chore(i18n): refresh ar translations
This commit is contained in:
parent
0224b19aa0
commit
788ef578e8
402
docs/ar/ci.md
402
docs/ar/ci.md
@ -1,94 +1,94 @@
|
||||
---
|
||||
read_when:
|
||||
- تحتاج إلى فهم سبب تشغيل مهمة CI أو عدم تشغيلها
|
||||
- أنت تصحّح خللًا في فحص GitHub Actions فاشل
|
||||
- أنت تنسّق تشغيل عملية التحقق من الإصدار أو إعادة تشغيلها
|
||||
- أنت تغيّر توجيه ClawSweeper أو إعادة توجيه نشاط GitHub
|
||||
summary: مخطط وظائف CI، وبوابات النطاق، ومظلات الإصدار، ومكافئات الأوامر المحلية
|
||||
title: خط أنابيب CI
|
||||
- أنت تعمل على تصحيح فحص GitHub Actions فاشل
|
||||
- أنت تنسّق تشغيل التحقق من الإصدار أو إعادة تشغيله
|
||||
- أنت تغيّر إرسال ClawSweeper أو إعادة توجيه نشاط GitHub
|
||||
summary: مخطط مهام التكامل المستمر، وبوابات النطاق، ومظلات الإصدار، ومكافئات الأوامر المحلية
|
||||
title: مسار CI
|
||||
x-i18n:
|
||||
generated_at: "2026-05-02T22:17:47Z"
|
||||
generated_at: "2026-05-02T23:39:26Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: a8033b928b26adfa340200ea69fd63d339a6e65c21659b8119a68b23b8b16016
|
||||
source_hash: 321fe0a061044f75b8e1d03b4d3e76d4f8dd2dae0ebc58831887fc20af953cf1
|
||||
source_path: ci.md
|
||||
workflow: 16
|
||||
---
|
||||
|
||||
تشغّل OpenClaw CI عند كل دفع إلى `main` وكل طلب سحب. تصنّف مهمة `preflight` الفرق وتوقف المسارات المكلفة عندما تتغير مناطق غير مرتبطة فقط. تتجاوز عمليات التشغيل اليدوية عبر `workflow_dispatch` تحديد النطاق الذكي عن قصد وتوسّع الرسم البياني الكامل لمرشحي الإصدارات والتحقق الواسع. تبقى مسارات Android اختيارية عبر `include_android`. توجد تغطية Plugin الخاصة بالإصدار فقط في سير عمل [`Plugin Prerelease`](#plugin-prerelease) المنفصل، ولا تعمل إلا من [`Full Release Validation`](#full-release-validation) أو من تشغيل يدوي صريح.
|
||||
تعمل CI الخاصة بـ OpenClaw عند كل دفع إلى `main` وكل طلب سحب. تصنّف مهمة `preflight` الفرق وتوقف المسارات المكلفة عندما تتغير مناطق غير ذات صلة فقط. تتجاوز عمليات `workflow_dispatch` اليدوية النطاق الذكي عمدًا وتوسّع الرسم البياني الكامل لمرشحي الإصدار والتحقق الواسع. تظل مسارات Android اختيارية عبر `include_android`. تغطية Plugin الخاصة بالإصدار فقط موجودة في سير العمل المنفصل [`Plugin Prerelease`](#plugin-prerelease)، ولا تعمل إلا من [`Full Release Validation`](#full-release-validation) أو من تشغيل يدوي صريح.
|
||||
|
||||
## نظرة عامة على خط المعالجة
|
||||
## نظرة عامة على المسار
|
||||
|
||||
| المهمة | الغرض | متى تعمل |
|
||||
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ---------------------------------- |
|
||||
| `preflight` | اكتشاف تغييرات التوثيق فقط، والنطاقات المتغيرة، والإضافات المتغيرة، وبناء بيان CI | دائمًا عند الدفعات وطلبات السحب غير المسودة |
|
||||
| `security-scm-fast` | اكتشاف المفاتيح الخاصة وتدقيق سير العمل عبر `zizmor` | دائمًا عند الدفعات وطلبات السحب غير المسودة |
|
||||
| `security-dependency-audit` | تدقيق ملف قفل الإنتاج، من دون اعتماديات، مقابل تحذيرات npm | دائمًا عند الدفعات وطلبات السحب غير المسودة |
|
||||
| `security-fast` | تجميع مطلوب لمهام الأمان السريعة | دائمًا عند الدفعات وطلبات السحب غير المسودة |
|
||||
| `check-dependencies` | تمرير Knip الخاص باعتماديات الإنتاج فقط، بالإضافة إلى حارس قائمة السماح للملفات غير المستخدمة | تغييرات مرتبطة بـ Node |
|
||||
| `build-artifacts` | بناء `dist/`، وواجهة التحكم، وفحوصات القطع المبنية، والقطع القابلة لإعادة الاستخدام في المراحل اللاحقة | تغييرات مرتبطة بـ Node |
|
||||
| `checks-fast-core` | مسارات صحة Linux السريعة مثل فحوصات المضمّن/عقد Plugin/البروتوكول | تغييرات مرتبطة بـ Node |
|
||||
| `checks-fast-contracts-channels` | فحوصات عقد القنوات المجزأة مع نتيجة فحص تجميعية مستقرة | تغييرات مرتبطة بـ Node |
|
||||
| `checks-node-core-test` | أجزاء اختبارات Node الأساسية، باستثناء مسارات القنوات، والمضمّن، والعقود، والإضافات | تغييرات مرتبطة بـ Node |
|
||||
| `check` | المكافئ المجزأ للبوابة المحلية الرئيسية: أنواع الإنتاج، والفحص، والحراس، وأنواع الاختبارات، واختبار الدخان الصارم | تغييرات مرتبطة بـ Node |
|
||||
| `check-additional` | أجزاء البنية، والحدود، وانحراف لقطات الموجهات، وحراس سطح الإضافات، وحدود الحزم، ومراقبة Gateway | تغييرات مرتبطة بـ Node |
|
||||
| `build-smoke` | اختبارات دخان CLI المبني واختبار دخان ذاكرة بدء التشغيل | تغييرات مرتبطة بـ Node |
|
||||
| `checks` | أداة تحقق لاختبارات قنوات القطع المبنية | تغييرات مرتبطة بـ Node |
|
||||
| `checks-node-compat-node22` | مسار بناء ودخان لتوافق Node 22 | تشغيل CI يدوي للإصدارات |
|
||||
| `check-docs` | تنسيق التوثيق وفحصه وفحوصات الروابط المعطلة | عند تغير التوثيق |
|
||||
| `skills-python` | Ruff + pytest للـ Skills المدعومة بـ Python | تغييرات مرتبطة بـ Skills الخاصة بـ Python |
|
||||
| `checks-windows` | اختبارات عمليات/مسارات خاصة بـ Windows، بالإضافة إلى انحدارات محددات استيراد وقت التشغيل المشتركة | تغييرات مرتبطة بـ Windows |
|
||||
| `macos-node` | مسار اختبارات TypeScript على macOS باستخدام القطع المبنية المشتركة | تغييرات مرتبطة بـ macOS |
|
||||
| `macos-swift` | فحص Swift وبناؤه واختباراته لتطبيق macOS | تغييرات مرتبطة بـ macOS |
|
||||
| `android` | اختبارات وحدة Android لكلا النكهتين، بالإضافة إلى بناء APK تصحيح واحد | تغييرات مرتبطة بـ Android |
|
||||
| `test-performance-agent` | تحسين يومي لاختبارات Codex البطيئة بعد نشاط موثوق | نجاح CI الرئيسي أو تشغيل يدوي |
|
||||
| `openclaw-performance` | تقارير أداء وقت تشغيل Kova يومية/عند الطلب مع مسارات مزود وهمي، وملف تعريف عميق، وGPT 5.4 مباشر | تشغيل مجدول ويدوي |
|
||||
| المهمة | الغرض | متى تعمل |
|
||||
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ---------------------------------- |
|
||||
| `preflight` | اكتشاف تغييرات الوثائق فقط، والنطاقات المتغيرة، والإضافات المتغيرة، وبناء بيان CI | دائمًا في الدفعات وطلبات السحب غير المسودة |
|
||||
| `security-scm-fast` | اكتشاف المفاتيح الخاصة وتدقيق سير العمل عبر `zizmor` | دائمًا في الدفعات وطلبات السحب غير المسودة |
|
||||
| `security-dependency-audit` | تدقيق ملف قفل الإنتاج دون تبعيات مقابل إرشادات npm الأمنية | دائمًا في الدفعات وطلبات السحب غير المسودة |
|
||||
| `security-fast` | تجميع مطلوب لمهام الأمان السريعة | دائمًا في الدفعات وطلبات السحب غير المسودة |
|
||||
| `check-dependencies` | تمرير Knip الخاص بتبعيات الإنتاج فقط إضافة إلى حارس قائمة السماح للملفات غير المستخدمة | تغييرات ذات صلة بـ Node |
|
||||
| `build-artifacts` | بناء `dist/` وواجهة Control UI وفحوصات القطع المبنية والقطع القابلة لإعادة الاستخدام للمراحل اللاحقة | تغييرات ذات صلة بـ Node |
|
||||
| `checks-fast-core` | مسارات صحة سريعة على Linux مثل فحوصات المضمّن/عقد Plugin/البروتوكول | تغييرات ذات صلة بـ Node |
|
||||
| `checks-fast-contracts-channels` | فحوصات عقود القنوات الموزعة على أجزاء مع نتيجة فحص تجميعية مستقرة | تغييرات ذات صلة بـ Node |
|
||||
| `checks-node-core-test` | أجزاء اختبارات Node الأساسية، باستثناء مسارات القنوات والمضمّن والعقود والإضافات | تغييرات ذات صلة بـ Node |
|
||||
| `check` | مكافئ البوابة المحلية الرئيسية الموزعة: أنواع الإنتاج، والفحص، والحراس، وأنواع الاختبارات، واختبار smoke صارم | تغييرات ذات صلة بـ Node |
|
||||
| `check-additional` | البنية، والحدود، وانحراف لقطات المطالبات، وحراس سطح الإضافات، وحدود الحزم، وأجزاء مراقبة Gateway | تغييرات ذات صلة بـ Node |
|
||||
| `build-smoke` | اختبارات smoke لواجهة CLI المبنية واختبار smoke لذاكرة بدء التشغيل | تغييرات ذات صلة بـ Node |
|
||||
| `checks` | متحقق لاختبارات قناة القطع المبنية | تغييرات ذات صلة بـ Node |
|
||||
| `checks-node-compat-node22` | مسار بناء وتحقق smoke لتوافق Node 22 | تشغيل CI يدوي للإصدارات |
|
||||
| `check-docs` | تنسيق الوثائق، والفحص، وفحوصات الروابط المعطلة | عند تغيّر الوثائق |
|
||||
| `skills-python` | Ruff + pytest للـ Skills المدعومة بـ Python | تغييرات ذات صلة بـ Skills الخاصة بـ Python |
|
||||
| `checks-windows` | اختبارات العمليات/المسارات الخاصة بـ Windows إضافة إلى تراجعات محددات استيراد وقت التشغيل المشتركة | تغييرات ذات صلة بـ Windows |
|
||||
| `macos-node` | مسار اختبار TypeScript على macOS باستخدام القطع المبنية المشتركة | تغييرات ذات صلة بـ macOS |
|
||||
| `macos-swift` | فحص Swift وبناؤه واختباراته لتطبيق macOS | تغييرات ذات صلة بـ macOS |
|
||||
| `android` | اختبارات وحدات Android لكلا النكهتين إضافة إلى بناء APK debug واحد | تغييرات ذات صلة بـ Android |
|
||||
| `test-performance-agent` | تحسين يومي لاختبارات Codex البطيئة بعد نشاط موثوق | نجاح CI الرئيسي أو تشغيل يدوي |
|
||||
| `openclaw-performance` | تقارير أداء يومية/عند الطلب لوقت تشغيل Kova مع مسارات مزود وهمي، وملف تعريف عميق، وGPT 5.4 مباشر | تشغيل مجدول ويدوي |
|
||||
|
||||
## ترتيب الإخفاق السريع
|
||||
## ترتيب الفشل السريع
|
||||
|
||||
1. يقرر `preflight` أي المسارات موجودة أصلًا. منطق `docs-scope` و`changed-scope` خطوات داخل هذه المهمة، وليس مهامًا مستقلة.
|
||||
2. تفشل `security-scm-fast` و`security-dependency-audit` و`security-fast` و`check` و`check-additional` و`check-docs` و`skills-python` بسرعة من دون انتظار مهام القطع ومصفوفة المنصات الأثقل.
|
||||
3. يتداخل `build-artifacts` مع مسارات Linux السريعة حتى تتمكن الجهات المستهلكة اللاحقة من البدء بمجرد جاهزية البناء المشترك.
|
||||
1. تقرر `preflight` أي المسارات موجودة أصلًا. منطق `docs-scope` و`changed-scope` عبارة عن خطوات داخل هذه المهمة، وليست مهامًا مستقلة.
|
||||
2. تفشل `security-scm-fast` و`security-dependency-audit` و`security-fast` و`check` و`check-additional` و`check-docs` و`skills-python` بسرعة دون انتظار مهام القطع ومصفوفة المنصات الأثقل.
|
||||
3. تتداخل `build-artifacts` مع مسارات Linux السريعة بحيث يمكن للمستهلكين اللاحقين البدء بمجرد أن يصبح البناء المشترك جاهزًا.
|
||||
4. تتوسع مسارات المنصات ووقت التشغيل الأثقل بعد ذلك: `checks-fast-core` و`checks-fast-contracts-channels` و`checks-node-core-test` و`checks` و`checks-windows` و`macos-node` و`macos-swift` و`android`.
|
||||
|
||||
قد يعلّم GitHub المهام التي تجاوزها تشغيل أحدث على أنها `cancelled` عندما تصل دفعة أحدث إلى طلب السحب نفسه أو مرجع `main`. تعامل مع ذلك كضجيج CI ما لم يكن أحدث تشغيل للمرجع نفسه يفشل أيضًا. تستخدم فحوصات الأجزاء التجميعية `!cancelled() && always()` حتى تظل تبلغ عن إخفاقات الأجزاء العادية، لكنها لا تدخل الطابور بعد أن يكون سير العمل كله قد تجاوزه تشغيل أحدث. مفتاح التزامن التلقائي لـ CI ذو إصدار (`CI-v7-*`) حتى لا يستطيع عمل عالق من جهة GitHub في مجموعة طابور قديمة حظر تشغيلات main الأحدث إلى أجل غير مسمى. تستخدم عمليات التشغيل اليدوية للحزمة الكاملة `CI-manual-v1-*` ولا تلغي عمليات التشغيل الجارية.
|
||||
قد يعلّم GitHub المهام التي تجاوزتها دفعة أحدث على أنها `cancelled` عندما تصل دفعة أحدث إلى طلب السحب نفسه أو مرجع `main`. تعامل مع ذلك كضجيج CI ما لم تكن أحدث عملية تشغيل للمرجع نفسه تفشل أيضًا. تستخدم فحوصات الأجزاء التجميعية `!cancelled() && always()` كي تظل تبلغ عن إخفاقات الأجزاء العادية، لكنها لا تصطف بعد أن يكون سير العمل بأكمله قد تجاوزه تشغيل أحدث. مفتاح تزامن CI التلقائي ذو إصدار (`CI-v7-*`) بحيث لا يستطيع عالق من جهة GitHub في مجموعة انتظار قديمة حظر عمليات تشغيل main الأحدث إلى أجل غير مسمى. تستخدم عمليات التشغيل اليدوية للمجموعة الكاملة `CI-manual-v1-*` ولا تلغي العمليات الجارية.
|
||||
|
||||
## النطاق والتوجيه
|
||||
|
||||
يوجد منطق النطاق في `scripts/ci-changed-scope.mjs` وتغطيه اختبارات وحدة في `src/scripts/ci-changed-scope.test.ts`. يتخطى التشغيل اليدوي اكتشاف النطاق المتغير ويجعل بيان preflight يتصرف كما لو أن كل منطقة محددة النطاق قد تغيرت.
|
||||
يوجد منطق النطاق في `scripts/ci-changed-scope.mjs` وتغطيه اختبارات وحدات في `src/scripts/ci-changed-scope.test.ts`. يتجاوز التشغيل اليدوي اكتشاف النطاق المتغير ويجعل بيان preflight يتصرف كما لو أن كل منطقة ذات نطاق قد تغيرت.
|
||||
|
||||
- **تعديلات سير عمل CI** تتحقق من رسم CI الخاص بـ Node بالإضافة إلى فحص سير العمل، لكنها لا تفرض بنفسها بناءات Windows أو Android أو macOS الأصلية؛ تبقى مسارات هذه المنصات محددة بتغييرات مصدر المنصة.
|
||||
- **تعديلات التوجيه فقط في CI، وتعديلات تجهيزات اختبارات أساسية رخيصة محددة، وتعديلات ضيقة لمساعدات/توجيه اختبارات عقد Plugin** تستخدم مسار بيان سريعًا خاصًا بـ Node فقط: `preflight`، والأمان، ومهمة `checks-fast-core` واحدة. يتخطى ذلك المسار قطع البناء، وتوافق Node 22، وعقود القنوات، وأجزاء النواة الكاملة، وأجزاء Plugin المضمّنة، ومصفوفات الحراس الإضافية عندما يقتصر التغيير على أسطح التوجيه أو المساعدة التي تمرنها المهمة السريعة مباشرة.
|
||||
- **فحوصات Node على Windows** محددة بنطاق أغلفة العمليات/المسارات الخاصة بـ Windows، ومساعدات مشغلات npm/pnpm/UI، وإعدادات مدير الحزم، وأسطر سير عمل CI التي تنفذ ذلك المسار؛ تبقى تغييرات المصدر وPlugin واختبارات دخان التثبيت والتغييرات الخاصة بالاختبارات فقط غير المرتبطة على مسارات Node الخاصة بـ Linux.
|
||||
- **تعديلات سير عمل CI** تتحقق من رسم CI الخاص بـ Node إضافة إلى فحص سير العمل، لكنها لا تجبر بذاتها بناءات Windows أو Android أو macOS الأصلية؛ تظل مسارات تلك المنصات محصورة في تغييرات مصدر المنصة.
|
||||
- **تعديلات توجيه CI فقط، وتعديلات مختارة ورخيصة على تجهيزات اختبارات core، وتعديلات ضيقة على مساعدي/توجيه اختبارات عقد Plugin** تستخدم مسار بيان سريع خاص بـ Node فقط: `preflight`، والأمان، ومهمة `checks-fast-core` واحدة. يتجاوز هذا المسار قطع البناء، وتوافق Node 22، وعقود القنوات، وكل أجزاء core الكاملة، وأجزاء Plugin المضمّنة، ومصفوفات الحراس الإضافية عندما يكون التغيير محدودًا بأسطح التوجيه أو المساعدين التي تختبرها المهمة السريعة مباشرة.
|
||||
- **فحوصات Windows Node** محصورة في أغلفة العمليات/المسارات الخاصة بـ Windows، ومساعدي مشغلات npm/pnpm/UI، وتكوين مدير الحزم، وأسطح سير عمل CI التي تنفذ ذلك المسار؛ تبقى تغييرات المصدر وPlugin واختبار التثبيت وتغييرات الاختبارات فقط غير ذات الصلة على مسارات Linux Node.
|
||||
|
||||
تُقسّم أو توازن أبطأ عائلات اختبارات Node بحيث يبقى كل عمل صغيرًا من دون حجز زائد للمشغلات: تعمل عقود القنوات كثلاثة أجزاء موزونة، وتقترن مسارات وحدات النواة الصغيرة، ويعمل الرد التلقائي كأربعة عاملين متوازنين (مع تقسيم شجرة الرد الفرعية إلى أجزاء agent-runner، والإرسال، والأوامر/توجيه الحالة)، وتوزّع إعدادات Gateway/Plugin ذات الطابع الوكيل عبر مهام Node الوكيلية الحالية الخاصة بالمصدر فقط بدلًا من انتظار القطع المبنية. تستخدم اختبارات المتصفح وQA والوسائط وPlugin المتفرقة الواسعة إعدادات Vitest المخصصة لها بدلًا من ملتقط Plugin المشترك العام. تسجل أجزاء أنماط التضمين إدخالات التوقيت باستخدام اسم جزء CI، بحيث يستطيع `.artifacts/vitest-shard-timings.json` تمييز إعداد كامل من جزء مفلتر. يبقي `check-additional` عمل ترجمة/كناري حدود الحزم معًا ويفصل بنية طوبولوجيا وقت التشغيل عن تغطية مراقبة Gateway؛ يشغّل جزء حارس الحدود حراسه المستقلين الصغار بالتوازي داخل مهمة واحدة، بما في ذلك `pnpm prompt:snapshots:check` حتى يُثبّت انحراف موجهات المسار الناجح في Codex إلى طلب السحب الذي سببه. تعمل مراقبة Gateway واختبارات القنوات وجزء حدود دعم النواة بالتوازي داخل `build-artifacts` بعد بناء `dist/` و`dist-runtime/` بالفعل.
|
||||
تُقسّم أو تُوازن أبطأ عائلات اختبارات Node بحيث تبقى كل مهمة صغيرة دون حجز زائد للمشغلات: تعمل عقود القنوات كثلاثة أجزاء موزونة، وتقترن مسارات وحدات core الصغيرة، ويعمل الرد التلقائي كأربعة عمال متوازنين (مع تقسيم شجرة الرد الفرعية إلى أجزاء agent-runner وdispatch وcommands/state-routing)، وتوزّع تكوينات Gateway/Plugin الوكيلة عبر مهام Node الوكيلة الحالية الخاصة بالمصدر فقط بدل انتظار القطع المبنية. تستخدم اختبارات المتصفح وQA والوسائط وPlugin المتنوعة والواسعة تكوينات Vitest المخصصة لها بدل تجميع Plugin المشترك العام. تسجل أجزاء أنماط التضمين إدخالات توقيت باستخدام اسم جزء CI، بحيث يمكن لـ `.artifacts/vitest-shard-timings.json` التمييز بين تكوين كامل وجزء مرشح. تبقي `check-additional` عمل تجميع/اختبار حدود الحزم معًا وتفصل بنية طوبولوجيا وقت التشغيل عن تغطية مراقبة Gateway؛ يشغّل جزء حارس الحدود حراسه الصغيرة المستقلة بالتزامن داخل مهمة واحدة، بما في ذلك `pnpm prompt:snapshots:check` بحيث يُثبّت انحراف مطالبات المسار السعيد لوقت تشغيل Codex إلى طلب السحب الذي سببه. تعمل مراقبة Gateway واختبارات القنوات وجزء حدود دعم core بالتزامن داخل `build-artifacts` بعد أن يكون `dist/` و`dist-runtime/` قد بُنيا بالفعل.
|
||||
|
||||
يشغّل Android CI كلًا من `testPlayDebugUnitTest` و`testThirdPartyDebugUnitTest` ثم يبني APK تصحيح Play. لا تملك نكهة الطرف الثالث مجموعة مصدر أو بيانًا منفصلًا؛ لا يزال مسار اختبارات الوحدة الخاص بها يترجم النكهة مع علامات BuildConfig الخاصة بـ SMS/call-log، مع تجنب مهمة تغليف APK تصحيح مكررة في كل دفعة مرتبطة بـ Android.
|
||||
يشغّل Android CI كلًا من `testPlayDebugUnitTest` و`testThirdPartyDebugUnitTest` ثم يبني APK debug الخاص بـ Play. لا تحتوي نكهة الطرف الثالث على مجموعة مصدر أو بيان منفصل؛ يظل مسار اختبارات الوحدات الخاص بها يجمّع النكهة مع أعلام BuildConfig الخاصة بـ SMS/سجل المكالمات، مع تجنب مهمة تغليف APK debug مكررة في كل دفعة ذات صلة بـ Android.
|
||||
|
||||
يشغّل جزء `check-dependencies` الأمر `pnpm deadcode:dependencies` (تمرير Knip خاص باعتماديات الإنتاج فقط ومثبت على أحدث إصدار من Knip، مع تعطيل الحد الأدنى لعمر إصدار pnpm لتثبيت `dlx`) و`pnpm deadcode:unused-files`، الذي يقارن نتائج Knip لملفات الإنتاج غير المستخدمة مع `scripts/deadcode-unused-files.allowlist.mjs`. يفشل حارس الملفات غير المستخدمة عندما يضيف طلب سحب ملفًا غير مستخدم جديدًا لم يراجع، أو يترك إدخال قائمة سماح قديمًا، مع الحفاظ على أسطح Plugin الديناميكية، والمولدة، والبناء، والاختبارات المباشرة، وجسور الحزم المقصودة التي لا يستطيع Knip حلها ساكنًا.
|
||||
يشغّل جزء `check-dependencies` الأمر `pnpm deadcode:dependencies` (تمرير Knip خاص بتبعيات الإنتاج فقط ومثبت على أحدث إصدار Knip، مع تعطيل حد العمر الأدنى لإصدار pnpm لتثبيت `dlx`) و`pnpm deadcode:unused-files`، الذي يقارن نتائج Knip الإنتاجية للملفات غير المستخدمة مع `scripts/deadcode-unused-files.allowlist.mjs`. يفشل حارس الملفات غير المستخدمة عندما يضيف طلب سحب ملفًا جديدًا غير مستخدم ولم يُراجع، أو يترك إدخال قائمة سماح قديمًا، مع الحفاظ على أسطح Plugin الديناميكية والمولدة والبناء والاختبارات المباشرة وجسور الحزم المقصودة التي لا يستطيع Knip حلها ساكنًا.
|
||||
|
||||
## تمرير نشاط ClawSweeper
|
||||
|
||||
يمثل `.github/workflows/clawsweeper-dispatch.yml` الجسر من جهة الهدف من نشاط مستودع OpenClaw إلى ClawSweeper. لا يجلب كود طلبات السحب غير الموثوق ولا ينفذه. ينشئ سير العمل رمز GitHub App من `CLAWSWEEPER_APP_PRIVATE_KEY`، ثم يرسل حمولات `repository_dispatch` مدمجة إلى `openclaw/clawsweeper`.
|
||||
`.github/workflows/clawsweeper-dispatch.yml` هو الجسر من جهة الهدف من نشاط مستودع OpenClaw إلى ClawSweeper. لا يسحب أو ينفذ كود طلبات السحب غير الموثوق. ينشئ سير العمل رمز GitHub App من `CLAWSWEEPER_APP_PRIVATE_KEY`، ثم يرسل حمولات `repository_dispatch` مدمجة إلى `openclaw/clawsweeper`.
|
||||
|
||||
يحتوي سير العمل على أربعة مسارات:
|
||||
|
||||
- `clawsweeper_item` لطلبات مراجعة المشكلات وطلبات السحب المحددة؛
|
||||
- `clawsweeper_comment` لأوامر ClawSweeper الصريحة في تعليقات المشكلات؛
|
||||
- `clawsweeper_item` لطلبات مراجعة القضايا وطلبات السحب الدقيقة؛
|
||||
- `clawsweeper_comment` لأوامر ClawSweeper الصريحة في تعليقات القضايا؛
|
||||
- `clawsweeper_commit_review` لطلبات المراجعة على مستوى الالتزام في دفعات `main`؛
|
||||
- `github_activity` لنشاط GitHub العام الذي قد يفحصه وكيل ClawSweeper.
|
||||
|
||||
يمرر مسار `github_activity` بيانات وصفية مطبّعة فقط: نوع الحدث، والإجراء، والفاعل، والمستودع، ورقم العنصر، وURL، والعنوان، والحالة، ومقتطفات قصيرة للتعليقات أو المراجعات عند وجودها. يتجنب عمدًا تمرير جسم Webhook الكامل. سير العمل المستقبِل في `openclaw/clawsweeper` هو `.github/workflows/github-activity.yml`، الذي ينشر الحدث المطبّع إلى خطاف OpenClaw Gateway لوكيل ClawSweeper.
|
||||
يمرر مسار `github_activity` البيانات الوصفية المطبّعة فقط: نوع الحدث، والإجراء، والفاعل، والمستودع، ورقم العنصر، وURL، والعنوان، والحالة، ومقتطفات قصيرة للتعليقات أو المراجعات عند وجودها. يتجنب عمدًا تمرير كامل جسم Webhook. سير العمل المستقبِل في `openclaw/clawsweeper` هو `.github/workflows/github-activity.yml`، والذي ينشر الحدث المطبّع إلى خطاف OpenClaw Gateway لوكيل ClawSweeper.
|
||||
|
||||
النشاط العام ملاحظة، وليس تسليمًا افتراضيًا. يتلقى وكيل ClawSweeper هدف Discord في موجهه ويجب أن ينشر إلى `#clawsweeper` فقط عندما يكون الحدث مفاجئًا، أو قابلًا للتنفيذ، أو محفوفًا بالمخاطر، أو مفيدًا تشغيليًا. يجب أن تؤدي عمليات الفتح والتعديل الروتينية، وضجيج البوتات، وضجيج Webhook المكرر، وحركة المراجعات العادية إلى `NO_REPLY`.
|
||||
النشاط العام للمراقبة، وليس للتسليم افتراضيًا. يتلقى وكيل ClawSweeper هدف Discord في مطالبته، وينبغي أن ينشر إلى `#clawsweeper` فقط عندما يكون الحدث مفاجئًا أو قابلًا للتنفيذ أو خطيرًا أو مفيدًا تشغيليًا. ينبغي أن تؤدي عمليات الفتح والتعديل الروتينية، وضجيج الروبوتات، وضجيج Webhook المكرر، وحركة المراجعات العادية إلى `NO_REPLY`.
|
||||
|
||||
تعامل مع عناوين GitHub وتعليقاته وأجسامه ونصوص المراجعات وأسماء الفروع ورسائل الالتزام كبيانات غير موثوقة طوال هذا المسار. إنها مدخلات للتلخيص والفرز، وليست تعليمات لسير العمل أو وقت تشغيل الوكيل.
|
||||
تعامل مع عناوين GitHub وتعليقاته ومتونه ونصوص المراجعات وأسماء الفروع ورسائل الالتزام كبيانات غير موثوقة عبر هذا المسار كله. هي مدخلات للتلخيص والفرز، وليست تعليمات لسير العمل أو وقت تشغيل الوكيل.
|
||||
|
||||
## التشغيلات اليدوية
|
||||
## عمليات التشغيل اليدوية
|
||||
|
||||
تُشغّل عمليات إرسال CI اليدوية مخطط المهام نفسه مثل CI العادي، لكنها تُفعّل قسريًا كل مسار محدد النطاق غير Android: أجزاء Linux Node، وأجزاء bundled-plugin، وعقود القنوات، وتوافق Node 22، و`check`، و`check-additional`، واختبار البناء السريع، وفحوصات الوثائق، وPython skills، وWindows، وmacOS، وتعريب Control UI. تُشغّل عمليات إرسال CI اليدوية المستقلة Android فقط مع `include_android=true`؛ وتُفعّل مظلة الإصدار الكامل Android بتمرير `include_android=true`. تُستبعد من CI الفحوصات الثابتة لمرحلة ما قبل إصدار Plugin، وجزء `agentic-plugins` الخاص بالإصدار فقط، والمسح الدفعي الكامل للإضافات، ومسارات Docker لمرحلة ما قبل إصدار Plugin. لا تعمل حزمة ما قبل إصدار Docker إلا عندما تُرسل `Full Release Validation` سير عمل `Plugin Prerelease` المنفصل مع تمكين بوابة التحقق من الإصدار.
|
||||
تُشغّل عمليات إرسال CI اليدوية مخطط المهام نفسه مثل CI العادي، لكنها تفرض تشغيل كل مسار غير خاص بنظام Android ضمن النطاق: أجزاء Linux Node، وأجزاء Plugin المضمّنة، وعقود القنوات، وتوافق Node 22، و`check`، و`check-additional`، واختبار البناء السريع، وفحوصات الوثائق، وPython skills، وWindows، وmacOS، وتدويل واجهة Control UI. تُشغّل عمليات إرسال CI اليدوية المستقلة Android فقط مع `include_android=true`؛ ويُمكّن غطاء الإصدار الكامل Android عبر تمرير `include_android=true`. تُستثنى من CI فحوصات Plugin الثابتة لما قبل الإصدار، وجزء `agentic-plugins` الخاص بالإصدار فقط، والفحص الدفعي الكامل للإضافات، ومسارات Docker الخاصة بما قبل إصدار Plugin. لا تعمل حزمة Docker لما قبل الإصدار إلا عندما يرسل `Full Release Validation` سير عمل `Plugin Prerelease` المنفصل مع تمكين بوابة التحقق من الإصدار.
|
||||
|
||||
تستخدم التشغيلات اليدوية مجموعة تزامن فريدة حتى لا تُلغى حزمة مرشح الإصدار الكاملة بسبب تشغيل push أو PR آخر على المرجع نفسه. يتيح إدخال `target_ref` الاختياري لمستدعٍ موثوق تشغيل ذلك المخطط على فرع أو وسم أو SHA كامل لالتزام، مع استخدام ملف سير العمل من مرجع الإرسال المحدد.
|
||||
تستخدم التشغيلات اليدوية مجموعة تزامن فريدة حتى لا تُلغى حزمة مرشح الإصدار الكاملة بسبب عملية دفع أو تشغيل PR أخرى على المرجع نفسه. يتيح إدخال `target_ref` الاختياري لمستدعٍ موثوق تشغيل ذلك المخطط مقابل فرع أو وسم أو SHA كامل للالتزام مع استخدام ملف سير العمل من مرجع الإرسال المحدد.
|
||||
|
||||
```bash
|
||||
gh workflow run ci.yml --ref release/YYYY.M.D
|
||||
@ -96,14 +96,14 @@ gh workflow run ci.yml --ref main -f target_ref=<branch-or-sha> -f include_andro
|
||||
gh workflow run full-release-validation.yml --ref main -f ref=<branch-or-sha>
|
||||
```
|
||||
|
||||
## المشغلات
|
||||
## المشغّلات
|
||||
|
||||
| المشغّل | المهام |
|
||||
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `ubuntu-24.04` | `preflight`، ومهام الأمان السريعة والتجميعات (`security-scm-fast`، و`security-dependency-audit`، و`security-fast`)، وفحوصات البروتوكول/العقود/المجمعة السريعة، وفحوصات عقود القنوات المجزأة، وأجزاء `check` باستثناء lint، وأجزاء `check-additional` وتجميعاتها، ومحققات تجميع اختبارات Node، وفحوصات الوثائق، وPython skills، وworkflow-sanity، وlabeler، وauto-response؛ يستخدم تمهيد install-smoke أيضًا Ubuntu المستضاف على GitHub حتى تتمكن مصفوفة Blacksmith من الوقوف في الطابور أبكر |
|
||||
| `ubuntu-24.04` | `preflight`، ومهام الأمان السريعة والتجميعات (`security-scm-fast`، و`security-dependency-audit`، و`security-fast`)، وفحوصات البروتوكول/العقود/المضمّنة السريعة، وفحوصات عقود القنوات المجزأة، وأجزاء `check` باستثناء lint، وأجزاء وتجميعات `check-additional`، ومحققات تجميع اختبارات Node، وفحوصات الوثائق، وPython skills، وworkflow-sanity، وlabeler، وauto-response؛ يستخدم تمهيد install-smoke أيضًا Ubuntu المستضاف على GitHub حتى تتمكن مصفوفة Blacksmith من الاصطفاف مبكرًا |
|
||||
| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`، وأجزاء الإضافات الأخف وزنًا، و`checks-fast-core`، و`checks-node-compat-node22`، و`check-prod-types`، و`check-test-types` |
|
||||
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`، وbuild-smoke، وأجزاء اختبارات Linux Node، وأجزاء اختبارات Plugin المجمعة، و`android` |
|
||||
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (حساس للمعالج بما يكفي لأن 8 vCPU كلفت أكثر مما وفرت)؛ وبناءات Docker الخاصة بـ install-smoke (كلفة وقت طابور 32-vCPU كانت أكبر مما وفرته) |
|
||||
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`، وbuild-smoke، وأجزاء اختبارات Linux Node، وأجزاء اختبارات Plugin المضمّنة، و`android` |
|
||||
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (حسّاسة للمعالج بما يكفي لأن 8 vCPU كلّفت أكثر مما وفّرت)؛ وبناءات Docker الخاصة بـ install-smoke (وقت انتظار 32-vCPU كلّف أكثر مما وفّر) |
|
||||
| `blacksmith-16vcpu-windows-2025` | `checks-windows` |
|
||||
| `blacksmith-6vcpu-macos-latest` | `macos-node` على `openclaw/openclaw`؛ تعود forks إلى `macos-latest` |
|
||||
| `blacksmith-12vcpu-macos-latest` | `macos-swift` على `openclaw/openclaw`؛ تعود forks إلى `macos-latest` |
|
||||
@ -144,29 +144,29 @@ gh workflow run openclaw-performance.yml --ref main -f profile=diagnostic -f rep
|
||||
gh workflow run openclaw-performance.yml --ref main -f profile=smoke -f repeat=1 -f deep_profile=true -f live_gpt54=true
|
||||
```
|
||||
|
||||
يثبّت سير العمل OCM من إصدار مثبت وKova من إدخال `kova_ref` المثبت، ثم يشغّل ثلاثة مسارات:
|
||||
يثبّت سير العمل OCM من إصدار مثبّت وKova من إدخال `kova_ref` المثبّت، ثم يشغّل ثلاثة مسارات:
|
||||
|
||||
- `mock-provider`: سيناريوهات تشخيص Kova ضد وقت تشغيل ببناء محلي مع مصادقة OpenAI-compatible وهمية وحتمية.
|
||||
- `mock-deep-profile`: إعداد ملفات تعريف CPU/heap/trace لمواضع الاختناق في بدء التشغيل، وGateway، ودور agent.
|
||||
- `live-gpt54`: دور agent حقيقي من OpenAI `openai/gpt-5.4`، ويُتخطى عندما لا يكون `OPENAI_API_KEY` متاحًا.
|
||||
- `mock-provider`: سيناريوهات تشخيص Kova مقابل وقت تشغيل ببناء محلي مع مصادقة وهمية حتمية متوافقة مع OpenAI.
|
||||
- `mock-deep-profile`: توصيف CPU/heap/trace لنقاط السخونة في بدء التشغيل، وGateway، ودوران الوكيل.
|
||||
- `live-gpt54`: دورة وكيل OpenAI حقيقية `openai/gpt-5.4`، تُتخطى عندما لا يكون `OPENAI_API_KEY` متاحًا.
|
||||
|
||||
يشغّل مسار mock-provider أيضًا مجسات مصدر أصلية لـ OpenClaw بعد مرور Kova: توقيت إقلاع Gateway والذاكرة عبر حالات بدء التشغيل الافتراضية وhook و50-plugin؛ وحلقات hello متكررة لـ mock-OpenAI `channel-chat-baseline`؛ وأوامر بدء CLI ضد Gateway المُشغّل. يوجد ملخص Markdown لمجس المصدر في `source/index.md` ضمن حزمة التقرير، مع JSON الخام بجانبه.
|
||||
يشغّل مسار mock-provider أيضًا مجسات مصدر أصلية من OpenClaw بعد مرور Kova: توقيت إقلاع Gateway والذاكرة عبر حالات بدء التشغيل الافتراضية، وhook، و50-Plugin؛ وحلقات hello متكررة لـ mock-OpenAI `channel-chat-baseline`؛ وأوامر بدء CLI مقابل Gateway الذي تم إقلاعه. يوجد ملخص Markdown لمجس المصدر في `source/index.md` ضمن حزمة التقرير، مع JSON الخام بجانبه.
|
||||
|
||||
يرفع كل مسار artifacts إلى GitHub. عندما يكون `CLAWGRIT_REPORTS_TOKEN` مهيأً، يلتزم سير العمل أيضًا بـ `report.json` و`report.md` والحزم و`index.md` وartifacts مجس المصدر في `openclaw/clawgrit-reports` تحت `openclaw-performance/<ref>/<run-id>-<attempt>/<lane>/`. يُكتب مؤشر الفرع الحالي باسم `openclaw-performance/<ref>/latest-<lane>.json`.
|
||||
يرفع كل مسار artifacts إلى GitHub. عندما يكون `CLAWGRIT_REPORTS_TOKEN` مهيأ، يلتزم سير العمل أيضًا بـ `report.json`، و`report.md`، والحزم، و`index.md`، وartifacts مجس المصدر إلى `openclaw/clawgrit-reports` تحت `openclaw-performance/<ref>/<run-id>-<attempt>/<lane>/`. يُكتب مؤشر الفرع الحالي باسم `openclaw-performance/<ref>/latest-<lane>.json`.
|
||||
|
||||
## التحقق الكامل من الإصدار
|
||||
|
||||
`Full Release Validation` هو سير العمل اليدوي المظلي لـ "تشغيل كل شيء قبل الإصدار". يقبل فرعًا أو وسمًا أو SHA كاملًا لالتزام، ويرسل سير عمل `CI` اليدوي بذلك الهدف، ويرسل `Plugin Prerelease` لإثبات plugin/package/static/Docker الخاص بالإصدار فقط، ويرسل `OpenClaw Release Checks` لاختبار التثبيت السريع، وقبول الحزمة، وحزم مسار إصدار Docker، وlive/E2E، وOpenWebUI، وتكافؤ QA Lab، وMatrix، ومسارات Telegram. مع `rerun_group=all` و`release_profile=full`، يشغّل أيضًا `NPM Telegram Beta E2E` ضد artifact `release-package-under-test` من فحوصات الإصدار. بعد النشر، مرّر `npm_telegram_package_spec` لإعادة تشغيل مسار حزمة Telegram نفسه ضد حزمة npm المنشورة.
|
||||
`Full Release Validation` هو سير العمل اليدوي الجامع من أجل "تشغيل كل شيء قبل الإصدار." يقبل فرعًا أو وسمًا أو SHA كاملًا للالتزام، ويرسل سير عمل `CI` اليدوي بذلك الهدف، ويرسل `Plugin Prerelease` لإثباتات Plugin/الحزمة/الثابتة/Docker الخاصة بالإصدار فقط، ويرسل `OpenClaw Release Checks` لاختبار التثبيت السريع، وقبول الحزمة، وحزم مسار إصدار Docker، والاختبارات الحية/E2E، وOpenWebUI، وتكافؤ QA Lab، وMatrix، ومسارات Telegram. مع `rerun_group=all` و`release_profile=full`، يشغّل أيضًا `NPM Telegram Beta E2E` مقابل artifact `release-package-under-test` من فحوصات الإصدار. بعد النشر، مرّر `npm_telegram_package_spec` لإعادة تشغيل مسار حزمة Telegram نفسه مقابل حزمة npm المنشورة.
|
||||
|
||||
راجع [التحقق الكامل من الإصدار](/ar/reference/full-release-validation) للاطلاع على
|
||||
مصفوفة المراحل، وأسماء مهام سير العمل الدقيقة، وفروقات الملفات الشخصية، وartifacts، ومقابض
|
||||
إعادة التشغيل المركزة.
|
||||
مصفوفة المراحل، وأسماء مهام سير العمل الدقيقة، واختلافات الملفات التعريفية، وartifacts،
|
||||
ومعالجات إعادة التشغيل المركزة.
|
||||
|
||||
`OpenClaw Release Publish` هو سير عمل الإصدار اليدوي المُغيِّر. أرسله
|
||||
من `release/YYYY.M.D` أو `main` بعد وجود وسم الإصدار وبعد نجاح
|
||||
تمهيد OpenClaw npm. يتحقق من `pnpm plugins:sync:check`،
|
||||
`OpenClaw Release Publish` هو سير عمل الإصدار اليدوي الذي يُجري تغييرات. أرسله
|
||||
من `release/YYYY.M.D` أو `main` بعد وجود وسم الإصدار وبعد نجاح تمهيد
|
||||
OpenClaw npm. يتحقق من `pnpm plugins:sync:check`،
|
||||
ويرسل `Plugin NPM Release` لكل حزم Plugin القابلة للنشر، ويرسل
|
||||
`Plugin ClawHub Release` لـ SHA الإصدار نفسه، وبعد ذلك فقط يرسل
|
||||
`Plugin ClawHub Release` لإصدار SHA نفسه، وعندها فقط يرسل
|
||||
`OpenClaw NPM Release` مع `preflight_run_id` المحفوظ.
|
||||
|
||||
```bash
|
||||
@ -177,47 +177,47 @@ gh workflow run openclaw-release-publish.yml \
|
||||
-f npm_dist_tag=beta
|
||||
```
|
||||
|
||||
لإثبات التزام مثبت على فرع سريع الحركة، استخدم المساعد بدلًا من
|
||||
لإثبات التزام مثبّت على فرع سريع الحركة، استخدم المساعد بدلًا من
|
||||
`gh workflow run ... --ref main -f ref=<sha>`:
|
||||
|
||||
```bash
|
||||
pnpm ci:full-release --sha <full-sha>
|
||||
```
|
||||
|
||||
يجب أن تكون مراجع إرسال سير عمل GitHub فروعًا أو وسومًا، لا SHAs خامة للالتزامات. يدفع
|
||||
يجب أن تكون مراجع إرسال سير عمل GitHub فروعًا أو وسومًا، وليست SHA خامًا للالتزامات. يدفع
|
||||
المساعد فرعًا مؤقتًا `release-ci/<sha>-...` عند SHA الهدف،
|
||||
ويرسل `Full Release Validation` من ذلك المرجع المثبت، ويتحقق من أن كل
|
||||
`headSha` لسير عمل فرعي يطابق الهدف، ويحذف الفرع المؤقت عند اكتمال
|
||||
التشغيل. يفشل محقق المظلة أيضًا إذا عمل أي سير عمل فرعي عند
|
||||
ويرسل `Full Release Validation` من ذلك المرجع المثبّت، ويتحقق من أن كل
|
||||
`headSha` لسير عمل فرعي يطابق الهدف، ويحذف الفرع المؤقت عندما يكتمل
|
||||
التشغيل. يفشل المحقق الجامع أيضًا إذا عمل أي سير عمل فرعي عند
|
||||
SHA مختلف.
|
||||
|
||||
يتحكم `release_profile` في اتساع live/provider الممرر إلى فحوصات الإصدار. تكون
|
||||
سير عمل الإصدار اليدوية افتراضيًا على `stable`؛ استخدم `full` فقط عندما
|
||||
تريد عمدًا مصفوفة provider/media الاستشارية الواسعة.
|
||||
يتحكم `release_profile` في اتساع الحي/المزوّد الذي يُمرر إلى فحوصات الإصدار. تفترض
|
||||
سير عمل الإصدار اليدوية القيمة الافتراضية `stable`؛ استخدم `full` فقط عندما
|
||||
تريد عمدًا مصفوفة المزوّد/الوسائط الاستشارية الواسعة.
|
||||
|
||||
- `minimum` يبقي أسرع مسارات OpenAI/core الحرجة للإصدار.
|
||||
- `stable` يضيف مجموعة provider/backend المستقرة.
|
||||
- `full` يشغّل مصفوفة provider/media الاستشارية الواسعة.
|
||||
- يحافظ `minimum` على أسرع مسارات OpenAI/core الحرجة للإصدار.
|
||||
- يضيف `stable` مجموعة المزوّد/الخلفية المستقرة.
|
||||
- يشغّل `full` مصفوفة المزوّد/الوسائط الاستشارية الواسعة.
|
||||
|
||||
تسجل المظلة معرّفات تشغيل الأطفال المُرسلة، وتعيد مهمة `Verify full validation` النهائية فحص نتائج تشغيل الأطفال الحالية وتلحق جداول أبطأ المهام لكل تشغيل فرعي. إذا أُعيد تشغيل سير عمل فرعي وأصبح أخضر، فأعد تشغيل مهمة محقق الأصل فقط لتحديث نتيجة المظلة وملخص التوقيت.
|
||||
يسجل الغطاء معرّفات التشغيل الفرعية المرسلة، وتعيد مهمة `Verify full validation` النهائية فحص استنتاجات تشغيلات الأطفال الحالية وتُلحق جداول أبطأ المهام لكل تشغيل فرعي. إذا أُعيد تشغيل سير عمل فرعي وأصبح أخضر، فأعد تشغيل مهمة محقق الأصل فقط لتحديث نتيجة الغطاء وملخص التوقيت.
|
||||
|
||||
للاسترداد، يقبل كل من `Full Release Validation` و`OpenClaw Release Checks` القيمة `rerun_group`. استخدم `all` لمرشح إصدار، و`ci` للفرع الفرعي العادي الخاص بـ CI الكامل فقط، و`plugin-prerelease` للفرع الفرعي الخاص بالإصدار التمهيدي للـ plugin فقط، و`release-checks` لكل فرع إصدار فرعي، أو مجموعة أضيق: `install-smoke` أو `cross-os` أو `live-e2e` أو `package` أو `qa` أو `qa-parity` أو `qa-live` أو `npm-telegram` على المظلة. يحافظ هذا على حصر إعادة تشغيل مربع إصدار فاشل بعد إصلاح مركز.
|
||||
للاسترداد، يقبل كل من `Full Release Validation` و`OpenClaw Release Checks` القيمة `rerun_group`. استخدم `all` لمرشح إصدار، و`ci` لابن CI الكامل العادي فقط، و`plugin-prerelease` لابن ما قبل إصدار Plugin فقط، و`release-checks` لكل ابن إصدار، أو مجموعة أضيق: `install-smoke` أو `cross-os` أو `live-e2e` أو `package` أو `qa` أو `qa-parity` أو `qa-live` أو `npm-telegram` على المظلة. يبقي هذا إعادة تشغيل صندوق إصدار فاشل محدودة بعد إصلاح مركز.
|
||||
|
||||
يستخدم `OpenClaw Release Checks` مرجع سير العمل الموثوق لحل المرجع المحدد مرة واحدة إلى أرشيف `release-package-under-test` بصيغة tarball، ثم يمرر ذلك الأثر إلى كل من سير عمل Docker الخاص بمسار الإصدار المباشر/E2E وجزء قبول الحزمة. يحافظ ذلك على اتساق بايتات الحزمة عبر مربعات الإصدار ويتجنب إعادة تحزيم المرشح نفسه في عدة مهام فرعية.
|
||||
يستخدم `OpenClaw Release Checks` مرجع سير العمل الموثوق لحل المرجع المحدد مرة واحدة إلى أرشيف `release-package-under-test` بصيغة tarball، ثم يمرر ذلك الأثر إلى كل من سير عمل Docker لمسار الإصدار live/E2E وشظية قبول الحزمة. يحافظ ذلك على اتساق بايتات الحزمة عبر صناديق الإصدار ويتجنب إعادة تغليف المرشح نفسه في عدة مهام أبناء.
|
||||
|
||||
تشغيلات `Full Release Validation` المكررة لـ `ref=main` و`rerun_group=all`
|
||||
تحل محل المظلة الأقدم. يلغي مراقب الأصل أي سير عمل فرعي
|
||||
سبق أن أرسله عندما يُلغى الأصل، لذلك لا يبقى تحقق main الأحدث
|
||||
خلف تشغيل قديم لفحوصات الإصدار مدته ساعتان. يحتفظ تحقق فرع/وسم الإصدار
|
||||
ومجموعات إعادة التشغيل المركزة بـ `cancel-in-progress: false`.
|
||||
تحل محل المظلة الأقدم. يلغي مراقب الأصل أي سير عمل ابن سبق أن
|
||||
أرسله عندما يُلغى الأصل، لذلك لا يقف تحقق main الأحدث خلف تشغيل قديم
|
||||
لفحوصات الإصدار مدته ساعتان. يحتفظ تحقق فرع/وسم الإصدار ومجموعات إعادة
|
||||
التشغيل المركزة بـ `cancel-in-progress: false`.
|
||||
|
||||
## أجزاء المباشر وE2E
|
||||
## شظايا live وE2E
|
||||
|
||||
يحافظ فرع المباشر/E2E الخاص بالإصدار على تغطية أصلية واسعة لـ `pnpm test:live`، لكنه يشغله كأجزاء مسماة عبر `scripts/test-live-shard.mjs` بدلا من مهمة تسلسلية واحدة:
|
||||
يحتفظ ابن live/E2E الخاص بالإصدار بتغطية واسعة أصلية عبر `pnpm test:live`، لكنه يشغلها كشظايا مسماة عبر `scripts/test-live-shard.mjs` بدلا من مهمة تسلسلية واحدة:
|
||||
|
||||
- `native-live-src-agents`
|
||||
- `native-live-src-gateway-core`
|
||||
- مهام `native-live-src-gateway-profiles` المصفاة حسب المزود
|
||||
- مهام `native-live-src-gateway-profiles` المفلترة حسب الموفر
|
||||
- `native-live-src-gateway-backends`
|
||||
- `native-live-test`
|
||||
- `native-live-extensions-a-k`
|
||||
@ -225,61 +225,61 @@ SHA مختلف.
|
||||
- `native-live-extensions-openai`
|
||||
- `native-live-extensions-o-z-other`
|
||||
- `native-live-extensions-xai`
|
||||
- أجزاء وسائط صوت/فيديو مقسمة وأجزاء موسيقى مصفاة حسب المزود
|
||||
- شظايا صوت/فيديو وسائط مقسمة وشظايا موسيقى مفلترة حسب الموفر
|
||||
|
||||
يحافظ ذلك على تغطية الملفات نفسها مع تسهيل إعادة تشغيل وتشخيص إخفاقات مزود المباشر البطيئة. تظل أسماء الأجزاء التجميعية `native-live-extensions-o-z` و`native-live-extensions-media` و`native-live-extensions-media-music` صالحة لإعادات التشغيل اليدوية لمرة واحدة.
|
||||
يحافظ ذلك على تغطية الملفات نفسها مع جعل إخفاقات موفري live البطيئة أسهل في إعادة التشغيل والتشخيص. تبقى أسماء الشظايا المجمعة `native-live-extensions-o-z` و`native-live-extensions-media` و`native-live-extensions-media-music` صالحة لإعادات التشغيل اليدوية لمرة واحدة.
|
||||
|
||||
تعمل أجزاء وسائط المباشر الأصلية في `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`، المبنية بواسطة سير عمل `Live Media Runner Image`. تثبت تلك الصورة مسبقا `ffmpeg` و`ffprobe`؛ ولا تتحقق مهام الوسائط إلا من الثنائيات قبل الإعداد. أبق مجموعات اختبار المباشر المدعومة بـ Docker على مشغلات Blacksmith العادية — فمهام الحاويات ليست المكان المناسب لتشغيل اختبارات Docker متداخلة.
|
||||
تعمل شظايا وسائط live الأصلية في `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`، المبني بواسطة سير عمل `Live Media Runner Image`. تثبت تلك الصورة مسبقا `ffmpeg` و`ffprobe`؛ تتحقق مهام الوسائط من الثنائيات فقط قبل الإعداد. أبق مجموعات live المدعومة بـ Docker على مشغلات Blacksmith العادية — فمهام الحاويات ليست المكان المناسب لتشغيل اختبارات Docker متداخلة.
|
||||
|
||||
تستخدم أجزاء نموذج/واجهة المباشر الخلفية المدعومة بـ Docker صورة مشتركة منفصلة `ghcr.io/openclaw/openclaw-live-test:<sha>` لكل commit محدد. يبني سير عمل إصدار المباشر تلك الصورة ويدفعها مرة واحدة، ثم تعمل أجزاء نموذج Docker المباشر وGateway المقسمة حسب المزود وواجهة CLI الخلفية وربط ACP وحزام Codex مع `OPENCLAW_SKIP_DOCKER_BUILD=1`. تحمل أجزاء Gateway Docker حدود `timeout` صريحة على مستوى السكربت أقل من مهلة مهمة سير العمل، بحيث تفشل الحاوية العالقة أو مسار التنظيف بسرعة بدلا من استهلاك ميزانية فحص الإصدار كاملة. إذا أعادت هذه الأجزاء بناء هدف Docker الكامل للمصدر بشكل مستقل، فهذا يعني أن تشغيل الإصدار مهيأ بشكل خاطئ وسيهدر وقتا فعليا على عمليات بناء صور مكررة.
|
||||
تستخدم شظايا النماذج/الخلفيات live المدعومة بـ Docker صورة مشتركة منفصلة `ghcr.io/openclaw/openclaw-live-test:<sha>` لكل تنفيذ محدد. يبني سير عمل إصدار live تلك الصورة ويدفعها مرة واحدة، ثم تعمل شظايا نموذج Docker live وGateway المقسمة حسب الموفر وخلفية CLI وربط ACP وحزمة Codex مع `OPENCLAW_SKIP_DOCKER_BUILD=1`. تحمل شظايا Gateway Docker حدود `timeout` صريحة على مستوى السكربت أدنى من مهلة مهمة سير العمل بحيث يفشل مسار حاوية عالق أو تنظيف بسرعة بدلا من استهلاك ميزانية فحص الإصدار كاملة. إذا أعادت تلك الشظايا بناء هدف Docker الكامل للمصدر بشكل مستقل، فإن تشغيل الإصدار مضبوط بشكل خاطئ وسيهدر وقتا فعليا في بناء صور مكررة.
|
||||
|
||||
## قبول الحزمة
|
||||
|
||||
استخدم `Package Acceptance` عندما يكون السؤال هو "هل تعمل حزمة OpenClaw القابلة للتثبيت هذه كمنتج؟" يختلف ذلك عن CI العادي: يتحقق CI العادي من شجرة المصدر، بينما يتحقق قبول الحزمة من أرشيف tarball واحد عبر حزام Docker E2E نفسه الذي يستخدمه المستخدمون بعد التثبيت أو التحديث.
|
||||
استخدم `Package Acceptance` عندما يكون السؤال هو "هل تعمل حزمة OpenClaw القابلة للتثبيت هذه كمنتج؟" يختلف ذلك عن CI العادي: يتحقق CI العادي من شجرة المصدر، بينما يتحقق قبول الحزمة من أرشيف tarball واحد عبر حزمة Docker E2E نفسها التي يستخدمها المستخدمون بعد التثبيت أو التحديث.
|
||||
|
||||
### المهام
|
||||
|
||||
1. يتحقق `resolve_package` من `workflow_ref`، ويحل مرشح حزمة واحدا، ويكتب `.artifacts/docker-e2e-package/openclaw-current.tgz`، ويكتب `.artifacts/docker-e2e-package/package-candidate.json`، ويرفعهما كلاهما كأثر `package-under-test`، ويطبع المصدر ومرجع سير العمل ومرجع الحزمة والإصدار وSHA-256 والملف التعريفي في ملخص خطوة GitHub.
|
||||
2. يستدعي `docker_acceptance` الملف `openclaw-live-and-e2e-checks-reusable.yml` مع `ref=workflow_ref` و`package_artifact_name=package-under-test`. ينزل سير العمل القابل لإعادة الاستخدام ذلك الأثر، ويتحقق من مخزون أرشيف tarball، ويحضّر صور Docker الخاصة بملخص الحزمة عند الحاجة، ويشغل مسارات Docker المحددة ضد تلك الحزمة بدلا من تحزيم نسخة سير العمل المسحوبة. عندما يحدد ملف تعريفي عدة `docker_lanes` مستهدفة، يحضر سير العمل القابل لإعادة الاستخدام الحزمة والصور المشتركة مرة واحدة، ثم يوزع تلك المسارات كمهام Docker مستهدفة متوازية مع آثار فريدة.
|
||||
3. يستدعي `package_telegram` اختياريا `NPM Telegram Beta E2E`. يعمل عندما لا تكون `telegram_mode` هي `none` ويثبت أثر `package-under-test` نفسه عندما يكون Package Acceptance قد حل واحدا؛ ولا يزال بإمكان إرسال Telegram المستقل تثبيت مواصفة npm منشورة.
|
||||
1. يسحب `resolve_package` `workflow_ref`، ويحل مرشح حزمة واحدا، ويكتب `.artifacts/docker-e2e-package/openclaw-current.tgz`، ويكتب `.artifacts/docker-e2e-package/package-candidate.json`، ويرفع كليهما كأثر `package-under-test`، ويطبع المصدر ومرجع سير العمل ومرجع الحزمة والإصدار وSHA-256 والملف الشخصي في ملخص خطوة GitHub.
|
||||
2. يستدعي `docker_acceptance` `openclaw-live-and-e2e-checks-reusable.yml` مع `ref=workflow_ref` و`package_artifact_name=package-under-test`. ينزل سير العمل القابل لإعادة الاستخدام ذلك الأثر، ويتحقق من قائمة محتويات tarball، ويجهز صور Docker الخاصة بملخص الحزمة عند الحاجة، ويشغل مسارات Docker المحددة ضد تلك الحزمة بدلا من تغليف نسخة سير العمل. عندما يحدد ملف شخصي عدة `docker_lanes` مستهدفة، يجهز سير العمل القابل لإعادة الاستخدام الحزمة والصور المشتركة مرة واحدة، ثم يوزع تلك المسارات كمهام Docker مستهدفة متوازية مع آثار فريدة.
|
||||
3. يستدعي `package_telegram` اختياريا `NPM Telegram Beta E2E`. يعمل عندما لا تكون `telegram_mode` هي `none` ويثبت أثر `package-under-test` نفسه عندما يكون قبول الحزمة قد حله؛ يمكن لإرسال Telegram مستقل أن يظل يثبت مواصفة npm منشورة.
|
||||
4. يفشل `summary` سير العمل إذا فشل حل الحزمة أو قبول Docker أو مسار Telegram الاختياري.
|
||||
|
||||
### مصادر المرشحين
|
||||
|
||||
- تقبل `source=npm` فقط `openclaw@alpha` أو `openclaw@beta` أو `openclaw@latest` أو إصدار OpenClaw دقيقا مثل `openclaw@2026.4.27-beta.2`. استخدم هذا لقبول الإصدارات التمهيدية/المستقرة المنشورة.
|
||||
- تحزم `source=ref` فرعا موثوقا أو وسما أو SHA كاملا للـ commit من `package_ref`. يجلب محلل الحزم فروع/وسوم OpenClaw، ويتحقق من أن commit المحدد قابل للوصول من سجل فروع المستودع أو وسم إصدار، ويثبت التبعيات في شجرة عمل منفصلة، ويحزمه باستخدام `scripts/package-openclaw-for-docker.mjs`.
|
||||
- تنزل `source=url` ملف `.tgz` عبر HTTPS؛ ويكون `package_sha256` مطلوبا.
|
||||
- تنزل `source=artifact` ملف `.tgz` واحدا من `artifact_run_id` و`artifact_name`؛ ويكون `package_sha256` اختياريا، لكن ينبغي توفيره للآثار المشتركة خارجيا.
|
||||
- لا يقبل `source=npm` إلا `openclaw@beta` أو `openclaw@latest` أو إصدار OpenClaw دقيقا مثل `openclaw@2026.4.27-beta.2`. استخدم هذا لقبول ما قبل الإصدار/الإصدار المستقر المنشور.
|
||||
- يغلف `source=ref` فرعا أو وسما أو SHA كاملا لتنفيذ `package_ref` موثوق. يجلب المحلل فروع/وسوم OpenClaw، ويتحقق من أن التنفيذ المحدد يمكن الوصول إليه من سجل فروع المستودع أو وسم إصدار، ويثبت التبعيات في شجرة عمل منفصلة، ويغلفه باستخدام `scripts/package-openclaw-for-docker.mjs`.
|
||||
- ينزل `source=url` ملف `.tgz` عبر HTTPS؛ تكون `package_sha256` مطلوبة.
|
||||
- ينزل `source=artifact` ملف `.tgz` واحدا من `artifact_run_id` و`artifact_name`؛ تكون `package_sha256` اختيارية لكن ينبغي توفيرها للآثار المشتركة خارجيا.
|
||||
|
||||
أبق `workflow_ref` و`package_ref` منفصلين. `workflow_ref` هو كود سير العمل/الحزام الموثوق الذي يشغل الاختبار. `package_ref` هو commit المصدر الذي يُحزم عندما تكون `source=ref`. يتيح هذا لحزام الاختبار الحالي التحقق من commits مصدر موثوقة أقدم دون تشغيل منطق سير عمل قديم.
|
||||
أبق `workflow_ref` و`package_ref` منفصلين. `workflow_ref` هو كود سير العمل/الحزمة الموثوق الذي يشغل الاختبار. `package_ref` هو تنفيذ المصدر الذي يُغلف عندما تكون `source=ref`. يتيح هذا لحزمة الاختبار الحالية التحقق من تنفيذات مصدر موثوقة أقدم دون تشغيل منطق سير عمل قديم.
|
||||
|
||||
### ملفات تعريف المجموعة
|
||||
### ملفات تعريف الحزمة
|
||||
|
||||
- `smoke` — `npm-onboard-channel-agent`, `gateway-network`, `config-reload`
|
||||
- `package` — `npm-onboard-channel-agent`, `doctor-switch`, `update-channel-switch`, `upgrade-survivor`, `published-upgrade-survivor`, `plugins-offline`, `plugin-update`
|
||||
- `product` — `package` بالإضافة إلى `mcp-channels`, `cron-mcp-cleanup`, `openai-web-search-minimal`, `openwebui`
|
||||
- `product` — `package` إضافة إلى `mcp-channels`, `cron-mcp-cleanup`, `openai-web-search-minimal`, `openwebui`
|
||||
- `full` — أجزاء مسار إصدار Docker الكاملة مع OpenWebUI
|
||||
- `custom` — `docker_lanes` دقيقة؛ مطلوبة عندما تكون `suite_profile=custom`
|
||||
- `custom` — `docker_lanes` الدقيقة؛ مطلوبة عندما تكون `suite_profile=custom`
|
||||
|
||||
يستخدم ملف `package` التعريفي تغطية plugin غير متصلة حتى لا يكون التحقق من الحزمة المنشورة مرهونا بتوفر ClawHub المباشر. يعيد مسار Telegram الاختياري استخدام أثر `package-under-test` في `NPM Telegram Beta E2E`، مع الإبقاء على مسار مواصفة npm المنشورة للإرسالات المستقلة.
|
||||
يستخدم ملف تعريف `package` تغطية Plugin غير متصلة حتى لا يكون تحقق الحزمة المنشورة مشروطا بتوفر ClawHub live. يعيد مسار Telegram الاختياري استخدام أثر `package-under-test` في `NPM Telegram Beta E2E`، مع إبقاء مسار مواصفة npm المنشورة للإرسالات المستقلة.
|
||||
|
||||
للسياسة المخصصة لاختبار التحديث والـ plugin، بما في ذلك الأوامر المحلية،
|
||||
ومسارات Docker، ومدخلات Package Acceptance، وافتراضيات الإصدار، وفرز الإخفاقات،
|
||||
راجع [اختبار التحديثات والـ plugins](/ar/help/testing-updates-plugins).
|
||||
للسياسة المخصصة لاختبار التحديثات وPlugin، بما في ذلك الأوامر المحلية،
|
||||
ومسارات Docker، ومدخلات قبول الحزمة، وافتراضات الإصدار، وفرز الإخفاقات،
|
||||
راجع [اختبار التحديثات وPlugin](/ar/help/testing-updates-plugins).
|
||||
|
||||
تستدعي فحوصات الإصدار Package Acceptance مع `source=artifact`، وأثر حزمة الإصدار المحضر، و`suite_profile=custom`، و`docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'`، و`published_upgrade_survivor_baselines=all-since-2026.4.23`، و`published_upgrade_survivor_scenarios=reported-issues`، و`telegram_mode=mock-openai`. يحافظ هذا على إثبات ترحيل الحزمة، والتحديث، وتنظيف تبعيات plugin القديمة، وإصلاح تثبيت plugin المهيأ، وplugin غير المتصل، وتحديث plugin، وTelegram على أرشيف tarball الحزمة المحلول نفسه. عيّن `package_acceptance_package_spec` في Full Release Validation أو OpenClaw Release Checks لتشغيل المصفوفة نفسها ضد حزمة npm مشحونة بدلا من الأثر المبني من SHA. لا تزال فحوصات الإصدار عبر أنظمة التشغيل تغطي الإعداد الأولي الخاص بنظام التشغيل والمثبت وسلوك المنصة؛ وينبغي أن يبدأ تحقق منتج الحزمة/التحديث بـ Package Acceptance. يتحقق مسار Docker `published-upgrade-survivor` من خط أساس حزمة منشورة واحد في كل تشغيل. في Package Acceptance، يكون أرشيف tarball `package-under-test` المحلول هو المرشح دائما، ويحدد `published_upgrade_survivor_baseline` خط الأساس المنشور الاحتياطي، مع القيمة الافتراضية `openclaw@latest`؛ وتحافظ أوامر إعادة تشغيل المسارات الفاشلة على ذلك الخط الأساسي. عيّن `published_upgrade_survivor_baselines=all-since-2026.4.23` لتوسيع Full Release CI عبر كل إصدار npm مستقر من `2026.4.23` حتى `latest`؛ ويظل `release-history` متاحا لأخذ عينات أوسع يدويا باستخدام مرساة ما قبل التاريخ الأقدم. عيّن `published_upgrade_survivor_scenarios=reported-issues` لتوسيع خطوط الأساس نفسها عبر تجهيزات تشبه القضايا لتكوين Feishu، وملفات bootstrap/persona المحفوظة، وتثبيتات OpenClaw plugin المهيأة، ومسارات السجل ذات الشرطة المتموجة، وجذور تبعيات plugin القديمة العالقة. يستخدم سير عمل `Update Migration` المنفصل مسار Docker `update-migration` مع `all-since-2026.4.23` و`plugin-deps-cleanup` عندما يكون السؤال هو التنظيف الشامل لتحديث منشور، لا اتساع Full Release CI العادي. يمكن للتشغيلات التجميعية المحلية تمرير مواصفات حزمة دقيقة باستخدام `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS`، أو إبقاء مسار واحد باستخدام `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` مثل `openclaw@2026.4.15`، أو تعيين `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` لمصفوفة السيناريوهات. يهيئ المسار المنشور خط الأساس بوصفة أمر `openclaw config set` مدمجة، ويسجل خطوات الوصفة في `summary.json`، ويفحص `/healthz` و`/readyz` بالإضافة إلى حالة RPC بعد بدء Gateway. تتحقق أيضا مسارات حزمة Windows والمثبت الجديدة من أن الحزمة المثبتة تستطيع استيراد تجاوز التحكم بالمتصفح من مسار Windows مطلق خام. يستخدم اختبار دخان دورة وكيل OpenAI عبر أنظمة التشغيل القيمة الافتراضية `OPENCLAW_CROSS_OS_OPENAI_MODEL` عند تعيينها، وإلا `openai/gpt-5.4`، بحيث يبقى إثبات التثبيت وGateway على نموذج اختبار GPT-5 مع تجنب افتراضيات GPT-4.x.
|
||||
تستدعي فحوصات الإصدار قبول الحزمة مع `source=artifact`، وأثر حزمة الإصدار المحضر، و`suite_profile=custom`، و`docker_lanes='doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update'`، و`published_upgrade_survivor_baselines=all-since-2026.4.23`، و`published_upgrade_survivor_scenarios=reported-issues`، و`telegram_mode=mock-openai`. يحافظ هذا على إثبات ترحيل الحزمة، والتحديث، وتنظيف تبعية Plugin القديمة، وإصلاح تثبيت Plugin المضبوط، وPlugin دون اتصال، وتحديث Plugin، وTelegram على أرشيف tarball نفسه للحزمة المحلولة. اضبط `package_acceptance_package_spec` على Full Release Validation أو OpenClaw Release Checks لتشغيل المصفوفة نفسها ضد حزمة npm مشحونة بدلا من الأثر المبني من SHA. لا تزال فحوصات إصدار Cross-OS تغطي سلوك الإعداد الأولي والمثبت والمنصة الخاص بنظام التشغيل؛ ينبغي أن يبدأ تحقق منتج الحزمة/التحديث بقبول الحزمة. يتحقق مسار Docker `published-upgrade-survivor` من أساس حزمة منشورة واحد لكل تشغيل. في قبول الحزمة، يكون أرشيف tarball المحلول `package-under-test` هو المرشح دائما، وتحدد `published_upgrade_survivor_baseline` الأساس المنشور الاحتياطي، مع القيمة الافتراضية `openclaw@latest`؛ وتحافظ أوامر إعادة تشغيل المسار الفاشل على ذلك الأساس. اضبط `published_upgrade_survivor_baselines=all-since-2026.4.23` لتوسيع CI للإصدار الكامل عبر كل إصدار npm مستقر من `2026.4.23` حتى `latest`؛ يظل `release-history` متاحا لأخذ عينات يدوية أوسع مع مرساة التاريخ المسبق الأقدم. اضبط `published_upgrade_survivor_scenarios=reported-issues` لتوسيع الأسس نفسها عبر تجهيزات على هيئة مشكلات لإعدادات Feishu، وملفات bootstrap/persona المحفوظة، وتثبيتات OpenClaw Plugin المضبوطة، ومسارات السجلات ذات التلدة، وجذور تبعيات Plugin القديمة الراكدة. يستخدم سير عمل `Update Migration` المنفصل مسار Docker `update-migration` مع `all-since-2026.4.23` و`plugin-deps-cleanup` عندما يكون السؤال عن تنظيف تحديثات منشورة شامل، وليس عن اتساع CI العادي للإصدار الكامل. يمكن للتشغيلات المحلية المجمعة تمرير مواصفات حزم دقيقة باستخدام `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS`، أو الإبقاء على مسار واحد باستخدام `OPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC` مثل `openclaw@2026.4.15`، أو ضبط `OPENCLAW_UPGRADE_SURVIVOR_SCENARIOS` لمصفوفة السيناريوهات. يضبط المسار المنشور الأساس بوصفة أوامر `openclaw config set` مضمنة، ويسجل خطوات الوصفة في `summary.json`، ويفحص `/healthz` و`/readyz` إضافة إلى حالة RPC بعد بدء Gateway. تتحقق مسارات Windows الجديدة للحزمة والمثبت أيضا من أن الحزمة المثبتة يمكنها استيراد تجاوز browser-control من مسار Windows مطلق خام. يستخدم اختبار دخان دور وكيل OpenAI عبر Cross-OS القيمة `OPENCLAW_CROSS_OS_OPENAI_MODEL` افتراضيا عند ضبطها، وإلا يستخدم `openai/gpt-5.4`، بحيث يبقى إثبات التثبيت وGateway على نموذج اختبار GPT-5 مع تجنب افتراضات GPT-4.x.
|
||||
|
||||
### نوافذ التوافق القديم
|
||||
### نوافذ التوافق القديمة
|
||||
|
||||
لدى Package Acceptance نوافذ توافق قديم محدودة للحزم المنشورة مسبقا. قد تستخدم الحزم حتى `2026.4.25`، بما في ذلك `2026.4.25-beta.*`، مسار التوافق:
|
||||
يحتوي قبول الحزمة على نوافذ توافق قديمة محدودة للحزم المنشورة سابقا. يمكن للحزم حتى `2026.4.25`، بما في ذلك `2026.4.25-beta.*`، استخدام مسار التوافق:
|
||||
|
||||
- قد تشير إدخالات QA الخاصة المعروفة في `dist/postinstall-inventory.json` إلى ملفات محذوفة من أرشيف tarball؛
|
||||
- قد يتخطى `doctor-switch` الحالة الفرعية لاستمرارية `gateway install --wrapper` عندما لا تكشف الحزمة ذلك العلم؛
|
||||
- قد يقلم `update-channel-switch` قيم `pnpm.patchedDependencies` المفقودة من تجهيز git المزيف المشتق من أرشيف tarball وقد يسجل غياب `update.channel` المستمر؛
|
||||
- قد تقرأ اختبارات دخان plugin مواقع سجلات تثبيت قديمة أو تقبل غياب استمرارية سجل تثبيت السوق؛
|
||||
- قد يسمح `plugin-update` بترحيل بيانات التكوين الوصفية مع الاستمرار في اشتراط بقاء سجل التثبيت وسلوك عدم إعادة التثبيت دون تغيير.
|
||||
- قد تشير إدخالات QA الخاصة المعروفة في `dist/postinstall-inventory.json` إلى ملفات محذوفة من tarball؛
|
||||
- قد يتخطى `doctor-switch` الحالة الفرعية لاستمرارية `gateway install --wrapper` عندما لا تعرض الحزمة ذلك العلم؛
|
||||
- قد يزيل `update-channel-switch` قيم `pnpm.patchedDependencies` المفقودة من تجهيز git الوهمي المستمد من tarball وقد يسجل `update.channel` محفوظا مفقودا؛
|
||||
- قد تقرأ اختبارات Plugin السريعة مواقع سجلات تثبيت قديمة أو تقبل غياب استمرارية سجل تثبيت السوق؛
|
||||
- قد يسمح `plugin-update` بترحيل بيانات تعريف الإعدادات مع استمرار اشتراط بقاء سجل التثبيت وسلوك عدم إعادة التثبيت دون تغيير.
|
||||
|
||||
قد تحذر حزمة `2026.4.26` المنشورة أيضا من ملفات ختم بيانات وصفية للبناء المحلي كانت قد شُحنت بالفعل. يجب أن تفي الحزم اللاحقة بالعقود الحديثة؛ وتفشل الشروط نفسها بدلا من التحذير أو التخطي.
|
||||
قد تحذر حزمة `2026.4.26` المنشورة أيضا بشأن ملفات ختم بيانات تعريف البناء المحلية التي سبق شحنها. يجب أن تستوفي الحزم اللاحقة العقود الحديثة؛ وتفشل الشروط نفسها بدلا من التحذير أو التخطي.
|
||||
|
||||
### أمثلة
|
||||
|
||||
@ -322,110 +322,110 @@ gh workflow run package-acceptance.yml \
|
||||
-f docker_lanes='install-e2e plugin-update'
|
||||
```
|
||||
|
||||
عند تصحيح تشغيل فاشل لقبول الحزمة، ابدأ من ملخص `resolve_package` لتأكيد مصدر الحزمة وإصدارها وSHA-256. ثم افحص التشغيل الفرعي `docker_acceptance` وآثار Docker الخاصة به: `.artifacts/docker-tests/**/summary.json` و`failures.json` وسجلات المسارات وتوقيتات المراحل وأوامر إعادة التشغيل. فضّل إعادة تشغيل ملف تعريف الحزمة الفاشل أو مسارات Docker الدقيقة بدلا من إعادة تشغيل تحقق الإصدار الكامل.
|
||||
عند تصحيح تشغيل قبول حزمة فاشل، ابدأ من ملخص `resolve_package` لتأكيد مصدر الحزمة وإصدارها وSHA-256 الخاص بها. ثم افحص تشغيل `docker_acceptance` الفرعي وآثاره الخاصة بـ Docker: `.artifacts/docker-tests/**/summary.json`، و`failures.json`، وسجلات المسارات، وتوقيتات المراحل، وأوامر إعادة التشغيل. فضّل إعادة تشغيل ملف تعريف الحزمة الفاشل أو مسارات Docker الدقيقة بدلاً من إعادة تشغيل تحقق الإصدار الكامل.
|
||||
|
||||
## اختبار تثبيت سريع
|
||||
|
||||
يعيد سير العمل المنفصل `Install Smoke` استخدام نص النطاق نفسه من خلال مهمة `preflight` الخاصة به. وهو يقسم تغطية الاختبار السريع إلى `run_fast_install_smoke` و`run_full_install_smoke`.
|
||||
يعيد سير عمل `Install Smoke` المنفصل استخدام سكربت النطاق نفسه من خلال مهمة `preflight` الخاصة به. ويقسّم تغطية الاختبار السريع إلى `run_fast_install_smoke` و`run_full_install_smoke`.
|
||||
|
||||
- يشغّل **المسار السريع** لطلبات السحب التي تلمس أسطح Docker/الحزم، أو تغييرات حزم/بيانات Plugin المضمنة، أو أسطح Plugin/channel/gateway/Plugin SDK الأساسية التي تمرنها مهام اختبار Docker السريع. تغييرات Plugin المضمنة الخاصة بالمصدر فقط، وتعديلات الاختبارات فقط، وتعديلات الوثائق فقط لا تحجز عمّال Docker. يبني المسار السريع صورة Dockerfile الجذر مرة واحدة، ويتحقق من CLI، ويشغل اختبار CLI السريع لحذف الوكلاء لمساحة العمل المشتركة، ويشغل e2e لشبكة Gateway في الحاوية، ويتحقق من وسيطة بناء امتداد مضمن، ويشغل ملف تعريف Docker المحدود للـ Plugin المضمنة ضمن مهلة أمر إجمالية قدرها 240 ثانية (مع تحديد كل تشغيل Docker لكل سيناريو على حدة).
|
||||
- يحتفظ **المسار الكامل** بتغطية تثبيت حزمة QR وتغطية Docker/التحديث للمثبّت للتشغيلات الليلية المجدولة، والتشغيلات اليدوية، وفحوصات الإصدار عبر workflow-call، وطلبات السحب التي تلمس فعلا أسطح المثبّت/الحزمة/Docker. في الوضع الكامل، يجهز install-smoke صورة اختبار سريع لصورة Dockerfile الجذر في GHCR لعنوان SHA المستهدف أو يعيد استخدامها، ثم يشغل تثبيت حزمة QR، واختبارات Dockerfile/Gateway الجذر، واختبارات المثبّت/التحديث، وDocker E2E السريع للـ Plugin المضمنة كمهام منفصلة حتى لا ينتظر عمل المثبّت خلف اختبارات صورة الجذر.
|
||||
- **المسار السريع** يعمل لطلبات السحب التي تلمس أسطح Docker/الحزمة، أو تغييرات حزمة/بيان Plugin المجمّع، أو أسطح Plugin/القناة/Gateway/Plugin SDK الأساسية التي تمرّنها مهام اختبار Docker السريع. تغييرات Plugin المجمّع الخاصة بالمصدر فقط، والتعديلات الخاصة بالاختبارات فقط، والتعديلات الخاصة بالوثائق فقط لا تحجز عمال Docker. يبني المسار السريع صورة Dockerfile الجذرية مرة واحدة، ويفحص CLI، ويشغّل اختبار CLI السريع لحذف الوكلاء من مساحة العمل المشتركة، ويشغّل اختبار e2e لشبكة Gateway الحاوية، ويتحقق من وسيطة بناء إضافة مجمّعة، ويشغّل ملف تعريف Docker المحدود لـ Plugin المجمّع ضمن مهلة إجمالية للأمر قدرها 240 ثانية (مع تحديد كل تشغيل Docker لكل سيناريو بشكل منفصل).
|
||||
- **المسار الكامل** يحتفظ بتثبيت حزمة QR وتغطية Docker/التحديث للمثبّت للتشغيلات الليلية المجدولة، وعمليات الإرسال اليدوية، وفحوصات الإصدار عبر workflow-call، وطلبات السحب التي تلمس فعلاً أسطح المثبّت/الحزمة/Docker. في الوضع الكامل، يجهّز install-smoke أو يعيد استخدام صورة اختبار سريع Dockerfile جذرية من GHCR لهدف SHA واحد، ثم يشغّل تثبيت حزمة QR، واختبارات Dockerfile/Gateway الجذرية السريعة، واختبارات المثبّت/التحديث السريعة، وDocker E2E السريع لـ Plugin المجمّع كمهام منفصلة حتى لا ينتظر عمل المثبّت خلف اختبارات الصورة الجذرية السريعة.
|
||||
|
||||
دفعات `main` (بما فيها commits الدمج) لا تفرض المسار الكامل؛ عندما يطلب منطق نطاق التغيير تغطية كاملة عند الدفع، يبقي سير العمل اختبار Docker السريع ويترك اختبار التثبيت السريع الكامل للتحقق الليلي أو تحقق الإصدار.
|
||||
لا تفرض دفعات `main` (بما في ذلك commits الدمج) المسار الكامل؛ عندما يطلب منطق نطاق التغييرات تغطية كاملة عند الدفع، يحافظ سير العمل على اختبار Docker السريع ويترك اختبار التثبيت السريع الكامل للتحقق الليلي أو تحقق الإصدار.
|
||||
|
||||
اختبار مزود الصور لتثبيت Bun العمومي البطيء محكوم على نحو منفصل عبر `run_bun_global_install_smoke`. يعمل على الجدول الليلي ومن سير عمل فحوصات الإصدار، ويمكن للتشغيلات اليدوية لـ `Install Smoke` الاشتراك فيه، لكن طلبات السحب ودفعات `main` لا تفعل ذلك. تحتفظ اختبارات QR وDocker الخاصة بالمثبّت بملفات Dockerfile الخاصة بها والمركزة على التثبيت.
|
||||
اختبار موفر الصورة لتثبيت Bun العام البطيء محكوم بشكل منفصل بواسطة `run_bun_global_install_smoke`. يعمل وفق الجدول الليلي ومن سير عمل فحوصات الإصدار، ويمكن لعمليات إرسال `Install Smoke` اليدوية الاشتراك فيه، لكن طلبات السحب ودفعات `main` لا تفعل ذلك. تحتفظ اختبارات QR وDocker الخاصة بالمثبّت بملفات Dockerfile الخاصة بها والمركزة على التثبيت.
|
||||
|
||||
## Docker E2E المحلي
|
||||
|
||||
يبني `pnpm test:docker:all` مسبقا صورة اختبار مباشر مشتركة واحدة، ويحزم OpenClaw مرة واحدة كملف tarball من npm، ويبني صورتين مشتركتين من `scripts/e2e/Dockerfile`:
|
||||
يقوم `pnpm test:docker:all` ببناء صورة اختبار حي مشتركة واحدة مسبقاً، ويحزم OpenClaw مرة واحدة كحزمة npm tarball، ويبني صورتين مشتركتين من `scripts/e2e/Dockerfile`:
|
||||
|
||||
- مشغّل Node/Git عار لمسارات المثبّت/التحديث/اعتماديات Plugin؛
|
||||
- صورة وظيفية تثبت ملف tarball نفسه في `/app` لمسارات الوظائف العادية.
|
||||
- مشغّل Node/Git مجرد لمسارات المثبّت/التحديث/اعتمادية Plugin؛
|
||||
- صورة وظيفية تثبّت tarball نفسه في `/app` لمسارات الوظائف العادية.
|
||||
|
||||
توجد تعريفات مسارات Docker في `scripts/lib/docker-e2e-scenarios.mjs`، ويوجد منطق التخطيط في `scripts/lib/docker-e2e-plan.mjs`، ولا ينفذ المشغّل إلا الخطة المحددة. يختار المجدول الصورة لكل مسار باستخدام `OPENCLAW_DOCKER_E2E_BARE_IMAGE` و`OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`، ثم يشغل المسارات باستخدام `OPENCLAW_SKIP_DOCKER_BUILD=1`.
|
||||
توجد تعريفات مسارات Docker في `scripts/lib/docker-e2e-scenarios.mjs`، ويوجد منطق المخطط في `scripts/lib/docker-e2e-plan.mjs`، ولا ينفذ المشغّل إلا الخطة المحددة. يحدد المجدول الصورة لكل مسار باستخدام `OPENCLAW_DOCKER_E2E_BARE_IMAGE` و`OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`، ثم يشغّل المسارات باستخدام `OPENCLAW_SKIP_DOCKER_BUILD=1`.
|
||||
|
||||
### خيارات الضبط
|
||||
### قابلية الضبط
|
||||
|
||||
| المتغير | الافتراضي | الغرض |
|
||||
| -------------------------------------- | ------- | --------------------------------------------------------------------------------------------- |
|
||||
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | عدد خانات التجمع الرئيسي للمسارات العادية. |
|
||||
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | عدد خانات تجمع الذيل الحساس للمزود. |
|
||||
| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | حد المسارات المباشرة المتزامنة حتى لا يخنق المزودون الطلبات. |
|
||||
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | عدد خانات التجمع اللاحق الحساس للموفرين. |
|
||||
| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | حد المسارات الحية المتزامنة حتى لا يطبّق الموفرون الخنق. |
|
||||
| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | حد مسارات تثبيت npm المتزامنة. |
|
||||
| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | حد مسارات الخدمات المتعددة المتزامنة. |
|
||||
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | تباعد بين بدايات المسارات لتجنب عواصف إنشاء Docker daemon؛ اضبطه على `0` لعدم وجود تباعد. |
|
||||
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | مهلة احتياطية لكل مسار (120 دقيقة)؛ تستخدم مسارات مباشرة/ذيل محددة حدودا أضيق. |
|
||||
| `OPENCLAW_DOCKER_ALL_DRY_RUN` | غير مضبوط | يطبع `1` خطة المجدول دون تشغيل المسارات. |
|
||||
| `OPENCLAW_DOCKER_ALL_LANES` | غير مضبوط | قائمة مسارات دقيقة مفصولة بفواصل؛ تتخطى تنظيف الاختبار السريع حتى يتمكن الوكلاء من إعادة إنتاج مسار فاشل واحد. |
|
||||
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | الفاصل بين بدء المسارات لتجنب عواصف إنشاء Docker daemon؛ عيّن `0` لعدم وجود فاصل. |
|
||||
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | مهلة احتياطية لكل مسار (120 دقيقة)؛ تستخدم مسارات حية/لاحقة محددة حدوداً أضيق. |
|
||||
| `OPENCLAW_DOCKER_ALL_DRY_RUN` | غير معيّن | يطبع `1` خطة المجدول دون تشغيل المسارات. |
|
||||
| `OPENCLAW_DOCKER_ALL_LANES` | غير معيّن | قائمة مسارات دقيقة مفصولة بفواصل؛ تتخطى اختبار التنظيف السريع حتى يتمكن الوكلاء من إعادة إنتاج مسار فاشل واحد. |
|
||||
|
||||
يمكن لمسار أثقل من حده الفعال أن يبدأ مع ذلك من تجمع فارغ، ثم يعمل وحده حتى يحرر السعة. تنفذ التجميعة المحلية فحوصات تمهيدية لـ Docker، وتزيل حاويات OpenClaw E2E القديمة، وتصدر حالة المسارات النشطة، وتحفظ توقيتات المسارات للترتيب من الأطول أولا، وتتوقف افتراضيا عن جدولة مسارات مجمعة جديدة بعد أول فشل.
|
||||
يمكن أن يبدأ مسار أثقل من حده الفعال من تجمع فارغ، ثم يعمل وحده حتى يحرر السعة. تمهّد التجميعة المحلية Docker، وتزيل حاويات OpenClaw E2E القديمة، وتصدر حالة المسارات النشطة، وتحفظ توقيتات المسارات للترتيب من الأطول أولاً، وتتوقف افتراضياً عن جدولة مسارات مجمعة جديدة بعد الفشل الأول.
|
||||
|
||||
### سير عمل مباشر/E2E قابل لإعادة الاستخدام
|
||||
### سير عمل حي/E2E قابل لإعادة الاستخدام
|
||||
|
||||
يسأل سير العمل المباشر/E2E القابل لإعادة الاستخدام `scripts/test-docker-all.mjs --plan-json` عن الحزمة ونوع الصورة والصورة المباشرة والمسار وتغطية بيانات الاعتماد المطلوبة. ثم يحول `scripts/docker-e2e.mjs` تلك الخطة إلى مخرجات وملخصات GitHub. إما أن يحزم OpenClaw عبر `scripts/package-openclaw-for-docker.mjs`، أو ينزل artifact حزمة من التشغيل الحالي، أو ينزل artifact حزمة من `package_artifact_run_id`؛ ويتحقق من مخزون ملف tarball؛ ويبني ويدفع صور Docker E2E العارية/الوظيفية في GHCR الموسومة ببصمة الحزمة عبر ذاكرة التخزين المؤقت لطبقات Docker في Blacksmith عندما تحتاج الخطة إلى مسارات ذات حزمة مثبتة؛ ويعيد استخدام مدخلات `docker_e2e_bare_image`/`docker_e2e_functional_image` المقدمة أو صور بصمة الحزمة الموجودة بدلا من إعادة البناء. يعاد محاولة سحب صور Docker بمهلة محدودة قدرها 180 ثانية لكل محاولة حتى يعاد سريعا تدفق registry/cache العالق بدلا من استهلاك معظم المسار الحرج لـ CI.
|
||||
يسأل سير عمل الحي/E2E القابل لإعادة الاستخدام `scripts/test-docker-all.mjs --plan-json` عن الحزمة ونوع الصورة وصورة الحي والمسار وتغطية بيانات الاعتماد المطلوبة. ثم يحوّل `scripts/docker-e2e.mjs` تلك الخطة إلى مخرجات GitHub وملخصات. إما أن يحزم OpenClaw عبر `scripts/package-openclaw-for-docker.mjs`، أو ينزّل أثر حزمة من التشغيل الحالي، أو ينزّل أثر حزمة من `package_artifact_run_id`؛ ويتحقق من مخزون tarball؛ ويبني ويدفع صور Docker E2E العارية/الوظيفية من GHCR الموسومة بملخص الحزمة عبر ذاكرة التخزين المؤقت لطبقات Docker الخاصة بـ Blacksmith عندما تحتاج الخطة إلى مسارات مثبتة الحزمة؛ ويعيد استخدام مدخلات `docker_e2e_bare_image`/`docker_e2e_functional_image` المقدمة أو صور ملخص الحزمة الموجودة بدلاً من إعادة البناء. تتم إعادة محاولة سحب صور Docker بمهلة محدودة قدرها 180 ثانية لكل محاولة حتى يعاد سريعاً أي تدفق سجل/ذاكرة تخزين مؤقت عالق بدلاً من استهلاك معظم المسار الحرج في CI.
|
||||
|
||||
### أجزاء مسار الإصدار
|
||||
|
||||
تعمل تغطية Docker للإصدار عبر مهام مجزأة أصغر باستخدام `OPENCLAW_SKIP_DOCKER_BUILD=1` بحيث يسحب كل جزء نوع الصورة الذي يحتاجه فقط وينفذ عدة مسارات عبر المجدول الموزون نفسه:
|
||||
تعمل تغطية Docker للإصدار في مهام مجزأة أصغر باستخدام `OPENCLAW_SKIP_DOCKER_BUILD=1` حتى يسحب كل جزء نوع الصورة الذي يحتاجه فقط وينفذ عدة مسارات عبر المجدول الموزون نفسه:
|
||||
|
||||
- `OPENCLAW_DOCKER_ALL_PROFILE=release-path`
|
||||
- `OPENCLAW_DOCKER_ALL_CHUNK=core | package-update-openai | package-update-anthropic | package-update-core | plugins-runtime-plugins | plugins-runtime-services | plugins-runtime-install-a..h`
|
||||
|
||||
أجزاء Docker الحالية للإصدار هي `core` و`package-update-openai` و`package-update-anthropic` و`package-update-core` و`plugins-runtime-plugins` و`plugins-runtime-services` ومن `plugins-runtime-install-a` إلى `plugins-runtime-install-h`. تبقى `plugins-runtime-core` و`plugins-runtime` و`plugins-integrations` أسماء مستعارة تجميعية للـ Plugin/runtime. ويبقى اسم المسار المستعار `install-e2e` اسم إعادة التشغيل اليدوي التجميعي لكلا مساري مثبّت المزود.
|
||||
أجزاء Docker الحالية للإصدار هي `core`، و`package-update-openai`، و`package-update-anthropic`، و`package-update-core`، و`plugins-runtime-plugins`، و`plugins-runtime-services`، ومن `plugins-runtime-install-a` حتى `plugins-runtime-install-h`. تبقى `plugins-runtime-core`، و`plugins-runtime`، و`plugins-integrations` أسماء مستعارة تجميعية للـ Plugin/وقت التشغيل. يبقى الاسم المستعار لمسار `install-e2e` اسم إعادة التشغيل اليدوي التجميعي لكل من مساري مثبّت الموفرين.
|
||||
|
||||
يدمج OpenWebUI في `plugins-runtime-services` عندما تطلبه تغطية مسار الإصدار الكاملة، ويحتفظ بجزء مستقل `openwebui` فقط للتشغيلات الخاصة بـ OpenWebUI وحده. تعيد مسارات تحديث القنوات المضمنة المحاولة مرة واحدة عند فشل شبكة npm العابر.
|
||||
يُدمج OpenWebUI في `plugins-runtime-services` عندما تطلبه تغطية مسار الإصدار الكاملة، ويحتفظ بجزء مستقل باسم `openwebui` فقط لعمليات الإرسال الخاصة بـ OpenWebUI وحده. تعيد مسارات تحديث القنوات المجمّعة المحاولة مرة واحدة عند حدوث أعطال شبكة npm عابرة.
|
||||
|
||||
يرفع كل جزء `.artifacts/docker-tests/` مع سجلات المسارات، والتوقيتات، و`summary.json`، و`failures.json`، وتوقيتات المراحل، وJSON خطة المجدول، وجداول المسارات البطيئة، وأوامر إعادة التشغيل لكل مسار. يشغل مدخل `docker_lanes` في سير العمل المسارات المحددة مقابل الصور المعدة بدلا من مهام الأجزاء، ما يبقي تصحيح المسار الفاشل محدودا في مهمة Docker موجهة واحدة ويجهز أو ينزل أو يعيد استخدام artifact الحزمة لذلك التشغيل؛ إذا كان المسار المحدد مسارا مباشرا في Docker، تبني المهمة الموجهة صورة الاختبار المباشر محليا لإعادة التشغيل تلك. تتضمن أوامر إعادة التشغيل في GitHub المولدة لكل مسار `package_artifact_run_id` و`package_artifact_name` ومدخلات الصور المعدة عندما تكون هذه القيم موجودة، حتى يستطيع المسار الفاشل إعادة استخدام الحزمة والصور الدقيقة من التشغيل الفاشل.
|
||||
يرفع كل جزء `.artifacts/docker-tests/` مع سجلات المسارات، والتوقيتات، و`summary.json`، و`failures.json`، وتوقيتات المراحل، وخطة المجدول بصيغة JSON، وجداول المسارات البطيئة، وأوامر إعادة التشغيل لكل مسار. يشغّل مدخل `docker_lanes` في سير العمل المسارات المحددة ضد الصور المحضرة بدلاً من مهام الأجزاء، ما يحصر تصحيح المسار الفاشل في مهمة Docker واحدة موجهة ويجهّز أثر الحزمة لذلك التشغيل أو ينزّله أو يعيد استخدامه؛ إذا كان المسار المحدد مسار Docker حياً، تبني المهمة الموجهة صورة الاختبار الحي محلياً لإعادة التشغيل تلك. تتضمن أوامر إعادة تشغيل GitHub المتولدة لكل مسار `package_artifact_run_id` و`package_artifact_name` ومدخلات الصور المحضرة عندما توجد تلك القيم، حتى يتمكن مسار فاشل من إعادة استخدام الحزمة والصور الدقيقة من التشغيل الفاشل.
|
||||
|
||||
```bash
|
||||
pnpm test:docker:rerun <run-id> # download Docker artifacts and print combined/per-lane targeted rerun commands
|
||||
pnpm test:docker:timings <summary> # slow-lane and phase critical-path summaries
|
||||
```
|
||||
|
||||
يشغّل سير العمل المباشر/E2E المجدول مجموعة Docker الكاملة لمسار الإصدار يوميا.
|
||||
يشغّل سير العمل الحي/E2E المجدول مجموعة Docker الكاملة لمسار الإصدار يومياً.
|
||||
|
||||
## Plugin Prerelease
|
||||
## الإصدار التمهيدي لـ Plugin
|
||||
|
||||
`Plugin Prerelease` تغطية منتج/حزمة أعلى تكلفة، لذلك هو سير عمل منفصل يطلقه `Full Release Validation` أو مشغل صريح. تبقي طلبات السحب العادية ودفعات `main` والتشغيلات اليدوية المستقلة لـ CI تلك المجموعة متوقفة. يوازن اختبارات Plugin المضمنة عبر ثمانية عمّال امتدادات؛ تشغّل مهام أجزاء الامتدادات هذه ما يصل إلى مجموعتي إعدادات Plugin في كل مرة مع عامل Vitest واحد لكل مجموعة وذاكرة Node أكبر حتى لا تنشئ دفعات Plugin كثيفة الاستيراد مهام CI إضافية. يجمع مسار Docker لما قبل الإصدار الخاص بالإصدار مسارات Docker الموجهة في مجموعات صغيرة لتجنب حجز عشرات المشغّلات لمهام مدتها من دقيقة إلى ثلاث دقائق.
|
||||
`Plugin Prerelease` هو تغطية منتج/حزمة أعلى تكلفة، لذلك فهو سير عمل منفصل يتم إرساله بواسطة `Full Release Validation` أو بواسطة مشغل صريح. تبقي طلبات السحب العادية، ودفعات `main`، وعمليات إرسال CI اليدوية المستقلة هذه المجموعة متوقفة. يوازن اختبارات Plugin المجمّع عبر ثمانية عمال إضافات؛ وتشغّل مهام أجزاء الإضافات هذه ما يصل إلى مجموعتي إعدادات Plugin في الوقت نفسه مع عامل Vitest واحد لكل مجموعة وذاكرة heap أكبر لـ Node حتى لا تنشئ دفعات Plugin كثيفة الاستيراد مهام CI إضافية. يجمع مسار Docker التمهيدي الخاص بالإصدار فقط مسارات Docker الموجهة في مجموعات صغيرة لتجنب حجز عشرات المشغلات لمهام مدتها من دقيقة إلى ثلاث دقائق.
|
||||
|
||||
## مختبر QA
|
||||
## مختبر ضمان الجودة
|
||||
|
||||
يملك مختبر QA مسارات CI مخصصة خارج سير العمل الرئيسي ذي النطاق الذكي. تكافؤ الوكلاء متداخل ضمن حزم QA والإصدار الواسعة، وليس سير عمل PR مستقلا. استخدم `Full Release Validation` مع `rerun_group=qa-parity` عندما ينبغي للتكافؤ أن يسير مع تشغيل تحقق واسع.
|
||||
لمختبر ضمان الجودة مسارات CI مخصصة خارج سير العمل الرئيسي ذي النطاق الذكي. التكافؤ الوكيلي متداخل ضمن حزم ضمان الجودة والإصدار الواسعة، وليس سير عمل PR مستقلاً. استخدم `Full Release Validation` مع `rerun_group=qa-parity` عندما ينبغي أن يرافق التكافؤ تشغيل تحقق واسعاً.
|
||||
|
||||
- يشغل سير العمل `QA-Lab - All Lanes` ليليا على `main` وعند التشغيل اليدوي؛ ويوسع مسار التكافؤ الوهمي، ومسار Matrix المباشر، ومساري Telegram وDiscord المباشرين كمهام متوازية. تستخدم المهام المباشرة بيئة `qa-live-shared`، ويستخدم Telegram/Discord عقود Convex.
|
||||
- يعمل سير عمل `QA-Lab - All Lanes` ليلاً على `main` وعند الإرسال اليدوي؛ ويشعّب مسار التكافؤ الوهمي، ومسار Matrix الحي، ومساري Telegram وDiscord الحيين كمهام متوازية. تستخدم المهام الحية بيئة `qa-live-shared`، ويستخدم Telegram/Discord إيجارات Convex.
|
||||
|
||||
تشغل فحوصات الإصدار مساري نقل Matrix وTelegram المباشرين مع المزود الوهمي الحتمي والنماذج المؤهلة وهميا (`mock-openai/gpt-5.5` و`mock-openai/gpt-5.5-alt`) حتى يعزل عقد القناة عن زمن استجابة النموذج المباشر وبدء Plugin المزود العادي. يعطل Gateway النقل المباشر بحث الذاكرة لأن تكافؤ QA يغطي سلوك الذاكرة على نحو منفصل؛ وتغطي الاتصال بالمزود مجموعات النموذج المباشر والمزود الأصلي ومزود Docker المنفصلة.
|
||||
تشغّل فحوصات الإصدار مسارات نقل Matrix وTelegram الحية مع الموفر الوهمي الحتمي والنماذج المؤهلة وهمياً (`mock-openai/gpt-5.5` و`mock-openai/gpt-5.5-alt`) حتى يعزل عقد القناة عن زمن استجابة النموذج الحي وبدء Plugin الموفر العادي. يعطّل Gateway النقل الحي بحث الذاكرة لأن تكافؤ ضمان الجودة يغطي سلوك الذاكرة بشكل منفصل؛ وتغطي اتصال الموفر مجموعات النموذج الحي، والموفر الأصلي، وموفر Docker المنفصلة.
|
||||
|
||||
تستخدم Matrix `--profile fast` للبوابات المجدولة وبوابات الإصدار، مع إضافة `--fail-fast` فقط عندما يدعمها CLI المحدد. تبقى القيمة الافتراضية لـ CLI ومدخل سير العمل اليدوي `all`؛ تشغيل `matrix_profile=all` اليدوي يقسم دائما تغطية Matrix الكاملة إلى مهام `transport` و`media` و`e2ee-smoke` و`e2ee-deep` و`e2ee-cli`.
|
||||
يستخدم Matrix الخيار `--profile fast` لبوابات الجدولة والإصدار، مع إضافة `--fail-fast` فقط عندما يدعمه CLI المفحوص. يبقى افتراضي CLI ومدخل سير العمل اليدوي `all`؛ وإرسال `matrix_profile=all` اليدوي يجزئ دائماً تغطية Matrix الكاملة إلى مهام `transport`، و`media`، و`e2ee-smoke`، و`e2ee-deep`، و`e2ee-cli`.
|
||||
|
||||
يشغل `OpenClaw Release Checks` أيضا مسارات مختبر QA الحرجة للإصدار قبل موافقة الإصدار؛ تشغل بوابة تكافؤ QA الخاصة به حزم المرشح والأساس كمهام مسارات متوازية، ثم تنزل كلا الـ artifacts في مهمة تقرير صغيرة للمقارنة النهائية للتكافؤ.
|
||||
يشغّل `OpenClaw Release Checks` أيضاً مسارات QA Lab الحرجة للإصدار قبل موافقة الإصدار؛ وتشغّل بوابة تكافؤ ضمان الجودة الخاصة به حزم المرشح وخط الأساس كمهام مسارات متوازية، ثم تنزّل كلا الأثرين في مهمة تقرير صغيرة للمقارنة النهائية للتكافؤ.
|
||||
|
||||
بالنسبة إلى طلبات السحب العادية، اتبع أدلة CI/الفحوصات ذات النطاق بدلا من التعامل مع التكافؤ كحالة مطلوبة.
|
||||
بالنسبة لطلبات السحب العادية، اتبع أدلة CI/الفحص المحددة النطاق بدلاً من التعامل مع التكافؤ كحالة مطلوبة.
|
||||
|
||||
## CodeQL
|
||||
|
||||
يركّز سير عمل `CodeQL` عمدًا على كونه ماسح أمان أوليًّا ضيق النطاق، وليس مسحًا شاملًا للمستودع بأكمله. تفحص عمليات الحراسة اليومية واليدوية وطلبات السحب غير المسودة كود سير عمل Actions إضافة إلى أسطح JavaScript/TypeScript الأعلى خطورة باستخدام استعلامات أمان عالية الثقة مفلترة إلى `security-severity` مرتفع/حرج.
|
||||
يُعد سير عمل `CodeQL` ماسح أمان أولي ضيق النطاق عن قصد، وليس فحصا شاملا للمستودع كاملا. تفحص عمليات الحماية اليومية واليدوية وطلبات السحب غير المسودة كود سير عمل Actions بالإضافة إلى أسطح JavaScript/TypeScript الأعلى خطورة باستخدام استعلامات أمان عالية الثقة مصفاة إلى `security-severity` العالية/الحرجة.
|
||||
|
||||
تبقى حراسة طلب السحب خفيفة: فهي تبدأ فقط للتغييرات ضمن `.github/actions` أو `.github/codeql` أو `.github/workflows` أو `packages` أو `src`، وتشغّل مصفوفة الأمان عالية الثقة نفسها مثل سير العمل المجدول. يبقى CodeQL الخاص بـ Android وmacOS خارج الإعدادات الافتراضية لطلبات السحب.
|
||||
يبقى حارس طلبات السحب خفيفا: فهو لا يبدأ إلا للتغييرات ضمن `.github/actions` أو `.github/codeql` أو `.github/workflows` أو `packages` أو `src`، ويشغل مصفوفة الأمان عالية الثقة نفسها التي يستخدمها سير العمل المجدول. يبقى CodeQL الخاصان بـ Android وmacOS خارج الإعدادات الافتراضية لطلبات السحب.
|
||||
|
||||
### فئات الأمان
|
||||
|
||||
| الفئة | السطح |
|
||||
| ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `/codeql-security-high/core-auth-secrets` | المصادقة، والأسرار، وبيئة العزل، وcron، وخط أساس Gateway |
|
||||
| `/codeql-security-high/channel-runtime-boundary` | عقود تنفيذ القنوات الأساسية إضافة إلى وقت تشغيل Plugin القناة، وGateway، وPlugin SDK، والأسرار، ونقاط لمس التدقيق |
|
||||
| `/codeql-security-high/network-ssrf-boundary` | أسطح SSRF الأساسية، وتحليل IP، وحارس الشبكة، وجلب الويب، وسياسة SSRF في Plugin SDK |
|
||||
| `/codeql-security-high/mcp-process-tool-boundary` | خوادم MCP، ومساعدات تنفيذ العمليات، والتسليم الصادر، وبوابات تنفيذ أدوات الوكيل |
|
||||
| `/codeql-security-high/plugin-trust-boundary` | أسطح الثقة لتثبيت Plugin، والمحمّل، والبيان، والسجل، وتثبيت مدير الحزم، وتحميل المصدر، وعقد حزمة Plugin SDK |
|
||||
| `/codeql-security-high/core-auth-secrets` | خط أساس المصادقة والأسرار وصندوق العزل وcron وgateway |
|
||||
| `/codeql-security-high/channel-runtime-boundary` | عقود تنفيذ القنوات الأساسية بالإضافة إلى وقت تشغيل Plugin القناة وgateway وPlugin SDK والأسرار ونقاط تماس التدقيق |
|
||||
| `/codeql-security-high/network-ssrf-boundary` | أسطح سياسة SSRF الأساسية، وتحليل IP، وحارس الشبكة، وجلب الويب، وسياسة SSRF في Plugin SDK |
|
||||
| `/codeql-security-high/mcp-process-tool-boundary` | خوادم MCP، ومساعدات تنفيذ العمليات، والتسليم الصادر، وبوابات تنفيذ أدوات الوكيل |
|
||||
| `/codeql-security-high/plugin-trust-boundary` | أسطح الثقة في تثبيت Plugin، والمحمّل، والبيان، والسجل، وتثبيت مدير الحزم، وتحميل المصدر، وعقد حزمة Plugin SDK |
|
||||
|
||||
### أجزاء الأمان الخاصة بالمنصة
|
||||
|
||||
- `CodeQL Android Critical Security` — جزء أمان Android مجدول. يبني تطبيق Android يدويًا لأجل CodeQL على أصغر مشغّل Blacksmith Linux تقبله سلامة سير العمل. يرفع ضمن `/codeql-critical-security/android`.
|
||||
- `CodeQL macOS Critical Security` — جزء أمان macOS أسبوعي/يدوي. يبني تطبيق macOS يدويًا لأجل CodeQL على Blacksmith macOS، ويصفّي نتائج بناء التبعيات من SARIF المرفوع، ويرفع ضمن `/codeql-critical-security/macos`. يُبقى خارج الإعدادات الافتراضية اليومية لأن بناء macOS يهيمن على وقت التشغيل حتى عندما يكون نظيفًا.
|
||||
- `CodeQL Android Critical Security` — جزء أمان Android المجدول. يبني تطبيق Android يدويا من أجل CodeQL على أصغر مشغل Blacksmith Linux يقبله فحص سلامة سير العمل. يرفع النتائج تحت `/codeql-critical-security/android`.
|
||||
- `CodeQL macOS Critical Security` — جزء أمان macOS الأسبوعي/اليدوي. يبني تطبيق macOS يدويا من أجل CodeQL على Blacksmith macOS، ويصفي نتائج بناء التبعيات خارج SARIF المرفوع، ويرفع النتائج تحت `/codeql-critical-security/macos`. يبقى خارج الإعدادات اليومية الافتراضية لأن بناء macOS يهيمن على وقت التشغيل حتى عندما يكون نظيفا.
|
||||
|
||||
### فئات الجودة الحرجة
|
||||
|
||||
`CodeQL Critical Quality` هو الجزء غير الأمني المطابق. يشغّل فقط استعلامات جودة JavaScript/TypeScript غير أمنية وبخطورة أخطاء على أسطح ضيقة عالية القيمة على مشغّل Blacksmith Linux الأصغر. حراسة طلب السحب الخاصة به أصغر عمدًا من الملف المجدول: طلبات السحب غير المسودة تشغّل فقط أجزاء `agent-runtime-boundary` و`config-boundary` و`core-auth-secrets` و`channel-runtime-boundary` و`gateway-runtime-boundary` و`memory-runtime-boundary` و`mcp-process-runtime-boundary` و`provider-runtime-boundary` و`session-diagnostics-boundary` و`plugin-boundary` و`plugin-sdk-package-contract` و`plugin-sdk-reply-runtime` المطابقة عند تغييرات كود تنفيذ أوامر/نماذج/أدوات الوكيل وإرسال الردود، أو كود مخطط/ترحيل/إدخال وإخراج الإعدادات، أو كود المصادقة/الأسرار/بيئة العزل/الأمان، أو وقت تشغيل القناة الأساسية وPlugin القناة المضمّن، أو بروتوكول Gateway/طريقة الخادم، أو وقت تشغيل الذاكرة/لصق SDK، أو MCP/العملية/التسليم الصادر، أو وقت تشغيل المزوّد/كتالوج النماذج، أو تشخيصات الجلسة/طوابير التسليم، أو محمّل Plugin، أو Plugin SDK/عقد الحزمة، أو وقت تشغيل رد Plugin SDK. تغييرات إعدادات CodeQL وسير عمل الجودة تشغّل كل أجزاء جودة طلب السحب الاثني عشر.
|
||||
`CodeQL Critical Quality` هو الجزء غير الأمني المطابق. يشغل فقط استعلامات جودة JavaScript/TypeScript غير الأمنية وذات شدة الخطأ على أسطح ضيقة عالية القيمة على مشغل Blacksmith Linux الأصغر. حارس طلبات السحب الخاص به أصغر عمدا من الملف المجدول: طلبات السحب غير المسودة لا تشغل إلا أجزاء `agent-runtime-boundary` و`config-boundary` و`core-auth-secrets` و`channel-runtime-boundary` و`gateway-runtime-boundary` و`memory-runtime-boundary` و`mcp-process-runtime-boundary` و`provider-runtime-boundary` و`session-diagnostics-boundary` و`plugin-boundary` و`plugin-sdk-package-contract` و`plugin-sdk-reply-runtime` المطابقة لتغييرات كود تنفيذ أوامر/نماذج/أدوات الوكيل وإرسال الردود، وكود مخطط/ترحيل/إدخال وإخراج الإعدادات، وكود المصادقة/الأسرار/صندوق العزل/الأمان، ووقت تشغيل القناة الأساسية وPlugin القناة المضمنة، وبروتوكول Gateway/طريقة الخادم، ووقت تشغيل الذاكرة/ربط SDK، وMCP/العمليات/التسليم الصادر، ووقت تشغيل المزود/كتالوج النماذج، وتشخيص الجلسات/طوابير التسليم، ومحمّل Plugin، وPlugin SDK/عقد الحزمة، أو وقت تشغيل ردود Plugin SDK. تشغل تغييرات إعدادات CodeQL وسير عمل الجودة كل أجزاء الجودة الاثني عشر الخاصة بطلبات السحب.
|
||||
|
||||
يقبل التشغيل اليدوي:
|
||||
|
||||
@ -433,40 +433,40 @@ pnpm test:docker:timings <summary> # slow-lane and phase critical-path summari
|
||||
profile=all|agent-runtime-boundary|config-boundary|core-auth-secrets|channel-runtime-boundary|gateway-runtime-boundary|memory-runtime-boundary|mcp-process-runtime-boundary|plugin-boundary|plugin-sdk-package-contract|plugin-sdk-reply-runtime|provider-runtime-boundary|session-diagnostics-boundary
|
||||
```
|
||||
|
||||
الملفات الضيقة هي نقاط تعليم/تكرار لتشغيل جزء جودة واحد بمعزل.
|
||||
الملفات الضيقة هي أدوات تعليم/تكرار لتشغيل جزء جودة واحد بمعزل عن غيره.
|
||||
|
||||
| الفئة | السطح |
|
||||
| ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `/codeql-critical-quality/core-auth-secrets` | كود حدود أمان المصادقة، والأسرار، وبيئة العزل، وcron، وGateway |
|
||||
| `/codeql-critical-quality/config-boundary` | عقود مخطط الإعدادات، والترحيل، والتطبيع، والإدخال والإخراج |
|
||||
| `/codeql-critical-quality/gateway-runtime-boundary` | مخططات بروتوكول Gateway وعقود طرق الخادم |
|
||||
| `/codeql-critical-quality/channel-runtime-boundary` | عقود تنفيذ القناة الأساسية وPlugin القناة المضمّن |
|
||||
| `/codeql-critical-quality/agent-runtime-boundary` | تنفيذ الأوامر، وإرسال النموذج/المزوّد، وإرسال الرد التلقائي والطوابير، وعقود وقت تشغيل مستوى تحكم ACP |
|
||||
| `/codeql-critical-quality/mcp-process-runtime-boundary` | خوادم MCP وجسور الأدوات، ومساعدات إشراف العمليات، وعقود التسليم الصادر |
|
||||
| `/codeql-critical-quality/memory-runtime-boundary` | SDK مضيف الذاكرة، وواجهات وقت تشغيل الذاكرة، وأسماء Plugin SDK المستعارة للذاكرة، ولصق تفعيل وقت تشغيل الذاكرة، وأوامر doctor للذاكرة |
|
||||
| `/codeql-critical-quality/session-diagnostics-boundary` | داخليات طابور الردود، وطوابير تسليم الجلسات، ومساعدات ربط/تسليم الجلسات الصادرة، وأسطح حزمة أحداث/سجلات التشخيص، وعقود CLI الخاصة بـ doctor للجلسات |
|
||||
| `/codeql-critical-quality/plugin-sdk-reply-runtime` | إرسال الردود الواردة في Plugin SDK، ومساعدات حمولة/تجزئة/وقت تشغيل الردود، وخيارات رد القناة، وطوابير التسليم، ومساعدات ربط الجلسة/الخيط |
|
||||
| `/codeql-critical-quality/provider-runtime-boundary` | تطبيع كتالوج النماذج، ومصادقة المزوّد واكتشافه، وتسجيل وقت تشغيل المزوّد، وافتراضيات/كتالوجات المزوّد، وسجلات الويب/البحث/الجلب/التضمين |
|
||||
| `/codeql-critical-quality/ui-control-plane` | تمهيد واجهة التحكم، والاستمرارية المحلية، وتدفقات تحكم Gateway، وعقود وقت تشغيل مستوى التحكم بالمهام |
|
||||
| `/codeql-critical-quality/web-media-runtime-boundary` | عقود وقت تشغيل جلب/بحث الويب الأساسي، وإدخال وإخراج الوسائط، وفهم الوسائط، وتوليد الصور، وتوليد الوسائط |
|
||||
| `/codeql-critical-quality/plugin-boundary` | عقود نقطة دخول المحمّل، والسجل، والسطح العام، وPlugin SDK |
|
||||
| `/codeql-critical-quality/plugin-sdk-package-contract` | مصدر Plugin SDK المنشور من جهة الحزمة ومساعدات عقد حزمة Plugin |
|
||||
| الفئة | السطح |
|
||||
| ------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `/codeql-critical-quality/core-auth-secrets` | كود حدود أمان المصادقة والأسرار وصندوق العزل وcron وgateway |
|
||||
| `/codeql-critical-quality/config-boundary` | عقود مخطط الإعدادات والترحيل والتطبيع والإدخال/الإخراج |
|
||||
| `/codeql-critical-quality/gateway-runtime-boundary` | مخططات بروتوكول Gateway وعقود طرق الخادم |
|
||||
| `/codeql-critical-quality/channel-runtime-boundary` | عقود تنفيذ القناة الأساسية وPlugin القناة المضمنة |
|
||||
| `/codeql-critical-quality/agent-runtime-boundary` | عقود تنفيذ الأوامر، وإرسال النموذج/المزود، وإرسال الرد التلقائي والطوابير، ووقت تشغيل مستوى تحكم ACP |
|
||||
| `/codeql-critical-quality/mcp-process-runtime-boundary` | خوادم MCP وجسور الأدوات، ومساعدات الإشراف على العمليات، وعقود التسليم الصادر |
|
||||
| `/codeql-critical-quality/memory-runtime-boundary` | SDK مضيف الذاكرة، وواجهات وقت تشغيل الذاكرة، وأسماء Plugin SDK المستعارة للذاكرة، وربط تفعيل وقت تشغيل الذاكرة، وأوامر طبيب الذاكرة |
|
||||
| `/codeql-critical-quality/session-diagnostics-boundary` | داخليات طابور الردود، وطوابير تسليم الجلسات، ومساعدات ربط/تسليم الجلسات الصادرة، وأسطح حزم أحداث/سجلات التشخيص، وعقود CLI طبيب الجلسات |
|
||||
| `/codeql-critical-quality/plugin-sdk-reply-runtime` | إرسال الردود الواردة في Plugin SDK، ومساعدات حمولة الرد/تجزئته/وقت تشغيله، وخيارات رد القنوات، وطوابير التسليم، ومساعدات ربط الجلسات/المحادثات |
|
||||
| `/codeql-critical-quality/provider-runtime-boundary` | تطبيع كتالوج النماذج، ومصادقة المزود واكتشافه، وتسجيل وقت تشغيل المزود، وافتراضيات/كتالوجات المزود، وسجلات الويب/البحث/الجلب/التضمين |
|
||||
| `/codeql-critical-quality/ui-control-plane` | تمهيد واجهة التحكم، والاستمرارية المحلية، وتدفقات تحكم Gateway، وعقود وقت تشغيل مستوى التحكم بالمهام |
|
||||
| `/codeql-critical-quality/web-media-runtime-boundary` | جلب/بحث الويب الأساسي، وإدخال/إخراج الوسائط، وفهم الوسائط، وتوليد الصور، وعقود وقت تشغيل توليد الوسائط |
|
||||
| `/codeql-critical-quality/plugin-boundary` | عقود المحمّل والسجل والسطح العام ونقطة دخول Plugin SDK |
|
||||
| `/codeql-critical-quality/plugin-sdk-package-contract` | مصدر Plugin SDK المنشور من جانب الحزمة ومساعدات عقد حزمة Plugin |
|
||||
|
||||
تبقى الجودة منفصلة عن الأمان لكي يمكن جدولة نتائج الجودة أو قياسها أو تعطيلها أو توسيعها دون حجب إشارة الأمان. يجب إعادة إضافة توسعة CodeQL لـ Swift وPython وPlugins المضمّنة كعمل لاحق محدد النطاق أو مجزأ فقط بعد أن تصبح الملفات الضيقة مستقرة في وقت التشغيل والإشارة.
|
||||
تبقى الجودة منفصلة عن الأمان كي يمكن جدولة نتائج الجودة أو قياسها أو تعطيلها أو توسيعها دون حجب إشارة الأمان. ينبغي أن تضاف توسعة CodeQL الخاصة بـ Swift وPython وPlugins المضمنة مرة أخرى كعمل متابعة محدود النطاق أو مقسم إلى أجزاء فقط بعد أن تصبح الملفات الضيقة مستقرة في وقت التشغيل والإشارة.
|
||||
|
||||
## سير عمل الصيانة
|
||||
|
||||
### Docs Agent
|
||||
### وكيل المستندات
|
||||
|
||||
سير عمل `Docs Agent` هو مسار صيانة Codex قائم على الأحداث لإبقاء المستندات الحالية متوافقة مع التغييرات التي هبطت حديثًا. لا يملك جدولًا صرفًا: يمكن لتشغيل CI ناجح من دفع غير آلي على `main` أن يفعّله، ويمكن للتشغيل اليدوي أن يشغّله مباشرة. تتخطى استدعاءات workflow-run عندما يكون `main` قد تقدّم أو عندما يكون تشغيل `Docs Agent` آخر غير متخطى قد أُنشئ خلال الساعة الماضية. عندما يعمل، يراجع نطاق الالتزامات من SHA مصدر `Docs Agent` السابق غير المتخطى إلى `main` الحالي، بحيث يمكن لتشغيل واحد كل ساعة أن يغطي كل تغييرات main المتراكمة منذ آخر مرور على المستندات.
|
||||
سير عمل `Docs Agent` هو مسار صيانة Codex مدفوع بالأحداث لإبقاء المستندات الحالية متوافقة مع التغييرات التي وصلت مؤخرا. ليس له جدول محض: يمكن لتشغيل CI ناجح من دفعة غير آلية على `main` أن يشغله، كما يمكن للتشغيل اليدوي أن يشغله مباشرة. تتخطى استدعاءات workflow-run التشغيل عندما يكون `main` قد تقدم أو عندما يكون تشغيل آخر غير متخطى من Docs Agent قد أنشئ خلال الساعة الماضية. عندما يعمل، يراجع نطاق الالتزامات من SHA المصدر السابق غير المتخطى لـ Docs Agent إلى `main` الحالي، بحيث يمكن لتشغيل واحد كل ساعة أن يغطي كل تغييرات main المتراكمة منذ آخر مرور على المستندات.
|
||||
|
||||
### Test Performance Agent
|
||||
### وكيل أداء الاختبارات
|
||||
|
||||
سير عمل `Test Performance Agent` هو مسار صيانة Codex قائم على الأحداث للاختبارات البطيئة. لا يملك جدولًا صرفًا: يمكن لتشغيل CI ناجح من دفع غير آلي على `main` أن يفعّله، لكنه يتخطى إذا كان استدعاء workflow-run آخر قد شُغّل بالفعل أو قيد التشغيل في ذلك اليوم حسب UTC. يتجاوز التشغيل اليدوي بوابة النشاط اليومية هذه. يبني المسار تقرير أداء Vitest مجمّعًا لكامل الحزمة، ويسمح لـ Codex بإجراء إصلاحات صغيرة فقط لأداء الاختبارات مع الحفاظ على التغطية بدلًا من إعادة هيكلة واسعة، ثم يعيد تشغيل تقرير كامل الحزمة ويرفض التغييرات التي تقلل عدد اختبارات خط الأساس الناجحة. إذا كان خط الأساس يحتوي على اختبارات فاشلة، يجوز لـ Codex إصلاح الإخفاقات الواضحة فقط ويجب أن ينجح تقرير كامل الحزمة بعد الوكيل قبل الالتزام بأي شيء. عندما يتقدم `main` قبل وصول دفع البوت، يعيد المسار تطبيق التصحيح المتحقق منه فوقه، ويعيد تشغيل `pnpm check:changed`، ويعيد محاولة الدفع؛ أما التصحيحات القديمة المتعارضة فتُتخطى. يستخدم Ubuntu المستضاف على GitHub حتى يستطيع إجراء Codex الحفاظ على وضع السلامة نفسه بإسقاط sudo كما في وكيل المستندات.
|
||||
سير عمل `Test Performance Agent` هو مسار صيانة Codex مدفوع بالأحداث للاختبارات البطيئة. ليس له جدول محض: يمكن لتشغيل CI ناجح من دفعة غير آلية على `main` أن يشغله، لكنه يتخطى التنفيذ إذا كان استدعاء workflow-run آخر قد شغل أو لا يزال يشغل في ذلك اليوم بتوقيت UTC. يتجاوز التشغيل اليدوي بوابة النشاط اليومية هذه. يبني المسار تقرير أداء Vitest مجمعا للحزمة الكاملة، ويسمح لـ Codex بإجراء إصلاحات أداء اختبارات صغيرة تحافظ على التغطية فقط بدلا من إعادة هيكلة واسعة، ثم يعيد تشغيل تقرير الحزمة الكاملة ويرفض التغييرات التي تقلل عدد الاختبارات الناجحة في خط الأساس. إذا كان خط الأساس يحتوي على اختبارات فاشلة، يجوز لـ Codex إصلاح الإخفاقات الواضحة فقط، ويجب أن ينجح تقرير الحزمة الكاملة بعد الوكيل قبل الالتزام بأي شيء. عندما يتقدم `main` قبل وصول دفعة الروبوت، يعيد المسار تأسيس الرقعة المتحقق منها، ويعيد تشغيل `pnpm check:changed`، ويعيد محاولة الدفع؛ وتتخطى الرقع القديمة المتعارضة. يستخدم Ubuntu المستضاف على GitHub كي يتمكن إجراء Codex من الحفاظ على موقف السلامة نفسه الخاص بإسقاط sudo مثل وكيل المستندات.
|
||||
|
||||
### طلبات السحب المكررة بعد الدمج
|
||||
|
||||
سير عمل `Duplicate PRs After Merge` هو سير عمل يدوي للمشرفين لتنظيف التكرارات بعد الهبوط. يضبط افتراضيًا على التشغيل الجاف ولا يغلق إلا طلبات السحب المذكورة صراحة عندما يكون `apply=true`. قبل تعديل GitHub، يتحقق من أن طلب السحب الهابط مدموج وأن كل تكرار يملك إما قضية مرجعية مشتركة أو مقاطع تغييرات متداخلة.
|
||||
سير عمل `Duplicate PRs After Merge` هو سير عمل يدوي للمشرفين لتنظيف التكرارات بعد الوصول. يكون افتراضيا في وضع التجربة الجافة ولا يغلق إلا طلبات السحب المدرجة صراحة عندما تكون `apply=true`. قبل تعديل GitHub، يتحقق من أن طلب السحب الواصل مدموج وأن كل تكرار لديه إما مشكلة مشار إليها مشتركة أو مقاطع تغييرات متداخلة.
|
||||
|
||||
```bash
|
||||
gh workflow run duplicate-after-merge.yml \
|
||||
@ -477,27 +477,27 @@ gh workflow run duplicate-after-merge.yml \
|
||||
|
||||
## بوابات الفحص المحلية وتوجيه التغييرات
|
||||
|
||||
تعيش منطق مسارات التغييرات المحلية في `scripts/changed-lanes.mjs` وتُنفّذ بواسطة `scripts/check-changed.mjs`. بوابة الفحص المحلية هذه أكثر صرامة بخصوص حدود البنية من نطاق منصة CI الواسع:
|
||||
تعيش منطق مسارات التغيير المحلية في `scripts/changed-lanes.mjs` ويتم تنفيذها بواسطة `scripts/check-changed.mjs`. بوابة الفحص المحلية هذه أكثر صرامة بشأن حدود المعمارية من نطاق منصة CI الواسع:
|
||||
|
||||
- تغييرات الإنتاج الأساسية تشغّل فحص أنواع الإنتاج الأساسي وفحص أنواع اختبارات الأساس إضافة إلى lint/الحراس الأساسيين؛
|
||||
- تغييرات الاختبارات الأساسية فقط تشغّل فقط فحص أنواع اختبارات الأساس إضافة إلى lint الأساسي؛
|
||||
- تغييرات إنتاج الإضافات تشغّل فحص أنواع إنتاج الإضافات واختبارات الإضافات إضافة إلى lint الإضافات؛
|
||||
- تغييرات اختبارات الإضافات فقط تشغّل فحص أنواع اختبارات الإضافات إضافة إلى lint الإضافات؛
|
||||
- تغييرات Plugin SDK العام أو عقد Plugin تتوسع إلى فحص أنواع الإضافات لأن الإضافات تعتمد على تلك العقود الأساسية (تبقى عمليات مسح إضافات Vitest عمل اختبار صريحًا)؛
|
||||
- زيادات الإصدار الخاصة ببيانات الإصدار الوصفية فقط تشغّل فحوصات إصدار/إعدادات/تبعية جذر مستهدفة؛
|
||||
- تغييرات الإنتاج الأساسية تشغل فحص أنواع الإنتاج الأساسي واختبارات الأساس بالإضافة إلى فحص أنواع الاختبارات الأساسية ولنت الأساس/الحراس؛
|
||||
- تغييرات الاختبارات الأساسية فقط تشغل فقط فحص أنواع الاختبارات الأساسية بالإضافة إلى لنت الأساس؛
|
||||
- تغييرات إنتاج الإضافات تشغل فحص أنواع إنتاج الإضافات واختبارات الإضافات بالإضافة إلى لنت الإضافات؛
|
||||
- تغييرات اختبارات الإضافات فقط تشغل فحص أنواع اختبارات الإضافات بالإضافة إلى لنت الإضافات؛
|
||||
- توسع تغييرات Plugin SDK العام أو عقد Plugin إلى فحص أنواع الإضافات لأن الإضافات تعتمد على تلك العقود الأساسية (تبقى فحوصات Vitest للإضافات عملا اختباريا صريحا)؛
|
||||
- زيادات الإصدارات الخاصة ببيانات الإصدار الوصفية فقط تشغل فحوصات موجهة للإصدار/الإعدادات/تبعية الجذر؛
|
||||
- تغييرات الجذر/الإعدادات غير المعروفة تفشل بأمان إلى كل مسارات الفحص.
|
||||
|
||||
يعيش توجيه اختبارات التغييرات المحلية في `scripts/test-projects.test-support.mjs` وهو أرخص عمدًا من `check:changed`: تعديلات الاختبارات المباشرة تشغّل نفسها، وتعديلات المصدر تفضّل التعيينات الصريحة، ثم اختبارات الأشقاء والاعتمادات في رسم الاستيراد. إعداد تسليم غرفة المجموعة المشتركة هو أحد التعيينات الصريحة: تغييرات إعداد الرد المرئي للمجموعة، أو وضع تسليم رد المصدر، أو موجّه مطالبة نظام أداة الرسائل تمر عبر اختبارات الرد الأساسية إضافة إلى انحدارات تسليم Discord وSlack حتى تفشل تغييرات افتراض مشترك قبل أول دفع لطلب السحب. استخدم `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` فقط عندما يكون التغيير واسعًا على مستوى الحاضنة بما يكفي لجعل المجموعة المعيّنة الرخيصة وكيلًا غير موثوق.
|
||||
تعيش توجيهات الاختبارات المحلية المتغيرة في `scripts/test-projects.test-support.mjs` وهي أرخص عمدا من `check:changed`: تعديلات الاختبارات المباشرة تشغل نفسها، وتفضل تعديلات المصدر الخرائط الصريحة، ثم اختبارات الأشقاء والاعتمادات في مخطط الاستيراد. إعداد تسليم غرفة المجموعة المشتركة هو أحد الخرائط الصريحة: التغييرات على إعداد الرد المرئي للمجموعة، أو وضع تسليم رد المصدر، أو مطالبة نظام أداة الرسائل تمر عبر اختبارات الرد الأساسية بالإضافة إلى انحدارات تسليم Discord وSlack، بحيث يفشل تغيير افتراضي مشترك قبل أول دفع لطلب السحب. استخدم `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` فقط عندما يكون التغيير واسعا على مستوى الحزمة الاختبارية بما يكفي بحيث لا تكون المجموعة الرخيصة المرسومة وكيلا موثوقا.
|
||||
|
||||
## تحقق Testbox
|
||||
|
||||
شغّل Testbox من جذر المستودع وفضّل صندوقًا جديدًا مُحمّى مسبقًا للإثبات الواسع. قبل إنفاق بوابة بطيئة على صندوق أُعيد استخدامه، أو انتهت صلاحيته، أو أبلغ للتو عن مزامنة كبيرة على نحو غير متوقع، شغّل `pnpm testbox:sanity` داخل الصندوق أولًا.
|
||||
شغّل Testbox من جذر المستودع، وفضّل صندوقًا جديدًا مُدفّأ مسبقًا للإثبات واسع النطاق. قبل إنفاق بوابة تحقق بطيئة على صندوق أُعيد استخدامه، أو انتهت صلاحيته، أو أبلغ للتو عن مزامنة كبيرة على نحو غير متوقع، شغّل `pnpm testbox:sanity` داخل الصندوق أولًا.
|
||||
|
||||
يفشل فحص السلامة بسرعة عندما تختفي ملفات الجذر المطلوبة مثل `pnpm-lock.yaml` أو عندما يعرض `git status --short` ما لا يقل عن 200 عملية حذف لملفات متتبعة. يعني ذلك عادةً أن حالة المزامنة البعيدة ليست نسخة موثوقة من PR؛ أوقف ذلك الصندوق وحمِّ صندوقًا جديدًا بدلًا من تصحيح فشل اختبار المنتج. بالنسبة إلى PRs ذات عمليات الحذف الكبيرة المقصودة، عيّن `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` لتشغيل فحص السلامة ذاك.
|
||||
يفشل فحص السلامة سريعًا عندما تختفي ملفات الجذر المطلوبة مثل `pnpm-lock.yaml` أو عندما يعرض `git status --short` ما لا يقل عن 200 حذف متعقّب. يعني ذلك عادةً أن حالة المزامنة البعيدة ليست نسخة موثوقة من PR؛ أوقف ذلك الصندوق ودفّئ صندوقًا جديدًا بدلًا من تصحيح فشل اختبار المنتج. بالنسبة إلى PRs ذات الحذف الكبير المقصود، عيّن `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` لتشغيل فحص السلامة ذلك.
|
||||
|
||||
ينهي `pnpm testbox:run` أيضًا استدعاء Blacksmith CLI محليًا إذا بقي في مرحلة المزامنة لأكثر من خمس دقائق بدون مخرجات بعد المزامنة. عيّن `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` لتعطيل ذلك الحارس، أو استخدم قيمة أكبر بالمللي ثانية للفروقات المحلية الكبيرة بشكل غير معتاد.
|
||||
ينهي `pnpm testbox:run` أيضًا استدعاء Blacksmith CLI محليًا إذا بقي في مرحلة المزامنة لأكثر من خمس دقائق من دون مخرجات بعد المزامنة. عيّن `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` لتعطيل هذا الحارس، أو استخدم قيمة أكبر بالميلي ثانية للفروقات المحلية الكبيرة على نحو غير معتاد.
|
||||
|
||||
Crabbox هو مسار الصندوق البعيد الثاني المملوك للمستودع لإثبات Linux عندما لا يكون Blacksmith متاحًا أو عندما تكون سعة السحابة المملوكة مفضلة. حمِّ صندوقًا، واملأه عبر سير عمل المشروع، ثم شغّل الأوامر عبر Crabbox CLI:
|
||||
Crabbox هو المسار الثاني المملوك للمستودع للصناديق البعيدة لإثبات Linux عندما لا يكون Blacksmith متاحًا أو عندما تكون السعة السحابية المملوكة مفضلة. دفّئ صندوقًا، واملأه عبر سير عمل المشروع، ثم شغّل الأوامر عبر Crabbox CLI:
|
||||
|
||||
```bash
|
||||
pnpm crabbox:warmup -- --idle-timeout 90m
|
||||
@ -506,7 +506,7 @@ pnpm crabbox:run -- --id <cbx_id> --shell "OPENCLAW_TESTBOX=1 pnpm check:changed
|
||||
pnpm crabbox:stop -- <cbx_id>
|
||||
```
|
||||
|
||||
تمتلك `.crabbox.yaml` الإعدادات الافتراضية للمزوّد والمزامنة وملء GitHub Actions. وهي تستثني `.git` المحلي بحيث يحتفظ checkout المملوء من Actions ببيانات Git الوصفية البعيدة الخاصة به بدلًا من مزامنة مستودعات remotes ومخازن objects المحلية الخاصة بالمشرف، وتستثني مصنوعات وقت التشغيل/البناء المحلية التي يجب ألا تُنقل أبدًا. تمتلك `.github/workflows/crabbox-hydrate.yml` إعداد checkout وNode/pnpm وجلب `origin/main` وتسليم البيئة غير السرية التي تستوردها لاحقًا أوامر `crabbox run --id <cbx_id>`.
|
||||
تملك `.crabbox.yaml` الإعدادات الافتراضية للمزوّد والمزامنة وملء GitHub Actions. وهي تستبعد `.git` المحلي حتى يحتفظ checkout المملوء عبر Actions ببيانات Git الوصفية البعيدة الخاصة به بدلًا من مزامنة remotes ومخازن الكائنات المحلية للمشرف، كما تستبعد artifacts المحلية الخاصة بوقت التشغيل/البناء التي يجب ألا تُنقل أبدًا. يملك `.github/workflows/crabbox-hydrate.yml` checkout وإعداد Node/pnpm وجلب `origin/main` وتسليم البيئة غير السرية التي تستوردها أوامر `crabbox run --id <cbx_id>` اللاحقة.
|
||||
|
||||
## ذات صلة
|
||||
|
||||
|
||||
@ -2,150 +2,149 @@
|
||||
read_when:
|
||||
- تحرير نص موجّه النظام، أو قائمة الأدوات، أو أقسام الوقت/Heartbeat
|
||||
- تغيير سلوك تمهيد مساحة العمل أو حقن Skills
|
||||
summary: ما الذي يحتوي عليه موجّه النظام في OpenClaw وكيف يتم تجميعه
|
||||
summary: ما يحتويه موجّه نظام OpenClaw وكيفية تجميعه
|
||||
title: موجّه النظام
|
||||
x-i18n:
|
||||
generated_at: "2026-05-02T22:18:29Z"
|
||||
generated_at: "2026-05-02T23:39:15Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: 3b8761a8722bb328b937e0832774be7b4e99602ae032c9a255f26843237c110c
|
||||
source_hash: f8e0234453812c16cf5d273096d335049bf435ca76ade36200caf4bb344624e5
|
||||
source_path: concepts/system-prompt.md
|
||||
workflow: 16
|
||||
---
|
||||
|
||||
OpenClaw يبني موجه نظام مخصصًا لكل تشغيل للوكيل. الموجه **مملوك لـ OpenClaw** ولا يستخدم الموجه الافتراضي لـ pi-coding-agent.
|
||||
ينشئ OpenClaw موجّه نظام مخصصًا لكل تشغيل وكيل. الموجّه **مملوك لـ OpenClaw** ولا يستخدم موجّه pi-coding-agent الافتراضي.
|
||||
|
||||
يُجمَّع الموجه بواسطة OpenClaw ويُحقن في كل تشغيل للوكيل.
|
||||
يجمّع OpenClaw الموجّه ويحقنه في كل تشغيل وكيل.
|
||||
|
||||
يمكن لـ Provider plugins الإسهام بإرشادات موجه واعية بالتخزين المؤقت من دون استبدال
|
||||
الموجه الكامل المملوك لـ OpenClaw. يمكن لوقت تشغيل المزود أن:
|
||||
يمكن لـ Plugins المزوّد أن تساهم بإرشادات موجّه واعية بذاكرة التخزين المؤقت دون استبدال
|
||||
الموجّه الكامل المملوك لـ OpenClaw. يمكن لوقت تشغيل المزوّد أن:
|
||||
|
||||
- يستبدل مجموعة صغيرة من الأقسام الأساسية المسماة (`interaction_style`,
|
||||
- يستبدل مجموعة صغيرة من أقسام النواة المسماة (`interaction_style`,
|
||||
`tool_call_style`, `execution_bias`)
|
||||
- يحقن **بادئة مستقرة** فوق حد ذاكرة التخزين المؤقت للموجه
|
||||
- يحقن **لاحقة ديناميكية** أسفل حد ذاكرة التخزين المؤقت للموجه
|
||||
- يحقن **بادئة مستقرة** أعلى حد ذاكرة تخزين الموجّه المؤقتة
|
||||
- يحقن **لاحقة ديناميكية** أسفل حد ذاكرة تخزين الموجّه المؤقتة
|
||||
|
||||
استخدم إسهامات مملوكة للمزود للضبط الخاص بعائلات النماذج. أبقِ تعديل الموجه القديم
|
||||
`before_prompt_build` للتوافق أو لتغييرات الموجه العامة حقًا، وليس لسلوك المزود العادي.
|
||||
استخدم مساهمات مملوكة للمزوّد للضبط الخاص بعائلة النموذج. أبقِ تحوير الموجّه القديم
|
||||
`before_prompt_build` للتوافق أو لتغييرات الموجّه العامة فعلًا، وليس لسلوك المزوّد المعتاد.
|
||||
|
||||
يحافظ تراكب عائلة OpenAI GPT-5 على قاعدة التنفيذ الأساسية صغيرة ويضيف
|
||||
إرشادات خاصة بالنموذج لتثبيت الشخصية، والإخراج الموجز، وانضباط الأدوات،
|
||||
والبحث الموازي، وتغطية المخرجات، والتحقق، والسياق المفقود، ونظافة أداة الطرفية.
|
||||
يبقي تراكب عائلة OpenAI GPT-5 قاعدة التنفيذ الأساسية صغيرة ويضيف
|
||||
إرشادات خاصة بالنموذج لتثبيت الشخصية، والإخراج الموجز، والانضباط في استخدام الأدوات،
|
||||
والبحث الموازي، وتغطية المخرجات المطلوبة، والتحقق، والسياق الناقص، ونظافة أداة الطرفية.
|
||||
|
||||
## البنية
|
||||
|
||||
الموجه مضغوط عمدًا ويستخدم أقسامًا ثابتة:
|
||||
الموجّه مضغوط عمدًا ويستخدم أقسامًا ثابتة:
|
||||
|
||||
- **الأدوات**: تذكير بمصدر الحقيقة للأداة المهيكلة مع إرشادات استخدام الأدوات وقت التشغيل.
|
||||
- **تحيز التنفيذ**: إرشادات متابعة مضغوطة: التصرف ضمن الدوران عند
|
||||
الطلبات القابلة للتنفيذ، والاستمرار حتى الاكتمال أو الحظر، والتعافي من نتائج الأدوات
|
||||
الضعيفة، والتحقق من الحالة القابلة للتغير مباشرة، والتحقق قبل الإنهاء.
|
||||
- **السلامة**: تذكير قصير بالحواجز لتجنب السلوك الساعي للسلطة أو تجاوز الإشراف.
|
||||
- **الأدوات**: تذكير بمصدر الحقيقة للأداة المنظمة مع إرشادات وقت التشغيل لاستخدام الأدوات.
|
||||
- **انحياز التنفيذ**: إرشادات متابعة مضغوطة: التصرف ضمن الدور عند
|
||||
الطلبات القابلة للتنفيذ، والاستمرار حتى الاكتمال أو التعطل، والتعافي من نتائج الأدوات
|
||||
الضعيفة، وفحص الحالة القابلة للتغيير مباشرة، والتحقق قبل الإنهاء.
|
||||
- **السلامة**: تذكير قصير بضوابط الحماية لتجنب سلوك السعي إلى السلطة أو تجاوز الإشراف.
|
||||
- **Skills** (عند توفرها): يخبر النموذج بكيفية تحميل تعليمات Skills عند الطلب.
|
||||
- **التحديث الذاتي لـ OpenClaw**: كيفية فحص الإعدادات بأمان باستخدام
|
||||
`config.schema.lookup`، وتصحيح الإعدادات باستخدام `config.patch`، واستبدال الإعدادات الكاملة
|
||||
باستخدام `config.apply`، وتشغيل `update.run` فقط بناءً على طلب صريح من المستخدم.
|
||||
كما ترفض أداة `gateway` المخصصة للمالك فقط إعادة كتابة
|
||||
كما ترفض أداة `gateway` الخاصة بالمالك فقط إعادة كتابة
|
||||
`tools.exec.ask` / `tools.exec.security`، بما في ذلك الأسماء المستعارة القديمة `tools.bash.*`
|
||||
التي تُطبَّع إلى مسارات exec المحمية تلك.
|
||||
التي تُطبّع إلى مسارات exec المحمية هذه.
|
||||
- **مساحة العمل**: دليل العمل (`agents.defaults.workspace`).
|
||||
- **التوثيق**: المسار المحلي إلى وثائق OpenClaw (المستودع أو حزمة npm) ومتى تُقرأ.
|
||||
- **ملفات مساحة العمل (محقونة)**: يشير إلى أن ملفات التمهيد مضمنة أدناه.
|
||||
- **بيئة العزل** (عند تمكينها): تشير إلى وقت تشغيل معزول، ومسارات بيئة العزل، وما إذا كان exec بامتيازات مرتفعة متاحًا.
|
||||
- **التوثيق**: المسار المحلي لتوثيق OpenClaw (المستودع أو حزمة npm) ومتى يجب قراءته.
|
||||
- **ملفات مساحة العمل (محقونة)**: يشير إلى أن ملفات التمهيد مضمّنة أدناه.
|
||||
- **Sandbox** (عند تمكينه): يشير إلى وقت تشغيل ضمن sandbox، ومسارات sandbox، وما إذا كان تنفيذ exec المرتفع متاحًا.
|
||||
- **التاريخ والوقت الحاليان**: وقت المستخدم المحلي، والمنطقة الزمنية، وتنسيق الوقت.
|
||||
- **وسوم الرد**: صيغة اختيارية لوسوم الرد للمزودين المدعومين.
|
||||
- **Heartbeats**: موجه Heartbeat وسلوك الإقرار، عندما تكون Heartbeats ممكّنة للوكيل الافتراضي.
|
||||
- **وقت التشغيل**: المضيف، ونظام التشغيل، وNode، والنموذج، وجذر المستودع (عند اكتشافه)، ومستوى التفكير (سطر واحد).
|
||||
- **الاستدلال**: مستوى الرؤية الحالي + تلميح تبديل /reasoning.
|
||||
- **وسوم الرد**: صيغة اختيارية لوسوم الرد للمزوّدين المدعومين.
|
||||
- **Heartbeats**: موجّه Heartbeat وسلوك الإقرار، عند تمكين Heartbeats للوكيل الافتراضي.
|
||||
- **وقت التشغيل**: المضيف، ونظام التشغيل، وnode، والنموذج، وجذر المستودع (عند اكتشافه)، ومستوى التفكير (سطر واحد).
|
||||
- **الاستدلال**: مستوى الظهور الحالي + تلميح تبديل /reasoning.
|
||||
|
||||
يبقي OpenClaw المحتوى الكبير المستقر، بما في ذلك **سياق المشروع**، فوق
|
||||
حد ذاكرة التخزين المؤقت الداخلي للموجه. تُلحق أقسام القناة/الجلسة المتقلبة مثل
|
||||
إرشادات تضمين واجهة التحكم، و**المراسلة**، و**الصوت**، و**سياق دردشة المجموعة**،
|
||||
يبقي OpenClaw المحتوى المستقر الكبير، بما في ذلك **سياق المشروع**، أعلى
|
||||
حد ذاكرة تخزين الموجّه المؤقتة الداخلي. وتُضاف أقسام القناة/الجلسة المتغيرة مثل
|
||||
إرشادات تضمين Control UI، و**المراسلة**، و**الصوت**، و**سياق دردشة المجموعة**،
|
||||
و**التفاعلات**، و**Heartbeats**، و**وقت التشغيل** أسفل ذلك الحد
|
||||
حتى تتمكن الواجهات الخلفية المحلية ذات ذاكرات تخزين مؤقت للبادئات من إعادة استخدام بادئة مساحة العمل المستقرة
|
||||
عبر دورات القناة. ينبغي لأوصاف الأدوات كذلك تجنب تضمين أسماء القنوات الحالية
|
||||
عندما يحمل المخطط المقبول أصلًا تفاصيل وقت التشغيل تلك.
|
||||
كي تتمكن الخلفيات المحلية ذات ذاكرات تخزين البادئة المؤقتة من إعادة استخدام بادئة مساحة العمل المستقرة
|
||||
عبر أدوار القناة. وبالمثل، ينبغي أن تتجنب أوصاف الأدوات تضمين أسماء القنوات الحالية
|
||||
عندما يحمل المخطط المقبول هذه التفاصيل الخاصة بوقت التشغيل بالفعل.
|
||||
|
||||
يتضمن قسم الأدوات أيضًا إرشادات وقت التشغيل للعمل طويل الأمد:
|
||||
|
||||
- استخدم Cron للمتابعة المستقبلية (`check back later`، والتذكيرات، والعمل المتكرر)
|
||||
بدلًا من حلقات نوم `exec`، أو حيل تأخير `yieldMs`، أو استقصاء `process`
|
||||
- استخدم cron للمتابعة المستقبلية (`check back later`، والتذكيرات، والعمل المتكرر)
|
||||
بدلًا من حلقات نوم `exec`، أو حيل تأخير `yieldMs`، أو استطلاع `process`
|
||||
المتكرر
|
||||
- استخدم `exec` / `process` فقط للأوامر التي تبدأ الآن وتستمر في العمل
|
||||
في الخلفية
|
||||
- عند تمكين إيقاظ الإكمال التلقائي، ابدأ الأمر مرة واحدة واعتمد على
|
||||
مسار الإيقاظ القائم على الدفع عندما يصدر مخرجات أو يفشل
|
||||
- استخدم `process` للسجلات، أو الحالة، أو الإدخال، أو التدخل عندما تحتاج إلى
|
||||
- استخدم `process` للسجلات أو الحالة أو الإدخال أو التدخل عندما تحتاج إلى
|
||||
فحص أمر قيد التشغيل
|
||||
- إذا كانت المهمة أكبر، ففضّل `sessions_spawn`؛ إكمال الوكيل الفرعي
|
||||
قائم على الدفع ويعلن تلقائيًا للطالب
|
||||
- لا تستقصِ `subagents list` / `sessions_list` في حلقة لمجرد انتظار
|
||||
- لا تستطلع `subagents list` / `sessions_list` في حلقة لمجرد انتظار
|
||||
الإكمال
|
||||
|
||||
عند تمكين أداة `update_plan` التجريبية، يخبر قسم الأدوات النموذج أيضًا
|
||||
باستخدامها فقط للعمل متعدد الخطوات غير البسيط، والحفاظ على خطوة واحدة بالضبط
|
||||
`in_progress`، وتجنب تكرار الخطة الكاملة بعد كل تحديث.
|
||||
عند تمكين أداة `update_plan` التجريبية، يخبر قسم الأدوات
|
||||
النموذج أيضًا باستخدامها فقط للعمل متعدد الخطوات غير البسيط، وإبقاء خطوة
|
||||
`in_progress` واحدة بالضبط، وتجنب تكرار الخطة كاملة بعد كل تحديث.
|
||||
|
||||
حواجز السلامة في موجه النظام إرشادية. إنها توجه سلوك النموذج لكنها لا تفرض السياسة. استخدم سياسة الأدوات، وموافقات exec، وبيئة العزل، وقوائم السماح للقنوات للفرض الصارم؛ يمكن للمشغلين تعطيل هذه عمدًا.
|
||||
ضوابط السلامة في موجّه النظام إرشادية. إنها توجه سلوك النموذج لكنها لا تفرض سياسة. استخدم سياسة الأدوات، وموافقات exec، وsandboxing، وقوائم السماح للقنوات للإنفاذ الصارم؛ يمكن للمشغلين تعطيل هذه عمدًا حسب التصميم.
|
||||
|
||||
في القنوات ذات بطاقات/أزرار الموافقة الأصلية، يخبر موجه وقت التشغيل الآن
|
||||
الوكيل بالاعتماد أولًا على واجهة الموافقة الأصلية تلك. ينبغي أن يضمّن أمرًا يدويًا
|
||||
`/approve` فقط عندما تقول نتيجة الأداة إن موافقات الدردشة غير متاحة أو
|
||||
في القنوات التي تحتوي على بطاقات/أزرار موافقة أصلية، يخبر موجّه وقت التشغيل الآن
|
||||
الوكيل بالاعتماد أولًا على واجهة الموافقة الأصلية تلك. وينبغي ألا يتضمن أمرًا يدويًا
|
||||
`/approve` إلا عندما تقول نتيجة الأداة إن موافقات الدردشة غير متاحة أو
|
||||
أن الموافقة اليدوية هي المسار الوحيد.
|
||||
|
||||
## أوضاع الموجه
|
||||
## أوضاع الموجّه
|
||||
|
||||
يمكن لـ OpenClaw عرض موجهات نظام أصغر للوكلاء الفرعيين. يعيّن وقت التشغيل
|
||||
`promptMode` لكل تشغيل (ليس إعدادًا ظاهرًا للمستخدم):
|
||||
يمكن لـ OpenClaw عرض موجّهات نظام أصغر للوكلاء الفرعيين. يضبط وقت التشغيل
|
||||
`promptMode` لكل تشغيل (وليس إعدادًا ظاهرًا للمستخدم):
|
||||
|
||||
- `full` (الافتراضي): يتضمن كل الأقسام أعلاه.
|
||||
- `minimal`: يُستخدم للوكلاء الفرعيين؛ يحذف **Skills**، و**استدعاء الذاكرة**، و**التحديث الذاتي لـ OpenClaw**،
|
||||
و**الأسماء المستعارة للنماذج**، و**هوية المستخدم**، و**وسوم الرد**،
|
||||
- `full` (افتراضي): يتضمن كل الأقسام أعلاه.
|
||||
- `minimal`: يُستخدم للوكلاء الفرعيين؛ ويحذف **Skills**، و**Memory Recall**، و**التحديث الذاتي لـ OpenClaw
|
||||
Self-Update**، و**الأسماء المستعارة للنماذج**، و**هوية المستخدم**، و**وسوم الرد**،
|
||||
و**المراسلة**، و**الردود الصامتة**، و**Heartbeats**. تظل الأدوات، و**السلامة**،
|
||||
ومساحة العمل، وبيئة العزل، والتاريخ والوقت الحاليان (عند معرفتهما)، ووقت التشغيل، والسياق
|
||||
المحقون متاحة.
|
||||
- `none`: يعيد سطر الهوية الأساسي فقط.
|
||||
ومساحة العمل، وSandbox، والتاريخ والوقت الحاليان (عند معرفتهما)، ووقت التشغيل، والسياق المحقون
|
||||
متاحة.
|
||||
- `none`: يعيد فقط سطر الهوية الأساسي.
|
||||
|
||||
عندما يكون `promptMode=minimal`، تُسمى الموجهات الإضافية المحقونة **سياق الوكيل الفرعي**
|
||||
عندما يكون `promptMode=minimal`، تُوسم الموجّهات المحقونة الإضافية باسم **سياق الوكيل الفرعي**
|
||||
بدلًا من **سياق دردشة المجموعة**.
|
||||
|
||||
لتشغيلات الرد التلقائي في القنوات، يمكن لـ OpenClaw حذف قسم **الردود الصامتة**
|
||||
العام عندما يتضمن سياق الدردشة المباشرة/الجماعية بالفعل سلوك
|
||||
`NO_REPLY` الخاص بالمحادثة والمحلول. يتجنب هذا تكرار آليات الرموز
|
||||
في كل من موجه النظام العام وسياق القناة.
|
||||
بالنسبة إلى تشغيلات الرد التلقائي للقنوات، يمكن لـ OpenClaw حذف قسم **الردود الصامتة**
|
||||
العام عندما يتضمن سياق الدردشة المباشرة/المجموعة بالفعل سلوك
|
||||
`NO_REPLY` الخاص بالمحادثة والمحلول. يتجنب ذلك تكرار آليات الرموز
|
||||
في كل من موجّه النظام العام وسياق القناة.
|
||||
|
||||
## لقطات الموجه
|
||||
## لقطات الموجّه
|
||||
|
||||
يحتفظ OpenClaw بلقطات موجه ملتزم بها للمسار السعيد لوقت تشغيل Codex/أداة الرسائل
|
||||
ضمن `test/fixtures/agents/prompt-snapshots/happy-path/`. تعرض هذه اللقطات
|
||||
معلمات مختارة لخيط/دوران خادم التطبيق بالإضافة إلى مكدس طبقات موجه مرتبط بالنموذج
|
||||
ومعاد بناؤه لدورات Telegram المباشرة، ومجموعة Discord، وHeartbeat. يتضمن ذلك المكدس
|
||||
مثبتًا لموجه نموذج Codex `gpt-5.5` مُنشأ من شكل كتالوج/ذاكرة تخزين مؤقت لنماذج Codex،
|
||||
ونص مطور أذونات المسار السعيد لـ Codex، وتعليمات مطور OpenClaw، وإدخال دور المستخدم،
|
||||
ومراجع إلى مواصفات الأدوات الديناميكية.
|
||||
يحتفظ OpenClaw بلقطات موجّه ملتزم بها لمسار Codex runtime السعيد ضمن
|
||||
`test/fixtures/agents/prompt-snapshots/codex-runtime-happy-path/`. تعرض هذه اللقطات
|
||||
معلمات خيط/دور مختارة من خادم التطبيق إضافة إلى مكدس طبقات موجّه مرتبط بالنموذج ومُعاد بناؤه
|
||||
لأدوار Telegram المباشرة، ومجموعة Discord، وHeartbeat. يتضمن ذلك المكدس
|
||||
مثبتًا لموجّه نموذج Codex `gpt-5.5` مولدًا من شكل كتالوج/ذاكرة تخزين نماذج Codex،
|
||||
ونص مطوّر الأذونات لمسار Codex السعيد،
|
||||
وتعليمات مطوّر OpenClaw، ومدخل دور المستخدم، وإشارات إلى مواصفات الأدوات الديناميكية.
|
||||
|
||||
حدّث مثبت موجه نموذج Codex باستخدام
|
||||
`pnpm prompt:snapshots:sync-codex-model`. افتراضيًا، يبحث السكربت عن
|
||||
حدّث مثبت موجّه نموذج Codex باستخدام
|
||||
`pnpm prompt:snapshots:sync-codex-model`. افتراضيًا، يبحث النص البرمجي عن
|
||||
ذاكرة تخزين وقت تشغيل Codex في `$CODEX_HOME/models_cache.json`، ثم
|
||||
`~/.codex/models_cache.json`، وبعد ذلك فقط يعود إلى اصطلاح نسخة Codex
|
||||
للمشرف في `~/code/codex/codex-rs/models-manager/models.json`. إذا
|
||||
لم يوجد أي من هذه المصادر، يخرج الأمر دون تغيير المثبت الملتزم به.
|
||||
`~/.codex/models_cache.json`، ثم يعود فقط إلى عرف checkout الخاص بمشرف Codex
|
||||
في `~/code/codex/codex-rs/models-manager/models.json`. إذا لم توجد
|
||||
أي من هذه المصادر، ينهي الأمر دون تغيير المثبت الملتزم به.
|
||||
مرر `--catalog <path>` للتحديث من ملف `models_cache.json`
|
||||
أو `models.json` محدد.
|
||||
|
||||
لا تزال هذه اللقطات ليست التقاطًا خامًا لطلب OpenAI بايتًا مقابل بايت. يمكن لـ Codex
|
||||
هذه اللقطات ما زالت ليست التقاطًا أوليًا حرفيًا لطلب OpenAI. يمكن لـ Codex
|
||||
إضافة سياق مساحة عمل مملوك لوقت التشغيل مثل `AGENTS.md`، وسياق البيئة،
|
||||
والذكريات، وتعليمات التطبيق/Plugin، وتعليمات وضع التعاون المستقبلية
|
||||
داخل وقت تشغيل Codex بعد أن يرسل OpenClaw معلمات الخيط والدوران.
|
||||
والذكريات، وتعليمات التطبيق/Plugin، وتعليمات أوضاع التعاون المستقبلية
|
||||
داخل Codex runtime بعد أن يرسل OpenClaw معلمات الخيط والدور.
|
||||
|
||||
أعد توليدها باستخدام `pnpm prompt:snapshots:gen` وتحقق من الانحراف باستخدام
|
||||
`pnpm prompt:snapshots:check`. يشغّل CI فحص الانحراف في جزء الحدود
|
||||
الإضافي بحيث تبقى تغييرات الموجه وتحديثات اللقطات مرتبطة بنفس
|
||||
PR.
|
||||
`pnpm prompt:snapshots:check`. يشغّل CI فحص الانحراف في شريحة
|
||||
الحدود الإضافية حتى تبقى تغييرات الموجّه وتحديثات اللقطات مرتبطة بالـ PR نفسه.
|
||||
|
||||
## حقن تمهيد مساحة العمل
|
||||
|
||||
تُقص ملفات التمهيد وتُلحق ضمن **سياق المشروع** حتى يرى النموذج سياق الهوية والملف الشخصي دون الحاجة إلى قراءات صريحة:
|
||||
تُقص ملفات التمهيد وتُضاف تحت **سياق المشروع** كي يرى النموذج سياق الهوية والملف الشخصي دون الحاجة إلى قراءات صريحة:
|
||||
|
||||
- `AGENTS.md`
|
||||
- `SOUL.md`
|
||||
@ -156,44 +155,51 @@ PR.
|
||||
- `BOOTSTRAP.md` (فقط في مساحات العمل الجديدة تمامًا)
|
||||
- `MEMORY.md` عند وجوده
|
||||
|
||||
كل هذه الملفات **تُحقن في نافذة السياق** في كل دوران ما لم
|
||||
كل هذه الملفات **تُحقن في نافذة السياق** في كل دور ما لم
|
||||
تنطبق بوابة خاصة بملف. يُحذف `HEARTBEAT.md` في التشغيلات العادية عندما
|
||||
تكون Heartbeats معطلة للوكيل الافتراضي أو عندما تكون
|
||||
`agents.defaults.heartbeat.includeSystemPromptSection` false. أبقِ الملفات المحقونة
|
||||
موجزة — خاصة `MEMORY.md`، الذي يمكن أن ينمو بمرور الوقت ويؤدي إلى
|
||||
استخدام سياق عالٍ بشكل غير متوقع وCompaction أكثر تكرارًا.
|
||||
موجزة — خصوصًا `MEMORY.md`، الذي يمكن أن ينمو بمرور الوقت ويؤدي إلى
|
||||
استخدام سياق مرتفع على نحو غير متوقع وCompaction أكثر تكرارًا.
|
||||
|
||||
عندما تعمل جلسة على حاضنة Codex الأصلية، يحمّل Codex ملف `AGENTS.md`
|
||||
من خلال اكتشاف مستندات المشروع الخاص به. لا يزال OpenClaw يحل ملفات
|
||||
التمهيد المتبقية ويمررها كتعليمات إعدادات Codex، لذا يحافظ `SOUL.md`،
|
||||
و`TOOLS.md`، و`IDENTITY.md`، و`USER.md`، و`HEARTBEAT.md`، و`BOOTSTRAP.md`، و
|
||||
`MEMORY.md` على دور سياق مساحة العمل نفسه دون تكرار
|
||||
`AGENTS.md`.
|
||||
|
||||
<Note>
|
||||
ملفات `memory/*.md` اليومية **ليست** جزءًا من سياق مشروع التمهيد العادي. في الدورانات العادية تُستدعى عند الطلب عبر أداتي `memory_search` و`memory_get`، لذلك لا تُحسب ضمن نافذة السياق ما لم يقرأها النموذج صراحة. الدورانات المجردة `/new` و`/reset` هي الاستثناء: يمكن لوقت التشغيل إلحاق ذاكرة يومية حديثة في المقدمة ككتلة سياق بدء لمرة واحدة لذلك الدوران الأول.
|
||||
ملفات `memory/*.md` اليومية **ليست** جزءًا من سياق المشروع التمهيدي العادي. في الأدوار الاعتيادية، تُستخدم عند الطلب عبر أداتي `memory_search` و`memory_get`، ولذلك لا تُحتسب ضمن نافذة السياق إلا إذا قرأها النموذج صراحة. أدوار `/new` و`/reset` المجردة هي الاستثناء: يمكن لوقت التشغيل إلحاق الذاكرة اليومية الحديثة في البداية ككتلة سياق بدء لمرة واحدة لذلك الدور الأول.
|
||||
</Note>
|
||||
|
||||
تُقتطع الملفات الكبيرة مع علامة. يتحكم في الحجم الأقصى لكل ملف
|
||||
`agents.defaults.bootstrapMaxChars` (الافتراضي: 12000). يُحد المحتوى التمهيدي المحقون الإجمالي
|
||||
عبر الملفات بواسطة `agents.defaults.bootstrapTotalMaxChars`
|
||||
(الافتراضي: 60000). تحقن الملفات المفقودة علامة قصيرة لملف مفقود. عند حدوث الاقتطاع،
|
||||
يمكن لـ OpenClaw حقن كتلة تحذير في سياق المشروع؛ تحكم في ذلك باستخدام
|
||||
تُقتطع الملفات الكبيرة مع وسم. يتحكم
|
||||
`agents.defaults.bootstrapMaxChars` بالحجم الأقصى لكل ملف (افتراضيًا: 12000). ويُحد المحتوى التمهيدي المحقون
|
||||
إجمالًا عبر الملفات بواسطة `agents.defaults.bootstrapTotalMaxChars`
|
||||
(افتراضيًا: 60000). تحقن الملفات الناقصة وسمًا قصيرًا للملف الناقص. عند حدوث الاقتطاع،
|
||||
يمكن لـ OpenClaw حقن كتلة تحذير في سياق المشروع؛ تحكم بذلك عبر
|
||||
`agents.defaults.bootstrapPromptTruncationWarning` (`off`، `once`، `always`؛
|
||||
الافتراضي: `once`).
|
||||
|
||||
تحقن جلسات الوكيل الفرعي فقط `AGENTS.md` و`TOOLS.md` (تُصفى ملفات التمهيد الأخرى
|
||||
لإبقاء سياق الوكيل الفرعي صغيرًا).
|
||||
تحقن جلسات الوكيل الفرعي `AGENTS.md` و`TOOLS.md` فقط (تُرشح ملفات التمهيد الأخرى
|
||||
للإبقاء على سياق الوكيل الفرعي صغيرًا).
|
||||
|
||||
يمكن للخطافات الداخلية اعتراض هذه الخطوة عبر `agent:bootstrap` لتعديل ملفات التمهيد المحقونة أو استبدالها
|
||||
(مثل تبديل `SOUL.md` بشخصية بديلة).
|
||||
يمكن للخطافات الداخلية اعتراض هذه الخطوة عبر `agent:bootstrap` لتحوير ملفات التمهيد المحقونة أو استبدالها
|
||||
(مثلًا استبدال `SOUL.md` بشخصية بديلة).
|
||||
|
||||
إذا كنت تريد جعل الوكيل يبدو أقل عمومية، فابدأ بـ
|
||||
إذا أردت جعل صوت الوكيل أقل عمومية، فابدأ بـ
|
||||
[دليل شخصية SOUL.md](/ar/concepts/soul).
|
||||
|
||||
لفحص مقدار إسهام كل ملف محقون (الخام مقابل المحقون، والاقتطاع، بالإضافة إلى عبء مخطط الأدوات)، استخدم `/context list` أو `/context detail`. راجع [السياق](/ar/concepts/context).
|
||||
لفحص مقدار مساهمة كل ملف محقون (الأولي مقابل المحقون، والاقتطاع، إضافة إلى عبء مخطط الأدوات)، استخدم `/context list` أو `/context detail`. راجع [السياق](/ar/concepts/context).
|
||||
|
||||
## التعامل مع الوقت
|
||||
|
||||
يتضمن موجه النظام قسمًا مخصصًا بعنوان **التاريخ والوقت الحاليان** عندما تكون
|
||||
المنطقة الزمنية للمستخدم معروفة. للحفاظ على استقرار ذاكرة التخزين المؤقت للموجه، أصبح الآن يتضمن فقط
|
||||
يتضمن موجّه النظام قسمًا مخصصًا بعنوان **التاريخ والوقت الحاليان** عندما تكون
|
||||
منطقة المستخدم الزمنية معروفة. وللحفاظ على استقرار ذاكرة تخزين الموجّه المؤقتة، فإنه يتضمن الآن فقط
|
||||
**المنطقة الزمنية** (دون ساعة ديناميكية أو تنسيق وقت).
|
||||
|
||||
استخدم `session_status` عندما يحتاج الوكيل إلى الوقت الحالي؛ تتضمن بطاقة الحالة
|
||||
سطر طابع زمني. يمكن للأداة نفسها اختياريًا تعيين تجاوز نموذج لكل جلسة
|
||||
سطر طابع زمني. ويمكن للأداة نفسها اختياريًا تعيين تجاوز نموذج لكل جلسة
|
||||
(`model=default` يمسحه).
|
||||
|
||||
اضبط باستخدام:
|
||||
@ -201,22 +207,22 @@ PR.
|
||||
- `agents.defaults.userTimezone`
|
||||
- `agents.defaults.timeFormat` (`auto` | `12` | `24`)
|
||||
|
||||
راجع [التاريخ والوقت](/ar/date-time) للحصول على تفاصيل السلوك الكاملة.
|
||||
راجع [التاريخ والوقت](/ar/date-time) لتفاصيل السلوك الكاملة.
|
||||
|
||||
## Skills
|
||||
|
||||
عند وجود Skills مؤهلة، يحقن OpenClaw **قائمة Skills المتاحة** مضغوطة
|
||||
(`formatSkillsForPrompt`) تتضمن **مسار الملف** لكل Skill. يوجه
|
||||
الموجه النموذج إلى استخدام `read` لتحميل SKILL.md في الموقع المدرج
|
||||
(مساحة العمل، أو المُدار، أو المضمّن). إذا لم تكن أي Skills مؤهلة، يُحذف
|
||||
عند وجود Skills مؤهلة، يحقن OpenClaw **قائمة skills متاحة** مضغوطة
|
||||
(`formatSkillsForPrompt`) تتضمن **مسار الملف** لكل skill. يوجه
|
||||
الموجّه النموذج إلى استخدام `read` لتحميل SKILL.md في الموقع المدرج
|
||||
(مساحة العمل، أو المُدار، أو المجمّع). إذا لم تكن أي Skills مؤهلة، فسيُحذف
|
||||
قسم Skills.
|
||||
|
||||
تشمل الأهلية بوابات بيانات تعريف Skills، وفحوصات بيئة/إعدادات وقت التشغيل،
|
||||
وقائمة السماح الفعالة لـ Skill للوكيل عندما تكون `agents.defaults.skills` أو
|
||||
تشمل الأهلية بوابات بيانات skill الوصفية، وفحوصات بيئة/إعدادات وقت التشغيل،
|
||||
وقائمة السماح الفعلية لـ Skills الخاصة بالوكيل عندما تكون `agents.defaults.skills` أو
|
||||
`agents.list[].skills` مضبوطة.
|
||||
|
||||
تكون Skills المضمنة في Plugin مؤهلة فقط عندما يكون Plugin المالك لها ممكّنًا.
|
||||
يتيح هذا لـ tool plugins عرض أدلة تشغيل أعمق دون تضمين كل
|
||||
تكون Skills المجمعة ضمن Plugin مؤهلة فقط عندما يكون Plugin المالك لها مفعّلًا.
|
||||
يتيح ذلك لـ Plugins الأدوات كشف أدلة تشغيل أعمق دون تضمين كل
|
||||
تلك الإرشادات مباشرة في كل وصف أداة.
|
||||
|
||||
```
|
||||
@ -229,42 +235,28 @@ PR.
|
||||
</available_skills>
|
||||
```
|
||||
|
||||
يبقي هذا الموجه الأساسي صغيرًا مع الاستمرار في تمكين استخدام Skills الموجه.
|
||||
يبقي هذا الموجّه الأساسي صغيرًا مع استمرار تمكين استخدام Skills الموجه.
|
||||
|
||||
ميزانية قائمة Skills مملوكة لنظام Skills الفرعي:
|
||||
|
||||
- الافتراضي العام: `skills.limits.maxSkillsPromptChars`
|
||||
- تجاوز لكل وكيل: `agents.list[].skillsLimits.maxSkillsPromptChars`
|
||||
|
||||
تستخدم مقتطفات وقت التشغيل العامة المحدودة سطحًا مختلفًا:
|
||||
تستخدم المقتطفات العامة المحدودة في وقت التشغيل سطحًا مختلفًا:
|
||||
|
||||
- `agents.defaults.contextLimits.*`
|
||||
- `agents.list[].contextLimits.*`
|
||||
|
||||
يبقي هذا الفصل تحجيم Skills منفصلًا عن تحجيم القراءة/الحقن وقت التشغيل مثل
|
||||
`memory_get`، ونتائج الأدوات المباشرة، وتحديثات AGENTS.md بعد Compaction.
|
||||
يحافظ هذا الفصل على تحجيم Skills منفصلًا عن تحجيم القراءة/الحقن في وقت التشغيل مثل `memory_get`، ونتائج الأدوات المباشرة، وتحديثات AGENTS.md بعد Compaction.
|
||||
|
||||
## التوثيق
|
||||
|
||||
تتضمن مطالبة النظام قسم **التوثيق**. عند توفر المستندات المحلية، فإنه
|
||||
يشير إلى دليل مستندات OpenClaw المحلي (`docs/` في نسخة Git مستخرجة أو مستندات حزمة npm
|
||||
المضمنة). إذا لم تكن المستندات المحلية متوفرة، فإنه يرجع إلى
|
||||
[https://docs.openclaw.ai](https://docs.openclaw.ai).
|
||||
يتضمن موجّه النظام قسم **التوثيق**. عندما تكون الوثائق المحلية متاحة، يشير إلى دليل وثائق OpenClaw المحلي (`docs/` في نسخة Git أو وثائق حزمة npm المضمّنة). إذا كانت الوثائق المحلية غير متاحة، فإنه يعود إلى [https://docs.openclaw.ai](https://docs.openclaw.ai).
|
||||
|
||||
يتضمن القسم نفسه أيضًا موقع مصدر OpenClaw. تتيح نسخ Git المستخرجة جذر المصدر المحلي
|
||||
حتى يتمكن الوكيل من فحص الكود مباشرة. تتضمن تثبيتات الحزمة عنوان URL لمصدر GitHub
|
||||
وتطلب من الوكيل مراجعة المصدر هناك عندما تكون المستندات غير مكتملة أو
|
||||
قديمة. تذكر المطالبة أيضًا مرآة المستندات العامة، ومجتمع Discord، وClawHub
|
||||
([https://clawhub.ai](https://clawhub.ai)) لاكتشاف Skills. وتطلب من النموذج
|
||||
استشارة المستندات أولًا بخصوص سلوك OpenClaw أو أوامره أو تكوينه أو بنيته، وأن
|
||||
يشغل `openclaw status` بنفسه عند الإمكان (مع سؤال المستخدم فقط عندما لا يملك إمكانية الوصول).
|
||||
وبالنسبة إلى التكوين تحديدًا، فإنها توجه الوكلاء إلى إجراء الأداة `gateway`
|
||||
`config.schema.lookup` للحصول على مستندات وقيود دقيقة على مستوى الحقول، ثم إلى
|
||||
`docs/gateway/configuration.md` و`docs/gateway/configuration-reference.md`
|
||||
للحصول على إرشادات أوسع.
|
||||
يتضمن القسم نفسه أيضًا موقع مصدر OpenClaw. تعرض نسخ Git الجذر المحلي للمصدر حتى يتمكن الوكيل من فحص الشيفرة مباشرة. تتضمن عمليات تثبيت الحزمة عنوان URL لمصدر GitHub وتطلب من الوكيل مراجعة المصدر هناك كلما كانت الوثائق غير مكتملة أو قديمة. يشير الموجّه أيضًا إلى مرآة الوثائق العامة، ومجتمع Discord، وClawHub ([https://clawhub.ai](https://clawhub.ai)) لاكتشاف Skills. ويوجه النموذج إلى مراجعة الوثائق أولًا بشأن سلوك OpenClaw أو أوامره أو تكوينه أو بنيته، وإلى تشغيل `openclaw status` بنفسه عند الإمكان (مع سؤال المستخدم فقط عندما لا يملك وصولًا). وبالنسبة إلى التكوين تحديدًا، فإنه يوجّه الوكلاء إلى إجراء أداة `gateway` وهو `config.schema.lookup` للحصول على وثائق وقيود دقيقة على مستوى الحقول، ثم إلى `docs/gateway/configuration.md` و`docs/gateway/configuration-reference.md` للحصول على إرشادات أوسع.
|
||||
|
||||
## ذات صلة
|
||||
## ذو صلة
|
||||
|
||||
- [بيئة تشغيل الوكيل](/ar/concepts/agent)
|
||||
- [وقت تشغيل الوكيل](/ar/concepts/agent)
|
||||
- [مساحة عمل الوكيل](/ar/concepts/agent-workspace)
|
||||
- [محرك السياق](/ar/concepts/context-engine)
|
||||
|
||||
@ -1,13 +1,13 @@
|
||||
---
|
||||
read_when:
|
||||
- تغيير نسخ الصوت أو معالجة الوسائط
|
||||
summary: كيفية تنزيل الصوت/الملاحظات الصوتية الواردة وتفريغها نصيًا وإدراجها في الردود
|
||||
- تغيير تفريغ الصوت أو معالجة الوسائط
|
||||
summary: كيفية تنزيل الملاحظات الصوتية الواردة ونسخها وإدراجها في الردود
|
||||
title: الصوت والملاحظات الصوتية
|
||||
x-i18n:
|
||||
generated_at: "2026-04-30T08:09:31Z"
|
||||
generated_at: "2026-05-02T23:39:05Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: 35074d79104f767ee252064462202a8ec21ac26f6db25c39e67f31f6b40edeb7
|
||||
source_hash: 91cd6951f80c6137061a7d4e82415b0872bc92c6d6ad136273a2e9ad7ec00ac1
|
||||
source_path: nodes/audio.md
|
||||
workflow: 16
|
||||
---
|
||||
@ -16,37 +16,38 @@ x-i18n:
|
||||
|
||||
## ما يعمل
|
||||
|
||||
- **فهم الوسائط (الصوت)**: إذا كان فهم الصوت مفعلا (أو تم اكتشافه تلقائيا)، فإن OpenClaw:
|
||||
1. يحدد أول مرفق صوتي (مسار محلي أو URL) وينزله إذا لزم الأمر.
|
||||
- **فهم الوسائط (الصوت)**: إذا كان فهم الصوت مفعّلًا (أو مكتشفًا تلقائيًا)، فإن OpenClaw:
|
||||
1. يحدد أول مرفق صوتي (مسار محلي أو URL) وينزّله عند الحاجة.
|
||||
2. يفرض `maxBytes` قبل الإرسال إلى كل إدخال نموذج.
|
||||
3. يشغل أول إدخال نموذج مؤهل بالترتيب (موفر أو CLI).
|
||||
4. إذا فشل أو تم تخطيه (الحجم/المهلة)، فإنه يجرب الإدخال التالي.
|
||||
5. عند النجاح، يستبدل `Body` بكتلة `[Audio]` ويضبط `{{Transcript}}`.
|
||||
- **تحليل الأوامر**: عند نجاح النسخ، يتم ضبط `CommandBody`/`RawBody` على النص المنسوخ لكي تظل أوامر الشرطة المائلة تعمل.
|
||||
- **التسجيل التفصيلي**: في `--verbose`، نسجل عند تشغيل النسخ وعند استبداله للمتن.
|
||||
3. يشغّل أول إدخال نموذج مؤهل بالترتيب (مزود أو CLI).
|
||||
4. إذا فشل أو تم تخطيه (الحجم/المهلة)، فإنه يجرّب الإدخال التالي.
|
||||
5. عند النجاح، يستبدل `Body` بكتلة `[Audio]` ويعيّن `{{Transcript}}`.
|
||||
- **تحليل الأوامر**: عند نجاح النسخ، يتم تعيين `CommandBody`/`RawBody` إلى النص المنسوخ لكي تظل أوامر الشرطة المائلة تعمل.
|
||||
- **تسجيل مفصل**: في `--verbose`، نسجل متى يعمل النسخ ومتى يستبدل النص الأساسي.
|
||||
- **إملاء واجهة التحكم**: يستطيع مؤلف الدردشة إرسال مقطع ميكروفون مسجل من المتصفح إلى `chat.transcribeAudio`. يكتب استدعاء Gateway RPC هذا المقطع إلى ملف محلي مؤقت، ويشغّل مسار نسخ الصوت نفسه، ويعيد نص مسودة إلى المتصفح، ثم يحذف الملف المؤقت. لا ينشئ تشغيلًا للوكيل بذاته.
|
||||
|
||||
## الاكتشاف التلقائي (الافتراضي)
|
||||
|
||||
إذا **لم تقم بتكوين النماذج** ولم يتم ضبط `tools.media.audio.enabled` على **`false`**،
|
||||
يكتشف OpenClaw تلقائيا بهذا الترتيب ويتوقف عند أول خيار يعمل:
|
||||
إذا كنت **لا تضبط النماذج** وكان `tools.media.audio.enabled` **غير** مضبوط على `false`،
|
||||
فإن OpenClaw يكتشف تلقائيًا بهذا الترتيب ويتوقف عند أول خيار يعمل:
|
||||
|
||||
1. **نموذج الرد النشط** عندما يدعم موفره فهم الصوت.
|
||||
1. **نموذج الرد النشط** عندما يدعم مزوده فهم الصوت.
|
||||
2. **واجهات CLI المحلية** (إذا كانت مثبتة)
|
||||
- `sherpa-onnx-offline` (يتطلب `SHERPA_ONNX_MODEL_DIR` مع encoder/decoder/joiner/tokens)
|
||||
- `whisper-cli` (من `whisper-cpp`؛ يستخدم `WHISPER_CPP_MODEL` أو النموذج الصغير المضمن)
|
||||
- `whisper` (Python CLI؛ ينزل النماذج تلقائيا)
|
||||
- `whisper-cli` (من `whisper-cpp`؛ يستخدم `WHISPER_CPP_MODEL` أو النموذج الصغير المضمّن)
|
||||
- `whisper` (CLI بلغة Python؛ ينزّل النماذج تلقائيًا)
|
||||
3. **Gemini CLI** (`gemini`) باستخدام `read_many_files`
|
||||
4. **مصادقة الموفر**
|
||||
- تتم تجربة إدخالات `models.providers.*` المكونة التي تدعم الصوت أولا
|
||||
- ترتيب الاحتياط المضمن: OpenAI → Groq → xAI → Deepgram → Google → SenseAudio → ElevenLabs → Mistral
|
||||
4. **مصادقة المزود**
|
||||
- تتم تجربة إدخالات `models.providers.*` المضبوطة التي تدعم الصوت أولًا
|
||||
- ترتيب الرجوع المضمّن: OpenAI → Groq → xAI → Deepgram → Google → SenseAudio → ElevenLabs → Mistral
|
||||
|
||||
لتعطيل الاكتشاف التلقائي، اضبط `tools.media.audio.enabled: false`.
|
||||
للتخصيص، اضبط `tools.media.audio.models`.
|
||||
ملاحظة: اكتشاف الثنائيات هو أفضل جهد عبر macOS/Linux/Windows؛ تأكد من أن CLI موجود في `PATH` (نوسع `~`)، أو اضبط نموذج CLI صريحا بمسار أمر كامل.
|
||||
ملاحظة: اكتشاف الثنائيات هو أفضل جهد عبر macOS/Linux/Windows؛ تأكد من أن CLI موجودة على `PATH` (نوسّع `~`)، أو عيّن نموذج CLI صريحًا مع مسار أمر كامل.
|
||||
|
||||
## أمثلة التكوين
|
||||
## أمثلة الضبط
|
||||
|
||||
### موفر + احتياط CLI (OpenAI + Whisper CLI)
|
||||
### مزود + رجوع CLI (OpenAI + Whisper CLI)
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -70,7 +71,7 @@ x-i18n:
|
||||
}
|
||||
```
|
||||
|
||||
### موفر فقط مع بوابة النطاق
|
||||
### مزود فقط مع بوابة النطاق
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -89,7 +90,7 @@ x-i18n:
|
||||
}
|
||||
```
|
||||
|
||||
### موفر فقط (Deepgram)
|
||||
### مزود فقط (Deepgram)
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -104,7 +105,7 @@ x-i18n:
|
||||
}
|
||||
```
|
||||
|
||||
### موفر فقط (Mistral Voxtral)
|
||||
### مزود فقط (Mistral Voxtral)
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -119,7 +120,7 @@ x-i18n:
|
||||
}
|
||||
```
|
||||
|
||||
### موفر فقط (SenseAudio)
|
||||
### مزود فقط (SenseAudio)
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -134,7 +135,7 @@ x-i18n:
|
||||
}
|
||||
```
|
||||
|
||||
### تكرار النص المنسوخ إلى الدردشة (اشتراك اختياري)
|
||||
### صدى النص المنسوخ إلى الدردشة (اختياري)
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -153,28 +154,28 @@ x-i18n:
|
||||
|
||||
## ملاحظات وحدود
|
||||
|
||||
- تتبع مصادقة الموفر ترتيب مصادقة النموذج القياسي (ملفات تعريف المصادقة، متغيرات البيئة، `models.providers.*.apiKey`).
|
||||
- تتبع مصادقة المزود ترتيب مصادقة النماذج القياسي (ملفات تعريف المصادقة، متغيرات البيئة، `models.providers.*.apiKey`).
|
||||
- تفاصيل إعداد Groq: [Groq](/ar/providers/groq).
|
||||
- يلتقط Deepgram قيمة `DEEPGRAM_API_KEY` عند استخدام `provider: "deepgram"`.
|
||||
- تفاصيل إعداد Deepgram: [Deepgram (نسخ الصوت)](/ar/providers/deepgram).
|
||||
- تفاصيل إعداد Mistral: [Mistral](/ar/providers/mistral).
|
||||
- يلتقط SenseAudio قيمة `SENSEAUDIO_API_KEY` عند استخدام `provider: "senseaudio"`.
|
||||
- تفاصيل إعداد SenseAudio: [SenseAudio](/ar/providers/senseaudio).
|
||||
- يمكن لموفري الصوت تجاوز `baseUrl` و`headers` و`providerOptions` عبر `tools.media.audio`.
|
||||
- حد الحجم الافتراضي هو 20MB (`tools.media.audio.maxBytes`). يتم تخطي الصوت الزائد الحجم لذلك النموذج وتجربة الإدخال التالي.
|
||||
- يتم تخطي ملفات الصوت الصغيرة جدا/الفارغة الأقل من 1024 بايت قبل النسخ عبر الموفر/CLI.
|
||||
- قيمة `maxChars` الافتراضية للصوت **غير مضبوطة** (النص المنسوخ الكامل). اضبط `tools.media.audio.maxChars` أو `maxChars` لكل إدخال لاقتطاع الإخراج.
|
||||
- القيمة التلقائية الافتراضية لـ OpenAI هي `gpt-4o-mini-transcribe`؛ اضبط `model: "gpt-4o-transcribe"` لدقة أعلى.
|
||||
- يمكن لمزودي الصوت تجاوز `baseUrl` و`headers` و`providerOptions` عبر `tools.media.audio`.
|
||||
- حد الحجم الافتراضي هو 20MB (`tools.media.audio.maxBytes`). يتم تخطي الصوت زائد الحجم لذلك النموذج وتجربة الإدخال التالي.
|
||||
- يتم تخطي ملفات الصوت الصغيرة جدًا/الفارغة التي تقل عن 1024 بايت قبل النسخ عبر المزود/CLI.
|
||||
- قيمة `maxChars` الافتراضية للصوت **غير مضبوطة** (النص المنسوخ الكامل). اضبط `tools.media.audio.maxChars` أو `maxChars` لكل إدخال لقص الناتج.
|
||||
- افتراضي OpenAI التلقائي هو `gpt-4o-mini-transcribe`؛ اضبط `model: "gpt-4o-transcribe"` لدقة أعلى.
|
||||
- استخدم `tools.media.audio.attachments` لمعالجة عدة ملاحظات صوتية (`mode: "all"` + `maxAttachments`).
|
||||
- يتوفر النص المنسوخ للقوالب على هيئة `{{Transcript}}`.
|
||||
- `tools.media.audio.echoTranscript` متوقف افتراضيا؛ فعله لإرسال تأكيد النص المنسوخ إلى الدردشة الأصلية قبل معالجة الوكيل.
|
||||
- يخصص `tools.media.audio.echoFormat` نص التكرار (العنصر النائب: `{transcript}`).
|
||||
- يتم تقييد stdout الخاص بـ CLI (5MB)؛ اجعل إخراج CLI موجزا.
|
||||
- يجب أن تستخدم `args` الخاصة بـ CLI قيمة `{{MediaPath}}` لمسار ملف الصوت المحلي. شغل `openclaw doctor --fix` لترحيل عناصر `{input}` النائبة المهملة من تكوينات `audio.transcription.command` الأقدم.
|
||||
- النص المنسوخ متاح للقوالب كـ `{{Transcript}}`.
|
||||
- `tools.media.audio.echoTranscript` متوقف افتراضيًا؛ فعّله لإرسال تأكيد النص المنسوخ إلى الدردشة الأصلية قبل معالجة الوكيل.
|
||||
- يخصص `tools.media.audio.echoFormat` نص الصدى (العنصر النائب: `{transcript}`).
|
||||
- خرج stdout في CLI محدود (5MB)؛ اجعل خرج CLI موجزًا.
|
||||
- يجب أن تستخدم `args` في CLI قيمة `{{MediaPath}}` لمسار ملف الصوت المحلي. شغّل `openclaw doctor --fix` لترحيل عناصر `{input}` النائبة المهملة من إعدادات `audio.transcription.command` الأقدم.
|
||||
|
||||
### دعم بيئة الوكيل
|
||||
|
||||
يحترم نسخ الصوت المعتمد على الموفر متغيرات بيئة وكيل الخروج القياسية:
|
||||
يحترم نسخ الصوت المعتمد على المزود متغيرات بيئة الوكيل الصادر القياسية:
|
||||
|
||||
- `HTTPS_PROXY`
|
||||
- `HTTP_PROXY`
|
||||
@ -183,42 +184,42 @@ x-i18n:
|
||||
- `http_proxy`
|
||||
- `all_proxy`
|
||||
|
||||
إذا لم يتم ضبط متغيرات بيئة الوكيل، يتم استخدام خروج مباشر. إذا كان تكوين الوكيل مشوها، يسجل OpenClaw تحذيرا ويعود إلى الجلب المباشر.
|
||||
إذا لم تكن متغيرات بيئة الوكيل مضبوطة، يتم استخدام الخروج المباشر. إذا كان ضبط الوكيل مشوهًا، يسجل OpenClaw تحذيرًا ويرجع إلى الجلب المباشر.
|
||||
|
||||
## اكتشاف الإشارات في المجموعات
|
||||
## اكتشاف الإشارة في المجموعات
|
||||
|
||||
عند ضبط `requireMention: true` لدردشة جماعية، ينسخ OpenClaw الآن الصوت **قبل** التحقق من الإشارات. يتيح هذا معالجة الملاحظات الصوتية حتى عندما تحتوي على إشارات.
|
||||
عند ضبط `requireMention: true` لدردشة جماعية، ينسخ OpenClaw الصوت الآن **قبل** التحقق من الإشارات. يتيح هذا معالجة الملاحظات الصوتية حتى عندما تحتوي على إشارات.
|
||||
|
||||
**كيف يعمل:**
|
||||
**كيفية عمله:**
|
||||
|
||||
1. إذا لم تكن للرسالة الصوتية متن نصي وكانت المجموعة تتطلب إشارات، ينفذ OpenClaw نسخة "تمهيدية".
|
||||
2. يتم فحص النص المنسوخ بحثا عن أنماط الإشارة (مثل `@BotName`، ومشغلات الرموز التعبيرية).
|
||||
1. إذا لم تكن للرسالة الصوتية هيئة نصية وكانت المجموعة تتطلب إشارات، ينفذ OpenClaw نسخًا "تمهيديًا".
|
||||
2. يتم فحص النص المنسوخ بحثًا عن أنماط الإشارة (مثل `@BotName` ومشغلات الرموز التعبيرية).
|
||||
3. إذا تم العثور على إشارة، تتابع الرسالة عبر مسار الرد الكامل.
|
||||
4. يتم استخدام النص المنسوخ لاكتشاف الإشارات حتى تتمكن الملاحظات الصوتية من اجتياز بوابة الإشارات.
|
||||
4. يُستخدم النص المنسوخ لاكتشاف الإشارات لكي تتمكن الملاحظات الصوتية من اجتياز بوابة الإشارة.
|
||||
|
||||
**سلوك الاحتياط:**
|
||||
**سلوك الرجوع:**
|
||||
|
||||
- إذا فشل النسخ أثناء التمهيد (مهلة، خطأ API، وما إلى ذلك)، تتم معالجة الرسالة بناء على اكتشاف الإشارات النصية فقط.
|
||||
- يضمن هذا أن الرسائل المختلطة (نص + صوت) لا يتم إسقاطها بشكل غير صحيح أبدا.
|
||||
- إذا فشل النسخ أثناء التمهيد (مهلة، خطأ API، إلخ)، تتم معالجة الرسالة بناءً على اكتشاف الإشارات النصية فقط.
|
||||
- يضمن ذلك عدم إسقاط الرسائل المختلطة (نص + صوت) بشكل غير صحيح أبدًا.
|
||||
|
||||
**إلغاء الاشتراك لكل مجموعة/موضوع في Telegram:**
|
||||
|
||||
- اضبط `channels.telegram.groups.<chatId>.disableAudioPreflight: true` لتخطي فحوصات إشارة النص المنسوخ التمهيدية لتلك المجموعة.
|
||||
- اضبط `channels.telegram.groups.<chatId>.topics.<threadId>.disableAudioPreflight` للتجاوز لكل موضوع (`true` للتخطي، و`false` لفرض التفعيل).
|
||||
- الافتراضي هو `false` (التمهيد مفعل عندما تتطابق شروط بوابة الإشارات).
|
||||
- الافتراضي هو `false` (التمهيد مفعّل عندما تطابق شروط بوابة الإشارة).
|
||||
|
||||
**مثال:** يرسل مستخدم ملاحظة صوتية تقول "Hey @Claude, what's the weather?" في مجموعة Telegram مع `requireMention: true`. يتم نسخ الملاحظة الصوتية، ويتم اكتشاف الإشارة، ويرد الوكيل.
|
||||
**مثال:** يرسل مستخدم ملاحظة صوتية تقول "مرحبًا @Claude، كيف الطقس؟" في مجموعة Telegram مع `requireMention: true`. تُنسخ الملاحظة الصوتية، وتُكتشف الإشارة، ويرد الوكيل.
|
||||
|
||||
## أمور يجب الانتباه لها
|
||||
|
||||
- تستخدم قواعد النطاق أول تطابق رابح. تتم تسوية `chatType` إلى `direct` أو `group` أو `room`.
|
||||
- تأكد من أن CLI يخرج 0 ويطبع نصا عاديا؛ يحتاج JSON إلى معالجة عبر `jq -r .text`.
|
||||
- بالنسبة إلى `parakeet-mlx`، إذا مررت `--output-dir`، يقرأ OpenClaw `<output-dir>/<media-basename>.txt` عندما يكون `--output-format` هو `txt` (أو محذوفا)؛ تعود تنسيقات الإخراج غير `txt` إلى تحليل stdout.
|
||||
- اجعل المهل معقولة (`timeoutSeconds`، الافتراضي 60s) لتجنب حظر طابور الرد.
|
||||
- تستخدم قواعد النطاق أول تطابق فائز. يتم تطبيع `chatType` إلى `direct` أو `group` أو `room`.
|
||||
- تأكد من أن CLI يخرج بالرمز 0 ويطبع نصًا عاديًا؛ يحتاج JSON إلى معالجة عبر `jq -r .text`.
|
||||
- بالنسبة إلى `parakeet-mlx`، إذا مررت `--output-dir`، يقرأ OpenClaw الملف `<output-dir>/<media-basename>.txt` عندما يكون `--output-format` هو `txt` (أو محذوفًا)؛ صيغ الإخراج غير `txt` ترجع إلى تحليل stdout.
|
||||
- اجعل المهل معقولة (`timeoutSeconds`، الافتراضي 60 ثانية) لتجنب حظر طابور الرد.
|
||||
- يعالج النسخ التمهيدي **أول** مرفق صوتي فقط لاكتشاف الإشارات. تتم معالجة الصوت الإضافي أثناء مرحلة فهم الوسائط الرئيسية.
|
||||
|
||||
## ذو صلة
|
||||
|
||||
- [فهم الوسائط](/ar/nodes/media-understanding)
|
||||
- [وضع التحدث](/ar/nodes/talk)
|
||||
- [إيقاظ الصوت](/ar/nodes/voicewake)
|
||||
- [تنبيه الصوت](/ar/nodes/voicewake)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,43 +1,43 @@
|
||||
---
|
||||
read_when:
|
||||
- تريد استخدام Arcee AI مع OpenClaw
|
||||
- تحتاج إلى متغير البيئة الخاص بمفتاح API أو خيار مصادقة CLI
|
||||
summary: إعداد Arcee AI (المصادقة + اختيار النموذج)
|
||||
- تحتاج إلى متغير البيئة لمفتاح API أو خيار مصادقة CLI
|
||||
summary: إعداد Arcee AI (المصادقة + اختيار النموذج)
|
||||
title: Arcee AI
|
||||
x-i18n:
|
||||
generated_at: "2026-04-24T07:57:54Z"
|
||||
model: gpt-5.4
|
||||
generated_at: "2026-05-02T23:39:09Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: 54989e1706901fedc8a0c816ca7ee7f877fa4b973697540dd90cb9182420043f
|
||||
source_hash: 622ee5288aec3ae0b45d3f06ba65fd6f972e07d7a7596ae3905d6fbdac0bf737
|
||||
source_path: providers/arcee.md
|
||||
workflow: 15
|
||||
workflow: 16
|
||||
---
|
||||
|
||||
يوفر [Arcee AI](https://arcee.ai) وصولًا إلى عائلة Trinity من نماذج mixture-of-experts عبر واجهة API متوافقة مع OpenAI. جميع نماذج Trinity مرخّصة بموجب Apache 2.0.
|
||||
توفر [Arcee AI](https://arcee.ai) الوصول إلى عائلة Trinity من نماذج خليط الخبراء عبر API متوافق مع OpenAI. جميع نماذج Trinity مرخصة بترخيص Apache 2.0.
|
||||
|
||||
يمكن الوصول إلى نماذج Arcee AI مباشرة عبر منصة Arcee أو عبر [OpenRouter](/ar/providers/openrouter).
|
||||
يمكن الوصول إلى نماذج Arcee AI مباشرة عبر منصة Arcee أو من خلال [OpenRouter](/ar/providers/openrouter).
|
||||
|
||||
| الخاصية | القيمة |
|
||||
| -------- | ---------------------------------------------------------------------------------------- |
|
||||
| المزوّد | `arcee` |
|
||||
| المصادقة | `ARCEEAI_API_KEY` (مباشر) أو `OPENROUTER_API_KEY` (عبر OpenRouter) |
|
||||
| API | متوافقة مع OpenAI |
|
||||
| Base URL | `https://api.arcee.ai/api/v1` (مباشر) أو `https://openrouter.ai/api/v1` (عبر OpenRouter) |
|
||||
| الخاصية | القيمة |
|
||||
| -------- | ------------------------------------------------------------------------------------- |
|
||||
| المزوّد | `arcee` |
|
||||
| المصادقة | `ARCEEAI_API_KEY` (مباشر) أو `OPENROUTER_API_KEY` (عبر OpenRouter) |
|
||||
| API | متوافق مع OpenAI |
|
||||
| عنوان URL الأساسي | `https://api.arcee.ai/api/v1` (مباشر) أو `https://openrouter.ai/api/v1` (OpenRouter) |
|
||||
|
||||
## البدء
|
||||
|
||||
<Tabs>
|
||||
<Tab title="مباشر (منصة Arcee)">
|
||||
<Tab title="Direct (Arcee platform)">
|
||||
<Steps>
|
||||
<Step title="احصل على مفتاح API">
|
||||
أنشئ مفتاح API على [Arcee AI](https://chat.arcee.ai/).
|
||||
<Step title="Get an API key">
|
||||
أنشئ مفتاح API في [Arcee AI](https://chat.arcee.ai/).
|
||||
</Step>
|
||||
<Step title="شغّل الإعداد الأولي">
|
||||
<Step title="Run onboarding">
|
||||
```bash
|
||||
openclaw onboard --auth-choice arceeai-api-key
|
||||
```
|
||||
</Step>
|
||||
<Step title="اضبط نموذجًا افتراضيًا">
|
||||
<Step title="Set a default model">
|
||||
```json5
|
||||
{
|
||||
agents: {
|
||||
@ -51,17 +51,17 @@ x-i18n:
|
||||
</Steps>
|
||||
</Tab>
|
||||
|
||||
<Tab title="عبر OpenRouter">
|
||||
<Tab title="Via OpenRouter">
|
||||
<Steps>
|
||||
<Step title="احصل على مفتاح API">
|
||||
أنشئ مفتاح API على [OpenRouter](https://openrouter.ai/keys).
|
||||
<Step title="Get an API key">
|
||||
أنشئ مفتاح API في [OpenRouter](https://openrouter.ai/keys).
|
||||
</Step>
|
||||
<Step title="شغّل الإعداد الأولي">
|
||||
<Step title="Run onboarding">
|
||||
```bash
|
||||
openclaw onboard --auth-choice arceeai-openrouter
|
||||
```
|
||||
</Step>
|
||||
<Step title="اضبط نموذجًا افتراضيًا">
|
||||
<Step title="Set a default model">
|
||||
```json5
|
||||
{
|
||||
agents: {
|
||||
@ -72,7 +72,7 @@ x-i18n:
|
||||
}
|
||||
```
|
||||
|
||||
تعمل مراجع النماذج نفسها مع الإعدادين المباشر وعبر OpenRouter (مثل `arcee/trinity-large-thinking`).
|
||||
تعمل مراجع النماذج نفسها لكل من إعدادات الاتصال المباشر وOpenRouter (على سبيل المثال `arcee/trinity-large-thinking`).
|
||||
</Step>
|
||||
</Steps>
|
||||
|
||||
@ -82,7 +82,7 @@ x-i18n:
|
||||
## الإعداد غير التفاعلي
|
||||
|
||||
<Tabs>
|
||||
<Tab title="مباشر (منصة Arcee)">
|
||||
<Tab title="Direct (Arcee platform)">
|
||||
```bash
|
||||
openclaw onboard --non-interactive \
|
||||
--mode local \
|
||||
@ -91,7 +91,7 @@ x-i18n:
|
||||
```
|
||||
</Tab>
|
||||
|
||||
<Tab title="عبر OpenRouter">
|
||||
<Tab title="Via OpenRouter">
|
||||
```bash
|
||||
openclaw onboard --non-interactive \
|
||||
--mode local \
|
||||
@ -101,51 +101,51 @@ x-i18n:
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## الفهرس المدمج
|
||||
## الكتالوج المضمّن
|
||||
|
||||
يشحن OpenClaw حاليًا فهرس Arcee المضمّن التالي:
|
||||
يشحن OpenClaw حاليًا كتالوج Arcee المضمّن هذا:
|
||||
|
||||
| مرجع النموذج | الاسم | الإدخال | السياق | التكلفة (دخول/خروج لكل 1M) | ملاحظات |
|
||||
| ----------------------------- | ---------------------- | ------- | ------ | -------------------------- | -------------------------------------------- |
|
||||
| `arcee/trinity-large-thinking` | Trinity Large Thinking | text | 256K | $0.25 / $0.90 | النموذج الافتراضي؛ reasoning مفعّل |
|
||||
| `arcee/trinity-large-preview` | Trinity Large Preview | text | 128K | $0.25 / $1.00 | للأغراض العامة؛ 400B معلمات، و13B نشطة |
|
||||
| `arcee/trinity-mini` | Trinity Mini 26B | text | 128K | $0.045 / $0.15 | سريع وموفّر للتكلفة؛ function calling |
|
||||
| مرجع النموذج | الاسم | الإدخال | السياق | التكلفة (إدخال/إخراج لكل 1M) | ملاحظات |
|
||||
| ------------------------------ | ---------------------- | ----- | ------- | -------------------- | ------------------------------------------ |
|
||||
| `arcee/trinity-large-thinking` | Trinity Large Thinking | text | 256K | $0.25 / $0.90 | النموذج الافتراضي؛ التفكير مفعّل؛ بلا أدوات |
|
||||
| `arcee/trinity-large-preview` | Trinity Large Preview | text | 128K | $0.25 / $1.00 | متعدد الأغراض؛ 400B معامل، 13B نشط |
|
||||
| `arcee/trinity-mini` | Trinity Mini 26B | text | 128K | $0.045 / $0.15 | سريع وفعّال من حيث التكلفة؛ استدعاء الدوال |
|
||||
|
||||
<Tip>
|
||||
يضبط إعداد onboarding المسبق `arcee/trinity-large-thinking` كنموذج افتراضي.
|
||||
يضبط إعداد التهيئة المسبق `arcee/trinity-large-thinking` بوصفه النموذج الافتراضي. إنه مخصص للاستدلال/النص فقط ولا يدعم استخدام الأدوات أو استدعاء الدوال.
|
||||
</Tip>
|
||||
|
||||
## الميزات المدعومة
|
||||
|
||||
| الميزة | مدعومة |
|
||||
| ----------------------------------------------- | ------------------------------ |
|
||||
| البث | نعم |
|
||||
| استخدام الأدوات / function calling | نعم |
|
||||
| المخرجات المهيكلة (وضع JSON ومخطط JSON) | نعم |
|
||||
| التفكير الممتد | نعم (Trinity Large Thinking) |
|
||||
| الميزة | مدعومة |
|
||||
| --------------------------------------------- | ------------------------------------------- |
|
||||
| البث | نعم |
|
||||
| استخدام الأدوات / استدعاء الدوال | يعتمد على النموذج؛ ليس Trinity Large Thinking |
|
||||
| الإخراج المنظم (وضع JSON ومخطط JSON) | نعم |
|
||||
| التفكير الممتد | نعم (Trinity Large Thinking) |
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="ملاحظة حول البيئة">
|
||||
إذا كان Gateway يعمل كـ daemon (launchd/systemd)، فتأكد من أن `ARCEEAI_API_KEY`
|
||||
(أو `OPENROUTER_API_KEY`) متاح لتلك العملية (على سبيل المثال في
|
||||
<Accordion title="Environment note">
|
||||
إذا كان Gateway يعمل كخدمة خفية (launchd/systemd)، فتأكد من أن `ARCEEAI_API_KEY`
|
||||
(أو `OPENROUTER_API_KEY`) متاح لتلك العملية (على سبيل المثال، في
|
||||
`~/.openclaw/.env` أو عبر `env.shellEnv`).
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="توجيه OpenRouter">
|
||||
عند استخدام نماذج Arcee عبر OpenRouter، تُطبَّق مراجع النماذج نفسها من نوع `arcee/*`.
|
||||
ويتولى OpenClaw التوجيه بشفافية وفق اختيار المصادقة لديك. راجع
|
||||
[وثائق مزوّد OpenRouter](/ar/providers/openrouter) للحصول على تفاصيل التكوين
|
||||
الخاصة بـ OpenRouter.
|
||||
<Accordion title="OpenRouter routing">
|
||||
عند استخدام نماذج Arcee عبر OpenRouter، تنطبق مراجع نماذج `arcee/*` نفسها.
|
||||
يتولى OpenClaw التوجيه بشفافية بناءً على خيار المصادقة لديك. راجع
|
||||
[وثائق مزوّد OpenRouter](/ar/providers/openrouter) للحصول على تفاصيل
|
||||
التهيئة الخاصة بـ OpenRouter.
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## ذو صلة
|
||||
## ذات صلة
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="OpenRouter" href="/ar/providers/openrouter" icon="shuffle">
|
||||
الوصول إلى نماذج Arcee ونماذج كثيرة أخرى عبر مفتاح API واحد.
|
||||
يمكنك الوصول إلى نماذج Arcee وكثير غيرها عبر مفتاح API واحد.
|
||||
</Card>
|
||||
<Card title="اختيار النموذج" href="/ar/concepts/model-providers" icon="layers">
|
||||
اختيار المزوّدين، ومراجع النماذج، وسلوك الاحتياط.
|
||||
<Card title="Model selection" href="/ar/concepts/model-providers" icon="layers">
|
||||
اختيار المزوّدين ومراجع النماذج وسلوك تجاوز الفشل.
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
@ -2,205 +2,197 @@
|
||||
read_when:
|
||||
- جارٍ البحث عن تعريفات قنوات الإصدار العامة
|
||||
- تشغيل التحقق من الإصدار أو قبول الحزمة
|
||||
- البحث عن تسمية الإصدارات ووتيرتها
|
||||
summary: مسارات الإصدار، وقائمة تحقق المشغّل، وصناديق التحقق، وتسمية الإصدارات، والوتيرة
|
||||
- البحث عن تسمية الإصدارات ووتيرة إصدارها
|
||||
summary: مسارات الإصدار، قائمة تحقق المشغل، مربعات التحقق، تسمية الإصدارات، والوتيرة
|
||||
title: سياسة الإصدار
|
||||
x-i18n:
|
||||
generated_at: "2026-05-02T21:01:57Z"
|
||||
generated_at: "2026-05-02T23:39:24Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: 493cb8b42f0e15f3bf5f8fb9be7d01fd626f4f16db9ac0a85e6efa747ef12d12
|
||||
source_hash: ba316d1736eae8edd2fb0a71b9a3da345f8895c3b536e9a1f619718ea12fc851
|
||||
source_path: reference/RELEASING.md
|
||||
workflow: 16
|
||||
---
|
||||
|
||||
لدى OpenClaw أربعة مسارات إصدار عامة:
|
||||
لدى OpenClaw ثلاثة مسارات إصدار عامة:
|
||||
|
||||
- المستقر: إصدارات موسومة تُنشر إلى npm `beta` افتراضيًا، أو إلى npm `latest` عند طلب ذلك صراحة
|
||||
- ألفا: وسوم ما قبل الإصدار التي تُنشر إلى npm `alpha`
|
||||
- مستقر: إصدارات موسومة تُنشر إلى npm `beta` افتراضيًا، أو إلى npm `latest` عند طلب ذلك صراحةً
|
||||
- بيتا: وسوم ما قبل الإصدار التي تُنشر إلى npm `beta`
|
||||
- التطوير: الرأس المتحرك لـ `main`
|
||||
- تطوير: الرأس المتحرك للفرع `main`
|
||||
|
||||
## تسمية الإصدارات
|
||||
|
||||
- إصدار الإصدار المستقر: `YYYY.M.D`
|
||||
- وسم Git: `vYYYY.M.D`
|
||||
- إصدار التصحيح المستقر: `YYYY.M.D-N`
|
||||
- إصدار تصحيح مستقر: `YYYY.M.D-N`
|
||||
- وسم Git: `vYYYY.M.D-N`
|
||||
- إصدار ألفا ما قبل الإصدار: `YYYY.M.D-alpha.N`
|
||||
- وسم Git: `vYYYY.M.D-alpha.N`
|
||||
- إصدار بيتا ما قبل الإصدار: `YYYY.M.D-beta.N`
|
||||
- وسم Git: `vYYYY.M.D-beta.N`
|
||||
- لا تضف صفرًا بادئًا للشهر أو اليوم
|
||||
- يعني `latest` إصدار npm المستقر والمروّج حاليًا
|
||||
- يعني `alpha` هدف تثبيت ألفا الحالي
|
||||
- يعني `beta` هدف تثبيت بيتا الحالي
|
||||
- تُنشر الإصدارات المستقرة وإصدارات التصحيح المستقرة إلى npm `beta` افتراضيًا؛ ويمكن لمشغّلي الإصدار استهداف `latest` صراحة، أو ترقية بناء بيتا جرى التحقق منه لاحقًا
|
||||
- يشحن كل إصدار OpenClaw مستقر حزمة npm وتطبيق macOS معًا؛
|
||||
عادةً ما تتحقق إصدارات بيتا من مسار npm/الحزمة وتنشره أولًا، مع
|
||||
حجز بناء/توقيع/توثيق تطبيق mac لنظام macOS للإصدار المستقر ما لم يُطلب ذلك صراحة
|
||||
- لا تضف أصفارًا بادئة إلى الشهر أو اليوم
|
||||
- `latest` يعني إصدار npm المستقر الحالي الذي تمت ترقيته
|
||||
- `beta` يعني هدف التثبيت التجريبي الحالي
|
||||
- تُنشر الإصدارات المستقرة وإصدارات التصحيح المستقرة إلى npm `beta` افتراضيًا؛ يمكن لمشغلي الإصدار استهداف `latest` صراحةً، أو ترقية بناء بيتا مُدقّق لاحقًا
|
||||
- كل إصدار OpenClaw مستقر يشحن حزمة npm وتطبيق macOS معًا؛
|
||||
عادةً ما تتحقق إصدارات بيتا من مسار npm/package وتنشره أولًا، مع
|
||||
حجز بناء/توقيع/توثيق تطبيق mac لإصدارات الاستقرار ما لم يُطلب ذلك صراحةً
|
||||
|
||||
## وتيرة الإصدار
|
||||
## وتيرة الإصدارات
|
||||
|
||||
- تتحرك الإصدارات وفق نهج بيتا أولًا
|
||||
- لا يتبع الإصدار المستقر إلا بعد التحقق من أحدث بيتا
|
||||
- لا يأتي الإصدار المستقر إلا بعد التحقق من أحدث إصدار بيتا
|
||||
- عادةً ما يقتطع المشرفون الإصدارات من فرع `release/YYYY.M.D` يُنشأ
|
||||
من `main` الحالي، بحيث لا تعطل عمليات التحقق من الإصدار وإصلاحاته
|
||||
من `main` الحالي، بحيث لا تمنع عملية التحقق من الإصدار وإصلاحاته
|
||||
التطوير الجديد على `main`
|
||||
- إذا دُفع وسم بيتا أو نُشر واحتاج إلى إصلاح، يقتطع المشرفون
|
||||
- إذا دُفع وسم بيتا أو نُشر ويحتاج إلى إصلاح، يقتطع المشرفون
|
||||
وسم `-beta.N` التالي بدلًا من حذف وسم بيتا القديم أو إعادة إنشائه
|
||||
- إجراءات الإصدار التفصيلية، والموافقات، وبيانات الاعتماد، وملاحظات الاسترداد
|
||||
مخصصة للمشرفين فقط
|
||||
|
||||
## قائمة تحقق مشغّل الإصدار
|
||||
## قائمة تحقق مشغل الإصدار
|
||||
|
||||
هذه القائمة هي الشكل العام لتدفق الإصدار. تبقى بيانات الاعتماد الخاصة،
|
||||
والتوقيع، والتوثيق، واسترداد dist-tag، وتفاصيل التراجع الطارئ في
|
||||
دليل تشغيل الإصدار المخصص للمشرفين فقط.
|
||||
دليل تشغيل الإصدار الخاص بالمشرفين فقط.
|
||||
|
||||
1. ابدأ من `main` الحالي: اسحب الأحدث، وتأكد من دفع الالتزام المستهدف،
|
||||
وتأكد من أن CI الحالي لـ `main` أخضر بما يكفي للتفريع منه.
|
||||
1. ابدأ من `main` الحالي: اسحب الأحدث، وأكد أن الالتزام الهدف قد دُفع،
|
||||
وأكد أن CI الحالي على `main` أخضر بما يكفي لإنشاء فرع منه.
|
||||
2. أعد كتابة قسم `CHANGELOG.md` العلوي من سجل الالتزامات الحقيقي باستخدام
|
||||
`/changelog`، وأبقِ الإدخالات موجهة للمستخدم، وثبّتها في التزام، وادفعها، ثم أعد
|
||||
rebase/السحب مرة أخرى قبل التفريع.
|
||||
`/changelog`، واجعل الإدخالات موجهة للمستخدم، ثم التزم بها وادفعها، وأجرِ rebase/pull
|
||||
مرة أخرى قبل إنشاء الفرع.
|
||||
3. راجع سجلات توافق الإصدار في
|
||||
`src/plugins/compat/registry.ts` و
|
||||
`src/commands/doctor/shared/deprecation-compat.ts`. أزل التوافق المنتهي
|
||||
فقط عندما يبقى مسار الترقية مغطى، أو سجّل سبب حمله عمدًا.
|
||||
4. أنشئ `release/YYYY.M.D` من `main` الحالي؛ لا تنفذ عمل الإصدار المعتاد
|
||||
فقط عندما يظل مسار الترقية مغطى، أو سجّل سبب حمله عمدًا.
|
||||
4. أنشئ `release/YYYY.M.D` من `main` الحالي؛ لا تنفذ عمل الإصدار العادي
|
||||
مباشرةً على `main`.
|
||||
5. ارفع كل موقع إصدار مطلوب للوسم المقصود، وشغّل
|
||||
5. ارفع رقم الإصدار في كل موضع مطلوب للوسم المقصود، وشغّل
|
||||
`pnpm plugins:sync` حتى تشارك حزم Plugin القابلة للنشر إصدار الإصدار
|
||||
وبيانات التوافق الوصفية، ثم شغّل التحقق المحلي التمهيدي الحتمي:
|
||||
وبيانات التوافق، ثم شغّل الفحص المحلي الحتمي المسبق:
|
||||
`pnpm check:test-types`، و`pnpm check:architecture`،
|
||||
و`pnpm build && pnpm ui:build`، و`pnpm plugins:sync:check`، و
|
||||
`pnpm release:check`.
|
||||
6. شغّل `OpenClaw NPM Release` مع `preflight_only=true`. قبل وجود وسم،
|
||||
يُسمح باستخدام SHA كامل بطول 40 حرفًا من فرع الإصدار للتحقق التمهيدي فقط.
|
||||
يُسمح باستخدام SHA كامل بطول 40 حرفًا لفرع الإصدار للتحقق المسبق فقط.
|
||||
احفظ `preflight_run_id` الناجح.
|
||||
7. ابدأ جميع اختبارات ما قبل الإصدار باستخدام `Full Release Validation` لفرع
|
||||
الإصدار أو الوسم أو SHA الكامل للالتزام. هذه هي نقطة الدخول اليدوية الواحدة
|
||||
الإصدار أو الوسم أو SHA الكامل للالتزام. هذا هو مدخل التشغيل اليدوي الوحيد
|
||||
لصناديق اختبار الإصدار الأربعة الكبيرة: Vitest، وDocker، وQA Lab، وPackage.
|
||||
8. إذا فشل التحقق، فأصلح على فرع الإصدار وأعد تشغيل أصغر ملف فاشل
|
||||
أو مسار أو مهمة workflow أو ملف تعريف حزمة أو مزود أو allowlist نموذج
|
||||
يثبت الإصلاح. لا تُعد تشغيل المظلة الكاملة إلا عندما يجعل السطح المتغير
|
||||
الأدلة السابقة قديمة.
|
||||
9. بالنسبة إلى ألفا أو بيتا، ضع الوسم `vYYYY.M.D-alpha.N` أو `vYYYY.M.D-beta.N`، ثم شغّل `OpenClaw Release Publish` من
|
||||
8. إذا فشل التحقق، أصلح على فرع الإصدار وأعد تشغيل أصغر ملف أو مسار أو مهمة workflow
|
||||
أو ملف تعريف حزمة أو مزود أو allowlist نموذج فشل ويثبت الإصلاح. أعد تشغيل
|
||||
المظلة الكاملة فقط عندما يجعل السطح المتغير الأدلة السابقة قديمة.
|
||||
9. بالنسبة إلى بيتا، وسّم `vYYYY.M.D-beta.N`، ثم شغّل `OpenClaw Release Publish` من
|
||||
فرع `release/YYYY.M.D` المطابق. يتحقق من `pnpm plugins:sync:check`،
|
||||
وينشر جميع حزم Plugin القابلة للنشر إلى npm أولًا، وينشر المجموعة نفسها
|
||||
إلى ClawHub ثانيًا، ثم يروّج أداة OpenClaw npm التمهيدية المحضّرة
|
||||
مع dist-tag المطابق. بعد النشر، شغّل قبول الحزمة بعد النشر مقابل حزمة
|
||||
`openclaw@YYYY.M.D-alpha.N` أو `openclaw@alpha` أو
|
||||
`openclaw@YYYY.M.D-beta.N` أو `openclaw@beta` المنشورة. إذا احتاج ما قبل إصدار
|
||||
مدفوع أو منشور إلى إصلاح، فاقتطع رقم ما قبل الإصدار المطابق التالي؛
|
||||
لا تحذف ما قبل الإصدار القديم ولا تعد كتابته.
|
||||
10. بالنسبة إلى المستقر، لا تتابع إلا بعد أن يمتلك بيتا أو مرشح الإصدار الذي جرى التحقق منه
|
||||
دليل التحقق المطلوب. يمر نشر npm المستقر أيضًا عبر
|
||||
`OpenClaw Release Publish`، مع إعادة استخدام أداة التحقق التمهيدي الناجحة عبر
|
||||
`preflight_run_id`؛ كما تتطلب جاهزية إصدار macOS المستقر أيضًا
|
||||
ملفات `.zip` و`.dmg` و`.dSYM.zip` المعبأة، و`appcast.xml` المحدّث على `main`.
|
||||
11. بعد النشر، شغّل مدقق npm بعد النشر، وTelegram E2E الاختياري المستقل
|
||||
المنشور من npm عندما تحتاج إلى إثبات قناة بعد النشر،
|
||||
وترقية dist-tag عند الحاجة، وملاحظات إصدار/ما قبل إصدار GitHub من
|
||||
قسم `CHANGELOG.md` الكامل المطابق، وخطوات إعلان الإصدار.
|
||||
وينشر أولًا كل حزم Plugin القابلة للنشر إلى npm، وينشر المجموعة نفسها إلى
|
||||
ClawHub ثانيًا، ثم يرقّي أثر فحص OpenClaw npm المسبق المُحضّر باستخدام
|
||||
dist-tag المطابق. بعد النشر، شغّل قبول الحزمة بعد النشر مقابل حزمة
|
||||
`openclaw@YYYY.M.D-beta.N` أو `openclaw@beta` المنشورة. إذا احتاج ما قبل الإصدار
|
||||
الذي دُفع أو نُشر إلى إصلاح، فاقتطع رقم ما قبل الإصدار المطابق التالي؛
|
||||
لا تحذف ما قبل الإصدار القديم ولا تعيد كتابته.
|
||||
10. بالنسبة إلى الإصدار المستقر، لا تتابع إلا بعد أن يمتلك إصدار بيتا المُدقّق
|
||||
أو مرشح الإصدار أدلة التحقق المطلوبة. نشر npm المستقر يمر أيضًا عبر
|
||||
`OpenClaw Release Publish`، مع إعادة استخدام أثر الفحص المسبق الناجح عبر
|
||||
`preflight_run_id`؛ كما تتطلب جاهزية إصدار macOS المستقر وجود
|
||||
`.zip` و`.dmg` و`.dSYM.zip` المعبأة، و`appcast.xml` المحدّث على `main`.
|
||||
11. بعد النشر، شغّل متحقق npm بعد النشر، واختبار Telegram E2E الاختياري المستقل
|
||||
من npm المنشور عندما تحتاج إلى دليل قناة بعد النشر، وترقية dist-tag عند الحاجة،
|
||||
وملاحظات إصدار/ما قبل إصدار GitHub من قسم `CHANGELOG.md` المطابق الكامل،
|
||||
وخطوات إعلان الإصدار.
|
||||
|
||||
## التحقق التمهيدي للإصدار
|
||||
## الفحص المسبق للإصدار
|
||||
|
||||
- شغّل `pnpm check:test-types` قبل فحص ما قبل الإصدار حتى تظل TypeScript الخاصة بالاختبارات
|
||||
مشمولة خارج بوابة `pnpm check` المحلية الأسرع
|
||||
- شغّل `pnpm check:architecture` قبل فحص ما قبل الإصدار حتى تكون فحوصات دورات الاستيراد
|
||||
وحدود البنية الأوسع ناجحة خارج البوابة المحلية الأسرع
|
||||
- شغّل `pnpm check:test-types` قبل فحص الإصدار التمهيدي حتى يبقى TypeScript الخاص بالاختبارات
|
||||
مشمولًا خارج بوابة `pnpm check` المحلية الأسرع
|
||||
- شغّل `pnpm check:architecture` قبل فحص الإصدار التمهيدي حتى تكون فحوصات دورات الاستيراد
|
||||
الأوسع وحدود البنية خضراء خارج البوابة المحلية الأسرع
|
||||
- شغّل `pnpm build && pnpm ui:build` قبل `pnpm release:check` حتى تكون عناصر الإصدار المتوقعة
|
||||
`dist/*` وحزمة واجهة Control UI موجودة لخطوة
|
||||
التحقق من الحزمة
|
||||
`dist/*` وحزمة واجهة Control UI موجودة لخطوة التحقق من الحزمة
|
||||
- شغّل `pnpm plugins:sync` بعد رفع إصدار الجذر وقبل وضع الوسم. فهو
|
||||
يحدّث إصدارات حزم Plugin القابلة للنشر، وبيانات توافق OpenClaw للنظير/API،
|
||||
وبيانات البناء الوصفية، وقوالب سجلات تغييرات Plugin لتطابق إصدار
|
||||
النواة. `pnpm plugins:sync:check` هو حارس الإصدار غير المعدِّل؛
|
||||
وسيفشل مسار النشر قبل أي تعديل في السجل إذا تم
|
||||
نسيان هذه الخطوة.
|
||||
يحدّث إصدارات حزم Plugin القابلة للنشر، وبيانات توافق OpenClaw النظير/API،
|
||||
وبيانات البناء، ومسودات سجل تغييرات Plugin لتطابق إصدار النواة.
|
||||
`pnpm plugins:sync:check` هو حارس الإصدار غير المعدِّل؛ ويفشل سير عمل النشر
|
||||
قبل أي تعديل في السجل إذا نُسيت هذه الخطوة.
|
||||
- شغّل سير العمل اليدوي `Full Release Validation` قبل اعتماد الإصدار
|
||||
لبدء جميع صناديق اختبار ما قبل الإصدار من نقطة دخول واحدة. يقبل فرعًا
|
||||
أو وسمًا أو SHA كاملًا للالتزام، ويطلق `CI` يدويًا، ويطلق
|
||||
`OpenClaw Release Checks` لمسارات install smoke، وقبول الحزمة، ومجموعات
|
||||
مسار إصدار Docker، والاختبارات الحية/E2E، وOpenWebUI، وتكافؤ QA Lab، وMatrix، ومسارات Telegram. مع `release_profile=full` و`rerun_group=all`، يشغّل أيضًا حزمة
|
||||
Telegram E2E مقابل الأثر `release-package-under-test` من فحوصات الإصدار. قدّم `npm_telegram_package_spec` بعد النشر عندما ينبغي لنفس
|
||||
Telegram E2E إثبات حزمة npm المنشورة أيضًا. قدّم
|
||||
`package_acceptance_package_spec` بعد النشر عندما ينبغي لقبول الحزمة
|
||||
تشغيل مصفوفة الحزمة/التحديث الخاصة به مقابل حزمة npm المشحونة بدلًا
|
||||
من الأثر المبني من SHA. قدّم
|
||||
`evidence_package_spec` عندما ينبغي لتقرير الأدلة الخاص إثبات أن
|
||||
التحقق يطابق حزمة npm منشورة دون فرض Telegram E2E.
|
||||
لتشغيل كل صناديق اختبار ما قبل الإصدار من نقطة دخول واحدة. يقبل فرعًا،
|
||||
أو وسمًا، أو SHA كاملًا للالتزام، ويطلق `CI` يدويًا، ويطلق
|
||||
`OpenClaw Release Checks` لمسارات فحص التثبيت، وقبول الحزمة، ومجموعات مسار
|
||||
إصدار Docker، والاختبارات الحية/E2E، وOpenWebUI، وتكافؤ QA Lab، وMatrix،
|
||||
ومسارات Telegram. مع `release_profile=full` و`rerun_group=all`، يشغّل أيضًا
|
||||
Telegram E2E للحزمة مقابل عنصر `release-package-under-test` الناتج من فحوصات
|
||||
الإصدار. قدّم `npm_telegram_package_spec` بعد النشر عندما يجب على Telegram E2E
|
||||
نفسها إثبات حزمة npm المنشورة أيضًا. قدّم `package_acceptance_package_spec`
|
||||
بعد النشر عندما ينبغي أن يشغّل Package Acceptance مصفوفة الحزمة/التحديث الخاصة به
|
||||
مقابل حزمة npm المشحونة بدلًا من العنصر المبني من SHA. قدّم
|
||||
`evidence_package_spec` عندما يجب أن يثبت تقرير الأدلة الخاص أن التحقق
|
||||
يطابق حزمة npm منشورة من دون فرض Telegram E2E.
|
||||
مثال:
|
||||
`gh workflow run full-release-validation.yml --ref main -f ref=release/YYYY.M.D`
|
||||
- شغّل سير العمل اليدوي `Package Acceptance` عندما تريد دليلًا جانبيًا
|
||||
- شغّل سير العمل اليدوي `Package Acceptance` عندما تريد دليلًا من قناة جانبية
|
||||
لمرشح حزمة بينما يستمر عمل الإصدار. استخدم `source=npm` من أجل
|
||||
`openclaw@alpha` أو `openclaw@beta` أو `openclaw@latest` أو إصدار محدد بدقة؛ و`source=ref`
|
||||
لحزم فرع/وسم/SHA موثوق به في `package_ref` باستخدام عدة
|
||||
`workflow_ref` الحالية؛ و`source=url` لملف tarball عبر HTTPS مع
|
||||
SHA-256 مطلوب؛ أو `source=artifact` لملف tarball تم رفعه بواسطة تشغيل
|
||||
GitHub Actions آخر. يحل سير العمل المرشح إلى
|
||||
`openclaw@beta`، أو `openclaw@latest`، أو إصدار محدد بدقة؛ و`source=ref`
|
||||
لحزم فرع/وسم/SHA موثوق في `package_ref` باستخدام عدة `workflow_ref` الحالية؛
|
||||
و`source=url` لأرشيف tarball عبر HTTPS مع SHA-256 إلزامي؛ أو `source=artifact`
|
||||
لأرشيف tarball مرفوع من تشغيل GitHub Actions آخر. يحل سير العمل المرشح إلى
|
||||
`package-under-test`، ويعيد استخدام مجدول إصدار Docker E2E مقابل ذلك
|
||||
الملف، ويمكنه تشغيل Telegram QA مقابل ملف tarball نفسه باستخدام
|
||||
الأرشيف، ويمكنه تشغيل Telegram QA مقابل الأرشيف نفسه باستخدام
|
||||
`telegram_mode=mock-openai` أو `telegram_mode=live-frontier`. عندما تتضمن
|
||||
مسارات Docker المحددة `published-upgrade-survivor`، يكون أثر الحزمة
|
||||
هو المرشح ويحدد `published_upgrade_survivor_baseline`
|
||||
خط الأساس المنشور.
|
||||
مسارات Docker المحددة `published-upgrade-survivor`، يكون عنصر الحزمة هو
|
||||
المرشح ويحدد `published_upgrade_survivor_baseline` خط الأساس المنشور.
|
||||
مثال: `gh workflow run package-acceptance.yml --ref main -f workflow_ref=main -f source=npm -f package_spec=openclaw@beta -f suite_profile=product -f published_upgrade_survivor_baseline=openclaw@2026.4.26 -f telegram_mode=mock-openai`
|
||||
الملفات الشخصية الشائعة:
|
||||
- `smoke`: مسارات التثبيت/القناة/الوكيل، وشبكة Gateway، وإعادة تحميل التهيئة
|
||||
- `package`: مسارات الحزمة/التحديث/Plugin الأصلية للأثر دون OpenWebUI أو ClawHub حي
|
||||
- `product`: ملف الحزمة الشخصي بالإضافة إلى قنوات MCP، وتنظيف cron/الوكيل الفرعي،
|
||||
- `smoke`: مسارات التثبيت/القناة/الوكيل، وشبكة Gateway، وإعادة تحميل الإعدادات
|
||||
- `package`: مسارات الحزمة/التحديث/Plugin الأصلية للعنصر من دون OpenWebUI أو ClawHub حي
|
||||
- `product`: ملف الحزمة الشخصي إضافة إلى قنوات MCP، وتنظيف cron/الوكيل الفرعي،
|
||||
وبحث الويب من OpenAI، وOpenWebUI
|
||||
- `full`: أجزاء مسار إصدار Docker مع OpenWebUI
|
||||
- `custom`: اختيار `docker_lanes` بدقة لإعادة تشغيل مركزة
|
||||
- شغّل سير العمل اليدوي `CI` مباشرةً عندما تحتاج فقط إلى تغطية CI عادية
|
||||
كاملة لمرشح الإصدار. تتجاوز تشغيلات CI اليدوية نطاق التغييرات
|
||||
وتفرض شظايا Linux Node، وشظايا Plugin المضمّنة، وعقود القنوات، وتوافق
|
||||
Node 22، و`check`، و`check-additional`، واختبار البناء السريع،
|
||||
وفحوصات المستندات، وPython skills، وWindows، وmacOS، وAndroid، ومسارات Control UI i18n.
|
||||
- `custom`: تحديد `docker_lanes` بدقة لإعادة تشغيل مركزة
|
||||
- شغّل سير العمل اليدوي `CI` مباشرة عندما تحتاج فقط إلى تغطية CI العادية الكاملة
|
||||
لمرشح الإصدار. تتجاوز عمليات إطلاق CI اليدوية نطاق التغييرات
|
||||
وتفرض أجزاء Linux Node، وأجزاء Plugin المضمّنة، وعقود القنوات،
|
||||
وتوافق Node 22، و`check`، و`check-additional`، وفحص البناء،
|
||||
وفحوصات الوثائق، وSkills الخاصة بـ Python، وWindows، وmacOS، وAndroid، ومسارات i18n
|
||||
الخاصة بواجهة Control UI.
|
||||
مثال: `gh workflow run ci.yml --ref release/YYYY.M.D`
|
||||
- شغّل `pnpm qa:otel:smoke` عند التحقق من قياسات الإصدار. فهو يمرّن
|
||||
QA-lab عبر مستقبل OTLP/HTTP محلي ويتحقق من أسماء مقاطع التتبع
|
||||
المصدّرة، والسمات المحدودة، وتنقيح المحتوى/المعرّفات دون
|
||||
الحاجة إلى Opik أو Langfuse أو أي مجمّع خارجي آخر.
|
||||
- شغّل `pnpm qa:otel:smoke` عند التحقق من قياس الإصدار. فهو يمرّن
|
||||
QA-lab عبر مستقبِل OTLP/HTTP محلي ويتحقق من أسماء نطاقات التتبع المصدّرة،
|
||||
والسمات المحدودة، وتنقيح المحتوى/المعرّفات من دون الحاجة إلى Opik أو Langfuse
|
||||
أو جامع خارجي آخر.
|
||||
- شغّل `pnpm release:check` قبل كل إصدار موسوم
|
||||
- شغّل `OpenClaw Release Publish` لتسلسل النشر المعدِّل بعد وجود
|
||||
الوسم. أطلقه من `release/YYYY.M.D` (أو `main` عند نشر وسم
|
||||
يمكن الوصول إليه من main)، ومرّر وسم الإصدار و`preflight_run_id`
|
||||
ناجحًا لـ OpenClaw npm، وأبقِ نطاق نشر Plugin الافتراضي
|
||||
`all-publishable` ما لم تكن تشغّل إصلاحًا مركزًا عمدًا. يقوم سير
|
||||
العمل بتسلسل نشر Plugin إلى npm، ونشر Plugin إلى ClawHub، ونشر OpenClaw
|
||||
إلى npm بحيث لا تُنشر الحزمة الأساسية قبل Plugins الخارجية الخاصة بها.
|
||||
- شغّل `OpenClaw Release Publish` لتسلسل النشر المعدِّل بعد وجود الوسم.
|
||||
أطلقه من `release/YYYY.M.D` (أو `main` عند نشر وسم يمكن الوصول إليه من main)،
|
||||
ومرّر وسم الإصدار و`preflight_run_id` الناجح الخاص بـ npm لـ OpenClaw،
|
||||
وأبقِ نطاق نشر Plugin الافتراضي `all-publishable` إلا إذا كنت تشغّل إصلاحًا
|
||||
مركزًا عمدًا. ينسّق سير العمل نشر npm الخاص بـ Plugin، ونشر ClawHub الخاص بـ Plugin،
|
||||
ونشر npm الخاص بـ OpenClaw حتى لا تُنشر حزمة النواة قبل Plugins الخارجية.
|
||||
- تعمل فحوصات الإصدار الآن في سير عمل يدوي منفصل:
|
||||
`OpenClaw Release Checks`
|
||||
- يشغّل `OpenClaw Release Checks` أيضًا مسار تكافؤ QA Lab الوهمي بالإضافة إلى ملف Matrix الحي السريع ومسار Telegram QA قبل اعتماد الإصدار. تستخدم المسارات الحية بيئة `qa-live-shared`؛ ويستخدم Telegram أيضًا عقود إيجار بيانات اعتماد Convex CI. شغّل سير العمل اليدوي `QA-Lab - All Lanes` مع
|
||||
`matrix_profile=all` و`matrix_shards=true` عندما تريد جرد نقل Matrix
|
||||
والوسائط وE2EE الكامل بالتوازي.
|
||||
- يُعد التحقق التشغيلي للتثبيت والترقية عبر أنظمة التشغيل جزءًا من
|
||||
- يشغّل `OpenClaw Release Checks` أيضًا مسار تكافؤ QA Lab الوهمي إضافة إلى ملف Matrix
|
||||
الحي السريع ومسار Telegram QA قبل اعتماد الإصدار. تستخدم المسارات الحية بيئة
|
||||
`qa-live-shared`؛ ويستخدم Telegram أيضًا عقود اعتماد Convex CI. شغّل سير العمل
|
||||
اليدوي `QA-Lab - All Lanes` مع `matrix_profile=all` و`matrix_shards=true`
|
||||
عندما تريد جرد نقل Matrix الكامل والوسائط وE2EE بالتوازي.
|
||||
- تحقق وقت تشغيل التثبيت والترقية عبر أنظمة التشغيل جزء من
|
||||
`OpenClaw Release Checks` و`Full Release Validation` العامين، اللذين يستدعيان
|
||||
سير العمل القابل لإعادة الاستخدام
|
||||
`.github/workflows/openclaw-cross-os-release-checks-reusable.yml` مباشرةً
|
||||
- هذا الفصل مقصود: أبقِ مسار إصدار npm الحقيقي قصيرًا،
|
||||
وحتميًا، ومركزًا على الأثر، بينما تبقى الفحوصات الحية الأبطأ في
|
||||
مسارها الخاص حتى لا تعطل النشر أو تحظره
|
||||
`.github/workflows/openclaw-cross-os-release-checks-reusable.yml` مباشرة
|
||||
- هذا الفصل مقصود: أبقِ مسار إصدار npm الحقيقي قصيرًا
|
||||
وحتميًا ومركّزًا على العناصر، بينما تبقى الفحوصات الحية الأبطأ في مسارها الخاص
|
||||
حتى لا تؤخر النشر أو تمنعه
|
||||
- ينبغي إطلاق فحوصات الإصدار التي تحمل أسرارًا عبر `Full Release
|
||||
Validation` أو من مرجع سير عمل `main`/الإصدار حتى يظل منطق سير العمل
|
||||
Validation` أو من مرجع سير العمل `main`/release حتى تبقى منطق سير العمل
|
||||
والأسرار تحت السيطرة
|
||||
- يقبل `OpenClaw Release Checks` فرعًا أو وسمًا أو SHA كاملًا للالتزام ما دام
|
||||
الالتزام المحلول يمكن الوصول إليه من فرع OpenClaw أو وسم إصدار
|
||||
- يقبل فحص ما قبل الإصدار للتحقق فقط في `OpenClaw NPM Release` أيضًا
|
||||
SHA الكامل الحالي ذي 40 حرفًا لالتزام فرع سير العمل دون الحاجة إلى وسم مدفوع
|
||||
- مسار SHA هذا للتحقق فقط ولا يمكن ترقيته إلى نشر حقيقي
|
||||
- في وضع SHA، يصنع سير العمل `v<package.json version>` فقط من أجل
|
||||
فحص بيانات الحزمة الوصفية؛ ولا يزال النشر الحقيقي يتطلب وسم إصدار حقيقيًا
|
||||
- يحافظ كلا سيري العمل على مسار النشر والترقية الحقيقي على مشغلات
|
||||
GitHub المستضافة، بينما يمكن لمسار التحقق غير المعدِّل استخدام مشغلات
|
||||
Blacksmith Linux الأكبر
|
||||
- يقبل `OpenClaw Release Checks` فرعًا، أو وسمًا، أو SHA كاملًا للالتزام ما دام
|
||||
الالتزام المحلول قابلًا للوصول من فرع OpenClaw أو وسم إصدار
|
||||
- يقبل فحص `OpenClaw NPM Release` التمهيدي المخصص للتحقق فقط أيضًا SHA الالتزام
|
||||
الحالي الكامل المكوّن من 40 حرفًا لفرع سير العمل من دون اشتراط وسم مدفوع
|
||||
- مسار SHA هذا مخصص للتحقق فقط ولا يمكن ترقيته إلى نشر حقيقي
|
||||
- في وضع SHA ينشئ سير العمل `v<package.json version>` فقط لفحص بيانات
|
||||
الحزمة؛ أما النشر الحقيقي فما زال يتطلب وسم إصدار حقيقيًا
|
||||
- يحافظ كلا سيري العمل على مسار النشر والترقية الحقيقي على مشغلات GitHub المستضافة،
|
||||
بينما يمكن لمسار التحقق غير المعدِّل استخدام مشغلات Blacksmith Linux الأكبر
|
||||
- يشغّل ذلك سير العمل
|
||||
`OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_CACHE_TEST=1 pnpm test:live:cache`
|
||||
باستخدام سري سير العمل `OPENAI_API_KEY` و`ANTHROPIC_API_KEY` كليهما
|
||||
- لم يعد فحص ما قبل إصدار npm ينتظر مسار فحوصات الإصدار المنفصل
|
||||
باستخدام سري سير العمل `OPENAI_API_KEY` و`ANTHROPIC_API_KEY`
|
||||
- لم يعد فحص npm التمهيدي للإصدار ينتظر مسار فحوصات الإصدار المنفصل
|
||||
- شغّل `RELEASE_TAG=vYYYY.M.D node --import tsx scripts/openclaw-npm-release-check.ts`
|
||||
(أو وسم beta/التصحيح المطابق) قبل الاعتماد
|
||||
- بعد نشر npm، شغّل
|
||||
@ -208,68 +200,66 @@ Validation` أو من مرجع سير عمل `main`/الإصدار حتى يظل
|
||||
(أو إصدار beta/التصحيح المطابق) للتحقق من مسار تثبيت السجل المنشور
|
||||
في بادئة مؤقتة جديدة
|
||||
- بعد نشر beta، شغّل `OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@YYYY.M.D-beta.N OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci pnpm test:docker:npm-telegram-live`
|
||||
للتحقق من تهيئة الحزمة المثبتة، وإعداد Telegram، وTelegram E2E الحقيقي
|
||||
مقابل حزمة npm المنشورة باستخدام مجموعة بيانات اعتماد Telegram المؤجرة المشتركة. يمكن لعمليات المشرف المحلية لمرة واحدة حذف متغيرات Convex وتمرير
|
||||
بيانات اعتماد البيئة الثلاثة `OPENCLAW_QA_TELEGRAM_*` مباشرةً.
|
||||
- يمكن للمشرفين تشغيل فحص ما بعد النشر نفسه من GitHub Actions عبر
|
||||
سير العمل اليدوي `NPM Telegram Beta E2E`. وهو يدوي فقط عمدًا ولا
|
||||
يعمل عند كل دمج.
|
||||
- تستخدم أتمتة إصدار المشرفين الآن أسلوب الفحص المسبق ثم الترقية:
|
||||
- يجب أن يمر نشر npm الحقيقي عبر `preflight_run_id` ناجح لـ npm
|
||||
للتحقق من تأهيل الحزمة المثبتة، وإعداد Telegram، وTelegram E2E الحقيقي
|
||||
مقابل حزمة npm المنشورة باستخدام تجمع بيانات اعتماد Telegram المؤجرة المشتركة.
|
||||
يمكن للقطات المحلية الفردية للمشرفين حذف متغيرات Convex وتمرير بيانات اعتماد البيئة الثلاثة
|
||||
`OPENCLAW_QA_TELEGRAM_*` مباشرة.
|
||||
- يمكن للمشرفين تشغيل فحص ما بعد النشر نفسه من GitHub Actions عبر سير العمل
|
||||
اليدوي `NPM Telegram Beta E2E`. وهو يدوي فقط عمدًا ولا يعمل عند كل دمج.
|
||||
- تستخدم أتمتة إصدار المشرفين الآن نمط الفحص التمهيدي ثم الترقية:
|
||||
- يجب أن يجتاز نشر npm الحقيقي `preflight_run_id` ناجحًا لـ npm
|
||||
- يجب إطلاق نشر npm الحقيقي من فرع `main` أو
|
||||
`release/YYYY.M.D` نفسه الذي انطلق منه تشغيل الفحص المسبق الناجح
|
||||
- إصدارات npm المستقرة تضبط افتراضيًا إلى `beta`
|
||||
- يمكن لنشر npm المستقر استهداف `latest` صراحةً عبر مدخل سير العمل
|
||||
- أصبح تعديل dist-tag في npm القائم على الرمز المميز موجودًا الآن في
|
||||
`release/YYYY.M.D` نفسه مثل تشغيل الفحص التمهيدي الناجح
|
||||
- الإصدارات المستقرة من npm تستخدم `beta` افتراضيًا
|
||||
- يمكن لنشر npm المستقر استهداف `latest` صراحة عبر مدخل سير العمل
|
||||
- انتقل تعديل dist-tag في npm المستند إلى الرموز الآن إلى
|
||||
`openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`
|
||||
لأسباب أمنية، لأن `npm dist-tag add` لا يزال يحتاج إلى `NPM_TOKEN` بينما
|
||||
يبقي المستودع العام النشر معتمدًا على OIDC فقط
|
||||
- `macOS Release` العام للتحقق فقط؛ عندما يوجد وسم فقط على
|
||||
فرع إصدار لكن سير العمل يُطلق من `main`، اضبط
|
||||
لأسباب أمنية، لأن `npm dist-tag add` ما زال يحتاج إلى `NPM_TOKEN` بينما
|
||||
يبقي المستودع العام النشر عبر OIDC فقط
|
||||
- `macOS Release` العام مخصص للتحقق فقط؛ عندما يكون الوسم موجودًا على فرع
|
||||
إصدار فقط لكن سير العمل يُطلق من `main`، اضبط
|
||||
`public_release_branch=release/YYYY.M.D`
|
||||
- يجب أن يمر نشر mac الخاص الحقيقي عبر `preflight_run_id` و`validate_run_id`
|
||||
ناجحين لـ mac الخاص
|
||||
- تقوم مسارات النشر الحقيقية بترقية الآثار المحضّرة بدلًا من إعادة بنائها
|
||||
مرة أخرى
|
||||
- بالنسبة إلى إصدارات التصحيح المستقرة مثل `YYYY.M.D-N`، يتحقق مدقق ما بعد النشر
|
||||
أيضًا من مسار الترقية نفسه ذي البادئة المؤقتة من `YYYY.M.D` إلى `YYYY.M.D-N`
|
||||
حتى لا تترك تصحيحات الإصدار التثبيتات العامة الأقدم بصمت على
|
||||
حمولة الإصدار المستقر الأساسية
|
||||
- يفشل فحص ما قبل إصدار npm مغلقًا ما لم يتضمن ملف tarball كلًا من
|
||||
- يجب أن يجتاز نشر mac الخاص الحقيقي `preflight_run_id` و`validate_run_id`
|
||||
ناجحين للـ mac الخاص
|
||||
- ترقّي مسارات النشر الحقيقية العناصر المجهزة بدلًا من إعادة بنائها مرة أخرى
|
||||
- بالنسبة لإصدارات التصحيح المستقرة مثل `YYYY.M.D-N`، يتحقق مدقق ما بعد النشر
|
||||
أيضًا من مسار الترقية نفسه ببادئة مؤقتة من `YYYY.M.D` إلى `YYYY.M.D-N`
|
||||
حتى لا تترك تصحيحات الإصدار التثبيتات العامة الأقدم بصمت على حمولة الإصدار
|
||||
المستقر الأساسي
|
||||
- يفشل فحص npm التمهيدي للإصدار بإغلاق آمن ما لم يتضمن الأرشيف كلًا من
|
||||
`dist/control-ui/index.html` وحمولة غير فارغة في `dist/control-ui/assets/`
|
||||
حتى لا نشحن لوحة تحكم متصفح فارغة مرة أخرى
|
||||
- يتحقق التحقق بعد النشر أيضًا من وجود نقاط دخول Plugin المنشورة
|
||||
وبيانات الحزمة الوصفية في تخطيط السجل المثبت. يفشل الإصدار الذي
|
||||
يشحن حمولات تشغيل Plugin مفقودة في مدقق ما بعد النشر ولا
|
||||
يمكن ترقيته إلى `latest`.
|
||||
- يفرض `pnpm test:install:smoke` أيضًا ميزانية `unpackedSize` لحزمة npm على
|
||||
ملف tarball المرشح للتحديث، بحيث تكتشف اختبارات e2e للمثبت تضخم الحزمة العرضي
|
||||
- يتحقق فحص ما بعد النشر أيضًا من وجود نقاط دخول Plugin المنشورة
|
||||
وبيانات الحزمة في تخطيط السجل المثبت. الإصدار الذي يشحن حمولات تشغيل Plugin
|
||||
ناقصة يفشل في مدقق ما بعد النشر ولا يمكن ترقيته إلى `latest`.
|
||||
- يفرض `pnpm test:install:smoke` أيضًا ميزانية `unpackedSize` الخاصة بحزمة npm
|
||||
على أرشيف تحديث المرشح، حتى يلتقط installer e2e تضخم الحزمة العرضي
|
||||
قبل مسار نشر الإصدار
|
||||
- إذا مس عمل الإصدار تخطيط CI أو بيانات توقيت الإضافة أو
|
||||
مصفوفات اختبار الإضافة، فأعد توليد ومراجعة مخرجات مصفوفة
|
||||
- إذا لمس عمل الإصدار تخطيط CI، أو بيانات توقيت الامتدادات، أو مصفوفات اختبار
|
||||
الامتدادات، فأعد توليد ومراجعة مخرجات مصفوفة
|
||||
`plugin-prerelease-extension-shard` المملوكة للمخطط من
|
||||
`.github/workflows/plugin-prerelease.yml` قبل الاعتماد حتى لا
|
||||
تصف ملاحظات الإصدار تخطيط CI قديمًا
|
||||
- تشمل جاهزية إصدار macOS المستقر أيضًا أسطح المحدث:
|
||||
- يجب أن ينتهي إصدار GitHub بملفات `.zip` و`.dmg` و`.dSYM.zip` المحزّمة
|
||||
- يجب أن يشير `appcast.xml` على `main` إلى zip المستقر الجديد بعد النشر
|
||||
- يجب أن يحافظ التطبيق المحزّم على معرّف حزمة غير تصحيحي، وعنوان URL
|
||||
غير فارغ لتغذية Sparkle، و`CFBundleVersion` عند أو فوق حد أرضية بناء Sparkle القانوني
|
||||
لذلك الإصدار
|
||||
`.github/workflows/plugin-prerelease.yml` قبل الاعتماد حتى لا تصف ملاحظات الإصدار
|
||||
تخطيط CI قديمًا
|
||||
- تشمل جاهزية إصدار macOS المستقر أيضًا أسطح التحديث:
|
||||
- يجب أن ينتهي إصدار GitHub ومعه ملفات `.zip` و`.dmg` و`.dSYM.zip` المعبأة
|
||||
- يجب أن يشير `appcast.xml` على `main` إلى ملف zip المستقر الجديد بعد النشر
|
||||
- يجب أن يحافظ التطبيق المعبأ على معرّف حزمة غير مخصص للتصحيح، وعنوان URL غير فارغ
|
||||
لتغذية Sparkle، و`CFBundleVersion` عند أو فوق الحد الأدنى القانوني لبناء Sparkle
|
||||
لإصدار ذلك الإصدار
|
||||
|
||||
## صناديق اختبار الإصدار
|
||||
|
||||
`Full Release Validation` هي الطريقة التي يبدأ بها المشغلون جميع اختبارات ما قبل الإصدار من
|
||||
نقطة دخول واحدة. لإثبات التزام مثبت على فرع سريع الحركة، استخدم
|
||||
المساعد حتى يعمل كل سير عمل فرعي من فرع مؤقت مثبت عند SHA الهدف:
|
||||
`Full Release Validation` هي الطريقة التي يطلق بها المشغلون كل اختبارات ما قبل الإصدار من
|
||||
نقطة دخول واحدة. للحصول على دليل التزام مثبت على فرع سريع الحركة، استخدم
|
||||
المساعد حتى يعمل كل سير عمل فرعي من فرع مؤقت مثبت على SHA المستهدف:
|
||||
|
||||
```bash
|
||||
pnpm ci:full-release --sha <full-sha>
|
||||
```
|
||||
|
||||
يدفع المساعد `release-ci/<sha>-...`، ويطلق `Full Release Validation`
|
||||
من ذلك الفرع مع `ref=<sha>`، ويتحقق من أن كل `headSha` لسير عمل فرعي
|
||||
يطابق الهدف، ثم يحذف الفرع المؤقت. وهذا يتجنب إثبات تشغيل فرعي أحدث من
|
||||
من ذلك الفرع مع `ref=<sha>`، ويتحقق من أن `headSha` لكل سير عمل فرعي
|
||||
يطابق الهدف، ثم يحذف الفرع المؤقت. يتجنب هذا إثبات تشغيل فرعي أحدث من
|
||||
`main` عن طريق الخطأ.
|
||||
|
||||
للتحقق من فرع إصدار أو وسم، شغّله من مرجع سير العمل الموثوق `main`
|
||||
@ -285,46 +275,39 @@ gh workflow run full-release-validation.yml \
|
||||
-f evidence_package_spec=openclaw@YYYY.M.D-beta.N
|
||||
```
|
||||
|
||||
يعالج سير العمل مرجع الهدف، ويشغّل `CI` يدويًا مع
|
||||
يحل سير العمل مرجع الهدف، ويشغّل `CI` يدويًا مع
|
||||
`target_ref=<release-ref>`، ويشغّل `OpenClaw Release Checks`، ويشغّل
|
||||
اختبار Telegram E2E المستقل للحزمة عندما تكون `release_profile=full` مع
|
||||
`rerun_group=all` أو عند تعيين `npm_telegram_package_spec`. بعد ذلك، يتفرع
|
||||
`OpenClaw Release Checks` إلى اختبارات install smoke، وفحوصات الإصدار عبر
|
||||
أنظمة التشغيل، وتغطية مسار الإصدار live/E2E Docker، وPackage Acceptance مع
|
||||
Telegram package QA، وتكافؤ QA Lab، وMatrix المباشر، وTelegram المباشر. لا
|
||||
يُعد التشغيل الكامل مقبولًا إلا عندما يُظهر ملخص
|
||||
اختبار Telegram E2E المستقل للحزمة عندما يكون `release_profile=full` مع
|
||||
`rerun_group=all` أو عندما يتم ضبط `npm_telegram_package_spec`. ثم يوسّع
|
||||
`OpenClaw Release Checks` التنفيذ إلى install smoke، وفحوصات الإصدار عبر أنظمة التشغيل، وتغطية مسار إصدار Docker الحية/E2E، وPackage Acceptance مع ضمان جودة حزمة Telegram، وتكافؤ QA Lab، وMatrix الحي، وTelegram الحي. لا يُعد التشغيل الكامل مقبولًا إلا عندما يعرض ملخص
|
||||
`Full Release Validation`
|
||||
أن `normal_ci` و`release_checks` ناجحان. في وضع full/all، يجب أن يكون الفرع
|
||||
الابن `npm_telegram` ناجحًا أيضًا؛ وخارج full/all يُتخطى إلا إذا قُدمت
|
||||
قيمة `npm_telegram_package_spec` منشورة. يتضمن ملخص أداة التحقق النهائي
|
||||
جداول أبطأ المهام لكل تشغيل ابن، بحيث يستطيع مدير الإصدار رؤية المسار الحرج
|
||||
الحالي من دون تنزيل السجلات.
|
||||
راجع [التحقق الكامل من الإصدار](/ar/reference/full-release-validation) للاطلاع
|
||||
على مصفوفة المراحل الكاملة، وأسماء مهام سير العمل الدقيقة، والفروق بين ملفي
|
||||
التعريف stable وfull، والتحف، ومقابض إعادة التشغيل المركزة.
|
||||
تُشغّل مهام سير العمل الابنة من المرجع الموثوق الذي يشغّل `Full Release
|
||||
Validation`، وعادةً يكون `--ref main`، حتى عندما يشير `ref` الهدف إلى فرع
|
||||
إصدار أو وسم أقدم. لا يوجد إدخال منفصل لمرجع سير عمل Full Release Validation؛
|
||||
اختر الحاضنة الموثوقة عبر اختيار مرجع تشغيل سير العمل. لا تستخدم
|
||||
`--ref main -f ref=<sha>` لإثبات الالتزام الدقيق على `main` المتحرك؛ لا يمكن
|
||||
أن تكون قيم SHA الخام للالتزامات مراجع تشغيل لسير العمل، لذلك استخدم
|
||||
`pnpm ci:full-release --sha <sha>` لإنشاء الفرع المؤقت المثبت.
|
||||
أن `normal_ci` و`release_checks` ناجحان. في وضع full/all،
|
||||
يجب أن يكون الطفل `npm_telegram` ناجحًا أيضًا؛ وخارج full/all يتم تخطيه
|
||||
ما لم يتم توفير `npm_telegram_package_spec` منشور. يتضمن ملخص
|
||||
التحقق النهائي جداول أبطأ المهام لكل تشغيل طفل، حتى يتمكن مدير الإصدار من رؤية المسار الحرج الحالي من دون تنزيل السجلات.
|
||||
راجع [التحقق الكامل من الإصدار](/ar/reference/full-release-validation) للاطلاع على
|
||||
مصفوفة المراحل الكاملة، وأسماء مهام سير العمل الدقيقة، والفروق بين ملف التعريف stable وfull، والآثار، ومقابض إعادة التشغيل المركّزة.
|
||||
تُشغَّل مهام سير العمل الطفل من المرجع الموثوق الذي يشغّل `Full Release
|
||||
Validation`، عادةً `--ref main`، حتى عندما يشير `ref` الهدف إلى
|
||||
فرع إصدار أو وسم أقدم. لا يوجد إدخال منفصل لمرجع سير عمل Full Release Validation؛ اختر حاضنة التشغيل الموثوقة باختيار مرجع تشغيل سير العمل.
|
||||
لا تستخدم `--ref main -f ref=<sha>` لإثبات الالتزام الدقيق على `main` المتحرك؛
|
||||
لا يمكن أن تكون قيم SHA الخام للالتزامات مراجع تشغيل لسير العمل، لذلك استخدم
|
||||
`pnpm ci:full-release --sha <sha>` لإنشاء الفرع المؤقت المثبّت.
|
||||
|
||||
استخدم `release_profile` لاختيار اتساع live/provider:
|
||||
استخدم `release_profile` لتحديد اتساع التغطية الحية/المزوّد:
|
||||
|
||||
- `minimum`: أسرع مسار live وDocker الحرج للإصدار في OpenAI/core
|
||||
- `stable`: الحد الأدنى بالإضافة إلى تغطية provider/backend مستقرة لاعتماد الإصدار
|
||||
- `full`: stable بالإضافة إلى تغطية استشارية واسعة للموفرين/الوسائط
|
||||
- `minimum`: أسرع مسار OpenAI/core حي وDocker حرج للإصدار
|
||||
- `stable`: الحد الأدنى بالإضافة إلى تغطية المزوّدات/الخلفيات المستقرة لاعتماد الإصدار
|
||||
- `full`: stable بالإضافة إلى تغطية استشارية واسعة للمزوّدين/الوسائط
|
||||
|
||||
يستخدم `OpenClaw Release Checks` مرجع سير العمل الموثوق لحل المرجع الهدف
|
||||
مرة واحدة باسم `release-package-under-test` ويعيد استخدام تلك التحفة في كل
|
||||
من فحوصات Docker لمسار الإصدار وPackage Acceptance. يبقي هذا كل الصناديق
|
||||
الموجهة للحزمة على البايتات نفسها ويتجنب بناء الحزمة مرارًا. يستخدم اختبار
|
||||
OpenAI install smoke عبر أنظمة التشغيل `OPENCLAW_CROSS_OS_OPENAI_MODEL` عندما
|
||||
يكون متغير repo/org معينًا، وإلا يستخدم `openai/gpt-5.4`، لأن هذا المسار
|
||||
يثبت تثبيت الحزمة، والإعداد الأولي، وبدء Gateway، ودورة واحدة لوكيل مباشر،
|
||||
بدلًا من قياس أبطأ نموذج افتراضي. تظل مصفوفة provider المباشر الأوسع هي
|
||||
المكان المخصص للتغطية الخاصة بالنماذج.
|
||||
مرة واحدة باسم `release-package-under-test` ويعيد استخدام ذلك الأثر في كل من
|
||||
فحوصات Docker لمسار الإصدار وPackage Acceptance. وهذا يبقي كل صناديق
|
||||
مواجهة الحزمة على البايتات نفسها ويتجنب تكرار بناء الحزمة.
|
||||
يستخدم install smoke الخاص بـ OpenAI عبر أنظمة التشغيل `OPENCLAW_CROSS_OS_OPENAI_MODEL` عندما يكون متغير المستودع/المؤسسة مضبوطًا، وإلا `openai/gpt-5.4`، لأن هذا المسار
|
||||
يثبت تثبيت الحزمة، والإعداد الأولي، وبدء تشغيل Gateway، ودورة وكيل حية واحدة
|
||||
بدلًا من قياس أداء أبطأ نموذج افتراضي. تظل مصفوفة المزوّدات الحية الأوسع
|
||||
هي المكان المخصص للتغطية الخاصة بالنماذج.
|
||||
|
||||
استخدم هذه المتغيرات بحسب مرحلة الإصدار:
|
||||
|
||||
@ -356,42 +339,36 @@ gh workflow run full-release-validation.yml \
|
||||
-f npm_telegram_provider_mode=mock-openai
|
||||
```
|
||||
|
||||
لا تستخدم المظلة الكاملة كأول إعادة تشغيل بعد إصلاح مركز. إذا فشل صندوق
|
||||
واحد، فاستخدم سير العمل الابن الفاشل، أو المهمة، أو مسار Docker، أو ملف
|
||||
تعريف الحزمة، أو موفر النموذج، أو مسار QA للإثبات التالي. شغّل المظلة الكاملة
|
||||
مرة أخرى فقط عندما يغير الإصلاح تنسيق الإصدار المشترك أو يجعل دليل كل
|
||||
الصناديق السابق قديمًا. تعيد أداة التحقق النهائية للمظلة فحص معرفات تشغيل
|
||||
سير العمل الابن المسجلة، لذلك بعد إعادة تشغيل سير عمل ابن بنجاح، أعد تشغيل
|
||||
مهمة الأصل الفاشلة `Verify full validation` فقط.
|
||||
لا تستخدم المظلة الكاملة كأول إعادة تشغيل بعد إصلاح مركّز. إذا فشل صندوق واحد،
|
||||
فاستخدم سير العمل الطفل الفاشل، أو المهمة، أو مسار Docker، أو ملف تعريف الحزمة، أو مزوّد النموذج، أو مسار QA للإثبات التالي. أعد تشغيل المظلة الكاملة مرة أخرى فقط عندما
|
||||
يغيّر الإصلاح تنسيق الإصدار المشترك أو يجعل أدلة كل الصناديق السابقة
|
||||
قديمة. يعيد متحقق المظلة النهائي فحص معرّفات تشغيل مهام سير العمل الطفل المسجلة، لذلك بعد إعادة تشغيل سير عمل طفل بنجاح، أعد تشغيل مهمة الأب الفاشلة فقط
|
||||
`Verify full validation`.
|
||||
|
||||
للاسترداد المحدود، مرّر `rerun_group` إلى المظلة. `all` هو تشغيل مرشح الإصدار
|
||||
الحقيقي، و`ci` يشغّل ابن CI العادي فقط، و`plugin-prerelease` يشغّل ابن Plugin
|
||||
الخاص بالإصدار فقط، و`release-checks` يشغّل كل صناديق الإصدار، ومجموعات
|
||||
الإصدار الأضيق هي `install-smoke`، و`cross-os`، و`live-e2e`، و`package`،
|
||||
و`qa`، و`qa-parity`، و`qa-live`، و`npm-telegram`. تتطلب عمليات إعادة التشغيل
|
||||
المركزة لـ `npm-telegram` وجود `npm_telegram_package_spec`؛ أما عمليات full/all
|
||||
مع `release_profile=full` فتستخدم تحفة حزمة release-checks.
|
||||
للاسترداد المحدود، مرّر `rerun_group` إلى المظلة. `all` هو تشغيل
|
||||
مرشح الإصدار الحقيقي، و`ci` يشغّل طفل CI العادي فقط، و`plugin-prerelease`
|
||||
يشغّل طفل Plugin الخاص بالإصدار فقط، و`release-checks` يشغّل كل صندوق إصدار،
|
||||
ومجموعات الإصدار الأضيق هي `install-smoke` و`cross-os` و
|
||||
`live-e2e` و`package` و`qa` و`qa-parity` و`qa-live` و`npm-telegram`.
|
||||
تتطلب إعادات تشغيل `npm-telegram` المركّزة `npm_telegram_package_spec`؛ أما عمليات full/all
|
||||
مع `release_profile=full` فتستخدم أثر حزمة release-checks.
|
||||
|
||||
### Vitest
|
||||
|
||||
صندوق Vitest هو سير العمل الابن اليدوي `CI`. يتجاوز CI اليدوي عمدًا تحديد
|
||||
النطاق حسب التغييرات ويفرض رسم الاختبارات العادي لمرشح الإصدار: شظايا Linux
|
||||
Node، وشظايا Plugin المجمعة، وعقود القنوات، وتوافق Node 22، و`check`،
|
||||
و`check-additional`، واختبار build smoke، وفحوصات docs، وPython skills،
|
||||
وWindows، وmacOS، وAndroid، وControl UI i18n.
|
||||
صندوق Vitest هو سير عمل `CI` الطفل اليدوي. يتجاوز CI اليدوي عمدًا
|
||||
نطاق التغييرات ويفرض مخطط الاختبار العادي لمرشح الإصدار: شظايا Linux Node، وشظايا Plugin المضمنة، وعقود القنوات، وتوافق Node 22، و`check`، و`check-additional`، وbuild smoke، وفحوصات المستندات، وPython skills، وWindows، وmacOS، وAndroid، وControl UI i18n.
|
||||
|
||||
استخدم هذا الصندوق للإجابة عن سؤال: "هل اجتازت شجرة المصدر مجموعة الاختبارات
|
||||
العادية الكاملة؟" وهو ليس مثل تحقق المنتج في مسار الإصدار. الأدلة التي يجب
|
||||
الاحتفاظ بها:
|
||||
استخدم هذا الصندوق للإجابة عن "هل اجتازت شجرة المصدر مجموعة الاختبارات العادية الكاملة؟"
|
||||
إنه ليس مماثلًا للتحقق من المنتج عبر مسار الإصدار. الأدلة التي يجب الاحتفاظ بها:
|
||||
|
||||
- ملخص `Full Release Validation` الذي يعرض عنوان URL لتشغيل `CI` المشغّل
|
||||
- تشغيل `CI` ناجح على SHA الهدف الدقيق
|
||||
- تشغيل `CI` أخضر على SHA الهدف الدقيق
|
||||
- أسماء الشظايا الفاشلة أو البطيئة من مهام CI عند التحقيق في الانحدارات
|
||||
- تحف توقيت Vitest مثل `.artifacts/vitest-shard-timings.json` عندما يحتاج
|
||||
التشغيل إلى تحليل أداء
|
||||
- آثار توقيت Vitest مثل `.artifacts/vitest-shard-timings.json` عندما
|
||||
يحتاج التشغيل إلى تحليل أداء
|
||||
|
||||
شغّل CI اليدوي مباشرة فقط عندما يحتاج الإصدار إلى CI عادي حتمي، لكن لا يحتاج
|
||||
إلى صناديق Docker أو QA Lab أو live أو cross-OS أو package:
|
||||
شغّل CI اليدوي مباشرةً فقط عندما يحتاج الإصدار إلى CI عادي حتمي ولكن
|
||||
لا يحتاج إلى صناديق Docker أو QA Lab أو الحية أو عبر أنظمة التشغيل أو الحزم:
|
||||
|
||||
```bash
|
||||
gh workflow run ci.yml --ref main -f target_ref=release/YYYY.M.D
|
||||
@ -399,104 +376,101 @@ gh workflow run ci.yml --ref main -f target_ref=release/YYYY.M.D
|
||||
|
||||
### Docker
|
||||
|
||||
يوجد صندوق Docker داخل `OpenClaw Release Checks` عبر
|
||||
يقع صندوق Docker في `OpenClaw Release Checks` من خلال
|
||||
`openclaw-live-and-e2e-checks-reusable.yml`، بالإضافة إلى سير عمل
|
||||
`install-smoke` في وضع الإصدار. يتحقق من مرشح الإصدار عبر بيئات Docker
|
||||
المحزمة بدلًا من اختبارات مستوى المصدر فقط.
|
||||
`install-smoke` بوضع الإصدار. يتحقق من مرشح الإصدار عبر بيئات Docker
|
||||
المعبأة بدلًا من اختبارات مستوى المصدر فقط.
|
||||
|
||||
تشمل تغطية Docker للإصدار:
|
||||
|
||||
- install smoke كامل مع تمكين اختبار Bun global install smoke البطيء
|
||||
- إعداد/إعادة استخدام صورة smoke لـ Dockerfile الجذر حسب SHA الهدف، مع تشغيل
|
||||
مهام QR، وroot/gateway، وinstaller/Bun smoke كشظايا install-smoke منفصلة
|
||||
- install smoke كامل مع تمكين install smoke العام البطيء لـ Bun
|
||||
- إعداد/إعادة استخدام صورة smoke من Dockerfile الجذري بحسب SHA الهدف، مع تشغيل مهام QR،
|
||||
والجذر/Gateway، وinstaller/Bun smoke كشظايا install-smoke منفصلة
|
||||
- مسارات E2E للمستودع
|
||||
- مقاطع Docker لمسار الإصدار: `core`، و`package-update-openai`،
|
||||
- أجزاء Docker لمسار الإصدار: `core`، و`package-update-openai`،
|
||||
و`package-update-anthropic`، و`package-update-core`، و`plugins-runtime-plugins`،
|
||||
و`plugins-runtime-services`,
|
||||
و`plugins-runtime-services`،
|
||||
و`plugins-runtime-install-a`، و`plugins-runtime-install-b`،
|
||||
و`plugins-runtime-install-c`، و`plugins-runtime-install-d`،
|
||||
و`plugins-runtime-install-e`، و`plugins-runtime-install-f`،
|
||||
و`plugins-runtime-install-g`، و`plugins-runtime-install-h`
|
||||
- تغطية OpenWebUI داخل مقطع `plugins-runtime-services` عند طلبها
|
||||
- مسارات تثبيت/إلغاء تثبيت Plugin المجمعة المقسمة
|
||||
`bundled-plugin-install-uninstall-0` حتى
|
||||
- تغطية OpenWebUI داخل جزء `plugins-runtime-services` عند طلبها
|
||||
- مسارات تثبيت/إزالة تثبيت Plugin المضمنة المقسّمة
|
||||
من `bundled-plugin-install-uninstall-0` حتى
|
||||
`bundled-plugin-install-uninstall-23`
|
||||
- مجموعات provider live/E2E وتغطية نموذج Docker المباشر عندما تتضمن فحوصات
|
||||
الإصدار مجموعات live
|
||||
- مجموعات المزوّدين الحية/E2E وتغطية نماذج Docker الحية عندما تتضمن فحوصات الإصدار
|
||||
مجموعات حية
|
||||
|
||||
استخدم تحف Docker قبل إعادة التشغيل. يرفع مجدول مسار الإصدار
|
||||
استخدم آثار Docker قبل إعادة التشغيل. يرفع مجدول مسار الإصدار
|
||||
`.artifacts/docker-tests/` مع سجلات المسارات، و`summary.json`، و`failures.json`،
|
||||
وتوقيتات المراحل، وJSON لخطة المجدول، وأوامر إعادة التشغيل. للاسترداد
|
||||
المركز، استخدم `docker_lanes=<lane[,lane]>` على سير عمل live/E2E القابل
|
||||
لإعادة الاستخدام بدلًا من إعادة تشغيل كل مقاطع الإصدار. تتضمن أوامر إعادة
|
||||
التشغيل المولدة `package_artifact_run_id` السابق ومدخلات صور Docker المحضرة
|
||||
عند توفرها، بحيث يستطيع المسار الفاشل إعادة استخدام tarball وصور GHCR نفسها.
|
||||
وتوقيتات المراحل، وملف JSON لخطة المجدول، وأوامر إعادة التشغيل. للاسترداد المركّز،
|
||||
استخدم `docker_lanes=<lane[,lane]>` في سير العمل الحي/E2E القابل لإعادة الاستخدام بدلًا من
|
||||
إعادة تشغيل كل أجزاء الإصدار. تتضمن أوامر إعادة التشغيل المولدة
|
||||
`package_artifact_run_id` السابق ومدخلات صورة Docker المحضّرة عند توفرها، حتى يمكن
|
||||
لمسار فاشل إعادة استخدام tarball وصور GHCR نفسها.
|
||||
|
||||
### QA Lab
|
||||
|
||||
صندوق QA Lab جزء من `OpenClaw Release Checks` أيضًا. وهو بوابة الإصدار لسلوك
|
||||
الوكلاء ومستوى القنوات، منفصلًا عن آليات حزم Vitest وDocker.
|
||||
صندوق QA Lab هو أيضًا جزء من `OpenClaw Release Checks`. إنه بوابة الإصدار
|
||||
لسلوك الوكيل وعلى مستوى القناة، منفصل عن Vitest وآليات حزم Docker.
|
||||
|
||||
تشمل تغطية QA Lab للإصدار:
|
||||
|
||||
- مسار تكافؤ وهمي يقارن مسار OpenAI المرشح بخط أساس Opus 4.6 باستخدام حزمة
|
||||
التكافؤ الوكيلية
|
||||
- ملف تعريف Matrix QA المباشر السريع باستخدام بيئة `qa-live-shared`
|
||||
- مسار Telegram QA مباشر باستخدام عقود اعتماد Convex CI
|
||||
- مسار تكافؤ mock يقارن مسار مرشح OpenAI بخط أساس Opus 4.6
|
||||
باستخدام حزمة التكافؤ الوكيلية
|
||||
- ملف تعريف QA سريع وحَي لـ Matrix باستخدام بيئة `qa-live-shared`
|
||||
- مسار QA حي لـ Telegram باستخدام عقود إيجار بيانات اعتماد Convex CI
|
||||
- `pnpm qa:otel:smoke` عندما يحتاج قياس الإصدار عن بُعد إلى إثبات محلي صريح
|
||||
|
||||
استخدم هذا الصندوق للإجابة عن سؤال: "هل يتصرف الإصدار بشكل صحيح في سيناريوهات
|
||||
QA وتدفقات القنوات المباشرة؟" احتفظ بعناوين URL للتحف الخاصة بمسارات التكافؤ
|
||||
وMatrix وTelegram عند اعتماد الإصدار. تظل تغطية Matrix الكاملة متاحة كتشغيل
|
||||
QA-Lab يدوي مقسم إلى شظايا بدلًا من المسار الافتراضي الحرج للإصدار.
|
||||
استخدم هذا الصندوق للإجابة عن "هل يتصرف الإصدار بشكل صحيح في سيناريوهات QA وتدفقات القنوات الحية؟"
|
||||
احتفظ بعناوين URL للآثار الخاصة بمسارات التكافؤ وMatrix وTelegram عند اعتماد الإصدار. تظل تغطية Matrix الكاملة متاحة كتشغيل QA-Lab يدوي مقسّم إلى شظايا بدلًا من المسار الافتراضي الحرج للإصدار.
|
||||
|
||||
### الحزمة
|
||||
|
||||
صندوق الحزمة هو بوابة المنتج القابل للتثبيت. يدعمه `Package Acceptance`
|
||||
والمحلل `scripts/resolve-openclaw-package-candidate.mjs`. يطبع المحلل المرشح
|
||||
إلى tarball `package-under-test` الذي تستهلكه Docker E2E، ويتحقق من مخزون
|
||||
الحزمة، ويسجل إصدار الحزمة وSHA-256، ويبقي مرجع حاضنة سير العمل منفصلًا عن
|
||||
مرجع مصدر الحزمة.
|
||||
صندوق الحزمة هو بوابة المنتج القابل للتثبيت. وهو مدعوم بـ
|
||||
`Package Acceptance` والمحلل
|
||||
`scripts/resolve-openclaw-package-candidate.mjs`. يطبّع المحلل
|
||||
المرشح إلى tarball `package-under-test` الذي تستهلكه Docker E2E، ويتحقق من
|
||||
مخزون الحزمة، ويسجل إصدار الحزمة وSHA-256، ويبقي مرجع حاضنة سير العمل منفصلًا عن مرجع مصدر الحزمة.
|
||||
|
||||
مصادر المرشحين المدعومة:
|
||||
|
||||
- `source=npm`: `openclaw@beta` أو `openclaw@latest` أو إصدار OpenClaw دقيق
|
||||
- `source=ref`: حزم فرع `package_ref` أو وسمًا أو SHA التزام كاملًا موثوقًا
|
||||
باستخدام حاضنة `workflow_ref` المحددة
|
||||
- `source=url`: تنزيل `.tgz` عبر HTTPS مع `package_sha256` مطلوب
|
||||
- `source=npm`: `openclaw@beta` أو `openclaw@latest` أو إصدار OpenClaw دقيق
|
||||
- `source=ref`: حزم فرع `package_ref` موثوق أو وسم أو SHA التزام كامل
|
||||
مع حاضنة `workflow_ref` المحددة
|
||||
- `source=url`: تنزيل `.tgz` عبر HTTPS مع `package_sha256` المطلوب
|
||||
- `source=artifact`: إعادة استخدام `.tgz` مرفوع بواسطة تشغيل GitHub Actions آخر
|
||||
|
||||
يشغّل `OpenClaw Release Checks` Package Acceptance مع `source=artifact`،
|
||||
وتحفة حزمة الإصدار المحضرة، و`suite_profile=custom`،
|
||||
و`docker_lanes=doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update`،
|
||||
و`published_upgrade_survivor_baselines=all-since-2026.4.23`،
|
||||
و`published_upgrade_survivor_scenarios=reported-issues`، و`telegram_mode=mock-openai`.
|
||||
يبقي Package Acceptance الترحيل، والتحديث، وتنظيف تبعيات Plugin القديمة،
|
||||
وتجهيزات Plugin غير المتصلة، وتحديث Plugin، وTelegram package QA ضد tarball
|
||||
المحلول نفسه. تغطي مصفوفة الترقية كل خط أساس npm منشور ومستقر من `2026.4.23`
|
||||
حتى `latest`؛ استخدم Package Acceptance مع `source=npm` لمرشح شُحن بالفعل،
|
||||
أو `source=ref`/`source=artifact` لـ tarball npm محلي مدعوم بـ SHA قبل النشر.
|
||||
إنه البديل الأصلي في GitHub لمعظم تغطية الحزمة/التحديث التي كانت تتطلب
|
||||
Parallels سابقًا. ما زالت فحوصات الإصدار عبر أنظمة التشغيل مهمة للإعداد
|
||||
الأولي الخاص بنظام التشغيل، والمثبت، وسلوك المنصة، لكن تحقق منتج الحزمة/التحديث
|
||||
يجب أن يفضل Package Acceptance.
|
||||
يشغّل `OpenClaw Release Checks` Package Acceptance مع `source=artifact`، وأثر حزمة الإصدار
|
||||
المحضّر، و`suite_profile=custom`،
|
||||
و`docker_lanes=doctor-switch update-channel-switch upgrade-survivor published-upgrade-survivor plugins-offline plugin-update`,
|
||||
و`published_upgrade_survivor_baselines=all-since-2026.4.23`,
|
||||
و`published_upgrade_survivor_scenarios=reported-issues`، و
|
||||
`telegram_mode=mock-openai`. يحافظ Package Acceptance على الترحيل، والتحديث، وتنظيف اعتماديات Plugin القديمة، وتركيبات Plugin غير المتصلة، وتحديث Plugin، وضمان جودة حزمة Telegram
|
||||
مقابل tarball المحلول نفسه. تغطي مصفوفة الترقية كل خط أساس مستقر منشور على npm من `2026.4.23` حتى `latest`؛ استخدم
|
||||
Package Acceptance مع `source=npm` لمرشح تم شحنه بالفعل، أو
|
||||
`source=ref`/`source=artifact` لـ tarball npm محلي مدعوم بـ SHA قبل
|
||||
النشر. وهو البديل الأصلي في GitHub لمعظم تغطية الحزمة/التحديث التي كانت تتطلب
|
||||
Parallels سابقًا. لا تزال فحوصات الإصدار عبر أنظمة التشغيل مهمة للإعداد الأولي الخاص بنظام التشغيل،
|
||||
والمثبت، وسلوك المنصة، لكن يجب أن يفضّل التحقق من المنتج للحزمة/التحديث
|
||||
Package Acceptance.
|
||||
|
||||
قائمة التحقق الأساسية للتحقق من التحديث وPlugin هي
|
||||
[اختبار التحديثات وPlugin](/ar/help/testing-updates-plugins). استخدمها عند تحديد
|
||||
أي مسار محلي أو Docker أو Package Acceptance أو release-check يثبت تثبيت/تحديث
|
||||
Plugin أو تنظيف doctor أو تغيير ترحيل الحزمة المنشورة. الترحيل المنشور
|
||||
الشامل للتحديث من كل حزمة مستقرة `2026.4.23+` هو سير عمل يدوي منفصل
|
||||
`Update Migration`، وليس جزءًا من Full Release CI.
|
||||
قائمة التحقق القياسية للتحقق من التحديث وPlugin هي
|
||||
[اختبار التحديثات وPlugins](/ar/help/testing-updates-plugins). استخدمها عند
|
||||
تحديد أي مسار محلي أو Docker أو Package Acceptance أو release-check يثبت
|
||||
تثبيت/تحديث Plugin، أو تنظيف doctor، أو تغيير ترحيل حزمة منشورة.
|
||||
ترحيل التحديث المنشور الشامل من كل حزمة `2026.4.23+` مستقرة
|
||||
هو سير عمل `Update Migration` يدوي منفصل، وليس جزءًا من Full Release CI.
|
||||
|
||||
تسامح package-acceptance القديم محدود زمنيًا عمدًا. يمكن للحزم حتى `2026.4.25`
|
||||
استخدام مسار التوافق للفجوات الوصفية المنشورة بالفعل إلى npm: إدخالات مخزون
|
||||
QA خاصة مفقودة من tarball، و`gateway install --wrapper` مفقود، وملفات تصحيح
|
||||
مفقودة في تجهيز git المشتق من tarball، و`update.channel` مستمر مفقود، ومواقع
|
||||
سجلات تثبيت Plugin قديمة، واستمرار سجل تثبيت marketplace مفقود، وترحيل بيانات
|
||||
config الوصفية أثناء `plugins update`. قد تحذر حزمة `2026.4.26` المنشورة
|
||||
بالنسبة إلى ملفات ختم بيانات build الوصفية المحلية التي شُحنت بالفعل. يجب
|
||||
أن تستوفي الحزم اللاحقة عقود الحزم الحديثة؛ وتؤدي الفجوات نفسها إلى فشل
|
||||
تحقق الإصدار.
|
||||
تم تحديد مرونة package-acceptance القديمة زمنيًا عمدًا. قد تستخدم الحزم حتى
|
||||
`2026.4.25` مسار التوافق لفجوات البيانات الوصفية المنشورة بالفعل
|
||||
إلى npm: إدخالات مخزون QA الخاصة المفقودة من tarball، و
|
||||
`gateway install --wrapper` المفقود، وملفات التصحيح المفقودة في تركيب git
|
||||
المشتق من tarball، و`update.channel` المستمر المفقود، ومواقع سجل تثبيت Plugin
|
||||
القديمة، واستمرارية سجل تثبيت marketplace المفقودة، وترحيل بيانات تعريف الإعدادات
|
||||
أثناء `plugins update`. قد تحذر حزمة `2026.4.26` المنشورة
|
||||
من ملفات ختم بيانات تعريف البناء المحلية التي تم شحنها بالفعل. يجب أن تفي الحزم اللاحقة
|
||||
بعقود الحزم الحديثة؛ وتفشل الفجوات نفسها في التحقق من الإصدار.
|
||||
|
||||
استخدم ملفات تعريف Package Acceptance الأوسع عندما يكون سؤال الإصدار متعلقًا
|
||||
بحزمة فعلية قابلة للتثبيت:
|
||||
@ -513,35 +487,32 @@ gh workflow run package-acceptance.yml \
|
||||
|
||||
ملفات تعريف الحزمة الشائعة:
|
||||
|
||||
- `smoke`: مسارات تثبيت الحزمة/القناة/الوكيل السريعة، وشبكة Gateway، وإعادة
|
||||
تحميل config
|
||||
- `package`: عقود حزمة التثبيت/التحديث/Plugin من دون ClawHub مباشر؛ هذا هو
|
||||
الافتراضي في release-check
|
||||
- `product`: `package` بالإضافة إلى قنوات MCP، وتنظيف cron/subagent، وبحث
|
||||
الويب OpenAI، وOpenWebUI
|
||||
- `full`: مقاطع Docker لمسار الإصدار مع OpenWebUI
|
||||
- `custom`: قائمة `docker_lanes` الدقيقة لإعادة التشغيل المركزة
|
||||
- `smoke`: مسارات سريعة لتثبيت الحزمة/القناة/الوكيل، وشبكة Gateway، وإعادة تحميل الإعدادات
|
||||
- `package`: عقود حزمة التثبيت/التحديث/Plugin من دون ClawHub حي؛ هذا هو الإعداد الافتراضي لـ release-check
|
||||
- `product`: `package` بالإضافة إلى قنوات MCP، وتنظيف cron/subagent، وبحث الويب في OpenAI، وOpenWebUI
|
||||
- `full`: أجزاء Docker لمسار الإصدار مع OpenWebUI
|
||||
- `custom`: قائمة `docker_lanes` دقيقة لإعادات التشغيل المركّزة
|
||||
|
||||
لإثبات Telegram لحزمة مرشحة، فعّل `telegram_mode=mock-openai` أو
|
||||
`telegram_mode=live-frontier` في قبول الحزمة. يمرر سير العمل ملف tarball
|
||||
المحلول `package-under-test` إلى مسار Telegram؛ ولا يزال سير عمل Telegram
|
||||
المستقل يقبل مواصفة npm منشورة لفحوصات ما بعد النشر.
|
||||
لإثبات مرشح حزمة Telegram، فعّل `telegram_mode=mock-openai` أو
|
||||
`telegram_mode=live-frontier` في Package Acceptance. يمرر سير العمل حزمة
|
||||
`package-under-test` tarball التي تم حلها إلى مسار Telegram؛ ولا يزال سير عمل
|
||||
Telegram المستقل يقبل مواصفة npm منشورة لفحوصات ما بعد النشر.
|
||||
|
||||
## أتمتة نشر الإصدار
|
||||
## أتمتة نشر الإصدارات
|
||||
|
||||
`OpenClaw Release Publish` هو نقطة دخول النشر المعدِّلة الاعتيادية. ينسق
|
||||
`OpenClaw Release Publish` هو نقطة الدخول العادية للنشر المعدِّل. وهو ينسق
|
||||
سير عمل الناشر الموثوق بالترتيب الذي يحتاجه الإصدار:
|
||||
|
||||
1. سحب وسم الإصدار وحل SHA الالتزام الخاص به.
|
||||
2. التحقق من أن الوسم قابل للوصول من `main` أو `release/*`.
|
||||
3. تشغيل `pnpm plugins:sync:check`.
|
||||
4. إرسال `Plugin NPM Release` مع `publish_scope=all-publishable` و
|
||||
1. اسحب وسم الإصدار وحدد SHA الالتزام الخاص به.
|
||||
2. تحقق من أن الوسم يمكن الوصول إليه من `main` أو `release/*`.
|
||||
3. شغّل `pnpm plugins:sync:check`.
|
||||
4. أرسل `Plugin NPM Release` مع `publish_scope=all-publishable` و
|
||||
`ref=<release-sha>`.
|
||||
5. إرسال `Plugin ClawHub Release` بالنطاق نفسه وSHA نفسه.
|
||||
6. إرسال `OpenClaw NPM Release` مع وسم الإصدار ووسم dist-tag الخاص بـ npm و
|
||||
5. أرسل `Plugin ClawHub Release` بالنطاق وSHA نفسيهما.
|
||||
6. أرسل `OpenClaw NPM Release` مع وسم الإصدار، ووسم توزيع npm، و
|
||||
`preflight_run_id` المحفوظ.
|
||||
|
||||
مثال نشر بيتا:
|
||||
مثال نشر Beta:
|
||||
|
||||
```bash
|
||||
gh workflow run openclaw-release-publish.yml \
|
||||
@ -551,17 +522,7 @@ gh workflow run openclaw-release-publish.yml \
|
||||
-f npm_dist_tag=beta
|
||||
```
|
||||
|
||||
مثال نشر ألفا:
|
||||
|
||||
```bash
|
||||
gh workflow run openclaw-release-publish.yml \
|
||||
--ref release/YYYY.M.D \
|
||||
-f tag=vYYYY.M.D-alpha.N \
|
||||
-f preflight_run_id=<successful-openclaw-npm-preflight-run-id> \
|
||||
-f npm_dist_tag=alpha
|
||||
```
|
||||
|
||||
نشر مستقر إلى وسم dist-tag الافتراضي beta:
|
||||
نشر Stable إلى وسم توزيع beta الافتراضي:
|
||||
|
||||
```bash
|
||||
gh workflow run openclaw-release-publish.yml \
|
||||
@ -571,7 +532,7 @@ gh workflow run openclaw-release-publish.yml \
|
||||
-f npm_dist_tag=beta
|
||||
```
|
||||
|
||||
تكون الترقية المستقرة مباشرة إلى `latest` صريحة:
|
||||
الترقية Stable مباشرة إلى `latest` صريحة:
|
||||
|
||||
```bash
|
||||
gh workflow run openclaw-release-publish.yml \
|
||||
@ -581,90 +542,90 @@ gh workflow run openclaw-release-publish.yml \
|
||||
-f npm_dist_tag=latest
|
||||
```
|
||||
|
||||
استخدم سيري العمل الأدنى مستوى `Plugin NPM Release` و`Plugin ClawHub Release`
|
||||
استخدم سيري العمل الأقل مستوى `Plugin NPM Release` و`Plugin ClawHub Release`
|
||||
فقط لأعمال الإصلاح أو إعادة النشر المركزة. لإصلاح Plugin محدد، مرر
|
||||
`plugin_publish_scope=selected` و`plugins=@openclaw/name` إلى
|
||||
`OpenClaw Release Publish`، أو أرسل سير العمل الفرعي مباشرة عندما يجب عدم نشر
|
||||
حزمة OpenClaw.
|
||||
`OpenClaw Release Publish`، أو أرسل سير العمل الفرعي مباشرة عندما يجب عدم
|
||||
نشر حزمة OpenClaw.
|
||||
|
||||
## مدخلات سير عمل NPM
|
||||
|
||||
يقبل `OpenClaw NPM Release` هذه المدخلات التي يتحكم بها المشغل:
|
||||
|
||||
- `tag`: وسم الإصدار المطلوب مثل `v2026.4.2` أو `v2026.4.2-1` أو
|
||||
`v2026.4.2-alpha.1` أو `v2026.4.2-beta.1`؛ عندما تكون `preflight_only=true`، يمكن أن يكون أيضًا SHA الالتزام الكامل الحالي ذي 40 حرفًا لفرع سير العمل من أجل اختبار تمهيدي للتحقق فقط
|
||||
- `tag`: وسم إصدار مطلوب مثل `v2026.4.2` أو `v2026.4.2-1` أو
|
||||
`v2026.4.2-beta.1`؛ وعندما تكون `preflight_only=true`، يمكن أن يكون أيضًا
|
||||
SHA الالتزام الكامل الحالي المكوّن من 40 حرفًا لفرع سير العمل، وذلك لفحص
|
||||
ما قبل النشر المخصص للتحقق فقط
|
||||
- `preflight_only`: `true` للتحقق/البناء/الحزمة فقط، و`false` لمسار النشر
|
||||
الفعلي
|
||||
- `preflight_run_id`: مطلوب في مسار النشر الفعلي حتى يعيد سير العمل استخدام
|
||||
ملف tarball المجهز من تشغيل الاختبار التمهيدي الناجح
|
||||
- `npm_dist_tag`: وسم npm الهدف لمسار النشر؛ القيمة الافتراضية `beta`
|
||||
الحقيقي
|
||||
- `preflight_run_id`: مطلوب في مسار النشر الحقيقي لكي يعيد سير العمل استخدام
|
||||
حزمة tarball المحضّرة من تشغيل ما قبل النشر الناجح
|
||||
- `npm_dist_tag`: وسم npm الهدف لمسار النشر؛ افتراضيًا `beta`
|
||||
|
||||
يقبل `OpenClaw Release Publish` هذه المدخلات التي يتحكم بها المشغل:
|
||||
|
||||
- `tag`: وسم الإصدار المطلوب؛ يجب أن يكون موجودًا مسبقًا
|
||||
- `preflight_run_id`: معرّف تشغيل الاختبار التمهيدي الناجح لـ `OpenClaw NPM Release`؛
|
||||
- `tag`: وسم إصدار مطلوب؛ يجب أن يكون موجودًا مسبقًا
|
||||
- `preflight_run_id`: معرّف تشغيل ما قبل النشر الناجح لـ`OpenClaw NPM Release`؛
|
||||
مطلوب عندما تكون `publish_openclaw_npm=true`
|
||||
- `npm_dist_tag`: وسم npm الهدف لحزمة OpenClaw
|
||||
- `plugin_publish_scope`: القيمة الافتراضية `all-publishable`؛ استخدم `selected` فقط
|
||||
- `plugin_publish_scope`: افتراضيًا `all-publishable`؛ استخدم `selected` فقط
|
||||
لأعمال الإصلاح المركزة
|
||||
- `plugins`: أسماء حزم `@openclaw/*` مفصولة بفواصل عندما تكون
|
||||
`plugin_publish_scope=selected`
|
||||
- `publish_openclaw_npm`: القيمة الافتراضية `true`؛ اضبطها على `false` فقط عند استخدام
|
||||
سير العمل كمنسق إصلاح للـ Plugin فقط
|
||||
- `publish_openclaw_npm`: افتراضيًا `true`؛ اضبطها على `false` فقط عند استخدام
|
||||
سير العمل كمنسق إصلاح خاص بالـPlugin فقط
|
||||
|
||||
يقبل `OpenClaw Release Checks` هذه المدخلات التي يتحكم بها المشغل:
|
||||
|
||||
- `ref`: فرع أو وسم أو SHA التزام كامل للتحقق منه. تتطلب الفحوصات الحاملة للأسرار
|
||||
أن يكون الالتزام المحلول قابلًا للوصول من فرع OpenClaw أو وسم إصدار.
|
||||
- `ref`: فرع أو وسم أو SHA الالتزام الكامل المراد التحقق منه. تتطلب الفحوصات
|
||||
التي تحمل أسرارًا أن يكون الالتزام المحلول قابلًا للوصول من فرع OpenClaw
|
||||
أو وسم إصدار.
|
||||
|
||||
القواعد:
|
||||
|
||||
- يمكن للوسوم المستقرة ووسوم التصحيح النشر إلى `beta` أو `latest`
|
||||
- يمكن لوسوم الإصدار التمهيدي ألفا النشر إلى `alpha` فقط
|
||||
- يمكن لوسوم الإصدار التمهيدي بيتا النشر إلى `beta` فقط
|
||||
- بالنسبة إلى `OpenClaw NPM Release`، يُسمح بإدخال SHA الالتزام الكامل فقط عندما تكون
|
||||
`preflight_only=true`
|
||||
- يكون `OpenClaw Release Checks` و`Full Release Validation` دائمًا
|
||||
للتحقق فقط
|
||||
- يجب أن يستخدم مسار النشر الفعلي `npm_dist_tag` نفسه المستخدم أثناء الاختبار التمهيدي؛
|
||||
يتحقق سير العمل من تلك البيانات الوصفية قبل متابعة النشر
|
||||
- يمكن لوسوم Stable والتصحيح النشر إلى `beta` أو `latest`
|
||||
- يمكن لوسوم ما قبل إصدار Beta النشر إلى `beta` فقط
|
||||
- بالنسبة إلى `OpenClaw NPM Release`، يُسمح بإدخال SHA الالتزام الكامل فقط
|
||||
عندما تكون `preflight_only=true`
|
||||
- `OpenClaw Release Checks` و`Full Release Validation` مخصصان دائمًا للتحقق فقط
|
||||
- يجب أن يستخدم مسار النشر الحقيقي `npm_dist_tag` نفسه المستخدم أثناء ما قبل
|
||||
النشر؛ ويتحقق سير العمل من هذه البيانات الوصفية قبل متابعة النشر
|
||||
|
||||
## تسلسل إصدار npm مستقر
|
||||
## تسلسل إصدار npm Stable
|
||||
|
||||
عند إصدار npm مستقر:
|
||||
عند إصدار npm Stable:
|
||||
|
||||
1. شغّل `OpenClaw NPM Release` مع `preflight_only=true`
|
||||
- قبل وجود وسم، يمكنك استخدام SHA الالتزام الكامل الحالي لفرع سير العمل
|
||||
كتشغيل تجريبي للتحقق فقط لسير عمل الاختبار التمهيدي
|
||||
2. اختر `npm_dist_tag=beta` للتدفق الاعتيادي الذي يبدأ ببيتا، أو `latest` فقط
|
||||
عندما تريد عمدًا نشرًا مستقرًا مباشرًا
|
||||
3. شغّل `Full Release Validation` على فرع الإصدار أو وسم الإصدار أو SHA الالتزام الكامل
|
||||
عندما تريد CI الاعتيادي مع ذاكرة التخزين المؤقت الحية للمطالبات، وDocker، ومختبر ضمان الجودة،
|
||||
والمصفوفة، وتغطية Telegram من سير عمل يدوي واحد
|
||||
4. إذا كنت تحتاج عمدًا إلى رسم الاختبار الاعتيادي الحتمي فقط، فشغّل
|
||||
سير عمل `CI` اليدوي على مرجع الإصدار بدلًا من ذلك
|
||||
لتشغيل تجريبي بلا نشر لسير عمل ما قبل النشر مخصص للتحقق فقط
|
||||
2. اختر `npm_dist_tag=beta` للتدفق العادي الذي يبدأ بـbeta، أو `latest` فقط
|
||||
عندما تريد عمدًا نشر Stable مباشرًا
|
||||
3. شغّل `Full Release Validation` على فرع الإصدار أو وسم الإصدار أو SHA الالتزام
|
||||
الكامل عندما تريد CI العادي بالإضافة إلى تغطية ذاكرة التخزين المؤقت
|
||||
للمطالبات الحية، وDocker، وQA Lab، وMatrix، وTelegram من سير عمل يدوي واحد
|
||||
4. إذا كنت تحتاج عمدًا إلى مخطط الاختبارات العادي الحتمي فقط، فشغّل سير عمل
|
||||
`CI` اليدوي على مرجع الإصدار بدلًا من ذلك
|
||||
5. احفظ `preflight_run_id` الناجح
|
||||
6. شغّل `OpenClaw Release Publish` مع `tag` نفسه و`npm_dist_tag` نفسه
|
||||
و`preflight_run_id` المحفوظ؛ ينشر Plugins الخارجية إلى npm
|
||||
وClawHub قبل ترقية حزمة npm الخاصة بـ OpenClaw
|
||||
6. شغّل `OpenClaw Release Publish` مع `tag` نفسه، و`npm_dist_tag` نفسه،
|
||||
و`preflight_run_id` المحفوظ؛ فهو ينشر Plugins الخارجية إلى npm وClawHub
|
||||
قبل ترقية حزمة OpenClaw npm
|
||||
7. إذا وصل الإصدار إلى `beta`، فاستخدم سير العمل الخاص
|
||||
`openclaw/releases-private/.github/workflows/openclaw-npm-dist-tags.yml`
|
||||
لترقية ذلك الإصدار المستقر من `beta` إلى `latest`
|
||||
8. إذا نُشر الإصدار عمدًا مباشرة إلى `latest` ويجب أن يتبع `beta`
|
||||
البناء المستقر نفسه فورًا، فاستخدم سير العمل الخاص نفسه
|
||||
لتوجيه وسمي dist-tag كليهما إلى الإصدار المستقر، أو دع مزامنة الإصلاح الذاتي المجدولة
|
||||
تنقل `beta` لاحقًا
|
||||
لترقية إصدار Stable هذا من `beta` إلى `latest`
|
||||
8. إذا نُشر الإصدار عمدًا مباشرة إلى `latest` وكان يجب أن يتبع `beta` بنية
|
||||
Stable نفسها فورًا، فاستخدم سير العمل الخاص نفسه لتوجيه وسمي التوزيع إلى
|
||||
إصدار Stable، أو اترك مزامنة الإصلاح الذاتي المجدولة تنقل `beta` لاحقًا
|
||||
|
||||
يوجد تعديل dist-tag في المستودع الخاص لأسباب أمنية لأنه لا يزال
|
||||
يتطلب `NPM_TOKEN`، بينما يحافظ المستودع العام على نشر يعتمد على OIDC فقط.
|
||||
توجد عملية تعديل وسم التوزيع في المستودع الخاص لأسباب أمنية لأنها لا تزال
|
||||
تتطلب `NPM_TOKEN`، بينما يحتفظ المستودع العام بنشر يعتمد على OIDC فقط.
|
||||
|
||||
يبقي ذلك مسار النشر المباشر ومسار الترقية الذي يبدأ ببيتا موثقين
|
||||
ومرئيين للمشغلين.
|
||||
وهذا يُبقي مساري النشر المباشر والترقية التي تبدأ بـbeta موثقين ومرئيين
|
||||
للمشغلين.
|
||||
|
||||
إذا اضطر أحد المشرفين إلى الرجوع إلى مصادقة npm المحلية، فشغّل أي أوامر
|
||||
CLI الخاصة بـ 1Password (`op`) داخل جلسة tmux مخصصة فقط. لا تستدعِ `op`
|
||||
مباشرة من صدفة الوكيل الرئيسية؛ فإبقاؤه داخل tmux يجعل المطالبات
|
||||
والتنبيهات ومعالجة OTP قابلة للملاحظة ويمنع تنبيهات المضيف المتكررة.
|
||||
1Password CLI (`op`) داخل جلسة tmux مخصصة فقط. لا تستدعِ `op` مباشرة من صدفة
|
||||
الوكيل الرئيسية؛ فإبقاؤه داخل tmux يجعل المطالبات والتنبيهات ومعالجة OTP قابلة
|
||||
للملاحظة ويمنع تنبيهات المضيف المتكررة.
|
||||
|
||||
## المراجع العامة
|
||||
|
||||
|
||||
@ -1,152 +1,153 @@
|
||||
---
|
||||
read_when:
|
||||
- تريد إدارة Gateway من متصفح
|
||||
- تريد الوصول إلى Tailnet من دون أنفاق SSH
|
||||
- تريد تشغيل Gateway من متصفح
|
||||
- تريد الوصول إلى Tailnet دون أنفاق SSH
|
||||
sidebarTitle: Control UI
|
||||
summary: واجهة تحكم قائمة على المتصفح لـ Gateway (الدردشة، العُقد، التهيئة)
|
||||
summary: واجهة تحكم مستندة إلى المتصفح لـ Gateway (الدردشة، العُقد، التكوين)
|
||||
title: واجهة التحكم
|
||||
x-i18n:
|
||||
generated_at: "2026-05-02T21:05:34Z"
|
||||
generated_at: "2026-05-02T23:39:10Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: 88959ccf435b31015039bf28c3043023d99f0b953a1489986ab2d0cbd261771c
|
||||
source_hash: 50bef807915f27406e19f1c6ca7d839a610d79ba79da85d7a78523400cbf9208
|
||||
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** على المنفذ نفسه.
|
||||
|
||||
## فتح سريع (محلي)
|
||||
|
||||
إذا كان الـ Gateway يعمل على الكمبيوتر نفسه، فافتح:
|
||||
إذا كان Gateway يعمل على الكمبيوتر نفسه، فافتح:
|
||||
|
||||
- [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 عبر:
|
||||
|
||||
- `connect.params.auth.token`
|
||||
- `connect.params.auth.password`
|
||||
- ترويسات هوية Tailscale Serve عندما تكون `gateway.auth.allowTailscale: true`
|
||||
- ترويسات هوية الوكيل الموثوق عندما تكون `gateway.auth.mode: "trusted-proxy"`
|
||||
- ترويسات هوية الوكيل الموثوق عندما يكون `gateway.auth.mode: "trusted-proxy"`
|
||||
|
||||
تحتفظ لوحة إعدادات لوحة المعلومات برمز مميز لجلسة تبويب المتصفح الحالية وعنوان gateway المحدد؛ ولا تُحفَظ كلمات المرور. عادةً ما ينشئ الإعداد الأولي رمز gateway للمصادقة عبر السر المشترك عند أول اتصال، لكن مصادقة كلمة المرور تعمل أيضاً عندما تكون `gateway.auth.mode` هي `"password"`.
|
||||
تحتفظ لوحة إعدادات لوحة المعلومات برمز مميز لجلسة تبويب المتصفح الحالية وعنوان URL المحدد لـ Gateway؛ ولا تُحفظ كلمات المرور. ينشئ الإعداد الأولي عادةً رمز Gateway للمصادقة بالسر المشترك عند أول اتصال، لكن مصادقة كلمة المرور تعمل أيضًا عندما يكون `gateway.auth.mode` هو `"password"`.
|
||||
|
||||
## إقران الجهاز (الاتصال الأول)
|
||||
|
||||
عند الاتصال بواجهة التحكم من متصفح أو جهاز جديد، يتطلب الـ Gateway عادةً **موافقة إقران لمرة واحدة**. هذا إجراء أمني لمنع الوصول غير المصرح به.
|
||||
عند الاتصال بواجهة التحكم من متصفح أو جهاز جديد، يتطلب Gateway عادةً **موافقة إقران لمرة واحدة**. هذا إجراء أمني لمنع الوصول غير المصرح به.
|
||||
|
||||
**ما ستراه:** "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، ويقدم المتصفح هوية جهازه.
|
||||
- لا تزال ارتباطات Tailnet المباشرة، واتصالات متصفح LAN، وملفات تعريف المتصفح التي لا تحتوي على هوية جهاز تتطلب موافقة صريحة.
|
||||
- ينشئ كل ملف تعريف متصفح معرّف جهاز فريداً، لذا سيتطلب تبديل المتصفحات أو مسح بيانات المتصفح إعادة الإقران.
|
||||
- تتم الموافقة تلقائيًا على اتصالات متصفح 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` المشترك متاحًا للعملاء غير التابعين لواجهة المستخدم الذين يكتبون الحقل مباشرةً (مثل بوابات Gateway النصية أو لوحات المعلومات المخصصة).
|
||||
|
||||
## نقطة نهاية إعدادات وقت التشغيل
|
||||
|
||||
تجلب واجهة التحكم إعدادات وقت التشغيل الخاصة بها من `/__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/themes)، واختر سمة أو أنشئها، وانقر **مشاركة**، ثم الصق رابط السمة المنسوخ في المظهر. يقبل المستورد أيضاً عناوين 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/themes)، واختر سمة أو أنشئها، وانقر **مشاركة**، ثم الصق رابط السمة المنسوخ في المظهر. يقبل المستورد أيضًا عناوين 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 الميكروفون عبر RPCs `talk.realtime.relay*` ويرسل استدعاءات أداة `openclaw_agent_consult` مرة أخرى عبر `chat.send` للنموذج الأكبر المكوّن في OpenClaw.
|
||||
- بث استدعاءات الأدوات + بطاقات مخرجات الأدوات الحية في الدردشة (أحداث الوكيل).
|
||||
- دردش مع النموذج عبر Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`).
|
||||
- أمْلِ في مؤلف الدردشة باستخدام STT من جانب الخادم (`chat.transcribeAudio`). يسجل المتصفح مقطع ميكروفون قصيرًا ويرسله إلى Gateway، الذي يشغّل مسار نسخ `tools.media.audio` المضبوط ويعيد نصًا مسودة دون كشف بيانات اعتماد المزود للمتصفح.
|
||||
- تحدث عبر جلسات المتصفح في الوقت الفعلي. يستخدم OpenAI WebRTC مباشرًا، ويستخدم Google Live رمز متصفح مقيدًا لمرة واحدة عبر WebSocket، وتستخدم Plugins الصوت في الوقت الفعلي الخلفية فقط نقل ترحيل Gateway. يُبقي الترحيل بيانات اعتماد المزود على Gateway بينما يبث المتصفح PCM الميكروفون عبر RPCs `talk.realtime.relay*` ويرسل استدعاءات أداة `openclaw_agent_consult` مرة أخرى عبر `chat.send` إلى نموذج OpenClaw الأكبر المضبوط.
|
||||
- بث استدعاءات الأدوات + بطاقات إخراج الأدوات الحية في الدردشة (أحداث الوكيل).
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="القنوات والمثيلات والجلسات والأحلام">
|
||||
- القنوات: حالة قنوات Plugins المدمجة والمرفقة/الخارجية، وتسجيل الدخول عبر QR، وإعدادات كل قناة (`channels.status`, `web.login.*`, `config.patch`).
|
||||
<Accordion title="القنوات، والمثيلات، والجلسات، والأحلام">
|
||||
- القنوات: حالة القنوات المدمجة إضافةً إلى قنوات Plugin المجمعة/الخارجية، وتسجيل الدخول بـ QR، وإعدادات كل قناة (`channels.status`, `web.login.*`, `config.patch`).
|
||||
- المثيلات: قائمة الحضور + التحديث (`system-presence`).
|
||||
- الجلسات: القائمة + تجاوزات النموذج/التفكير/السريع/المطوّل/التتبّع/الاستدلال لكل جلسة (`sessions.list`, `sessions.patch`).
|
||||
- الجلسات: قائمة + تجاوزات النموذج/التفكير/السريع/المفصل/التتبع/الاستدلال لكل جلسة (`sessions.list`, `sessions.patch`).
|
||||
- الأحلام: حالة Dreaming، ومفتاح التمكين/التعطيل، وقارئ يوميات الأحلام (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Cron وSkills وNodes وموافقات التنفيذ">
|
||||
<Accordion title="Cron، وSkills، وNodes، وموافقات exec">
|
||||
- مهام Cron: قائمة/إضافة/تحرير/تشغيل/تمكين/تعطيل + سجل التشغيل (`cron.*`).
|
||||
- Skills: الحالة، التمكين/التعطيل، التثبيت، تحديثات مفتاح API (`skills.*`).
|
||||
- Nodes: قائمة + القدرات (`node.list`).
|
||||
- موافقات التنفيذ: تحرير قوائم السماح للـ gateway أو node + سياسة السؤال لـ `exec host=gateway/node` (`exec.approvals.*`).
|
||||
- موافقات exec: تحرير قوائم السماح لـ Gateway أو Node + سياسة السؤال لـ `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 + القناة عند توفرها)؛ يتوفر محرر Raw JSON فقط عندما تحتوي اللقطة على رحلة ذهاب وإياب خام آمنة.
|
||||
- إذا تعذر على لقطة أن تجري رحلة ذهاب وإياب آمنة للنص الخام، تفرض واجهة التحكم وضع النموذج وتعطّل وضع Raw لتلك اللقطة.
|
||||
- يحافظ محرر Raw JSON "إعادة الضبط إلى المحفوظ" على الشكل المؤلف خاماً (التنسيق، التعليقات، تخطيط `$include`) بدلاً من إعادة عرض لقطة مسطحة، حتى تنجو التعديلات الخارجية من إعادة الضبط عندما تستطيع اللقطة إجراء رحلة ذهاب وإياب آمنة.
|
||||
- تُعرض قيم كائن SecretRef المهيكلة للقراءة فقط في حقول نص النموذج لمنع تلف عرضي من كائن إلى سلسلة نصية.
|
||||
- تطبيق + إعادة تشغيل مع التحقق (`config.apply`) وإيقاظ آخر جلسة نشطة.
|
||||
- تتضمن عمليات الكتابة حارس تجزئة أساسيًا لمنع الكتابة فوق التحريرات المتزامنة.
|
||||
- عمليات الكتابة (`config.set`/`config.apply`/`config.patch`) تجري فحصًا تمهيديًا لحل SecretRef النشط للمراجع في حمولة الإعدادات المقدمة؛ وتُرفض المراجع النشطة المقدمة غير المحلولة قبل الكتابة.
|
||||
- مخطط + عرض نموذج (`config.schema` / `config.schema.lookup`، بما في ذلك `title` / `description` للحقل، وتلميحات واجهة المستخدم المطابقة، وملخصات الأبناء المباشرة، وبيانات تعريف المستندات على عقد الكائن/حرف البدل/المصفوفة/التركيب المتداخلة، إضافةً إلى مخططات Plugin + القنوات عند توفرها)؛ محرر JSON الخام متاح فقط عندما تحتوي اللقطة على رحلة ذهاب وإياب خام آمنة.
|
||||
- إذا تعذر على لقطة الدوران ذهابًا وإيابًا بأمان كنص خام، تُجبر واجهة التحكم وضع النموذج وتعطل الوضع الخام لتلك اللقطة.
|
||||
- يحافظ محرر 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`).
|
||||
- السجلات: تتبع مباشر لسجلات ملفات Gateway مع التصفية/التصدير (`logs.tail`).
|
||||
- التحديث: تشغيل تحديث حزمة/git + إعادة تشغيل (`update.run`) مع تقرير إعادة تشغيل، ثم استطلاع `update.status` بعد إعادة الاتصال للتحقق من إصدار Gateway قيد التشغيل.
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="ملاحظات لوحة مهام Cron">
|
||||
- بالنسبة إلى المهام المعزولة، يكون التسليم افتراضياً إعلان الملخص. يمكنك التبديل إلى لا شيء إذا أردت تشغيلات داخلية فقط.
|
||||
- للمهام المعزولة، يكون التسليم افتراضيًا إلى إعلان ملخص. يمكنك التبديل إلى لا شيء إذا أردت تشغيلات داخلية فقط.
|
||||
- تظهر حقول القناة/الهدف عند تحديد الإعلان.
|
||||
- يستخدم وضع Webhook القيمة `delivery.mode = "webhook"` مع ضبط `delivery.to` على عنوان HTTP(S) webhook صالح.
|
||||
- بالنسبة إلى مهام الجلسة الرئيسية، تتوفر أوضاع تسليم Webhook ولا شيء.
|
||||
- تتضمن عناصر تحكم التحرير المتقدمة الحذف بعد التشغيل، ومسح تجاوز الوكيل، وخيارات cron الدقيقة/المتدرجة، وتجاوزات نموذج/تفكير الوكيل، ومفاتيح تبديل التسليم بأفضل جهد.
|
||||
- يكون التحقق من النموذج مضمناً مع أخطاء على مستوى الحقول؛ وتعطّل القيم غير الصالحة زر الحفظ حتى تُصلح.
|
||||
- عيّن `cron.webhookToken` لإرسال رمز bearer مخصص، وإذا حُذف فسيُرسل الـ webhook بدون ترويسة مصادقة.
|
||||
- احتياط متقادم: لا تزال المهام القديمة المخزنة التي تحتوي على `notify: true` تستطيع استخدام `cron.webhook` حتى تُرحّل.
|
||||
- يستخدم وضع Webhook `delivery.mode = "webhook"` مع تعيين `delivery.to` إلى عنوان URL صالح لـ Webhook بنمط HTTP(S).
|
||||
- لمهام الجلسة الرئيسية، تتوفر أوضاع تسليم Webhook ولا شيء.
|
||||
- تتضمن عناصر التحكم المتقدمة للتحرير الحذف بعد التشغيل، ومسح تجاوز الوكيل، وخيارات Cron الدقيقة/المتدرجة، وتجاوزات نموذج/تفكير الوكيل، ومفاتيح تسليم بأفضل جهد.
|
||||
- التحقق من النموذج مضمّن مع أخطاء على مستوى الحقول؛ وتعطّل القيم غير الصالحة زر الحفظ حتى تُصلح.
|
||||
- عيّن `cron.webhookToken` لإرسال رمز حامل مخصص، وإذا حُذف فسيُرسل Webhook دون ترويسة مصادقة.
|
||||
- احتياطي مهمل: لا تزال المهام القديمة المخزنة التي تحتوي على `notify: true` قادرة على استخدام `cron.webhook` حتى تُرحّل.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
@ -155,61 +156,62 @@ 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.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`.
|
||||
- `chat.transcribeAudio` هو مساعد إملاء لمرة واحدة لمسودات Chat. يقبل صوتا بصيغة base64 مسجلا من المتصفح، ويبقي الرفع دون حد إطار WebSocket الخاص بـ Gateway، ويكتب ملفا محليا مؤقتا، ويشغل نسخ الصوت بفهم الوسائط باستخدام إعداد Gateway النشط، ويعيد `{ text, provider, model }`، ثم يزيل الملف المؤقت. لا ينشئ تشغيل وكيل، وهو منفصل عن Talk في الوقت الفعلي.
|
||||
- تقبل عمليات رفع Chat الصور والملفات غير الفيديوية. تحتفظ الصور بمسار الصورة الأصلي؛ أما الملفات الأخرى فتخزن كوسائط مدارة وتعرض في السجل كروابط مرفقات.
|
||||
- تؤدي إعادة الإرسال باستخدام `idempotencyKey` نفسه إلى إرجاع `{ status: "in_flight" }` أثناء التشغيل، و`{ status: "ok" }` بعد الاكتمال.
|
||||
- استجابات `chat.history` محدودة الحجم حفاظا على أمان UI. عندما تكون إدخالات النص كبيرة جدا، قد يقتطع 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.inject` ملاحظة مساعد إلى نص الجلسة ويبث حدث `chat` لتحديثات UI فقط (لا تشغيل وكيل، ولا تسليم قناة).
|
||||
- تقوم منتقيات النموذج والتفكير في ترويسة الدردشة بتصحيح الجلسة النشطة فورا عبر `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`؛ ولا يزال من الممكن إعادة استخدام إعداد مزود الزمن الحقيقي Voice Call كاحتياطي. لا يتلقى المتصفح أبدا مفتاح API قياسيا للمزود. يتلقى OpenAI سرا مؤقتا لعميل Realtime من أجل WebRTC. يتلقى Google Live رمز مصادقة Live API مقيدا صالحا لاستخدام واحد لجلسة WebSocket في المتصفح، مع تعليمات وتصريحات أدوات مقفلة داخل الرمز بواسطة Gateway. المزودون الذين لا يعرضون إلا جسرا خلفيا للزمن الحقيقي يعملون عبر نقل ترحيل Gateway، بحيث تبقى بيانات الاعتماد ومآخذ المورد على جانب الخادم بينما ينتقل صوت المتصفح عبر RPCs مصادق عليها في Gateway. تجمع مطالبة جلسة Realtime بواسطة Gateway؛ ولا يقبل `talk.realtime.session` تجاوزات تعليمات مقدمة من المستدعي.
|
||||
<Accordion title="وضع Talk (الوقت الفعلي في المتصفح)">
|
||||
يستخدم وضع Talk مزود صوت وقت فعلي مسجلا. هيئ OpenAI باستخدام `talk.provider: "openai"` مع `talk.providers.openai.apiKey`، أو هيئ Google باستخدام `talk.provider: "google"` مع `talk.providers.google.apiKey`؛ ولا يزال بالإمكان إعادة استخدام إعداد مزود الوقت الفعلي لـ Voice Call كخيار احتياطي. لا يتلقى المتصفح أبدا مفتاح API قياسيا للمزود. يتلقى OpenAI سر عميل Realtime مؤقتا لـ WebRTC. يتلقى Google Live رمز مصادقة Live API مقيدا صالحا لمرة واحدة لجلسة WebSocket في المتصفح، مع تثبيت التعليمات وتصريحات الأدوات داخل الرمز بواسطة Gateway. المزودون الذين لا يكشفون إلا جسرا خلفيا للوقت الفعلي يعملون عبر نقل ترحيل Gateway، لذلك تبقى بيانات الاعتماد ومآخذ البائع على جانب الخادم بينما ينتقل صوت المتصفح عبر RPCs مصادق عليها في Gateway. يجمع Gateway مطالبة جلسة Realtime؛ ولا يقبل `talk.realtime.session` تجاوزات تعليمات مقدمة من المستدعي.
|
||||
|
||||
في مؤلف الدردشة، يكون عنصر تحكم التحدث هو زر الموجات بجوار زر إملاء الميكروفون. عند بدء التحدث، يعرض صف حالة المؤلف `Connecting Talk...`، ثم `Talk live` أثناء اتصال الصوت، أو `Asking OpenClaw...` أثناء استشارة استدعاء أداة زمن حقيقي للنموذج الأكبر المكون عبر `chat.send`.
|
||||
في مؤلف Chat، يكون عنصر تحكم 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 لمتصفح OpenAI WebRTC، وإعداد 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="الاحتفاظ الجزئي عند الإلغاء">
|
||||
- عند إلغاء تشغيل، لا يزال من الممكن عرض نص المساعد الجزئي في UI.
|
||||
- يحفظ Gateway نص المساعد الجزئي الملغى في سجل النص عندما توجد مخرجات مخزنة مؤقتا.
|
||||
- تتضمن الإدخالات المحفوظة بيانات وصفية للإلغاء حتى يتمكن مستهلكو النص من تمييز جزئيات الإلغاء عن مخرجات الاكتمال العادية.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## تثبيت PWA والدفع عبر الويب
|
||||
## تثبيت PWA ودفع الويب
|
||||
|
||||
تتضمن واجهة التحكم `manifest.webmanifest` وعامل خدمة، لذلك تستطيع المتصفحات الحديثة تثبيتها كتطبيق PWA مستقل. يتيح Web Push لـ Gateway إيقاظ PWA المثبت بالإشعارات حتى عندما لا يكون اللسان أو نافذة المتصفح مفتوحا.
|
||||
يتضمن Control UI ملف `manifest.webmanifest` وعامل خدمة، لذلك يمكن للمتصفحات الحديثة تثبيته كتطبيق PWA مستقل. يتيح Web Push لـ Gateway إيقاظ PWA المثبت بإشعارات حتى عندما لا تكون علامة التبويب أو نافذة المتصفح مفتوحة.
|
||||
|
||||
| السطح | ما يفعله |
|
||||
| ----------------------------------------------------- | ------------------------------------------------------------------ |
|
||||
| `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` | نقاط نهاية اشتراكات المتصفح المستمرة. |
|
||||
| `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 عندما تريد تثبيت المفاتيح (لعمليات النشر متعددة المضيفين، أو تدوير الأسرار، أو الاختبارات):
|
||||
تجاوز زوج مفاتيح VAPID عبر متغيرات البيئة في عملية Gateway عندما تريد تثبيت المفاتيح (للنشر متعدد المضيفين، أو تدوير الأسرار، أو الاختبارات):
|
||||
|
||||
- `OPENCLAW_VAPID_PUBLIC_KEY`
|
||||
- `OPENCLAW_VAPID_PRIVATE_KEY`
|
||||
- `OPENCLAW_VAPID_SUBJECT` (القيمة الافتراضية `mailto:openclaw@localhost`)
|
||||
|
||||
تستخدم واجهة التحكم طرق Gateway المقيدة بالنطاق هذه لتسجيل اشتراكات المتصفح واختبارها:
|
||||
يستخدم Control UI طرق Gateway المقيدة بالنطاق هذه لتسجيل اشتراكات المتصفح واختبارها:
|
||||
|
||||
- `push.web.vapidPublicKey` — يجلب مفتاح VAPID العام النشط.
|
||||
- `push.web.subscribe` — يسجل `endpoint` مع `keys.p256dh`/`keys.auth`.
|
||||
@ -217,22 +219,22 @@ x-i18n:
|
||||
- `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="صارم">
|
||||
يعطل تنفيذ البرامج النصية داخل التضمينات المستضافة.
|
||||
<Tab title="strict">
|
||||
يعطل تنفيذ السكربتات داخل التضمينات المستضافة.
|
||||
</Tab>
|
||||
<Tab title="البرامج النصية (افتراضي)">
|
||||
يسمح بالتضمينات التفاعلية مع الحفاظ على عزل الأصل؛ وهذا هو الوضع الافتراضي وعادة ما يكون كافيا لألعاب/ودجات المتصفح المستقلة.
|
||||
<Tab title="scripts (default)">
|
||||
يسمح بالتضمينات التفاعلية مع الحفاظ على عزل الأصل؛ هذا هو الخيار الافتراضي وعادة ما يكون كافيا لألعاب/ودجات المتصفح المستقلة.
|
||||
</Tab>
|
||||
<Tab title="موثوق">
|
||||
يضيف `allow-same-origin` فوق `allow-scripts` للمستندات من الموقع نفسه التي تحتاج عمدا إلى صلاحيات أقوى.
|
||||
<Tab title="trusted">
|
||||
يضيف `allow-same-origin` فوق `allow-scripts` للمستندات في الموقع نفسه التي تحتاج عمدا إلى امتيازات أقوى.
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
@ -249,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
|
||||
{
|
||||
@ -268,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 على local loopback ودع Tailscale Serve يوكله عبر HTTPS:
|
||||
|
||||
```bash
|
||||
openclaw gateway --tailscale serve
|
||||
@ -282,14 +284,14 @@ Web Push مستقل عن مسار ترحيل iOS APNS (راجع [الإعداد]
|
||||
|
||||
افتح:
|
||||
|
||||
- `https://<magicdns>/` (أو `gateway.controlUi.basePath` الذي ضبطته)
|
||||
- `https://<magicdns>/` (أو `gateway.controlUi.basePath` الذي هيأته)
|
||||
|
||||
افتراضيا، يمكن لطلبات Control UI/WebSocket Serve المصادقة عبر ترويسات هوية 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` ومطابقته مع الترويسة، ولا يقبلها إلا عندما يصل الطلب إلى local loopback مع ترويسات `x-forwarded-*` الخاصة بـ Tailscale. بالنسبة إلى جلسات مشغل 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>
|
||||
@ -300,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`).
|
||||
الصق السر المشترك المطابق في إعدادات UI (يرسل كـ `connect.params.auth.token` أو `connect.params.auth.password`).
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## 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"`
|
||||
- خيار طوارئ `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
|
||||
- توافق HTTP غير آمن خاص بـ localhost مع `gateway.controlUi.allowInsecureAuth=true`
|
||||
- مصادقة واجهة التحكم للمشغّل بنجاح عبر `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: {
|
||||
@ -336,7 +338,7 @@ Web Push مستقل عن مسار ترحيل iOS APNS (راجع [الإعداد]
|
||||
|
||||
`allowInsecureAuth` هو مفتاح توافق محلي فقط:
|
||||
|
||||
- يسمح لجلسات Control UI على localhost بالمتابعة من دون هوية جهاز في سياقات HTTP غير الآمنة.
|
||||
- يسمح لجلسات واجهة التحكم على localhost بالمتابعة دون هوية الجهاز في سياقات HTTP غير الآمنة.
|
||||
- لا يتجاوز فحوصات الاقتران.
|
||||
- لا يخفف متطلبات هوية الجهاز البعيد (غير localhost).
|
||||
|
||||
@ -353,14 +355,14 @@ Web Push مستقل عن مسار ترحيل iOS APNS (راجع [الإعداد]
|
||||
```
|
||||
|
||||
<Warning>
|
||||
يعطل `dangerouslyDisableDeviceAuth` فحوصات هوية جهاز Control UI ويعد خفضا شديدا لمستوى الأمان. تراجع عنه بسرعة بعد الاستخدام الطارئ.
|
||||
يعطّل `dangerouslyDisableDeviceAuth` فحوصات هوية الجهاز في واجهة التحكم، وهو خفض أمني شديد. أعده سريعًا بعد الاستخدام الطارئ.
|
||||
</Warning>
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="ملاحظة الوكيل الموثوق">
|
||||
- يمكن لمصادقة الوكيل الموثوق الناجحة قبول جلسات Control UI الخاصة بـ **المشغل** من دون هوية جهاز.
|
||||
- لا يمتد هذا إلى جلسات Control UI ذات دور العقدة.
|
||||
- لا تزال وكلاء reverse proxy عبر local loopback على المضيف نفسه لا تستوفي مصادقة الوكيل الموثوق؛ راجع [مصادقة الوكيل الموثوق](/ar/gateway/trusted-proxy-auth).
|
||||
- يمكن لمصادقة trusted-proxy الناجحة السماح بجلسات واجهة التحكم الخاصة بـ **المشغّل** دون هوية الجهاز.
|
||||
- لا يمتد هذا إلى جلسات واجهة التحكم بدور node.
|
||||
- لا تزال الوكلاء العكسية على loopback في المضيف نفسه لا تستوفي مصادقة trusted-proxy؛ راجع [مصادقة الوكيل الموثوق](/ar/gateway/trusted-proxy-auth).
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
@ -369,30 +371,30 @@ Web Push مستقل عن مسار ترحيل iOS APNS (راجع [الإعداد]
|
||||
|
||||
## سياسة أمان المحتوى
|
||||
|
||||
يأتي Control UI مع سياسة `img-src` صارمة: لا يسمح إلا بالأصول من **نفس المصدر**، وعناوين URL من نوع `data:`، وعناوين URL من نوع `blob:` المنشأة محليا. يرفض المتصفح عناوين صور `http(s)` البعيدة والعناوين النسبية للبروتوكول ولا يجري طلبات شبكة لها.
|
||||
تأتي واجهة التحكم مع سياسة `img-src` صارمة: لا يُسمح إلا بأصول **same-origin**، وعناوين URL من نوع `data:`، وعناوين URL من نوع `blob:` المُنشأة محليًا. يرفض المتصفح عناوين صور `http(s)` البعيدة والعناوين النسبية للبروتوكول، ولا يصدر طلبات جلب عبر الشبكة.
|
||||
|
||||
ما يعنيه هذا عمليا:
|
||||
ما يعنيه ذلك عمليًا:
|
||||
|
||||
- لا تزال الصور الرمزية والصور المقدمة ضمن مسارات نسبية (على سبيل المثال `/avatars/<id>`) تظهر، بما في ذلك مسارات الصور الرمزية المصادق عليها التي يجلبها UI ويحولها إلى عناوين URL محلية من نوع `blob:`.
|
||||
- لا تزال عناوين URL المضمنة من نوع `data:image/...` تظهر (مفيدة للحمولات داخل البروتوكول).
|
||||
- لا تزال عناوين URL المحلية من نوع `blob:` التي ينشئها Control UI تظهر.
|
||||
- تزال عناوين URL البعيدة للصور الرمزية الصادرة من بيانات تعريف القنوات عند مساعدات الصور الرمزية في Control UI وتستبدل بالشعار/الشارة المدمجين، لذلك لا تستطيع قناة مخترقة أو ضارة إجبار متصفح المشغل على جلب صور بعيدة عشوائية.
|
||||
- لا تزال الصور الرمزية والصور المقدّمة عبر مسارات نسبية (مثل `/avatars/<id>`) تُعرض، بما في ذلك مسارات الصور الرمزية المصادَق عليها التي تجلبها واجهة المستخدم وتحولها إلى عناوين URL محلية من نوع `blob:`.
|
||||
- لا تزال عناوين URL المضمّنة `data:image/...` تُعرض (مفيدة للحمولات داخل البروتوكول).
|
||||
- لا تزال عناوين URL المحلية من نوع `blob:` التي تنشئها واجهة التحكم تُعرض.
|
||||
- تُزال عناوين URL البعيدة للصور الرمزية الصادرة عن بيانات تعريف القناة في مساعدات الصور الرمزية لواجهة التحكم وتُستبدل بالشعار/الشارة المدمجة، لذلك لا يمكن لقناة مخترقة أو خبيثة فرض عمليات جلب صور بعيدة عشوائية من متصفح المشغّل.
|
||||
|
||||
لا تحتاج إلى تغيير أي شيء للحصول على هذا السلوك — فهو مفعل دائما وغير قابل للتهيئة.
|
||||
لا تحتاج إلى تغيير أي شيء للحصول على هذا السلوك — فهو مفعّل دائمًا وغير قابل للتهيئة.
|
||||
|
||||
## مصادقة مسار الصورة الرمزية
|
||||
|
||||
عند تهيئة مصادقة Gateway، يتطلب طرفية الصورة الرمزية في Control UI رمز Gateway نفسه مثل بقية API:
|
||||
عند تهيئة مصادقة Gateway، يتطلب endpoint الصورة الرمزية لواجهة التحكم رمز Gateway نفسه مثل باقي API:
|
||||
|
||||
- يعيد `GET /avatar/<agentId>` صورة الصورة الرمزية للمتصلين المصادق عليهم فقط. يعيد `GET /avatar/<agentId>?meta=1` بيانات تعريف الصورة الرمزية وفق القاعدة نفسها.
|
||||
- ترفض الطلبات غير المصادق عليها إلى أي من المسارين (بما يطابق مسار وسائط المساعد الشقيق). يمنع هذا مسار الصورة الرمزية من تسريب هوية الوكيل على المضيفات المحمية بطريقة أخرى.
|
||||
- يمرر Control UI نفسه رمز Gateway كترويسة bearer عند جلب الصور الرمزية، ويستخدم عناوين URL مصادق عليها من نوع blob بحيث تظل الصورة تظهر في لوحات المعلومات.
|
||||
- يعيد `GET /avatar/<agentId>` صورة الصورة الرمزية فقط للمتصلين المصادَق عليهم. ويعيد `GET /avatar/<agentId>?meta=1` بيانات تعريف الصورة الرمزية وفق القاعدة نفسها.
|
||||
- تُرفض الطلبات غير المصادَق عليها إلى أي من المسارين (مطابقةً لمسار assistant-media الشقيق). يمنع هذا مسار الصورة الرمزية من تسريب هوية الوكيل على المضيفين المحميين بخلاف ذلك.
|
||||
- تمرر واجهة التحكم نفسها رمز Gateway كترويسة bearer عند جلب الصور الرمزية، وتستخدم عناوين blob URL مصادَق عليها حتى تظل الصورة معروضة في لوحات المعلومات.
|
||||
|
||||
إذا عطلت مصادقة Gateway (غير موصى به على المضيفات المشتركة)، يصبح مسار الصورة الرمزية أيضا غير مصادق عليه، بما يتماشى مع بقية Gateway.
|
||||
إذا عطلت مصادقة Gateway (غير موصى به على المضيفين المشتركين)، يصبح مسار الصورة الرمزية أيضًا غير مصادَق عليه، بما يتماشى مع باقي Gateway.
|
||||
|
||||
## بناء UI
|
||||
## بناء واجهة المستخدم
|
||||
|
||||
يقدم Gateway الملفات الثابتة من `dist/control-ui`. ابنها باستخدام:
|
||||
يقدم Gateway الملفات الثابتة من `dist/control-ui`. ابنِها باستخدام:
|
||||
|
||||
```bash
|
||||
pnpm ui:build
|
||||
@ -410,14 +412,14 @@ OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
|
||||
pnpm ui:dev
|
||||
```
|
||||
|
||||
ثم وجه UI إلى عنوان URL الخاص بـ Gateway WS لديك (مثلا `ws://127.0.0.1:18789`).
|
||||
ثم وجّه واجهة المستخدم إلى عنوان Gateway WS الخاص بك (مثل `ws://127.0.0.1:18789`).
|
||||
|
||||
## التصحيح/الاختبار: خادم التطوير + Gateway بعيد
|
||||
## تصحيح الأخطاء/الاختبار: خادم التطوير + Gateway بعيد
|
||||
|
||||
Control UI عبارة عن ملفات ثابتة؛ هدف WebSocket قابل للتهيئة ويمكن أن يكون مختلفا عن أصل HTTP. يكون هذا مفيدا عندما تريد خادم تطوير Vite محليا بينما يعمل Gateway في مكان آخر.
|
||||
واجهة التحكم هي ملفات ثابتة؛ هدف WebSocket قابل للتهيئة ويمكن أن يكون مختلفًا عن أصل HTTP. يكون هذا مفيدًا عندما تريد خادم تطوير Vite محليًا بينما يعمل Gateway في مكان آخر.
|
||||
|
||||
<Steps>
|
||||
<Step title="ابدأ خادم تطوير UI">
|
||||
<Step title="ابدأ خادم تطوير واجهة المستخدم">
|
||||
```bash
|
||||
pnpm ui:dev
|
||||
```
|
||||
@ -438,17 +440,17 @@ Control UI عبارة عن ملفات ثابتة؛ هدف WebSocket قابل ل
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="ملاحظات">
|
||||
- يخزن `gatewayUrl` في localStorage بعد التحميل ويزال من عنوان URL.
|
||||
- إذا مررت نقطة نهاية كاملة `ws://` أو `wss://` عبر `gatewayUrl`، فقم بترميز قيمة `gatewayUrl` في URL حتى يفسر المتصفح سلسلة الاستعلام بشكل صحيح.
|
||||
- ينبغي تمرير `token` عبر جزء عنوان URL (`#token=...`) كلما أمكن. لا ترسل الأجزاء إلى الخادم، ما يتجنب تسربها في سجلات الطلبات وReferer. لا تزال معلمات الاستعلام القديمة `?token=` تستورد مرة واحدة للتوافق، لكن كخيار احتياطي فقط، وتزال فورا بعد bootstrap.
|
||||
- يبقى `password` في الذاكرة فقط.
|
||||
- عند تعيين `gatewayUrl`، لا يعود UI إلى بيانات اعتماد التهيئة أو البيئة. وفر `token` (أو `password`) صراحة. عدم وجود بيانات اعتماد صريحة يعد خطأ.
|
||||
- استخدم `wss://` عندما يكون Gateway خلف TLS (Tailscale Serve، وكيل HTTPS، إلخ).
|
||||
- لا يقبل `gatewayUrl` إلا في نافذة بالمستوى الأعلى (غير مضمّنة) لمنع clickjacking.
|
||||
- يجب على عمليات نشر Control UI خارج local loopback تعيين `gateway.controlUi.allowedOrigins` صراحة (أصول كاملة). يشمل هذا إعدادات التطوير البعيدة.
|
||||
- قد يزرع بدء تشغيل Gateway أصولا محلية مثل `http://localhost:<port>` و`http://127.0.0.1:<port>` من الربط والمنفذ الفعليين في وقت التشغيل، لكن أصول المتصفح البعيدة لا تزال تحتاج إلى إدخالات صريحة.
|
||||
- لا تستخدم `gateway.controlUi.allowedOrigins: ["*"]` إلا للاختبار المحلي المحكوم بإحكام. يعني ذلك السماح لأي أصل متصفح، وليس "مطابقة أي مضيف أستخدمه".
|
||||
- يفعّل `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` وضع الرجوع إلى أصل ترويسة Host، لكنه وضع أمان خطير.
|
||||
- يُخزّن `gatewayUrl` في localStorage بعد التحميل ويُزال من عنوان URL.
|
||||
- إذا مررت endpoint كاملًا من نوع `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، لكنه وضع أمني خطير.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
@ -467,7 +469,7 @@ Control UI عبارة عن ملفات ثابتة؛ هدف WebSocket قابل ل
|
||||
|
||||
تفاصيل إعداد الوصول البعيد: [الوصول البعيد](/ar/gateway/remote).
|
||||
|
||||
## ذو صلة
|
||||
## ذات صلة
|
||||
|
||||
- [لوحة المعلومات](/ar/web/dashboard) — لوحة معلومات Gateway
|
||||
- [فحوصات الصحة](/ar/gateway/health) — مراقبة صحة Gateway
|
||||
|
||||
@ -1,71 +1,72 @@
|
||||
---
|
||||
read_when:
|
||||
- تصحيح أخطاء الوصول إلى WebChat أو تكوينه
|
||||
summary: مضيف دردشة الويب الثابت للاسترجاع الحلقي واستخدام Gateway WS لواجهة مستخدم الدردشة
|
||||
summary: المضيف الثابت لـ WebChat عبر حلقة الرجوع واستخدام WS الخاص بـ Gateway لواجهة مستخدم الدردشة
|
||||
title: دردشة الويب
|
||||
x-i18n:
|
||||
generated_at: "2026-05-02T07:47:09Z"
|
||||
generated_at: "2026-05-02T23:39:04Z"
|
||||
model: gpt-5.5
|
||||
provider: openai
|
||||
source_hash: fe6d3cb30ed18d651b0d0ca8fd188b47c5f1d186410ee340deb79315f194ed8d
|
||||
source_hash: ad3a09c8962e3a6dda83716d319df7ba27e18105cee50721278b5cba0a85c52f
|
||||
source_path: web/webchat.md
|
||||
workflow: 16
|
||||
---
|
||||
|
||||
الحالة: تتواصل واجهة دردشة SwiftUI في macOS/iOS مباشرة مع Gateway WebSocket.
|
||||
الحالة: تتحدث واجهة دردشة SwiftUI على macOS/iOS مباشرة مع WebSocket الخاص بـ Gateway.
|
||||
|
||||
## ما هي
|
||||
|
||||
- واجهة دردشة أصلية للـ gateway (من دون متصفح مضمّن ومن دون خادم ثابت محلي).
|
||||
- واجهة دردشة أصلية لـ Gateway (من دون متصفح مضمّن ومن دون خادم ثابت محلي).
|
||||
- تستخدم الجلسات وقواعد التوجيه نفسها مثل القنوات الأخرى.
|
||||
- توجيه حتمي: تعود الردود دائمًا إلى WebChat.
|
||||
|
||||
## البدء السريع
|
||||
|
||||
1. ابدأ تشغيل الـ gateway.
|
||||
1. شغّل Gateway.
|
||||
2. افتح واجهة WebChat (تطبيق macOS/iOS) أو تبويب الدردشة في واجهة التحكم.
|
||||
3. تأكد من تكوين مسار مصادقة gateway صالح (سرّ مشترك افتراضيًا،
|
||||
3. تأكد من تكوين مسار مصادقة صالح لـ Gateway (سرّ مشترك افتراضيًا،
|
||||
حتى على loopback).
|
||||
|
||||
## كيف تعمل (السلوك)
|
||||
|
||||
- تتصل الواجهة بـ Gateway WebSocket وتستخدم `chat.history` و`chat.send` و`chat.inject`.
|
||||
- يكون `chat.history` محدودًا لضمان الاستقرار: قد يقتطع Gateway حقول النص الطويلة، ويحذف البيانات الوصفية الثقيلة، ويستبدل الإدخالات كبيرة الحجم بـ `[chat.history omitted: message too large]`.
|
||||
- يتبع `chat.history` فرع النص النشط لملفات الجلسات الحديثة ذات الإلحاق فقط، لذلك لا تُعرض فروع إعادة الكتابة المتروكة ولا نسخ المطالبات المستبدلة في WebChat.
|
||||
- تتذكر واجهة التحكم `sessionId` الخاص بـ Gateway الخلفي الذي يعيده `chat.history` وتضمّنه في استدعاءات `chat.send` اللاحقة، لذلك تواصل عمليات إعادة الاتصال وتحديث الصفحة المحادثة المخزنة نفسها ما لم يبدأ المستخدم جلسة أو يعيد ضبطها.
|
||||
- تدمج واجهة التحكم عمليات الإرسال المكررة قيد التنفيذ للجلسة والرسالة والمرفقات نفسها قبل إنشاء معرّف تشغيل جديد لـ `chat.send`؛ ولا يزال Gateway يزيل تكرار الطلبات المتكررة التي تعيد استخدام مفتاح الإتاحة نفسه.
|
||||
- يكون `chat.history` مطبّعًا للعرض أيضًا: تتم إزالة سياق OpenClaw المخصص لوقت التشغيل فقط،
|
||||
وأغلفة المظاريف الواردة، ووسوم توجيهات التسليم المضمنة
|
||||
مثل `[[reply_to_*]]` و`[[audio_as_voice]]`، وحمولات XML لاستدعاءات الأدوات بنص عادي
|
||||
- تتصل الواجهة بـ WebSocket الخاص بـ Gateway وتستخدم `chat.history` و`chat.send` و`chat.inject` و`chat.transcribeAudio`.
|
||||
- `chat.history` محدود لضمان الاستقرار: قد يقتطع Gateway حقول النص الطويلة، ويحذف البيانات الوصفية الثقيلة، ويستبدل الإدخالات كبيرة الحجم بـ `[chat.history omitted: message too large]`.
|
||||
- يتبع `chat.history` فرع النص النشط لملفات الجلسات الحديثة ذات الإلحاق فقط، لذلك لا تُعرض فروع إعادة الكتابة المهجورة ونسخ المطالبات التي تم تجاوزها في WebChat.
|
||||
- تتذكر واجهة التحكم `sessionId` الخاص بـ Gateway الأساسي الذي يُرجعه `chat.history` وتضمّنه في استدعاءات `chat.send` اللاحقة، لذلك تواصل عمليات إعادة الاتصال وتحديث الصفحة المحادثة المخزنة نفسها ما لم يبدأ المستخدم جلسة أو يعيد ضبطها.
|
||||
- تدمج واجهة التحكم عمليات الإرسال المكررة الجارية للجلسة والرسالة والمرفقات نفسها قبل إنشاء معرّف تشغيل `chat.send` جديد؛ ومع ذلك يزيل Gateway تكرار الطلبات المتكررة التي تعيد استخدام مفتاح idempotency نفسه.
|
||||
- كما أن `chat.history` مطبّع للعرض: تتم إزالة سياق OpenClaw الخاص بوقت التشغيل فقط،
|
||||
وأغلفة المظاريف الواردة، ووسوم توجيهات التسليم المضمّنة
|
||||
مثل `[[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`.
|
||||
- تُستبعد حمولات الرد الموسومة بالاستدلال (`isReasoning: true`) من محتوى مساعد WebChat، ونص إعادة تشغيل النص، وكتل محتوى الصوت، لذلك لا تظهر الحمولات الخاصة بالتفكير فقط كرسائل مساعد مرئية أو صوت قابل للتشغيل.
|
||||
- يلحق `chat.inject` ملاحظة مساعد مباشرة بالنص ويبثها إلى الواجهة (من دون تشغيل وكيل).
|
||||
- يمكن أن تُبقي عمليات التشغيل المُجهضة خرج المساعد الجزئي مرئيًا في الواجهة.
|
||||
- يحفظ Gateway نص المساعد الجزئي المُجهض في سجل النص عندما يوجد خرج مخزن مؤقتًا، ويميز تلك الإدخالات ببيانات وصفية للإجهاض.
|
||||
- يُجلب السجل دائمًا من الـ gateway (من دون مراقبة ملفات محلية).
|
||||
- إذا تعذر الوصول إلى الـ gateway، يكون WebChat للقراءة فقط.
|
||||
و`<function_calls>...</function_calls>`، وكتل استدعاء الأدوات المقتطعة)،
|
||||
ورموز تحكم النموذج المسربة بنطاق ASCII/العرض الكامل من النص المرئي،
|
||||
ويتم حذف إدخالات المساعد التي يكون نصها المرئي كله هو الرمز الصامت الدقيق
|
||||
`NO_REPLY` / `no_reply` فقط.
|
||||
- تُستبعد حمولات الرد التي تحمل علامة الاستدلال (`isReasoning: true`) من محتوى مساعد WebChat، ونص إعادة تشغيل النص، وكتل المحتوى الصوتي، لذلك لا تظهر حمولات التفكير فقط كرسائل مساعد مرئية أو صوت قابل للتشغيل.
|
||||
- يشغّل `chat.transcribeAudio` الإملاء من جهة الخادم في محرر الدردشة في واجهة التحكم. يسجل المتصفح صوت الميكروفون، ويرسله بصيغة base64 إلى Gateway، ويشغّل Gateway مسار `tools.media.audio` المكوّن. يُدرج النص المرتجع في المسودة؛ ولا يبدأ أي تشغيل للوكيل حتى يرسله المستخدم.
|
||||
- يضيف `chat.inject` ملاحظة من المساعد مباشرة إلى النص ويبثها إلى الواجهة (من دون تشغيل وكيل).
|
||||
- يمكن أن تُبقي عمليات التشغيل المجهضة مخرجات المساعد الجزئية مرئية في الواجهة.
|
||||
- يحفظ Gateway نص المساعد الجزئي المجهض في سجل النص عندما توجد مخرجات مخزنة مؤقتًا، ويضع على تلك الإدخالات بيانات وصفية للإجهاض.
|
||||
- يُجلب السجل دائمًا من Gateway (من دون مراقبة ملفات محلية).
|
||||
- إذا تعذر الوصول إلى Gateway، يكون WebChat للقراءة فقط.
|
||||
|
||||
## لوحة أدوات الوكلاء في واجهة التحكم
|
||||
|
||||
- تحتوي لوحة الأدوات في `/agents` ضمن واجهة التحكم على عرضين منفصلين:
|
||||
- **متاح الآن** يستخدم `tools.effective(sessionKey=...)` ويعرض ما يمكن للجلسة الحالية
|
||||
- تحتوي لوحة الأدوات `/agents` في واجهة التحكم على عرضين منفصلين:
|
||||
- تستخدم **متاح الآن** `tools.effective(sessionKey=...)` وتعرض ما يمكن للجلسة الحالية
|
||||
استخدامه فعليًا في وقت التشغيل، بما في ذلك الأدوات الأساسية وأدوات plugin والأدوات المملوكة للقنوات.
|
||||
- **تكوين الأدوات** يستخدم `tools.catalog` ويبقى مركزًا على ملفات التعريف والتجاوزات
|
||||
- تستخدم **تكوين الأدوات** `tools.catalog` وتبقى مركزة على الملفات التعريفية والتجاوزات
|
||||
ودلالات الفهرس.
|
||||
- يكون توفر وقت التشغيل محدودًا بنطاق الجلسة. يمكن أن يغيّر تبديل الجلسات على الوكيل نفسه
|
||||
قائمة **متاح الآن**.
|
||||
- لا يعني محرر التكوين توفرًا في وقت التشغيل؛ فلا يزال الوصول الفعلي يتبع أسبقية السياسة
|
||||
(`allow`/`deny`، وتجاوزات كل وكيل وكل موفر/قناة).
|
||||
- يكون التوفر في وقت التشغيل محدودًا بنطاق الجلسة. قد يؤدي تبديل الجلسات على الوكيل نفسه إلى تغيير قائمة
|
||||
**متاح الآن**.
|
||||
- لا يعني محرر التكوين التوفر في وقت التشغيل؛ إذ يظل الوصول الفعّال يتبع أسبقية السياسات
|
||||
(`allow`/`deny`، وتجاوزات كل وكيل والمزوّد/القناة).
|
||||
|
||||
## الاستخدام عن بُعد
|
||||
## الاستخدام البعيد
|
||||
|
||||
- يمرر الوضع البعيد Gateway WebSocket عبر SSH/Tailscale.
|
||||
- لست بحاجة إلى تشغيل خادم WebChat منفصل.
|
||||
- يمرر الوضع البعيد WebSocket الخاص بـ Gateway عبر SSH/Tailscale.
|
||||
- لا تحتاج إلى تشغيل خادم WebChat منفصل.
|
||||
|
||||
## مرجع التكوين (WebChat)
|
||||
|
||||
@ -73,18 +74,18 @@ x-i18n:
|
||||
|
||||
خيارات WebChat:
|
||||
|
||||
- `gateway.webchat.chatHistoryMaxChars`: الحد الأقصى لعدد الأحرف في حقول النص ضمن استجابات `chat.history`. عندما يتجاوز إدخال نص هذا الحد، يقتطع Gateway حقول النص الطويلة وقد يستبدل الرسائل كبيرة الحجم بعنصر نائب. يمكن للعميل أيضًا إرسال `maxChars` لكل طلب لتجاوز هذا الافتراضي في استدعاء `chat.history` واحد.
|
||||
- `gateway.webchat.chatHistoryMaxChars`: الحد الأقصى لعدد الأحرف لحقول النص في استجابات `chat.history`. عندما يتجاوز إدخال النص هذا الحد، يقتطع Gateway حقول النص الطويلة وقد يستبدل الرسائل كبيرة الحجم بعنصر نائب. يمكن للعميل أيضًا إرسال `maxChars` لكل طلب لتجاوز هذا الإعداد الافتراضي لاستدعاء `chat.history` واحد.
|
||||
|
||||
الخيارات العامة ذات الصلة:
|
||||
|
||||
- `gateway.port`، `gateway.bind`: مضيف/منفذ WebSocket.
|
||||
- `gateway.auth.mode`، `gateway.auth.token`، `gateway.auth.password`:
|
||||
مصادقة WebSocket بسرّ مشترك.
|
||||
مصادقة WebSocket بالسرّ المشترك.
|
||||
- `gateway.auth.allowTailscale`: يمكن لتبويب دردشة واجهة التحكم في المتصفح استخدام ترويسات هوية Tailscale
|
||||
Serve عند تفعيلها.
|
||||
- `gateway.auth.mode: "trusted-proxy"`: مصادقة وكيل عكسي لعملاء المتصفح خلف مصدر وكيل **غير loopback** واعٍ بالهوية (راجع [مصادقة الوكيل الموثوق](/ar/gateway/trusted-proxy-auth)).
|
||||
- `gateway.remote.url`، `gateway.remote.token`، `gateway.remote.password`: هدف gateway البعيد.
|
||||
- `session.*`: تخزين الجلسة والإعدادات الافتراضية للمفتاح الرئيسي.
|
||||
Serve عند التمكين.
|
||||
- `gateway.auth.mode: "trusted-proxy"`: مصادقة الوكيل العكسي لعملاء المتصفح خلف مصدر وكيل **غير loopback** مدرك للهوية (راجع [مصادقة الوكيل الموثوق](/ar/gateway/trusted-proxy-auth)).
|
||||
- `gateway.remote.url`، `gateway.remote.token`، `gateway.remote.password`: هدف Gateway البعيد.
|
||||
- `session.*`: تخزين الجلسات والإعدادات الافتراضية للمفتاح الرئيسي.
|
||||
|
||||
## ذات صلة
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user