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)
idleworkingMain(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 часа.
- В каждой строке сеанса сохраняются шкала токенов, возраст, предварительный просмотр, переключатель режимов рассуждений и подробного вывода, а также действия сброса, сжатия и удаления.
- Сообщения о загрузке, отключении и ошибках загрузки сеансов отображаются внутри подменю «Контекст».
- Разделы использования и стоимости остаются на корневом уровне под разделом «Контекст», чтобы их можно было быстро просмотреть, не открывая подменю.
Текст строки состояния (меню)
- Во время активной работы:
<Session role> · <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?