Приложение-компаньон для macOS
IPC в macOS
Текущая модель: локальный Unix-сокет соединяет сервис узла node с приложением macOS для подтверждений выполнения и system.run. Существует отладочный CLI openclaw-mac для проверки обнаружения/подключения; действия агента по-прежнему проходят через WebSocket шлюза и node.invoke. Автоматизация интерфейса использует PeekabooBridge.
Цели
- Единственный экземпляр GUI-приложения, который отвечает за всю работу с TCC (уведомления, запись экрана, микрофон, речь, AppleScript).
- Небольшая поверхность для автоматизации: Шлюз + команды узла, а также PeekabooBridge для автоматизации интерфейса.
- Предсказуемые разрешения: всегда один и тот же подписанный Bundle ID, запускаемый через launchd, чтобы разрешения TCC сохранялись.
Как это работает
Транспорт Шлюза + узел
- Приложение запускает Шлюз (локальный режим) и подключается к нему как узел.
- Действия агента выполняются через
node.invoke(например,system.run,system.notify,canvas.*).
IPC между сервисом узла и приложением
- Фоновый сервис узла подключается к WebSocket Шлюза.
- Запросы
system.runперенаправляются в приложение macOS через локальный Unix-сокет. - Приложение выполняет команду в контексте UI, запрашивает подтверждение при необходимости и возвращает результат.
Диаграмма (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; лазейка только для DEBUG для клиентов с тем же UID защищена переменной
PEEKABOO_ALLOW_UNSIGNED_SOCKET_CLIENTS=1(соглашение Peekaboo). - Подробнее см.: Использование PeekabooBridge.
Операционные потоки
- Перезапуск/пересборка:
SIGN_IDENTITY="Apple Development: <Имя разработчика> (<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.