failproofai 0.0.5 → 0.0.6-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/.next/standalone/.failproofai/policies/review-policies.mjs +112 -0
  2. package/.next/standalone/.failproofai/policies/workflow-policies.mjs +2 -1
  3. package/.next/standalone/.next/BUILD_ID +1 -1
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  5. package/.next/standalone/.next/prerender-manifest.json +3 -3
  6. package/.next/standalone/.next/required-server-files.json +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
  8. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  9. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  13. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  14. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  15. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  16. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  17. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  18. package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
  19. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  20. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  23. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  24. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  25. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  26. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
  27. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  28. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  29. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  30. package/.next/standalone/.next/server/app/index.html +1 -1
  31. package/.next/standalone/.next/server/app/index.rsc +15 -15
  32. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  33. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  34. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  35. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
  36. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  37. package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
  38. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  39. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/policies/page/build-manifest.json +2 -2
  42. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
  43. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +2 -2
  46. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  47. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +2 -2
  50. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  51. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  52. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/projects/page/build-manifest.json +2 -2
  55. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  56. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g72weg._.js +1 -1
  59. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
  60. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
  61. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
  62. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
  63. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
  64. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
  65. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0a~g15g._.js → [root-of-the-server]__0rh.18_._.js} +2 -2
  66. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +6 -6
  67. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0qn95h3._.js → [root-of-the-server]__0~kmh8w._.js} +2 -2
  68. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
  69. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
  70. package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
  71. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
  72. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
  73. package/.next/standalone/.next/server/middleware-build-manifest.js +5 -5
  74. package/.next/standalone/.next/server/pages/404.html +2 -2
  75. package/.next/standalone/.next/server/pages/500.html +1 -1
  76. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
  78. package/.next/standalone/.next/static/chunks/{0sme4lkv.tgn-.js → 01b~z8f1ws0rk.js} +1 -1
  79. package/.next/standalone/.next/static/chunks/{0lgbwkfqmnsmc.js → 03rz6ykw-a2xi.js} +1 -1
  80. package/.next/standalone/.next/static/chunks/{17manv47o-~wp.js → 08t08igdql9yt.js} +1 -1
  81. package/.next/standalone/.next/static/chunks/09_k80d~cq2wg.js +4 -0
  82. package/.next/standalone/.next/static/chunks/{0ksdlt_1hucdm.js → 0bvhsa6zva2o..js} +1 -1
  83. package/.next/standalone/.next/static/chunks/{09ikntpt2-o9b.js → 0gbf4cphy8ksq.js} +1 -1
  84. package/.next/standalone/.next/static/chunks/{0yumumfzx_f27.js → 0v.yd0kg_ld3r.js} +1 -1
  85. package/.next/standalone/.next/static/chunks/{13juklu.vksks.js → 0wlyoif4_kj_t.js} +1 -1
  86. package/.next/standalone/.next/static/chunks/{09e7drilkf1sn.js → 12simlrcfk3g2.js} +1 -1
  87. package/.next/standalone/.next/static/chunks/{0em7tspi4kylh.js → 12~yi9oj8av8p.js} +2 -2
  88. package/.next/standalone/.next/static/chunks/{turbopack-0r26pc8h0y_-e.js → turbopack-0o7k.hakttp4k.js} +1 -1
  89. package/.next/standalone/CHANGELOG.md +13 -0
  90. package/.next/standalone/README.md +2 -2
  91. package/.next/standalone/bun.lock +43 -85
  92. package/.next/standalone/dist/cli.mjs +107 -3
  93. package/.next/standalone/docs/ar/architecture.mdx +65 -64
  94. package/.next/standalone/docs/ar/configuration.mdx +42 -42
  95. package/.next/standalone/docs/ar/custom-policies.mdx +62 -64
  96. package/.next/standalone/docs/built-in-policies.mdx +37 -0
  97. package/.next/standalone/docs/custom-policies.mdx +1 -1
  98. package/.next/standalone/docs/de/architecture.mdx +92 -92
  99. package/.next/standalone/docs/de/configuration.mdx +34 -34
  100. package/.next/standalone/docs/de/custom-policies.mdx +49 -50
  101. package/.next/standalone/docs/es/architecture.mdx +72 -72
  102. package/.next/standalone/docs/es/configuration.mdx +25 -25
  103. package/.next/standalone/docs/es/custom-policies.mdx +48 -49
  104. package/.next/standalone/docs/examples.mdx +54 -0
  105. package/.next/standalone/docs/fr/architecture.mdx +53 -53
  106. package/.next/standalone/docs/fr/configuration.mdx +25 -25
  107. package/.next/standalone/docs/fr/custom-policies.mdx +42 -43
  108. package/.next/standalone/docs/getting-started.mdx +52 -0
  109. package/.next/standalone/docs/he/architecture.mdx +66 -66
  110. package/.next/standalone/docs/he/configuration.mdx +53 -52
  111. package/.next/standalone/docs/he/custom-policies.mdx +72 -73
  112. package/.next/standalone/docs/hi/architecture.mdx +106 -106
  113. package/.next/standalone/docs/hi/configuration.mdx +39 -39
  114. package/.next/standalone/docs/hi/custom-policies.mdx +75 -76
  115. package/.next/standalone/docs/i18n/README.ar.md +66 -66
  116. package/.next/standalone/docs/i18n/README.de.md +38 -38
  117. package/.next/standalone/docs/i18n/README.es.md +38 -38
  118. package/.next/standalone/docs/i18n/README.fr.md +42 -42
  119. package/.next/standalone/docs/i18n/README.he.md +67 -67
  120. package/.next/standalone/docs/i18n/README.hi.md +70 -70
  121. package/.next/standalone/docs/i18n/README.it.md +62 -62
  122. package/.next/standalone/docs/i18n/README.ja.md +54 -54
  123. package/.next/standalone/docs/i18n/README.ko.md +58 -58
  124. package/.next/standalone/docs/i18n/README.pt-br.md +43 -43
  125. package/.next/standalone/docs/i18n/README.ru.md +69 -69
  126. package/.next/standalone/docs/i18n/README.tr.md +76 -76
  127. package/.next/standalone/docs/i18n/README.vi.md +70 -70
  128. package/.next/standalone/docs/i18n/README.zh.md +52 -52
  129. package/.next/standalone/docs/it/architecture.mdx +54 -53
  130. package/.next/standalone/docs/it/configuration.mdx +44 -45
  131. package/.next/standalone/docs/it/custom-policies.mdx +76 -78
  132. package/.next/standalone/docs/ja/architecture.mdx +93 -93
  133. package/.next/standalone/docs/ja/configuration.mdx +47 -47
  134. package/.next/standalone/docs/ja/custom-policies.mdx +62 -63
  135. package/.next/standalone/docs/ko/architecture.mdx +66 -66
  136. package/.next/standalone/docs/ko/configuration.mdx +35 -35
  137. package/.next/standalone/docs/ko/custom-policies.mdx +71 -72
  138. package/.next/standalone/docs/pt-br/architecture.mdx +55 -55
  139. package/.next/standalone/docs/pt-br/configuration.mdx +35 -35
  140. package/.next/standalone/docs/pt-br/custom-policies.mdx +60 -61
  141. package/.next/standalone/docs/ru/architecture.mdx +59 -60
  142. package/.next/standalone/docs/ru/configuration.mdx +52 -53
  143. package/.next/standalone/docs/ru/custom-policies.mdx +68 -69
  144. package/.next/standalone/docs/tr/architecture.mdx +124 -124
  145. package/.next/standalone/docs/tr/configuration.mdx +45 -46
  146. package/.next/standalone/docs/tr/custom-policies.mdx +75 -75
  147. package/.next/standalone/docs/vi/architecture.mdx +65 -64
  148. package/.next/standalone/docs/vi/configuration.mdx +41 -41
  149. package/.next/standalone/docs/vi/custom-policies.mdx +68 -69
  150. package/.next/standalone/docs/zh/architecture.mdx +67 -67
  151. package/.next/standalone/docs/zh/configuration.mdx +34 -34
  152. package/.next/standalone/docs/zh/custom-policies.mdx +53 -54
  153. package/.next/standalone/node_modules/@next/env/package.json +1 -1
  154. package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
  155. package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +7 -7
  156. package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
  157. package/.next/standalone/node_modules/next/dist/server/config-schema.js +10 -2
  158. package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
  159. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
  160. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
  161. package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
  162. package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
  163. package/.next/standalone/node_modules/next/dist/server/render.js +27 -20
  164. package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
  165. package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
  166. package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
  167. package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
  168. package/.next/standalone/node_modules/next/package.json +15 -15
  169. package/.next/standalone/package.json +2 -2
  170. package/.next/standalone/server.js +1 -1
  171. package/.next/standalone/src/hooks/builtin-policies.ts +131 -0
  172. package/README.md +2 -2
  173. package/dist/cli.mjs +107 -3
  174. package/package.json +2 -2
  175. package/src/hooks/builtin-policies.ts +131 -0
  176. package/.next/standalone/.next/static/chunks/0_yayar~bpphd.js +0 -4
  177. /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → CkmOT-ZvDN-sVULinGVKT}/_buildManifest.js +0 -0
  178. /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → CkmOT-ZvDN-sVULinGVKT}/_clientMiddlewareManifest.js +0 -0
  179. /package/.next/standalone/.next/static/{hYQM6iCWnF1W5XDpsIRhV → CkmOT-ZvDN-sVULinGVKT}/_ssgManifest.js +0 -0
