Gateway
بروتوكول Gateway
بروتوكول Gateway WS هو مستوى التحكم الوحيد ووسيلة نقل العُقد في OpenClaw. يتصل عملاء المشغّل والعُقد (CLI، وواجهة الويب، وتطبيق macOS، وعُقد iOS/Android، والعُقد بلا واجهة) عبر WebSocket ويُعلنون دورًا ونطاقًا عند إجراء المصافحة.
النقل وتأطير الرسائل
- WebSocket، إطارات نصية، وحمولات JSON.
- يجب أن يكون الإطار الأول طلب
connect. - يقتصر حجم الإطارات السابقة للاتصال على 64 KiB (
MAX_PREAUTH_PAYLOAD_BYTES). بعد المصافحة، اتبعhello-ok.policy.maxPayloadوhello-ok.policy.maxBufferedBytes. عند تفعيل التشخيصات، تُصدر الإطارات الواردة ذات الحجم الزائد والمخازن المؤقتة الصادرة البطيئة أحداثpayload.largeقبل أن يغلق Gateway الاتصال أو يسقط الإطار. تحمل هذه الأحداثsurface، وأحجام البايتات، والحدود، ورمز سبب آمنًا، ولا تحمل مطلقًا نصوص الرسائل، أو محتويات المرفقات، أو بايتات الإطار الخام، أو الرموز المميزة، أو ملفات تعريف الارتباط، أو الأسرار.
أشكال الإطارات:
- الطلب:
{type:"req", id, method, params} - الاستجابة:
{type:"res", id, ok, payload|error} - الحدث:
{type:"event", event, payload, seq?, stateVersion?}
تتطلب الطرق ذات الآثار الجانبية مفاتيح ضمان عدم التكرار (راجع المخطط).
المصافحة
يرسل Gateway تحديًا سابقًا للاتصال:
{ "type": "event", "event": "connect.challenge", "payload": { "nonce": "…", "ts": 1737264000000 }}يرد العميل باستخدام connect:
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 4, "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 باستخدام hello-ok:
{ "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 } }}كل من server وfeatures وsnapshot وpolicy وauth مطلوب بموجب
HelloOkSchema (packages/gateway-protocol/src/schema/frames.ts). يُبلغ auth
عن الدور والنطاقات المتفاوض عليها حتى عند عدم إصدار رمز مميز للجهاز (بالشكل
الموضح أعلاه). يُعد pluginSurfaceUrls اختياريًا، ويربط أسماء أسطح Plugin (مثل
canvas) بعناوين URL مستضافة ومحددة النطاق؛ وقد تنتهي صلاحيته، لذا تستدعي العُقد
node.pluginSurface.refresh باستخدام { "surface": "canvas" } للحصول على إدخال جديد.
مسار canvasHostUrl / canvasCapability / node.canvas.capability.refresh
المهمَل غير مدعوم؛ استخدم أسطح Plugin.
يمثل appliedConfigHash الاختياري في اللقطة مراجعة إعداد المصدر التي
حلّها وقت تشغيل Gateway النشط وقبلها. يمكن للعملاء مقارنته مع
config.get.configRevisionHash لتحديد ما إذا كان إعداد محفوظ أحدث لا يزال
يتطلب إعادة تشغيل. يظل config.get.hash مراجعة ملف الجذر الخام المستخدمة بواسطة
حواجز تعارض كتابة الإعداد.
بينما لا يزال Gateway يُنهي تشغيل العمليات الجانبية عند بدء التشغيل، يمكن أن يعيد connect
خطأ UNAVAILABLE قابلًا لإعادة المحاولة مع details.reason: "startup-sidecars" و
retryAfterMs. أعد المحاولة ضمن ميزانية اتصالك بدلًا من اعتباره
فشلًا نهائيًا في المصافحة.
عند إصدار رمز مميز للجهاز، يضيفه hello-ok.auth:
{ "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"] } ] }}تسليم المشغّل هذا محدود عمدًا: فهو يكفي لبدء حلقة المشغّل على الجهاز المحمول
والإعداد الأصلي، بما في ذلك operator.talk.secrets لقراءة إعداد
Talk، لكن من دون نطاقات تعديل الاقتران ومن دون operator.admin. يتطلب الوصول الأوسع
إلى الاقتران/الإدارة اقترانًا منفصلًا معتمدًا أو تدفقًا منفصلًا للرمز المميز. لا تحفظ
hello-ok.auth.deviceTokens إلا عندما جرت مصادقة التمهيد عبر وسيلة نقل موثوقة
(wss:// أو اقتران الاسترجاع الحلقي/المحلي).
يمكن لعملاء الواجهة الخلفية الموثوقين ضمن العملية نفسها (client.id: "gateway-client"،
client.mode: "backend") حذف device في اتصالات الاسترجاع الحلقي المباشرة عند
المصادقة باستخدام الرمز المميز/كلمة المرور المشتركة لـ Gateway. هذا المسار مخصص
لاستدعاءات RPC الداخلية لمستوى التحكم (مثل تحديثات جلسات الوكلاء الفرعيين)، ويتجنب
منع خطوط أساس اقتران CLI/الجهاز القديمة لعمل الواجهة الخلفية المحلي. أما العملاء البعيدون،
والصادرون من المتصفح، والعُقد، والعملاء الذين يستخدمون صراحةً رمزًا مميزًا للجهاز/هوية الجهاز، فلا يزالون
يمرون بفحوصات الاقتران وترقية النطاق المعتادة.
دور العامل والبروتوكول المغلق
يستخدم العاملون السحابيون نقطة دخول مخصصة للاسترجاع الحلقي عبر نفق SSH الذي يملكه Gateway
والمثبّت بمفتاح المضيف. وهي لا تقبل إلا هوية العامل ولا توجّه مطلقًا
المصادقة العامة، أو أحداث العُقد، أو استدعاءات RPC للمشغّل، أو طرق Plugin. يتحقق connect الصارم
من بيانات اعتماد قصيرة العمر مخزنة كتجزئة ومرتبطة بالبيئة، وتجزئة
الحزمة، وحقبة المالك، وإصدار مجموعة RPC، وانتهاء الصلاحية، وجلسة واحدة قابلة للقيمة الخالية؛ كما
يتحقق بصورة منفصلة من الإصدار الحالي ومجموعة الميزات. يعيد النجاح
worker-hello-ok بالحد الأدنى؛ ويكون تفاوض الميزات مستقلًا عن إصدار البروتوكول
العام. تظل الإطارات دون 64 KiB، باستثناء إطار worker.inference.start
المتفاوض عليه، الذي قد يصل إلى 25 MiB. تحتوي قائمة السماح المغلقة على worker.heartbeat
وworker.transcript.commit وworker.live-event وworker.inference.start و
worker.inference.cancel.
تستخدم عمليات تثبيت النصوص المنسوخة تسييج حقبة المالك، وربط جلسة يملكه Gateway، وعملية مقارنة ومبادلة للورقة الأساسية، وإعادة تشغيل متينة للتسلسل؛ وينشئ Gateway معرّفات إدخال النص المنسوخ والأصل من خلال كاتب الجلسة المعتاد. يُعاد التحقق من الملكية وانتهاء الصلاحية في كل استدعاء RPC.
إمكانات العميل
يمكن لعملاء المشغّل الإعلان عن إمكانات اختيارية في connect.params.caps:
tool-events: يقبل أحداث دورة حياة الأدوات المنظَّمة.inline-widgets: يمكنه عرض نتائج أدوات عناصر واجهة مضمّنة مستضافة.
تصف إمكانات العميل العميل المتصل، وليس التخويل. قد تعلن أدوات الوكيل عن إمكانات مطلوبة؛ ويحذف Gateway تلك الأدوات ما لم يظهر كل متطلب في caps الخاص بالعميل المصدر. لا تتضمن عمليات التشغيل الصادرة من القنوات إمكانات عميل Gateway، لذا لا تتوفر الأدوات المقيّدة بالإمكانات حتى عندما تسمح بها سياسة الأدوات صراحةً.
مثال على اتصال عقدة
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 4, "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": "…" } }}تعلن العُقد عن ادعاءات الإمكانات عند الاتصال:
caps: فئات عالية المستوى مثلcameraوcanvasوscreen، وlocationوvoiceوtalk.commands: قائمة السماح بالأوامر للاستدعاء.permissions: مفاتيح تبديل دقيقة (مثلscreen.recordوcamera.capture).
يتعامل Gateway مع هذه على أنها ادعاءات ويفرض قوائم السماح من جانب الخادم.
الأدوار والنطاقات
للاطلاع على نموذج نطاق المشغّل الكامل، وفحوصات وقت الموافقة، ودلالات السر المشترك، راجع نطاقات المشغّل.
الأدوار:
operator: عميل مستوى التحكم (CLI/واجهة المستخدم/الأتمتة).node: مضيف الإمكانات (الكاميرا/الشاشة/لوحة الرسم/system.run).worker: مضيف تنفيذ سحابي على بروتوكول العامل المخصص والمغلق.
نطاقات المشغّل (src/gateway/operator-scopes.ts)، وهي المجموعة المغلقة الكاملة:
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 نطاق المشغّل الخاص بها،
لكن بادئات النواة المحجوزة التالية تُحل دائمًا إلى operator.admin
(src/shared/gateway-method-policy.ts): config.* وexec.approvals.*،
وwizard.* وupdate.*.
نطاق الطريقة ليس سوى البوابة الأولى. تطبّق بعض أوامر الشرطة المائلة التي يجري الوصول إليها عبر
chat.send فحوصات أكثر صرامة على مستوى الأمر: تتطلب عمليات كتابة /config set و
/config unset الدائمة وجود operator.admin حتى لعملاء Gateway الذين
لديهم بالفعل نطاق مشغّل أدنى.
لدى node.pair.approve فحص إضافي للنطاق وقت الموافقة، علاوة على نطاق
الطريقة الأساسي (operator.pairing)، استنادًا إلى commands المعلن
للطلب المعلّق (src/infra/node-pairing-authz.ts):
| الأوامر المعلنة | النطاقات المطلوبة |
|---|---|
| لا شيء | operator.pairing |
| أوامر عادية | operator.pairing + operator.write |
يتضمن system.run أو system.run.prepare أو system.which أو browser.proxy أو fs.listDir أو system.execApprovals.get/set |
operator.pairing + operator.admin |
الإمكانات/الأوامر/الأذونات (العقدة)
تعلن العُقد عن ادعاءات الإمكانات عند الاتصال:
caps: فئات إمكانات عالية المستوى مثلcameraوcanvasوscreen، وlocationوvoiceوtalk.commands: قائمة السماح بالأوامر للاستدعاء.permissions: مفاتيح تبديل دقيقة (مثلscreen.recordوcamera.capture).
يتعامل Gateway مع هذه على أنها ادعاءات ويفرض قوائم السماح من جانب الخادم.
يمكن للعُقد المتصلة نشر واصفات اختيارية لأدوات Plugin أو MCP مرئية للوكيل
باستخدام node.pluginTools.update بعد نجاح الاتصال أو
إعادة الاتصال. تُعاد تشغيل مضيفات العُقد عديمة الواجهة لتطبيق تغييرات مخزون MCP
التعريفية. طريقة التحديث هذه هي مسار النشر الوحيد؛ ولا تُقبل واصفات أدوات Plugin ضمن
معاملات connect. يجب أن يستخدم كل واصف أداة name آمنة لمزوّد الخدمة وأن يسمّي
command ضمن قائمة السماح الحالية للأوامر في العقدة. يثق Gateway في بيانات الواصف
الوصفية الواردة من العقدة المقترنة، ويرشّح الواصفات الواقعة خارج نطاق الأوامر
المعتمد، ويزيلها عند قطع اتصال العقدة، ويرفض محاولات المشغّل
لتعديل كتالوج عقدة أخرى. عيّن gateway.nodes.pluginTools.enabled: false
لتجاهل الواصفات التي تنشرها العقدة.
تنشر مضيفات العُقد المتصلة كتالوج الاستبدال الكامل للمهارات لديها باستخدام
node.skills.update. طريقة دور العقدة هذه هي مسار نشر مهارات العقدة
الوحيد؛ ولا تُقبل المهارات ضمن معاملات connect. يحتوي كل واصف على
اسم آمن ووصف ومحتوى SKILL.md محدود. يحلّل Gateway ذلك
المحتوى باستخدام محمّل المهارات المعتاد، ويدرجه في لقطات مهارات الوكيل
ما دامت العقدة متصلة، ويزيله عند قطع الاتصال. عيّن
gateway.nodes.skills.enabled: false لتجاهل المهارات التي تنشرها العقدة.
الحضور
system-presenceيعيد إدخالات مفهرسة حسب هوية الجهاز، بما في ذلكdeviceIdوrolesوscopes، لكي تتمكن واجهات المستخدم من عرض صف واحد لكل جهاز حتى عندما يتصل بصفته مشغّلًا وعقدة في آن واحد.node.listيتضمنlastSeenAtMsوlastSeenReasonاختياريين. تُبلغ العُقد المتصلة عن وقت الاتصال الحالي بالسببconnect؛ ويمكن للعُقد المقترنة أيضًا الإبلاغ عن حضور دائم في الخلفية عبر حدث عقدة موثوق.
يمكن لعُقد macOS الأصلية أيضًا إرسال أحداث node.presence.activity موثّقة
مع مدة خمول إدخال محدودة. يشتق Gateway الطوابع الزمنية للنشاط وفق
ساعته الخاصة، ويعرض أحدث جهاز Mac متصل عبر node.list و
node.describe، ويبث تحديثات node.presence إلى العملاء ذوي نطاق القراءة.
راجع حضور الحاسوب النشط لمعرفة سلوك الاختيار والخصوصية وسياق النموذج
وتوجيه الإشعارات.
حدث بقاء العقدة حية في الخلفية
تستدعي العُقد node.event باستخدام event: "node.presence.alive" لتسجيل أن
عقدة مقترنة كانت حية أثناء تنبيه في الخلفية، من دون وضع علامة عليها بأنها متصلة:
{ "event": "node.presence.alive", "payloadJSON": "{\"trigger\":\"silent_push\",\"sentAtMs\":1737264000000,\"displayName\":\"هاتف iPhone الخاص بـ Peter\",\"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. تُطبّع القيم غير المعروفة إلى
background (src/shared/node-presence.ts). لا يُحفظ الحدث إلا
لجلسات أجهزة العُقد الموثّقة؛ أما الجلسات التي لا تتضمن جهازًا أو غير المقترنة فتعيد
handled: false.
تعيد بوابات Gateway الناجحة نتيجة منظّمة:
{ "ok": true, "event": "node.presence.alive", "handled": true, "reason": "persisted"}قد تعيد بوابات Gateway الأقدم { "ok": true } فقط من أجل node.event؛ تعامل مع ذلك
بصفته إقرارًا باستدعاء RPC، وليس حفظًا دائمًا للحضور.
تحديد نطاق أحداث البث
تخضع أحداث البث التي يدفعها الخادم لنطاقات الصلاحية، بحيث لا تتلقى الجلسات
المقيّدة بنطاق الاقتران أو المخصصة للعُقد فقط محتوى الجلسة بشكل سلبي
(src/gateway/server-broadcast.ts):
- تتطلب إطارات المحادثة والوكيل ونتائج الأدوات (أحداث
agentالمتدفقة، وأحداث نتائج الأدوات)operator.readعلى الأقل. تتخطى الجلسات التي لا تملكه هذه الإطارات بالكامل. - تُقيّد عمليات بث
plugin.*المعرّفة بواسطة Plugin افتراضيًا إلىoperator.writeأوoperator.admin؛ وتستخدم الإدخالات الصريحة مثلplugin.approval.requested/plugin.approval.resolvedoperator.approvalsبدلًا من ذلك. - تظل أحداث الحالة/النقل (
heartbeatوpresenceوtickودورة حياة الاتصال/قطع الاتصال) غير مقيّدة، لكي تكون صحة النقل قابلة للرصد في كل جلسة موثّقة. - تُقيّد عائلات أحداث البث غير المعروفة بنطاقات الصلاحية افتراضيًا (الإغلاق عند الفشل) ما لم يُرخِها معالج مسجّل صراحةً.
يحتفظ كل اتصال عميل برقم تسلسلي خاص به لكل عميل، لذلك تظل عمليات البث مرتبة ترتيبًا رتيبًا تصاعديًا على ذلك المقبس حتى عندما يرى عملاء مختلفون مجموعات فرعية مختلفة من تدفق الأحداث بعد ترشيحها حسب النطاق.
عائلات طرق RPC
hello-ok.features.methods هي قائمة اكتشاف متحفظة مبنية من
src/gateway/server-methods-list.ts إضافة إلى صادرات طرق Plugin/القناة
المحمّلة — وليست تفريغًا مولّدًا لكل طريقة، وبعض الطرق (مثل
push.test وweb.login.start وweb.login.wait وsessions.usage)
مستبعدة عمدًا من الاكتشاف مع أنها طرق حقيقية قابلة
للاستدعاء. تعامل مع هذه باعتبارها وسيلة لاكتشاف الميزات، لا تعدادًا كاملًا لـ
src/gateway/server-methods/*.ts.
النظام والهوية
healthيعيد لقطة صحة Gateway المخزنة مؤقتًا أو التي جرى فحصها حديثًا.diagnostics.stabilityيعيد مسجّل الاستقرار التشخيصي الحديث والمحدود: أسماء الأحداث وأعدادها وأحجام البايتات وقراءات الذاكرة وحالة قوائم الانتظار/الجلسات وأسماء القنوات/Plugin ومعرّفات الجلسات. لا يتضمن نصوص المحادثات أو أجسام Webhook أو مخرجات الأدوات أو أجسام الطلبات/الاستجابات الخام أو الرموز المميزة أو ملفات تعريف الارتباط أو الأسرار. يتطلبoperator.read.statusيعيد ملخص Gateway بنمط/status؛ ولا تظهر الحقول الحساسة إلا لعملاء المشغّل ذوي نطاق المسؤول.gateway.identity.getيعيد هوية جهاز Gateway المستخدمة في تدفقات الترحيل والاقتران.system-presenceيعيد لقطة الحضور الحالية لأجهزة المشغّل/العقدة المتصلة.system-eventيلحق حدثًا بالنظام ويمكنه تحديث سياق الحضور وبثه.last-heartbeatيعيد أحدث حدث Heartbeat محفوظ.set-heartbeatsيفعّل أو يعطّل معالجة Heartbeat على Gateway.gateway.suspend.prepareينشئ عقد إيجار قصيرًا للتعليق التعاوني فقط عندما يكون عمل Gateway المتتبّع خاملًا. يتحققgateway.suspend.statusمن عقد الإيجار هذا، ويحررهgateway.suspend.resumeبعد استئناف التشغيل أو إحباط عملية المضيف.
النماذج والاستخدام
models.listيعيد كتالوج النماذج المسموح بها في وقت التشغيل. راجع طرق عرض "models.list" أدناه.usage.statusيعيد ملخصات نوافذ استخدام المزوّد/الحصة المتبقية.usage.costيعيد ملخصات استخدام التكلفة المجمّعة لنطاق زمني. مرّرagentIdلوكيل واحد، أوagentScope: "all"لتجميع الوكلاء المضبوطين.doctor.memory.statusيعيد جاهزية ذاكرة المتجهات / التضمينات المخزنة مؤقتًا لمساحة عمل الوكيل الافتراضي النشط. مرّر{ "probe": true }أو{ "deep": true }فقط لتنفيذ اختبار اتصال مباشر وصريح بمزوّد التضمينات. مرّر{ "agentId": "agent-id" }لتقييد إحصاءات مخزن Dreaming بمساحة عمل وكيل واحدة؛ ويؤدي حذفه إلى تجميع مساحات عمل Dreaming المضبوطة.doctor.memory.dreamDiaryوdoctor.memory.backfillDreamDiaryوdoctor.memory.resetDreamDiaryوdoctor.memory.resetGroundedShortTermوdoctor.memory.repairDreamingArtifactsوdoctor.memory.dedupeDreamDiaryتقبل{ "agentId": "agent-id" }اختياريًا؛ وعند حذفه، تعمل على مساحة عمل الوكيل الافتراضي المضبوطة.doctor.memory.remHarnessيعيد معاينة محدودة وللقراءة فقط لأداة REM للعملاء البعيدين في مستوى التحكم، بما في ذلك مسارات مساحة العمل ومقتطفات الذاكرة ونصوص Markdown المؤسَّسة المعروضة ومرشحي الترقية العميقة. يتطلبoperator.read.sessions.usageيعيد ملخصات الاستخدام لكل جلسة. مرّرagentIdلوكيل واحد، أوagentScope: "all"لسرد الوكلاء المضبوطين معًا. تقبل طريقتا الاستخدام كلتاهماmode: "specific"معtimeZoneمن IANA لحدود وحاويات الأيام التقويمية المدركة للتوقيت الصيفي. يظلutcOffsetمدعومًا للعملاء الأقدم وكخيار احتياطي عندما لا يتعرف وقت تشغيل Gateway على المنطقة المطلوبة.sessions.usage.timeseriesيعيد استخدام السلسلة الزمنية لجلسة واحدة.sessions.usage.logsيعيد إدخالات سجل الاستخدام لجلسة واحدة.
القنوات ومساعدات تسجيل الدخول
channels.statusيعيد ملخصات حالة القنوات/Plugin المدمجة والمضمّنة.channels.logoutيسجّل خروج قناة/حساب محدد عندما تدعم القناة ذلك.web.login.startيبدأ تدفق تسجيل دخول عبر QR/الويب لمزوّد قناة الويب الحالي القادر على استخدام QR.web.login.waitينتظر اكتمال ذلك التدفق ويبدأ القناة عند النجاح.push.testيرسل إشعار APNs اختباريًا إلى عقدة iOS مسجّلة.voicewake.getيعيد مشغّلات كلمات التنبيه المخزنة.voicewake.setيحدّث مشغّلات كلمات التنبيه ويبث التغيير.
إدارة Plugin
plugins.list(operator.read) يعيد مخزون Plugin المثبّت إضافة إلى الاختيارات الرسمية المنتقاة محليًا والتشخيصات وما إذا كان وضع التثبيت الحالي يسمح بالتعديلات.plugins.search(operator.read) يبحث في عائلات Plugin البرمجية وPlugin الحزم القابلة للتثبيت من ClawHub. مرّرqueryغير فارغ وlimitاختياريًا من 1 إلى 100.plugins.install(operator.admin) يثبّت إما إدخالًا من الكتالوج الرسمي باستخدام{ source: "official", pluginId }أو حزمة ClawHub باستخدام{ source: "clawhub", packageName, version?, acknowledgeClawHubRisk? }. تحافظ عمليات تثبيت ClawHub على فحوص الثقة والتكامل وسياسة التثبيت الخاصة بـ Gateway. تتطلب عمليات التثبيت الناجحة إعادة تشغيل Gateway.plugins.setEnabled(operator.admin) يغيّر سياسة التمكين لـ Plugin واحد مثبّت باستخدام{ pluginId, enabled }. تتضمن الاستجابة إدخال الكتالوج المحدّث وبيانات إعادة التشغيل الوصفية وأي تحذيرات بشأن اختيار الفتحة.plugins.uninstall(operator.admin) يزيل Plugin واحدًا مثبّتًا خارجيًا باستخدام{ pluginId }: مراجع الإعداد وسجل التثبيت والملفات المُدارة. لا يمكن إلغاء تثبيت Plugin المضمّنة، بل يمكن تعطيلها فقط. تسرد الاستجابة إجراءات الإزالة وتتطلب دائمًا إعادة تشغيل Gateway.
المراسلة والسجلات
sendهو RPC التسليم الصادر المباشر للإرسال الموجّه إلى قناة/حساب/سلسلة محادثة خارج مشغّل المحادثة.logs.tailيعيد ذيل سجل ملفات Gateway المضبوط مع عناصر تحكم في المؤشر/الحد والحد الأقصى للبايتات.
طرفية المشغّل
terminal.openيبدأ PTY على المضيف لصالحagentIdمحدد أو الوكيل الافتراضي، ويعيد الوكيل الذي جرى حله، ودليل العمل، والصدفة، وحالة العزل.terminal.inputوterminal.resizeوterminal.closeتعمل فقط على الجلسات المملوكة للاتصال المستدعي.terminal.uploadيقبل ملفًا واحدًا بترميز base64 يصل حجمه إلى 16 MiB، ويضعه مؤقتًا في دليل خاص لمدة 24 ساعة على Gateway الخاص بالجلسة أو مضيف العقدة المقترنة، ويعيد المسار المطلق. يظل على المستدعي لصق ذلك المسار أو استخدامه بطريقة أخرى؛ فلا يكتب RPC أبدًا إدخالًا إلى الطرفية ولا ينفّذ أمرًا.- تُبث أحداث
terminal.dataوterminal.exitفقط إلى الاتصال الذي يملك الجلسة. - تُفصل الجلسات التي ينقطع اتصالها بدلًا من إنهائها: وتظل قابلة لإعادة الاتصال لمدة
gateway.terminal.detachedSessionTimeoutSeconds(القيمة الافتراضية 300؛ ويعيد0سلوك الإنهاء عند انقطاع الاتصال)، بينما يتراكم الإخراج الحديث في مخزن مؤقت محدود على جانب الخادم. terminal.listيعيد الجلسات القابلة للاتصال؛ ويعيدterminal.attachربط جلسة نشطة أو مفصولة بالاتصال المستدعي ويعيد مخزن إعادة التشغيل المؤقت (استحواذ بأسلوب tmux — يتلقى المالك النشط السابقterminal.exitبالسببdetached)؛ ويقرأterminal.textالمخزن المؤقت كنص عادي من دون اتصال.- تتطلب كل طريقة طرفية
operator.admin؛ ويجب أن تكونgateway.terminal.enabledمضبوطة صراحةً على true. تُرفض الوكلاء المعزولة بالكامل، ويؤدي تغيير سياسة الوكيل إلى إغلاق جلسات PTY الحالية وقيد التنفيذ، بما فيها الجلسات المفصولة.
المحادثة وتحويل النص إلى كلام
talk.catalogيعيد كتالوج موفّري المحادثة للقراءة فقط للكلام، والنسخ المتدفق، والصوت في الوقت الفعلي: معرّفات الموفّرين الأساسية، وأسماء السجل البديلة، والتسميات، وحالة التهيئة، ونتيجةreadyاختيارية على مستوى المجموعة، ومعرّفات النماذج/الأصوات المكشوفة، والأوضاع الأساسية، ووسائط النقل، واستراتيجيات العقل، وعلامات الصوت/الإمكانات في الوقت الفعلي، من دون إعادة أسرار الموفّر أو تعديل الإعداد العام. تضبط بوابات Gateway الحاليةreadyبعد تطبيق اختيار الموفّر في وقت التشغيل؛ ويُعد غيابه غير متحقق منه في بوابات Gateway الأقدم.talk.configيعيد حمولة إعداد المحادثة الفعلية؛ ويتطلبincludeSecretsوجودoperator.talk.secrets(أوoperator.admin).talk.session.createينشئ جلسة محادثة مملوكة لـ 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.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يرسل تحكمًا صوتيًا في التشغيل النشط إلى جلسة محادثة مدعومة بوكيل ومملوكة لـ Gateway:{ sessionId, text, mode? }، حيث تكونmodeإحدىstatusأوsteerأوcancelأوfollowup؛ ويُصنّف الوضع المحذوف من النص المنطوق.talk.session.closeيغلق جلسة ترحيل أو نسخ أو غرفة مُدارة مملوكة لـ Gateway، ويصدر أحداث المحادثة النهائية.talk.modeيضبط/يبث حالة وضع المحادثة الحالية لعملاء WebChat/واجهة التحكم.talk.client.createينشئ جلسة موفّر في الوقت الفعلي مملوكة للعميل باستخدامwebrtcأوprovider-websocket، بينما يملك Gateway الإعداد وبيانات الاعتماد والتعليمات وسياسة الأدوات.talk.client.toolCallيتيح لوسائط النقل في الوقت الفعلي المملوكة للعميل تمرير استدعاءات أدوات الموفّر إلى سياسة Gateway. الأداة الأولى المدعومة هيopenclaw_agent_consult؛ ويحصل العملاء على معرّف تشغيل وينتظرون أحداث دورة حياة الدردشة المعتادة قبل إرسال نتيجة الأداة الخاصة بالموفّر.talk.client.steerيرسل تحكمًا صوتيًا في التشغيل النشط لوسائط النقل في الوقت الفعلي المملوكة للعميل. يحل Gateway التشغيل المضمن النشط منsessionKeyويعيد نتيجة قبول/رفض منظّمة بدلًا من إسقاط التوجيه بصمت.talk.eventهي قناة أحداث المحادثة الوحيدة لمحولات الوقت الفعلي، والنسخ، وSTT/TTS، والغرف المُدارة، والاتصالات الهاتفية، والاجتماعات.talk.speakيولّد الكلام عبر موفّر كلام المحادثة النشط.tts.statusيعيد حالة تمكين TTS، والموفّر النشط، والموفّرين الاحتياطيين، وحالة إعداد الموفّر.tts.providersيعيد مخزون موفّري TTS المرئي.tts.enableوtts.disableيبدّلان حالة تفضيلات TTS.tts.setProviderيحدّث موفّر TTS المفضّل.tts.convertيشغّل تحويلًا لمرة واحدة من النص إلى كلام.tts.speak(operator.write) يعالجtextغير الفارغ باستخدام سلسلة موفّري TTS العامة المُعدّة، ويعيد مقطعًا كاملًا واحدًا مضمّنًا بصفتهaudioBase64، بالإضافة إلىproviderوبياناتoutputFormatوmimeTypeوfileExtensionالوصفية الاختيارية. بخلافtts.convert، لا يعيد مسارًا محليًا لـ Gateway؛ وبخلافtalk.speak، لا يتطلب موفّر محادثة. يعيد النص الذي يتجاوزmessages.tts.maxTextLengthالقيمةINVALID_REQUEST؛ وتعيد حالات فشل التوليدUNAVAILABLE.
الأسرار والإعداد والتحديث والمعالج
secrets.reloadيعيد حل SecretRefs النشطة ويستبدل حالة الأسرار في وقت التشغيل فقط عند النجاح الكامل.secrets.resolveيحل تعيينات الأسرار لأهداف الأوامر لمجموعة أوامر/أهداف محددة.config.getيعيد لقطة الإعداد الحالية على القرص، وhashلملف الجذر الخام، وconfigRevisionHashالذي جرى حله، وappliedConfigHashاختياريًا للمراجعة المحلولة التي قبلها وقت تشغيل Gateway النشط.config.setيكتب حمولة إعداد تم التحقق من صحتها.config.patchيدمج تحديث إعداد جزئيًا. يتطلب الاستبدال الإتلافي للمصفوفة إدراج المسار المتأثر فيreplacePaths؛ وتستخدم المصفوفات المتداخلة ضمن إدخالات المصفوفة مسارات[]مثلagents.list[].skills.config.applyيتحقق من حمولة الإعداد الكاملة ويستبدلها.config.schemaيعيد حمولة مخطط الإعداد الحي التي تستخدمها واجهة التحكم وأدوات CLI: المخطط، وuiHints، والإصدار، وبيانات التوليد الوصفية، وبيانات مخطط Plugin والقناة الوصفية عندما يمكن تحميلها. ويتضمن بياناتtitle/descriptionالوصفية من التسميات/نص المساعدة نفسها المستخدمة في واجهة المستخدم، بما في ذلك فروع تركيب الكائنات المتداخلة، وأحرف البدل، وعناصر المصفوفة، وanyOf/oneOf/allOfعند وجود وثائق مطابقة للحقل.config.schema.lookupيعيد حمولة بحث مقيّدة بمسار لمسار إعداد واحد: المسار المطبع، وعقدة مخطط سطحية، والتلميح المطابق معhintPath، وreloadKindاختياريًا، وملخصات الأبناء المباشرين للتعمق عبر واجهة المستخدم/CLI. تكونreloadKindإحدىrestartأوhotأوnone(src/config/schema.ts)، وتحاكي مخطط إعادة تحميل إعداد 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 الخاضعة للإشراف من مستوى التحكم تسليمًا منفصلًا إلى خدمة مُدارة بدلًا من استبدال شجرة الحزمة أو تعديل مخرجات نسخة العمل/البناء داخل Gateway النشط. يعيد التسليم الذي بدأok: trueمعresult.reason: "managed-service-handoff-started"وhandoff.status: "started"؛ وتعيد عمليات التسليم غير المتاحة أو الفاشلةok: falseمعmanaged-service-handoff-unavailableأوmanaged-service-handoff-failed، بالإضافة إلىhandoff.commandعندما يلزم تحديث يدوي عبر الصدفة. تعني «غير متاح» أن 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تدير ملفات مساحة عمل التمهيد المتاحة للوكيل.audit.activity.listيعيد سجل النشاط ذي الإصدارات والمقتصر على البيانات الوصفية؛ ويظلaudit.listهو RPC الآمن من حيث التوافق للتشغيل/الأداة.agents.workspace.listوagents.workspace.get(operator.read) يتيحان تصفحًا للقراءة فقط ومقسّمًا إلى صفحات لدليل مساحة عمل الوكيل، للعملاء ضمن نطاق المشغّل الموثوق الموضح في نطاقات المشغّل. لا تقبل الطلبات إلا المسارات النسبية إلى مساحة العمل؛ وتظل عمليات القراءة محصورة في جذر مساحة العمل بعد حل مساره الحقيقي (مع رفض محاولات الإفلات عبر الروابط الرمزية والروابط الصلبة)، ومقيدة بالحجم، ومقتصرة على نص UTF-8 وأنواع الصور الشائعة (base64). لا تكشف الاستجابات مسار مساحة العمل على المضيف. لا توجد عمليات كتابة في نطاق الأسماء هذا.tasks.listوtasks.getوtasks.cancelتتيح سجل مهام Gateway لعملاء SDK والمشغّل. راجع واجهات RPC لسجل المهام أدناه.artifacts.listوartifacts.getوartifacts.downloadتتيح ملخصات العناصر المستمدة من السجل النصي وتنزيلاتها ضمن نطاق صريح من نوعsessionKeyأوrunIdأوtaskId. تستخرج استعلامات التشغيل والمهام الجلسة المالكة على جانب الخادم، ولا تعيد إلا وسائط السجل النصي ذات المصدر المطابق؛ وتعيد مصادر URL غير الآمنة أو المحلية تنزيلات غير مدعومة بدلًا من جلبها على جانب الخادم.environments.listوenvironments.statusتحافظان على اكتشاف بيئة Gateway المحلية وبيئة Node. تضيف عُقد العمل السحابية المهيأة والسجلات الدائمة التي تركتها ملفات التعريف السابقة بياناتworkerالوصفية معproviderIdوleaseIdالاختياري وstateوageMsوidleMsالاختياري وattachedSessionIds. حالات دورة حياة عقدة العمل هيrequestedوprovisioningوbootstrappingوreadyوattachedوidleوdrainingوdestroyingوdestroyedوfailedوorphaned.environments.create({ profileId, idempotencyKey }) يوفّر عقدة عمل من ملف تعريف موفّر مهيأ في Plugin؛ وتعيد المحاولات بالمفتاح نفسه استخدام العملية الدائمة. ويطلبenvironments.destroy({ environmentId }) إزالة متكررة آمنة لبيئة عقدة عمل دائمة. يتطلب كلاهماoperator.admin، وهما عمليتا كتابة في مستوى التحكم، ويعيدان بنية ملخص البيئة نفسها المستخدمة في استجابات الحالة.agent.identity.getيعيد هوية المساعد الفعلية لوكيل أو جلسة.agent.waitينتظر انتهاء تشغيل ويعيد اللقطة النهائية عند توفرها.
التحكم في الجلسة
sessions.listيعيد فهرس الجلسات الحالي، بما في ذلك بياناتagentRuntimeالوصفية لكل صف عند تهيئة واجهة خلفية لبيئة تشغيل الوكيل. وعند تمكين توزيع عُقد العمل السحابية أو وجود حالة استرداد دائمة، تتضمن صفوف الجلسات أيضًا حالةplacementمغلقة (localأوrequestedأوprovisioningأوsyncingأوstartingأوactiveأوdrainingأوreconcilingأوreclaimedأوfailed) بالإضافة إلى حقول البيئة أو حقبة المالك أو مساحة العمل أو الحزمة أو مؤشر ACK أو الاسترداد الخاصة بالحالة.sessions.subscribeوsessions.unsubscribeتبدّلان اشتراكات أحداث تغييرات الجلسة لعميل WS الحالي.sessions.messages.subscribeوsessions.messages.unsubscribeتبدّلان اشتراكات أحداث السجل النصي/الرسائل لجلسة واحدة. مرّرincludeApprovals: trueلتلقي أحداث دورة حياةsession.approvalالمنقّحة أيضًا، وذلك للموافقات التي يتضمن جمهورها المحفوظ تلك الجلسة تحديدًا والتي يصرّح ربط المراجع فيها للعميل المشترك. تتضمن استجابة الاشتراك حينئذٍ قائمةapprovalReplayمعلّقة ومحدودة؛ وتكون موثوقة عندما تكونtruncatedبالقيمة false. يكون الاشتراك الاختياري خاصًا بكل استدعاء اشتراك وليس دائمًا: تؤدي إعادة الاشتراك في الجلسة نفسها دونincludeApprovals: trueإلى إزالة اشتراك موافقات قائم. بالإضافة إلى صلاحية قراءة الجلسة العادية، يتطلب هذا الاشتراك الاختياريoperator.admin، أوoperator.approvalsعلى جهاز مقترن.sessions.previewيعيد معاينات محدودة للسجل النصي لمفاتيح جلسات محددة.sessions.describeيعيد صف جلسة واحدًا من Gateway لمفتاح جلسة مطابق تمامًا.sessions.resolveيستخرج هدف جلسة أو يحوّله إلى صيغته القياسية.sessions.createينشئ إدخال جلسة جديدًا. تحفظ قيمتاmodelوthinkingLevelالاختياريتان تجاوزات النموذج والاستدلال الأولية ذريًا. يوفّرworktree: trueشجرة عمل مُدارة؛ ويحدّدworktreeBaseRef/worktreeNameالاختياريان المرجع الأساسي واسم الفرع، ويربطexecNode(operator.admin) تنفيذ الجلسة بمضيف Node. تُعاد شجرة العمل المنشأة في النتيجة وتُحفظ في صف الجلسة (worktree: { id, branch, repoRoot }). عندما يُنشأ الإدخال لكن يُرفضchat.sendالأولي المتداخل، تتضمن النتيجة الناجحةrunStarted: falseوrunError؛ ويمكن للعملاء الاحتفاظ بالموجّه وإعادة المحاولة باستخدام مفتاح الجلسة المُعاد.sessions.dispatch(operator.admin) ينقل جلسة OpenClaw محلية قائمة ذات شجرة عمل مُدارة تملكها الجلسة إلى ملف تعريف مهيأ لعقدة عمل سحابية. مرّر{ key, profileId, agentId? }. لا تكون الطريقة موجودة عند عدم تهيئة أي ملف تعريف لعقدة العمل، وتغلق قبول الأدوار المحلية قبل تصريف العمل النشط، ولا تعود إلا بعد أن يصل التوزيع إلى ملكية عقدة العملactive. الإرسال أحادي الاتجاه؛ ولا يشمل RPC هذا السحب من عقدة العمل إلى البيئة المحلية.sessions.groups.listوsessions.groups.putوsessions.groups.renameوsessions.groups.deleteتدير دليل مجموعات الجلسات المخصصة الذي يملكه Gateway (الأسماء + ترتيب العرض). تظل العضوية في حقلcategoryلكل جلسة؛ ويؤدي تغيير الاسم والحذف إلى تحديث الجلسات الأعضاء على جانب الخادم.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.toolTitlesيعيد عناوين قصيرة لأغراض استدعاءات الأدوات المعروضة في واجهة التحكم (على دفعات، بحد أقصى 24 عنصرًا مع مدخلات محدودة). تُفعّل الميزة اختياريًا عبرgateway.controlUi.toolTitles(معطّلة افتراضيًا)؛ وتجيب بوابات Gateway المعطّلة عن{ titles: {}, disabled: true }من دون استدعاء للنموذج كي يتوقف العملاء عن الطلب. عند تمكينها، تستخدم العناوين توجيه نموذج الأدوات المساعدة القياسي: إماutilityModelمهيأ صراحةً (وهو قرار للمشغّل قد يرسل، مثل جميع مهام الأدوات المساعدة، محتوى مهمة محدودًا إلى الموفّر المختار)، وإلا فالنموذج الصغير الافتراضي المعلن لموفّر الجلسة، بحيث لا تظهر وجهة خروج جديدة ضمنيًا؛ ويؤديutilityModelالفارغ إلى تعطيلها بالكامل. لا تعود العناوين أبدًا إلى النموذج الأساسي. تُخزّن النتائج مؤقتًا في قاعدة بيانات الحالة الخاصة بكل وكيل، بمفتاح يتكون من اسم الأداة + المدخلات، لذلك لا تعيد المشاهدات المتكررة احتساب تكلفة الاستدعاءات نفسها.chat.sendيقبلfastMode: "auto"لدور واحد لاستخدام الوضع السريع لاستدعاءات النموذج التي تبدأ قبل حد الإيقاف التلقائي، ثم بدء محاولات إعادة لاحقة أو استدعاءات احتياطية أو نتائج أدوات أو استدعاءات متابعة من دون الوضع السريع. القيمة الافتراضية للحد هي 60 ثانية (DEFAULT_FAST_MODE_AUTO_ON_SECONDS) ويمكن تهيئتها لكل نموذج باستخدامagents.defaults.models["<provider>/<model>"].params.fastAutoOnSeconds. يمكن لمستدعٍ من نوعchat.sendتمريرfastAutoOnSecondsلدور واحد لتجاوز الحد لذلك الطلب. مرّرqueueMode(steerأوfollowupأوcollectأوinterrupt) لتجاوز وضع قائمة الانتظار المحفوظ لهذا الطلب فقط؛ وتستخدم إجراءات التوجيه الصريحة في واجهة التحكمqueueMode: "steer".
إقران الأجهزة ورموزها المميزة
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.pair.renameيعيّن تسمية للمشغّل ({ deviceId, label }) تُفضّل على اسم العرض الذي يبلّغ عنه العميل، وتستمر بعد إصلاح الجهاز أو إعادة الموافقة عليه.device.token.rotateيدوّر الرمز المميز لجهاز مقترن ضمن حدود دوره المعتمد ونطاق المستدعي.device.token.revokeيلغي الرمز المميز لجهاز مقترن ضمن حدود دوره المعتمد ونطاق المستدعي.
يتضمن رمز الإعداد بيانات اعتماد تمهيدية قصيرة العمر. يجب ألا يسجّلها العملاء أو يحتفظوا بها بعد انتهاء تدفق الإقران.
إقران Node والاستدعاء والعمل المعلّق
node.pair.listوnode.pair.approveوnode.pair.rejectوnode.pair.removeتغطي الموافقات على إمكانات Node. أُزيلتnode.pair.requestوnode.pair.verifyفي 2026.7 مع مخزن إقران Node المستقل؛ وينشئ Gateway الطلبات المعلّقة أثناء اتصالات Node.node.listوnode.describeتعيدان حالة Node المعروفة/المتصلة.node.renameتحدّث تسمية Node مقترنة.node.invokeتمرّر أمرًا إلى Node متصلة.node.invoke.resultتعيد نتيجة طلب استدعاء.mcp.tools.call.v1هي أمر مضيف Node غير المزود بواجهة رسومية لاستدعاء أداة MCP محلية في Node تم تكوينها. تُنقل عبرnode.invoke، وتتطلب من Node التصريح بالأمر، وتظل خاضعة لموافقة الإقران وgateway.nodes.denyCommands.node.eventتنقل الأحداث الصادرة من Node إلى Gateway.node.pluginTools.updateهي مسار النشر الوحيد لاستبدال واصفات أدوات Plugin/MCP المرئية للوكيل في Node المتصلة؛ ولا تحملها معاملاتconnect.node.pending.pullوnode.pending.ackهما واجهتا API لطابور Node المتصلة.node.pending.enqueueوnode.pending.drainتديران العمل المعلّق الدائم لعُقد Node غير المتصلة بالشبكة/المنفصلة.
عائلات الموافقات
approval.getوapproval.resolveهما طريقتا الموافقة الدائمتان غير المقيّدتين بنوع (النطاقoperator.approvals). تعيدapproval.getإسقاطًا منقحًا معلّقًا أو نهائيًا محتفظًا به معurlPathثابت؛ وتقبلapproval.resolveمعرّف الموافقة الأساسي وkindصريحًا وقرارًا، وتطبّق حسم أسبقية الإجابة الأولى، وتعيد دائمًا النتيجة الأساسية المسجّلة.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تديران سياسة موافقة التنفيذ المحلية في Node عبر أوامر ترحيل Node.plugin.approval.requestوplugin.approval.listوplugin.approval.waitDecisionوplugin.approval.resolveتغطي تدفقات الموافقة التي يعرّفها Plugin.
الأتمتة وSkills والأدوات
- الأتمتة: تجدول
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: تحديثات النص المسجّل وعملية الجلسة الجارية وتدفق الأحداث لجلسة مشترَك فيها.session.approval: الحقيقة المنقحة للموافقات المعلّقة والنهائية لمشترك في الجلسة الدقيقة اختار الاشتراك صراحةً. تستخدم الموافقات الفرعية جمهور السلف المحفوظ؛ ولا تعدّل الأحداث النصوص المسجّلة ولا توقظ الوكلاء أبدًا.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
يمكن لعُقد Node استدعاء skills.bins لجلب القائمة الحالية لملفات Skills التنفيذية
من أجل عمليات التحقق من السماح التلقائي.
RPC لدفتر التدقيق
تمنح audit.activity.list عملاء المشغّلين عرضًا ثابتًا مرتبًا من الأحدث إلى الأقدم للبيانات الوصفية
لدورة حياة تشغيل الوكيل وإجراء الأداة والرسالة المشترَك فيها اختياريًا. وتتطلب
operator.read. تستبعد الاستعلامات السجلات الأقدم من 30 يومًا، ويقتصر دفتر
SQLite المشترك على 100,000 سجل. تُحذف الصفوف المنتهية الصلاحية أثناء
بدء تشغيل Gateway والصيانة كل ساعة وعمليات الكتابة اللاحقة. راجع
سجل التدقيق لمعرفة نموذج البيانات ودلالات الخصوصية.
- المعاملات:
agentIdأوsessionKeyأوrunIdمطابق تمامًا اختياري؛ وkindاختياري ("agent_run"أو"tool_action"أو"message")؛ وstatusاختياري ("started"أو"succeeded"أو"failed"أو"cancelled"أو"timed_out"أو"blocked"أو"unknown")؛ وdirectionللرسالة اختياري ("inbound"أو"outbound") وchannelمطابق تمامًا؛ وحدودafter/beforeالشاملة الاختيارية بالميلي ثانية وفق Unix؛ وlimitاختياري من1إلى500؛ وcursorنصي اختياري من الصفحة السابقة. - النتيجة:
{ "events": AuditActivityEventV1[], "nextCursor"?: string }.
يتضمن اتحاد نتائج V1 المسمّى مخططات منفصلة لتشغيل الوكيل وإجراء الأداة والرسالة الواردة
والرسالة الصادرة. مميّز eventType هو على الترتيب
agent_run أو tool_action أو inbound_message أو outbound_message؛ ويظل kind
وdirection للرسالة متاحين للتصفية والعرض. لكل حدث
schemaVersion: 1 صحيح. تستخدم مراجع هوية الرسالة تنسيق
hmac-sha256:v1:<32 hex key id>:<64 hex digest> المطابق تمامًا؛ ويستخدم معرّف جهة فاعلة
مرسلة عبر القناة التنسيق نفسه.
تتطلب جميع المتغيرات eventType وschemaVersion وeventId وsequence
وsourceSequence وoccurredAt وkind وaction وstatus وactor
وredaction. حقول المتغيرات هي:
eventType |
الحقول المطلوبة | الحقول الاختيارية |
|---|---|---|
agent_run |
agentId، runId؛ kind: "agent_run" |
sessionKey، sessionId، errorCode |
tool_action |
agentId، runId؛ kind: "tool_action" |
sessionKey، sessionId، toolCallId، toolName، errorCode |
inbound_message |
direction: "inbound"، channel، conversationKind، outcome |
agentId، runId، durationMs، resultCount، مراجع الهوية، reasonCode، errorCode |
outbound_message |
direction: "outbound"، channel، conversationKind، outcome |
agentId، runId، durationMs، resultCount، مراجع الهوية، reasonCode، deliveryKind، failureStage، errorCode |
تعدادات الرسائل المغلقة هي:
conversationKind: directأوgroupأوchannelأوunknown.outcomeالوارد:completedأوskippedأوfailed؛ وreasonCodeاختياري:duplicateأوreply_operation_activeأوreply_operation_abortedأوfast_abortأوplugin_bound_handledأوplugin_bound_unavailableأوplugin_bound_declinedأوplugin_bound_errorأوbefore_dispatch_handledأوacp_dispatch_completedأوacp_dispatch_failedأوacp_dispatch_emptyأوacp_dispatch_aborted.outcomeالصادر:sentأوsuppressedأوfailedأوunknown؛ وreasonCodeاختياري:cancelled_by_message_sending_hookأوcancelled_by_reply_payload_sending_hookأوempty_after_message_sending_hookأوempty_after_reply_payload_sending_hookأوno_visible_payload. يكون المحوّل الذي لا يعيد هوية للمنصة هوunknown، لأنه لا يمكن نفي الأثر الجانبي الخارجي.deliveryKind: textأوmediaأوother؛ وfailureStage: platform_sendأوqueueأوunknown.
الحقول النهائية مترابطة، وليست اختيارية كلٌ على حدة:
| المتغير | التعيين النهائي |
|---|---|
| تشغيل الوكيل | لا يحتوي started على errorCode؛ وتتطلب كل حالة انتهاء غير ناجحة رمز run_* المطابق لها. |
| إجراء الأداة | لا يحتوي started والحالة الناجحة على errorCode؛ وتتطلب كل حالة انتهاء أخرى رمز tool_* المطابق لها. |
| الرسالة الواردة | ناجحة = completed؛ محظورة = skipped؛ فاشلة = failed إضافة إلى message_processing_failed. عند وجود reasonCode، يجب أن تنتمي إلى تلك العائلة النهائية. |
| الرسالة الصادرة | ناجحة = sent؛ محظورة = suppressed إضافة إلى reasonCode؛ فاشلة = failed إضافة إلى errorCode وfailureStage؛ غير معروفة = unknown إضافة إلى failureStage. |
يتضمن كل حدث نشاط معرّف حدث ثابتًا، وتسلسلًا رتيبًا للسجل،
وتسلسل حدث المصدر، وطابعًا زمنيًا، والجهة الفاعلة، والإجراء، والحالة، والعدد الصحيح
schemaVersion: 1، وredaction: "metadata_only". تتطلب سجلات التشغيل والأدوات
بيانات منشأ الوكيل والتشغيل، وقد تتضمن بيانات منشأ الجلسة. قد تتضمن سجلات
الرسائل معرّفات الوكيل والتشغيل، لكنها لا تتضمن عمدًا مطلقًا
sessionKey أو sessionId؛ ولذلك لا ينطبق مرشح الاستعلام sessionKey إلا على
صفوف التشغيل والأدوات. قد تتضمن أحداث الأدوات معرّف استدعاء الأداة واسم الأداة.
تستخدم سجلات الرسائل message.inbound.processed أو
message.outbound.finished، وتضيف الاتجاه، والقناة، ونوع المحادثة،
والنتيجة الموحّدة، ونوع التسليم الاختياري، ومرحلة الفشل، والمدة،
وعدد النتائج، ورمز السبب، والأسماء المستعارة ذات المفاتيح والمحلية للتثبيت
للحساب/المحادثة/الرسالة/الهدف. تساعد هذه الأسماء المستعارة في
الربط، لكنها لا تحقق إخفاء الهوية: إذ تحتوي قاعدة بيانات الحالة على مفتاحها،
بينما لا تتضمنه صادرات RPC وCLI. لا يخزّن السجل المطالبات، أو نصوص
الرسائل، أو وسائط الأدوات، أو نتائج الأدوات، أو مخرجات الأوامر، أو نصوص الأخطاء الخام.
تظل قيم sessionKey للتشغيل/الأداة بيانات وصفية خامًا للربط، ويمكن أن تتضمن
معرّفات حسابات المنصة أو النظراء؛ وتحذف سجلات الرسائل مفاتيح الجلسات.
بالنسبة إلى الصفوف الواردة، يقيس durationMs الإرسال الأساسي حتى حالته النهائية، ويحصي
resultCount حمولات الأدوات والكتل والردود النهائية الموضوعة في قائمة الانتظار. وبالنسبة إلى
الصفوف الصادرة، يمتد durationMs من تولّي مسؤولية التسليم حتى الإقرار،
أو قائمة الرسائل المتعذرة، أو التسوية (بما في ذلك وقت الانتظار في قائمة الانتظار)، ويحصي resultCount
عمليات الإرسال الفعلية المحددة إلى المنصة. يصف deliveryKind، عند وجوده،
الحمولة الفعلية بعد الخطافات والعرض؛ وتحذفه الصفوف المحجوبة أو
الملتبسة بسبب الأعطال.
تشمل تغطية الرسائل الحالية الرسائل الواردة المقبولة التي تصل إلى
الإرسال الأساسي، بما في ذلك نتائج التكرار/النهاية الأساسية. وتكتب تغطية الصادر
صفًا نهائيًا واحدًا لكل حمولة رد منطقية أصلية تصل إلى التسليم المشترك
الدائم؛ ويُجمّع التقسيم والتوزيع المتشعب للمحوّل في resultCount. لا تُسجّل
عمليات الإرسال القابلة لإعادة المحاولة أو الملتبسة الموضوعة في قائمة الانتظار إلا بعد الإقرار، أو إدراجها في
قائمة الرسائل المتعذرة، أو التسوية. لا تشمل التغطية حتى الآن المسارات المحلية للـPlugin ومسارات الإرسال المباشر التي تتجاوز تلك
الحدود المشتركة. تعمل قائمة انتظار العامل المحدودة بأفضل جهد
وقد تُسقط السجلات عند الفشل أو التشبع، لذا لا تمثل هذه الواجهة
أرشيف امتثال كاملًا بلا فقد.
يكون التسجيل مفعّلًا افتراضيًا وتتحكم فيه
audit.enabled. ويُتحكم في تسجيل الرسائل
بشكل منفصل بواسطة audit.messages، وتكون قيمته الافتراضية "off". عند
تعطيل التسجيل، يواصل audit.activity.list تقديم السجلات المكتوبة
سابقًا حتى انتهاء صلاحيتها.
تظل مخططات الطلب والنتيجة وAuditEvent المشحونة لـaudit.list
دون تغيير، ولا تعيد إلا سجلات تشغيل الوكيل وإجراءات الأدوات. ينبغي لعملاء
المشغّل الجدد استدعاء audit.activity.list عندما يعلن Gateway دعمه. قد
تُبلغ بوابات Gateway الأقدم إما عن unknown method: audit.activity.list أو، لأن
التخويل كان يسبق البحث عن الطريقة في الإصدارات المشحونة، عن missing scope: operator.admin لطلب ذي نطاق قراءة. لا تتعامل مع الحالة الأخيرة على أنها غياب للطريقة
إلا عندما لا تكون الطريقة مُعلنة. ويمكن للعميل حينها إعادة محاولة audit.list
فقط عندما لا تتطلب مرشحاته دعم نوع الرسالة، أو الاتجاه، أو القناة.
استخدم openclaw audit للاستعلامات النصية وصادرات JSON المحدودة.
استدعاءات RPC لسجل المهام
يفحص عملاء المشغّل سجلات مهام Gateway في الخلفية ويلغونها عبر
استدعاءات RPC لسجل المهام (packages/gateway-protocol/src/schema/tasks.ts). تعيد هذه
ملخصات منقّحة للمهام، لا حالة وقت التشغيل الخام.
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 خاصًا قبل تثبيته. هذا مسار تحميل منفصل للمسؤول ومخصص للعملاء الموثوقين، وليس مسار تثبيت Skill المعتاد في 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 اختياريًا
(src/agents/model-catalog-visibility.ts):
- محذوف أو
"default": إذا جرى تكوينagents.defaults.models، فتكون الاستجابة هي الكتالوج المسموح به، بما في ذلك النماذج المكتشفة ديناميكيًا لإدخالاتprovider/*. وإلا فتكون الاستجابة هي كتالوج Gateway الكامل. "configured": سلوك بحجم أداة الاختيار. إذا جرى تكوينagents.defaults.models، فإنه يظل ذا الأولوية، بما في ذلك الاكتشاف المحدد النطاق بحسب المزوّد لإدخالاتprovider/*. من دون قائمة سماح، تستخدم الاستجابة إدخالاتmodels.providers.<provider>.modelsالصريحة، ولا تعود إلى الكتالوج الكامل إلا عند عدم وجود صفوف نماذج مكوّنة."provider-config": مخزون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القياسي نفسه بوصفه سياق الأمر/مجلد العمل الحالي/الجلسة المعتمد. - إذا عدّل مستدعٍ
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وMIN_CLIENT_PROTOCOL_VERSIONوMIN_NODE_PROTOCOL_VERSIONوMIN_PROBE_PROTOCOL_VERSIONفيpackages/gateway-protocol/src/version.ts. - يرسل العملاء
minProtocol+maxProtocol. يجب أن يتضمن عملاء المشغّل وواجهة المستخدم البروتوكول الحالي ضمن هذا النطاق؛ ويعمل العملاء والخوادم الحالية بالبروتوكول v4. - يجوز للعملاء المصادق عليهم الذين لديهم كل من
role: "node"وclient.mode: "node"استخدام بروتوكول Node السابق مباشرةً N-1 (حاليًا v3). تستخدم مجسّات إعادة التشغيل الخفيفة نافذة N-1 نفسها. لا تتغير مصادقة الجهاز والإقران والنطاقات وسياسة الأوامر وموافقات التنفيذ بفعل نافذة التوافق هذه. تُحجب إمكانات Node والأوامر المملوكة لـ Plugin حتى ترقية Node إلى البروتوكول الحالي، لأن أسطحها المستضافة ليست جزءًا من عقد N-1. - تُولَّد المخططات والنماذج من تعريفات TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
ثوابت العميل
يوجد تنفيذ العميل المرجعي في packages/gateway-client/src/
(يغلّفه OpenClaw عبر واجهة 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 |
MIN_NODE_PROTOCOL_VERSION |
3 |
packages/gateway-protocol/src/version.ts |
MIN_PROBE_PROTOCOL_VERSION |
3 |
packages/gateway-protocol/src/version.ts |
| مهلة الطلب (لكل RPC) | 30_000 مللي ثانية |
packages/gateway-client/src/client.ts (requestTimeoutMs) |
| مهلة ما قبل المصادقة / تحدي الاتصال | 15_000 مللي ثانية |
packages/gateway-client/src/timeouts.ts (يمكن لمتغير البيئة OPENCLAW_HANDSHAKE_TIMEOUT_MS زيادة ميزانية الخادم/العميل المقترن) |
| التراجع الأولي لإعادة الاتصال | 1_000 مللي ثانية |
packages/gateway-client/src/client.ts (GATEWAY_RECONNECT_POLICY) |
| أقصى تراجع لإعادة الاتصال | 30_000 مللي ثانية |
packages/gateway-client/src/client.ts (GATEWAY_RECONNECT_POLICY) |
| تقييد إعادة المحاولة السريعة بعد إغلاق رمز الجهاز | 250 مللي ثانية |
packages/gateway-client/src/client.ts |
مهلة الإيقاف الإجباري قبل terminate() |
250 مللي ثانية |
FORCE_STOP_TERMINATE_GRACE_MS |
مهلة stopAndWait() الافتراضية |
1_000 مللي ثانية |
STOP_AND_WAIT_TIMEOUT_MS |
الفاصل الافتراضي للنبضات (قبل hello-ok) |
30_000 مللي ثانية |
packages/gateway-client/src/client.ts |
| الإغلاق عند انتهاء مهلة النبضة | الرمز 4000 عندما يتجاوز الصمت tickIntervalMs * 2 |
packages/gateway-client/src/client.ts |
MAX_PAYLOAD_BYTES |
25 * 1024 * 1024 (25 MB) |
src/gateway/server-constants.ts |
يعلن الخادم قيم policy.tickIntervalMs
وpolicy.maxPayload وpolicy.maxBufferedBytes الفعلية في hello-ok؛ وينبغي للعملاء
الالتزام بهذه القيم بدلًا من القيم الافتراضية السابقة للمصافحة.
يتيح العميل المرجعي للطلبات المحدودة امتلاك مهلتها النهائية المكوّنة عندما
يكون لكل طلب معلّق مهلة. يُبقي طلب expectFinal من دون
timeoutMs محدودة، أو أي طلب يتضمن timeoutMs: null، أو مزيج من الطلبات المحدودة
وغير المحدودة، مراقب النبضات نشطًا. إذا ظلت الأحداث الواردة
والاستجابات صامتة بعد حد مهلة النبضات، يغلق العميل
المقبس بالرمز 4000، ويرفض كل طلب معلّق، ثم يعيد الاتصال. ولا
يعيد تشغيل الطلبات المرفوضة بعد إعادة الاتصال.
المصادقة
- تستخدم مصادقة Gateway بالسر المشترك
connect.params.auth.tokenأوconnect.params.auth.password، حسبgateway.auth.modeالمُهيأ ("none" | "token" | "password" | "trusted-proxy"). - تستوفي الأوضاع الحاملة للهوية، مثل Tailscale Serve (
gateway.auth.allowTailscale: true) أوgateway.auth.mode: "trusted-proxy"غير ذي الاسترجاع المحلي، فحص مصادقة الاتصال من ترويسات الطلب بدلاً منconnect.params.auth.*. - يتخطى
gateway.auth.mode: "none"ذو الدخول الخاص مصادقة الاتصال بالسر المشترك بالكامل؛ لا تكشف هذا الوضع عبر دخول عام أو غير موثوق. - بعد الاقتران، يصدر Gateway رمز جهاز مقيّدًا بدور الاتصال
ونطاقاته، ويُعاد في
hello-ok.auth.deviceToken. ينبغي للعملاء الاحتفاظ به بعد أي اتصال ناجح. - ينبغي أيضًا عند إعادة الاتصال باستخدام رمز الجهاز المخزّن إعادة استخدام مجموعة النطاقات المعتمدة المخزّنة لذلك الرمز. يحافظ ذلك على صلاحيات القراءة والفحص والحالة الممنوحة سابقًا، ويتجنب حصر عمليات إعادة الاتصال ضمنيًا ودون تنبيه في نطاق أضيق مخصص للمسؤول فقط.
- تجميع مصادقة الاتصال من جانب العميل (
selectConnectAuthفيpackages/gateway-client/src/client.ts):- يُعد
auth.passwordمستقلاً ويُمرر دائمًا عند تعيينه. - تُملأ
auth.tokenوفق ترتيب الأولوية: رمز مشترك صريح أولاً، ثمdeviceTokenصريح، ثم رمز مخزّن خاص بكل جهاز (مفهرس بواسطةdeviceId+role). - لا تُرسل
auth.bootstrapTokenإلا عندما لا يحسم أي مما سبقauth.token. يؤدي وجود رمز مشترك أو أي رمز جهاز محسوم إلى منع إرسالها. - تقتصر الترقية التلقائية لرمز جهاز مخزّن عند إعادة المحاولة لمرة واحدة
باستخدام
AUTH_TOKEN_MISMATCHعلى نقاط النهاية الموثوقة فقط: الاسترجاع المحلي، أوwss://معtlsFingerprintمثبت. لا يتأهلwss://العام من دون تثبيت.
- يُعد
- يعيد تمهيد رمز الإعداد المضمّن
hello-ok.auth.deviceTokenالخاص بالعقدة الأساسية، إضافة إلى رمز مشغّل محدود فيhello-ok.auth.deviceTokensلتسليم موثوق إلى جهاز محمول. يتضمن رمز المشغّلoperator.talk.secretsلقراءة إعدادات Talk الأصلية، لكنه يستثني نطاقات تعديل الاقتران وoperator.admin. - أثناء انتظار تمهيد رمز إعداد غير أساسي للموافقة،
تتضمن تفاصيل
PAIRING_REQUIREDكلاً منrecommendedNextStep: "wait_then_retry"، وretryable: true، وpauseReconnect: false. واصل إعادة الاتصال باستخدام رمز التمهيد نفسه حتى تتم الموافقة على الطلب أو يصبح الرمز غير صالح. - لا تحتفظ بـ
hello-ok.auth.deviceTokensإلا عندما يستخدم الاتصال مصادقة التمهيد عبر وسيلة نقل موثوقة مثلwss://أو الاقتران عبر الاسترجاع المحلي/المحلي. - إذا قدّم العميل
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(packages/gateway-protocol/src/connect-error-details.ts).
- سلوك العميل عند
AUTH_TOKEN_MISMATCH:- يجوز للعملاء الموثوقين محاولة إعادة واحدة محدودة باستخدام رمز مخزّن مؤقتًا خاص بكل جهاز.
- إذا فشلت إعادة المحاولة، فأوقف حلقات إعادة الاتصال التلقائية وأظهر إرشادات الإجراء المطلوب من المشغّل.
- تعني
AUTH_SCOPE_MISMATCHأن رمز الجهاز قد تم التعرف عليه، لكنه لا يغطي الدور أو النطاقات المطلوبة. لا تعرض هذا باعتباره رمزًا غير صالح؛ اطلب من المشغّل إعادة الاقتران أو الموافقة على عقد النطاقات الأضيق أو الأوسع.
هوية الجهاز والاقتران
- ينبغي للعقد تضمين هوية جهاز ثابتة (
device.id) مشتقة من بصمة زوج مفاتيح. - تصدر بوابات Gateway رموزًا لكل جهاز ودور.
- تلزم موافقات الاقتران لمعرّفات الأجهزة الجديدة ما لم تكن الموافقة التلقائية المحلية مفعّلة.
- تتركز الموافقة التلقائية على الاقتران حول الاتصالات المحلية المباشرة عبر الاسترجاع المحلي.
- يتضمن OpenClaw أيضًا مسار اتصال ذاتي ضيقًا محليًا بالنسبة إلى الواجهة الخلفية/الحاوية لتدفقات المساعد الموثوقة التي تستخدم السر المشترك.
- تظل الاتصالات من المضيف نفسه عبر الشبكة الخاصة أو LAN تُعامل على أنها بعيدة لأغراض الاقتران وتتطلب الموافقة.
- تتضمن عملاء WS عادةً هوية
deviceأثناءconnect(المشغّل + العقدة). والاستثناءات الوحيدة للمشغّل من دون جهاز هي مسارات الثقة الصريحة:gateway.controlUi.allowInsecureAuth=trueللتوافق مع HTTP غير الآمن والمقتصر على المضيف المحلي.- مصادقة ناجحة لواجهة Control UI الخاصة بالمشغّل عبر
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(ملاذ أخير، خفض شديد للأمان).- استدعاءات RPC المباشرة عبر الاسترجاع المحلي لواجهة
gateway-clientالخلفية على مسار المساعد الداخلي المحجوز.
- يترتب على حذف هوية الجهاز عواقب تخص النطاقات. عندما يُسمح باتصال
مشغّل من دون جهاز عبر مسار ثقة صريح، يظل OpenClaw
يمسح النطاقات المعلنة ذاتيًا إلى مجموعة فارغة ما لم يكن لذلك المسار
استثناء مسمى للاحتفاظ بالنطاقات. عندئذ تفشل الأساليب المقيّدة بالنطاقات مع
missing scope. - يُعد
gateway.controlUi.dangerouslyDisableDeviceAuth=trueمسارًا لواجهة Control UI للاحتفاظ بالنطاقات في حالات الملاذ الأخير. ولا يمنح نطاقات إلى عملاء WebSocket مخصصين عشوائيين على هيئة واجهة خلفية أو CLI. - يحتفظ مسار مساعد الواجهة الخلفية المحجوز والمباشر عبر الاسترجاع المحلي
gateway-clientبالنطاقات فقط لاستدعاءات RPC الداخلية والمحلية لمستوى التحكم؛ ولا تحصل معرّفات الواجهات الخلفية المخصصة على هذا الاستثناء. - يجب على جميع الاتصالات توقيع قيمة 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(buildDeviceAuthPayloadV3فيpackages/gateway-client/src/device-auth.ts)، التي تربطplatformوdeviceFamilyإضافة إلى حقول الجهاز والعميل والدور والنطاقات والرمز وnonce. - تظل توقيعات
v2القديمة مقبولة للتوافق، لكن تثبيت البيانات الوصفية للجهاز المقترن يظل يتحكم في سياسة الأوامر عند إعادة الاتصال.
TLS والتثبيت
- يُدعم TLS لاتصالات WS (إعداد
gateway.tls). - يمكن للعملاء اختياريًا تثبيت بصمة شهادة Gateway عبر
gateway.remote.tlsFingerprintأو--tls-fingerprintفي CLI.
النطاق
يتيح هذا البروتوكول واجهة Gateway API الكاملة: الحالة، والقنوات، والنماذج، والمحادثة،
والوكيل، والجلسات، والعقد، والموافقات، وغير ذلك. ويُحدد السطح الدقيق بواسطة
مخططات TypeBox المُعاد تصديرها من packages/gateway-protocol/src/schema.ts.