failproofai 1.0.7-beta.0 → 1.0.7-beta.2

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 (320) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/required-server-files.json +1 -1
  5. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  6. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  10. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
  11. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  12. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  17. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  18. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  19. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
  20. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  30. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/index.html +1 -1
  33. package/.next/standalone/.next/server/app/index.rsc +15 -15
  34. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
  35. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  36. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  37. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  38. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
  41. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  44. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  47. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  48. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  51. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +7 -7
  54. package/.next/standalone/.next/server/app/settings/page.js +2 -2
  55. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  56. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l3yhx4._.js +2 -2
  58. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +1 -1
  59. package/.next/standalone/.next/server/chunks/_0tovk6q._.js +1 -1
  60. package/.next/standalone/.next/server/chunks/_0trp3yc._.js +1 -1
  61. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  62. package/.next/standalone/.next/server/chunks/src_hooks_18qtd42._.js +1 -1
  63. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04usis8._.js +2 -2
  64. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__056wjo4._.js +2 -2
  65. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1p28m0u._.js → [root-of-the-server]__0l44ual._.js} +2 -2
  66. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n0xg95._.js +2 -2
  67. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rwtwpm._.js +2 -2
  68. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s_yomn._.js +2 -2
  69. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11mayhe._.js +2 -2
  70. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1pprgri._.js +2 -2
  71. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1q4p5b8._.js +2 -2
  72. package/.next/standalone/.next/server/chunks/ssr/_042cgl1._.js +1 -1
  73. package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
  74. package/.next/standalone/.next/server/chunks/ssr/_0bqoto4._.js +1 -1
  75. package/.next/standalone/.next/server/chunks/ssr/{_0cf1olg._.js → _1mel6y1._.js} +2 -2
  76. package/.next/standalone/.next/server/chunks/ssr/{_135-c3y._.js → _1v-jvrv._.js} +1 -1
  77. package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +1 -1
  78. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo.js +2 -2
  79. package/.next/standalone/.next/server/chunks/ssr/app_actions_get-scheduled-audit_ts_0ei9sni._.js +1 -1
  80. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -1
  81. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  82. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
  83. package/.next/standalone/.next/server/chunks/ssr/app_settings_02tf1h4._.js +1 -1
  84. package/.next/standalone/.next/server/chunks/ssr/src_hooks_15t8kqj._.js +1 -1
  85. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1fm2w5z._.js +1 -1
  86. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1j0zy3v._.js +1 -1
  87. package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
  88. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  89. package/.next/standalone/.next/server/pages/404.html +1 -1
  90. package/.next/standalone/.next/server/pages/500.html +1 -1
  91. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/server-reference-manifest.json +22 -22
  93. package/.next/standalone/.next/static/chunks/043j99m8ykg__.css +2 -0
  94. package/.next/standalone/.next/static/chunks/{0289oapk24zql.js → 0fqd7m_u81mi5.js} +1 -1
  95. package/.next/standalone/.next/static/chunks/{2tqszh84mp_2l.js → 129ag2bw93bdh.js} +1 -1
  96. package/.next/standalone/.next/static/chunks/{0pyy9m5cm8zku.js → 1qd741hzlmjbo.js} +1 -1
  97. package/.next/standalone/.next/static/chunks/{3vwnzfx9q80yl.js → 2_pltstd8-xgs.js} +1 -1
  98. package/.next/standalone/.next/static/chunks/{3vp7c3knkh8mr.js → 2c8j9l6j_b1ci.js} +1 -1
  99. package/.next/standalone/.next/static/chunks/3-k569wzcli8q.js +1 -0
  100. package/.next/standalone/.next/static/chunks/{3cdkxrukvlvul.js → 3brze37td_wnc.js} +1 -1
  101. package/.next/standalone/.next/static/chunks/{3dnd-_29uiaj3.js → 3otmypm6j_xfo.js} +2 -2
  102. package/.next/standalone/.next/static/chunks/{00i9thnpht4l1.js → 3ugmd_7dyn0id.js} +1 -1
  103. package/.next/standalone/.next/static/chunks/3yxro_r2_o9ad.js +69 -0
  104. package/.next/standalone/PROBE-FOLLOWUP.md +186 -0
  105. package/.next/standalone/app/actions/get-jev-config.ts +38 -23
  106. package/.next/standalone/app/actions/update-jev-config.ts +1 -1
  107. package/.next/standalone/app/settings/jev-panel.tsx +33 -29
  108. package/.next/standalone/package.json +10 -10
  109. package/.next/standalone/sdk/python/skill/SKILL.md +60 -14
  110. package/.next/standalone/sdk/python/skill/agents/openai.yaml +2 -1
  111. package/.next/standalone/sdk/python/skill/references/evaluator.md +255 -0
  112. package/.next/standalone/sdk/python/skill/references/events.md +17 -8
  113. package/.next/standalone/sdk/python/skill/references/frameworks.md +3 -0
  114. package/.next/standalone/sdk/python/skill/references/install.md +3 -0
  115. package/.next/standalone/sdk/python/skill/references/integration.md +6 -2
  116. package/.next/standalone/sdk/python/skill/references/typescript.md +568 -0
  117. package/.next/standalone/sdk/typescript/CHANGELOG.md +119 -0
  118. package/.next/standalone/sdk/typescript/LICENSE +42 -0
  119. package/.next/standalone/sdk/typescript/README.md +552 -0
  120. package/.next/standalone/sdk/typescript/eslint.config.mjs +59 -0
  121. package/.next/standalone/sdk/typescript/examples/research-agent.ts +197 -0
  122. package/.next/standalone/sdk/typescript/integration/ai.test.ts +920 -0
  123. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/agent.ts +337 -0
  124. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package-lock.json +281 -0
  125. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package.json +13 -0
  126. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/surfaces.ts +605 -0
  127. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/tsconfig.json +12 -0
  128. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/tsconfig.surfaces.json +4 -0
  129. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/agent.ts +342 -0
  130. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package-lock.json +168 -0
  131. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package.json +13 -0
  132. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/surfaces.ts +628 -0
  133. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/tsconfig.json +12 -0
  134. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/tsconfig.surfaces.json +4 -0
  135. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/agent.ts +346 -0
  136. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package-lock.json +156 -0
  137. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package.json +13 -0
  138. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/surfaces.ts +651 -0
  139. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/tsconfig.json +12 -0
  140. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/tsconfig.surfaces.json +4 -0
  141. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/agent.ts +350 -0
  142. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package-lock.json +153 -0
  143. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package.json +13 -0
  144. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/surfaces.ts +651 -0
  145. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/tsconfig.json +12 -0
  146. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/tsconfig.surfaces.json +4 -0
  147. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/agent.ts +623 -0
  148. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package-lock.json +463 -0
  149. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package.json +15 -0
  150. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/tsconfig.json +12 -0
  151. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/agent-v1.ts +99 -0
  152. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/agent.ts +623 -0
  153. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package-lock.json +336 -0
  154. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package.json +15 -0
  155. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/tsconfig.json +12 -0
  156. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/agent.ts +96 -0
  157. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package-lock.json +579 -0
  158. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package.json +15 -0
  159. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/tsconfig.json +12 -0
  160. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/index.cjs +53 -0
  161. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/index.mjs +55 -0
  162. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/package.json +18 -0
  163. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/agent.ts +659 -0
  164. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package-lock.json +635 -0
  165. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package.json +15 -0
  166. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/tsconfig.json +12 -0
  167. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/agent.ts +659 -0
  168. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package-lock.json +553 -0
  169. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package.json +15 -0
  170. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/tsconfig.json +12 -0
  171. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/agent.ts +877 -0
  172. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/mcp-server.mjs +66 -0
  173. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package-lock.json +6417 -0
  174. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package.json +15 -0
  175. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/tsconfig.json +12 -0
  176. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/agent.ts +872 -0
  177. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/mcp-server.mjs +66 -0
  178. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package-lock.json +2540 -0
  179. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package.json +15 -0
  180. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/tsconfig.json +12 -0
  181. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/actions.ts +18 -0
  182. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/ai/route.ts +42 -0
  183. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/edge/route.ts +29 -0
  184. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/langgraph/route.ts +21 -0
  185. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/llamaindex/route.ts +11 -0
  186. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/mastra/route.ts +19 -0
  187. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/status/route.ts +7 -0
  188. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/layout.tsx +9 -0
  189. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/page.tsx +15 -0
  190. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/instrumentation.ts +15 -0
  191. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/ai.ts +61 -0
  192. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/langgraph.ts +68 -0
  193. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/llamaindex.ts +98 -0
  194. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/mastra.ts +90 -0
  195. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/next.config.ts +52 -0
  196. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package-lock.json +4343 -0
  197. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package.json +28 -0
  198. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/agent.ts +51 -0
  199. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/deno-npm.ts +76 -0
  200. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package-lock.json +484 -0
  201. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package.json +15 -0
  202. package/.next/standalone/sdk/typescript/integration/fixtures/types/agent.ts +79 -0
  203. package/.next/standalone/sdk/typescript/integration/fixtures/types/package-lock.json +740 -0
  204. package/.next/standalone/sdk/typescript/integration/fixtures/types/package.json +11 -0
  205. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/agent.ts +197 -0
  206. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/package-lock.json +70 -0
  207. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/package.json +12 -0
  208. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/tsconfig.json +12 -0
  209. package/.next/standalone/sdk/typescript/integration/global-setup.ts +29 -0
  210. package/.next/standalone/sdk/typescript/integration/harness.ts +451 -0
  211. package/.next/standalone/sdk/typescript/integration/langchain.test.ts +682 -0
  212. package/.next/standalone/sdk/typescript/integration/llamaindex.test.ts +709 -0
  213. package/.next/standalone/sdk/typescript/integration/mastra-coverage.test.ts +386 -0
  214. package/.next/standalone/sdk/typescript/integration/mastra.test.ts +311 -0
  215. package/.next/standalone/sdk/typescript/integration/nextjs.test.ts +341 -0
  216. package/.next/standalone/sdk/typescript/integration/runtime-parity.ts +180 -0
  217. package/.next/standalone/sdk/typescript/integration/runtimes.bun.test.ts +15 -0
  218. package/.next/standalone/sdk/typescript/integration/runtimes.core.test.ts +113 -0
  219. package/.next/standalone/sdk/typescript/integration/runtimes.deno.test.ts +19 -0
  220. package/.next/standalone/sdk/typescript/integration/types.test.ts +141 -0
  221. package/.next/standalone/sdk/typescript/integration/vanilla.test.ts +255 -0
  222. package/.next/standalone/sdk/typescript/package-lock.json +2640 -0
  223. package/.next/standalone/sdk/typescript/package.json +401 -0
  224. package/.next/standalone/sdk/typescript/scripts/finalize-build.mjs +123 -0
  225. package/.next/standalone/sdk/typescript/scripts/release.mjs +177 -0
  226. package/.next/standalone/sdk/typescript/src/clock.ts +58 -0
  227. package/.next/standalone/sdk/typescript/src/context.ts +214 -0
  228. package/.next/standalone/sdk/typescript/src/edge/adapter.ts +18 -0
  229. package/.next/standalone/sdk/typescript/src/edge/ai.ts +116 -0
  230. package/.next/standalone/sdk/typescript/src/edge/index.ts +238 -0
  231. package/.next/standalone/sdk/typescript/src/edge/langchain.ts +18 -0
  232. package/.next/standalone/sdk/typescript/src/edge/llamaindex.ts +12 -0
  233. package/.next/standalone/sdk/typescript/src/edge/mastra.ts +17 -0
  234. package/.next/standalone/sdk/typescript/src/edge/notice.ts +33 -0
  235. package/.next/standalone/sdk/typescript/src/environment.ts +75 -0
  236. package/.next/standalone/sdk/typescript/src/evaluator/authoring.ts +480 -0
  237. package/.next/standalone/sdk/typescript/src/evaluator/cli.ts +96 -0
  238. package/.next/standalone/sdk/typescript/src/evaluator/client.ts +421 -0
  239. package/.next/standalone/sdk/typescript/src/evaluator/expression.ts +1292 -0
  240. package/.next/standalone/sdk/typescript/src/evaluator/index.ts +144 -0
  241. package/.next/standalone/sdk/typescript/src/evaluator/protocol.ts +747 -0
  242. package/.next/standalone/sdk/typescript/src/evaluator/runtime.ts +930 -0
  243. package/.next/standalone/sdk/typescript/src/evaluator/sandbox-worker.ts +171 -0
  244. package/.next/standalone/sdk/typescript/src/evaluator/source-limits.ts +27 -0
  245. package/.next/standalone/sdk/typescript/src/evaluator/source.ts +509 -0
  246. package/.next/standalone/sdk/typescript/src/events.ts +879 -0
  247. package/.next/standalone/sdk/typescript/src/exit.ts +117 -0
  248. package/.next/standalone/sdk/typescript/src/index.ts +186 -0
  249. package/.next/standalone/sdk/typescript/src/integrations/ai.ts +1566 -0
  250. package/.next/standalone/sdk/typescript/src/integrations/compat.ts +322 -0
  251. package/.next/standalone/sdk/typescript/src/integrations/core.ts +1321 -0
  252. package/.next/standalone/sdk/typescript/src/integrations/index.ts +355 -0
  253. package/.next/standalone/sdk/typescript/src/integrations/langchain.ts +2340 -0
  254. package/.next/standalone/sdk/typescript/src/integrations/llamaindex.ts +2111 -0
  255. package/.next/standalone/sdk/typescript/src/integrations/mastra.ts +1802 -0
  256. package/.next/standalone/sdk/typescript/src/logger.ts +98 -0
  257. package/.next/standalone/sdk/typescript/src/next.ts +115 -0
  258. package/.next/standalone/sdk/typescript/src/node-require.ts +446 -0
  259. package/.next/standalone/sdk/typescript/src/redact.ts +305 -0
  260. package/.next/standalone/sdk/typescript/src/resolver.ts +120 -0
  261. package/.next/standalone/sdk/typescript/src/runtime.ts +29 -0
  262. package/.next/standalone/sdk/typescript/src/schema.ts +410 -0
  263. package/.next/standalone/sdk/typescript/src/scopes.ts +701 -0
  264. package/.next/standalone/sdk/typescript/src/shared.ts +33 -0
  265. package/.next/standalone/sdk/typescript/src/version.ts +5 -0
  266. package/.next/standalone/sdk/typescript/src/writer.ts +934 -0
  267. package/.next/standalone/sdk/typescript/test/adapters.test.ts +397 -0
  268. package/.next/standalone/sdk/typescript/test/ai.test.ts +1076 -0
  269. package/.next/standalone/sdk/typescript/test/copies.test.ts +204 -0
  270. package/.next/standalone/sdk/typescript/test/edge.test.ts +183 -0
  271. package/.next/standalone/sdk/typescript/test/evaluator-client.test.ts +234 -0
  272. package/.next/standalone/sdk/typescript/test/evaluator-protocol.test.ts +225 -0
  273. package/.next/standalone/sdk/typescript/test/events.test.ts +193 -0
  274. package/.next/standalone/sdk/typescript/test/expression.test.ts +181 -0
  275. package/.next/standalone/sdk/typescript/test/global-setup.ts +26 -0
  276. package/.next/standalone/sdk/typescript/test/helpers.ts +130 -0
  277. package/.next/standalone/sdk/typescript/test/integrations.test.ts +369 -0
  278. package/.next/standalone/sdk/typescript/test/langchain-copies.test.ts +204 -0
  279. package/.next/standalone/sdk/typescript/test/langchain.test.ts +999 -0
  280. package/.next/standalone/sdk/typescript/test/llamaindex.test.ts +1760 -0
  281. package/.next/standalone/sdk/typescript/test/mastra-coverage.test.ts +501 -0
  282. package/.next/standalone/sdk/typescript/test/mastra-lifecycle.test.ts +479 -0
  283. package/.next/standalone/sdk/typescript/test/mastra.test.ts +285 -0
  284. package/.next/standalone/sdk/typescript/test/next.test.ts +109 -0
  285. package/.next/standalone/sdk/typescript/test/packaging.test.ts +312 -0
  286. package/.next/standalone/sdk/typescript/test/redaction.test.ts +171 -0
  287. package/.next/standalone/sdk/typescript/test/runtimes.test.ts +101 -0
  288. package/.next/standalone/sdk/typescript/test/sandbox.test.ts +189 -0
  289. package/.next/standalone/sdk/typescript/test/scopes.test.ts +271 -0
  290. package/.next/standalone/sdk/typescript/test/setup.ts +19 -0
  291. package/.next/standalone/sdk/typescript/test/skill-snippets.test.ts +73 -0
  292. package/.next/standalone/sdk/typescript/test/spool-contract.test.ts +124 -0
  293. package/.next/standalone/sdk/typescript/test/tracker-bounds.test.ts +191 -0
  294. package/.next/standalone/sdk/typescript/test/wire-format.test.ts +214 -0
  295. package/.next/standalone/sdk/typescript/test/writer.test.ts +407 -0
  296. package/.next/standalone/sdk/typescript/tsconfig.build.json +15 -0
  297. package/.next/standalone/sdk/typescript/tsconfig.cjs.json +19 -0
  298. package/.next/standalone/sdk/typescript/tsconfig.json +28 -0
  299. package/.next/standalone/sdk/typescript/vitest.config.ts +33 -0
  300. package/.next/standalone/sdk/typescript/vitest.integration.config.ts +23 -0
  301. package/.next/standalone/server.js +1 -1
  302. package/README.md +2 -2
  303. package/dist/cli.mjs +225 -30
  304. package/dist/worker.mjs +120 -14
  305. package/package.json +10 -10
  306. package/scripts/build-policy-pack.mjs +14 -0
  307. package/src/audit/features.ts +3 -2
  308. package/src/hooks/builtin-policies.ts +156 -5
  309. package/src/hooks/jev-cli.ts +57 -1
  310. package/src/hooks/manager.ts +1 -1
  311. package/src/hooks/pack-cli.ts +191 -24
  312. package/src/hooks/pack-store.ts +1 -1
  313. package/src/hooks/policy-catalog.ts +148 -9
  314. package/src/hooks/types.ts +1 -1
  315. package/.next/standalone/.next/static/chunks/15heikmy3yjzc.js +0 -1
  316. package/.next/standalone/.next/static/chunks/285spx855h_3r.css +0 -2
  317. package/.next/standalone/.next/static/chunks/2plg9qae1yejv.js +0 -69
  318. /package/.next/standalone/.next/static/{qbVI48kgBOf9CTOKcFIk2 → gbEOjBgZAxF2UIUwZVHNu}/_buildManifest.js +0 -0
  319. /package/.next/standalone/.next/static/{qbVI48kgBOf9CTOKcFIk2 → gbEOjBgZAxF2UIUwZVHNu}/_clientMiddlewareManifest.js +0 -0
  320. /package/.next/standalone/.next/static/{qbVI48kgBOf9CTOKcFIk2 → gbEOjBgZAxF2UIUwZVHNu}/_ssgManifest.js +0 -0
