Fundamentals
Gateway-architectuur
Overzicht
- Eén langlevende Gateway beheert alle berichtinterfaces (WhatsApp via Baileys, Telegram via grammY, Slack, Discord, Signal, iMessage, WebChat).
- Besturingsvlakclients (macOS-app, CLI, webinterface, automatiseringen) verbinden met de
Gateway via WebSocket op de geconfigureerde bind-host (standaard
127.0.0.1:18789). - Nodes (macOS/iOS/Android/headless) verbinden ook via WebSocket, maar
declareren
role: nodemet expliciete mogelijkheden/opdrachten. - Eén Gateway per host; dit is de enige plek die een WhatsApp-sessie opent.
- De canvas-host wordt aangeboden door de HTTP-server van de Gateway onder:
/__openclaw__/canvas/(door agent bewerkbare HTML/CSS/JS)/__openclaw__/a2ui/(A2UI-host) Deze gebruikt dezelfde poort als de Gateway (standaard18789).
Componenten en stromen
Gateway (daemon)
- Onderhoudt providerverbindingen.
- Biedt een getypeerde WS-API (verzoeken, antwoorden, server-pushgebeurtenissen).
- Valideert inkomende frames tegen JSON Schema.
- Verzendt gebeurtenissen zoals
agent,chat,presence,health,heartbeat,cron.
Clients (Mac-app / CLI / webbeheer)
- Eén WS-verbinding per client.
- Versturen verzoeken (
health,status,send,agent,system-presence). - Abonneren zich op gebeurtenissen (
tick,agent,presence,shutdown).
Nodes (macOS / iOS / Android / headless)
- Verbinden met dezelfde WS-server met
role: node. - Geven een apparaatidentiteit op in
connect; koppeling is apparaatgebaseerd (rolnode) en goedkeuring leeft in de opslag voor apparaatkoppelingen. - Bieden opdrachten zoals
canvas.*,camera.*,screen.record,location.get.
Protocoldetails:
WebChat
- Statische interface die de Gateway-WS-API gebruikt voor chatgeschiedenis en verzenden.
- In externe opstellingen verbindt deze via dezelfde SSH-/Tailscale-tunnel als andere clients.
Verbindingslevenscyclus (één 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
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}
Wireprotocol (samenvatting)
- Transport: WebSocket, tekstframes met JSON-payloads.
- Eerste frame moet
connectzijn. - Na handshake:
- Verzoeken:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - Gebeurtenissen:
{type:"event", event, payload, seq?, stateVersion?}
- Verzoeken:
hello-ok.features.methods/eventszijn ontdekkingsmetadata, geen gegenereerde dump van elke aanroepbare hulproute.- Authenticatie met gedeeld geheim gebruikt
connect.params.auth.tokenofconnect.params.auth.password, afhankelijk van de geconfigureerde Gateway-authenticatiemodus. - Modi met identiteit, zoals Tailscale Serve
(
gateway.auth.allowTailscale: true) of niet-loopbackgateway.auth.mode: "trusted-proxy"voldoen aan authenticatie via verzoekheaders in plaats vanconnect.params.auth.*. - Privé-ingress
gateway.auth.mode: "none"schakelt authenticatie met gedeeld geheim volledig uit; houd die modus uitgeschakeld voor publieke/onvertrouwde ingress. - Idempotentiesleutels zijn vereist voor methoden met neveneffecten (
send,agent) om veilig opnieuw te proberen; de server bewaart een kortlevende deduplicatiecache. - Nodes moeten
role: "node"plus mogelijkheden/opdrachten/rechten opnemen inconnect.
Koppeling + lokaal vertrouwen
- Alle WS-clients (operators + nodes) nemen een apparaatidentiteit op bij
connect. - Nieuwe apparaat-ID's vereisen koppelingsgoedkeuring; de Gateway geeft een apparaat-token uit voor latere verbindingen.
- Directe local loopback-verbindingen kunnen automatisch worden goedgekeurd om de gebruikerservaring op dezelfde host soepel te houden.
- OpenClaw heeft ook een smal backend-/containerlokaal zelfverbindingspad voor vertrouwde hulpstromen met gedeeld geheim.
- Tailnet- en LAN-verbindingen, inclusief tailnet-binds op dezelfde host, vereisen nog steeds expliciete koppelingsgoedkeuring.
- Alle verbindingen moeten de
connect.challenge-nonce ondertekenen. - Handtekeningpayload
v3bindt ookplatform+deviceFamily; de gateway pint gekoppelde metadata bij opnieuw verbinden en vereist herstelkoppeling voor metadatawijzigingen. - Niet-lokale verbindingen vereisen nog steeds expliciete goedkeuring.
- Gateway-authenticatie (
gateway.auth.*) geldt nog steeds voor alle verbindingen, lokaal of extern.
Details: Gateway-protocol, Koppeling, Beveiliging.
Protocoltypering en codegeneratie
- TypeBox-schema's definiëren het protocol.
- JSON Schema wordt uit die schema's gegenereerd.
- Swift-modellen worden gegenereerd uit het JSON Schema.
Externe toegang
-
Voorkeur: Tailscale of VPN.
-
Alternatief: SSH-tunnel
ssh -N -L 18789:127.0.0.1:18789 user@host -
Dezelfde handshake + authenticatietoken gelden via de tunnel.
-
TLS + optionele pinning kunnen voor WS worden ingeschakeld in externe opstellingen.
Operationele momentopname
- Start:
openclaw gateway(voorgrond, logt naar stdout). - Gezondheid:
healthvia WS (ook opgenomen inhello-ok). - Supervisie: launchd/systemd voor automatisch herstarten.
Invarianten
- Exact één Gateway beheert één Baileys-sessie per host.
- Handshake is verplicht; elk niet-JSON of niet-connect eerste frame leidt tot een harde sluiting.
- Gebeurtenissen worden niet opnieuw afgespeeld; clients moeten vernieuwen bij hiaten.
Gerelateerd
- Agentlus — gedetailleerde uitvoeringscyclus van de agent
- Gateway-protocol — WebSocket-protocolcontract
- Wachtrij — opdrachtenwachtrij en gelijktijdigheid
- Beveiliging — vertrouwensmodel en hardening