Приложение-компаньон для 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.

Шлюз на macOSНавыки