macOS companion app

Строка меню

Что отображается

  • Текущее рабочее состояние агента отображается в значке строки меню и в первой строке состояния меню.
  • Состояние работоспособности скрывается во время активной работы и снова появляется, когда все сеансы переходят в режим ожидания.
  • Корневой пункт «Контекст» открывает подменю с недавними сеансами вместо их разворачивания в корневом меню.
  • Блок «Узлы» в корневом меню содержит только сопряжённые устройства (из node.list), а не записи клиентов или присутствия.
  • Раздел «Использование» отображается в корневом меню под разделом «Контекст», когда доступны снимки использования провайдера; за ним при наличии следуют сведения о стоимости.

Модель состояний

  • Источник: WorkActivityStore (apps/macos/Sources/OpenClaw/WorkActivityStore.swift).
  • События поступают как ControlAgentEvent с runId; обработчик (ControlChannel.routeWorkActivity) считывает sessionKey из полезной нагрузки события, а при его отсутствии использует значение "main" по умолчанию.
  • Приоритет: основной сеанс (sessionKey == "main" по умолчанию) всегда имеет преимущество. Если основной сеанс активен, его состояние отображается немедленно. Если основной сеанс находится в режиме ожидания, вместо него отображается последний активный неосновной сеанс. Хранилище не переключается во время активности; переключение происходит только тогда, когда текущий сеанс переходит в режим ожидания или основной сеанс становится активным.
  • Виды активности:
    • job: выполнение высокоуровневой команды (state: started|streaming|done|error|...).
    • tool: phase: start|result с name, необязательными meta/args.

Перечисление IconState (Swift)

  • idle
  • workingMain(ActivityKind)
  • workingOther(ActivityKind)
  • overridden(ActivityKind) (переопределение для отладки)

ActivityKind -> символ индикатора

ActivityKind служит оболочкой для ToolKind (bash, read, write, edit, attach, other) или отдельного job. Каждому значению соответствует индикатор с символом SF Symbols, отображаемый поверх значка существа (IconState.badgeSymbolName):

Вид Символ
bash chevron.left.slash.chevron.right
read doc
write pencil
edit pencil.tip
attach paperclip
other / job gearshape.fill

Визуальное представление

  • idle: обычное существо без индикатора.
  • workingMain: индикатор с символом, полная насыщенность оттенка (выраженность .primary), анимация ног «в работе».
  • workingOther: индикатор с символом, приглушённый оттенок (выраженность .secondary), без анимации движения.
  • overridden: выбранные символ и оттенок используются независимо от фактической активности.

Подменю «Контекст»

  • В корневом меню отображается одна строка «Контекст» с количеством и состоянием сеансов; она открывает подменю (MenuSessionsInjector).
  • В заголовке подменю отображается количество активных сеансов за последние 24 часа.
  • В каждой строке сеанса сохраняются шкала токенов, возраст, предварительный просмотр, переключатель режимов рассуждений и подробного вывода, а также действия сброса, сжатия и удаления.
  • Сообщения о загрузке, отключении и ошибках загрузки сеансов отображаются внутри подменю «Контекст».
  • Разделы использования и стоимости остаются на корневом уровне под разделом «Контекст», чтобы их можно было быстро просмотреть, не открывая подменю.

Текст строки состояния (меню)

  • Во время активной работы: &lt;Session role&gt; · <activity label> ("\(roleLabel) · \(activity.label)" в MenuContentView), где метка роли — Main или Other.
  • В режиме ожидания: вместо этого отображается сводка работоспособности.

Приём событий

  • Источник: события agent канала управления, маршрутизируемые ControlChannel.routeWorkActivity(from:).
  • Разбираемые поля:
    • stream: "job" с data.state для запуска и остановки.
    • stream: "tool" с data.phase, data.name, необязательными data.meta/data.args.
  • Метки инструментов берутся из ToolDisplayRegistry.resolve(name:args:meta:); для нераспознанных имён используется исходное имя инструмента.

Переопределение для отладки

  • Средство выбора Settings > Debug > "Icon override":
    • System (auto) (по умолчанию)
    • Working: main / Working: other (для каждого вида инструмента: bash, read, write, edit, other)
    • Idle
  • Сохраняется в UserDefaults по ключу openclaw.iconOverride; сопоставляется с IconState.overridden.

Контрольный список тестирования

  • Запустите задание основного сеанса: значок переключается немедленно, а в строке состояния отображается метка основного сеанса.
  • Запустите задание неосновного сеанса, когда основной находится в режиме ожидания: значок и состояние отображают неосновной сеанс и остаются неизменными до его завершения.
  • Запустите основной сеанс, пока активен другой: значок мгновенно переключается на основной сеанс.
  • Быстрые серии вызовов инструментов: индикатор не мерцает (льготное окно 2 с перед очисткой завершившего работу инструмента, WorkActivityStore.toolResultGrace).
  • Строка работоспособности снова появляется, когда все сеансы переходят в режим ожидания.

Связанные материалы

Was this useful?
On this page

On this page