chore(i18n): refresh ar translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-05-04 07:49:51 +00:00
parent 83b5b28db7
commit e90acef5ed
4 changed files with 574 additions and 567 deletions

View File

@ -6,38 +6,38 @@ read_when:
summary: 'نظرة عامة على الاقتران: وافق على من يمكنه مراسلتك مباشرة + العُقد التي يمكنها الانضمام'
title: الاقتران
x-i18n:
generated_at: "2026-05-04T02:22:04Z"
generated_at: "2026-05-04T07:46:44Z"
model: gpt-5.5
provider: openai
source_hash: 4fb27840f7c9ef55e7270cc29f813e6db90b240aa2180f30952eb9485f0f8874
source_hash: f2bce4cfba7708b0003f2ffeacada8bc1849cc301f28178b499a9a67bddcf36d
source_path: channels/pairing.md
workflow: 16
---
"الإقران" هو خطوة الموافقة الصريحة على الوصول في OpenClaw.
«الإقران» هو خطوة موافقة صريحة على الوصول في OpenClaw.
يُستخدم في موضعين:
1. **إقران الرسائل المباشرة** (من يُسمح له بالتحدث إلى البوت)
2. **إقران Node** (أي الأجهزة/العُقد يُسمح لها بالانضمام إلى شبكة Gateway)
1. **إقران الرسائل المباشرة** (من يُسمح له بالتحدث إلى الروبوت)
2. **إقران Node** (أي الأجهزة/Nodes يُسمح لها بالانضمام إلى شبكة Gateway)
سياق الأمان: [الأمان](/ar/gateway/security)
## 1) إقران الرسائل المباشرة (الوصول إلى الدردشة الواردة)
## 1) إقران الرسائل المباشرة (وصول الدردشة الواردة)
عند تكوين قناة بسياسة رسائل مباشرة `pairing`، يحصل المرسلون غير المعروفين على رمز قصير و**لا تتم معالجة** رسالتهم حتى توافق عليها.
عند تكوين قناة بسياسة رسائل مباشرة `pairing`، يحصل المرسلون غير المعروفين على رمز قصير ولا تتم **معالجة** رسالتهم حتى توافق عليها.
سياسات الرسائل المباشرة الافتراضية موثقة في: [الأمان](/ar/gateway/security)
`dmPolicy: "open"` تكون عامة فقط عندما تتضمن قائمة السماح الفعلية للرسائل المباشرة `"*"`.
يتطلب الإعداد والتحقق هذا الرمز الشامل لتكوينات الفتح العام. إذا كانت الحالة الحالية
تحتوي على `open` مع إدخالات `allowFrom` محددة، فسيظل وقت التشغيل يسمح
لهؤلاء المرسلين فقط، ولا توسّع موافقات مخزن الإقران وصول `open`.
يتطلب الإعداد والتحقق وجود حرف البدل هذا لتكوينات الفتح العام. إذا كانت الحالة الحالية
تحتوي على `open` مع إدخالات `allowFrom` محددة، فسيظل وقت التشغيل يقبل
هؤلاء المرسلين فقط، ولا توسّع موافقات مخزن الإقران وصول `open`.
رموز الإقران:
- 8 أحرف، أحرف كبيرة، من دون أحرف ملتبسة (`0O1I`).
- **تنتهي صلاحيتها بعد ساعة واحدة**. يرسل البوت رسالة الإقران فقط عند إنشاء طلب جديد (تقريبًا مرة واحدة في الساعة لكل مرسل).
- طلبات إقران الرسائل المباشرة المعلقة محدودة افتراضيًا بـ **3 لكل قناة**؛ يتم تجاهل الطلبات الإضافية حتى تنتهي صلاحية أحدها أو تتم الموافقة عليه.
- 8 أحرف، بأحرف كبيرة، من دون أحرف ملتبسة (`0O1I`).
- **تنتهي صلاحيتها بعد ساعة واحدة**. لا يرسل الروبوت رسالة الإقران إلا عند إنشاء طلب جديد (تقريبًا مرة واحدة في الساعة لكل مرسل).
- تُحدّ طلبات إقران الرسائل المباشرة المعلقة إلى **3 لكل قناة** افتراضيًا؛ ويتم تجاهل الطلبات الإضافية حتى تنتهي صلاحية أحدها أو تتم الموافقة عليه.
### الموافقة على مرسل
@ -46,21 +46,21 @@ openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
```
إذا لم يكن مالك الأوامر مكوّنًا بعد، فإن الموافقة على رمز إقران الرسائل المباشرة تؤسس أيضًا
`commands.ownerAllowFrom` للمرسل الموافق عليه، مثل `telegram:123456789`.
يمنح ذلك عمليات الإعداد لأول مرة مالكًا صريحًا للأوامر ذات الامتيازات ومطالبات موافقة
التنفيذ. بعد وجود مالك، تمنح موافقات الإقران اللاحقة وصول الرسائل المباشرة فقط؛
ولا تضيف مزيدًا من المالكين.
إذا لم يكن مالك الأوامر مكوّنًا بعد، فإن الموافقة على رمز إقران الرسائل المباشرة تهيئ أيضًا
`commands.ownerAllowFrom` إلى المرسل الموافق عليه، مثل `telegram:123456789`.
يمنح ذلك إعدادات المرة الأولى مالكًا صريحًا للأوامر ذات الامتياز ومطالبات موافقة التنفيذ.
بعد وجود مالك، تمنح موافقات الإقران اللاحقة وصول الرسائل المباشرة فقط؛
ولا تضيف مالكين آخرين.
القنوات المدعومة: `bluebubbles`, `discord`, `feishu`, `googlechat`, `imessage`, `irc`, `line`, `matrix`, `mattermost`, `msteams`, `nextcloud-talk`, `nostr`, `openclaw-weixin`, `signal`, `slack`, `synology-chat`, `telegram`, `twitch`, `whatsapp`, `zalo`, `zalouser`.
### مجموعات مرسلين قابلة لإعادة الاستخدام
استخدم `accessGroups` على المستوى الأعلى عندما يجب أن تنطبق مجموعة المرسلين الموثوقين نفسها على
قنوات رسائل متعددة أو على قوائم السماح للرسائل المباشرة والمجموعات معًا.
استخدم `accessGroups` على المستوى الأعلى عندما ينبغي أن تنطبق مجموعة المرسلين الموثوقين نفسها على
قنوات رسائل متعددة أو على قوائم سماح الرسائل المباشرة والمجموعات معًا.
تستخدم المجموعات الثابتة `type: "message.senders"` وتتم الإشارة إليها باستخدام
`accessGroup:<name>` من قوائم السماح الخاصة بالقنوات:
تستخدم المجموعات الثابتة `type: "message.senders"` وتُشار إليها باستخدام
`accessGroup:<name>` من قوائم السماح في القنوات:
```json5
{
@ -83,63 +83,69 @@ openclaw pairing approve telegram <CODE>
مجموعات الوصول موثقة بالتفصيل هنا: [مجموعات الوصول](/ar/channels/access-groups)
### مكان تخزين الحالة
### مكان حفظ الحالة
مخزنة ضمن `~/.openclaw/credentials/`:
تُخزن ضمن `~/.openclaw/credentials/`:
- الطلبات المعلقة: `<channel>-pairing.json`
- مخزن قائمة السماح المعتمدة:
- مخزن قائمة السماح الموافق عليها:
- الحساب الافتراضي: `<channel>-allowFrom.json`
- الحساب غير الافتراضي: `<channel>-<accountId>-allowFrom.json`
سلوك نطاق الحساب:
- الحسابات غير الافتراضية تقرأ/تكتب ملف قائمة السماح المحدد النطاق الخاص بها فقط.
- يستخدم الحساب الافتراضي ملف قائمة السماح غير محدد النطاق الخاص بالقناة.
- الحسابات غير الافتراضية تقرأ/تكتب ملف قائمة السماح ذي النطاق الخاص بها فقط.
- يستخدم الحساب الافتراضي ملف قائمة السماح غير محدد النطاق والخاص بالقناة.
تعامل معها كبيانات حساسة (فهي تتحكم بالوصول إلى مساعدك).
عامل هذه الملفات باعتبارها حساسة (فهي تتحكم بالوصول إلى مساعدك).
<Note>
مخزن قائمة السماح الخاصة بالإقران مخصص لوصول الرسائل المباشرة. تفويض المجموعات منفصل.
لا تسمح الموافقة على رمز إقران الرسائل المباشرة تلقائيًا لذلك المرسل بتشغيل أوامر المجموعة
أو التحكم في البوت داخل المجموعات. التأسيس الأول للمالك هو حالة تكوين منفصلة
في `commands.ownerAllowFrom`، ولا يزال تسليم دردشة المجموعة يتبع
قوائم السماح للمجموعات في القناة (مثل `groupAllowFrom` أو `groups` أو التجاوزات لكل مجموعة
مخزن قائمة سماح الإقران مخصص لوصول الرسائل المباشرة. تفويض المجموعات منفصل.
الموافقة على رمز إقران الرسائل المباشرة لا تسمح تلقائيًا لذلك المرسل بتشغيل أوامر المجموعة
أو التحكم في الروبوت داخل المجموعات. تهيئة المالك الأول هي حالة تكوين منفصلة
في `commands.ownerAllowFrom`، ويظل تسليم دردشة المجموعة يتبع
قوائم سماح المجموعات الخاصة بالقناة (مثل `groupAllowFrom` أو `groups` أو التجاوزات لكل مجموعة
أو لكل موضوع بحسب القناة).
</Note>
## 2) إقران أجهزة Node (iOS/Android/macOS/العُقد بلا واجهة)
## 2) إقران أجهزة Node (iOS/Android/macOS/Nodes بلا واجهة)
تتصل العُقد بـ Gateway كـ **أجهزة** مع `role: node`. ينشئ Gateway
تتصل Nodes بـ Gateway بصفتها **أجهزة** مع `role: node`. ينشئ Gateway
طلب إقران جهاز يجب الموافقة عليه.
### الإقران عبر Telegram (موصى به لـ iOS)
إذا كنت تستخدم Plugin `device-pair`، يمكنك إجراء إقران الجهاز لأول مرة بالكامل من Telegram:
إذا كنت تستخدم Plugin `device-pair`، يمكنك إجراء إقران الجهاز لأول مرة بالكامل من Telegram:
1. في Telegram، أرسل إلى البوت: `/pair`
2. يرد البوت برسالتين: رسالة تعليمات ورسالة **رمز إعداد** منفصلة (سهلة النسخ/اللصق في Telegram).
3. على هاتفك، افتح تطبيق OpenClaw على iOS ← الإعدادات ← Gateway.
4. الصق رمز الإعداد واتصل.
5. بالعودة إلى Telegram: `/pair pending` (راجع معرّفات الطلبات والدور والنطاقات)، ثم وافق.
1. في Telegram، أرسل رسالة إلى روبوتك: `/pair`
2. يرد الروبوت برسالتين: رسالة تعليمات ورسالة **رمز إعداد** منفصلة (سهلة النسخ/اللصق في Telegram).
3. على هاتفك، افتح تطبيق OpenClaw لنظام iOS ← الإعدادات ← Gateway.
4. امسح رمز QR أو الصق رمز الإعداد واتصل.
5. عُد إلى Telegram: `/pair pending` (راجع معرّفات الطلبات والدور والنطاقات)، ثم وافق.
رمز الإعداد هو حمولة JSON مرمّزة بـ base64 تحتوي على:
رمز الإعداد هو حمولة JSON مشفرة بـ base64 تحتوي على:
- `url`: عنوان URL لـ WebSocket الخاص بـ Gateway (`ws://...` أو `wss://...`)
- `bootstrapToken`: رمز تأسيس قصير العمر لجهاز واحد يُستخدم لمصافحة الإقران الأولية
- `bootstrapToken`: رمز تمهيد قصير العمر ومخصص لجهاز واحد يُستخدم لمصافحة الإقران الأولية
يحمل رمز التأسيس هذا ملف تعريف تأسيس الإقران المدمج:
يحمل رمز التمهيد هذا ملف تعريف تمهيد الإقران المدمج:
- يظل رمز `node` الأساسي الذي تم تسليمه `scopes: []`
- أي رمز `operator` تم تسليمه يظل محدودًا بقائمة السماح للتأسيس:
- يبقى رمز `node` الأساسي الذي تم تسليمه `scopes: []`
- يبقى أي رمز `operator` تم تسليمه مقيدًا بقائمة السماح للتمهيد:
`operator.approvals`, `operator.read`, `operator.talk.secrets`, `operator.write`
- فحوصات نطاق التأسيس مسبوقة بالدور، وليست مجموعة نطاقات مسطحة واحدة:
إدخالات نطاق المشغّل لا تفي إلا بطلبات المشغّل، ويجب على الأدوار غير المشغّلة
أن تظل تطلب النطاقات ضمن بادئة دورها الخاصة
- تظل عمليات تدوير/إلغاء الرموز اللاحقة محدودة بكل من عقد الدور الموافق عليه للجهاز
ونطاقات المشغّل لجلسة المستدعي
- فحوصات نطاق التمهيد مسبوقة بالدور، وليست تجميعة نطاقات مسطحة واحدة:
إدخالات نطاق operator تفي فقط بطلبات operator، ويجب أن تظل الأدوار غير operator
تطلب النطاقات تحت بادئة دورها الخاصة
- يظل تدوير/إبطال الرموز لاحقًا مقيدًا بكل من عقد الدور الموافق عليه للجهاز
ونطاقات operator لجلسة المستدعي
تعامل مع رمز الإعداد ككلمة مرور أثناء صلاحيته.
عامل رمز الإعداد ككلمة مرور أثناء صلاحيته.
بالنسبة إلى Tailscale أو الإقران المحمول العام أو غيره من الإقران غير local loopback، استخدم Tailscale
Serve/Funnel أو عنوان URL آخر لـ Gateway بصيغة `wss://`. تُرفض عناوين URL الخاصة بالإعداد المباشر غير local loopback بصيغة `ws://`
قبل إصدار رمز QR/رمز الإعداد. تقتصر رموز إعداد `ws://` ذات النص الصريح
على عناوين URL المحلية؛ ولا يزال عملاء `ws://` على الشبكة الخاصة يتطلبون كسر الحاجز الصريح
`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` الموضح في دليل Gateway البعيد.
### الموافقة على جهاز Node
@ -149,25 +155,24 @@ openclaw devices approve <requestId>
openclaw devices reject <requestId>
```
عند رفض موافقة صريحة لأن جلسة الجهاز المقترن التي توافق
فُتحت بنطاق مخصص للإقران فقط، يعيد CLI محاولة الطلب نفسه باستخدام
`operator.admin`. يتيح ذلك لجهاز مقترن قائم قادر على الإدارة استرداد إقران جديد
لـ Control UI/المتصفح من دون تعديل `devices/paired.json` يدويًا. لا يزال
Gateway يتحقق من الاتصال المعاد؛ الرموز التي لا يمكنها المصادقة
باستخدام `operator.admin` تظل محظورة.
عند رفض موافقة صريحة لأن جلسة الجهاز المقترن التي تقوم بالموافقة
فُتحت بنطاق الإقران فقط، يعيد CLI محاولة الطلب نفسه باستخدام
`operator.admin`. يتيح ذلك لجهاز مقترن حالي قادر على الإدارة استرداد إقران جديد
لـ Control UI/المتصفح من دون تحرير `devices/paired.json` يدويًا. لا يزال
Gateway يتحقق من الاتصال المعاد؛ وتظل الرموز التي لا يمكنها المصادقة
باستخدام `operator.admin` محظورة.
إذا أعاد الجهاز نفسه المحاولة بتفاصيل مصادقة مختلفة (على سبيل المثال دور/نطاقات/مفتاح عام مختلف)،
يتم استبدال الطلب المعلق السابق ويتم إنشاء
إذا أعاد الجهاز نفسه المحاولة بتفاصيل مصادقة مختلفة (مثل دور/نطاقات/مفتاح عام مختلف)، يتم استبدال الطلب المعلق السابق ويُنشأ
`requestId` جديد.
<Note>
لا يحصل الجهاز المقترن بالفعل على وصول أوسع بصمت. إذا أعاد الاتصال طالبًا نطاقات أكثر أو دورًا أوسع، يبقي OpenClaw الموافقة الحالية كما هي وينشئ طلب ترقية معلقًا جديدًا. استخدم `openclaw devices list` لمقارنة الوصول الموافق عليه حاليًا مع الوصول المطلوب حديثًا قبل الموافقة.
لا يحصل الجهاز المقترن مسبقًا على وصول أوسع بصمت. إذا أعاد الاتصال طالبًا نطاقات أكثر أو دورًا أوسع، يُبقي OpenClaw الموافقة الحالية كما هي وينشئ طلب ترقية معلقًا جديدًا. استخدم `openclaw devices list` لمقارنة الوصول الموافق عليه حاليًا بالوصول المطلوب حديثًا قبل الموافقة.
</Note>
### الموافقة التلقائية الاختيارية لعُقد CIDR موثوقة
### موافقة تلقائية اختيارية على Node عبر CIDR موثوق
يبقى إقران الأجهزة يدويًا افتراضيًا. بالنسبة إلى شبكات العُقد المضبوطة بإحكام،
يمكنك الاشتراك في الموافقة التلقائية لأول مرة على Node باستخدام CIDR صريحة أو عناوين IP مطابقة:
يظل إقران الأجهزة يدويًا افتراضيًا. بالنسبة إلى شبكات Node الخاضعة لرقابة صارمة،
يمكنك الاشتراك في الموافقة التلقائية لأول مرة على Node باستخدام CIDR صريحة أو عناوين IP دقيقة:
```json5
{
@ -182,28 +187,28 @@ Gateway يتحقق من الاتصال المعاد؛ الرموز التي لا
```
ينطبق هذا فقط على طلبات إقران `role: node` الجديدة من دون نطاقات مطلوبة.
لا يزال عملاء المشغّل والمتصفح وControl UI وWebChat يتطلبون موافقة يدوية.
كما لا تزال تغييرات الدور والنطاق والبيانات الوصفية والمفتاح العام تتطلب موافقة يدوية.
لا يزال عملاء operator والمتصفح وControl UI وWebChat يتطلبون موافقة يدوية.
ولا تزال تغييرات الدور والنطاق والبيانات الوصفية والمفتاح العام تتطلب موافقة يدوية.
### تخزين حالة إقران Node
مخزنة ضمن `~/.openclaw/devices/`:
تُخزن ضمن `~/.openclaw/devices/`:
- `pending.json` (قصير العمر؛ تنتهي صلاحية الطلبات المعلقة)
- `paired.json` (الأجهزة المقترنة + الرموز)
### ملاحظات
- واجهة API القديمة `node.pair.*` (CLI: `openclaw nodes pending|approve|reject|remove|rename`) هي
مخزن إقران منفصل مملوك لـ Gateway. لا تزال عُقد WS تتطلب إقران الأجهزة.
- سجل الإقران هو مصدر الحقيقة الدائم للأدوار الموافق عليها. تظل
رموز الأجهزة النشطة محدودة بمجموعة الأدوار الموافق عليها تلك؛ ولا ينشئ إدخال رمز عارض
- واجهة API القديمة `node.pair.*` (CLI: `openclaw nodes pending|approve|reject|remove|rename`) هي
مخزن إقران منفصل مملوك لـ Gateway. لا تزال WS Nodes تتطلب إقران الأجهزة.
- سجل الإقران هو مصدر الحقيقة الدائم للأدوار الموافق عليها. تظل رموز
الأجهزة النشطة مقيدة بمجموعة الأدوار الموافق عليها تلك؛ ولا ينشئ إدخال رمز عابر
خارج الأدوار الموافق عليها وصولًا جديدًا.
## مستندات ذات صلة
- نموذج الأمان + حقن المطالبات: [الأمان](/ar/gateway/security)
- التحديث بأمان (تشغيل doctor): [التحديث](/ar/install/updating)
- التحديث بأمان (تشغيل الطبيب): [التحديث](/ar/install/updating)
- تكوينات القنوات:
- Telegram: [Telegram](/ar/channels/telegram)
- WhatsApp: [WhatsApp](/ar/channels/whatsapp)

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,14 @@
---
read_when:
- إضافة إجراءات CLI للرسائل أو تعديلها
- إضافة إجراءات CLI الخاصة بالرسائل أو تعديلها
- تغيير سلوك القناة الصادرة
summary: مرجع CLI لـ `openclaw message` (إجراءات send + القنوات)
summary: مرجع CLI لـ `openclaw message` (الإرسال + إجراءات القناة)
title: رسالة
x-i18n:
generated_at: "2026-05-02T20:42:33Z"
generated_at: "2026-05-04T07:46:36Z"
model: gpt-5.5
provider: openai
source_hash: 6b73a50da34838f80ad5d0d266f5c66f95436f8535e6312296ae022918b1ab55
source_hash: 9ef57d33c93206a61a6d044667de4faf6340f7d8cc324300f235e838ee3b7ff1
source_path: cli/message.md
workflow: 16
---
@ -26,103 +26,103 @@ openclaw message <subcommand> [flags]
اختيار القناة:
- يكون `--channel` مطلوبًا إذا كانت هناك أكثر من قناة واحدة مكوّنة.
- إذا كانت قناة واحدة بالضبط مكوّنة، تصبح هي الافتراضية.
- يكون `--channel` مطلوبًا إذا كانت هناك أكثر من قناة واحدة مهيأة.
- إذا كانت هناك قناة واحدة مهيأة بالضبط، فتصبح هي الافتراضية.
- القيم: `discord|googlechat|imessage|matrix|mattermost|msteams|signal|slack|telegram|whatsapp` (يتطلب Mattermost وجود Plugin)
- يحلّ `openclaw message` القناة المحددة إلى Plugin المالك لها عند وجود `--channel` أو هدف مسبوق باسم قناة؛ وإلا فإنه يحمّل مكوّنات Plugin للقنوات المكوّنة لاستنتاج القناة الافتراضية.
- يحل `openclaw message` القناة المحددة إلى Plugin المالك لها عند وجود `--channel` أو هدف مسبوق باسم قناة؛ وإلا فإنه يحمّل Plugins القنوات المهيأة لاستنتاج القناة الافتراضية.
تنسيقات الهدف (`--target`):
- WhatsApp: رقم E.164، أو JID لمجموعة، أو JID لقناة/نشرة WhatsApp (`...@newsletter`)
- Telegram: معرّف المحادثة أو `@username`
- Discord: `channel:<id>` أو `user:<id>` (أو إشارة `<@id>`؛ تُعامل المعرّفات الرقمية الخام كقنوات)
- WhatsApp: رقم E.164، أو JID مجموعة، أو JID قناة/نشرة WhatsApp (`...@newsletter`)
- Telegram: معرّف دردشة، أو `@username`، أو هدف موضوع منتدى (`-1001234567890:topic:42`، أو `--thread-id 42`)
- Discord: `channel:<id>` أو `user:<id>` (أو إشارة `<@id>`؛ وتُعامل المعرّفات الرقمية الخام كقنوات)
- Google Chat: `spaces/<spaceId>` أو `users/<userId>`
- Slack: `channel:<id>` أو `user:<id>` (يُقبل معرّف القناة الخام)
- Mattermost (Plugin): `channel:<id>`، أو `user:<id>`، أو `@username` (تُعامل المعرّفات المجردة كقنوات)
- Signal: `+E.164`، أو `group:<id>`، أو `signal:+E.164`، أو `signal:group:<id>`، أو `username:<name>`/`u:<name>`
- iMessage: معرّف، أو `chat_id:<id>`، أو `chat_guid:<guid>`، أو `chat_identifier:<id>`
- iMessage: مقبض، أو `chat_id:<id>`، أو `chat_guid:<guid>`، أو `chat_identifier:<id>`
- Matrix: `@user:server`، أو `!room:server`، أو `#alias:server`
- Microsoft Teams: معرّف المحادثة (`19:...@thread.tacv2`) أو `conversation:<id>` أو `user:<aad-object-id>`
- Microsoft Teams: معرّف محادثة (`19:...@thread.tacv2`) أو `conversation:<id>` أو `user:<aad-object-id>`
البحث بالاسم:
- بالنسبة للموفّرين المدعومين (Discord/Slack/إلخ)، تُحلّ أسماء القنوات مثل `Help` أو `#help` عبر ذاكرة التخزين المؤقت للدليل.
- عند عدم وجود نتيجة في ذاكرة التخزين المؤقت، سيحاول OpenClaw إجراء بحث مباشر في الدليل عندما يدعمه الموفّر.
- لمقدمي الخدمة المدعومين (Discord/Slack/وغيرهما)، تُحل أسماء القنوات مثل `Help` أو `#help` عبر ذاكرة التخزين المؤقت للدليل.
- عند عدم العثور في ذاكرة التخزين المؤقت، سيحاول OpenClaw إجراء بحث مباشر في الدليل عندما يدعم مقدم الخدمة ذلك.
## الأعلام الشائعة
- `--channel <name>`
- `--account <id>`
- `--target <dest>` (القناة أو المستخدم الهدف للإرسال/الاستطلاع/القراءة/إلخ)
- `--targets <name>` (مكرر؛ للبث فقط)
- `--target <dest>` (القناة أو المستخدم الهدف للإرسال/الاستطلاع/القراءة/وغير ذلك)
- `--targets <name>` (يُكرر؛ للبث فقط)
- `--json`
- `--dry-run`
- `--verbose`
## سلوك SecretRef
- يحلّ `openclaw message` مراجع SecretRefs للقنوات المدعومة قبل تشغيل الإجراء المحدد.
- يكون الحل محصورًا بهدف الإجراء النشط عندما يكون ذلك ممكنًا:
- على نطاق القناة عند تعيين `--channel` (أو استنتاجه من الأهداف المسبوقة مثل `discord:...`)
- على نطاق الحساب عند تعيين `--account` (عموميات القناة + أسطح الحساب المحدد)
- عند حذف `--account`، لا يفرض OpenClaw نطاق SecretRef لحساب `default`
- لا تمنع SecretRefs غير المحلولة في القنوات غير المرتبطة إجراء رسالة مستهدف.
- إذا كان SecretRef للقناة/الحساب المحدد غير محلول، يفشل الأمر بشكل مغلق لذلك الإجراء.
- يحل `openclaw message` قيم SecretRef المدعومة للقنوات قبل تشغيل الإجراء المحدد.
- يكون الحل محدودًا بهدف الإجراء النشط عندما يكون ذلك ممكنًا:
- على مستوى القناة عندما يُعيّن `--channel` (أو يُستنتج من الأهداف المسبوقة مثل `discord:...`)
- على مستوى الحساب عندما يُعيّن `--account` (عموميات القناة + واجهات الحساب المحدد)
- عندما يُحذف `--account`، لا يفرض OpenClaw نطاق SecretRef لحساب `default`
- لا تمنع قيم SecretRef غير المحلولة في قنوات غير مرتبطة إجراء رسالة مستهدفًا.
- إذا كانت قيمة SecretRef للقناة/الحساب المحدد غير محلولة، يفشل الأمر فشلًا مغلقًا لذلك الإجراء.
## الإجراءات
### الأساس
### الأساسي
- `send`
- القنوات: WhatsApp/Telegram/Discord/Google Chat/Slack/Mattermost (Plugin)/Signal/iMessage/Matrix/Microsoft Teams
- مطلوب: `--target`، بالإضافة إلى `--message` أو `--media` أو `--presentation`
- اختياري: `--media`، `--presentation`، `--delivery`، `--pin`، `--reply-to`، `--thread-id`، `--gif-playback`، `--force-document`، `--silent`
- حمولات العرض التقديمي المشتركة: يرسل `--presentation` كتلًا دلالية (`text`، `context`، `divider`، `buttons`، `select`) يعرضها الأساس عبر الإمكانات المعلنة للقناة المحددة. راجع [عرض الرسائل](/ar/plugins/message-presentation).
- تفضيلات التسليم العامة: يقبل `--delivery` تلميحات تسليم مثل `{ "pin": true }`؛ ويكون `--pin` اختصارًا للتسليم المثبّت عندما تدعمه القناة.
- Telegram فقط: `--force-document` (إرسال الصور وصور GIF كمستندات لتجنب ضغط Telegram)
- حمولات العرض التقديمي المشتركة: يرسل `--presentation` كتلًا دلالية (`text`، `context`، `divider`، `buttons`، `select`) يعرضها القلب عبر القدرات المعلنة للقناة المحددة. راجع [عرض الرسائل](/ar/plugins/message-presentation).
- تفضيلات التسليم العامة: يقبل `--delivery` تلميحات تسليم مثل `{ "pin": true }`؛ ويكون `--pin` اختصارًا للتسليم المثبت عندما تدعمه القناة.
- Telegram فقط: `--force-document` (إرسال الصور وملفات GIF كمستندات لتجنب ضغط Telegram)
- Telegram فقط: `--thread-id` (معرّف موضوع المنتدى)
- Slack فقط: `--thread-id` (الطابع الزمني لسلسلة المحادثات؛ يستخدم `--reply-to` الحقل نفسه)
- Slack فقط: `--thread-id` (الطابع الزمني للسلسلة؛ يستخدم `--reply-to` الحقل نفسه)
- Telegram + Discord: `--silent`
- WhatsApp فقط: `--gif-playback`؛ تُخاطَب قنوات/نشرات WhatsApp باستخدام JID الأصلي الخاص بها `@newsletter`.
- WhatsApp فقط: `--gif-playback`؛ تُخاطَب قنوات/نشرات WhatsApp باستخدام JID الأصلي `@newsletter`.
- `poll`
- القنوات: WhatsApp/Telegram/Discord/Matrix/Microsoft Teams
- مطلوب: `--target`، `--poll-question`، `--poll-option`كرر)
- مطلوب: `--target`، و`--poll-question`، و`--poll-option` (يُكرر)
- اختياري: `--poll-multi`
- Discord فقط: `--poll-duration-hours`، `--silent`، `--message`
- Telegram فقط: `--poll-duration-seconds` (5-600)، `--silent`، `--poll-anonymous` / `--poll-public`، `--thread-id`
- Discord فقط: `--poll-duration-hours`، و`--silent`، و`--message`
- Telegram فقط: `--poll-duration-seconds` (5-600)، و`--silent`، و`--poll-anonymous` / `--poll-public`، و`--thread-id`
- `react`
- القنوات: Discord/Google Chat/Slack/Telegram/WhatsApp/Signal/Matrix
- مطلوب: `--message-id`، `--target`
- اختياري: `--emoji`، `--remove`، `--participant`، `--from-me`، `--target-author`، `--target-author-uuid`
- ملاحظة: يتطلب `--remove` وجود `--emoji` (احذف `--emoji` لمسح تفاعلاتك عندما يكون ذلك مدعومًا؛ راجع /tools/reactions)
- WhatsApp فقط: `--participant`، `--from-me`
- تفاعلات مجموعات Signal: يلزم `--target-author` أو `--target-author-uuid`
- مطلوب: `--message-id`، و`--target`
- اختياري: `--emoji`، و`--remove`، و`--participant`، و`--from-me`، و`--target-author`، و`--target-author-uuid`
- ملاحظة: يتطلب `--remove` وجود `--emoji` (احذف `--emoji` لمسح تفاعلاتك الخاصة حيث يكون ذلك مدعومًا؛ راجع /tools/reactions)
- WhatsApp فقط: `--participant`، و`--from-me`
- تفاعلات مجموعات Signal: يكون `--target-author` أو `--target-author-uuid` مطلوبًا
- `reactions`
- القنوات: Discord/Google Chat/Slack/Matrix
- مطلوب: `--message-id`، `--target`
- مطلوب: `--message-id`، و`--target`
- اختياري: `--limit`
- `read`
- القنوات: Discord/Slack/Matrix
- مطلوب: `--target`
- اختياري: `--limit`، `--message-id`، `--before`، `--after`
- Slack فقط: يقرأ `--message-id` طابعًا زمنيًا محددًا لرسالة Slack؛ ادمجه مع `--thread-id` لقراءة رد محدد في سلسلة محادثات.
- اختياري: `--limit`، و`--message-id`، و`--before`، و`--after`
- Slack فقط: يقرأ `--message-id` طابعًا زمنيًا محددًا لرسالة Slack؛ ادمجه مع `--thread-id` لقراءة رد محدد في سلسلة بدقة.
- Discord فقط: `--around`
- `edit`
- القنوات: Discord/Slack/Matrix
- مطلوب: `--message-id`، `--message`، `--target`
- مطلوب: `--message-id`، و`--message`، و`--target`
- `delete`
- القنوات: Discord/Slack/Telegram/Matrix
- مطلوب: `--message-id`، `--target`
- مطلوب: `--message-id`، و`--target`
- `pin` / `unpin`
- القنوات: Discord/Slack/Matrix
- مطلوب: `--message-id`، `--target`
- مطلوب: `--message-id`، و`--target`
- `pins` (قائمة)
- القنوات: Discord/Slack/Matrix
@ -131,80 +131,80 @@ openclaw message <subcommand> [flags]
- `permissions`
- القنوات: Discord/Matrix
- مطلوب: `--target`
- Matrix فقط: متاح عند تمكين تشفير Matrix والسماح بإجراءات التحقق
- Matrix فقط: متاح عندما يكون تشفير Matrix ممكّنًا وتكون إجراءات التحقق مسموحًا بها
- `search`
- القنوات: Discord
- مطلوب: `--guild-id`، `--query`
- اختياري: `--channel-id`، `--channel-ids` (مكرر)، `--author-id`، `--author-ids` (مكرر)، `--limit`
- مطلوب: `--guild-id`، و`--query`
- اختياري: `--channel-id`، و`--channel-ids` (يُكرر)، و`--author-id`، و`--author-ids` (يُكرر)، و`--limit`
### سلاسل المحادثات
### السلاسل
- `thread create`
- القنوات: Discord
- مطلوب: `--thread-name`، `--target` (معرّف القناة)
- اختياري: `--message-id`، `--message`، `--auto-archive-min`
- مطلوب: `--thread-name`، و`--target` (معرّف القناة)
- اختياري: `--message-id`، و`--message`، و`--auto-archive-min`
- `thread list`
- القنوات: Discord
- مطلوب: `--guild-id`
- اختياري: `--channel-id`، `--include-archived`، `--before`، `--limit`
- اختياري: `--channel-id`، و`--include-archived`، و`--before`، و`--limit`
- `thread reply`
- القنوات: Discord
- مطلوب: `--target` (معرّف سلسلة المحادثات)، `--message`
- اختياري: `--media`، `--reply-to`
- مطلوب: `--target` (معرّف السلسلة)، و`--message`
- اختياري: `--media`، و`--reply-to`
### الرموز التعبيرية
- `emoji list`
- Discord: `--guild-id`
- Slack: لا أعلام إضافية
- Slack: لا توجد أعلام إضافية
- `emoji upload`
- القنوات: Discord
- مطلوب: `--guild-id`، `--emoji-name`، `--media`
- اختياري: `--role-ids` (مكرر)
- مطلوب: `--guild-id`، و`--emoji-name`، و`--media`
- اختياري: `--role-ids` (يُكرر)
### الملصقات
- `sticker send`
- القنوات: Discord
- مطلوب: `--target`، `--sticker-id`كرر)
- مطلوب: `--target`، و`--sticker-id` (يُكرر)
- اختياري: `--message`
- `sticker upload`
- القنوات: Discord
- مطلوب: `--guild-id`، `--sticker-name`، `--sticker-desc`، `--sticker-tags`، `--media`
- مطلوب: `--guild-id`، و`--sticker-name`، و`--sticker-desc`، و`--sticker-tags`، و`--media`
### الأدوار / القنوات / الأعضاء / الصوت
- `role info` (Discord): `--guild-id`
- `role add` / `role remove` (Discord): `--guild-id`، `--user-id`، `--role-id`
- `role add` / `role remove` (Discord): `--guild-id`، و`--user-id`، و`--role-id`
- `channel info` (Discord): `--target`
- `channel list` (Discord): `--guild-id`
- `member info` (Discord/Slack): `--user-id` (+ `--guild-id` لـ Discord)
- `voice status` (Discord): `--guild-id`، `--user-id`
- `voice status` (Discord): `--guild-id`، و`--user-id`
### الأحداث
- `event list` (Discord): `--guild-id`
- `event create` (Discord): `--guild-id`، `--event-name`، `--start-time`
- اختياري: `--end-time`، `--desc`، `--channel-id`، `--location`، `--event-type`
- `event create` (Discord): `--guild-id`، و`--event-name`، و`--start-time`
- اختياري: `--end-time`، و`--desc`، و`--channel-id`، و`--location`، و`--event-type`
### الإشراف (Discord)
- `timeout`: `--guild-id`، `--user-id` (اختياريًا `--duration-min` أو `--until`؛ احذف كليهما لمسح المهلة)
- `kick`: `--guild-id`، `--user-id` (+ `--reason`)
- `ban`: `--guild-id`، `--user-id` (+ `--delete-days`، `--reason`)
- `timeout`: `--guild-id`، و`--user-id` (اختياريًا `--duration-min` أو `--until`؛ احذف كليهما لمسح المهلة)
- `kick`: `--guild-id`، و`--user-id` (+ `--reason`)
- `ban`: `--guild-id`، و`--user-id` (+ `--delete-days`، و`--reason`)
- يدعم `timeout` أيضًا `--reason`
### البث
- `broadcast`
- القنوات: أي قناة مكوّنة؛ استخدم `--channel all` لاستهداف جميع الموفّرين
- القنوات: أي قناة مهيأة؛ استخدم `--channel all` لاستهداف جميع مقدمي الخدمة
- مطلوب: `--targets <target...>`
- اختياري: `--message`، `--media`، `--dry-run`
- اختياري: `--message`، و`--media`، و`--dry-run`
## أمثلة
@ -215,7 +215,7 @@ openclaw message send --channel discord \
--target channel:123 --message "hi" --reply-to 456
```
إرسال رسالة مع أزرار دلالية:
إرسال رسالة بأزرار دلالية:
```
openclaw message send --channel discord \
@ -223,9 +223,9 @@ openclaw message send --channel discord \
--presentation '{"blocks":[{"type":"buttons","buttons":[{"label":"Approve","value":"approve","style":"success"},{"label":"Decline","value":"decline","style":"danger"}]}]}'
```
يعرض الأساس حمولة `presentation` نفسها إلى مكوّنات Discord، وكتل Slack، وأزرار Telegram المضمنة، وخصائص Mattermost، أو بطاقات Teams/Feishu بحسب إمكانية القناة. راجع [عرض الرسائل](/ar/plugins/message-presentation) للاطلاع على العقد الكامل وقواعد الرجوع الاحتياطي.
يعرض القلب حمولة `presentation` نفسها في مكوّنات Discord، أو كتل Slack، أو أزرار Telegram المضمنة، أو خصائص Mattermost، أو بطاقات Teams/Feishu بحسب قدرة القناة. راجع [عرض الرسائل](/ar/plugins/message-presentation) للاطلاع على العقد الكامل وقواعد الرجوع الاحتياطي.
إرسال حمولة عرض تقديمي أكثر ثراءً:
إرسال حمولة عرض تقديمي أغنى:
```bash
openclaw message send --channel googlechat --target spaces/AAA... \

View File

@ -1,25 +1,25 @@
---
read_when:
- تريد تشغيل Gateway من متصفح
- تريد الوصول إلى Tailnet بدون أنفاق SSH
- تريد الوصول إلى Tailnet دون أنفاق SSH
sidebarTitle: Control UI
summary: واجهة التحكم المستندة إلى المتصفح لـ Gateway (الدردشة، العُقد، التكوين)
summary: واجهة تحكم مستندة إلى المتصفح لـ Gateway (الدردشة، العُقد، الإعدادات)
title: واجهة التحكم
x-i18n:
generated_at: "2026-05-04T07:12:12Z"
generated_at: "2026-05-04T07:46:40Z"
model: gpt-5.5
provider: openai
source_hash: 07fbbe1c7fec5f67a04a231e02bdf0f7d16be9c5fe188915674d71fcd69002a5
source_hash: 896c75116d7a396571017ac6e6db7ff6ce328617e44470c303fd41af58aa2bd7
source_path: web/control-ui.md
workflow: 16
---
واجهة التحكم هي تطبيق صفحة واحدة صغير مبني بـ **Vite + Lit** يقدمه Gateway:
واجهة التحكم هي تطبيق صغير أحادي الصفحة مبني بـ **Vite + Lit** يقدمه Gateway:
- الافتراضي: `http://<host>:18789/`
- بادئة اختيارية: عيّن `gateway.controlUi.basePath` (مثل `/openclaw`)
- بادئة اختيارية: اضبط `gateway.controlUi.basePath` (مثل `/openclaw`)
تتواصل **مباشرة مع WebSocket الخاص بـ Gateway** على المنفذ نفسه.
يتواصل **مباشرة مع Gateway WebSocket** على المنفذ نفسه.
## فتح سريع (محلي)
@ -27,16 +27,16 @@ x-i18n:
- [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (أو [http://localhost:18789/](http://localhost:18789/))
إذا فشل تحميل الصفحة، فابدأ Gateway أولاً: `openclaw gateway`.
إذا فشل تحميل الصفحة، فابدأ Gateway أولًا: `openclaw gateway`.
تُقدَّم المصادقة أثناء مصافحة WebSocket عبر:
تُوفَّر المصادقة أثناء مصافحة WebSocket عبر:
- `connect.params.auth.token`
- `connect.params.auth.password`
- ترويسات هوية Tailscale Serve عند ضبط `gateway.auth.allowTailscale: true`
- ترويسات هوية الوكيل الموثوق عند ضبط `gateway.auth.mode: "trusted-proxy"`
تحتفظ لوحة إعدادات لوحة المعلومات برمز مميز لجلسة تبويب المتصفح الحالية وعنوان URL المحدد للـ gateway؛ ولا يتم الاحتفاظ بكلمات المرور. عادةً ما ينشئ الإعداد الأولي رمز gateway لمصادقة السر المشترك عند أول اتصال، لكن مصادقة كلمة المرور تعمل أيضاً عندما يكون `gateway.auth.mode` مضبوطاً على `"password"`.
تحتفظ لوحة إعدادات لوحة المعلومات برمز مميز لجلسة تبويب المتصفح الحالية وعنوان URL المحدد للبوابة؛ ولا تُحفَظ كلمات المرور. عادةً ينشئ الإعداد الأولي رمز Gateway للمصادقة بالسر المشترك عند الاتصال الأول، لكن مصادقة كلمة المرور تعمل أيضًا عندما يكون `gateway.auth.mode` هو `"password"`.
## إقران الجهاز (الاتصال الأول)
@ -45,108 +45,109 @@ x-i18n:
**ما ستراه:** "disconnected (1008): pairing required"
<Steps>
<Step title="سرد الطلبات المعلقة">
<Step title="عرض الطلبات المعلقة">
```bash
openclaw devices list
```
</Step>
<Step title="الموافقة باستخدام معرّف الطلب">
<Step title="الموافقة بواسطة معرّف الطلب">
```bash
openclaw devices approve <requestId>
```
</Step>
</Steps>
إذا أعاد المتصفح محاولة الإقران بتفاصيل مصادقة متغيرة (الدور/النطاقات/المفتاح العام)، فسيتم تجاوز الطلب المعلق السابق وإنشاء `requestId` جديد. أعد تشغيل `openclaw devices list` قبل الموافقة.
إذا أعاد المتصفح محاولة الإقران مع تفاصيل مصادقة متغيرة (الدور/النطاقات/المفتاح العام)، فسيتم تجاوز الطلب المعلق السابق وإنشاء `requestId` جديد. شغّل `openclaw devices list` مرة أخرى قبل الموافقة.
إذا كان المتصفح مقترناً بالفعل وغيّرته من وصول للقراءة إلى وصول للكتابة/الإدارة، فسيُعامل ذلك كترقية موافقة، وليس إعادة اتصال صامتة. يبقي OpenClaw الموافقة القديمة نشطة، ويحظر إعادة الاتصال ذات النطاق الأوسع، ويطلب منك الموافقة صراحةً على مجموعة النطاقات الجديدة.
إذا كان المتصفح مقترنًا بالفعل وغيّرته من صلاحية قراءة إلى صلاحية كتابة/مسؤول، فيُعامَل ذلك كترقية موافقة، وليس إعادة اتصال صامتة. يُبقي OpenClaw الموافقة القديمة نشطة، ويمنع إعادة الاتصال ذات النطاق الأوسع، ويطلب منك الموافقة صراحةً على مجموعة النطاقات الجديدة.
بعد الموافقة، يتم تذكّر الجهاز ولن يتطلب إعادة موافقة إلا إذا ألغيتَه باستخدام `openclaw devices revoke --device <id> --role <role>`. راجع [CLI الأجهزة](/ar/cli/devices) لتدوير الرموز المميزة والإلغاء.
بعد الموافقة، يتم تذكّر الجهاز ولن يتطلب موافقة جديدة إلا إذا ألغيتَه باستخدام `openclaw devices revoke --device <id> --role <role>`. راجع [CLI الأجهزة](/ar/cli/devices) لتدوير الرموز وإلغائها.
<Note>
- تتم الموافقة تلقائياً على اتصالات متصفح local loopback المباشرة (`127.0.0.1` / `localhost`).
- يستطيع Tailscale Serve تخطي جولة الإقران لجلسات مشغّل واجهة التحكم عندما يكون `gateway.auth.allowTailscale: true`، ويتم التحقق من هوية Tailscale، ويقدم المتصفح هوية جهازه.
- تتم الموافقة تلقائيًا على اتصالات متصفح local loopback المباشرة (`127.0.0.1` / `localhost`).
- يستطيع Tailscale Serve تخطي جولة الإقران لجلسات مشغل واجهة التحكم عندما يكون `gateway.auth.allowTailscale: true`، وتتحقق هوية Tailscale، ويعرض المتصفح هوية جهازه.
- لا تزال روابط Tailnet المباشرة، واتصالات متصفح LAN، وملفات تعريف المتصفح التي لا تحتوي على هوية جهاز تتطلب موافقة صريحة.
- ينشئ كل ملف تعريف متصفح معرّف جهاز فريداً، لذلك سيتطلب تبديل المتصفحات أو مسح بيانات المتصفح إعادة الإقران.
- ينشئ كل ملف تعريف متصفح معرّف جهاز فريدًا، لذا فإن تبديل المتصفحات أو مسح بيانات المتصفح سيتطلب إعادة الإقران.
</Note>
## الهوية الشخصية (محلية للمتصفح)
تدعم واجهة التحكم هوية شخصية لكل متصفح (اسم عرض وصورة رمزية) تُرفق بالرسائل الصادرة للإسناد في الجلسات المشتركة. تعيش هذه الهوية في تخزين المتصفح، وتكون مقصورة على ملف تعريف المتصفح الحالي، ولا تتم مزامنتها مع أجهزة أخرى أو الاحتفاظ بها من جانب الخادم بخلاف بيانات تعريف مؤلفي الرسائل المعتادة في الرسائل التي ترسلها فعلياً. يؤدي مسح بيانات الموقع أو تبديل المتصفحات إلى إعادتها إلى فارغة.
تدعم واجهة التحكم هوية شخصية لكل متصفح (اسم عرض وصورة رمزية) تُرفق بالرسائل الصادرة للإسناد في الجلسات المشتركة. تعيش هذه الهوية في تخزين المتصفح، وتكون مقصورة على ملف تعريف المتصفح الحالي، ولا تتم مزامنتها مع أجهزة أخرى أو حفظها على جانب الخادم باستثناء بيانات وصف مؤلف النص العادية على الرسائل التي ترسلها فعليًا. يؤدي مسح بيانات الموقع أو تبديل المتصفحات إلى إعادة ضبطها إلى فارغة.
ينطبق النمط المحلي للمتصفح نفسه على تجاوز صورة المساعد الرمزية. تغطي صور المساعد الرمزية المرفوعة الهوية التي حلّها gateway في المتصفح المحلي فقط، ولا تدور أبداً عبر `config.patch`. لا يزال حقل الإعدادات المشترك `ui.assistant.avatar` متاحاً للعملاء غير المرتبطين بواجهة المستخدم الذين يكتبون الحقل مباشرةً (مثل gateways النصية أو لوحات المعلومات المخصصة).
ينطبق نمط المتصفح المحلي نفسه على تجاوز الصورة الرمزية للمساعد. توضع صور المساعد الرمزية المرفوعة فوق الهوية التي حلّها Gateway في المتصفح المحلي فقط ولا تمر ذهابًا وإيابًا عبر `config.patch`. لا يزال حقل إعدادات `ui.assistant.avatar` المشترك متاحًا للعملاء غير التابعين لواجهة المستخدم الذين يكتبون الحقل مباشرة (مثل البوابات المؤتمتة أو لوحات المعلومات المخصصة).
## نقطة نهاية إعدادات وقت التشغيل
تجلب واجهة التحكم إعدادات وقت التشغيل من `/__openclaw/control-ui-config.json`. هذه النقطة محمية بمصادقة gateway نفسها مثل بقية سطح HTTP: لا يمكن للمتصفحات غير المصادقة جلبها، ويتطلب الجلب الناجح إما رمز gateway/كلمة مرور صالحة مسبقاً، أو هوية Tailscale Serve، أو هوية وكيل موثوق.
تجلب واجهة التحكم إعدادات وقت التشغيل من `/__openclaw/control-ui-config.json`. تخضع نقطة النهاية هذه لمصادقة Gateway نفسها مثل بقية سطح HTTP: لا تستطيع المتصفحات غير المصادق عليها جلبها، ويتطلب الجلب الناجح إما رمز/كلمة مرور Gateway صالحة بالفعل، أو هوية Tailscale Serve، أو هوية وكيل موثوق.
## دعم اللغة
يمكن لواجهة التحكم ترجمة نفسها عند التحميل الأول بناءً على لغة المتصفح. لتجاوز ذلك لاحقاً، افتح **نظرة عامة -> الوصول إلى Gateway -> اللغة**. يوجد منتقي اللغة في بطاقة الوصول إلى Gateway، وليس ضمن المظهر.
يمكن لواجهة التحكم تعريب نفسها عند التحميل الأول استنادًا إلى لغة متصفحك. لتجاوز ذلك لاحقًا، افتح **نظرة عامة -> وصول 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 تلك الأكواد.
تُولَّد ترجمات الوثائق لمجموعة اللغات غير الإنجليزية نفسها، لكن منتقي اللغة المدمج في موقع الوثائق من Mintlify يقتصر على رموز اللغات التي يقبلها Mintlify. لا تزال وثائق التايلاندية (`th`) والفارسية (`fa`) تُولَّد في مستودع النشر؛ وقد لا تظهر في ذلك المنتقي حتى يدعم Mintlify تلك الرموز.
## سمات المظهر
تحتفظ لوحة المظهر بسمات Claw وKnot وDash المدمجة، بالإضافة إلى خانة استيراد tweakcn محلية واحدة للمتصفح. لاستيراد سمة، افتح [محرر tweakcn](https://tweakcn.com/editor/theme)، واختر سمة أو أنشئ واحدة، وانقر **مشاركة**، ثم الصق رابط السمة المنسوخ في المظهر. يقبل المستورد أيضاً عناوين URL لسجل `https://tweakcn.com/r/themes/<id>`، وعناوين URL للمحرر مثل `https://tweakcn.com/editor/theme?theme=amethyst-haze`، ومسارات `/themes/<id>` النسبية، ومعرّفات السمات الخام، وأسماء السمات الافتراضية مثل `amethyst-haze`.
تحتفظ لوحة المظهر بالسمات المدمجة Claw وKnot وDash، بالإضافة إلى موضع استيراد tweakcn محلي للمتصفح. لاستيراد سمة، افتح [محرر tweakcn](https://tweakcn.com/editor/theme)، واختر سمة أو أنشئ واحدة، وانقر **مشاركة**، ثم الصق رابط السمة المنسوخ في المظهر. يقبل المستورد أيضًا عناوين URL لسجل `https://tweakcn.com/r/themes/<id>`، وعناوين URL للمحرر مثل `https://tweakcn.com/editor/theme?theme=amethyst-haze`، ومسارات `/themes/<id>` النسبية، ومعرّفات السمات الخام، وأسماء السمات الافتراضية مثل `amethyst-haze`.
تُخزَّن السمات المستوردة فقط في ملف تعريف المتصفح الحالي. لا تُكتب في إعدادات gateway ولا تتم مزامنتها عبر الأجهزة. يؤدي استبدال السمة المستوردة إلى تحديث الخانة المحلية الواحدة؛ ويؤدي مسحها إلى إعادة السمة النشطة إلى Claw إذا كانت السمة المستوردة محددة.
تُخزَّن السمات المستوردة في ملف تعريف المتصفح الحالي فقط. لا تُكتب إلى إعدادات Gateway ولا تتم مزامنتها عبر الأجهزة. يؤدي استبدال السمة المستوردة إلى تحديث الموضع المحلي الواحد؛ ويؤدي مسحها إلى إعادة السمة النشطة إلى Claw إذا كانت السمة المستوردة محددة.
## ما يمكنها فعله (اليوم)
## ما يمكنه فعله (اليوم)
<AccordionGroup>
<Accordion title="الدردشة والتحدث">
- الدردشة مع النموذج عبر Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`).
- التحدث عبر جلسات المتصفح في الوقت الحقيقي. يستخدم OpenAI اتصال WebRTC مباشراً، ويستخدم Google Live رمز متصفح محدوداً لمرة واحدة عبر WebSocket، وتستخدم Plugins الصوت في الوقت الحقيقي الخاصة بالخلفية فقط نقل الترحيل عبر Gateway. يحتفظ الترحيل ببيانات اعتماد المزوّد على Gateway بينما يبث المتصفح PCM الميكروفون عبر استدعاءات RPC `talk.realtime.relay*` ويرسل استدعاءات أداة `openclaw_agent_consult` مرة أخرى عبر `chat.send` إلى نموذج OpenClaw الأكبر المُعد.
- بث استدعاءات الأدوات + بطاقات مخرجات الأدوات المباشرة في الدردشة (أحداث الوكيل).
- التحدث عبر جلسات المتصفح الفورية. يستخدم OpenAI اتصال WebRTC مباشرًا، ويستخدم Google Live رمز متصفح مقيّدًا للاستخدام مرة واحدة عبر WebSocket، وتستخدم Plugins الصوت الفوري المخصصة للخلفية فقط نقل ترحيل Gateway. يحافظ الترحيل على بيانات اعتماد الموفر على Gateway بينما يبث المتصفح PCM الميكروفون عبر استدعاءات RPC من `talk.realtime.relay*` ويرسل استدعاءات أداة `openclaw_agent_consult` مرة أخرى عبر `chat.send` إلى نموذج OpenClaw الأكبر المضبوط.
- بث استدعاءات الأدوات + بطاقات مخرجات الأدوات الحية في الدردشة (أحداث الوكيل).
</Accordion>
<Accordion title="القنوات، المثيلات، الجلسات، الأحلام">
- القنوات: حالة القنوات المدمجة وقنوات Plugin المضمّنة/الخارجية، وتسجيل الدخول عبر QR، وإعدادات كل قناة (`channels.status`, `web.login.*`, `config.patch`).
<Accordion title="القنوات، والمثيلات، والجلسات، والأحلام">
- القنوات: حالة القنوات المدمجة وقنوات Plugin المرفقة/الخارجية، وتسجيل الدخول عبر QR، وإعدادات كل قناة (`channels.status`, `web.login.*`, `config.patch`).
- المثيلات: قائمة الحضور + التحديث (`system-presence`).
- الجلسات: القائمة + تجاوزات النموذج/التفكير/السريع/المفصل/التتبع/الاستدلال لكل جلسة (`sessions.list`, `sessions.patch`).
- الأحلام: حالة Dreaming، ومفتاح التفعيل/التعطيل، وقارئ مفكرة الأحلام (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
- الجلسات: القائمة + تجاوزات النموذج/التفكير/السريع/المطوّل/التتبع/الاستدلال لكل جلسة (`sessions.list`, `sessions.patch`).
- الأحلام: حالة Dreaming، ومفتاح التفعيل/التعطيل، وقارئ يوميات الأحلام (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
</Accordion>
<Accordion title="Cron، Skills، العقد، موافقات التنفيذ">
- مهام Cron: سرد/إضافة/تحرير/تشغيل/تفعيل/تعطيل + سجل التشغيل (`cron.*`).
<Accordion title="Cron، وSkills، والعقد، وموافقات exec">
- مهام Cron: عرض/إضافة/تحرير/تشغيل/تفعيل/تعطيل + سجل التشغيل (`cron.*`).
- Skills: الحالة، التفعيل/التعطيل، التثبيت، تحديثات مفتاح API (`skills.*`).
- العقد: القائمة + القدرات (`node.list`).
- موافقات التنفيذ: تحرير قوائم السماح في gateway أو العقدة + سياسة الطلب لـ `exec host=gateway/node` (`exec.approvals.*`).
- العقد: القائمة + الإمكانات (`node.list`).
- موافقات exec: تحرير قوائم السماح الخاصة بالبوابة أو العقدة + سياسة السؤال لـ `exec host=gateway/node` (`exec.approvals.*`).
</Accordion>
<Accordion title="الإعدادات">
- عرض/تحرير `~/.openclaw/openclaw.json` (`config.get`, `config.set`).
- التطبيق + إعادة التشغيل مع التحقق (`config.apply`) وإيقاظ آخر جلسة نشطة.
- تتضمن عمليات الكتابة حارس تجزئة أساسي لمنع الكتابة فوق التعديلات المتزامنة.
- تجري عمليات الكتابة (`config.set`/`config.apply`/`config.patch`) فحصاً مسبقاً لحل SecretRef النشط للمراجع في حمولة الإعدادات المقدمة؛ وتُرفض المراجع النشطة المقدمة غير المحلولة قبل الكتابة.
- عرض المخطط + النموذج (`config.schema` / `config.schema.lookup`، بما في ذلك `title` / `description` للحقل، وتلميحات واجهة المستخدم المطابقة، وملخصات الأبناء المباشرة، وبيانات تعريف الوثائق على عقد الكائنات المتداخلة/أحرف البدل/المصفوفات/التركيب، بالإضافة إلى مخططات Plugin + القنوات عند توفرها)؛ محرر JSON الخام متاح فقط عندما تحتوي اللقطة على دورة ذهاب وعودة خام آمنة.
- إذا تعذر على اللقطة إجراء دورة ذهاب وعودة آمنة للنص الخام، تفرض واجهة التحكم وضع النموذج وتعطل الوضع الخام لتلك اللقطة.
- يحافظ "إعادة التعيين إلى المحفوظ" في محرر JSON الخام على الشكل المكتوب خاماً (التنسيق، التعليقات، تخطيط `$include`) بدلاً من إعادة عرض لقطة مسطحة، لذلك تبقى التعديلات الخارجية بعد إعادة التعيين عندما تتمكن اللقطة من إجراء دورة ذهاب وعودة آمنة.
- تُعرض قيم كائن SecretRef المنظم للقراءة فقط في مدخلات نص النموذج لمنع تلف تحويل الكائن إلى سلسلة نصية دون قصد.
- تتضمن عمليات الكتابة حارس تجزئة أساس لمنع طمس التعديلات المتزامنة.
- تُجري عمليات الكتابة (`config.set`/`config.apply`/`config.patch`) فحصًا مسبقًا لحل SecretRef النشط للمراجع الموجودة في حمولة الإعدادات المقدمة؛ وتُرفض المراجع النشطة غير المحلولة المقدمة قبل الكتابة.
- عرض المخطط + النموذج (`config.schema` / `config.schema.lookup`، بما في ذلك `title` / `description` للحقل، وتلميحات واجهة المستخدم المطابقة، وملخصات الأبناء المباشرة، وبيانات وصف الوثائق على عقد الكائنات/أحرف البدل/المصفوفات/التركيب المتداخلة، بالإضافة إلى مخططات Plugin + القنوات عند توفرها)؛ لا يتوفر محرر Raw JSON إلا عندما تحتوي اللقطة على ذهاب وإياب خام آمن.
- إذا تعذر على لقطة إجراء ذهاب وإياب آمن للنص الخام، تفرض واجهة التحكم وضع النموذج وتعطل الوضع الخام لتلك اللقطة.
- يحافظ محرر Raw JSON عند "إعادة الضبط إلى المحفوظ" على الشكل المؤلف خامًا (التنسيق، والتعليقات، وتخطيط `$include`) بدلًا من إعادة عرض لقطة مسطحة، لذلك تبقى التعديلات الخارجية بعد إعادة الضبط عندما تستطيع اللقطة إجراء ذهاب وإياب آمن.
- تُعرض قيم كائن SecretRef المنظمة للقراءة فقط في مدخلات نص النموذج لمنع تلف تحويل الكائن إلى سلسلة نصية بالخطأ.
</Accordion>
<Accordion title="التصحيح، السجلات، التحديث">
- التصحيح: لقطات الحالة/الصحة/النماذج + سجل الأحداث + استدعاءات RPC يدوية (`status`, `health`, `models.list`).
- السجلات: ذيل مباشر لسجلات ملفات gateway مع التصفية/التصدير (`logs.tail`).
- التحديث: تشغيل تحديث حزمة/git + إعادة التشغيل (`update.run`) مع تقرير إعادة تشغيل، ثم استطلاع `update.status` بعد إعادة الاتصال للتحقق من إصدار gateway العامل.
<Accordion title="التصحيح، والسجلات، والتحديث">
- التصحيح: لقطات الحالة/الصحة/النماذج + سجل الأحداث + استدعاءات RPC اليدوية (`status`, `health`, `models.list`).
- يتضمن سجل الأحداث توقيتات تحديث/RPC لواجهة التحكم بالإضافة إلى إدخالات استجابة المتصفح لإطارات الرسوم المتحركة الطويلة أو المهام الطويلة عندما يعرض المتصفح أنواع إدخالات PerformanceObserver تلك.
- السجلات: متابعة حية لسجلات ملف Gateway مع التصفية/التصدير (`logs.tail`).
- التحديث: تشغيل تحديث حزمة/ git + إعادة التشغيل (`update.run`) مع تقرير إعادة التشغيل، ثم استطلاع `update.status` بعد إعادة الاتصال للتحقق من إصدار Gateway الجاري تشغيله.
</Accordion>
<Accordion title="ملاحظات لوحة مهام Cron">
- بالنسبة إلى المهام المعزولة، يكون التسليم افتراضياً على إعلان الملخص. يمكنك التبديل إلى لا شيء إذا كنت تريد تشغيلات داخلية فقط.
- بالنسبة للمهام المعزولة، يكون التسليم افتراضيًا على إعلان الملخص. يمكنك التبديل إلى لا شيء إذا أردت تشغيلات داخلية فقط.
- تظهر حقول القناة/الهدف عند تحديد الإعلان.
- يستخدم وضع Webhook القيمة `delivery.mode = "webhook"` مع ضبط `delivery.to` على عنوان URL صالح لـ HTTP(S) webhook.
- بالنسبة إلى مهام الجلسة الرئيسية، تتوفر أوضاع تسليم webhook ولا شيء.
- تشمل عناصر التحكم المتقدمة في التحرير الحذف بعد التشغيل، ومسح تجاوز الوكيل، وخيارات cron الدقيقة/المتدرجة، وتجاوزات نموذج/تفكير الوكيل، ومفاتيح تسليم بأفضل جهد.
- يكون تحقق النموذج مضمناً مع أخطاء على مستوى الحقول؛ وتعطل القيم غير الصالحة زر الحفظ حتى يتم إصلاحها.
- عيّن `cron.webhookToken` لإرسال رمز حامل مخصص، وإذا تم حذفه فسيُرسل webhook بدون ترويسة مصادقة.
- بديل مهمل: لا تزال المهام القديمة المخزنة ذات `notify: true` قادرة على استخدام `cron.webhook` حتى يتم ترحيلها.
- بالنسبة لمهام الجلسة الرئيسية، تتوفر أوضاع تسليم webhook ولا شيء.
- تتضمن عناصر التحكم المتقدمة في التحرير الحذف بعد التشغيل، ومسح تجاوز الوكيل، وخيارات cron الدقيقة/المتدرجة، وتجاوزات نموذج/تفكير الوكيل، ومفاتيح تسليم بأفضل جهد.
- يكون التحقق من النموذج مضمّنًا مع أخطاء على مستوى الحقل؛ وتؤدي القيم غير الصالحة إلى تعطيل زر الحفظ حتى إصلاحها.
- اضبط `cron.webhookToken` لإرسال رمز bearer مخصص، وإذا حُذف يُرسل Webhook بدون ترويسة مصادقة.
- بديل مهمل: لا تزال المهام القديمة المخزنة التي تحتوي على `notify: true` تستطيع استخدام `cron.webhook` حتى يتم ترحيلها.
</Accordion>
</AccordionGroup>
@ -155,85 +156,85 @@ x-i18n:
<AccordionGroup>
<Accordion title="دلالات الإرسال والسجل">
- `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`.
- أثناء إرسال نشط وتحديث السجل النهائي، تُبقي طريقة عرض الدردشة رسائل المستخدم/المساعد المحلية التفاؤلية مرئية إذا أعاد `chat.history` لقطة أقدم لفترة وجيزة؛ ويستبدل النص الرسمي تلك الرسائل المحلية بمجرد أن يلحق سجل Gateway.
- أحداث `chat` الحية هي حالة تسليم، بينما يُعاد بناء `chat.history` من نص الجلسة الدائم. بعد أحداث tool-final تعيد واجهة التحكم تحميل السجل وتدمج ذيلًا تفاؤليًا صغيرًا فقط؛ وقد وُثِّق حد النص في [WebChat](/ar/web/webchat).
- يضيف `chat.inject` ملاحظة مساعد إلى نص الجلسة ويبث حدث `chat` للتحديثات الخاصة بواجهة المستخدم فقط (بلا تشغيل وكيل، وبلا تسليم قناة).
- تقوم منتقيات النموذج والتفكير في ترويسة الدردشة بتصحيح الجلسة النشطة فورًا عبر `sessions.patch`؛ وهي تجاوزات جلسة دائمة، وليست خيارات إرسال لدورة واحدة فقط.
- تؤدي كتابة `/new` في واجهة التحكم إلى إنشاء جلسة لوحة معلومات جديدة والتبديل إليها، مثل New Chat. وتحافظ كتابة `/reset` على إعادة الضبط الصريحة في المكان نفسه من Gateway للجلسة الحالية.
- يطلب منتقي نموذج الدردشة عرض النموذج المُكوَّن في Gateway. إذا كان `agents.defaults.models` موجودًا، فستقود قائمة السماح هذه المنتقي. وإلا يعرض المنتقي إدخالات `models.providers.*.models` الصريحة بالإضافة إلى المزوّدين ذوي المصادقة القابلة للاستخدام. يبقى الفهرس الكامل متاحًا عبر RPC التصحيحي `models.list` مع `view: "all"`.
- عندما تُظهر تقارير استخدام جلسة Gateway الحديثة ضغطًا عاليًا على السياق، تعرض منطقة مؤلِّف الدردشة إشعارًا بالسياق، وعند مستويات Compaction الموصى بها، زرًا مضغوطًا يشغّل مسار Compaction العادي للجلسة. تُخفى لقطات الرموز القديمة حتى يبلغ Gateway عن استخدام حديث مرة أخرى.
- `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`.
- أثناء إرسال نشط وتحديث السجل النهائي، تُبقي طريقة عرض الدردشة رسائل المستخدم/المساعد المحلية المتفائلة مرئية إذا أعاد `chat.history` لفترة وجيزة لقطة أقدم؛ ويستبدل النص المنسوخ المعتمد تلك الرسائل المحلية عندما يلحق سجل Gateway.
- أحداث `chat` الحية تمثل حالة التسليم، بينما يُعاد بناء `chat.history` من النص المنسوخ الدائم للجلسة. بعد أحداث tool-final، تعيد Control UI تحميل السجل وتدمج فقط ذيلًا متفائلًا صغيرًا؛ ويُوثَّق حد النص المنسوخ في [WebChat](/ar/web/webchat).
- يضيف `chat.inject` ملاحظة مساعد إلى النص المنسوخ للجلسة ويبث حدث `chat` لتحديثات واجهة المستخدم فقط (لا تشغيل للوكيل، ولا تسليم للقناة).
- تُصحّح منتقيات نموذج ترويسة الدردشة والتفكير الجلسة النشطة فورًا عبر `sessions.patch`؛ وهي تجاوزات جلسة دائمة، وليست خيارات إرسال لدورة واحدة فقط.
- تؤدي كتابة `/new` في Control UI إلى إنشاء جلسة لوحة معلومات جديدة والتحويل إليها مثل New Chat. وتُبقي كتابة `/reset` إعادة الضبط الصريحة في المكان نفسه من Gateway للجلسة الحالية.
- يطلب منتقي نموذج الدردشة عرض النموذج المُعدّ في Gateway. إذا كان `agents.defaults.models` موجودًا، فإن قائمة السماح هذه تقود المنتقي. وإلا فيعرض المنتقي إدخالات `models.providers.*.models` الصريحة إضافة إلى المزوّدين ذوي المصادقة القابلة للاستخدام. ويبقى الفهرس الكامل متاحًا عبر استدعاء RPC للتصحيح `models.list` مع `view: "all"`.
- عندما تُظهر تقارير استخدام جلسة Gateway الجديدة ضغط سياق مرتفعًا، تعرض منطقة مؤلف الدردشة تنبيه سياق، وعند مستويات Compaction الموصى بها، زرًا مضغوطًا يشغّل مسار Compaction العادي للجلسة. تُخفى لقطات الرموز القديمة حتى يبلّغ Gateway عن استخدام جديد مرة أخرى.
</Accordion>
<Accordion title="وضع التحدث (الوقت الفعلي في المتصفح)">
يستخدم وضع التحدث مزوّد صوت فوريًا مسجّلًا. اضبط OpenAI باستخدام `talk.provider: "openai"` بالإضافة إلى `talk.providers.openai.apiKey`، أو اضبط Google باستخدام `talk.provider: "google"` بالإضافة إلى `talk.providers.google.apiKey`؛ ولا يزال من الممكن إعادة استخدام إعدادات مزوّد الوقت الفعلي للمكالمات الصوتية كخيار احتياطي. لا يتلقى المتصفح أبدًا مفتاح API قياسيًا للمزوّد. تتلقى OpenAI سر عميل Realtime مؤقتًا لـ WebRTC. وتتلقى Google Live رمز مصادقة Live API مقيّدًا أحادي الاستخدام لجلسة WebSocket في المتصفح، مع تعليمات وتصريحات الأدوات مقفلة داخل الرمز بواسطة Gateway. تعمل المزوّدات التي لا تكشف إلا جسرًا فوريًا خلفيًا عبر نقل ترحيل Gateway، لذلك تبقى بيانات الاعتماد ومقابس المورّد من جهة الخادم بينما ينتقل صوت المتصفح عبر RPCs موثَّقة من Gateway. يجمع Gateway موجّه جلسة Realtime؛ ولا يقبل `talk.realtime.session` تجاوزات تعليمات مقدَّمة من المستدعي.
<Accordion title="وضع الحديث (الوقت الحقيقي في المتصفح)">
يستخدم وضع الحديث مزوّد صوت في الوقت الحقيقي مسجلًا. اضبط OpenAI باستخدام `talk.provider: "openai"` مع `talk.providers.openai.apiKey`، أو اضبط Google باستخدام `talk.provider: "google"` مع `talk.providers.google.apiKey`؛ ولا يزال بالإمكان إعادة استخدام إعداد مزوّد الوقت الحقيقي للمكالمات الصوتية كخيار احتياطي. لا يتلقى المتصفح أبدًا مفتاح API قياسيًا للمزوّد. يتلقى OpenAI سر عميل Realtime مؤقتًا لـ WebRTC. ويتلقى Google Live رمز مصادقة Live API مقيدًا للاستخدام مرة واحدة لجلسة WebSocket في المتصفح، مع تعليمات وتصريحات أدوات مقفلة داخل الرمز بواسطة Gateway. يعمل المزوّدون الذين لا يوفّرون إلا جسرًا خلفيًا للوقت الحقيقي عبر نقل ترحيل Gateway، وبذلك تبقى بيانات الاعتماد ومقابس المورّد على جانب الخادم بينما ينتقل صوت المتصفح عبر استدعاءات RPC مصادَق عليها من Gateway. تُجمَّع مطالبة جلسة Realtime بواسطة Gateway؛ ولا يقبل `talk.realtime.session` تجاوزات تعليمات يقدّمها المستدعي.
في مؤلِّف الدردشة، عنصر تحكم Talk هو زر الموجات بجوار زر الإملاء بالميكروفون. عند بدء Talk، يعرض صف حالة المؤلِّف `Connecting Talk...`، ثم `Talk live` أثناء اتصال الصوت، أو `Asking OpenClaw...` أثناء استشارة استدعاء أداة فوري للنموذج الأكبر المُكوَّن عبر `chat.send`.
في مؤلف الدردشة، يكون عنصر التحكم Talk هو زر الموجات بجانب زر إملاء الميكروفون. عند بدء Talk، يعرض صف حالة المؤلف `Connecting Talk...`، ثم `Talk live` أثناء اتصال الصوت، أو `Asking OpenClaw...` بينما يستشير استدعاء أداة في الوقت الحقيقي النموذج الأكبر المُعدّ عبر `chat.send`.
اختبار الدخان الحي للمشرف: يتحقق `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` من تبادل SDP الخاص بـ OpenAI عبر WebRTC في المتصفح، وإعداد WebSocket للمتصفح برمز مقيّد في Google Live، ومحوّل متصفح ترحيل Gateway بوسائط ميكروفون وهمية. يطبع الأمر حالة المزوّد فقط ولا يسجّل الأسرار.
اختبار دخان حي للمشرف: يتحقق `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` من تبادل SDP لـ WebRTC في متصفح OpenAI، وإعداد WebSocket المتصفح برمز مقيد لـ Google Live، ومحوّل متصفح ترحيل Gateway مع وسائط ميكروفون مزيفة. لا يطبع الأمر إلا حالة المزوّد ولا يسجل الأسرار.
</Accordion>
<Accordion title="الإيقاف والإلغاء">
<Accordion title="الإيقاف والإجهاض">
- انقر **إيقاف** (يستدعي `chat.abort`).
- أثناء نشاط تشغيل ما، تُصفّ المتابعات العادية في الطابور. انقر **توجيه** على رسالة مصفوفة لحقن تلك المتابعة في الدور قيد التشغيل.
- اكتب `/stop` (أو عبارات إلغاء مستقلة مثل `stop` و`stop action` و`stop run` و`stop openclaw` و`please stop`) للإلغاء خارج النطاق.
- يدعم `chat.abort` القيمة `{ sessionKey }` (بلا `runId`) لإلغاء جميع التشغيلات النشطة لتلك الجلسة.
- أثناء نشاط تشغيل، تصطف المتابعات العادية في قائمة انتظار. انقر **توجيه** على رسالة في قائمة الانتظار لحقن تلك المتابعة في الدورة الجارية.
- اكتب `/stop` (أو عبارات إجهاض مستقلة مثل `stop` و`stop action` و`stop run` و`stop openclaw` و`please stop`) للإجهاض خارج المسار.
- يدعم `chat.abort` الصيغة `{ sessionKey }` (دون `runId`) لإجهاض كل عمليات التشغيل النشطة لتلك الجلسة.
</Accordion>
<Accordion title="الاحتفاظ الجزئي عند الإلغاء">
- عند إلغاء تشغيل ما، لا يزال يمكن عرض نص المساعد الجزئي في واجهة المستخدم.
- يحفظ Gateway نص المساعد الجزئي المُلغى في سجل النص عند وجود خرج مخزّن مؤقتًا.
- تتضمن الإدخالات المحفوظة بيانات وصفية للإلغاء لكي يتمكن مستهلكو النص من تمييز الجزئيات المُلغاة عن خرج الاكتمال العادي.
<Accordion title="الاحتفاظ الجزئي عند الإجهاض">
- عند إجهاض تشغيل، يمكن أن يظل نص المساعد الجزئي معروضًا في واجهة المستخدم.
- يحفظ Gateway نص المساعد الجزئي المُجهَض في سجل النص المنسوخ عند وجود مخرجات مخزنة مؤقتًا.
- تتضمن الإدخالات المحفوظة بيانات وصفية للإجهاض حتى يستطيع مستهلكو النص المنسوخ تمييز الأجزاء الجزئية الناتجة عن الإجهاض من مخرجات الاكتمال العادية.
</Accordion>
</AccordionGroup>
## تثبيت PWA والدفع عبر الويب
تأتي واجهة التحكم مع `manifest.webmanifest` وعامل خدمة، لذلك يمكن للمتصفحات الحديثة تثبيتها كتطبيق PWA مستقل. يتيح Web Push لـ Gateway إيقاظ PWA المثبّت بإشعارات حتى عندما لا تكون علامة التبويب أو نافذة المتصفح مفتوحة.
تتضمن Control UI ملف `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` | نقاط نهاية اشتراك المتصفح المحفوظة. |
| ---------------------------------------------------- | ------------------------------------------------------------------ |
| `ui/public/manifest.webmanifest` | بيان PWA. تعرض المتصفحات "Install app" بمجرد أن يصبح قابلًا للوصول. |
| `ui/public/sw.js` | عامل خدمة يتعامل مع أحداث `push` ونقرات الإشعارات. |
| `push/vapid-keys.json` (ضمن دليل حالة OpenClaw) | زوج مفاتيح VAPID يُنشأ تلقائيًا ويُستخدم لتوقيع حمولات Web Push. |
| `push/web-push-subscriptions.json` | نقاط نهاية اشتراك المتصفح المحفوظة. |
تجاوز زوج مفاتيح VAPID عبر متغيرات البيئة في عملية Gateway عندما تريد تثبيت المفاتيح (لعمليات النشر متعددة المضيفين، أو تدوير الأسرار، أو الاختبارات):
تجاوز زوج مفاتيح VAPID عبر متغيرات البيئة على عملية Gateway عندما تريد تثبيت المفاتيح (لعمليات النشر متعددة المضيفين، أو تدوير الأسرار، أو الاختبارات):
- `OPENCLAW_VAPID_PUBLIC_KEY`
- `OPENCLAW_VAPID_PRIVATE_KEY`
- `OPENCLAW_VAPID_SUBJECT` (الافتراضي هو `mailto:openclaw@localhost`)
- `OPENCLAW_VAPID_SUBJECT` (الافتراضي `mailto:openclaw@localhost`)
تستخدم واجهة التحكم طرق Gateway هذه المقيّدة بالنطاق لتسجيل اشتراكات المتصفح واختبارها:
تستخدم Control UI طرق Gateway هذه المقيدة بالنطاق لتسجيل اشتراكات المتصفح واختبارها:
- `push.web.vapidPublicKey` — يجلب مفتاح VAPID العام النشط.
- `push.web.subscribe` — يسجل `endpoint` بالإضافة إلى `keys.p256dh`/`keys.auth`.
- `push.web.subscribe` — يسجل `endpoint` إضافة إلى `keys.p256dh`/`keys.auth`.
- `push.web.unsubscribe` — يزيل نقطة نهاية مسجلة.
- `push.web.test` — يرسل إشعار اختبار إلى اشتراك المستدعي.
<Note>
Web Push مستقل عن مسار ترحيل iOS APNS (راجع [الإعداد](/ar/gateway/configuration) للدفع المدعوم بالترحيل) وعن طريقة `push.test` الحالية، التي تستهدف إقران الأجهزة المحمولة الأصلية.
Web Push مستقل عن مسار ترحيل APNS في iOS (راجع [الإعداد](/ar/gateway/configuration) للدفع المدعوم بالترحيل) وعن طريقة `push.test` الحالية، التي تستهدف إقران الأجهزة المحمولة الأصلية.
</Note>
## التضمينات المستضافة
يمكن لرسائل المساعد عرض محتوى ويب مستضاف مضمنًا باستخدام الرمز القصير `[embed ...]`. تتحكم `gateway.controlUi.embedSandbox` في سياسة عزل iframe:
يمكن لرسائل المساعد عرض محتوى ويب مستضاف مضمنًا باستخدام الرمز المختصر `[embed ...]`. تتحكم `gateway.controlUi.embedSandbox` في سياسة صندوق عزل iframe:
<Tabs>
<Tab title="strict">
يعطّل تنفيذ السكربتات داخل التضمينات المستضافة.
يعطل تنفيذ البرامج النصية داخل التضمينات المستضافة.
</Tab>
<Tab title="scripts (default)">
يسمح بالتضمينات التفاعلية مع الحفاظ على عزل الأصل؛ وهذا هو الإعداد الافتراضي ويكفي عادةً لألعاب/ودجات المتصفح المستقلة.
</Tab>
<Tab title="trusted">
يضيف `allow-same-origin` فوق `allow-scripts` للمستندات من الموقع نفسه التي تحتاج عمدًا إلى امتيازات أقوى.
يضيف `allow-same-origin` فوق `allow-scripts` للمستندات من الموقع نفسه التي تحتاج عمدًا إلى صلاحيات أقوى.
</Tab>
</Tabs>
@ -250,14 +251,14 @@ Web Push مستقل عن مسار ترحيل iOS APNS (راجع [الإعداد]
```
<Warning>
استخدم `trusted` فقط عندما يحتاج المستند المضمّن فعلًا إلى سلوك الأصل نفسه. بالنسبة إلى معظم الألعاب واللوحات التفاعلية التي ينشئها الوكيل، يكون `scripts` هو الخيار الأكثر أمانًا.
استخدم `trusted` فقط عندما يحتاج المستند المضمّن فعلًا إلى سلوك الأصل نفسه. بالنسبة إلى معظم الألعاب واللوحات التفاعلية التي ينشئها الوكيل، يكون `scripts` الخيار الأكثر أمانًا.
</Warning>
تبقى عناوين URL للتضمين الخارجية المطلقة `http(s)` محظورة افتراضيًا. إذا كنت تريد عمدًا أن يحمّل `[embed url="https://..."]` صفحات تابعة لجهات خارجية، فعيّن `gateway.controlUi.allowExternalEmbedUrls: true`.
تبقى عناوين URL الخارجية المطلقة من نوع `http(s)` للتضمين محظورة افتراضيًا. إذا كنت تريد عمدًا أن يحمّل `[embed url="https://..."]` صفحات تابعة لجهات خارجية، فاضبط `gateway.controlUi.allowExternalEmbedUrls: true`.
## عرض رسالة الدردشة
تستخدم رسائل الدردشة المجمّعة حدًا أقصى افتراضيًا مقروءًا للعرض. يمكن لعمليات النشر على الشاشات العريضة تجاوزه دون تصحيح CSS المضمّن بتعيين `gateway.controlUi.chatMessageMaxWidth`:
تستخدم رسائل الدردشة المجمعة حدًا أقصى افتراضيًا للعرض يسهل قراءته. يمكن لعمليات النشر على الشاشات العريضة تجاوزه دون تعديل CSS المضمنة، وذلك بضبط `gateway.controlUi.chatMessageMaxWidth`:
```json5
{
@ -269,13 +270,13 @@ Web Push مستقل عن مسار ترحيل iOS APNS (راجع [الإعداد]
}
```
تُتحقق القيمة قبل وصولها إلى المتصفح. تشمل القيم المدعومة الأطوال والنسب المئوية البسيطة مثل `960px` أو `82%`، بالإضافة إلى تعبيرات عرض مقيّدة مثل `min(...)` و`max(...)` و`clamp(...)` و`calc(...)` و`fit-content(...)`.
تُتحقق القيمة قبل أن تصل إلى المتصفح. تشمل القيم المدعومة الأطوال والنسب المئوية البسيطة مثل `960px` أو `82%`، إضافة إلى تعبيرات العرض المقيدة `min(...)` و`max(...)` و`clamp(...)` و`calc(...)` و`fit-content(...)`.
## وصول tailnet (موصى به)
## الوصول إلى tailnet (موصى به)
<Tabs>
<Tab title="خدمة Tailscale Serve المدمجة (مفضلة)">
أبقِ Gateway على local loopback ودع Tailscale Serve يوكّله عبر HTTPS:
<Tab title="Tailscale Serve المدمج (مفضل)">
أبقِ Gateway على loopback ودع Tailscale Serve يوكّله عبر HTTPS:
```bash
openclaw gateway --tailscale serve
@ -283,14 +284,14 @@ Web Push مستقل عن مسار ترحيل iOS APNS (راجع [الإعداد]
افتح:
- `https://<magicdns>/` (أو `gateway.controlUi.basePath` الذي قمت بتكوينه)
- `https://<magicdns>/` (أو `gateway.controlUi.basePath` الذي ضبطته)
افتراضيًا، يمكن لمتطلبات Serve الخاصة بواجهة التحكم/WebSocket المصادقة عبر ترويسات هوية Tailscale (`tailscale-user-login`) عندما تكون `gateway.auth.allowTailscale` هي `true`. يتحقق OpenClaw من الهوية بحل عنوان `x-forwarded-for` باستخدام `tailscale whois` ومطابقته مع الترويسة، ولا يقبلها إلا عندما يصل الطلب إلى local loopback مع ترويسات `x-forwarded-*` الخاصة بـ Tailscale. بالنسبة إلى جلسات مشغّل واجهة التحكم ذات هوية جهاز المتصفح، يتجاوز مسار Serve المتحقق هذا أيضًا رحلة إقران الجهاز؛ أما المتصفحات بلا جهاز واتصالات دور العقدة فتظل تتبع فحوصات الجهاز العادية. عيّن `gateway.auth.allowTailscale: false` إذا كنت تريد طلب بيانات اعتماد سر مشترك صريحة حتى لحركة Serve. ثم استخدم `gateway.auth.mode: "token"` أو `"password"`.
افتراضيًا، يمكن لمتطلبات Control UI/WebSocket Serve المصادقة عبر ترويسات هوية Tailscale (`tailscale-user-login`) عندما تكون `gateway.auth.allowTailscale` هي `true`. يتحقق OpenClaw من الهوية بحل عنوان `x-forwarded-for` باستخدام `tailscale whois` ومطابقته مع الترويسة، ولا يقبلها إلا عندما يصل الطلب إلى loopback مع ترويسات Tailscale من نوع `x-forwarded-*`. بالنسبة إلى جلسات مشغل Control UI ذات هوية جهاز المتصفح، يتجاوز مسار Serve المتحقق هذا أيضًا رحلة إقران الجهاز؛ أما المتصفحات بلا جهاز واتصالات دور العقدة فتظل تتبع فحوصات الجهاز العادية. اضبط `gateway.auth.allowTailscale: false` إذا كنت تريد طلب بيانات اعتماد سر مشترك صريحة حتى لحركة Serve. ثم استخدم `gateway.auth.mode: "token"` أو `"password"`.
بالنسبة إلى مسار هوية Serve غير المتزامن هذا، تُسلسَل محاولات المصادقة الفاشلة لنفس IP العميل ونطاق المصادقة قبل كتابات حد المعدل. لذلك يمكن أن تعرض المحاولات السيئة المتزامنة من المتصفح نفسه `retry later` في الطلب الثاني بدلًا من تسابق عدم تطابقين عاديين بالتوازي.
بالنسبة إلى مسار هوية Serve غير المتزامن هذا، تُسلسَل محاولات المصادقة الفاشلة لعنوان IP العميل ونطاق المصادقة نفسيهما قبل كتابات حد المعدل. لذلك يمكن أن تُظهر محاولات إعادة المحاولة السيئة المتزامنة من المتصفح نفسه `retry later` في الطلب الثاني بدلًا من عدم تطابقين عاديين يتسابقان بالتوازي.
<Warning>
تفترض مصادقة Serve بلا رمز أن مضيف Gateway موثوق به. إذا كان قد يعمل كود محلي غير موثوق على ذلك المضيف، فاطلب مصادقة برمز/كلمة مرور.
تفترض مصادقة Serve بلا رمز أن مضيف Gateway موثوق. إذا كان من الممكن تشغيل تعليمات برمجية محلية غير موثوقة على ذلك المضيف، فاطلب مصادقة برمز/كلمة مرور.
</Warning>
</Tab>
@ -301,30 +302,30 @@ Web Push مستقل عن مسار ترحيل iOS APNS (راجع [الإعداد]
ثم افتح:
- `http://<tailscale-ip>:18789/` (أو `gateway.controlUi.basePath` الذي قمت بتكوينه)
- `http://<tailscale-ip>:18789/` (أو `gateway.controlUi.basePath` الذي ضبطته)
الصق السر المشترك المطابق في إعدادات واجهة المستخدم (يُرسل كـ `connect.params.auth.token` أو `connect.params.auth.password`).
</Tab>
</Tabs>
## HTTP غير آمن
## HTTP غير الآمن
إذا فتحت لوحة المعلومات عبر HTTP عادي (`http://<lan-ip>` أو `http://<tailscale-ip>`)، يعمل المتصفح في **سياق غير آمن** ويحظر WebCrypto. افتراضيًا، **يحظر** OpenClaw اتصالات واجهة التحكم من دون هوية جهاز.
إذا فتحت لوحة المعلومات عبر HTTP عادي (`http://<lan-ip>` أو `http://<tailscale-ip>`)، يعمل المتصفح في **سياق غير آمن** ويحظر WebCrypto. افتراضيًا، **يحظر** OpenClaw اتصالات Control UI دون هوية جهاز.
الاستثناءات الموثقة:
- توافق HTTP غير الآمن الخاص بـ localhost فقط مع `gateway.controlUi.allowInsecureAuth=true`
- نجاح مصادقة واجهة تحكم المشغّل عبر `gateway.auth.mode: "trusted-proxy"`
- نجاح مصادقة مشغل Control UI عبر `gateway.auth.mode: "trusted-proxy"`
- خيار الطوارئ `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
**الإصلاح الموصى به:** استخدم HTTPS (Tailscale Serve) أو افتح واجهة المستخدم محليًا:
**الإصلاح الموصى به:** استخدم HTTPS (Tailscale Serve) أو افتح الواجهة محليًا:
- `https://<magicdns>/` (Serve)
- `http://127.0.0.1:18789/` (على مضيف Gateway)
<AccordionGroup>
<Accordion title="سلوك مفتاح المصادقة غير الآمنة">
<Accordion title="سلوك تبديل المصادقة غير الآمنة">
```json5
{
gateway: {
@ -337,7 +338,7 @@ Web Push مستقل عن مسار ترحيل iOS APNS (راجع [الإعداد]
`allowInsecureAuth` هو مفتاح توافق محلي فقط:
- يسمح لجلسات واجهة مستخدم التحكم على localhost بالمتابعة من دون هوية جهاز في سياقات HTTP غير الآمنة.
- يسمح لجلسات واجهة التحكم على localhost بالمتابعة دون هوية الجهاز في سياقات HTTP غير الآمنة.
- لا يتجاوز فحوصات الإقران.
- لا يخفف متطلبات هوية الجهاز البعيد (غير localhost).
@ -354,13 +355,13 @@ Web Push مستقل عن مسار ترحيل iOS APNS (راجع [الإعداد]
```
<Warning>
يعطل `dangerouslyDisableDeviceAuth` فحوصات هوية جهاز واجهة مستخدم التحكم، وهو تخفيض أمني شديد الخطورة. أعده سريعًا بعد الاستخدام الطارئ.
يعطل `dangerouslyDisableDeviceAuth` فحوصات هوية الجهاز في واجهة التحكم، وهو خفض أمني شديد. أعده سريعًا بعد الاستخدام الطارئ.
</Warning>
</Accordion>
<Accordion title="ملاحظة الوكيل الموثوق">
- يمكن لمصادقة الوكيل الموثوق الناجحة قبول جلسات واجهة مستخدم التحكم الخاصة بـ **المشغّل** من دون هوية جهاز.
- لا يمتد هذا إلى جلسات واجهة مستخدم التحكم ذات دور node.
- يمكن لمصادقة الوكيل الموثوق الناجحة إدخال جلسات واجهة التحكم الخاصة بـ **المشغل** دون هوية الجهاز.
- هذا **لا** يمتد إلى جلسات واجهة التحكم ذات دور العقدة.
- لا تزال وكلاء reverse proxy عبر loopback على المضيف نفسه لا تستوفي مصادقة الوكيل الموثوق؛ راجع [مصادقة الوكيل الموثوق](/ar/gateway/trusted-proxy-auth).
</Accordion>
@ -370,46 +371,46 @@ Web Push مستقل عن مسار ترحيل iOS APNS (راجع [الإعداد]
## سياسة أمان المحتوى
تأتي واجهة مستخدم التحكم مع سياسة `img-src` محكمة: لا يُسمح إلا بأصول **نفس المصدر**، وروابط URL من نوع `data:`، وروابط URL من نوع `blob:` المنشأة محليًا. يرفض المتصفح روابط صور `http(s)` البعيدة والروابط النسبية إلى البروتوكول، ولا يصدر طلبات جلب عبر الشبكة.
تأتي واجهة التحكم مع سياسة `img-src` صارمة: يُسمح فقط بالأصول من **نفس المصدر**، وعناوين URL من نوع `data:`، وعناوين URL من نوع `blob:` المنشأة محليًا. يرفض المتصفح عناوين URL البعيدة من نوع `http(s)` والعناوين النسبية إلى البروتوكول، ولا يصدر طلبات جلب شبكية.
ما يعنيه ذلك عمليًا:
- لا تزال الصور الرمزية والصور المقدمة ضمن مسارات نسبية (على سبيل المثال `/avatars/<id>`) تُعرض، بما في ذلك مسارات الصور الرمزية المصادق عليها التي تجلبها واجهة المستخدم وتحولها إلى روابط URL محلية من نوع `blob:`.
- لا تزال روابط URL المضمنة من نوع `data:image/...` تُعرض (مفيدة للحمولات داخل البروتوكول).
- لا تزال روابط URL المحلية من نوع `blob:` التي تنشئها واجهة مستخدم التحكم تُعرض.
- تُزال روابط الصور الرمزية البعيدة التي تصدرها بيانات تعريف القناة عند مساعدين الصور الرمزية في واجهة مستخدم التحكم وتُستبدل بالشعار/الشارة المدمجة، لذلك لا تستطيع قناة مخترقة أو خبيثة فرض عمليات جلب صور بعيدة عشوائية من متصفح المشغّل.
- لا تزال الصور الرمزية والصور المقدمة ضمن مسارات نسبية (على سبيل المثال `/avatars/<id>`) تُعرض، بما في ذلك مسارات الصور الرمزية المصادق عليها التي تجلبها الواجهة وتحولها إلى عناوين URL محلية من نوع `blob:`.
- لا تزال عناوين URL المضمنة `data:image/...` تُعرض (مفيدة للحمولات داخل البروتوكول).
- لا تزال عناوين URL المحلية من نوع `blob:` التي تنشئها واجهة التحكم تُعرض.
- تُزال عناوين URL البعيدة للصور الرمزية التي تصدرها بيانات تعريف القناة عند مساعدات الصور الرمزية في واجهة التحكم وتُستبدل بالشعار/الشارة المدمجة، لذلك لا يمكن لقناة مخترقة أو خبيثة أن تجبر متصفح المشغل على جلب صور بعيدة عشوائية.
لا تحتاج إلى تغيير أي شيء للحصول على هذا السلوك — فهو مفعّل دائمًا وغير قابل للتكوين.
لا تحتاج إلى تغيير أي شيء للحصول على هذا السلوك — فهو مفعل دائمًا وغير قابل للتكوين.
## مصادقة مسار الصورة الرمزية
عند تكوين مصادقة Gateway، تتطلب نقطة نهاية الصورة الرمزية في واجهة مستخدم التحكم رمز Gateway نفسه مثل بقية API:
عند تكوين مصادقة Gateway، تتطلب نقطة نهاية الصورة الرمزية في واجهة التحكم رمز Gateway نفسه كبقية API:
- يعيد `GET /avatar/<agentId>` صورة الصورة الرمزية للمتصلين المصادق عليهم فقط. يعيد `GET /avatar/<agentId>?meta=1` بيانات تعريف الصورة الرمزية وفق القاعدة نفسها.
- تُرفض الطلبات غير المصادق عليها إلى أي من المسارين (مطابقة لمسار وسائط المساعد المجاور). يمنع هذا مسار الصورة الرمزية من تسريب هوية الوكيل على المضيفين المحميين بخلاف ذلك.
- تمرر واجهة مستخدم التحكم نفسها رمز Gateway كترويسة bearer عند جلب الصور الرمزية، وتستخدم روابط URL مصادقًا عليها من نوع blob حتى تظل الصورة معروضة في لوحات المعلومات.
- يعيد `GET /avatar/<agentId>` صورة الصورة الرمزية للمتصلين المصادق عليهم فقط. ويعيد `GET /avatar/<agentId>?meta=1` بيانات تعريف الصورة الرمزية وفق القاعدة نفسها.
- تُرفض الطلبات غير المصادق عليها إلى أي من المسارين (مطابقة لمسار وسائط المساعد الشقيق). يمنع هذا مسار الصورة الرمزية من تسريب هوية الوكيل على المضيفين المحمية بخلاف ذلك.
- تمرر واجهة التحكم نفسها رمز Gateway كترويسة bearer عند جلب الصور الرمزية، وتستخدم عناوين URL مصادقًا عليها من نوع blob بحيث تظل الصورة معروضة في لوحات المعلومات.
إذا عطّلت مصادقة Gateway (غير موصى به على المضيفين المشتركين)، يصبح مسار الصورة الرمزية أيضًا غير مصادق عليه، بما يتماشى مع بقية Gateway.
إذا عطلت مصادقة Gateway (غير موصى به على المضيفين المشتركين)، يصبح مسار الصورة الرمزية أيضًا غير مصادق عليه، بما يتماشى مع بقية Gateway.
## مصادقة مسار وسائط المساعد
عند تكوين مصادقة Gateway، تستخدم معاينات الوسائط المحلية للمساعد مسارًا من خطوتين:
- يتطلب `GET /__openclaw__/assistant-media?meta=1&source=<path>` مصادقة مشغّل واجهة مستخدم التحكم العادية. يرسل المتصفح رمز Gateway كترويسة bearer عند التحقق من التوفر.
- تتضمن استجابات بيانات التعريف الناجحة `mediaTicket` قصير العمر ومحدد النطاق إلى مسار المصدر هذا بالضبط.
- تستخدم روابط URL للصور والصوت والفيديو والمستندات المعروضة في المتصفح `mediaTicket=<ticket>` بدلًا من رمز Gateway النشط أو كلمة المرور. تنتهي صلاحية التذكرة سريعًا ولا يمكنها تخويل مصدر مختلف.
- يتطلب `GET /__openclaw__/assistant-media?meta=1&source=<path>` مصادقة مشغل واجهة التحكم العادية. يرسل المتصفح رمز Gateway كترويسة bearer عند التحقق من التوفر.
- تتضمن استجابات بيانات التعريف الناجحة `mediaTicket` قصير العمر ومقيدًا بمسار المصدر الدقيق.
- تستخدم عناوين URL للصور والصوت والفيديو والمستندات التي يعرضها المتصفح `mediaTicket=<ticket>` بدلًا من رمز Gateway النشط أو كلمة المرور. تنتهي صلاحية التذكرة سريعًا ولا يمكنها تخويل مصدر مختلف.
يحافظ هذا على توافق عرض الوسائط العادي مع عناصر الوسائط الأصلية في المتصفح من دون وضع بيانات اعتماد Gateway القابلة لإعادة الاستخدام في روابط URL ظاهرة للوسائط.
يحافظ هذا على توافق عرض الوسائط العادي مع عناصر الوسائط الأصلية في المتصفح دون وضع بيانات اعتماد Gateway القابلة لإعادة الاستخدام في عناوين URL المرئية للوسائط.
## بناء واجهة المستخدم
## بناء الواجهة
يقدم Gateway الملفات الثابتة من `dist/control-ui`. ابنها باستخدام:
يقدم Gateway ملفات ثابتة من `dist/control-ui`. ابنها باستخدام:
```bash
pnpm ui:build
```
أساس مطلق اختياري (عندما تريد روابط URL ثابتة للأصول):
قاعدة مطلقة اختيارية (عندما تريد عناوين URL ثابتة للأصول):
```bash
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
@ -421,14 +422,14 @@ OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
pnpm ui:dev
```
ثم وجّه واجهة المستخدم إلى رابط Gateway WS الخاص بك (مثل `ws://127.0.0.1:18789`).
ثم وجّه الواجهة إلى عنوان URL الخاص بـ Gateway WS (مثل `ws://127.0.0.1:18789`).
## التصحيح/الاختبار: خادم تطوير + Gateway بعيد
## تصحيح الأخطاء/الاختبار: خادم التطوير + Gateway بعيد
واجهة مستخدم التحكم هي ملفات ثابتة؛ هدف WebSocket قابل للتكوين ويمكن أن يختلف عن أصل HTTP. هذا مفيد عندما تريد خادم تطوير Vite محليًا بينما يعمل Gateway في مكان آخر.
واجهة التحكم هي ملفات ثابتة؛ هدف WebSocket قابل للتكوين ويمكن أن يكون مختلفًا عن مصدر HTTP. هذا مفيد عندما تريد خادم تطوير Vite محليًا بينما يعمل Gateway في مكان آخر.
<Steps>
<Step title="شغّل خادم تطوير واجهة المستخدم">
<Step title="ابدأ خادم تطوير الواجهة">
```bash
pnpm ui:dev
```
@ -449,17 +450,17 @@ pnpm ui:dev
<AccordionGroup>
<Accordion title="ملاحظات">
- يُخزّن `gatewayUrl` في localStorage بعد التحميل ويُزال من رابط URL.
- إذا مررت نقطة نهاية كاملة `ws://` أو `wss://` عبر `gatewayUrl`، فقم بترميز قيمة `gatewayUrl` في رابط URL حتى يحلل المتصفح سلسلة الاستعلام بشكل صحيح.
- ينبغي تمرير `token` عبر جزء رابط URL (`#token=...`) كلما أمكن. لا تُرسل الأجزاء إلى الخادم، ما يتجنب تسربها في سجلات الطلبات وترويسة Referer. لا تزال معاملات الاستعلام القديمة `?token=` تُستورد مرة واحدة للتوافق، ولكن كخيار احتياطي فقط، وتُزال فورًا بعد bootstrap.
- يُخزن `gatewayUrl` في localStorage بعد التحميل ويُزال من عنوان URL.
- إذا مررت نقطة نهاية كاملة `ws://` أو `wss://` عبر `gatewayUrl`، فقم بترميز قيمة `gatewayUrl` كعنوان URL حتى يفسر المتصفح سلسلة الاستعلام بشكل صحيح.
- يجب تمرير `token` عبر جزء عنوان URL (`#token=...`) كلما أمكن. لا تُرسل الأجزاء إلى الخادم، مما يتجنب تسربها في سجلات الطلب وReferer. لا تزال معاملات الاستعلام القديمة `?token=` تُستورد مرة واحدة للتوافق، لكن كخيار احتياطي فقط، وتُزال فورًا بعد bootstrap.
- يُحتفظ بـ `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، لكنه وضع أمني خطير.
- عند تعيين `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>` من bind والمنفذ الفعالين وقت التشغيل، لكن مصادر المتصفح البعيدة لا تزال تحتاج إلى إدخالات صريحة.
- لا تستخدم `gateway.controlUi.allowedOrigins: ["*"]` إلا للاختبار المحلي الخاضع لرقابة صارمة. فهي تعني السماح لأي مصدر متصفح، وليس "طابق أي مضيف أستخدمه."
- يفعّل `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` وضع الرجوع إلى مصدر ترويسة Host، لكنه وضع أمني خطير.
</Accordion>
</AccordionGroup>
@ -478,9 +479,9 @@ pnpm ui:dev
تفاصيل إعداد الوصول البعيد: [الوصول البعيد](/ar/gateway/remote).
## ذات صلة
## ذو صلة
- [لوحة المعلومات](/ar/web/dashboard) — لوحة معلومات Gateway
- [فحوصات الصحة](/ar/gateway/health) — مراقبة صحة Gateway
- [TUI](/ar/web/tui) — واجهة مستخدم طرفية
- [WebChat](/ar/web/webchat) — واجهة محادثة مستندة إلى المتصفح
- [WebChat](/ar/web/webchat) — واجهة دردشة مستندة إلى المتصفح