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)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(налагоджувальне перевизначення)
ActivityKind → гліф
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- типово → 🛠️
Візуальне зіставлення
idle: звичайний персонаж.workingMain: бейдж із гліфом, повне тонування, анімація ніг «працює».workingOther: бейдж із гліфом, приглушене тонування, без метушні.overridden: використовує вибраний гліф/тонування незалежно від активності.
Підменю «Контекст»
- Кореневе меню показує один рядок «Контекст» із кількістю/станом сесій і відкриває підменю.
- Заголовок підменю «Контекст» показує кількість активних сесій за останні 24 години.
- Кожен рядок сесії зберігає свою смугу токенів, вік, попередній перегляд, thinking/verbose, а також дії скидання, ущільнення й видалення.
- Повідомлення про завантаження, від’єднання та помилки завантаження сесій з’являються всередині підменю «Контекст».
- Використання провайдера та деталі вартості використання залишаються на кореневому рівні під «Контекст», щоб їх можна було швидко переглянути без відкриття підменю.
Текст рядка стану (меню)
- Поки робота активна:
<Session role> · <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-пільга для результатів інструментів).
- Рядок працездатності знову з’являється, щойно всі сесії стають неактивними.