Gateway
بروتوكول Gateway
بروتوكول Gateway WS هو مستوى التحكم الوحيد + نقل العقد في OpenClaw. يتصل جميع العملاء (CLI، واجهة الويب، تطبيق macOS، عقد iOS/Android، العقد بلا واجهة) عبر WebSocket ويعلنون الدور + النطاق أثناء وقت المصافحة.
النقل
- WebSocket، إطارات نصية بحمولات JSON.
- يجب أن يكون الإطار الأول طلب
connect. - تُحدَّد إطارات ما قبل الاتصال بسعة 64 KiB. بعد مصافحة ناجحة، ينبغي للعملاء
اتباع حدود
hello-ok.policy.maxPayloadوhello-ok.policy.maxBufferedBytes. عند تفعيل التشخيصات، تُصدر الإطارات الواردة الزائدة الحجم والمخازن المؤقتة الصادرة البطيئة أحداثpayload.largeقبل أن يغلق Gateway الإطار المتأثر أو يسقطه. تحتفظ هذه الأحداث بالأحجام، والحدود، والأسطح، ورموز الأسباب الآمنة. ولا تحتفظ بنص الرسالة، أو محتويات المرفقات، أو جسم الإطار الخام، أو الرموز، أو ملفات تعريف الارتباط، أو القيم السرية.
المصافحة (connect)
Gateway → العميل (تحدي ما قبل الاتصال):
{ "type": "event", "event": "connect.challenge", "payload": { "nonce": "…", "ts": 1737264000000 }}العميل → Gateway:
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 3, "maxProtocol": 4, "client": { "id": "cli", "version": "1.2.3", "platform": "macos", "mode": "operator" }, "role": "operator", "scopes": ["operator.read", "operator.write"], "caps": [], "commands": [], "permissions": {}, "auth": { "token": "…" }, "locale": "en-US", "userAgent": "openclaw-cli/1.2.3", "device": { "id": "device_fingerprint", "publicKey": "…", "signature": "…", "signedAt": 1737264000000, "nonce": "…" } }}Gateway → العميل:
{ "type": "res", "id": "…", "ok": true, "payload": { "type": "hello-ok", "protocol": 4, "server": { "version": "…", "connId": "…" }, "features": { "methods": ["…"], "events": ["…"] }, "snapshot": { "…": "…" }, "auth": { "role": "operator", "scopes": ["operator.read", "operator.write"] }, "policy": { "maxPayload": 26214400, "maxBufferedBytes": 52428800, "tickIntervalMs": 15000 } }}بينما لا يزال Gateway ينهي مكونات بدء التشغيل الجانبية، يمكن أن
يعيد طلب connect خطأ UNAVAILABLE قابلا لإعادة المحاولة مع ضبط details.reason على
"startup-sidecars" وretryAfterMs. ينبغي للعملاء إعادة محاولة هذه الاستجابة
ضمن ميزانية الاتصال الإجمالية بدلا من عرضها كفشل
مصافحة نهائي.
كل من server وfeatures وsnapshot وpolicy مطلوبة كلها في المخطط
(packages/gateway-protocol/src/schema/frames.ts). كذلك auth مطلوبة وتعرض
الدور/النطاقات المتفاوض عليها. pluginSurfaceUrls اختيارية وتربط أسماء أسطح Plugin
، مثل canvas، بعناوين URL مستضافة ومحددة النطاق.
قد تنتهي صلاحية عناوين URL لأسطح Plugin المحددة النطاق. يمكن للعقد استدعاء
node.pluginSurface.refresh مع { "surface": "canvas" } لتلقي إدخال جديد
في pluginSurfaceUrls. لا يدعم إعادة بناء Plugin Canvas التجريبي
مسار التوافق المهمل canvasHostUrl أو canvasCapability أو
node.canvas.capability.refresh؛ يجب على العملاء الأصليين وGateway الحاليين
استخدام أسطح Plugin.
عندما لا يصدر رمز جهاز، يعرض hello-ok.auth الصلاحيات المتفاوض عليها
من دون حقول الرمز:
{ "auth": { "role": "operator", "scopes": ["operator.read", "operator.write"] }}يمكن لعملاء الخلفية الموثوقين داخل العملية نفسها (client.id: "gateway-client"،
client.mode: "backend") حذف device على اتصالات loopback المباشرة عندما
يصادقون باستخدام رمز/كلمة مرور Gateway المشتركة. هذا المسار مخصص
لاستدعاءات RPC الداخلية لمستوى التحكم، ويمنع خطوط أساس إقران CLI/الأجهزة القديمة من
حظر عمل الخلفية المحلي مثل تحديثات جلسات الوكلاء الفرعيين. العملاء البعيدون،
وعملاء أصل المتصفح، وعملاء العقد، وعملاء رمز الجهاز/هوية الجهاز الصريحون
ما زالوا يستخدمون فحوصات الإقران وترقية النطاق العادية.
عند إصدار رمز جهاز، يتضمن hello-ok أيضا:
{ "auth": { "deviceToken": "…", "role": "operator", "scopes": ["operator.read", "operator.write"] }}تمهيد رمز QR/رمز الإعداد المدمج هو مسار تسليم محمول جديد. يعيد اتصال رمز إعداد خط أساس ناجح رمز عقدة أساسيا إضافة إلى رمز مشغل واحد محدود:
{ "auth": { "deviceToken": "…", "role": "node", "scopes": [], "deviceTokens": [ { "deviceToken": "…", "role": "operator", "scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"] } ] }}تسليم المشغل محدود عمدا حتى يتمكن إعداد QR من بدء
حلقة المشغل المحمول وإكمال الإعداد الأصلي من دون منح نطاقات
تغيير الإقران أو operator.admin. ويتضمن operator.talk.secrets حتى
يتمكن العميل الأصلي من قراءة إعدادات Talk التي يحتاجها بعد التمهيد. يتطلب
الوصول الأوسع للإقران والإدارة تدفق إقران مشغل أو رمز منفصلا ومعتمدا.
ينبغي للعملاء حفظ
hello-ok.auth.deviceTokens فقط
عندما يستخدم الاتصال مصادقة التمهيد على نقل موثوق مثل wss:// أو
loopback/الإقران المحلي.
مثال عقدة
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 3, "maxProtocol": 4, "client": { "id": "ios-node", "version": "1.2.3", "platform": "ios", "mode": "node" }, "role": "node", "scopes": [], "caps": ["camera", "canvas", "screen", "location", "voice"], "commands": ["camera.snap", "canvas.navigate", "screen.record", "location.get"], "permissions": { "camera.capture": true, "screen.record": false }, "auth": { "token": "…" }, "locale": "en-US", "userAgent": "openclaw-ios/1.2.3", "device": { "id": "device_fingerprint", "publicKey": "…", "signature": "…", "signedAt": 1737264000000, "nonce": "…" } }}التأطير
- الطلب:
{type:"req", id, method, params} - الاستجابة:
{type:"res", id, ok, payload|error} - الحدث:
{type:"event", event, payload, seq?, stateVersion?}
تتطلب الأساليب ذات الآثار الجانبية مفاتيح عدم التكرار (انظر المخطط).
الأدوار + النطاقات
للاطلاع على نموذج نطاق المشغل الكامل، وفحوصات وقت الموافقة، ودلالات السر المشترك، راجع نطاقات المشغل.
الأدوار
operator= عميل مستوى التحكم (CLI/واجهة المستخدم/الأتمتة).node= مضيف الإمكانية (camera/screen/canvas/system.run).
النطاقات (المشغل)
النطاقات الشائعة:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
يتطلب talk.config مع includeSecrets: true النطاق operator.talk.secrets
(أو operator.admin).
عند تضمين الأسرار، ينبغي للعملاء قراءة اعتماد موفر Talk النشط
من talk.resolved.config.apiKey؛ يبقى talk.providers.<id>.apiKey
بشكل المصدر وقد يكون كائن SecretRef أو سلسلة منقحة.
قد تطلب أساليب RPC الخاصة بـ Gateway والمسجلة بواسطة 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: فئات إمكانات عالية المستوى مثلcameraوcanvasوscreenوlocationوvoiceوtalk.commands: قائمة سماح بالأوامر للاستدعاء.permissions: مفاتيح تبديل دقيقة (مثلscreen.recordوcamera.capture).
يتعامل Gateway مع هذه كـ مطالبات ويفرض قوائم السماح من جانب الخادم.
الحضور
- يعيد
system-presenceإدخالات مفهرسة حسب هوية الجهاز. - تتضمن إدخالات الحضور
deviceIdوrolesوscopesحتى تتمكن واجهات المستخدم من عرض صف واحد لكل جهاز حتى عندما يتصل بصفته مشغلا وعقدة في الوقت نفسه. - يتضمن
node.listالحقلين الاختياريينlastSeenAtMsوlastSeenReason. تعرض العقد المتصلة وقت اتصالها الحالي كـlastSeenAtMsمع السببconnect؛ ويمكن للعقد المقترنة أيضا عرض حضور خلفية دائم عندما يحدّث حدث عقدة موثوق بيانات تعريف الإقران الخاصة بها.
حدث بقاء العقدة حية في الخلفية
يمكن للعقد استدعاء node.event مع event: "node.presence.alive" لتسجيل أن عقدة مقترنة كانت
حية أثناء إيقاظ في الخلفية من دون تمييزها كمتصلة.
{ "event": "node.presence.alive", "payloadJSON": "{\"trigger\":\"silent_push\",\"sentAtMs\":1737264000000,\"displayName\":\"Peter's iPhone\",\"version\":\"2026.4.28\",\"platform\":\"iOS 18.4.0\",\"deviceFamily\":\"iPhone\",\"modelIdentifier\":\"iPhone17,1\",\"pushTransport\":\"relay\"}"}trigger تعداد مغلق: background أو silent_push أو bg_app_refresh
أو significant_location أو manual أو connect. يطبع Gateway سلاسل المشغلات غير المعروفة إلى
background قبل الحفظ. يكون الحدث دائما فقط لجلسات أجهزة العقد المصادق عليها؛
تعيد الجلسات بلا جهاز أو غير المقترنة handled: false.
تعيد Gateway الناجحة نتيجة منظمة:
{ "ok": true, "event": "node.presence.alive", "handled": true, "reason": "persisted"}قد تظل Gateway الأقدم تعيد { "ok": true } لـ node.event؛ ينبغي للعملاء التعامل مع ذلك كاستدعاء
RPC مؤكد، وليس كاستمرار حضور دائم.
تحديد نطاق أحداث البث
تخضع أحداث بث WebSocket المدفوعة من الخادم للنطاقات، حتى لا تتلقى الجلسات المحددة بنطاق الإقران أو جلسات العقد فقط محتوى الجلسة بشكل سلبي.
- إطارات الدردشة والوكيل ونتائج الأدوات (بما في ذلك أحداث
agentالمتدفقة ونتائج استدعاءات الأدوات) تتطلب على الأقلoperator.read. تتخطى الجلسات التي لا تملكoperator.readهذه الإطارات بالكامل. - بثوث
plugin.*المعرفة بواسطة Plugin تخضع لـoperator.writeأوoperator.admin، بناء على كيفية تسجيل Plugin لها. - أحداث الحالة والنقل (
heartbeatوpresenceوtickودورة حياة الاتصال/قطع الاتصال، وما إلى ذلك) تبقى غير مقيدة حتى تبقى صحة النقل قابلة للملاحظة لكل جلسة مصادق عليها. - عائلات أحداث البث غير المعروفة تخضع للنطاقات افتراضيا (تفشل مغلقة) ما لم يرخها معالج مسجل صراحة.
يحتفظ كل اتصال عميل برقم تسلسل خاص به لكل عميل حتى تحافظ البثوث على ترتيب تصاعدي على ذلك المقبس، حتى عندما يرى عملاء مختلفون مجموعات فرعية مختلفة مفلترة بالنطاق من تدفق الأحداث.
عائلات أساليب RPC الشائعة
سطح WS العام أوسع من أمثلة المصافحة/المصادقة أعلاه. هذه
ليست نسخة مولدة — hello-ok.features.methods قائمة اكتشاف محافظة
مبنية من src/gateway/server-methods-list.ts إضافة إلى صادرات أساليب
Plugin/القناة المحملة. تعامل معها كاكتشاف ميزات، لا كتعداد كامل
لـ src/gateway/server-methods/*.ts.
النظام والهوية
- يعيد
healthلقطة حالة Gateway المخزنة مؤقتًا أو المفحوصة حديثًا. - يعيد
diagnostics.stabilityمسجل الاستقرار التشخيصي المحدود حديثًا. يحتفظ ببيانات تعريف تشغيلية مثل أسماء الأحداث، والأعداد، وأحجام البايت، وقراءات الذاكرة، وحالة الطابور/الجلسة، وأسماء القنوات/Plugin، ومعرفات الجلسات. لا يحتفظ بنصوص المحادثات، أو أجسام Webhook، أو مخرجات الأدوات، أو أجسام الطلبات أو الاستجابات الخام، أو الرموز، أو ملفات تعريف الارتباط، أو القيم السرية. يلزم نطاق قراءة المشغل. - يعيد
statusملخص Gateway بنمط/status؛ ولا تُضمَّن الحقول الحساسة إلا لعملاء المشغلين ذوي نطاق الإدارة. - يعيد
gateway.identity.getهوية جهاز Gateway المستخدمة في تدفقات الترحيل والاقتران. - يعيد
system-presenceلقطة الحضور الحالية لأجهزة المشغل/Node المتصلة. - يضيف
system-eventحدث نظام، ويمكنه تحديث/بث سياق الحضور. - يعيد
last-heartbeatأحدث حدث Heartbeat مستمر. - يبدّل
set-heartbeatsمعالجة Heartbeat على Gateway.
النماذج والاستخدام
- يعيد
models.listكتالوج النماذج المسموح بها في وقت التشغيل. مرّر{ "view": "configured" }للنماذج المكوّنة بحجم المنتقي (agents.defaults.modelsأولًا، ثمmodels.providers.*.models)، أو{ "view": "all" }للكتالوج الكامل. - يعيد
usage.statusملخصات نوافذ استخدام المزوّد/الحصة المتبقية. - يعيد
usage.costملخصات استخدام التكلفة المجمعة لنطاق تاريخ. مرّرagentIdلوكيل واحد، أوagentScope: "all"لتجميع الوكلاء المكوّنين. - يعيد
doctor.memory.statusجاهزية ذاكرة المتجهات / التضمين المخزن مؤقتًا لمساحة عمل الوكيل الافتراضي النشط. مرّر{ "probe": true }أو{ "deep": true }فقط عندما يريد المستدعي صراحةً اختبار اتصال مباشر بمزوّد التضمين. يمكن للعملاء المدركين لـ Dreaming أيضًا تمرير{ "agentId": "agent-id" }لتقييد إحصاءات مخزن Dreaming بمساحة عمل وكيل محددة؛ يؤدي حذفagentIdإلى إبقاء الرجوع إلى الوكيل الافتراضي وتجميع مساحات عمل Dreaming المكوّنة. - تقبل
doctor.memory.dreamDiaryوdoctor.memory.backfillDreamDiaryوdoctor.memory.resetDreamDiaryوdoctor.memory.resetGroundedShortTermوdoctor.memory.repairDreamingArtifactsوdoctor.memory.dedupeDreamDiaryمعاملات اختيارية{ "agentId": "agent-id" }لطرق عرض/إجراءات Dreaming للوكيل المحدد. عند حذفagentId، تعمل على مساحة عمل الوكيل الافتراضي المكوّنة. - يعيد
doctor.memory.remHarnessمعاينة محدودة وللقراءة فقط لحزام REM لعملاء مستوى التحكم البعيد. يمكن أن تتضمن مسارات مساحة العمل، ومقتطفات الذاكرة، وMarkdown المؤرض المعروض، ومرشحي الترقية العميقة، لذلك يحتاج المستدعون إلىoperator.read. - يعيد
sessions.usageملخصات الاستخدام لكل جلسة. مرّرagentIdلوكيل واحد، أوagentScope: "all"لسرد الوكلاء المكوّنين معًا. - يعيد
sessions.usage.timeseriesاستخدام السلاسل الزمنية لجلسة واحدة. - يعيد
sessions.usage.logsإدخالات سجل الاستخدام لجلسة واحدة.
القنوات ومساعدو تسجيل الدخول
- يعيد
channels.statusملخصات حالة القنوات/Plugin المدمجة + المرفقة. - يسجّل
channels.logoutخروج قناة/حساب محدد حيث تدعم القناة تسجيل الخروج. - يبدأ
web.login.startتدفق تسجيل دخول QR/ويب لمزوّد قناة الويب الحالي القادر على QR. - ينتظر
web.login.waitاكتمال تدفق تسجيل دخول QR/ويب هذا ويبدأ القناة عند النجاح. - يرسل
push.testدفعة APNs اختبارية إلى Node iOS مسجّل. - يعيد
voicewake.getمشغلات كلمة التنبيه المخزنة. - يحدّث
voicewake.setمشغلات كلمة التنبيه ويبث التغيير.
المراسلة والسجلات
sendهو RPC المباشر للتسليم الصادر للإرسال المستهدف إلى قناة/حساب/سلسلة خارج مشغل المحادثة.- يعيد
logs.tailذيل سجل ملفات Gateway المكوّن مع عناصر تحكم المؤشر/الحد والحد الأقصى للبايتات.
Talk وTTS
- يعيد
talk.catalogكتالوج مزوّدي Talk للقراءة فقط للكلام، والنسخ المتدفق، والصوت الفوري. يتضمن معرفات المزوّدين القانونية، وأسماء السجل المستعارة، والتسميات، وحالة التكوين، ونتيجة اختياريةreadyعلى مستوى المجموعة، ومعرفات النماذج/الأصوات المعروضة، والأوضاع القانونية، ووسائل النقل، واستراتيجيات الدماغ، وأعلام الصوت/القدرات الفورية من دون إرجاع أسرار المزوّد أو تعديل الإعدادات العامة. تضبط Gateways الحاليةreadyبعد تطبيق اختيار مزوّد وقت التشغيل؛ ينبغي للعملاء اعتبار غيابها غير متحقق منه للتوافق مع Gateways الأقدم. - يعيد
talk.configحمولة إعداد Talk الفعالة؛ يتطلبincludeSecretsإذنoperator.talk.secrets(أوoperator.admin). - ينشئ
talk.session.createجلسة Talk مملوكة لـ Gateway من أجلrealtime/gateway-relayأوtranscription/gateway-relayأوstt-tts/managed-room. بالنسبة إلىstt-tts/managed-room، يجب على مستدعيoperator.writeالذين يمررونsessionKeyأن يمرروا أيضًاspawnedByلرؤية مفتاح الجلسة محدودة النطاق؛ ويتطلب إنشاءsessionKeyغير محدود النطاق وbrain: "direct-tools"إذنoperator.admin. - يتحقق
talk.session.joinمن رمز جلسة غرفة مُدارة، ويصدر أحداثsession.readyأوsession.replacedعند الحاجة، ويعيد بيانات تعريف الغرفة/الجلسة بالإضافة إلى أحداث Talk الحديثة من دون الرمز بالنص الصريح أو تجزئة الرمز المخزنة. - يضيف
talk.session.appendAudioصوت إدخال PCM بترميز base64 إلى جلسات الترحيل الفوري والنسخ المملوكة لـ Gateway. - تقود
talk.session.startTurnوtalk.session.endTurnوtalk.session.cancelTurnدورة حياة دور الغرفة المُدارة مع رفض الدور القديم قبل مسح الحالة. - يوقف
talk.session.cancelOutputخرج صوت المساعد، أساسًا للمقاطعة المحكومة بـ VAD في جلسات ترحيل Gateway. - يكمل
talk.session.submitToolResultاستدعاء أداة مزوّد صادرًا عن جلسة ترحيل فورية مملوكة لـ Gateway. مرّرoptions: { willContinue: true }لخرج أداة مؤقت عندما ستتبعه نتيجة نهائية، أوoptions: { suppressResponse: true }عندما ينبغي لنتيجة الأداة أن تلبي استدعاء المزوّد من دون بدء استجابة مساعد فورية أخرى. - يرسل
talk.session.steerتحكمًا صوتيًا لتشغيل نشط إلى جلسة Talk مدعومة بوكيل ومملوكة لـ Gateway. يقبل{ sessionId, text, mode? }، حيث يكونmodeهوstatusأوsteerأوcancelأوfollowup؛ ويُصنَّف الوضع المحذوف من النص المنطوق. - يغلق
talk.session.closeجلسة ترحيل أو نسخ أو غرفة مُدارة مملوكة لـ Gateway، ويصدر أحداث Talk نهائية. - يضبط
talk.modeحالة وضع Talk الحالية ويبثها لعملاء WebChat/Control UI. - ينشئ
talk.client.createجلسة مزوّد فورية مملوكة للعميل باستخدامwebrtcأوprovider-websocketبينما تمتلك Gateway الإعدادات وبيانات الاعتماد والتعليمات وسياسة الأدوات. - يتيح
talk.client.toolCallلوسائل النقل الفورية المملوكة للعميل تمرير استدعاءات أدوات المزوّد إلى سياسة Gateway. أول أداة مدعومة هيopenclaw_agent_consult؛ يتلقى العملاء معرف تشغيل وينتظرون أحداث دورة حياة المحادثة العادية قبل إرسال نتيجة الأداة الخاصة بالمزوّد. - يرسل
talk.client.steerتحكمًا صوتيًا لتشغيل نشط لوسائل النقل الفورية المملوكة للعميل. تحل Gateway التشغيل المضمّن النشط منsessionKeyوتعيد نتيجة منظمة مقبولة/مرفوضة بدلًا من إسقاط التوجيه بصمت. talk.eventهي قناة أحداث Talk الوحيدة لمحولات الوقت الفوري، والنسخ، وSTT/TTS، والغرفة المُدارة، والاتصالات الهاتفية، والاجتماعات.- يصطنع
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لقطة الإعداد الحالية والتجزئة. - يكتب
config.setحمولة إعداد متحققًا منها. - يدمج
config.patchتحديث إعداد جزئيًا. يتطلب استبدال المصفوفة المدمر المسار المتأثر فيreplacePaths؛ تستخدم المصفوفات المتداخلة ضمن إدخالات المصفوفة مسارات[]مثلagents.list[].skills. - يتحقق
config.applyمن حمولة الإعداد الكاملة + يستبدلها. - يعيد
config.schemaحمولة مخطط الإعدادات الحية المستخدمة بواسطة أدوات Control UI وCLI: المخطط، وuiHints، والإصدار، وبيانات تعريف التوليد، بما في ذلك بيانات تعريف مخطط Plugin + القناة عندما يستطيع وقت التشغيل تحميلها. يتضمن المخطط بيانات تعريف الحقلtitle/descriptionالمستمدة من التسميات نفسها ونص المساعدة المستخدمين في واجهة المستخدم، بما في ذلك فروع الكائنات المتداخلة، وحروف البدل، وعنصر المصفوفة، وتركيباتanyOf/oneOf/allOfعندما توجد وثائق حقل مطابقة. - يعيد
config.schema.lookupحمولة بحث محدودة المسار لمسار إعداد واحد: المسار المطبّع، وعقدة مخطط سطحية، والتلميح المطابق +hintPath، وreloadKindاختياري، وملخصات الأبناء المباشرين للتنقل التفصيلي في UI/CLI.reloadKindهو أحدrestartأوhotأوnoneويعكس مخطط إعادة تحميل إعدادات Gateway للمسار المطلوب. تحتفظ عقد مخطط البحث بالوثائق الموجهة للمستخدم وحقول التحقق الشائعة (title، وdescription، وtype، وenum، وconst، وformat، وpattern، وحدود الأرقام/السلاسل/المصفوفات/الكائنات، وأعلام مثلadditionalProperties، وdeprecated، وreadOnly، وwriteOnly). تعرض ملخصات الأبناءkey، وpathالمطبّع، وtype، وrequired، وhasChildren، وreloadKindالاختياري، بالإضافة إلىhint/hintPathالمطابقين. - يشغّل
update.runتدفق تحديث Gateway ويجدول إعادة تشغيل فقط عندما ينجح التحديث نفسه؛ يمكن للمستدعين ذوي الجلسة تضمينcontinuationMessageكي يستأنف بدء التشغيل دور وكيل متابعة واحدًا عبر طابور متابعة إعادة التشغيل. تستخدم تحديثات مدير الحزم وتحديثات git-checkout الخاضعة للإشراف من مستوى التحكم تسليمًا منفصلًا لخدمة مُدارة بدلًا من استبدال شجرة الحزم أو تعديل مخرجات checkout/build داخل Gateway الحية. يعيد التسليم الذي بدأok: trueمعresult.reason: "managed-service-handoff-started"وhandoff.status: "started"؛ وتعيد عمليات التسليم غير المتاحة أو الفاشلةok: falseمعmanaged-service-handoff-unavailableأوmanaged-service-handoff-failed، بالإضافة إلىhandoff.commandعندما يكون تحديث shell يدوي مطلوبًا. يعني التسليم غير المتاح أن OpenClaw يفتقر إلى حد مشرف آمن أو هوية خدمة دائمة، مثلOPENCLAW_SYSTEMD_UNITلـ systemd. أثناء التسليم الذي بدأ، قد يبلّغ حارس إعادة التشغيل لفترة وجيزةstats.reason: "restart-health-pending"؛ وتُؤخر المتابعة حتى يتحقق CLI من Gateway المعاد تشغيلها ويكتب حارسokالنهائي. - يحدّث
update.statusأحدث حارس لإعادة تشغيل التحديث ويعيده، بما في ذلك الإصدار الجاري بعد إعادة التشغيل عند توفره. - تعرض
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ملفات مساحة عمل التمهيد المكشوفة للوكيل. - تكشف
tasks.listوtasks.getوtasks.cancelسجل مهام Gateway لعملاء SDK والمشغّلين. - تكشف
artifacts.listوartifacts.getوartifacts.downloadملخصات العناصر الناتجة من النصوص المنسوخة والتنزيلات لنطاقsessionKeyأوrunIdأوtaskIdصريح. تحل استعلامات التشغيل والمهام الجلسة المالكة من جهة الخادم ولا تعيد إلا وسائط النصوص المنسوخة ذات المصدر المطابق؛ وتعيد مصادر URL غير الآمنة أو المحلية تنزيلات غير مدعومة بدلا من الجلب من جهة الخادم. - تكشف
environments.listوenvironments.statusاكتشاف بيئات Gateway المحلية وبيئات العقدة للقراءة فقط لعملاء SDK. - يعيد
agent.identity.getهوية المساعد الفعّالة لوكيل أو جلسة. - ينتظر
agent.waitحتى يكتمل تشغيل، ويعيد اللقطة النهائية عند توفرها.
التحكم في الجلسة
- يعيد
sessions.listفهرس الجلسات الحالي، بما في ذلك بيانات تعريفagentRuntimeلكل صف عند تكوين خلفية وقت تشغيل وكيل. - تبدّل
sessions.subscribeوsessions.unsubscribeاشتراكات أحداث تغيّر الجلسات لعميل WS الحالي. - تبدّل
sessions.messages.subscribeوsessions.messages.unsubscribeاشتراكات أحداث النص المنسوخ/الرسائل لجلسة واحدة. - تعيد
sessions.previewمعاينات نصوص منسوخة محدودة لمفاتيح جلسات محددة. - تعيد
sessions.describeصف جلسة Gateway واحدا لمفتاح جلسة مطابق تماما. - تحل
sessions.resolveهدف جلسة أو تجعله معياريا. - تنشئ
sessions.createإدخال جلسة جديدا. - ترسل
sessions.sendرسالة إلى جلسة موجودة. - تمثل
sessions.steerصيغة المقاطعة والتوجيه لجلسة نشطة. - تلغي
sessions.abortالعمل النشط لجلسة. يمكن للمتصل تمريرkeyمعrunIdاختياري، أو تمريرrunIdوحده للتشغيلات النشطة التي يستطيع Gateway حلها إلى جلسة. - تحدّث
sessions.patchبيانات تعريف الجلسة/التجاوزات وتبلغ عن النموذج المعياري المحلول إضافة إلىagentRuntimeالفعّال. - تنفذ
sessions.resetوsessions.deleteوsessions.compactصيانة الجلسات. - تعيد
sessions.getصف الجلسة المخزن بالكامل. - لا يزال تنفيذ الدردشة يستخدم
chat.historyوchat.sendوchat.abortوchat.inject. يكونchat.historyمطبّعا للعرض لعملاء الواجهة: تزال وسوم التوجيه المضمنة من النص المرئي، وتزال حمولات XML لاستدعاءات الأدوات بنص عادي (بما في ذلك<tool_call>...</tool_call>و<function_call>...</function_call>و<tool_calls>...</tool_calls>و<function_calls>...</function_calls>وكتل استدعاء الأدوات المبتورة) ورموز تحكم النموذج المسربة بصيغة ASCII/العرض الكامل، وتُحذف صفوف المساعد ذات الرموز الصامتة فقط مثلNO_REPLY/no_replyالمطابقة تماما، ويمكن استبدال الصفوف كبيرة الحجم بعناصر نائبة. chat.message.getهو قارئ الرسالة الكاملة المحدودة الإضافي لإدخال نص منسوخ مرئي واحد. يمرر العملاءsessionKey، وagentIdاختياريا عندما يكون اختيار الجلسة محدودا بنطاق الوكيل، إضافة إلىmessageIdللنص المنسوخ سبق عرضه عبرchat.history، ويعيد Gateway الإسقاط نفسه المطبّع للعرض من دون حد الاقتطاع الخفيف للسجل عندما لا يزال الإدخال المخزن متاحا وليس كبير الحجم.- يقبل
chat.sendقيمةfastMode: "auto"لدورة واحدة لاستخدام الوضع السريع لاستدعاءات النموذج التي تبدأ قبل حد القطع التلقائي، ثم بدء استدعاءات إعادة المحاولة أو الرجوع الاحتياطي أو نتيجة الأداة أو المتابعة اللاحقة من دون الوضع السريع. يكون حد القطع افتراضيا 60 ثانية ويمكن تكوينه لكل نموذج باستخدامagents.defaults.models["<provider>/<model>"].params.fastAutoOnSeconds. يمكن لمتصلchat.sendتمريرfastAutoOnSecondsلدورة واحدة لتجاوز حد القطع لذلك الطلب.
إقران الأجهزة ورموز الأجهزة
- تعيد
device.pair.listالأجهزة المقترنة المعلقة والمعتمدة. - تنشئ
device.pair.setupCodeرمز إعداد للجوال، وافتراضيا URL بيانات QR بصيغة PNG. تتطلبoperator.adminوهي محذوفة عمدا من الاكتشاف المعلن. تتضمن النتيجةsetupCodeوqrDataUrlاختياريا وgatewayUrlوتسميةauthغير السرية وurlSource. - تدير
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.removeوnode.pair.verifyإقران العقدة والتحقق من التمهيد. - تعيد
node.listوnode.describeحالة العقد المعروفة/المتصلة. - تحدّث
node.renameتسمية عقدة مقترنة. - تمرر
node.invokeأمرا إلى عقدة متصلة. - تعيد
node.invoke.resultنتيجة طلب استدعاء. - يحمل
node.eventالأحداث الصادرة من العقدة مرة أخرى إلى Gateway. - تمثل
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سياسة موافقة التنفيذ المحلية للعقدة عبر أوامر ترحيل العقدة. - تغطي
plugin.approval.requestوplugin.approval.listوplugin.approval.waitDecisionوplugin.approval.resolveتدفقات الموافقة التي يعرّفها Plugin.
Automation, skills, and tools
- الأتمتة: يجدول
wakeحقن نص تنبيه فوري أو عند Heartbeat التالي؛ وتديرcron.getوcron.listوcron.statusوcron.addوcron.updateوcron.removeوcron.runوcron.runsالعمل المجدول. - يبقى
cron.runاستدعاء RPC بأسلوب الإضافة إلى قائمة الانتظار للتشغيل اليدوي. يجب على العملاء الذين يحتاجون إلى دلالات الإكمال قراءةrunIdالمُعاد واستطلاعcron.runs. - يقبل
cron.runsعامل تصفية اختياريًا غير فارغ باسمrunIdحتى يتمكن العملاء من متابعة تشغيل يدوي واحد في قائمة الانتظار دون التسابق مع إدخالات سجل أخرى للمهمة نفسها. - Skills والأدوات:
commands.listوskills.*وtools.catalogوtools.effectiveوtools.invoke.
عائلات الأحداث الشائعة
chat: تحديثات دردشة واجهة المستخدم مثلchat.injectوأحداث دردشة أخرى خاصة بالنص المنسوخ فقط. في بروتوكول v4، تحمل حمولات الفروقاتdeltaText؛ ويبقىmessageلقطة المساعد التراكمية. تضبط الاستبدالات غير البادئةreplace=trueوتستخدمdeltaTextكنص الاستبدال.session.messageوsession.operationوsession.tool: تحديثات النص المنسوخ، وعملية الجلسة الجارية، وتدفق الأحداث لجلسة مشترك فيها.sessions.changed: تغيّر فهرس الجلسات أو بياناتها الوصفية.presence: تحديثات لقطات حضور النظام.tick: حدث إبقاء اتصال دوري / حيوية.health: تحديث لقطة صحة Gateway.heartbeat: تحديث تدفق حدث Heartbeat.cron: حدث تغيير تشغيل/مهمة Cron.shutdown: إشعار إيقاف Gateway.node.pair.requested/node.pair.resolved: دورة حياة إقران Node.node.invoke.request: بث طلب استدعاء Node.device.pair.requested/device.pair.resolved: دورة حياة الجهاز المقترن.voicewake.changed: تغيّر إعداد مشغل كلمة التنبيه.exec.approval.requested/exec.approval.resolved: دورة حياة موافقة التنفيذ.plugin.approval.requested/plugin.approval.resolved: دورة حياة موافقة Plugin.
طرق مساعدة Node
- يمكن للعُقد استدعاء
skills.binsلجلب القائمة الحالية للملفات التنفيذية الخاصة بالـ Skills لفحوصات السماح التلقائي.
استدعاءات RPC لسجل المهام
يمكن لعملاء المشغّل فحص سجلات مهام Gateway الخلفية وإلغاؤها عبر استدعاءات RPC لسجل المهام. تعيد هذه الطرق ملخصات مهام منقّحة، لا حالة تشغيل خام.
- يتطلب
tasks.listالإذنoperator.read.- المعاملات:
statusاختياري ("queued"أو"running"أو"completed"أو"failed"أو"cancelled"أو"timed_out") أو مصفوفة من هذه الحالات، وagentIdاختياري، وsessionKeyاختياري، وlimitاختياري من1إلى500، وسلسلةcursorاختيارية. - النتيجة:
{ "tasks": TaskSummary[], "nextCursor"?: string }.
- المعاملات:
- يتطلب
tasks.getالإذنoperator.read.- المعاملات:
{ "taskId": string }. - النتيجة:
{ "task": TaskSummary }. - تعيد معرّفات المهام المفقودة بنية خطأ عدم العثور الخاصة بـ Gateway.
- المعاملات:
- يتطلب
tasks.cancelالإذنoperator.write.- المعاملات:
{ "taskId": string, "reason"?: string }. - النتيجة:
{ "found": boolean, "cancelled": boolean, "reason"?: string, "task"?: TaskSummary }. - يبلّغ
foundعما إذا كان السجل يحتوي على مهمة مطابقة. ويبلّغcancelledعما إذا كان وقت التشغيل قد قبل الإلغاء أو سجّله.
- المعاملات:
يتضمن TaskSummary كلًا من id وstatus وبيانات وصفية اختيارية مثل kind
وruntime وtitle وagentId وsessionKey وchildSessionKey وownerKey
وrunId وtaskId وflowId وparentTaskId وsourceId والطوابع الزمنية والتقدم
والملخص النهائي ونص الخطأ المنقّح. يحدد agentId الوكيل
الذي ينفذ المهمة؛ وتحافظ sessionKey وownerKey على سياق الطالب والتحكم.
طرق مساعدة المشغّل
- يجوز للمشغّلين استدعاء
commands.list(operator.read) لجلب مخزون أوامر وقت التشغيل لوكيل.agentIdاختياري؛ احذفه لقراءة مساحة عمل الوكيل الافتراضية.- يتحكم
scopeفي السطح الذي يستهدفهnameالأساسي:- يعيد
textرمز الأمر النصي الأساسي من دون/البادئة - يعيد
nativeومسارbothالافتراضي الأسماء الأصلية المراعية للمزوّد عند توفرها
- يعيد
- يحمل
textAliasesالأسماء المستعارة الدقيقة بشرطة مائلة مثل/modelو/m. - يحمل
nativeNameاسم الأمر الأصلي المراعي للمزوّد عند وجوده. providerاختياري ولا يؤثر إلا في التسمية الأصلية وتوفّر أوامر Plugin الأصلية.- يحذف
includeArgs=falseبيانات تعريف الوسيطات المتسلسلة من الاستجابة.
- يجوز للمشغّلين استدعاء
tools.catalog(operator.read) لجلب كتالوج أدوات وقت التشغيل لوكيل. تتضمن الاستجابة أدوات مجمّعة وبيانات تعريف المصدر:source:coreأوpluginpluginId: مالك Plugin عندما يكونsource="plugin"optional: ما إذا كانت أداة Plugin اختيارية
- يجوز للمشغّلين استدعاء
tools.effective(operator.read) لجلب مخزون الأدوات الفعّال في وقت التشغيل لجلسة.sessionKeyمطلوب.- يشتق Gateway سياق وقت التشغيل الموثوق من الجلسة على جانب الخادم بدلا من قبول سياق مصادقة أو تسليم يقدمه المستدعي.
- الاستجابة هي إسقاط مشتق من الخادم ومقيّد بالجلسة للمخزون النشط، بما في ذلك أدوات الخادم الأساسية وPlugin والقناة وخادم MCP المكتشفة مسبقا.
tools.effectiveللقراءة فقط بالنسبة إلى MCP: قد يسقط كتالوج MCP لجلسة دافئة عبر سياسة الأدوات النهائية، لكنه لا ينشئ أوقات تشغيل MCP، ولا يوصّل وسائل النقل، ولا يصدرtools/list. إذا لم يوجد كتالوج دافئ مطابق، فقد تتضمن الاستجابة إشعارا مثلmcp-not-yet-connectedأوmcp-not-yet-listedأوmcp-stale-catalog.- تستخدم إدخالات الأدوات الفعّالة
source="core"أوsource="plugin"أوsource="channel"أوsource="mcp".
- يجوز للمشغّلين استدعاء
tools.invoke(operator.write) لاستدعاء أداة واحدة متاحة عبر مسار سياسة Gateway نفسه مثل/tools/invoke.nameمطلوب. أماargsوsessionKeyوagentIdوconfirmوidempotencyKeyفهي اختيارية.- إذا كان كل من
sessionKeyوagentIdموجودين، فيجب أن يطابق وكيل الجلسة المحلولagentId. - تتطلب أغلفة النواة الخاصة بالمالك فقط مثل
cronوgatewayوnodesهوية مالك/مسؤول (operator.admin) رغم أن طريقةtools.invokeنفسها هيoperator.write. - الاستجابة غلاف موجّه إلى SDK يحتوي على
okوtoolNameوoutputاختياري وحقولerrorنمطية. ترجع رفضات الموافقة أو السياسةok:falseفي الحمولة بدلا من تجاوز مسار سياسة أدوات Gateway.
- يجوز للمشغّلين استدعاء
skills.status(operator.read) لجلب مخزون Skills المرئي لوكيل.agentIdاختياري؛ احذفه لقراءة مساحة عمل الوكيل الافتراضية.- تتضمن الاستجابة الأهلية والمتطلبات المفقودة وفحوصات الإعدادات وخيارات تثبيت منقّاة من دون كشف قيم الأسرار الخام.
- يجوز للمشغّلين استدعاء
skills.searchوskills.detail(operator.read) للحصول على بيانات تعريف اكتشاف ClawHub. - يجوز للمشغّلين استدعاء
skills.upload.beginوskills.upload.chunkوskills.upload.commit(operator.admin) لتهيئة أرشيف Skill خاص قبل تثبيته. هذا مسار رفع إداري منفصل للعملاء الموثوقين، وليس تدفق تثبيت Skills العادي في ClawHub، وهو معطّل افتراضيا ما لم يتم تفعيلskills.install.allowUploadedArchives.- ينشئ
skills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })رفعا مرتبطا بذلك المعرّف وقيمة الفرض. - يضيف
skills.upload.chunk({ uploadId, offset, dataBase64 })البايتات عند الإزاحة المفكوكة الدقيقة. - يتحقق
skills.upload.commit({ uploadId, sha256? })من الحجم النهائي و SHA-256. ينجز الالتزام الرفع فقط؛ ولا يثبّت Skill. - أرشيفات Skills المرفوعة هي أرشيفات zip تحتوي على جذر
SKILL.md. لا يحدد اسم الدليل الداخلي في الأرشيف هدف التثبيت مطلقا.
- ينشئ
- يجوز للمشغّلين استدعاء
skills.install(operator.admin) في ثلاثة أوضاع:- وضع ClawHub: يثبّت
{ source: "clawhub", slug, version?, force? }مجلد Skill في دليلskills/ضمن مساحة عمل الوكيل الافتراضية. - وضع الرفع: يثبّت
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }رفعا ملتزما في دليلskills/<slug>ضمن مساحة عمل الوكيل الافتراضية. يجب أن يطابق المعرّف وقيمة الفرض طلبskills.upload.beginالأصلي. يرفض هذا الوضع ما لم يتم تفعيلskills.install.allowUploadedArchives. لا يؤثر الإعداد في عمليات تثبيت ClawHub. - وضع مثبّت Gateway: يشغّل
{ name, installId, timeoutMs? }إجراءmetadata.openclaw.installمعلنا على مضيف Gateway. قد يستمر العملاء الأقدم في إرسالdangerouslyForceUnsafeInstall؛ هذا الحقل مهمل، ولا يقبل إلا للتوافق البروتوكولي، ويتم تجاهله. استخدمsecurity.installPolicyلقرارات التثبيت المملوكة للمشغّل.
- وضع ClawHub: يثبّت
- يجوز للمشغّلين استدعاء
skills.update(operator.admin) في وضعين:- يحدّث وضع ClawHub معرّفا متتبعا واحدا أو كل عمليات تثبيت ClawHub المتتبعة في مساحة عمل الوكيل الافتراضية.
- يرقّع وضع الإعدادات قيما مثل
skills.entries.<skillKey>مثلenabledوapiKeyوenv.
عروض models.list
يقبل models.list معامل view اختياريا:
- محذوف أو
"default": سلوك وقت التشغيل الحالي. إذا كانagents.defaults.modelsمكوّنا، تكون الاستجابة هي الكتالوج المسموح به، بما في ذلك النماذج المكتشفة ديناميكيا لإدخالاتprovider/*. وإلا تكون الاستجابة هي كتالوج Gateway الكامل. "configured": سلوك بحجم المنتقي. إذا كانagents.defaults.modelsمكوّنا، فإنه يظل هو السائد، بما في ذلك الاكتشاف المقيّد بالمزوّد لإدخالاتprovider/*. من دون قائمة سماح، تستخدم الاستجابة إدخالاتmodels.providers.*.modelsالصريحة، مع الرجوع إلى الكتالوج الكامل فقط عندما لا توجد صفوف نماذج مكوّنة."all": كتالوج Gateway الكامل، متجاوزاagents.defaults.models. استخدم هذا للتشخيصات وواجهات اكتشاف المستخدم، وليس منتقيات النماذج العادية.
موافقات التنفيذ
- عندما يحتاج طلب تنفيذ إلى موافقة، يبث 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بالرجوع إلى التنفيذ داخل الجلسة فقط عندما لا يمكن حل مسار خارجي قابل للتسليم (مثل جلسات داخلية/دردشة ويب أو إعدادات متعددة القنوات ملتبسة). - قد تتضمن نتائج
agentالنهائيةresult.deliveryStatusعندما يكون التسليم مطلوبا، باستخدام حالاتsentوsuppressedوpartial_failedوfailedنفسها الموثقة فيopenclaw agent --json --deliver.
تحديد الإصدارات
- يوجد
PROTOCOL_VERSIONفيpackages/gateway-protocol/src/version.ts. - يرسل العملاء
minProtocol+maxProtocol؛ ويرفض الخادم النطاقات التي لا تتضمن بروتوكوله الحالي. يتطلب العملاء والخوادم الحاليون البروتوكول v4. - يتم إنشاء المخططات + النماذج من تعريفات TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
ثوابت العميل
يستخدم العميل المرجعي في src/gateway/client.ts هذه القيم الافتراضية. القيم
مستقرة عبر البروتوكول v4 وهي خط الأساس المتوقع للعملاء الخارجيين.
| الثابت | الافتراضي | المصدر |
|---|---|---|
PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
MIN_CLIENT_PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
| مهلة الطلب (لكل RPC) | 30_000 ms |
src/gateway/client.ts (requestTimeoutMs) |
| مهلة المصادقة المسبقة / تحدي الاتصال | 15_000 ms |
src/gateway/handshake-timeouts.ts (يمكن للإعداد/البيئة رفع ميزانية الخادم/العميل المزدوجة) |
| تراجع إعادة الاتصال الأولي | 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 |
الفاصل الافتراضي للنبضات (قبل hello-ok) |
30_000 ms |
src/gateway/client.ts |
| إغلاق مهلة النبضة | الرمز 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) أو غير local loopbackgateway.auth.mode: "trusted-proxy"تفي بفحص مصادقة الاتصال من رؤوس الطلب بدلا منconnect.params.auth.*. - يتجاوز
gateway.auth.mode: "none"للدخول الخاص مصادقة الاتصال بالسر المشترك بالكامل؛ لا تعرض هذا الوضع على دخول عام/غير موثوق. - بعد الاقتران، يصدر 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.deviceTokenبالإضافة إلى رمز مشغل محدود فيhello-ok.auth.deviceTokensللتسليم الموثوق إلى الهاتف المحمول. يتضمن رمز المشغلoperator.talk.secretsلقراءات إعداد Talk الأصلية، لكنه يستثني نطاقات تعديل الاقتران وoperator.admin. - أثناء انتظار تمهيد رمز إعداد غير أساسي للموافقة، تتضمن تفاصيل
PAIRING_REQUIREDrecommendedNextStep: "wait_then_retry"، وretryable: true، وpauseReconnect: false. يجب على العملاء متابعة إعادة الاتصال بالرمز التمهيدي نفسه حتى تتم الموافقة على الطلب أو يصبح الرمز غير صالح. - احفظ
hello-ok.auth.deviceTokensفقط عندما يستخدم الاتصال مصادقة التمهيد على نقل موثوق مثلwss://أو اقتران loopback/محلي. - إذا قدم عميل
deviceTokenصريحا أوscopesصريحة، تظل مجموعة النطاقات التي طلبها المستدعي هي المعتمدة؛ لا يعاد استخدام النطاقات المخزنة مؤقتا إلا عندما يعيد العميل استخدام الرمز المخزن لكل جهاز. - يمكن تدوير/إبطال رموز الأجهزة عبر
device.token.rotateوdevice.token.revoke(يتطلب نطاقoperator.pairing). تدوير أو إبطال عقدة أو دور آخر غير مشغل يتطلب أيضاoperator.admin. - يعيد
device.token.rotateبيانات وصفية للتدوير. يكرر رمز الحامل البديل فقط لاستدعاءات الجهاز نفسه التي تمت مصادقتها بالفعل باستخدام رمز ذلك الجهاز، حتى يتمكن العملاء المعتمدون على الرموز فقط من حفظ البديل قبل إعادة الاتصال. لا تكرر تدويرات المشترك/المسؤول رمز الحامل. - يظل إصدار الرموز وتدويرها وإبطالها محدودا بمجموعة الأدوار الموافق عليها والمسجلة في إدخال اقتران ذلك الجهاز؛ لا يمكن لتعديل الرمز توسيع أو استهداف دور جهاز لم تمنحه موافقة الاقتران قط.
- بالنسبة إلى جلسات رموز الأجهزة المقترنة، تكون إدارة الجهاز ذاتية النطاق ما لم يكن
لدى المستدعي أيضا
operator.admin: يمكن للمستدعين غير المسؤولين إدارة رمز المشغل لإدخال جهازهم الخاص فقط. إدارة رموز العقد وغيرها من الرموز غير المشغلة خاصة بالمسؤول فقط، حتى لجهاز المستدعي نفسه. - يفحص
device.token.rotateوdevice.token.revokeأيضا مجموعة نطاقات رمز المشغل الهدف مقابل نطاقات جلسة المستدعي الحالية. لا يمكن للمستدعين غير المسؤولين تدوير أو إبطال رمز مشغل أوسع مما يحملونه بالفعل. - تتضمن حالات فشل المصادقة
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:- يمكن للعملاء الموثوقين محاولة إعادة محاولة محدودة واحدة باستخدام رمز مخزن مؤقتا لكل جهاز.
- إذا فشلت تلك المحاولة، يجب على العملاء إيقاف حلقات إعادة الاتصال التلقائية وعرض إرشادات إجراء المشغل.
- يعني
AUTH_SCOPE_MISMATCHأن رمز الجهاز تم التعرف عليه لكنه لا يغطي الدور/النطاقات المطلوبة. يجب ألا يعرض العملاء هذا باعتباره رمزا سيئا؛ اطلب من المشغل إعادة الاقتران أو الموافقة على عقد النطاق الأضيق/الأوسع.
هوية الجهاز + الاقتران
- يجب أن تتضمن العقد هوية جهاز مستقرة (
device.id) مشتقة من بصمة زوج مفاتيح. - تصدر Gateways الرموز لكل جهاز + دور.
- موافقات الاقتران مطلوبة لمعرفات الأجهزة الجديدة ما لم تكن الموافقة التلقائية المحلية مفعلة.
- تتمحور الموافقة التلقائية على الاقتران حول اتصالات local loopback المباشرة.
- لدى OpenClaw أيضا مسار اتصال ذاتي ضيق داخل الخلفية/الحاوية لتدفقات المساعد الموثوقة ذات السر المشترك.
- لا تزال اتصالات tailnet أو LAN على المضيف نفسه تعامل على أنها بعيدة للاقتران و تتطلب موافقة.
- يتضمن عملاء WS عادة هوية
deviceأثناءconnect(مشغل + عقدة). استثناءات المشغلين من دون جهاز الوحيدة هي مسارات الثقة الصريحة:gateway.controlUi.allowInsecureAuth=trueلتوافق HTTP غير آمن على المضيف المحلي فقط.- مصادقة Control UI للمشغل عبر
gateway.auth.mode: "trusted-proxy"الناجحة. gateway.controlUi.dangerouslyDisableDeviceAuth=true(كسر طارئ، خفض أمان شديد).- RPCs خلفية
gateway-clientعبر direct-loopback على مسار المساعد الداخلي المحجوز.
- لحذف هوية الجهاز عواقب على النطاقات. عندما يسمح باتصال مشغل
من دون جهاز عبر مسار ثقة صريح، يظل OpenClaw يمسح
النطاقات المعلنة ذاتيا إلى مجموعة فارغة ما لم يكن لذلك المسار استثناء مسمى
لحفظ النطاقات. عندها تفشل الطرق المحكومة بالنطاقات مع
missing scope. gateway.controlUi.dangerouslyDisableDeviceAuth=trueهو مسار حفظ نطاقات كسر طارئ لـ Control UI. لا يمنح نطاقات إلى عملاء WebSocket مخصصين عشوائيين بشكل خلفية أو CLI.- يحافظ مسار مساعد الخلفية المحجوز
gateway-clientعبر direct-loopback على النطاقات فقط لـ RPCs مستوى التحكم المحلي الداخلية؛ لا تحصل معرفات الخلفية المخصصة على هذا الاستثناء. - يجب أن توقع كل الاتصالات على قيمة 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بالإضافة إلى حقول الجهاز/العميل/الدور/النطاقات/الرمز/nonce. - تظل توقيعات
v2القديمة مقبولة للتوافق، لكن تثبيت البيانات الوصفية للجهاز المقترن لا يزال يتحكم في سياسة الأوامر عند إعادة الاتصال.
TLS + التثبيت
- TLS مدعوم لاتصالات WS.
- يمكن للعملاء اختياريا تثبيت بصمة شهادة Gateway (راجع إعداد
gateway.tlsبالإضافة إلىgateway.remote.tlsFingerprintأو CLI--tls-fingerprint).
النطاق
يكشف هذا البروتوكول واجهة برمجة تطبيقات Gateway الكاملة (الحالة، القنوات، النماذج، الدردشة،
الوكيل، الجلسات، العقد، الموافقات، إلخ). يحدد السطح الدقيق بواسطة
مخططات TypeBox في packages/gateway-protocol/src/schema.ts.