package/dist/worker.mjs CHANGED
@@ -708,7 +708,8 @@ var init_policy_catalog = __esm(() => {
708
708
  impact: "Catches catastrophic `rm -rf /` and Windows equivalents.",
709
709
  description: "Prevent catastrophic deletions",
710
710
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
711
- authority: "hard",
711
+ authority: "reviewable",
712
+ reviewedBy: ["destructive-deletion"],
712
713
  defaultEnabled: false,
713
714
  category: "Dangerous Commands",
714
715
  params: {
@@ -739,7 +740,8 @@ var init_policy_catalog = __esm(() => {
739
740
  impact: "kubectl can change live cluster state — gated unless allow-listed.",
740
741
  description: "Block kubectl commands (Kubernetes cluster mutations)",
741
742
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
742
- authority: "hard",
743
+ authority: "reviewable",
744
+ reviewedBy: ["production-infra-change"],
743
745
  defaultEnabled: false,
744
746
  category: "Infra Commands",
745
747
  params: {
@@ -756,7 +758,8 @@ var init_policy_catalog = __esm(() => {
756
758
  impact: "Terraform mutates real infrastructure — gated unless allow-listed.",
757
759
  description: "Block terraform and tofu (OpenTofu) commands",
758
760
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
759
- authority: "hard",
761
+ authority: "reviewable",
762
+ reviewedBy: ["production-infra-change"],
760
763
  defaultEnabled: false,
761
764
  category: "Infra Commands",
762
765
  params: {
@@ -773,7 +776,8 @@ var init_policy_catalog = __esm(() => {
773
776
  impact: "AWS CLI can spend money or break prod — gated.",
774
777
  description: "Block aws CLI commands",
775
778
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
776
- authority: "hard",
779
+ authority: "reviewable",
780
+ reviewedBy: ["production-infra-change"],
777
781
  defaultEnabled: false,
778
782
  category: "Infra Commands",
779
783
  params: {
@@ -790,7 +794,8 @@ var init_policy_catalog = __esm(() => {
790
794
  impact: "gcloud can spend money or break prod — gated.",
791
795
  description: "Block gcloud (Google Cloud) CLI commands",
792
796
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
793
- authority: "hard",
797
+ authority: "reviewable",
798
+ reviewedBy: ["production-infra-change"],
794
799
  defaultEnabled: false,
795
800
  category: "Infra Commands",
796
801
  params: {
@@ -807,7 +812,8 @@ var init_policy_catalog = __esm(() => {
807
812
  impact: "az can spend money or break prod — gated.",
808
813
  description: "Block az (Azure) CLI commands",
809
814
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
810
- authority: "hard",
815
+ authority: "reviewable",
816
+ reviewedBy: ["production-infra-change"],
811
817
  defaultEnabled: false,
812
818
  category: "Infra Commands",
813
819
  params: {
@@ -824,7 +830,8 @@ var init_policy_catalog = __esm(() => {
824
830
  impact: "Helm releases mutate cluster state — gated.",
825
831
  description: "Block helm commands",
826
832
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
827
- authority: "hard",
833
+ authority: "reviewable",
834
+ reviewedBy: ["production-infra-change"],
828
835
  defaultEnabled: false,
829
836
  category: "Infra Commands",
830
837
  params: {
@@ -858,7 +865,8 @@ var init_policy_catalog = __esm(() => {
858
865
  impact: "Stops the agent from creating `.pem`, `id_rsa`, `credentials.json`, etc.",
859
866
  description: "Block writing secret key files",
860
867
  match: { events: ["PreToolUse"], toolNames: ["Write"] },
861
- authority: "hard",
868
+ authority: "reviewable",
869
+ reviewedBy: ["secret-exposure"],
862
870
  defaultEnabled: false,
863
871
  category: "Dangerous Commands",
864
872
  params: {
@@ -892,7 +900,8 @@ var init_policy_catalog = __esm(() => {
892
900
  impact: "Force-pushes rewrite history and can clobber teammates' work.",
893
901
  description: "Prevent force-pushing to any branch",
894
902
  match: { events: ["PreToolUse"], toolNames: ["Bash"] },
895
- authority: "hard",
903
+ authority: "reviewable",
904
+ reviewedBy: ["git-history-rewrite"],
896
905
  defaultEnabled: false,
897
906
  category: "Git"
898
907
  },
@@ -934,6 +943,23 @@ var init_policy_catalog = __esm(() => {
934
943
  defaultEnabled: false,
935
944
  category: "Git"
936
945
  },
946
+ {
947
+ name: "warn-git-clean",
948
+ displayTitle: "Tried to delete untracked or ignored files with git clean",
949
+ impact: "`git clean -fdx` takes `.env`, local config and unstaged work — git never had a copy of any of it.",
950
+ description: "Warns before git clean deletes untracked directories (-d) or ignored files (-x / -X)",
951
+ match: { events: ["PreToolUse"], toolNames: ["Bash"] },
952
+ authority: "hard",
953
+ defaultEnabled: false,
954
+ category: "Git",
955
+ params: {
956
+ destructiveFlags: {
957
+ type: "string[]",
958
+ description: "git clean flag letters that make it worth warning about, checked alongside --force. Narrow to ['x','X'] to allow `git clean -fd`, or widen with 'f' to warn on a bare `git clean -f`.",
959
+ default: ["d", "x", "X"]
960
+ }
961
+ }
962
+ },
937
963
  {
938
964
  name: "warn-all-files-staged",
939
965
  displayTitle: "Staged all files with git add -A / .",
@@ -1136,7 +1162,7 @@ function instruct(reason) {
1136
1162
  }
1137
1163
 
1138
1164
  // package.json
1139
- var version = "1.0.7-beta.0";
1165
+ var version = "1.0.7-beta.2";
1140
1166
  var init_package = () => {};
1141
1167
 
1142
1168
  // src/hooks/policy-types.ts
@@ -2055,7 +2081,7 @@ function stripShellQuoting(command) {
2055
2081
  const ansiDecoded = joined.replace(/\$'((?:[^'\\]|\\.)*)'/g, (_, body) => decodeAnsiC(body));
2056
2082
  return ansiDecoded.replace(/\\(.)/g, "$1").replace(/['"]/g, "");
2057
2083
  }
2058
- function gitSubcommand(args) {
2084
+ function gitSubcommandIndex(args) {
2059
2085
  for (let i = 0;i < args.length; i++) {
2060
2086
  const arg = args[i];
2061
2087
  if (GIT_FLAGS_WITH_OPERANDS.has(arg)) {
@@ -2064,9 +2090,13 @@ function gitSubcommand(args) {
2064
2090
  }
2065
2091
  if (arg.startsWith("-"))
2066
2092
  continue;
2067
- return arg;
2093
+ return i;
2068
2094
  }
2069
- return;
2095
+ return -1;
2096
+ }
2097
+ function gitSubcommand(args) {
2098
+ const i = gitSubcommandIndex(args);
2099
+ return i < 0 ? undefined : args[i];
2070
2100
  }
2071
2101
  function globCouldNameState(raw) {
2072
2102
  const stripped = raw.replace(/^[()]+|[()]+$/g, "");
@@ -3182,6 +3212,77 @@ function warnGitStashDrop(ctx) {
3182
3212
  }
3183
3213
  return allow();
3184
3214
  }
3215
+ function readGitCleanFlags(args) {
3216
+ const letters = new Set;
3217
+ let force = false;
3218
+ let dryRun = false;
3219
+ let sawEndOfOptions = false;
3220
+ for (const token of args) {
3221
+ if (token === "--") {
3222
+ sawEndOfOptions = true;
3223
+ continue;
3224
+ }
3225
+ if (sawEndOfOptions)
3226
+ continue;
3227
+ if (token === "--force") {
3228
+ force = true;
3229
+ continue;
3230
+ }
3231
+ if (token === "--dry-run") {
3232
+ dryRun = true;
3233
+ continue;
3234
+ }
3235
+ if (token.startsWith("--"))
3236
+ continue;
3237
+ if (!SHORT_FLAG_CLUSTER_RE.test(token))
3238
+ continue;
3239
+ for (const letter of token.slice(1)) {
3240
+ if (letter === "f")
3241
+ force = true;
3242
+ if (letter === "n")
3243
+ dryRun = true;
3244
+ letters.add(letter);
3245
+ }
3246
+ }
3247
+ if (force)
3248
+ letters.add("f");
3249
+ return { force, dryRun, letters };
3250
+ }
3251
+ function gitCleanForceWaived(globalOptions) {
3252
+ for (let i = 0;i < globalOptions.length; i++) {
3253
+ const token = globalOptions[i];
3254
+ const value = token === "-c" ? globalOptions[i + 1] : token.startsWith("-c") ? token.slice(2) : undefined;
3255
+ if (value !== undefined && GIT_CLEAN_FORCE_WAIVED_RE.test(value))
3256
+ return true;
3257
+ }
3258
+ return false;
3259
+ }
3260
+ function warnGitClean(ctx) {
3261
+ if (ctx.toolName !== "Bash")
3262
+ return allow();
3263
+ const destructiveFlags = ctx.params?.destructiveFlags ?? GIT_CLEAN_DESTRUCTIVE_FLAGS;
3264
+ if (destructiveFlags.length === 0)
3265
+ return allow();
3266
+ for (const segment of shellSegments(getCommand(ctx))) {
3267
+ const tokens = parseArgvTokens(segment);
3268
+ const gitIdx = tokens.findIndex((t) => GIT_CMD_RE.test(t));
3269
+ if (gitIdx < 0)
3270
+ continue;
3271
+ const args = tokens.slice(gitIdx + 1);
3272
+ const subIdx = gitSubcommandIndex(args);
3273
+ if (subIdx < 0 || args[subIdx] !== "clean")
3274
+ continue;
3275
+ const flags = readGitCleanFlags(args.slice(subIdx + 1));
3276
+ if (flags.dryRun)
3277
+ continue;
3278
+ if (!flags.force && !gitCleanForceWaived(args.slice(0, subIdx)))
3279
+ continue;
3280
+ if (!destructiveFlags.some((f) => flags.letters.has(f)))
3281
+ continue;
3282
+ return instruct("STOP: This command deletes untracked files from the working tree (git clean). Git has no copy of " + "untracked or ignored files, so nothing it removes can be recovered: -d takes whole untracked " + "directories, and -x / -X also take .gitignore'd files such as .env, local config and scratch work. " + "Re-run it with --dry-run and confirm the exact paths with the user before executing.");
3283
+ }
3284
+ return allow();
3285
+ }
3185
3286
  function warnAllFilesStaged(ctx) {
3186
3287
  if (ctx.toolName !== "Bash")
3187
3288
  return allow();
@@ -3567,7 +3668,7 @@ function registerBuiltinPolicies(enabledNames) {
3567
3668
  }
3568
3669
  }
3569
3670
  }
3570
- var isClaudeInternalPath, isClaudeSettingsFile, SHELL_OPERATORS, SHELL_METACHAR_RE, JWT_RE, API_KEY_PATTERNS, CONNECTION_STRING_RE, PRIVATE_KEY_RE, BEARER_TOKEN_RE, SECRET_PATTERNS, SQL_TOOL_RE, DESTRUCTIVE_SQL_RE, DELETE_NO_WHERE_RE, SQL_WHERE_RE, SCHEMA_ALTER_RE, PUBLISH_CMD_RE, ENV_PRINTENV_RE, ECHO_ENV_RE, EXPORT_RE, PS_ENV_VAR_RE, PS_CHILDITEM_ENV_RE, DOTNET_GETENV_RE, CMD_ECHO_ENV_RE, ENV_FILE_PATH_RE, ENV_CMD_RE, PS_ELEVATION_RE, RUNAS_RE, CURL_PIPE_SH_RE, SEGMENT_SEPARATORS, COMMAND_PREFIX_TOKENS, SELF_BINARY_TOKEN_RE, SELF_ENTRY_PATH_RE, CONFIG_SUBCOMMAND_RE, PAUSE_FLAG_RE, ENV_ASSIGNMENT_RE, RUNNER_OPERAND_RE, PS_WEB_PIPE_RE, SHORT_FLAG_BUNDLE_RE, SAFE_FORCE_PREFIXES, SECRET_FILE_RE, SECRET_FILE_ID_RSA_RE, SECRET_FILE_CREDENTIALS_RE, GIT_COMMIT_MERGE_RE, FAILPROOFAI_STATE_PATH_RE, STATE_READ_COMMANDS, SHELL_KEYWORD_PREFIXES, LOOP_HEADER_RE, COPY_COMMANDS, OPERAND_WRITE_COMMANDS, SECOND_OPERAND_WRITERS, OUTPUT_FLAG_COMMANDS, FIND_WRITE_ACTIONS, SAFE_EXEC_COMMANDS, GIT_DESTRUCTIVE_SUBCOMMANDS, GIT_FLAGS_WITH_OPERANDS, STATE_MENTION_COMMANDS, FIND_EXEC_ACTIONS, PIPELINE_SEPARATORS, VAR_REFERENCE_RE, STATE_GLOB_CANDIDATES, GLOB_DECOYS, BRACE_EXPANSION_LIMIT = 4096, BRACE_EXPANSION_ROUNDS = 24, GLOB_METACHAR_RE, REDIRECT_TARGET_RE, FAILPROOFAI_UNINSTALL_RE, GIT_AMEND_RE, GIT_STASH_DROP_RE, GIT_ADD_ALL_RE, NPM_GLOBAL_RE, YARN_GLOBAL_RE, PNPM_GLOBAL_RE, BUN_GLOBAL_RE, CARGO_INSTALL_RE, PIP_SYSTEM_RE, PKG_MANAGER_DETECTORS, NOHUP_RE, SCREEN_DETACH_RE, TMUX_DETACH_RE, DISOWN_RE, BACKGROUND_AMPERSAND_RE, KUBECTL_RE, TERRAFORM_RE, AWS_CLI_RE, GCLOUD_RE, AZ_CLI_RE, HELM_RE, GH_PIPELINE_RE, gitBranchCache, GIT_BRANCH_CACHE_MAX_ENTRIES = 500, EVAL_FLAG_RE, HOME_PREFIX_RE, RM_CMD_RE, FIND_CMD_RE, FIND_EXEC_RE, FIND_GLOBAL_OPT_RE, FIND_EXPR_START_RE, SCRATCH_ROOTS, CATASTROPHIC_DEPTH = 2, READ_LIKE_CMDS, TOOL_CALL_TRACKER_MAX_BYTES = 65536, SEGMENT_SPLIT_RE, POLICY_IMPLEMENTATIONS, BUILTIN_POLICIES;
3671
+ var isClaudeInternalPath, isClaudeSettingsFile, SHELL_OPERATORS, SHELL_METACHAR_RE, JWT_RE, API_KEY_PATTERNS, CONNECTION_STRING_RE, PRIVATE_KEY_RE, BEARER_TOKEN_RE, SECRET_PATTERNS, SQL_TOOL_RE, DESTRUCTIVE_SQL_RE, DELETE_NO_WHERE_RE, SQL_WHERE_RE, SCHEMA_ALTER_RE, PUBLISH_CMD_RE, ENV_PRINTENV_RE, ECHO_ENV_RE, EXPORT_RE, PS_ENV_VAR_RE, PS_CHILDITEM_ENV_RE, DOTNET_GETENV_RE, CMD_ECHO_ENV_RE, ENV_FILE_PATH_RE, ENV_CMD_RE, PS_ELEVATION_RE, RUNAS_RE, CURL_PIPE_SH_RE, SEGMENT_SEPARATORS, COMMAND_PREFIX_TOKENS, SELF_BINARY_TOKEN_RE, SELF_ENTRY_PATH_RE, CONFIG_SUBCOMMAND_RE, PAUSE_FLAG_RE, ENV_ASSIGNMENT_RE, RUNNER_OPERAND_RE, PS_WEB_PIPE_RE, SHORT_FLAG_BUNDLE_RE, SAFE_FORCE_PREFIXES, SECRET_FILE_RE, SECRET_FILE_ID_RSA_RE, SECRET_FILE_CREDENTIALS_RE, GIT_COMMIT_MERGE_RE, FAILPROOFAI_STATE_PATH_RE, STATE_READ_COMMANDS, SHELL_KEYWORD_PREFIXES, LOOP_HEADER_RE, COPY_COMMANDS, OPERAND_WRITE_COMMANDS, SECOND_OPERAND_WRITERS, OUTPUT_FLAG_COMMANDS, FIND_WRITE_ACTIONS, SAFE_EXEC_COMMANDS, GIT_DESTRUCTIVE_SUBCOMMANDS, GIT_FLAGS_WITH_OPERANDS, STATE_MENTION_COMMANDS, FIND_EXEC_ACTIONS, PIPELINE_SEPARATORS, VAR_REFERENCE_RE, STATE_GLOB_CANDIDATES, GLOB_DECOYS, BRACE_EXPANSION_LIMIT = 4096, BRACE_EXPANSION_ROUNDS = 24, GLOB_METACHAR_RE, REDIRECT_TARGET_RE, FAILPROOFAI_UNINSTALL_RE, GIT_AMEND_RE, GIT_STASH_DROP_RE, GIT_CMD_RE, SHORT_FLAG_CLUSTER_RE, GIT_CLEAN_FORCE_WAIVED_RE, GIT_CLEAN_DESTRUCTIVE_FLAGS, GIT_ADD_ALL_RE, NPM_GLOBAL_RE, YARN_GLOBAL_RE, PNPM_GLOBAL_RE, BUN_GLOBAL_RE, CARGO_INSTALL_RE, PIP_SYSTEM_RE, PKG_MANAGER_DETECTORS, NOHUP_RE, SCREEN_DETACH_RE, TMUX_DETACH_RE, DISOWN_RE, BACKGROUND_AMPERSAND_RE, KUBECTL_RE, TERRAFORM_RE, AWS_CLI_RE, GCLOUD_RE, AZ_CLI_RE, HELM_RE, GH_PIPELINE_RE, gitBranchCache, GIT_BRANCH_CACHE_MAX_ENTRIES = 500, EVAL_FLAG_RE, HOME_PREFIX_RE, RM_CMD_RE, FIND_CMD_RE, FIND_EXEC_RE, FIND_GLOBAL_OPT_RE, FIND_EXPR_START_RE, SCRATCH_ROOTS, CATASTROPHIC_DEPTH = 2, READ_LIKE_CMDS, TOOL_CALL_TRACKER_MAX_BYTES = 65536, SEGMENT_SPLIT_RE, POLICY_IMPLEMENTATIONS, BUILTIN_POLICIES;
3571
3672
  var init_builtin_policies = __esm(() => {
3572
3673
  init_policy_catalog();
3573
3674
  init_policy_registry();
@@ -3836,6 +3937,10 @@ var init_builtin_policies = __esm(() => {
3836
3937
  FAILPROOFAI_UNINSTALL_RE = /(?:npm\s+(?:uninstall|remove|un|r)\s.*failproofai|bun\s+remove\s.*failproofai|yarn\s+global\s+remove\s+failproofai|pnpm\s+(?:remove|uninstall|un)\s.*failproofai)/;
3837
3938
  GIT_AMEND_RE = /\bgit\s+commit\b.*--amend\b/;
3838
3939
  GIT_STASH_DROP_RE = /\bgit\s+stash\s+(?:drop|clear)\b/;
3940
+ GIT_CMD_RE = /^(?:\/\S*\/)?git$/;
3941
+ SHORT_FLAG_CLUSTER_RE = /^-[A-Za-z]+$/;
3942
+ GIT_CLEAN_FORCE_WAIVED_RE = /^clean\.requireforce=(?:false|0|no|off)$/i;
3943
+ GIT_CLEAN_DESTRUCTIVE_FLAGS = ["d", "x", "X"];
3839
3944
  GIT_ADD_ALL_RE = /\bgit\s+add\s+(?:-A\b|--all\b|\.(?:\s|$|;|&&|\|\|))/;
3840
3945
  NPM_GLOBAL_RE = /\bnpm\s+(?:install|i)\b(?=.*(?:\s-g\b|--global\b))/;
3841
3946
  YARN_GLOBAL_RE = /\byarn\s+global\s+add\b/;
@@ -3904,6 +4009,7 @@ var init_builtin_policies = __esm(() => {
3904
4009
  "block-work-on-main": blockWorkOnMain,
3905
4010
  "warn-git-amend": warnGitAmend,
3906
4011
  "warn-git-stash-drop": warnGitStashDrop,
4012
+ "warn-git-clean": warnGitClean,
3907
4013
  "warn-all-files-staged": warnAllFilesStaged,
3908
4014
  "warn-destructive-sql": warnDestructiveSql,
3909
4015
  "warn-schema-alteration": warnSchemaAlteration,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "failproofai",
3
- "version": "1.0.7-beta.0",
4
- "description": "Observability and enforcement for AI agent harnesses. 39 built-in policies hooked into 12 of them — Claude Code, Codex, Cursor, Hermes, OpenClaw and more — blocking the tool call before it runs. Local dashboard included, no account needed.",
3
+ "version": "1.0.7-beta.2",
4
+ "description": "Observability and enforcement for AI agent harnesses. 40 built-in policies hooked into 12 of them — Claude Code, Codex, Cursor, Hermes, OpenClaw and more — blocking the tool call before it runs. Local dashboard included, no account needed.",
5
5
  "bin": {
6
6
  "failproofai": "./dist/cli.mjs",
7
7
  "failproofaid": "./bin/failproofaid-shim.mjs"
@@ -122,15 +122,15 @@
122
122
  "browserslist": "4.28.8"
123
123
  },
124
124
  "optionalDependencies": {
125
- "@failproofai/failproofaid-linux-x64": "1.0.7-beta.0",
126
- "@failproofai/failproofaid-linux-arm64": "1.0.7-beta.0",
127
- "@failproofai/failproofaid-darwin-x64": "1.0.7-beta.0",
128
- "@failproofai/failproofaid-darwin-arm64": "1.0.7-beta.0"
125
+ "@failproofai/failproofaid-linux-x64": "1.0.7-beta.2",
126
+ "@failproofai/failproofaid-linux-arm64": "1.0.7-beta.2",
127
+ "@failproofai/failproofaid-darwin-x64": "1.0.7-beta.2",
128
+ "@failproofai/failproofaid-darwin-arm64": "1.0.7-beta.2"
129
129
  },
130
130
  "failproofaidBinaries": {
131
- "linux-x64": "3ac234868fe9149179c32981da9ae1209371e98df7ffb09c6a4947664a3d6857",
132
- "linux-arm64": "3603faac5741c321a63ba5a963e0cb4bb38c84663a63b53f764faae020116f90",
133
- "darwin-x64": "c8a5b32a1e97b5a7f76ce4e42c78f0d566d108be65fdca3c6cd59c405f39b946",
134
- "darwin-arm64": "255ac741c3ee3069591b1eb8bbf397baa0722ef240b83a8540b73f3f1b35722c"
131
+ "linux-x64": "5362ab6a4cfb23d1eee598aac67aedd9e43351e62724ee1c6b40c4fc8021c08f",
132
+ "linux-arm64": "f14a2548b41e14ad32b7fdd03a27ffe7160da1046e422e1f651099371b0d27e5",
133
+ "darwin-x64": "14189cade04f17cf5278bd8061a5ec0c2a2381aa21944ae0d05e8c35b98c2816",
134
+ "darwin-arm64": "4ba9f5c321894d953407efa3404f0deec07dccfd7db7bc2511bb35226816b583"
135
135
  }
136
136
  }
@@ -114,6 +114,20 @@ for (const policy of BUILTIN_POLICIES) {
114
114
  defaultEnabled: policy.defaultEnabled === true,
115
115
  match: policy.match,
116
116
  fn: policy.fn,
117
+ // The parameter schema. It has to be registered here as well as written
118
+ // into the manifest this script builds, because there are TWO manifest
119
+ // producers for this pack and they have to agree: this script builds one
120
+ // from POLICY_CATALOG, and the publish command rebuilds one by importing
121
+ // the entry and reading back what it registered. A field the entry does
122
+ // not register is a field the second producer cannot know about.
123
+ //
124
+ // params is the one that fails silently STRICTER. Registration reads a
125
+ // pack policy's schema from the manifest, so an absent schema means the
126
+ // policy sees empty params: block-sudo's allowPatterns, and block-rm-rf's
127
+ // and block-read-outside-cwd's allowPaths, stop applying -- taking the
128
+ // user's own configured values with them. No backticks in this comment:
129
+ // see the note above entrySource.
130
+ ...(policy.params !== undefined ? { params: policy.params } : {}),
117
131
  // Whether Jev may clear it; see the note on authority at the top.
118
132
  ...(policy.authority !== undefined ? { authority: policy.authority } : {}),
119
133
  ...(policy.reviewedBy !== undefined ? { reviewedBy: policy.reviewedBy } : {}),
@@ -69,13 +69,13 @@ export const ARCHITECT_CAUTION_SIGNALS = new Set(["reread-after-edit", "redundan
69
69
 
70
70
  /**
71
71
  * Mapping from policy/detector short-name → which archetype its hits feed,
72
- * and how heavily (intensity within the cluster). Every one of the 39 builtin
72
+ * and how heavily (intensity within the cluster). Every one of the 40 builtin
73
73
  * policies and 8 audit-only detectors maps exactly once — no overlaps, full
74
74
  * coverage. Weights express *severity within* a persona; cross-persona
75
75
  * fairness is handled later by lift normalisation, not by these numbers.
76
76
  */
77
77
  export const SIGNAL_MAP: Record<string, { archetype: ArchetypeKey; weight: number }> = {
78
- // ── cowboy ── destructive / forceful / bypasses guardrails (20) ───────────
78
+ // ── cowboy ── destructive / forceful / bypasses guardrails (21) ───────────
79
79
  "block-rm-rf": { archetype: "cowboy", weight: 2.0 },
80
80
  "block-failproofai-commands":{ archetype: "cowboy", weight: 2.0 },
81
81
  "block-sudo": { archetype: "cowboy", weight: 1.5 },
@@ -88,6 +88,7 @@ export const SIGNAL_MAP: Record<string, { archetype: ArchetypeKey; weight: numbe
88
88
  "git-commit-no-verify": { archetype: "cowboy", weight: 1.5 },
89
89
  "warn-git-amend": { archetype: "cowboy", weight: 0.8 },
90
90
  "warn-git-stash-drop": { archetype: "cowboy", weight: 1.0 },
91
+ "warn-git-clean": { archetype: "cowboy", weight: 1.0 },
91
92
  "warn-all-files-staged": { archetype: "cowboy", weight: 0.6 },
92
93
  "block-kubectl": { archetype: "cowboy", weight: 1.5 },
93
94
  "block-terraform": { archetype: "cowboy", weight: 1.5 },
@@ -623,8 +623,15 @@ const GIT_DESTRUCTIVE_SUBCOMMANDS = new Set([
623
623
  */
624
624
  const GIT_FLAGS_WITH_OPERANDS = new Set(["-C", "-c", "--git-dir", "--work-tree", "--namespace", "--exec-path"]);
625
625
 
626
- /** The `git` subcommand, with git's own global options walked off first. */
627
- function gitSubcommand(args: string[]): string | undefined {
626
+ /**
627
+ * Where the `git` subcommand sits in `args`, with git's own global options
628
+ * walked off first, or `-1` when there is no subcommand at all.
629
+ *
630
+ * The index rather than the value, because a caller that wants to read the
631
+ * SUBCOMMAND's flags (`warnGitClean`) needs to know where they start, and
632
+ * `args.indexOf("clean")` would land on a `-C clean` operand instead.
633
+ */
634
+ function gitSubcommandIndex(args: string[]): number {
628
635
  for (let i = 0; i < args.length; i++) {
629
636
  const arg = args[i];
630
637
  if (GIT_FLAGS_WITH_OPERANDS.has(arg)) {
@@ -632,9 +639,15 @@ function gitSubcommand(args: string[]): string | undefined {
632
639
  continue;
633
640
  }
634
641
  if (arg.startsWith("-")) continue;
635
- return arg;
642
+ return i;
636
643
  }
637
- return undefined;
644
+ return -1;
645
+ }
646
+
647
+ /** The `git` subcommand, with git's own global options walked off first. */
648
+ function gitSubcommand(args: string[]): string | undefined {
649
+ const i = gitSubcommandIndex(args);
650
+ return i < 0 ? undefined : args[i];
638
651
  }
639
652
 
640
653
  /**
@@ -1379,6 +1392,48 @@ const GIT_AMEND_RE = /\bgit\s+commit\b.*--amend\b/;
1379
1392
  // warnGitStashDrop
1380
1393
  const GIT_STASH_DROP_RE = /\bgit\s+stash\s+(?:drop|clear)\b/;
1381
1394
 
1395
+ // warnGitClean
1396
+ /**
1397
+ * `git`, however the command line spells it. Same shape as {@link RM_CMD_RE}:
1398
+ * an absolute path to the binary does not change what it does.
1399
+ */
1400
+ const GIT_CMD_RE = /^(?:\/\S*\/)?git$/;
1401
+
1402
+ /** A short-flag cluster: `-f`, `-fdx`, `-xdf`. */
1403
+ const SHORT_FLAG_CLUSTER_RE = /^-[A-Za-z]+$/;
1404
+
1405
+ /**
1406
+ * `clean.requireForce=false`, the config that makes `git clean` delete with no
1407
+ * `-f` at all — and settable per invocation as `git -c
1408
+ * clean.requireForce=false clean -xd`. Reading the subcommand's flags alone
1409
+ * would call that "no force, no warning" on the one spelling that needs none.
1410
+ */
1411
+ const GIT_CLEAN_FORCE_WAIVED_RE = /^clean\.requireforce=(?:false|0|no|off)$/i;
1412
+
1413
+ /**
1414
+ * The default `destructiveFlags`, and why the condition is these three letters
1415
+ * rather than "any `git clean`".
1416
+ *
1417
+ * `git clean` deletes nothing without `-f` / `--force` (or the config above),
1418
+ * and `-n` / `--dry-run` only prints — so force is the precondition and
1419
+ * dry-run is the exemption. What force ALONE removes is untracked files in the
1420
+ * current directory: the narrowest spelling, and the one people mean when they
1421
+ * tidy up. These are the letters that widen the blast radius past that:
1422
+ *
1423
+ * - `-x` also removes IGNORED files — `.env`, local config, editor state,
1424
+ * scratch work. That is the data that genuinely cannot be rebuilt by running
1425
+ * a command, and it is what makes `git clean -fdx` the severe spelling.
1426
+ * - `-X` removes ONLY ignored files: the same loss, tracked tree untouched.
1427
+ * - `-d` also removes untracked DIRECTORIES — whole new subtrees git has never
1428
+ * had a copy of.
1429
+ *
1430
+ * A bare `git clean -f` is deliberately absent. It has the smallest radius and
1431
+ * by far the most traffic, and a guard that fires on the ordinary spelling is
1432
+ * one people switch off — which would cost them the `-fdx` warning too. Add
1433
+ * `"f"` to `destructiveFlags` to opt into it.
1434
+ */
1435
+ const GIT_CLEAN_DESTRUCTIVE_FLAGS = ["d", "x", "X"];
1436
+
1382
1437
  // warnAllFilesStaged
1383
1438
  const GIT_ADD_ALL_RE = /\bgit\s+add\s+(?:-A\b|--all\b|\.(?:\s|$|;|&&|\|\|))/;
1384
1439
 
@@ -2528,6 +2583,101 @@ function warnGitStashDrop(ctx: PolicyContext): PolicyResult {
2528
2583
  return allow();
2529
2584
  }
2530
2585
 
2586
+ /** What one `git clean` argument list asks for. */
2587
+ interface GitCleanFlags {
2588
+ force: boolean;
2589
+ dryRun: boolean;
2590
+ /** Short-flag letters, with `--force` counted as `f` so widening works either way. */
2591
+ letters: Set<string>;
2592
+ }
2593
+
2594
+ /**
2595
+ * Read `git clean`'s own options: clusters (`-fdx`) and the two long forms
2596
+ * that matter (`--force`, `--dry-run`).
2597
+ *
2598
+ * Everything after `--` is a pathspec, not a flag — `git clean -n -- -fdx`
2599
+ * asks about a file literally called `-fdx` and deletes nothing.
2600
+ */
2601
+ function readGitCleanFlags(args: string[]): GitCleanFlags {
2602
+ const letters = new Set<string>();
2603
+ let force = false;
2604
+ let dryRun = false;
2605
+ let sawEndOfOptions = false;
2606
+ for (const token of args) {
2607
+ if (token === "--") {
2608
+ sawEndOfOptions = true;
2609
+ continue;
2610
+ }
2611
+ if (sawEndOfOptions) continue;
2612
+ if (token === "--force") {
2613
+ force = true;
2614
+ continue;
2615
+ }
2616
+ if (token === "--dry-run") {
2617
+ dryRun = true;
2618
+ continue;
2619
+ }
2620
+ if (token.startsWith("--")) continue;
2621
+ if (!SHORT_FLAG_CLUSTER_RE.test(token)) continue;
2622
+ for (const letter of token.slice(1)) {
2623
+ if (letter === "f") force = true;
2624
+ if (letter === "n") dryRun = true;
2625
+ letters.add(letter);
2626
+ }
2627
+ }
2628
+ if (force) letters.add("f");
2629
+ return { force, dryRun, letters };
2630
+ }
2631
+
2632
+ /** True when git's own `-c key=value` options waive `clean.requireForce`. */
2633
+ function gitCleanForceWaived(globalOptions: string[]): boolean {
2634
+ for (let i = 0; i < globalOptions.length; i++) {
2635
+ const token = globalOptions[i];
2636
+ const value =
2637
+ token === "-c" ? globalOptions[i + 1] : token.startsWith("-c") ? token.slice(2) : undefined;
2638
+ if (value !== undefined && GIT_CLEAN_FORCE_WAIVED_RE.test(value)) return true;
2639
+ }
2640
+ return false;
2641
+ }
2642
+
2643
+ /**
2644
+ * The gap this closes: `git clean -fdx` was caught by NEITHER tier — no regex
2645
+ * builtin matched the string at all, and the semantic check that covers
2646
+ * unrecoverable deletion cannot fire on it. See the note on the catalog entry
2647
+ * for the measurement and for why this policy is `hard`.
2648
+ */
2649
+ function warnGitClean(ctx: PolicyContext): PolicyResult {
2650
+ if (ctx.toolName !== "Bash") return allow();
2651
+ const destructiveFlags = ((ctx.params?.destructiveFlags ?? GIT_CLEAN_DESTRUCTIVE_FLAGS) as string[]);
2652
+ if (destructiveFlags.length === 0) return allow();
2653
+
2654
+ for (const segment of shellSegments(getCommand(ctx))) {
2655
+ const tokens = parseArgvTokens(segment);
2656
+ // `findIndex`, not `tokens[0]`, so an env prefix (`GIT_DIR=x git clean …`)
2657
+ // and an absolute binary path both still resolve to the git invocation.
2658
+ const gitIdx = tokens.findIndex((t) => GIT_CMD_RE.test(t));
2659
+ if (gitIdx < 0) continue;
2660
+ const args = tokens.slice(gitIdx + 1);
2661
+ const subIdx = gitSubcommandIndex(args);
2662
+ if (subIdx < 0 || args[subIdx] !== "clean") continue;
2663
+
2664
+ const flags = readGitCleanFlags(args.slice(subIdx + 1));
2665
+ // `-n` / `--dry-run` prints what would go and removes nothing, whatever
2666
+ // else is on the line — the safe inspection form, never a warning.
2667
+ if (flags.dryRun) continue;
2668
+ if (!flags.force && !gitCleanForceWaived(args.slice(0, subIdx))) continue;
2669
+ if (!destructiveFlags.some((f) => flags.letters.has(f))) continue;
2670
+
2671
+ return instruct(
2672
+ "STOP: This command deletes untracked files from the working tree (git clean). Git has no copy of " +
2673
+ "untracked or ignored files, so nothing it removes can be recovered: -d takes whole untracked " +
2674
+ "directories, and -x / -X also take .gitignore'd files such as .env, local config and scratch work. " +
2675
+ "Re-run it with --dry-run and confirm the exact paths with the user before executing.",
2676
+ );
2677
+ }
2678
+ return allow();
2679
+ }
2680
+
2531
2681
  function warnAllFilesStaged(ctx: PolicyContext): PolicyResult {
2532
2682
  if (ctx.toolName !== "Bash") return allow();
2533
2683
  const cmd = getCommand(ctx);
@@ -3090,7 +3240,7 @@ function requireCiGreenBeforeStop(ctx: PolicyContext): PolicyResult {
3090
3240
  * Each value is the identical hoisted function object, never a wrapper. Two
3091
3241
  * things depend on that and neither fails loudly: `audit/cache.ts` hashes
3092
3242
  * `fn.toString()` into the audit cache's `engineVersion`, so wrapping every
3093
- * entry would collapse 39 distinct hashes into one and freeze the key — stale
3243
+ * entry would collapse 40 distinct hashes into one and freeze the key — stale
3094
3244
  * audit results would then be served for the full 30-day TTL with no symptom;
3095
3245
  * and `gitBranchCache` is module-scoped, so a per-call factory would silently
3096
3246
  * reset it on every hook event.
@@ -3121,6 +3271,7 @@ const POLICY_IMPLEMENTATIONS: Record<string, PolicyFunction> = {
3121
3271
  "block-work-on-main": blockWorkOnMain,
3122
3272
  "warn-git-amend": warnGitAmend,
3123
3273
  "warn-git-stash-drop": warnGitStashDrop,
3274
+ "warn-git-clean": warnGitClean,
3124
3275
  "warn-all-files-staged": warnAllFilesStaged,
3125
3276
  "warn-destructive-sql": warnDestructiveSql,
3126
3277
  "warn-schema-alteration": warnSchemaAlteration,
@@ -345,6 +345,29 @@ function providerForUrl(url: string): JevProviderKind {
345
345
  }
346
346
  }
347
347
 
348
+ /**
349
+ * The account id a Cloudflare URL already carries, or null.
350
+ *
351
+ * Cloudflare's run endpoint IS per-account — `…/client/v4/accounts/<id>/ai/run`
352
+ * — so the id is in the canonical URL, and asking for it again as a flag asks
353
+ * for something the person has already typed. The first real attempt to
354
+ * configure Cloudflare pasted exactly that URL and was refused with "pass the
355
+ * account id as well", with the id visible in the string being rejected.
356
+ *
357
+ * Read from the path only, never from a query or fragment, and only on a host
358
+ * this build already recognises as Cloudflare's, so nothing else can inject one.
359
+ */
360
+ export function accountIdFromUrl(url: string): string | null {
361
+ try {
362
+ const parsed = new URL(url);
363
+ if (PROVIDER_BY_HOST[parsed.hostname.toLowerCase()] !== "cloudflare") return null;
364
+ const m = /\/accounts\/([0-9a-f]{32})(?:\/|$)/i.exec(parsed.pathname);
365
+ return m ? m[1].toLowerCase() : null;
366
+ } catch {
367
+ return null;
368
+ }
369
+ }
370
+
348
371
  /** Whether a validated URL is exactly where this provider's requests already go. */
349
372
  function isProviderDefaultUrl(kind: JevProviderKind, url: string): boolean {
350
373
  const base = JEV_PROVIDER_DEFAULTS[kind].baseUrl;
@@ -468,6 +491,34 @@ async function setup(argv: string[], deps: JevCliDeps, opts: RenderOpts): Promis
468
491
  }
469
492
  const kind = explicit ?? urlProvider.kind;
470
493
  if (explicit === null) values.set("--provider", kind);
494
+ // Cloudflare's endpoint IS per-account, so the run URL copied out of the
495
+ // dashboard already names the account. Read it from there rather than
496
+ // demanding a value that is sitting in the string being read — the first
497
+ // person to configure Cloudflare pasted exactly that URL and was told to
498
+ // "pass the account id as well", with the id visible in the refusal.
499
+ //
500
+ // Set into `values` here, while the URL is still in scope, because the
501
+ // block below deletes `--url` once it has moved the address to
502
+ // `--base-url`. Everything downstream then treats it as a flag that was
503
+ // given, including the 32-hex validation.
504
+ if (kind === "cloudflare") {
505
+ const fromUrl = accountIdFromUrl(normalized);
506
+ const given = values.get("--account-id");
507
+ if (fromUrl !== null && given === undefined) {
508
+ values.set("--account-id", fromUrl);
509
+ } else if (fromUrl !== null && given !== undefined && given.toLowerCase() !== fromUrl) {
510
+ // Preferring either one silently would send every request to an account
511
+ // the person did not name on the line they are looking at.
512
+ return fail([
513
+ "Not saved: --account-id and the account id in --url are different.",
514
+ ` --url names ${fromUrl}`,
515
+ ` --account-id names ${given.toLowerCase()}`,
516
+ "Drop one of them.",
517
+ "",
518
+ "Nothing was written.",
519
+ ]);
520
+ }
521
+ }
471
522
  // The provider's own API is where its key belongs anyway, so a URL naming
472
523
  // it clears the override instead of writing the same address into the file
473
524
  // (`custom` has no API of its own — its URL is the whole address).
@@ -546,9 +597,14 @@ async function setup(argv: string[], deps: JevCliDeps, opts: RenderOpts): Promis
546
597
  // host with another provider asked for is settled above, and nothing here
547
598
  // demands an id the file would not keep.
548
599
  if (kind === "cloudflare" && urlProvider?.kind === "cloudflare" && typeof next.accountId !== "string") {
600
+ // Reached only when the URL did not carry one either — a bare
601
+ // `/client/v4`, say. The URL form is named as well as the flag, because it
602
+ // is the address the dashboard hands out.
549
603
  return fail([
550
604
  `Not saved: ${urlProvider.host} is Cloudflare Workers AI, whose endpoint is per-account.`,
551
- "Pass the account id as well: --account-id <32 hex characters>.",
605
+ "Pass the account id as well: --account-id <32 hex characters>,",
606
+ "or give the full run URL, which already contains it:",
607
+ " https://api.cloudflare.com/client/v4/accounts/<id>/ai/run",
552
608
  "",
553
609
  "Nothing was written.",
554
610
  ]);
@@ -1108,7 +1108,7 @@ export async function listHooks(cwd?: string): Promise<void> {
1108
1108
  // `packCount` counts ENABLED policies, so a pack installed with everything
1109
1109
  // switched off reaches zero the same way an empty machine does — and the
1110
1110
  // advice for the two could not be more different. Telling somebody who has
1111
- // just unticked all 38 to `policies add FailproofAI/policies` sends them to
1111
+ // just unticked all 39 to `policies add FailproofAI/policies` sends them to
1112
1112
  // install what they already have, and doing it would change nothing: the
1113
1113
  // selection is what is empty, not the shelf.
1114
1114
  const packsInstalled = (() => {