macOS companion app
메뉴 막대
표시되는 내용
- 현재 에이전트 작업 상태가 메뉴 막대 아이콘과 메뉴의 첫 번째 상태 행에 표시됩니다.
- 작업이 활성 상태인 동안에는 상태 점검 정보가 숨겨지며, 모든 세션이 유휴 상태가 되면 다시 표시됩니다.
- 루트의 "컨텍스트" 항목은 루트 메뉴에서 최근 세션을 펼치는 대신, 최근 세션이 포함된 하위 메뉴를 엽니다.
- 루트 메뉴의 "Node" 블록에는 클라이언트/프레즌스 항목이 아니라 페어링된 기기만 (
node.list에서 가져와) 표시됩니다. - 제공자 사용량 스냅샷을 사용할 수 있으면 루트의 "사용량" 섹션이 컨텍스트 아래에 표시되고, 비용 세부 정보를 사용할 수 있으면 그 뒤에 표시됩니다.
상태 모델
- 소스:
WorkActivityStore(apps/macos/Sources/OpenClaw/WorkActivityStore.swift). - 이벤트는
runId가 있는ControlAgentEvent로 도착합니다. 핸들러(ControlChannel.routeWorkActivity)는 이벤트 페이로드에서sessionKey를 읽으며, 없으면 기본값으로"main"을 사용합니다. - 우선순위: 기본적으로 메인 세션(
sessionKey == "main")이 항상 우선합니다. 메인 세션이 활성 상태이면 해당 상태가 즉시 표시됩니다. 메인 세션이 유휴 상태이면 가장 최근에 활성 상태였던 비메인 세션이 대신 표시됩니다. 저장소는 작업 도중에 전환하지 않으며, 현재 세션이 유휴 상태가 되거나 메인 세션이 활성 상태가 될 때만 전환합니다. - 작업 종류:
job: 상위 수준 명령 실행(state: started|streaming|done|error|...).tool:name과 선택적meta/args가 있는phase: start|result.
IconState 열거형(Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(디버그 재정의)
ActivityKind -> 배지 기호
ActivityKind는 ToolKind(bash, read, write, edit, attach, other) 또는 단독 job을 래핑합니다. 각각은 동물 아이콘 위에 그려지는 SF Symbols 배지(IconState.badgeSymbolName)에 매핑됩니다.
| 종류 | 기호 |
|---|---|
bash |
chevron.left.slash.chevron.right |
read |
doc |
write |
pencil |
edit |
pencil.tip |
attach |
paperclip |
other / job |
gearshape.fill |
시각적 매핑
idle: 배지가 없는 일반 동물 아이콘.workingMain: 기호가 있는 배지, 전체 색조(.primary강조도), 다리 "작업 중" 애니메이션.workingOther: 기호가 있는 배지, 흐린 색조(.secondary강조도), 빠르게 움직이는 애니메이션 없음.overridden: 실제 작업 상태와 관계없이 선택한 기호/색조를 사용합니다.
컨텍스트 하위 메뉴
- 루트 메뉴에는 세션 수/상태가 표시된 하나의 "컨텍스트" 행이 있으며, 이 행을 누르면 하위 메뉴(
MenuSessionsInjector)가 열립니다. - 하위 메뉴 헤더에는 최근 24시간 동안의 활성 세션 수가 표시됩니다.
- 각 세션 행에는 토큰 막대, 경과 시간, 미리보기, 추론/상세 출력 전환, 초기화, 압축, 삭제 작업이 그대로 유지됩니다.
- 로딩, 연결 끊김, 세션 로드 오류 메시지는 컨텍스트 하위 메뉴 안에 표시됩니다.
- 사용량 및 비용 섹션은 컨텍스트 아래의 루트 수준에 유지되므로 하위 메뉴를 열지 않고도 한눈에 확인할 수 있습니다.
상태 행 텍스트(메뉴)
- 작업이 진행 중일 때:
<Session role> · <activity label>(MenuContentView에서는"\(roleLabel) · \(activity.label)")이며, 역할 레이블은Main또는Other입니다. - 유휴 상태일 때: 상태 요약으로 대체됩니다.
이벤트 수집
- 소스:
ControlChannel.routeWorkActivity(from:)에서 라우팅되는 제어 채널agent이벤트. - 파싱되는 필드:
- 시작/중지에는
data.state가 포함된stream: "job". data.phase,data.name, 선택적data.meta/data.args가 포함된stream: "tool".
- 시작/중지에는
- 도구 레이블은
ToolDisplayRegistry.resolve(name:args:meta:)에서 가져오며, 이름을 확인할 수 없으면 원시 도구 이름을 사용합니다.
디버그 재정의
- Settings > Debug > "Icon override" 선택기:
System (auto)(기본값)Working: main/Working: other(도구 종류별: bash, read, write, edit, other)Idle
UserDefaults키openclaw.iconOverride에 저장되며IconState.overridden에 매핑됩니다.
테스트 체크리스트
- 기본 세션 작업을 실행합니다. 아이콘이 즉시 전환되고 상태 행에 기본 세션 레이블이 표시됩니다.
- 기본 세션이 유휴 상태일 때 기본 세션이 아닌 세션의 작업을 실행합니다. 아이콘과 상태에 해당 세션이 표시되며 작업이 완료될 때까지 안정적으로 유지됩니다.
- 다른 세션이 활성 상태일 때 기본 세션을 시작합니다. 아이콘이 즉시 기본 세션으로 전환됩니다.
- 도구를 빠르게 연속 실행합니다. 배지가 깜박이지 않습니다(완료된 도구를 지우기 전 2초의 유예 시간,
WorkActivityStore.toolResultGrace). - 모든 세션이 유휴 상태가 되면 상태 확인 행이 다시 나타납니다.
관련 문서
Was this useful?