Gateway
Gateway-Protokoll
Das Gateway-WS-Protokoll ist die zentrale Steuerungsebene und der Node-Transport für OpenClaw. Operator- und Node-Clients (CLI, Web-UI, macOS-App, iOS-/Android-Nodes, headless Nodes) stellen eine Verbindung über WebSocket her und deklarieren beim Handshake eine Rolle und einen Scope.
npm-Pakete
Diese Pakete werden mit den OpenClaw-Release-Zyklen ausgeliefert. Während der anfänglichen Einführung
kann npm E404 zurückgeben, bis das erste Release mit diesen Paketen veröffentlicht wurde.
@openclaw/gateway-protocolveröffentlicht die Schemas, Validatoren, TypeScript-Typen, schlanken Frame- und Fehler- Hilfsfunktionen sowie Versionskonstanten. Das Tarball enthält den generiertenprotocol.schema.jsonmaschinenlesbaren Vertrag.@openclaw/gateway-clientveröffentlicht den Referenz-Node-Client und einen browsersicheren Einstiegspunkt unter@openclaw/gateway-client/browser.
Hinweise zum Anwendungslebenszyklus finden Sie unter Gateway-Client erstellen. Informationen zu Apps, die das Gateway als untergeordneten Prozess überwachen, finden Sie unter OpenClaw einbetten.
Transport und Framing
- WebSocket, Text-Frames, JSON-Nutzdaten.
- Der erste Frame muss eine
connect-Anfrage sein. - Frames vor dem Verbindungsaufbau sind auf 64 KiB (
MAX_PREAUTH_PAYLOAD_BYTES) begrenzt. Nach dem Handshake geltenhello-ok.policy.maxPayloadundhello-ok.policy.maxBufferedBytes. Bei aktivierter Diagnose lösen übergroße eingehende Frames und langsame ausgehende Pufferpayload.large-Ereignisse aus, bevor das Gateway die Verbindung schließt oder den Frame verwirft. Diese Ereignisse enthaltensurface, Byte- Größen, Grenzwerte und einen sicheren Ursachencode, jedoch niemals Nachrichteninhalte, Inhalte von Anhängen, rohe Frame-Bytes, Tokens, Cookies oder Geheimnisse.
Frame-Formen:
- Anfrage:
{type:"req", id, method, params} - Antwort:
{type:"res", id, ok, payload|error} - Ereignis:
{type:"event", event, payload, seq?, stateVersion?}
Antwortfehler verwenden { code, message, details?, retryable?, retryAfterMs? }.
Clients sollten anhand von code und details.code verzweigen; message bleibt menschenlesbar
und kann sich ändern, sofern ein Kompatibilitätshinweis nichts anderes angibt. Autorisierungsfehler
auf Methodenebene verwenden das code: "FORBIDDEN"-Feld auf oberster Ebene mit strukturierten
Details zu fehlenden Scopes:
- Fehlender Scope:
{ code: "MISSING_SCOPE", missingScope, requiredScopes }.requiredScopesist die vollständige Menge bekannter Scopes für den angeforderten Vorgang. Die altemissing scope: <scope>-Meldung bleibt für ältere Clients erhalten.
Clients sollten zuerst details lesen und die alte Meldung nur als Kompatibilitäts-
Fallback verwenden. readMissingScopeError und readMissingScopeErrorDetails werden aus
@openclaw/gateway-protocol/gateway-error-details exportiert; der browsersichere Gateway-Client
exportiert sie erneut aus @openclaw/gateway-client/browser.
Die Schemas werden als GatewayErrorDetailsSchema,
MissingScopeErrorDetailsSchema aus @openclaw/gateway-protocol/schema exportiert.
HTTP-Scope-Fehler spiegeln das MISSING_SCOPE-Objekt unter error.details wider und
verwenden den HTTP-Status 403.
Methoden mit Nebenwirkungen erfordern Idempotenzschlüssel (siehe Schema).
Handshake
Das Gateway sendet vor dem Verbindungsaufbau eine Challenge:
{ "type": "event", "event": "connect.challenge", "payload": { "nonce": "…", "ts": 1737264000000 }}Der Client antwortet mit 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": "…" } }}Das Gateway antwortet mit 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 und auth sind gemäß
HelloOkSchema (packages/gateway-protocol/src/schema/frames.ts) alle erforderlich. auth
meldet die ausgehandelte Rolle und die ausgehandelten Scopes, selbst wenn kein Geräte-Token ausgegeben wird (Form
siehe oben). pluginSurfaceUrls ist optional und ordnet Plugin-Oberflächennamen (z. B.
canvas) URLs mit Scope für gehostete Inhalte zu; der Eintrag kann ablaufen, daher rufen Nodes
node.pluginSurface.refresh mit { "surface": "canvas" } auf, um einen neuen Eintrag zu erhalten.
Der veraltete Pfad canvasHostUrl / canvasCapability / node.canvas.capability.refresh
wird nicht unterstützt; verwenden Sie Plugin-Oberflächen.
Das optionale appliedConfigHash des Snapshots ist die aufgelöste Revision der Quellkonfiguration,
die von der aktiven Gateway-Laufzeit akzeptiert wurde. Clients können sie mit
config.get.configRevisionHash vergleichen, um festzustellen, ob eine neuere gespeicherte Konfiguration weiterhin
einen Neustart erfordert. config.get.hash bleibt die rohe Revision der Stammdatei, die von
Konfliktsicherungen beim Schreiben der Konfiguration verwendet wird.
Während das Gateway den Start seiner Sidecars noch abschließt, kann connect einen
wiederholbaren UNAVAILABLE-Fehler mit details.reason: "startup-sidecars" und
retryAfterMs zurückgeben. Wiederholen Sie den Vorgang innerhalb Ihres Verbindungsbudgets, statt dies als
endgültigen Handshake-Fehler zu behandeln.
Wenn ein Geräte-Token ausgegeben wird, fügt hello-ok.auth es hinzu:
{ "auth": { "deviceToken": "…", "role": "operator", "scopes": ["operator.read", "operator.write"] }}Der integrierte Bootstrap über QR-/Einrichtungscode ist ein Übergabepfad für Mobilgeräte. Eine erfolgreiche Basisverbindung per Einrichtungscode gibt ein primäres Node-Token sowie ein eingeschränktes Operator-Token zurück:
{ "auth": { "deviceToken": "…", "role": "node", "scopes": [], "deviceTokens": [ { "deviceToken": "…", "role": "operator", "scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"] } ] }}Diese Operator-Übergabe ist absichtlich eingeschränkt: Sie reicht aus, um die mobile
Operator-Schleife und die native Einrichtung zu starten, einschließlich operator.talk.secrets für Lesevorgänge
der Talk-Konfiguration, enthält jedoch keine Scopes für Pairing-Änderungen und kein operator.admin. Umfassenderer
Pairing-/Administratorzugriff erfordert einen separaten genehmigten Pairing- oder Token-Ablauf. Speichern Sie
hello-ok.auth.deviceTokens nur dauerhaft, wenn die Bootstrap-Authentifizierung über einen vertrauenswürdigen
Transport erfolgte (wss:// oder Loopback/lokales Pairing).
Vertrauenswürdige Backend-Clients im selben Prozess (client.id: "gateway-client",
client.mode: "backend") dürfen device bei direkten Loopback-Verbindungen weglassen, wenn sie
sich mit dem gemeinsam genutzten Gateway-Token/-Passwort authentifizieren. Dieser Pfad ist
internen RPCs der Steuerungsebene vorbehalten (z. B. Sitzungsaktualisierungen von Subagenten) und verhindert,
dass veraltete CLI-/Geräte-Pairing-Baselines lokale Backend-Arbeit blockieren. Entfernte,
aus Browsern stammende, Node- sowie explizite Geräte-Token-/Geräteidentitäts-Clients durchlaufen weiterhin
die normalen Pairing- und Scope-Upgrade-Prüfungen.
Worker-Rolle und geschlossenes Protokoll
Cloud-Worker verwenden einen dedizierten Loopback-Eingang durch den Gateway-eigenen,
per Hostschlüssel fixierten SSH-Tunnel. Er akzeptiert ausschließlich Worker-Identitäten und leitet niemals
allgemeine Authentifizierung, Node-Ereignisse, Operator-RPCs oder Plugin-Methoden weiter. Ein striktes connect
verifiziert einen im Ruhezustand gehashten, kurzlebigen Berechtigungsnachweis, der an die Umgebung, den Bundle-
Hash, die Eigentümerepoche, die RPC-Satzversion, das Ablaufdatum und eine nullable Sitzung gebunden ist; zusätzlich
werden die aktuelle Version und der Funktionsumfang separat geprüft. Bei Erfolg wird ein minimales
worker-hello-ok zurückgegeben; die Funktionsaushandlung ist von der allgemeinen Protokollversion
unabhängig. Frames bleiben unter 64 KiB, mit Ausnahme eines ausgehandelten worker.inference.start-
Frames, der bis zu 25 MiB groß sein darf. Die geschlossene Positivliste enthält worker.heartbeat,
worker.transcript.commit, worker.live-event, worker.inference.start und
worker.inference.cancel.
Transkript-Commits verwenden Fencing anhand der Eigentümerepoche, eine Gateway-eigene Sitzungsbindung, Compare-and-Swap des Basisblatts und dauerhafte Sequenzwiedergabe; das Gateway erzeugt Transkripteintrags- und übergeordnete IDs über den normalen Sitzungsschreiber. Eigentümerschaft und Ablauf werden bei jedem RPC erneut geprüft.
Client-Fähigkeiten
Operator-Clients können in connect.params.caps optionale Fähigkeiten ankündigen:
tool-events: akzeptiert strukturierte Ereignisse zum Lebenszyklus von Tools.inline-widgets: kann Ergebnisse gehosteter Inline-Widget-Tools darstellen.
Client-Fähigkeiten beschreiben den verbundenen Client, nicht die Autorisierung. Agent-Tools können erforderliche Fähigkeiten deklarieren; das Gateway lässt diese Tools aus, sofern nicht jede Anforderung in caps des ursprünglichen Clients enthalten ist. Über einen Kanal gestartete Ausführungen verfügen über keine Gateway-Client-Fähigkeiten, daher sind fähigkeitsgebundene Tools auch dann nicht verfügbar, wenn die Tool-Richtlinie sie ausdrücklich zulässt.
Beispiel für eine Node-Verbindung
{ "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 deklarieren beim Verbindungsaufbau Fähigkeitsansprüche:
caps: übergeordnete Kategorien wiecamera,canvas,screen,location,voice,talk.commands: Positivliste der Befehle für Aufrufe.permissions: granulare Umschalter (z. B.screen.record,camera.capture).
Das Gateway behandelt diese Angaben als Ansprüche und erzwingt serverseitige Positivlisten.
Rollen und Scopes
Das vollständige Operator-Scope-Modell, Prüfungen zum Genehmigungszeitpunkt und die Semantik gemeinsam genutzter Geheimnisse finden Sie unter Operator-Scopes.
Rollen:
operator: Client der Steuerungsebene (CLI/UI/Automatisierung).node: Fähigkeitshost (Kamera/Bildschirm/Canvas/system.run).worker: Cloud-Ausführungshost im dedizierten, geschlossenen Worker-Protokoll.
Operator-Scopes (src/gateway/operator-scopes.ts), die vollständige geschlossene Menge:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config mit includeSecrets: true erfordert operator.talk.secrets (oder
operator.admin). Wenn Geheimnisse enthalten sind, lesen Sie den Berechtigungsnachweis des aktiven Talk-Providers
aus talk.resolved.config.apiKey; talk.providers.<id>.apiKey
behält die Form der Quelle bei und kann ein SecretRef-Objekt oder eine redigierte Zeichenfolge sein.
Vom Plugin registrierte Gateway-RPC-Methoden können einen eigenen Operator-Scope anfordern,
diese reservierten Core-Präfixe werden jedoch immer zu operator.admin
(src/shared/gateway-method-policy.ts) aufgelöst: config.*, exec.approvals.*,
wizard.*, update.*.
Der Methoden-Scope ist nur die erste Zugriffsschranke. Einige über
chat.send erreichte Slash-Befehle wenden strengere Prüfungen auf Befehlsebene an: Dauerhafte Schreibvorgänge für /config set und
/config unset erfordern operator.admin, selbst bei Gateway-Clients, die
bereits über einen niedrigeren Operator-Scope verfügen.
node.pair.approve verfügt zusätzlich zum grundlegenden
Methoden-Scope (operator.pairing) über eine weitere Scope-Prüfung zum Genehmigungszeitpunkt,
die auf dem deklarierten commands (src/infra/node-pairing-authz.ts) der ausstehenden Anfrage basiert:
| Deklarierte Befehle | Erforderliche Berechtigungsbereiche |
|---|---|
| keine | operator.pairing |
| gewöhnliche Befehle | operator.pairing + operator.write |
enthält system.run, system.run.prepare, system.which, browser.proxy, fs.listDir oder system.execApprovals.get/set |
operator.pairing + operator.admin |
Fähigkeiten/Befehle/Berechtigungen (Node)
Nodes deklarieren beim Verbindungsaufbau ihre beanspruchten Fähigkeiten:
caps: übergeordnete Fähigkeitskategorien wiecamera,canvas,screen,location,voiceundtalk.commands: Befehls-Zulassungsliste für Aufrufe.permissions: granulare Umschalter (z. B.screen.record,camera.capture).
Der Gateway behandelt diese als Angaben und erzwingt serverseitige Zulassungslisten.
Verbundene Nodes können nach einem erfolgreichen Verbindungsaufbau oder
erneuten Verbindungsaufbau mit node.pluginTools.update optionale, für Agenten sichtbare Plugin- oder MCP-Tool-
Deskriptoren veröffentlichen. Headless-Node-Hosts werden neu gestartet, um Änderungen
am deklarativen MCP-Inventar anzuwenden. Diese Aktualisierungsmethode ist der einzige Veröffentlichungspfad;
Plugin-Tool-Deskriptoren werden in den Parametern von connect nicht akzeptiert. Jeder Deskriptor muss
einen Provider-sicheren Tool-name verwenden und einen command aus der aktuellen
Befehls-Zulassungsliste des Nodes benennen. Der Gateway vertraut den Deskriptor-Metadaten des gekoppelten
Nodes, filtert Deskriptoren außerhalb der genehmigten Befehlsoberfläche, entfernt sie beim Trennen
des Nodes und weist Versuche von Operatoren zurück, den Katalog eines anderen Nodes zu ändern. Setzen Sie
gateway.nodes.pluginTools.enabled: false, um von Nodes veröffentlichte Deskriptoren zu ignorieren.
Verbundene Node-Hosts veröffentlichen ihren vollständigen Skill-Ersetzungskatalog mit
node.skills.update. Diese Methode der Node-Rolle ist der einzige Veröffentlichungspfad für Node-Skills;
Skills werden in den Parametern von connect nicht akzeptiert. Jeder Deskriptor enthält einen
sicheren Namen, eine Beschreibung und begrenzten SKILL.md-Inhalt. Der Gateway verarbeitet diesen
Inhalt mit dem normalen Skills-Loader, nimmt ihn in die Skill-Snapshots der Agenten auf,
solange der Node verbunden ist, und entfernt ihn beim Trennen der Verbindung. Setzen Sie
gateway.nodes.allowSkills: false, um von Nodes veröffentlichte Skills zu ignorieren.
Präsenz
system-presencegibt nach Geräteidentität indizierte Einträge zurück, einschließlichdeviceId,rolesundscopes, sodass Benutzeroberflächen auch dann eine Zeile pro Gerät anzeigen können, wenn es sowohl als Operator als auch als Node verbunden ist.node.listenthält optionallastSeenAtMsundlastSeenReason. Verbundene Nodes melden die aktuelle Verbindungszeit mit dem Grundconnect; gekoppelte Nodes können außerdem über ein vertrauenswürdiges Node-Ereignis eine dauerhafte Hintergrundpräsenz melden.
Native macOS-Nodes können außerdem authentifizierte node.presence.activity-Ereignisse
mit begrenzter Leerlaufzeit der Eingabe senden. Der Gateway leitet Aktivitätszeitstempel anhand seiner
eigenen Uhr ab, stellt den zuletzt aktiven verbundenen Mac über node.list und
node.describe bereit und überträgt node.presence-Aktualisierungen an Clients mit Leseberechtigung.
Die App sendet { "action": "clear" }, wenn der Benutzer die Aktivitätsfreigabe deaktiviert;
der Gateway löscht Zeitstempel nur für genau diese authentifizierte Node-Verbindung.
Gateways, die älter als diese bestätigte Aktion sind, geben sie als unbehandelt zurück, sodass der Mac-
Node die Verbindung einmal neu herstellt und die Bereinigung beim Trennen den alten Verbindungsstatus entfernt.
Unter Präsenz des aktiven Computers finden Sie Informationen zu Auswahl, Datenschutz, Modell-
kontext und dem Verhalten beim Weiterleiten von Benachrichtigungen.
Hintergrund-Aktivereignis des Nodes
Nodes rufen node.event mit event: "node.presence.alive" auf, um zu erfassen, dass ein
gekoppelter Node während einer Hintergrundaktivierung aktiv war, ohne ihn als verbunden zu markieren:
{ "event": "node.presence.alive", "payloadJSON": "{\"trigger\":\"silent_push\",\"sentAtMs\":1737264000000,\"displayName\":\"Peters iPhone\",\"version\":\"2026.4.28\",\"platform\":\"iOS 18.4.0\",\"deviceFamily\":\"iPhone\",\"modelIdentifier\":\"iPhone17,1\",\"pushTransport\":\"relay\"}"}trigger ist eine geschlossene Aufzählung: background, silent_push, bg_app_refresh,
significant_location, manual, connect. Unbekannte Werte werden zu
background (src/shared/node-presence.ts) normalisiert. Das Ereignis wird nur für
authentifizierte Node-Gerätesitzungen dauerhaft gespeichert; Sitzungen ohne Gerät oder ohne Kopplung geben
handled: false zurück.
Erfolgreiche Gateways geben ein strukturiertes Ergebnis zurück:
{ "ok": true, "event": "node.presence.alive", "handled": true, "reason": "persisted"}Ältere Gateways geben für node.event möglicherweise nur { "ok": true } zurück; behandeln Sie dies
als bestätigten RPC-Aufruf und nicht als dauerhafte Speicherung der Präsenz.
Geltungsbereich von Broadcast-Ereignissen
Vom Server übertragene Broadcast-Ereignisse sind durch Berechtigungsbereiche beschränkt, damit Sitzungen,
die auf die Kopplung oder ausschließlich auf Nodes beschränkt sind, nicht passiv Sitzungsinhalte empfangen
(src/gateway/server-broadcast.ts):
- Chat-, Agenten- und Tool-Ergebnis-Frames (gestreamte
agent-Ereignisse, Tool-Ergebnis- Ereignisse) erfordern mindestensoperator.read. Sitzungen ohne diese Berechtigung überspringen diese Frames vollständig. - Von Plugins definierte
plugin.*-Broadcasts sind standardmäßig aufoperator.writeoderoperator.adminbeschränkt; explizite Einträge wieplugin.approval.requested/plugin.approval.resolvedverwenden stattdessenoperator.approvals. - Status-/Transportereignisse (
heartbeat,presence,tick, Lebenszyklus von Verbindungsaufbau/-trennung) bleiben unbeschränkt, sodass der Transportzustand für jede authentifizierte Sitzung sichtbar ist. - Unbekannte Familien von Broadcast-Ereignissen werden standardmäßig durch Berechtigungsbereiche beschränkt (Fail-Closed), sofern ein registrierter Handler diese Beschränkung nicht ausdrücklich lockert.
Jede Clientverbindung verwaltet ihre eigene clientbezogene Sequenznummer, sodass Broadcasts auf diesem Socket monoton geordnet bleiben, selbst wenn verschiedene Clients unterschiedliche, nach Berechtigungsbereichen gefilterte Teilmengen des Ereignisstroms sehen.
RPC-Methodenfamilien
hello-ok.features.methods ist eine konservative Ermittlungsliste, die aus
src/gateway/server-methods-list.ts sowie den exportierten Methoden geladener Plugins/Kanäle
erstellt wird – sie ist kein generierter Auszug aller Methoden, und einige Methoden (zum
Beispiel push.test, web.login.start, web.login.wait, sessions.usage)
sind absichtlich von der Ermittlung ausgeschlossen, obwohl es sich um echte, aufrufbare
Methoden handelt. Betrachten Sie dies als Funktionsermittlung und nicht als vollständige Aufzählung von
src/gateway/server-methods/*.ts.
System und Identität
healthgibt den zwischengespeicherten oder neu abgefragten Zustands-Snapshot des Gateways zurück.diagnostics.stabilitygibt die aktuelle begrenzte Diagnoseaufzeichnung der Stabilität zurück: Ereignisnamen, Anzahlen, Bytegrößen, Speicherwerte, Warteschlangen-/Sitzungsstatus, Kanal-/Plugin-Namen, Sitzungs-IDs. Keine Chattexte, Webhook-Inhalte, Tool-Ausgaben, unverarbeiteten Anfrage-/Antwortinhalte, Token, Cookies oder Geheimnisse. Erfordertoperator.read.statusgibt die Gateway-Zusammenfassung im Stil von/statuszurück; vertrauliche Felder nur für Operator-Clients mit Administratorberechtigung.gateway.identity.getgibt die Gateway-Geräteidentität zurück, die von Relay- und Kopplungsabläufen verwendet wird.system-presencegibt den aktuellen Präsenz-Snapshot für verbundene Operator-/Node-Geräte zurück.system-eventfügt ein Systemereignis an und kann den Präsenzkontext aktualisieren/übertragen.last-heartbeatgibt das zuletzt dauerhaft gespeicherte Heartbeat-Ereignis zurück.set-heartbeatsschaltet die Heartbeat-Verarbeitung auf dem Gateway ein oder aus.gateway.suspend.prepareerstellt nur dann eine kurze Lease zur kooperativen Unterbrechung, wenn die nachverfolgte Gateway-Arbeit inaktiv ist.gateway.suspend.statusprüft diese Lease, undgateway.suspend.resumegibt sie nach dem Reaktivieren oder einem abgebrochenen Hostvorgang frei.
Modelle und Nutzung
models.listgibt den zur Laufzeit zulässigen Modellkatalog zurück. Siehe „models.list-Ansichten“ unten.usage.statusgibt Nutzungsfenster/Zusammenfassungen des verbleibenden Kontingents des Providers zurück.usage.costgibt aggregierte Kostennutzungszusammenfassungen für einen Datumsbereich zurück. Übergeben SieagentIdfür einen Agenten oderagentScope: "all", um konfigurierte Agenten zu aggregieren.doctor.memory.statusgibt die Bereitschaft des Vektorspeichers/zwischengespeicherter Embeddings für den aktiven Standard-Agenten-Workspace zurück. Übergeben Sie{ "probe": true }oder{ "deep": true }nur für einen expliziten Live-Ping des Embedding-Providers. Übergeben Sie{ "agentId": "agent-id" }, um die Statistiken des Dreaming-Speichers auf einen Agenten-Workspace zu beschränken; ohne diesen Parameter werden konfigurierte Dreaming-Workspaces aggregiert.doctor.memory.dreamDiary,doctor.memory.backfillDreamDiary,doctor.memory.resetDreamDiary,doctor.memory.resetGroundedShortTerm,doctor.memory.repairDreamingArtifactsunddoctor.memory.dedupeDreamDiaryakzeptieren optional{ "agentId": "agent-id" }; ohne diesen Parameter verwenden sie den konfigurierten Standard-Agenten-Workspace.doctor.memory.remHarnessgibt für Remote-Clients der Steuerungsebene eine begrenzte, schreibgeschützte Vorschau des REM-Harness zurück, einschließlich Workspace-Pfaden, Speicherausschnitten, gerendertem fundiertem Markdown und Kandidaten für die tiefgreifende Hochstufung. Erfordertoperator.read.sessions.usagegibt Nutzungszusammenfassungen pro Sitzung zurück. Übergeben SieagentIdfür einen Agenten oderagentScope: "all", um konfigurierte Agenten gemeinsam aufzulisten. Beide Nutzungsmethoden akzeptierenmode: "specific"mit einer IANA-timeZonefür DST-konforme Grenzen und Buckets von Kalendertagen.utcOffsetwird weiterhin für ältere Clients und als Fallback unterstützt, wenn die Gateway-Laufzeit die angeforderte Zone nicht erkennt.sessions.usage.timeseriesgibt Zeitreihennutzungsdaten für eine Sitzung zurück.sessions.usage.logsgibt Nutzungsprotokolleinträge für eine Sitzung zurück.
Kanäle und Anmeldehilfen
channels.statusgibt Statuszusammenfassungen integrierter und gebündelter Kanäle/Plugins zurück.channels.logoutmeldet einen bestimmten Kanal/ein bestimmtes Konto ab, sofern der Kanal dies unterstützt.web.login.startstartet einen QR-/Web-Anmeldeablauf für den aktuellen Webkanal-Provider mit QR-Unterstützung.web.login.waitwartet auf den Abschluss dieses Ablaufs und startet bei Erfolg den Kanal.push.testsendet eine APNs-Test-Push-Nachricht an einen registrierten iOS-Node.voicewake.getgibt die gespeicherten Aktivierungswort-Trigger zurück.voicewake.setaktualisiert Aktivierungswort-Trigger und überträgt die Änderung.
Plugin-Verwaltung
plugins.list(operator.read) gibt das Inventar der installierten Plugins sowie lokal kuratierte offizielle Empfehlungen, Diagnosedaten und die Information zurück, ob der aktuelle Installationsmodus Änderungen zulässt.plugins.search(operator.read) sucht nach installierbaren ClawHub-Code-Plugin- und Bundle-Plugin-Familien. Übergeben Sie einen nicht leeren Wert fürqueryund optional einen Wert fürlimitvon 1 bis 100.plugins.install(operator.admin) installiert entweder einen offiziellen Katalogeintrag mit{ source: "official", pluginId }oder ein ClawHub-Paket mit{ source: "clawhub", packageName, version?, acknowledgeClawHubRisk? }. ClawHub-Installationen behalten die Prüfungen des Gateways für Vertrauenswürdigkeit, Integrität und Installationsrichtlinien bei. Erfolgreiche Installationen erfordern einen Neustart des Gateways.plugins.setEnabled(operator.admin) ändert mit{ pluginId, enabled }die Aktivierungsrichtlinie eines installierten Plugins. Die Antwort enthält den aktualisierten Katalogeintrag, Neustartmetadaten und etwaige Warnungen zur Slot-Auswahl.plugins.uninstall(operator.admin) entfernt mit{ pluginId }ein extern installiertes Plugin: Konfigurationsverweise, den Installationsdatensatz und verwaltete Dateien. Mitgelieferte Plugins können nicht deinstalliert, sondern nur deaktiviert werden. Die Antwort listet die Entfernungsvorgänge auf und erfordert immer einen Neustart des Gateways.
Nachrichten und Protokolle
sendist der direkte RPC für ausgehende Zustellungen an bestimmte Kanäle, Konten und Threads außerhalb des Chat-Runners.logs.tailgibt das konfigurierte Ende des Gateway-Dateiprotokolls mit Steuerelementen für Cursor, Limit und maximale Byteanzahl zurück.
Operator-Terminal
terminal.openstartet ein Host-PTY für einen expliziten Wert vonagentIdoder den Standard-Agenten und gibt den aufgelösten Agenten, das Arbeitsverzeichnis, die Shell und den Einschränkungsstatus zurück.terminal.input,terminal.resizeundterminal.closearbeiten ausschließlich mit Sitzungen, deren Eigentümer die aufrufende Verbindung ist.terminal.uploadakzeptiert eine Base64-Datei mit bis zu 16 MiB, stellt sie in einem privaten temporären Verzeichnis mit einer Lebensdauer von 24 Stunden auf dem Gateway der Sitzung oder dem Host des gekoppelten Nodes bereit und gibt den absoluten Pfad zurück. Der Aufrufer muss diesen Pfad weiterhin einfügen oder anderweitig verwenden; der RPC schreibt niemals Terminaleingaben und führt keinen Befehl aus.- Ereignisse vom Typ
terminal.dataundterminal.exitwerden ausschließlich an die Verbindung gestreamt, der die Sitzung gehört. - Sitzungen, deren Verbindung abbricht, werden getrennt, nicht beendet: Sie können für
gateway.terminal.detachedSessionTimeoutSeconds(Standardwert 300;0stellt das Beenden bei Verbindungstrennung wieder her) erneut verbunden werden, während sich die jüngsten Ausgaben in einem begrenzten serverseitigen Puffer ansammeln. terminal.listgibt verbindbare Sitzungen zurück;terminal.attachbindet eine aktive oder getrennte Sitzung erneut an die aufrufende Verbindung und gibt den Wiedergabepuffer zurück (Übernahme im tmux-Stil – ein vorheriger aktiver Eigentümer erhältterminal.exitmit dem Grunddetached);terminal.textliest den Puffer als Klartext, ohne eine Verbindung herzustellen.- Jede Terminalmethode erfordert
operator.admin;gateway.terminal.enabledmuss explizit auf „true“ gesetzt sein. Vollständig sandboxgeschützte Agenten werden abgelehnt, und eine Änderung der Agentenrichtlinie schließt bestehende und gerade gestartete PTYs einschließlich der getrennten PTYs.
Talk und TTS
talk.cataloggibt den schreibgeschützten Talk-Provider-Katalog für Sprache, Streaming-Transkription und Echtzeit-Sprachkommunikation zurück: kanonische Provider-IDs, Registry-Aliasse, Bezeichnungen, Konfigurationsstatus, ein optionales Ergebnis fürreadyauf Gruppenebene, verfügbare Modell-/Sprach-IDs, kanonische Modi, Transporte, Brain-Strategien sowie Echtzeit-Audio-/Funktionsflags, ohne Provider-Geheimnisse zurückzugeben oder die globale Konfiguration zu ändern. Aktuelle Gateways setzenready, nachdem die Provider-Auswahl zur Laufzeit angewendet wurde; behandeln Sie das Fehlen dieses Werts bei älteren Gateways als nicht verifiziert.talk.configgibt die effektive Talk-Konfigurationsnutzlast zurück;includeSecretserfordertoperator.talk.secrets(oderoperator.admin).talk.session.createerstellt eine Gateway-eigene Talk-Sitzung fürrealtime/gateway-relay,transcription/gateway-relayoderstt-tts/managed-room. Beistt-tts/managed-roommüssen Aufrufer vonoperator.write, diesessionKeyübergeben, zusätzlichspawnedByübergeben, damit Sitzungsschlüssel innerhalb des Gültigkeitsbereichs sichtbar sind; die Erstellung eines nicht bereichsgebundenensessionKeyundbrain: "direct-tools"erfordernoperator.admin.talk.session.joinvalidiert ein Sitzungstoken für einen verwalteten Raum, gibt bei Bedarfsession.readyodersession.replacedaus und gibt Raum-/Sitzungsmetadaten sowie die jüngsten Talk-Ereignisse zurück, jedoch niemals das Klartexttoken oder dessen Hash.talk.session.appendAudiofügt Gateway-eigenen Echtzeit-Relay- und Transkriptionssitzungen Base64-codierte PCM-Eingangsaudiodaten hinzu.talk.session.startTurn,talk.session.endTurnundtalk.session.cancelTurnsteuern den Lebenszyklus von Gesprächsbeiträgen in verwalteten Räumen und lehnen veraltete Gesprächsbeiträge ab, bevor der Status gelöscht wird.talk.session.cancelOutputstoppt die Audioausgabe des Assistenten, hauptsächlich für durch VAD gesteuerte Unterbrechungen in Gateway-Relay-Sitzungen.talk.session.submitToolResultschließt einen Provider-Tool-Aufruf ab, der von einer Gateway-eigenen Echtzeit-Relay-Sitzung ausgegeben wurde. Die Anfrage wartet auf alle asynchronen Abschlusssignale, die von der Provider-Bridge bereitgestellt werden; fehlgeschlagene Übermittlungen lassen den verknüpften Lauf aktiv und geben kein Ereignis für ein erfolgreiches Tool-Ergebnis aus. Übergeben Sieoptions: { willContinue: true }für vorläufige Tool-Ausgaben oderoptions: { suppressResponse: true }, wenn die Provider-Bridge Unterstützung für die Unterdrückung signalisiert und das Ergebnis keine weitere Antwort starten soll.talk.session.steersendet die Sprachsteuerung für einen aktiven Lauf an eine Gateway-eigene, agentengestützte Talk-Sitzung:{ sessionId, text, mode? }, wobeimodeentwederstatus,steer,canceloderfollowupist; ein ausgelassener Modus wird anhand des gesprochenen Textes klassifiziert.talk.session.closeschließt eine Gateway-eigene Relay-, Transkriptions- oder verwaltete Raumsitzung und gibt abschließende Talk-Ereignisse aus.talk.modesetzt den aktuellen Talk-Modusstatus für WebChat-/Control-UI-Clients und überträgt ihn.talk.client.createerstellt eine clientseitig verwaltete Echtzeit-Provider-Sitzung mithilfe vonwebrtcoderprovider-websocketoder setzt sie fort, während das Gateway Anmeldedaten, Anweisungen, Tool-Richtlinien und den zurückgegebenen WertvoiceSessionIdverwaltet. Clients übergebensessionKeyund verwendenvoiceSessionIderneut, wenn der Provider-Transport während eines Anrufs ersetzt wird.talk.client.transcriptfügt der normalen Agentensitzung ein abgeschlossenes Element vom Typ{ role, text }hinzu. Der erforderliche WertentryIdist innerhalb vonvoiceSessionIdidempotent; Wiederholungsversuche duplizieren keine Transkriptnachrichten.talk.client.closeschließt die logische Sprachsitzung nach ausstehenden Transkriptschreibvorgängen. Das Schließen ist idempotent und kann eine ausschließlich Änderungen enthaltende Anrufzusammenfassung an den letzten Kanal der Sitzung senden, der nicht WebChat ist.talk.client.toolCallermöglicht clientseitig verwalteten Echtzeittransporten, Provider-Tool-Aufrufe an die Gateway-Richtlinie weiterzuleiten. Das erste unterstützte Tool istopenclaw_agent_consult; Clients erhalten eine Lauf-ID und warten auf normale Chat-Lebenszyklusereignisse, bevor sie das providerspezifische Tool-Ergebnis übermitteln. Sprachgebundene Aktionen mit hoher Auswirkung gebenVOICE_CONFIRMATION_REQUIRED:<id>zurück, bis eine spätere abgeschlossene Benutzeräußerung genau diese Aktion ausdrücklich bestätigt und die nächste AbfrageconfirmationIdbereitstellt.talk.client.steersendet die Sprachsteuerung für einen aktiven Lauf an clientseitig verwaltete Echtzeittransporte. Das Gateway löst den aktiven eingebetteten Lauf aussessionKeyauf und gibt ein strukturiertes Ergebnis mit Annahme oder Ablehnung zurück, anstatt die Steuerung stillschweigend zu verwerfen.talk.eventist der zentrale Talk-Ereigniskanal für Echtzeit-, Transkriptions-, STT-/TTS-, verwaltete Raum-, Telefonie- und Meeting-Adapter.talk.speaksynthetisiert Sprache über den aktiven Talk-Sprach-Provider.tts.statusgibt den TTS-Aktivierungsstatus, den aktiven Provider, Fallback-Provider und den Provider-Konfigurationsstatus zurück.tts.providersgibt das sichtbare TTS-Provider-Inventar zurück.tts.enableundtts.disableschalten den Status der TTS-Einstellungen um.tts.setProvideraktualisiert den bevorzugten TTS-Provider.tts.convertführt eine einmalige Text-zu-Sprache-Konvertierung durch.tts.speak(operator.write) rendert einen nicht leeren Wert vontextmit der konfigurierten allgemeinen TTS-Provider-Kette und gibt einen vollständigen Clip inline alsaudioBase64sowieproviderund optionale Metadaten füroutputFormat,mimeTypeundfileExtensionzurück. Im Gegensatz zutts.convertwird kein Gateway-lokaler Pfad zurückgegeben; im Gegensatz zutalk.speakist kein Talk-Provider erforderlich. Text oberhalb vontts.maxTextLengthgibtINVALID_REQUESTzurück; Synthesefehler gebenUNAVAILABLEzurück.
Secrets, Konfiguration, Aktualisierung und Assistent
secrets.reloadlöst aktive SecretRefs erneut auf und veröffentlicht atomar einen eigentümerbezogenen Laufzeitstatus. Fehler berechtigter Eigentümer können mitwarningCountals kalte oder veraltete Beeinträchtigung veröffentlicht werden; strikte oder nicht zugeordnete Fehler lehnen das erneute Laden ab und bewahren den aktiven Snapshot.secrets.resolvelöst Zuweisungen von Befehlsziel-Secrets für eine bestimmte Gruppe von Befehlen und Zielen auf.config.getgibt den aktuellen Konfigurations-Snapshot auf dem Datenträger, die unverarbeitete Stammdateihash, die aufgelösteconfigRevisionHashund optionalappliedConfigHashfür die aufgelöste Revision zurück, die von der aktiven Gateway-Laufzeit akzeptiert wurde.config.setschreibt eine validierte Konfigurationsnutzlast.config.patchführt eine partielle Konfigurationsaktualisierung zusammen. Eine destruktive Array-Ersetzung erfordert den betroffenen Pfad inreplacePaths; verschachtelte Arrays unter Array-Einträgen verwenden[]-Pfade wieagents.entries.*.skills.config.applyvalidiert und ersetzt die vollständige Konfigurationsnutzlast.config.schemagibt die Nutzlast des aktiven Konfigurationsschemas zurück, die von Control UI und CLI-Werkzeugen verwendet wird: Schema,uiHints, Version, Generierungsmetadaten sowie Metadaten zu Plugin- und Kanalschemas, sofern sie geladen werden können. Sie enthälttitle- /description-Metadaten aus denselben Beschriftungen und Hilfetexten wie die UI, einschließlich verschachtelter Objekt-, Platzhalter- und Array-Element-Zweige sowieanyOf- /oneOf- /allOf-Kompositionszweige, wenn eine passende Felddokumentation vorhanden ist.config.schema.lookupgibt für einen Konfigurationspfad eine pfadbezogene Suchnutzlast zurück: normalisierter Pfad, ein flacher Schemaknoten, übereinstimmender Hinweis undhintPath, optionalreloadKindsowie Zusammenfassungen der unmittelbar untergeordneten Elemente für die Detailnavigation in UI und CLI.reloadKindist entwederrestart,hotodernone(src/config/schema.ts) und entspricht für den angeforderten Pfad dem Planer zum erneuten Laden der Gateway-Konfiguration. Schemaknoten der Suche behalten die benutzerorientierte Dokumentation und gängige Validierungsfelder bei (title,description,type,enum,const,format,pattern, numerische Grenzen sowie Grenzen für Zeichenfolgen, Arrays und Objekte,additionalProperties,deprecated,readOnly,writeOnly). Zusammenfassungen untergeordneter Elemente stellenkey, normalisiertepath,type,required,hasChildren, optionalreloadKindsowie die übereinstimmendenhint/hintPathbereit.update.runführt den Gateway-Aktualisierungsablauf aus und plant einen Neustart nur, wenn die Aktualisierung erfolgreich war; Aufrufer mit einer Sitzung könnencontinuationMessageeinbeziehen, sodass beim Start über die Fortsetzungswarteschlange für Neustarts eine weitere Agent-Ausführung fortgesetzt wird. Paketmanager-Aktualisierungen und überwachte Aktualisierungen von Git-Checkouts aus der Steuerungsebene verwenden eine getrennte Übergabe an einen verwalteten Dienst, anstatt den Paketbaum zu ersetzen oder Checkout-/Build-Ausgaben innerhalb des aktiven Gateways zu verändern. Eine gestartete Übergabe gibtok: truemitresult.reason: "managed-service-handoff-started"undhandoff.status: "started"zurück. Eine zweite gleichzeitigeupdate.run, die vom selben Gateway-Prozess verarbeitet wird, gibtok: falsemitresult.reason: "managed-service-handoff-already-running"undhandoff.status: "already-running"zurück; ihre Fortsetzung wird nicht akzeptiert, sodass der Aufrufer es erneut versuchen kann, nachdem die aktive Aktualisierung abgeschlossen ist. Eigenständige CLI-Aktualisierungsprogramme und ersetzende Gateway-Prozesse unterliegen nicht dieser prozesslokalen Schutzvorrichtung. Nicht verfügbare oder fehlgeschlagene Übergaben gebenok: falsemitmanaged-service-handoff-unavailableodermanaged-service-handoff-failedsowiehandoff.commandzurück, wenn eine manuelle Shell-Aktualisierung erforderlich ist. „Nicht verfügbar“ bedeutet, dass OpenClaw keine sichere Supervisor-Grenze oder dauerhafte Dienstidentität besitzt, beispielsweiseOPENCLAW_SYSTEMD_UNITfür systemd. Während einer gestarteten Übergabe kann der Neustart-Sentinel kurzzeitigstats.reason: "restart-health-pending"melden; die Fortsetzung wird verzögert, bis die CLI das neu gestartete Gateway überprüft und den endgültigenok-Sentinel schreibt.update.statusaktualisiert den neuesten Neustart-Sentinel der Aktualisierung und gibt ihn zurück, einschließlich der nach dem Neustart ausgeführten Version, sofern verfügbar.wizard.start,wizard.next,wizard.statusundwizard.cancelstellen den Onboarding-Assistenten über WS-RPC bereit.
Hilfsfunktionen für Agent und Arbeitsbereich
agents.listgibt für das Gateway sichtbare Agent-Einträge zurück, einschließlich effektiver Modell-/Laufzeitmetadaten und optionaler semantischerkind(agentodersystem). Clients geben beim Handshake die Fähigkeitagent-kindan, um die vollständige typisierte Liste zu erhalten; Clients ohne diese Fähigkeit behalten die veraltete, auswahlsichere Liste ohne Systemzeilen bei. Typbewusste Clients schließensystem-Zeilen aus gewöhnlichen Auswahlfeldern aus, behalten sie jedoch in Diagnoseansichten bei. Ältere v4-Gateways können Zeilen ohnekindzurückgeben.agents.create,agents.updateundagents.deleteverwalten Agent-Datensätze und die Verknüpfung von Arbeitsbereichen.agents.files.list,agents.files.getundagents.files.setverwalten die Bootstrap-Arbeitsbereichsdateien, die für einen Agent bereitgestellt werden.audit.activity.listgibt das versionierte, ausschließlich Metadaten enthaltende Aktivitätsjournal zurück;audit.listbleibt der kompatibilitätssichere RPC für Ausführungen und Werkzeuge.agents.workspace.listundagents.workspace.get(operator.read) ermöglichen Clients in der vertrauenswürdigen Operatordomäne, die unter Operatorbereiche beschrieben ist, das schreibgeschützte, paginierte Durchsuchen des Arbeitsbereichsverzeichnisses eines Agents. Anfragen akzeptieren ausschließlich arbeitsbereichsrelative Pfade; Lesezugriffe bleiben auf das per realpath aufgelöste Stammverzeichnis des Arbeitsbereichs beschränkt (Ausbrüche über symbolische Links und Hardlinks werden abgelehnt), sind größenbeschränkt und auf UTF-8-Text sowie gängige Bildtypen (Base64) begrenzt. Antworten legen den Pfad des Arbeitsbereichs auf dem Host nicht offen. Dieser Namensraum enthält keine Schreiboperationen.tasks.list,tasks.getundtasks.cancelstellen das Gateway-Aufgabenjournal für SDK- und Operator-Clients bereit. Siehe unten RPCs des Aufgabenjournals.artifacts.list,artifacts.getundartifacts.downloadstellen aus Transkripten abgeleitete Artefaktzusammenfassungen und Downloads für einen explizitensessionKey-,runId- odertaskId-Bereich bereit. Ausführungs- und Aufgabenabfragen ermitteln serverseitig die zugehörige Sitzung und geben nur Transkriptmedien mit übereinstimmender Herkunft zurück; unsichere oder lokale URL-Quellen führen zu nicht unterstützten Downloads, anstatt serverseitig abgerufen zu werden.environments.listundenvironments.statusbehalten die Gateway-lokale und Node-Umgebungserkennung bei. Konfigurierte Cloud-Worker und dauerhafte Datensätze, die von früheren Profilen hinterlassen wurden, fügenworker-Metadaten mitproviderId, optionalleaseId,state,ageMs, optionalidleMsundattachedSessionIdshinzu. Die Lebenszykluszustände von Workern sindrequested,provisioning,bootstrapping,ready,attached,idle,draining,destroying,destroyed,failedundorphaned.environments.create({ profileId, idempotencyKey }) stellt einen Worker aus einem konfigurierten Provider-Profil eines Plugins bereit; Wiederholungsversuche mit demselben Schlüssel verwenden den dauerhaften Vorgang erneut.environments.destroy({ environmentId }) fordert den idempotenten Abbau einer dauerhaften Worker-Umgebung an. Beide erfordernoperator.admin, sind Schreibvorgänge der Steuerungsebene und geben dieselbe Form der Umgebungszusammenfassung zurück, die von Statusantworten verwendet wird.agent.identity.getgibt die effektive Assistentenidentität für einen Agent oder eine Sitzung zurück.agent.waitwartet auf den Abschluss einer Ausführung und gibt den abschließenden Snapshot zurück, sofern verfügbar.
Sitzungssteuerung
sessions.listgibt den aktuellen Sitzungsindex zurück, einschließlich zeilenbezogeneragentRuntime-Metadaten, wenn ein Agent-Runtime-Backend konfiguriert ist. Wenn die Platzierung auf Cloud-Workern aktiviert ist oder ein dauerhafter Wiederherstellungszustand vorliegt, enthalten Sitzungszeilen außerdem einen abgeschlossenenplacement-Zustand (local,requested,provisioning,syncing,starting,active,draining,reconciling,reclaimedoderfailed) sowie zustandsspezifische Umgebungs-, Owner-Epoch-, Workspace-, Bundle-, ACK-Cursor- oder Wiederherstellungsfelder.sessions.subscribeundsessions.unsubscribeschalten Abonnements für Sitzungsänderungsereignisse für den aktuellen WS-Client ein oder aus.sessions.messages.subscribeundsessions.messages.unsubscribeschalten Abonnements für Transkript-/Nachrichtenereignisse einer Sitzung ein oder aus. Übergeben SieincludeApprovals: true, um zusätzlich bereinigtesession.approval-Lebenszyklusereignisse für Genehmigungen zu empfangen, deren persistierte Zielgruppe genau diese Sitzung umfasst und deren Prüferbindung den abonnierenden Client autorisiert. Die Abonnementantwort enthält dann eine begrenzte ausstehendeapprovalReplay; sie ist maßgeblich, wenntruncatedfalsch ist. Die Zustimmung gilt pro Abonnementaufruf und ist nicht dauerhaft: Wenn dieselbe Sitzung ohneincludeApprovals: trueerneut abonniert wird, wird ein vorhandenes Genehmigungsabonnement entfernt. Zusätzlich zur normalen Leseberechtigung für Sitzungen erfordert diese Zustimmungoperator.adminoderoperator.approvalsauf einem gekoppelten Gerät.sessions.previewgibt begrenzte Transkriptvorschauen für bestimmte Sitzungsschlüssel zurück.sessions.describegibt eine Gateway-Sitzungszeile für einen exakten Sitzungsschlüssel zurück.sessions.resolvelöst ein Sitzungsziel auf oder kanonisiert es.sessions.createerstellt einen neuen Sitzungseintrag. Optionale Werte fürmodelundthinkingLevelpersistieren das anfängliche Modell und die Reasoning-Überschreibungen atomar.worktree: truestellt einen verwalteten Worktree bereit; die optionalen WerteworktreeBaseRef/worktreeNamewählen die Basisreferenz und den Branch-Namen aus, undexecNode(operator.admin) bindet die Sitzungsausführung an einen Node-Host. Der erstellte Worktree wird im Ergebnis zurückgegeben und in der Sitzungszeile (worktree: { id, branch, repoRoot }) persistiert. Wenn der Eintrag erstellt wird, sein verschachtelter anfänglicherchat.sendjedoch abgelehnt wird, enthält das erfolgreiche ErgebnisrunStarted: falseundrunError; Clients können den Prompt beibehalten und den Versuch mit dem zurückgegebenen Sitzungsschlüssel wiederholen. Ein Aufrufer, derparentSessionKeymitemitCommandHooks: trueübergibt, sollte außerdem die Lebenszyklusdisposition eines separaten untergeordneten Elements deklarieren:succeedsParent: truebeendet das übergeordnete Element mitsession_end, währendfalsedas übergeordnete Element aktiv hält und nursession_startdes untergeordneten Elements ausgibt. WirdsucceedsParentweggelassen, bleibt für bestehende Clients das bisherige Rollover-Verhalten des übergeordneten Elements erhalten. Die Disposition erfordert sowohl eine Verknüpfung mit dem übergeordneten Element als auch Command-Hooks; ein Fork kann sein übergeordnetes Element nicht erfolgreich abschließen. Das Reset-in-Place-Verhalten der Hauptsitzung bleibt unverändert, da kein separates untergeordnetes Element erstellt wird. Neue Zeilen werden über die vertrauenswürdige Erstellungsschnittstelle mit einmalig schreibbarer Erstellungsprovenienz (createdVia,createdActor,createdAt) versehen; bei der Übernahme eines vorhandenen Schlüssels wird sie nie neu gesetzt. Für menschliche Profilakteure wirdcreatedActor.labelbei der Projektion der Zeile aus dem aktuellen Benutzerprofil aufgelöst und nie im Sitzungseintrag gespeichert, sodass Profilumbenennungen keine Abweichungen verursachen. Sitzungszeilen enthalten außerdemparentSessionKey(Navigations-Elternelement, persistiert),controlOwnerSessionKey(Runtime-Controller, wenn aktiv),forkSource(exakter Quellschlüssel + Transkriptgeneration für Forks) undpreviousSessionId(vorherige Transkriptgeneration unter demselben Schlüssel).sessions.dispatch(operator.admin) verschiebt eine vorhandene lokale OpenClaw-Sitzung mit einem sitzungseigenen verwalteten Worktree in ein konfiguriertes Cloud-Worker-Profil. Übergeben Sie{ key, profileId, agentId? }. Die Methode ist nicht vorhanden, wenn kein Worker-Profil konfiguriert ist, schließt die lokale Zulassung von Turns, bevor aktive Arbeit abgearbeitet wird, und kehrt erst zurück, nachdem die Platzierung die Worker-Eigentümerschaftactiveerreicht hat. Der Versand erfolgt nur in eine Richtung; das Zurückholen vom Worker auf das lokale System ist nicht Teil dieses RPC.sessions.groups.list,sessions.groups.put,sessions.groups.renameundsessions.groups.deleteverwalten den Gateway-eigenen Katalog benutzerdefinierter Sitzungsgruppen (Namen + Anzeigereihenfolge). Die Mitgliedschaft verbleibt im Feldcategoryjeder Sitzung; beim Umbenennen und Löschen werden die Mitgliedssitzungen serverseitig aktualisiert.sessions.sendsendet eine Nachricht an eine vorhandene Sitzung.sessions.steerist die Variante zum Unterbrechen und Steuern einer aktiven Sitzung.sessions.abortbricht aktive Arbeit für eine Sitzung ab. Übergeben Siekeysowie optionalrunIdoder nurrunIdfür aktive Ausführungen, die das Gateway einer Sitzung zuordnen kann. Durch Angabe vonrunIdbleibt der Abbruch auf diese Ausführung beschränkt. Setzen SieclearQueued: truebei einer nicht globalen Anfrage, die nur einen Schlüssel enthält, um außerdem die dieser Sitzung zugeordneten Folge- und Lane-Warteschlangen zu verwerfen. Bei vorhandenen Aufrufern, dieclearQueuedweglassen, bleiben diese Warteschlangen erhalten. Der literale Schlüsselglobalbehält die bestehenden agentenqualifizierten Eigentumsregeln fürchat.abortbei und führt keine nicht globale Bereinigung von Folge- oder Lane-Warteschlangen durch.sessions.patchaktualisiert Sitzungsmetadaten/-überschreibungen und meldet das aufgelöste kanonische Modell sowie den effektiven WertagentRuntime. Die Spawn-Abstammung (spawnedBy,spawnedWorkspaceDir,spawnedCwd,spawnDepth,subagentRole,subagentControlScope) kann nicht mehr öffentlich gepatcht werden; diese Fakten werden von vertrauenswürdigen Erstellungspfaden einmalig geschrieben, und Anfragen, die sie weiterhin senden, werden abgelehnt.sessions.reset,sessions.deleteundsessions.compactführen Sitzungswartungsaufgaben aus.sessions.getgibt die vollständig gespeicherte Sitzungszeile zurück.- Die Chat-Ausführung verwendet weiterhin
chat.history,chat.send,chat.abortundchat.inject.chat.historywird für UI-Clients an die Anzeige angepasst: Inline-Direktiven-Tags werden aus sichtbarem Text entfernt, Nur-Text-XML-Nutzlasten von Tool-Aufrufen (<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>und abgeschnittene Tool-Aufrufblöcke) sowie durchgesickerte Modellsteuerungstoken in ASCII oder voller Breite werden entfernt, reine Assistant-Zeilen mit Silent-Token (exaktNO_REPLY/no_reply) werden ausgelassen, und übergroße Zeilen können durch Platzhalter ersetzt werden. chat.message.getist der additive, begrenzte Leser vollständiger Nachrichten für einen einzelnen sichtbaren Transkripteintrag. Übergeben SiesessionKey, optionalagentId, wenn die Sitzungsauswahl agentenbezogen ist, und einen TranskriptwertmessageId, der zuvor überchat.historybereitgestellt wurde; das Gateway gibt dieselbe an die Anzeige angepasste Projektion ohne die Begrenzung zur Kürzung des leichtgewichtigen Verlaufs zurück, sofern der gespeicherte Eintrag noch verfügbar und nicht übergroß ist.chat.toolTitlesgibt kurze Zweckbezeichnungen für Tool-Aufrufe zurück, die in der Control UI dargestellt werden (gebündelt, maximal 24 Elemente mit begrenzten Eingaben). Die Funktion wird übergateway.controlUi.toolTitlesaktiviert (standardmäßig deaktiviert); deaktivierte Gateways beantworten{ titles: {}, disabled: true }ohne Modellaufruf, damit Clients keine weiteren Anfragen stellen. Wenn die Funktion aktiviert ist, verwenden die Bezeichnungen das standardmäßige Routing für Utility-Modelle: entweder ein explizit konfiguriertesutilityModel(eine Betreiberentscheidung, die wie alle Utility-Aufgaben begrenzte Aufgabeninhalte an den ausgewählten Provider senden kann) oder andernfalls den deklarierten Standard des Sitzungs-Providers für kleine Modelle, sodass nicht implizit ein neues Egress-Ziel entsteht; ein leerer WertutilityModeldeaktiviert sie vollständig. Die Bezeichnungen greifen nie auf das primäre Modell zurück. Ergebnisse werden in der agentenbezogenen Zustandsdatenbank anhand von Tool-Name + Eingabe zwischengespeichert, sodass wiederholte Ansichten dieselben Aufrufe nie erneut abrechnen.chat.sendakzeptiert den für einen Turn geltenden WertfastMode: "auto", um den Schnellmodus für Modellaufrufe zu verwenden, die vor dem automatischen Grenzwert gestartet wurden, und spätere Wiederholungs-, Fallback-, Tool-Ergebnis- oder Fortsetzungsaufrufe anschließend ohne Schnellmodus zu starten. Der Grenzwert beträgt standardmäßig 60 Sekunden (DEFAULT_FAST_MODE_AUTO_ON_SECONDS) und kann mitagents.defaults.models["<provider>/<model>"].params.fastAutoOnSecondspro Modell konfiguriert werden. Ein Aufrufer vonchat.sendkann den für einen Turn geltenden WertfastAutoOnSecondsübergeben, um den Grenzwert für diese Anfrage zu überschreiben. Übergeben SiequeueMode(steer,followup,collectoderinterrupt), um den gespeicherten Warteschlangenmodus nur für diese Anfrage zu überschreiben; explizite Steuerungsaktionen der Control UI verwendenqueueMode: "steer". Interaktive Clients könnenexpectedLeafEntryIdmit dem aktiven Blatt des angezeigten Transkript-Branches odernullfür ein maßgebliches leeres Transkript übergeben; das Gateway lehnt das Senden mitdetails.reason: "active-leaf-changed"ab, wenn zuvor ein anderer Client den Branch gewechselt hat.
Gerätekopplung und Gerätetoken
device.pair.listgibt ausstehende und genehmigte gekoppelte Geräte zurück.device.pair.setupCodeerstellt einen mobilen Einrichtungscode und standardmäßig eine PNG-QR-Daten-URL. Dies erfordertoperator.adminund wird bewusst nicht in der angekündigten Discovery aufgeführt. Das Ergebnis enthältsetupCode, optionalqrDataUrl,gatewayUrl, die nicht geheime BezeichnungauthundurlSource.device.pair.approve,device.pair.rejectunddevice.pair.removeverwalten Datensätze zur Gerätekopplung.device.pair.renameweist eine Betreiberbezeichnung ({ deviceId, label }) zu, die gegenüber dem vom Client gemeldeten Anzeigenamen bevorzugt wird und eine Gerätereparatur oder erneute Genehmigung überdauert.device.token.rotaterotiert ein Token eines gekoppelten Geräts innerhalb der Grenzen seiner genehmigten Rolle und des Aufruferbereichs.device.token.revokewiderruft ein Token eines gekoppelten Geräts innerhalb der Grenzen seiner genehmigten Rolle und des Aufruferbereichs.
Der Einrichtungscode enthält kurzzeitig gültige Bootstrap-Zugangsdaten. Clients dürfen diese nicht protokollieren oder über den Kopplungsablauf hinaus persistieren.
Node-Kopplung, Aufruf und ausstehende Arbeit
node.pair.list,node.pair.approve,node.pair.rejectundnode.pair.removedecken Genehmigungen für Node-Fähigkeiten ab.node.pair.requestundnode.pair.verifywurden 2026.7 zusammen mit dem eigenständigen Speicher für Node-Kopplungen entfernt; ausstehende Anfragen werden vom Gateway während der Verbindung von Nodes erstellt.node.listundnode.describegeben den Zustand bekannter/verbundener Nodes zurück.node.renameaktualisiert die Bezeichnung eines gekoppelten Nodes.node.invokeleitet einen Befehl an einen verbundenen Node weiter.node.invoke.resultgibt das Ergebnis einer Aufrufanfrage zurück.mcp.tools.call.v1ist der Headless-Node-Host-Befehl zum Aufrufen eines konfigurierten Node-lokalen MCP-Tools. Er wird übernode.invokeübertragen, setzt voraus, dass der Node den Befehl deklariert, und unterliegt weiterhin der Kopplungsgenehmigung sowiegateway.nodes.commands.deny.node.eventüberträgt von Nodes stammende Ereignisse zurück an das Gateway.node.pluginTools.updateist der einzige Veröffentlichungspfad zum Ersetzen der für den Agent sichtbaren Plugin-/MCP-Tool-Deskriptoren des verbundenen Nodes; die Parameter vonconnectübertragen diese nicht.node.pending.pullundnode.pending.acksind die Warteschlangen-APIs für verbundene Nodes.node.pending.enqueueundnode.pending.drainverwalten dauerhafte ausstehende Arbeit für offline befindliche/getrennte Nodes.
Genehmigungsfamilien
approval.historygibt die neuesten zuerst aufgeführten, 30 Tage lang aufbewahrten abschließenden Genehmigungen für Exec-, Plugin- und System-Agent-Anfragen zurück (Geltungsbereichoperator.approvals). Es unterstützt Cursor-Paginierung sowie einen optionalen Artfilter; ausstehende Genehmigungen sind keine Verlaufseinträge.approval.getundapproval.resolvesind die artunabhängigen, dauerhaft gespeicherten Genehmigungsmethoden (Geltungsbereichoperator.approvals).approval.getgibt eine bereinigte Projektion einer ausstehenden oder aufbewahrten abschließenden Genehmigung mit einer stabilenurlPathzurück;approval.resolveakzeptiert die kanonische Genehmigungs-ID, eine explizitekindund eine Entscheidung, wendet die Auflösung nach dem Prinzip „erste Antwort gewinnt“ an und gibt stets das aufgezeichnete kanonische Ergebnis zurück.exec.approval.request,exec.approval.get,exec.approval.listundexec.approval.resolvedecken einmalige Exec-Genehmigungsanfragen sowie das Nachschlagen und erneute Abspielen ausstehender Genehmigungen ab. Sie sind Adapter an der Protokollgrenze über derselben dauerhaft gespeicherten Genehmigungsregistrierung.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-Richtlinie für Exec-Genehmigungen.exec.approvals.node.getundexec.approvals.node.setverwalten die Node-lokale Richtlinie für Exec-Genehmigungen über Node-Relay-Befehle.plugin.approval.request,plugin.approval.list,plugin.approval.waitDecisionundplugin.approval.resolvedecken Plugin-definierte Genehmigungsabläufe ab.
Control-UI-Befehle
ui.commandermöglicht es einemoperator.write-Aufrufer, typisierte Layout- und Navigationsbefehle an verbundene Control-UI-Clients zu senden, welche die Fähigkeitui-commandsbekannt geben.- Die Befehle decken das Teilen, Schließen und Fokussieren von Bereichen, die Sichtbarkeit der Seitenleiste, die Sichtbarkeit und Andockposition des Terminal-/Browser-Bereichs sowie die Sitzungsnavigation ab.
- Protokoll v1 verteilt die Befehle absichtlich an jede verbundene, dazu fähige Control UI. Ist keine verbunden, schlägt die Anfrage mit
UNAVAILABLEfehl, statt vorzugeben, das Layout habe sich geändert.
Automatisierung, Skills und Werkzeuge
- Automatisierung:
wakeplant die sofortige oder beim nächsten Heartbeat erfolgende Einspeisung eines Aktivierungstexts;cron.get,cron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runsverwalten geplante Aufgaben. cron.runbleibt ein RPC im Einreihungsstil für manuelle Ausführungen. Clients, die Abschlusssemantik benötigen, sollten die zurückgegebenerunIdlesen undcron.runsabfragen.cron.runsakzeptiert einen optionalen, nicht leerenrunId-Filter, damit Clients eine einzelne eingereihte manuelle Ausführung verfolgen können, ohne mit anderen Verlaufseinträgen für dieselbe Aufgabe in Konflikt zu geraten.- Skills und Werkzeuge:
commands.list,skills.*,tools.catalog,tools.effective,tools.invoke. Siehe unten Hilfsmethoden für Operatoren.
Allgemeine Ereignisfamilien
chat: UI-Chat-Aktualisierungen wiechat.injectund andere ausschließlich das Transkript betreffende Chat- Ereignisse. In Protokoll v4 enthalten Delta-NutzlastendeltaText;messagebleibt der kumulative Assistenten-Snapshot. Ersetzungen, die keine Präfixe sind, setzenreplace=trueund verwendendeltaTextals Ersetzungstext.session.message,session.operation,session.tool: Aktualisierungen des Transkripts, laufender Sitzungsvorgänge und des Ereignisstroms für eine abonnierte Sitzung.session.approval: bereinigter Wahrheitsstand zu ausstehenden und abschließenden Genehmigungen für einen ausdrücklich angemeldeten Abonnenten einer exakten Sitzung. Untergeordnete Genehmigungen verwenden die dauerhaft gespeicherte Zielgruppe des Vorfahren; Ereignisse verändern niemals Transkripte und aktivieren keine Agenten.sessions.changed: Sitzungsindex oder Metadaten wurden geändert.presence: Aktualisierungen des Systempräsenz-Snapshots.tick: periodisches Keepalive-/Erreichbarkeitsereignis.health: Aktualisierung des Gateway-Zustands-Snapshots.heartbeat: Aktualisierung des Heartbeat-Ereignisstroms.cron: Ereignis einer Änderung an einer Cron-Ausführung oder -Aufgabe.shutdown: Benachrichtigung über das Herunterfahren des Gateways.node.pair.requested/node.pair.resolved: Lebenszyklus der Node-Kopplung.node.invoke.request: Übertragung einer Node-Aufrufanfrage.device.pair.requested/device.pair.resolved: Lebenszyklus gekoppelter Geräte.voicewake.changed: Konfiguration des Aktivierungswort-Auslösers wurde geändert.config.changed: eine Konfigurationsänderung wurde dauerhaft gespeichert (die Nutzlast enthält den Konfigurationspfad, den neuen Snapshot-Hash und einen Zeitstempel – niemals Konfigurationsinhalte). Auf Operator-Lesezugriff beschränkt; Clients aktualisieren überconfig.get.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.bins aufrufen, um die aktuelle Liste ausführbarer Skill-Dateien
für Prüfungen der automatischen Zulassung abzurufen.
RPC für das Audit-Ledger
audit.activity.list bietet Operator-Clients eine stabile, nach neuesten Einträgen zuerst sortierte Ansicht der Metadaten zum Lebenszyklus von Agenten-
ausführungen, Werkzeugaktionen und optional erfassten Nachrichten. Es erfordert
operator.read. Abfragen schließen Datensätze aus, die älter als 30 Tage sind, und das gemeinsam genutzte
SQLite-Ledger ist auf 100,000 Datensätze begrenzt. Abgelaufene Zeilen werden beim
Start des Gateways, bei der stündlichen Wartung und bei späteren Schreibvorgängen gelöscht. Siehe
Audit-Verlauf für das Datenmodell und die Datenschutzsemantik.
- Parameter: optionale exakte
agentId,sessionKeyoderrunId; optionalekind("agent_run","tool_action"oder"message"); optionalestatus("started","succeeded","failed","cancelled","timed_out","blocked"oder"unknown"); optionale Nachrichten-direction("inbound"oder"outbound") und exaktechannel; optionale inklusive Unix-Millisekunden-Grenzenafter/before; optionalelimitvon1bis500; und optionale Zeichenfolgecursorvon der vorherigen Seite. - Ergebnis:
{ "events": AuditActivityEventV1[], "nextCursor"?: string }.
Die benannte V1-Ergebnis-Union besitzt separate Schemas für Agentenausführungen, Werkzeugaktionen, eingehende Nachrichten
und ausgehende Nachrichten. Der Diskriminator eventType lautet jeweils
agent_run, tool_action, inbound_message oder outbound_message; kind und die
Nachrichten-direction bleiben für Filterung und Anzeige verfügbar. Jedes Ereignis besitzt eine
ganzzahlige schemaVersion: 1. Referenzen auf Nachrichtenidentitäten verwenden das exakte
Format hmac-sha256:v1:<32 hex key id>:<64 hex digest>; die Akteur-ID eines Kanalabsenders
verwendet dasselbe Format.
Alle Varianten erfordern eventType, schemaVersion, eventId, sequence,
sourceSequence, occurredAt, kind, action, status, actor und
redaction. Die Variantenfelder sind:
eventType |
Erforderliche Felder | Optionale Felder |
|---|---|---|
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, Identitätsreferenzen, reasonCode, errorCode |
outbound_message |
direction: "outbound", channel, conversationKind, outcome |
agentId, runId, durationMs, resultCount, Identitätsreferenzen, reasonCode, deliveryKind, failureStage, errorCode |
Die geschlossenen Nachrichten-Enums sind:
conversationKind:direct,group,channeloderunknown.- Eingehende
outcome:completed,skippedoderfailed; optionalereasonCode: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_emptyoderacp_dispatch_aborted. - Ausgehende
outcome:sent,suppressed,failedoderunknown; optionalereasonCode:cancelled_by_message_sending_hook,cancelled_by_reply_payload_sending_hook,empty_after_message_sending_hook,empty_after_reply_payload_sending_hookoderno_visible_payload. Ein Adapter, der keine Plattformidentität zurückgibt, istunknown, da die externe Nebenwirkung nicht widerlegt werden kann. deliveryKind:text,mediaoderother;failureStage:platform_send,queueoderunknown.
Abschlussfelder sind miteinander korreliert und nicht unabhängig optional:
| Variante | Abschlusszuordnung |
|---|---|
| Agentenausführung | started besitzt keine errorCode; jeder abgeschlossene Status ohne Erfolg erfordert seinen entsprechenden run_*-Code. |
| Werkzeugaktion | started und „erfolgreich“ besitzen keine errorCode; jeder andere abgeschlossene Status erfordert seinen entsprechenden tool_*-Code. |
| Eingehende Nachricht | erfolgreich = completed; blockiert = skipped; fehlgeschlagen = failed plus message_processing_failed. reasonCode muss, sofern vorhanden, zu dieser Abschlussfamilie gehören. |
| Ausgehende Nachricht | erfolgreich = sent; blockiert = suppressed plus reasonCode; fehlgeschlagen = failed plus errorCode und failureStage; unbekannt = unknown plus failureStage. |
Jedes Aktivitätsereignis enthält eine stabile Ereignis-ID, eine monotone Ledger-Sequenz,
eine Quellereignissequenz, einen Zeitstempel, einen Akteur, eine Aktion, einen Status, die ganzzahlige
schemaVersion: 1 und redaction: "metadata_only". Ausführungs- und Werkzeugdatensätze
erfordern die Herkunft des Agenten und der Ausführung und können die Herkunft der Sitzung enthalten. Nachrichten-
datensätze können Agenten- und Ausführungs-IDs enthalten, schließen jedoch absichtlich stets
sessionKey und sessionId aus; der Abfragefilter sessionKey gilt daher
nur für Ausführungs- und Werkzeugzeilen. Werkzeugereignisse können die Werkzeugaufruf-ID und den Werkzeugnamen enthalten.
Nachrichtendatensätze verwenden message.inbound.processed oder
message.outbound.finished und ergänzen Richtung, Kanal, Konversationsart,
normalisiertes Ergebnis sowie optional Zustellungsart, Fehlerphase, Dauer,
Ergebnisanzahl, Ursachencode und installationslokale, schlüsselbasierte
Konto-/Konversations-/Nachrichten-/Zielpseudonyme. Diese Pseudonyme erleichtern
die Korrelation, stellen jedoch keine Anonymisierung dar: Die Zustandsdatenbank enthält ihren Schlüssel,
RPC- und CLI-Exporte hingegen nicht. Das Ledger speichert keine Prompts, Nachrichteninhalte,
Toolargumente, Toolergebnisse, Befehlsausgaben oder unformatierten Fehlertexte.
Run-/Tool-sessionKey-Werte bleiben unverarbeitete Korrelationsmetadaten und können
Plattformkonto- oder Peer-IDs enthalten; Nachrichtendatensätze lassen Sitzungsschlüssel aus.
Bei eingehenden Zeilen misst durationMs den Core-Dispatch bis zu seinem Abschluss, und
resultCount zählt finalisierte, in die Warteschlange eingereihte Tool-, Block- und Antwort-Payloads. Bei
ausgehenden Zeilen umfasst durationMs die Zustellungsverantwortung bis zur Bestätigung,
Dead-Letter-Behandlung oder Abstimmung (einschließlich Wartezeit in der Warteschlange), und resultCount
zählt identifizierte physische Sendungen an die Plattform. deliveryKind beschreibt, sofern vorhanden,
den effektiven Payload nach Hooks und Rendering; unterdrückte oder
bei Abstürzen mehrdeutige Zeilen lassen diesen Wert aus.
Die aktuelle Nachrichtenabdeckung umfasst akzeptierte eingehende Nachrichten, die den Core-
Dispatch erreichen, einschließlich Core-Ergebnissen für Duplikate und Abschlüsse. Für ausgehende Nachrichten wird
eine Abschlusszeile pro ursprünglichem logischen Antwort-Payload geschrieben, der die gemeinsame dauerhafte
Zustellung erreicht; Chunking und Adapter-Fan-out werden in resultCount zusammengefasst. In die Warteschlange eingereihte,
wiederholbare oder mehrdeutige Sendungen werden erst nach Bestätigung, Dead-Letter-Behandlung
oder Abstimmung aufgezeichnet. Plugin-lokale und direkte Sendepfade, die diese
gemeinsamen Grenzen umgehen, sind noch nicht abgedeckt. Die begrenzte Worker-Warteschlange arbeitet nach bestem Bemühen
und kann bei Fehlern oder Überlastung Datensätze verwerfen; daher ist diese Oberfläche kein
verlustfreies Compliance-Archiv.
Die Aufzeichnung ist standardmäßig aktiviert und wird über
audit.enabled gesteuert. Die Nachrichtenaufzeichnung wird
separat durch audit.messages gesteuert und verwendet standardmäßig "off". Wenn
die Aufzeichnung deaktiviert ist, stellt audit.activity.list zuvor geschriebene Datensätze
weiterhin bereit, bis sie ablaufen.
Die ausgelieferten Schemas für audit.list-Anfragen, -Ergebnisse und AuditEvent bleiben
unverändert und geben ausschließlich Agentenlauf- und Toolaktionsdatensätze zurück. Neue Operator-
Clients sollten audit.activity.list aufrufen, wenn der Gateway dies ankündigt. Ältere
Gateways melden bei einer auf Lesezugriff beschränkten Anfrage möglicherweise entweder unknown method: audit.activity.list oder, da
die Autorisierung in ausgelieferten Versionen vor der Methodensuche erfolgte, missing scope: operator.admin. Behandeln Sie Letzteres
nur dann als fehlende Methode, wenn die Methode nicht angekündigt wurde. Ein Client darf anschließend audit.list
nur dann erneut versuchen, wenn seine Filter keine Unterstützung für Nachrichtenart, Richtung oder Kanal
erfordern.
Verwenden Sie openclaw audit für Textabfragen und begrenzte JSON-Exporte.
Task-Ledger-RPCs
Operator-Clients prüfen und stornieren Datensätze von Gateway-Hintergrundaufgaben über
die Task-Ledger-RPCs (packages/gateway-protocol/src/schema/tasks.ts). Diese
geben bereinigte Aufgabenzusammenfassungen zurück, keinen unverarbeiteten Laufzeitstatus.
tasks.listerfordertoperator.read.- Parameter: optional
status("queued","running","completed","failed","cancelled"oder"timed_out") oder ein Array dieser Statuswerte, optionalagentId, optionalsessionKey, optionallimitvon1bis500und optional die Zeichenfolgecursor. - Ergebnis:
{ "tasks": TaskSummary[], "nextCursor"?: string }.
- Parameter: optional
tasks.geterfordertoperator.read.- Parameter:
{ "taskId": string }. - Ergebnis:
{ "task": TaskSummary }. - Fehlende Aufgaben-IDs geben die Gateway-Fehlerstruktur für „nicht gefunden“ zurück.
- Parameter:
tasks.cancelerfordertoperator.write.- Parameter:
{ "taskId": string, "reason"?: string }. - Ergebnis:
{ "found": boolean, "cancelled": boolean, "reason"?: string, "task"?: TaskSummary }. foundgibt an, ob das Ledger eine passende Aufgabe enthielt.cancelledgibt an, ob die Laufzeit die Stornierung akzeptiert oder aufgezeichnet hat.
- Parameter:
TaskSummary enthält id, status und optionale Metadaten: kind,
runtime, title, agentId, sessionKey, childSessionKey, ownerKey,
runId, taskId, flowId, parentTaskId, sourceId, Zeitstempel, Fortschritt,
Abschlusszusammenfassung und bereinigten Fehlertext. agentId identifiziert den Agenten,
der die Aufgabe ausführt; sessionKey und ownerKey bewahren den Kontext des Anfragenden und der Steuerung.
Hilfsmethoden für Operatoren
commands.list(operator.read) ruft das Laufzeit-Befehlsinventar für einen Agenten ab.agentIdist optional; lassen Sie es aus, um den Standardarbeitsbereich des Agenten zu lesen.scopesteuert, auf welche Oberfläche das primärenameabzielt:textgibt das primäre Textbefehlstoken ohne das vorangestellte/zurück;nativeund der standardmäßigeboth-Pfad geben, sofern verfügbar, Provider-spezifische native Namen zurück.textAliasesenthält exakte Slash-Aliase wie/modelund/m.nativeNameenthält den Provider-spezifischen nativen Befehlsnamen, sofern einer vorhanden ist.providerist optional und wirkt sich nur auf die native Benennung sowie die Verfügbarkeit nativer Plugin- Befehle aus.includeArgs=falselässt serialisierte Argumentmetadaten in der Antwort aus.
tools.catalog(operator.read) ruft den Laufzeit-Toolkatalog für einen Agenten ab. Die Antwort enthält gruppierte Tools und Herkunftsmetadaten:source:coreoderpluginpluginId: Plugin-Eigentümer, wennsource="plugin"optional: ob ein Plugin-Tool optional ist
tools.effective(operator.read) ruft das laufzeiteffektive Tool- Inventar für eine Sitzung ab.sessionKeyist erforderlich.- Der Gateway leitet den vertrauenswürdigen Laufzeitkontext serverseitig aus der Sitzung ab, statt vom Aufrufer bereitgestellten Authentifizierungs- oder Zustellungskontext zu akzeptieren.
- Die Antwort ist eine sitzungsbezogene, serverseitig abgeleitete Projektion des aktiven Inventars, einschließlich Core-, Plugin-, Kanal- und bereits erkannter MCP- Server-Tools.
tools.effectiveist für MCP schreibgeschützt: Es kann einen aufgewärmten MCP-Katalog der Sitzung durch die endgültige Toolrichtlinie projizieren, erstellt jedoch keine MCP-Laufzeiten, verbindet keine Transporte und gibt keintools/listaus. Wenn kein passender aufgewärmter Katalog vorhanden ist, kann die Antwort einen Hinweis wiemcp-not-yet-connected,mcp-not-yet-listedodermcp-stale-catalogenthalten.- Effektive Tooleinträge verwenden
source="core",source="plugin",source="channel"odersource="mcp".
tools.invoke(operator.write) ruft ein verfügbares Tool über denselben Gateway-Richtlinienpfad wie/tools/invokeauf.nameist erforderlich.args,sessionKey,agentId,confirmundidempotencyKeysind optional.- Wenn sowohl
sessionKeyals auchagentIdvorhanden sind, muss der aufgelöste Sitzungsagent mitagentIdübereinstimmen. - Nur für Eigentümer bestimmte Core-Wrapper wie
cron,gatewayundnodeserfordern eine Eigentümer-/Administratoridentität (operator.admin), obwohltools.invokeselbstoperator.writeist. - Die Antwort ist ein SDK-seitiger Umschlag mit
ok,toolName, optionaloutputund typisiertenerror-Feldern. Ablehnungen aufgrund von Genehmigungen oder Richtlinien gebenok:falseim Payload zurück, anstatt die Gateway-Toolrichtlinien- Pipeline zu umgehen.
skills.status(operator.read) ruft das sichtbare Skills-Inventar für einen Agenten ab.agentIdist optional; lassen Sie es aus, um den Standardarbeitsbereich des Agenten zu lesen.- Die Antwort enthält Eignung, fehlende Anforderungen, Konfigurationsprüfungen und bereinigte Installationsoptionen, ohne unverarbeitete Geheimniswerte offenzulegen.
skills.searchundskills.detail(operator.read) geben ClawHub- Erkennungsmetadaten zurück.skills.upload.begin,skills.upload.chunkundskills.upload.commit(operator.admin) stellen ein privates Skills-Archiv bereit, bevor es installiert wird. Dies ist ein separater Administrator-Uploadpfad für vertrauenswürdige Clients, nicht der normale ClawHub- Installationsablauf für Skills, und ist standardmäßig deaktiviert, sofernskills.install.allowUploadedArchivesnicht aktiviert ist.skills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })erstellt einen Upload, der an diesen Slug und Force-Wert gebunden ist.skills.upload.chunk({ uploadId, offset, dataBase64 })hängt Bytes am exakten dekodierten Offset an.skills.upload.commit({ uploadId, sha256? })überprüft die endgültige Größe und SHA-256. Der Commit schließt nur den Upload ab; er installiert den Skill nicht.- Hochgeladene Skills-Archive sind ZIP-Archive, die ein
SKILL.md-Stammverzeichnis enthalten. Der interne Verzeichnisname des Archivs bestimmt niemals das Installationsziel.
skills.install(operator.admin) hat drei Modi:- ClawHub-Modus:
{ source: "clawhub", slug, version?, force? }installiert einen Skills-Ordner in dasskills/-Verzeichnis des Standardarbeitsbereichs des Agenten. - Upload-Modus:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }installiert einen abgeschlossenen Upload in dasskills/<slug>-Verzeichnis des Standardarbeitsbereichs des Agenten. Der Slug und der Force-Wert müssen mit der ursprünglichenskills.upload.begin-Anfrage übereinstimmen. Wird abgelehnt, sofernskills.install.allowUploadedArchivesnicht aktiviert ist; die Einstellung wirkt sich nicht auf ClawHub-Installationen aus. - Gateway-Installationsmodus:
{ name, installId, timeoutMs? }führt eine deklariertemetadata.openclaw.install-Aktion auf dem Gateway-Host aus. Ältere Clients können weiterhindangerouslyForceUnsafeInstallsenden; dieses Feld ist veraltet, wird nur aus Gründen der Protokollkompatibilität akzeptiert und ignoriert. Verwenden Siesecurity.installPolicyfür vom Operator verantwortete Installationsentscheidungen.
- ClawHub-Modus:
skills.update(operator.admin) hat zwei Modi:- Der ClawHub-Modus aktualisiert einen nachverfolgten Slug oder alle nachverfolgten ClawHub-Installationen im Standardarbeitsbereich des Agenten.
- Der Konfigurationsmodus patcht
skills.entries.<skillKey>-Werte wieenabled,apiKeyundenv.
models.list-Ansichten
models.list akzeptiert einen optionalen view-Parameter
(src/agents/model-catalog-visibility.ts):
- Ausgelassen oder
"default": Wennagents.defaults.modelPolicy.allowkonfiguriert ist, besteht die Antwort aus dem zulässigen Katalog, einschließlich dynamisch erkannter Modelle fürprovider/*-Einträge. Andernfalls besteht die Antwort aus dem vollständigen Gateway- Katalog. "configured": Verhalten mit für eine Auswahl geeigneter Größe. Wennagents.defaults.modelPolicy.allowkonfiguriert ist, hat es weiterhin Vorrang, einschließlich Provider-bezogener Erkennung fürprovider/*-Einträge. Ohne Zulassungsliste verwendet die Antwort explizitemodels.providers.<provider>.models-Einträge und greift nur dann auf den vollständigen Katalog zurück, wenn keine konfigurierten Modellzeilen vorhanden sind."provider-config": vom Quellautor erstelltesmodels.providers.*.models-Inventar, unabhängig von Auswahl-Zulassungslisten. Zeilen enthalten öffentliche Modellfähigkeiten und routenbezogene Verfügbarkeit, lassen jedoch Provider-Endpunkte, Authentifizierungsmaterial und Laufzeit-Anfragekonfiguration aus."all": vollständiger Gateway-Katalog unter Umgehung vonagents.defaults.modelPolicy.allow. Für Diagnose-/Erkennungsoberflächen verwenden, nicht für normale Modellauswahlen.
Ausführungsgenehmigungen
- Wenn eine exec-Anfrage eine Genehmigung benötigt, sendet das Gateway
exec.approval.requested. - Operator-Clients lösen sie durch Aufrufen von
exec.approval.resolveauf (erfordertoperator.approvals). - Für
host=nodemussexec.approval.requestsystemRunPlanenthalten (kanonischeargv/cwd/rawCommand/Sitzungsmetadaten). Anfragen ohnesystemRunPlanwerden abgelehnt. - Nach der Genehmigung verwenden weitergeleitete
node.invoke system.run-Aufrufe diesen kanonischensystemRunPlanals maßgeblichen Befehls-/cwd-/Sitzungskontext. - Wenn ein Aufrufer
command,rawCommand,cwd,agentIdodersessionKeyzwischen der Vorbereitung und der endgültigen genehmigtensystem.run-Weiterleitung verändert, lehnt das Gateway die Ausführung ab, anstatt der veränderten Nutzlast zu vertrauen.
Fallback bei der Agent-Zustellung
agent-Anfragen könnendeliver=trueenthalten, um eine ausgehende Zustellung anzufordern.bestEffortDeliver=false(der Standardwert) behält das strikte Verhalten bei: Nicht auflösbare oder ausschließlich interne Zustellungsziele gebenINVALID_REQUESTzurück.bestEffortDeliver=trueermöglicht einen Fallback auf eine Ausführung ausschließlich in der Sitzung, wenn keine extern zustellbare Route aufgelöst werden kann (beispielsweise bei internen/Webchat- Sitzungen oder mehrdeutigen Mehrkanalkonfigurationen).- Endgültige
agent-Ergebnisse könnenresult.deliveryStatusenthalten, wenn eine Zustellung angefordert wurde, wobei dieselben Statussent,suppressed,partial_failedundfailedverwendet werden, die füropenclaw agent --json --deliverdokumentiert sind.
Versionierung
PROTOCOL_VERSION,MIN_CLIENT_PROTOCOL_VERSION,MIN_NODE_PROTOCOL_VERSIONundMIN_PROBE_PROTOCOL_VERSIONbefinden sich inpackages/gateway-protocol/src/version.ts.- Clients senden
minProtocol+maxProtocol. Operator- und UI-Clients müssen das aktuelle Protokoll in diesem Bereich enthalten; aktuelle Clients und Server verwenden Protokoll v4. - Authentifizierte Clients mit sowohl
role: "node"als auchclient.mode: "node"können das N-1-Node-Protokoll verwenden (derzeit v3). Leichtgewichtige Neustartprüfungen verwenden dasselbe N-1-Fenster. Geräteauthentifizierung, Kopplung, Geltungsbereiche, Befehlsrichtlinien und exec- Genehmigungen bleiben von diesem Kompatibilitätsfenster unverändert. Plugin-eigene Node- Fähigkeiten und Befehle werden zurückgehalten, bis die Node auf das aktuelle Protokoll aktualisiert wurde, da ihre gehosteten Oberflächen nicht Teil des N-1-Vertrags sind. - Schemas und Modelle werden aus TypeBox-Definitionen generiert:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Client-Konstanten
Die Referenzimplementierung des Clients befindet sich in packages/gateway-client/src/
(OpenClaw bindet sie über die schlanke src/gateway/client.ts-Fassade ein). Diese
Standardwerte sind über Protokoll v4 hinweg stabil und bilden die erwartete Ausgangsbasis für
Clients von Drittanbietern.
| Konstante | Standardwert | Quelle |
|---|---|---|
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 |
| Anfrage-Timeout (pro RPC) | 30_000 ms |
packages/gateway-client/src/client.ts (requestTimeoutMs) |
| Timeout für Preauth/Verbindungs-Challenge | 15_000 ms |
packages/gateway-client/src/timeouts.ts (die Umgebungsvariable OPENCLAW_HANDSHAKE_TIMEOUT_MS kann das gekoppelte Server-/Client-Budget erhöhen) |
| Anfänglicher Backoff für erneute Verbindung | 1_000 ms |
packages/gateway-client/src/client.ts (GATEWAY_RECONNECT_POLICY) |
| Maximaler Backoff für erneute Verbindung | 30_000 ms |
packages/gateway-client/src/client.ts (GATEWAY_RECONNECT_POLICY) |
| Begrenzung schneller Wiederholungsversuche nach dem Schließen wegen eines Geräte-Tokens | 250 ms |
packages/gateway-client/src/client.ts |
Karenzzeit für erzwungenes Beenden vor terminate() |
250 ms |
FORCE_STOP_TERMINATE_GRACE_MS |
Standard-Timeout für stopAndWait() |
1_000 ms |
STOP_AND_WAIT_TIMEOUT_MS |
Standardmäßiges Tick-Intervall (vor hello-ok) |
30_000 ms |
packages/gateway-client/src/client.ts |
| Schließen bei Tick-Timeout | Code 4000, wenn die Stille tickIntervalMs * 2 überschreitet |
packages/gateway-client/src/client.ts |
MAX_PAYLOAD_BYTES |
25 * 1024 * 1024 (25 MB) |
src/gateway/server-constants.ts |
Der Server gibt die effektiven Werte für policy.tickIntervalMs,
policy.maxPayload und policy.maxBufferedBytes in hello-ok bekannt; Clients
sollten diese Werte anstelle der Standardwerte vor dem Handshake berücksichtigen.
Der Referenz-Client überlässt Anfragen mit endlicher Laufzeit ihre konfigurierte Frist, wenn
jede ausstehende Anfrage eine solche besitzt. Eine expectFinal-Anfrage ohne endlichen
timeoutMs, eine beliebige Anfrage mit timeoutMs: null oder eine Mischung aus zeitlich begrenzten und
unbegrenzten Anfragen lässt den Tick-Watchdog aktiv. Wenn eingehende Ereignisse und
Antworten über den Tick-Timeout-Schwellenwert hinaus ausbleiben, schließt der Client den
Socket mit Code 4000, lehnt alle ausstehenden Anfragen ab und stellt die Verbindung erneut her. Er
führt abgelehnte Anfragen nach der erneuten Verbindung nicht erneut aus.
Authentifizierung
- Die Gateway-Authentifizierung mit gemeinsamem Geheimnis verwendet je nach konfiguriertem
gateway.auth.mode("none" | "token" | "password" | "trusted-proxy") entwederconnect.params.auth.tokenoderconnect.params.auth.password. - Identitätstragende Modi wie Tailscale Serve (
gateway.auth.allowTailscale: true) oder ein nicht an Loopback gebundenesgateway.auth.mode: "trusted-proxy"erfüllen die Authentifizierungsprüfung beim Verbindungsaufbau anhand der Anfrage-Header statt anhand vonconnect.params.auth.*. - Bei privatem Ingress überspringt
gateway.auth.mode: "none"die Authentifizierung beim Verbindungsaufbau mit gemeinsamem Geheimnis vollständig; stellen Sie diesen Modus nicht über öffentlichen/nicht vertrauenswürdigen Ingress bereit. - Nach dem Pairing stellt das Gateway ein auf Verbindungsrolle und Geltungsbereiche
beschränktes Geräte-Token aus, das in
hello-ok.auth.deviceTokenzurückgegeben wird. Clients sollten es nach jedem erfolgreichen Verbindungsaufbau dauerhaft speichern. - Beim erneuten Verbindungsaufbau mit diesem gespeicherten Geräte-Token sollte auch der gespeicherte genehmigte Satz von Geltungsbereichen für dieses Token wiederverwendet werden. Dadurch bleiben bereits gewährte Lese-, Prüf- und Statuszugriffe erhalten, und erneute Verbindungen werden nicht unbemerkt auf einen engeren, impliziten, ausschließlich für Administratoren vorgesehenen Geltungsbereich reduziert.
- Clientseitige Zusammenstellung der Authentifizierung für den Verbindungsaufbau (
selectConnectAuthinpackages/gateway-client/src/client.ts):auth.passwordist unabhängig und wird immer weitergeleitet, wenn es gesetzt ist.auth.tokenwird in folgender Prioritätsreihenfolge befüllt: zuerst ein explizites gemeinsames Token, dann ein explizitesdeviceToken, anschließend ein gespeichertes gerätespezifisches Token (indiziert nachdeviceId+role).auth.bootstrapTokenwird nur gesendet, wenn keine der vorstehenden Optionenauth.tokenaufgelöst hat. Ein gemeinsames Token oder ein beliebiges aufgelöstes Geräte-Token unterdrückt es.- Die automatische Heraufstufung eines gespeicherten Geräte-Tokens beim einmaligen
Wiederholungsversuch mit
AUTH_TOKEN_MISMATCHist ausschließlich für vertrauenswürdige Endpunkte zulässig: Loopback oderwss://mit einem angeheftetentlsFingerprint. Öffentlicheswss://ohne Anheftung erfüllt die Voraussetzungen nicht.
- Der integrierte Bootstrap per Einrichtungscode gibt den primären Node
hello-ok.auth.deviceTokensowie ein begrenztes Operator-Token inhello-ok.auth.deviceTokensfür die vertrauenswürdige Übergabe an Mobilgeräte zurück. Das Operator-Token enthältoperator.talk.secretsfür native Lesezugriffe auf die Talk-Konfiguration, schließt jedoch Geltungsbereiche für Pairing-Änderungen undoperator.adminaus. - Während ein Einrichtungscode-Bootstrap außerhalb der Basiskonfiguration auf die Genehmigung wartet,
enthalten die Details von
PAIRING_REQUIREDdie FelderrecommendedNextStep: "wait_then_retry",retryable: trueundpauseReconnect: false. Stellen Sie die Verbindung mit demselben Bootstrap-Token wiederholt her, bis die Anfrage genehmigt wurde oder das Token ungültig wird. - Speichern Sie
hello-ok.auth.deviceTokensnur dauerhaft, wenn beim Verbindungsaufbau die Bootstrap- Authentifizierung über einen vertrauenswürdigen Transport wiewss://oder über lokales/Loopback-Pairing verwendet wurde. - Wenn ein Client ein explizites
deviceTokenoder explizitesscopesbereitstellt, bleibt dieser vom Aufrufer angeforderte Satz von Geltungsbereichen maßgeblich; zwischengespeicherte Geltungsbereiche werden nur wiederverwendet, wenn der Client das gespeicherte gerätespezifische Token erneut verwendet. - Geräte-Token können über
device.token.rotateunddevice.token.revokerotiert/widerrufen werden (erfordertoperator.pairing). Das Rotieren oder Widerrufen eines Node oder einer anderen Nicht-Operator-Rolle erfordert außerdemoperator.admin. device.token.rotategibt Rotationsmetadaten zurück. Das Ersatz- Bearer-Token wird nur bei Aufrufen desselben Geräts zurückgegeben, die bereits mit diesem Geräte-Token authentifiziert wurden, damit Clients, die ausschließlich Token verwenden, ihren Ersatz vor dem erneuten Verbindungsaufbau dauerhaft speichern können. Bei Rotationen über gemeinsame Token oder Administratorzugriff wird das Bearer-Token nicht zurückgegeben.- Ausstellung, Rotation und Widerruf von Token bleiben auf den genehmigten Rollensatz beschränkt, der im Pairing-Eintrag dieses Geräts verzeichnet ist; Token-Änderungen können keine Geräterolle erweitern oder adressieren, die bei der Pairing-Genehmigung nie gewährt wurde.
- Bei Token-Sitzungen gekoppelter Geräte ist die Geräteverwaltung auf das eigene Gerät beschränkt, sofern
der Aufrufer nicht zusätzlich über
operator.adminverfügt: Aufrufer ohne Administratorrechte können nur das Operator-Token ihres eigenen Geräteeintrags verwalten. Die Verwaltung von Node- und anderen Nicht-Operator-Token ist ausschließlich Administratoren vorbehalten, selbst beim eigenen Gerät des Aufrufers. device.token.rotateunddevice.token.revokeprüfen außerdem den Satz von Geltungsbereichen des adressierten Operator-Tokens gegen die aktuellen Sitzungsgeltungsbereiche des Aufrufers. Aufrufer ohne Administratorrechte können kein Operator-Token rotieren oder widerrufen, dessen Geltungsbereich weiter gefasst ist als ihr eigener.- Authentifizierungsfehler enthalten
error.details.codesowie Hinweise zur Wiederherstellung:error.details.canRetryWithDeviceToken(boolescher Wert)error.details.recommendedNextStep: einer der Werteretry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration(packages/gateway-protocol/src/connect-error-details.ts).
- Clientverhalten für
AUTH_TOKEN_MISMATCH:- Vertrauenswürdige Clients dürfen einen einzigen begrenzten Wiederholungsversuch mit einem zwischengespeicherten gerätespezifischen Token unternehmen.
- Wenn dieser Wiederholungsversuch fehlschlägt, beenden Sie automatische Schleifen zum erneuten Verbindungsaufbau und zeigen Sie Hinweise zu den erforderlichen Maßnahmen des Operators an.
AUTH_SCOPE_MISMATCHbedeutet, dass das Geräte-Token erkannt wurde, aber die angeforderte Rolle bzw. die angeforderten Geltungsbereiche nicht abdeckt. Stellen Sie dies nicht als ungültiges Token dar; fordern Sie den Operator auf, das Gerät erneut zu koppeln oder den engeren/weiteren Geltungsbereichsvertrag zu genehmigen.
Geräteidentität und Pairing
- Nodes sollten eine stabile Geräteidentität (
device.id) enthalten, die aus dem Fingerabdruck eines Schlüsselpaars abgeleitet wird. - Gateways stellen Token pro Gerät und Rolle aus.
- Pairing-Genehmigungen sind für neue Geräte-IDs erforderlich, sofern die lokale automatische Genehmigung nicht aktiviert ist.
- Die automatische Pairing-Genehmigung ist auf direkte lokale Loopback-Verbindungen ausgerichtet.
- OpenClaw verfügt außerdem über einen eng begrenzten lokalen Selbstverbindungspfad für Backend/Container bei vertrauenswürdigen Hilfsabläufen mit gemeinsamem Geheimnis.
- Tailnet- oder LAN-Verbindungen auf demselben Host werden beim Pairing weiterhin als remote behandelt und müssen genehmigt werden.
- WS-Clients geben normalerweise während
connecteinedevice-Identität an (Operator + Node). Die einzigen Ausnahmen für Operatoren ohne Gerät sind explizite Vertrauenspfade:- erfolgreiche Operatorauthentifizierung der Control UI über
gateway.auth.mode: "trusted-proxy". - Direkte Loopback-Backend-RPCs über
gateway-clientauf dem reservierten internen Hilfspfad.
- erfolgreiche Operatorauthentifizierung der Control UI über
- Das Weglassen der Geräteidentität hat Auswirkungen auf die Geltungsbereiche. Wenn eine gerätelose
Operatorverbindung über einen expliziten Vertrauenspfad zugelassen wird, setzt OpenClaw
selbst deklarierte Geltungsbereiche dennoch auf eine leere Menge zurück, sofern dieser Pfad keine
benannte Ausnahme zur Beibehaltung von Geltungsbereichen hat. Methoden mit Geltungsbereichsprüfung schlagen dann mit
missing scopefehl. - Der reservierte direkte Loopback-Backend-Hilfspfad
gateway-clientbehält Geltungsbereiche nur für interne lokale RPCs der Steuerungsebene bei; benutzerdefinierte Backend-IDs erhalten diese Ausnahme nicht. - Alle Verbindungen müssen die vom Server bereitgestellte Nonce
connect.challengesignieren.
Migrationsdiagnose für die Geräteauthentifizierung
Für ältere Clients, die weiterhin das Signaturverhalten vor Einführung der Challenge verwenden, gibt connect
unter error.details.code die Detailcodes DEVICE_AUTH_* mit einem stabilen
error.details.reason zurück.
Häufige Migrationsfehler:
| Meldung | details.code | details.reason | Bedeutung |
|---|---|---|---|
device nonce required |
DEVICE_AUTH_NONCE_REQUIRED |
device-nonce-missing |
Der Client hat device.nonce ausgelassen (oder leer gesendet). |
device nonce mismatch |
DEVICE_AUTH_NONCE_MISMATCH |
device-nonce-mismatch |
Der Client hat mit einer veralteten/falschen Nonce signiert. |
device signature invalid |
DEVICE_AUTH_SIGNATURE_INVALID |
device-signature |
Die Signaturnutzlast entspricht nicht der v2-Nutzlast. |
device signature expired |
DEVICE_AUTH_SIGNATURE_EXPIRED |
device-signature-stale |
Der signierte Zeitstempel liegt außerhalb der zulässigen Abweichung. |
device identity mismatch |
DEVICE_AUTH_DEVICE_ID_MISMATCH |
device-id-mismatch |
device.id entspricht nicht dem Fingerabdruck des öffentlichen Schlüssels. |
device public key invalid |
DEVICE_AUTH_PUBLIC_KEY_INVALID |
device-public-key |
Format/Kanonisierung des öffentlichen Schlüssels ist fehlgeschlagen. |
Migrationsziel:
- Warten Sie immer auf
connect.challenge. - Signieren Sie die v2-Nutzlast, die die Server-Nonce enthält.
- Senden Sie dieselbe Nonce in
connect.params.device.nonce. - Die bevorzugte Signaturnutzlast ist
v3(buildDeviceAuthPayloadV3inpackages/gateway-client/src/device-auth.ts), die zusätzlich zu Geräte-/Client-/Rollen-/Geltungsbereichs-/Token-/Nonce-Feldern auchplatformunddeviceFamilybindet. - Ältere
v2-Signaturen werden aus Kompatibilitätsgründen weiterhin akzeptiert, aber die Fixierung der Metadaten gekoppelter Geräte steuert beim erneuten Verbindungsaufbau weiterhin die Befehlsrichtlinie.
TLS und Anheftung
- TLS wird für WS-Verbindungen unterstützt (
gateway.tls-Konfiguration). - Clients können den Fingerabdruck des Gateway-Zertifikats optional über
gateway.remote.tlsFingerprintoder die CLI-Option--tls-fingerprintanheften.
Umfang
Dieses Protokoll stellt die vollständige Gateway-API bereit: Status, Kanäle, Modelle, Chat,
Agent, Sitzungen, Nodes, Genehmigungen und mehr. Die genaue Oberfläche wird durch
die aus packages/gateway-protocol/src/schema.ts erneut exportierten TypeBox-Schemata definiert.