Вузли
Вузол — це допоміжний пристрій (macOS/iOS/Android/headless), який підключається до WebSocket Gateway (той самий порт, що й для операторів) зrole: "node" і надає поверхню команд (наприклад, canvas.*, camera.*, device.*, notifications.*, system.*) через node.invoke. Подробиці протоколу: Протокол Gateway.
Застарілий транспорт: Протокол bridge (TCP JSONL;
лише історично для поточних вузлів).
macOS також може працювати в режимі вузла: застосунок menubar підключається до WS-сервера Gateway і надає свої локальні команди canvas/camera як вузол (тому openclaw nodes … працює з цим Mac).
Примітки:
- Вузли — це периферійні пристрої, а не gateway. Вони не запускають сервіс gateway.
- Повідомлення Telegram/WhatsApp тощо надходять на gateway, а не на вузли.
- Runbook для усунення несправностей: /nodes/troubleshooting
Pairing + статус
WS-вузли використовують pairing пристрою. Під часconnect вузли пред’являють ідентичність пристрою; Gateway
створює запит pairing пристрою для role: node. Підтверджуйте через CLI devices (або UI).
Швидкий CLI:
requestId. Перед підтвердженням знову виконайте
openclaw devices list.
Примітки:
nodes statusпозначає вузол як paired, коли його роль pairing пристрою міститьnode.- Запис pairing пристрою — це сталий контракт підтверджених ролей. Ротація токена залишається в межах цього контракту; вона не може підвищити paired-вузол до іншої ролі, якої не надавав pairing.
node.pair.*(CLI:openclaw nodes pending/approve/reject/rename) — це окреме сховище pairing вузлів, яким володіє gateway; воно не керує WS-handshakeconnect.- Область підтвердження залежить від оголошених команд очікувального запиту:
- запит без команд:
operator.pairing - команди вузла без exec:
operator.pairing+operator.write system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- запит без команд:
Віддалений host вузла (system.run)
Використовуйте node host, коли ваш Gateway працює на одній машині, а ви хочете, щоб команди
виконувалися на іншій. Модель усе одно взаємодіє з gateway; gateway
пересилає виклики exec до node host, коли вибрано host=node.
Що де виконується
- Host Gateway: отримує повідомлення, запускає модель, маршрутизує виклики інструментів.
- Node host: виконує
system.run/system.whichна машині вузла. - Підтвердження: застосовуються на node host через
~/.openclaw/exec-approvals.json.
- Запуски вузла з підтвердженням прив’язуються до точного контексту запиту.
- Для прямих виконань shell/runtime-файлів OpenClaw також у режимі best-effort прив’язує один конкретний локальний файловий операнд і забороняє запуск, якщо цей файл зміниться до виконання.
- Якщо OpenClaw не може точно визначити рівно один конкретний локальний файл для команди interpreter/runtime, виконання з підтвердженням забороняється замість удавання повного покриття runtime. Для ширшої семантики interpreter використовуйте sandboxing, окремі хости або явний trusted allowlist/full workflow.
Запустіть node host (у foreground)
На машині вузла:Віддалений gateway через SSH-тунель (bind до loopback)
Якщо Gateway прив’язано до loopback (gateway.bind=loopback, типово в локальному режимі),
віддалені node host не можуть підключитися напряму. Створіть SSH-тунель і вкажіть
node host на локальний кінець цього тунелю.
Приклад (node host -> gateway host):
openclaw node runпідтримує автентифікацію за token або password.- Перевага надається env vars:
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD. - Резервний варіант із конфігурації:
gateway.auth.token/gateway.auth.password. - У локальному режимі node host навмисно ігнорує
gateway.remote.token/gateway.remote.password. - У віддаленому режимі
gateway.remote.token/gateway.remote.passwordпідпадають під правила пріоритету remote. - Якщо активні локальні SecretRef у
gateway.auth.*налаштовано, але не визначено, автентифікація node host блокується за принципом fail-closed. - Визначення автентифікації node host враховує лише env vars
OPENCLAW_GATEWAY_*.
Запустіть node host (як сервіс)
Pair + назва
На хості gateway:openclaw devices list
і підтвердьте поточний requestId.
Варіанти іменування:
--display-nameуopenclaw node run/openclaw node install(зберігається в~/.openclaw/node.jsonна вузлі).openclaw nodes rename --node <id|name|ip> --name "Build Node"(перевизначення на gateway).
Додайте команди в allowlist
Підтвердження exec діють для кожного node host окремо. Додавайте записи allowlist із gateway:~/.openclaw/exec-approvals.json.
Спрямуйте exec на вузол
Налаштуйте типові значення (конфігурація gateway):exec з host=node виконуватиметься на node host (відповідно до
allowlist/підтверджень вузла).
host=auto сам по собі не вибере вузол неявно, але явний запит host=node для конкретного виклику дозволений із auto. Якщо ви хочете, щоб exec на вузлі був типовим для сесії, явно задайте tools.exec.host=node або /exec host=node ....
Пов’язане:
Виклик команд
Низькорівневий спосіб (сирий RPC):Знімки екрана (знімки canvas)
Якщо вузол показує Canvas (WebView),canvas.snapshot повертає { format, base64 }.
CLI helper (записує у тимчасовий файл і друкує MEDIA:<path>):
Керування Canvas
canvas presentприймає URL або локальні шляхи до файлів (--target), а також необов’язкові--x/--y/--width/--heightдля позиціювання.canvas evalприймає inline JS (--js) або позиційний аргумент.
A2UI (Canvas)
- Підтримується лише A2UI v0.8 JSONL (v0.9/createSurface відхиляється).
Фото + відео (камера вузла)
Фото (jpg):
mp4):
- Вузол має бути на передньому плані для
canvas.*іcamera.*(виклики у фоні повертаютьNODE_BACKGROUND_UNAVAILABLE). - Тривалість кліпу обмежується (зараз
<= 60s), щоб уникати надто великих payload base64. - Android по можливості покаже запити на дозволи
CAMERA/RECORD_AUDIO; відхилені дозволи завершуються помилкою*_PERMISSION_REQUIRED.
Запис екрана (вузли)
Підтримувані вузли надаютьscreen.record (mp4). Приклад:
- Доступність
screen.recordзалежить від платформи вузла. - Тривалість запису екрана обмежується до
<= 60s. --no-audioвимикає захоплення мікрофона на підтримуваних платформах.- Використовуйте
--screen <index>, щоб вибрати дисплей, якщо екранів кілька.
Геолокація (вузли)
Вузли надаютьlocation.get, якщо в налаштуваннях увімкнено Location.
CLI helper:
- Location типово вимкнено.
- “Always” потребує системного дозволу; отримання у фоні працює в режимі best-effort.
- Відповідь містить lat/lon, точність (у метрах) і часову позначку.
SMS (вузли Android)
Вузли Android можуть надаватиsms.send, коли користувач надає дозвіл SMS і пристрій підтримує телефонію.
Низькорівневий виклик:
- Перед тим як можливість буде оголошена, на пристрої Android треба підтвердити запит дозволу.
- Пристрої лише з Wi‑Fi без телефонії не оголошуватимуть
sms.send.
Команди Android для пристрою + персональних даних
Вузли Android можуть оголошувати додаткові сімейства команд, коли ввімкнено відповідні можливості. Доступні сімейства:device.status,device.info,device.permissions,device.healthnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
- Команди руху керуються доступними датчиками на рівні можливостей.
Системні команди (node host / вузол mac)
Вузол macOS надаєsystem.run, system.notify і system.execApprovals.get/set.
Headless node host надає system.run, system.which і system.execApprovals.get/set.
Приклади:
system.runповертає stdout/stderr/exit code у payload.- Виконання shell тепер проходить через інструмент
execзhost=node;nodesлишається прямою RPC-поверхнею для явних команд вузла. nodes invokeне відкриваєsystem.runабоsystem.run.prepare; вони лишаються лише на шляху exec.- Шлях exec готує канонічний
systemRunPlanперед підтвердженням. Щойно підтвердження надано, gateway пересилає саме цей збережений план, а не будь-які пізніше змінені викликачем поля command/cwd/session. system.notifyвраховує стан дозволів сповіщень у застосунку macOS.- Для нерозпізнаних метаданих вузла
platform/deviceFamilyвикористовується консервативний типовий allowlist, який виключаєsystem.runіsystem.which. Якщо вам свідомо потрібні ці команди для невідомої платформи, додайте їх явно черезgateway.nodes.allowCommands. system.runпідтримує--cwd,--env KEY=VAL,--command-timeoutі--needs-screen-recording.- Для shell-обгорток (
bash|sh|zsh ... -c/-lc) значення--env, прив’язані до запиту, скорочуються до явного allowlist (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR). - Для рішень allow-always в режимі allowlist відомі dispatch-обгортки (
env,nice,nohup,stdbuf,timeout) зберігають внутрішні шляхи виконуваних файлів, а не шляхи до самих обгорток. Якщо безпечне розгортання неможливе, запис allowlist автоматично не зберігається. - На node host Windows у режимі allowlist запуски shell-обгорток через
cmd.exe /cпотребують підтвердження (сам запис allowlist не дозволяє цю форму автоматично). system.notifyпідтримує--priority <passive|active|timeSensitive>і--delivery <system|overlay|auto>.- Node host ігнорують перевизначення
PATHі прибирають небезпечні ключі startup/shell (DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4). Якщо вам потрібні додаткові записи PATH, налаштуйте середовище сервісу node host (або встановлюйте інструменти у стандартних місцях) замість передаванняPATHчерез--env. - У режимі вузла macOS
system.runкерується підтвердженнями exec у застосунку macOS (Settings → Exec approvals). Ask/allowlist/full працюють так само, як у headless node host; відхилені запити повертаютьSYSTEM_RUN_DENIED. - На headless node host
system.runкерується підтвердженнями exec (~/.openclaw/exec-approvals.json).
Прив’язка exec до вузла
Коли доступно кілька вузлів, ви можете прив’язати exec до конкретного вузла. Це задає типовий вузол дляexec host=node (і може бути перевизначено для агента).
Глобальне типове значення:
Мапа дозволів
Вузли можуть включати мапуpermissions у node.list / node.describe, де ключами є назви дозволів (наприклад, screenRecording, accessibility), а значеннями — булеві значення (true = дозволено).
Headless node host (кросплатформний)
OpenClaw може запускати headless node host (без UI), який підключається до WebSocket Gateway і надаєsystem.run / system.which. Це корисно на Linux/Windows
або для запуску мінімального вузла поруч із сервером.
Запуск:
- Pairing усе одно потрібен (Gateway покаже запит pairing пристрою).
- Node host зберігає свій id вузла, токен, display name і дані підключення до gateway у
~/.openclaw/node.json. - Підтвердження exec застосовуються локально через
~/.openclaw/exec-approvals.json(див. Підтвердження Exec). - На macOS headless node host типово виконує
system.runлокально. ЗадайтеOPENCLAW_NODE_EXEC_HOST=app, щоб маршрутизуватиsystem.runчерез companion app exec host; додайтеOPENCLAW_NODE_EXEC_FALLBACK=0, щоб вимагати host застосунку й блокуватися за принципом fail-closed, якщо він недоступний. - Додайте
--tls/--tls-fingerprint, якщо Gateway WS використовує TLS.
Режим вузла на Mac
- Застосунок menubar macOS підключається до WS-сервера Gateway як вузол (тому
openclaw nodes …працює з цим Mac). - У remote mode застосунок відкриває SSH-тунель для порту Gateway і підключається до
localhost.