الانتقال إلى المحتوى الرئيسي

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.

واجهة التحكم هي تطبيق صغير أحادي الصفحة مبني بـ Vite + Lit ويقدمه Gateway:
  • الافتراضي: http://<host>:18789/
  • بادئة اختيارية: عيّن gateway.controlUi.basePath (مثلًا /openclaw)
وهي تتواصل مباشرة مع Gateway WebSocket على المنفذ نفسه.

فتح سريع (محلي)

إذا كان Gateway يعمل على الكمبيوتر نفسه، فافتح: إذا فشل تحميل الصفحة، فابدأ Gateway أولًا: openclaw gateway. تُقدَّم المصادقة أثناء مصافحة WebSocket عبر:
  • connect.params.auth.token
  • connect.params.auth.password
  • ترويسات هوية Tailscale Serve عندما تكون gateway.auth.allowTailscale: true
  • ترويسات هوية الوكيل الموثوق عندما تكون gateway.auth.mode: "trusted-proxy"
تحتفظ لوحة إعدادات لوحة التحكم برمز لجلسة تبويب المتصفح الحالية وعنوان URL المحدد للبوابة؛ ولا تُحفَظ كلمات المرور بشكل دائم. عادةً ينشئ الإعداد الأولي رمز بوابة لمصادقة السر المشترك عند أول اتصال، لكن مصادقة كلمة المرور تعمل أيضًا عندما تكون gateway.auth.mode هي "password".

إقران الجهاز (الاتصال الأول)

عندما تتصل بواجهة التحكم من متصفح أو جهاز جديد، يطلب Gateway عادةً موافقة إقران لمرة واحدة. هذا إجراء أمني لمنع الوصول غير المصرح به. ما ستراه: “disconnected (1008): pairing required”
1

List pending requests

openclaw devices list
2

Approve by request ID

openclaw devices approve <requestId>
إذا أعاد المتصفح محاولة الإقران مع تفاصيل مصادقة متغيرة (الدور/النطاقات/المفتاح العام)، فسيتم تجاوز الطلب المعلّق السابق وإنشاء 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
  • تُحمَّل الترجمات غير الإنجليزية بشكل كسول في المتصفح.
  • تُحفَظ اللغة المحددة في تخزين المتصفح ويُعاد استخدامها في الزيارات المستقبلية.
  • تعود مفاتيح الترجمة المفقودة إلى الإنجليزية.