@@ -2,22 +2,22 @@
2
2
 
3
3
  ---
4
4
  title: आर्किटेक्चर
5
- description: "हुक हैंडलर, कॉन्फ़िग लोडिंग, और पॉलिसी मूल्यांकन आंतरिक रूप से कैसे काम करते हैं"
5
+ description: "हुक हैंडलर, कॉन्फ़िगरेशन लोडिंग और पॉलिसी मूल्यांकन आंतरिक रूप से कैसे काम करते हैं"
6
6
  icon: sitemap
7
7
  ---
8
8
 
9
- यह दस्तावेज़ failproofai कैसे आंतरिक रूप से काम करता है, यह समझाता है: कैसे हुक सिस्टम एजेंट टूल कॉल को इंटरसेप्ट करता है, कॉन्फ़िग कैसे लोड और मर्ज होता है, पॉलिसीज़ का मूल्यांकन कैसे होता है, और डैशबोर्ड एजेंट गतिविधि की निगरानी कैसे करता है।
9
+ यह दस्तावेज़ बताता है कि failproofai आंतरिक रूप से कैसे काम करता है: हुक सिस्टम एजेंट टूल कॉल को कैसे इंटरसेप्ट करता है, कॉन्फ़िगरेशन कैसे लोड और मर्ज होता है, पॉलिसीज़ का मूल्यांकन कैसे होता है, और डैशबोर्ड एजेंट गतिविधि को कैसे मॉनिटर करता है।
10
10
 
