بروتوكول Gateway (WebSocket)
بروتوكول Gateway WS هو سطح التحكم الوحيد + نقل العقد لـ OpenClaw. فجميع العملاء (CLI وواجهة الويب وتطبيق macOS وعقد iOS/Android والعقد عديمة الرأس) يتصلون عبر WebSocket ويعلنون الدور + النطاق الخاصين بهم وقت المصافحة.النقل
- WebSocket، وإطارات نصية بحمولات JSON.
- يجب أن يكون الإطار الأول طلب
connect.
المصافحة (connect)
Gateway → العميل (تحدي ما قبل الاتصال):
hello-ok أيضًا:
hello-ok.auth أيضًا إدخالات
أدوار إضافية محدودة ضمن deviceTokens:
scopes: [] وتبقى أي token للمشغّل مسلّمة ضمن الحدود
المقيدة بقائمة سماح bootstrap للمشغّل (operator.approvals, operator.read,
operator.talk.secrets, operator.write). وتظل فحوصات نطاق bootstrap
مرتبطة ببادئة الدور: إذ لا تلبّي إدخالات المشغّل إلا طلبات المشغّل، وما تزال
الأدوار غير المشغّلة تحتاج إلى نطاقات تحت بادئة دورها الخاصة.
مثال عقدة
التأطير
- طلب:
{type:"req", id, method, params} - استجابة:
{type:"res", id, ok, payload|error} - حدث:
{type:"event", event, payload, seq?, stateVersion?}
الأدوار + النطاقات
الأدوار
operator= عميل سطح التحكم (CLI/UI/الأتمتة).node= مضيف الإمكانات (camera/screen/canvas/system.run).
النطاقات (operator)
النطاقات الشائعة:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config مع includeSecrets: true النطاق operator.talk.secrets
(أو operator.admin).
قد تطلب طرق Gateway RPC المسجلة من المكونات الإضافية نطاق operator خاصًا بها، لكن
بادئات الإدارة الأساسية المحجوزة (config.*, exec.approvals.*, wizard.*,
update.*) تُحل دائمًا إلى operator.admin.
يمثل نطاق الطريقة البوابة الأولى فقط. إذ تطبق بعض الأوامر المائلة التي تصل عبر
chat.send فحوصات أشد على مستوى الأمر فوق ذلك. فعلى سبيل المثال، تتطلب
عمليات الكتابة الدائمة عبر /config set و/config unset النطاق operator.admin.
كما يملك node.pair.approve فحص نطاق إضافيًا وقت الموافقة فوق
نطاق الطريقة الأساسي:
- الطلبات من دون أوامر:
operator.pairing - الطلبات التي تحتوي على أوامر عقدة غير
exec: operator.pairing+operator.write - الطلبات التي تتضمن
system.run,system.run.prepare, أوsystem.which: operator.pairing+operator.admin
caps/commands/permissions (node)
تعلن العقد مطالبات الإمكانات وقت الاتصال:
caps: فئات إمكانات عالية المستوى.commands: قائمة سماح الأوامر للاستدعاء.permissions: مفاتيح تبديل دقيقة (مثلscreen.record,camera.capture).
الحضور
- تعيد
system-presenceإدخالات مفاتيحها حسب هوية الجهاز. - تتضمن إدخالات الحضور
deviceId,roles, وscopesلكي تتمكن واجهات المستخدم من عرض صف واحد لكل جهاز حتى عندما يتصل بصفته operator وnode معًا.
عائلات طرق RPC الشائعة
ليست هذه الصفحة تفريغًا مولّدًا كاملًا، لكن السطح العام لـ WS أوسع من أمثلة المصافحة/المصادقة أعلاه. وهذه هي عائلات الطرق الرئيسية التي يعرضها Gateway اليوم.hello-ok.features.methods هي قائمة اكتشاف متحفظة مبنية من
src/gateway/server-methods-list.ts بالإضافة إلى الطرق المصدّرة من المكونات الإضافية/القنوات المحمّلة.
تعامل معها على أنها اكتشاف للميزات، لا على أنها تفريغ مولّد لكل المساعدات القابلة للاستدعاء
المطبقة في src/gateway/server-methods/*.ts.
النظام والهوية
- تعيد
healthلقطة السلامة المخزنة مؤقتًا أو المفحوصة حديثًا للـ gateway. - تعيد
statusملخص gateway بنمط/status؛ وتُضمّن الحقول الحساسة فقط لعملاء operator ذوي النطاق الإداري. - تعيد
gateway.identity.getهوية جهاز gateway المستخدمة في relay وتدفقات الاقتران. - تعيد
system-presenceلقطة الحضور الحالية للأجهزة المتصلة operator/node. - يضيف
system-eventحدث نظام ويمكنه تحديث/بث سياق الحضور. - تعيد
last-heartbeatأحدث حدث heartbeat محفوظ. - يبدّل
set-heartbeatsمعالجة heartbeat على الـ gateway.
النماذج والاستخدام
- تعيد
models.listفهرس النماذج المسموح بها وقت التشغيل. - تعيد
usage.statusملخصات نوافذ استخدام المزوّد/الحصة المتبقية. - تعيد
usage.costملخصات مجمعة لاستخدام التكلفة لنطاق زمني. - تعيد
doctor.memory.statusجاهزية الذاكرة المتجهية / embedding لمساحة عمل الوكيل الافتراضي النشطة. - تعيد
sessions.usageملخصات استخدام لكل جلسة. - تعيد
sessions.usage.timeseriesسلسلة زمنية للاستخدام لجلسة واحدة. - تعيد
sessions.usage.logsإدخالات سجل الاستخدام لجلسة واحدة.
القنوات ومساعدات تسجيل الدخول
- تعيد
channels.statusملخصات حالة القنوات/المكونات الإضافية المضمّنة والمجمّعة. - تسجّل
channels.logoutالخروج من قناة/حساب محدد حيث تدعم القناة تسجيل الخروج. - تبدأ
web.login.startتدفق تسجيل دخول QR/ويب للقناة الحالية القابلة لتسجيل دخول QR على الويب. - تنتظر
web.login.waitاكتمال تدفق تسجيل دخول QR/الويب ذاك وتبدأ القناة عند النجاح. - ترسل
push.testدفعة APNs اختبارية إلى عقدة iOS مسجّلة. - تعيد
voicewake.getمحفزات كلمة التنبيه المخزنة. - تحدّث
voicewake.setمحفزات كلمة التنبيه وتبث التغيير.
المراسلة والسجلات
sendهو RPC التسليم الصادر المباشر للإرسال الموجّه إلى قناة/حساب/سلسلة خارج مشغّل الدردشة.- تعيد
logs.tailذيل سجل ملف gateway المكوَّن مع أدوات المؤشر/الحدود والتحكم في أقصى عدد من البايتات.
Talk وTTS
- تعيد
talk.configحمولة إعداد Talk الفعالة؛ ويتطلبincludeSecretsالنطاقoperator.talk.secrets(أوoperator.admin). - تضبط
talk.mode/تبث حالة وضع Talk الحالية لعملاء WebChat/Control UI. - تولد
talk.speakكلامًا من خلال مزود الكلام النشط في Talk. - تعيد
tts.statusحالة تفعيل TTS، والمزوّد النشط، ومزوّدي fallback، وحالة إعداد المزوّد. - تعيد
tts.providersجرد مزوّدي TTS المرئيين. - تبدّل
tts.enableوtts.disableحالة تفضيلات TTS. - تحدّث
tts.setProviderالمزوّد المفضّل لـ TTS. - تشغّل
tts.convertتحويل text-to-speech لمرة واحدة.
الأسرار، والإعداد، والتحديث، والمعالج
- تعيد
secrets.reloadحل SecretRefs النشطة وتبدّل حالة الأسرار وقت التشغيل فقط عند النجاح الكامل. - تحل
secrets.resolveإسنادات الأسرار المستهدفة بالأوامر لمجموعة أوامر/أهداف محددة. - تعيد
config.getلقطة الإعداد الحالية وhash الخاص بها. - تكتب
config.setحمولة إعداد مُتحققًا من صحتها. - تدمج
config.patchتحديثًا جزئيًا للإعداد. - تتحقق
config.apply+ تستبدل حمولة الإعداد الكاملة. - تعيد
config.schemaحمولة schema الحية للإعداد المستخدمة بواسطة Control UI و أدوات CLI: schema، وuiHints، والإصدار، وبيانات التوليد الوصفية، بما في ذلك بيانات schema الوصفية للمكونات الإضافية + القنوات عندما يستطيع وقت التشغيل تحميلها. وتتضمن schema بياناتtitle/descriptionالوصفية للحقول المشتقة من التسميات نفسها ونصوص المساعدة المستخدمة في UI، بما في ذلك فروع التركيب الخاصة بالكائنات المتداخلة، والرمز الشامل، وعناصر المصفوفات، وanyOf/oneOf/allOfعندما توجد وثائق حقول مطابقة. - تعيد
config.schema.lookupحمولة lookup محددة بالمسار لمسار إعداد واحد: المسار المطبع، وعقدة schema سطحية، وhint مطابق +hintPath، و ملخصات الأبناء المباشرين للتعمق في UI/CLI.- تحتفظ عقد schema الخاصة بالlookup بالوثائق الموجهة للمستخدم
وحقول التحقق الشائعة:
title,description,type,enum,const,format,pattern, وحدود الأعداد/السلاسل/المصفوفات/الكائنات، والأعلام المنطقية مثلadditionalProperties,deprecated,readOnly,writeOnly. - تعرض ملخصات الأبناء
key, وpathالمطبع، وtype, وrequired, وhasChildren، بالإضافة إلىhint/hintPathالمطابقين.
- تحتفظ عقد schema الخاصة بالlookup بالوثائق الموجهة للمستخدم
وحقول التحقق الشائعة:
- تشغّل
update.runتدفق تحديث gateway وتجدول إعادة التشغيل فقط عندما ينجح التحديث نفسه. - تعرض
wizard.start,wizard.next,wizard.status, وwizard.cancelمعالج الإعداد الأولي عبر WS RPC.
العائلات الرئيسية الموجودة
مساعدات الوكيل ومساحة العمل
- تعيد
agents.listإدخالات الوكلاء المكوّنة. - تدير
agents.create,agents.update, وagents.deleteسجلات الوكلاء وربط مساحة العمل. - تدير
agents.files.list,agents.files.get, وagents.files.setملفات bootstrap الخاصة بمساحة العمل المعروضة لوكيل ما. - تعيد
agent.identity.getهوية المساعد الفعالة لوكيل أو جلسة. - تنتظر
agent.waitانتهاء تشغيل ما وتعيد اللقطة النهائية عند توفرها.
التحكم في الجلسة
- تعيد
sessions.listفهرس الجلسات الحالي. - تبدّل
sessions.subscribeوsessions.unsubscribeاشتراكات تغييرات الجلسات لعميل WS الحالي. - تبدّل
sessions.messages.subscribeوsessions.messages.unsubscribeاشتراكات أحداث النصوص/الرسائل لجلسة واحدة. - تعيد
sessions.previewمعاينات نصوص محدودة لمفاتيح جلسات محددة. - تحل
sessions.resolveأو تحول إلى الصيغة القانونية هدف جلسة. - تنشئ
sessions.createإدخال جلسة جديدًا. - ترسل
sessions.sendرسالة إلى جلسة موجودة. sessions.steerهو متغير المقاطعة والتوجيه لجلسة نشطة.- توقف
sessions.abortالعمل النشط لجلسة. - تحدّث
sessions.patchبيانات الجلسة الوصفية/التجاوزات. - تنفذ
sessions.reset,sessions.delete, وsessions.compactصيانة الجلسات. - تعيد
sessions.getصف الجلسة المخزن كاملًا. - ما يزال تنفيذ الدردشة يستخدم
chat.history,chat.send,chat.abort, وchat.inject. - يتم تطبيع
chat.historyللعرض لعملاء UI: حيث تُزال وسوم التعليمات المضمنة من النص المرئي، وتُزال حمولات XML النصية العادية لاستدعاءات الأدوات (بما في ذلك<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>, و كتل استدعاءات الأدوات المقتطعة)، كما تُزال رموز التحكم بالنموذج المسرّبة بصيغة ASCII/العرض الكامل، وتُحذف صفوف المساعد الصامتة البحتة مثلNO_REPLY/no_replyالمطابقة تمامًا، ويمكن استبدال الصفوف كبيرة الحجم بعناصر نائبة.
اقتران الأجهزة وdevice tokens
- تعيد
device.pair.listالأجهزة المقترنة المعلقة والموافق عليها. - تدير
device.pair.approve,device.pair.reject, وdevice.pair.removeسجلات اقتران الأجهزة. - تدير
device.token.rotateتدوير token جهاز مقترن ضمن حدود دوره ونطاقاته المعتمدة. - تلغي
device.token.revokedevice token.
اقتران العقد، والاستدعاء، والعمل المعلّق
- تغطي
node.pair.request,node.pair.list,node.pair.approve,node.pair.reject, وnode.pair.verifyاقتران العقد والتحقق من bootstrap. - تعيد
node.listوnode.describeحالة العقد المعروفة/المتصلة. - تحدّث
node.renameتسمية عقدة مقترنة. - تمرر
node.invokeأمرًا إلى عقدة متصلة. - تعيد
node.invoke.resultالنتيجة لطلب invoke. - تحمل
node.eventالأحداث الصادرة من العقدة عودةً إلى الـ gateway. - تحدّث
node.canvas.capability.refreshرموز canvas-capability المحددة النطاق. - تمثل
node.pending.pullوnode.pending.ackواجهات queue الخاصة بالعقد المتصلة. - تدير
node.pending.enqueueوnode.pending.drainالعمل المعلّق المتين للعقد غير المتصلة/المنفصلة.
عائلات الموافقات
- تغطي
exec.approval.requestوexec.approval.resolveطلبات موافقة exec لمرة واحدة. - تنتظر
exec.approval.waitDecisionقرار exec pending واحدًا وتعيد القرار النهائي (أوnullعند انتهاء المهلة). - تدير
exec.approvals.getوexec.approvals.setلقطات سياسة موافقات exec الخاصة بالـ gateway. - تدير
exec.approvals.node.getوexec.approvals.node.setسياسة موافقات exec المحلية للعقدة عبر أوامر relay الخاصة بالعقدة. - تغطي
plugin.approval.request,plugin.approval.waitDecision, وplugin.approval.resolveتدفقات الموافقات المعرّفة من المكونات الإضافية.
عائلات رئيسية أخرى
- الأتمتة:
- تجدول
wakeحقن نص تنبيه فوري أو في heartbeat التالية cron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runs
- تجدول
- المهارات/الأدوات:
skills.*,tools.catalog,tools.effective
عائلات الأحداث الشائعة
chat: تحديثات دردشة UI مثلchat.injectوغيرها من أحداث الدردشة الخاصة بالنصوص فقط.session.messageوsession.tool: تحديثات النصوص/تدفق الأحداث لجلسة مشتركة.sessions.changed: تغيّر فهرس الجلسات أو بياناتها الوصفية.presence: تحديثات لقطة حضور النظام.tick: حدث keepalive / liveness دوري.health: تحديث لقطة سلامة gateway.heartbeat: تحديث تدفق أحداث heartbeat.cron: حدث تغيّر تشغيل/وظيفة cron.shutdown: إشعار إيقاف gateway.node.pair.requested/node.pair.resolved: دورة حياة اقتران العقد.node.invoke.request: بث طلب استدعاء عقدة.device.pair.requested/device.pair.resolved: دورة حياة الأجهزة المقترنة.voicewake.changed: تغيّر إعداد محفزات كلمة التنبيه.exec.approval.requested/exec.approval.resolved: دورة حياة موافقة exec.plugin.approval.requested/plugin.approval.resolved: دورة حياة موافقة المكون الإضافي.
طرق مساعدة العقد
- يمكن للعقد استدعاء
skills.binsلجلب القائمة الحالية للملفات التنفيذية الخاصة بالمهارات لفحوصات allow التلقائية.
طرق مساعدة المشغّل
- يمكن للمشغّلين استدعاء
tools.catalog(operator.read) لجلب فهرس الأدوات وقت التشغيل لوكيل ما. وتتضمن الاستجابة أدوات مجمّعة وبيانات وصفية للمصدر:source: coreأوpluginpluginId: مالك المكون الإضافي عندما يكونsource="plugin"optional: ما إذا كانت أداة المكون الإضافي اختيارية
- يمكن للمشغّلين استدعاء
tools.effective(operator.read) لجلب جرد الأدوات الفعّال وقت التشغيل لجلسة ما.sessionKeyمطلوب.- يستمد gateway سياق وقت التشغيل الموثوق من الجلسة على جانب الخادم بدل قبول سياق مصادقة أو تسليم يقدمه المستدعي.
- تكون الاستجابة محددة بالجسلة وتعكس ما الذي تستطيع المحادثة النشطة استخدامه الآن، بما في ذلك الأدوات الأساسية وأدوات المكونات الإضافية وأدوات القنوات.
- يمكن للمشغّلين استدعاء
skills.status(operator.read) لجلب جرد المهارات المرئي لوكيل ما.agentIdاختياري؛ اتركه فارغًا لقراءة مساحة عمل الوكيل الافتراضي.- تتضمن الاستجابة الأهلية، والمتطلبات المفقودة، وفحوصات الإعداد، و خيارات التثبيت المنقحة من دون كشف القيم السرية الخام.
- يمكن للمشغّلين استدعاء
skills.searchوskills.detail(operator.read) للحصول على بيانات اكتشاف ClawHub الوصفية. - يمكن للمشغّلين استدعاء
skills.install(operator.admin) في وضعين:- وضع ClawHub:
{ source: "clawhub", slug, version?, force? }يثبّت مجلد مهارة داخل دليلskills/في مساحة عمل الوكيل الافتراضي. - وضع مثبّت Gateway:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }يشغّل إجراءmetadata.openclaw.installمصرّحًا به على مضيف gateway.
- وضع ClawHub:
- يمكن للمشغّلين استدعاء
skills.update(operator.admin) في وضعين:- يحدّث وضع ClawHub slug متتبعًا واحدًا أو جميع عمليات تثبيت ClawHub المتتبعة في مساحة عمل الوكيل الافتراضي.
- يقوم وضع config بترقيع قيم
skills.entries.<skillKey>مثلenabled,apiKey, وenv.
موافقات exec
- عندما يحتاج طلب exec إلى موافقة، يبث gateway الحدث
exec.approval.requested. - يحل عملاء operator ذلك عبر استدعاء
exec.approval.resolve(يتطلب النطاقoperator.approvals). - بالنسبة إلى
host=node، يجب أن يتضمنexec.approval.requestالقيمةsystemRunPlan(argv/cwd/rawCommand/بيانات الجلسة الوصفية القانونية). وتُرفض الطلبات التي تفتقدsystemRunPlan. - بعد الموافقة، تعيد استدعاءات
node.invoke system.runالمُمررة استخدامsystemRunPlanالقانوني ذاك بوصفه السياق الموثوق للأمر/cwd/الجلسة. - إذا عدّل مستدعٍ القيم
command,rawCommand,cwd,agentId, أوsessionKeyبين التحضير والتمرير النهائي الموافق عليه لـsystem.run، فإن gateway يرفض التشغيل بدل الوثوق بالحمولة المعدلة.
fallback تسليم الوكيل
- يمكن لطلبات
agentأن تتضمنdeliver=trueلطلب تسليم صادر. - يبقي
bestEffortDeliver=falseالسلوك صارمًا: إذ تعيد أهداف التسليم غير المحلولة أو الداخلية فقط الخطأINVALID_REQUEST. - يسمح
bestEffortDeliver=trueبالرجوع الاحتياطي إلى التنفيذ داخل الجلسة فقط عندما لا يمكن حل أي مسار خارجي قابل للتسليم (مثل جلسات internal/webchat أو إعدادات متعددة القنوات ملتبسة).
الإصدارات
- يعيش
PROTOCOL_VERSIONفيsrc/gateway/protocol/schema.ts. - يرسل العملاء
minProtocol+maxProtocol؛ ويرفض الخادم عدم التطابق. - تُولَّد schemas + models من تعريفات TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
المصادقة
- تستخدم مصادقة gateway بالسر المشترك إما
connect.params.auth.tokenأوconnect.params.auth.password، بحسب وضع المصادقة المكوَّن. - تلبّي الأوضاع الحاملة للهوية مثل Tailscale Serve
(
gateway.auth.allowTailscale: true) أوgateway.auth.mode: "trusted-proxy"غير المعتمد على loopback فحص مصادقة الاتصال من ترويسات الطلب بدلconnect.params.auth.*. - يتجاوز
gateway.auth.mode: "none"الخاص بالدخول الخاص فحص المصادقة بالسر المشترك بالكامل؛ ولا تعرض هذا الوضع على دخول عام/غير موثوق. - بعد الاقتران، يصدر Gateway device token محددة بالدور + النطاقات الخاصة بالاتصال.
وتُعاد في
hello-ok.auth.deviceTokenويجب أن يحتفظ بها العميل للاتصالات المستقبلية. - يجب على العملاء الاحتفاظ بالـ
hello-ok.auth.deviceTokenالأساسية بعد أي اتصال ناجح. - كما يجب عند إعادة الاتصال باستخدام device token هذه المخزنة إعادة استخدام مجموعة النطاقات المعتمدة المخزنة الخاصة بتلك الـ token. وهذا يحافظ على وصول read/probe/status الذي مُنح بالفعل ويتجنب انهيار إعادة الاتصال بصمت إلى نطاق ضمني أضيق خاص بالإدارة فقط.
- تكون أسبقية مصادقة الاتصال العادية: token/password المشتركة الصريحة أولًا، ثم
deviceTokenالصريحة، ثم token المخزنة لكل جهاز، ثم bootstrap token. - إن إدخالات
hello-ok.auth.deviceTokensالإضافية هي tokens مسلّمة ضمن bootstrap. ولا تحتفظ بها إلا عندما يستخدم الاتصال مصادقة bootstrap عبر نقل موثوق مثلwss://أو loopback/local pairing. - إذا قدّم عميل
deviceTokenصريحة أوscopesصريحة، فإن مجموعة النطاقات المطلوبة من المستدعي تبقى هي المرجع؛ ولا يُعاد استخدام النطاقات المخبأة إلا عندما يعيد العميل استخدام token المخزنة لكل جهاز. - يمكن تدوير/إلغاء device tokens عبر
device.token.rotateوdevice.token.revoke(يتطلبoperator.pairing). - يبقى إصدار/تدوير token مقيدًا بمجموعة الأدوار المعتمدة المسجلة في إدخال اقتران ذلك الجهاز؛ ولا يمكن لتدوير token توسيع الجهاز إلى دور لم تمنحه موافقة الاقتران أصلًا.
- بالنسبة إلى جلسات token الخاصة بالأجهزة المقترنة، تكون إدارة الأجهزة محددة بالذات ما لم يكن
للمستدعي أيضًا
operator.admin: إذ لا يستطيع غير المسؤولين إزالة/إلغاء/تدوير إلا إدخال الجهاز الخاص بهم. - كما يتحقق
device.token.rotateمن مجموعة نطاقات operator المطلوبة مقابل نطاقات جلسة المستدعي الحالية. ولا يستطيع غير المسؤولين تدوير token إلى مجموعة نطاقات operator أوسع مما يملكونه بالفعل. - تتضمن إخفاقات المصادقة
error.details.codeبالإضافة إلى تلميحات الاستعادة:error.details.canRetryWithDeviceToken(قيمة منطقية)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
- سلوك العميل مع
AUTH_TOKEN_MISMATCH:- يمكن للعملاء الموثوقين محاولة إعادة محاولة واحدة محدودة باستخدام token مخزنة لكل جهاز.
- إذا فشلت إعادة المحاولة تلك، فيجب على العملاء إيقاف حلقات إعادة الاتصال التلقائية وإظهار إرشادات لاتخاذ إجراء من المشغّل.
هوية الجهاز + الاقتران
- يجب على العقد تضمين هوية جهاز ثابتة (
device.id) مشتقة من بصمة زوج مفاتيح. - تصدر Gateways tokens لكل جهاز + دور.
- موافقات الاقتران مطلوبة لمعرّفات الأجهزة الجديدة ما لم يكن تفعيل الموافقة التلقائية المحلية مفعّلًا.
- تتمحور الموافقة التلقائية للاقتران حول اتصالات loopback المحلية المباشرة.
- يملك OpenClaw أيضًا مسار self-connect ضيقًا محليًا على مستوى backend/container لتدفقات المساعدات الموثوقة ذات الأسرار المشتركة.
- ما تزال اتصالات tailnet أو LAN على المضيف نفسه تُعامل على أنها بعيدة لأغراض الاقتران وتتطلب موافقة.
- يجب أن تتضمن جميع عملاء WS هوية
deviceأثناءconnect(operator + node). ويمكن لـ Control UI حذفها فقط في هذه الأوضاع:gateway.controlUi.allowInsecureAuth=trueلتوافق HTTP غير الآمن على localhost فقط.- نجاح مصادقة operator في Control UI ضمن
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(وضع طوارئ، خفض أمني شديد).
- يجب أن توقّع جميع الاتصالات
connect.challengenonce التي يوفرها الخادم.
تشخيصات ترحيل مصادقة الجهاز
بالنسبة إلى العملاء القدامى الذين ما زالوا يستخدمون سلوك التوقيع السابق للتحدي، يعيدconnect الآن
رموز تفاصيل DEVICE_AUTH_* ضمن error.details.code مع قيمة ثابتة error.details.reason.
إخفاقات الترحيل الشائعة:
| الرسالة | details.code | details.reason | المعنى |
|---|---|---|---|
device nonce required | DEVICE_AUTH_NONCE_REQUIRED | device-nonce-missing | حذف العميل device.nonce (أو أرسل قيمة فارغة). |
device nonce mismatch | DEVICE_AUTH_NONCE_MISMATCH | device-nonce-mismatch | وقّع العميل باستخدام nonce قديمة/خاطئة. |
device signature invalid | DEVICE_AUTH_SIGNATURE_INVALID | device-signature | لا تطابق حمولة التوقيع حمولة v2. |
device signature expired | DEVICE_AUTH_SIGNATURE_EXPIRED | device-signature-stale | يقع الطابع الزمني الموقَّع خارج الانحراف المسموح. |
device identity mismatch | DEVICE_AUTH_DEVICE_ID_MISMATCH | device-id-mismatch | لا يطابق device.id بصمة المفتاح العام. |
device public key invalid | DEVICE_AUTH_PUBLIC_KEY_INVALID | device-public-key | فشل تنسيق/تحويل المفتاح العام إلى الصيغة القانونية. |
- انتظر دائمًا
connect.challenge. - وقّع حمولة v2 التي تتضمن server nonce.
- أرسل nonce نفسها ضمن
connect.params.device.nonce. - حمولة التوقيع المفضلة هي
v3، التي تربطplatformوdeviceFamilyبالإضافة إلى حقول الجهاز/العميل/الدور/النطاقات/token/nonce. - ما تزال توقيعات
v2القديمة مقبولة للتوافق، لكن تثبيت البيانات الوصفية للأجهزة المقترنة ما يزال يتحكم في سياسة الأوامر عند إعادة الاتصال.
TLS + التثبيت
- TLS مدعوم لاتصالات WS.
- يمكن للعملاء اختياريًا تثبيت بصمة شهادة gateway (راجع إعداد
gateway.tlsبالإضافة إلىgateway.remote.tlsFingerprintأو CLI--tls-fingerprint).
النطاق
يعرض هذا البروتوكول واجهة gateway API الكاملة (الحالة، والقنوات، والنماذج، والدردشة، والوكيل، والجلسات، والعقد، والموافقات، وغير ذلك). ويُعرَّف السطح الدقيق بواسطة TypeBox schemas فيsrc/gateway/protocol/schema.ts.