Nodi
Un nodo è un dispositivo companion (macOS/iOS/Android/headless) che si connette al WebSocket del Gateway (stessa porta degli operatori) conrole: "node" ed espone una superficie di comandi (ad esempio canvas.*, camera.*, device.*, notifications.*, system.*) tramite node.invoke. Dettagli del protocollo: Protocollo del Gateway.
Transport legacy: Protocollo bridge (TCP JSONL;
solo storico per i nodi attuali).
Anche macOS può funzionare in modalità nodo: l’app nella barra dei menu si connette al server WS del Gateway ed espone i suoi comandi locali canvas/fotocamera come nodo (quindi openclaw nodes … funziona su questo Mac).
Note:
- I nodi sono periferiche, non gateway. Non eseguono il servizio gateway.
- I messaggi Telegram/WhatsApp/ecc. arrivano al gateway, non ai nodi.
- Runbook di risoluzione dei problemi: /nodes/troubleshooting
Pairing + stato
I nodi WS usano il pairing del dispositivo. I nodi presentano un’identità del dispositivo duranteconnect; il Gateway
crea una richiesta di pairing del dispositivo per role: node. Approvala tramite la CLI devices (o UI).
CLI rapida:
requestId. Esegui di nuovo
openclaw devices list prima di approvare.
Note:
nodes statuscontrassegna un nodo come paired quando il ruolo di pairing del dispositivo includenode.- Il record di pairing del dispositivo è il contratto durevole dei ruoli approvati. La rotazione del token resta all’interno di quel contratto; non può elevare un nodo associato a un ruolo diverso che l’approvazione del pairing non ha mai concesso.
node.pair.*(CLI:openclaw nodes pending/approve/reject/rename) è uno store separato di pairing dei nodi gestito dal gateway; non controlla l’handshake WSconnect.- L’ambito di approvazione segue i comandi dichiarati nella richiesta in sospeso:
- richiesta senza comandi:
operator.pairing - comandi nodo non-exec:
operator.pairing+operator.write system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- richiesta senza comandi:
Host nodo remoto (system.run)
Usa un host nodo quando il tuo Gateway gira su una macchina e vuoi che i comandi
vengano eseguiti su un’altra. Il modello continua a parlare con il gateway; il gateway
inoltra le chiamate exec all’host nodo quando viene selezionato host=node.
Cosa gira dove
- Host gateway: riceve i messaggi, esegue il modello, instrada le chiamate agli strumenti.
- Host nodo: esegue
system.run/system.whichsulla macchina del nodo. - Approvazioni: applicate sull’host nodo tramite
~/.openclaw/exec-approvals.json.
- Le esecuzioni del nodo supportate da approvazione legano l’esatto contesto della richiesta.
- Per esecuzioni dirette di shell/file runtime, OpenClaw lega anche nel miglior modo possibile un singolo operando file locale concreto e nega l’esecuzione se quel file cambia prima dell’esecuzione.
- Se OpenClaw non riesce a identificare esattamente un solo file locale concreto per un comando interprete/runtime, l’esecuzione supportata da approvazione viene negata invece di fingere una copertura completa del runtime. Usa sandboxing, host separati o una allowlist/workflow esplicito attendibile per semantiche interprete più ampie.
Avvia un host nodo (foreground)
Sulla macchina del nodo:Gateway remoto via tunnel SSH (bind loopback)
Se il Gateway effettua il bind al loopback (gateway.bind=loopback, predefinito in modalità locale),
gli host nodo remoti non possono connettersi direttamente. Crea un tunnel SSH e punta l’host
nodo all’estremità locale del tunnel.
Esempio (host nodo -> host gateway):
openclaw node runsupporta autenticazione con token o password.- Le env var sono preferite:
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD. - Il fallback di configurazione è
gateway.auth.token/gateway.auth.password. - In modalità locale, l’host nodo ignora intenzionalmente
gateway.remote.token/gateway.remote.password. - In modalità remota,
gateway.remote.token/gateway.remote.passwordsono validi secondo le regole di precedenza remota. - Se sono configurati SecretRef attivi
gateway.auth.*locali ma non risolti, l’autenticazione dell’host nodo fallisce in modalità chiusa. - La risoluzione auth dell’host nodo considera solo le env var
OPENCLAW_GATEWAY_*.
Avvia un host nodo (servizio)
Associa + assegna nome
Sull’host gateway:openclaw devices list
e approva il requestId corrente.
Opzioni di denominazione:
--display-namesuopenclaw node run/openclaw node install(persistente in~/.openclaw/node.jsonsul nodo).openclaw nodes rename --node <id|name|ip> --name "Build Node"(override del gateway).
Inserisci i comandi nella allowlist
Le approvazioni exec sono per host nodo. Aggiungi voci allowlist dal gateway:~/.openclaw/exec-approvals.json.
Punta exec al nodo
Configura i valori predefiniti (configurazione gateway):exec con host=node verrà eseguita sull’host nodo (soggetta alla
allowlist/approvazioni del nodo).
host=auto non sceglierà implicitamente il nodo da solo, ma una richiesta esplicita per chiamata host=node è consentita da auto. Se vuoi che exec su nodo sia il valore predefinito per la sessione, imposta esplicitamente tools.exec.host=node o /exec host=node ....
Correlati:
Invocazione dei comandi
Livello basso (RPC grezzo):Screenshot (snapshot canvas)
Se il nodo sta mostrando il Canvas (WebView),canvas.snapshot restituisce { format, base64 }.
Helper CLI (scrive in un file temporaneo e stampa MEDIA:<path>):
Controlli Canvas
canvas presentaccetta URL o percorsi file locali (--target), più opzionalmente--x/--y/--width/--heightper il posizionamento.canvas evalaccetta JS inline (--js) o un argomento posizionale.
A2UI (Canvas)
- È supportato solo A2UI v0.8 JSONL (v0.9/createSurface viene rifiutato).
Foto + video (fotocamera del nodo)
Foto (jpg):
mp4):
- Il nodo deve essere in foreground per
canvas.*ecamera.*(le chiamate in background restituisconoNODE_BACKGROUND_UNAVAILABLE). - La durata delle clip viene limitata (attualmente
<= 60s) per evitare payload base64 troppo grandi. - Android richiede i permessi
CAMERA/RECORD_AUDIOquando possibile; i permessi negati falliscono con*_PERMISSION_REQUIRED.
Registrazioni schermo (nodi)
I nodi supportati espongonoscreen.record (mp4). Esempio:
- La disponibilità di
screen.recorddipende dalla piattaforma del nodo. - Le registrazioni schermo vengono limitate a
<= 60s. --no-audiodisabilita la cattura del microfono sulle piattaforme supportate.- Usa
--screen <index>per selezionare uno schermo quando sono disponibili più display.
Posizione (nodi)
I nodi espongonolocation.get quando la posizione è abilitata nelle impostazioni.
Helper CLI:
- La posizione è disattivata per impostazione predefinita.
- “Always” richiede il permesso di sistema; il recupero in background è best-effort.
- La risposta include lat/lon, accuratezza (metri) e timestamp.
SMS (nodi Android)
I nodi Android possono esporresms.send quando l’utente concede il permesso SMS e il dispositivo supporta la telefonia.
Invocazione di basso livello:
- Il prompt dei permessi deve essere accettato sul dispositivo Android prima che la capability venga pubblicizzata.
- I dispositivi solo Wi‑Fi senza telefonia non pubblicizzeranno
sms.send.
Comandi dispositivo Android + dati personali
I nodi Android possono pubblicizzare famiglie di comandi aggiuntive quando le capability corrispondenti sono abilitate. Famiglie disponibili:device.status,device.info,device.permissions,device.healthnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
- I comandi motion sono soggetti alle capability dei sensori disponibili.
Comandi di sistema (host nodo / nodo mac)
Il nodo macOS esponesystem.run, system.notify e system.execApprovals.get/set.
L’host nodo headless espone system.run, system.which e system.execApprovals.get/set.
Esempi:
system.runrestituisce stdout/stderr/codice di uscita nel payload.- L’esecuzione shell ora passa attraverso lo strumento
execconhost=node;nodesresta la superficie RPC diretta per i comandi nodo espliciti. nodes invokenon esponesystem.runosystem.run.prepare; questi restano solo sul percorso exec.- Il percorso exec prepara un
systemRunPlancanonico prima dell’approvazione. Una volta che un’approvazione è concessa, il gateway inoltra quel piano memorizzato, non eventuali campi command/cwd/session modificati in seguito dal chiamante. system.notifyrispetta lo stato dei permessi di notifica nell’app macOS.- I metadati nodo
platform/deviceFamilynon riconosciuti usano una allowlist predefinita conservativa che escludesystem.runesystem.which. Se hai intenzionalmente bisogno di quei comandi per una piattaforma sconosciuta, aggiungili esplicitamente tramitegateway.nodes.allowCommands. system.runsupporta--cwd,--env KEY=VAL,--command-timeoute--needs-screen-recording.- Per i wrapper shell (
bash|sh|zsh ... -c/-lc), i valori--envcon ambito richiesta vengono ridotti a una allowlist esplicita (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR). - Per le decisioni allow-always in modalità allowlist, i wrapper di dispatch noti (
env,nice,nohup,stdbuf,timeout) mantengono i percorsi degli eseguibili interni invece dei percorsi del wrapper. Se l’unwrapping non è sicuro, nessuna voce allowlist viene mantenuta automaticamente. - Sugli host nodo Windows in modalità allowlist, le esecuzioni wrapper shell tramite
cmd.exe /crichiedono approvazione (la sola voce allowlist non consente automaticamente la forma wrapper). system.notifysupporta--priority <passive|active|timeSensitive>e--delivery <system|overlay|auto>.- Gli host nodo ignorano gli override di
PATHe rimuovono chiavi pericolose di avvio/shell (DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4). Se hai bisogno di voci PATH aggiuntive, configura l’ambiente del servizio host nodo (o installa gli strumenti in percorsi standard) invece di passarePATHtramite--env. - In modalità nodo macOS,
system.runè controllato dalle approvazioni exec nell’app macOS (Impostazioni → Approvazioni exec). Ask/allowlist/full si comportano come per l’host nodo headless; i prompt negati restituisconoSYSTEM_RUN_DENIED. - Sull’host nodo headless,
system.runè controllato dalle approvazioni exec (~/.openclaw/exec-approvals.json).
Associazione exec al nodo
Quando sono disponibili più nodi, puoi associare exec a un nodo specifico. Questo imposta il nodo predefinito perexec host=node (e può essere sovrascritto per agente).
Valore predefinito globale:
Mappa dei permessi
I nodi possono includere una mappapermissions in node.list / node.describe, indicizzata per nome permesso (ad esempio screenRecording, accessibility) con valori booleani (true = concesso).
Host nodo headless (cross-platform)
OpenClaw può eseguire un host nodo headless (senza UI) che si connette al WebSocket del Gateway ed esponesystem.run / system.which. Questo è utile su Linux/Windows
o per eseguire un nodo minimale accanto a un server.
Avvialo:
- Il pairing è comunque richiesto (il Gateway mostrerà un prompt di pairing del dispositivo).
- L’host nodo memorizza il suo id nodo, token, display name e le informazioni di connessione al gateway in
~/.openclaw/node.json. - Le approvazioni exec vengono applicate localmente tramite
~/.openclaw/exec-approvals.json(vedi Approvazioni exec). - Su macOS, l’host nodo headless esegue
system.runlocalmente per impostazione predefinita. ImpostaOPENCLAW_NODE_EXEC_HOST=appper instradaresystem.runtramite l’host exec dell’app companion; aggiungiOPENCLAW_NODE_EXEC_FALLBACK=0per richiedere l’host app e fallire in modalità chiusa se non è disponibile. - Aggiungi
--tls/--tls-fingerprintquando il WS del Gateway usa TLS.
Modalità nodo Mac
- L’app macOS nella barra dei menu si connette al server WS del Gateway come nodo (quindi
openclaw nodes …funziona su questo Mac). - In modalità remota, l’app apre un tunnel SSH per la porta Gateway e si connette a
localhost.