Gateway-Architektur
Zuletzt aktualisiert: 22.01.2026
Ueberblick
- Ein einzelnes langlebendes Gateway verwaltet alle Messaging-Oberflaechen (WhatsApp ueber Baileys, Telegram ueber grammY, Slack, Discord, Signal, iMessage, WebChat).
- Control-Plane-Clients (macOS-App, CLI, Web-UI, Automatisierungen) verbinden sich ueber
WebSocket mit dem Gateway auf dem konfigurierten Bind-Host (Standard
127.0.0.1:18789). - Nodes (macOS/iOS/Android/Headless) verbinden sich ebenfalls ueber WebSocket, deklarieren
aber
role: nodemit expliziten Caps/Commands. - Ein Gateway pro Host; es ist der einzige Ort, der eine WhatsApp-Sitzung oeffnet.
- Der Canvas-Host wird vom Gateway-HTTP-Server unter folgenden Pfaden bereitgestellt:
/__openclaw__/canvas/(vom Agenten bearbeitbares HTML/CSS/JS)/__openclaw__/a2ui/(A2UI-Host) Er nutzt denselben Port wie das Gateway (Standard18789).
Komponenten und Ablaeufe
Gateway (Daemon)
- Haelt Provider-Verbindungen aufrecht.
- Stellt eine typisierte WS-API bereit (Requests, Responses, Server-Push-Events).
- Validiert eingehende Frames gegen JSON-Schema.
- Gibt Events wie
agent,chat,presence,health,heartbeat,cronaus.
Clients (Mac-App / CLI / Web-Admin)
- Eine WS-Verbindung pro Client.
- Senden Requests (
health,status,send,agent,system-presence). - Abonnieren Events (
tick,agent,presence,shutdown).
Nodes (macOS / iOS / Android / Headless)
- Verbinden sich zum selben WS-Server mit
role: node. - Liefern eine Geraeteidentitaet beim
connect; das Pairing ist geraetebasiert (Rollenode) und die Genehmigung liegt im Geraete-Pairing-Store. - Stellen Befehle bereit wie
canvas.*,camera.*,screen.record,location.get.
Protokolldetails:
WebChat
- Statische UI, die die Gateway-WS-API fuer Chat-Verlauf und Sends nutzt.
- Bei Remote-Setups verbindet sie sich ueber denselben SSH/Tailscale-Tunnel wie andere Clients.
Verbindungs-Lebenszyklus (einzelner Client)
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<br>snapshot: presence + health
Gateway-->>Client: event:presence
Gateway-->>Client: event:tick
Client->>Gateway: req:agent
Gateway-->>Client: res:agent<br>ack {runId, status:"accepted"}
Gateway-->>Client: event:agent<br>(streaming)
Gateway-->>Client: res:agent<br>final {runId, status, summary}
Wire-Protokoll (Zusammenfassung)
- Transport: WebSocket, Text-Frames mit JSON-Payloads.
- Der erste Frame muss
connectsein. - Nach dem Handshake:
- Requests:
{type:"req", id, method, params}->{type:"res", id, ok, payload|error} - Events:
{type:"event", event, payload, seq?, stateVersion?}
- Requests:
- Wenn
OPENCLAW_GATEWAY_TOKEN(oder--token) gesetzt ist, mussconnect.params.auth.tokenuebereinstimmen, sonst wird der Socket geschlossen. - Idempotenz-Schluessel sind fuer seiteneffektbehaftete Methoden (
send,agent) erforderlich, um sicheres Wiederholen zu ermoeglichen; der Server haelt einen kurzlebigen Dedupe-Cache. - Nodes muessen
role: "node"plus Caps/Commands/Permissions inconnectmitliefern.
Pairing und lokales Vertrauen
- Alle WS-Clients (Operatoren und Nodes) liefern eine Geraeteidentitaet beim
connect. - Neue Geraete-IDs erfordern eine Pairing-Genehmigung; das Gateway gibt ein Geraete-Token fuer nachfolgende Connects aus.
- Lokale Connects (Loopback oder die eigene Tailnet-Adresse des Gateway-Hosts) koennen automatisch genehmigt werden, damit die UX auf demselben Host reibungslos bleibt.
- Alle Connects muessen die
connect.challenge-Nonce signieren. - Signatur-Payload
v3bindet auchplatformunddeviceFamily; das Gateway fixiert die gepairten Metadaten beim Reconnect und verlangt Repair-Pairing bei Metadaten-Aenderungen. - Nicht-lokale Connects erfordern weiterhin eine explizite Genehmigung.
- Gateway-Auth (
gateway.auth.*) gilt fuer alle Verbindungen, lokal oder remote.
Details: Gateway-Protokoll, Pairing, Sicherheit.
Protokoll-Typisierung und Codegen
- TypeBox-Schemas definieren das Protokoll.
- JSON-Schema wird aus diesen Schemas generiert.
- Swift-Modelle werden aus dem JSON-Schema generiert.
Remote-Zugriff
-
Bevorzugt: Tailscale oder VPN.
-
Alternative: SSH-Tunnel
ssh -N -L 18789:127.0.0.1:18789 user@host -
Derselbe Handshake und Auth-Token gelten auch ueber den Tunnel.
-
TLS und optionales Pinning koennen fuer WS in Remote-Setups aktiviert werden.
Betriebs-Snapshot
- Start:
openclaw gateway(Vordergrund, loggt auf stdout). - Health:
healthueber WS (auch inhello-okenthalten). - Supervision: launchd/systemd fuer automatischen Neustart.
Invarianten
- Genau ein Gateway kontrolliert eine einzelne Baileys-Sitzung pro Host.
- Der Handshake ist Pflicht; jeder Nicht-JSON- oder Nicht-Connect-erste-Frame fuehrt zu einem harten Close.
- Events werden nicht wiederholt; Clients muessen bei Luecken aktualisieren.