Gateway
Gateway प्रोटोकॉल
Gateway WS प्रोटोकॉल OpenClaw के लिए एकल कंट्रोल प्लेन + Node ट्रांसपोर्ट है। सभी क्लाइंट (CLI, वेब UI, macOS ऐप, iOS/Android Nodes, हेडलेस Nodes) WebSocket पर कनेक्ट होते हैं और हैंडशेक समय पर अपनी role + scope घोषित करते हैं।
ट्रांसपोर्ट
- WebSocket, JSON पेलोड वाले टेक्स्ट फ्रेम।
- पहला फ्रेम अवश्य
connectअनुरोध होना चाहिए। - प्री-कनेक्ट फ्रेम 64 KiB तक सीमित हैं। सफल हैंडशेक के बाद, क्लाइंट को
hello-ok.policy.maxPayloadऔरhello-ok.policy.maxBufferedBytesसीमाओं का पालन करना चाहिए। डायग्नॉस्टिक्स सक्षम होने पर, बहुत बड़े इनबाउंड फ्रेम और धीमे आउटबाउंड बफर Gateway के प्रभावित फ्रेम को बंद या ड्रॉप करने से पहलेpayload.largeइवेंट उत्सर्जित करते हैं। ये इवेंट आकार, सीमाएं, सतहें, और सुरक्षित कारण कोड रखते हैं। वे संदेश बॉडी, अटैचमेंट सामग्री, कच्ची फ्रेम बॉडी, टोकन, कुकी, या गुप्त मान नहीं रखते।
हैंडशेक (connect)
Gateway → क्लाइंट (प्री-कनेक्ट चैलेंज):
{ "type": "event", "event": "connect.challenge", "payload": { "nonce": "…", "ts": 1737264000000 }}क्लाइंट → Gateway:
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 3, "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": "…" } }}Gateway → क्लाइंट:
{ "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 } }}जब Gateway अभी भी स्टार्टअप साइडकार पूरे कर रहा हो, तो connect अनुरोध
details.reason को "startup-sidecars" और retryAfterMs पर सेट करके retryable
UNAVAILABLE त्रुटि लौटा सकता है। क्लाइंट को इसे टर्मिनल
हैंडशेक विफलता के रूप में दिखाने के बजाय अपने कुल कनेक्शन बजट के भीतर उस प्रतिक्रिया को फिर से आजमाना चाहिए।
server, features, snapshot, और policy सभी स्कीमा
(packages/gateway-protocol/src/schema/frames.ts) द्वारा आवश्यक हैं। auth भी आवश्यक है और
negotiated role/scopes रिपोर्ट करता है। pluginSurfaceUrls वैकल्पिक है और canvas जैसे Plugin
सतह नामों को scoped hosted URLs से मैप करता है।
Scoped Plugin सतह URL समाप्त हो सकते हैं। Nodes
pluginSurfaceUrls में ताजा प्रविष्टि पाने के लिए
node.pluginSurface.refresh को { "surface": "canvas" } के साथ कॉल कर सकते हैं। प्रयोगात्मक Canvas Plugin refactor deprecated
canvasHostUrl, canvasCapability, या
node.canvas.capability.refresh compatibility path का समर्थन नहीं करता; वर्तमान native clients और
gateways को Plugin सतहों का उपयोग करना चाहिए।
जब कोई डिवाइस टोकन जारी नहीं किया जाता, तो hello-ok.auth negotiated
permissions को token fields के बिना रिपोर्ट करता है:
{ "auth": { "role": "operator", "scopes": ["operator.read", "operator.write"] }}विश्वसनीय same-process backend clients (client.id: "gateway-client",
client.mode: "backend") direct loopback connections पर device छोड़ सकते हैं जब
वे shared gateway token/password से authenticate करते हैं। यह path internal control-plane RPCs के लिए आरक्षित है और stale CLI/device pairing baselines को
subagent session updates जैसे local backend work को block करने से रोकता है। Remote clients,
browser-origin clients, node clients, और explicit device-token/device-identity
clients अभी भी normal pairing और scope-upgrade checks का उपयोग करते हैं।
जब device token जारी किया जाता है, तो hello-ok में यह भी शामिल होता है:
{ "auth": { "deviceToken": "…", "role": "operator", "scopes": ["operator.read", "operator.write"] }}Built-in QR/setup-code bootstrap एक नया mobile handoff path है। सफल baseline setup-code connect primary node token और एक bounded operator token लौटाता है:
{ "auth": { "deviceToken": "…", "role": "node", "scopes": [], "deviceTokens": [ { "deviceToken": "…", "role": "operator", "scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"] } ] }}operator handoff जानबूझकर bounded है ताकि QR onboarding
operator.admin या operator.pairing दिए बिना mobile operator loop शुरू कर सके।
इसमें operator.talk.secrets शामिल है ताकि native client bootstrap के बाद आवश्यक Talk
configuration पढ़ सके। व्यापक admin और pairing scopes के लिए
अलग approved operator pairing या token flow आवश्यक है। क्लाइंट को
hello-ok.auth.deviceTokens केवल तब persist करना चाहिए
जब connect ने wss:// या loopback/local pairing जैसे trusted transport पर bootstrap auth का उपयोग किया हो।
Node उदाहरण
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 3, "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": "…" } }}फ्रेमिंग
- Request:
{type:"req", id, method, params} - Response:
{type:"res", id, ok, payload|error} - Event:
{type:"event", event, payload, seq?, stateVersion?}
Side-effecting methods के लिए idempotency keys आवश्यक हैं (स्कीमा देखें)।
Roles + scopes
पूरे operator scope model, approval-time checks, और shared-secret semantics के लिए, Operator scopes देखें।
Roles
operator= control plane client (CLI/UI/automation)।node= capability host (camera/screen/canvas/system.run)।
Scopes (operator)
सामान्य scopes:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
includeSecrets: true वाला talk.config operator.talk.secrets
(या operator.admin) मांगता है।
Plugin-registered gateway RPC methods अपने operator scope का अनुरोध कर सकते हैं, लेकिन
reserved core admin prefixes (config.*, exec.approvals.*, wizard.*,
update.*) हमेशा operator.admin पर resolve होते हैं।
Method scope केवल पहला gate है। chat.send के माध्यम से पहुंचे कुछ slash commands
इसके ऊपर stricter command-level checks लागू करते हैं। उदाहरण के लिए, persistent
/config set और /config unset writes के लिए operator.admin आवश्यक है।
node.pair.approve में base method scope के ऊपर एक अतिरिक्त approval-time scope check भी होता है:
- commandless requests:
operator.pairing - non-exec node commands वाले requests:
operator.pairing+operator.write - वे requests जिनमें
system.run,system.run.prepare, याsystem.whichशामिल हैं:operator.pairing+operator.admin
Caps/commands/permissions (node)
Nodes connect time पर capability claims घोषित करते हैं:
caps:camera,canvas,screen,location,voice, औरtalkजैसी high-level capability categories।commands: invoke के लिए command allowlist।permissions: granular toggles (जैसेscreen.record,camera.capture)।
Gateway इन्हें claims मानता है और server-side allowlists लागू करता है।
Presence
system-presencedevice identity से keyed entries लौटाता है।- Presence entries में
deviceId,roles, औरscopesशामिल होते हैं ताकि UIs प्रति device एक ही row दिखा सकें भले ही वह operator और node दोनों के रूप में connect हो। node.listमें वैकल्पिकlastSeenAtMsऔरlastSeenReasonfields शामिल हैं। Connected nodes अपना current connection timelastSeenAtMsके रूप में reasonconnectके साथ report करते हैं; paired nodes तब durable background presence भी report कर सकते हैं जब trusted node event उनकी pairing metadata update करता है।
Node background alive event
Nodes event: "node.presence.alive" के साथ node.event कॉल कर सकते हैं ताकि record हो सके कि paired node
background wake के दौरान alive था, बिना उसे connected mark किए।
{ "event": "node.presence.alive", "payloadJSON": "{\"trigger\":\"silent_push\",\"sentAtMs\":1737264000000,\"displayName\":\"Peter's iPhone\",\"version\":\"2026.4.28\",\"platform\":\"iOS 18.4.0\",\"deviceFamily\":\"iPhone\",\"modelIdentifier\":\"iPhone17,1\",\"pushTransport\":\"relay\"}"}trigger एक closed enum है: background, silent_push, bg_app_refresh,
significant_location, manual, या connect। Unknown trigger strings को persistence से पहले gateway द्वारा
background में normalize किया जाता है। यह event केवल authenticated node
device sessions के लिए durable है; device-less या unpaired sessions handled: false लौटाते हैं।
सफल gateways structured result लौटाते हैं:
{ "ok": true, "event": "node.presence.alive", "handled": true, "reason": "persisted"}पुराने gateways node.event के लिए अब भी { "ok": true } लौटा सकते हैं; clients को इसे
acknowledged RPC के रूप में मानना चाहिए, durable presence persistence के रूप में नहीं।
Broadcast event scoping
Server-pushed WebSocket broadcast events scope-gated होते हैं ताकि pairing-scoped या node-only sessions निष्क्रिय रूप से session content प्राप्त न करें।
- Chat, agent, और tool-result frames (streamed
agentevents और tool call results सहित) के लिए कम से कमoperator.readआवश्यक है।operator.readके बिना sessions इन frames को पूरी तरह skip करते हैं। - Plugin-defined
plugin.*broadcasts Plugin ने उन्हें कैसे register किया है, इसके आधार परoperator.writeयाoperator.adminतक gated होते हैं। - Status और transport events (
heartbeat,presence,tick, connect/disconnect lifecycle, आदि) unrestricted रहते हैं ताकि transport health हर authenticated session को observable रहे। - Unknown broadcast event families default रूप से scope-gated (fail-closed) होते हैं जब तक कोई registered handler उन्हें explicitly relax न करे।
हर client connection अपना per-client sequence number रखता है ताकि broadcasts उस socket पर monotonic ordering बनाए रखें, भले ही अलग-अलग clients event stream के अलग-अलग scope-filtered subsets देखें।
सामान्य RPC method families
Public WS surface ऊपर दिए handshake/auth examples से व्यापक है। यह
generated dump नहीं है — hello-ok.features.methods एक conservative
discovery list है जो src/gateway/server-methods-list.ts और loaded
plugin/channel method exports से बनी है। इसे feature discovery मानें, src/gateway/server-methods/*.ts की full
enumeration नहीं।
सिस्टम और पहचान
healthकैश किया हुआ या नए सिरे से जांचा गया Gateway स्वास्थ्य स्नैपशॉट लौटाता है।diagnostics.stabilityहाल का सीमित डायग्नोस्टिक स्थिरता रिकॉर्डर लौटाता है। यह इवेंट नाम, गणना, बाइट आकार, मेमरी रीडिंग, क्यू/सेशन स्थिति, चैनल/Plugin नाम, और सेशन id जैसे परिचालन मेटाडेटा रखता है। यह चैट टेक्स्ट, Webhook बॉडी, टूल आउटपुट, कच्ची अनुरोध या प्रतिक्रिया बॉडी, टोकन, कुकी, या गुप्त मान नहीं रखता। ऑपरेटर रीड स्कोप आवश्यक है।status/status-शैली का Gateway सारांश लौटाता है; संवेदनशील फील्ड केवल admin-स्कोप वाले ऑपरेटर क्लाइंट के लिए शामिल किए जाते हैं।gateway.identity.getrelay और pairing फ्लो में उपयोग की जाने वाली Gateway डिवाइस पहचान लौटाता है।system-presenceकनेक्टेड ऑपरेटर/node डिवाइसों के लिए वर्तमान presence स्नैपशॉट लौटाता है।system-eventएक सिस्टम इवेंट जोड़ता है और presence context को अपडेट/ब्रॉडकास्ट कर सकता है।last-heartbeatनवीनतम सहेजा गया Heartbeat इवेंट लौटाता है।set-heartbeatsGateway पर Heartbeat प्रोसेसिंग को टॉगल करता है।
मॉडल और उपयोग
models.listruntime-अनुमत मॉडल कैटलॉग लौटाता है। पिकर-आकार के configured मॉडल (agents.defaults.modelsपहले, फिरmodels.providers.*.models) के लिए{ "view": "configured" }पास करें, या पूरे कैटलॉग के लिए{ "view": "all" }पास करें।usage.statusprovider उपयोग विंडो/शेष quota सारांश लौटाता है।usage.costकिसी date range के लिए aggregated cost usage सारांश लौटाता है। एक agent के लिएagentIdपास करें, या configured agents को aggregate करने के लिएagentScope: "all"पास करें।doctor.memory.statusactive default agent workspace के लिए vector-memory / cached embedding readiness लौटाता है।{ "probe": true }या{ "deep": true }केवल तब पास करें जब caller स्पष्ट रूप से live embedding provider ping चाहता हो। Dreaming-aware clients चयनित agent workspace तक Dreaming store stats को scope करने के लिए{ "agentId": "agent-id" }भी पास कर सकते हैं;agentIdछोड़ने पर default-agent fallback बना रहता है और configured Dreaming workspaces aggregate होते हैं।doctor.memory.dreamDiary,doctor.memory.backfillDreamDiary,doctor.memory.resetDreamDiary,doctor.memory.resetGroundedShortTerm,doctor.memory.repairDreamingArtifacts, औरdoctor.memory.dedupeDreamDiaryचयनित-agent Dreaming views/actions के लिए वैकल्पिक{ "agentId": "agent-id" }params स्वीकार करते हैं। जबagentIdछोड़ा जाता है, वे configured default agent workspace पर काम करते हैं।doctor.memory.remHarnessremote control-plane clients के लिए सीमित, read-only REM harness preview लौटाता है। इसमें workspace paths, memory snippets, rendered grounded markdown, और deep promotion candidates शामिल हो सकते हैं, इसलिए callers कोoperator.readचाहिए।sessions.usageप्रति-session usage सारांश लौटाता है। एक agent के लिएagentIdपास करें, या configured agents को साथ सूचीबद्ध करने के लिएagentScope: "all"पास करें।sessions.usage.timeseriesएक session के लिए timeseries usage लौटाता है।sessions.usage.logsएक session के लिए usage log entries लौटाता है।
चैनल और login helpers
channels.statusbuilt-in + bundled channel/Plugin status सारांश लौटाता है।channels.logoutऐसे specific channel/account को logout करता है जहां channel logout support करता है।web.login.startवर्तमान QR-capable web channel provider के लिए QR/web login flow शुरू करता है।web.login.waitउस QR/web login flow के complete होने की प्रतीक्षा करता है और सफलता पर channel शुरू करता है।push.testregistered iOS node को test APNs push भेजता है।voicewake.getstored wake-word triggers लौटाता है।voicewake.setwake-word triggers अपडेट करता है और बदलाव broadcast करता है।
Messaging और logs
sendchat runner के बाहर channel/account/thread-targeted sends के लिए direct outbound-delivery RPC है।logs.tailcursor/limit और max-byte controls के साथ configured Gateway file-log tail लौटाता है।
Talk और TTS
talk.catalogspeech, streaming transcription, और realtime voice के लिए read-only Talk provider catalog लौटाता है। इसमें provider ids, labels, configured state, exposed model/voice ids, canonical modes, transports, brain strategies, और realtime audio/capability flags शामिल होते हैं, बिना provider secrets लौटाए या global config mutate किए।talk.configeffective Talk config payload लौटाता है;includeSecretsके लिएoperator.talk.secrets(याoperator.admin) आवश्यक है।talk.session.createrealtime/gateway-relay,transcription/gateway-relay, याstt-tts/managed-roomके लिए Gateway-owned Talk session बनाता है।stt-tts/managed-roomके लिए,operator.writecallers जोsessionKeyपास करते हैं उन्हें scoped session-key visibility के लिएspawnedByभी पास करना होगा; unscopedsessionKeycreation औरbrain: "direct-tools"के लिएoperator.adminआवश्यक है।talk.session.joinmanaged-room session token validate करता है, जरूरत के अनुसारsession.readyयाsession.replacedevents emit करता है, और plaintext token या stored token hash के बिना room/session metadata और recent Talk events लौटाता है।talk.session.appendAudioGateway-owned realtime relay और transcription sessions में base64 PCM input audio जोड़ता है।talk.session.startTurn,talk.session.endTurn, औरtalk.session.cancelTurnstate clear होने से पहले stale-turn rejection के साथ managed-room turn lifecycle चलाते हैं।talk.session.cancelOutputassistant audio output रोकता है, मुख्य रूप से Gateway relay sessions में VAD-gated barge-in के लिए।talk.session.submitToolResultGateway-owned realtime relay session द्वारा emit की गई provider tool call complete करता है। interim tool output के लिएoptions: { willContinue: true }पास करें जब final result बाद में आएगा, याoptions: { suppressResponse: true }जब tool result को दूसरा realtime assistant response शुरू किए बिना provider call satisfy करनी चाहिए।talk.session.steerGateway-owned agent-backed Talk session में active-run voice control भेजता है। यह{ sessionId, text, mode? }स्वीकार करता है, जहांmodestatus,steer,cancel, याfollowupहै; छोड़ा गया mode बोले गए text से classify किया जाता है।talk.session.closeGateway-owned relay, transcription, या managed-room session बंद करता है और terminal Talk events emit करता है।talk.modeWebChat/Control UI clients के लिए current Talk mode state set/broadcast करता है।talk.client.createwebrtcयाprovider-websocketका उपयोग करके client-owned realtime provider session बनाता है, जबकि Gateway config, credentials, instructions, और tool policy own करता है।talk.client.toolCallclient-owned realtime transports को provider tool calls Gateway policy तक forward करने देता है। पहला supported toolopenclaw_agent_consultहै; clients को run id मिलता है और provider-specific tool result submit करने से पहले वे normal chat lifecycle events की प्रतीक्षा करते हैं।talk.client.steerclient-owned realtime transports के लिए active-run voice control भेजता है। GatewaysessionKeyसे active embedded run resolve करता है और steering को चुपचाप drop करने के बजाय structured accepted/rejected result लौटाता है।talk.eventrealtime, transcription, STT/TTS, managed-room, telephony, और meeting adapters के लिए single Talk event channel है।talk.speakactive Talk speech provider के माध्यम से speech synthesize करता है।tts.statusTTS enabled state, active provider, fallback providers, और provider config state लौटाता है।tts.providersvisible TTS provider inventory लौटाता है।tts.enableऔरtts.disableTTS prefs state टॉगल करते हैं।tts.setProviderpreferred TTS provider अपडेट करता है।tts.convertone-shot text-to-speech conversion चलाता है।
Secrets, config, update, और wizard
secrets.reloadactive SecretRefs को फिर से resolve करता है और केवल full success पर runtime secret state swap करता है।secrets.resolvespecific command/target set के लिए command-target secret assignments resolve करता है।config.getcurrent config snapshot और hash लौटाता है।config.setvalidated config payload लिखता है।config.patchpartial config update merge करता है। Destructive array replacement के लिए affected path काreplacePathsमें होना आवश्यक है; array entries के तहत nested arraysagents.list[].skillsजैसे[]paths उपयोग करते हैं।config.applyfull config payload को validate + replace करता है।config.schemaControl UI और CLI tooling द्वारा उपयोग किया गया live config schema payload लौटाता है: schema,uiHints, version, और generation metadata, जिसमें runtime द्वारा load किए जा सकने पर plugin + channel schema metadata शामिल है। schema में UI द्वारा उपयोग किए गए उन्हीं labels और help text से derived fieldtitle/descriptionmetadata शामिल है, जिसमें matching field documentation मौजूद होने पर nested object, wildcard, array-item, औरanyOf/oneOf/allOfcomposition branches शामिल हैं।config.schema.lookupएक config path के लिए path-scoped lookup payload लौटाता है: normalized path, shallow schema node, matched hint +hintPath, optionalreloadKind, और UI/CLI drill-down के लिए immediate child summaries।reloadKindrestart,hot, याnoneमें से एक है और requested path के लिए Gateway config reload planner को mirror करता है। Lookup schema nodes user-facing docs और common validation fields (title,description,type,enum,const,format,pattern, numeric/string/array/object bounds, औरadditionalProperties,deprecated,readOnly,writeOnlyजैसे flags) रखते हैं। Child summarieskey, normalizedpath,type,required,hasChildren, optionalreloadKind, साथ ही matchedhint/hintPathexpose करते हैं।update.runGateway update flow चलाता है और restart केवल तब schedule करता है जब update स्वयं सफल हो; session वाले callerscontinuationMessageशामिल कर सकते हैं ताकि startup restart continuation queue के माध्यम से एक follow-up agent turn resume करे। control plane से package-manager updates और supervised git-checkout updates live Gateway के अंदर package tree replace करने या checkout/build output mutate करने के बजाय detached managed-service handoff का उपयोग करते हैं। शुरू किया गया handoffresult.reason: "managed-service-handoff-started"औरhandoff.status: "started"के साथok: trueलौटाता है; unavailable या failed handoffsmanaged-service-handoff-unavailableयाmanaged-service-handoff-failedके साथok: falseलौटाते हैं, साथ में manual shell update आवश्यक होने परhandoff.commandभी। unavailable handoff का अर्थ है कि OpenClaw के पास safe supervisor boundary या durable service identity नहीं है, जैसे systemd के लिएOPENCLAW_SYSTEMD_UNIT। शुरू किए गए handoff के दौरान, restart sentinel थोड़े समय के लिएstats.reason: "restart-health-pending"report कर सकता है; continuation तब तक delay होता है जब तक CLI restarted Gateway verify नहीं करता और finaloksentinel नहीं लिखता।update.statuslatest update restart sentinel refresh करके लौटाता है, उपलब्ध होने पर post-restart running version सहित।wizard.start,wizard.next,wizard.status, औरwizard.cancelWS RPC पर onboarding wizard expose करते हैं।
एजेंट और कार्यस्थान सहायक
agents.listप्रभावी मॉडल और रनटाइम मेटाडेटा सहित कॉन्फ़िगर की गई एजेंट प्रविष्टियां लौटाता है।agents.create,agents.update, औरagents.deleteएजेंट रिकॉर्ड और कार्यस्थान वायरिंग का प्रबंधन करते हैं।agents.files.list,agents.files.get, औरagents.files.setकिसी एजेंट के लिए उजागर की गई बूटस्ट्रैप कार्यस्थान फ़ाइलों का प्रबंधन करते हैं।tasks.list,tasks.get, औरtasks.cancelSDK और ऑपरेटर क्लाइंट के लिए Gateway टास्क लेजर उजागर करते हैं।artifacts.list,artifacts.get, औरartifacts.downloadस्पष्टsessionKey,runId, याtaskIdस्कोप के लिए ट्रांसक्रिप्ट-व्युत्पन्न आर्टिफैक्ट सारांश और डाउनलोड उजागर करते हैं। रन और टास्क क्वेरी सर्वर-साइड स्वामी सत्र को रिज़ॉल्व करती हैं और केवल मेल खाते उद्गम वाली ट्रांसक्रिप्ट मीडिया लौटाती हैं; असुरक्षित या स्थानीय URL स्रोत सर्वर-साइड फ़ेच करने के बजाय असमर्थित डाउनलोड लौटाते हैं।environments.listऔरenvironments.statusSDK क्लाइंट के लिए केवल-पठन Gateway-स्थानीय और नोड परिवेश खोज उजागर करते हैं।agent.identity.getकिसी एजेंट या सत्र के लिए प्रभावी असिस्टेंट पहचान लौटाता है।agent.waitकिसी रन के समाप्त होने की प्रतीक्षा करता है और उपलब्ध होने पर टर्मिनल स्नैपशॉट लौटाता है।
सत्र नियंत्रण
sessions.listवर्तमान सत्र इंडेक्स लौटाता है, जिसमें एजेंट रनटाइम बैकएंड कॉन्फ़िगर होने पर प्रति-पंक्तिagentRuntimeमेटाडेटा शामिल होता है।sessions.subscribeऔरsessions.unsubscribeवर्तमान WS क्लाइंट के लिए सत्र परिवर्तन इवेंट सदस्यताएं टॉगल करते हैं।sessions.messages.subscribeऔरsessions.messages.unsubscribeएक सत्र के लिए ट्रांसक्रिप्ट/संदेश इवेंट सदस्यताएं टॉगल करते हैं।sessions.previewविशिष्ट सत्र कुंजियों के लिए सीमित ट्रांसक्रिप्ट पूर्वावलोकन लौटाता है।sessions.describeसटीक सत्र कुंजी के लिए एक Gateway सत्र पंक्ति लौटाता है।sessions.resolveकिसी सत्र लक्ष्य को रिज़ॉल्व या कैननिकलाइज़ करता है।sessions.createनई सत्र प्रविष्टि बनाता है।sessions.sendमौजूदा सत्र में संदेश भेजता है।sessions.steerसक्रिय सत्र के लिए interrupt-and-steer वैरिएंट है।sessions.abortकिसी सत्र के लिए सक्रिय कार्य को रोकता है। कॉलरkeyके साथ वैकल्पिकrunIdपास कर सकता है, या सक्रिय रनों के लिए केवलrunIdपास कर सकता है जिन्हें Gateway किसी सत्र में रिज़ॉल्व कर सकता है।sessions.patchसत्र मेटाडेटा/ओवरराइड अपडेट करता है और रिज़ॉल्व किया गया कैननिकल मॉडल तथा प्रभावीagentRuntimeरिपोर्ट करता है।sessions.reset,sessions.delete, औरsessions.compactसत्र रखरखाव करते हैं।sessions.getपूरी संग्रहित सत्र पंक्ति लौटाता है।- चैट निष्पादन अब भी
chat.history,chat.send,chat.abort, औरchat.injectका उपयोग करता है। UI क्लाइंट के लिएchat.historyप्रदर्शन-सामान्यीकृत है: इनलाइन निर्देश टैग दृश्य पाठ से हटाए जाते हैं, प्लेन-टेक्स्ट टूल-कॉल XML पेलोड (जिसमें<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>, और कटे हुए टूल-कॉल ब्लॉक शामिल हैं) और लीक हुए ASCII/पूर्ण-चौड़ाई मॉडल नियंत्रण टोकन हटाए जाते हैं, शुद्ध मौन-टोकन असिस्टेंट पंक्तियां जैसे सटीकNO_REPLY/no_replyछोड़ी जाती हैं, और बहुत बड़ी पंक्तियों को प्लेसहोल्डर से बदला जा सकता है। chat.message.getएकल दृश्य ट्रांसक्रिप्ट प्रविष्टि के लिए additive सीमित पूर्ण-संदेश रीडर है। क्लाइंटsessionKey, सत्र चयन एजेंट-स्कोप्ड होने पर वैकल्पिकagentId, साथ ही पहलेchat.historyके माध्यम से सतह पर आए ट्रांसक्रिप्टmessageIdपास करते हैं, और Gateway वही प्रदर्शन-सामान्यीकृत प्रोजेक्शन लौटाता है, हल्के history truncation cap के बिना, जब संग्रहित प्रविष्टि अब भी उपलब्ध हो और बहुत बड़ी न हो।chat.sendऑटो कटऑफ से पहले शुरू किए गए मॉडल कॉल के लिए fast mode का उपयोग करने हेतु one-turnfastMode: "auto"स्वीकार करता है, फिर बाद के retry, fallback, tool-result, या continuation कॉल fast mode के बिना शुरू करता है। कटऑफ डिफ़ॉल्ट रूप से 60 सेकंड है और प्रति मॉडलagents.defaults.models["<provider>/<model>"].params.fastAutoOnSecondsसे कॉन्फ़िगर किया जा सकता है।chat.sendकॉलर उस अनुरोध के लिए कटऑफ ओवरराइड करने हेतु one-turnfastAutoOnSecondsपास कर सकता है।
डिवाइस पेयरिंग और डिवाइस टोकन
device.pair.listलंबित और स्वीकृत पेयर किए गए डिवाइस लौटाता है।device.pair.approve,device.pair.reject, औरdevice.pair.removeडिवाइस-पेयरिंग रिकॉर्ड का प्रबंधन करते हैं।device.token.rotateपेयर किए गए डिवाइस टोकन को उसकी स्वीकृत भूमिका और कॉलर स्कोप सीमाओं के भीतर रोटेट करता है।device.token.revokeपेयर किए गए डिवाइस टोकन को उसकी स्वीकृत भूमिका और कॉलर स्कोप सीमाओं के भीतर निरस्त करता है।
नोड पेयरिंग, invoke, और लंबित कार्य
node.pair.request,node.pair.list,node.pair.approve,node.pair.reject,node.pair.remove, औरnode.pair.verifyनोड पेयरिंग और बूटस्ट्रैप सत्यापन को कवर करते हैं।node.listऔरnode.describeज्ञात/कनेक्टेड नोड स्थिति लौटाते हैं।node.renameपेयर किए गए नोड लेबल को अपडेट करता है।node.invokeकनेक्टेड नोड को कमांड अग्रेषित करता है।node.invoke.resultinvoke अनुरोध के लिए परिणाम लौटाता है।node.eventनोड-जनित इवेंट को gateway में वापस ले जाता है।node.pending.pullऔरnode.pending.ackकनेक्टेड-नोड queue APIs हैं।node.pending.enqueueऔरnode.pending.drainऑफ़लाइन/डिस्कनेक्टेड नोड के लिए durable pending work का प्रबंधन करते हैं।
स्वीकृति परिवार
exec.approval.request,exec.approval.get,exec.approval.list, औरexec.approval.resolveone-shot exec स्वीकृति अनुरोधों के साथ लंबित स्वीकृति lookup/replay को कवर करते हैं।exec.approval.waitDecisionएक लंबित exec स्वीकृति की प्रतीक्षा करता है और अंतिम निर्णय लौटाता है (या timeout परnull)।exec.approvals.getऔरexec.approvals.setgateway exec स्वीकृति नीति snapshots का प्रबंधन करते हैं।exec.approvals.node.getऔरexec.approvals.node.setnode relay commands के माध्यम से node-local exec स्वीकृति नीति का प्रबंधन करते हैं।plugin.approval.request,plugin.approval.list,plugin.approval.waitDecision, औरplugin.approval.resolveplugin-defined स्वीकृति flows को कवर करते हैं।
ऑटोमेशन, skills, और टूल
- ऑटोमेशन:
wakeतत्काल या अगले-heartbeat wake text injection शेड्यूल करता है;cron.get,cron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runsनिर्धारित कार्य का प्रबंधन करते हैं। cron.runमैनुअल runs के लिए enqueue-style RPC बना रहता है। जिन क्लाइंट को completion semantics चाहिए, उन्हें लौटाया गयाrunIdपढ़ना चाहिए औरcron.runspoll करना चाहिए।cron.runsवैकल्पिक non-emptyrunIdफ़िल्टर स्वीकार करता है ताकि क्लाइंट उसी job के अन्य history entries से race किए बिना एक queued manual run को follow कर सकें।- Skills और टूल:
commands.list,skills.*,tools.catalog,tools.effective,tools.invoke.
सामान्य इवेंट परिवार
chat: UI चैट अपडेट जैसेchat.injectऔर अन्य केवल-ट्रांसक्रिप्ट चैट इवेंट। protocol v4 में, delta payloadsdeltaTextले जाते हैं;messagecumulative assistant snapshot बना रहता है। Non-prefix replacementsreplace=trueसेट करते हैं औरdeltaTextको replacement text के रूप में उपयोग करते हैं।session.message,session.operation, औरsession.tool: subscribed session के लिए transcript, in-flight session operation, और event-stream updates।sessions.changed: सत्र इंडेक्स या मेटाडेटा बदला।presence: सिस्टम उपस्थिति snapshot updates।tick: periodic keepalive / liveness event।health: gateway health snapshot update।heartbeat: heartbeat event stream update।cron: cron run/job change event।shutdown: gateway shutdown notification।node.pair.requested/node.pair.resolved: नोड पेयरिंग lifecycle।node.invoke.request: node invoke request broadcast।device.pair.requested/device.pair.resolved: paired-device lifecycle।voicewake.changed: wake-word trigger config changed।exec.approval.requested/exec.approval.resolved: exec approval lifecycle।plugin.approval.requested/plugin.approval.resolved: plugin approval lifecycle।
नोड सहायक विधियां
- नोड auto-allow checks के लिए skill executables की वर्तमान सूची फ़ेच करने हेतु
skills.binsकॉल कर सकते हैं।
टास्क लेजर RPCs
ऑपरेटर क्लाइंट task ledger RPCs के माध्यम से Gateway background task records का निरीक्षण और रद्द कर सकते हैं। ये विधियां raw runtime state नहीं, बल्कि sanitized task summaries लौटाती हैं।
tasks.listके लिएoperator.readआवश्यक है।- Params: वैकल्पिक
status("queued","running","completed","failed","cancelled", या"timed_out") या उन statuses की array, वैकल्पिकagentId, वैकल्पिकsessionKey, वैकल्पिकlimit1से500तक, और वैकल्पिक stringcursor। - Result:
{ "tasks": TaskSummary[], "nextCursor"?: string }।
- Params: वैकल्पिक
tasks.getके लिएoperator.readआवश्यक है।- Params:
{ "taskId": string }। - Result:
{ "task": TaskSummary }। - गुम task ids Gateway not-found error shape लौटाते हैं।
- Params:
tasks.cancelके लिएoperator.writeआवश्यक है।- Params:
{ "taskId": string, "reason"?: string }। - Result:
{ "found": boolean, "cancelled": boolean, "reason"?: string, "task"?: TaskSummary }। foundरिपोर्ट करता है कि ledger में matching task था या नहीं।cancelledरिपोर्ट करता है कि runtime ने cancellation स्वीकार या record किया या नहीं।
- Params:
TaskSummary में id, status, और वैकल्पिक मेटाडेटा जैसे kind,
runtime, title, agentId, sessionKey, childSessionKey, ownerKey,
runId, taskId, flowId, parentTaskId, sourceId, timestamps, progress,
terminal summary, और sanitized error text शामिल होते हैं। agentId task
execute करने वाले agent की पहचान करता है; sessionKey और ownerKey requester और control
context को preserve करते हैं।
ऑपरेटर सहायक विधियां
- ऑपरेटर किसी एजेंट के लिए runtime command inventory प्राप्त करने हेतु
commands.list(operator.read) कॉल कर सकते हैं।agentIdवैकल्पिक है; default agent workspace पढ़ने के लिए इसे छोड़ दें।scopeनियंत्रित करता है कि primarynameकिस सतह को target करता है:textleading/के बिना primary text command token लौटाता हैnativeऔर defaultbothpath उपलब्ध होने पर provider-aware native names लौटाते हैं
textAliases/modelऔर/mजैसे exact slash aliases रखता है।nativeNameprovider-aware native command name रखता है जब कोई मौजूद हो।providerवैकल्पिक है और केवल native naming तथा native Plugin command availability को प्रभावित करता है।includeArgs=falseresponse से serialized argument metadata हटा देता है।
- ऑपरेटर किसी एजेंट के लिए runtime tool catalog प्राप्त करने हेतु
tools.catalog(operator.read) कॉल कर सकते हैं। response में grouped tools और provenance metadata शामिल होते हैं:source:coreयाpluginpluginId: Plugin owner जबsource="plugin"optional: क्या कोई Plugin tool optional है
- ऑपरेटर किसी session के लिए runtime-effective tool inventory प्राप्त करने हेतु
tools.effective(operator.read) कॉल कर सकते हैं।sessionKeyआवश्यक है।- Gateway caller-supplied auth या delivery context स्वीकार करने के बजाय session server-side से trusted runtime context निकालता है।
- response active inventory का session-scoped server-derived projection है, जिसमें core, Plugin, channel, और पहले से discovered MCP server tools शामिल हैं।
tools.effectiveMCP के लिए read-only है: यह warm session MCP catalog को final tool policy के जरिए project कर सकता है, लेकिन MCP runtimes नहीं बनाता, transports connect नहीं करता, याtools/listissue नहीं करता। यदि कोई matching warm catalog मौजूद नहीं है, तो response मेंmcp-not-yet-connected,mcp-not-yet-listed, याmcp-stale-catalogजैसा notice शामिल हो सकता है।- Effective tool entries
source="core",source="plugin",source="channel", याsource="mcp"का उपयोग करती हैं।
- ऑपरेटर
/tools/invokeजैसे ही Gateway policy path के जरिए एक उपलब्ध tool invoke करने हेतुtools.invoke(operator.write) कॉल कर सकते हैं।nameआवश्यक है।args,sessionKey,agentId,confirm, औरidempotencyKeyवैकल्पिक हैं।- यदि
sessionKeyऔरagentIdदोनों मौजूद हैं, तो resolved session agent कोagentIdसे match करना होगा। cron,gateway, औरnodesजैसे owner-only core wrappers को owner/admin identity (operator.admin) चाहिए, भले हीtools.invokemethod स्वयंoperator.writeहो।- response SDK-facing envelope है जिसमें
ok,toolName, optionaloutput, और typederrorfields होते हैं। Approval या policy refusals Gateway tool policy pipeline को bypass करने के बजाय payload मेंok:falseलौटाते हैं।
- ऑपरेटर किसी एजेंट के लिए visible skill inventory प्राप्त करने हेतु
skills.status(operator.read) कॉल कर सकते हैं।agentIdवैकल्पिक है; default agent workspace पढ़ने के लिए इसे छोड़ दें।- response में eligibility, missing requirements, config checks, और raw secret values उजागर किए बिना sanitized install options शामिल होते हैं।
- ऑपरेटर ClawHub discovery metadata के लिए
skills.searchऔरskills.detail(operator.read) कॉल कर सकते हैं। - ऑपरेटर install करने से पहले private skill archive stage करने हेतु
skills.upload.begin,skills.upload.chunk, औरskills.upload.commit(operator.admin) कॉल कर सकते हैं। यह trusted clients के लिए अलग admin upload path है, सामान्य ClawHub skill install flow नहीं, और default रूप से disabled रहता है जब तकskills.install.allowUploadedArchivesenabled न हो।skills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })उस slug और force value से bound upload बनाता है।skills.upload.chunk({ uploadId, offset, dataBase64 })exact decoded offset पर bytes append करता है।skills.upload.commit({ uploadId, sha256? })final size और SHA-256 verify करता है। Commit केवल upload को finalize करता है; यह skill install नहीं करता।- Uploaded skill archives ऐसे zip archives हैं जिनमें
SKILL.mdroot होता है। archive का internal directory name कभी install target select नहीं करता।
- ऑपरेटर तीन modes में
skills.install(operator.admin) कॉल कर सकते हैं:- ClawHub mode:
{ source: "clawhub", slug, version?, force? }default agent workspaceskills/directory में skill folder install करता है। - Upload mode:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }committed upload को default agent workspaceskills/<slug>directory में install करता है। slug और force value को originalskills.upload.beginrequest से match करना होगा। यह mode तब तक rejected रहता है जब तकskills.install.allowUploadedArchivesenabled न हो। setting ClawHub installs को प्रभावित नहीं करती। - Gateway installer mode:
{ name, installId, timeoutMs? }Gateway host पर declaredmetadata.openclaw.installaction चलाता है। पुराने clients अभी भीdangerouslyForceUnsafeInstallभेज सकते हैं; यह field deprecated है, केवल protocol compatibility के लिए accepted है, और ignored है। operator-owned install decisions के लिएsecurity.installPolicyका उपयोग करें।
- ClawHub mode:
- ऑपरेटर दो modes में
skills.update(operator.admin) कॉल कर सकते हैं:- ClawHub mode default agent workspace में एक tracked slug या सभी tracked ClawHub installs update करता है।
- Config mode
skills.entries.<skillKey>values जैसेenabled,apiKey, औरenvpatch करता है।
models.list views
models.list वैकल्पिक view parameter स्वीकार करता है:
- Omitted या
"default": current runtime behavior. यदिagents.defaults.modelsconfigured है, तो response allowed catalog है, जिसमेंprovider/*entries के लिए dynamically discovered models शामिल हैं। अन्यथा response full Gateway catalog है। "configured": picker-sized behavior. यदिagents.defaults.modelsconfigured है, तो वही प्राथमिक रहता है, जिसमेंprovider/*entries के लिए provider-scoped discovery शामिल है। allowlist के बिना, response explicitmodels.providers.*.modelsentries का उपयोग करता है, और full catalog पर केवल तभी fallback करता है जब कोई configured model rows मौजूद न हों।"all": full Gateway catalog,agents.defaults.modelsको bypass करते हुए। इसका उपयोग diagnostics और discovery UIs के लिए करें, normal model pickers के लिए नहीं।
Exec approvals
- जब किसी exec request को approval चाहिए, Gateway
exec.approval.requestedbroadcast करता है। - Operator clients
exec.approval.resolveकॉल करके resolve करते हैं (operator.approvalsscope आवश्यक है)। host=nodeके लिए,exec.approval.requestमेंsystemRunPlan(canonicalargv/cwd/rawCommand/session metadata) शामिल होना चाहिए।systemRunPlanmissing वाली requests rejected होती हैं।- approval के बाद, forwarded
node.invoke system.runcalls उसी canonicalsystemRunPlanको authoritative command/cwd/session context के रूप में reuse करते हैं। - यदि कोई caller prepare और final approved
system.runforward के बीचcommand,rawCommand,cwd,agentId, याsessionKeymutate करता है, तो Gateway mutated payload पर trust करने के बजाय run reject करता है।
Agent delivery fallback
agentrequests outbound delivery request करने के लिएdeliver=trueशामिल कर सकती हैं।bestEffortDeliver=falsestrict behavior रखता है: unresolved या internal-only delivery targetsINVALID_REQUESTलौटाते हैं।bestEffortDeliver=trueतब session-only execution पर fallback की अनुमति देता है जब कोई external deliverable route resolve नहीं हो सकता (उदाहरण के लिए internal/webchat sessions या ambiguous multi-channel configs)।- Final
agentresults में delivery requested होने परresult.deliveryStatusशामिल हो सकता है, जोopenclaw agent --json --deliverके लिए documented समानsent,suppressed,partial_failed, औरfailedstatuses का उपयोग करता है।
Versioning
PROTOCOL_VERSIONpackages/gateway-protocol/src/version.tsमें रहता है।- Clients
minProtocol+maxProtocolभेजते हैं; server उन ranges को reject करता है जिनमें उसका current protocol शामिल नहीं है। current clients और servers को protocol v4 चाहिए। - Schemas + models TypeBox definitions से generated होते हैं:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Client constants
src/gateway/client.ts में reference client ये defaults उपयोग करता है। Values protocol v4 में stable हैं और third-party clients के लिए expected baseline हैं।
| Constant | Default | Source |
|---|---|---|
PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
MIN_CLIENT_PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
| Request timeout (प्रति RPC) | 30_000 ms |
src/gateway/client.ts (requestTimeoutMs) |
| Preauth / connect-challenge timeout | 15_000 ms |
src/gateway/handshake-timeouts.ts (config/env paired server/client budget बढ़ा सकता है) |
| Initial reconnect backoff | 1_000 ms |
src/gateway/client.ts (backoffMs) |
| Max reconnect backoff | 30_000 ms |
src/gateway/client.ts (scheduleReconnect) |
| Fast-retry clamp after device-token close | 250 ms |
src/gateway/client.ts |
Force-stop grace before terminate() |
250 ms |
FORCE_STOP_TERMINATE_GRACE_MS |
stopAndWait() default timeout |
1_000 ms |
STOP_AND_WAIT_TIMEOUT_MS |
Default tick interval (pre hello-ok) |
30_000 ms |
src/gateway/client.ts |
| Tick-timeout close | code 4000 when silence exceeds tickIntervalMs * 2 |
src/gateway/client.ts |
MAX_PAYLOAD_BYTES |
25 * 1024 * 1024 (25 MB) |
src/gateway/server-constants.ts |
server effective policy.tickIntervalMs, policy.maxPayload, और policy.maxBufferedBytes को hello-ok में advertise करता है; clients को pre-handshake defaults के बजाय उन values का honor करना चाहिए।
Auth
- Shared-secret Gateway auth कॉन्फ़िगर किए गए auth मोड के आधार पर
connect.params.auth.tokenयाconnect.params.auth.passwordका उपयोग करता है। - Tailscale Serve जैसे पहचान-धारी मोड
(
gateway.auth.allowTailscale: true) या non-loopbackgateway.auth.mode: "trusted-proxy"connect.params.auth.*के बजाय request headers से connect auth जांच पूरी करते हैं। - Private-ingress
gateway.auth.mode: "none"shared-secret connect auth को पूरी तरह छोड़ देता है; इस मोड को public/untrusted ingress पर expose न करें। - pairing के बाद, Gateway connection role + scopes तक सीमित device token जारी करता है।
यह
hello-ok.auth.deviceTokenमें लौटाया जाता है और client को future connects के लिए persist करना चाहिए। - Clients को किसी भी सफल connect के बाद primary
hello-ok.auth.deviceTokenpersist करना चाहिए। - उस stored device token के साथ reconnect करने पर उस token के लिए stored approved scope set भी reuse होना चाहिए। यह पहले से granted read/probe/status access को सुरक्षित रखता है और reconnects को चुपचाप संकरे implicit admin-only scope तक घटने से बचाता है।
- Client-side connect auth assembly (
src/gateway/client.tsमेंselectConnectAuth):auth.passwordorthogonal है और set होने पर हमेशा forward किया जाता है।auth.tokenpriority order में populate होता है: पहले explicit shared token, फिर explicitdeviceToken, फिर stored per-device token (deviceId+roleसे keyed)।auth.bootstrapTokenकेवल तब भेजा जाता है जब ऊपर में से किसी ने भीauth.tokenresolve न किया हो। shared token या कोई भी resolved device token इसे suppress कर देता है।- one-shot
AUTH_TOKEN_MISMATCHretry पर stored device token की auto-promotion केवल trusted endpoints तक gated है — loopback, या pinnedtlsFingerprintवालाwss://। Pinning के बिना publicwss://qualify नहीं करता।
- Built-in setup-code bootstrap primary node
hello-ok.auth.deviceTokenऔर trusted mobile handoff के लिएhello-ok.auth.deviceTokensमें bounded operator token लौटाता है। operator token में native Talk configuration reads के लिएoperator.talk.secretsशामिल है औरoperator.adminतथाoperator.pairingशामिल नहीं हैं। - जब non-baseline setup-code bootstrap approval की प्रतीक्षा कर रहा हो,
PAIRING_REQUIREDdetails मेंrecommendedNextStep: "wait_then_retry",retryable: true, औरpauseReconnect: falseशामिल होते हैं। Clients को उसी bootstrap token के साथ reconnect करते रहना चाहिए जब तक request approved न हो जाए या token invalid न हो जाए। hello-ok.auth.deviceTokensको केवल तब persist करें जब connect ने trusted transport जैसेwss://या loopback/local pairing पर bootstrap auth का उपयोग किया हो।- यदि कोई client explicit
deviceTokenया explicitscopessupply करता है, तो वह caller-requested scope set authoritative रहता है; cached scopes केवल तब reuse होते हैं जब client stored per-device token reuse कर रहा हो। - Device tokens को
device.token.rotateऔरdevice.token.revokeके जरिए rotate/revoke किया जा सकता है (operator.pairingscope आवश्यक)। node या किसी अन्य non-operator role को rotate या revoke करने के लिएoperator.adminभी आवश्यक है। device.token.rotaterotation metadata लौटाता है। यह replacement bearer token को केवल same-device calls के लिए echo करता है जो पहले से उस device token से authenticated हों, ताकि token-only clients reconnect करने से पहले अपना replacement persist कर सकें। Shared/admin rotations bearer token echo नहीं करते।- Token issuance, rotation, और revocation उस approved role set तक bounded रहते हैं जो उस device की pairing entry में recorded है; token mutation pairing approval द्वारा कभी grant न किए गए device role को expand या target नहीं कर सकता।
- Paired-device token sessions के लिए, device management self-scoped होता है जब तक
caller के पास
operator.adminभी न हो: non-admin callers केवल अपने स्वयं के device entry के operator token को manage कर सकते हैं। Node और अन्य non-operator token management admin-only है, caller के अपने device के लिए भी। device.token.rotateऔरdevice.token.revoketarget operator token scope set को caller के current session scopes के विरुद्ध भी check करते हैं। Non-admin callers अपने पास मौजूद scope से broader operator token को rotate या revoke नहीं कर सकते।- Auth failures में
error.details.codeऔर recovery hints शामिल होते हैं:error.details.canRetryWithDeviceToken(boolean)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
AUTH_TOKEN_MISMATCHके लिए client behavior:- Trusted clients cached per-device token के साथ एक bounded retry attempt कर सकते हैं।
- यदि वह retry fail हो जाए, clients को automatic reconnect loops रोककर operator action guidance दिखानी चाहिए।
AUTH_SCOPE_MISMATCHका अर्थ है कि device token recognized था लेकिन requested role/scopes को cover नहीं करता। Clients को इसे bad token के रूप में present नहीं करना चाहिए; operator को re-pair करने या संकरे/व्यापक scope contract को approve करने के लिए prompt करें।
Device identity + pairing
- Nodes को keypair fingerprint से derived stable device identity (
device.id) शामिल करनी चाहिए। - Gateways प्रति device + role tokens जारी करते हैं।
- नई device IDs के लिए pairing approvals आवश्यक हैं, जब तक local auto-approval enabled न हो।
- Pairing auto-approval direct local loopback connects पर centered है।
- OpenClaw में trusted shared-secret helper flows के लिए narrow backend/container-local self-connect path भी है।
- Same-host tailnet या LAN connects को pairing के लिए अब भी remote माना जाता है और approval आवश्यक होता है।
- WS clients आम तौर पर
connectके दौरानdeviceidentity शामिल करते हैं (operator + node)। केवल device-less operator exceptions explicit trust paths हैं:- localhost-only insecure HTTP compatibility के लिए
gateway.controlUi.allowInsecureAuth=true। - सफल
gateway.auth.mode: "trusted-proxy"operator Control UI auth। gateway.controlUi.dangerouslyDisableDeviceAuth=true(break-glass, गंभीर security downgrade)।- reserved internal helper path पर direct-loopback
gateway-clientbackend RPCs।
- localhost-only insecure HTTP compatibility के लिए
- Device identity omit करने के scope consequences होते हैं। जब device-less operator
connection किसी explicit trust path से allowed हो, OpenClaw फिर भी
self-declared scopes को empty set तक clear कर देता है जब तक उस path में named
scope-preservation exception न हो। Scope-gated methods फिर
missing scopeके साथ fail होते हैं। gateway.controlUi.dangerouslyDisableDeviceAuth=trueएक Control UI break-glass scope-preservation path है। यह arbitrary custom backend या CLI-shaped WebSocket clients को scopes grant नहीं करता।- Reserved direct-loopback
gateway-clientbackend helper path scopes को केवल internal local control-plane RPCs के लिए preserve करता है; custom backend IDs को यह exception नहीं मिलता। - सभी connections को server-provided
connect.challengenonce sign करना होगा।
Device auth migration diagnostics
legacy clients के लिए जो अभी भी pre-challenge signing behavior उपयोग करते हैं, connect अब
error.details.code के अंतर्गत stable error.details.reason के साथ
DEVICE_AUTH_* detail codes लौटाता है।
Common migration failures:
| Message | details.code | details.reason | Meaning |
|---|---|---|---|
device nonce required |
DEVICE_AUTH_NONCE_REQUIRED |
device-nonce-missing |
Client ने device.nonce omit किया (या blank भेजा)। |
device nonce mismatch |
DEVICE_AUTH_NONCE_MISMATCH |
device-nonce-mismatch |
Client ने stale/wrong nonce से sign किया। |
device signature invalid |
DEVICE_AUTH_SIGNATURE_INVALID |
device-signature |
Signature payload v2 payload से match नहीं करता। |
device signature expired |
DEVICE_AUTH_SIGNATURE_EXPIRED |
device-signature-stale |
Signed timestamp allowed skew से बाहर है। |
device identity mismatch |
DEVICE_AUTH_DEVICE_ID_MISMATCH |
device-id-mismatch |
device.id public key fingerprint से match नहीं करता। |
device public key invalid |
DEVICE_AUTH_PUBLIC_KEY_INVALID |
device-public-key |
Public key format/canonicalization fail हुई। |
Migration target:
- हमेशा
connect.challengeकी प्रतीक्षा करें। - server nonce शामिल करने वाले v2 payload को sign करें।
- वही nonce
connect.params.device.nonceमें भेजें। - Preferred signature payload
v3है, जो device/client/role/scopes/token/nonce fields के अलावाplatformऔरdeviceFamilyको bind करता है। - Legacy
v2signatures compatibility के लिए accepted रहती हैं, लेकिन paired-device metadata pinning reconnect पर command policy को अब भी control करती है।
TLS + pinning
- WS connections के लिए TLS supported है।
- Clients वैकल्पिक रूप से gateway cert fingerprint pin कर सकते हैं (
gateway.tlsconfig औरgateway.remote.tlsFingerprintया CLI--tls-fingerprintदेखें)।
Scope
यह protocol full Gateway API (status, channels, models, chat,
agent, sessions, nodes, approvals, आदि) expose करता है। Exact surface
packages/gateway-protocol/src/schema.ts में TypeBox schemas द्वारा defined है।