メインコンテンツへスキップ

メニューバーアイコンの状態

Author: steipete · Updated: 2025-12-06 · Scope: macOS アプリ(apps/macos
  • アイドル: 通常のアイコンアニメーション(点滅、時折の小さな揺れ)。
  • 一時停止: ステータスアイテムは appearsDisabled を使用し、動きはありません。
  • 音声トリガー(大きな耳): ウェイクワードが検出されると、音声ウェイク検出器が AppState.triggerVoiceEars(ttl: nil) を呼び出し、発話の取得中は earBoostActive=true を維持します。耳は 1.9x にスケールアップし、可読性のために円形の耳穴を持ち、無音が 1 秒続くと stopVoiceEars() によりドロップします。アプリ内の音声パイプラインからのみ発火します。 耳は大きくなって(1.9x)、読みやすくするために円形の耳穴を手に入れ、1秒間のサイレンスの後にstopVoiceEars()を介してドロップします。 アプリ内の音声パイプラインからのみ発生しました。 耳は大きくなって(1.9x)、読みやすくするために円形の耳穴を手に入れ、1秒間のサイレンスの後にstopVoiceEars()を介してドロップします。 アプリ内の音声パイプラインからのみ発生しました。
  • 作業中(エージェント実行中): AppState.isWorking=true が「尻尾/脚の小走り」マイクロモーションを駆動します。作業中は脚の揺れが速くなり、わずかなオフセットが入ります。現在は WebChat エージェントの実行前後でトグルされています。他の長時間タスクでも配線する際は同じトグルを追加してください。 作業中(エージェント実行中): AppState.isWorking=true が「尻尾/脚の小走り」マイクロモーションを駆動します。作業中は脚の揺れが速くなり、わずかなオフセットが入ります。現在は WebChat エージェントの実行前後でトグルされています。他の長時間タスクでも配線する際は同じトグルを追加してください。 現在、WebChat エージェントの実行を切り替えます。同じトグルを他の長いタスクに配線するときに追加します。
配線ポイント
  • 音声ウェイク: トリガー時に runtime/tester が AppState.triggerVoiceEars(ttl: nil) を呼び出し、取得ウィンドウに合わせて無音 1 秒後に stopVoiceEars() を呼び出します。
  • エージェント活動: 作業スパンの前後で AppStateStore.shared.setWorking(true/false) を設定します(WebChat エージェント呼び出しでは既に実装済み)。アニメーションの張り付き防止のため、スパンは短く保ち、defer ブロックで必ずリセットしてください。 deferブロックのスパンを短くしてリセットすると、動けなくなってしまいます。 deferブロックのスパンを短くしてリセットすると、動けなくなってしまいます。
形状とサイズ
  • ベースアイコンは CritterIconRenderer.makeIcon(blink:legWiggle:earWiggle:earScale:earHoles:) で描画されます。
  • 耳のスケールは既定で 1.0 です。音声ブーストでは earScale=1.9 を設定し、全体フレームを変更せずに earHoles=true をトグルします(18×18 pt のテンプレート画像を 36×36 px の Retina バッキングストアにレンダリング)。
  • Scuryは、最大1.0までのレッグを小さな水平ジグで動かします。既存のアイドル状態のウィグルに加算します。
振る舞いに関する注記
  • 耳/作業中の外部 CLI/ブローカーによるトグルはありません。意図しないフラッピングを避けるため、アプリ自身のシグナルに内部的に限定してください。
  • ジョブがハングした場合でも素早くベースラインに戻るよう、TTL は短く(10 秒未満)保ってください。