Gateway
بروتوكول الجسر
سبب وجوده
- حدّ الأمان: يعرّض الجسر قائمة سماح صغيرة بدلاً من كامل سطح واجهة برمجة تطبيقات Gateway.
- الإقران + هوية العقدة: قبول العقدة مملوك لـ Gateway ومرتبط برمز مميز لكل عقدة.
- تجربة الاكتشاف: يمكن للعُقد اكتشاف Gateways عبر Bonjour على LAN، أو الاتصال مباشرة عبر tailnet.
- Loopback WS: يظل مستوى تحكم WS الكامل محلياً ما لم يُمرَّر عبر SSH.
النقل
- TCP، كائن JSON واحد لكل سطر (JSONL).
- TLS اختياري (عندما تكون
bridge.tls.enabledبقيمة true). - كان منفذ المستمع الافتراضي تاريخياً
18790(لا تبدأ الإصدارات الحالية جسر TCP).
عند تمكين TLS، تتضمن سجلات TXT الخاصة بالاكتشاف bridgeTls=1 بالإضافة إلى
bridgeTlsSha256 كتلميح غير سري. لاحظ أن سجلات TXT في Bonjour/mDNS
غير موثّقة؛ يجب ألا يتعامل العملاء مع البصمة المعلنة كدبوس موثوق دون قصد صريح من المستخدم أو تحقق آخر خارج النطاق.
المصافحة + الإقران
- يرسل العميل
helloمع بيانات وصفية للعقدة + رمز مميز (إذا كان مقترناً مسبقاً). - إذا لم يكن مقترناً، يرد Gateway بـ
error(NOT_PAIRED/UNAUTHORIZED). - يرسل العميل
pair-request. - ينتظر Gateway الموافقة، ثم يرسل
pair-okوhello-ok.
تاريخياً، كان hello-ok يعيد serverName؛ أما أسطح Plugin المستضافة فتُعلن الآن
من خلال pluginSurfaceUrls. يستخدم Canvas/A2UI
pluginSurfaceUrls.canvas؛ والاسم المستعار المهمل canvasHostUrl ليس جزءاً من
البروتوكول المعاد تصميمه.
الإطارات
العميل ← Gateway:
req/res: RPC محدود النطاق لـ Gateway (الدردشة، الجلسات، الإعدادات، الصحة، voicewake، skills.bins)event: إشارات العقدة (نص صوتي، طلب وكيل، اشتراك دردشة، دورة حياة التنفيذ)
Gateway ← العميل:
invoke/invoke-res: أوامر العقدة (canvas.*,camera.*,screen.record,location.get,sms.send)event: تحديثات الدردشة للجلسات المشترَك بهاping/pong: إبقاء الاتصال حياً
كان فرض قائمة السماح القديمة موجوداً في src/gateway/server-bridge.ts (أُزيل).
أحداث دورة حياة التنفيذ
يمكن للعُقد إصدار أحداث exec.finished أو exec.denied لإظهار نشاط system.run.
تُحوَّل هذه إلى أحداث نظام في Gateway. (قد تظل العُقد القديمة تصدر exec.started.)
حقول الحمولة (كلها اختيارية ما لم يُذكر خلاف ذلك):
sessionKey(مطلوب): جلسة الوكيل التي ستتلقى حدث النظام.runId: معرّف تنفيذ فريد للتجميع.command: سلسلة الأمر الخام أو المنسقة.exitCode,timedOut,success,output: تفاصيل الإكمال (للانتهاء فقط).reason: سبب الرفض (للرفض فقط).
استخدام tailnet التاريخي
- اربط الجسر بعنوان IP على tailnet:
bridge.bind: "tailnet"في~/.openclaw/openclaw.json(تاريخي فقط؛ لم يعدbridge.*صالحاً). - يتصل العملاء عبر اسم MagicDNS أو عنوان IP على tailnet.
- لا يعبر Bonjour الشبكات؛ استخدم المضيف/المنفذ اليدوي أو DNS-SD واسع النطاق عند الحاجة.
ضبط الإصدارات
كان الجسر v1 ضمنياً (دون تفاوض حد أدنى/أقصى). هذا القسم مرجع تاريخي فقط؛ يستخدم عملاء العُقد/المشغّلون الحاليون WebSocket بروتوكول Gateway.