Fundamentals
Architecture du Gateway
Présentation
- Un unique Gateway longue durée possède toutes les surfaces de messagerie (WhatsApp via Baileys, Telegram via grammY, Slack, Discord, Signal, iMessage, WebChat).
- Les clients du plan de contrôle (application macOS, CLI, interface utilisateur web, automatisations) se connectent au
Gateway via WebSocket sur l’hôte de liaison configuré (par défaut
127.0.0.1:18789). - Les Nodes (macOS/iOS/Android/sans interface) se connectent aussi via WebSocket, mais
déclarent
role: nodeavec des capacités/commandes explicites. - Un Gateway par hôte ; c’est le seul endroit qui ouvre une session WhatsApp.
- L’hôte de canevas est servi par le serveur HTTP du Gateway sous :
/__openclaw__/canvas/(HTML/CSS/JS modifiables par l’agent)/__openclaw__/a2ui/(hôte A2UI) Il utilise le même port que le Gateway (par défaut18789).
Composants et flux
Gateway (démon)
- Maintient les connexions aux fournisseurs.
- Expose une API WS typée (requêtes, réponses, événements poussés par le serveur).
- Valide les trames entrantes avec un schéma JSON.
- Émet des événements comme
agent,chat,presence,health,heartbeat,cron.
Clients (application Mac / CLI / administration web)
- Une connexion WS par client.
- Envoient des requêtes (
health,status,send,agent,system-presence). - S’abonnent aux événements (
tick,agent,presence,shutdown).
Nodes (macOS / iOS / Android / sans interface)
- Se connectent au même serveur WS avec
role: node. - Fournissent une identité d’appareil dans
connect; l’appairage est basé sur l’appareil (rôlenode) et l’approbation réside dans le stockage d’appairage des appareils. - Exposent des commandes comme
canvas.*,camera.*,screen.record,location.get.
Détails du protocole :
WebChat
- Interface utilisateur statique qui utilise l’API WS du Gateway pour l’historique de discussion et les envois.
- Dans les configurations distantes, se connecte via le même tunnel SSH/Tailscale que les autres clients.
Cycle de vie de connexion (client unique)
sequenceDiagram
participant Client
participant Gateway
Client->>Gateway: req:connect
Gateway-->>Client: res (ok)
Note right of Gateway: or res error + close
Note left of Client: payload=hello-ok
snapshot: presence + health
Gateway-->>Client: event:presence
Gateway-->>Client: event:tick
Client->>Gateway: req:agent
Gateway-->>Client: res:agent
ack {runId, status:"accepted"}
Gateway-->>Client: event:agent
(streaming)
Gateway-->>Client: res:agent
final {runId, status, summary}
Protocole filaire (résumé)
- Transport : WebSocket, trames texte avec charges utiles JSON.
- La première trame doit être
connect. - Après la négociation :
- Requêtes :
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - Événements :
{type:"event", event, payload, seq?, stateVersion?}
- Requêtes :
hello-ok.features.methods/eventssont des métadonnées de découverte, pas un vidage généré de toutes les routes d’assistance appelables.- L’authentification par secret partagé utilise
connect.params.auth.tokenouconnect.params.auth.password, selon le mode d’authentification du Gateway configuré. - Les modes portant une identité comme Tailscale Serve
(
gateway.auth.allowTailscale: true) ou ungateway.auth.mode: "trusted-proxy"sans local loopback satisfont l’authentification à partir des en-têtes de requête au lieu deconnect.params.auth.*. - L’entrée privée
gateway.auth.mode: "none"désactive entièrement l’authentification par secret partagé ; gardez ce mode désactivé sur une entrée publique/non fiable. - Les clés d’idempotence sont requises pour les méthodes à effet de bord (
send,agent) afin de permettre une nouvelle tentative en toute sécurité ; le serveur conserve un cache de déduplication à courte durée de vie. - Les Nodes doivent inclure
role: "node"ainsi que les capacités/commandes/permissions dansconnect.
Appairage + confiance locale
- Tous les clients WS (opérateurs + Nodes) incluent une identité d’appareil sur
connect. - Les nouveaux ID d’appareil nécessitent une approbation d’appairage ; le Gateway émet un jeton d’appareil pour les connexions suivantes.
- Les connexions directes en local loopback peuvent être approuvées automatiquement pour préserver une expérience fluide sur le même hôte.
- OpenClaw dispose aussi d’un chemin étroit d’auto-connexion local au backend/conteneur pour les flux d’assistance fiables à secret partagé.
- Les connexions tailnet et LAN, y compris les liaisons tailnet sur le même hôte, nécessitent toujours une approbation explicite de l’appairage.
- Toutes les connexions doivent signer le nonce
connect.challenge. - La charge utile de signature
v3lie aussiplatform+deviceFamily; le gateway épingle les métadonnées appairées à la reconnexion et exige une réparation de l’appairage en cas de changements de métadonnées. - Les connexions non locales nécessitent toujours une approbation explicite.
- L’authentification du Gateway (
gateway.auth.*) s’applique toujours à toutes les connexions, locales ou distantes.
Détails : Protocole du Gateway, Appairage, Sécurité.
Typage du protocole et génération de code
- Les schémas TypeBox définissent le protocole.
- Le schéma JSON est généré à partir de ces schémas.
- Les modèles Swift sont générés à partir du schéma JSON.
Accès distant
-
Préféré : Tailscale ou VPN.
-
Alternative : tunnel SSH
ssh -N -L 18789:127.0.0.1:18789 user@host -
La même négociation + le même jeton d’authentification s’appliquent via le tunnel.
-
TLS + l’épinglage facultatif peuvent être activés pour WS dans les configurations distantes.
Instantané des opérations
- Démarrage :
openclaw gateway(premier plan, journaux vers stdout). - Santé :
healthvia WS (également inclus danshello-ok). - Supervision : launchd/systemd pour le redémarrage automatique.
Invariants
- Exactement un Gateway contrôle une seule session Baileys par hôte.
- La négociation est obligatoire ; toute première trame non JSON ou qui n’est pas
connectentraîne une fermeture ferme. - Les événements ne sont pas rejoués ; les clients doivent actualiser en cas d’interruptions.
Liens connexes
- Boucle d’agent — cycle détaillé d’exécution d’agent
- Protocole du Gateway — contrat du protocole WebSocket
- File d’attente — file d’attente des commandes et concurrence
- Sécurité — modèle de confiance et renforcement