TypeBox بوصفه مصدر الحقيقة للبروتوكول
آخر تحديث: 2026-01-10 TypeBox هي مكتبة مخططات تركز أولًا على TypeScript. نستخدمها لتعريف بروتوكول Gateway WebSocket (المصافحة، والطلب/الاستجابة، وأحداث الخادم). وتدفع هذه المخططات عمليات التحقق في وقت التشغيل وتصدير JSON Schema وتوليد شيفرة Swift لتطبيق macOS. مصدر واحد للحقيقة؛ وكل شيء آخر مولّد. إذا كنت تريد سياق البروتوكول على المستوى الأعلى، فابدأ من معمارية Gateway.النموذج الذهني (30 ثانية)
كل رسالة Gateway WS هي أحد ثلاثة إطارات:- طلب:
{ type: "req", id, method, params } - استجابة:
{ type: "res", id, ok, payload | error } - حدث:
{ type: "event", event, payload, seq?, stateVersion? }
connect. وبعد ذلك، يمكن للعملاء استدعاء
الأساليب (مثل health وsend وchat.send) والاشتراك في
الأحداث (مثل presence وtick وagent).
تدفق الاتصال (الحد الأدنى):
| الفئة | أمثلة | ملاحظات |
|---|---|---|
| الأساسية | connect وhealth وstatus | يجب أن يكون connect أولًا |
| المراسلة | send وagent وagent.wait وsystem-event وlogs.tail | تحتاج التأثيرات الجانبية إلى idempotencyKey |
| الدردشة | chat.history وchat.send وchat.abort | تستخدم WebChat هذه |
| الجلسات | sessions.list وsessions.patch وsessions.delete | إدارة الجلسات |
| الأتمتة | wake وcron.list وcron.run وcron.runs | التحكم في wake + cron |
| العقد | node.list وnode.invoke وnode.pair.* | Gateway WS + إجراءات العقد |
| الأحداث | tick وpresence وagent وchat وhealth وshutdown | دفع من الخادم |
src/gateway/server-methods-list.ts (listGatewayMethods وGATEWAY_EVENTS).
مكان وجود المخططات
- المصدر:
src/gateway/protocol/schema.ts - أدوات التحقق في وقت التشغيل (AJV):
src/gateway/protocol/index.ts - سجل الميزات/الاكتشاف المُعلن:
src/gateway/server-methods-list.ts - المصافحة على الخادم + توزيع الأساليب:
src/gateway/server.impl.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
- يكتب JSON Schema (draft‑07) إلى
pnpm protocol:gen:swift- يولّد نماذج Swift الخاصة بـ gateway
pnpm protocol:check- يشغّل كلا المولّدين ويتحقق من أن المخرجات قد تم حفظها في commit
كيفية استخدام المخططات في وقت التشغيل
- من جهة الخادم: يتم التحقق من كل إطار وارد باستخدام AJV. ولا تقبل المصافحة إلا
طلب
connectالذي تطابق معلماتهConnectParams. - من جهة العميل: يتحقق عميل JS من أطر الأحداث والاستجابة قبل استخدامها.
- اكتشاف الميزات: يرسل Gateway قائمة محافظة من
features.methodsوfeatures.eventsفيhello-okمنlistGatewayMethods()وGATEWAY_EVENTS. - قائمة الاكتشاف هذه ليست تفريغًا مولدًا لكل مساعد قابل للاستدعاء في
coreGatewayHandlers; فبعض RPCs المساعدة تُنفذ فيsrc/gateway/server-methods/*.tsمن دون تعدادها في قائمة الميزات المُعلنة.
أمثلة على الإطارات
الاتصال (أول رسالة):عميل مصغّر (Node.js)
أصغر تدفق مفيد: connect + health.مثال عملي: إضافة أسلوب من البداية إلى النهاية
مثال: إضافة طلب جديدsystem.echo يعيد { ok: true, text }.
- المخطط (مصدر الحقيقة)
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" إلى مدخل listGatewayMethods في
src/gateway/server-methods-list.ts.
إذا كان الأسلوب قابلًا للاستدعاء من عميل المشغّل أو عميل العقدة، فصنّفه أيضًا في
src/gateway/method-scopes.ts حتى تبقى فرضية النطاق وإعلانات ميزات hello-ok
متوافقة.
- إعادة التوليد
- الاختبارات + المستندات
src/gateway/server.*.test.ts واذكر الأسلوب في المستندات.
سلوك توليد شيفرة Swift
يُصدر مولد Swift ما يلي:- تعداد
GatewayFrameمع الحالاتreqوresوeventوunknown - هياكل/تعدادات payload مكتوبة بقوة
- قيم
ErrorCodeوGATEWAY_PROTOCOL_VERSION
الإصدار والتوافق
- يوجد
PROTOCOL_VERSIONفيsrc/gateway/protocol/schema.ts. - يرسل العملاء
minProtocolوmaxProtocol؛ ويرفض الخادم عدم التطابق. - تحتفظ نماذج Swift بأنواع الإطارات غير المعروفة لتجنب كسر العملاء الأقدم.
أنماط المخططات والاصطلاحات
- تستخدم معظم الكائنات
additionalProperties: falseمن أجل حمولات صارمة. - تُعد
NonEmptyStringالقيمة الافتراضية للمعرّفات وأسماء الأساليب/الأحداث. - يستخدم
GatewayFrameفي المستوى الأعلى مميّزًا علىtype. - تتطلب الأساليب ذات التأثيرات الجانبية عادةً قيمة
idempotencyKeyفي المعلمات (مثال:sendوpollوagentوchat.send). - يقبل
agentقيمةinternalEventsالاختيارية من أجل سياق orchestration مُولّد وقت التشغيل (على سبيل المثال تسليم إكمال مهمة subagent/cron)؛ تعامل مع ذلك كسطح API داخلي.
JSON Schema الحي
يوجد JSON Schema المُولّد في المستودع فيdist/protocol.schema.json. وعادةً ما يكون
الملف الخام المنشور متاحًا على:
عندما تغيّر المخططات
- حدّث مخططات TypeBox.
- سجّل الأسلوب/الحدث في
src/gateway/server-methods-list.ts. - حدّث
src/gateway/method-scopes.tsعندما يحتاج RPC الجديد إلى تصنيف نطاق المشغّل أو العقدة. - شغّل
pnpm protocol:check. - نفّذ commit للمخطط المُعاد توليده + نماذج Swift.