واجهة التحكم هي تطبيق صغير أحادي الصفحة مبني بـ Vite + Lit ويقدمه Gateway:Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
- الافتراضي:
http://<host>:18789/ - بادئة اختيارية: عيّن
gateway.controlUi.basePath(مثلًا/openclaw)
فتح سريع (محلي)
إذا كان Gateway يعمل على الكمبيوتر نفسه، فافتح: إذا فشل تحميل الصفحة، فابدأ Gateway أولًا:openclaw gateway.
تُقدَّم المصادقة أثناء مصافحة WebSocket عبر:
connect.params.auth.tokenconnect.params.auth.password- ترويسات هوية Tailscale Serve عندما تكون
gateway.auth.allowTailscale: true - ترويسات هوية الوكيل الموثوق عندما تكون
gateway.auth.mode: "trusted-proxy"
gateway.auth.mode هي "password".
إقران الجهاز (الاتصال الأول)
عندما تتصل بواجهة التحكم من متصفح أو جهاز جديد، يطلب Gateway عادةً موافقة إقران لمرة واحدة. هذا إجراء أمني لمنع الوصول غير المصرح به. ما ستراه: “disconnected (1008): pairing required” إذا أعاد المتصفح محاولة الإقران مع تفاصيل مصادقة متغيرة (الدور/النطاقات/المفتاح العام)، فسيتم تجاوز الطلب المعلّق السابق وإنشاءrequestId جديد. أعد تشغيل openclaw devices list قبل الموافقة.
إذا كان المتصفح مقترنًا بالفعل وغيّرته من وصول القراءة إلى وصول الكتابة/المسؤول، فسيُعامل ذلك كترقية موافقة، وليس كإعادة اتصال صامتة. يُبقي OpenClaw الموافقة القديمة نشطة، ويحظر إعادة الاتصال الأوسع، ويطلب منك الموافقة صراحةً على مجموعة النطاقات الجديدة.
بعد الموافقة، يتم تذكّر الجهاز ولن يتطلب إعادة الموافقة إلا إذا ألغيتَه باستخدام openclaw devices revoke --device <id> --role <role>. راجع CLI الأجهزة لتدوير الرموز والإلغاء.
- تتم الموافقة تلقائيًا على اتصالات متصفح local loopback المباشرة (
127.0.0.1/localhost). - يمكن لـ Tailscale Serve تخطي جولة الإقران لجلسات مشغّل واجهة التحكم عندما تكون
gateway.auth.allowTailscale: true، وتتحقق هوية Tailscale، ويقدّم المتصفح هوية جهازه. - لا تزال روابط Tailnet المباشرة، واتصالات متصفح LAN، وملفات تعريف المتصفح التي لا تحتوي على هوية جهاز تتطلب موافقة صريحة.
- ينشئ كل ملف تعريف متصفح معرّف جهاز فريدًا، لذا فإن تبديل المتصفحات أو مسح بيانات المتصفح سيتطلب إعادة الإقران.
الهوية الشخصية (محلية للمتصفح)
تدعم واجهة التحكم هوية شخصية لكل متصفح (اسم عرض وصورة رمزية) تُرفق بالرسائل الصادرة للإسناد في الجلسات المشتركة. وهي تعيش في تخزين المتصفح، وتقتصر على ملف تعريف المتصفح الحالي، ولا تُزامَن مع أجهزة أخرى ولا تُحفَظ على جانب الخادم بما يتجاوز بيانات وصفية عادية لتأليف النصوص في الرسائل التي ترسلها فعليًا. مسح بيانات الموقع أو تبديل المتصفحات يعيدها إلى فارغة. ينطبق نمط المتصفح المحلي نفسه على تجاوز صورة المساعد الرمزية. تغطي صور المساعد الرمزية المرفوعة الهوية التي يحلها Gateway على المتصفح المحلي فقط، ولا تمر ذهابًا وإيابًا عبرconfig.patch. لا يزال حقل الإعداد المشترك ui.assistant.avatar متاحًا للعملاء غير التابعين لواجهة المستخدم الذين يكتبون الحقل مباشرةً (مثل البوابات النصية أو لوحات التحكم المخصصة).
نقطة نهاية إعداد وقت التشغيل
تجلب واجهة التحكم إعدادات وقت التشغيل الخاصة بها من/__openclaw/control-ui-config.json. هذه النقطة النهائية محمية بمصادقة البوابة نفسها مثل بقية سطح HTTP: لا يمكن للمتصفحات غير المصادق عليها جلبها، ويتطلب الجلب الناجح إما رمز/كلمة مرور Gateway صالحين بالفعل، أو هوية Tailscale Serve، أو هوية وكيل موثوق.
دعم اللغة
يمكن لواجهة التحكم أن تعرّب نفسها عند التحميل الأول بناءً على لغة متصفحك. لتجاوز ذلك لاحقًا، افتح نظرة عامة -> الوصول إلى Gateway -> اللغة. يوجد منتقي اللغة في بطاقة الوصول إلى Gateway، وليس ضمن المظهر.- اللغات المدعومة:
en,zh-CN,zh-TW,pt-BR,de,es,ja-JP,ko,fr,ar,it,tr,uk,id,pl,th,vi,nl,fa - تُحمَّل الترجمات غير الإنجليزية بشكل كسول في المتصفح.
- تُحفَظ اللغة المحددة في تخزين المتصفح ويُعاد استخدامها في الزيارات المستقبلية.
- تعود مفاتيح الترجمة المفقودة إلى الإنجليزية.
th) والفارسية (fa) تُولَّد في مستودع النشر؛ وقد لا تظهر في ذلك المنتقي إلى أن يدعم Mintlify تلك الرموز.
سمات المظهر
تحتفظ لوحة المظهر بالسمات المدمجة Claw وKnot وDash، بالإضافة إلى خانة استيراد tweakcn واحدة محلية للمتصفح. لاستيراد سمة، افتح محرر tweakcn، واختر سمة أو أنشئ واحدة، وانقر مشاركة، ثم الصق رابط السمة المنسوخ في المظهر. يقبل المستورد أيضًا عناوين URL لسجلhttps://tweakcn.com/r/themes/<id>، وعناوين URL للمحرر مثل https://tweakcn.com/editor/theme?theme=amethyst-haze، والمسارات النسبية /themes/<id>، ومعرّفات السمات الخام، وأسماء السمات الافتراضية مثل amethyst-haze.
تُخزَّن السمات المستوردة فقط في ملف تعريف المتصفح الحالي. ولا تُكتب في إعدادات Gateway ولا تتزامن عبر الأجهزة. يستبدل تغيير السمة المستوردة الخانة المحلية الواحدة؛ ويؤدي مسحها إلى تبديل السمة النشطة مرة أخرى إلى Claw إذا كانت السمة المستوردة محددة.
ما يمكنها فعله (اليوم)
Chat and Talk
Chat and Talk
- الدردشة مع النموذج عبر Gateway WS (
chat.history,chat.send,chat.abort,chat.inject). - تطلب تحديثات سجل الدردشة نافذة حديثة محدودة مع حدود نصية لكل رسالة حتى لا تجبر الجلسات الكبيرة المتصفح على عرض حمولة النص الكامل قبل أن تصبح الدردشة قابلة للاستخدام.
- التحدث عبر جلسات المتصفح في الوقت الفعلي. يستخدم OpenAI اتصال WebRTC مباشرًا، ويستخدم Google Live رمز متصفح مقيدًا لمرة واحدة عبر WebSocket، وتستخدم Plugins الصوت الفوري التي تعمل على الخلفية فقط نقل ترحيل Gateway. تبدأ جلسات المزود المملوكة للعميل بـ
talk.client.create؛ وتبدأ جلسات ترحيل Gateway بـtalk.session.create. يحتفظ الترحيل ببيانات اعتماد المزود على Gateway بينما يبث المتصفح PCM الميكروفون عبرtalk.session.appendAudioويمرر استدعاءات أدوات المزودopenclaw_agent_consultعبرtalk.client.toolCallلسياسة Gateway ونموذج OpenClaw الأكبر المكوّن. - بث استدعاءات الأدوات + بطاقات إخراج الأدوات الحية في الدردشة (أحداث الوكيل).
Channels, instances, sessions, dreams
Channels, instances, sessions, dreams
- القنوات: حالة القنوات المدمجة بالإضافة إلى قنوات Plugin المضمنة/الخارجية، وتسجيل الدخول عبر QR، وإعداد كل قناة (
channels.status,web.login.*,config.patch). - تُبقي تحديثات فحص القنوات اللقطة السابقة مرئية أثناء انتهاء فحوصات المزود البطيئة، وتُوسَم اللقطات الجزئية عندما يتجاوز فحص أو تدقيق ميزانية واجهة المستخدم الخاصة به.
- المثيلات: قائمة الحضور + التحديث (
system-presence). - الجلسات: تسرد جلسات الوكيل المكوّن افتراضيًا، وتتراجع من مفاتيح جلسات الوكيل غير المكوّن القديمة، وتطبق تجاوزات النموذج/التفكير/السريع/المطوّل/التتبع/الاستدلال لكل جلسة (
sessions.list,sessions.patch). - الأحلام: حالة Dreaming، ومفتاح التفعيل/التعطيل، وقارئ Dream Diary (
doctor.memory.status,doctor.memory.dreamDiary,config.patch).
Cron, skills, nodes, exec approvals
Cron, skills, nodes, exec approvals
- مهام Cron: سرد/إضافة/تحرير/تشغيل/تفعيل/تعطيل + سجل التشغيل (
cron.*). - Skills: الحالة، التفعيل/التعطيل، التثبيت، تحديثات مفتاح API (
skills.*). - العقد: القائمة + القدرات (
node.list). - موافقات التنفيذ: تحرير قوائم السماح للبوابة أو العقدة + سياسة السؤال لـ
exec host=gateway/node(exec.approvals.*).
Config
Config
- عرض/تحرير
~/.openclaw/openclaw.json(config.get,config.set). - التطبيق + إعادة التشغيل مع التحقق (
config.apply) وإيقاظ آخر جلسة نشطة. - تتضمن عمليات الكتابة حارس تجزئة أساسيًا لمنع طمس التحريرات المتزامنة.
- تُجري عمليات الكتابة (
config.set/config.apply/config.patch) فحصًا مسبقًا لحل SecretRef النشط للمراجع في حمولة الإعداد المقدمة؛ وتُرفض المراجع النشطة المقدمة غير المحلولة قبل الكتابة. - عرض المخطط + النموذج (
config.schema/config.schema.lookup، بما في ذلك حقلاtitle/description، وتلميحات واجهة المستخدم المطابقة، وملخصات الأبناء المباشرين، وبيانات وصفية للتوثيق على عقد الكائنات/أحرف البدل/المصفوفات/التركيبات المتداخلة، بالإضافة إلى مخططات Plugin + القنوات عند توفرها)؛ يتوفر محرر Raw JSON فقط عندما تحتوي اللقطة على رحلة ذهاب وإياب خام آمنة. - إذا تعذر على لقطة ما إكمال رحلة ذهاب وإياب آمنة للنص الخام، تفرض واجهة التحكم وضع النموذج وتعطل وضع الخام لتلك اللقطة.
- يحافظ محرر Raw JSON “إعادة التعيين إلى المحفوظ” على الشكل المؤلف خامًا (التنسيق، التعليقات، تخطيط
$include) بدلًا من إعادة عرض لقطة مسطحة، لذا تنجو التحريرات الخارجية من إعادة التعيين عندما تستطيع اللقطة إكمال رحلة ذهاب وإياب بأمان. - تُعرض قيم كائن SecretRef المهيكلة للقراءة فقط في حقول نص النموذج لمنع تلف الكائن إلى سلسلة نصية عرضيًا.
Debug, logs, update
Debug, logs, update
- التصحيح: لقطات الحالة/الصحة/النماذج + سجل الأحداث + استدعاءات RPC اليدوية (
status,health,models.list). - يتضمن سجل الأحداث توقيتات تحديث/RPC الخاصة بواجهة التحكم، وتوقيتات عرض الدردشة/الإعداد البطيئة، ومدخلات استجابة المتصفح لإطارات الرسوم المتحركة الطويلة أو المهام الطويلة عندما يكشف المتصفح أنواع إدخال PerformanceObserver تلك.
- السجلات: متابعة حية لسجلات ملفات Gateway مع التصفية/التصدير (
logs.tail). - التحديث: تشغيل تحديث حزمة/git + إعادة التشغيل (
update.run) مع تقرير إعادة تشغيل، ثم استطلاعupdate.statusبعد إعادة الاتصال للتحقق من إصدار Gateway الجاري تشغيله.
Cron jobs panel notes
Cron jobs panel notes
- بالنسبة للمهام المعزولة، يكون التسليم الافتراضي هو إعلان الملخص. يمكنك التبديل إلى بلا إذا أردت تشغيلات داخلية فقط.
- تظهر حقول القناة/الهدف عند تحديد الإعلان.
- يستخدم وضع Webhook القيمة
delivery.mode = "webhook"مع تعيينdelivery.toإلى عنوان URL صالح لـ HTTP(S) webhook. - بالنسبة لمهام الجلسة الرئيسية، تتوفر أوضاع تسليم webhook وبلا.
- تتضمن عناصر التحكم المتقدمة للتحرير الحذف بعد التشغيل، ومسح تجاوز الوكيل، وخيارات cron الدقيقة/المتدرجة، وتجاوزات نموذج/تفكير الوكيل، ومفاتيح تسليم أفضل جهد.
- يكون التحقق من النموذج مضمّنًا مع أخطاء على مستوى الحقل؛ وتعطل القيم غير الصالحة زر الحفظ إلى أن يتم إصلاحها.
- عيّن
cron.webhookTokenلإرسال رمز حامل مخصص، وإذا تُرك محذوفًا فسيُرسل webhook دون ترويسة مصادقة. - بديل مهمل: يمكن للمهام القديمة المخزنة مع
notify: trueالاستمرار في استخدامcron.webhookإلى أن تُرحَّل.
سلوك الدردشة
دلالات الإرسال والسجل
دلالات الإرسال والسجل
chat.sendغير حاجب: يقر فورا بـ{ runId, status: "started" }وتتدفق الاستجابة عبر أحداثchat.- تقبل تحميلات الدردشة الصور والملفات غير الفيديوية. تحتفظ الصور بمسار الصورة الأصلي؛ أما الملفات الأخرى فتخزن كوسائط مدارة وتظهر في السجل كروابط مرفقات.
- تعيد إعادة الإرسال باستخدام
idempotencyKeyنفسه{ status: "in_flight" }أثناء التشغيل، و{ status: "ok" }بعد الاكتمال. - تكون استجابات
chat.historyمحدودة الحجم لسلامة واجهة المستخدم. عندما تكون إدخالات النص كبيرة جدا، قد يقتطع Gateway حقول النص الطويلة، ويحذف كتل البيانات الوصفية الثقيلة، ويستبدل الرسائل كبيرة الحجم بعنصر نائب ([chat.history omitted: message too large]). - تحفظ الصور التي ينتجها المساعد/النظام كإشارات وسائط مدارة وتقدم مرة أخرى عبر عناوين URL لوسائط Gateway مصادق عليها، لذلك لا تعتمد عمليات إعادة التحميل على بقاء حمولات الصور الخام بترميز base64 في استجابة سجل الدردشة.
- عند عرض
chat.history، تزيل واجهة التحكم وسوم التعليمات المضمنة المخصصة للعرض فقط من نص المساعد المرئي (مثل[[reply_to_*]]و[[audio_as_voice]])، وحمولات XML لاستدعاءات الأدوات بنص عادي (بما في ذلك<tool_call>...</tool_call>و<function_call>...</function_call>و<tool_calls>...</tool_calls>و<function_calls>...</function_calls>وكتل استدعاءات الأدوات المقتطعة)، ورموز التحكم في النموذج المسربة بصيغة ASCII/العرض الكامل، وتحذف إدخالات المساعد التي يكون نصها المرئي كله هو الرمز الصامت الدقيقNO_REPLY/no_replyأو رمز إقرار HeartbeatHEARTBEAT_OK. - أثناء إرسال نشط وتحديث السجل النهائي، يحافظ عرض الدردشة على ظهور رسائل المستخدم/المساعد التفاؤلية المحلية إذا أعاد
chat.historyلقطة أقدم لفترة وجيزة؛ ويستبدل النص المرجعي تلك الرسائل المحلية عندما يلحق سجل Gateway. - أحداث
chatالمباشرة هي حالة التسليم، بينما يعاد بناءchat.historyمن نص الجلسة الدائم. بعد أحداث نهاية الأدوات، تعيد واجهة التحكم تحميل السجل ولا تدمج إلا ذيلا تفاؤليا صغيرا؛ وحد النص موثق في WebChat. - يضيف
chat.injectملاحظة مساعد إلى نص الجلسة ويبث حدثchatلتحديثات واجهة المستخدم فقط (بدون تشغيل وكيل، وبدون تسليم قناة). - يعرض رأس الدردشة مرشح الوكيل قبل منتقي الجلسة، ويكون منتقي الجلسة مقيدا بالوكيل المحدد. عند تبديل الوكلاء، لا تظهر إلا الجلسات المرتبطة بذلك الوكيل، مع الرجوع إلى جلسة ذلك الوكيل الرئيسية عندما لا تكون لديه جلسات لوحة معلومات محفوظة بعد.
- في عروض سطح المكتب، تبقى عناصر تحكم الدردشة في صف مضغوط واحد وتنطوي أثناء التمرير لأسفل في النص؛ وتعود عناصر التحكم عند التمرير لأعلى، أو الرجوع إلى الأعلى، أو الوصول إلى الأسفل.
- تعرض الرسائل النصية المتكررة المتتالية كفقاعة واحدة مع شارة عدد. أما الرسائل التي تحمل صورا أو مرفقات أو مخرجات أدوات أو معاينات لوحة فتبقى غير مطوية.
- يطبق منتقيا النموذج والتفكير في رأس الدردشة تعديلا فوريا على الجلسة النشطة عبر
sessions.patch؛ وهما تجاوزان دائمان للجلسة، وليسا خيارين للإرسال لدورة واحدة فقط. - إذا أرسلت رسالة بينما لا يزال تغيير منتقي النموذج للجلسة نفسها قيد الحفظ، ينتظر المؤلف تصحيح تلك الجلسة قبل استدعاء
chat.sendحتى يستخدم الإرسال النموذج المحدد. - تؤدي كتابة
/newفي واجهة التحكم إلى إنشاء جلسة لوحة معلومات جديدة مماثلة والتبديل إليها مثل New Chat، إلا عندما يكونsession.dmScope: "main"مهيأ ويكون الأصل الحالي هو جلسة الوكيل الرئيسية؛ في هذه الحالة يعيد ضبط الجلسة الرئيسية في مكانها. وتبقي كتابة/resetإعادة الضبط الصريحة في مكانها من Gateway للجلسة الحالية. - يطلب منتقي نموذج الدردشة عرض النموذج المهيأ في Gateway. إذا كان
agents.defaults.modelsموجودا، فستقود قائمة السماح هذه المنتقي، بما في ذلك إدخالاتprovider/*التي تبقي كتالوجات النطاق الخاص بالمزود ديناميكية. وإلا، يعرض المنتقي إدخالاتmodels.providers.*.modelsالصريحة بالإضافة إلى المزودين ذوي المصادقة القابلة للاستخدام. يظل الكتالوج الكامل متاحا عبر RPC التصحيحmodels.listمعview: "all". - عندما تتضمن تقارير استخدام جلسة Gateway الحديثة رموز السياق الحالية، تعرض منطقة مؤلف الدردشة مؤشرا مضغوطا لاستخدام السياق. يتحول إلى نمط تحذيري عند ضغط سياق مرتفع، وعند مستويات Compaction الموصى بها، يعرض زرا مضغوطا يشغل مسار Compaction العادي للجلسة. تخفى لقطات الرموز القديمة حتى يبلغ Gateway عن استخدام حديث مرة أخرى.
وضع التحدث (الوقت الحقيقي في المتصفح)
وضع التحدث (الوقت الحقيقي في المتصفح)
يستخدم وضع التحدث مزود صوت وقت حقيقي مسجلا. هيئ OpenAI باستخدام
talk.realtime.provider: "openai" بالإضافة إلى إما talk.realtime.providers.openai.apiKey أو OPENAI_API_KEY أو ملف تعريف OAuth باسم openai-codex؛ وهيئ Google باستخدام talk.realtime.provider: "google" بالإضافة إلى talk.realtime.providers.google.apiKey. لا يتلقى المتصفح أبدا مفتاح API قياسيا للمزود. يتلقى OpenAI سرا مؤقتا لعميل Realtime من أجل WebRTC. ويتلقى Google Live رمز مصادقة Live API مقيدا للاستخدام مرة واحدة لجلسة WebSocket في المتصفح، مع تعليمات وتصريحات أدوات مقفلة داخل الرمز بواسطة Gateway. المزودون الذين لا يكشفون إلا جسرا خلفيا للوقت الحقيقي يعملون عبر نقل ترحيل Gateway، بحيث تبقى بيانات الاعتماد ومقابس المورد من جهة الخادم بينما ينتقل صوت المتصفح عبر RPCs مصادق عليها من Gateway. يجمع Gateway مطالبة جلسة Realtime؛ ولا يقبل talk.client.create تجاوزات تعليمات مقدمة من المستدعي.يتضمن مؤلف الدردشة زر خيارات التحدث بجانب زر بدء/إيقاف التحدث. تنطبق الخيارات على جلسة التحدث التالية ويمكنها تجاوز المزود، والنقل، والنموذج، والصوت، وجهد الاستدلال، وعتبة VAD، ومدة الصمت، وحشو البادئة. عندما يكون خيار فارغا، يستخدم Gateway القيم الافتراضية المهيأة حيثما توفرت أو القيمة الافتراضية للمزود. يفرض اختيار ترحيل Gateway مسار الترحيل الخلفي؛ أما اختيار WebRTC فيبقي الجلسة مملوكة للعميل ويفشل بدلا من الرجوع بصمت إلى الترحيل إذا لم يستطع المزود إنشاء جلسة متصفح.في مؤلف الدردشة، عنصر تحكم التحدث هو زر الموجات بجانب زر الإملاء بالميكروفون. عند بدء التحدث، يعرض صف حالة المؤلف Connecting Talk...، ثم Talk live أثناء اتصال الصوت، أو Asking OpenClaw... أثناء استشارة استدعاء أداة في الوقت الحقيقي للنموذج الأكبر المهيأ عبر talk.client.toolCall.اختبار smoke مباشر للمشرفين: يتحقق OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts من جسر WebSocket الخلفي لـ OpenAI، وتبادل SDP عبر WebRTC في متصفح OpenAI، وإعداد WebSocket للمتصفح برمز مقيد في Google Live، ومحول متصفح ترحيل Gateway مع وسائط ميكروفون وهمية. يطبع الأمر حالة المزود فقط ولا يسجل الأسرار.الإيقاف والإجهاض
الإيقاف والإجهاض
- انقر إيقاف (يستدعي
chat.abort). - أثناء نشاط تشغيل، تصطف المتابعات العادية في قائمة انتظار. انقر توجيه على رسالة في قائمة الانتظار لحقن تلك المتابعة في الدورة الجارية.
- اكتب
/stop(أو عبارات إجهاض مستقلة مثلstopوstop actionوstop runوstop openclawوplease stop) للإجهاض خارج النطاق. - يدعم
chat.abortالقيمة{ sessionKey }(بدونrunId) لإجهاض كل عمليات التشغيل النشطة لتلك الجلسة.
الاحتفاظ الجزئي بعد الإجهاض
الاحتفاظ الجزئي بعد الإجهاض
- عند إجهاض تشغيل، يمكن أن يظل نص المساعد الجزئي معروضا في واجهة المستخدم.
- يحفظ Gateway نص المساعد الجزئي المجهض في سجل النص عندما توجد مخرجات مخزنة مؤقتا.
- تتضمن الإدخالات المحفوظة بيانات وصفية للإجهاض حتى يستطيع مستهلكو النص تمييز الجزئيات المجهضة من مخرجات الاكتمال العادية.
تثبيت PWA والدفع الويب
تشحن واجهة التحكمmanifest.webmanifest وعامل خدمة، لذلك تستطيع المتصفحات الحديثة تثبيتها كتطبيق PWA مستقل. يتيح Web Push لـ Gateway إيقاظ PWA المثبت بإشعارات حتى عندما لا تكون علامة التبويب أو نافذة المتصفح مفتوحة.
| السطح | ما يفعله |
|---|---|
ui/public/manifest.webmanifest | بيان PWA. تعرض المتصفحات خيار “تثبيت التطبيق” بمجرد أن يصبح قابلا للوصول. |
ui/public/sw.js | عامل خدمة يتعامل مع أحداث push ونقرات الإشعارات. |
push/vapid-keys.json (تحت دليل حالة OpenClaw) | زوج مفاتيح VAPID يولد تلقائيا ويستخدم لتوقيع حمولات Web Push. |
push/web-push-subscriptions.json | نقاط نهاية اشتراك المتصفح المحفوظة. |
OPENCLAW_VAPID_PUBLIC_KEYOPENCLAW_VAPID_PRIVATE_KEYOPENCLAW_VAPID_SUBJECT(افتراضياmailto:openclaw@localhost)
push.web.vapidPublicKey— يجلب مفتاح VAPID العام النشط.push.web.subscribe— يسجلendpointبالإضافة إلىkeys.p256dh/keys.auth.push.web.unsubscribe— يزيل نقطة نهاية مسجلة.push.web.test— يرسل إشعار اختبار إلى اشتراك المستدعي.
Web Push مستقل عن مسار ترحيل APNS في iOS (راجع التهيئة للدفع المدعوم بالترحيل) وعن طريقة
push.test الحالية، التي تستهدف اقتران الأجهزة المحمولة الأصلية.التضمينات المستضافة
يمكن لرسائل المساعد عرض محتوى ويب مستضافا مضمننا باستخدام الرمز المختصر[embed ...]. تتحكم gateway.controlUi.embedSandbox في سياسة صندوق عزل iframe:
- صارم
- سكربتات (افتراضي)
- موثوق
يعطل تنفيذ السكربتات داخل التضمينات المستضافة.
http(s) للتضمين محظورة افتراضيا. إذا كنت تريد عمدا أن تحمل [embed url="https://..."] صفحات من طرف ثالث، فاضبط gateway.controlUi.allowExternalEmbedUrls: true.
عرض رسالة الدردشة
تستخدم رسائل الدردشة المجمعة حدا أقصى افتراضيا للعرض سهل القراءة. تستطيع عمليات النشر على الشاشات العريضة تجاوزه دون تعديل CSS المضمنة عبر ضبطgateway.controlUi.chatMessageMaxWidth:
960px أو 82%، بالإضافة إلى تعبيرات العرض المقيدة min(...) وmax(...) وclamp(...) وcalc(...) وfit-content(...).
وصول Tailnet (موصى به)
- خدمة Tailscale Serve المدمجة (مفضلة)
- الربط إلى tailnet + الرمز
أبق Gateway على loopback ودع Tailscale Serve يمرره عبر HTTPS:افتح:
https://<magicdns>/(أوgateway.controlUi.basePathالمهيأ لديك)
tailscale-user-login) عندما تكون gateway.auth.allowTailscale مضبوطة على true. يتحقق OpenClaw من الهوية عبر حل عنوان x-forwarded-for باستخدام tailscale whois ومطابقته مع الترويسة، ولا يقبل ذلك إلا عندما يصل الطلب إلى loopback مع ترويسات Tailscale من نوع x-forwarded-*. بالنسبة إلى جلسات مشغّل واجهة التحكم ذات هوية جهاز المتصفح، يتجاوز مسار Serve المتحقق منه هذا أيضًا جولة إقران الجهاز؛ أما المتصفحات بلا جهاز واتصالات دور العقدة فتظل تتبع فحوصات الجهاز العادية. اضبط gateway.auth.allowTailscale: false إذا كنت تريد فرض بيانات اعتماد سر مشترك صريحة حتى لحركة Serve. ثم استخدم gateway.auth.mode: "token" أو "password".بالنسبة إلى مسار هوية Serve غير المتزامن هذا، تُسلسل محاولات المصادقة الفاشلة لعنوان IP العميل نفسه ونطاق المصادقة نفسه قبل عمليات كتابة حدّ المعدّل. لذلك قد تعرض إعادة المحاولة السيئة المتزامنة من المتصفح نفسه retry later في الطلب الثاني بدلًا من عدم تطابقين عاديين يتسابقان بالتوازي.HTTP غير آمن
إذا فتحت لوحة المعلومات عبر HTTP عادي (http://<lan-ip> أو http://<tailscale-ip>)، يعمل المتصفح في سياق غير آمن ويحظر WebCrypto. افتراضيًا، يحظر OpenClaw اتصالات واجهة التحكم من دون هوية جهاز.
الاستثناءات الموثقة:
- توافق HTTP غير الآمن المقتصر على localhost مع
gateway.controlUi.allowInsecureAuth=true - مصادقة مشغّل واجهة التحكم الناجحة عبر
gateway.auth.mode: "trusted-proxy" - خيار الطوارئ
gateway.controlUi.dangerouslyDisableDeviceAuth=true
https://<magicdns>/(Serve)http://127.0.0.1:18789/(على مضيف Gateway)
سلوك مفتاح المصادقة غير الآمنة
سلوك مفتاح المصادقة غير الآمنة
allowInsecureAuth هو مفتاح توافق محلي فقط:- يسمح لجلسات واجهة التحكم على localhost بالمتابعة من دون هوية جهاز في سياقات HTTP غير الآمنة.
- لا يتجاوز فحوصات الإقران.
- لا يخفف متطلبات هوية الجهاز البعيدة (غير localhost).
للطوارئ فقط
للطوارئ فقط
ملاحظة عن الوكيل الموثوق
ملاحظة عن الوكيل الموثوق
- يمكن لمصادقة الوكيل الموثوق الناجحة قبول جلسات واجهة التحكم الخاصة بـ المشغّل من دون هوية جهاز.
- لا يمتد ذلك إلى جلسات واجهة التحكم ذات دور العقدة.
- لا تزال وكلاء reverse proxy عبر loopback على المضيف نفسه لا تفي بمصادقة الوكيل الموثوق؛ راجع مصادقة الوكيل الموثوق.
سياسة أمان المحتوى
تأتي واجهة التحكم مع سياسةimg-src صارمة: لا يُسمح إلا بأصول نفس المصدر، وعناوين URL من نوع data:، وعناوين URL من نوع blob: المُنشأة محليًا. يرفض المتصفح عناوين URL للصور البعيدة من نوع http(s) والنسبية إلى البروتوكول ولا يصدر طلبات جلب شبكية.
ما يعنيه ذلك عمليًا:
- لا تزال الصور الرمزية والصور المقدمة ضمن مسارات نسبية (مثل
/avatars/<id>) تظهر، بما في ذلك مسارات الصور الرمزية المصادق عليها التي تجلبها الواجهة وتحولها إلى عناوين URL محلية من نوعblob:. - لا تزال عناوين URL المضمنة من نوع
data:image/...تظهر (مفيدة للحمولات داخل البروتوكول). - لا تزال عناوين URL المحلية من نوع
blob:التي تنشئها واجهة التحكم تظهر. - تُزال عناوين URL البعيدة للصور الرمزية التي تصدرها بيانات تعريف القناة في مساعدات الصور الرمزية الخاصة بواجهة التحكم وتُستبدل بالشعار/الشارة المدمجة، لذلك لا يمكن لقناة مخترقة أو خبيثة فرض عمليات جلب صور بعيدة عشوائية من متصفح المشغّل.
مصادقة مسار الصورة الرمزية
عند تكوين مصادقة Gateway، تتطلب نقطة نهاية الصورة الرمزية في واجهة التحكم رمز Gateway نفسه كبقية API:- يعيد
GET /avatar/<agentId>صورة الصورة الرمزية للمتصلين المصادق عليهم فقط. يعيدGET /avatar/<agentId>?meta=1بيانات تعريف الصورة الرمزية وفق القاعدة نفسها. - تُرفض الطلبات غير المصادق عليها إلى أي من المسارين (بما يطابق مسار وسائط المساعد الشقيق). يمنع ذلك مسار الصورة الرمزية من تسريب هوية الوكيل على المضيفات المحمية بخلاف ذلك.
- تمرر واجهة التحكم نفسها رمز Gateway كترويسة bearer عند جلب الصور الرمزية، وتستخدم عناوين URL مصادقًا عليها من نوع blob بحيث تظل الصورة ظاهرة في لوحات المعلومات.
مصادقة مسار وسائط المساعد
عند تكوين مصادقة Gateway، تستخدم معاينات الوسائط المحلية للمساعد مسارًا من خطوتين:- يتطلب
GET /__openclaw__/assistant-media?meta=1&source=<path>مصادقة مشغّل واجهة التحكم العادية. يرسل المتصفح رمز Gateway كترويسة bearer عند التحقق من التوفر. - تتضمن ردود بيانات التعريف الناجحة
mediaTicketقصير العمر ومقيّدًا بذلك المسار المصدر المحدد. - تستخدم عناوين URL للصور والصوت والفيديو والمستندات المعروضة في المتصفح
mediaTicket=<ticket>بدلًا من رمز Gateway النشط أو كلمة المرور. تنتهي صلاحية التذكرة بسرعة ولا يمكنها تخويل مصدر مختلف.
بناء الواجهة
يقدّم Gateway الملفات الثابتة منdist/control-ui. ابنها باستخدام:
ws://127.0.0.1:18789).
صفحة واجهة التحكم الفارغة
إذا حمّل المتصفح لوحة معلومات فارغة ولم تعرض DevTools أي خطأ مفيد، فقد تكون إضافة أو سكربت محتوى مبكر قد منع تطبيق وحدة JavaScript من التقييم. تتضمن الصفحة الثابتة لوحة استرداد HTML عادية تظهر عندما لا يكون<openclaw-app> مسجلًا بعد بدء التشغيل.
استخدم إجراء المحاولة مرة أخرى في اللوحة بعد تغيير بيئة المتصفح، أو أعد التحميل يدويًا بعد هذه الفحوصات:
- عطّل الإضافات التي تحقن في كل الصفحات، خاصة الإضافات ذات سكربتات محتوى
<all_urls>. - جرّب نافذة خاصة، أو ملف تعريف متصفح نظيفًا، أو متصفحًا آخر.
- أبقِ Gateway قيد التشغيل وتحقق من عنوان URL نفسه للوحة المعلومات بعد تغيير المتصفح.
التصحيح/الاختبار: خادم التطوير + Gateway بعيد
واجهة التحكم هي ملفات ثابتة؛ هدف WebSocket قابل للتكوين ويمكن أن يكون مختلفًا عن أصل HTTP. هذا مفيد عندما تريد خادم تطوير Vite محليًا بينما يعمل Gateway في مكان آخر.ملاحظات
ملاحظات
- يُخزّن
gatewayUrlفي localStorage بعد التحميل ويُزال من عنوان URL. - إذا مررت نقطة نهاية كاملة
ws://أوwss://عبرgatewayUrl، فقم بترميز قيمةgatewayUrlبعنوان URL كي يحلل المتصفح سلسلة الاستعلام بشكل صحيح. - ينبغي تمرير
tokenعبر جزء عنوان URL (#token=...) كلما أمكن. لا تُرسل الأجزاء إلى الخادم، ما يتجنب تسرب سجلات الطلبات وReferer. لا تزال معاملات الاستعلام القديمة?token=تُستورد مرة واحدة للتوافق، لكن كخيار احتياطي فقط، وتُزال فورًا بعد التمهيد. - تُحفظ
passwordفي الذاكرة فقط. - عند تعيين
gatewayUrl، لا تعود الواجهة إلى بيانات اعتماد التكوين أو البيئة. قدّمtoken(أوpassword) صراحةً. غياب بيانات الاعتماد الصريحة خطأ. - استخدم
wss://عندما يكون Gateway خلف TLS (Tailscale Serve، وكيل HTTPS، إلخ). - يُقبل
gatewayUrlفقط في نافذة من المستوى الأعلى (غير مضمنة) لمنع clickjacking. - يجب على عمليات نشر واجهة التحكم غير loopback تعيين
gateway.controlUi.allowedOriginsصراحةً (الأصول الكاملة). ويشمل ذلك إعدادات التطوير البعيدة. - قد يزرع بدء تشغيل Gateway أصولًا محلية مثل
http://localhost:<port>وhttp://127.0.0.1:<port>من الربط والمنفذ الفعليين وقت التشغيل، لكن أصول المتصفح البعيدة لا تزال تحتاج إلى إدخالات صريحة. - لا تستخدم
gateway.controlUi.allowedOrigins: ["*"]إلا للاختبار المحلي الخاضع للتحكم الصارم. فهذا يعني السماح لأي أصل متصفح، وليس “مطابقة أي مضيف أستخدمه.” - يفعّل
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=trueوضع الرجوع إلى أصل ترويسة Host، لكنه وضع أمني خطير.
ذات صلة
- لوحة المعلومات — لوحة معلومات Gateway
- فحوصات الصحة — مراقبة صحة Gateway
- TUI — واجهة مستخدم طرفية
- WebChat — واجهة دردشة مستندة إلى المتصفح