メニューバーのステータスロジック
表示されるもの
- 現在のエージェントの作業状態を、メニューバーアイコンとメニューの最初のステータス行に表示します。
- 作業中は正常性ステータスは非表示になり、すべてのセッションがアイドルになると再表示されます。
- メニュー内の「Nodes」ブロックには、デバイスのみが一覧表示されます(
node.listによる paired nodes)。client / presence エントリーは表示されません。 - プロバイダー使用状況のスナップショットが利用可能な場合、Context の下に「Usage」セクションが表示されます。
状態モデル
- セッション: イベントは
runId(実行ごと)と、payload 内のsessionKeyとともに到着します。「main」セッションはキーmainです。存在しない場合は、最後に更新されたセッションにフォールバックします。 - 優先順位: 常に main が優先されます。main がアクティブなら、その状態が即座に表示されます。main がアイドルなら、最後にアクティブだった非 main セッションが表示されます。アクティビティの途中で行ったり来たりはしません。現在のセッションがアイドルになるか、main がアクティブになったときにのみ切り替えます。
- アクティビティ種別:
job: 高レベルのコマンド実行(state: started|streaming|done|error)。tool:phase: start|resultとtoolNameおよびmeta/args。
IconState enum(Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(デバッグ用上書き)
ActivityKind → glyph
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- デフォルト → 🛠️
視覚的マッピング
idle: 通常のクリッター。workingMain: glyph 付きバッジ、フル tint、脚の「作業中」アニメーション。workingOther: glyph 付きバッジ、抑えた tint、スカリーなし。overridden: アクティビティに関係なく、選択された glyph / tint を使います。
ステータス行テキスト(メニュー)
- 作業中:
<Session role> · <activity label>- 例:
Main · exec: pnpm test、Other · read: apps/macos/Sources/OpenClaw/AppState.swift。
- 例:
- アイドル時: 正常性サマリーにフォールバックします。
イベント取り込み
- ソース: control-channel の
agentイベント(ControlChannel.handleAgentEvent)。 - 解析されるフィールド:
stream: "job"とdata.stateによる開始 / 停止。stream: "tool"とdata.phase、name、任意のmeta/args。
- ラベル:
exec:args.commandの最初の行。read/write: 短縮されたパス。edit: パスに加え、meta/ diff 件数から推測した変更種別。- フォールバック: tool 名。
デバッグ用上書き
- Settings ▸ Debug ▸ 「Icon override」ピッカー:
System (auto)(デフォルト)Working: main(tool 種別ごと)Working: other(tool 種別ごと)Idle
@AppStorage("iconOverride")を通じて保存され、IconState.overriddenにマッピングされます。
テストチェックリスト
- main セッションの job を発火させる: アイコンが即座に切り替わり、ステータス行に main ラベルが表示されることを確認する。
- main がアイドル中に非 main セッションの job を発火させる: アイコン / ステータスに非 main が表示され、完了するまで安定していることを確認する。
- 他がアクティブ中に main を開始する: アイコンが即座に main に切り替わることを確認する。
- 高速な tool バースト: バッジが点滅しないことを確認する(tool result に TTL の猶予あり)。
- すべてのセッションがアイドルになると正常性行が再表示されることを確認する。