Gateway
Gateway-protocol
Het Gateway-WS-protocol is het centrale besturingsvlak en Node-transport voor OpenClaw. Operator- en Node-clients (CLI, web-UI, macOS-app, iOS-/Android-nodes, headless nodes) maken verbinding via WebSocket en declareren tijdens de handshake een rol en scope.
npm-pakketten
Deze pakketten worden meegeleverd met OpenClaw-releasereeksen. Tijdens de eerste uitrol
kan npm E404 retourneren totdat de eerste release met pakketten is gepubliceerd.
@openclaw/gateway-protocolpubliceert de schema's, validators, TypeScript-typen, lichtgewicht helpers voor frames en fouten, en versieconstanten. De tarball bevat het gegenereerdeprotocol.schema.jsonmachineleesbare contract.@openclaw/gateway-clientpubliceert de referentieclient voor Node en een browserveilige ingang op@openclaw/gateway-client/browser.
Zie voor richtlijnen over de levenscyclus van toepassingen Een Gateway-client bouwen. Zie voor apps die de Gateway als onderliggend proces beheren OpenClaw insluiten.
Transport en framing
- WebSocket, tekstframes, JSON-payloads.
- Het eerste frame moet een
connect-verzoek zijn. - Frames vóór de verbinding zijn beperkt tot 64 KiB (
MAX_PREAUTH_PAYLOAD_BYTES). Volg na de handshakehello-ok.policy.maxPayloadenhello-ok.policy.maxBufferedBytes. Als diagnostiek is ingeschakeld, genereren te grote binnenkomende frames en trage uitgaande bufferspayload.large-gebeurtenissen voordat de Gateway het frame sluit of laat vallen. Deze gebeurtenissen bevattensurface, bytegroottes, limieten en een veilige redencode, maar nooit berichtteksten, inhoud van bijlagen, onbewerkte framebytes, tokens, cookies of geheimen.
Framevormen:
- Verzoek:
{type:"req", id, method, params} - Antwoord:
{type:"res", id, ok, payload|error} - Gebeurtenis:
{type:"event", event, payload, seq?, stateVersion?}
Antwoordfouten gebruiken { code, message, details?, retryable?, retryAfterMs? }.
Clients moeten vertakken op code en details.code; message blijft voor mensen leesbaar
en kan veranderen, behalve waar een compatibiliteitsopmerking anders aangeeft. Autorisatiefouten
op methodeniveau gebruiken code: "FORBIDDEN" op het hoogste niveau met gestructureerde
details over ontbrekende scopes:
- Ontbrekende scope:
{ code: "MISSING_SCOPE", missingScope, requiredScopes }.requiredScopesis de volledige bekende scopeset voor de aangevraagde bewerking. Het verouderdemissing scope: <scope>-bericht blijft behouden voor oudere clients.
Clients moeten eerst details lezen en het verouderde bericht alleen als compatibiliteits-
fallback gebruiken. readMissingScopeError en readMissingScopeErrorDetails worden geëxporteerd vanuit
@openclaw/gateway-protocol/gateway-error-details; de browserveilige Gateway-client
exporteert ze opnieuw vanuit @openclaw/gateway-client/browser.
De schema's worden geëxporteerd als GatewayErrorDetailsSchema,
MissingScopeErrorDetailsSchema vanuit @openclaw/gateway-protocol/schema.
HTTP-scopefouten weerspiegelen het MISSING_SCOPE-object onder error.details en
gebruiken HTTP-status 403.
Methoden met neveneffecten vereisen idempotentiesleutels (zie schema).
Handshake
De Gateway stuurt vóór de verbinding een challenge:
{ "type": "event", "event": "connect.challenge", "payload": { "nonce": "…", "ts": 1737264000000 }}De client antwoordt met connect:
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 4, "maxProtocol": 4, "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": "…" } }}De Gateway antwoordt met hello-ok:
{ "type": "res", "id": "…", "ok": true, "payload": { "type": "hello-ok", "protocol": 4, "server": { "version": "…", "connId": "…" }, "features": { "methods": ["…"], "events": ["…"] }, "snapshot": { "…": "…" }, "auth": { "role": "operator", "scopes": ["operator.read", "operator.write"] }, "policy": { "maxPayload": 26214400, "maxBufferedBytes": 52428800, "tickIntervalMs": 15000 } }}server, features, snapshot, policy en auth zijn allemaal vereist door
HelloOkSchema (packages/gateway-protocol/src/schema/frames.ts). auth
rapporteert de overeengekomen rol/scopes, zelfs wanneer geen apparaattoken wordt uitgegeven (vorm
hierboven). pluginSurfaceUrls is optioneel en koppelt namen van Plugin-oppervlakken (bijv.
canvas) aan gehoste URL's met scopes; deze kunnen verlopen, dus nodes roepen
node.pluginSurface.refresh aan met { "surface": "canvas" } voor een nieuwe ingang.
Het verouderde pad canvasHostUrl / canvasCapability / node.canvas.capability.refresh
wordt niet ondersteund; gebruik Plugin-oppervlakken.
De optionele appliedConfigHash van de snapshot is de opgeloste bronconfiguratierevisie
die door de actieve Gateway-runtime is geaccepteerd. Clients kunnen deze vergelijken met
config.get.configRevisionHash om te bepalen of voor een nieuwere opgeslagen configuratie nog steeds
een herstart nodig is. config.get.hash blijft de onbewerkte revisie van het hoofdbestand die wordt gebruikt door
conflictbeveiligingen bij het schrijven van configuraties.
Terwijl de Gateway de opstart-sidecars nog voltooit, kan connect een
opnieuw te proberen UNAVAILABLE-fout retourneren met details.reason: "startup-sidecars" en
retryAfterMs. Probeer het binnen het verbindingsbudget opnieuw in plaats van dit als
een definitieve handshakefout te behandelen.
Wanneer een apparaattoken wordt uitgegeven, voegt hello-ok.auth dit toe:
{ "auth": { "deviceToken": "…", "role": "operator", "scopes": ["operator.read", "operator.write"] }}De ingebouwde bootstrap via QR-/installatiecode is een overdrachtspad voor mobiele apparaten. Een geslaagde basisverbinding met een installatiecode retourneert een primair Node-token plus één begrensd operatortoken:
{ "auth": { "deviceToken": "…", "role": "node", "scopes": [], "deviceTokens": [ { "deviceToken": "…", "role": "operator", "scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"] } ] }}Deze operatoroverdracht is bewust begrensd: voldoende om de mobiele
operatorlus en systeemeigen installatie te starten, inclusief operator.talk.secrets voor het lezen van de Talk-
configuratie, maar zonder scopes voor koppelingsmutaties en zonder operator.admin. Ruimere
toegang voor koppeling/beheer vereist een afzonderlijk goedgekeurd koppelings- of tokenproces. Sla
hello-ok.auth.deviceTokens alleen permanent op wanneer de bootstrapauthenticatie via een vertrouwd
transport is uitgevoerd (wss:// of loopback/lokale koppeling).
Vertrouwde backendclients binnen hetzelfde proces (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 voorbehouden
aan interne RPC's van het besturingsvlak (bijv. sessie-updates van subagents) en voorkomt dat
verouderde basisinstellingen voor CLI-/apparaatkoppeling lokaal backendwerk blokkeren. Externe
clients, clients met browseroorsprong, nodes en expliciete clients met apparaattokens/apparaatidentiteit doorlopen nog steeds
de normale controles voor koppeling en scope-upgrades.
Workerrol en gesloten protocol
Cloudworkers gebruiken een speciale loopback-ingang via de door de Gateway beheerde,
met een hostsleutel vastgezette SSH-tunnel. Deze accepteert alleen een workeridentiteit en stuurt nooit
algemene authenticatie, Node-gebeurtenissen, operator-RPC's of Plugin-methoden door. Een strikte connect
verifieert een gehashte, permanent opgeslagen, kortstondige credential die is gebonden aan de omgeving, de bundle-
hash, de ownerepoch, de RPC-setversie, de vervaldatum en één nullable sessie; afzonderlijk worden
de huidige versie en functieset gecontroleerd. Bij succes wordt een minimale
worker-hello-ok geretourneerd; functieonderhandeling staat los van de algemene protocolversie.
Frames blijven kleiner dan 64 KiB, behalve dat een overeengekomen worker.inference.start-
frame maximaal 25 MiB mag zijn. De gesloten allowlist bevat worker.heartbeat,
worker.transcript.commit, worker.live-event, worker.inference.start en
worker.inference.cancel.
Transcriptcommits gebruiken fencing op basis van de ownerepoch, een door de Gateway beheerde sessiekoppeling, compare-and-swap van het basisblad en duurzame herhaling van sequenties; de Gateway genereert transcriptitem- en bovenliggende ID's via de normale sessieschrijver. Eigendom en verval worden bij elke RPC opnieuw gecontroleerd.
Clientmogelijkheden
Operatorclients kunnen optionele mogelijkheden adverteren in connect.params.caps:
tool-events: accepteert gestructureerde gebeurtenissen uit de levenscyclus van tools.inline-widgets: kan gehoste inline widgetresultaten van tools weergeven.
Clientmogelijkheden beschrijven de verbonden client, niet de autorisatie. Agenttools kunnen vereiste mogelijkheden declareren; de Gateway laat die tools weg tenzij elke vereiste voorkomt in caps van de oorspronkelijke client. Runs die vanuit een kanaal afkomstig zijn, hebben geen Gateway-clientmogelijkheden, waardoor tools waarvoor mogelijkheden vereist zijn niet beschikbaar zijn, zelfs wanneer het toolbeleid ze expliciet toestaat.
Voorbeeld van een Node-verbinding
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 4, "maxProtocol": 4, "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": "…" } }}Nodes declareren claims voor mogelijkheden wanneer ze verbinding maken:
caps: categorieën op hoog niveau, zoalscamera,canvas,screen,location,voice,talk.commands: allowlist met opdrachten voor aanroepen.permissions: fijnmazige schakelaars (bijv.screen.record,camera.capture).
De Gateway behandelt deze als claims en dwingt allowlists aan de serverzijde af.
Rollen en scopes
Zie Operatorscopes voor het volledige model voor operatorscopes, controles tijdens goedkeuring en de semantiek van gedeelde geheimen.
Rollen:
operator: client van het besturingsvlak (CLI/UI/automatisering).node: host voor mogelijkheden (camera/scherm/canvas/system.run).worker: cloudhost voor uitvoering via het speciale, gesloten workerprotocol.
Operatorscopes (src/gateway/operator-scopes.ts), de volledige gesloten set:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config met includeSecrets: true vereist operator.talk.secrets (of
operator.admin). Wanneer geheimen zijn opgenomen, lees je de credential van de actieve Talk-provider
uit talk.resolved.config.apiKey; talk.providers.<id>.apiKey
behoudt de bronvorm en kan een SecretRef-object of een geredigeerde tekenreeks zijn.
Door Plugins geregistreerde Gateway-RPC-methoden kunnen hun eigen operatorscope vereisen,
maar deze gereserveerde kernprefixen worden altijd omgezet naar operator.admin
(src/shared/gateway-method-policy.ts): config.*, exec.approvals.*,
wizard.*, update.*.
De methodescope is slechts de eerste controle. Sommige slash-opdrachten die via
chat.send worden bereikt, passen strengere controles op opdrachtniveau toe: permanente schrijfbewerkingen naar /config set en
/config unset vereisen operator.admin, zelfs voor Gateway-clients die
al een lagere operatorscope hebben.
node.pair.approve heeft naast de basismethodescope
(operator.pairing) een extra scopecontrole tijdens de goedkeuring, gebaseerd op de gedeclareerde
commands (src/infra/node-pairing-authz.ts) van het openstaande verzoek:
| Gedeclareerde opdrachten | Vereiste scopes |
|---|---|
| geen | operator.pairing |
| gewone opdrachten | operator.pairing + operator.write |
bevat system.run, system.run.prepare, system.which, browser.proxy, fs.listDir of system.execApprovals.get/set |
operator.pairing + operator.admin |
Capaciteiten/opdrachten/machtigingen (node)
Nodes declareren claims over capaciteiten wanneer ze verbinding maken:
caps: categorieën van capaciteiten op hoog niveau, zoalscamera,canvas,screen,location,voiceentalk.commands: lijst met toegestane opdrachten voor aanroepen.permissions: gedetailleerde schakelaars (bijv.screen.record,camera.capture).
De Gateway behandelt deze als claims en dwingt aan de serverzijde lijsten met toegestane waarden af.
Verbonden nodes kunnen na een geslaagde verbinding of
herverbinding optionele, voor agents zichtbare Plugin- of MCP-tooldescriptors publiceren met node.pluginTools.update. Headless nodehosts worden opnieuw gestart om wijzigingen
in de declaratieve MCP-inventaris toe te passen. Deze updatemethode is het enige publicatiepad; descriptors van Plugin-tools worden niet geaccepteerd in
de parameters van connect. Elke descriptor moet een providerveilige tool-name gebruiken en
een command opgeven uit de huidige lijst met toegestane opdrachten van de node. De Gateway vertrouwt de metagegevens van descriptors
van de gekoppelde node, filtert descriptors buiten het goedgekeurde opdrachtoppervlak,
verwijdert ze wanneer de verbinding met de node wordt verbroken en weigert pogingen van operators
om de catalogus van een andere node te wijzigen. Stel gateway.nodes.pluginTools.enabled: false
in om door nodes gepubliceerde descriptors te negeren.
Verbonden nodehosts publiceren hun volledige vervangingscatalogus voor Skills met
node.skills.update. Deze methode voor de noderol is het enige publicatiepad voor Skills
van nodes; Skills worden niet geaccepteerd in de parameters van connect. Elke descriptor bevat een
veilige naam, beschrijving en begrensde SKILL.md-inhoud. De Gateway parseert die
inhoud met de normale Skills-loader, neemt deze op in snapshots van Skills voor agents
zolang de node verbonden is en verwijdert deze wanneer de verbinding wordt verbroken. Stel
gateway.nodes.allowSkills: false in om door nodes gepubliceerde Skills te negeren.
Aanwezigheid
system-presenceretourneert vermeldingen met de apparaatidentiteit als sleutel, waaronderdeviceId,rolesenscopes, zodat UI's één rij per apparaat kunnen tonen, zelfs wanneer het zowel als operator als node verbinding maakt.node.listbevat optioneellastSeenAtMsenlastSeenReason. Verbonden nodes rapporteren de huidige verbindingstijd met redenconnect; gekoppelde nodes kunnen ook duurzame achtergrondaanwezigheid rapporteren via een vertrouwde nodegebeurtenis.
Native macOS-nodes kunnen ook geverifieerde node.presence.activity-gebeurtenissen verzenden
met een begrensde inactieve invoertijd. De Gateway leidt activiteitstijdstempels af met zijn
eigen klok, maakt de meest recent actieve verbonden Mac beschikbaar via node.list en
node.describe en zendt node.presence-updates uit naar clients met leesscope.
De app verzendt { "action": "clear" } wanneer de gebruiker het delen van activiteit uitschakelt;
de Gateway wist tijdstempels alleen voor precies die geverifieerde nodeverbinding.
Gateways van vóór deze bevestigde actie retourneren deze als niet-afgehandeld, waarna de Mac-
node eenmaal opnieuw verbinding maakt en de opschoning bij het verbreken van de verbinding de oude verbindingsstatus laat verwijderen.
Zie Aanwezigheid van actieve computer voor selectie, privacy, modelcontext
en gedrag voor het routeren van meldingen.
Gebeurtenis dat een node op de achtergrond actief was
Nodes roepen node.event aan met event: "node.presence.alive" om vast te leggen dat een
gekoppelde node tijdens een achtergrondactivatie actief was, zonder deze als verbonden te markeren:
{ "event": "node.presence.alive", "payloadJSON": "{\"trigger\":\"silent_push\",\"sentAtMs\":1737264000000,\"displayName\":\"Peter's iPhone\",\"version\":\"2026.4.28\",\"platform\":\"iOS 18.4.0\",\"deviceFamily\":\"iPhone\",\"modelIdentifier\":\"iPhone17,1\",\"pushTransport\":\"relay\"}"}trigger is een gesloten enumeratie: background, silent_push, bg_app_refresh,
significant_location, manual, connect. Onbekende waarden worden genormaliseerd naar
background (src/shared/node-presence.ts). De gebeurtenis wordt alleen opgeslagen voor
geverifieerde apparaatsessies van nodes; sessies zonder apparaat of niet-gekoppelde sessies retourneren
handled: false.
Geslaagde Gateways retourneren een gestructureerd resultaat:
{ "ok": true, "event": "node.presence.alive", "handled": true, "reason": "persisted"}Oudere Gateways retourneren mogelijk alleen { "ok": true } voor node.event; behandel dit
als een bevestigde RPC, niet als duurzame opslag van aanwezigheid.
Scoping van broadcastgebeurtenissen
Door de server gepushte broadcastgebeurtenissen worden op basis van scope afgeschermd, zodat sessies
met alleen een koppelingsscope of alleen een noderol niet passief sessie-inhoud ontvangen
(src/gateway/server-broadcast.ts):
- Frames voor chats, agents en toolresultaten (gestreamde
agent-gebeurtenissen, toolresultaatgebeurtenissen) vereisen ten minsteoperator.read. Sessies zonder deze scope slaan deze frames volledig over. - Door Plugins gedefinieerde
plugin.*-broadcasts worden standaard beperkt totoperator.writeofoperator.admin; expliciete vermeldingen zoalsplugin.approval.requested/plugin.approval.resolvedgebruiken in plaats daarvanoperator.approvals. - Status-/transportgebeurtenissen (
heartbeat,presence,tick, de levenscyclus van verbinden/verbreken) blijven onbeperkt, zodat de transportstatus voor elke geverifieerde sessie waarneembaar is. - Onbekende families van broadcastgebeurtenissen worden standaard op basis van scope afgeschermd (fail-closed), tenzij een geregistreerde handler deze beperking expliciet versoepelt.
Elke clientverbinding behoudt een eigen volgnummer per client, zodat broadcasts op die socket monotoon geordend blijven, zelfs wanneer verschillende clients verschillende, op scope gefilterde subsets van de gebeurtenisstroom zien.
Families van RPC-methoden
hello-ok.features.methods is een conservatieve ontdekkingslijst die is opgebouwd uit
src/gateway/server-methods-list.ts plus geëxporteerde methoden van geladen Plugins/kanalen
— het is geen gegenereerde dump van elke methode, en sommige methoden (bijvoorbeeld
push.test, web.login.start, web.login.wait, sessions.usage)
zijn bewust uitgesloten van ontdekking, hoewel het echte, aanroepbare
methoden zijn. Behandel dit als functieontdekking, niet als een volledige opsomming van
src/gateway/server-methods/*.ts.
Systeem en identiteit
healthretourneert de gecachte of onlangs gepeilde momentopname van de Gateway-status.diagnostics.stabilityretourneert de recente, begrensde recorder voor diagnostische stabiliteit: gebeurtenisnamen, aantallen, bytegroottes, geheugenmetingen, wachtrij-/sessiestatus, kanaal-/Pluginnamen, sessie-id's. Geen chattekst, Webhook-bodies, tooluitvoer, onbewerkte request-/response-bodies, tokens, cookies of geheimen. Vereistoperator.read.statusretourneert het Gateway-overzicht in/status-stijl; gevoelige velden alleen voor operatorclients met beheerdersscope.gateway.identity.getretourneert de apparaatidentiteit van de Gateway die wordt gebruikt door relay- en koppelingsflows.system-presenceretourneert de huidige momentopname van aanwezigheid voor verbonden operator-/nodeapparaten.system-eventvoegt een systeemgebeurtenis toe en kan aanwezigheidscontext bijwerken/uitzenden.last-heartbeatretourneert de laatst opgeslagen Heartbeat-gebeurtenis.set-heartbeatsschakelt Heartbeat-verwerking op de Gateway in of uit.gateway.suspend.preparemaakt alleen een korte lease voor coöperatieve opschorting wanneer bijgehouden Gateway-werk inactief is.gateway.suspend.statuscontroleert die lease engateway.suspend.resumegeeft deze vrij na hervatting of een afgebroken hostbewerking.
Modellen en gebruik
models.listretourneert de tijdens runtime toegestane modelcatalogus. Zie de onderstaande weergaven voor "models.list".usage.statusretourneert gebruiksvensters/overzichten van resterende quota van providers.usage.costretourneert geaggregeerde overzichten van kostengebruik voor een datumbereik. GeefagentIddoor voor één agent, ofagentScope: "all"om geconfigureerde agents te aggregeren.doctor.memory.statusretourneert de gereedheidsstatus van vectorgeheugen/gecachete embeddings voor de actieve standaardwerkruimte van de agent. Geef{ "probe": true }of{ "deep": true }alleen door voor een expliciete live-ping naar een embeddingprovider. Geef{ "agentId": "agent-id" }door om statistieken van de Dreaming-opslag te beperken tot één agentwerkruimte; bij weglaten worden geconfigureerde Dreaming-werkruimten geaggregeerd.doctor.memory.dreamDiary,doctor.memory.backfillDreamDiary,doctor.memory.resetDreamDiary,doctor.memory.resetGroundedShortTerm,doctor.memory.repairDreamingArtifactsendoctor.memory.dedupeDreamDiaryaccepteren optioneel{ "agentId": "agent-id" }; bij weglaten werken ze op de geconfigureerde standaardwerkruimte van de agent.doctor.memory.remHarnessretourneert een begrensde, alleen-lezen preview van de REM-harnas voor externe control-plane-clients, inclusief werkruimtepaden, geheugenfragmenten, gerenderde onderbouwde Markdown en kandidaten voor diepgaande promotie. Vereistoperator.read.sessions.usageretourneert gebruiksoverzichten per sessie. GeefagentIddoor voor één agent, ofagentScope: "all"om geconfigureerde agents samen weer te geven. Beide gebruiksmethoden accepterenmode: "specific"met een IANA-timeZonevoor kalenderdaggrenzen en buckets die rekening houden met zomertijd.utcOffsetblijft ondersteund voor oudere clients en als terugval wanneer de Gateway-runtime de aangevraagde zone niet herkent.sessions.usage.timeseriesretourneert tijdreeksgebruik voor één sessie.sessions.usage.logsretourneert gebruikslogvermeldingen voor één sessie.
Kanalen en aanmeldhelpers
channels.statusretourneert ingebouwde + gebundelde statusoverzichten van kanalen/Plugins.channels.logoutmeldt een specifiek kanaal/account af wanneer het kanaal dit ondersteunt.web.login.startstart een QR-/webaanmeldflow voor de huidige webkanaalprovider met QR-ondersteuning.web.login.waitwacht totdat die flow is voltooid en start bij succes het kanaal.push.testverzendt een test-APNs-push naar een geregistreerde iOS-node.voicewake.getretourneert de opgeslagen activeringswoordtriggers.voicewake.setwerkt activeringswoordtriggers bij en zendt de wijziging uit.
Pluginbeheer
plugins.list(operator.read) retourneert de inventaris van geïnstalleerde plugins, plus lokaal samengestelde officiële aanbevelingen, diagnostische gegevens en of de huidige installatiemodus wijzigingen toestaat.plugins.search(operator.read) zoekt naar installeerbare families van ClawHub-codeplugins en -bundelplugins. Geef een niet-legequeryen een optionelelimitvan 1 tot 100 door.plugins.install(operator.admin) installeert een officiële catalogusvermelding met{ source: "official", pluginId }of een ClawHub-pakket met{ source: "clawhub", packageName, version?, acknowledgeClawHubRisk? }. Bij ClawHub-installaties blijven de Gateway-controles voor vertrouwen, integriteit en installatiebeleid behouden. Na een geslaagde installatie moet de Gateway opnieuw worden gestart.plugins.setEnabled(operator.admin) wijzigt met{ pluginId, enabled }het inschakelbeleid van één geïnstalleerde plugin. Het antwoord bevat de bijgewerkte catalogusvermelding, metadata voor het opnieuw starten en eventuele waarschuwingen over de sleufselectie.plugins.uninstall(operator.admin) verwijdert met{ pluginId }één extern geïnstalleerde plugin: configuratieverwijzingen, de installatierecord en beheerde bestanden. Gebundelde plugins kunnen niet worden verwijderd, maar alleen worden uitgeschakeld. Het antwoord vermeldt de verwijderingsacties en vereist altijd dat de Gateway opnieuw wordt gestart.
Berichten en logboeken
sendis de RPC voor rechtstreekse uitgaande aflevering voor verzendingen buiten de chatrunner die op een kanaal, account en thread zijn gericht.logs.tailretourneert het geconfigureerde uiteinde van het Gateway-bestandslogboek, met besturingselementen voor cursor/limiet en het maximale aantal bytes.
Operatorterminal
terminal.openstart een host-PTY voor een explicieteagentIdof de standaardagent en retourneert de bepaalde agent, werkmap, shell en isolatiestatus.terminal.input,terminal.resizeenterminal.closewerken alleen op sessies die eigendom zijn van de aanroepende verbinding.terminal.uploadaccepteert één base64-bestand van maximaal 16 MiB, plaatst dit in een persoonlijke tijdelijke map met een levensduur van 24 uur op de Gateway van de sessie of de host van de gekoppelde Node, en retourneert het absolute pad. De aanroeper moet dat pad nog steeds plakken of anderszins gebruiken; de RPC schrijft nooit terminalinvoer en voert geen opdracht uit.terminal.data- enterminal.exit-gebeurtenissen worden alleen gestreamd naar de verbinding die eigenaar is van de sessie.- Sessies waarvan de verbinding wordt verbroken, worden losgekoppeld en niet beëindigd: ze kunnen gedurende
gateway.terminal.detachedSessionTimeoutSecondsopnieuw worden gekoppeld (standaard 300;0herstelt beëindiging bij verbreking van de verbinding), terwijl recente uitvoer zich ophoopt in een begrensde buffer aan de serverzijde. terminal.listretourneert koppelbare sessies;terminal.attachkoppelt een actieve of losgekoppelde sessie opnieuw aan de aanroepende verbinding en retourneert de herhalingsbuffer (overname in tmux-stijl — een vorige actieve eigenaar ontvangtterminal.exitmet redendetached);terminal.textleest de buffer als platte tekst zonder de sessie te koppelen.- Elke terminalmethode vereist
operator.admin;gateway.terminal.enabledmoet expliciet waar zijn. Volledig gesandboxte agents worden geweigerd en een wijziging van het agentbeleid sluit bestaande en lopende PTY's, inclusief losgekoppelde PTY's.
Spraak en TTS
talk.catalogretourneert de alleen-lezen catalogus met Talk-providers voor spraak, streamingtranscriptie en realtime spraak: canonieke provider-id's, registeraliassen, labels, configuratiestatus, een optioneelready-resultaat op groepsniveau, beschikbare model-/spraak-id's, canonieke modi, transporten, denkstrategieën en vlaggen voor realtime audio/mogelijkheden, zonder providergeheimen te retourneren of de globale configuratie te wijzigen. Huidige Gateways stellenreadyin nadat de runtimeproviderselectie is toegepast; beschouw het ontbreken ervan als niet-geverifieerd op oudere Gateways.talk.configretourneert de effectieve payload van de Talk-configuratie;includeSecretsvereistoperator.talk.secrets(ofoperator.admin).talk.session.createmaakt een Talk-sessie in beheer van de Gateway voorrealtime/gateway-relay,transcription/gateway-relayofstt-tts/managed-room. Voorstt-tts/managed-roommoetenoperator.write-aanroepers diesessionKeydoorgeven, ookspawnedBydoorgeven voor zichtbaarheid van de sessiesleutel binnen het bereik; het maken vansessionKeyzonder bereik enbrain: "direct-tools"vereisenoperator.admin.talk.session.joinvalideert een sessietoken voor een beheerde ruimte, verzendt indien nodigsession.readyofsession.replaced, en retourneert metadata over de ruimte en sessie plus recente Talk-gebeurtenissen, maar nooit het token in platte tekst of de hash ervan.talk.session.appendAudiovoegt base64-PCM-invoeraudio toe aan realtime relay- en transcriptiesessies in beheer van de Gateway.talk.session.startTurn,talk.session.endTurnentalk.session.cancelTurnsturen de levenscyclus van beurten in beheerde ruimten aan, waarbij verouderde beurten worden geweigerd voordat de status wordt gewist.talk.session.cancelOutputstopt de audio-uitvoer van de assistent, voornamelijk voor door VAD aangestuurde onderbrekingen in Gateway-relaysessies.talk.session.submitToolResultvoltooit een provider-toolaanroep die door een realtime relaysessie in beheer van de Gateway is verzonden. De aanvraag wacht op elk asynchroon voltooiingssignaal dat door de providerbridge beschikbaar wordt gesteld; mislukte inzendingen houden de gekoppelde uitvoering actief en verzenden geen gebeurtenis voor een geslaagd toolresultaat. Geefoptions: { willContinue: true }door voor tussentijdse tooluitvoer ofoptions: { suppressResponse: true }wanneer de providerbridge ondersteuning voor onderdrukking aangeeft en het resultaat geen nieuw antwoord mag starten.talk.session.steerstuurt spraakbesturing voor een actieve uitvoering naar een door een agent ondersteunde Talk-sessie in beheer van de Gateway:{ sessionId, text, mode? }, waarbijmodegelijk is aanstatus,steer,canceloffollowup; als de modus wordt weggelaten, wordt deze geclassificeerd op basis van de gesproken tekst.talk.session.closesluit een relay-, transcriptie- of beheerde-ruimtesessie in beheer van de Gateway en verzendt afsluitende Talk-gebeurtenissen.talk.modestelt de huidige status van de Talk-modus in en zendt deze uit voor WebChat-/Control UI-clients.talk.client.createmaakt of hervat een realtime providersessie in beheer van de client metwebrtcofprovider-websocket, terwijl de Gateway de referenties, instructies, het toolbeleid en de geretourneerdevoiceSessionIdbeheert. Clients gevensessionKeydoor en hergebruikenvoiceSessionIdwanneer ze tijdens één aanroep het providertransport vervangen.talk.client.transcriptvoegt één afgerond{ role, text }-item toe aan de normale agentsessie. De vereisteentryIdis idempotent binnenvoiceSessionId; nieuwe pogingen dupliceren geen transcriptberichten.talk.client.closesluit de logische spraaksessie nadat openstaande transcriptschrijfbewerkingen zijn voltooid. Sluiten is idempotent en kan een alleen-wijzigingssamenvatting van de aanroep afleveren bij het laatste niet-WebChat-kanaal van de sessie.talk.client.toolCalllaat realtime transporten in beheer van de client provider-toolaanroepen doorsturen naar het Gateway-beleid. De eerste ondersteunde tool isopenclaw_agent_consult; clients ontvangen een uitvoerings-id en wachten op normale gebeurtenissen in de chatlevenscyclus voordat ze het providerspecifieke toolresultaat indienen. Spraakgebonden acties met grote impact retournerenVOICE_CONFIRMATION_REQUIRED:<id>totdat een latere afgeronde gebruikersuiting die exacte actie expliciet bevestigt en de volgende raadpleging deconfirmationIdaanlevert.talk.client.steerstuurt spraakbesturing voor een actieve uitvoering voor realtime transporten in beheer van de client. De Gateway bepaalt de actieve ingesloten uitvoering op basis vansessionKeyen retourneert een gestructureerd geaccepteerd/geweigerd resultaat in plaats van bijsturing stilzwijgend te negeren.talk.eventis het enige Talk-gebeurteniskanaal voor realtime, transcriptie, STT/TTS, beheerde ruimten, telefonie en vergaderadapters.talk.speaksynthetiseert spraak via de actieve Talk-spraakprovider.tts.statusretourneert de ingeschakelde status van TTS, de actieve provider, fallbackproviders en de configuratiestatus van providers.tts.providersretourneert de zichtbare inventaris van TTS-providers.tts.enableentts.disableschakelen de status van TTS-voorkeuren om.tts.setProviderwerkt de voorkeursprovider voor TTS bij.tts.convertvoert een eenmalige conversie van tekst naar spraak uit.tts.speak(operator.write) zet een niet-legetextom met de geconfigureerde algemene TTS-providerketen en retourneert één volledige clip inline alsaudioBase64, plusprovideren optionele metadata vooroutputFormat,mimeTypeenfileExtension. In tegenstelling tottts.convertretourneert deze geen lokaal Gateway-pad; in tegenstelling tottalk.speakvereist deze geen Talk-provider. Tekst langer dantts.maxTextLengthretourneertINVALID_REQUEST; synthesefouten retournerenUNAVAILABLE.
Secrets, configuratie, updates en wizard
secrets.reloadlost actieve SecretRefs opnieuw op en publiceert atomair runtime-status die rekening houdt met de eigenaar. In aanmerking komende fouten van eigenaren kunnen metwarningCountworden gepubliceerd als koude of verouderde degradatie; strikte of niet-toegewezen fouten wijzen het opnieuw laden af en behouden de actieve momentopname.secrets.resolvelost geheime toewijzingen voor opdrachtdoelen op voor een specifieke set opdrachten/doelen.config.getretourneert de huidige configuratiemomentopname op schijf, het onbewerktehashvan het hoofdbestand, de opgelosteconfigRevisionHashen de optioneleappliedConfigHashvoor de opgeloste revisie die door de actieve Gateway-runtime is geaccepteerd.config.setschrijft een gevalideerde configuratiepayload.config.patchvoegt een gedeeltelijke configuratie-update samen. Voor destructieve vervanging van arrays is het betreffende pad vereist inreplacePaths; geneste arrays onder array-items gebruiken[]-paden zoalsagents.entries.*.skills.config.applyvalideert en vervangt de volledige configuratiepayload.config.schemaretourneert de live payload van het configuratieschema die wordt gebruikt door de Control UI en CLI-hulpmiddelen: schema,uiHints, versie, generatiemetadata en, indien laadbaar, schema-metadata van plugins en kanalen. Deze bevattitle- /description-metadata uit dezelfde labels/helptekst als de UI, inclusief vertakkingen voor geneste objecten, jokertekens, array-items enanyOf/oneOf/allOf-composities wanneer bijpassende velddocumentatie bestaat.config.schema.lookupretourneert een tot één configuratiepad beperkte opzoekpayload: genormaliseerd pad, een oppervlakkig schemaknooppunt, overeenkomende hint plushintPath, optionelereloadKinden samenvattingen van directe onderliggende items voor detailnavigatie in de UI/CLI.reloadKindis een vanrestart,hotofnone(src/config/schema.ts) en weerspiegelt de planner voor het opnieuw laden van de Gateway-configuratie voor het aangevraagde pad. Schemakooppunten voor opzoekacties behouden de gebruikersgerichte documentatie en algemene validatievelden (title,description,type,enum,const,format,pattern, grenzen voor getallen/tekenreeksen/arrays/objecten,additionalProperties,deprecated,readOnly,writeOnly). Samenvattingen van onderliggende items tonenkey, het genormaliseerdepath,type,required,hasChildren, de optionelereloadKind, plus de overeenkomendehint/hintPath.update.runvoert de Gateway-updateflow uit en plant alleen een herstart als de update is geslaagd; aanroepers met een sessie kunnencontinuationMessageopnemen, zodat bij het opstarten één vervolgstap van de agent wordt hervat via de wachtrij voor voortzetting na een herstart. Updates via pakketbeheerders en begeleide updates van git-checkouts vanuit het besturingsvlak gebruiken een losgekoppelde overdracht aan een beheerde service in plaats van de pakketstructuur te vervangen of checkout-/build-uitvoer binnen de actieve Gateway te wijzigen. Een gestarte overdracht retourneertok: truemetresult.reason: "managed-service-handoff-started"enhandoff.status: "started". Een tweede gelijktijdigeupdate.rundie door hetzelfde Gateway-proces wordt afgehandeld, retourneertok: falsemetresult.reason: "managed-service-handoff-already-running"enhandoff.status: "already-running"; de voortzetting ervan wordt niet geaccepteerd, zodat de aanroeper het opnieuw kan proberen nadat de actieve update is voltooid. Zelfstandige CLI-updaters en vervangende Gateway-processen vallen buiten deze proceslokale beveiliging. Niet-beschikbare of mislukte overdrachten retournerenok: falsemetmanaged-service-handoff-unavailableofmanaged-service-handoff-failed, plushandoff.commandwanneer een handmatige shell-update vereist is. Niet-beschikbaar betekent dat OpenClaw geen veilige supervisorgrens of duurzame service-identiteit heeft, zoalsOPENCLAW_SYSTEMD_UNITvoor systemd. Tijdens een gestarte overdracht kan de herstartmarkering kortstats.reason: "restart-health-pending"melden; de voortzetting wordt uitgesteld totdat de CLI de opnieuw gestarte Gateway verifieert en de definitieveok-markering schrijft.update.statusvernieuwt en retourneert de nieuwste markering voor een updateherstart, inclusief de actieve versie na de herstart wanneer die beschikbaar is.wizard.start,wizard.next,wizard.statusenwizard.cancelontsluiten de onboardingwizard via WS-RPC.
Helpers voor agents en werkruimten
agents.listretourneert agent-items die zichtbaar zijn voor de Gateway, inclusief effectieve model-/runtime-metadata en optionele semantischekind(agentofsystem). Clients kondigen de handshake-mogelijkheidagent-kindaan om het volledige getypeerde overzicht te ontvangen; clients zonder deze mogelijkheid behouden het verouderde, voor selectors veilige overzicht zonder systeemrijen. Clients die rekening houden met het type sluitensystem-rijen uit van gewone selectors, maar behouden ze in diagnostische weergaven. Oudere v4-Gateways kunnen rijen zonderkindretourneren.agents.create,agents.updateenagents.deletebeheren agentrecords en de koppeling met werkruimten.agents.files.list,agents.files.getenagents.files.setbeheren de bootstrapbestanden van de werkruimte die voor een agent beschikbaar worden gesteld.audit.activity.listretourneert het geversioneerde activiteitenregister met alleen metadata;audit.listblijft de compatibiliteitsveilige RPC voor uitvoeringen/hulpmiddelen.agents.workspace.listenagents.workspace.get(operator.read) bieden alleen-lezen, gepagineerd bladeren door de werkruimtemap van een agent voor clients in het vertrouwde operatordomein dat wordt beschreven in Operatorbereiken. Aanvragen accepteren alleen paden relatief aan de werkruimte; leesbewerkingen blijven beperkt tot de via realpath bepaalde hoofdmap van de werkruimte (ontsnappingen via symbolische en harde koppelingen worden geweigerd), hebben een maximale grootte en zijn beperkt tot UTF-8-tekst plus gangbare afbeeldingstypen (base64). Antwoorden maken het hostpad van de werkruimte niet bekend. Deze naamruimte bevat geen schrijfbewerkingen.tasks.list,tasks.getentasks.cancelstellen het Gateway-takenregister beschikbaar aan SDK- en operatorclients. Zie hieronder RPC's voor het takenregister.artifacts.list,artifacts.getenartifacts.downloadbieden uit transcripties afgeleide artefactsamenvattingen en downloads voor een explicietsessionKey-,runId- oftaskId-bereik. Query's voor uitvoeringen en taken bepalen de bijbehorende sessie aan de serverzijde en retourneren alleen transcriptiemedia met overeenkomende herkomst; onveilige of lokale URL-bronnen retourneren niet-ondersteunde downloads in plaats van ze aan de serverzijde op te halen.environments.listenenvironments.statusbehouden de detectie van Gateway-lokale en Node-omgevingen. Geconfigureerde cloudworkers en duurzame records die door eerdere profielen zijn achtergelaten, voegenworker-metadata toe metproviderId, optioneleleaseId,state,ageMs, optioneleidleMsenattachedSessionIds. De levenscyclusstatussen van workers zijnrequested,provisioning,bootstrapping,ready,attached,idle,draining,destroying,destroyed,failedenorphaned.environments.create({ profileId, idempotencyKey }) richt een worker in vanuit een geconfigureerd providerprofiel van een Plugin; nieuwe pogingen met dezelfde sleutel hergebruiken de duurzame bewerking.environments.destroy({ environmentId }) vraagt om idempotente ontmanteling van een duurzame workeromgeving. Beide vereisenoperator.admin, zijn schrijfbewerkingen van het besturingsvlak en retourneren dezelfde vorm van de omgevingssamenvatting die door statusantwoorden wordt gebruikt.agent.identity.getretourneert de effectieve assistentidentiteit voor een agent of sessie.agent.waitwacht tot een uitvoering is voltooid en retourneert de eindmomentopname wanneer die beschikbaar is.
Sessiebeheer
sessions.listretourneert de huidige sessie-index, inclusiefagentRuntime-metadata per rij wanneer een backend voor de agentruntime is geconfigureerd. Wanneer plaatsing op cloudworkers is ingeschakeld of duurzame herstelstatus bestaat, bevatten sessierijen ook een afgeslotenplacement-status (local,requested,provisioning,syncing,starting,active,draining,reconciling,reclaimedoffailed), plus statusafhankelijke velden voor omgeving, owner-epoch, werkruimte, bundel, ACK-cursor of herstel.sessions.subscribeensessions.unsubscribeschakelen abonnementen op sessiewijzigingsgebeurtenissen in of uit voor de huidige WS-client.sessions.messages.subscribeensessions.messages.unsubscribeschakelen abonnementen op transcript-/berichtgebeurtenissen in of uit voor één sessie. GeefincludeApprovals: truedoor om ook opgeschoondesession.approval-levenscyclusgebeurtenissen te ontvangen voor goedkeuringen waarvan het opgeslagen publiek exact die sessie omvat en waarvan de reviewerbinding de abonnerende client autoriseert. Het antwoord op het abonnement bevat dan een begrensde openstaandeapprovalReplay; deze is gezaghebbend wanneertruncatedfalse is. De opt-in geldt per abonnementsaanroep en blijft niet behouden: opnieuw abonneren op dezelfde sessie zonderincludeApprovals: trueverwijdert een bestaand goedkeuringsabonnement. Naast de normale autorisatie om de sessie te lezen, vereist deze opt-inoperator.admin, ofoperator.approvalsop een gekoppeld apparaat.sessions.previewretourneert begrensde transcriptvoorbeelden voor specifieke sessiesleutels.sessions.describeretourneert één Gateway-sessierij voor een exacte sessiesleutel.sessions.resolveherleidt of canonicaliseert een sessiedoel.sessions.createmaakt een nieuwe sessievermelding. Optionele waarden voormodelenthinkingLevelslaan de initiële model- en redeneersoverschrijvingen atomair op.worktree: truericht een beheerde worktree in; optioneleworktreeBaseRef/worktreeNameselecteren de basisreferentie en branchnaam, enexecNode(operator.admin) bindt sessie-uitvoering aan een Node-host. De gemaakte worktree wordt in het resultaat teruggegeven en in de sessierij opgeslagen (worktree: { id, branch, repoRoot }). Wanneer de vermelding is gemaakt maar de geneste initiëlechat.sendwordt geweigerd, bevat het geslaagde resultaatrunStarted: falseenrunError; clients kunnen de prompt behouden en het opnieuw proberen met de geretourneerde sessiesleutel. Een aanroeper dieparentSessionKeymetemitCommandHooks: truedoorgeeft, moet ook de levenscyclusafhandeling van een afzonderlijk child declareren:succeedsParent: truebeëindigt de parent metsession_end, terwijlfalsede parent actief houdt en alleen desession_startvan het child uitzendt. AlssucceedsParentwordt weggelaten, blijft het verouderde parent-rollovergedrag voor bestaande clients behouden. De afhandeling vereist zowel een parentkoppeling als command-hooks; een fork kan zijn parent niet laten slagen. Het gedrag waarbij de hoofdsessie ter plaatse wordt gereset, blijft ongewijzigd omdat er geen afzonderlijk child wordt gemaakt. Nieuwe rijen krijgen een eenmalig schrijfbare herkomstmarkering voor het maken (createdVia,createdActor,createdAt) vanuit de vertrouwde aanmaakinterface; het overnemen van een bestaande sleutel brengt deze markering nooit opnieuw aan. Voor menselijke profielactoren wordtcreatedActor.labelvanuit het huidige gebruikersprofiel herleid wanneer de rij wordt geprojecteerd en nooit in de sessievermelding opgeslagen, zodat profielnamen na een naamswijziging niet uiteenlopen. Sessierijen bevatten ookparentSessionKey(navigatieparent, opgeslagen),controlOwnerSessionKey(runtimecontroller wanneer actief),forkSource(exacte bronsleutel + transcriptgeneratie voor forks) enpreviousSessionId(eerdere transcriptgeneratie onder dezelfde sleutel).sessions.dispatch(operator.admin) verplaatst een bestaande lokale OpenClaw-sessie met een door de sessie beheerde worktree naar een geconfigureerd cloudworkerprofiel. Geef{ key, profileId, agentId? }door. De methode ontbreekt wanneer geen workerprofiel is geconfigureerd, sluit lokale toelating van beurten voordat actief werk wordt afgehandeld en retourneert pas nadat de plaatsingactive-workereigenaarschap heeft bereikt. Dispatch werkt één kant op; terughalen van worker naar lokaal maakt geen deel uit van deze RPC.sessions.groups.list,sessions.groups.put,sessions.groups.renameensessions.groups.deletebeheren de aangepaste sessiegroepencatalogus van de Gateway (namen + weergavevolgorde). Het lidmaatschap blijft opgeslagen in hetcategory-veld van elke sessie; hernoemen en verwijderen werken lidsessies aan serverzijde bij.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. Geefkeyplus optioneelrunIddoor, of alleenrunIdvoor actieve uitvoeringen die de Gateway aan een sessie kan koppelen. AlsrunIdwordt opgegeven, blijft de annulering beperkt tot die uitvoering. StelclearQueued: truein bij een niet-globaal verzoek met alleen een sleutel om ook vervolg- en lane-wachtrijen van die sessie te verwijderen. Bestaande aanroepers dieclearQueuedweglaten, behouden deze wachtrijen. De letterlijke sleutelglobalbehoudt de bestaande agentgekwalificeerde eigendomsregels vanchat.aborten voert geen niet-globale opschoning van vervolg- of lane-wachtrijen uit.sessions.patchwerkt sessiemetadata/-overschrijvingen bij en rapporteert het herleide canonieke model plus de effectieveagentRuntime. Afstammingsgegevens van spawn-acties (spawnedBy,spawnedWorkspaceDir,spawnedCwd,spawnDepth,subagentRole,subagentControlScope) kunnen niet langer openbaar worden gepatcht; deze gegevens worden eenmaal door vertrouwde aanmaakpaden geschreven en verzoeken die ze nog steeds meesturen, worden geweigerd.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.historywordt voor weergave genormaliseerd voor UI-clients: inline directivetags worden uit zichtbare tekst verwijderd, XML-payloads voor toolaanroepen in platte tekst (<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>en afgekorte toolaanroepblokken) en gelekte ASCII-/volledige-breedte-modelbesturingstokens worden verwijderd, assistentrijen die uitsluitend een stil token bevatten (exactNO_REPLY/no_reply) worden weggelaten en te grote rijen kunnen door tijdelijke aanduidingen worden vervangen. chat.message.getis de aanvullende begrensde lezer voor volledige berichten van één zichtbare transcriptvermelding. GeefsessionKeydoor, optioneelagentIdwanneer de sessieselectie agentgebonden is, en een transcript-messageIddie eerder viachat.historybeschikbaar is gesteld; de Gateway retourneert dezelfde voor weergave genormaliseerde projectie zonder de afkappingslimiet voor lichtgewicht geschiedenis wanneer de opgeslagen vermelding nog beschikbaar en niet te groot is.chat.toolTitlesretourneert korte doeltitels voor toolaanroepen die in de Control UI worden weergegeven (in batches, maximaal 24 items met begrensde invoer). De functie is opt-in viagateway.controlUi.toolTitles(standaard uitgeschakeld); uitgeschakelde Gateways beantwoorden{ titles: {}, disabled: true }zonder modelaanroep, zodat clients niet meer blijven vragen. Wanneer dit is ingeschakeld, gebruiken titels de standaardroutering voor utility-modellen: een expliciet geconfigureerdeutilityModel(een beslissing van de operator die, net als alle utility-taken, begrensde taakinhoud naar de gekozen provider kan sturen), anders de gedeclareerde standaard voor kleine modellen van de sessieprovider, zodat niet impliciet een nieuwe uitgaande bestemming ontstaat; een legeutilityModelschakelt ze volledig uit. Titels vallen nooit terug op het primaire model. Resultaten worden gecachet in de statusdatabase per agent, met toolnaam + invoer als sleutel, zodat herhaalde weergaven dezelfde aanroepen nooit opnieuw in rekening brengen.chat.sendaccepteert een eenmaligefastMode: "auto"om de snelle modus te gebruiken voor modelaanroepen die vóór de automatische grens worden gestart, en start latere nieuwe pogingen, fallbacks, toolresultaat- of vervolgaanroepen vervolgens zonder snelle modus. De grens is standaard 60 seconden (DEFAULT_FAST_MODE_AUTO_ON_SECONDS) en kan per model worden geconfigureerd metagents.defaults.models["<provider>/<model>"].params.fastAutoOnSeconds. Eenchat.send-aanroeper kan een eenmaligefastAutoOnSecondsdoorgeven om de grens voor dat verzoek te overschrijven. GeefqueueMode(steer,followup,collectofinterrupt) door om de opgeslagen wachtrijmodus alleen voor dit verzoek te overschrijven; expliciete bijstuuracties in de Control UI gebruikenqueueMode: "steer". Interactieve clients kunnenexpectedLeafEntryIddoorgeven met het blad van de actieve transcriptbranch dat ze weergeven, ofnullvoor een gezaghebbend leeg transcript; de Gateway weigert de verzending metdetails.reason: "active-leaf-changed"als een andere client eerst van branch is gewisseld.
Apparaatkoppeling en apparaattokens
device.pair.listretourneert wachtende en goedgekeurde gekoppelde apparaten.device.pair.setupCodemaakt een mobiele installatiecode en standaard een PNG-QR-data-URL. Hiervoor isoperator.adminvereist en de methode wordt opzettelijk weggelaten uit de geadverteerde ontdekking. Het resultaat bevatsetupCode, optioneelqrDataUrl,gatewayUrl, het niet-geheimeauth-label enurlSource.device.pair.approve,device.pair.rejectendevice.pair.removebeheren records voor apparaatkoppeling.device.pair.renamewijst een operatorlabel ({ deviceId, label }) toe dat de voorkeur krijgt boven de door de client gerapporteerde weergavenaam en behouden blijft na apparaatherstel of hernieuwde goedkeuring.device.token.rotateroteert een token van een gekoppeld apparaat binnen de grenzen van de goedgekeurde rol en het bereik van de aanroeper.device.token.revoketrekt een token van een gekoppeld apparaat in binnen de grenzen van de goedgekeurde rol en het bereik van de aanroeper.
De installatiecode bevat een kortlevende bootstrapreferentie. Clients mogen deze niet loggen of na het koppelingsproces bewaren.
Node-koppeling, aanroepen en wachtend werk
node.pair.list,node.pair.approve,node.pair.rejectennode.pair.removebehandelen goedkeuringen van Node-capaciteiten.node.pair.requestennode.pair.verifyzijn in 2026.7 verwijderd, samen met de zelfstandige opslag voor Node-koppelingen; wachtende verzoeken worden door de Gateway gemaakt wanneer Nodes verbinding maken.node.listennode.describeretourneren de bekende/verbonden Node-status.node.renamewerkt het label van een gekoppelde Node bij.node.invokestuurt een opdracht door naar een verbonden Node.node.invoke.resultretourneert het resultaat van een aanroepverzoek.mcp.tools.call.v1is de headless Node-hostopdracht voor het aanroepen van een geconfigureerde Node-lokale MCP-tool. Deze wordt vianode.invokedoorgegeven, vereist dat de Node de opdracht declareert en blijft onderworpen aan koppelingsgoedkeuring engateway.nodes.commands.deny.node.eventstuurt gebeurtenissen die van een Node afkomstig zijn terug naar de Gateway.node.pluginTools.updateis het enige publicatiepad voor het vervangen van de agentzichtbare Plugin-/MCP-tooldescriptors van de verbonden Node;connect-parameters bevatten deze niet.node.pending.pullennode.pending.ackzijn de wachtrij-API's voor verbonden Nodes.node.pending.enqueueennode.pending.drainbeheren duurzaam wachtend werk voor offline/niet-verbonden Nodes.
Goedkeuringscategorieën
approval.historyretourneert de nieuwste definitieve goedkeuringen eerst, die 30 dagen worden bewaard voor uitvoerings-, plugin- en systeemagentaanvragen (bereikoperator.approvals). Het ondersteunt cursorpaginering en een optioneel typefilter; openstaande goedkeuringen zijn geen geschiedenisrijen.approval.getenapproval.resolvezijn de type-onafhankelijke duurzame goedkeuringsmethoden (bereikoperator.approvals).approval.getretourneert een opgeschoonde projectie van een openstaande of bewaarde definitieve goedkeuring met een stabieleurlPath;approval.resolveaccepteert de canonieke goedkeurings-id, een explicietekinden een beslissing, past afhandeling toe waarbij het eerste antwoord geldt en retourneert altijd het vastgelegde canonieke resultaat.exec.approval.request,exec.approval.get,exec.approval.listenexec.approval.resolveomvatten eenmalige uitvoeringsgoedkeuringsaanvragen en het opzoeken/opnieuw afspelen van openstaande goedkeuringen. Het zijn adapters aan de protocolgrens boven op hetzelfde duurzame goedkeuringsregister.exec.approval.waitDecisionwacht op één openstaande uitvoeringsgoedkeuring en retourneert de definitieve beslissing (ofnullbij een time-out).exec.approvals.getenexec.approvals.setbeheren momentopnamen van het Gateway-beleid voor uitvoeringsgoedkeuringen.exec.approvals.node.getenexec.approvals.node.setbeheren het node-lokale beleid voor uitvoeringsgoedkeuringen via node-relayopdrachten.plugin.approval.request,plugin.approval.list,plugin.approval.waitDecisionenplugin.approval.resolveomvatten door plugins gedefinieerde goedkeuringsflows.
Opdrachten voor de Control UI
ui.commandlaat eenoperator.write-aanroeper getypeerde lay-out- en navigatieopdrachten verzenden naar verbonden Control UI-clients die de mogelijkheidui-commandskenbaar maken.- Opdrachten omvatten het splitsen, sluiten en focussen van deelvensters, de zichtbaarheid van de zijbalk, de zichtbaarheid en dokpositie van terminal- en browserpanelen en sessienavigatie.
- Protocol v1 stuurt de opdracht bewust door naar elke verbonden geschikte Control UI. Als er geen is verbonden, mislukt de aanvraag met
UNAVAILABLEin plaats van te doen alsof de lay-out is gewijzigd.
Automatisering, Skills en hulpmiddelen
- Automatisering:
wakeplant een onmiddellijke of bij-de-volgende-Heartbeat uitgevoerde injectie van activeringstekst;cron.get,cron.list,cron.status,cron.add,cron.update,cron.remove,cron.runencron.runsbeheren gepland werk. cron.runblijft een RPC volgens het wachtrijmodel voor handmatige uitvoeringen. Clients die voltooiingssemantiek nodig hebben, moeten de geretourneerderunIdlezen encron.runspollen.cron.runsaccepteert een optioneel niet-leegrunId-filter, zodat clients één handmatig in de wachtrij geplaatste uitvoering kunnen volgen zonder te concurreren met andere geschiedenisvermeldingen voor dezelfde taak.- Skills en hulpmiddelen:
commands.list,skills.*,tools.catalog,tools.effective,tools.invoke. Zie hieronder Hulpmethoden voor operators.
Algemene gebeurteniscategorieën
chat: UI-chatupdates zoalschat.injecten andere chatgebeurtenissen die alleen in het transcript voorkomen. In protocol v4 bevatten delta-payloadsdeltaText;messageblijft de cumulatieve momentopname van de assistent. Vervangingen die geen prefix zijn, stellenreplace=truein en gebruikendeltaTextals vervangende tekst.session.message,session.operation,session.tool: updates voor het transcript, een lopende sessiebewerking en de gebeurtenisstroom van een gevolgde sessie.session.approval: opgeschoonde waarheid over openstaande en definitieve goedkeuringen voor een expliciet aangemelde abonnee van exact die sessie. Onderliggende goedkeuringen gebruiken het opgeslagen publiek van de bovenliggende goedkeuring; gebeurtenissen wijzigen nooit transcripten en activeren geen agents.sessions.changed: sessie-index of metagegevens gewijzigd.presence: updates van de momentopname van systeemaanwezigheid.tick: periodieke keepalive-/levendigheidsgebeurtenis.health: update van de momentopname van de Gateway-status.heartbeat: update van de Heartbeat-gebeurtenisstroom.cron: gebeurtenis bij een wijziging van een Cron-uitvoering of -taak.shutdown: melding dat de Gateway wordt afgesloten.node.pair.requested/node.pair.resolved: levenscyclus van nodekoppeling.node.invoke.request: uitzending van een node-aanroepaanvraag.device.pair.requested/device.pair.resolved: levenscyclus van gekoppelde apparaten.voicewake.changed: configuratie voor activering via een trefwoord gewijzigd.config.changed: een configuratieschrijfactie is opgeslagen (de payload bevat het configuratiepad, de hash van de nieuwe momentopname en een tijdstempel — nooit configuratie-inhoud). Beperkt tot operators met leesbereik; clients vernieuwen viaconfig.get.exec.approval.requested/exec.approval.resolved: levenscyclus van uitvoeringsgoedkeuringen.plugin.approval.requested/plugin.approval.resolved: levenscyclus van plugingoedkeuringen.
Hulpmethoden voor nodes
Nodes kunnen skills.bins aanroepen om de huidige lijst met uitvoerbare Skill-bestanden
op te halen voor controles op automatische toestemming.
RPC voor het auditlogboek
audit.activity.list biedt operatorclients een stabiele weergave, met de nieuwste eerst, van metagegevens over de levenscyclus van
agentuitvoeringen, hulpmiddelacties en vrijwillig opgenomen berichten. Hiervoor is
operator.read vereist. Query's sluiten records ouder dan 30 dagen uit en het gedeelde
SQLite-logboek is beperkt tot 100.000 records. Verlopen rijen worden verwijderd tijdens
het opstarten van de Gateway, bij elk uuronderhoud en bij latere schrijfacties. Zie
Auditgeschiedenis voor het gegevensmodel en de privacysemantiek.
- Parameters: optioneel exact
agentId,sessionKeyofrunId; optioneelkind("agent_run","tool_action"of"message"); optioneelstatus("started","succeeded","failed","cancelled","timed_out","blocked"of"unknown"); optioneel bericht-direction("inbound"of"outbound") en exactchannel; optionele inclusieve Unix-millisecondegrenzenafter/before; optioneellimitvan1tot500; en optionele tekenreekscursorvan de voorgaande pagina. - Resultaat:
{ "events": AuditActivityEventV1[], "nextCursor"?: string }.
De benoemde V1-resultaatunie heeft afzonderlijke schema's voor agentuitvoeringen, hulpmiddelacties, inkomende berichten
en uitgaande berichten. De discriminator eventType is respectievelijk
agent_run, tool_action, inbound_message of outbound_message; kind en
bericht-direction blijven beschikbaar voor filtering en weergave. Elke gebeurtenis heeft
een gehele schemaVersion: 1. Verwijzingen naar berichtidentiteiten gebruiken de exacte
hmac-sha256:v1:<32 hex key id>:<64 hex digest>-indeling; een actor-id van een kanaalafzender
gebruikt dezelfde indeling.
Alle varianten vereisen eventType, schemaVersion, eventId, sequence,
sourceSequence, occurredAt, kind, action, status, actor en
redaction. De variantvelden zijn:
eventType |
Vereiste velden | Optionele velden |
|---|---|---|
agent_run |
agentId, runId; kind: "agent_run" |
sessionKey, sessionId, errorCode |
tool_action |
agentId, runId; kind: "tool_action" |
sessionKey, sessionId, toolCallId, toolName, errorCode |
inbound_message |
direction: "inbound", channel, conversationKind, outcome |
agentId, runId, durationMs, resultCount, identiteitsverwijzingen, reasonCode, errorCode |
outbound_message |
direction: "outbound", channel, conversationKind, outcome |
agentId, runId, durationMs, resultCount, identiteitsverwijzingen, reasonCode, deliveryKind, failureStage, errorCode |
De gesloten berichten-enums zijn:
conversationKind:direct,group,channelofunknown.- Inkomend
outcome:completed,skippedoffailed; optioneelreasonCode:duplicate,reply_operation_active,reply_operation_aborted,fast_abort,plugin_bound_handled,plugin_bound_unavailable,plugin_bound_declined,plugin_bound_error,before_dispatch_handled,acp_dispatch_completed,acp_dispatch_failed,acp_dispatch_emptyofacp_dispatch_aborted. - Uitgaand
outcome:sent,suppressed,failedofunknown; optioneelreasonCode:cancelled_by_message_sending_hook,cancelled_by_reply_payload_sending_hook,empty_after_message_sending_hook,empty_after_reply_payload_sending_hookofno_visible_payload. Een adapter die geen platformidentiteit retourneert, isunknown, omdat de externe bijwerking niet kan worden weerlegd. deliveryKind:text,mediaofother;failureStage:platform_send,queueofunknown.
Definitieve velden zijn gecorreleerd en niet onafhankelijk optioneel:
| Variant | Definitieve toewijzing |
|---|---|
| Agentuitvoering | started heeft geen errorCode; elke voltooide status die geen succes aangeeft, vereist de bijbehorende run_*-code. |
| Hulpmiddelactie | started en geslaagd hebben geen errorCode; elke andere voltooide status vereist de bijbehorende tool_*-code. |
| Inkomend bericht | geslaagd = completed; geblokkeerd = skipped; mislukt = failed plus message_processing_failed. reasonCode moet, indien aanwezig, tot die definitieve categorie behoren. |
| Uitgaand bericht | geslaagd = sent; geblokkeerd = suppressed plus reasonCode; mislukt = failed plus errorCode en failureStage; onbekend = unknown plus failureStage. |
Elke activiteitsgebeurtenis bevat een stabiele gebeurtenis-id, monotoon oplopend logboekvolgnummer,
brongebeurtenisvolgnummer, tijdstempel, actor, actie, status, gehele
schemaVersion: 1 en redaction: "metadata_only". Uitvoerings- en hulpmiddelrecords
vereisen de herkomst van de agent en uitvoering en kunnen sessieherkomst bevatten. Berichtrecords
kunnen agent- en uitvoerings-id's bevatten, maar bevatten bewust nooit
sessionKey of sessionId; het queryfilter sessionKey is daarom alleen van toepassing op
uitvoerings- en hulpmiddelrijen. Hulpmiddelgebeurtenissen kunnen de id van de hulpmiddelaanroep en de hulpmiddelnaam bevatten.
Berichtrecords gebruiken message.inbound.processed of
message.outbound.finished en voegen richting, kanaal, gesprekstype,
genormaliseerd resultaat en optioneel afleveringstype, foutfase, duur,
aantal resultaten, redencode en met een installatiegebonden sleutel aangemaakte
pseudoniemen voor account/gesprek/bericht/doel toe. Deze pseudoniemen helpen bij
correlatie, maar zijn geen anonimisering: de statusdatabase bevat hun sleutel,
terwijl RPC- en CLI-exports die niet bevatten. Het logboek slaat geen prompts, berichtinhoud,
toolargumenten, toolresultaten, opdrachtuitvoer of onbewerkte fouttekst op.
Run/tool-waarden van sessionKey blijven onbewerkte correlatiemetadata en kunnen
platformaccount- of peer-id's bevatten; berichtrecords bevatten geen sessiesleutels.
Voor inkomende rijen meet durationMs de kerndispatch tot en met de eindstatus en
telt resultCount de definitief verwerkte tool-, blok- en antwoordpayloads in de wachtrij. Voor
uitgaande rijen omvat durationMs het eigenaarschap van de aflevering tot en met bevestiging,
dead letter of reconciliatie (inclusief wachttijd in de wachtrij), en telt resultCount
de geïdentificeerde fysieke verzendingen naar het platform. deliveryKind beschrijft, indien aanwezig,
de effectieve payload na hooks en rendering; onderdrukte rijen of rijen
waarvan de status door een crash onduidelijk is, bevatten deze waarde niet.
De huidige berichtdekking omvat geaccepteerde inkomende berichten die de
kerndispatch bereiken, inclusief dubbele/eindresultaten van de kern. Voor uitgaande berichten wordt
één eindrij geschreven per oorspronkelijke logische antwoordpayload die de gedeelde duurzame
aflevering bereikt; segmentering en adapter-fan-out worden samengevoegd in resultCount. Opnieuw
te proberen verzendingen in de wachtrij of verzendingen met een onduidelijke status worden pas vastgelegd na bevestiging, een
dead letter of reconciliatie. Plugin-lokale en directe verzendpaden die deze
gedeelde grenzen omzeilen, worden nog niet gedekt. De begrensde workerwachtrij werkt volgens het best-effortprincipe
en kan records laten vallen bij fouten of verzadiging. Dit oppervlak is daarom geen
verliesvrij nalevingsarchief.
Registratie is standaard ingeschakeld en wordt beheerd via
audit.enabled. Berichtregistratie wordt
afzonderlijk beheerd via audit.messages en is standaard ingesteld op "off". Wanneer
registratie is uitgeschakeld, blijft audit.activity.list eerder geschreven records aanbieden
totdat ze verlopen.
De meegeleverde schema's voor het audit.list-verzoek, het resultaat en AuditEvent
blijven ongewijzigd en retourneren alleen records van agentruns en toolacties. Nieuwe operatorclients
moeten audit.activity.list aanroepen wanneer de Gateway deze methode adverteert. Oudere
Gateways kunnen unknown method: audit.activity.list rapporteren of, omdat
autorisatie in meegeleverde versies voorafging aan het opzoeken van de methode, missing scope: operator.admin voor een verzoek met leesbereik. Behandel dat laatste alleen als
afwezigheid van de methode wanneer de methode niet was geadverteerd. Een client kan vervolgens alleen audit.list
opnieuw proberen wanneer de filters geen ondersteuning voor berichtstype, richting of kanaal
vereisen.
Gebruik openclaw audit voor tekstquery's en begrensde JSON-exports.
RPC's voor het taaklogboek
Operatorclients inspecteren en annuleren records van achtergrondtaken van de Gateway via
de RPC's van het taaklogboek (packages/gateway-protocol/src/schema/tasks.ts). Deze
retourneren opgeschoonde taaksamenvattingen, geen onbewerkte runtimestatus.
tasks.listvereistoperator.read.- Parameters: optioneel
status("queued","running","completed","failed","cancelled"of"timed_out") of een array met deze statussen, optioneelagentId, optioneelsessionKey, optioneellimitvan1tot500en optionele tekenreekscursor. - Resultaat:
{ "tasks": TaskSummary[], "nextCursor"?: string }.
- Parameters: optioneel
tasks.getvereistoperator.read.- Parameters:
{ "taskId": string }. - Resultaat:
{ "task": TaskSummary }. - Ontbrekende taak-id's retourneren de vorm van de niet-gevonden-fout van de Gateway.
- Parameters:
tasks.cancelvereistoperator.write.- Parameters:
{ "taskId": string, "reason"?: string }. - Resultaat:
{ "found": boolean, "cancelled": boolean, "reason"?: string, "task"?: TaskSummary }. foundgeeft aan of het logboek een overeenkomende taak bevatte.cancelledgeeft aan of de runtime de annulering heeft geaccepteerd of vastgelegd.
- Parameters:
TaskSummary bevat id, status en optionele metadata: kind,
runtime, title, agentId, sessionKey, childSessionKey, ownerKey,
runId, taskId, flowId, parentTaskId, sourceId, tijdstempels, voortgang,
eindsamenvatting en opgeschoonde fouttekst. agentId identificeert de agent
die de taak uitvoert; sessionKey en ownerKey behouden de context van de aanvrager en de besturing.
Hulpmethoden voor operators
commands.list(operator.read) haalt de runtimeopdrachtinventaris voor een agent op.agentIdis optioneel; laat dit weg om de standaardwerkruimte van de agent te lezen.scopebepaalt op welk oppervlak de primairenameis gericht:textretourneert het primaire token van de tekstopdracht zonder de voorafgaande/;nativeen het standaardpadbothretourneren providerbewuste systeemeigen namen wanneer die beschikbaar zijn.textAliasesbevat exacte slash-aliassen zoals/modelen/m.nativeNamebevat de providerbewuste systeemeigen opdrachtnaam wanneer die bestaat.provideris optioneel en beïnvloedt alleen systeemeigen naamgeving en de beschikbaarheid van systeemeigen Plugin- opdrachten.includeArgs=falselaat geserialiseerde argumentmetadata weg uit het antwoord.
tools.catalog(operator.read) haalt de runtimetoolcatalogus voor een agent op. Het antwoord bevat gegroepeerde tools en herkomstmetadata:source:coreofpluginpluginId: eigenaar van de Plugin wanneersource="plugin"optional: of een Plugin-tool optioneel is
tools.effective(operator.read) haalt de runtime-effectieve toolinventaris voor een sessie op.sessionKeyis vereist.- De Gateway leidt vertrouwde runtimecontext server-side af uit de sessie in plaats van door de aanroeper verstrekte authenticatie- of afleveringscontext te accepteren.
- Het antwoord is een sessiegebonden, door de server afgeleide projectie van de actieve inventaris, inclusief tools van de kern, Plugins, kanalen en reeds ontdekte MCP- servers.
tools.effectiveis alleen-lezen voor MCP: deze methode kan een MCP- catalogus van een warme sessie via het definitieve toolbeleid projecteren, maar maakt geen MCP-runtimes, verbindt geen transports en geeft geentools/listuit. Als er geen overeenkomende warme catalogus bestaat, kan het antwoord een melding bevatten zoalsmcp-not-yet-connected,mcp-not-yet-listedofmcp-stale-catalog.- Effectieve toolvermeldingen gebruiken
source="core",source="plugin",source="channel"ofsource="mcp".
tools.invoke(operator.write) roept één beschikbare tool aan via hetzelfde Gateway-beleidspad als/tools/invoke.nameis vereist.args,sessionKey,agentId,confirmenidempotencyKeyzijn optioneel.- Als zowel
sessionKeyalsagentIdaanwezig zijn, moet de opgeloste sessieagent overeenkomen metagentId. - Kernwrappers die alleen voor de eigenaar zijn bedoeld, zoals
cron,gatewayennodes, vereisen een eigenaars-/beheerdersidentiteit (operator.admin), hoeweltools.invokezelfoperator.writeis. - Het antwoord is een op de SDK gerichte envelop met
ok,toolName, optioneeloutputen getypeerdeerror-velden. Weigeringen wegens goedkeuring of beleid retournerenok:falsein de payload in plaats van de Gateway-pijplijn voor toolbeleid te omzeilen.
skills.status(operator.read) haalt de zichtbare Skills-inventaris voor een agent op.agentIdis optioneel; laat dit weg om de standaardwerkruimte van de agent te lezen.- Het antwoord bevat geschiktheid, ontbrekende vereisten, configuratiecontroles en opgeschoonde installatieopties zonder onbewerkte geheime waarden bloot te stellen.
skills.searchenskills.detail(operator.read) retourneren ClawHub- detectiemetadata.skills.upload.begin,skills.upload.chunkenskills.upload.commit(operator.admin) bereiden een privé-Skills-archief voor voordat het wordt geïnstalleerd. Dit is een afzonderlijk uploadpad voor beheerders voor vertrouwde clients, niet de normale ClawHub- installatiestroom voor Skills, en is standaard uitgeschakeld tenzijskills.install.allowUploadedArchivesis ingeschakeld.skills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })maakt een upload die aan die slug en force-waarde is gekoppeld.skills.upload.chunk({ uploadId, offset, dataBase64 })voegt bytes toe op de exacte gedecodeerde offset.skills.upload.commit({ uploadId, sha256? })verifieert de uiteindelijke grootte en SHA-256. Commit voltooit alleen de upload; de Skill wordt niet geïnstalleerd.- Geüploade Skills-archieven zijn ziparchieven met een
SKILL.md-hoofdmap. De interne mapnaam van het archief bepaalt nooit het installatiedoel.
skills.install(operator.admin) heeft drie modi:- ClawHub-modus:
{ source: "clawhub", slug, version?, force? }installeert een Skills-map in de mapskills/van de standaardwerkruimte van de agent. - Uploadmodus:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }installeert een vastgelegde upload in de mapskills/<slug>van de standaardwerkruimte van de agent. De slug en force-waarde moeten overeenkomen met het oorspronkelijkeskills.upload.begin-verzoek. Wordt geweigerd tenzijskills.install.allowUploadedArchivesis ingeschakeld; de instelling heeft geen invloed op ClawHub-installaties. - Gateway-installatiemodus:
{ name, installId, timeoutMs? }voert een gedeclareerdemetadata.openclaw.install-actie uit op de Gateway-host. Oudere clients kunnen nog steedsdangerouslyForceUnsafeInstallverzenden; dit veld is verouderd, wordt alleen geaccepteerd voor protocolcompatibiliteit en wordt genegeerd. Gebruiksecurity.installPolicyvoor installatiebeslissingen van operators.
- ClawHub-modus:
skills.update(operator.admin) heeft twee modi:- De ClawHub-modus werkt één bijgehouden slug of alle bijgehouden ClawHub-installaties in de standaardwerkruimte van de agent bij.
- De configuratiemodus past
skills.entries.<skillKey>-waarden aan, zoalsenabled,apiKeyenenv.
models.list-weergaven
models.list accepteert een optionele parameter view
(src/agents/model-catalog-visibility.ts):
- Weggelaten of
"default": alsagents.defaults.modelPolicy.allowis geconfigureerd, is het antwoord de toegestane catalogus, inclusief dynamisch ontdekte modellen voorprovider/*-vermeldingen. Anders is het antwoord de volledige Gateway- catalogus. "configured": gedrag met de omvang van een keuzelijst. Alsagents.defaults.modelPolicy.allowis geconfigureerd, krijgt deze nog steeds voorrang, inclusief providergebonden detectie voorprovider/*-vermeldingen. Zonder een toelatingslijst gebruikt het antwoord explicietemodels.providers.<provider>.models-vermeldingen, met een terugval op de volledige catalogus alleen wanneer er geen geconfigureerde modelrijen bestaan."provider-config": door de bron opgesteldemodels.providers.*.models-inventaris, onafhankelijk van toelatingslijsten voor keuzelijsten. Rijen bevatten openbare modelmogelijkheden en routebewuste beschikbaarheid, maar laten providereindpunten, authenticatiemateriaal en runtimeverzoekconfiguratie weg."all": volledige Gateway-catalogus, waarbijagents.defaults.modelPolicy.allowwordt omzeild. Gebruik dit voor diagnostische/detectie-UI's, niet voor normale modelkeuzelijsten.
Uitvoeringsgoedkeuringen
- Wanneer een exec-verzoek goedkeuring vereist, zendt de Gateway
exec.approval.requesteduit. - Operatorclients handelen dit af door
exec.approval.resolveaan te roepen (vereistoperator.approvals). - Voor
host=nodemoetexec.approval.requestsystemRunPlanbevatten (canoniekeargv/cwd/rawCommand/sessiemetadata). Verzoeken zondersystemRunPlanworden geweigerd. - Na goedkeuring hergebruiken doorgestuurde
node.invoke system.run-aanroepen die canoniekesystemRunPlanals de gezaghebbende opdracht-/cwd-/sessiecontext. - Als een aanroeper
command,rawCommand,cwd,agentIdofsessionKeywijzigt tussen de voorbereiding en het uiteindelijk goedgekeurde doorsturen vansystem.run, weigert de Gateway de uitvoering in plaats van de gewijzigde payload te vertrouwen.
Terugvaloptie voor agentbezorging
agent-verzoeken kunnendeliver=truebevatten om uitgaande bezorging aan te vragen.bestEffortDeliver=false(de standaardwaarde) handhaaft strikt gedrag: niet-opgeloste of uitsluitend interne bezorgingsdoelen retournerenINVALID_REQUEST.bestEffortDeliver=truestaat terugvallen op uitvoering binnen alleen de sessie toe wanneer geen externe bezorgbare route kan worden bepaald (bijvoorbeeld bij interne/webchat- sessies of dubbelzinnige configuraties met meerdere kanalen).- Uiteindelijke
agent-resultaten kunnenresult.deliveryStatusbevatten wanneer bezorging is aangevraagd, met dezelfde statussensent,suppressed,partial_failedenfaileddie zijn gedocumenteerd vooropenclaw agent --json --deliver.
Versiebeheer
PROTOCOL_VERSION,MIN_CLIENT_PROTOCOL_VERSION,MIN_NODE_PROTOCOL_VERSIONenMIN_PROBE_PROTOCOL_VERSIONbevinden zich inpackages/gateway-protocol/src/version.ts.- Clients verzenden
minProtocol+maxProtocol. Operator- en UI-clients moeten het huidige protocol in dat bereik opnemen; huidige clients en servers gebruiken protocol v4. - Geverifieerde clients met zowel
role: "node"alsclient.mode: "node"mogen het N-1-nodeprotocol gebruiken (momenteel v3). Lichtgewicht herstartcontroles gebruiken hetzelfde N-1-venster. Apparaatverificatie, koppeling, bereiken, opdrachtbeleid en exec- goedkeuringen blijven door dit compatibiliteitsvenster ongewijzigd. Door Plugins beheerde node- mogelijkheden en opdrachten worden niet beschikbaar gesteld totdat de node naar het huidige protocol is bijgewerkt, omdat de door hen gehoste oppervlakken geen deel uitmaken van het N-1-contract. - Schema's en modellen worden gegenereerd uit TypeBox-definities:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Clientconstanten
De referentie-implementatie van de client bevindt zich in packages/gateway-client/src/
(OpenClaw verpakt deze via de dunne src/gateway/client.ts-facade). Deze
standaardwaarden zijn stabiel in protocol v4 en vormen de verwachte basis voor
clients van derden.
| Constante | Standaardwaarde | Bron |
|---|---|---|
PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
MIN_CLIENT_PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
MIN_NODE_PROTOCOL_VERSION |
3 |
packages/gateway-protocol/src/version.ts |
MIN_PROBE_PROTOCOL_VERSION |
3 |
packages/gateway-protocol/src/version.ts |
| Time-out van verzoek (per RPC) | 30_000 ms |
packages/gateway-client/src/client.ts (requestTimeoutMs) |
| Time-out voor preauth/verbindingsuitdaging | 15_000 ms |
packages/gateway-client/src/timeouts.ts (env OPENCLAW_HANDSHAKE_TIMEOUT_MS kan het budget van de gekoppelde server/client verhogen) |
| Initiële back-off voor opnieuw verbinden | 1_000 ms |
packages/gateway-client/src/client.ts (GATEWAY_RECONNECT_POLICY) |
| Maximale back-off voor opnieuw verbinden | 30_000 ms |
packages/gateway-client/src/client.ts (GATEWAY_RECONNECT_POLICY) |
| Begrenzing voor snelle nieuwe poging na sluiting wegens apparaattoken | 250 ms |
packages/gateway-client/src/client.ts |
Respijtperiode voor geforceerd stoppen vóór terminate() |
250 ms |
FORCE_STOP_TERMINATE_GRACE_MS |
Standaardtime-out voor stopAndWait() |
1_000 ms |
STOP_AND_WAIT_TIMEOUT_MS |
Standaard tick-interval (vóór hello-ok) |
30_000 ms |
packages/gateway-client/src/client.ts |
| Sluiting wegens tick-time-out | code 4000 wanneer de stilte langer duurt dan tickIntervalMs * 2 |
packages/gateway-client/src/client.ts |
MAX_PAYLOAD_BYTES |
25 * 1024 * 1024 (25 MB) |
src/gateway/server-constants.ts |
De server maakt de effectieve policy.tickIntervalMs,
policy.maxPayload en policy.maxBufferedBytes bekend in hello-ok; clients
moeten die waarden respecteren in plaats van de standaardwaarden van vóór de handshake.
De referentieclient laat eindige verzoeken hun geconfigureerde deadline beheren wanneer
elk verzoek in behandeling er een heeft. Een expectFinal-verzoek zonder een eindige
timeoutMs, elk verzoek met timeoutMs: null of een combinatie van eindige en
onbegrensde verzoeken houdt de tick-watchdog actief. Als inkomende gebeurtenissen en
antwoorden langer stil blijven dan de drempel voor de tick-time-out, sluit de client de
socket met code 4000, wijst elk verzoek in behandeling af en maakt opnieuw verbinding. De client
speelt afgewezen verzoeken na het opnieuw verbinden niet opnieuw af.
Verificatie
- Gateway-authenticatie met een gedeeld geheim gebruikt
connect.params.auth.tokenofconnect.params.auth.password, afhankelijk van de geconfigureerdegateway.auth.mode("none" | "token" | "password" | "trusted-proxy"). - Modi die identiteit bevatten, zoals Tailscale Serve (
gateway.auth.allowTailscale: true) of niet-loopback-gateway.auth.mode: "trusted-proxy", voldoen op basis van aanvraagheaders aan de authenticatiecontrole voor de verbinding, in plaats van viaconnect.params.auth.*. gateway.auth.mode: "none"voor privé-ingang slaat authenticatie met een gedeeld geheim bij het verbinden volledig over; stel die modus niet beschikbaar via een openbare/niet-vertrouwde ingang.- Na het koppelen geeft de Gateway een apparaattoken uit dat beperkt is tot de
verbindingsrol en -bereiken en wordt geretourneerd in
hello-ok.auth.deviceToken. Clients moeten dit na elke geslaagde verbinding opslaan. - Bij opnieuw verbinden met dat opgeslagen apparaattoken moet ook de opgeslagen goedgekeurde bereikenset voor dat token opnieuw worden gebruikt. Dit behoudt reeds verleende lees-/controle-/statustoegang en voorkomt dat nieuwe verbindingen ongemerkt worden beperkt tot een smaller impliciet bereik dat alleen voor beheerders bestemd is.
- Samenstelling van verbindingsauthenticatie aan clientzijde (
selectConnectAuthinpackages/gateway-client/src/client.ts):auth.passwordstaat hier los van en wordt altijd doorgestuurd wanneer het is ingesteld.auth.tokenwordt in deze prioriteitsvolgorde ingevuld: eerst een expliciet gedeeld token, vervolgens een explicietedeviceTokenen daarna een opgeslagen token per apparaat (metdeviceId+roleals sleutel).auth.bootstrapTokenwordt alleen verzonden wanneer geen van de bovenstaande optiesauth.tokenheeft opgeleverd. Een gedeeld token of elk gevonden apparaattoken onderdrukt dit.- Automatische promotie van een opgeslagen apparaattoken bij de eenmalige
nieuwe poging voor
AUTH_TOKEN_MISMATCHis uitsluitend toegestaan voor vertrouwde eindpunten: loopback ofwss://met een vastgezettetlsFingerprint. Openbarewss://zonder vastzetten komt niet in aanmerking.
- De ingebouwde bootstrap met installatiecode retourneert de
hello-ok.auth.deviceTokenvan de primaire Node plus een begrensd operatortoken inhello-ok.auth.deviceTokensvoor vertrouwde overdracht naar mobiele apparaten. Het operatortoken bevatoperator.talk.secretsvoor het lezen van de native Talk-configuratie, maar sluit bereiken voor koppelingswijzigingen enoperator.adminuit. - Terwijl een bootstrap met een niet-standaardinstallatiecode op goedkeuring wacht,
bevatten de details van
PAIRING_REQUIREDrecommendedNextStep: "wait_then_retry",retryable: trueenpauseReconnect: false. Blijf opnieuw verbinden met hetzelfde bootstraptoken totdat de aanvraag is goedgekeurd of het token ongeldig wordt. - Sla
hello-ok.auth.deviceTokensalleen op wanneer voor de verbinding bootstrap- authenticatie via een vertrouwd transport is gebruikt, zoalswss://of lokale koppeling/loopback. - Als een client een expliciete
deviceTokenof explicietescopesopgeeft, blijft die door de aanroeper aangevraagde bereikenset leidend; gecachte bereiken worden alleen hergebruikt wanneer de client het opgeslagen token per apparaat hergebruikt. - Apparaattokens kunnen worden geroteerd/ingetrokken via
device.token.rotateendevice.token.revoke(vereistoperator.pairing). Voor het roteren of intrekken van een Node of een andere niet-operatorrol is ookoperator.adminvereist. device.token.rotateretourneert rotatiemetadata. Het geeft het vervangende bearertoken alleen terug bij aanroepen vanaf hetzelfde apparaat die al met dat apparaattoken zijn geauthenticeerd, zodat clients die uitsluitend tokens gebruiken hun vervanging vóór het opnieuw verbinden kunnen opslaan. Rotaties door middel van gedeelde/beheerderstokens geven het bearertoken niet terug.- Uitgifte, rotatie en intrekking van tokens blijven beperkt tot de goedgekeurde rollenset die in de koppelingsvermelding van dat apparaat is vastgelegd; tokenwijzigingen kunnen geen apparaatrol uitbreiden of als doel kiezen die nooit via koppelingsgoedkeuring is verleend.
- Voor tokensessies van gekoppelde apparaten is apparaatbeheer beperkt tot het eigen apparaat, tenzij
de aanroeper ook
operator.adminheeft: niet-beheerders kunnen alleen het operatortoken voor hun eigen apparaatvermelding beheren. Tokenbeheer voor Nodes en andere niet-operatorrollen is uitsluitend voor beheerders, zelfs voor het eigen apparaat van de aanroeper. device.token.rotateendevice.token.revokecontroleren ook de bereikenset van het beoogde operatortoken aan de hand van de huidige sessiebereiken van de aanroeper. Niet-beheerders kunnen geen operatortoken roteren of intrekken dat ruimere bereiken heeft dan het token waarover ze al beschikken.- Authenticatiefouten bevatten
error.details.codeplus hersteltips:error.details.canRetryWithDeviceToken(booleaans)error.details.recommendedNextStep: een vanretry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration(packages/gateway-protocol/src/connect-error-details.ts).
- Clientgedrag voor
AUTH_TOKEN_MISMATCH:- Vertrouwde clients mogen één begrensde nieuwe poging doen met een gecacht token per apparaat.
- Als die nieuwe poging mislukt, stop dan automatische lussen voor opnieuw verbinden en toon aanwijzingen voor actie door de operator.
AUTH_SCOPE_MISMATCHbetekent dat het apparaattoken is herkend, maar niet de aangevraagde rol/bereiken dekt. Presenteer dit niet als een ongeldig token; vraag de operator opnieuw te koppelen of het smallere/ruimere bereikcontract goed te keuren.
Apparaatidentiteit en koppeling
- Nodes moeten een stabiele apparaatidentiteit (
device.id) bevatten die is afgeleid van de vingerafdruk van een sleutelpaar. - Gateways geven tokens uit per apparaat + rol.
- Voor nieuwe apparaat-ID's is koppelingsgoedkeuring vereist, tenzij lokale automatische goedkeuring is ingeschakeld.
- Automatische koppelingsgoedkeuring is gericht op directe lokale loopbackverbindingen.
- OpenClaw heeft ook een beperkt zelfverbindingspad dat lokaal is voor de backend/container, voor vertrouwde helperstromen met een gedeeld geheim.
- Tailnet- of LAN-verbindingen vanaf dezelfde host worden voor koppeling nog steeds als extern behandeld en vereisen goedkeuring.
- WS-clients nemen tijdens
connectnormaal gesproken de identiteitdeviceop (operator + Node). De enige uitzonderingen voor operators zonder apparaat zijn expliciete vertrouwenspaden:- geslaagde
gateway.auth.mode: "trusted-proxy"-operatorauthenticatie voor de Control UI. - directe loopback-
gateway-client-backend-RPC's op het gereserveerde interne helperpad.
- geslaagde
- Het weglaten van de apparaatidentiteit heeft gevolgen voor de bereiken. Wanneer een operatorverbinding
zonder apparaat via een expliciet vertrouwenspad wordt toegestaan, wist OpenClaw
zelf opgegeven bereiken nog steeds tot een lege set, tenzij dat pad een
benoemde uitzondering voor bereikbehoud heeft. Methoden waarvoor bereiken vereist zijn, mislukken vervolgens met
missing scope. - Het gereserveerde directe loopback-
gateway-client-backendhelperpad behoudt bereiken alleen voor interne lokale RPC's van het besturingsvlak; aangepaste backend-ID's krijgen deze uitzondering niet. - Alle verbindingen moeten de door de server verstrekte
connect.challenge-nonce ondertekenen.
Migratiediagnostiek voor apparaatauthenticatie
Voor verouderde clients die nog ondertekeningsgedrag van vóór de challenge gebruiken, retourneert connect
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 verzond een lege waarde). |
device nonce mismatch |
DEVICE_AUTH_NONCE_MISMATCH |
device-nonce-mismatch |
Client ondertekende met een verouderde/verkeerde nonce. |
device signature invalid |
DEVICE_AUTH_SIGNATURE_INVALID |
device-signature |
De ondertekeningspayload komt niet overeen met de v2-payload. |
device signature expired |
DEVICE_AUTH_SIGNATURE_EXPIRED |
device-signature-stale |
Het ondertekende tijdstempel valt buiten de toegestane afwijking. |
device identity mismatch |
DEVICE_AUTH_DEVICE_ID_MISMATCH |
device-id-mismatch |
device.id komt niet overeen met de vingerafdruk van de openbare sleutel. |
device public key invalid |
DEVICE_AUTH_PUBLIC_KEY_INVALID |
device-public-key |
De indeling/canonicalisatie van de openbare sleutel is mislukt. |
Migratiedoel:
- Wacht altijd op
connect.challenge. - Onderteken de v2-payload die de servernonce bevat.
- Verzend dezelfde nonce in
connect.params.device.nonce. - De voorkeurspayload voor ondertekening is
v3(buildDeviceAuthPayloadV3inpackages/gateway-client/src/device-auth.ts), die naast de velden voor apparaat/client/rol/bereiken/token/nonce ookplatformendeviceFamilybindt. - Verouderde
v2-handtekeningen blijven voor compatibiliteit geaccepteerd, maar het vastzetten van metadata van gekoppelde apparaten blijft bij opnieuw verbinden het opdrachtenbeleid bepalen.
TLS en vastzetten
- TLS wordt ondersteund voor WS-verbindingen (
gateway.tls-configuratie). - Clients kunnen optioneel de vingerafdruk van het Gateway-certificaat vastzetten via
gateway.remote.tlsFingerprintof CLI--tls-fingerprint.
Bereik
Dit protocol ontsluit de volledige Gateway-API: status, kanalen, modellen, chat,
agent, sessies, Nodes, goedkeuringen en meer. Het exacte oppervlak wordt bepaald door
de TypeBox-schema's die opnieuw worden geëxporteerd vanuit packages/gateway-protocol/src/schema.ts.