بروتوكول Gateway (WebSocket)
يُعد بروتوكول Gateway WS مستوى التحكم الوحيد + ناقل العقد في OpenClaw. تتصل جميع العملاء (CLI، وواجهة الويب، وتطبيق macOS، وعقد iOS/Android، والعقد عديمة الواجهة) عبر WebSocket وتُصرّح عن الدور + النطاق في وقت المصافحة.النقل
- WebSocket، بإطارات نصية تحتوي على حمولات JSON.
- يجب أن يكون الإطار الأول بالضرورة طلب
connect.
المصافحة (connect)
Gateway ← العميل (تحدي ما قبل الاتصال):
server وfeatures وsnapshot وpolicy مطلوبة جميعًا بحسب المخطط
(src/gateway/protocol/schema/frames.ts). ويُعد canvasHostUrl اختياريًا. وتعرض
auth الدور/النطاقات التي تم التفاوض عليها عند توفرها، وتتضمن deviceToken
عندما يصدر الـ gateway واحدًا.
عند عدم إصدار رمز جهاز مميز، يمكن أن تعرض hello-ok.auth الأذونات التي تم التفاوض عليها رغم ذلك:
hello-ok أيضًا:
hello-ok.auth أيضًا إدخالات أدوار إضافية مقيّدة في deviceTokens:
scopes: [] وأي رمز مشغّل مُسلَّم يظل مقيّدًا بقائمة سماح مشغّل التمهيد
(operator.approvals, operator.read,
operator.talk.secrets, operator.write). وتظل عمليات التحقق من نطاقات التمهيد
مسبوقة بالدور: لا تلبّي إدخالات المشغّل إلا طلبات المشغّل، وما زالت الأدوار غير المشغّلة
تحتاج إلى نطاقات تحت بادئة دورها الخاصة.
مثال على عقدة
التأطير
- طلب:
{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 المسجّلة بواسطة Plugin نطاق مشغّل خاصًا بها، لكن
بادئات الإدارة الأساسية المحجوزة (config.*, exec.approvals.*, wizard.*,
update.*) تُحل دائمًا إلى operator.admin.
يُعد نطاق الأسلوب هو بوابة التحقق الأولى فقط. فبعض أوامر الشرطة المائلة التي يتم الوصول إليها
عبر chat.send تطبّق عمليات تحقق أكثر صرامة على مستوى الأمر فوق ذلك. على سبيل المثال،
تتطلب عمليات الكتابة الدائمة في /config set و/config unset النطاق operator.admin.
ويمتلك node.pair.approve أيضًا تحقق نطاق إضافيًا في وقت الموافقة فوق نطاق الأسلوب الأساسي:
- الطلبات بلا أوامر:
operator.pairing - الطلبات التي تحتوي على أوامر عقدة غير تنفيذية:
operator.pairing+operator.write - الطلبات التي تتضمن
system.runأوsystem.run.prepareأوsystem.which:operator.pairing+operator.admin
caps/commands/permissions (node)
تُصرّح العقد بادعاءات الإمكانات عند وقت الاتصال:
caps: فئات إمكانات عالية المستوى.commands: قائمة سماح الأوامر لعملية invoke.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 بالإضافة إلى صادرات أساليب Plugins/القنوات المحمّلة.
تعامل معها على أنها لاكتشاف الميزات، لا كتفريغ مُولّد لكل مساعد قابل للاستدعاء
ومنفذ في src/gateway/server-methods/*.ts.
النظام والهوية
- يعيد
healthلقطة صحة الـ gateway المخبأة أو التي جرى فحصها حديثًا. - يعيد
statusملخص الـ gateway على نمط/status؛ وتُضمَّن الحقول الحساسة فقط لعملاء المشغّل ذوي النطاق الإداري. - يعيد
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جاهزية الذاكرة المتجهية / التضمينات لمساحة عمل الوكيل الافتراضي النشطة. - يعيد
sessions.usageملخصات الاستخدام لكل جلسة. - يعيد
sessions.usage.timeseriesسلسلة زمنية للاستخدام لجلسة واحدة. - يعيد
sessions.usage.logsإدخالات سجل الاستخدام لجلسة واحدة.
القنوات ومساعدات تسجيل الدخول
- يعيد
channels.statusملخصات حالة القنوات/Plugins المضمنة والمجمعة. - يسجّل
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، والمزوّد النشط، ومزوّدي الرجوع الاحتياطي، وحالة إعدادات المزوّد. - يعيد
tts.providersجرد مزوّدي TTS المرئيين. - يبدّل
tts.enableوtts.disableحالة تفضيلات TTS. - يحدّث
tts.setProviderمزوّد TTS المفضل. - يشغّل
tts.convertتحويل نص إلى كلام لمرة واحدة.
الأسرار والإعدادات والتحديث والمعالج
- يعيد
secrets.reloadحل SecretRefs النشطة ويبدّل حالة الأسرار وقت التشغيل فقط عند النجاح الكامل. - يعيد
secrets.resolveحل تعيينات الأسرار المستهدفة للأوامر لمجموعة أوامر/أهداف محددة. - يعيد
config.getلقطة الإعدادات الحالية وhash الخاص بها. - يكتب
config.setحمولة إعدادات تم التحقق من صحتها. - يدمج
config.patchتحديث إعدادات جزئيًا. - يتحقق
config.applyمن حمولة الإعدادات الكاملة ويستبدلها. - يعيد
config.schemaحمولة مخطط الإعدادات الحية التي تستخدمها Control UI وأدوات CLI: المخطط، وuiHints، والإصدار، وبيانات التوليد الوصفية، بما في ذلك بيانات مخطط Plugin + القناة عندما يستطيع وقت التشغيل تحميلها. ويتضمن المخطط بياناتtitle/descriptionللحقل المستمدة من نفس التسميات ونصوص المساعدة المستخدمة في واجهة المستخدم، بما في ذلك الكائنات المتداخلة، وعناصر wildcard، وعناصر المصفوفات، وفروع التركيبanyOf/oneOf/allOfعندما توجد وثائق حقل مطابقة. - يعيد
config.schema.lookupحمولة بحث مقيّدة بالمسار لمسار إعدادات واحد: المسار الموحّد، وعقدة مخطط سطحية، وhintالمطابق +hintPath، وملخصات الأبناء المباشرين للتنقل المتدرج في UI/CLI.- تحتفظ عقد مخطط البحث بالتوثيق المواجه للمستخدم وحقول التحقق الشائعة:
titleوdescriptionوtypeوenumوconstوformatوpattern، وحدود الأرقام/السلاسل/المصفوفات/الكائنات، وأعلام منطقية مثلadditionalPropertiesوdeprecatedوreadOnlyوwriteOnly. - تعرض ملخصات الأبناء
keyوpathالموحّد وtypeوrequiredوhasChildren، بالإضافة إلىhint/hintPathالمطابقين.
- تحتفظ عقد مخطط البحث بالتوثيق المواجه للمستخدم وحقول التحقق الشائعة:
- يشغّل
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ملفات مساحة العمل الخاصة بالتمهيد المعروضة لوكيل. - يعيد
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.pair.listالأجهزة المقترنة المعلقة والموافق عليها. - تدير
device.pair.approveوdevice.pair.rejectوdevice.pair.removeسجلات اقتران الأجهزة. - يدوّر
device.token.rotateرمز جهاز مقترن ضمن حدود الدور والنطاق الموافق عليهما. - يلغي
device.token.revokeرمز جهاز مقترنًا.
اقتران العقدة والاستدعاء والعمل المعلّق
- تغطي
node.pair.requestوnode.pair.listوnode.pair.approveوnode.pair.rejectوnode.pair.verifyاقتران العقدة والتحقق من التمهيد. - يعيد
node.listوnode.describeحالة العقدة المعروفة/المتصلة. - يحدّث
node.renameتسمية عقدة مقترنة. - يمرر
node.invokeأمرًا إلى عقدة متصلة. - يعيد
node.invoke.resultنتيجة طلب استدعاء. - يحمل
node.eventالأحداث الصادرة من العقدة إلى الـ gateway. - يجدّد
node.canvas.capability.refreshرموز إمكانات canvas المقيّدة. - تُعد
node.pending.pullوnode.pending.ackواجهات API لطابور العقدة المتصلة. - تدير
node.pending.enqueueوnode.pending.drainالعمل المعلّق المتين للعقد غير المتصلة/غير المتصلة حاليًا.
عائلات الموافقات
- تغطي
exec.approval.requestوexec.approval.getوexec.approval.listوexec.approval.resolveطلبات موافقة التنفيذ لمرة واحدة بالإضافة إلى البحث/إعادة التشغيل للموافقات المعلقة. - ينتظر
exec.approval.waitDecisionقرار موافقة تنفيذ واحدة معلقة ويعيد القرار النهائي (أوnullعند انتهاء المهلة). - تدير
exec.approvals.getوexec.approvals.setلقطات سياسة موافقات التنفيذ في الـ gateway. - تدير
exec.approvals.node.getوexec.approvals.node.setسياسة موافقات التنفيذ المحلية للعقدة عبر أوامر relay الخاصة بالعقدة. - تغطي
plugin.approval.requestوplugin.approval.listوplugin.approval.waitDecisionوplugin.approval.resolveتدفقات الموافقات التي يعرّفها Plugin.
عائلات رئيسية أخرى
- الأتمتة:
- يجدول
wakeإدخال نص تنبيه فوري أو عند Heartbeat التالي cron.listوcron.statusوcron.addوcron.updateوcron.remove، وcron.runوcron.runs
- يجدول
- Skills/الأدوات:
commands.listوskills.*وtools.catalogوtools.effective
عائلات الأحداث الشائعة
chat: تحديثات دردشة UI مثلchat.injectوغيرها من أحداث الدردشة الخاصة بالنص فقط.session.messageوsession.tool: تحديثات النص/دفق الأحداث لجلسة مشترَك بها.sessions.changed: تغيّر فهرس الجلسات أو بياناتها الوصفية.presence: تحديثات لقطة حضور النظام.tick: حدث keepalive / حيوية دوري.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: دورة حياة موافقة التنفيذ.plugin.approval.requested/plugin.approval.resolved: دورة حياة موافقة Plugin.
أساليب مساعدة العقدة
- يمكن للعقد استدعاء
skills.binsلجلب القائمة الحالية للملفات التنفيذية الخاصة بـ Skills من أجل عمليات التحقق التلقائية من السماح.
أساليب مساعدة المشغّل
- يمكن للمشغّلين استدعاء
commands.list(operator.read) لجلب مخزون الأوامر وقت التشغيل لوكيل ما.agentIdاختياري؛ احذفه لقراءة مساحة عمل الوكيل الافتراضية.- يتحكم
scopeفي السطح الذي يستهدفهnameالأساسي:- يعيد
textرمز أمر النص الأساسي دون الشرطة المائلة البادئة/ - يعيد
nativeومسارbothالافتراضي أسماء native المدركة للمزوّد عند توفرها
- يعيد
- يحمل
textAliasesالأسماء المستعارة الدقيقة ذات الشرطة المائلة مثل/modelو/m. - يحمل
nativeNameاسم الأمر native المدرك للمزوّد عندما يوجد. providerاختياري ويؤثر فقط في التسمية native وتوفر أوامر Plugin native.- يؤدي
includeArgs=falseإلى حذف بيانات الوسائط المسلسلة من الاستجابة.
- يمكن للمشغّلين استدعاء
tools.catalog(operator.read) لجلب فهرس الأدوات وقت التشغيل لوكيل ما. وتتضمن الاستجابة أدوات مجمّعة وبيانات وصفية للمصدر:source:coreأوpluginpluginId: مالك Plugin عندما يكونsource="plugin"optional: ما إذا كانت أداة Plugin اختيارية
- يمكن للمشغّلين استدعاء
tools.effective(operator.read) لجلب مخزون الأدوات الفعّال وقت التشغيل لجلسة ما.sessionKeyمطلوب.- يستمد الـ gateway سياق وقت تشغيل موثوقًا من الجلسة من جهة الخادم بدلًا من قبول سياق مصادقة أو تسليم يزوّده المستدعي.
- تكون الاستجابة مقيّدة بالجلسة وتعكس ما يمكن للمحادثة النشطة استخدامه الآن، بما في ذلك أدوات core وPlugin والقناة.
- يمكن للمشغّلين استدعاء
skills.status(operator.read) لجلب مخزون Skills المرئي لوكيل.agentIdاختياري؛ احذفه لقراءة مساحة عمل الوكيل الافتراضية.- تتضمن الاستجابة الأهلية، والمتطلبات المفقودة، وعمليات تحقق الإعدادات، وخيارات التثبيت المنقحة دون كشف القيم السرية الخام.
- يمكن للمشغّلين استدعاء
skills.searchوskills.detail(operator.read) للحصول على بيانات الاكتشاف الوصفية لـ ClawHub. - يمكن للمشغّلين استدعاء
skills.install(operator.admin) في وضعين:- وضع ClawHub:
{ source: "clawhub", slug, version?, force? }يثبّت مجلد Skill في دليلskills/الخاص بمساحة عمل الوكيل الافتراضية. - وضع مُثبّت Gateway:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }يشغّل إجراءmetadata.openclaw.installمُعلَنًا على مضيف الـ gateway.
- وضع ClawHub:
- يمكن للمشغّلين استدعاء
skills.update(operator.admin) في وضعين:- يحدّث وضع ClawHub slug واحدًا متتبَّعًا أو جميع عمليات تثبيت ClawHub المتتبعة في مساحة عمل الوكيل الافتراضية.
- يقوم وضع الإعدادات بترقيع قيم
skills.entries.<skillKey>مثلenabled، وapiKey، وenv.
موافقات التنفيذ
- عندما يحتاج طلب تنفيذ إلى موافقة، يبث الـ gateway
exec.approval.requested. - يحل عملاء المشغّل ذلك عبر استدعاء
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 يرفض التشغيل بدلًا من الثقة بالحمولة المعدّلة.
الرجوع الاحتياطي لتسليم الوكيل
- يمكن أن تتضمن طلبات
agentالحقلdeliver=trueلطلب التسليم الصادر. - يُبقي
bestEffortDeliver=falseالسلوك الصارم: إذ تُرجع أهداف التسليم غير المحلولة أو الداخلية فقطINVALID_REQUEST. - يسمح
bestEffortDeliver=trueبالرجوع الاحتياطي إلى التنفيذ على مستوى الجلسة عندما لا يمكن حل أي مسار تسليم خارجي قابل للتسليم (مثلًا جلسات internal/webchat أو إعدادات متعددة القنوات ملتبسة).
إصدار النسخ
- يوجد
PROTOCOL_VERSIONفيsrc/gateway/protocol/schema/protocol-schemas.ts. - يرسل العملاء
minProtocolوmaxProtocol؛ ويرفض الخادم حالات عدم التطابق. - تُولَّد المخططات + النماذج من تعريفات TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
ثوابت العميل
يستخدم العميل المرجعي فيsrc/gateway/client.ts هذه القيم الافتراضية. وهذه القيم
مستقرة عبر البروتوكول v3 وهي خط الأساس المتوقع للعملاء من الجهات الخارجية.
| الثابت | الافتراضي | المصدر |
|---|---|---|
PROTOCOL_VERSION | 3 | src/gateway/protocol/schema/protocol-schemas.ts |
| مهلة الطلب (لكل RPC) | 30_000 ms | src/gateway/client.ts (requestTimeoutMs) |
| مهلة ما قبل المصادقة / تحدي الاتصال | 10_000 ms | src/gateway/handshake-timeouts.ts (التقييد 250–10_000) |
| التراجع الأولي لإعادة الاتصال | 1_000 ms | src/gateway/client.ts (backoffMs) |
| الحد الأقصى للتراجع لإعادة الاتصال | 30_000 ms | src/gateway/client.ts (scheduleReconnect) |
| تقييد إعادة المحاولة السريعة بعد إغلاق رمز الجهاز | 250 ms | src/gateway/client.ts |
مهلة السماح قبل terminate() في الإيقاف القسري | 250 ms | FORCE_STOP_TERMINATE_GRACE_MS |
المهلة الافتراضية لـ stopAndWait() | 1_000 ms | STOP_AND_WAIT_TIMEOUT_MS |
الفاصل الزمني الافتراضي لـ tick (قبل hello-ok) | 30_000 ms | src/gateway/client.ts |
| إغلاق مهلة tick | الرمز 4000 عندما يتجاوز الصمت tickIntervalMs * 2 | src/gateway/client.ts |
MAX_PAYLOAD_BYTES | 25 * 1024 * 1024 (25 MB) | src/gateway/server-constants.ts |
policy.tickIntervalMs وpolicy.maxPayload
وpolicy.maxBufferedBytes في hello-ok؛ ويجب على العملاء احترام هذه القيم
بدلًا من القيم الافتراضية السابقة للمصافحة.
المصادقة
- تستخدم مصادقة الـ 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"على ingress الخاص مصادقة الاتصال ذات السر المشترك بالكامل؛ لا تعرض هذا الوضع على ingress عام/غير موثوق. - بعد الاقتران، يصدر Gateway رمز جهاز مقيّدًا بدور الاتصال +
النطاقات. ويُعاد في
hello-ok.auth.deviceTokenويجب على العميل الاحتفاظ به للاتصالات المستقبلية. - يجب على العملاء الاحتفاظ بالرمز الأساسي
hello-ok.auth.deviceTokenبعد أي اتصال ناجح. - يجب أن تؤدي إعادة الاتصال باستخدام رمز الجهاز المحفوظ هذا أيضًا إلى إعادة استخدام مجموعة النطاقات الموافق عليها والمحفوظة لذلك الرمز. وهذا يحافظ على وصول القراءة/الفحص/الحالة الذي مُنح مسبقًا ويتجنب تقليص عمليات إعادة الاتصال بصمت إلى نطاق إداري ضمني أضيق فقط.
- تجميع مصادقة الاتصال من جهة العميل (
selectConnectAuthفيsrc/gateway/client.ts):auth.passwordمستقل ويُمرَّر دائمًا عند ضبطه.- يُملأ
auth.tokenبحسب أولوية الترتيب التالية: الرمز المشترك الصريح أولًا، ثمdeviceTokenصريح، ثم رمز محفوظ لكل جهاز (مفهرس بواسطةdeviceId+role). - لا يُرسل
auth.bootstrapTokenإلا عندما لا يحل أي مما سبق قيمةauth.token. ويؤدي الرمز المشترك أو أي رمز جهاز محلول إلى منعه. - يخضع الترفيع التلقائي لرمز جهاز محفوظ في إعادة المحاولة الوحيدة
AUTH_TOKEN_MISMATCHإلى نقاط نهاية موثوقة فقط — loopback، أوwss://معtlsFingerprintمثبّت. ولا يُعدwss://العام دون تثبيت مؤهلًا.
- تُعد الإدخالات الإضافية
hello-ok.auth.deviceTokensرموز تسليم تمهيد. احتفظ بها فقط عندما يكون الاتصال قد استخدم مصادقة التمهيد على نقل موثوق مثلwss://أو الاقتران المحلي/loopback. - إذا زوّد العميل
deviceTokenصريحًا أوscopesصريحة، فإن مجموعة النطاقات التي طلبها المستدعي تبقى هي المعتمدة؛ ولا يُعاد استخدام النطاقات المخبأة إلا عندما يعيد العميل استخدام الرمز المحفوظ لكل جهاز. - يمكن تدوير/إلغاء رموز الأجهزة عبر
device.token.rotateوdevice.token.revoke(يتطلب ذلك النطاقoperator.pairing). - يبقى إصدار/تدوير الرموز مقيّدًا بمجموعة الأدوار الموافق عليها والمُسجّلة في إدخال اقتران ذلك الجهاز؛ ولا يمكن أن يؤدي تدوير رمز إلى توسيع الجهاز إلى دور لم تمنحه موافقة الاقتران أصلًا.
- بالنسبة إلى جلسات رموز الأجهزة المقترنة، تكون إدارة الجهاز مقيّدة بالذات ما لم يكن لدى
المستدعي أيضًا
operator.admin: إذ لا يمكن للمستدعين غير الإداريين إزالة/إلغاء/تدوير إلا إدخال جهازهم الخاص. - يتحقق
device.token.rotateأيضًا من مجموعة نطاقات المشغّل المطلوبة مقارنةً مع نطاقات جلسة المستدعي الحالية. ولا يمكن للمستدعين غير الإداريين تدوير رمز إلى مجموعة نطاقات مشغّل أوسع مما يملكونه بالفعل. - تتضمن حالات فشل المصادقة
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:- يمكن للعملاء الموثوقين محاولة إعادة محاولة واحدة مقيّدة باستخدام رمز محفوظ لكل جهاز.
- إذا فشلت إعادة المحاولة هذه، يجب على العملاء إيقاف حلقات إعادة الاتصال التلقائي وعرض إرشادات لاتخاذ إجراء من المشغّل.
هوية الجهاز + الاقتران
- يجب أن تتضمن العقد هوية جهاز مستقرة (
device.id) مشتقة من بصمة زوج مفاتيح. - تصدر الـ gateways رموزًا لكل جهاز + دور.
- تتطلب معرفات الأجهزة الجديدة موافقات اقتران ما لم يكن القبول التلقائي المحلي مفعّلًا.
- يتمحور القبول التلقائي للاقتران حول اتصالات loopback المحلية المباشرة.
- يمتلك OpenClaw أيضًا مسار اتصال ذاتي ضيقًا محليًا على الخلفية/الحاوية لتدفقات المساعدات الموثوقة ذات السر المشترك.
- تظل اتصالات tailnet أو LAN على نفس المضيف تُعامل على أنها بعيدة بالنسبة إلى الاقتران وتتطلب موافقة.
- يجب على جميع عملاء WS تضمين هوية
deviceأثناءconnect(operator + node). يمكن لـ Control UI حذفها فقط في هذه الأوضاع:gateway.controlUi.allowInsecureAuth=trueمن أجل توافق HTTP غير الآمن الخاص بـ localhost فقط.- نجاح مصادقة مشغّل Control UI في
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(خيار طوارئ، تخفيض أمني شديد).
- يجب على جميع الاتصالات توقيع nonce الخاص بـ
connect.challengeالذي يوفّره الخادم.
تشخيصات ترحيل مصادقة الجهاز
بالنسبة إلى العملاء القدامى الذين ما زالوا يستخدمون سلوك التوقيع السابق للتحدي، يعيد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 التي تتضمن nonce الخاص بالخادم.
- أرسل nonce نفسه في
connect.params.device.nonce. - حمولة التوقيع المفضلة هي
v3، التي تربطplatformوdeviceFamilyبالإضافة إلى حقول device/client/role/scopes/token/nonce. - تظل تواقيع
v2القديمة مقبولة للتوافق، لكن تثبيت البيانات الوصفية للأجهزة المقترنة ما زال يتحكم في سياسة الأوامر عند إعادة الاتصال.
TLS + التثبيت
- يدعم البروتوكول TLS لاتصالات WS.
- يمكن للعملاء اختياريًا تثبيت بصمة شهادة الـ gateway (راجع إعدادات
gateway.tlsبالإضافة إلىgateway.remote.tlsFingerprintأو خيار CLI--tls-fingerprint).
النطاق
يكشف هذا البروتوكول واجهة API الكاملة للـ gateway (الحالة، والقنوات، والنماذج، والدردشة، والوكيل، والجلسات، والعقد، والموافقات، وما إلى ذلك). ويُعرَّف السطح الدقيق بواسطة مخططات TypeBox فيsrc/gateway/protocol/schema.ts.