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. يتم تجاهل الحمولات التي تتجاوز هذا الحد وجميع السياسات تسمح بشكل ضمني.
تنسيق الاستجابة
Deny (PreToolUse):- رمز الخروج:
2 - السبب المكتوب إلى stderr (وليس stdout)
- رمز الخروج:
0 - stdout فارغ
allow(message) يسمح لسياسة بإرسال سياق معلوماتي مرة أخرى إلى Claude حتى عند السماح بالعملية. يكتب معالج الخطاف JSON التالي إلى stdout (وليس ملف إعدادات — هذه هي استجابة المعالج إلى Claude Code، تماماً مثل استجابات deny و instruct أعلاه):
- رمز الخروج:
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، أرسل استجابة deny. - إذا تم جمع أي استجابات
instruct، أرسل استجابة instruct واحدة مع دمج جميع الرسائل. - بخلاف ذلك، أرسل استجابة allow (stdout فارغ، خروج 0).
السياسات المدمجة
src/hooks/builtin-policies.ts يعرّف جميع السياسات المدمجة الـ 26 كائنات BuiltinPolicyDefinition:
params تعلن عن PolicyParamsSchema مع أنواع وافتراضيات لكل معامل. يُدرج مُقيّم السياسة القيم المحلولة في ctx.params قبل استدعاء fn. تقرأ دوال السياسة ctx.params دون حماية null لأن الافتراضيات يتم تطبيقها دائماً أولاً.
يستخدم مطابقة الأنماط داخل السياسات رموز الأوامر المحللة (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 لجميع الطفرات (تبديل، تحديث المعاملات، التثبيت/الإزالة).
- عارض الجلسة يحلل تنسيق نسخة Claude JSONL ويعرض جدول زمني للرسائل واستدعاءات الأدوات.
- لا توجد قاعدة بيانات - جميع الحالة المستمرة موجودة في ملفات عادية (
~/.failproofai/,~/.claude/projects/). - Server Actions للطفرات - لا حاجة لـ REST API لعمليات CRUD.
- React Server Components لصفحات القراءة - حمل أولي أسرع، بدون حزمة عميل لجلب البيانات.
- مكونات العميل فقط حيث تكون التفاعلية مطلوبة (تبديل السياسة، بحث النشاط، عارض السجل).

