Перейти до основного вмісту

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

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

  • Ми показуємо поточний стан роботи агента в іконці рядка меню та в першому рядку стану меню.
  • Стан працездатності приховується, поки робота активна; він повертається, коли всі сесії перебувають у стані очікування.
  • Блок “Вузли” у меню показує лише пристрої (спарені вузли через 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 для результатів інструментів).
  • Рядок працездатності знову з’являється, щойно всі сесії переходять у стан очікування.