メニューバーのステータスロジック
表示される内容
- 現在のエージェントの作業状態を、メニューバーのアイコンおよびメニュー先頭のステータス行に表示します。
- 作業がアクティブな間はヘルスステータスを非表示にし、すべてのセッションがアイドルになると再表示します。
- メニュー内の「Nodes」ブロックには デバイス のみ(
node.listによってペアリングされたノード)を一覧表示し、クライアント/プレゼンスのエントリーは表示しません。 - プロバイダーの使用量スナップショットが利用可能な場合、Context の下に「Usage」セクションが表示されます。
状態モデル
- セッション: イベントは
runId(実行単位)に加えて、ペイロード内のsessionKeyとともに到着します。「メイン」セッションはキー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 → グリフ
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- default → 🛠️
視覚的マッピング
idle: 通常のクリッター。workingMain: グリフ付きバッジ、フルのティント、脚の「作業中」アニメーション。workingOther: グリフ付きのバッジ、ミュートされた色、破砕なし。overridden: アクティビティに関係なく、選択されたグリフ/ティントを使用します。
ステータス行のテキスト(メニュー)
- 作業がアクティブな間:
<Session role> · <activity label>- 例:
Main · exec: pnpm test、Other · read: apps/macos/Sources/OpenClaw/AppState.swift。
- 例:
- アイドルの場合:健康要約に戻ります。
イベント取り込み
- ソース: コントロールチャンネルの
agentイベント(ControlChannel.handleAgentEvent)。 - 解析されるフィールド:
- 開始/停止用の
stream: "job"とdata.state。 stream: "tool"(data.phase、name、任意のmeta/args)。
- 開始/停止用の
- ラベル:
exec:args.commandの先頭行。read/write: 短縮されたパス。edit:meta/diff 件数から推定した変更種別を含むパス。- フォールバック: ツール名。
デバッグ用オーバーライド
- 設定 ▸ デバッグ ▸ 「Icon override」ピッカー:
System (auto)(デフォルト)Working: main(ツール種別ごと)Working: other(ツール種別ごと)Idle
@AppStorage("iconOverride")により保存され、IconState.overriddenにマッピングされます。
テストチェックリスト
- メインセッションのジョブをトリガー: アイコンが即座に切り替わり、ステータス行にメインのラベルが表示されることを確認します。
- メインがアイドルの間に非メインセッションのジョブをトリガー: アイコン/ステータスが非メインを表示し、完了まで安定していることを確認します。
- 他がアクティブな状態でメインを開始: アイコンが即座にメインへ切り替わることを確認します。
- 急速なツールのバースト: バッジがちらつかないことを確認します(ツール結果に対する TTL の猶予)。
- すべてのセッションがアイドルになったら、ヘルス行が再表示されることを確認します。