exec وwait.
توثق هذه الصفحة وضع الكود في OpenClaw. وهو ليس وضع Codex Code mode. تشترك
الميزتان في الاسم، لكنهما تنفذان عبر أوقات تشغيل مختلفة وتكشفان
عقود exec مختلفة:
- Codex Code Mode مفعل لخيوط خادم تطبيق Codex ما لم تعطل سياسة الأدوات
المقيدة وضع الكود الأصلي. يعمل ضمن حاضنة البرمجة في Codex،
حيث يكتب النموذج أوامر الصدفة من خلال عقد
exec.command. - وضع الكود في OpenClaw معطل ما لم يتم ضبط
tools.codeMode.enabled: true. يعمل ضمن وقت تشغيل الوكيل العام في OpenClaw، حيث يكتب النموذج برامج JavaScript أو TypeScript من خلال عقدexec.code.
quickjs-wasi، وكتالوج أدوات
OpenClaw مخفي، ومنفذ أدوات OpenClaw العادي.
ما هذا؟
يتيح وضع الكود في OpenClaw للنموذج كتابة برنامج JavaScript أو TypeScript صغير بدلا من الاختيار مباشرة من قائمة طويلة من الأدوات. عندما يكون وضع الكود نشطا:- قائمة الأدوات المرئية للنموذج هي بالضبط
execوwait. - يقيم
execJavaScript أو TypeScript مولدا من النموذج في عامل QuickJS-WASI مقيد. - تكون أدوات OpenClaw العادية مخفية عن مطالبة النموذج ومكشوفة داخل
برنامج الضيف عبر
ALL_TOOLSوtools. - يمكن لكود الضيف البحث في الكتالوج المخفي، ووصف أداة، واستدعاء أداة من خلال مسار تنفيذ OpenClaw نفسه المستخدم في دورات الوكيل العادية.
- تجمع أدوات MCP تحت مساحة الاسم
MCP. في وضع الكود، مساحة الاسم هذه هي الطريقة الوحيدة المدعومة لاستدعاء أدوات MCP. - يستأنف
waitتشغيلة وضع كود معلقة عندما تظل استدعاءات الأدوات المتداخلة قيد الانتظار.
لماذا هذا جيد؟
يجعل وضع الكود كتالوجات الأدوات الكبيرة أسهل استخداما للنماذج.- سطح مطالبة أصغر: يتلقى المزودون أداتي تحكم بدلا من عشرات أو مئات مخططات الأدوات الكاملة.
- تنسيق أفضل: يمكن للنموذج استخدام الحلقات، والدمج، والتحويلات الصغيرة، والمنطق الشرطي، واستدعاءات الأدوات المتداخلة المتوازية داخل خلية كود واحدة.
- محايد للمزودين: يعمل مع أدوات OpenClaw وPlugin وMCP والعميل دون الاعتماد على تنفيذ كود أصلي لدى المزود.
- تظل السياسة الحالية نافذة: ما زالت استدعاءات الأدوات المتداخلة تمر عبر سياسة OpenClaw، والموافقات، والخطافات، وسياق الجلسة، ومسارات التدقيق.
- نمط فشل واضح: عندما يكون وضع الكود مفعلا صراحة ويكون وقت التشغيل غير متاح، يفشل OpenClaw بإغلاق آمن بدلا من الرجوع إلى كشف واسع ومباشر للأدوات.
كيفية تفعيله
أضفtools.codeMode.enabled: true إلى إعداد الوكيل أو وقت التشغيل:
tools.codeMode محذوفا، أو false، أو كائنا
بلا enabled: true.
عند استخدام وكلاء معزولين مع خوادم MCP مضبوطة، تأكد أيضا من أن سياسة أدوات
العزل تسمح بـ Plugin MCP المضمن، مثلا عبر
tools.sandbox.tools.alsoAllow: ["bundle-mcp"]. راجع
الإعداد - الأدوات والمزودون المخصصون.
استخدم حدودا صريحة عندما تريد قيودا أشد:
exec وwait. إذا كنت تحتاج إلى حمولة المزود المنقحة، فأضف
OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted لجلسة تصحيح قصيرة.
جولة تقنية
يصف باقي هذه الصفحة عقد وقت التشغيل وتفاصيل التنفيذ. وهو مخصص للمشرفين، ومؤلفي Plugin الذين يصححون كشف الأدوات، والمشغلين الذين يتحققون من عمليات نشر عالية المخاطر.حالة وقت التشغيل
- وقت التشغيل:
quickjs-wasi. - الحالة الافتراضية: معطل.
- الاستقرار: سطح OpenClaw تجريبي؛ وضع Codex Code mode سطح منفصل مستقر في حاضنة Codex.
- السطح الهدف: تشغيلات وكيل OpenClaw العامة.
- الموقف الأمني: كود النموذج عدائي.
- الوعد الموجه للمستخدم: لا يؤدي تفعيل وضع الكود أبدا إلى رجوع صامت إلى كشف واسع ومباشر للأدوات.
النطاق
يمتلك وضع الكود شكل التنسيق المواجه للنموذج لتشغيلة معدة. ولا يمتلك اختيار النموذج، أو سلوك القناة، أو المصادقة، أو سياسة الأدوات، أو تنفيذات الأدوات. ضمن النطاق:- تعريفات أداتي
execوwaitالمرئيتين للنموذج - بناء كتالوج الأدوات المخفي
- تنفيذ ضيف JavaScript وTypeScript
- وقت تشغيل عامل QuickJS-WASI
- استدعاءات المضيف للبحث في الكتالوج، ووصف المخطط، واستدعاء الأداة
- حالة قابلة للاستئناف لبرامج الضيف المعلقة
- حدود الإخراج، والمهلة، والذاكرة، والاستدعاءات المعلقة، واللقطات
- القياس عن بعد وإسقاط المسار لاستدعاءات الأدوات المتداخلة
- تنفيذ الكود البعيد الأصلي لدى المزود
- دلالات تنفيذ الصدفة
- تغيير تفويض الأدوات الحالي
- سكربتات مستمرة يؤلفها المستخدم
- الوصول إلى مدير الحزم، أو الملفات، أو الشبكة، أو الوحدات في كود الضيف
- إعادة الاستخدام المباشر لداخليات وضع Codex Code mode
المصطلحات
وضع الكود هو وضع وقت تشغيل OpenClaw الذي يخفي أدوات النموذج العادية ولا يكشف سوىexec وwait.
وقت تشغيل الضيف هو آلة JavaScript الافتراضية QuickJS-WASI التي تقيم كود النموذج.
جسر المضيف هو سطح الاستدعاء الضيق المتوافق مع JSON من كود الضيف
راجعا إلى OpenClaw.
الكتالوج هو قائمة الأدوات الفعالة ضمن نطاق التشغيلة بعد سياسة الأدوات
العادية، وحل Plugin وMCP وأدوات العميل.
استدعاء أداة متداخل هو استدعاء أداة يتم من كود الضيف عبر جسر المضيف.
اللقطة هي حالة آلة QuickJS-WASI الافتراضية المسلسلة المحفوظة لكي يستطيع
wait متابعة تشغيلة وضع كود معلقة.
الإعداد
tools.codeMode.enabled هو بوابة التفعيل. لا يؤدي تعيين حقول وضع الكود الأخرى
إلى تفعيل الميزة.
الحقول المدعومة:
enabled: قيمة منطقية. الافتراضيfalse. يفعل وضع الكود فقط عندما تكونtrue.runtime:"quickjs-wasi". وقت التشغيل الوحيد المدعوم.mode:"only". يكشفexecوwait، ويخفي أدوات النموذج العادية.languages: مصفوفة من"javascript"و"typescript". يتضمن الافتراضي كليهما.timeoutMs: حد زمني فعلي لعمليةexecأوwaitواحدة. الافتراضي10000. حد وقت التشغيل: من100إلى60000.memoryLimitBytes: حد كومة QuickJS. الافتراضي67108864. حد وقت التشغيل: من1048576إلى1073741824.maxOutputBytes: حد للنص المعاد، وJSON، والسجلات. الافتراضي65536. حد وقت التشغيل: من1024إلى10485760.maxSnapshotBytes: حد للقطات الآلة الافتراضية المسلسلة. الافتراضي10485760. حد وقت التشغيل: من1024إلى268435456.maxPendingToolCalls: حد لاستدعاءات الأدوات المتداخلة المتزامنة. الافتراضي16. حد وقت التشغيل: من1إلى128.snapshotTtlSeconds: مدة إمكانية استئناف آلة افتراضية معلقة. الافتراضي900. حد وقت التشغيل: من1إلى86400.searchDefaultLimit: عدد نتائج البحث الافتراضي في الكتالوج المخفي. الافتراضي8. يقيد وقت التشغيل هذا إلىmaxSearchLimit.maxSearchLimit: الحد الأقصى لعدد نتائج البحث في الكتالوج المخفي. الافتراضي50. حد وقت التشغيل: من1إلى50.
التفعيل
يقيم وضع الكود بعد معرفة سياسة الأدوات الفعالة وقبل تجميع طلب النموذج النهائي. ترتيب التفعيل:- حل الوكيل، والنموذج، والمزود، والعزل، والقناة، والمرسل، وسياسة التشغيلة.
- بناء قائمة أدوات OpenClaw الفعالة.
- إضافة أدوات Plugin وMCP والعميل المؤهلة.
- تطبيق سياسة السماح والمنع.
- إذا كانت
tools.codeMode.enabledخطأ، فتابع مع كشف الأدوات العادي. - إذا كانت مفعلة وكانت الأدوات نشطة للتشغيلة، فسجل الأدوات الفعالة في كتالوج وضع الكود.
- أزل كل الأدوات العادية من قائمة الأدوات المرئية للنموذج.
- أضف
execوwaitالخاصتين بوضع الكود.
disableTools، أو قائمة سماح فارغة، لا تفعل سطح وضع الكود حتى لو كان
الإعداد يحتوي على tools.codeMode.enabled: true.
كتالوج وضع الكود ضمن نطاق التشغيلة. يجب ألا يسرب أدوات من وكيل، أو جلسة،
أو مرسل، أو تشغيلة أخرى.
الأدوات المرئية للنموذج
عندما يكون وضع الكود نشطا، يرى النموذج بالضبط هاتين الأداتين على المستوى الأعلى:execwait
exec لتنسيق الأدوات، ودمج البيانات، والحلقات،
والاستدعاءات المتداخلة المتوازية، والتحويلات المنظمة. وينبغي أن يستخدم النموذج
wait فقط عندما يعيد exec نتيجة waiting قابلة للاستئناف.
exec
يبدأ exec خلية وضع كود ويعيد نتيجة واحدة. كود الإدخال مولد من النموذج
ويجب التعامل معه كعدائي.
الإدخال:
- يجب أن يكون أحد
codeأوcommandغير فارغ. codeهو الحقل الموثق والموجه للنموذج.- يقبل
commandكاسم بديل متوافق مع exec لسياسات الخطافات وإعادة الكتابة الموثوقة؛ عند وجودهما معا، يجب أن تتطابق القيمتان. - تتضمن أحداث خطاف
execالخارجية لوضع الكودtoolKind: "code_mode_exec"وتتضمنtoolInputKind: "javascript" | "typescript"عندما تكون لغة الإدخال معروفة، بحيث تستطيع السياسات تمييز خلايا وضع الكود عن استدعاءاتexecبأسلوب الصدفة التي تشترك في اسم الأداة نفسه. - القيمة الافتراضية لـ
languageهي"javascript". - إذا كانت
languageهي"typescript"، يقوم OpenClaw بالتحويل قبل التقييم. - يرفض
execأنماطimport، وrequire، والاستيراد الديناميكي، ومحمل الوحدات في v1. - لا يكشف
execتنفيذexecالعادي للصدفة بشكل تكراري.
exec الحالة waiting عندما تعلق آلة QuickJS الافتراضية مع حالة قابلة
للاستئناف ما زالت تحتاج إلى متابعة مرئية للنموذج. تتضمن النتيجة runId من أجل
wait. تستنزف استدعاءات جسر مساحة الاسم، بما في ذلك استدعاءات مساحة اسم MCP،
تلقائيا داخل استدعاء exec/wait نفسه عندما تكون جاهزة، لذلك يمكن لكتلة كود
موجزة فحص $api() واستدعاء أداة MCP دون فرض استدعاء أداة نموذج واحد لكل
انتظار مساحة اسم.
exec تُرجع completed فقط عندما لا تكون لدى آلة الضيف الافتراضية أي أعمال معلقة وتكون
القيمة النهائية متوافقة مع JSON بعد تشغيل محوّل مخرجات OpenClaw.
wait
تواصل wait آلة افتراضية معلّقة في وضع الشيفرة.
الإدخال:
CodeModeResult نفسه الذي تُرجعه exec.
توجد wait لأن أدوات OpenClaw المتداخلة قد تكون بطيئة أو تفاعلية أو خاضعة
للموافقة أو تبث تحديثات جزئية. يجب ألا يحتاج النموذج إلى إبقاء استدعاء exec
طويل واحد مفتوحًا بينما ينتظر المضيف عملًا خارجيًا.
لقطة QuickJS-WASI والاستعادة هما آلية الاستئناف في v1:
- تقيّم
execالشيفرة حتى الاكتمال أو الفشل أو التعليق. - عند التعليق، يأخذ OpenClaw لقطة لآلة QuickJS الافتراضية ويسجل عمل المضيف المعلق.
- عندما يستقر العمل المعلق، تستعيد
waitلقطة الآلة الافتراضية. - يعيد OpenClaw تسجيل استدعاءات المضيف الراجعة بأسماء مستقرة.
- يسلّم OpenClaw نتائج الأدوات المتداخلة إلى الآلة الافتراضية المستعادة.
- يفرّغ OpenClaw مهام QuickJS المعلقة.
- تُرجع
waitالنتيجةcompletedأوfailedأو نتيجةwaitingأخرى.
wait عندما:
- يكون
runIdغير معروف. - تكون اللقطة منتهية الصلاحية.
- يكون التشغيل الأصل أو الجلسة قد أُجهض.
- لا يكون المستدعي ضمن نطاق التشغيل/الجلسة نفسه.
- تفشل استعادة QuickJS-WASI.
- تتجاوز الاستعادة الحدود المضبوطة.
واجهة API لبيئة تشغيل الضيف
تعرض بيئة تشغيل الضيف واجهة API عامة صغيرة:ALL_TOOLS هي بيانات وصفية مضغوطة للفهرس المقيّد بنطاق التشغيل. لا تحتوي
المخططات الكاملة افتراضيًا.
tools.call(...) أو الدوال المختصرة
في وضع الشيفرة. تُعرَض فقط من خلال مساحة الأسماء MCP المولّدة. تتوفر ملفات
تصريح بأسلوب TypeScript من خلال سطح الملفات الافتراضي API للقراءة فقط، لكي
تتمكن الوكلاء من فحص تواقيع MCP دون إضافة مخططات MCP إلى الموجه:
API.read("mcp/<server>.d.ts") تصريحات مضغوطة مستنتجة من بيانات وصفية
لأداة MCP:
exec في وضع الشيفرة، يبني OpenClaw فهرس الأدوات المقيّد بنطاق
التشغيل، ويبقي إدخالات MCP المرئية، ويصيّر mcp/index.d.ts إضافة إلى تصريح
mcp/<server>.d.ts واحد لكل خادم مرئي، ويحقن ذلك الجدول الصغير للقراءة فقط في
عامل QuickJS. لا ترى شيفرة الضيف إلا الكائن API: تُرجع API.list(prefix?)
بيانات وصفية للملف وتُرجع API.read(path) محتوى التصريح المحدد. تُرفض المسارات
غير المعروفة ومقاطع . / ...
يبقي هذا مخططات MCP الكبيرة خارج موجه النموذج. يتعلم الوكيل وجود واجهة API
الافتراضية من وصف أداة exec، ويقرأ فقط ملف التصريح المطلوب، ثم يستدعي
MCP.<server>.<tool>() بوسيط كائن واحد. تبقى MCP.<server>.$api() متاحة
كخيار احتياطي مضمن عندما يحتاج الوكيل إلى استجابة مخطط لأداة واحدة داخل البرنامج.
يجب ألا تعرض بيئة تشغيل الضيف كائنات المضيف مباشرة. تعبر المدخلات والمخرجات
الجسر كقيم متوافقة مع JSON وبحدود حجم صريحة.
مساحات الأسماء الداخلية
تمنح مساحات الأسماء الداخلية وضع الشيفرة واجهة API موجزة للمجال دون إضافة المزيد من الأدوات المرئية للنموذج. يمكن لتكامل مملوك للمحمّل تسجيل مساحة أسماء مثلIssues أو Fictions أو Calendar؛ ثم تستدعي شيفرة الضيف مساحة الأسماء
تلك داخل برنامج QuickJS بينما لا يزال OpenClaw يعرض للنموذج سوى exec وwait.
مساحات الأسماء داخلية في الوقت الحالي. لا توجد واجهة API عامة لمساحات أسماء
Plugin SDK: تحتاج مساحات أسماء Plugins الخارجية إلى عقد مملوك للمحمّل بحيث لا
تنحرف هوية Plugin والبيانات الظاهرة المثبتة وحالة المصادقة وواصفات الفهرس
المخزنة مؤقتًا عن أدوات Plugin التي تدعم مساحة الأسماء. لا يملك وضع الشيفرة
في النواة إلا صندوق العزل، والتسلسل، وبوابة الفهرس، وإرسال الجسر.
يمكن لشيفرة الضيف بعد ذلك استخدام العام المباشر أو خريطة namespaces:
دورة حياة السجل
سجل مساحة الأسماء محلي للعملية ومفهرس بمعرّف مساحة الأسماء. يتبع التشغيل النموذجي هذا المسار:- يستدعي محمّل موثوق
registerCodeModeNamespaceForPlugin(pluginId, registration). - ينشئ وضع الشيفرة
ToolSearchRuntimeالمخفي للتشغيل ويقرأ فهرسه المقيّد بنطاق التشغيل. - تُبقي
createCodeModeNamespaceRuntime(ctx, catalog)فقط التسجيلات التي تكون كلrequiredToolNamesفيها مرئية ومملوكة لنفسpluginId. - تستدعي كل مساحة أسماء مرئية
createScope(ctx)للتشغيل الحالي. يتلقى النطاق سياق التشغيل مثلagentIdوsessionKeyوsessionIdوrunIdوالإعدادات وحالة الإجهاض. - تُسلسَل بيانات النطاق إلى واصف عادي وتُحقن في QuickJS كعموميات مباشرة و
namespaces.<globalName>. - تُعلّق استدعاءات الضيف عبر جسر العامل، وتحل مسار مساحة الأسماء على المضيف،
وتربط الاستدعاء بأداة فهرس مصرّح بها ومملوكة لـ Plugin، وتنفذ تلك الأداة عبر
ToolSearchRuntime.call. - يفرّغ OpenClaw تلقائيًا استدعاءات جسر مساحة الأسماء الجاهزة داخل استدعاء
أداة
exec/waitالنشط. إذا ظل عمل مساحة الأسماء معلقًا عند المهلة أو أعطى الضيف التحكم صراحة، تستأنفwaitبيئة تشغيل مساحة الأسماء نفسها لاحقًا. - يستدعي تراجع Plugin أو إلغاء تثبيته
clearCodeModeNamespacesForPlugin(pluginId)حتى لا تبقى العموميات القديمة بعد فشل تحميل Plugin.
tools.call(...).
شكل التسجيل
سجّل مساحات الأسماء من التكامل الذي يملك الأدوات الداعمة. أبقِ النطاق صغيرًا واعرض فقط أفعال المجال التي ترتبط بأدوات فهرس مصرّح بها.createCodeModeNamespaceTool(toolName, inputMapper) علامة على عضو النطاق
كدالة مساحة أسماء قابلة للاستدعاء. يتلقى inputMapper الاختياري وسائط الضيف
ويُرجع كائن الإدخال لأداة الفهرس الداعمة. دون مخطط إدخال، يُستخدم وسيط الضيف
الأول، أو {} عند حذفه.
تُرفض دوال المضيف الخام قبل تشغيل شيفرة الضيف:
الملكية والرؤية
ملكية مساحة الأسماء مرتبطة بـpluginId الخاص بمستدعي التسجيل.
requiredToolNames هي بوابة رؤية وفحص ملكية في الوقت نفسه:
- يجب أن تكون كل أداة مطلوبة موجودة في فهرس التشغيل
- يجب أن تكون لكل أداة مطلوبة
sourceName === pluginId - تُخفى مساحة الأسماء عند غياب أي أداة مطلوبة أو امتلاكها من Plugin آخر
- لا يجوز لكل مسار قابل للاستدعاء استهداف إلا أداة مسماة في
requiredToolNames
قواعد تسلسل النطاق
قد تُرجعcreateScope(ctx) كائنًا عاديًا يحتوي قيمًا متوافقة مع JSON ومصفوفات
وكائنات متداخلة وعلامات استدعاء createCodeModeNamespaceTool(...). لا تدخل
كائنات المضيف إلى QuickJS مباشرة أبدًا.
يرفض المسلسل:
- الدوال الخام
- رسومًا بيانية كائنية دائرية
- مقاطع المسار غير الآمنة:
__proto__أوconstructorأوprototypeأو المفاتيح الفارغة أو المفاتيح التي تحتوي فاصل المسار الداخلي - قيم
globalNameالتي ليست معرّفات JavaScript - تصادمات
globalNameمع عموميات وضع الشيفرة المدمجة مثلtoolsأوnamespacesأوtextأوjsonأوyield_controlأو__openclaw*
الموجهات
تُلحَقdescription الخاصة بمساحة الأسماء وprompt الاختيارية بمخطط exec
المرئي للنموذج فقط عندما تكون مساحة الأسماء مرئية لذلك التشغيل. استخدمها
لتعليم أصغر سطح مفيد:
التنظيف
مساحات الأسماء هي تسجيلات محلية للعملية. أزلها عندما يكون Plugin المالك معطلا أو ملغى تثبيته أو جرى التراجع عنه:clearCodeModeNamespacesForTest() لتجنب تسريب التسجيلات
عبر الحالات.
قائمة تحقق الاختبار
يجب أن تغطي تغييرات مساحة الأسماء حد الأمان وسلوك الضيف:- يظهر نص مطالبة مساحة الأسماء فقط عندما تكون الأدوات الداعمة مرئية
- الأدوات ذات الاسم نفسه من
sourceNameآخر لا تكشف مساحة الأسماء - تُرفض دوال النطاق الخام
- تُرفض معرفات مساحة الأسماء المزورة والمسارات المزورة
- لا يمكن للمسارات القابلة للاستدعاء استهداف أدوات غير مصرّح بها
- تُسلسل الكائنات المتداخلة والمراجع المشتركة بشكل صحيح
- تُنفذ استدعاءات مساحة الأسماء عبر أدوات الكتالوج وتعيد تفاصيل آمنة لـ JSON
- يمكن لرمز الضيف التقاط حالات الفشل
- تُستأنف استدعاءات مساحة الأسماء المعلقة عبر
wait - يؤدي التراجع عن Plugin إلى مسح تسجيلات مساحة الأسماء المالكة
tools.search / tools.call العام. استخدم
الكتالوج لأدوات OpenClaw وPlugin والعميل الممكنة عموما؛ واستخدم MCP لأدوات
MCP؛ واستخدم مساحات أسماء أخرى لواجهات API موثقة ومملوكة للـ Plugin ضمن نطاقات
مجالية، حيث تكون التعليمات البرمجية الموجزة أكثر موثوقية من عمليات البحث المتكررة في المخطط.
واجهة API للإخراج
يضيفtext(value) مخرجا قابلا للقراءة البشرية إلى مصفوفة output.
يضيف json(value) عنصر إخراج منظما بعد تسلسل متوافق مع JSON.
تصبح القيمة النهائية التي يرجعها رمز الضيف هي value في نتيجة completed.
عنصر الإخراج:
- ترتيب الإخراج يطابق استدعاءات الضيف
- الإخراج محدود بواسطة
maxOutputBytes - تُحوّل القيم غير القابلة للتسلسل إلى سلاسل نصية عادية أو أخطاء
- القيم الثنائية غير مدعومة في v1
- تنتقل الصور والملفات عبر أدوات OpenClaw العادية، لا عبر جسر وضع التعليمات البرمجية
كتالوج الأدوات
يتضمن الكتالوج المخفي الأدوات بعد تطبيق ترشيح السياسة الفعلي:- أدوات OpenClaw الأساسية.
- أدوات Plugin المضمنة.
- أدوات Plugin الخارجية.
- أدوات MCP.
- الأدوات المقدمة من العميل للتشغيل الحالي.
execwaittool_search_codetool_searchtool_describetool_call
ALL_TOOLS وtools.search(...) وtools.describe(...) وtools.call(...)
الموجهة للضيف إدخالات MCP. تحل مساحة الأسماء
MCP.<server>.<tool>({ ...input }) المولدة إلى معرف الكتالوج الدقيق ثم تُرسل عبر
مسار المنفذ نفسه.
تفاعل بحث الأدوات
يحل وضع التعليمات البرمجية محل سطح نموذج بحث أدوات OpenClaw للتشغيلات التي يكون فيها نشطا. عندما تكونtools.codeMode.enabled صحيحة وينشط وضع التعليمات البرمجية:
- لا يكشف OpenClaw
tool_search_codeأوtool_searchأوtool_describeأوtool_callكأدوات مرئية للنموذج. - تنتقل فكرة الفهرسة نفسها إلى داخل وقت تشغيل الضيف.
- يتلقى وقت تشغيل الضيف بيانات تعريف
ALL_TOOLSمضغوطة ومساعدات بحث ووصف واستدعاء للأدوات غير التابعة لـ MCP. - تستخدم استدعاءات MCP مساحة الأسماء
MCPالمولدة وترويسات$api()الخاصة بها بدلا منtools.call(...). - تُرسل الاستدعاءات المتداخلة عبر مسار منفذ OpenClaw نفسه الذي يستخدمه بحث الأدوات.
exec وwait.
أسماء الأدوات والتعارضات
أداةexec المرئية للنموذج هي أداة وضع التعليمات البرمجية. إذا كانت أداة OpenClaw
العادية للصدفة exec ممكنة، فستُخفى عن النموذج وتُفهرس مثل أي أداة أخرى.
داخل وقت تشغيل الضيف:
- يمكن لـ
tools.call("openclaw:core:exec", input)استدعاء أداة تنفيذ الصدفة إذا سمحت السياسة بذلك. - لا تُثبت
tools.exec(...)إلا إذا كان لإدخال كتالوج تنفيذ الصدفة اسم آمن غير ملتبس. - لا تكون أداة وضع التعليمات البرمجية
execمتاحة أبدا بصورة متكررة عبرtools.
tools.call(id, input).
تنفيذ الأدوات المتداخلة
يعبر كل استدعاء أداة متداخل جسر المضيف ويعيد الدخول إلى OpenClaw. يحافظ التنفيذ المتداخل على:- معرف العامل النشط
- معرف الجلسة ومفتاح الجلسة
- سياق المرسل والقناة
- سياسة صندوق العزل
- سياسة الموافقة
- خطافات Plugin
before_tool_call - إشارة الإجهاض
- تحديثات البث حيثما توفرت
- أحداث المسار والتدقيق
maxPendingToolCalls.
حالة وقت التشغيل
لكل تشغيل في وضع التعليمات البرمجية آلة حالات:running: ينفذ VM أو توجد استدعاءات متداخلة قيد التنفيذ.waiting: توجد لقطة VM ويمكن استئنافها باستخدامwait.completed: أُعيدت القيمة النهائية؛ حُذفت اللقطة.failed: أُعيد خطأ؛ حُذفت اللقطة.expired: تجاوزت اللقطة أو الحالة المعلقة مدة الاحتفاظ؛ لا يمكن الاستئناف.aborted: أُلغيت الجلسة/التشغيل الأب؛ حُذفت اللقطة.
wait من تشغيل أو جلسة مختلفة.
تخزين اللقطات محدود:
- الحد الأقصى لبايتات اللقطة لكل تشغيل
- الحد الأقصى للقطات الحية لكل عملية
- مدة بقاء اللقطة
- التنظيف عند نهاية التشغيل
- التنظيف عند إيقاف Gateway حيث لا يكون الاستمرار مدعوما
وقت تشغيل QuickJS-WASI
يحمّل OpenClawquickjs-wasi كتبعية مباشرة في الحزمة المالكة. لا يعتمد وقت التشغيل
على نسخة انتقالية مثبتة للوكيل أو PAC أو أي تبعيات أخرى غير ذات صلة.
مسؤوليات وقت التشغيل:
- ترجمة أو تحميل وحدة WebAssembly الخاصة بـ QuickJS-WASI
- إنشاء VM معزول واحد لكل تشغيل أو استئناف في وضع التعليمات البرمجية
- تسجيل استدعاءات المضيف بأسماء مستقرة
- تعيين حدود الذاكرة والمقاطعة
- تقييم JavaScript
- تفريغ المهام المعلقة
- أخذ لقطة لحالة VM المعلقة
- استعادة اللقطات من أجل
wait - التخلص من مقابض VM واللقطات بعد الحالات النهائية
TypeScript
دعم TypeScript هو تحويل مصدري فقط:- الإدخال المقبول: سلسلة تعليمات TypeScript واحدة
- الإخراج: سلسلة JavaScript يقيّمها QuickJS-WASI
- لا يوجد فحص أنواع
- لا يوجد حل للوحدات
- لا يوجد
importأوrequireفي v1 - تُعاد التشخيصات كنتائج
failed
حد الأمان
رمز النموذج عدائي. يستخدم وقت التشغيل دفاعا متعدد الطبقات:- تشغيل QuickJS-WASI خارج حلقة الأحداث الرئيسية
- تحميل
quickjs-wasiكتبعية مباشرة، لا عبر Codex أو حزمة انتقالية - لا نظام ملفات ولا شبكة ولا عملية فرعية ولا استيراد وحدات ولا متغيرات بيئة ولا كائنات مضيف عامة في الضيف
- استخدام حدود ذاكرة ومقاطعة QuickJS
- فرض مهلة زمنية حائطية للعملية الأب
- فرض حدود للإخراج واللقطات والسجلات والاستدعاءات المعلقة
- تسلسل قيم جسر المضيف عبر محول JSON ضيق
- تحويل أخطاء المضيف إلى أخطاء ضيف عادية، وليس إلى كائنات من نطاق المضيف أبدا
- إسقاط اللقطات عند المهلة أو الإجهاض أو نهاية الجلسة أو انتهاء الصلاحية
- رفض الوصول المتكرر إلى
execوwaitوأدوات التحكم في بحث الأدوات - منع تعارضات أسماء الملاءمة من حجب مساعدات الكتالوج
رموز الخطأ
Error الخاصة بالمضيف
ولا كائنات المكدس ولا النماذج الأولية ولا دوال المضيف إلى QuickJS.
القياسات
يبلغ وضع التعليمات البرمجية عن:- أسماء الأدوات المرئية المرسلة إلى النموذج
- حجم الكتالوج المخفي وتفصيل المصادر
- أعداد
execوwait - أعداد البحث والوصف والاستدعاء المتداخلة
- معرفات الأدوات المتداخلة المستدعاة
- حالات فشل حدود المهلة والذاكرة واللقطات والإخراج
- أحداث دورة حياة اللقطات
التصحيح
استخدم تسجيل نقل النموذج الموجه عندما يتصرف وضع التعليمات البرمجية بشكل مختلف عن تشغيل أداة عادي:OPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted.
يسجل هذا لقطة JSON محدودة ومنقحة لطلب النموذج؛ وينبغي استخدامه أثناء التصحيح فقط
لأن المطالبات ونص الرسائل قد تظل ظاهرة.
لتصحيح البث، استخدم OPENCLAW_DEBUG_SSE=peek لتسجيل أول خمسة أحداث SSE
منقحة. يفشل وضع التعليمات البرمجية أيضا بشكل مغلق إذا لم تحتو حمولة المزود النهائية
على exec وwait بالضبط بعد تفعيل سطح وضع التعليمات البرمجية.
تخطيط التنفيذ
وحدات التنفيذ:- عقد التكوين:
tools.codeMode - منشئ الكتالوج: الأدوات الفعلية إلى إدخالات مضغوطة وخريطة معرفات
- محول سطح النموذج: استبدال الأدوات المرئية بـ
execوwait - محول وقت تشغيل QuickJS-WASI: التحميل، التقييم، اللقطة، الاستعادة، التخلص
- مشرف العامل: المهلة، الإجهاض، عزل الانهيار
- محول الجسر: استدعاءات مضيف آمنة لـ JSON وتسليم النتائج
- محول TypeScript
- مخزن اللقطات: مدة البقاء، حدود الحجم، تحديد نطاق التشغيل/الجلسة
- إسقاط المسار لاستدعاءات الأدوات المتداخلة
- عدادات القياسات والتشخيصات
node:vm كصندوق عزل.
قائمة تحقق التحقق
يجب أن تثبت تغطية وضع التعليمات البرمجية:- يترك الإعداد المعطّل عرض الأدوات الحالي دون تغيير
- إعداد الكائن بدون
enabled: trueيترك وضع الكود معطّلاً - يعرض الإعداد المفعّل فقط
execوwaitللنموذج عندما تكون الأدوات نشطة للتشغيل - لا تؤدي التشغيلات الأولية بلا أدوات، و
disableTools، وقوائم السماح الفارغة إلى فرض حمولة وضع الكود - تظهر جميع الأدوات الفعالة غير MCP في
ALL_TOOLS - لا تظهر الأدوات المرفوضة في
ALL_TOOLS - تعمل
tools.searchوtools.describeوtools.callمع أدوات OpenClaw - يتيح
API.list("mcp")وAPI.read("mcp/<server>.d.ts")إعلانات MCP بنمط TypeScript دون جسر/استدعاء أداة - تبقى مساحة أسماء MCP
$api()متاحة كبديل احتياطي مضمن للمخططات - تعمل استدعاءات مساحة أسماء MCP للأدوات المرئية من MCP مع إدخال كائن واحد، بينما
لا تكون إدخالات كتالوج MCP المباشرة موجودة في
tools.* - تكون أدوات التحكم في Tool Search مخفية عن كل من سطح النموذج والكتالوج المخفي
- تحافظ الاستدعاءات المتداخلة على سلوك الموافقة والخطاف
- يكون shell
execمخفيًا عن النموذج لكن يمكن استدعاؤه عبر معرّف الكتالوج عند السماح بذلك - لا يمكن استدعاء
execوwaitالمتكررين في وضع الكود من كود الضيف - يتم تحويل إدخال TypeScript وتقييمه دون تحميل TypeScript في المسارات المعطّلة أو الخاصة بـ JavaScript فقط
- يفشل الوصول إلى
importوrequireونظام الملفات والشبكة والبيئة - تنتهي الحلقات اللانهائية بمهلة ولا يمكنها حظر Gateway
- تنهي حالات فشل حد الذاكرة VM الضيف
- يتم فرض حدود الإخراج واللقطات للاستدعاءات المكتملة والمعلّقة
- يستأنف
waitلقطة معلّقة ويعيد القيمة النهائية - تفشل قيم
runIdالمنتهية الصلاحية، والمُجهضة، وذات الجلسة الخاطئة، والمجهولة - تحافظ إعادة تشغيل النص والمثابرة على استدعاءات التحكم في وضع الكود
- يعرض النص والقياسات استدعاءات الأدوات المتداخلة بوضوح
خطة اختبار E2E
شغّل هذه كاختبارات تكامل أو اختبارات شاملة عند تغيير وقت التشغيل:- ابدأ Gateway مع
tools.codeMode.enabled: false. - أرسل دورة وكيل مع مجموعة أدوات مباشرة صغيرة.
- تحقق من أن الأدوات المرئية للنموذج لم تتغير.
- أعد التشغيل مع
tools.codeMode.enabled: true. - أرسل دورة وكيل مع أدوات اختبار OpenClaw وPlugin وMCP والعميل.
- تحقق من أن قائمة الأدوات المرئية للنموذج هي بالضبط
execوwait. - في
exec، اقرأALL_TOOLSوتحقق من وجود أدوات الاختبار الفعالة. - في
exec، استدع أدوات OpenClaw/Plugin/العميل عبرtools.search، وtools.describe، وtools.call. - في
exec، استدعAPI.list("mcp")وAPI.read("mcp/<server>.d.ts")وتحقق من أن ملفات الإعلان تصف أدوات MCP المرئية. - في
exec، استدع أدوات MCP عبرMCP.<server>.<tool>({ ...input })وتحقق من أن إدخالات كتالوج MCP المباشرة غير موجودة فيALL_TOOLSوtools.*. - تحقق من أن الأدوات المرفوضة غير موجودة ولا يمكن استدعاؤها بمعرّف مُخمّن.
- ابدأ استدعاء أداة متداخلاً يكتمل بعد أن يعيد
execالقيمةwaiting. - استدع
waitوتحقق من أن VM المستعاد يتلقى نتيجة الأداة. - تحقق من أن الإجابة النهائية تحتوي على إخراج تم إنتاجه بعد الاستعادة.
- تحقق من أن المهلة والإجهاض وانتهاء صلاحية اللقطة تنظف حالة وقت التشغيل.
- صدّر المسار وتحقق من أن الاستدعاءات المتداخلة مرئية تحت استدعاء وضع الكود الأصل.
pnpm check:docs.