Приложение для macOS
Приложение для macOS — это компаньон в строке меню для OpenClaw. Оно управляет разрешениями, управляет/подключается к Шлюзу локально (launchd или вручную) и предоставляет возможности macOS агенту как узел.
Что оно делает
- Показывает нативные уведомления и статус в строке меню.
- Управляет запросами TCC (Уведомления, Специальные возможности, Запись экрана, Микрофон, Распознавание речи, Автоматизация/AppleScript).
- Запускает или подключается к Шлюзу (локальному или удаленному).
- Предоставляет инструменты, доступные только в macOS (Canvas, Камера, Запись экрана,
system.run). - Запускает локальную службу узла в удаленном режиме (launchd) и останавливает её в локальном режиме.
- Опционально размещает PeekabooBridge для автоматизации пользовательского интерфейса.
- Устанавливает глобальный CLI (
openclaw) через npm/pnpm по запросу (bun не рекомендуется для среды выполнения Шлюза).
Локальный vs удаленный режим
- Локальный (по умолчанию): приложение подключается к запущенному локальному Шлюзу, если он присутствует; в противном случае оно включает службу launchd через
openclaw gateway install. - Удаленный: приложение подключается к Шлюзу через SSH/Tailscale и никогда не запускает локальный процесс. Приложение запускает локальную службу узла, чтобы удаленный Шлюз мог получить доступ к этому Mac. Приложение не запускает Шлюз как дочерний процесс.
Управление Launchd
Приложение управляет LaunchAgent для каждого пользователя с меткой ai.openclaw.gateway (или ai.openclaw.<profile> при использовании --profile/OPENCLAW_PROFILE; устаревшие com.openclaw.* все еще выгружаются).
launchctl kickstart -k gui/$UID/ai.openclaw.gateway
launchctl bootout gui/$UID/ai.openclaw.gateway
Замените метку на ai.openclaw.<profile> при запуске именованного профиля. Если LaunchAgent не установлен, включите его из приложения или выполните openclaw gateway install.
Возможности узла (mac)
Приложение для macOS представляется как узел. Общие команды:
- Canvas:
canvas.present,canvas.navigate,canvas.eval,canvas.snapshot,canvas.a2ui.* - Камера:
camera.snap,camera.clip - Экран:
screen.record - Система:
system.run,system.notify
Узел сообщает карту permissions, чтобы агенты могли решать, что разрешено. Служба узла + IPC приложения:
- Когда служба узла без графического интерфейса запущена (удаленный режим), она подключается к WebSocket Шлюза как узел.
system.runвыполняется в приложении для macOS (контекст UI/TCC) через локальный Unix-сокет; запросы и вывод остаются в приложении.
Диаграмма (SCI):
Gateway -> Node Service (WS)
| IPC (UDS + token + HMAC + TTL)
v
Mac App (UI + TCC + system.run)
Одобрения выполнения (system.run)
system.run контролируется Одобрениями выполнения в приложении для macOS (Настройки → Одобрения выполнения). Безопасность, запрос и белый список хранятся локально на Mac в:
~/.openclaw/exec-approvals.json
Пример:
{
"version": 1,
"defaults": {
"security": "deny",
"ask": "on-miss"
},
"agents": {
"main": {
"security": "allowlist",
"ask": "on-miss",
"allowlist": [{ "pattern": "/opt/homebrew/bin/rg" }]
}
}
}
Примечания:
- Записи
allowlist— это шаблоны glob для разрешенных путей к бинарным файлам. - Необработанный текст команды оболочки, содержащий синтаксис управления или подстановки оболочки (
&&,||,;,|, ```,$,<,>,(,)), рассматривается как промах белого списка и требует явного одобрения (или добавления бинарного файла оболочки в белый список). - Выбор «Всегда разрешать» в запросе добавляет эту команду в белый список.
- Переопределения окружения
system.runфильтруются (удаляютсяPATH,DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4), а затем объединяются с окружением приложения. - Для оболочек-оберток (
bash|sh|zsh ... -c/-lc) переопределения окружения в рамках запроса сокращаются до небольшого явного белого списка (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR). - Для решений «разрешить всегда» в режиме белого списка известные обертки диспетчеризации (
env,nice,nohup,stdbuf,timeout) сохраняют пути к внутренним исполняемым файлам вместо путей к оберткам. Если развертывание небезопасно, запись в белый список не сохраняется автоматически.
Глубокие ссылки
Приложение регистрирует схему URL openclaw:// для локальных действий.
openclaw://agent
Запускает запрос agent к Шлюзу.
open 'openclaw://agent?message=Hello%20from%20deep%20link'
Параметры запроса:
message(обязательно)sessionKey(опционально)thinking(опционально)deliver/to/channel(опционально)timeoutSeconds(опционально)key(опциональный ключ для автономного режима)
Безопасность:
- Без
keyприложение запрашивает подтверждение. - Без
keyприложение применяет короткое ограничение на длину сообщения для запроса подтверждения и игнорируетdeliver/to/channel. - С действительным
keyвыполнение происходит автономно (предназначено для личных автоматизаций).
Процесс начальной настройки (типичный)
- Установите и запустите OpenClaw.app.
- Пройдите контрольный список разрешений (запросы TCC).
- Убедитесь, что активен Локальный режим и Шлюз запущен.
- Установите CLI, если нужен доступ из терминала.
Размещение каталога состояния (macOS)
Избегайте размещения каталога состояния OpenClaw в iCloud или других папках, синхронизируемых с облаком. Пути с синхронизацией могут добавлять задержки и иногда вызывать гонки блокировок/синхронизации файлов для сессий и учетных данных. Предпочтительнее использовать локальный несинхронизируемый путь, например:
OPENCLAW_STATE_DIR=~/.openclaw
Если openclaw doctor обнаружит состояние в:
~/Library/Mobile Documents/com~apple~CloudDocs/...~/Library/CloudStorage/...
он предупредит и порекомендует вернуться к локальному пути.
Сборка и рабочий процесс разработки (нативный)
cd apps/macos && swift buildswift run OpenClaw(или Xcode)- Упаковка приложения:
scripts/package-mac-app.sh
Отладка подключения к шлюзу (macOS CLI)
Используйте отладочный CLI, чтобы проверить ту же логику рукопожатия и обнаружения WebSocket Шлюза, которую использует приложение для macOS, без запуска самого приложения.
cd apps/macos
swift run openclaw-mac connect --json
swift run openclaw-mac discover --timeout 3000 --json
Опции подключения:
--url <ws://host:port>: переопределить конфигурацию--mode <local|remote>: определить из конфигурации (по умолчанию: из конфигурации или local)--probe: принудительно выполнить свежую проверку здоровья--timeout <ms>: таймаут запроса (по умолчанию:15000)--json: структурированный вывод для сравнения
Опции обнаружения:
--include-local: включать шлюзы, которые были бы отфильтрованы как «локальные»--timeout <ms>: общее окно обнаружения (по умолчанию:2000)--json: структурированный вывод для сравнения
Совет: сравните с openclaw gateway discover --json, чтобы увидеть, отличается ли конвейер обнаружения приложения для macOS (NWBrowser + резервный DNS‑SD tailnet) от обнаружения на основе dns-sd в Node CLI.
Организация удаленного подключения (SSH-туннели)
Когда приложение для macOS работает в удаленном режиме, оно открывает SSH-туннель, чтобы локальные компоненты пользовательского интерфейса могли общаться с удаленным Шлюзом, как если бы он был на localhost.
Управляющий туннель (порт WebSocket Шлюза)
- Назначение: проверки здоровья, статус, Web Chat, конфигурация и другие вызовы плоскости управления.
- Локальный порт: порт Шлюза (по умолчанию
18789), всегда стабильный. - Удаленный порт: тот же порт Шлюза на удаленном хосте.
- Поведение: нет случайного локального порта; приложение повторно использует существующий рабочий туннель или перезапускает его при необходимости.
- Форма SSH:
ssh -N -L <local>:127.0.0.1:<remote>с опциями BatchMode + ExitOnForwardFailure + keepalive. - Отчетность об IP: SSH-туннель использует loopback, поэтому шлюз будет видеть IP узла как
127.0.0.1. Используйте транспорт Прямой (ws/wss), если хотите, чтобы отображался реальный IP клиента (см. Удаленный доступ для macOS).
Шаги настройки см. в разделе Удаленный доступ для macOS. Подробности протокола см. в разделе Протокол Шлюза.