پروٹوکول کے واحد ماخذِ حقیقت کے طور پر TypeBox¶
آخری بار اپ ڈیٹ: 2026-01-10
- TypeBox ایک TypeScript‑first اسکیما لائبریری ہے۔ 30. ہم اسے Gateway WebSocket پروٹوکول (ہینڈشیک، ریکویسٹ/ریسپانس، سرور ایونٹس) کی تعریف کے لیے استعمال کرتے ہیں۔ 31. یہ اسکیماز رن ٹائم ویلیڈیشن، JSON Schema ایکسپورٹ، اور macOS ایپ کے لیے Swift codegen کو چلاتی ہیں۔ 46. ایک ہی ماخذِ حقیقت؛ باقی سب کچھ جنریٹ کیا جاتا ہے۔
اگر آپ کو اعلیٰ سطحی پروٹوکول کا سیاق درکار ہو تو 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?
- }
35. پہلا فریم **لازمی** طور پرconnect` ریکویسٹ ہونا چاہیے۔
- اس کے بعد، کلائنٹس
methods کال کر سکتے ہیں (مثلاً
health,send,chat.send) اور ایونٹس کو subscribe کر سکتے ہیں (مثلاًpresence,tick,agent)۔ 37. سرور سائیڈ: ہر inbound فریم AJV کے ذریعے ویلیڈیٹ کیا جاتا ہے۔
کنکشن فلو (کم از کم):
Client Gateway
|---- req:connect -------->|
|<---- res:hello-ok --------|
|<---- event:tick ----------|
|---- req:health ---------->|
|<---- res:health ----------|
عام میتھڈز + ایونٹس:
| زمرہ | مثالیں | نوٹس |
|---|---|---|
| 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) میں موجود ہے۔
اسکیمائیں کہاں رہتی ہیں¶
- ماخذ:
src/gateway/protocol/schema.ts - رن ٹائم ویلیڈیٹرز (AJV):
src/gateway/protocol/index.ts - سرور ہینڈشیک + میتھڈ ڈسپیچ:
src/gateway/server.ts - نوڈ کلائنٹ:
src/gateway/client.ts - جنریٹ شدہ JSON Schema:
dist/protocol.schema.json - جنریٹ شدہ Swift ماڈلز:
apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
موجودہ پائپ لائن¶
pnpm protocol:gen- JSON Schema (draft‑07) کو
dist/protocol.schema.jsonمیں لکھتا ہے pnpm protocol:gen:swift- Swift گیٹ وے ماڈلز جنریٹ کرتا ہے
pnpm protocol:check- دونوں جنریٹرز چلاتا ہے اور تصدیق کرتا ہے کہ آؤٹ پٹ کمٹ ہو چکا ہے
رن ٹائم میں اسکیماؤں کا استعمال¶
-
- ہینڈشیک صرف
ایسے
connectریکویسٹ کو قبول کرتا ہے جس کے paramsConnectParamsسے میچ کریں۔ 39. جنریٹ شدہ JSON Schema ریپو میںdist/protocol.schema.jsonپر موجود ہے۔
- ہینڈشیک صرف
ایسے
- کلائنٹ سائیڈ: JS کلائنٹ ایونٹ اور ریسپانس فریمز کو استعمال کرنے سے پہلے ویلیڈیٹ کرتا ہے۔
- میتھڈ سرفیس: Gateway سپورٹ شدہ
methodsاورeventsکوhello-okمیں مشتہر کرتا ہے۔
مثال فریمز¶
کنیکٹ (پہلا پیغام):
{
"type": "req",
"id": "c1",
"method": "connect",
"params": {
"minProtocol": 2,
"maxProtocol": 2,
"client": {
"id": "openclaw-macos",
"displayName": "macos",
"version": "1.0.0",
"platform": "macos 15.1",
"mode": "ui",
"instanceId": "A1B2"
}
}
}
Hello-ok ریسپانس:
{
"type": "res",
"id": "c1",
"ok": true,
"payload": {
"type": "hello-ok",
"protocol": 2,
"server": { "version": "dev", "connId": "ws-1" },
"features": { "methods": ["health"], "events": ["tick"] },
"snapshot": {
"presence": [],
"health": {},
"stateVersion": { "presence": 0, "health": 0 },
"uptimeMs": 0
},
"policy": { "maxPayload": 1048576, "maxBufferedBytes": 1048576, "tickIntervalMs": 30000 }
}
}
ریکویسٹ + ریسپانس:
{ "type": "req", "id": "r1", "method": "health" }
{ "type": "res", "id": "r1", "ok": true, "payload": { "ok": true } }
ایونٹ:
{ "type": "event", "event": "tick", "payload": { "ts": 1730000000 }, "seq": 12 }
کم از کم کلائنٹ (Node.js)¶
سب سے چھوٹا مفید فلو: کنیکٹ + ہیلتھ۔
import { WebSocket } from "ws";
const ws = new WebSocket("ws://127.0.0.1:18789");
ws.on("open", () => {
ws.send(
JSON.stringify({
type: "req",
id: "c1",
method: "connect",
params: {
minProtocol: 3,
maxProtocol: 3,
client: {
id: "cli",
displayName: "example",
version: "dev",
platform: "node",
mode: "cli",
},
},
}),
);
});
ws.on("message", (data) => {
const msg = JSON.parse(String(data));
if (msg.type === "res" && msg.id === "c1" && msg.ok) {
ws.send(JSON.stringify({ type: "req", id: "h1", method: "health" }));
}
if (msg.type === "res" && msg.id === "h1") {
console.log("health:", msg.payload);
ws.close();
}
});
عملی مثال: ایک میتھڈ اینڈ‑ٹو‑اینڈ شامل کریں¶
مثال: ایک نیا system.echo ریکویسٹ شامل کریں جو { ok: true, text } واپس کرے۔
- اسکیمہ (واحد ماخذِ حقیقت)
src/gateway/protocol/schema.ts میں شامل کریں:
export const SystemEchoParamsSchema = Type.Object(
{ text: NonEmptyString },
{ additionalProperties: false },
);
export const SystemEchoResultSchema = Type.Object(
{ ok: Type.Boolean(), text: NonEmptyString },
{ additionalProperties: false },
);
دونوں کو ProtocolSchemas میں شامل کریں اور ٹائپس ایکسپورٹ کریں:
SystemEchoParams: SystemEchoParamsSchema,
SystemEchoResult: SystemEchoResultSchema,
export type SystemEchoParams = Static<typeof SystemEchoParamsSchema>;
export type SystemEchoResult = Static<typeof SystemEchoResultSchema>;
- ویلیڈیشن
src/gateway/protocol/index.ts میں، ایک AJV ویلیڈیٹر ایکسپورٹ کریں:
export const validateSystemEchoParams = ajv.compile<SystemEchoParams>(SystemEchoParamsSchema);
- سرور رویّہ
src/gateway/server-methods/system.ts میں ایک ہینڈلر شامل کریں:
export const systemHandlers: GatewayRequestHandlers = {
"system.echo": ({ params, respond }) => {
const text = String(params.text ?? "");
respond(true, { ok: true, text });
},
};
اسے src/gateway/server-methods.ts میں رجسٹر کریں (یہ پہلے ہی systemHandlers کو مرج کرتا ہے)،
پھر "system.echo" کو METHODS میں src/gateway/server.ts کے اندر شامل کریں۔
- دوبارہ جنریٹ کریں
pnpm protocol:check
- ٹیسٹس + دستاویزات
src/gateway/server.*.test.ts میں ایک سرور ٹیسٹ شامل کریں اور دستاویزات میں میتھڈ کا ذکر کریں۔
Swift کوڈ جنریشن کا رویّہ¶
Swift جنریٹر درج ذیل خارج کرتا ہے:
GatewayFrameenum جس میںreq,res,event, اورunknownکیسز شامل ہیں- مضبوط ٹائپڈ پےلوڈ اسٹرکٹس/اینمز
ErrorCodeویلیوز اورGATEWAY_PROTOCOL_VERSION
نامعلوم فریم ٹائپس کو فارورڈ کمپیٹیبلٹی کے لیے را پےلوڈز کے طور پر محفوظ رکھا جاتا ہے۔
ورژنینگ + مطابقت¶
PROTOCOL_VERSIONsrc/gateway/protocol/schema.tsمیں موجود ہے۔- کلائنٹس
minProtocol+maxProtocolبھیجتے ہیں؛ سرور عدم مطابقت کو مسترد کر دیتا ہے۔ - Swift ماڈلز نامعلوم فریم ٹائپس کو برقرار رکھتے ہیں تاکہ پرانے کلائنٹس متاثر نہ ہوں۔
اسکیمہ پیٹرنز اور کنونشنز¶
- زیادہ تر آبجیکٹس سخت پےلوڈز کے لیے
additionalProperties: falseاستعمال کرتے ہیں۔ - IDs اور میتھڈ/ایونٹ ناموں کے لیے
NonEmptyStringبطورِ طے شدہ ہے۔ - ٹاپ‑لیول
GatewayFrame،typeپر ڈسکریمنیٹر استعمال کرتا ہے۔ - سائیڈ ایفیکٹس والے میتھڈز عموماً پیرامیٹرز میں
idempotencyKeyکا تقاضا کرتے ہیں (مثال:send,poll,agent,chat.send)۔
لائیو اسکیمہ JSON¶
- شائع شدہ raw فائل عموماً یہاں دستیاب ہوتی ہے: 41. رن فعال ہونے کے دوران ٹائپنگ انڈیکیٹرز چیٹ چینل پر بھیجے جاتے ہیں۔
جب آپ اسکیمائیں تبدیل کریں¶
- TypeBox اسکیماؤں کو اپ ڈیٹ کریں۔
pnpm protocol:checkچلائیں۔- دوبارہ جنریٹ شدہ اسکیمہ + Swift ماڈلز کمٹ کریں۔