メニューバーアイコンの状態
対象範囲: macOS アプリ(apps/macos)。レンダリング: CritterIconRenderer.makeIcon(...)。アニメーション/状態の配線: CritterStatusLabel + CritterStatusLabel+Behavior.swift。
状態
セッションにアクティブなジョブまたはツールがある場合、ツールアクティビティバッジ(SF Symbol のパック。例: exec の場合は
chevron.left.slash.chevron.right)を同じクリッターアイコンの上に表示できます。このバッジは IconState/ActivityKind から提供されます。完全な状態モデルについては、メニューバーを参照してください。
音声ウェイクの耳
- トリガー:
AppStateStore.shared.triggerVoiceEars(ttl: nil)。音声ウェイクのキャプチャパイプライン(VoiceWakeRuntime)と、音声ウェイクのデバッグ/テストツール(VoiceWakeTester、VoiceWakeOverlayController)から呼び出されます。 - 停止:
stopVoiceEars()。キャプチャの完了時に呼び出されます。 - 完了までの無音時間: 通常は
2.0s。トリガーワードだけが検出され、その後に発話が続かなかった場合は5.0s(VoiceWakeRuntime.silenceWindow/triggerOnlySilenceWindow)。 - ブースト中は、アイドル時のまばたき/小刻みな動き/脚/耳のタイマーが一時停止します(
earBoostActiveがCritterStatusLabel+Behaviorのアニメーションタスクを制御します)。
形状とサイズ
- キャンバス: 18x18pt のテンプレート画像。Retina でアイコンを鮮明に保つため、36x36px のビットマップバッキングストア(2x)にレンダリングされます。
- 耳のスケールのデフォルトは
1.0。音声ブーストでは、全体のフレームを変更せずにearScale=1.9を設定します。 antennaDroop(0~1)は、一時停止およびスリープの姿勢で触角を下向きに折りたたみます。- 脚の素早い動きには
legWiggleから最大1.0を使用し、水平方向に少し揺れます。
動作上の注意
- 耳や作業中状態を切り替える外部 CLI/ブローカーのトグルはありません。意図しないばたつきを避けるため、どちらもアプリのシグナル(
AppState.setWorking、AppState.triggerVoiceEars)によって内部的に駆動されます。 - ジョブが停止した場合でもアイコンがすぐに基準状態へ戻るよう、新しい TTL は短く(10秒を十分に下回る値に)保ってください。