11
11
  ---
12
12
 
13
13
  ## सारांश
14
14
 
15
- failproofai के दो स्वतंत्र सबसिस्टम हैं:
15
+ failproofai के दो स्वतंत्र उपप्रणालियां हैं:
16
16
 
17
- 1. **हुक हैंडलर** - एक तेज़ CLI सबप्रोसेस जो Claude Code हर एजेंट टूल कॉल पर आमंत्रित करता है। पॉलिसीज़ का मूल्यांकन करता है और एक निर्णय देता है।
18
- 2. **एजेंट मॉनिटर (डैशबोर्ड)** - एजेंट सेशन की निगरानी और पॉलिसीज़ प्रबंधन के लिए एक Next.js वेब एप्लिकेशन।
17
+ 1. **हुक हैंडलर** - एक तेज़ CLI उपप्रक्रिया जो Claude Code हर एजेंट टूल कॉल पर आमंत्रित करती है। पॉलिसीज़ का मूल्यांकन करता है और एक निर्णय देता है।
18
+ 2. **एजेंट मॉनिटर (डैशबोर्ड)** - एजेंट सत्रों की निगरानी और पॉलिसीज़ को प्रबंधित करने के लिए एक Next.js वेब एप्लिकेशन।
19
19
 
20
- दोनों सबसिस्टम `~/.failproofai/` और प्रोजेक्ट की `.failproofai/` डायरेक्टरी में कॉन्फ़िग फ़ाइलें साझा करते हैं, लेकिन ये अलग प्रक्रियाओं के रूप में चलते हैं और केवल फ़ाइलसिस्टम के माध्यम से संचार करते हैं।
20
+ दोनों उपप्रणालियां `~/.failproofai/` और प्रोजेक्ट की `.failproofai/` डायरेक्टरी में कॉन्फ़िगरेशन फ़ाइलें साझा करती हैं, लेकिन वे अलग-अलग प्रक्रियाओं के रूप में चलती हैं और केवल फ़ाइलसिस्टम के माध्यम से संचार करती हैं।
21
21
 
22
22
  ---
23
23
 
@@ -46,9 +46,9 @@ failproofai के दो स्वतंत्र सबसिस्टम ह
46
46
  }
47
47
  ```
48
48
 
49
- Claude Code फिर प्रत्येक टूल कॉल से पहले `failproofai --hook PreToolUse` को एक सबप्रोसेस के रूप में आमंत्रित करता है, stdin पर एक JSON पेलोड पास करता है।
49
+ Claude Code फिर प्रत्येक टूल कॉल से पहले `failproofai --hook PreToolUse` को एक उपप्रक्रिया के रूप में आमंत्रित करता है, stdin पर एक JSON पेलोड पास करता है।
50
50
 
51
- ### पेलोड फॉर्मेट
51
+ ### पेलोड प्रारूप
52
52
 
53
53
  ```json
54
54
  {
@@ -62,11 +62,11 @@ Claude Code फिर प्रत्येक टूल कॉल से पह
62
62
  }
63
63
  ```
64
64
 
65
- `PostToolUse` इवेंट्स के लिए, पेलोड में टूल के आउटपुट के साथ `tool_result` भी होता है।
65
+ `PostToolUse` इवेंट्स के लिए, पेलोड में टूल के आउटपुट के साथ `tool_result` भी शामिल है।
66
66
 
67
- हैंडलर 1 MB stdin लिमिट को लागू करता है। इससे अधिक पेलोड को डिस्कार्ड कर दिया जाता है और सभी पॉलिसीज़ निहितार्थ से अनुमति देती हैं।
67
+ हैंडलर 1 MB stdin सीमा लागू करता है। इस सीमा से अधिक पेलोड को छोड़ दिया जाता है और सभी पॉलिसीज़ अर्थपूर्ण रूप से अनुमति देती हैं।
68
68
 
69
- ### प्रतिक्रिया फॉर्मेट
69
+ ### प्रतिक्रिया प्रारूप
70
70
 
71
71
  **अस्वीकार करें (PreToolUse):**
72
72
  ```json
@@ -87,7 +87,7 @@ Claude Code फिर प्रत्येक टूल कॉल से पह
87
87
  }
88
88
  ```
89
89
 
90
- **निर्देशित करें (Stop को छोड़कर कोई भी इवेंट):**
90
+ **निर्देशन (Stop को छोड़कर किसी भी इवेंट):**
91
91
  ```json
