macOS companion app

Рядок меню

Що показано

  • Ми відображаємо поточний робочий стан агента в іконці рядка меню та в першому рядку стану меню.
  • Стан працездатності приховано, доки робота активна; він повертається, коли всі сесії неактивні.
  • Кореневе підменю «Контекст» містить нещодавні сесії замість того, щоб розгортати їх безпосередньо в кореневому меню.
  • Блок «Nodes» у кореневому меню перелічує лише пристрої (спарені вузли через node.list), а не записи клієнтів/присутності.
  • Кореневий розділ «Використання» з’являється під «Контекст», коли доступні знімки використання провайдера, а за ними, коли доступні, наведено деталі вартості використання.

Модель станів

  • Сесії: події надходять із runId (для окремого запуску) плюс sessionKey у payload. «Головна» сесія має ключ 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, а також дії скидання, ущільнення й видалення.
  • Повідомлення про завантаження, від’єднання та помилки завантаження сесій з’являються всередині підменю «Контекст».
  • Використання провайдера та деталі вартості використання залишаються на кореневому рівні під «Контекст», щоб їх можна було швидко переглянути без відкриття підменю.

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

  • Поки робота активна: &lt;Session role&gt; · <activity label>
    • Приклади: Main · exec: pnpm test, Other · read: apps/macos/Sources/OpenClaw/AppState.swift.
  • Коли неактивно: повертається до зведення працездатності.

Приймання подій

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

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

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

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

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

Пов’язане