الأساسيات
بنية البوابة
آخر تحديث: 2026-01-22
نظرة عامة
- تملك بوابة واحدة طويلة العمر جميع واجهات المراسلة (WhatsApp عبر Baileys، وTelegram عبر grammY، وSlack، وDiscord، وSignal، وiMessage، وWebChat).
- تتصل عملاء مستوى التحكم (تطبيق macOS، وCLI، وواجهة الويب، والأتمتة) بالبوابة عبر WebSocket على مضيف الربط المُهيأ (الافتراضي
127.0.0.1:18789). - تتصل العقد (macOS/iOS/Android/بدون واجهة) أيضًا عبر WebSocket، لكنها تعلن
role: nodeمع إمكانيات/أوامر صريحة. - بوابة واحدة لكل مضيف؛ وهي المكان الوحيد الذي يفتح جلسة WhatsApp.
- يتم تقديم مضيف اللوحة بواسطة خادم HTTP الخاص بالبوابة تحت:
/__openclaw__/canvas/(HTML/CSS/JS قابلة للتحرير بواسطة الوكيل)/__openclaw__/a2ui/(مضيف A2UI) يستخدم نفس منفذ البوابة (الافتراضي18789).
المكونات والتدفقات
البوابة (البرنامج الخلفي)
- تحافظ على اتصالات المزودين.
- تعرض واجهة برمجة تطبيقات WS مكتوبة (طلبات، ردود، أحداث دفع من الخادم).
- تتحقق من صحة الإطارات الواردة مقابل مخطط JSON.
- تصدر أحداثًا مثل
agent،chat،presence،health،heartbeat،cron.
العملاء (تطبيق ماك / CLI / واجهة إدارة الويب)
- اتصال WS واحد لكل عميل.
- ترسل طلبات (
health،status،send،agent،system-presence). - تشترك في الأحداث (
tick،agent،presence،shutdown).
العقد (macOS / iOS / Android / بدون واجهة)
- تتصل بنفس خادم WS مع
role: node. - توفر هوية جهاز في
connect؛ الاقتران يعتمد على الجهاز (دورnode) ويعيش الموافقة في مخزن اقتران الجهاز. - تعرض أوامر مثل
canvas.*،camera.*،screen.record،location.get.
تفاصيل البروتوكول:
WebChat
- واجهة مستخدم ثابتة تستخدم واجهة برمجة تطبيقات WS الخاصة بالبوابة لسجل المحادثة والإرسال.
- في الإعدادات عن بُعد، تتصل من خلال نفس نفق SSH/Tailscale مثل العملاء الآخرين.
دورة حياة الاتصال (عميل واحد)
البروتوكول السلكي (ملخص)
- النقل: WebSocket، إطارات نصية مع حمولات JSON.
- يجب أن تكون الإطار الأول
connect. - بعد المصافحة:
- الطلبات:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - الأحداث:
{type:"event", event, payload, seq?, stateVersion?}
- الطلبات:
- إذا تم تعيين
OPENCLAW_GATEWAY_TOKEN(أو--token)، يجب أن يتطابقconnect.params.auth.tokenأو يُغلق المقبس. - مفتاح عدم التأثير مطلوب للطرق ذات الأثر الجانبي (
send،agent) لإعادة المحاولة بأمان؛ يحتفظ الخادم بذاكرة تخزين مؤقت قصيرة العمر لإزالة التكرار. - يجب أن تتضمن العقد
role: "node"بالإضافة إلى الإمكانيات/الأوامر/الأذونات فيconnect.
الاقتران + الثقة المحلية
- تتضمن جميع عملاء WS (المشغلون + العقد) هوية جهاز في
connect. - تتطلب هويات الأجهزة الجديدة موافقة الاقتران؛ تصدر البوابة رمز جهاز للاتصالات اللاحقة.
- يمكن الموافقة تلقائيًا على الاتصالات المحلية (العودة المحلية أو عنوان tailnet الخاص بمضيف البوابة نفسه) للحفاظ على تجربة مستخدم سلسة لنفس المضيف.
- يجب على جميع الاتصالات توقيع قيمة
connect.challengeغير المتكررة. - تربط الحمولة الموقعة
v3أيضًاplatform+deviceFamily؛ تثبت البوابة البيانات الوصفية المقترنة عند إعادة الاتصال وتطلب إصلاح الاقتران لتغييرات البيانات الوصفية. - لا تزال الاتصالات غير المحلية تتطلب موافقة صريحة.
- لا تزال مصادقة البوابة (
gateway.auth.*) تنطبق على جميع الاتصالات، محلية أو عن بُعد.
التفاصيل: بروتوكول البوابة، الاقتران، الأمان.
كتابة البروتوكول وإنشاء الشفرة
- تحدد مخططات TypeBox البروتوكول.
- يتم إنشاء مخطط JSON من تلك المخططات.
- يتم إنشاء نماذج Swift من مخطط JSON.
الوصول عن بُعد
-
المفضل: Tailscale أو VPN.
-
البديل: نفق SSH
انسخ
ssh -N -L 18789:127.0.0.1:18789 user@host -
تنطبق نفس المصافحة + رمز المصادقة عبر النفق.
-
يمكن تمكين TLS + التثبيت الاختياري لـ WS في الإعدادات عن بُعد.
لقطة العمليات
- البدء:
openclaw gateway(في المقدمة، السجلات إلى stdout). - الصحة:
healthعبر WS (مضمن أيضًا فيhello-ok). - الإشراف: launchd/systemd لإعادة التشغيل التلقائي.
الثوابت
- تتحكم بوابة واحدة بالضبط في جلسة Baileys واحدة لكل مضيف.
- المصافحة إلزامية؛ أي إطار أول غير JSON أو غير connect يؤدي إلى إغلاق قاطع.
- لا يتم إعادة تشغيل الأحداث؛ يجب على العملاء التحديث عند وجود فجوات.