De Gateway WS-protocol is het enige besturingsvlak + nodetransport voor OpenClaw. Alle clients (CLI, web-UI, macOS-app, iOS/Android-nodes, headless nodes) maken verbinding via WebSocket en verklaren hun rol + scope tijdens de handshake.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Transport
- WebSocket, tekstframes met JSON-payloads.
- Het eerste frame moet een
connect-verzoek zijn. - Pre-connect-frames zijn beperkt tot 64 KiB. Na een geslaagde handshake moeten clients
de limieten
hello-ok.policy.maxPayloadenhello-ok.policy.maxBufferedBytesvolgen. Wanneer diagnostiek is ingeschakeld, geven te grote inkomende frames en trage uitgaande bufferspayload.large-events voordat de Gateway het betrokken frame sluit of laat vallen. Deze events bewaren groottes, limieten, oppervlakken en veilige redencodes. Ze bewaren niet de berichttekst, bijlage-inhoud, ruwe frametekst, tokens, cookies of geheime waarden.
Handshake (connect)
Gateway → Client (pre-connect challenge):connect-verzoek
een opnieuw te proberen UNAVAILABLE-fout retourneren met details.reason ingesteld op
"startup-sidecars" en retryAfterMs. Clients moeten die respons opnieuw proberen
binnen hun totale verbindingsbudget in plaats van die te tonen als een definitieve
handshakefout.
server, features, snapshot en policy zijn allemaal verplicht volgens het schema
(src/gateway/protocol/schema/frames.ts). auth is ook verplicht en rapporteert
de onderhandelde rol/scopes. canvasHostUrl is optioneel.
Wanneer er geen devicetoken wordt uitgegeven, rapporteert hello-ok.auth de onderhandelde
machtigingen zonder tokenvelden:
client.id: "gateway-client",
client.mode: "backend") mogen device weglaten bij directe loopbackverbindingen wanneer
ze authenticeren met het gedeelde Gateway-token/wachtwoord. Dit pad is gereserveerd
voor interne control-plane-RPC’s en voorkomt dat verouderde CLI/device-pairingbaselines
lokaal backendwerk blokkeren, zoals updates van subagent-sessies. Externe clients,
browser-originclients, nodeclients en expliciete devicetoken-/device-identityclients
gebruiken nog steeds de normale pairing- en scope-upgradecontroles.
Wanneer er een devicetoken wordt uitgegeven, bevat hello-ok ook:
hello-ok.auth ook extra
begrensde rolvermeldingen in deviceTokens bevatten:
scopes: [] en blijft elk overgedragen operatortoken begrensd tot de allowlist
voor bootstrapoperators (operator.approvals, operator.read,
operator.talk.secrets, operator.write). Bootstrap-scopecontroles blijven
rolgeprefixt: operatorvermeldingen voldoen alleen aan operatorverzoeken, en niet-operatorrollen
hebben nog steeds scopes nodig onder hun eigen rolprefix.
Nodevoorbeeld
Framing
- Verzoek:
{type:"req", id, method, params} - Respons:
{type:"res", id, ok, payload|error} - Event:
{type:"event", event, payload, seq?, stateVersion?}
Rollen + scopes
Rollen
operator= control-planeclient (CLI/UI/automatisering).node= capabilityhost (camera/screen/canvas/system.run).
Scopes (operator)
Veelgebruikte scopes:operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config met includeSecrets: true vereist operator.talk.secrets
(of operator.admin).
Door Plugins geregistreerde Gateway-RPC-methoden kunnen hun eigen operatorscope aanvragen, maar
gereserveerde core-adminprefixen (config.*, exec.approvals.*, wizard.*,
update.*) worden altijd omgezet naar operator.admin.
Methodescope is alleen de eerste controle. Sommige slashopdrachten die via
chat.send worden bereikt, passen daarbovenop strengere controles op opdrachtniveau toe.
Zo vereisen permanente schrijfacties van /config set en /config unset operator.admin.
node.pair.approve heeft ook een extra scopecontrole op goedkeuringstijdstip bovenop de
basisscope van de methode:
- verzoeken zonder opdracht:
operator.pairing - verzoeken met niet-exec-nodeopdrachten:
operator.pairing+operator.write - verzoeken die
system.run,system.run.prepareofsystem.whichbevatten:operator.pairing+operator.admin
Caps/opdrachten/machtigingen (node)
Nodes verklaren capabilityclaims tijdens het verbinden:caps: capabilitycategorieën op hoog niveau.commands: allowlist voor opdrachten voor invoke.permissions: granulaire schakelaars (bijv.screen.record,camera.capture).
Presence
system-presenceretourneert vermeldingen met device-identiteit als sleutel.- Presence-vermeldingen bevatten
deviceId,rolesenscopes, zodat UI’s één rij per device kunnen tonen zelfs wanneer het zowel als operator als node verbinding maakt. node.listbevat optionele veldenlastSeenAtMsenlastSeenReason. Verbonden nodes rapporteren hun huidige verbindingstijd alslastSeenAtMsmet redenconnect; gepairde nodes kunnen ook duurzame achtergrond-presence rapporteren wanneer een vertrouwd node-event hun pairingmetadata bijwerkt.
Achtergrond-alive-event van node
Nodes kunnennode.event aanroepen met event: "node.presence.alive" om vast te leggen dat een gepairde node
alive was tijdens een achtergrondwake zonder die als verbonden te markeren.
trigger is een gesloten enum: background, silent_push, bg_app_refresh,
significant_location, manual of connect. Onbekende triggerstrings worden door de Gateway
genormaliseerd naar background vóór persistentie. Het event is alleen duurzaam voor geauthenticeerde
nodesessies met device; sessies zonder device of zonder pairing retourneren handled: false.
Succesvolle gateways retourneren een gestructureerd resultaat:
{ "ok": true } retourneren voor node.event; clients moeten dat behandelen als een
erkende RPC, niet als duurzame presence-persistentie.
Scoping van broadcast-events
Door de server gepushte WebSocket-broadcast-events zijn scope-gated, zodat pairing-scoped sessies of node-only sessies niet passief sessie-inhoud ontvangen.- Chat-, agent- en tool-resultframes (inclusief gestreamde
agent-events en resultaten van toolaanroepen) vereisen minimaaloperator.read. Sessies zonderoperator.readslaan deze frames volledig over. - Door Plugins gedefinieerde
plugin.*-broadcasts zijn afgeschermd totoperator.writeofoperator.admin, afhankelijk van hoe de Plugin ze heeft geregistreerd. - Status- en transportevents (
heartbeat,presence,tick, connect/disconnect-levenscyclus, enz.) blijven onbeperkt, zodat transportgezondheid zichtbaar blijft voor elke geauthenticeerde sessie. - Onbekende broadcast-eventfamilies zijn standaard scope-gated (fail-closed), tenzij een geregistreerde handler ze expliciet versoepelt.
Veelvoorkomende RPC-methodefamilies
Het openbare WS-oppervlak is breder dan de handshake-/auth-voorbeelden hierboven. Dit is geen gegenereerde dump —hello-ok.features.methods is een conservatieve
discoverylijst die is opgebouwd uit src/gateway/server-methods-list.ts plus geladen
methode-exports van Plugins/kanalen. Behandel het als featurediscovery, niet als een volledige
opsomming van src/gateway/server-methods/*.ts.
System and identity
System and identity
healthretourneert de gecachete of net geprobede healthsnapshot van de Gateway.diagnostics.stabilityretourneert de recente begrensde diagnostische stabiliteitsrecorder. Deze bewaart operationele metadata zoals eventnamen, aantallen, bytegroottes, geheugenuitlezingen, queue-/sessiestatus, kanaal-/Plugin-namen en sessie-id’s. Deze bewaart geen chattekst, Webhook-bodies, tooloutputs, ruwe request- of responsebodies, tokens, cookies of geheime waarden. Operator-read-scope is vereist.statusretourneert de Gateway-samenvatting in/status-stijl; gevoelige velden worden alleen opgenomen voor operatorclients met adminscope.gateway.identity.getretourneert de device-identiteit van de Gateway die door relay- en pairingflows wordt gebruikt.system-presenceretourneert de huidige presencesnapshot voor verbonden operator-/nodedevices.system-eventvoegt een systemevent toe en kan presencecontext bijwerken/broadcasten.last-heartbeatretourneert het laatst gepersisteerde Heartbeat-event.set-heartbeatsschakelt Heartbeat-verwerking op de Gateway om.
Modellen en gebruik
Modellen en gebruik
models.listretourneert de modelcatalogus die tijdens runtime is toegestaan. Geef{ "view": "configured" }door voor geconfigureerde modellen op picker-formaat (agents.defaults.modelseerst, daarnamodels.providers.*.models), of{ "view": "all" }voor de volledige catalogus.usage.statusretourneert provider-gebruiksvensters en samenvattingen van resterend quotum.usage.costretourneert geaggregeerde samenvattingen van kostengebruik voor een datumbereik.doctor.memory.statusretourneert gereedheid van vectorgeheugen / gecachte embeddings voor de actieve standaard-agentwerkruimte. Geef{ "probe": true }of{ "deep": true }alleen door wanneer de aanroeper expliciet een live ping naar de embeddingprovider wil.doctor.memory.remHarnessretourneert een begrensde, alleen-lezen REM-harnesspreview voor externe control-plane-clients. Deze kan werkruimtepaden, geheugenfragmenten, gerenderde grounded markdown en kandidaten voor diepe promotie bevatten, dus aanroepers hebbenoperator.readnodig.sessions.usageretourneert gebruikssamenvattingen per sessie.sessions.usage.timeseriesretourneert tijdreeksgebruik voor één sessie.sessions.usage.logsretourneert gebruikslogitems voor één sessie.
Kanalen en loginhelpers
Kanalen en loginhelpers
channels.statusretourneert ingebouwde + gebundelde kanaal-/Plugin-statussamenvattingen.channels.logoutmeldt een specifiek kanaal/account af wanneer het kanaal afmelden ondersteunt.web.login.startstart een QR-/webloginflow voor de huidige QR-geschikte webkanaalprovider.web.login.waitwacht tot die QR-/webloginflow is voltooid en start het kanaal bij succes.push.testverstuurt een test-APNs-push naar een geregistreerde iOS-node.voicewake.getretourneert de opgeslagen wake-word-triggers.voicewake.setwerkt wake-word-triggers bij en broadcast de wijziging.
Berichten en logs
Berichten en logs
sendis de directe RPC voor uitgaande aflevering voor kanaal-/account-/threadgerichte verzendingen buiten de chatrunner.logs.tailretourneert de geconfigureerde gateway-file-log-tail met cursor-/limiet- en max-byte-instellingen.
Talk en TTS
Talk en TTS
talk.configretourneert de effectieve Talk-configpayload;includeSecretsvereistoperator.talk.secrets(ofoperator.admin).talk.modestelt de huidige Talk-modusstatus in voor WebChat-/Control UI-clients en broadcast deze.talk.speaksynthetiseert spraak via de actieve Talk-spraakprovider.tts.statusretourneert de ingeschakelde TTS-status, actieve provider, fallbackproviders en providerconfigstatus.tts.providersretourneert de zichtbare inventaris van TTS-providers.tts.enableentts.disableschakelen de TTS-voorkeurstatus.tts.setProviderwerkt de voorkeurs-TTS-provider bij.tts.convertvoert een eenmalige tekst-naar-spraakconversie uit.
Secrets, config, update en wizard
Secrets, config, update en wizard
secrets.reloadlost actieve SecretRefs opnieuw op en wisselt de runtime-secretstatus alleen bij volledig succes.secrets.resolvelost commandogerichte secrettoewijzingen op voor een specifieke opdracht-/doelset.config.getretourneert de huidige config-snapshot en hash.config.setschrijft een gevalideerde configpayload.config.patchvoegt een gedeeltelijke config-update samen.config.applyvalideert en vervangt de volledige configpayload.config.schemaretourneert de live config-schemapayload die wordt gebruikt door Control UI en CLI-tooling: schema,uiHints, versie en generatiemetadata, inclusief Plugin- + kanaalschemametadata wanneer de runtime deze kan laden. Het schema bevat veldmetadata voortitle/description, afgeleid van dezelfde labels en helptekst die door de UI worden gebruikt, inclusief geneste objecten, wildcards, array-items enanyOf/oneOf/allOf-compositietakken wanneer overeenkomende velddocumentatie bestaat.config.schema.lookupretourneert een padgebonden lookuppayload voor één configpad: genormaliseerd pad, een ondiepe schemanode, overeenkomende hint +hintPath, en directe child-samenvattingen voor UI-/CLI-drilldown. Lookup-schemanodes behouden de gebruikersgerichte docs en algemene validatievelden (title,description,type,enum,const,format,pattern, numerieke/string-/array-/objectgrenzen, en vlaggen zoalsadditionalProperties,deprecated,readOnly,writeOnly). Child-samenvattingen tonenkey, genormaliseerdpath,type,required,hasChildren, plus de overeenkomendehint/hintPath.update.runvoert de gateway-updateflow uit en plant alleen een herstart wanneer de update zelf is geslaagd.update.statusretourneert de nieuwste gecachte update-herstartsentinel, inclusief de draaiende versie na herstart wanneer beschikbaar.wizard.start,wizard.next,wizard.statusenwizard.cancelontsluiten de onboardingwizard via WS RPC.
Agent- en werkruimtehelpers
Agent- en werkruimtehelpers
agents.listretourneert geconfigureerde agentitems, inclusief effectief model en runtimemetadata.agents.create,agents.updateenagents.deletebeheren agentrecords en werkruimtebedrading.agents.files.list,agents.files.getenagents.files.setbeheren de bootstrap-werkruimtebestanden die voor een agent worden ontsloten.agent.identity.getretourneert de effectieve assistant-identiteit voor een agent of sessie.agent.waitwacht tot een run is voltooid en retourneert de terminalsnapshot wanneer beschikbaar.
Sessiebeheer
Sessiebeheer
sessions.listretourneert de huidige sessie-index, inclusiefagentRuntime-metadata per rij wanneer een agentruntime-backend is geconfigureerd.sessions.subscribeensessions.unsubscribeschakelen sessiewijziging-eventabonnementen voor de huidige WS-client.sessions.messages.subscribeensessions.messages.unsubscribeschakelen transcript-/bericht-eventabonnementen voor één sessie.sessions.previewretourneert begrensde transcriptpreviews voor specifieke sessiesleutels.sessions.resolvelost een sessiedoel op of canonicaliseert het.sessions.createmaakt een nieuw sessie-item aan.sessions.sendstuurt een bericht naar een bestaande sessie.sessions.steeris de variant voor onderbreken en bijsturen van een actieve sessie.sessions.abortbreekt actief werk voor een sessie af. Een aanroeper kankeyplus optioneelrunIddoorgeven, of alleenrunIdvoor actieve runs die de Gateway naar een sessie kan herleiden.sessions.patchwerkt sessiemetadata/-overrides bij en rapporteert het opgeloste canonieke model plus effectieveagentRuntime.sessions.reset,sessions.deleteensessions.compactvoeren sessieonderhoud uit.sessions.getretourneert de volledige opgeslagen sessierij.- Chatuitvoering gebruikt nog steeds
chat.history,chat.send,chat.abortenchat.inject.chat.historyis display-genormaliseerd voor UI-clients: inline directivetags worden uit zichtbare tekst verwijderd, platte-tekst tool-call XML-payloads (inclusief<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>en afgekorte tool-call-blokken) en gelekte ASCII-/volledige-breedte modelcontroletokens worden verwijderd, pure silent-token-assistantrijen zoals exactNO_REPLY/no_replyworden weggelaten, en te grote rijen kunnen worden vervangen door placeholders.
Apparaatkoppeling en apparaattokens
Apparaatkoppeling en apparaattokens
device.pair.listretourneert wachtende en goedgekeurde gekoppelde apparaten.device.pair.approve,device.pair.rejectendevice.pair.removebeheren apparaatkoppelingsrecords.device.token.rotateroteert een gekoppeld apparaattoken binnen de goedgekeurde rol- en aanroeperscopegrenzen.device.token.revoketrekt een gekoppeld apparaattoken in binnen de goedgekeurde rol- en aanroeperscopegrenzen.
Node-koppeling, invoke en wachtend werk
Node-koppeling, invoke en wachtend werk
node.pair.request,node.pair.list,node.pair.approve,node.pair.reject,node.pair.removeennode.pair.verifydekken nodekoppeling en bootstrapverificatie.node.listennode.describeretourneren bekende/verbonden nodestatus.node.renamewerkt een gekoppeld nodelabel bij.node.invokestuurt een opdracht door naar een verbonden node.node.invoke.resultretourneert het resultaat voor een invoke-aanvraag.node.eventdraagt events afkomstig van nodes terug naar de gateway.node.canvas.capability.refreshvernieuwt canvas-capabilitytokens met scope.node.pending.pullennode.pending.ackzijn de queue-API’s voor verbonden nodes.node.pending.enqueueennode.pending.drainbeheren duurzaam wachtend werk voor offline/losgekoppelde nodes.
Goedkeuringsfamilies
Goedkeuringsfamilies
exec.approval.request,exec.approval.get,exec.approval.listenexec.approval.resolvedekken eenmalige exec-goedkeuringsaanvragen plus lookup/replay van wachtende goedkeuringen.exec.approval.waitDecisionwacht op één wachtende exec-goedkeuring en retourneert de uiteindelijke beslissing (ofnullbij timeout).exec.approvals.getenexec.approvals.setbeheren gateway-exec-goedkeuringsbeleidssnapshots.exec.approvals.node.getenexec.approvals.node.setbeheren node-lokaal exec-goedkeuringsbeleid via noderelayopdrachten.plugin.approval.request,plugin.approval.list,plugin.approval.waitDecisionenplugin.approval.resolvedekken door plugins gedefinieerde goedkeuringsflows.
Automatisering, Skills en tools
Automatisering, Skills en tools
- Automatisering:
wakeplant een directe of volgende-Heartbeat-wake-tekstinjectie;cron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runsbeheren gepland werk. - Skills en tools:
commands.list,skills.*,tools.catalog,tools.effective.
Algemene eventfamilies
chat: UI-chatupdates zoalschat.injecten andere transcript-only chat events.session.messageensession.tool: transcript-/eventstreamupdates voor een geabonneerde sessie.sessions.changed: sessie-index of metadata gewijzigd.presence: updates van systeempresence-snapshots.tick: periodiek keepalive-/liveness-event.health: update van gateway-healthsnapshot.heartbeat: update van Heartbeat-eventstream.cron: event voor wijziging van Cron-run/job.shutdown: melding van gateway-afsluiting.node.pair.requested/node.pair.resolved: levenscyclus van nodekoppeling.node.invoke.request: broadcast van node-invoke-aanvraag.device.pair.requested/device.pair.resolved: levenscyclus van gekoppeld apparaat.voicewake.changed: wake-word-triggerconfig gewijzigd.exec.approval.requested/exec.approval.resolved: levenscyclus van exec-goedkeuring.plugin.approval.requested/plugin.approval.resolved: levenscyclus van Plugin-goedkeuring.
Node-helpermethoden
- Nodes kunnen
skills.binsaanroepen om de huidige lijst met uitvoerbare skillbestanden op te halen voor auto-allow-controles.
Operator-helpermethoden
- Operators kunnen
commands.list(operator.read) aanroepen om de runtime opdrachtinventaris voor een agent op te halen.agentIdis optioneel; laat dit weg om de standaardagentworkspace te lezen.scopebepaalt op welk oppervlak de primairenameis gericht:textretourneert het primaire tekstopdrachttoken zonder de voorafgaande/nativeen het standaardpadbothretourneren provideraane native namen wanneer beschikbaar
textAliasesbevat exacte slash-aliassen zoals/modelen/m.nativeNamebevat de provideraane native opdrachtnaam wanneer die bestaat.provideris optioneel en beïnvloedt alleen native naamgeving plus de beschikbaarheid van native pluginopdrachten.includeArgs=falselaat geserialiseerde argumentmetadata weg uit het antwoord.
- Operators kunnen
tools.catalog(operator.read) aanroepen om de runtime-toolcatalogus voor een agent op te halen. Het antwoord bevat gegroepeerde tools en herkomstmetadata:source:coreofpluginpluginId: plugin-eigenaar wanneersource="plugin"optional: of een plugintool optioneel is
- Operators kunnen
tools.effective(operator.read) aanroepen om de runtime-effectieve toolinventaris voor een sessie op te halen.sessionKeyis vereist.- De Gateway leidt vertrouwde runtimecontext server-side af uit de sessie in plaats van door de aanroeper aangeleverde auth- of aflevercontext te accepteren.
- Het antwoord is sessiegebonden en weerspiegelt wat het actieve gesprek nu kan gebruiken, inclusief core-, plugin- en kanaaltools.
- Operators kunnen
skills.status(operator.read) aanroepen om de zichtbare Skills-inventaris voor een agent op te halen.agentIdis optioneel; laat dit weg om de standaardagentworkspace te lezen.- Het antwoord bevat geschiktheid, ontbrekende vereisten, configuratiecontroles en opgeschoonde installatieopties zonder ruwe geheime waarden bloot te leggen.
- Operators kunnen
skills.searchenskills.detail(operator.read) aanroepen voor ClawHub-ontdekkingsmetadata. - Operators kunnen
skills.install(operator.admin) in twee modi aanroepen:- ClawHub-modus:
{ source: "clawhub", slug, version?, force? }installeert een skillmap in de mapskills/van de standaardagentworkspace. - Gateway-installatiemodus:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }voert een gedeclareerde actiemetadata.openclaw.installuit op de Gateway-host.
- ClawHub-modus:
- Operators kunnen
skills.update(operator.admin) in twee modi aanroepen:- ClawHub-modus werkt een gevolgde slug bij of alle gevolgde ClawHub-installaties in de standaardagentworkspace.
- Configuratiemodus patcht waarden van
skills.entries.<skillKey>zoalsenabled,apiKeyenenv.
models.list-weergaven
models.list accepteert een optionele parameter view:
- Weggelaten of
"default": huidig runtimegedrag. Alsagents.defaults.modelsis geconfigureerd, is het antwoord de toegestane catalogus; anders is het antwoord de volledige Gateway-catalogus. "configured": picker-formaat gedrag. Alsagents.defaults.modelsis geconfigureerd, heeft dat nog steeds voorrang. Anders gebruikt het antwoord expliciete vermeldingen inmodels.providers.*.models, met terugval naar de volledige catalogus alleen wanneer er geen geconfigureerde modelrijen bestaan."all": volledige Gateway-catalogus, waarbijagents.defaults.modelswordt omzeild. Gebruik dit voor diagnostiek en ontdekkings-UI’s, niet voor normale modelpickers.
Uitvoergoedkeuringen
- Wanneer een uitvoerverzoek goedkeuring nodig heeft, broadcast de Gateway
exec.approval.requested. - Operatorclients lossen dit op door
exec.approval.resolveaan te roepen (vereist scopeoperator.approvals). - Voor
host=nodemoetexec.approval.requestsystemRunPlanbevatten (canoniekeargv/cwd/rawCommand/sessiemetadata). Verzoeken zondersystemRunPlanworden geweigerd. - Na goedkeuring hergebruiken doorgestuurde
node.invoke system.run-aanroepen dat canoniekesystemRunPlanals de gezaghebbende opdracht-/cwd-/sessiecontext. - Als een aanroeper
command,rawCommand,cwd,agentIdofsessionKeywijzigt tussen voorbereiding en de uiteindelijke goedgekeurde doorsturing vansystem.run, weigert de Gateway de uitvoering in plaats van de gewijzigde payload te vertrouwen.
Fallback voor agentbezorging
agent-verzoeken kunnendeliver=truebevatten om uitgaande bezorging aan te vragen.bestEffortDeliver=falsebehoudt strikt gedrag: onopgeloste of alleen-interne bezorgdoelen retournerenINVALID_REQUEST.bestEffortDeliver=truestaat fallback naar alleen-sessie-uitvoering toe wanneer er geen externe bezorgbare route kan worden opgelost (bijvoorbeeld interne/webchat-sessies of dubbelzinnige meerkanaalsconfiguraties).
Versiebeheer
PROTOCOL_VERSIONstaat insrc/gateway/protocol/schema/protocol-schemas.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
Clientconstanten
De referentieclient insrc/gateway/client.ts gebruikt deze standaarden. Waarden zijn
stabiel binnen protocol v3 en vormen de verwachte baseline voor clients van derden.
| Constante | Standaard | Bron |
|---|---|---|
PROTOCOL_VERSION | 3 | src/gateway/protocol/schema/protocol-schemas.ts |
| Verzoektime-out (per RPC) | 30_000 ms | src/gateway/client.ts (requestTimeoutMs) |
| Preauth-/connect-challenge-time-out | 15_000 ms | src/gateway/handshake-timeouts.ts (config/env kan het gekoppelde server/clientbudget verhogen) |
| Initiële reconnect-backoff | 1_000 ms | src/gateway/client.ts (backoffMs) |
| Maximale reconnect-backoff | 30_000 ms | src/gateway/client.ts (scheduleReconnect) |
| Fast-retry-limiet na sluiten wegens device-token | 250 ms | src/gateway/client.ts |
Respijt voor geforceerd stoppen vóór terminate() | 250 ms | FORCE_STOP_TERMINATE_GRACE_MS |
Standaardtime-out van stopAndWait() | 1_000 ms | STOP_AND_WAIT_TIMEOUT_MS |
Standaard tick-interval (vóór hello-ok) | 30_000 ms | src/gateway/client.ts |
| Sluiten bij tick-time-out | code 4000 wanneer stilte langer duurt dan tickIntervalMs * 2 | src/gateway/client.ts |
MAX_PAYLOAD_BYTES | 25 * 1024 * 1024 (25 MB) | src/gateway/server-constants.ts |
policy.tickIntervalMs, policy.maxPayload,
en policy.maxBufferedBytes in hello-ok; clients moeten die waarden respecteren
in plaats van de standaarden van vóór de handshake.
Auth
- Shared-secret Gateway-auth gebruikt
connect.params.auth.tokenofconnect.params.auth.password, afhankelijk van de geconfigureerde auth-modus. - Modi met identiteit zoals Tailscale Serve
(
gateway.auth.allowTailscale: true) of niet-loopbackgateway.auth.mode: "trusted-proxy"voldoen aan de connect-auth-controle via verzoekheaders in plaats vanconnect.params.auth.*. - Private-ingress
gateway.auth.mode: "none"slaat shared-secret connect-auth volledig over; stel die modus niet bloot op publieke/onvertrouwde ingress. - Na pairing geeft de Gateway een device token uit, gebonden aan de verbindingsrol
- scopes. Dit wordt geretourneerd in
hello-ok.auth.deviceTokenen moet door de client worden opgeslagen voor toekomstige connects.
- scopes. Dit wordt geretourneerd in
- Clients moeten de primaire
hello-ok.auth.deviceTokenopslaan na elke succesvolle connect. - Opnieuw verbinden met dat opgeslagen device token moet ook de opgeslagen goedgekeurde scopeset voor dat token hergebruiken. Dit behoudt lees-/probe-/statustoegang die al was verleend en voorkomt dat reconnects stilzwijgend terugvallen naar een beperktere impliciete alleen-admin-scope.
- Client-side samenstelling van connect-auth (
selectConnectAuthinsrc/gateway/client.ts):auth.passwordis orthogonaal en wordt altijd doorgestuurd wanneer ingesteld.auth.tokenwordt gevuld in prioriteitsvolgorde: eerst expliciet gedeeld token, daarna een explicietedeviceToken, daarna een opgeslagen per-device token (gekeyed opdeviceId+role).auth.bootstrapTokenwordt alleen verzonden wanneer geen van de bovenstaande eenauth.tokenopleverde. Een gedeeld token of een opgelost device token onderdrukt dit.- Automatische promotie van een opgeslagen device token bij de eenmalige
AUTH_TOKEN_MISMATCH-retry is beperkt tot vertrouwde endpoints only — loopback, ofwss://met een gepindetlsFingerprint. Publiekewss://zonder pinning komt niet in aanmerking.
- Extra vermeldingen in
hello-ok.auth.deviceTokenszijn bootstrap-handoff-tokens. Sla ze alleen op wanneer de connect bootstrap-auth gebruikte op een vertrouwd transport zoalswss://of loopback/local pairing. - Als een client een expliciete
deviceTokenof explicietescopeslevert, blijft die door de aanroeper aangevraagde scopeset gezaghebbend; gecachte scopes worden alleen hergebruikt wanneer de client het opgeslagen per-device token hergebruikt. - Device tokens kunnen worden geroteerd/ingetrokken via
device.token.rotateendevice.token.revoke(vereist scopeoperator.pairing). device.token.rotateretourneert rotatiemetadata. Het echoot het vervangende bearer token alleen voor same-device-aanroepen die al met dat device token zijn geauthenticeerd, zodat token-only clients hun vervanging kunnen opslaan voordat ze opnieuw verbinden. Shared/admin-rotaties echoën het bearer token niet.- Tokenuitgifte, rotatie en intrekking blijven beperkt tot de goedgekeurde rollenset die is vastgelegd in de pairingvermelding van dat device; tokenmutatie kan geen devicerol uitbreiden of targeten die pairinggoedkeuring nooit heeft verleend.
- Voor gekoppelde-device-tokensessies is devicebeheer self-scoped tenzij de
aanroeper ook
operator.adminheeft: niet-admin-aanroepers kunnen alleen hun eigen devicevermelding verwijderen/intrekken/roteren. device.token.rotateendevice.token.revokecontroleren ook de scopeset van het doel-operator token tegen de huidige sessiescopes van de aanroeper. Niet-admin-aanroepers kunnen geen breder operator token roteren of intrekken dan ze al bezitten.- Auth-fouten bevatten
error.details.codeplus herstelhints:error.details.canRetryWithDeviceToken(boolean)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
- Clientgedrag voor
AUTH_TOKEN_MISMATCH:- Vertrouwde clients mogen één begrensde retry proberen met een gecacht per-device token.
- Als die retry mislukt, moeten clients automatische reconnect-lussen stoppen en begeleiding voor operatoractie tonen.
Device-identiteit + pairing
- Nodes moeten een stabiele apparaatidentiteit (
device.id) bevatten die is afgeleid van een keypair-vingerafdruk. - Gateways geven tokens uit per apparaat + rol.
- Koppelingsgoedkeuringen zijn vereist voor nieuwe apparaat-ID’s, tenzij lokale automatische goedkeuring is ingeschakeld.
- Automatische goedkeuring voor koppeling is gericht op directe local loopback-verbindingen.
- OpenClaw heeft ook een smal backend/container-lokaal zelfverbindingspad voor vertrouwde helperflows met gedeeld geheim.
- Verbindingen via dezelfde host-tailnet of LAN worden voor koppeling nog steeds als extern behandeld en vereisen goedkeuring.
- WS-clients nemen normaal gesproken de
device-identiteit op tijdensconnect(operator + node). De enige operator-uitzonderingen zonder apparaat zijn expliciete vertrouwenspaden:gateway.controlUi.allowInsecureAuth=truevoor localhost-only onveilige HTTP-compatibiliteit.- succesvolle operator-Control UI-authenticatie met
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(noodmaatregel, ernstige beveiligingsverlaging).- directe-loopback
gateway-clientbackend-RPC’s geauthenticeerd met het gedeelde gateway-token/wachtwoord.
- Alle verbindingen moeten de door de server verstrekte
connect.challenge-nonce ondertekenen.
Diagnostiek voor apparaatauthenticatiemigratie
Voor verouderde clients die nog steeds pre-challenge-ondertekeningsgedrag gebruiken, retourneertconnect nu
DEVICE_AUTH_*-detailcodes onder error.details.code met een stabiele error.details.reason.
Veelvoorkomende migratiefouten:
| Bericht | details.code | details.reason | Betekenis |
|---|---|---|---|
device nonce required | DEVICE_AUTH_NONCE_REQUIRED | device-nonce-missing | Client liet device.nonce weg (of stuurde leeg). |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | Client ondertekende met een verlopen/verkeerde nonce. |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | Handtekeningpayload komt niet overeen met v2-payload. |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | Ondertekende tijdstempel valt buiten toegestane afwijking. |
device identity mismatch | DEVICE_AUTH_DEVICE_ID_MISMATCH | device-id-mismatch | device.id komt niet overeen met vingerafdruk van publieke sleutel. |
device public key invalid | DEVICE_AUTH_PUBLIC_KEY_INVALID | device-public-key | Indeling/canonicalisatie van publieke sleutel is mislukt. |
- Wacht altijd op
connect.challenge. - Onderteken de v2-payload die de server-nonce bevat.
- Stuur dezelfde nonce in
connect.params.device.nonce. - De voorkeurs-handtekeningpayload is
v3, dieplatformendeviceFamilybindt naast de velden voor apparaat/client/rol/scopes/token/nonce. - Verouderde
v2-handtekeningen blijven geaccepteerd voor compatibiliteit, maar metadata-pinning van gekoppelde apparaten blijft het opdrachtbeleid bij opnieuw verbinden bepalen.
TLS + pinning
- TLS wordt ondersteund voor WS-verbindingen.
- Clients kunnen optioneel de cert-vingerafdruk van de gateway pinnen (zie
gateway.tls- configuratie plusgateway.remote.tlsFingerprintof CLI--tls-fingerprint).
Bereik
Dit protocol stelt de volledige Gateway-API beschikbaar (status, kanalen, modellen, chat, agent, sessies, nodes, goedkeuringen, enz.). Het exacte oppervlak wordt gedefinieerd door de TypeBox-schema’s insrc/gateway/protocol/schema.ts.