메뉴 바 상태 로직

표시되는 내용

  • 메뉴 바 아이콘과 메뉴의 첫 번째 상태 행에 현재 에이전트 작업 상태를 표시합니다.
  • 작업이 활성화된 동안 Health 상태는 숨겨집니다; 모든 세션이 idle 상태가 되면 다시 나타납니다.
  • 메뉴의 "Nodes" 블록은 디바이스만 나열합니다 (node.list를 통한 페어링된 노드), 클라이언트/presence 항목은 아닙니다.
  • provider 사용 스냅샷이 사용 가능한 경우 Context 아래에 "Usage" 섹션이 나타납니다.

상태 모델

  • Sessions: 이벤트는 runId (실행별) 및 페이로드의 sessionKey와 함께 도착합니다. "main" 세션은 키 main입니다; 없으면 가장 최근에 업데이트된 세션으로 폴백합니다.
  • 우선순위: main이 항상 이깁니다. main이 활성화되면 그 상태가 즉시 표시됩니다. main이 idle이면 가장 최근에 활성화된 non‑main 세션이 표시됩니다. 활동 중에는 flip‑flop하지 않습니다; 현재 세션이 idle 상태가 되거나 main이 활성화될 때만 전환합니다.
  • 활동 종류:
    • job: 고수준 명령 실행 (state: started|streaming|done|error).
    • tool: toolNamemeta/args와 함께 phase: start|result.

IconState enum (Swift)

  • idle
  • workingMain(ActivityKind)
  • workingOther(ActivityKind)
  • overridden(ActivityKind) (디버그 오버라이드)

ActivityKind → glyph

  • exec → 💻
  • read → 📄
  • write → ✍️
  • edit → 📝
  • attach → 📎
  • default → 🛠️

시각적 매핑

  • idle: 일반 critter.
  • workingMain: glyph가 있는 배지, 전체 틴트, 다리 "working" 애니메이션.
  • workingOther: glyph가 있는 배지, 음소거된 틴트, scurry 없음.
  • overridden: 활동과 관계없이 선택된 glyph/틴트 사용.

상태 행 텍스트 (메뉴)

  • 작업이 활성화된 동안: <Session role> · <activity label>
    • 예시: Main · exec: pnpm test, Other · read: apps/macos/Sources/OpenClaw/AppState.swift.
  • idle 시: health 요약으로 폴백.

이벤트 수집

  • 소스: control‑channel agent 이벤트 (ControlChannel.handleAgentEvent).
  • 파싱된 필드:
    • 시작/중지를 위한 data.state가 있는 stream: "job".
    • data.phase, name, 선택적 meta/args가 있는 stream: "tool".
  • 레이블:
    • exec: args.command의 첫 번째 줄.
    • read/write: 단축된 경로.
    • edit: 경로 + meta/diff 카운트에서 추론된 변경 종류.
    • 폴백: 도구 이름.

디버그 오버라이드

  • Settings ▸ Debug ▸ "Icon override" 선택기:
    • System (auto) (기본값)
    • Working: main (도구 종류별)
    • Working: other (도구 종류별)
    • Idle
  • @AppStorage("iconOverride")를 통해 저장; IconState.overridden에 매핑.

테스트 체크리스트

  • main 세션 job 트리거: 아이콘이 즉시 전환되고 상태 행이 main 레이블을 표시하는지 확인.
  • main idle 동안 non‑main 세션 job 트리거: 아이콘/상태가 non‑main을 표시; 완료될 때까지 안정적으로 유지.
  • 다른 활성 상태일 때 main 시작: 아이콘이 즉시 main으로 전환.
  • 빠른 도구 버스트: 배지가 깜빡이지 않는지 확인 (도구 결과의 TTL 유예).
  • 모든 세션 idle 시 Health 행이 다시 나타남.