title: आर्किटेक्चर description: “हुक हैंडलर, कॉन्फ़िग लोडिंग, और पॉलिसी मूल्यांकन आंतरिक रूप से कैसे काम करते हैं” icon: sitemap
यह दस्तावेज़ बताता है कि failproofai आंतरिक रूप से कैसे काम करता है: हुक सिस्टम एजेंट टूल कॉल को कैसे इंटरसेप्ट करता है, कॉन्फ़िग कैसे लोड और मर्ज किया जाता है, पॉलिसीज़ का मूल्यांकन कैसे होता है, और डैशबोर्ड एजेंट गतिविधि को कैसे मॉनिटर करता है।अवलोकन
failproofai के दो स्वतंत्र सबसिस्टम हैं:- हुक हैंडलर - एक तेज़ CLI सबप्रोसेस जिसे Claude Code हर एजेंट टूल कॉल पर आमंत्रित करता है। पॉलिसीज़ का मूल्यांकन करता है और एक निर्णय लौटाता है।
- एजेंट मॉनिटर (डैशबोर्ड) - एजेंट सेशन मॉनिटर करने और पॉलिसीज़ प्रबंधित करने के लिए एक Next.js वेब एप्लीकेशन।
~/.failproofai/ और प्रोजेक्ट की .failproofai/ डायरेक्टरी में कॉन्फ़िग फाइलें साझा करते हैं, लेकिन वे अलग प्रक्रियाओं के रूप में चलते हैं और केवल फाइलसिस्टम के माध्यम से संचार करते हैं।
हुक हैंडलर
Claude Code के साथ एकीकरण
जब आपfailproofai policies --install चलाते हैं, तो यह ~/.claude/settings.json में इस तरह की एंट्रीज़ लिखता है:
failproofai --hook PreToolUse को आमंत्रित करता है, stdin पर एक JSON पेलोड पास करता है।
पेलोड प्रारूप
PostToolUse इवेंट्स के लिए, पेलोड में टूल के आउटपुट के साथ tool_result भी होता है।
हैंडलर 1 MB stdin सीमा लागू करता है। इस सीमा से अधिक पेलोड को त्याग दिया जाता है और सभी पॉलिसीज़ निहित रूप से अनुमति देती हैं।
प्रतिक्रिया प्रारूप
अस्वीकार (PreToolUse):- एक्जिट कोड:
2 - कारण stderr में लिखा जाता है (stdout में नहीं)
- एक्जिट कोड:
0 - खाली stdout
allow(message) एक पॉलिसी को ऑपरेशन की अनुमति देते समय भी Claude को सूचनात्मक संदर्भ भेजने देता है। हुक हैंडलर stdout में निम्नलिखित JSON लिखता है (कॉन्फ़िग फाइल में नहीं — यह हैंडलर की 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 घोषित करती हैं। पॉलिसी मूल्यांकनकर्ता fn को कॉल करने से पहले हल किए गए मूल्यों को ctx.params में इंजेक्ट करता है। पॉलिसी फ़ंक्शन ctx.params को पढ़ते हैं null-गार्डिंग के बिना क्योंकि डिफ़ॉल्ट्स हमेशा पहले लागू होते हैं।
पॉलिसीज़ के अंदर पैटर्न मिलान पार्स किए गए कमांड टोकन (argv) का उपयोग करता है, कच्ची स्ट्रिंग मिलान नहीं। यह शेल ऑपरेटर इंजेक्शन के माध्यम से बाईपास को रोकता है (उदाहरण के लिए, 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 अभी भी आगे की कस्टम पॉलिसीज़ को शॉर्ट-सर्किट करता है (लेकिन इस बिंदु पर सभी बिल्ट-इन्स पहले ही चल चुकी हैं)।
गतिविधि लॉगिंग
प्रत्येक हुक इवेंट के बाद, हैंडलर~/.failproofai/hook-activity.jsonl में एक 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 - CRUD ऑपरेशन्स के लिए कोई REST API आवश्यक नहीं।
- पढ़ने वाले पेजों के लिए React Server Components - तेज़ प्रारंभिक लोड, डेटा फेचिंग के लिए कोई क्लाइंट बंडल नहीं।
- क्लाइंट कंपोनेंट्स केवल जहां इंटरएक्टिविटी आवश्यक है (पॉलिसी टॉगल्स, गतिविधि खोज, लॉग व्यूअर)।

