> ## Documentation Index
> Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Строка меню

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

* Текущее рабочее состояние агента отображается в значке строки меню и в первой строке состояния меню.
* Состояние работоспособности скрывается во время активной работы и снова появляется, когда все сеансы переходят в режим ожидания.
* Корневой пункт «Контекст» открывает подменю с недавними сеансами вместо их разворачивания в корневом меню.
* Блок «Узлы» в корневом меню содержит только сопряжённые **устройства** (из `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 часа.
* В каждой строке сеанса сохраняются шкала токенов, возраст, предварительный просмотр, переключатель режимов рассуждений и подробного вывода, а также действия сброса, сжатия и удаления.
* Сообщения о загрузке, отключении и ошибках загрузки сеансов отображаются внутри подменю «Контекст».
* Разделы использования и стоимости остаются на корневом уровне под разделом «Контекст», чтобы их можно было быстро просмотреть, не открывая подменю.

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

* Во время активной работы: `<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`).
* Строка работоспособности снова появляется, когда все сеансы переходят в режим ожидания.

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

* [Приложение для macOS](https://docs2.openclaw.ai/ru/platforms/macos.md)
* [Значок строки меню](https://docs2.openclaw.ai/ru/platforms/mac/icon.md)
