表示内容
- 現在のエージェント作業状態は、メニューバー アイコンと、メニュー先頭のステータス行に表示されます。
- 作業中はヘルス状態を非表示にし、すべてのセッションがアイドルへ戻ると再表示します。
- メニュー内の
Nodesブロックには、クライアントや presence エントリではなく、デバイス のみを表示します。対象はnode.listでペアリング済みのノードです。 - プロバイダー利用状況のスナップショットがある場合は、Context の下に
Usageセクションが表示されます。
状態モデル
- Sessions: イベントには実行単位の
runIdと、ペイロード内のsessionKeyが含まれます。mainセッションはmainキーで識別し、存在しない場合は最後に更新されたセッションへフォールバックします。 - Priority: 常に main を優先します。main がアクティブならその状態を即座に表示し、main がアイドルなら、直近でアクティブだった non-main セッションを表示します。動作中に表示が頻繁に入れ替わることはなく、現在のセッションがアイドルになるか、main がアクティブになったときだけ切り替えます。
- Activity kinds:
job: 高レベルのコマンド実行(state: started|streaming|done|error)tool:phase: start|resultとtoolName、meta/args
IconState 列挙型(Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(デバッグ用オーバーライド)
ActivityKind → glyph
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- default → 🛠️
視覚表現
idle: 通常の critter を表示します。workingMain: glyph 付きバッジ、フルの tint、脚のworkingアニメーションを表示します。workingOther: glyph 付きバッジを muted tint で表示し、scurry は行いません。overridden: 実際のアクティビティに関係なく、選択した glyph と tint を使います。
ステータス行の文言(メニュー)
- 作業中:
<Session role> · <activity label>- 例:
Main · exec: pnpm test、Other · read: apps/macos/Sources/OpenClaw/AppState.swift
- 例:
- アイドル時: ヘルス サマリー表示に戻ります。
イベント取り込み
- Source: control-channel の
agentイベント(ControlChannel.handleAgentEvent) - 解析対象フィールド:
stream: "job"とdata.stateによる開始 / 停止stream: "tool"とdata.phase、name、任意のmeta/args
- Labels:
exec:args.commandの 1 行目read/write: 短縮したパスedit: パスとmeta/ diff 件数から推測した変更種別- fallback: ツール名
デバッグ用オーバーライド
- Settings ▸ Debug ▸
Icon overridepicker:System (auto)(既定)Working: main(ツール種別ごと)Working: other(ツール種別ごと)Idle
- 値は
@AppStorage("iconOverride")で保存され、IconState.overriddenに対応付けられます。
テスト チェックリスト
- main セッションの job を発火し、アイコンが即座に切り替わり、ステータス行に main ラベルが出ることを確認します。
- main がアイドルの状態で non-main セッションの job を発火し、アイコンとステータスが non-main を示し、終了まで安定していることを確認します。
- 他セッションが動作中に main を開始し、アイコンがすぐ main に切り替わることを確認します。
- ツール実行が短時間に連続しても、バッジがちらつかないことを確認します(tool result に TTL の猶予を設けます)。
- すべてのセッションがアイドルに戻ったら、ヘルス行が再表示されることを確認します。