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