प्रोटोकॉल के सत्य स्रोत के रूप में TypeBox
अंतिम अपडेट: 2026-01-10 TypeBox एक TypeScript-फर्स्ट स्कीमा लाइब्रेरी है। हम इसका उपयोग Gateway WebSocket प्रोटोकॉल (handshake, request/response, server events) को परिभाषित करने के लिए करते हैं। ये स्कीमाज़ रनटाइम वैलिडेशन, JSON Schema export, और macOS ऐप के लिए Swift codegen को ड्राइव करती हैं। एक ही source of truth; बाकी सब कुछ जनरेट किया जाता है। यदि आपको उच्च‑स्तरीय प्रोटोकॉल संदर्भ चाहिए, तो Gateway architecture से शुरू करें।मानसिक मॉडल (30 सेकंड)
हर Gateway WS संदेश तीन में से एक फ्रेम होता है:- Request:
{ type: "req", id, method, params } - Response:
{ type: "res", id, ok, payload | error } - Event:
{ type: "event", event, payload, seq?, stateVersion? }पहला फ़्रेम ज़रूर एकconnectरिक्वेस्ट होना चाहिए।
health, send, chat.send) कॉल कर सकते हैं और इवेंट्स (जैसे presence, tick, agent) को सब्सक्राइब कर सकते हैं। सर्वर साइड: हर इनबाउंड फ़्रेम को AJV से वैलिडेट किया जाता है।
कनेक्शन फ्लो (न्यूनतम):
| Category | Examples | Notes |
|---|---|---|
| Core | connect, health, status | connect सबसे पहले होना चाहिए |
| Messaging | send, poll, agent, agent.wait | साइड‑इफेक्ट्स के लिए idempotencyKey आवश्यक |
| Chat | chat.history, chat.send, chat.abort, chat.inject | WebChat इन्हीं का उपयोग करता है |
| Sessions | sessions.list, sessions.patch, sessions.delete | सत्र प्रशासन |
| Nodes | node.list, node.invoke, node.pair.* | Gateway WS + नोड क्रियाएँ |
| Events | tick, presence, agent, chat, health, shutdown | सर्वर पुश |
src/gateway/server.ts में रहती है (METHODS, EVENTS)।
स्कीमा कहाँ रहते हैं
- Source:
src/gateway/protocol/schema.ts - Runtime validators (AJV):
src/gateway/protocol/index.ts - Server handshake + method dispatch:
src/gateway/server.ts - Node client:
src/gateway/client.ts - Generated JSON Schema:
dist/protocol.schema.json - Generated Swift models:
apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
वर्तमान पाइपलाइन
pnpm protocol:gen- JSON Schema (draft‑07) को
dist/protocol.schema.jsonमें लिखता है
- JSON Schema (draft‑07) को
pnpm protocol:gen:swift- Swift gateway मॉडल्स जनरेट करता है
pnpm protocol:check- दोनों जनरेटर चलाता है और सत्यापित करता है कि आउटपुट कमिट किया गया है
रनटाइम पर स्कीमा का उपयोग कैसे होता है
- हैंडशेक केवल उसी
connectरिक्वेस्ट को स्वीकार करता है जिसके paramsConnectParamsसे मेल खाते हों। जनरेट किया गया JSON Schema repo मेंdist/protocol.schema.jsonपर मौजूद है। - Client side: JS क्लाइंट इवेंट और प्रतिक्रिया फ्रेम्स का उपयोग करने से पहले उन्हें वैलिडेट करता है।
- Method surface: Gateway समर्थित
methodsऔरeventsकोhello-okमें विज्ञापित करता है।
उदाहरण फ्रेम्स
Connect (पहला संदेश):न्यूनतम क्लाइंट (Node.js)
सबसे छोटा उपयोगी फ्लो: connect + health।वर्क्ड उदाहरण: एक मेथड को एंड‑टू‑एंड जोड़ना
उदाहरण: एक नयाsystem.echo अनुरोध जोड़ें जो { ok: true, text } लौटाता है।
- Schema (सत्य का स्रोत)
src/gateway/protocol/schema.ts में जोड़ें:
ProtocolSchemas में जोड़ें और टाइप्स एक्सपोर्ट करें:
- सत्यापन
src/gateway/protocol/index.ts में, एक AJV वैलिडेटर एक्सपोर्ट करें:
- सर्वर का व्यवहार
src/gateway/server-methods/system.ts में एक हैंडलर जोड़ें:
src/gateway/server-methods.ts में रजिस्टर करें (जो पहले से systemHandlers को मर्ज करता है),
फिर "system.echo" को METHODS में src/gateway/server.ts के भीतर जोड़ें।
- पुनः उत्पन्न करें
- परीक्षण + दस्तावेज़
src/gateway/server.*.test.ts में एक सर्वर टेस्ट जोड़ें और दस्तावेज़ों में मेथड का उल्लेख करें।
Swift कोडजन व्यवहार
Swift जनरेटर निम्नलिखित उत्सर्जित करता है:GatewayFrameenum, जिसमेंreq,res,event, औरunknownकेस होते हैं- मज़बूती से टाइप किए गए payload structs/enums
ErrorCodeमान औरGATEWAY_PROTOCOL_VERSION
संस्करण निर्धारण + संगतता
PROTOCOL_VERSIONsrc/gateway/protocol/schema.tsमें रहता है।- क्लाइंट
minProtocol+maxProtocolभेजते हैं; सर्वर असंगतियों को अस्वीकार करता है। - Swift मॉडल्स पुराने क्लाइंट्स को न तोड़ने के लिए अज्ञात फ्रेम प्रकारों को बनाए रखते हैं।
स्कीमा पैटर्न और परंपराएँ
- अधिकांश ऑब्जेक्ट्स सख्त payloads के लिए
additionalProperties: falseका उपयोग करते हैं। - IDs और method/event नामों के लिए
NonEmptyStringडिफ़ॉल्ट है। - टॉप‑लेवल
GatewayFrametypeपर discriminator का उपयोग करता है। - साइड‑इफेक्ट्स वाले मेथड्स आमतौर पर params में
idempotencyKeyकी आवश्यकता रखते हैं (उदाहरण:send,poll,agent,chat.send)।
लाइव स्कीमा JSON
प्रकाशित रॉ फ़ाइल आमतौर पर यहाँ उपलब्ध होती है: जब कोई रन सक्रिय होता है, तो टाइपिंग इंडिकेटर्स चैट चैनल पर भेजे जाते हैं।जब आप स्कीमा बदलते हैं
- TypeBox स्कीमा अपडेट करें।
pnpm protocol:checkचलाएँ।- पुनः जनरेट किए गए स्कीमा + Swift मॉडल्स को कमिट करें।