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):- Exit कोड:
2 - कारण stderr (stdout नहीं) में लिखा गया है
- Exit कोड:
0 - खाली stdout
allow(message) एक पॉलिसी को Claude को सूचनात्मक संदर्भ भेजने देता है भले ही ऑपरेशन की अनुमति हो। हुक हैंडलर निम्नलिखित JSON को stdout में लिखता है (कॉन्फ़िग फ़ाइल में नहीं — यह Claude Code को हैंडलर की प्रतिक्रिया है, अस्वीकार करें और निर्देशित करें प्रतिक्रिया की तरह):
- Exit कोड:
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, exit 0)।
बिल्ट-इन पॉलिसीज़
src/hooks/builtin-policies.ts सभी 26 बिल्ट-इन पॉलिसीज़ को 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 - तेजी से प्रारंभिक लोड, डेटा फेचिंग के लिए कोई क्लाइंट बंडल नहीं।
- क्लाइंट घटक केवल जहां इंटरएक्टिविटी आवश्यक है (पॉलिसी टॉगल, गतिविधि खोज, लॉग दर्शक)।

