Gateway-Protokoll (WebSocket)
Das Gateway-WS-Protokoll ist die einzige Kontrollebene + der einzige Node-Transport für OpenClaw. Alle Clients (CLI, Web-UI, macOS-App, iOS/Android-Nodes, Headless- Nodes) verbinden sich über WebSocket und deklarieren ihre Rolle + ihren Geltungsbereich beim Handshake.Transport
- WebSocket, Text-Frames mit JSON-Payloads.
- Der erste Frame muss eine
connect-Anfrage sein.
Handshake (connect)
Gateway → Client (Pre-Connect-Challenge):
server, features, snapshot und policy sind laut Schema
(src/gateway/protocol/schema/frames.ts) alle erforderlich. canvasHostUrl ist optional. auth
meldet die ausgehandelte Rolle/die ausgehandelten Geltungsbereiche, wenn verfügbar, und enthält deviceToken,
wenn das Gateway eines ausstellt.
Wenn kein Device-Token ausgestellt wird, kann hello-ok.auth trotzdem die ausgehandelten
Berechtigungen melden:
hello-ok außerdem:
hello-ok.auth außerdem zusätzliche
begrenzte Rolleneinträge in deviceTokens enthalten:
scopes: [], und jedes übergebene Operator-Token bleibt auf die Bootstrap-
Operator-Allowlist begrenzt (operator.approvals, operator.read,
operator.talk.secrets, operator.write). Bootstrap-Geltungsbereichsprüfungen bleiben
rollenpräfixiert: Operator-Einträge erfüllen nur Operator-Anfragen, und Nicht-Operator-
Rollen benötigen weiterhin Geltungsbereiche unter ihrem eigenen Rollenpräfix.
Node-Beispiel
Framing
- Anfrage:
{type:"req", id, method, params} - Antwort:
{type:"res", id, ok, payload|error} - Ereignis:
{type:"event", event, payload, seq?, stateVersion?}
Rollen + Geltungsbereiche
Rollen
operator= Kontrollebenen-Client (CLI/UI/Automatisierung).node= Fähigkeits-Host (camera/screen/canvas/system.run).
Geltungsbereiche (Operator)
Häufige Geltungsbereiche:operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config mit includeSecrets: true erfordert operator.talk.secrets
(oder operator.admin).
Von Plugins registrierte Gateway-RPC-Methoden können ihren eigenen Operator-Geltungsbereich anfordern, aber
reservierte zentrale Admin-Präfixe (config.*, exec.approvals.*, wizard.*,
update.*) werden immer zu operator.admin aufgelöst.
Der Methodengeltungsbereich ist nur die erste Hürde. Einige Slash-Befehle, die über
chat.send erreicht werden, wenden darüber hinaus strengere Prüfungen auf Befehlsebene an. Zum Beispiel erfordern
persistente Schreibvorgänge mit /config set und /config unset operator.admin.
node.pair.approve hat zusätzlich zur
Basis-Methodenprüfung noch eine zusätzliche Geltungsbereichsprüfung zur Genehmigungszeit:
- Anfragen ohne Befehle:
operator.pairing - Anfragen mit Nicht-Exec-Node-Befehlen:
operator.pairing+operator.write - Anfragen, die
system.run,system.run.prepareodersystem.whichenthalten:operator.pairing+operator.admin
Caps/commands/permissions (Node)
Nodes deklarieren Fähigkeitsansprüche beiconnect:
caps: Kategorien auf hoher Ebene für Fähigkeiten.commands: Allowlist für Befehle beiinvoke.permissions: granulare Schalter (z. B.screen.record,camera.capture).
Presence
system-presencegibt Einträge zurück, die nach Geräteidentität verschlüsselt sind.- Presence-Einträge enthalten
deviceId,rolesundscopes, damit UIs eine einzelne Zeile pro Gerät anzeigen können, auch wenn es sowohl als operator als auch als node verbunden ist.
Häufige RPC-Methodenfamilien
Diese Seite ist kein generierter vollständiger Dump, aber die öffentliche WS-Oberfläche ist umfangreicher als die Handshake-/Auth-Beispiele oben. Dies sind die wichtigsten Methodenfamilien, die das Gateway derzeit bereitstellt.hello-ok.features.methods ist eine konservative Discovery-Liste, die aus
src/gateway/server-methods-list.ts plus geladenen Methodenexporten von Plugins/Kanälen erstellt wird.
Behandle sie als Funktions-Discovery, nicht als generierten Dump jeder aufrufbaren Hilfsfunktion,
die in src/gateway/server-methods/*.ts implementiert ist.
System und Identität
healthgibt den gecachten oder frisch geprüften Gateway-Health-Snapshot zurück.statusgibt die Gateway-Zusammenfassung im Stil von/statuszurück; sensible Felder werden nur für operator-Clients mit Admin-Geltungsbereich einbezogen.gateway.identity.getgibt die Gateway-Geräteidentität zurück, die für Relay- und Pairing-Abläufe verwendet wird.system-presencegibt den aktuellen Presence-Snapshot für verbundene Operator-/Node-Geräte zurück.system-eventhängt ein Systemereignis an und kann den Presence- Kontext aktualisieren/übertragen.last-heartbeatgibt das zuletzt persistierte Heartbeat-Ereignis zurück.set-heartbeatsschaltet die Heartbeat-Verarbeitung auf dem Gateway um.
Modelle und Nutzung
models.listgibt den zur Laufzeit zulässigen Modellkatalog zurück.usage.statusgibt Zusammenfassungen zu Nutzungsfenstern/verbleibendem Kontingent des Providers zurück.usage.costgibt aggregierte Zusammenfassungen der Kostennutzung für einen Datumsbereich zurück.doctor.memory.statusgibt den Bereitschaftsstatus von Vektorspeicher/Einbettungen für den aktiven Standard-Agent-Workspace zurück.sessions.usagegibt Nutzungszusammenfassungen pro Sitzung zurück.sessions.usage.timeseriesgibt Zeitreihennutzung für eine Sitzung zurück.sessions.usage.logsgibt Nutzungslokaleinträge für eine Sitzung zurück.
Kanäle und Login-Hilfen
channels.statusgibt Statuszusammenfassungen für integrierte und gebündelte Kanäle/Plugins zurück.channels.logoutmeldet ein bestimmtes Kanal-/Konto ab, wenn der Kanal Logout unterstützt.web.login.startstartet einen QR-/Web-Login-Ablauf für den aktuellen QR-fähigen Web- Kanal-Provider.web.login.waitwartet darauf, dass dieser QR-/Web-Login-Ablauf abgeschlossen wird, und startet bei Erfolg den Kanal.push.testsendet einen APNs-Test-Push an einen registrierten iOS-Node.voicewake.getgibt die gespeicherten Wake-Word-Trigger zurück.voicewake.setaktualisiert Wake-Word-Trigger und überträgt die Änderung.
Nachrichten und Logs
sendist die direkte Outbound-Delivery-RPC für Kanal-/Konto-/Thread-zielgerichtete Sendevorgänge außerhalb des Chat-Runners.logs.tailgibt den konfigurierten Gateway-Dateilog-Tail mit Cursor/Limit und Steuerelementen für maximale Bytes zurück.
Talk und TTS
talk.configgibt die effektive Talk-Konfigurations-Payload zurück;includeSecretserfordertoperator.talk.secrets(oderoperator.admin).talk.modesetzt/überträgt den aktuellen Talk-Modus-Zustand für WebChat-/Control-UI- Clients.talk.speaksynthetisiert Sprache über den aktiven Talk-Sprach-Provider.tts.statusgibt den Aktivierungsstatus von TTS, den aktiven Provider, Fallback-Provider und den Provider-Konfigurationsstatus zurück.tts.providersgibt das sichtbare TTS-Provider-Inventar zurück.tts.enableundtts.disableschalten den TTS-Präferenzstatus um.tts.setProvideraktualisiert den bevorzugten TTS-Provider.tts.convertführt eine einmalige Text-zu-Sprache-Konvertierung aus.
Secrets, Konfiguration, Update und Assistent
secrets.reloadlöst aktive SecretRefs erneut auf und tauscht den Laufzeit-Secret-Status nur bei vollständigem Erfolg aus.secrets.resolvelöst zielgerichtete Secret-Zuweisungen für einen bestimmten Befehl/Zielsatz auf.config.getgibt den aktuellen Konfigurations-Snapshot und Hash zurück.config.setschreibt eine validierte Konfigurations-Payload.config.patchführt ein Merge eines partiellen Konfigurations-Updates aus.config.applyvalidiert und ersetzt die vollständige Konfigurations-Payload.config.schemagibt die Live-Konfigurationsschema-Payload zurück, die von Control UI und CLI-Tooling verwendet wird: Schema,uiHints, Version und Generierungsmetadaten, einschließlich Plugin- und Kanal-Schema-Metadaten, wenn die Laufzeit sie laden kann. Das Schema enthält Feldmetadatentitle/description, die von denselben Labels und Hilfetexten abgeleitet werden, die von der UI verwendet werden, einschließlich verschachtelter Objekt-, Wildcard-, Array-Item- undanyOf/oneOf/allOf-Verzweigungen für Zusammensetzungen, wenn passende Felddokumentation vorhanden ist.config.schema.lookupgibt eine pfadbezogene Lookup-Payload für einen Konfigurationspfad zurück: normalisierter Pfad, ein flacher Schemaknoten, ein abgeglichener Hinweis +hintPathund Zusammenfassungen unmittelbarer untergeordneter Elemente für Drill-downs in UI/CLI.- Lookup-Schemaknoten behalten die benutzerorientierte Dokumentation und gängige Validierungsfelder:
title,description,type,enum,const,format,pattern, numerische/String-/Array-/Objektgrenzen und boolesche Flags wieadditionalProperties,deprecated,readOnly,writeOnly. - Zusammenfassungen untergeordneter Elemente stellen
key, normalisiertenpath,type,required,hasChildrensowie den abgeglichenenhint/hintPathbereit.
- Lookup-Schemaknoten behalten die benutzerorientierte Dokumentation und gängige Validierungsfelder:
update.runführt den Gateway-Update-Ablauf aus und plant einen Neustart nur dann, wenn das Update selbst erfolgreich war.wizard.start,wizard.next,wizard.statusundwizard.cancelstellen den Onboarding-Assistenten über WS-RPC bereit.
Vorhandene große Familien
Agent- und Workspace-Hilfen
agents.listgibt konfigurierte Agent-Einträge zurück.agents.create,agents.updateundagents.deleteverwalten Agent-Datensätze und Workspace-Verkabelung.agents.files.list,agents.files.getundagents.files.setverwalten die exponierten Bootstrap-Workspace-Dateien für einen Agenten.agent.identity.getgibt die effektive Assistant-Identität für einen Agenten oder eine Sitzung zurück.agent.waitwartet darauf, dass ein Lauf abgeschlossen wird, und gibt den terminalen Snapshot zurück, wenn verfügbar.
Sitzungssteuerung
sessions.listgibt den aktuellen Sitzungsindex zurück.sessions.subscribeundsessions.unsubscribeschalten Abonnements für Sitzungsänderungsereignisse für den aktuellen WS-Client um.sessions.messages.subscribeundsessions.messages.unsubscribeschalten Abonnements für Transkript-/Nachrichtenereignisse für eine Sitzung um.sessions.previewgibt begrenzte Transkriptvorschauen für bestimmte Sitzungs- Schlüssel zurück.sessions.resolvelöst ein Sitzungsziel auf oder kanonisiert es.sessions.createerstellt einen neuen Sitzungseintrag.sessions.sendsendet eine Nachricht in eine bestehende Sitzung.sessions.steerist die Interrupt-und-Steuern-Variante für eine aktive Sitzung.sessions.abortbricht aktive Arbeit für eine Sitzung ab.sessions.patchaktualisiert Sitzungsmetadaten/-überschreibungen.sessions.reset,sessions.deleteundsessions.compactführen Sitzungs- Wartung aus.sessions.getgibt die vollständige gespeicherte Sitzungszeile zurück.- Die Chat-Ausführung verwendet weiterhin
chat.history,chat.send,chat.abortundchat.inject. chat.historyist für UI-Clients anzeigennormalisiert: Inline-Direktiv-Tags werden aus sichtbarem Text entfernt, XML-Payloads für Tool-Aufrufe im Klartext (einschließlich<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>und abgeschnittener Tool-Call-Blöcke) sowie durchgesickerte ASCII-/Vollbreiten- Modell-Steuertokens werden entfernt, reine stille-Token-Assistant-Zeilen wie exaktesNO_REPLY/no_replywerden ausgelassen, und übergroße Zeilen können durch Platzhalter ersetzt werden.
Geräte-Pairing und Geräte-Tokens
device.pair.listgibt ausstehende und genehmigte gepairte Geräte zurück.device.pair.approve,device.pair.rejectunddevice.pair.removeverwalten Datensätze für Geräte-Pairing.device.token.rotaterotiert ein gepaartes Geräte-Token innerhalb seiner genehmigten Rollen- und Geltungsbereichsgrenzen.device.token.revokewiderruft ein gepaartes Geräte-Token.
Node-Pairing, Invoke und ausstehende Arbeit
node.pair.request,node.pair.list,node.pair.approve,node.pair.rejectundnode.pair.verifydecken Node-Pairing und Bootstrap- Verifizierung ab.node.listundnode.describegeben den bekannten/verbundenen Node-Status zurück.node.renameaktualisiert ein Label für einen gepaarten Node.node.invokeleitet einen Befehl an einen verbundenen Node weiter.node.invoke.resultgibt das Ergebnis für eine Invoke-Anfrage zurück.node.eventtransportiert von Nodes ausgehende Ereignisse zurück ins Gateway.node.canvas.capability.refreshaktualisiert bereichsbezogene Canvas-Fähigkeitstokens.node.pending.pullundnode.pending.acksind die Queue-APIs für verbundene Nodes.node.pending.enqueueundnode.pending.drainverwalten dauerhafte ausstehende Arbeit für offline/getrennte Nodes.
Genehmigungsfamilien
exec.approval.request,exec.approval.get,exec.approval.listundexec.approval.resolvedecken einmalige Exec-Genehmigungsanfragen sowie ausstehende Genehmigungssuche/-wiedergabe ab.exec.approval.waitDecisionwartet auf eine ausstehende Exec-Genehmigung und gibt die endgültige Entscheidung zurück (odernullbei Zeitüberschreitung).exec.approvals.getundexec.approvals.setverwalten Snapshots der Gateway-Exec- Genehmigungsrichtlinie.exec.approvals.node.getundexec.approvals.node.setverwalten die Node-lokale Exec- Genehmigungsrichtlinie über Node-Relay-Befehle.plugin.approval.request,plugin.approval.list,plugin.approval.waitDecisionundplugin.approval.resolvedecken von Plugins definierte Genehmigungsabläufe ab.
Andere große Familien
- Automatisierung:
wakeplant eine sofortige oder beim nächsten Heartbeat erfolgende Wake-Text-Injektioncron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runs
- Skills/Tools:
commands.list,skills.*,tools.catalog,tools.effective
Häufige Ereignisfamilien
chat: UI-Chat-Updates wiechat.injectund andere nur das Transkript betreffende Chat- Ereignisse.session.messageundsession.tool: Updates des Transkripts/Ereignisstreams für eine abonnierte Sitzung.sessions.changed: Sitzungsindex oder Metadaten wurden geändert.presence: Updates des System-Presence-Snapshots.tick: periodisches Keepalive-/Liveness-Ereignis.health: Update des Gateway-Health-Snapshots.heartbeat: Update des Heartbeat-Ereignisstreams.cron: Änderungsereignis für Cron-Lauf/Job.shutdown: Benachrichtigung über Gateway-Shutdown.node.pair.requested/node.pair.resolved: Lebenszyklus des Node-Pairings.node.invoke.request: Broadcast einer Node-Invoke-Anfrage.device.pair.requested/device.pair.resolved: Lebenszyklus gepaarter Geräte.voicewake.changed: Konfiguration der Wake-Word-Trigger wurde geändert.exec.approval.requested/exec.approval.resolved: Lebenszyklus der Exec- Genehmigung.plugin.approval.requested/plugin.approval.resolved: Lebenszyklus der Plugin- Genehmigung.
Node-Hilfsmethoden
- Nodes können
skills.binsaufrufen, um die aktuelle Liste der ausführbaren Skill-Dateien für Auto-Allow-Prüfungen abzurufen.
Operator-Hilfsmethoden
- Operatoren können
commands.list(operator.read) aufrufen, um das Laufzeit- Befehlsinventar für einen Agenten abzurufen.agentIdist optional; lasse es weg, um den Standard-Agent-Workspace zu lesen.scopesteuert, auf welche Oberfläche sich der primärenamebezieht:textgibt das primäre Text-Befehlstoken ohne führendes/zurücknativeund der Standardpfadbothgeben providerbewusste native Namen zurück, wenn verfügbar
textAliasesenthält exakte Slash-Aliasse wie/modelund/m.nativeNameenthält den providerbewussten nativen Befehlsnamen, wenn ein solcher existiert.providerist optional und beeinflusst nur native Benennung sowie native Plugin- Befehlsverfügbarkeit.includeArgs=falselässt serialisierte Argumentmetadaten in der Antwort weg.
- Operatoren können
tools.catalog(operator.read) aufrufen, um den Laufzeit-Toolkatalog für einen Agenten abzurufen. Die Antwort enthält gruppierte Tools und Provenienzmetadaten:source:coreoderpluginpluginId: Plugin-Eigentümer, wennsource="plugin"optional: ob ein Plugin-Tool optional ist
- Operatoren können
tools.effective(operator.read) aufrufen, um das zur Laufzeit effektive Tool- Inventar für eine Sitzung abzurufen.sessionKeyist erforderlich.- Das Gateway leitet vertrauenswürdigen Laufzeitkontext serverseitig aus der Sitzung ab, statt vom Aufrufer bereitgestellten Auth- oder Delivery-Kontext zu akzeptieren.
- Die Antwort ist sitzungsbezogen und spiegelt wider, was die aktive Unterhaltung derzeit verwenden kann, einschließlich Core-, Plugin- und Channel-Tools.
- Operatoren können
skills.status(operator.read) aufrufen, um das sichtbare Skill-Inventar für einen Agenten abzurufen.agentIdist optional; lasse es weg, um den Standard-Agent-Workspace zu lesen.- Die Antwort enthält Eignung, fehlende Anforderungen, Konfigurationsprüfungen und bereinigte Installationsoptionen, ohne rohe Secret-Werte offenzulegen.
- Operatoren können
skills.searchundskills.detail(operator.read) für ClawHub-Discovery-Metadaten aufrufen. - Operatoren können
skills.install(operator.admin) in zwei Modi aufrufen:- ClawHub-Modus:
{ source: "clawhub", slug, version?, force? }installiert einen Skill-Ordner in das Verzeichnisskills/des Standard-Agent-Workspaces. - Gateway-Installer-Modus:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }führt eine deklariertemetadata.openclaw.install-Aktion auf dem Gateway-Host aus.
- ClawHub-Modus:
- Operatoren können
skills.update(operator.admin) in zwei Modi aufrufen:- Der ClawHub-Modus aktualisiert einen verfolgten Slug oder alle verfolgten ClawHub-Installationen im Standard-Agent-Workspace.
- Der Konfigurationsmodus patched Werte unter
skills.entries.<skillKey>wieenabled,apiKeyundenv.
Exec-Genehmigungen
- Wenn eine Exec-Anfrage genehmigt werden muss, sendet das Gateway
exec.approval.requested. - Operator-Clients lösen dies durch Aufruf von
exec.approval.resolve(erfordert den Geltungsbereichoperator.approvals). - Für
host=nodemussexec.approval.requestsystemRunPlanenthalten (kanonischeargv/cwd/rawCommand/Sitzungsmetadaten). Anfragen ohnesystemRunPlanwerden abgelehnt. - Nach der Genehmigung verwenden weitergeleitete
node.invoke system.run-Aufrufe dieses kanonischesystemRunPlanerneut als maßgeblichen Befehl-/cwd-/Sitzungskontext. - Wenn ein Aufrufer
command,rawCommand,cwd,agentIdodersessionKeyzwischen der Vorbereitung und der endgültigen genehmigtensystem.run-Weiterleitung verändert, lehnt das Gateway den Lauf ab, statt der veränderten Payload zu vertrauen.
Fallback für Agent-Delivery
agent-Anfragen könnendeliver=trueenthalten, um Outbound-Delivery anzufordern.bestEffortDeliver=falsebehält striktes Verhalten bei: nicht auflösbare oder nur intern nutzbare Delivery-Ziele gebenINVALID_REQUESTzurück.bestEffortDeliver=trueerlaubt einen Fallback auf reine Sitzungsausführung, wenn keine externe zustellbare Route aufgelöst werden kann (zum Beispiel interne/WebChat-Sitzungen oder mehrdeutige Multi-Channel-Konfigurationen).
Versionierung
PROTOCOL_VERSIONbefindet sich insrc/gateway/protocol/schema/protocol-schemas.ts.- Clients senden
minProtocol+maxProtocol; der Server lehnt Abweichungen ab. - Schemas + Modelle werden aus TypeBox-Definitionen generiert:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Client-Konstanten
Der Referenzclient insrc/gateway/client.ts verwendet diese Standardwerte. Die Werte sind
über Protokoll-v3 hinweg stabil und bilden die erwartete Basis für Drittanbieter-Clients.
| Konstante | Standardwert | Quelle |
|---|---|---|
PROTOCOL_VERSION | 3 | src/gateway/protocol/schema/protocol-schemas.ts |
| Anforderungs-Timeout (pro RPC) | 30_000 ms | src/gateway/client.ts (requestTimeoutMs) |
| Preauth-/Connect-Challenge-Timeout | 10_000 ms | src/gateway/handshake-timeouts.ts (Clamp 250–10_000) |
| Initialer Reconnect-Backoff | 1_000 ms | src/gateway/client.ts (backoffMs) |
| Maximaler Reconnect-Backoff | 30_000 ms | src/gateway/client.ts (scheduleReconnect) |
| Fast-Retry-Clamp nach Device-Token-Close | 250 ms | src/gateway/client.ts |
Force-Stop-Schonfrist vor terminate() | 250 ms | FORCE_STOP_TERMINATE_GRACE_MS |
Standard-Timeout für stopAndWait() | 1_000 ms | STOP_AND_WAIT_TIMEOUT_MS |
Standard-Tick-Intervall (vor hello-ok) | 30_000 ms | src/gateway/client.ts |
| Tick-Timeout-Close | Code 4000, wenn Stille tickIntervalMs * 2 überschreitet | src/gateway/client.ts |
MAX_PAYLOAD_BYTES | 25 * 1024 * 1024 (25 MB) | src/gateway/server-constants.ts |
policy.tickIntervalMs, policy.maxPayload
und policy.maxBufferedBytes in hello-ok an; Clients sollten diese Werte
statt der Standardwerte vor dem Handshake beachten.
Auth
- Shared-Secret-Gateway-Auth verwendet
connect.params.auth.tokenoderconnect.params.auth.password, abhängig vom konfigurierten Auth-Modus. - Identitätstragende Modi wie Tailscale Serve
(
gateway.auth.allowTailscale: true) oder nicht-loopbackgateway.auth.mode: "trusted-proxy"erfüllen die Connect-Auth-Prüfung über Request-Header statt überconnect.params.auth.*. gateway.auth.mode: "none"für privaten Ingress überspringt Shared-Secret-Connect-Auth vollständig; diesen Modus nicht auf öffentlichem/nicht vertrauenswürdigem Ingress bereitstellen.- Nach dem Pairing stellt das Gateway ein Geräte-Token aus, das auf die Verbindungs-
Rolle + Geltungsbereiche beschränkt ist. Es wird in
hello-ok.auth.deviceTokenzurückgegeben und sollte vom Client für zukünftige Verbindungen persistiert werden. - Clients sollten das primäre
hello-ok.auth.deviceTokennach jeder erfolgreichen Verbindung persistieren. - Beim Wiederverbinden mit diesem gespeicherten Geräte-Token sollte auch der gespeicherte genehmigte Geltungsbereichssatz für dieses Token wiederverwendet werden. Dadurch bleibt bereits gewährter Lese-/Probe-/Status-Zugriff erhalten und es wird vermieden, dass Wiederverbindungen stillschweigend auf einen engeren impliziten Admin-only-Geltungsbereich zusammenfallen.
- Client-seitige Zusammenstellung der Connect-Auth (
selectConnectAuthinsrc/gateway/client.ts):auth.passwordist orthogonal und wird immer weitergeleitet, wenn es gesetzt ist.auth.tokenwird in folgender Prioritätsreihenfolge befüllt: zuerst explizites Shared-Token, dann ein explizitesdeviceToken, dann ein gespeichertes gerätespezifisches Token (indiziert nachdeviceId+role).auth.bootstrapTokenwird nur gesendet, wenn keines der oben genannten einauth.tokenaufgelöst hat. Ein Shared-Token oder ein aufgelöstes Geräte-Token unterdrückt es.- Die automatische Hochstufung eines gespeicherten Geräte-Tokens beim einmaligen
AUTH_TOKEN_MISMATCH-Retry ist auf nur vertrauenswürdige Endpunkte beschränkt — loopback oderwss://mit angeheftetemtlsFingerprint. Öffentlicheswss://ohne Pinning qualifiziert sich nicht.
- Zusätzliche Einträge in
hello-ok.auth.deviceTokenssind Bootstrap-Handoff-Tokens. Persistiere sie nur, wenn die Verbindung Bootstrap-Auth über einen vertrauenswürdigen Transport wiewss://oder loopback/local pairing verwendet hat. - Wenn ein Client ein explizites
deviceTokenoder explizitescopesangibt, bleibt dieser vom Aufrufer angeforderte Geltungsbereichssatz maßgeblich; gecachte Geltungsbereiche werden nur wiederverwendet, wenn der Client das gespeicherte gerätespezifische Token wiederverwendet. - Geräte-Tokens können über
device.token.rotateunddevice.token.revokerotiert/widerrufen werden (erfordert den Geltungsbereichoperator.pairing). - Ausgabe/Rotation von Tokens bleibt auf den genehmigten Rollensatz beschränkt, der im Pairing-Eintrag dieses Geräts gespeichert ist; das Rotieren eines Tokens kann das Gerät nicht in eine Rolle erweitern, die durch die Pairing-Genehmigung nie gewährt wurde.
- Für gepaarte Geräte-Token-Sitzungen ist die Geräteverwaltung auf das eigene Gerät beschränkt, es sei denn, der
Aufrufer hat zusätzlich
operator.admin: Nicht-Admin-Aufrufer können nur ihren eigenen Geräteeintrag entfernen/widerrufen/rotieren. device.token.rotateprüft außerdem den angeforderten Operator-Geltungsbereichssatz gegen die aktuellen Sitzungs-Geltungsbereiche des Aufrufers. Nicht-Admin-Aufrufer können ein Token nicht in einen weiter gefassten Operator-Geltungsbereichssatz rotieren, als sie bereits besitzen.- Auth-Fehler enthalten
error.details.codeplus Hinweise zur Wiederherstellung:error.details.canRetryWithDeviceToken(Boolean)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
- Client-Verhalten für
AUTH_TOKEN_MISMATCH:- Vertrauenswürdige Clients können einen begrenzten Retry mit einem gecachten gerätespezifischen Token versuchen.
- Wenn dieser Retry fehlschlägt, sollten Clients automatische Wiederverbindungsschleifen beenden und Hinweise für Maßnahmen durch den Operator anzeigen.
Geräteidentität + Pairing
- Nodes sollten eine stabile Geräteidentität (
device.id) angeben, die von einem Schlüsselpaar-Fingerprint abgeleitet ist. - Gateways stellen Tokens pro Gerät + Rolle aus.
- Pairing-Genehmigungen sind für neue Geräte-IDs erforderlich, es sei denn, lokale automatische Genehmigung ist aktiviert.
- Die automatische Pairing-Genehmigung ist auf direkte lokale loopback-Verbindungen ausgerichtet.
- OpenClaw hat außerdem einen engen Backend-/container-lokalen Self-Connect-Pfad für vertrauenswürdige Shared-Secret-Helferabläufe.
- Tailnet- oder LAN-Verbindungen auf demselben Host werden weiterhin als remote behandelt und erfordern Pairing-Genehmigung.
- Alle WS-Clients müssen beim
connectdiedevice-Identität angeben (operator + node). Control UI kann sie nur in diesen Modi weglassen:gateway.controlUi.allowInsecureAuth=truefür localhost-only inkompatible HTTP-Kompatibilität.- erfolgreiche
gateway.auth.mode: "trusted-proxy"-Operator-Control-UI-Auth. gateway.controlUi.dangerouslyDisableDeviceAuth=true(Notfallmaßnahme, erhebliche Sicherheitsverschlechterung).
- Alle Verbindungen müssen die vom Server bereitgestellte
connect.challenge-Nonce signieren.
Migrationsdiagnosen für Geräte-Auth
Für Legacy-Clients, die weiterhin Verhalten mit Signierung vor der Challenge verwenden, gibtconnect jetzt
DEVICE_AUTH_*-Detailcodes unter error.details.code mit einem stabilen error.details.reason zurück.
Häufige Migrationsfehler:
| Nachricht | details.code | details.reason | Bedeutung |
|---|---|---|---|
device nonce required | DEVICE_AUTH_NONCE_REQUIRED | device-nonce-missing | Client hat device.nonce weggelassen (oder leer gesendet). |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | Client hat mit einer veralteten/falschen Nonce signiert. |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | Signatur-Payload stimmt nicht mit der v2-Payload überein. |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | Signierter Zeitstempel liegt außerhalb der zulässigen Abweichung. |
device identity mismatch | DEVICE_AUTH_DEVICE_ID_MISMATCH | device-id-mismatch | device.id stimmt nicht mit dem Public-Key-Fingerprint überein. |
device public key invalid | DEVICE_AUTH_PUBLIC_KEY_INVALID | device-public-key | Public-Key-Format/Kanonisierung ist fehlgeschlagen. |
- Immer auf
connect.challengewarten. - Die v2-Payload signieren, die die Server-Nonce enthält.
- Dieselbe Nonce in
connect.params.device.noncesenden. - Bevorzugte Signatur-Payload ist
v3, die zusätzlich zu device/client/role/scopes/token/nonce-Feldern auchplatformunddeviceFamilybindet. - Legacy-
v2-Signaturen bleiben aus Kompatibilitätsgründen akzeptiert, aber das Anheften gepaarter Geräte- Metadaten steuert weiterhin die Befehlsrichtlinie bei Wiederverbindungen.
TLS + Pinning
- TLS wird für WS-Verbindungen unterstützt.
- Clients können optional den Gateway-Zertifikats-Fingerprint anheften (siehe
gateway.tls- Konfiguration plusgateway.remote.tlsFingerprintoder CLI--tls-fingerprint).
Geltungsbereich
Dieses Protokoll stellt die vollständige Gateway-API bereit (Status, Kanäle, Modelle, Chat, Agent, Sitzungen, Nodes, Genehmigungen usw.). Die genaue Oberfläche ist durch die TypeBox-Schemas insrc/gateway/protocol/schema.ts definiert.