Gateway-protocol (WebSocket)¶
Het Gateway WS-protocol is het enige control plane + node-transport voor OpenClaw. Alle clients (CLI, web-UI, macOS-app, iOS/Android-nodes, headless nodes) verbinden via WebSocket en verklaren hun rol + scope tijdens de handshake.
Transport¶
- WebSocket, tekstframes met JSON-payloads.
- Het eerste frame moet een
connect-request zijn.
Handshake (verbinden)¶
Gateway → Cliënt (pre-connect-uitdaging):
{
"type": "event",
"event": "connect.challenge",
"payload": { "nonce": "…", "ts": 1737264000000 }
}
Cliënt → Gateway:
{
"type": "req",
"id": "…",
"method": "connect",
"params": {
"minProtocol": 3,
"maxProtocol": 3,
"client": {
"id": "cli",
"version": "1.2.3",
"platform": "macos",
"mode": "operator"
},
"role": "operator",
"scopes": ["operator.read", "operator.write"],
"caps": [],
"commands": [],
"permissions": {},
"auth": { "token": "…" },
"locale": "en-US",
"userAgent": "openclaw-cli/1.2.3",
"device": {
"id": "device_fingerprint",
"publicKey": "…",
"signature": "…",
"signedAt": 1737264000000,
"nonce": "…"
}
}
}
Gateway → Cliënt:
{
"type": "res",
"id": "…",
"ok": true,
"payload": { "type": "hello-ok", "protocol": 3, "policy": { "tickIntervalMs": 15000 } }
}
Wanneer een apparaattoken wordt uitgegeven, bevat hello-ok ook:
{
"auth": {
"deviceToken": "…",
"role": "operator",
"scopes": ["operator.read", "operator.write"]
}
}
Node-voorbeeld¶
{
"type": "req",
"id": "…",
"method": "connect",
"params": {
"minProtocol": 3,
"maxProtocol": 3,
"client": {
"id": "ios-node",
"version": "1.2.3",
"platform": "ios",
"mode": "node"
},
"role": "node",
"scopes": [],
"caps": ["camera", "canvas", "screen", "location", "voice"],
"commands": ["camera.snap", "canvas.navigate", "screen.record", "location.get"],
"permissions": { "camera.capture": true, "screen.record": false },
"auth": { "token": "…" },
"locale": "en-US",
"userAgent": "openclaw-ios/1.2.3",
"device": {
"id": "device_fingerprint",
"publicKey": "…",
"signature": "…",
"signedAt": 1737264000000,
"nonce": "…"
}
}
}
Framing¶
- Verzoek:
{type:"req", id, method, params} - Antwoord:
{type:"res", id, ok, payload|error} - Gebeurtenis:
{type:"event", event, payload, seq?, stateVersion?}
Methoden met bijwerkingen vereisen idempotency keys (zie schema).
Rollen + scopes¶
Rollen¶
operator= control plane-client (CLI/UI/automatisering).node= capability-host (camera/scherm/canvas/system.run).
Reikwijdten (operator)¶
Veelvoorkomende scopes:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairing
Caps/commando's/machtigingen (node)¶
Nodes verklaren capability-claims tijdens het verbinden:
caps: hoog-niveau capability-categorieën.commands: command-allowlist voor invoke.permissions: fijnmazige toggles (bijv.screen.record,camera.capture).
De Gateway behandelt deze als claims en handhaaft server-side allowlists.
Presence¶
system-presenceretourneert items die zijn gesleuteld op apparaatidentiteit.- Presence-items bevatten
deviceId,rolesenscopes, zodat UI’s één rij per apparaat kunnen tonen, zelfs wanneer het zowel als operator als node verbindt.
Node-hulpmethoden¶
- Nodes kunnen
skills.binsaanroepen om de huidige lijst met skill-executables op te halen voor auto-allow-controles.
Exec approvals¶
- Wanneer een exec-aanvraag goedkeuring vereist, broadcast de gateway
exec.approval.requested. - Operator-clients lossen dit op door
exec.approval.resolveaan te roepen (vereistoperator.approvals-scope).
Versionering¶
PROTOCOL_VERSIONleeft insrc/gateway/protocol/schema.ts.- Clients sturen
minProtocol+maxProtocol; de server weigert mismatches. - Schema’s + modellen worden gegenereerd uit TypeBox-definities:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Auth¶
- Als
OPENCLAW_GATEWAY_TOKEN(of--token) is ingesteld, moetconnect.params.auth.tokenovereenkomen, anders wordt de socket gesloten. - Na pairing geeft de Gateway een apparaattoken uit, gescopeerd op de
verbindingsrol + scopes. Deze wordt teruggegeven in
hello-ok.auth.deviceTokenen moet door de client worden opgeslagen voor toekomstige verbindingen. - Apparaattokens kunnen worden geroteerd/ingetrokken via
device.token.rotateendevice.token.revoke(vereistoperator.pairing-scope).
Apparaatidentiteit + pairing¶
- Nodes moeten een stabiele apparaatidentiteit (
device.id) opnemen die is afgeleid van een keypair-fingerprint. - Gateways geven tokens uit per apparaat + rol.
- Pairing-goedkeuringen zijn vereist voor nieuwe apparaat-ID’s, tenzij lokale auto-goedkeuring is ingeschakeld.
- Lokale verbindingen omvatten loopback en het eigen tailnet-adres van de Gateway-host (zodat tailnet-binds op dezelfde host nog steeds automatisch kunnen worden goedgekeurd).
- Alle WS-clients moeten
device-identiteit opnemen tijdensconnect(operator + node). Control UI mag dit alleen weglaten wanneergateway.controlUi.allowInsecureAuthis ingeschakeld (ofgateway.controlUi.dangerouslyDisableDeviceAuthvoor break-glass-gebruik). - Niet-lokale verbindingen moeten de door de server geleverde
connect.challenge-nonce ondertekenen.
TLS + pinning¶
- TLS wordt ondersteund voor WS-verbindingen.
- Clients kunnen optioneel de gateway-certificaatvingerafdruk pinnen (zie
gateway.tls- config plusgateway.remote.tlsFingerprintof CLI--tls-fingerprint).
Scope¶
Dit protocol stelt de volledige gateway-API bloot (status, kanalen, modellen, chat,
agent, sessies, nodes, goedkeuringen, enz.). Het exacte oppervlak wordt gedefinieerd door de
TypeBox-schema’s in src/gateway/protocol/schema.ts.