title: البنية المعمارية description: “كيفية عمل معالج الخطاف وتحميل الإعدادات وتقييم السياسات بشكل داخلي” icon: sitemap
تشرح هذه الوثيقة كيفية عمل failproofai داخليًا: كيف يعترض نظام الخطاف استدعاءات أدوات الوكيل، وكيف يتم تحميل الإعدادات ودمجها، وكيف يتم تقييم السياسات، وكيف تراقب لوحة المعلومات نشاط الوكيل.نظرة عامة
يحتوي failproofai على نظامين فرعيين مستقلين:- معالج الخطاف - عملية CLI سريعة يستدعيها Claude Code على كل استدعاء لأداة وكيل. يقيّم السياسات ويعيد قرارًا.
- مراقب الوكيل (لوحة المعلومات) - تطبيق ويب Next.js لمراقبة جلسات الوكيل وإدارة السياسات.
~/.failproofai/ ودليل المشروع .failproofai/، لكنهما يعملان كعمليات منفصلة ولا يتواصلان إلا عبر نظام الملفات.
معالج الخطاف
التكامل مع Claude Code
عند تشغيلfailproofai policies --install، يكتب إدخالات مثل هذه في ~/.claude/settings.json:
failproofai --hook PreToolUse كعملية فرعية قبل كل استدعاء أداة، ويمرر حمولة JSON على stdin.
تنسيق الحمولة
PostToolUse، تحتوي الحمولة أيضًا على tool_result بمخرجات الأداة.
يفرض المعالج حد أقصى بحجم 1 ميجابايت على stdin. يتم تجاهل الحمولات التي تتجاوز هذا الحد وتسمح جميع السياسات ضمنيًا.
تنسيق الاستجابة
رفض (PreToolUse):- رمز الخروج:
2 - السبب المكتوب على stderr (وليس stdout)
- رمز الخروج:
0 - stdout فارغ
allow(message) لسياسة بإرسال سياق معلومات مرة أخرى إلى Claude حتى عند السماح بالعملية. يكتب معالج الخطاف JSON التالي إلى stdout (وليس ملف إعدادات — هذه هي استجابة المعالج لـ Claude Code، تمامًا مثل استجابات الرفض والتعليمات أعلاه):
- رمز الخروج:
0(العملية مسموح بها) - عند إرجاع عدة سياسات
allowمع رسالة، يتم دمج رسائلها مع فواصل أسطر في سلسلةadditionalContextواحدة - إذا لم توفر أي سياسة رسالة، يكون stdout فارغًا (كما هو الحال من قبل)
خط أنابيب المعالجة
تنفذsrc/hooks/handler.ts خط الأنابيب الكامل:
تحميل الإعدادات
تنفذsrc/hooks/hooks-config.ts تحميل الإعدادات ثلاثي النطاق.
enabledPolicies- اتحاد مخصص عبر جميع الملفات الثلاثةpolicyParams- لكل سياسة، الملف الأول الذي يحددها يفوز بالكاملcustomPoliciesPath- الملف الأول الذي يحددها يفوزllm- الملف الأول الذي يحددها يفوز
readHooksConfig() (عام فقط) للقراءة والكتابة، حيث لا يتم استدعاؤها مع cwd مشروع.
تقييم السياسة
تشغيلsrc/hooks/policy-evaluator.ts السياسات بالترتيب.
لكل سياسة:
- ابحث عن مخطط
paramsالخاص بالسياسة (إن وجد). - اقرأ
policyParams[policy.name]من الإعدادات المدمجة. - دمج القيم المتوفرة من المستخدم فوق الافتراضيات الخاصة بالمخطط لإنتاج
ctx.params. - استدعِ
policy.fn(ctx)مع السياق المحل. - إذا كانت النتيجة
deny، توقف فورًا وأعد هذا القرار. - إذا كانت النتيجة
instruct، جمّع الرسالة وتابع. - إذا كانت النتيجة
allow، انتقل إلى السياسة التالية.
- إذا تم إرجاع أي
deny، صدر استجابة الرفض. - إذا تم جمع أي استجابات
instruct، أصدر استجابة تعليمات واحدة مع دمج جميع الرسائل. - بخلاف ذلك، أصدر استجابة سماح (stdout فارغ، الخروج 0).
السياسات المدمجة
تحددsrc/hooks/builtin-policies.ts جميع 39 سياسة مدمجة كائنات BuiltinPolicyDefinition:
params بـ PolicyParamsSchema مع الأنواع والقيم الافتراضية لكل معامل. يدرج محيّم السياسة القيم المحلولة في ctx.params قبل استدعاء fn. تقرأ دوال السياسة ctx.params دون حماية فارغة لأن الافتراضيات يتم تطبيقها دائمًا أولاً.
يستخدم تطابق النمط داخل السياسات رموز الأوامر المحللة (argv)، وليس مطابقة السلسلة الخام. هذا يمنع الالتفاف عبر حقن مشغلات shell (على سبيل المثال، نمط لـ sudo systemctl status * لا يمكن التفافه عن طريق إضافة ; rm -rf / إلى الأمر).
السياسات المخصصة
تنفذsrc/hooks/custom-hooks-registry.ts سجل مدعوم بـ globalThis:
src/hooks/custom-hooks-loader.ts ملف السياسة الخاص بالمستخدم:
- اقرأ
customPoliciesPathمن الإعدادات؛ تخطَّ إذا كان غائبًا. - حل إلى مسار مطلق؛ تحقق من وجود الملف.
- أعد كتابة جميع استيرادات
from "failproofai"إلى مسار dist الفعلي بحيث يتم حلcustomPoliciesإلى سجلglobalThisنفسه. - أعد كتابة الاستيرادات المحلية الانتقالية بشكل متكرر لضمان التوافق مع ESM.
- اكتب ملفات
.mjsمؤقتة وimport()ملف الإدخال. - استدعِ
getCustomHooks()لاسترجاع الخطافات المسجلة. - نظف جميع الملفات المؤقتة في كتلة
finally.
~/.failproofai/hook.log ويعيد المحمل مصفوفة فارغة. السياسات المدمجة لم تتأثر.
يتم تقييم السياسات المخصصة بعد جميع السياسات المدمجة. لا يزال deny السياسة المخصصة يختصر السياسات المخصصة الإضافية (لكن جميع المدمجة قد عملت بالفعل في هذه المرحلة).
تسجيل النشاط
بعد كل حدث خطاف، يضيف المعالج سطر JSONL إلى~/.failproofai/hook-activity.jsonl:
بنية لوحة المعلومات
لوحة المعلومات عبارة عن تطبيق Next.js 16 يستخدم App Router مع React Server Components و Server Actions.- تستدعي مكونات الصفحة
lib/projects.tsوlib/log-entries.tsلقراءة بيانات المشروع/الجلسة مباشرة من نظام الملفات (لا توجد طبقة API للقراءات). - تستخدم صفحة السياسات Server Actions لجميع التغييرات (تبديل، تحديث المعاملات، التثبيت/الإزالة).
- يحلل عارض الجلسة تنسيق نصوص JSONL الخاص بـ Claude ويرسم خط زمني للرسائل واستدعاءات الأدوات.
- لا قاعدة بيانات - جميع الحالات الدائمة موجودة في ملفات عادية (
~/.failproofai/,~/.claude/projects/). - Server Actions للتغييرات - لا توجد حاجة إلى REST API لعمليات CRUD.
- React Server Components لصفحات القراءة - تحميل أسرع للبداية، لا توجد حزمة عميل لجلب البيانات.
- مكونات العميل فقط حيث تكون التفاعلية مطلوبة (تبديلات السياسة، البحث عن النشاط، عارض السجل).

