Nodes and media
Nodes
Een node is een begeleidend apparaat (macOS/iOS/Android/headless) dat verbinding maakt met de Gateway WebSocket (dezelfde poort als operators) met role: "node" en een opdrachtoppervlak aanbiedt (bijv. canvas.*, camera.*, device.*, notifications.*, system.*) via node.invoke. Protocoldetails: Gateway-protocol.
Legacy transport: Bridge-protocol (TCP JSONL; alleen historisch voor huidige nodes).
macOS kan ook in nodemodus draaien: de menubalk-app maakt verbinding met de WS-server van de Gateway en biedt zijn lokale canvas-/camera-opdrachten als node aan (zodat openclaw nodes … werkt tegen deze Mac). In externe gatewaymodus wordt browserautomatisering afgehandeld door de CLI-nodehost (openclaw node run of de geïnstalleerde nodeservice), niet door de native app-node.
Opmerkingen:
- Nodes zijn randapparaten, geen gateways. Ze voeren de gatewayservice niet uit.
- Telegram/WhatsApp/enz. berichten komen binnen op de gateway, niet op nodes.
- Runbook voor probleemoplossing: /nodes/troubleshooting
Koppelen + status
WS-nodes gebruiken apparaatkoppeling. Nodes presenteren een apparaatidentiteit tijdens connect; de Gateway maakt een apparaatkoppelingsaanvraag voor role: node. Keur goed via de apparaten-CLI (of UI).
Snelle CLI:
openclaw devices list
openclaw devices approve <requestId>
openclaw devices reject <requestId>
openclaw nodes status
openclaw nodes describe --node <idOrNameOrIp>
Als een node opnieuw probeert met gewijzigde auth-gegevens (rol/scopes/openbare sleutel), wordt de eerdere openstaande aanvraag vervangen en wordt een nieuwe requestId aangemaakt. Voer openclaw devices list opnieuw uit voordat je goedkeurt.
Opmerkingen:
nodes statusmarkeert een node als gekoppeld wanneer de apparaatkoppelingsrolnodebevat.- Het apparaatkoppelingsrecord is het duurzame contract voor goedgekeurde rollen. Tokenrotatie blijft binnen dat contract; het kan een gekoppelde node niet upgraden naar een andere rol waarvoor koppelingsgoedkeuring nooit is verleend.
node.pair.*(CLI:openclaw nodes pending/approve/reject/remove/rename) is een afzonderlijke gateway-eigen nodekoppelingsopslag; het blokkeert de WS-connect-handshake niet.openclaw nodes remove --node <id|name|ip>verwijdert verouderde vermeldingen uit die afzonderlijke gateway-eigen nodekoppelingsopslag.- Het goedkeuringsbereik volgt de gedeclareerde opdrachten van de openstaande aanvraag:
- aanvraag zonder opdrachten:
operator.pairing - node-opdrachten zonder exec:
operator.pairing+operator.write system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- aanvraag zonder opdrachten:
Externe nodehost (system.run)
Gebruik een nodehost wanneer je Gateway op de ene machine draait en je opdrachten op een andere wilt uitvoeren. Het model praat nog steeds met de gateway; de gateway stuurt exec-aanroepen door naar de nodehost wanneer host=node is geselecteerd.
Wat waar draait
- Gatewayhost: ontvangt berichten, voert het model uit, routeert toolaanroepen.
- Nodehost: voert
system.run/system.whichuit op de nodemachine. - Goedkeuringen: afgedwongen op de nodehost via
~/.openclaw/exec-approvals.json.
Opmerking over goedkeuring:
- Node-uitvoeringen met goedkeuring binden de exacte aanvraagcontext.
- Voor directe shell-/runtime-bestandsuitvoeringen bindt OpenClaw ook best-effort één concrete lokale bestandsoperand en weigert het de uitvoering als dat bestand vóór uitvoering verandert.
- Als OpenClaw niet precies één concreet lokaal bestand voor een interpreter-/runtime-opdracht kan identificeren, wordt uitvoering met goedkeuring geweigerd in plaats van volledige runtimedekking voor te wenden. Gebruik sandboxing, afzonderlijke hosts of een expliciete vertrouwde allowlist/volledige workflow voor bredere interpretersemantiek.
Een nodehost starten (voorgrond)
Op de nodemachine:
openclaw node run --host <gateway-host> --port 18789 --display-name "Build Node"
Externe gateway via SSH-tunnel (loopback-binding)
Als de Gateway aan loopback bindt (gateway.bind=loopback, standaard in lokale modus), kunnen externe nodehosts niet rechtstreeks verbinden. Maak een SSH-tunnel en wijs de nodehost naar het lokale uiteinde van de tunnel.
Voorbeeld (nodehost -> gatewayhost):
# Terminal A (laten draaien): forward lokale 18790 -> gateway 127.0.0.1:18789
ssh -N -L 18790:127.0.0.1:18789 user@gateway-host
# Terminal B: exporteer het gatewaytoken en verbind via de tunnel
export OPENCLAW_GATEWAY_TOKEN="<gateway-token>"
openclaw node run --host 127.0.0.1 --port 18790 --display-name "Build Node"
Opmerkingen:
openclaw node runondersteunt token- of wachtwoordauthenticatie.- Env vars hebben de voorkeur:
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD. - Config-fallback is
gateway.auth.token/gateway.auth.password. - In lokale modus negeert de nodehost bewust
gateway.remote.token/gateway.remote.password. - In externe modus komen
gateway.remote.token/gateway.remote.passwordin aanmerking volgens de externe prioriteitsregels. - Als actieve lokale
gateway.auth.*SecretRefs zijn geconfigureerd maar niet opgelost, faalt nodehost-auth gesloten. - Nodehost-authoplossing respecteert alleen
OPENCLAW_GATEWAY_*env vars.
Een nodehost starten (service)
openclaw node install --host <gateway-host> --port 18789 --display-name "Build Node"
openclaw node start
openclaw node restart
Koppelen + naam geven
Op de gatewayhost:
openclaw devices list
openclaw devices approve <requestId>
openclaw nodes status
Als de node opnieuw probeert met gewijzigde auth-gegevens, voer openclaw devices list opnieuw uit en keur de huidige requestId goed.
Naamgevingsopties:
--display-nameopopenclaw node run/openclaw node install(blijft bewaard in~/.openclaw/node.jsonop de node).openclaw nodes rename --node <id|name|ip> --name "Build Node"(gateway-override).
De opdrachten op de allowlist zetten
Exec-goedkeuringen zijn per nodehost. Voeg allowlist-vermeldingen toe vanaf de gateway:
openclaw approvals allowlist add --node <id|name|ip> "/usr/bin/uname"
openclaw approvals allowlist add --node <id|name|ip> "/usr/bin/sw_vers"
Goedkeuringen staan op de nodehost in ~/.openclaw/exec-approvals.json.
Exec naar de node wijzen
Configureer standaardwaarden (gatewayconfig):
openclaw config set tools.exec.host node
openclaw config set tools.exec.security allowlist
openclaw config set tools.exec.node "<id-or-name>"
Of per sessie:
/exec host=node security=allowlist node=<id-or-name>
Zodra dit is ingesteld, draait elke exec-aanroep met host=node op de nodehost (onderworpen aan de node-allowlist/goedkeuringen).
host=auto kiest niet impliciet uit zichzelf de node, maar een expliciete per-call host=node-aanvraag is toegestaan vanuit auto. Als je node-exec de standaard voor de sessie wilt maken, stel dan expliciet tools.exec.host=node of /exec host=node ... in.
Gerelateerd:
Opdrachten aanroepen
Laag niveau (ruwe RPC):
openclaw nodes invoke --node <idOrNameOrIp> --command canvas.eval --params '{"javaScript":"location.href"}'
Er bestaan helpers op hoger niveau voor de gangbare workflows "geef de agent een MEDIA-bijlage".
Opdrachtbeleid
Node-opdrachten moeten twee controles doorstaan voordat ze kunnen worden aangeroepen:
- De node moet de opdracht declareren in zijn WebSocket-
connect.commands-lijst. - Het platformbeleid van de gateway moet de gedeclareerde opdracht toestaan.
Windows- en macOS-begeleidende nodes staan standaard veilige gedeclareerde opdrachten toe, zoals canvas.*, camera.list, location.get en screen.snapshot. Vertrouwde nodes die de talk-capability adverteren of talk.*-opdrachten declareren, staan standaard ook gedeclareerde push-to-talk-opdrachten toe (talk.ptt.start, talk.ptt.stop, talk.ptt.cancel, talk.ptt.once), onafhankelijk van het platformlabel. Gevaarlijke of privacygevoelige opdrachten zoals camera.snap, camera.clip en screen.record vereisen nog steeds expliciete opt-in met gateway.nodes.allowCommands. gateway.nodes.denyCommands wint altijd van standaardwaarden en extra allowlist-vermeldingen.
Plugin-eigen node-opdrachten kunnen een Gateway-node-invoke-beleid toevoegen. Dat beleid draait na de allowlist-controle en vóór het doorsturen naar de node, zodat ruwe node.invoke, CLI-helpers en dedicated agent-tools dezelfde Plugin-toestemmingsgrens delen. Gevaarlijke Plugin-node-opdrachten vereisen nog steeds expliciete gateway.nodes.allowCommands-opt-in.
Nadat een node zijn gedeclareerde opdrachtenlijst wijzigt, wijs je de oude apparaatkoppeling af en keur je de nieuwe aanvraag goed, zodat de gateway de bijgewerkte opdrachtensnapshot opslaat.
Schermafbeeldingen (canvas-snapshots)
Als de node de Canvas (WebView) toont, retourneert canvas.snapshot { format, base64 }.
CLI-helper (schrijft naar een tijdelijk bestand en print MEDIA:<path>):
openclaw nodes canvas snapshot --node <idOrNameOrIp> --format png
openclaw nodes canvas snapshot --node <idOrNameOrIp> --format jpg --max-width 1200 --quality 0.9
Canvas-bediening
openclaw nodes canvas present --node <idOrNameOrIp> --target https://example.com
openclaw nodes canvas hide --node <idOrNameOrIp>
openclaw nodes canvas navigate https://example.com --node <idOrNameOrIp>
openclaw nodes canvas eval --node <idOrNameOrIp> --js "document.title"
Opmerkingen:
canvas presentaccepteert URL's of lokale bestandspaden (--target), plus optioneel--x/--y/--width/--heightvoor positionering.canvas evalaccepteert inline JS (--js) of een positioneel argument.
A2UI (Canvas)
openclaw nodes canvas a2ui push --node <idOrNameOrIp> --text "Hello"
openclaw nodes canvas a2ui push --node <idOrNameOrIp> --jsonl ./payload.jsonl
openclaw nodes canvas a2ui reset --node <idOrNameOrIp>
Opmerkingen:
- Alleen A2UI v0.8 JSONL wordt ondersteund (v0.9/createSurface wordt geweigerd).
Foto's + video's (nodecamera)
Foto's (jpg):
openclaw nodes camera list --node <idOrNameOrIp>
openclaw nodes camera snap --node <idOrNameOrIp> # default: beide richtingen (2 MEDIA-regels)
openclaw nodes camera snap --node <idOrNameOrIp> --facing front
Videoclips (mp4):
openclaw nodes camera clip --node <idOrNameOrIp> --duration 10s
openclaw nodes camera clip --node <idOrNameOrIp> --duration 3000 --no-audio
Opmerkingen:
- De node moet op de voorgrond staan voor
canvas.*encamera.*(achtergrondaanroepen retournerenNODE_BACKGROUND_UNAVAILABLE). - Clipduur wordt begrensd (momenteel
<= 60s) om te grote base64-payloads te voorkomen. - Android vraagt waar mogelijk om
CAMERA/RECORD_AUDIO-machtigingen; geweigerde machtigingen falen met*_PERMISSION_REQUIRED.
Schermopnamen (nodes)
Ondersteunde nodes bieden screen.record (mp4). Voorbeeld:
openclaw nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10
openclaw nodes screen record --node <idOrNameOrIp> --duration 10s --fps 10 --no-audio
Opmerkingen:
- Beschikbaarheid van
screen.recordhangt af van het nodeplatform. - Schermopnamen worden begrensd tot
<= 60s. --no-audioschakelt microfoonopname uit op ondersteunde platforms.- Gebruik
--screen <index>om een scherm te selecteren wanneer meerdere schermen beschikbaar zijn.
Locatie (nodes)
Nodes bieden location.get wanneer Locatie is ingeschakeld in de instellingen.
CLI-helper:
openclaw nodes location get --node <idOrNameOrIp>
openclaw nodes location get --node <idOrNameOrIp> --accuracy precise --max-age 15000 --location-timeout 10000
Opmerkingen:
- Locatie staat standaard uit.
- "Altijd" vereist systeemmachtiging; ophalen op de achtergrond gebeurt best-effort.
- Het antwoord bevat lat/lon, nauwkeurigheid (meters) en tijdstempel.
SMS (Android-nodes)
Android-nodes kunnen sms.send aanbieden wanneer de gebruiker SMS-machtiging verleent en het apparaat telefonie ondersteunt.
Laag-niveau aanroep:
openclaw nodes invoke --node <idOrNameOrIp> --command sms.send --params '{"to":"+15555550123","message":"Hello from OpenClaw"}'
Opmerkingen:
- De machtigingsprompt moet op het Android-apparaat worden geaccepteerd voordat de capability wordt geadverteerd.
- Apparaten zonder telefonie die alleen Wi-Fi ondersteunen, adverteren
sms.sendniet.
Android-apparaat + opdrachten voor persoonlijke gegevens
Android-nodes kunnen extra opdrachtfamilies adverteren wanneer de bijbehorende capabilities zijn ingeschakeld.
Beschikbare families:
device.status,device.info,device.permissions,device.healthnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
Voorbeeldaanroepen:
openclaw nodes invoke --node <idOrNameOrIp> --command device.status --params '{}'
openclaw nodes invoke --node <idOrNameOrIp> --command notifications.list --params '{}'
openclaw nodes invoke --node <idOrNameOrIp> --command photos.latest --params '{"limit":1}'
Opmerkingen:
- Bewegingsopdrachten worden via mogelijkheden beperkt op basis van beschikbare sensoren.
Systeemopdrachten (Node-host / Mac-Node)
De macOS-Node biedt system.run, system.notify en system.execApprovals.get/set.
De headless Node-host biedt system.run, system.which en system.execApprovals.get/set.
Voorbeelden:
openclaw nodes notify --node <idOrNameOrIp> --title "Ping" --body "Gateway ready"
openclaw nodes invoke --node <idOrNameOrIp> --command system.which --params '{"name":"git"}'
Opmerkingen:
system.runretourneert stdout/stderr/exitcode in de payload.- Shelluitvoering loopt nu via de
exec-tool methost=node;nodesblijft het directe RPC-oppervlak voor expliciete Node-opdrachten. nodes invokesteltsystem.runofsystem.run.prepareniet beschikbaar; die blijven alleen op het exec-pad.- Het exec-pad bereidt vóór goedkeuring een canoniek
systemRunPlanvoor. Zodra een goedkeuring is verleend, stuurt de Gateway dat opgeslagen plan door, niet eventuele later door de aanroeper bewerkte opdracht-/cwd-/sessievelden. system.notifyrespecteert de status van de meldingsmachtiging in de macOS-app.- Niet-herkende Node-
platform- /deviceFamily-metadata gebruikt een conservatieve standaardtoestemmingslijst diesystem.runensystem.whichuitsluit. Als je die opdrachten bewust nodig hebt voor een onbekend platform, voeg ze dan expliciet toe viagateway.nodes.allowCommands. system.runondersteunt--cwd,--env KEY=VAL,--command-timeouten--needs-screen-recording.- Voor shellwrappers (
bash|sh|zsh ... -c/-lc) worden aanvraaggebonden--env-waarden teruggebracht tot een expliciete toestemmingslijst (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR). - Voor altijd-toestaan-beslissingen in toestemmingslijstmodus bewaren bekende dispatch-wrappers (
env,nice,nohup,stdbuf,timeout) de paden van de interne uitvoerbare bestanden in plaats van de wrapperpaden. Als uitpakken niet veilig is, wordt er automatisch geen toestemmingslijstitem bewaard. - Op Windows-Node-hosts in toestemmingslijstmodus vereisen shellwrapperuitvoeringen via
cmd.exe /cgoedkeuring (alleen een toestemmingslijstitem staat de wrappervorm niet automatisch toe). system.notifyondersteunt--priority <passive|active|timeSensitive>en--delivery <system|overlay|auto>.- Node-hosts negeren
PATH-overschrijvingen en strippen gevaarlijke opstart-/shellsleutels (DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4). Als je extra PATH-vermeldingen nodig hebt, configureer dan de serviceomgeving van de Node-host (of installeer tools op standaardlocaties) in plaats vanPATHvia--envdoor te geven. - In macOS-Node-modus wordt
system.runbeperkt door exec-goedkeuringen in de macOS-app (Instellingen → Exec-goedkeuringen). Vragen/toestemmingslijst/volledig gedragen zich hetzelfde als de headless Node-host; geweigerde prompts retournerenSYSTEM_RUN_DENIED. - Op een headless Node-host wordt
system.runbeperkt door exec-goedkeuringen (~/.openclaw/exec-approvals.json).
Exec-Node-binding
Wanneer er meerdere Nodes beschikbaar zijn, kun je exec aan een specifieke Node binden.
Dit stelt de standaard-Node in voor exec host=node (en kan per agent worden overschreven).
Globale standaard:
openclaw config set tools.exec.node "node-id-or-name"
Overschrijving per agent:
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
Maak ongedaan om elke Node toe te staan:
openclaw config unset tools.exec.node
openclaw config unset agents.list[0].tools.exec.node
Machtigingenmap
Nodes kunnen een permissions-map opnemen in node.list / node.describe, geïndexeerd op machtigingsnaam (bijv. screenRecording, accessibility) met booleaanse waarden (true = verleend).
Headless Node-host (platformoverschrijdend)
OpenClaw kan een headless Node-host uitvoeren (geen UI) die verbinding maakt met de Gateway-
WebSocket en system.run / system.which beschikbaar stelt. Dit is nuttig op Linux/Windows
of om een minimale Node naast een server uit te voeren.
Start deze:
openclaw node run --host <gateway-host> --port 18789
Opmerkingen:
- Koppeling is nog steeds vereist (de Gateway toont een prompt voor apparaatkoppeling).
- De Node-host slaat de Node-id, het token, de weergavenaam en de Gateway-verbindingsgegevens op in
~/.openclaw/node.json. - Exec-goedkeuringen worden lokaal afgedwongen via
~/.openclaw/exec-approvals.json(zie Exec-goedkeuringen). - Op macOS voert de headless Node-host standaard
system.runlokaal uit. StelOPENCLAW_NODE_EXEC_HOST=appin omsystem.runvia de exec-host van de companion-app te routeren; voegOPENCLAW_NODE_EXEC_FALLBACK=0toe om de app-host te vereisen en gesloten te falen als deze niet beschikbaar is. - Voeg
--tls/--tls-fingerprinttoe wanneer de Gateway-WS TLS gebruikt.
Mac-Node-modus
- De macOS-menubalkapp maakt verbinding met de Gateway-WS-server als een Node (zodat
openclaw nodes …werkt voor deze Mac). - In externe modus opent de app een SSH-tunnel voor de Gateway-poort en maakt verbinding met
localhost.