failproofai 0.0.2-beta.6 → 0.0.2-beta.8

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 (162) hide show
  1. package/.next/standalone/.claude/settings.json +316 -0
  2. package/.next/standalone/.failproofai/policies/workflow-policies.mjs +62 -0
  3. package/.next/standalone/.failproofai/policies-config.json +39 -0
  4. package/.next/standalone/.next/BUILD_ID +1 -1
  5. package/.next/standalone/.next/build-manifest.json +5 -5
  6. package/.next/standalone/.next/prerender-manifest.json +3 -3
  7. package/.next/standalone/.next/required-server-files.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
  9. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  10. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  14. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  15. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  16. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  17. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  18. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/.next/standalone/.next/server/app/_not-found/page/build-manifest.json +2 -2
  20. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  21. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  24. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  25. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  26. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  27. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
  28. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  29. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  30. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  31. package/.next/standalone/.next/server/app/index.html +1 -1
  32. package/.next/standalone/.next/server/app/index.rsc +15 -15
  33. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  34. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  35. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  36. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
  37. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  38. package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
  39. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  40. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/policies/page/build-manifest.json +2 -2
  43. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
  44. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +2 -2
  47. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  48. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +2 -2
  51. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  52. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  53. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/projects/page/build-manifest.json +2 -2
  56. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  57. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  58. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/chunks/[root-of-the-server]__02nt~6d._.js +1 -1
  60. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_05pz9._._.js +1 -1
  61. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
  62. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0u_n1xe._.js → [root-of-the-server]__0.t2266._.js} +2 -2
  63. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
  64. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
  65. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
  66. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
  67. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
  68. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0epc5zr._.js → [root-of-the-server]__0pjorff._.js} +2 -2
  69. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +8 -9
  70. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
  71. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
  72. package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
  73. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
  74. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
  75. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a_7sdg.js +2 -2
  76. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ef3uwk.js +2 -2
  77. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0j79~gv.js +2 -2
  78. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0pbja1x.js +2 -2
  79. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0r6o0i2.js +2 -2
  80. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11y81~_.js +2 -2
  81. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_12or2kf.js +2 -2
  82. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.js +1 -1
  83. package/.next/standalone/.next/server/middleware-build-manifest.js +5 -5
  84. package/.next/standalone/.next/server/pages/404.html +2 -2
  85. package/.next/standalone/.next/server/pages/500.html +1 -1
  86. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/server-reference-manifest.json +9 -9
  88. package/.next/standalone/.next/static/chunks/{0efsuf1p-k4qe.js → 04xfyqyhdxbxz.js} +1 -1
  89. package/.next/standalone/.next/static/chunks/{17p200_z1ivz4.js → 07g0rbtaux_1t.js} +1 -1
  90. package/.next/standalone/.next/static/chunks/{031pa5~qfzt~_.js → 09e7drilkf1sn.js} +1 -1
  91. package/.next/standalone/.next/static/chunks/{0tood0~87-mm8.js → 0a_xh94bt.y0j.js} +1 -1
  92. package/.next/standalone/.next/static/chunks/{0rvepm.~uvks4.js → 0j752uotyfvjh.js} +1 -1
  93. package/.next/standalone/.next/static/chunks/{0wkzaq-8sxss7.js → 0qi0ubup__3pj.js} +1 -1
  94. package/.next/standalone/.next/static/chunks/{0kbfx4p.g9wnr.js → 0xyvis4r_y.8o.js} +2 -2
  95. package/.next/standalone/.next/static/chunks/{0jqg886bw85_6.js → 0zfyfi1suoteq.js} +1 -1
  96. package/.next/standalone/.next/static/chunks/{0_tx_~f8pi3d7.js → 121a-0zn-knuy.js} +1 -1
  97. package/.next/standalone/.next/static/chunks/{turbopack-0uc5y~g6h.n7-.js → turbopack-0r26pc8h0y_-e.js} +1 -1
  98. package/.next/standalone/CHANGELOG.md +88 -0
  99. package/.next/standalone/CLAUDE.md +14 -0
  100. package/.next/standalone/README.md +20 -3
  101. package/.next/standalone/bin/failproofai.mjs +5 -0
  102. package/.next/standalone/bun.lock +31 -63
  103. package/.next/standalone/dist/cli.mjs +268 -73
  104. package/.next/standalone/docs/built-in-policies.mdx +19 -3
  105. package/.next/standalone/docs/configuration.mdx +46 -0
  106. package/.next/standalone/docs/custom-policies.mdx +65 -7
  107. package/.next/standalone/docs/docs.json +3 -3
  108. package/.next/standalone/examples/convention-policies/security-policies.mjs +40 -0
  109. package/.next/standalone/examples/convention-policies/workflow-policies.mjs +41 -0
  110. package/.next/standalone/node_modules/@next/env/package.json +1 -1
  111. package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
  112. package/.next/standalone/node_modules/next/dist/compiled/jsonwebtoken/index.js +2 -2
  113. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +1 -1
  114. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +1 -1
  115. package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
  116. package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
  117. package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
  118. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +7 -2
  119. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
  120. package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
  121. package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
  122. package/.next/standalone/node_modules/next/dist/server/render.js +20 -19
  123. package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
  124. package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
  125. package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
  126. package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
  127. package/.next/standalone/node_modules/next/package.json +15 -15
  128. package/.next/standalone/node_modules/react/cjs/react.development.js +1 -1
  129. package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
  130. package/.next/standalone/node_modules/react/package.json +1 -1
  131. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
  132. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
  133. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +3 -3
  134. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +3 -3
  135. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +3 -3
  136. package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
  137. package/.next/standalone/node_modules/react-dom/package.json +2 -2
  138. package/.next/standalone/package.json +1 -1
  139. package/.next/standalone/server.js +1 -1
  140. package/.next/standalone/src/hooks/builtin-policies.ts +70 -18
  141. package/.next/standalone/src/hooks/custom-hooks-loader.ts +165 -21
  142. package/.next/standalone/src/hooks/handler.ts +32 -6
  143. package/.next/standalone/src/hooks/hooks-config.ts +47 -2
  144. package/.next/standalone/src/hooks/llm-client.ts +2 -2
  145. package/.next/standalone/src/hooks/loader-utils.ts +4 -4
  146. package/.next/standalone/src/hooks/manager.ts +57 -14
  147. package/.next/standalone/src/hooks/policy-evaluator.ts +35 -17
  148. package/README.md +20 -3
  149. package/bin/failproofai.mjs +5 -0
  150. package/dist/cli.mjs +268 -73
  151. package/package.json +1 -1
  152. package/src/hooks/builtin-policies.ts +70 -18
  153. package/src/hooks/custom-hooks-loader.ts +165 -21
  154. package/src/hooks/handler.ts +32 -6
  155. package/src/hooks/hooks-config.ts +47 -2
  156. package/src/hooks/llm-client.ts +2 -2
  157. package/src/hooks/loader-utils.ts +4 -4
  158. package/src/hooks/manager.ts +57 -14
  159. package/src/hooks/policy-evaluator.ts +35 -17
  160. /package/.next/standalone/.next/static/{gDMch26rYN-bU-9f6ftKR → itedhTSyIDln6TUf41j5X}/_buildManifest.js +0 -0
  161. /package/.next/standalone/.next/static/{gDMch26rYN-bU-9f6ftKR → itedhTSyIDln6TUf41j5X}/_clientMiddlewareManifest.js +0 -0
  162. /package/.next/standalone/.next/static/{gDMch26rYN-bU-9f6ftKR → itedhTSyIDln6TUf41j5X}/_ssgManifest.js +0 -0
