Nœuds
Un nœud est un appareil compagnon (macOS/iOS/Android/sans interface) qui se connecte au WebSocket de la Gateway (passerelle) (même port que les opérateurs) avecrole: "node" et expose une surface de commandes (p. ex. canvas.*, camera.*, system.*) via node.invoke. Détails du protocole : Protocole de la Gateway.
Transport hérité : Protocole Bridge (TCP JSONL ; obsolète/supprimé pour les nœuds actuels).
macOS peut aussi fonctionner en mode nœud : l’app de la barre de menus se connecte au serveur WS de la Gateway et expose ses commandes locales de canvas/caméra en tant que nœud (ainsi openclaw nodes … fonctionne sur ce Mac).
Notes :
- Les nœuds sont des périphériques, pas des passerelles. Ils n’exécutent pas le service de passerelle.
- Les messages Telegram/WhatsApp/etc. arrivent sur la gateway, pas sur les nœuds.
- Dépannage du runbook : /nodes/troubleshooting
Appairage + statut
Les nœuds WS utilisent l’appairage d’appareil. Les nœuds présentent une identité d’appareil pendantconnect ; la Gateway
crée une demande d’appairage d’appareil pour role: node. Approuvez via la CLI (ou l’UI) des appareils.
CLI rapide :
nodes statusmarque un nœud comme appairé lorsque son rôle d’appairage d’appareil inclutnode.node.pair.*(CLI :openclaw nodes pending/approve/reject) est un magasin d’appairage de nœuds distinct, détenu par la gateway ; il ne bloque pas l’handshake WSconnect.
Hôte de nœud distant (system.run)
Utilisez un hôte de nœud lorsque votre Gateway s’exécute sur une machine et que vous souhaitez que les commandes s’exécutent sur une autre. Le modèle parle toujours à la gateway ; la gateway transmet les appelsexec à l’hôte de nœud lorsque host=node est sélectionné.
Qu’est-ce qui fonctionne où
- Hôte de la gateway : reçoit les messages, exécute le modèle, route les appels d’outils.
- Hôte de nœud : exécute
system.run/system.whichsur la machine du nœud. - Approbations : appliquées sur l’hôte de nœud via
~/.openclaw/exec-approvals.json.
Démarrer un hôte de nœud (premier plan)
Sur la machine du nœud :Gateway distante via tunnel SSH (liaison loopback)
Si la Gateway se lie au loopback (gateway.bind=loopback, par défaut en mode local),
les hôtes de nœud distants ne peuvent pas se connecter directement. Créez un tunnel SSH et pointez
l’hôte de nœud vers l’extrémité locale du tunnel.
Exemple (hôte de nœud -> hôte de la gateway) :
- Le jeton est
gateway.auth.tokendepuis la configuration de la gateway (~/.openclaw/openclaw.jsonsur l’hôte de la gateway). openclaw node runlitOPENCLAW_GATEWAY_TOKENpour l’authentification.
Démarrer un hôte de nœud (service)
Appairer + nommer
Sur l’hôte de la gateway :--display-namesuropenclaw node run/openclaw node install(persistant dans~/.openclaw/node.jsonsur le nœud).openclaw nodes rename --node <id|name|ip> --name "Build Node"(remplacement côté gateway).
Mettre les commandes sur liste blanche
Les approbations d’exécution sont par hôte de nœud. Ajoutez des entrées de liste blanche depuis la gateway :~/.openclaw/exec-approvals.json.
Pointer l’exécution vers le nœud
Configurer les valeurs par défaut (configuration de la gateway) :exec avec host=node s’exécute sur l’hôte de nœud (sous réserve de la liste blanche/approbations du nœud).
Associé :
Invocation de commandes
Bas niveau (RPC brut) :Captures d’écran (instantanés du canvas)
Si le nœud affiche le Canvas (WebView),canvas.snapshot renvoie { format, base64 }.
Assistant CLI (écrit dans un fichier temporaire et affiche MEDIA:<path>) :
Commandes du canvas
canvas presentaccepte des URL ou des chemins de fichiers locaux (--target), plus--x/--y/--width/--heightoptionnel pour le positionnement.canvas evalaccepte du JS inline (--js) ou un argument positionnel.
A2UI (Canvas)
- Seul A2UI v0.8 JSONL est pris en charge (v0.9/createSurface est rejeté).
Photos + vidéos (caméra du nœud)
Photos (jpg) :
mp4) :
- Le nœud doit être au premier plan pour
canvas.*etcamera.*(les appels en arrière-plan renvoientNODE_BACKGROUND_UNAVAILABLE). - La durée des clips est plafonnée (actuellement
<= 60s) pour éviter des charges base64 trop volumineuses. - Android demandera les autorisations
CAMERA/RECORD_AUDIOlorsque possible ; les autorisations refusées échouent avec*_PERMISSION_REQUIRED.
Enregistrements d’écran (nœuds)
Les nœuds exposentscreen.record (mp4). Exemple :
screen.recordnécessite que l’app du nœud soit au premier plan.- Android affiche l’invite système de capture d’écran avant l’enregistrement.
- Les enregistrements d’écran sont plafonnés à
<= 60s. --no-audiodésactive la capture du microphone (pris en charge sur iOS/Android ; macOS utilise l’audio de capture système).- Utilisez
--screen <index>pour sélectionner un écran lorsque plusieurs sont disponibles.
Localisation (nœuds)
Les nœuds exposentlocation.get lorsque la localisation est activée dans les paramètres.
Assistant CLI :
- La localisation est désactivée par défaut.
- « Toujours » requiert une autorisation système ; la récupération en arrière-plan est au mieux.
- La réponse inclut lat/lon, précision (mètres) et horodatage.
SMS (nœuds Android)
Les nœuds Android peuvent exposersms.send lorsque l’utilisateur accorde l’autorisation SMS et que l’appareil prend en charge la téléphonie.
Invocation bas niveau :
- L’invite d’autorisation doit être acceptée sur l’appareil Android avant que la capacité ne soit annoncée.
- Les appareils uniquement Wi‑Fi sans téléphonie n’annonceront pas
sms.send.
Commandes système (hôte de nœud / nœud mac)
Le nœud macOS exposesystem.run, system.notify et system.execApprovals.get/set.
L’hôte de nœud sans interface expose system.run, system.which et system.execApprovals.get/set.
Exemples :
system.runrenvoie stdout/stderr/code de sortie dans la charge utile.system.notifyrespecte l’état des autorisations de notification dans l’app macOS.system.runprend en charge--cwd,--env KEY=VAL,--command-timeoutet--needs-screen-recording.system.notifyprend en charge--priority <passive|active|timeSensitive>et--delivery <system|overlay|auto>.- Les hôtes Node ignorent les surcharges
PATH. Si vous avez besoin d’entrées PATH supplémentaires, configurez l’environnement du service d’hébergement Node (ou installez les outils dans des emplacements standard) au lieu de transmettrePATHvia--env. - En mode nœud macOS,
system.runest contrôlé par les approbations Exec dans l’app macOS (Paramètres → Approbations Exec). Demander/liste blanche/complet se comportent comme sur l’hôte de nœud sans interface ; les invites refusées renvoientSYSTEM_RUN_DENIED. - Sur l’hôte de nœud sans interface,
system.runest contrôlé par les approbations Exec (~/.openclaw/exec-approvals.json).
Liaison Exec au nœud
Lorsque plusieurs nœuds sont disponibles, vous pouvez lier Exec à un nœud spécifique. Cela définit le nœud par défaut pourexec host=node (et peut être remplacé par agent).
Valeur par défaut globale :
Carte des autorisations
Les nœuds peuvent inclure une cartepermissions dans node.list / node.describe, indexée par nom d’autorisation (p. ex. screenRecording, accessibility) avec des valeurs booléennes (true = accordé).
Hôte de noeud Headless (cross-platform)
OpenClaw peut exécuter un hôte de nœud sans interface (sans UI) qui se connecte au WebSocket de la Gateway et exposesystem.run / system.which. C’est utile sous Linux/Windows
ou pour exécuter un nœud minimal à côté d’un serveur.
Démarrage :
- L’appairage est toujours requis (la Gateway affichera une invite d’approbation de nœud).
- L’hôte de nœud stocke son identifiant de nœud, son jeton, son nom d’affichage et les informations de connexion à la gateway dans
~/.openclaw/node.json. - Les approbations Exec sont appliquées localement via
~/.openclaw/exec-approvals.json(voir Approbations Exec). - Sur macOS, l’hôte de nœud sans interface préfère l’hôte d’exécution de l’app compagnon lorsqu’il est joignable et
bascule vers l’exécution locale si l’app est indisponible. Définissez
OPENCLAW_NODE_EXEC_HOST=apppour exiger l’app, ouOPENCLAW_NODE_EXEC_FALLBACK=0pour désactiver le repli. - Ajoutez
--tls/--tls-fingerprintlorsque le WS de la Gateway utilise TLS.
Mode nœud Mac
- L’app macOS de la barre de menus se connecte au serveur WS de la Gateway en tant que nœud (ainsi
openclaw nodes …fonctionne sur ce Mac). - En mode distant, l’app ouvre un tunnel SSH pour le port de la Gateway et se connecte à
localhost.