---
read_when:
    - Настройка интерфейса меню macOS или логики состояния
summary: Логика состояния строки меню и информация, отображаемая пользователям
title: Строка меню
x-i18n:
    generated_at: "2026-07-13T18:25:10Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 24
    provider: openai
    source_hash: 480a85f383a6495c0e45850a322c0c67c4cc35e21d2d29b4bd86f42fdbf9430a
    source_path: platforms/mac/menu-bar.md
    workflow: 16
---

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

- Текущее рабочее состояние агента отображается в значке строки меню и в первой строке состояния меню.
- Состояние работоспособности скрывается во время активной работы и снова появляется, когда все сеансы переходят в режим ожидания.
- Корневой пункт «Контекст» открывает подменю с недавними сеансами вместо их разворачивания в корневом меню.
- Блок «Узлы» в корневом меню содержит только сопряжённые **устройства** (из `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](/ru/platforms/macos)
- [Значок строки меню](/ru/platforms/mac/icon)
