---
read_when:
    - Настройка UI меню Mac или логики статуса
summary: Логика состояния строки меню и то, что показывается пользователям
title: Строка меню
x-i18n:
    generated_at: "2026-06-28T23:12:22Z"
    model: gpt-5.5
    postprocess_version: locale-links-v1
    provider: openai
    source_hash: c569ced20b2f6a639d52d373cc8b55a42d7c015a0b234d5154ce67ac03c2eaf6
    source_path: platforms/mac/menu-bar.md
    workflow: 16
---

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

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

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

- Сеансы: события приходят с `runId` (для отдельного запуска) плюс `sessionKey` в полезной нагрузке. «Основной» сеанс — это ключ `main`; если он отсутствует, мы возвращаемся к последнему обновленному сеансу.
- Приоритет: основной всегда побеждает. Если основной активен, его состояние отображается немедленно. Если основной простаивает, отображается последний активный неосновной сеанс. Мы не переключаемся туда-сюда во время активности; переключение происходит только когда текущий сеанс переходит в простой или основной становится активным.
- Типы активности:
  - `job`: выполнение команды высокого уровня (`state: started|streaming|done|error`).
  - `tool`: `phase: start|result` с `toolName` и `meta/args`.

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

- `idle`
- `workingMain(ActivityKind)`
- `workingOther(ActivityKind)`
- `overridden(ActivityKind)` (отладочное переопределение)

### ActivityKind → глиф

- `exec` → 💻
- `read` → 📄
- `write` → ✍️
- `edit` → 📝
- `attach` → 📎
- по умолчанию → 🛠️

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

- `idle`: обычное существо.
- `workingMain`: бейдж с глифом, полная тонировка, анимация ног «работает».
- `workingOther`: бейдж с глифом, приглушенная тонировка, без суеты.
- `overridden`: использует выбранный глиф/тонировку независимо от активности.

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

- Корневое меню показывает одну строку «Контекст» с количеством/статусом сеансов и открывает подменю.
- Заголовок подменю «Контекст» показывает количество активных сеансов за последние 24 часа.
- Каждая строка сеанса сохраняет свою полосу токенов, возраст, предпросмотр, режим thinking/verbose, а также действия сброса, Compaction и удаления.
- Сообщения о загрузке, отключении и ошибке загрузки сеансов появляются внутри подменю «Контекст».
- Сведения об использовании провайдера и стоимости использования остаются на корневом уровне под Контекстом, чтобы их можно было быстро просмотреть без открытия подменю.

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

- Пока работа активна: `<Session role> · <activity label>`
  - Примеры: `Main · exec: pnpm test`, `Other · read: apps/macos/Sources/OpenClaw/AppState.swift`.
- В простое: возвращается к сводке работоспособности.

## Прием событий

- Источник: события `agent` control-channel (`ControlChannel.handleAgentEvent`).
- Разобранные поля:
  - `stream: "job"` с `data.state` для запуска/остановки.
  - `stream: "tool"` с `data.phase`, `name`, необязательными `meta`/`args`.
- Метки:
  - `exec`: первая строка `args.command`.
  - `read`/`write`: сокращенный путь.
  - `edit`: путь плюс выведенный тип изменения из `meta`/количества строк diff.
  - запасной вариант: имя инструмента.

## Отладочное переопределение

- Настройки ▸ Отладка ▸ средство выбора «Переопределение значка»:
  - `System (auto)` (по умолчанию)
  - `Working: main` (по типу инструмента)
  - `Working: other` (по типу инструмента)
  - `Idle`
- Хранится через `@AppStorage("iconOverride")`; сопоставляется с `IconState.overridden`.

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

- Запустить задачу основного сеанса: убедиться, что значок переключается немедленно, а строка состояния показывает метку основного сеанса.
- Запустить задачу неосновного сеанса, пока основной простаивает: значок/статус показывает неосновной; остается стабильным до завершения.
- Запустить основной, пока другой активен: значок мгновенно переключается на основной.
- Быстрые всплески инструментов: убедиться, что бейдж не мерцает (льготный TTL для результатов инструментов).
- Строка работоспособности снова появляется, когда все сеансы простаивают.

## Связанное

- [приложение macOS](/ru/platforms/macos)
- [Значок строки меню](/ru/platforms/mac/icon)
