TaskManager 사양 4 · 도메인 기능과 기기 컨텍스트
None기존 DeviceAgent 기능을 Task 실행기로 연결하는 방법과 계획에 제공할 기기 상태 계약을 정의한다.
이 장의 결론: 기능은 등록된 실행기와 완료 증거를 통해 Task가 되고, 기기 컨텍스트는 사실과 최신성을 보존해 상위 호출자에 제공한다.
16. 도메인 기능과 실행기 연결
16.1 실행기 등록 원칙
TaskExecutorBootstrap은 표준 taskMethod를 도메인 어댑터에 등록한다.
실행 연결은 SKIX 제품 앱에서 기기 도메인까지의 호출 계층에 표시한 것처럼 taskMethod를 TaskExecutorRegistry, 도메인별 TaskExecutor, 기존 DeviceAgent manager·controller·API 순서로 전달한다.
실행기 어댑터가 해야 할 일:
- Task 계약 필드를 도메인 입력으로 정규화한다.
- 기존 도메인 기능을 호출한다.
- 요청 전달 결과를
outdata에 기록한다. - 비동기 기능이면 완료 연결부가 사용할 상관관계 키를 등록한다.
- 실제 완료는 도메인 콜백을 통해
TaskCompletionStateStore에 기록한다.
실행기 어댑터가 하면 안 되는 일:
- 자연어 원문이나 채널별 요청 문자열을 다시 파싱한다.
- 임의의 기본값으로 잘못된 공간이나 모드를 추정한다.
- 콜백 없이 고정 대기 시간만으로 물리 완료를 선언한다.
- 동일 기능의 핵심 로직을 복제한다.
- 등록되지 않은 메서드를 리플렉션으로 무제한 실행한다.
16.2 현재 실행기 그룹
| 실행기 | 대표 메서드 | 실제 수행 주체 |
|---|---|---|
FrameworkTaskExecutor |
battery, firmware, main/device status, screen, configuration | DeviceAgent framework state |
StationLocationTaskExecutor |
스테이션 위치 증거 조회 | 스테이션·맵 제공자 |
DockingSignalProbeTaskExecutor |
도킹 신호 관찰 | AMR·충전 상태 증거 |
ObservationTaskExecutor |
rotate, vision semantics | movement + Vision AI |
MainApiTaskExecutor |
map, security, follow state, 기타 MainApi 기능 | 기존 MainApi/domain |
MovementTaskExecutor |
move, return, stop | MovingController/AMR |
CleaningAmpTaskExecutor |
cleaning start/stop/status | Cleaning/Amp domain |
LlmTtsTaskExecutor |
LLM status, TTS, stop | LlmManager |
IotTaskExecutor |
device status, config | IotAgent path |
RoutineTaskExecutor |
Eye LED scene | Routine/PUI domain |
ScheduleTaskExecutor |
product schedule CRUD, interaction | Schedule domain |
UpdateTaskExecutor |
OTA/firmware state | Update domain |
16.3 공개 메서드 목록
기기 정보와 상태
| method | 분류 | 비고 |
|---|---|---|
getBatteryInfo |
query | planning context에도 포함 |
getFirmwareVersion |
query | device version |
getMainState |
query | current mode |
getDeviceStatus |
query | device status |
getConfiguration |
query | configuration snapshot |
setMainState |
control | main state 전환 |
setDeviceStatus |
control | device status 반영 |
setLauncherScreen |
control/session start | screenName canonical |
이동과 지도
| method | 분류 | completion 후보 |
|---|---|---|
setMoveTo |
long-running | movement.arrived |
returnToStation |
long-running | movement.stationCharging |
setMoving |
control | operation별 별도 완료 증거 필요 |
stopMovement |
cancel/control | 이동 최종 상태 확인 |
getFollowMeStatus |
query | follow state |
reqmap |
long-running/query mix | mapping.dataReceived |
isMapFilePresent |
query | map readiness |
resetReturnToStationCounter |
control | post-check 권장 |
setAMRMonitoring |
control | monitoring 상태 확인 |
getStationLocationEvidence |
query | 스테이션 위치 증거 스냅숏 |
probeDockingSignal |
observation | current signal only |
rotateInPlace |
bounded action | movement.rotationCompleted |
observeVisionSemantics |
observation | semantic result |
청정
| method | 분류 | 비고 |
|---|---|---|
getAirCleanerOperation |
query | running/paused/current mode |
setAirCleanerOperation |
long-running/control | action/mode/speed |
setStatusClean |
state update | domain status |
startSimpleAirClear |
alias/capability | canonical cleaning으로 정규화 필요 |
startBasicAirClear |
alias/capability | basic mode |
startFixedAirClear |
alias/capability | fixed cleaning |
startAllAirClear |
alias/capability | all-room cleaning |
startSelectiveAirClear |
alias/capability | selected rooms |
startAirSensorAirClear |
alias/capability | sensor-based mode |
stopAirClear |
control | 정지 증거 |
pauseAirClear |
control | paused state |
resumeAirClear |
control | resumed state |
returnAirClearToStation |
compound alias | cleaning stop/return 경계 확인 |
returnCleaningToStation |
compound alias | alias 정합 필요 |
stopCleaning / ampStop |
low-level control | executor 등록 상태 확인 |
LLM, TTS, UI와 루틴
| method | 분류 | completion |
|---|---|---|
setChangeLlmStatus |
state control | LLM 상태 콜백 |
setLlmTts |
long-running playback | tts.playbackEnded |
stopLlm |
cancel | 정지·유휴 증거 |
stopTts |
cancel | aborted playback |
setEyeLedColor |
bounded setting | post-check 또는 ACK |
setCurrentPuiEyeLedColor |
bounded setting | post-check 또는 ACK |
startEyeLedScene |
bounded routine | scene-specific lifecycle 필요 |
설정
| method | 분류 |
|---|---|
setConfig |
mutation |
getConfig |
query |
getAirClearAutoStartModeEnable |
query |
제품 스케줄과 상호작용
| method | 역할 |
|---|---|
addSchedule, editSchedule, deleteSchedule |
제품 schedule CRUD |
scheduleiot, setActiveSchedule, puiEditSchedule |
IoT/PUI schedule mutation |
callschedule, getschedule, getUpComingSchedule |
실행/조회 |
setScheduleExecuted |
execution state update |
| holiday methods | 휴일 예외 정책 |
gpsLocNearBy |
위치 기반 schedule trigger 지원 |
interSchedule |
welcome/wakeup/relax 등 interaction session |
보안
| method | 역할 | 완료 기준 |
|---|---|---|
checkSecurityBasicAvailability |
실행 가능성 query | 즉시 result |
startSecurityMode |
장기 session 시작 | security.started |
pauseSecurityMode |
session pause | security.paused |
resumeSecurityMode |
session resume | security.resumed |
stopSecurityMode |
session 종료 | security.stopped |
업데이트
| method | 역할 |
|---|---|
OTAUpdateArmResult |
ARM update result 처리 |
OTAUpdateMcuResult |
MCU update result 처리 |
setFirmwareUpdateStatus |
firmware update state 반영 |
16.4 기능 등록 체크리스트
새 DeviceAgent 기능을 TaskManager에 연결할 때 다음을 모두 정의한다.
- 표준
taskMethod - 조회·제어·장기 실행 분류
- 입력 스키마와 별칭
- 요청 출처 허용 범위
- 실행 방식
- 대기열과 우선순위
- 시간 제한, 재시도와 멱등성
- 필수 자원
- 실행기 어댑터
- 시작·완료·중단 증거
- 취소 메서드
- 보상 동작 필요 여부
- 실패 사유 변환
- 계획 컨텍스트에 노출할 상태
- 단위·통합·실기기 인수 시험
17. 기기 계획 컨텍스트
getDevicePlanningContext는 기능 정의가 아니라 현재 기기 상태의 스냅숏이다.
17.1 컨텍스트 구조
{
"schema_version": "device_context.v1",
"snapshot_ts": 1786400000000,
"updated_at_ms": 1786400000000,
"main_state": "...",
"battery": {},
"map": {},
"location": {},
"station": {},
"air_quality": {},
"cleaning": {},
"movement": {},
"network": {},
"voice_llm": {},
"security": {},
"interactions": {},
"task_manager": {},
"semantic_observations": {},
"capabilities": {}
}
17.2 컨텍스트 도메인
| 도메인 | 주요 필드 | 주의점 |
|---|---|---|
| battery | percent, is_low, is_charging, freshness | 오래된 정보이면 판단에 사용하지 않음 |
| map | rooms, room_count, editing, source | 지도 편집 중에는 사용 불가 |
| location | current_room_id/name, x/y/theta, is_on_station | 내부 ID를 사용자에게 그대로 안내하지 않음 |
| station | 위치 증거, docking/charging | 지도상 스테이션과 실제 도킹 상태 분리 |
| air_quality | PM, TVOC, NOx, HCHO, CO2, 온습도, AQ level | 원시 필드 이름을 그대로 TTS하지 않음 |
| cleaning | is_running, is_paused, last_action, area_info | 현재 Task와 교차 확인 |
| movement | moving_status, is_moving, is_paused, blocked | 목표 위치와 현재 위치 분리 |
| network | AWS IoT connected, freshness | 구독 준비와 실제 연결 상태 분리 |
| voice_llm | pipeline state, busy, session, output, model readiness | 음성 세션 중 TaskManager 일시정지 정책과 연결 |
| security | session, stage, current area, low light | 장기 세션의 생명주기 관리 필요 |
| interactions | 등록된 제품 스케줄 요약 | TaskManager 지연 Task와 구분 |
| task_manager | 대기열, 실행 중·최근·예약 Task | 실행 계획과 현재 상태 설명 |
| semantic_observations | 최근 관찰 증거와 최신성·개인정보 상태 | 제한된 관찰 결과만 사용 |
| capabilities | 이동, 청정, 복귀, TTS 등 | 실제 실행기·정책 목록과의 불일치 점검 |
17.3 공간 정보 계약
각 room은 최소 다음을 제공한다.
{
"id": "5",
"name": "안방",
"x": "...",
"y": "...",
"theta": "...",
"station": false
}
상위 호출자는 공간 이름을 areaId와 연결한 뒤 Workflow를 만든다. TaskManager는 존재하지 않는 공간을 임의로 대체하면 안 된다.
17.4 정보 최신성
컨텍스트 출처는 다음 메타데이터를 가질 수 있다.
observed_at_msfreshness_msttl_mssource_validstaleusablesource_stateexpiry_mode
조건부 Workflow는 available=true만 보지 말고 최신성과 사용 가능 여부를 함께 확인해야 한다.
17.5 계획 컨텍스트 사용 원칙
- 컨텍스트 필드 이름을 사용자 TTS에 그대로 노출하지 않는다.
current_room_name이 있으면 자연어 공간명으로 답한다.- 스테이션 도킹 상태이면 공간 이름이 비어 있어도 “스테이션에 있다”고 안내할 수 있다.
- 공기질 원시값은 의미 등급과 권장 행동으로 변환한다.
- 실행 중인 Task가 있으면 새 Task의 실행 허용과 선점 정책에 반영한다.
- 스냅숏은 조회 시점의 정보다. 실행 직전의 중요한 조건은 DeviceAgent에서 다시 확인한다.