Gateway प्रोटोकॉल (WebSocket)¶
Gateway WS प्रोटोकॉल OpenClaw के लिए एकमात्र control plane + node transport है। सभी क्लाइंट (CLI, web UI, macOS ऐप, iOS/Android nodes, headless nodes) WebSocket के माध्यम से कनेक्ट होते हैं और handshake समय पर अपना role + scope घोषित करते हैं।
ट्रांसपोर्ट¶
- WebSocket, JSON पेलोड्स के साथ टेक्स्ट फ्रेम्स।
- पहला फ्रेम अनिवार्य रूप से
connectअनुरोध होना चाहिए।
हैंडशेक (कनेक्ट)¶
Gateway → Client (प्री-कनेक्ट चुनौती):
{
"type": "event",
"event": "connect.challenge",
"payload": { "nonce": "…", "ts": 1737264000000 }
}
क्लाइंट → Gateway:
{
"type": "req",
"id": "…",
"method": "connect",
"params": {
"minProtocol": 3,
"maxProtocol": 3,
"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": 3, "policy": { "tickIntervalMs": 15000 } }
}
जब कोई डिवाइस टोकन जारी किया जाता है, तो hello-ok में यह भी शामिल होता है:
{
"auth": {
"deviceToken": "…",
"role": "operator",
"scopes": ["operator.read", "operator.write"]
}
}
Node उदाहरण¶
{
"type": "req",
"id": "…",
"method": "connect",
"params": {
"minProtocol": 3,
"maxProtocol": 3,
"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": "…"
}
}
}
फ्रेमिंग¶
- अनुरोध:
{type:"req", id, method, params} - प्रतिक्रिया:
{type:"res", id, ok, payload|error} - घटना:
{type:"event", event, payload, seq?, stateVersion?}
साइड-इफ़ेक्ट वाले मेथड्स के लिए idempotency keys आवश्यक हैं (स्कीमा देखें)।
भूमिकाएँ + स्कोप¶
भूमिकाएँ¶
operator= कंट्रोल प्लेन क्लाइंट (CLI/UI/ऑटोमेशन)।node= क्षमता होस्ट (camera/screen/canvas/system.run)।
Scopes (operator)¶
सामान्य स्कोप्स:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairing
Caps/commands/permissions (node)¶
नोड्स कनेक्ट समय पर क्षमता दावे (capability claims) घोषित करते हैं:
caps: उच्च-स्तरीय क्षमता श्रेणियाँ।commands: invoke के लिए कमांड allowlist।permissions: सूक्ष्म टॉगल्स (जैसेscreen.record,camera.capture)।
Gateway इन्हें claims के रूप में मानता है और सर्वर-साइड allowlists लागू करता है।
Presence¶
system-presenceडिवाइस पहचान द्वारा कुंजीबद्ध प्रविष्टियाँ लौटाता है।- Presence प्रविष्टियों में
deviceId,roles, औरscopesशामिल होते हैं ताकि UI प्रति डिवाइस एक ही पंक्ति दिखा सकें, भले ही वह operator और node दोनों के रूप में कनेक्ट हो।
Node सहायक मेथड्स¶
- नोड्स
skills.binsको कॉल कर सकते हैं ताकि auto-allow जाँचों के लिए वर्तमान skill executables की सूची प्राप्त की जा सके।
Exec अनुमोदन¶
- जब किसी exec अनुरोध को अनुमोदन की आवश्यकता होती है, तो Gateway
exec.approval.requestedप्रसारित करता है। - Operator क्लाइंट्स
exec.approval.resolveको कॉल करके समाधान करते हैं (इसके लिएoperator.approvalsस्कोप आवश्यक है)।
Versioning¶
PROTOCOL_VERSIONsrc/gateway/protocol/schema.tsमें स्थित है।- क्लाइंट्स
minProtocol+maxProtocolभेजते हैं; सर्वर असंगतियों को अस्वीकार करता है। - स्कीमा + मॉडल TypeBox परिभाषाओं से जनरेट किए जाते हैं:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Auth¶
- यदि
OPENCLAW_GATEWAY_TOKEN(या--token) सेट है, तोconnect.params.auth.tokenमेल खाना चाहिए; अन्यथा सॉकेट बंद कर दिया जाता है। - pairing के बाद, Gateway कनेक्शन के role + scopes तक सीमित एक device token जारी करता है। यह
hello-ok.auth.deviceTokenमें लौटाया जाता है और भविष्य के कनेक्शनों के लिए क्लाइंट द्वारा सहेजा जाना चाहिए। - डिवाइस टोकन
device.token.rotateऔरdevice.token.revokeके माध्यम से रोटेट/रिवोक किए जा सकते हैं (इसके लिएoperator.pairingस्कोप आवश्यक है)।
Device identity + pairing¶
- नोड्स को एक स्थिर डिवाइस पहचान (
device.id) शामिल करनी चाहिए, जो keypair फ़िंगरप्रिंट से व्युत्पन्न हो। - Gateway प्रति डिवाइस + role टोकन जारी करता है।
- नए डिवाइस IDs के लिए पेयरिंग अनुमोदन आवश्यक हैं, जब तक कि स्थानीय auto-approval सक्षम न हो।
- Local कनेक्शनों में loopback और Gateway होस्ट का अपना tailnet पता शामिल होता है (ताकि same‑host tailnet binds भी auto‑approve हो सकें)।
- सभी WS क्लाइंट्स को
connectके दौरानdeviceपहचान शामिल करनी चाहिए (operator + node)। Control UI इसे केवल तब छोड़ सकता है जबgateway.controlUi.allowInsecureAuthसक्षम हो (या ब्रेक-ग्लास उपयोग के लिएgateway.controlUi.dangerouslyDisableDeviceAuth)। - गैर-स्थानीय कनेक्शनों को सर्वर द्वारा प्रदान किए गए
connect.challengenonce पर हस्ताक्षर करना होगा।
TLS + pinning¶
- WS कनेक्शनों के लिए TLS समर्थित है।
- क्लाइंट्स वैकल्पिक रूप से Gateway प्रमाणपत्र फ़िंगरप्रिंट को पिन कर सकते हैं
(देखें
gateway.tlsविन्यास तथाgateway.remote.tlsFingerprintया CLI--tls-fingerprint)।
Scope¶
यह प्रोटोकॉल पूरा गेटवे API (status, channels, models, chat,
agent, sessions, nodes, approvals, आदि) को एक्सपोज़ करता है। सटीक सतह src/gateway/protocol/schema.ts में TypeBox schemas द्वारा परिभाषित है।