92
92
  {
93
93
  "hookSpecificOutput": {
@@ -96,17 +96,17 @@ Claude Code फिर प्रत्येक टूल कॉल से पह
96
96
  }
97
97
  ```
98
98
 
99
- **Stop इवेंट निर्देशित करें:**
100
- - Exit कोड: `2`
101
- - कारण stderr (stdout नहीं) में लिखा गया है
99
+ **Stop इवेंट निर्देशन:**
100
+ - Exit code: `2`
101
+ - कारण stderr को लिखा गया (stdout को नहीं)
102
102
 
103
103
  **अनुमति दें:**
104
- - Exit कोड: `0`
104
+ - Exit code: `0`
105
105
  - खाली stdout
106
106
 
107
107
  **संदेश के साथ अनुमति दें:**
108
108
 
109
- `allow(message)` एक पॉलिसी को Claude को सूचनात्मक संदर्भ भेजने देता है भले ही ऑपरेशन की अनुमति हो। हुक हैंडलर निम्नलिखित JSON को **stdout** में लिखता है (कॉन्फ़िग फ़ाइल में नहीं — यह Claude Code को हैंडलर की प्रतिक्रिया है, अस्वीकार करें और निर्देशित करें प्रतिक्रिया की तरह):
109
+ `allow(message)` एक पॉलिसी को Claude को सूचनात्मक संदर्भ भेजने देता है भले ही ऑपरेशन की अनुमति हो। हुक हैंडलर निम्नलिखित JSON को **stdout** में लिखता है (कॉन्फ़िगरेशन फ़ाइल में नहीं — यह हैंडलर की Claude Code को प्रतिक्रिया है, जैसे अस्वीकार और निर्देश प्रतिक्रियाएं ऊपर दी गई हैं):
110
110
 
111
111
  ```json
112
112
  // हुक हैंडलर प्रक्रिया द्वारा stdout में लिखा गया
@@ -116,8 +116,8 @@ Claude Code फिर प्रत्येक टूल कॉल से पह
116
116
  }
117
117
  }
118
118
  ```
119
- - Exit कोड: `0` (ऑपरेशन की अनुमति है)
120
- - जब कई पॉलिसीज़ संदेश के साथ `allow` देते हैं, तो उनके संदेश नई पंक्तियों के साथ एक एकल `additionalContext` स्ट्रिंग में जुड़ते हैं
119
+ - Exit code: `0` (ऑपरेशन की अनुमति है)
120
+ - जब कई पॉलिसीज़ एक संदेश के साथ `allow` देती हैं, तो उनके संदेश नई पंक्तियों के साथ एक एकल `additionalContext` स्ट्रिंग में जुड़ जाते हैं
121
121
  - यदि कोई पॉलिसी संदेश प्रदान नहीं करती है, तो stdout खाली है (पहले की तरह)
122
122
 
123
123
  ### प्रोसेसिंग पाइपलाइन
@@ -126,69 +126,69 @@ Claude Code फिर प्रत्येक टूल कॉल से पह
126
126
 
127
127
  ```text
128
128
  stdin JSON
129
- पेलोड को पार्स करें (अधिकतम 1 MB)
130
- सेशन मेटाडेटा निकालें (session_id, cwd, tool_name, tool_input, आदि)
131
- → readMergedHooksConfig(cwd) ← प्रोजेक्ट + स्थानीय + वैश्विक कॉन्फ़िग को मर्ज करता है
132
- सक्षम बिल्ट-इन पॉलिसीज़ को हल किए गए पैरामीटर के साथ पंजीकृत करें
133
- customPoliciesPath से कस्टम पॉलिसीज़ लोड करें (यदि सेट किया गया है)
134
- पॉलिसी रजिस्ट्री में कस्टम पॉलिसीज़ पंजीकृत करें
135
- सभी पॉलिसीज़ का मूल्यांकन करें (पहले बिल्ट-इन, फिर कस्टम)
136
- पहला अस्वीकार छोटा-परिपथ करता है
137
- निर्देशित निर्णय जमा होते हैं
138
- संदेश की अनुमति जमा होती है
139
- → JSON निर्णय stdout में लिखें
140
- इवेंट को ~/.failproofai/hook-activity.jsonl में सहेजें
141
- बाहर निकलें
129
+ parse payload (max 1 MB)
130
+ extract session metadata (session_id, cwd, tool_name, tool_input, etc.)
131
+ → readMergedHooksConfig(cwd) ← merges project + local + global config
132
+ register enabled builtin policies with resolved params
133
+ load custom policies from customPoliciesPath (if set)
134
+ register custom policies into policy registry
135
+ evaluate all policies (builtins first, then custom)
136
+ first deny short-circuits
137
+ instruct decisions accumulate
138
+ allow messages accumulate
139
+ write JSON decision to stdout
140
+ persist event to ~/.failproofai/hook-activity.jsonl
141
+ exit
142
142
  ```
143
143
 
144
- LLM कॉल के बिना विशिष्ट पेलोड के लिए पूरी प्रक्रिया 100ms में चलती है।
144
+ बिना LLM कॉल्स के सामान्य पेलोड्स के लिए पूरी प्रक्रिया 100ms से कम में चलती है।
145
145
 
146
146
  ---
147
147
 
148
- ## कॉन्फ़िग लोडिंग
148
+ ## कॉन्फ़िगरेशन लोडिंग
149
149
 
150
- `src/hooks/hooks-config.ts` तीन-स्कोप कॉन्फ़िग लोडिंग को लागू करता है।
150
+ `src/hooks/hooks-config.ts` तीन-स्कोप कॉन्फ़िगरेशन लोडिंग को लागू करता है।
151
151
 
152
152
  ```text
