Приложение-компаньон для macOS

Строка меню

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

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

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

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

Enum IconState (Swift)

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

ActivityKind → глиф

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

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

  • idle: обычный значок (critter).
  • 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/счетчиков diff.
    • запасной вариант: имя инструмента.

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

  • Настройки ▸ Отладка ▸ Селектор «Переопределение значка»:
    • Система (авто) (по умолчанию)
    • Работает: основная (по виду инструмента)
    • Работает: другая (по виду инструмента)
    • Простой
  • Сохраняется через @AppStorage("iconOverride"); преобразуется в IconState.overridden.

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

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

Настройка разработки для macOSГолосовое пробуждение