コンテンツにスキップ

Menu Bar Status Logic の仕組み

バックグラウンドで動作するツールを使っているとき、「今、何をしているのか」が分からなくて不安になることはありませんか?わざわざウィンドウを切り替えてログを確認するのは手間ですし、作業の集中力も切れてしまいます。

メニューバーに現在の状態がリアルタイムで表示されれば、開発の流れを止めることなく進捗を確認できます。今回は、エージェントの動作状態をメニューバーに反映させるためのロジックを解説します。

  • control-channel agent イベントの受信環境
  • node.list によるデバイスのペアリング
  • Swift 環境での IconState enum の実装

エージェントの状態をメニューバーに表示するための最小限のステップは以下の通りです。

ControlChannel.handleAgentEvent を通じてイベントを取得します。stream: "job" では実行状態を、stream: "tool" では具体的なツール名やパスを抽出します。

  • exec: args.command の最初の行を表示
  • read / write: 短縮されたパスを表示
  • edit: パスと、差分から推論された変更内容を表示

複数のセッションが動いている場合、表示には優先ルールがあります。

  • main キーを持つセッションが常に最優先されます。
  • main がアクティブな間はその状態を表示し、main が idle になった場合のみ、直近でアクティブだった他のセッションを表示します。
  • 動作の途中で表示が頻繁に切り替わるのを防ぐため、現在のセッションが idle になるか、main がアクティブになるまで表示を固定します。

3. アイコンの視覚的フィードバック

Section titled “3. アイコンの視覚的フィードバック”

IconState に応じて、メニューバーのアイコンを変化させます。

  • workingMain: バッジと glyph(💻, 📄 など)を表示し、アニメーションを有効にします。
  • workingOther: バッジと glyph を表示しますが、色は控えめにし、アニメーションは行いません。
  • idle: 通常のアイコンに戻ります。

メニューを開いた際の表示内容を設定します。

  • Status Row: 動作中は <Session role> · <activity label> を表示し、idle 時は health summary を表示します。
  • Nodes: node.list でペアリングされたデバイスのみをリストアップします。

ツールの実行結果が返ってくる際にバッジが消えないよう、TTL(生存時間)による猶予期間を設けています。ツール実行の合間にアイコンが消える場合は、この処理が正しく動作しているか確認してください。

デバッグ用のオーバーライド機能を利用してください。Settings ▸ Debug ▸ Icon override から、Working: main や Idle などの状態を強制的に再現できます。これは @AppStorage("iconOverride") に保存され、IconState.overridden として処理されます。

このロジックを実装することで、エージェントが「今、何を、どこで」実行しているかをユーザーが直感的に理解できるようになります。

さらに詳しい設定については、AI Setup Assistant で確認してください。

  • Control Channel API リファレンス
  • Swift UI コンポーネントの実装ガイド
  • Node 接続設定のカスタマイズ
  • デバッグツールの活用方法
OpenClaw

OpenClaw Expert

まだ解決しませんか?

このページで解決しない場合は、OpenClaw Expertに直接質問してください。