153
- [1] {cwd}/.failproofai/policies-config.json ← प्रोजेक्ट (सर्वोच्च प्राथमिकता)
154
- [2] {cwd}/.failproofai/policies-config.local.json ← स्थानीय
155
- [3] ~/.failproofai/policies-config.json ← वैश्विक (निम्नतम प्राथमिकता)
153
+ [1] {cwd}/.failproofai/policies-config.json ← project (highest priority)
154
+ [2] {cwd}/.failproofai/policies-config.local.json ← local
155
+ [3] ~/.failproofai/policies-config.json ← global (lowest priority)
156
156
  ```
157
157
 
158
- मर्ज लॉजिक:
159
- - `enabledPolicies` - सभी तीनों फ़ाइलों में डिडुप्लिकेटेड यूनियन
158
+ मर्ज तर्क:
159
+ - `enabledPolicies` - सभी तीन फ़ाइलों में डीडुप्लिकेटेड यूनियन
160
160
  - `policyParams` - प्रति-पॉलिसी कुंजी, पहली फ़ाइल जो इसे परिभाषित करती है पूरी तरह जीतती है
161
161
  - `customPoliciesPath` - पहली फ़ाइल जो इसे परिभाषित करती है जीतती है
162
162
  - `llm` - पहली फ़ाइल जो इसे परिभाषित करती है जीतती है
163
163
 
164
- वेब डैशबोर्ड पढ़ने और लिखने के लिए `readHooksConfig()` (केवल वैश्विक) का उपयोग करता है, क्योंकि यह प्रोजेक्ट cwd के साथ आमंत्रित नहीं किया जाता है।
164
+ वेब डैशबोर्ड पढ़ने और लिखने के लिए `readHooksConfig()` (केवल वैश्विक) का उपयोग करता है, क्योंकि इसे प्रोजेक्ट cwd के साथ आमंत्रित नहीं किया जाता है।
165
165
 
166
166
  ---
167
167
 
168
168
  ## पॉलिसी मूल्यांकन
169
169
 
170
- `src/hooks/policy-evaluator.ts` क्रम में पॉलिसीज़ चलाता है।
170
+ `src/hooks/policy-evaluator.ts` पॉलिसीज़ को क्रम में चलाता है।
171
171
 
172
172
  प्रत्येक पॉलिसी के लिए:
173
173
 
174
174
  1. पॉलिसी के `params` स्कीमा को देखें (यदि इसके पास है)।
175
- 2. मर्ज कॉन्फ़िग से `policyParams[policy.name]` पढ़ें।
176
- 3. `ctx.params` का उत्पादन करने के लिए स्कीमा डिफ़ॉल्ट पर उपयोगकर्ता-प्रदत्त मान को मर्ज करें।
175
+ 2. मर्ज किए गए कॉन्फ़िगरेशन से `policyParams[policy.name]` पढ़ें।
176
+ 3. `ctx.params` बनाने के लिए स्कीमा डिफ़ॉल्ट्स पर उपयोगकर्ता-प्रदान किए गए मानों को मर्ज करें।
177
177
  4. हल किए गए संदर्भ के साथ `policy.fn(ctx)` को कॉल करें।
178
- 5. यदि परिणाम `deny` है, तो तुरंत रुकें और वह निर्णय लौटाएं।
178
+ 5. यदि परिणाम `deny` है, तो तुरंत रुकें और उस निर्णय को वापस करें।
179
179
  6. यदि परिणाम `instruct` है, तो संदेश को जमा करें और जारी रखें।
180
180
  7. यदि परिणाम `allow` है, तो अगली पॉलिसी पर जाएं।
181
181
 
182
182
  सभी पॉलिसीज़ चलने के बाद:
183
- - यदि कोई `deny` लौटाया गया था, तो अस्वीकार प्रतिक्रिया जारी करें।
184
- - यदि कोई `instruct` रिटर्न एकत्र किए गए थे, तो सभी संदेशों को जुड़ा हुआ एक एकल निर्देशित प्रतिक्रिया जारी करें।
185
- - अन्यथा, अनुमति प्रतिक्रिया जारी करें (खाली stdout, exit 0)।
183
+ - यदि कोई `deny` वापस किया गया था, तो अस्वीकार प्रतिक्रिया दें।
184
+ - यदि कोई `instruct` वापसी एकत्र किए गए थे, तो सभी संदेशों को जोड़ने के साथ एक एकल निर्देश प्रतिक्रिया दें।
185
+ - अन्यथा, अनुमति प्रतिक्रिया दें (खाली stdout, exit 0)।
186
186
 
187
187
  ---
188
188
 
189
- ## बिल्ट-इन पॉलिसीज़
189
+ ## अंतर्निहित पॉलिसीज़
190
190
 
191
- `src/hooks/builtin-policies.ts` सभी 26 बिल्ट-इन पॉलिसीज़ को `BuiltinPolicyDefinition` ऑब्जेक्ट के रूप में परिभाषित करता है:
191
+ `src/hooks/builtin-policies.ts` सभी 26 अंतर्निहित पॉलिसीज़ को `BuiltinPolicyDefinition` ऑब्जेक्ट्स के रूप में परिभाषित करता है:
192
192
 
193
193
  ```typescript
