Архитектура 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, при необходимости запрашивает подтверждение и возвращает вывод.
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.