Skip to main content

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):
Cliënt → Gateway:
Gateway → Cliënt:
Wanneer een apparaattoken wordt uitgegeven, bevat hello-ok ook:

Node-voorbeeld

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.read
  • operator.write
  • operator.admin
  • operator.approvals
  • operator.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-presence retourneert items die zijn gesleuteld op apparaatidentiteit.
  • Presence-items bevatten deviceId, roles en scopes, zodat UI’s één rij per apparaat kunnen tonen, zelfs wanneer het zowel als operator als node verbindt.

Node-hulpmethoden

  • Nodes kunnen skills.bins aanroepen 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.resolve aan te roepen (vereist operator.approvals-scope).

Versionering

  • PROTOCOL_VERSION leeft in src/gateway/protocol/schema.ts.
  • Clients sturen minProtocol + maxProtocol; de server weigert mismatches.
  • Schema’s + modellen worden gegenereerd uit TypeBox-definities:
    • pnpm protocol:gen
    • pnpm protocol:gen:swift
    • pnpm protocol:check

Auth

  • Als OPENCLAW_GATEWAY_TOKEN (of --token) is ingesteld, moet connect.params.auth.token overeenkomen, 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.deviceToken en moet door de client worden opgeslagen voor toekomstige verbindingen.
  • Apparaattokens kunnen worden geroteerd/ingetrokken via device.token.rotate en device.token.revoke (vereist operator.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 tijdens connect (operator + node). Control UI mag dit alleen weglaten wanneer gateway.controlUi.allowInsecureAuth is ingeschakeld (of gateway.controlUi.dangerouslyDisableDeviceAuth voor 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 plus gateway.remote.tlsFingerprint of 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.