194
194
  interface BuiltinPolicyDefinition {
@@ -206,9 +206,9 @@ interface BuiltinPolicyDefinition {
206
206
  }
207
207
  ```
208
208
 
209
- जो पॉलिसीज़ `params` स्वीकार करती हैं वे प्रत्येक पैरामीटर के लिए प्रकार और डिफ़ॉल्ट के साथ एक `PolicyParamsSchema` घोषित करती हैं। पॉलिसी मूल्यांकन `fn` को कॉल करने से पहले हल किए गए मानों को `ctx.params` में इंजेक्ट करता है। पॉलिसी फ़ंक्शन `ctx.params` को पढ़ते हैं बिना null-गार्डिंग के क्योंकि डिफ़ॉल्ट हमेशा पहले लागू किए जाते हैं।
209
+ जो पॉलिसीज़ `params` स्वीकार करती हैं वे प्रत्येक पैरामीटर के लिए प्रकार और डिफ़ॉल्ट्स के साथ `PolicyParamsSchema` घोषित करती हैं। पॉलिसी मूल्यांकन `fn` को कॉल करने से पहले `ctx.params` में हल किए गए मानों को इंजेक्ट करता है। पॉलिसी फ़ंक्शन्स `ctx.params` को पढ़ते हैं बिना null-गार्डिंग के क्योंकि डिफ़ॉल्ट्स हमेशा पहले लागू होते हैं।
210
210
 
211
- पॉलिसीज़ के अंदर पैटर्न मिलान कच्ची स्ट्रिंग मिलान के बजाय पार्स किए गए कमांड टोकन (argv) का उपयोग करता है। यह शेल ऑपरेटर इंजेक्शन के माध्यम से बाईपास को रोकता है (उदाहरण के लिए `sudo systemctl status *` के लिए एक पैटर्न `; rm -rf /` को कमांड में जोड़ने से बाईपास नहीं किया जा सकता)।
211
+ पॉलिसीज़ के अंदर पैटर्न मिलान पार्स किए गए कमांड टोकन्स (argv) का उपयोग करता है, कच्ची स्ट्रिंग मिलान नहीं। यह shell ऑपरेटर इंजेक्शन के माध्यम से बाईपास को रोकता है (उदाहरण के लिए `sudo systemctl status *` के लिए एक पैटर्न को `; rm -rf /` को जोड़कर बाईपास नहीं किया जा सकता)।
212
212
 
213
213
  ---
214
214
 
@@ -224,28 +224,28 @@ export const customPolicies = {
224
224
  };
225
225
 
226
226
  export function getCustomHooks(): CustomHook[] { ... }
227
- export function clearCustomHooks(): void { ... } // परीक्षण में उपयोग किया जाता है
227
+ export function clearCustomHooks(): void { ... } // used in tests
228
228
  ```
229
229
 
230
230
  `src/hooks/custom-hooks-loader.ts` उपयोगकर्ता की पॉलिसी फ़ाइल लोड करता है:
231
231
 
232
- 1. कॉन्फ़िग से `customPoliciesPath` पढ़ें; अगर अनुपस्थित हो तो छोड़ें।
233
- 2. निरपेक्ष पथ के लिए हल करें; फ़ाइल का अस्तित्व जांचें।
234
- 3. सभी `from "failproofai"` आयातों को वास्तविक dist पाथ में फिर से लिखें ताकि `customPolicies` उसी `globalThis` रजिस्ट्री में हल हो।
235
- 4. ESM संगतता सुनिश्चित करने के लिए संक्रमणीय स्थानीय आयातों को पुनरावर्ती रूप से फिर से लिखें।
232
+ 1. कॉन्फ़िगरेशन से `customPoliciesPath` पढ़ें; यदि अनुपस्थित है तो छोड़ दें।
233
+ 2. निरपेक्ष पथ में हल करें; फ़ाइल मौजूदगी की जांच करें।
234
+ 3. सभी `from "failproofai"` आयातों को वास्तविक dist पथ में फिर से लिखें ताकि `customPolicies` एक ही `globalThis` रजिस्ट्री में हल हो।
235
+ 4. ESM अनुकूलता सुनिश्चित करने के लिए संक्रमणकालीन स्थानीय आयातों को पुनरावर्ती रूप से फिर से लिखें।
236
236
  5. अस्थायी `.mjs` फ़ाइलें लिखें और प्रविष्टि फ़ाइल को `import()` करें।
237
- 6. पंजीकृत हुक को पुनः प्राप्त करने के लिए `getCustomHooks()` को कॉल करें।
238
- 7. `finally` ब्लॉक में सभी अस्थायी फ़ाइलें साफ करें।
237
+ 6. पंजीकृत हुक्स को पुनः प्राप्त करने के लिए `getCustomHooks()` को कॉल करें।
238
+ 7. `finally` ब्लॉक में सभी अस्थायी फ़ाइलों को साफ़ करें।
239
239
 
240
- किसी भी त्रुटि पर (फ़ाइल नहीं मिली, सिंटैक्स त्रुटि, आयात विफल), त्रुटि को `~/.failproofai/hook.log` में लॉग किया जाता है और लोडर एक खाली सरणी लौटाता है। बिल्ट-इन पॉलिसीज़ प्रभावित नहीं होती हैं।
240
+ किसी भी त्रुटि पर (फ़ाइल नहीं मिली, सिंटैक्स त्रुटि, आयात विफलता), त्रुटि को `~/.failproofai/hook.log` में लॉग किया जाता है और लोडर एक खाली सरणी देता है। अंतर्निहित पॉलिसीज़ प्रभावित नहीं होती हैं।
241
241
 
242
- कस्टम पॉलिसीज़ सभी बिल्ट-इन पॉलिसीज़ के बाद मूल्यांकन किए जाते हैं। एक कस्टम पॉलिसी `deny` अभी भी आगे की कस्टम पॉलिसीज़ को छोटा-परिपथ करता है (लेकिन उस बिंदु पर सभी बिल्ट-इन पहले से ही चल चुकी हैं)।
242
+ कस्टम पॉलिसीज़ का मूल्यांकन सभी अंतर्निहित पॉलिसीज़ के बाद किया जाता है। एक कस्टम पॉलिसी `deny` अभी भी आगे की कस्टम पॉलिसीज़ को छोटा करता है (लेकिन सभी अंतर्निहित पॉलिसीज़ पहले ही चल चुकी हैं)।
243
243
 
244
244
  ---
245
245
 
246
246
  ## गतिविधि लॉगिंग
247
247
 
248
- प्रत्येक हुक इवेंट के बाद, हैंडलर `~/.failproofai/hook-activity.jsonl` में एक JSONL लाइन जोड़ता है:
248
+ प्रत्येक हुक इवेंट के बाद, हैंडलर `~/.failproofai/hook-activity.jsonl` में एक JSONL पंक्ति जोड़ता है:
249
249
 
250
250
  ```json
251
251
  {
@@ -260,44 +260,44 @@ export function clearCustomHooks(): void { ... } // परीक्षण म
260
260
  }
261
261
  ```
262
262
 
263
- गैर-अनुमति निर्णय लेने वाली प्रत्येक पॉलिसी के लिए एक पंक्ति। अनुमति निर्णय लॉग नहीं किए जाते हैं (फ़ाइल को छोटा रखने के लिए)।
263
+ प्रत्येक पॉलिसी के लिए एक पंक्ति जिसने एक गैर-अनुमति निर्णय दिया। अनुमति के निर्णय लॉग नहीं किए जाते हैं (फ़ाइल को छोटा रखने के लिए)।
264
264
 
265
265
  ---
266
266
 
267
267
  ## डैशबोर्ड आर्किटेक्चर
268
268
 
269
- डैशबोर्ड एक **Next.js 16** एप्लिकेशन है जो App Router को React Server Components और Server Actions के साथ उपयोग करता है।
269
+ डैशबोर्ड एक **Next.js 16** एप्लिकेशन है जो App Router के साथ React Server Components और Server Actions का उपयोग करता है।
270
270
 
271
271
  ```text
272
272
  app/
273
- layout.tsx ← रूट लेआउट (थीम, टेलीमेट्री, नेव)
274
- projects/page.tsx ← सर्वर घटक: सभी Claude प्रोजेक्ट्स सूचीबद्ध करें
275
- project/[name]/page.tsx ← सर्वर घटक: प्रोजेक्ट में सेशन सूचीबद्ध करें
273
+ layout.tsx ← Root layout (theme, telemetry, nav)
274
+ projects/page.tsx ← Server component: list all Claude projects
275
+ project/[name]/page.tsx ← Server component: list sessions in a project
276
276
  project/[name]/session/
277
- [sessionId]/page.tsx ← सर्वर घटक: सेशन दर्शक प्रदान करें
278
- policies/page.tsx ← क्लाइंट घटक: पॉलिसी प्रबंधन + गतिविधि लॉग
277
+ [sessionId]/page.tsx ← Server component: render session viewer
278
+ policies/page.tsx ← Client component: policy management + activity log
279
279
  actions/
280
- get-hooks-config.ts ← कॉन्फ़िग + पॉलिसी सूची पढ़ें
281
- update-hooks-config.ts ← पॉलिसी को चालू/बंद करें
282
- update-policy-params.ts ← पॉलिसी पैरामीटर अपडेट करें
283
- get-hook-activity.ts ← गतिविधि लॉग को पेजिनेट/खोजें
284
- install-hooks-web.ts ← ब्राउज़र से हुक इंस्टॉल/निकालें
280
+ get-hooks-config.ts ← Read config + policy list
281
+ update-hooks-config.ts ← Toggle policy on/off
282
+ update-policy-params.ts ← Update policy parameters
283
+ get-hook-activity.ts ← Paginate/search activity log
284
+ install-hooks-web.ts ← Install/remove hooks from the browser
285
285
  api/
286
- download/[project]/[session]/route.ts ← सेशन को ZIP/JSONL के रूप में निर्यात करें
286
+ download/[project]/[session]/route.ts ← Export session as ZIP/JSONL
287
287
  ```
288
288
 
289
- **डेटा फ्लो:**
289
+ **डेटा प्रवाह:**
290
290
 
291
- - पृष्ठ घटक `lib/projects.ts` और `lib/log-entries.ts` को कॉल करते हैं ताकि सीधे फ़ाइलसिस्टम से प्रोजेक्ट/सेशन डेटा पढ़ा जा सके (पढ़ने के लिए कोई API परत नहीं)।
292
- - पॉलिसीज़ पृष्ठ सभी उत्परिवर्तन के लिए Server Actions का उपयोग करता है (टॉगल, पैरामीटर अपडेट, इंस्टॉल/निकालें)।
293
- - सेशन दर्शक Claude के JSONL ट्रांसक्रिप्ट फॉर्मेट को पार्स करता है और संदेश और टूल कॉल की एक समय सूची प्रदान करता है।
291
+ - पेज कंपोनेंट्स प्रोजेक्ट/सेशन डेटा को सीधे फ़ाइलसिस्टम से पढ़ने के लिए `lib/projects.ts` और `lib/log-entries.ts` को कॉल करते हैं (पढ़ने के लिए कोई API परत नहीं)।
292
+ - पॉलिसीज़ पेज सभी म्यूटेशन्स के लिए Server Actions का उपयोग करता है (टॉगल, पैरामीटर अपडेट, इंस्टॉल/निकालना)।
293
+ - सेशन दर्शक Claude की JSONL ट्रांसक्रिप्ट प्रारूप को पार्स करता है और संदेशों और टूल कॉल्स की एक समयरेखा प्रस्तुत करता है।
294
294
 
295
295
  **मुख्य डिज़ाइन निर्णय:**
296
296
 
297
- - कोई डेटाबेस नहीं - सभी स्थायी स्थिति सादा फ़ाइलों में है (`~/.failproofai/`, `~/.claude/projects/`)।
298
- - उत्परिवर्तन के लिए Server Actions - CRUD संचालन के लिए कोई REST API की आवश्यकता नहीं।
299
- - पढ़ने वाले पृष्ठों के लिए React Server Components - तेजी से प्रारंभिक लोड, डेटा फेचिंग के लिए कोई क्लाइंट बंडल नहीं।
300
- - क्लाइंट घटक केवल जहां इंटरएक्टिविटी आवश्यक है (पॉलिसी टॉगल, गतिविधि खोज, लॉग दर्शक)।
297
+ - कोई डेटाबेस नहीं - सभी स्थायी स्थिति सादी फ़ाइलों में है (`~/.failproofai/`, `~/.claude/projects/`)।
298
+ - म्यूटेशन्स के लिए Server Actions - CRUD ऑपरेशन्स के लिए कोई REST API आवश्यक नहीं है।
299
+ - पढ़ने पन्नों के लिए React Server Components - तेज़ प्रारंभिक लोड, डेटा फेचिंग के लिए कोई क्लाइंट बंडल नहीं।
300
+ - क्लाइंट कंपोनेंट्स केवल जहां इंटरैक्टिविटी आवश्यक है (पॉलिसी टॉगल, गतिविधि खोज, लॉग दर्शक)।
301
301
 
302
302
  ---
303
303
 
@@ -306,29 +306,29 @@ app/
306
306
  ```text
307
307
  failproofai/
308
308
  ├── bin/
309
- │ └── failproofai.mjs # CLI राउटर (हुक / डैशबोर्ड / इंस्टॉल / आदि)
309
+ │ └── failproofai.mjs # CLI router (hook / dashboard / install / etc.)
310
310
  ├── src/hooks/
311
- │ ├── handler.ts # हुक इवेंट पाइपलाइन
312
- │ ├── builtin-policies.ts # 26 पॉलिसी परिभाषाएं
313
- │ ├── policy-evaluator.ts # पॉलिसी निष्पादन इंजन
314
- │ ├── policy-registry.ts # पॉलिसी पंजीकरण और लुकअप
315
- │ ├── policy-types.ts # TypeScript इंटरफेस
316
- │ ├── hooks-config.ts # बहु-स्कोप कॉन्फ़िग लोडिंग
317
- │ ├── custom-hooks-registry.ts # globalThis-समर्थित हुक रजिस्ट्री
318
- │ ├── custom-hooks-loader.ts # उपयोगकर्ता JS हुक के लिए ESM लोडर
319
- │ ├── manager.ts # इंस्टॉल / निकालें / सूची संचालन
320
- │ ├── install-prompt.ts # इंटरएक्टिव पॉलिसी चयन प्रॉम्प्ट
321
- │ ├── hook-logger.ts # hook.log में लॉगिंग
322
- │ ├── hook-activity-store.ts # hook-activity.jsonl में गतिविधि सहेजें
323
- │ └── llm-client.ts # LLM API क्लाइंट (AI-संचालित पॉलिसीज़ के लिए)
324
- ├── app/ # Next.js डैशबोर्ड (पृष्ठ + सर्वर क्रियाएं)
325
- ├── lib/ # साझा उपयोगिताएं
326
- │ ├── projects.ts # फ़ाइलसिस्टम से Claude प्रोजेक्ट्स की गणना करें
327
- │ ├── log-entries.ts # Claude ट्रांसक्रिप्ट JSONL फॉर्मेट पार्स करें
328
- │ ├── paths.ts # सिस्टम पाथ हल करें
311
+ │ ├── handler.ts # Hook event pipeline
312
+ │ ├── builtin-policies.ts # 26 policy definitions
313
+ │ ├── policy-evaluator.ts # Policy execution engine
314
+ │ ├── policy-registry.ts # Policy registration and lookup
315
+ │ ├── policy-types.ts # TypeScript interfaces
316
+ │ ├── hooks-config.ts # Multi-scope config loading
317
+ │ ├── custom-hooks-registry.ts # globalThis-backed hook registry
318
+ │ ├── custom-hooks-loader.ts # ESM loader for user JS hooks
319
+ │ ├── manager.ts # install / remove / list operations
320
+ │ ├── install-prompt.ts # Interactive policy selection prompt
321
+ │ ├── hook-logger.ts # Logging to hook.log
322
+ │ ├── hook-activity-store.ts # Persist activity to hook-activity.jsonl
323
+ │ └── llm-client.ts # LLM API client (for AI-powered policies)
324
+ ├── app/ # Next.js dashboard (pages + server actions)
325
+ ├── lib/ # Shared utilities
326
+ │ ├── projects.ts # Enumerate Claude projects from filesystem
327
+ │ ├── log-entries.ts # Parse Claude transcript JSONL format
328
+ │ ├── paths.ts # Resolve system paths
329
329
  │ └── ...
330
- ├── components/ # साझा React UI घटक
331
- ├── contexts/ # React संदर्भ प्रदाता (थीम, ऑटो-रिफ्रेश, टेलीमेट्री)
332
- ├── examples/ # उदाहरण कस्टम हुक फ़ाइलें
333
- └── __tests__/ # इकाई और E2E परीक्षण
330
+ ├── components/ # Shared React UI components
331
+ ├── contexts/ # React context providers (theme, auto-refresh, telemetry)
332
+ ├── examples/ # Example custom hook files
333
+ └── __tests__/ # Unit and E2E tests
334
334
  ```