Архитектура IPC OpenClaw для macOS
Текущая модель: локальный сокет Unix подключает службу хоста узла к приложению macOS для утверждений exec + system.run. Существует отладочный CLI openclaw-mac для проверки обнаружения/подключения; действия агента все еще проходят через WebSocket шлюза и node.invoke. Автоматизация пользовательского интерфейса использует PeekabooBridge.
Цели
- Один экземпляр GUI-приложения, которое владеет всей работой, связанной с TCC (уведомления, запись экрана, микрофон, речь, AppleScript).
- Небольшая поверхность для автоматизации: команды шлюза + узла, плюс PeekabooBridge для автоматизации пользовательского интерфейса.
- Предсказуемые разрешения: всегда один и тот же подписанный идентификатор пакета, запускаемый launchd, чтобы предоставления TCC сохранялись.
Как это работает
Шлюз + транспорт узла
- Приложение запускает шлюз (локальный режим) и подключается к нему как узел.
- Действия агента выполняются через node.invoke (например, system.run, system.notify, canvas.*).
Служба узла + IPC приложения
- Безголовая служба хоста узла подключается к WebSocket шлюза.
- Запросы system.run пересылаются приложению macOS через локальный сокет Unix.
- Приложение выполняет exec в контексте пользовательского интерфейса, запрашивает при необходимости и возвращает вывод.
Диаграмма (SCI):
Агент -> Шлюз -> Служба узла (WS)
| IPC (UDS + токен + HMAC + TTL)
v
Приложение Mac (UI + TCC + system.run)
PeekabooBridge (автоматизация пользовательского интерфейса)
- Автоматизация пользовательского интерфейса использует отдельный сокет UNIX с именем bridge.sock и протокол JSON PeekabooBridge.
- Порядок предпочтения хоста (на стороне клиента): Peekaboo.app → Claude.app → OpenClaw.app → локальное выполнение.
- Безопасность: хосты моста требуют разрешенного TeamID; escape hatch same-UID только для DEBUG защищен PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1 (соглашение Peekaboo).
- См.: Использование PeekabooBridge для деталей.
Операционные потоки
- Перезапуск/пересборка: SIGN_IDENTITY="Apple Development: <Developer Name> (<TEAMID>)" scripts/restart-mac.sh
- Убивает существующие экземпляры
- Сборка Swift + упаковка
- Записывает/инициализирует/запускает LaunchAgent
- Один экземпляр: приложение выходит рано, если уже запущен другой экземпляр с тем же идентификатором пакета.
Примечания по укреплению
- Предпочитайте требование соответствия TeamID для всех привилегированных поверхностей.
- PeekabooBridge: PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1 (только DEBUG) может разрешить вызывающим с тем же UID для локальной разработки.
- Вся связь остается только локальной; сетевые сокеты не предоставляются.
- Запросы TCC исходят только от пакета GUI-приложения; сохраняйте подписанный идентификатор пакета стабильным между пересборками.
- Укрепление IPC: режим сокета 0600, токен, проверки UID пира, challenge/response HMAC, короткий TTL.