تُولَّد ترجمات التوثيق لمجموعة اللغات غير الإنجليزية نفسها، لكن منتقي اللغة المدمج في موقع التوثيق من Mintlify يقتصر على رموز اللغات التي يقبلها Mintlify. لا تزال وثائق التايلاندية (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 إذا كانت السمة المستوردة محددة.

ما يمكنها فعله (اليوم)

  • الدردشة مع النموذج عبر 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 الأكبر المكوّن.
  • بث استدعاءات الأدوات + بطاقات إخراج الأدوات الحية في الدردشة (أحداث الوكيل).
  • القنوات: حالة القنوات المدمجة بالإضافة إلى قنوات 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: سرد/إضافة/تحرير/تشغيل/تفعيل/تعطيل + سجل التشغيل (cron.*).
  • Skills: الحالة، التفعيل/التعطيل، التثبيت، تحديثات مفتاح API (skills.*).
  • العقد: القائمة + القدرات (node.list).
  • موافقات التنفيذ: تحرير قوائم السماح للبوابة أو العقدة + سياسة السؤال لـ exec host=gateway/node (exec.approvals.*).
  • عرض/تحرير ~/.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 المهيكلة للقراءة فقط في حقول نص النموذج لمنع تلف الكائن إلى سلسلة نصية عرضيًا.
  • التصحيح: لقطات الحالة/الصحة/النماذج + سجل الأحداث + استدعاءات RPC اليدوية (status, health, models.list).
  • يتضمن سجل الأحداث توقيتات تحديث/RPC الخاصة بواجهة التحكم، وتوقيتات عرض الدردشة/الإعداد البطيئة، ومدخلات استجابة المتصفح لإطارات الرسوم المتحركة الطويلة أو المهام الطويلة عندما يكشف المتصفح أنواع إدخال PerformanceObserver تلك.
  • السجلات: متابعة حية لسجلات ملفات Gateway مع التصفية/التصدير (logs.tail).
  • التحديث: تشغيل تحديث حزمة/git + إعادة التشغيل (update.run) مع تقرير إعادة تشغيل، ثم استطلاع update.status بعد إعادة الاتصال للتحقق من إصدار Gateway الجاري تشغيله.
  • بالنسبة للمهام المعزولة، يكون التسليم الافتراضي هو إعلان الملخص. يمكنك التبديل إلى بلا إذا أردت تشغيلات داخلية فقط.
  • تظهر حقول القناة/الهدف عند تحديد الإعلان.
  • يستخدم وضع 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 أو رمز إقرار Heartbeat HEARTBEAT_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نقاط نهاية اشتراك المتصفح المحفوظة.
تجاوز زوج مفاتيح VAPID عبر متغيرات البيئة في عملية Gateway عندما تريد تثبيت المفاتيح (للنشر متعدد المضيفين، أو تدوير الأسرار، أو الاختبارات):
  • OPENCLAW_VAPID_PUBLIC_KEY
  • OPENCLAW_VAPID_PRIVATE_KEY
  • OPENCLAW_VAPID_SUBJECT (افتراضيا mailto:openclaw@localhost)
تستخدم واجهة التحكم طرق Gateway هذه المقيدة بالنطاق لتسجيل اشتراكات المتصفح واختبارها:
  • 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:
يعطل تنفيذ السكربتات داخل التضمينات المستضافة.
مثال:
{
  gateway: {
    controlUi: {
      embedSandbox: "scripts",
    },
  },
}
استخدم trusted فقط عندما يحتاج المستند المضمن حقا إلى سلوك من نفس الأصل. بالنسبة لمعظم الألعاب واللوحات التفاعلية التي ينشئها الوكيل، يكون scripts هو الخيار الأكثر أمانا.
تبقى عناوين URL الخارجية المطلقة من نوع http(s) للتضمين محظورة افتراضيا. إذا كنت تريد عمدا أن تحمل [embed url="https://..."] صفحات من طرف ثالث، فاضبط gateway.controlUi.allowExternalEmbedUrls: true.

عرض رسالة الدردشة

تستخدم رسائل الدردشة المجمعة حدا أقصى افتراضيا للعرض سهل القراءة. تستطيع عمليات النشر على الشاشات العريضة تجاوزه دون تعديل CSS المضمنة عبر ضبط gateway.controlUi.chatMessageMaxWidth:
{
  gateway: {
    controlUi: {
      chatMessageMaxWidth: "min(1280px, 82%)",
    },
  },
}
تتحقق القيمة قبل وصولها إلى المتصفح. تشمل القيم المدعومة الأطوال والنسب المئوية البسيطة مثل 960px أو 82%، بالإضافة إلى تعبيرات العرض المقيدة min(...) وmax(...) وclamp(...) وcalc(...) وfit-content(...).

وصول Tailnet (موصى به)

أبق Gateway على loopback ودع Tailscale Serve يمرره عبر HTTPS:
openclaw gateway --tailscale serve
افتح:
  • https://<magicdns>/ (أو gateway.controlUi.basePath المهيأ لديك)
افتراضيًا، يمكن لطلبات Serve الخاصة بواجهة التحكم/WebSocket المصادقة عبر ترويسات هوية Tailscale (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 في الطلب الثاني بدلًا من عدم تطابقين عاديين يتسابقان بالتوازي.
تفترض مصادقة Serve بلا رمز أن مضيف Gateway موثوق. إذا كان يمكن تشغيل كود محلي غير موثوق على ذلك المضيف، فافرض مصادقة بالرمز/كلمة المرور.

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 (Tailscale Serve) أو افتح الواجهة محليًا:
  • https://<magicdns>/ (Serve)
  • http://127.0.0.1:18789/ (على مضيف Gateway)
{
  gateway: {
    controlUi: { allowInsecureAuth: true },
    bind: "tailnet",
    auth: { mode: "token", token: "replace-me" },
  },
}
allowInsecureAuth هو مفتاح توافق محلي فقط:
  • يسمح لجلسات واجهة التحكم على localhost بالمتابعة من دون هوية جهاز في سياقات HTTP غير الآمنة.
  • لا يتجاوز فحوصات الإقران.
  • لا يخفف متطلبات هوية الجهاز البعيدة (غير localhost).
{
  gateway: {
    controlUi: { dangerouslyDisableDeviceAuth: true },
    bind: "tailnet",
    auth: { mode: "token", token: "replace-me" },
  },
}
يعطّل dangerouslyDisableDeviceAuth فحوصات هوية جهاز واجهة التحكم، وهو تخفيض أمني شديد. أعده سريعًا بعد الاستخدام الطارئ.
  • يمكن لمصادقة الوكيل الموثوق الناجحة قبول جلسات واجهة التحكم الخاصة بـ المشغّل من دون هوية جهاز.
  • لا يمتد ذلك إلى جلسات واجهة التحكم ذات دور العقدة.
  • لا تزال وكلاء reverse proxy عبر loopback على المضيف نفسه لا تفي بمصادقة الوكيل الموثوق؛ راجع مصادقة الوكيل الموثوق.
راجع Tailscale للحصول على إرشادات إعداد HTTPS.

سياسة أمان المحتوى

تأتي واجهة التحكم مع سياسة 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 (غير موصى به على المضيفات المشتركة)، يصبح مسار الصورة الرمزية أيضًا غير مصادق عليه، بما يتماشى مع بقية Gateway.

مصادقة مسار وسائط المساعد

عند تكوين مصادقة Gateway، تستخدم معاينات الوسائط المحلية للمساعد مسارًا من خطوتين:
  • يتطلب GET /__openclaw__/assistant-media?meta=1&source=<path> مصادقة مشغّل واجهة التحكم العادية. يرسل المتصفح رمز Gateway كترويسة bearer عند التحقق من التوفر.
  • تتضمن ردود بيانات التعريف الناجحة mediaTicket قصير العمر ومقيّدًا بذلك المسار المصدر المحدد.
  • تستخدم عناوين URL للصور والصوت والفيديو والمستندات المعروضة في المتصفح mediaTicket=<ticket> بدلًا من رمز Gateway النشط أو كلمة المرور. تنتهي صلاحية التذكرة بسرعة ولا يمكنها تخويل مصدر مختلف.
يحافظ ذلك على توافق عرض الوسائط العادي مع عناصر الوسائط الأصلية في المتصفح من دون وضع بيانات اعتماد Gateway القابلة لإعادة الاستخدام في عناوين URL المرئية للوسائط.

بناء الواجهة

يقدّم Gateway الملفات الثابتة من dist/control-ui. ابنها باستخدام:
pnpm ui:build
قاعدة مطلقة اختيارية (عندما تريد عناوين URL ثابتة للأصول):
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
للتطوير المحلي (خادم تطوير منفصل):
pnpm ui:dev
ثم وجّه الواجهة إلى عنوان URL الخاص بـ Gateway WS لديك (مثل ws://127.0.0.1:18789).

صفحة واجهة التحكم الفارغة

إذا حمّل المتصفح لوحة معلومات فارغة ولم تعرض DevTools أي خطأ مفيد، فقد تكون إضافة أو سكربت محتوى مبكر قد منع تطبيق وحدة JavaScript من التقييم. تتضمن الصفحة الثابتة لوحة استرداد HTML عادية تظهر عندما لا يكون <openclaw-app> مسجلًا بعد بدء التشغيل. استخدم إجراء المحاولة مرة أخرى في اللوحة بعد تغيير بيئة المتصفح، أو أعد التحميل يدويًا بعد هذه الفحوصات:
  • عطّل الإضافات التي تحقن في كل الصفحات، خاصة الإضافات ذات سكربتات محتوى <all_urls>.
  • جرّب نافذة خاصة، أو ملف تعريف متصفح نظيفًا، أو متصفحًا آخر.
  • أبقِ Gateway قيد التشغيل وتحقق من عنوان URL نفسه للوحة المعلومات بعد تغيير المتصفح.

التصحيح/الاختبار: خادم التطوير + Gateway بعيد

واجهة التحكم هي ملفات ثابتة؛ هدف WebSocket قابل للتكوين ويمكن أن يكون مختلفًا عن أصل HTTP. هذا مفيد عندما تريد خادم تطوير Vite محليًا بينما يعمل Gateway في مكان آخر.
1

بدء خادم تطوير الواجهة

pnpm ui:dev
2

الفتح باستخدام gatewayUrl

http://localhost:5173/?gatewayUrl=ws%3A%2F%2F<gateway-host>%3A18789
مصادقة اختيارية لمرة واحدة (إذا لزم الأمر):
http://localhost:5173/?gatewayUrl=wss%3A%2F%2F<gateway-host>%3A18789#token=<gateway-token>
  • يُخزّن 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: {
    controlUi: {
      allowedOrigins: ["http://localhost:5173"],
    },
  },
}
تفاصيل إعداد الوصول البعيد: الوصول البعيد.

ذات صلة