title: ארכיטקטורה description: “כיצד מטפל ה-hook, טעינת ההגדרות והערכת המדיניות עובדים באופן פנימי” icon: sitemap
מסמך זה מסביר כיצד failproofai עובד באופן פנימי: כיצד מערכת ה-hook מיירטת קריאות כלים של סוכנים, כיצד הגדרות נטענות ומתמזגות, כיצד מדיניות מוערכת, וכיצד לוח הבקרה עוקב אחרי פעילות סוכנים.סקירה כללית
ל-failproofai יש שתי תת-מערכות עצמאיות:- מטפל Hook - תת-תהליך CLI מהיר שClaude Code מפעיל בכל קריאת כלי סוכן. מעריך מדיניות ומחזיר החלטה.
- Agent Monitor (Dashboard) - יישום Next.js לניטור של סשנים של סוכנים וניהול מדיניות.
~/.failproofai/ ובתיקייה .failproofai/ של הפרויקט, אך הן פועלות כתהליכים נפרדים ותקשרות רק דרך מערכת הקבצים.
מטפל Hook
שילוב עם Claude Code
כאשר אתה מריץfailproofai policies --install, הוא כותב ערכים כמו זה לתוך ~/.claude/settings.json:
failproofai --hook PreToolUse כתת-תהליך לפני כל קריאת כלי, תוך העברת מטען JSON ל-stdin.
פורמט מטען
PostToolUse, המטען מכיל גם tool_result עם הפלט של הכלי.
המטפל אוכף מגבלת stdin של 1 MB. מטענים החוצים זאת מושלכים וכל מדיניות מאפשרת באופן מובנה.
פורמט תجובה
Deny (PreToolUse):- קוד יציאה:
2 - סיבה כתובה ל-stderr (לא stdout)
- קוד יציאה:
0 - stdout ריק
allow(message) מאפשר למדיניות לשלוח הקשר מידע חזור ל-Claude גם כאשר הפעולה מורשית. מטפל ה-hook כותב את ה-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-backed:
src/hooks/custom-hooks-loader.ts טוען את קובץ המדיניות של המשתמש:
- קרא את
customPoliciesPathמהגדרות; דלג אם היעדר. - פתור לנתיב מוחלט; בדוק שהקובץ קיים.
- כתוב מחדש את כל
from "failproofai"כדי להסב לנתיב dist בפועל כךcustomPoliciesמתפתר לרישוםglobalThisזהה. - כתוב מחדש רקורסיבי יבוא מקומי חולף כדי להבטיח תאימות ESM.
- כתוב קבצי
.mjsזמניים ו-import()הקובץ הכניסה. - קרא ל-
getCustomHooks()כדי לאחזר hooks שנרשמו. - נקה את כל הקבצים הזמניים בבלוק
finally.
~/.failproofai/hook.log והטוען מחזיר מערך ריק. מדיניות מובנית אינה מושפעת.
מדיניות מותאמת אישית מוערכת לאחר כל מדיניות מובנית. מדיניות מותאמת אישית deny עדיין קוצרת מדיניות מותאמת אישית נוספת (אך כל הביומיניות כבר רצות בנקודה זו).
רישום פעילות
לאחר כל אירוע hook, המטפל מצרף שורת 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 לכל מוטציות (toggle, params update, install/remove).
- מציג הסשן מנתח את פורמט התמלילון JSONL של Claude ומרנדר ציר זמן של הודעות וקריאות כלים.
- אין בסיס נתונים - כל מצב מתמשך הוא בקבצים רגילים (
~/.failproofai/,~/.claude/projects/). - Server Actions למוטציות - אין צורך ב-REST API עבור פעולות CRUD.
- React Server Components עבור עמודי קריאה - טעינה ראשונית מהירה יותר, אין חבילת לקוח עבור הבאת נתונים.
- רכיבים לקוח רק כאשר יש צורך באינטראקטיביות (toggles מדיניות, חיפוש פעילות, מציג יומן).

