macOS コンパニオンアプリ
メニューバー
表示内容
- 現在のエージェント作業状態をメニューバーアイコンおよびメニューの最初のステータス行に表示します。
- 作業中はヘルスステータスは非表示になります。すべてのセッションがアイドル状態になると再表示されます。
- メニュー内の「Nodes」ブロックは、デバイスのみをリストします(
node.list経由でペアリングされたノード)。クライアント/プレゼンスエントリは含まれません。 - プロバイダーの使用状況スナップショットが利用可能な場合、「Usage」セクションが Context の下に表示されます。
状態モデル
- セッション: イベントは
runId(実行ごと)とペイロード内のsessionKeyとともに到着します。「メイン」セッションはキーmainです。存在しない場合は、最も最近更新されたセッションにフォールバックします。 - 優先度: メインは常に優先されます。メインがアクティブな場合、その状態が即座に表示されます。メインがアイドルの場合、最も最近アクティブだった非メインセッションが表示されます。アクティビティの途中で切り替わることはありません。現在のセッションがアイドルになるか、メインがアクティブになったときにのみ切り替わります。
- アクティビティの種類:
job: 高レベルのコマンド実行 (state: started|streaming|done|error)。tool:phase: start|resultとtoolName、meta/args。
IconState enum (Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(デバッグオーバーライド)
ActivityKind → グリフ
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- デフォルト → 🛠️
視覚的マッピング
idle: 通常のクリッター。workingMain: グリフ付きバッジ、フルティント、足の「作業中」アニメーション。workingOther: グリフ付きバッジ、控えめなティント、走り回るアニメーションなし。overridden: アクティビティに関係なく、選択されたグリフ/ティントを使用。
ステータス行テキスト (メニュー)
- 作業中:
<セッションの役割> · <アクティビティラベル>- 例:
Main · exec: pnpm test,Other · read: apps/macos/Sources/OpenClaw/AppState.swift。
- 例:
- アイドル時: ヘルスサマリーにフォールバック。
イベント取り込み
- ソース: コントロールチャネル
agentイベント (ControlChannel.handleAgentEvent)。 - 解析されるフィールド:
- 開始/停止用の
data.stateを持つstream: "job"。 data.phase,name, オプションのmeta/argsを持つstream: "tool"。
- 開始/停止用の
- ラベル:
exec:args.commandの最初の行。read/write: 短縮されたパス。edit: パスとmeta/差分カウントから推測された変更種別。- フォールバック: ツール名。
デバッグオーバーライド
- 設定 ▸ デバッグ ▸ 「アイコンオーバーライド」ピッカー:
System (auto)(デフォルト)Working: main(ツール種別ごと)Working: other(ツール種別ごと)Idle
@AppStorage("iconOverride")経由で保存;IconState.overriddenにマッピング。
テストチェックリスト
- メインセッションのジョブをトリガー: アイコンが即座に切り替わり、ステータス行にメインラベルが表示されることを確認。
- メインがアイドル中に非メインセッションのジョブをトリガー: アイコン/ステータスが非メインを表示。完了するまで安定していることを確認。
- 他のアクティブ中にメインを開始: アイコンが即座にメインに切り替わることを確認。
- 高速なツールバースト: バッジがちらつかないことを確認(ツール結果のTTL猶予)。
- すべてのセッションがアイドルになるとヘルス行が再表示されることを確認。