HookRegistry في
نظرة عامة على الواجهة البرمجية.
حواجز حماية المدخلات والمخرجات
createAgent({ guardrails }) (أو ExecuteOptions.guardrails) يفحص التشغيل عند
ثلاث نقاط، وتُنفَّذ كل قائمة بالترتيب:
حاجز الحماية هو
{ name, check(ctx) }. يحتوي ctx على kind ('input' أو 'output'
أو 'tool')، وtext، وmessages الخاصة بالتشغيل، وtoolName وargs في حالة استدعاء
أداة، وsignal الخاصة بالتشغيل. تُعيد check (مباشرةً أو عبر وعد) { ok: true }
أو { ok: false, reason, action?, replacement? }:
action: 'block'(القيمة الافتراضية) ينهي التشغيل بـfinishReason: 'guardrail'وبـresult.guardrail({ name, kind, reason, toolName? }). تكون قيمةresult.textهي''ولا يُضاف الرد المحظور إلى سجل المحادثة؛ واستدعاء الأداة المحظور لا يُنفَّذ (ولا الاستدعاءات التي تليه في تلك الدورة) ويحصل على نتيجة “cancelled”، فيبقى سجل المحادثة صالحًا. ويُصدرstream()الحدثguardrail.trippedقبلrun.done.action: 'rewrite'يضعreplacementمكان النص (وفي معاملات استدعاء الأداة:replacementهو المعاملات الجديدة بصيغة JSON)، ويرى حاجز الحماية التالي النص الجديد، ويُصدرstream()الحدثguardrail.rewrote.
onTripped: 'throw' يؤدي الحظر إلى رفض الوعد بالخطأ GuardrailError
(LOUSHO_GUARDRAIL_TRIPPED، ومعه guardrail نفسه) بدلًا من ذلك. وإذا رمت check
استثناءً فشل التشغيل. يشغّل الوكلاء الفرعيون حواجز حماية الوكيل الأب، ثم
حواجزهم هم. وتذكر ملفات مواصفات الوكيل حواجز الحماية المضمَّنة بأسمائها في policy.guardrails (راجع الإعدادات).
حواجز حماية الرقع
runGuardrails(action, guardrails) ينفّذ كل الفحوص بالتزامن على رقعة
مقترحة ويجمع النتائج في حكم واحد. يستخدمه
مثال ops-pipeline لفحص رقعة وكيل
الإصلاح قبل فتح طلب سحب (pull request):
الإغلاق عند الفشل (fail-closed). حاجز الحماية الذي يرمي استثناءً، أو يُرفض وعده، أو لا يُحسم ضمن
مهلته (30 ثانية افتراضيًا)، أو يُحسم بأي شيء غير
pass: true يُعدّ
فاشلًا: runGuardrailSafely(guardrail, action) يغلّف كل حاجز. وحاجز الأمر
يقتل عمليته حين تنقضي المهلة (وعلى Windows، شجرة العمليات
كلها). اكتب حاجزك الخاص في صورة { name, check(action) } تُعيد
{ pass, reason? }.
الأدوات المعزولة
تختار الأداة العمل في بيئة معزولة بتحديدrequiresSandbox: true وتوفير الدالة sandboxExecute(args, sandbox).
عندها يستدعي المنفّذ sandboxExecute ومعها SandboxAdapter الخاص
بالتشغيل بدل أن يستدعي execute:
NoopSandbox(الافتراضي) يعمل على المستضيف. إنه بديل شكلي وليس عزلًا.SubprocessSandboxينفّذ كل أمر في حاوية Docker جديدة، معزولة عن الشبكة وتُزال تلقائيًا، ولا يُوصَل بها أي مجلد من المستضيف سوىcwdالذي تمرّره. يحتاج إلى خدمة Docker (daemon) قيد التشغيل وإلى الاعتمادية النظيرة الاختياريةdockerode(npm install dockerode@^5.0.1؛ تُحمَّل عند أول استخدام). وعند إلغاء التشغيل (run.abort()أوsignal) أو انقضاء مهلة الأمر، تُقتل الحاوية وتُزال.- نفّذ الواجهة
SandboxAdapter(nameوrun(cmd, args, opts)وwriteFile(path, content)) لدعم نظام خلفي آخر.
SandboxShell أداة الصدفة (shell) في مساحة العمل خلف المحوّل
نفسه؛ راجع أدوات مساحة العمل.