role: "node" et expose une surface de commandes (par ex. canvas.*, camera.*, device.*, notifications.*, system.*) via node.invoke. Détails du protocole : protocole du Gateway.
Transport hérité : protocole Bridge (TCP JSONL ;
historique uniquement pour les nœuds actuels).
macOS peut aussi fonctionner en mode nœud : l’application de barre de menus se connecte au serveur WS du Gateway et expose ses commandes locales de canvas/caméra comme un nœud (ainsi
openclaw nodes … fonctionne avec ce Mac). En mode Gateway distant, l’automatisation du navigateur est gérée par l’hôte de nœud CLI (openclaw node run ou le service de nœud installé), et non par le nœud de l’application native.
Notes :
- Les nœuds sont des périphériques, pas des gateways. Ils n’exécutent pas le service Gateway.
- Les messages Telegram/WhatsApp/etc. arrivent sur le gateway, pas sur les nœuds.
- Runbook de dépannage : /nodes/troubleshooting
Appairage + statut
Les nœuds WS utilisent l’appairage d’appareil. Les nœuds présentent une identité d’appareil pendantconnect ; le Gateway crée une demande d’appairage d’appareil pour role: node. Approuvez-la via la CLI des appareils (ou l’UI).
CLI rapide :
requestId est créé. Réexécutez
openclaw devices list avant d’approuver.
Notes :
nodes statusmarque un nœud comme appairé lorsque son rôle d’appairage d’appareil inclutnode.- L’enregistrement d’appairage d’appareil est le contrat durable de rôle approuvé. La rotation des jetons reste dans ce contrat ; elle ne peut pas promouvoir un nœud appairé vers un rôle différent que l’approbation d’appairage n’a jamais accordé.
node.pair.*(CLI :openclaw nodes pending/approve/reject/remove/rename) est un magasin d’appairage de nœuds distinct, détenu par le Gateway ; il ne contrôle pas la poignée de main WSconnect.openclaw nodes remove --node <id|name|ip>supprime un appairage de nœud. Pour un nœud adossé à un appareil, cela révoque le rôlenodede l’appareil dansdevices/paired.jsonet déconnecte les sessions de rôle nœud de cet appareil — un appareil à rôles mixtes conserve sa ligne et perd seulement le rôlenode, tandis qu’une ligne d’appareil uniquement nœud est supprimée. Cela efface aussi toute entrée correspondante du magasin d’appairage de nœuds distinct détenu par le Gateway.operator.pairingpeut supprimer des lignes de nœud non opérateur ; un appelant par jeton d’appareil qui révoque son propre rôle de nœud sur un appareil à rôles mixtes a en plus besoin deoperator.admin.- La portée d’approbation suit les commandes déclarées par la demande en attente :
- demande sans commande :
operator.pairing - commandes de nœud non exec :
operator.pairing+operator.write system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- demande sans commande :
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 voulez exécuter des commandes sur une autre. Le modèle parle toujours au gateway ; le gateway transmet les appelsexec à l’hôte de nœud lorsque host=node est sélectionné.
Ce qui s’exécute où
- Hôte 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.
- Les exécutions de nœud adossées à une approbation lient le contexte exact de la demande.
- Pour les exécutions directes de fichiers shell/runtime, OpenClaw tente aussi de lier un opérande de fichier local concret et refuse l’exécution si ce fichier change avant l’exécution.
- Si OpenClaw ne peut pas identifier exactement un fichier local concret pour une commande d’interpréteur/runtime, l’exécution adossée à une approbation est refusée au lieu de prétendre couvrir entièrement le runtime. Utilisez le sandboxing, des hôtes séparés, ou une liste d’autorisation/un workflow complet explicitement approuvé pour des sémantiques d’interpréteur plus larges.
Démarrer un hôte de nœud (premier plan)
Sur la machine du nœud :Gateway distant via tunnel SSH (liaison loopback)
Si le Gateway se lie au loopback (gateway.bind=loopback, valeur 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 gateway) :
openclaw node runprend en charge l’authentification par jeton ou par mot de passe.- Les variables d’environnement sont préférées :
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD. - Le repli de configuration est
gateway.auth.token/gateway.auth.password. - En mode local, l’hôte de nœud ignore intentionnellement
gateway.remote.token/gateway.remote.password. - En mode distant,
gateway.remote.token/gateway.remote.passwordsont admissibles selon les règles de précédence distante. - Si des SecretRefs locales actives
gateway.auth.*sont configurées mais non résolues, l’authentification de l’hôte de nœud échoue fermée. - La résolution d’authentification de l’hôte de nœud n’honore que les variables d’environnement
OPENCLAW_GATEWAY_*.
Démarrer un hôte de nœud (service)
Appairer + nommer
Sur l’hôte gateway :openclaw devices list
et approuvez le requestId actuel.
Options de nommage :
--display-namesuropenclaw node run/openclaw node install(persiste dans~/.openclaw/node.jsonsur le nœud).openclaw nodes rename --node <id|name|ip> --name "Build Node"(surcharge côté gateway).
Autoriser les commandes
Les approbations exec sont par hôte de nœud. Ajoutez des entrées de liste d’autorisation depuis le gateway :~/.openclaw/exec-approvals.json.
Pointer exec vers le nœud
Configurer les valeurs par défaut (configuration du gateway) :exec avec host=node s’exécute sur l’hôte de nœud (sous réserve de la liste d’autorisation/des approbations du nœud).
host=auto ne choisira pas implicitement le nœud de lui-même, mais une demande explicite par appel host=node est autorisée depuis auto. Si vous voulez que l’exécution sur nœud soit la valeur par défaut de la session, définissez explicitement tools.exec.host=node ou /exec host=node ....
Connexe :
Inférence de modèle locale
Un nœud de bureau ou serveur peut exposer des modèles capables de chat depuis un serveur Ollama exécuté sur ce nœud. Les agents utilisent l’outilnode_inference du Plugin Ollama pour découvrir les modèles installés et exécuter une invite bornée à distance ; le Gateway n’a pas besoin d’accès réseau direct à Ollama. Consultez Inférence locale au nœud Ollama
pour la configuration, le filtrage des modèles et les commandes de vérification directe.
Invocation de commandes
Bas niveau (RPC brut) :Politique de commandes
Les commandes de nœud doivent passer deux contrôles avant de pouvoir être invoquées :- Le nœud doit déclarer la commande dans sa liste WebSocket
connect.commands. - La politique de plateforme du gateway doit autoriser la commande déclarée.
canvas.*, camera.list, location.get et screen.snapshot.
Les nœuds de confiance qui annoncent la capacité talk ou déclarent des commandes talk.*
autorisent aussi par défaut les commandes push-to-talk déclarées (talk.ptt.start, talk.ptt.stop,
talk.ptt.cancel, talk.ptt.once), indépendamment du libellé de plateforme.
Les commandes dangereuses ou fortement sensibles à la confidentialité, telles que camera.snap, camera.clip et
screen.record, nécessitent toujours une acceptation explicite avec
gateway.nodes.allowCommands. gateway.nodes.denyCommands l’emporte toujours sur
les valeurs par défaut et les entrées de liste d’autorisation supplémentaires.
Les commandes de nœud détenues par un Plugin peuvent ajouter une politique Gateway node-invoke. Cette politique s’exécute après la vérification de la liste d’autorisation et avant le transfert au nœud, de sorte que node.invoke brut, les assistants CLI et les outils d’agent dédiés partagent la même frontière d’autorisation de Plugin. Les commandes de nœud de Plugin dangereuses nécessitent toujours une acceptation explicite gateway.nodes.allowCommands.
Après qu’un nœud a modifié sa liste de commandes déclarées, rejetez l’ancien appairage d’appareil et approuvez la nouvelle demande afin que le gateway stocke l’instantané de commandes mis à jour.
Configuration (openclaw.json)
Les paramètres liés aux nœuds se trouvent sous gateway.nodes et tools.exec :
denyCommands supprime une commande même lorsqu’une valeur par défaut de plateforme ou une entrée allowCommands l’autoriserait autrement. Consultez la référence de configuration du Gateway
pour les détails des champs d’appairage de nœuds gateway et de politique de commandes.
Surcharge du nœud exec par agent :
Captures d’écran (instantanés canvas)
Si le nœud affiche le Canvas (WebView),canvas.snapshot renvoie { format, base64 }.
Assistant CLI (écrit dans un fichier temporaire et affiche le chemin enregistré) :
Contrôles du canvas
canvas presentaccepte des URL ou des chemins de fichiers locaux (--target), ainsi que--x/--y/--width/--heightfacultatifs pour le positionnement.canvas evalaccepte du JS en ligne (--js) ou un argument positionnel.
A2UI (Canvas)
- Les Nodes mobiles utilisent une page A2UI intégrée appartenant à l’application pour le rendu avec actions.
- Seul le JSONL A2UI v0.8 est pris en charge (v0.9/createSurface est rejeté).
- iOS et Android affichent les pages Gateway Canvas distantes, mais les actions des boutons A2UI ne sont envoyées que depuis la page A2UI intégrée appartenant à l’application. Les pages A2UI HTTP/HTTPS hébergées par le Gateway sont en lecture seule sur ces clients mobiles.
Photos + vidéos (caméra du Node)
Photos (jpg) :
mp4) :
- Le Node doit être au premier plan pour
canvas.*etcamera.*(les appels en arrière-plan renvoientNODE_BACKGROUND_UNAVAILABLE). - La durée du clip est plafonnée (actuellement
<= 60s) afin d’éviter des charges utiles base64 trop volumineuses. - Android demandera les autorisations
CAMERA/RECORD_AUDIOlorsque c’est possible ; les autorisations refusées échouent avec*_PERMISSION_REQUIRED.
Enregistrements d’écran (Nodes)
Les Nodes pris en charge exposentscreen.record (mp4). Exemple :
- La disponibilité de
screen.recorddépend de la plateforme du Node. - Les enregistrements d’écran sont plafonnés à
<= 60s. --no-audiodésactive la capture du microphone sur les plateformes prises en charge.- Utilisez
--screen <index>pour sélectionner un écran lorsque plusieurs écrans sont disponibles.
Localisation (Nodes)
Les Nodes exposentlocation.get lorsque la localisation est activée dans les paramètres.
Assistant CLI :
- La localisation est désactivée par défaut.
- « Always » nécessite l’autorisation système ; la récupération en arrière-plan est au mieux.
- La réponse inclut la latitude/longitude, la précision (mètres) et l’horodatage.
SMS (Nodes Android)
Les Nodes Android peuvent exposersms.send lorsque l’utilisateur accorde l’autorisation SMS et que l’appareil prend en charge la téléphonie.
Appel de bas niveau :
- La demande 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 d’appareil Android + données personnelles
Les Nodes Android peuvent annoncer des familles de commandes supplémentaires lorsque les capacités correspondantes sont activées. Familles disponibles :device.status,device.info,device.permissions,device.healthdevice.appslorsque le partage des applications installées est activé dans les paramètres Androidnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
device.appsest optionnel et renvoie par défaut les applications visibles dans le lanceur.- Les commandes de mouvement sont limitées par les capteurs disponibles.
Commandes système (hôte du Node / Node Mac)
Le Node macOS exposesystem.run, system.notify et system.execApprovals.get/set.
L’hôte de Node sans interface expose system.run, system.which et system.execApprovals.get/set.
Exemples :
system.runrenvoie stdout/stderr/le code de sortie dans la charge utile.- L’exécution du shell passe désormais par l’outil
execavechost=node;nodesreste la surface RPC directe pour les commandes explicites du Node. nodes invoken’expose passystem.runnisystem.run.prepare; ceux-ci restent uniquement sur le chemin exec.- Le chemin exec prépare un
systemRunPlancanonique avant approbation. Une fois une approbation accordée, le Gateway transmet ce plan stocké, et non les champs command/cwd/session modifiés ultérieurement par l’appelant. system.notifyrespecte l’état des autorisations de notification dans l’application macOS.- Les métadonnées
platform/deviceFamilyde Node non reconnues utilisent une liste d’autorisation par défaut prudente qui exclutsystem.runetsystem.which. Si vous avez intentionnellement besoin de ces commandes pour une plateforme inconnue, ajoutez-les explicitement viagateway.nodes.allowCommands. system.runprend en charge--cwd,--env KEY=VAL,--command-timeoutet--needs-screen-recording.- Pour les enveloppes shell (
bash|sh|zsh ... -c/-lc), les valeurs--envlimitées à la requête sont réduites à une liste d’autorisation explicite (TERM,LANG,LC_*,COLORTERM,NO_COLOR,FORCE_COLOR). - Pour les décisions d’autorisation permanente en mode liste d’autorisation, les enveloppes d’envoi connues (
env,flock,nice,nohup,stdbuf,timeout) persistent les chemins des exécutables internes au lieu des chemins des enveloppes. Si le désencapsulage n’est pas sûr, aucune entrée de liste d’autorisation n’est persistée automatiquement. - Sur les hôtes de Node Windows en mode liste d’autorisation, les exécutions d’enveloppe shell via
cmd.exe /cnécessitent une approbation (l’entrée de liste d’autorisation seule n’autorise pas automatiquement la forme avec enveloppe). system.notifyprend en charge--priority <passive|active|timeSensitive>et--delivery <system|overlay|auto>.- Les hôtes de Node ignorent les remplacements
PATHet retirent les clés de démarrage/shell dangereuses (DYLD_*,LD_*,BASHOPTS,FPATH,KSH_ENV,NODE_OPTIONS,NODE_REDIRECT_WARNINGS,NODE_REPL_EXTERNAL_MODULE,NODE_REPL_HISTORY,NODE_V8_COVERAGE,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4,TCLLIBPATH). Si vous avez besoin d’entrées PATH supplémentaires, configurez l’environnement du service de l’hôte de Node (ou installez les outils dans des emplacements standard) au lieu de transmettrePATHvia--env. - En mode Node macOS,
system.runest contrôlé par les approbations exec dans l’application macOS (Paramètres → Approbations exec). Les modes demander/liste d’autorisation/complet se comportent comme pour l’hôte de Node sans interface ; les invites refusées renvoientSYSTEM_RUN_DENIED. - Sur l’hôte de Node sans interface,
system.runest contrôlé par les approbations exec (~/.openclaw/exec-approvals.json).
Liaison exec du Node
Lorsque plusieurs Nodes sont disponibles, vous pouvez lier exec à un Node spécifique. Cela définit le Node par défaut pourexec host=node (et peut être remplacé par agent).
Par défaut global :
Carte des autorisations
Les Nodes peuvent inclure une cartepermissions dans node.list / node.describe, indexée par nom d’autorisation (par exemple screenRecording, accessibility) avec des valeurs booléennes (true = accordée).
Hôte de Node sans interface (multiplateforme)
OpenClaw peut exécuter un hôte de Node sans interface (sans UI) qui se connecte au WebSocket du Gateway et exposesystem.run / system.which. C’est utile sous Linux/Windows
ou pour exécuter un Node minimal aux côtés d’un serveur.
Démarrez-le :
- L’appairage reste requis (le Gateway affichera une invite d’appairage de l’appareil).
- L’hôte de Node stocke son identifiant de Node, son jeton, son nom d’affichage et les informations de connexion au 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 Node sans interface exécute
system.runlocalement par défaut. DéfinissezOPENCLAW_NODE_EXEC_HOST=apppour routersystem.runvia l’hôte exec de l’application compagnon ; ajoutezOPENCLAW_NODE_EXEC_FALLBACK=0pour exiger l’hôte de l’application et échouer de manière fermée s’il est indisponible. - Ajoutez
--tls/--tls-fingerprintlorsque le WS du Gateway utilise TLS.
Mode Node Mac
- L’application de barre de menus macOS se connecte au serveur WS du Gateway en tant que Node (ainsi
openclaw nodes …fonctionne avec ce Mac). - En mode distant, l’application ouvre un tunnel SSH pour le port du Gateway et se connecte à
localhost.