Gateway-architectuur
Laatst bijgewerkt: 2026-01-22Overzicht
- Eén enkele langlevende Gateway beheert alle berichtoppervlakken (WhatsApp via Baileys, Telegram via grammY, Slack, Discord, Signal, iMessage, WebChat).
- Control-plane-clients (macOS-app, CLI, web-UI, 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 caps/opdrachten. - Eén Gateway per host; dit is de enige plek die een WhatsApp-sessie opent.
- De canvas host wordt door de Gateway HTTP-server aangeboden onder:
/__openclaw__/canvas/(door de agent bewerkbare HTML/CSS/JS)/__openclaw__/a2ui/(A2UI-host) Het gebruikt dezelfde poort als de Gateway (standaard18789).
Componenten en stromen
Gateway (daemon)
- Onderhoudt providerverbindingen.
- Stelt een getypeerde WS-API beschikbaar (requests, responses, server-push-events).
- Valideert inkomende frames tegen JSON Schema.
- Zendt events uit zoals
agent,chat,presence,health,heartbeat,cron.
Clients (mac-app / CLI / webbeheer)
- Eén WS-verbinding per client.
- Verzenden requests (
health,status,send,agent,system-presence). - Abonneren zich op events (
tick,agent,presence,shutdown).
Nodes (macOS / iOS / Android / headless)
- Verbinden met dezelfde WS-server met
role: node. - Leveren een apparaatidentiteit in
connect; koppeling is apparaat‑gebaseerd (rolnode) en goedkeuring leeft in de apparaatkoppelingsopslag. - Stellen opdrachten beschikbaar zoals
canvas.*,camera.*,screen.record,location.get.
WebChat
- Statische UI die de Gateway WS-API gebruikt voor chatgeschiedenis en verzenden.
- In remote-opstellingen verbindt via dezelfde SSH/Tailscale-tunnel als andere clients.
Verbindingslevenscyclus (enkele client)
Wire-protocol (samenvatting)
- Transport: WebSocket, tekstframes met JSON-payloads.
- Eerste frame moet
connectzijn. - Na de handshake:
- Requests:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - Events:
{type:"event", event, payload, seq?, stateVersion?}
- Requests:
- Als
OPENCLAW_GATEWAY_TOKEN(of--token) is ingesteld,connect.params.auth.tokenmoet overeenkomen, anders sluit de socket. - Idempotentiesleutels zijn vereist voor methoden met neveneffecten (
send,agent) om veilig te kunnen herhalen; de server houdt een kortlevende deduplicatiecache bij. - Nodes moeten
role: "node"opnemen plus caps/opdrachten/rechten inconnect.
Koppeling + lokaal vertrouwen
- Alle WS-clients (operators + nodes) nemen een apparaatidentiteit op in
connect. - Nieuwe apparaat-ID’s vereisen koppelingsgoedkeuring; de Gateway geeft een apparaat-token uit voor volgende verbindingen.
- Lokale verbindingen (loopback of het eigen tailnet-adres van de Gateway-host) kunnen automatisch worden goedgekeurd om de UX op dezelfde host soepel te houden.
- Niet-lokale verbindingen moeten de
connect.challenge-nonce ondertekenen en vereisen expliciete goedkeuring. - Gateway-auth (
gateway.auth.*) blijft van toepassing op alle verbindingen, lokaal of op afstand.
Protocoltypering en codegeneratie
- TypeBox-schema’s definiëren het protocol.
- JSON Schema wordt gegenereerd uit die schema’s.
- Swift-modellen worden gegenereerd uit het JSON Schema.
Toegang op afstand
- Voorkeur: Tailscale of VPN.
-
Alternatief: SSH-tunnel
- Dezelfde handshake + auth-token zijn van toepassing over de tunnel.
- TLS + optionele pinning kan worden ingeschakeld voor WS in remote-opstellingen.
Operationeel overzicht
- Starten:
openclaw gateway(foreground, logt naar stdout). - Health:
healthvia WS (ook opgenomen inhello-ok). - Supervisie: launchd/systemd voor automatisch herstarten.
Invarianten
- Precies één Gateway beheert één enkele Baileys-sessie per host.
- Handshake is verplicht; elk niet-JSON- of niet-connect-eerste frame resulteert in een harde sluiting.
- Events worden niet opnieuw afgespeeld; clients moeten bij hiaten verversen.