Перейти к основному содержанию

Архитектура IPC OpenClaw для macOS

Текущая модель: локальный Unix-сокет соединяет службу хоста узла с приложением для macOS для подтверждений выполнения команд + system.run. Для проверки обнаружения/подключения существует отладочный CLI openclaw-mac; действия агента по‑прежнему проходят через WebSocket Gateway (шлюз) и node.invoke. Автоматизация UI использует PeekabooBridge.

Цели

  • Единственный экземпляр GUI‑приложения, который выполняет всю работу, связанную с TCC (уведомления, запись экрана, микрофон, речь, AppleScript).
  • Небольшая поверхность для автоматизации: Gateway (шлюз) + команды узла, плюс PeekabooBridge для автоматизации UI.
  • Предсказуемые разрешения: всегда один и тот же подписанный bundle ID, запуск через launchd, чтобы разрешения TCC сохранялись.

Как это работает

Транспорт Gateway (шлюз) + узел

  • Приложение запускает Gateway (шлюз) (локальный режим) и подключается к нему как узел.
  • Действия агента выполняются через node.invoke (например, system.run, system.notify, canvas.*).

Служба узла + IPC приложения

  • Безголовая служба хоста узла подключается к WebSocket Gateway (шлюз).
  • Запросы system.run пересылаются в приложение для macOS по локальному Unix‑сокету.
  • Приложение выполняет exec в контексте UI, при необходимости запрашивает подтверждение и возвращает вывод.
Диаграмма (SCI):
Agent -> Gateway -> Node Service (WS)
                      |  IPC (UDS + token + HMAC + TTL)
                      v
                  Mac App (UI + TCC + system.run)

PeekabooBridge (автоматизация UI)

  • Автоматизация UI использует отдельный UNIX‑сокет с именем bridge.sock и JSON‑протокол PeekabooBridge.
  • Порядок предпочтений хостов (на стороне клиента): Peekaboo.app → Claude.app → OpenClaw.app → локальное выполнение.
  • Безопасность: хосты моста требуют разрешённый TeamID; отладочный обход с тем же UID (только DEBUG) защищён PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1 (соглашение Peekaboo).
  • См.: использование PeekabooBridge для подробностей.

Операционные потоки

  • Перезапуск/пересборка: SIGN_IDENTITY="Apple Development: <Developer Name> (<TEAMID>)" scripts/restart-mac.sh
    • Завершает существующие экземпляры
    • Сборка Swift + упаковка
    • Запись/инициализация/перезапуск LaunchAgent
  • Единственный экземпляр: приложение завершает работу на раннем этапе, если уже запущен другой экземпляр с тем же bundle ID.

Заметки о твердости

  • Предпочтительно требовать совпадение TeamID для всех привилегированных поверхностей.
  • PeekabooBridge: PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1 (только DEBUG) может разрешать вызовы от процессов с тем же UID для локальной разработки.
  • Вся коммуникация остаётся только локальной; сетевые сокеты не открываются.
  • Запросы TCC инициируются только из GUI‑приложения; поддерживайте стабильный подписанный bundle ID между пересборками.
  • Усиление IPC: режим сокета 0600, токен, проверки UID пира, HMAC‑challenge/response, короткий TTL.