role: "node" и предоставляет командную поверхность (например, canvas.*, camera.*, device.*, notifications.*, system.*) через node.invoke. Подробности протокола: протокол Gateway.
Устаревший транспорт: протокол Bridge (TCP JSONL;
только исторически для текущих Node).
macOS также может работать в режиме Node: приложение в строке меню подключается к WS-серверу Gateway и предоставляет свои локальные команды canvas/camera как Node (так что openclaw nodes … работает с этим Mac). В режиме удаленного Gateway автоматизация браузера обрабатывается хостом Node CLI (openclaw node run или установленной службой Node), а не нативным приложением Node.
Примечания:
- Node — это периферийные устройства, а не Gateway. Они не запускают службу Gateway.
- Сообщения Telegram/WhatsApp/и т. д. поступают на Gateway, а не на Node.
- Руководство по устранению неполадок: /nodes/troubleshooting
Сопряжение и статус
WS Node используют сопряжение устройств. Node предъявляют идентификатор устройства во времяconnect; Gateway создает запрос на сопряжение устройства для role: node. Одобрите его через CLI устройств (или UI).
Быстрый CLI:
requestId. Повторно выполните openclaw devices list перед одобрением.
Примечания:
nodes statusпомечает Node как сопряженный, когда его роль сопряжения устройства включаетnode.- Запись сопряжения устройства — это долговечный контракт утвержденной роли. Ротация токенов остается внутри этого контракта; она не может повысить сопряженный Node до другой роли, которую одобрение сопряжения никогда не предоставляло.
node.pair.*(CLI:openclaw nodes pending/approve/reject/remove/rename) — это отдельное хранилище сопряжений Node, принадлежащее Gateway; оно не ограничивает рукопожатие WSconnect.openclaw nodes remove --node <id|name|ip>удаляет сопряжение Node. Для Node на основе устройства это отзывает рольnodeу устройства вdevices/paired.jsonи отключает сессии этого устройства с ролью Node — устройство со смешанными ролями сохраняет свою строку и теряет только рольnode, а строка устройства только с ролью Node удаляется. Также очищается любое совпадающее значение из отдельного хранилища сопряжений Node, принадлежащего Gateway.operator.pairingможет удалять строки Node без роли оператора; вызывающему через токен устройства, который отзывает собственную роль Node на устройстве со смешанными ролями, дополнительно требуетсяoperator.admin.- Область одобрения следует объявленным командам ожидающего запроса:
- запрос без команд:
operator.pairing - не-exec команды Node:
operator.pairing+operator.write system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- запрос без команд:
Удаленный хост Node (system.run)
Используйте хост Node, когда Gateway работает на одной машине, а команды должны выполняться на другой. Модель по-прежнему общается с Gateway; Gateway пересылает вызовыexec на хост Node, когда выбран host=node.
Что где выполняется
- Хост Gateway: принимает сообщения, запускает модель, маршрутизирует вызовы инструментов.
- Хост Node: выполняет
system.run/system.whichна машине Node. - Одобрения: применяются на хосте Node через
~/.openclaw/exec-approvals.json.
- Запуски Node на основе одобрений привязываются к точному контексту запроса.
- Для прямых shell/runtime-выполнений файлов OpenClaw также по мере возможности привязывает один конкретный локальный файловый операнд и запрещает запуск, если этот файл изменится до выполнения.
- Если OpenClaw не может определить ровно один конкретный локальный файл для команды интерпретатора/runtime, выполнение на основе одобрения запрещается, вместо того чтобы имитировать полное покрытие runtime. Используйте песочницу, отдельные хосты или явный доверенный список разрешений/полный workflow для более широких семантик интерпретатора.
Запуск хоста Node (передний план)
На машине Node:Удаленный Gateway через SSH-туннель (привязка к loopback)
Если Gateway привязан к loopback (gateway.bind=loopback, по умолчанию в локальном режиме), удаленные хосты Node не могут подключиться напрямую. Создайте SSH-туннель и направьте хост Node на локальный конец туннеля.
Пример (хост Node -> хост Gateway):
openclaw node runподдерживает аутентификацию по токену или паролю.- Предпочтительны переменные окружения:
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD. - Резервная конфигурация:
gateway.auth.token/gateway.auth.password. - В локальном режиме хост Node намеренно игнорирует
gateway.remote.token/gateway.remote.password. - В удаленном режиме
gateway.remote.token/gateway.remote.passwordприменимы согласно правилам приоритета для удаленного режима. - Если настроены активные локальные SecretRefs
gateway.auth.*, но они не разрешены, аутентификация хоста Node завершается отказом. - Разрешение аутентификации хоста Node учитывает только переменные окружения
OPENCLAW_GATEWAY_*.
Запуск хоста Node (служба)
Сопряжение и имя
На хосте Gateway:openclaw devices list и одобрите текущий requestId.
Варианты именования:
--display-nameвopenclaw node run/openclaw node install(сохраняется в~/.openclaw/node.jsonна Node).openclaw nodes rename --node <id|name|ip> --name "Build Node"(переопределение Gateway).
Добавление команд в список разрешений
Одобрения exec являются отдельными для каждого хоста Node. Добавьте записи списка разрешений из Gateway:~/.openclaw/exec-approvals.json.
Направление exec на Node
Настройте значения по умолчанию (конфигурация Gateway):exec с host=node выполняется на хосте Node (с учетом списка разрешений/одобрений Node).
host=auto не будет неявно выбирать Node самостоятельно, но явный запрос host=node для отдельного вызова разрешен из auto. Если вы хотите, чтобы exec на Node был значением по умолчанию для сессии, явно задайте tools.exec.host=node или /exec host=node ....
Связанное:
Вызов команд
Низкий уровень (сырой RPC):Политика команд
Перед вызовом команды Node должны пройти две проверки:- Node должен объявить команду в своем списке WebSocket
connect.commands. - Политика платформы Gateway должна разрешать объявленную команду.
canvas.*, camera.list, location.get и screen.snapshot. Доверенные Node, которые рекламируют возможность talk или объявляют команды talk.*, также по умолчанию разрешают объявленные команды push-to-talk (talk.ptt.start, talk.ptt.stop, talk.ptt.cancel, talk.ptt.once), независимо от метки платформы. Опасные команды или команды с высоким влиянием на приватность, такие как camera.snap, camera.clip и screen.record, по-прежнему требуют явного включения через gateway.nodes.allowCommands. gateway.nodes.denyCommands всегда имеет приоритет над значениями по умолчанию и дополнительными записями списка разрешений.
Команды Node, принадлежащие Plugin, могут добавить политику node-invoke Gateway. Эта политика выполняется после проверки списка разрешений и перед пересылкой на Node, поэтому сырой node.invoke, помощники CLI и специализированные инструменты агента используют одну и ту же границу разрешений Plugin. Опасные команды Node из Plugin по-прежнему требуют явного включения через gateway.nodes.allowCommands.
После изменения объявленного списка команд Node отклоните старое сопряжение устройства и одобрите новый запрос, чтобы Gateway сохранил обновленный снимок команд.
Конфигурация (openclaw.json)
Настройки, связанные с Node, находятся в gateway.nodes и tools.exec:
denyCommands удаляет команду даже тогда, когда значение платформы по умолчанию или запись allowCommands иначе разрешили бы ее. См. справочник конфигурации Gateway для подробностей о полях сопряжения Node Gateway и политики команд.
Переопределение Node для exec на уровне агента:
Скриншоты (снимки canvas)
Если Node показывает Canvas (WebView),canvas.snapshot возвращает { format, base64 }.
Помощник CLI (записывает во временный файл и выводит сохраненный путь):
Управление Canvas
canvas presentпринимает URL или пути к локальным файлам (--target), а также необязательные--x/--y/--width/--heightдля позиционирования.canvas evalпринимает встроенный JS (--js) или позиционный аргумент.
A2UI (Canvas)
- Мобильные Node используют встроенную страницу A2UI, принадлежащую приложению, для рендеринга с поддержкой действий.
- Поддерживается только A2UI v0.8 JSONL (v0.9/createSurface отклоняется).
- iOS и Android отображают удаленные страницы Gateway Canvas, но действия кнопок A2UI отправляются только со встроенной страницы A2UI, принадлежащей приложению. HTTP/HTTPS-страницы A2UI, размещенные на Gateway, на этих мобильных клиентах доступны только для рендеринга.
Фото и видео (камера Node)
Фото (jpg):
mp4):
- Узел должен быть на переднем плане для
canvas.*иcamera.*(фоновые вызовы возвращаютNODE_BACKGROUND_UNAVAILABLE). - Длительность клипа ограничивается (сейчас
<= 60s), чтобы избежать слишком больших полезных нагрузок base64. - Android по возможности запросит разрешения
CAMERA/RECORD_AUDIO; при отказе разрешения команда завершится ошибкой*_PERMISSION_REQUIRED.
Записи экрана (узлы)
Поддерживаемые узлы предоставляютscreen.record (mp4). Пример:
- Доступность
screen.recordзависит от платформы узла. - Записи экрана ограничиваются
<= 60s. --no-audioотключает захват микрофона на поддерживаемых платформах.- Используйте
--screen <index>, чтобы выбрать дисплей, когда доступно несколько экранов.
Местоположение (узлы)
Узлы предоставляютlocation.get, когда местоположение включено в настройках.
Вспомогательная команда CLI:
- Местоположение выключено по умолчанию.
- «Всегда» требует системного разрешения; фоновое получение выполняется по мере возможности.
- Ответ включает широту/долготу, точность (в метрах) и временную метку.
SMS (узлы Android)
Узлы Android могут предоставлятьsms.send, когда пользователь выдает разрешение SMS и устройство поддерживает телефонию.
Низкоуровневый вызов:
- Запрос разрешения должен быть принят на устройстве Android до того, как возможность будет опубликована.
- Устройства только с Wi-Fi без телефонии не будут публиковать
sms.send.
Команды устройства Android и личных данных
Узлы Android могут объявлять дополнительные семейства команд, когда включены соответствующие возможности. Доступные семейства:device.status,device.info,device.permissions,device.healthdevice.apps, когда в настройках Android включен общий доступ к установленным приложениямnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
device.appsвключается явно и по умолчанию возвращает приложения, видимые в лаунчере.- Команды движения ограничиваются возможностями доступных датчиков.
Системные команды (хост узла / узел Mac)
Узел macOS предоставляетsystem.run, system.notify и system.execApprovals.get/set.
Безголовый хост узла предоставляет system.run, system.which и system.execApprovals.get/set.
Примеры:
system.runвозвращает stdout/stderr/код выхода в полезной нагрузке.- Выполнение shell теперь проходит через инструмент
execсhost=node;nodesостается прямой RPC-поверхностью для явных команд узла. nodes invokeне предоставляетsystem.runилиsystem.run.prepare; они остаются только на пути exec.- Путь exec подготавливает канонический
systemRunPlanперед подтверждением. После выдачи подтверждения Gateway пересылает этот сохраненный план, а не какие-либо позднее отредактированные вызывающей стороной поля команды/cwd/сессии. system.notifyучитывает состояние разрешения уведомлений в приложении macOS.- Нераспознанные метаданные узла
platform/deviceFamilyиспользуют консервативный список разрешений по умолчанию, который исключаетsystem.runиsystem.which. Если эти команды намеренно нужны для неизвестной платформы, добавьте их явно черезgateway.nodes.allowCommands. system.runподдерживает--cwd,--env KEY=VAL,--command-timeoutи--needs-screen-recording.- Для оболочек-оберток (
bash|sh|zsh ... -c/-lc) значения--env, ограниченные запросом, сокращаются до явного списка разрешений (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR). - Для решений «разрешать всегда» в режиме списка разрешений известные обертки диспетчеризации (
env,flock,nice,nohup,stdbuf,timeout) сохраняют пути внутренних исполняемых файлов вместо путей оберток. Если безопасное разворачивание невозможно, запись списка разрешений автоматически не сохраняется. - На хостах узлов Windows в режиме списка разрешений запуски оболочки-обертки через
cmd.exe /cтребуют подтверждения (одна запись в списке разрешений не разрешает форму обертки автоматически). system.notifyподдерживает--priority <passive|active|timeSensitive>и--delivery <system|overlay|auto>.- Хосты узлов игнорируют переопределения
PATHи удаляют опасные ключи запуска/оболочки (DYLD_*,LD_*,BASHOPTS,FPATH,KSH_ENV,NODE_OPTIONS,NODE_REDIRECT_WARNINGS,NODE_REPL_EXTERNAL_MODULE,NODE_REPL_HISTORY,NODE_V8_COVERAGE,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4,TCLLIBPATH). Если нужны дополнительные записи PATH, настройте окружение службы хоста узла (или установите инструменты в стандартные расположения), а не передавайтеPATHчерез--env. - В режиме узла macOS
system.runограничивается подтверждениями exec в приложении macOS (Настройки → Подтверждения exec). Ask/allowlist/full ведут себя так же, как безголовый хост узла; отклоненные запросы возвращаютSYSTEM_RUN_DENIED. - На безголовом хосте узла
system.runограничивается подтверждениями exec (~/.openclaw/exec-approvals.json).
Привязка узла exec
Когда доступно несколько узлов, можно привязать exec к конкретному узлу. Это задает узел по умолчанию дляexec host=node (и может быть переопределено для каждого агента).
Глобальное значение по умолчанию:
Карта разрешений
Узлы могут включать картуpermissions в node.list / node.describe, с ключами по имени разрешения (например, screenRecording, accessibility) и булевыми значениями (true = выдано).
Безголовый хост узла (кроссплатформенный)
OpenClaw может запускать безголовый хост узла (без UI), который подключается к WebSocket Gateway и предоставляетsystem.run / system.which. Это полезно на Linux/Windows
или для запуска минимального узла рядом с сервером.
Запуск:
- Сопряжение по-прежнему требуется (Gateway покажет запрос сопряжения устройства).
- Хост узла хранит свой идентификатор узла, токен, отображаемое имя и сведения о подключении к Gateway в
~/.openclaw/node.json. - Подтверждения exec применяются локально через
~/.openclaw/exec-approvals.json(см. Подтверждения exec). - На macOS безголовый хост узла по умолчанию выполняет
system.runлокально. ЗадайтеOPENCLAW_NODE_EXEC_HOST=app, чтобы направлятьsystem.runчерез exec-хост сопутствующего приложения; добавьтеOPENCLAW_NODE_EXEC_FALLBACK=0, чтобы требовать хост приложения и завершаться отказом, если он недоступен. - Добавьте
--tls/--tls-fingerprint, когда WS Gateway использует TLS.
Режим узла Mac
- Приложение macOS в строке меню подключается к серверу WS Gateway как узел (поэтому
openclaw nodes …работает с этим Mac). - В удаленном режиме приложение открывает SSH-туннель для порта Gateway и подключается к
localhost.