@@ -8,6 +8,14 @@ import { BUILTIN_POLICIES } from "./builtin-policies";
8
8
  import { getPoliciesForEvent } from "./policy-registry";
9
9
  import { hookLogInfo, hookLogWarn } from "./hook-logger";
10
10
 
11
+ function appendHint(baseReason: string, hint: unknown): string {
12
+ const base = baseReason.trim();
13
+ const normalizedHint = typeof hint === "string" ? hint.trim() : "";
14
+ if (!normalizedHint) return base;
15
+ if (!base) return normalizedHint;
16
+ return `${base}. ${normalizedHint}`;
17
+ }
18
+
11
19
  export interface EvaluationResult {
12
20
  exitCode: number;
13
21
  stdout: string;
@@ -48,9 +56,8 @@ export async function evaluatePolicies(
48
56
  session,
49
57
  };
50
58
 
51
- // Track the first instruct result (accumulated, does not short-circuit)
52
- let instructPolicyName: string | null = null;
53
- let instructReason: string | null = null;
59
+ // Track all instruct results (accumulated, does not short-circuit)
60
+ const instructEntries: Array<{ policyName: string; reason: string }> = [];
54
61
 
55
62
  // Track informational messages from allow decisions (with policy attribution)
56
63
  const allowEntries: Array<{ policyName: string; reason: string }> = [];
@@ -80,7 +87,10 @@ export async function evaluatePolicies(
80
87
  }
81
88
 
82
89
  if (result.decision === "deny") {
83
- const reason = result.reason ?? `Blocked by policy: ${policy.name}`;
90
+ const reason = appendHint(
91
+ result.reason ?? `Blocked by policy: ${policy.name}`,
92
+ config?.policyParams?.[policy.name]?.hint,
93
+ );
84
94
  hookLogInfo(`deny by "${policy.name}": ${reason}`);
85
95
 
86
96
  const displayTool = ctx.toolName ?? "unknown tool";
@@ -131,11 +141,14 @@ export async function evaluatePolicies(
131
141
  };
132
142
  }
133
143
 
134
- // Accumulate first instruct (does not short-circuit — later policies can still deny)
135
- if (result.decision === "instruct" && !instructPolicyName) {
136
- instructPolicyName = policy.name;
137
- instructReason = result.reason ?? `Instruction from policy: ${policy.name}`;
138
- hookLogInfo(`instruct by "${policy.name}": ${instructReason}`);
144
+ // Accumulate all instruct results (does not short-circuit — later policies can still deny)
145
+ if (result.decision === "instruct") {
146
+ const reason = appendHint(
147
+ result.reason ?? `Instruction from policy: ${policy.name}`,
148
+ config?.policyParams?.[policy.name]?.hint,
149
+ );
150
+ instructEntries.push({ policyName: policy.name, reason });
151
+ hookLogInfo(`instruct by "${policy.name}": ${reason}`);
139
152
  }
140
153
 
141
154
  // Accumulate informational messages from allow decisions
@@ -144,17 +157,21 @@ export async function evaluatePolicies(
144
157
  }
145
158
  }
146
159
 
147
- // No deny — check if we accumulated an instruct
148
- if (instructPolicyName && instructReason) {
160
+ // No deny — check if we accumulated any instructs
161
+ if (instructEntries.length > 0) {
162
+ const combined = instructEntries.map((e) => e.reason).join("\n");
163
+ const policyNames = instructEntries.map((e) => e.policyName);
164
+
149
165
  if (eventType === "Stop") {
150
166
  // Stop hook: exitCode 2 blocks Claude from stopping.
151
167
  // Reason goes to stderr so Claude Code receives it as context.
152
168
  return {
153
169
  exitCode: 2,
154
170
  stdout: "",
155
- stderr: instructReason,
156
- policyName: instructPolicyName,
157
- reason: instructReason,
171
+ stderr: combined,
172
+ policyName: policyNames[0],
173
+ policyNames,
174
+ reason: combined,
158
175
  decision: "instruct",
159
176
  };
160
177
  }
@@ -162,15 +179,16 @@ export async function evaluatePolicies(
162
179
  const response = {
163
180
  hookSpecificOutput: {
164
181
  hookEventName: eventType,
165
- additionalContext: `Instruction from failproofai: ${instructReason}`,
182
+ additionalContext: `Instruction from failproofai: ${combined}`,
166
183
  },
167
184
  };
168
185
  return {
169
186
  exitCode: 0,
170
187
  stdout: JSON.stringify(response),
171
188
  stderr: "",
172
- policyName: instructPolicyName,
173
- reason: instructReason,
189
+ policyName: policyNames[0],
190
+ policyNames,
191
+ reason: combined,
174
192
  decision: "instruct",
175
193
  };
176
194
  }