Nodos
Un nodo es un dispositivo complementario (macOS/iOS/Android/headless) que se conecta al WebSocket de Gateway (el mismo puerto que usan los operadores) conrole: "node" y expone una superficie de comandos (por ejemplo canvas.*, camera.*, device.*, notifications.*, system.*) mediante node.invoke. Detalles del protocolo: Protocolo de Gateway.
Transporte heredado: Protocolo de bridge (TCP JSONL;
solo histórico para los nodos actuales).
macOS también puede ejecutarse en modo nodo: la app de barra de menú se conecta al servidor WS de la Gateway y expone sus comandos locales de canvas/camera como un nodo (de modo que openclaw nodes … funciona contra este Mac).
Notas:
- Los nodos son periféricos, no gateways. No ejecutan el servicio de gateway.
- Los mensajes de Telegram/WhatsApp/etc. llegan a la gateway, no a los nodos.
- Runbook de solución de problemas: /nodes/troubleshooting
Emparejamiento + estado
Los nodos WS usan emparejamiento de dispositivos. Los nodos presentan una identidad de dispositivo duranteconnect; la Gateway
crea una solicitud de emparejamiento de dispositivo para role: node. Apruébala mediante la CLI de devices (o la UI).
CLI rápida:
requestId. Vuelve a ejecutar
openclaw devices list antes de aprobar.
Notas:
nodes statusmarca un nodo como paired cuando el rol de emparejamiento del dispositivo incluyenode.- El registro de emparejamiento del dispositivo es el contrato duradero de roles aprobados. La rotación del token permanece dentro de ese contrato; no puede ampliar un nodo emparejado a un rol distinto que la aprobación de emparejamiento nunca concedió.
node.pair.*(CLI:openclaw nodes pending/approve/reject/rename) es un almacén de emparejamiento de nodos separado y gestionado por la gateway; no controla el handshakeconnectde WS.- El ámbito de aprobación sigue los comandos declarados en la solicitud pendiente:
- solicitud sin comando:
operator.pairing - comandos de nodo sin exec:
operator.pairing+operator.write system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- solicitud sin comando:
Host de nodo remoto (system.run)
Usa un host de nodo cuando tu Gateway se ejecuta en una máquina y quieres que los comandos se ejecuten en otra. El modelo sigue hablando con la gateway; la gateway reenvía las llamadasexec al host de nodo cuando se selecciona host=node.
Qué se ejecuta en cada lugar
- Host de Gateway: recibe mensajes, ejecuta el modelo, enruta llamadas de herramientas.
- Host de nodo: ejecuta
system.run/system.whichen la máquina del nodo. - Aprobaciones: se aplican en el host de nodo mediante
~/.openclaw/exec-approvals.json.
- Las ejecuciones de nodo respaldadas por aprobación vinculan el contexto exacto de la solicitud.
- Para ejecuciones directas de shell/archivos de runtime, OpenClaw también intenta vincular, en la medida de lo posible, un único operando de archivo local concreto y deniega la ejecución si ese archivo cambia antes de ejecutarse.
- Si OpenClaw no puede identificar exactamente un archivo local concreto para un comando de intérprete/runtime, la ejecución respaldada por aprobación se deniega en lugar de fingir cobertura total del runtime. Usa sandboxing, hosts separados o una lista de permitidos/flujo de confianza explícito para una semántica más amplia de intérpretes.
Iniciar un host de nodo (primer plano)
En la máquina del nodo:Gateway remota mediante túnel SSH (enlace loopback)
Si la Gateway está enlazada a loopback (gateway.bind=loopback, valor predeterminado en modo local),
los hosts de nodo remotos no pueden conectarse directamente. Crea un túnel SSH y apunta el
host de nodo al extremo local del túnel.
Ejemplo (host de nodo -> host de gateway):
openclaw node runadmite autenticación por token o contraseña.- Se prefieren variables de entorno:
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD. - El fallback en configuración es
gateway.auth.token/gateway.auth.password. - En modo local, el host de nodo ignora intencionadamente
gateway.remote.token/gateway.remote.password. - En modo remoto,
gateway.remote.token/gateway.remote.passwordson válidos según las reglas de precedencia remota. - Si hay SecretRefs activos
gateway.auth.*configurados pero no resueltos, la autenticación del host de nodo falla de forma cerrada. - La resolución de autenticación del host de nodo solo respeta variables de entorno
OPENCLAW_GATEWAY_*.
Iniciar un host de nodo (servicio)
Emparejar + nombrar
En el host de la gateway:openclaw devices list
y aprueba el requestId actual.
Opciones de nombre:
--display-nameenopenclaw node run/openclaw node install(se conserva en~/.openclaw/node.jsonen el nodo).openclaw nodes rename --node <id|name|ip> --name "Build Node"(sobrescritura en la gateway).
Añadir los comandos a la lista de permitidos
Las aprobaciones de exec son por host de nodo. Añade entradas a la lista de permitidos desde la gateway:~/.openclaw/exec-approvals.json.
Apuntar exec al nodo
Configura los valores predeterminados (configuración de gateway):exec con host=node se ejecuta en el host de nodo (sujeta a la
lista de permitidos/aprobaciones del nodo).
host=auto no elegirá implícitamente el nodo por sí solo, pero se permite una solicitud explícita por llamada host=node desde auto. Si quieres que exec en el nodo sea el valor predeterminado para la sesión, establece tools.exec.host=node o /exec host=node ... explícitamente.
Relacionado:
Invocar comandos
Nivel bajo (RPC sin procesar):Capturas de pantalla (instantáneas de canvas)
Si el nodo está mostrando el Canvas (WebView),canvas.snapshot devuelve { format, base64 }.
Helper de CLI (escribe en un archivo temporal e imprime MEDIA:<path>):
Controles de Canvas
canvas presentacepta URL o rutas de archivo locales (--target), además de--x/--y/--width/--heightopcionales para el posicionamiento.canvas evalacepta JS inline (--js) o un argumento posicional.
A2UI (Canvas)
- Solo se admite A2UI v0.8 JSONL (v0.9/createSurface se rechaza).
Fotos + videos (camera del nodo)
Fotos (jpg):
mp4):
- El nodo debe estar en primer plano para
canvas.*ycamera.*(las llamadas en segundo plano devuelvenNODE_BACKGROUND_UNAVAILABLE). - La duración del clip está limitada (actualmente
<= 60s) para evitar cargas base64 demasiado grandes. - Android solicitará permisos
CAMERA/RECORD_AUDIOcuando sea posible; si se deniegan, fallará con*_PERMISSION_REQUIRED.
Grabaciones de pantalla (nodos)
Los nodos compatibles exponenscreen.record (mp4). Ejemplo:
- La disponibilidad de
screen.recorddepende de la plataforma del nodo. - Las grabaciones de pantalla están limitadas a
<= 60s. --no-audiodesactiva la captura del micrófono en las plataformas compatibles.- Usa
--screen <index>para seleccionar una pantalla cuando haya varias disponibles.
Ubicación (nodos)
Los nodos exponenlocation.get cuando la ubicación está habilitada en la configuración.
Helper de CLI:
- La ubicación está desactivada por defecto.
- “Always” requiere permiso del sistema; la obtención en segundo plano es best-effort.
- La respuesta incluye lat/lon, precisión (metros) y marca de tiempo.
SMS (nodos Android)
Los nodos Android pueden exponersms.send cuando el usuario concede el permiso SMS y el dispositivo admite telefonía.
Invocación de bajo nivel:
- La solicitud de permiso debe aceptarse en el dispositivo Android antes de que se anuncie la capacidad.
- Los dispositivos solo Wi‑Fi sin telefonía no anunciarán
sms.send.
Comandos de dispositivo Android + datos personales
Los nodos Android pueden anunciar familias de comandos adicionales cuando las capacidades correspondientes están habilitadas. Familias disponibles:device.status,device.info,device.permissions,device.healthnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
- Los comandos de movimiento están controlados por capacidades según los sensores disponibles.
Comandos del sistema (host de nodo / nodo Mac)
El nodo de macOS exponesystem.run, system.notify y system.execApprovals.get/set.
El host de nodo headless expone system.run, system.which y system.execApprovals.get/set.
Ejemplos:
system.rundevuelve stdout/stderr/código de salida en la carga.- La ejecución de shell ahora pasa por la herramienta
execconhost=node;nodessigue siendo la superficie de RPC directa para comandos explícitos del nodo. nodes invokeno exponesystem.runnisystem.run.prepare; estos permanecen solo en la ruta exec.- La ruta exec prepara un
systemRunPlancanónico antes de la aprobación. Una vez concedida una aprobación, la gateway reenvía ese plan almacenado, no ningún campo command/cwd/session editado posteriormente por quien llama. system.notifyrespeta el estado del permiso de notificaciones en la app de macOS.- Los metadatos de nodo
platform/deviceFamilyno reconocidos usan una lista de permitidos conservadora que excluyesystem.runysystem.which. Si intencionadamente necesitas esos comandos para una plataforma desconocida, añádelos explícitamente congateway.nodes.allowCommands. system.runadmite--cwd,--env KEY=VAL,--command-timeouty--needs-screen-recording.- Para wrappers de shell (
bash|sh|zsh ... -c/-lc), los valores--envdelimitados a la solicitud se reducen a una lista de permitidos explícita (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR). - Para decisiones de permitir siempre en modo allowlist, los wrappers de despacho conocidos (
env,nice,nohup,stdbuf,timeout) conservan las rutas internas del ejecutable en lugar de las rutas del wrapper. Si el desempaquetado no es seguro, no se conserva automáticamente ninguna entrada en la lista de permitidos. - En hosts de nodo Windows en modo allowlist, las ejecuciones mediante wrappers de shell con
cmd.exe /crequieren aprobación (la entrada en la lista de permitidos por sí sola no autoriza automáticamente el formato wrapper). system.notifyadmite--priority <passive|active|timeSensitive>y--delivery <system|overlay|auto>.- Los hosts de nodo ignoran las sobrescrituras de
PATHy eliminan claves peligrosas de inicio/shell (DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4). Si necesitas entradas adicionales de PATH, configura el entorno del servicio del host de nodo (o instala herramientas en ubicaciones estándar) en lugar de pasarPATHmediante--env. - En modo nodo de macOS,
system.runestá controlado por exec approvals en la app de macOS (Settings → Exec approvals). Ask/allowlist/full se comportan igual que en el host de nodo headless; las solicitudes denegadas devuelvenSYSTEM_RUN_DENIED. - En el host de nodo headless,
system.runestá controlado por exec approvals (~/.openclaw/exec-approvals.json).
Vinculación de nodo para exec
Cuando hay varios nodos disponibles, puedes vincular exec a un nodo específico. Esto establece el nodo predeterminado paraexec host=node (y puede sobrescribirse por agente).
Valor predeterminado global:
Mapa de permisos
Los nodos pueden incluir un mapapermissions en node.list / node.describe, indexado por nombre de permiso (por ejemplo screenRecording, accessibility) con valores booleanos (true = concedido).
Host de nodo headless (multiplataforma)
OpenClaw puede ejecutar un host de nodo headless (sin UI) que se conecta al WebSocket de Gateway y exponesystem.run / system.which. Esto es útil en Linux/Windows
o para ejecutar un nodo mínimo junto a un servidor.
Inícialo:
- El emparejamiento sigue siendo obligatorio (la Gateway mostrará una solicitud de emparejamiento de dispositivo).
- El host de nodo almacena su id de nodo, token, nombre para mostrar e información de conexión de gateway en
~/.openclaw/node.json. - Las exec approvals se aplican localmente mediante
~/.openclaw/exec-approvals.json(consulta Exec approvals). - En macOS, el host de nodo headless ejecuta
system.runlocalmente por defecto. EstableceOPENCLAW_NODE_EXEC_HOST=apppara enrutarsystem.runa través del host exec de la app complementaria; añadeOPENCLAW_NODE_EXEC_FALLBACK=0para exigir el host de la app y fallar de forma cerrada si no está disponible. - Añade
--tls/--tls-fingerprintcuando el WS de Gateway use TLS.
Modo nodo en Mac
- La app de barra de menú de macOS se conecta al servidor WS de Gateway como nodo (de modo que
openclaw nodes …funciona contra este Mac). - En modo remoto, la app abre un túnel SSH para el puerto de Gateway y se conecta a
localhost.