Menu Bar Status Logic の仕組み
バックグラウンドで動作するツールを使っているとき、「今、何をしているのか」が分からなくて不安になることはありませんか?わざわざウィンドウを切り替えてログを確認するのは手間ですし、作業の集中力も切れてしまいます。
メニューバーに現在の状態がリアルタイムで表示されれば、開発の流れを止めることなく進捗を確認できます。今回は、エージェントの動作状態をメニューバーに反映させるためのロジックを解説します。
- control-channel
agentイベントの受信環境 node.listによるデバイスのペアリング- Swift 環境での
IconStateenum の実装
クイックスタート
Section titled “クイックスタート”エージェントの状態をメニューバーに表示するための最小限のステップは以下の通りです。
1. イベントのパース
Section titled “1. イベントのパース”ControlChannel.handleAgentEvent を通じてイベントを取得します。stream: "job" では実行状態を、stream: "tool" では具体的なツール名やパスを抽出します。
- exec:
args.commandの最初の行を表示 - read / write: 短縮されたパスを表示
- edit: パスと、差分から推論された変更内容を表示
2. セッションの優先順位付け
Section titled “2. セッションの優先順位付け”複数のセッションが動いている場合、表示には優先ルールがあります。
mainキーを持つセッションが常に最優先されます。mainがアクティブな間はその状態を表示し、mainが idle になった場合のみ、直近でアクティブだった他のセッションを表示します。- 動作の途中で表示が頻繁に切り替わるのを防ぐため、現在のセッションが idle になるか、
mainがアクティブになるまで表示を固定します。
3. アイコンの視覚的フィードバック
Section titled “3. アイコンの視覚的フィードバック”IconState に応じて、メニューバーのアイコンを変化させます。
- workingMain: バッジと glyph(💻, 📄 など)を表示し、アニメーションを有効にします。
- workingOther: バッジと glyph を表示しますが、色は控えめにし、アニメーションは行いません。
- idle: 通常のアイコンに戻ります。
4. メニュー項目の更新
Section titled “4. メニュー項目の更新”メニューを開いた際の表示内容を設定します。
- Status Row: 動作中は
<Session role> · <activity label>を表示し、idle 時は health summary を表示します。 - Nodes:
node.listでペアリングされたデバイスのみをリストアップします。
トラブルシューティング
Section titled “トラブルシューティング”アイコンが頻繁にちらつく
Section titled “アイコンが頻繁にちらつく”ツールの実行結果が返ってくる際にバッジが消えないよう、TTL(生存時間)による猶予期間を設けています。ツール実行の合間にアイコンが消える場合は、この処理が正しく動作しているか確認してください。
特定の状態をテストしたい
Section titled “特定の状態をテストしたい”デバッグ用のオーバーライド機能を利用してください。Settings ▸ Debug ▸ Icon override から、Working: main や Idle などの状態を強制的に再現できます。これは @AppStorage("iconOverride") に保存され、IconState.overridden として処理されます。
このロジックを実装することで、エージェントが「今、何を、どこで」実行しているかをユーザーが直感的に理解できるようになります。
さらに詳しい設定については、AI Setup Assistant で確認してください。
次のステップ
Section titled “次のステップ”- Control Channel API リファレンス
- Swift UI コンポーネントの実装ガイド
- Node 接続設定のカスタマイズ
- デバッグツールの活用方法
OpenClaw Expert
まだ解決しませんか?
このページで解決しない場合は、OpenClaw Expertに直接質問してください。