Nodes
Un node est un appareil compagnon (macOS/iOS/Android/headless) qui se connecte au WebSocket de la passerelle (même port que les opérateurs) avecrole: "node" et expose une surface de commandes (par ex. canvas.*, camera.*, device.*, notifications.*, system.*) via node.invoke. Détails du protocole : Protocole Gateway.
Transport historique : Protocole Bridge (TCP JSONL ;
historique uniquement pour les nodes actuels).
macOS peut également fonctionner en mode node : l’app de barre de menus se connecte au serveur WS de la passerelle et expose ses commandes locales canvas/camera comme node (de sorte que openclaw nodes … fonctionne sur ce Mac).
Remarques :
- Les nodes 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 passerelle, pas sur les nodes.
- Guide de dépannage : /nodes/troubleshooting
Appairage + état
Les nodes WS utilisent l’appairage d’appareil. Les nodes présentent une identité d’appareil pendantconnect ; la passerelle
crée une demande d’appairage d’appareil pour role: node. Approuvez-la via la CLI des appareils (ou l’interface).
CLI rapide :
requestId est créé. Réexécutez
openclaw devices list avant d’approuver.
Remarques :
nodes statusmarque un node comme paired 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 de jeton reste à l’intérieur de ce contrat ; elle ne peut pas faire évoluer un node appairé vers un rôle différent que l’approbation d’appairage n’a jamais accordé.
node.pair.*(CLI :openclaw nodes pending/approve/reject/rename) est un magasin d’appairage de node distinct appartenant à la passerelle ; il ne contrôle pas la poignée de main WSconnect.- La portée d’approbation suit les commandes déclarées par la demande en attente :
- demande sans commande :
operator.pairing - commandes de node sans exec :
operator.pairing+operator.write system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- demande sans commande :
Hôte de node distant (system.run)
Utilisez un hôte de node lorsque votre passerelle s’exécute sur une machine et que vous voulez que les commandes s’exécutent sur une autre. Le modèle parle toujours à la passerelle ; la passerelle transmet les appelsexec à l’hôte de node lorsque host=node est sélectionné.
Ce qui s’exécute où
- Hôte de passerelle : reçoit les messages, exécute le modèle, route les appels d’outils.
- Hôte de node : exécute
system.run/system.whichsur la machine du node. - Approbations : appliquées sur l’hôte de node via
~/.openclaw/exec-approvals.json.
- Les exécutions de node adossées à une approbation lient le contexte exact de la requête.
- Pour les exécutions directes de fichiers shell/runtime, OpenClaw lie également au mieux 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 interpréteur/runtime, l’exécution adossée à une approbation est refusée au lieu de prétendre couvrir totalement le runtime. Utilisez le sandboxing, des hôtes séparés ou une liste d’autorisation/workflow approuvé explicite pour une sémantique d’interpréteur plus large.
Démarrer un hôte de node (premier plan)
Sur la machine du node :Passerelle distante via tunnel SSH (liaison loopback)
Si la passerelle est liée au loopback (gateway.bind=loopback, par défaut en mode local),
les hôtes de node distants ne peuvent pas se connecter directement. Créez un tunnel SSH et pointez l’hôte de node
vers l’extrémité locale du tunnel.
Exemple (hôte de node -> hôte de passerelle) :
openclaw node runprend en charge l’authentification par jeton ou 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 node ignore intentionnellement
gateway.remote.token/gateway.remote.password. - En mode distant,
gateway.remote.token/gateway.remote.passwordsont éligibles selon les règles de priorité distantes. - Si des SecretRefs actifs
gateway.auth.*sont configurés mais non résolus, l’authentification de l’hôte de node échoue en mode fermé. - La résolution d’auth de l’hôte de node n’honore que les variables d’environnement
OPENCLAW_GATEWAY_*.
Démarrer un hôte de node (service)
Appairer + nommer
Sur l’hôte de la passerelle :openclaw devices list
et approuvez le requestId courant.
Options de nommage :
--display-namesuropenclaw node run/openclaw node install(persiste dans~/.openclaw/node.jsonsur le node).openclaw nodes rename --node <id|name|ip> --name "Build Node"(remplacement côté passerelle).
Ajouter les commandes à la liste d’autorisation
Les approbations exec sont par hôte de node. Ajoutez des entrées de liste d’autorisation depuis la passerelle :~/.openclaw/exec-approvals.json.
Pointer exec vers le node
Configurez les valeurs par défaut (configuration de la passerelle) :exec avec host=node s’exécute sur l’hôte de node (sous réserve de la liste d’autorisation/des approbations du node).
host=auto ne choisira pas implicitement le node de lui-même, mais une requête explicite host=node par appel est autorisée depuis auto. Si vous voulez que l’exec sur node soit la valeur par défaut pour la session, définissez explicitement tools.exec.host=node ou /exec host=node ....
Associé :
Invocation de commandes
Bas niveau (RPC brut) :Captures d’écran (instantanés canvas)
Si le node affiche le Canvas (WebView),canvas.snapshot renvoie { format, base64 }.
Assistant CLI (écrit dans un fichier temporaire et affiche MEDIA:<path>) :
Contrôles Canvas
canvas presentaccepte des URL ou des chemins de fichiers locaux (--target), ainsi que des--x/--y/--width/--heightfacultatifs 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 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 des clips est limitée (actuellement
<= 60s) pour éviter des charges utiles base64 trop volumineuses. - Android demandera les autorisations
CAMERA/RECORD_AUDIOlorsque 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 limités à
<= 60s. --no-audiodésactive la capture microphone sur les plateformes prises en charge.- Utilisez
--screen <index>pour sélectionner un écran lorsqu’il y a plusieurs affichages.
Localisation (nodes)
Les nodes exposentlocation.get lorsque la localisation est activée dans les réglages.
Assistant CLI :
- La localisation est désactivée par défaut.
- « Toujours » nécessite une autorisation système ; la récupération en arrière-plan est best-effort.
- La réponse inclut lat/lon, précision (mètres) et 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.
Invocation bas niveau :
- L’invite d’autorisation doit être acceptée sur l’appareil Android avant que la capacité soit annoncée.
- Les appareils Wi‑Fi uniquement sans téléphonie n’annonceront pas
sms.send.
Commandes Android appareil + 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.healthnotifications.list,notifications.actionsphotos.latestcontacts.search,contacts.addcalendar.events,calendar.addcallLog.searchsms.searchmotion.activity,motion.pedometer
- Les commandes de mouvement sont contrôlées par capacité selon les capteurs disponibles.
Commandes système (hôte de node / mac node)
Le node macOS exposesystem.run, system.notify et system.execApprovals.get/set.
L’hôte de node headless expose system.run, system.which et system.execApprovals.get/set.
Exemples :
system.runrenvoie stdout/stderr/code de sortie dans la charge utile.- L’exécution shell passe désormais par l’outil
execavechost=node;nodesreste la surface RPC directe pour les commandes de node explicites. nodes invoken’expose passystem.runnisystem.run.prepare; ils restent uniquement sur le chemin exec.- Le chemin exec prépare un
systemRunPlancanonique avant approbation. Une fois une approbation accordée, la passerelle transmet ce plan stocké, et non des champs command/cwd/session modifiés ultérieurement par l’appelant. system.notifyrespecte l’état des autorisations de notification dans l’app macOS.- Les métadonnées
platform/deviceFamilyde node non reconnues utilisent une liste d’autorisation conservatrice par défaut 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 wrappers 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 allow-always en mode allowlist, les wrappers de distribution connus (
env,nice,nohup,stdbuf,timeout) persistent les chemins de l’exécutable interne au lieu des chemins du wrapper. Si le déballage 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 allowlist, les exécutions de wrapper shell via
cmd.exe /cnécessitent une approbation (une entrée de liste d’autorisation seule n’autorise pas automatiquement la forme wrapper). 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 dangereuses de démarrage/shell (DYLD_*,LD_*,NODE_OPTIONS,PYTHON*,PERL*,RUBYOPT,SHELLOPTS,PS4). Si vous avez besoin d’entrées PATH supplémentaires, configurez plutôt l’environnement du service de l’hôte de node (ou installez les outils dans des emplacements standard) au lieu de passerPATHvia--env. - En mode node macOS,
system.runest contrôlé par les approbations exec dans l’app macOS (Settings → Exec approvals). Ask/allowlist/full se comportent comme sur l’hôte de node headless ; les invites refusées renvoientSYSTEM_RUN_DENIED. - Sur l’hôte de node headless,
system.runest contrôlé par les approbations exec (~/.openclaw/exec-approvals.json).
Liaison exec 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).
Valeur par défaut globale :
Carte des autorisations
Les nodes peuvent inclure une cartepermissions dans node.list / node.describe, indexée par nom d’autorisation (par ex. screenRecording, accessibility) avec des valeurs booléennes (true = accordé).
Hôte de node headless (multiplateforme)
OpenClaw peut exécuter un hôte de node headless (sans interface) qui se connecte au WebSocket de la passerelle et exposesystem.run / system.which. C’est utile sous Linux/Windows
ou pour exécuter un node minimal à côté d’un serveur.
Démarrez-le :
- L’appairage reste requis (la passerelle affichera une invite d’appairage d’appareil).
- L’hôte de node stocke son identifiant de node, son jeton, son nom d’affichage et ses informations de connexion à la passerelle 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 headless exécute
system.runlocalement par défaut. DéfinissezOPENCLAW_NODE_EXEC_HOST=apppour routersystem.runvia l’hôte exec de l’app compagnon ; ajoutezOPENCLAW_NODE_EXEC_FALLBACK=0pour exiger l’hôte app et échouer en mode fermé s’il n’est pas disponible. - Ajoutez
--tls/--tls-fingerprintlorsque le WS de la passerelle utilise TLS.
Mode mac node
- L’app macOS de barre de menus se connecte au serveur WS de la passerelle comme node (de sorte que
openclaw nodes …fonctionne sur ce Mac). - En mode distant, l’app ouvre un tunnel SSH pour le port de la passerelle et se connecte à
localhost.