---
read_when:
    - Налаштування UI меню macOS або логіки стану
summary: Логіка стану рядка меню та те, що показується користувачам
title: Рядок меню
x-i18n:
    generated_at: "2026-04-05T18:10:28Z"
    model: gpt-5.4
    provider: openai
    source_hash: 8eb73c0e671a76aae4ebb653c65147610bf3e6d3c9c0943d150e292e7761d16d
    source_path: platforms/mac/menu-bar.md
    workflow: 15
---

# Логіка стану рядка меню

## Що показується

- Ми показуємо поточний стан роботи агента в іконці рядка меню та в першому рядку стану меню.
- Стан працездатності приховується, поки робота активна; він повертається, коли всі сесії перебувають у стані очікування.
- Блок “Вузли” у меню показує лише **пристрої** (спарені вузли через `node.list`), а не записи клієнтів/присутності.
- Розділ “Використання” з’являється під Context, коли доступні знімки використання провайдера.

## Модель стану

- Сесії: події надходять із `runId` (для кожного запуску) разом із `sessionKey` у корисному навантаженні. “Основна” сесія — це ключ `main`; якщо його немає, ми використовуємо сесію, оновлену найпізніше.
- Пріоритет: main завжди має перевагу. Якщо main активна, її стан показується негайно. Якщо main у стані очікування, показується найнещодавніше активна не-main сесія. Ми не перемикаємося туди-сюди посеред активності; перемикання відбувається лише тоді, коли поточна сесія переходить у стан очікування або 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`: використовує вибраний гліф/тонування незалежно від активності.

## Текст рядка стану (меню)

- Поки робота активна: `<Роль сесії> · <мітка активності>`
  - Приклади: `Main · exec: pnpm test`, `Other · read: apps/macos/Sources/OpenClaw/AppState.swift`.
- У стані очікування: повертається до зведення стану працездатності.

## Обробка подій

- Джерело: події `agent` каналу керування (`ControlChannel.handleAgentEvent`).
- Розібрані поля:
  - `stream: "job"` з `data.state` для старту/зупинки.
  - `stream: "tool"` з `data.phase`, `name`, необов’язковими `meta`/`args`.
- Мітки:
  - `exec`: перший рядок `args.command`.
  - `read`/`write`: скорочений шлях.
  - `edit`: шлях плюс визначений тип зміни з `meta`/кількості відмінностей.
  - резервний варіант: назва інструмента.

## Налагоджувальне перевизначення

- Налаштування ▸ Налагодження ▸ перемикач “Перевизначення іконки”:
  - `System (auto)` (за замовчуванням)
  - `Working: main` (для кожного типу інструмента)
  - `Working: other` (для кожного типу інструмента)
  - `Idle`
- Зберігається через `@AppStorage("iconOverride")`; зіставляється з `IconState.overridden`.

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

- Запустіть job основної сесії: переконайтеся, що іконка перемикається одразу, а рядок стану показує мітку main.
- Запустіть job не-main сесії, поки main у стані очікування: іконка/стан показують не-main; стан залишається стабільним, доки вона не завершиться.
- Запустіть main, поки інша активна: іконка миттєво перемикається на main.
- Швидкі серії викликів інструментів: переконайтеся, що бейдж не мерехтить (пільговий TTL для результатів інструментів).
- Рядок працездатності знову з’являється, щойно всі сесії переходять у стан очікування.
