failproofai 0.0.10 โ†’ 0.0.11-beta.10

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 (565) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +9 -1
  3. package/.next/standalone/.next/build-manifest.json +10 -10
  4. package/.next/standalone/.next/prerender-manifest.json +3 -32
  5. package/.next/standalone/.next/required-server-files.json +2 -1
  6. package/.next/standalone/.next/routes-manifest.json +51 -3
  7. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +7 -7
  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 +6 -6
  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 +7 -7
  20. package/.next/standalone/.next/server/app/_not-found/page/next-font-manifest.json +2 -6
  21. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  22. package/.next/standalone/.next/server/app/_not-found/page.js +12 -13
  23. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  26. package/.next/standalone/.next/server/app/_not-found.rsc +16 -16
  27. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +16 -16
  28. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  29. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
  30. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  31. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  32. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  33. package/.next/standalone/.next/server/app/api/audit/invite/route/app-paths-manifest.json +3 -0
  34. package/.next/standalone/.next/server/app/api/audit/invite/route/server-reference-manifest.json +4 -0
  35. package/.next/standalone/.next/server/app/api/audit/invite/route.js +7 -0
  36. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -0
  37. package/.next/standalone/.next/server/app/api/audit/invite/route_client-reference-manifest.js +3 -0
  38. package/.next/standalone/.next/server/app/api/audit/run/route/app-paths-manifest.json +3 -0
  39. package/.next/standalone/.next/server/app/api/audit/run/route/build-manifest.json +9 -0
  40. package/.next/standalone/.next/server/app/api/audit/run/route/server-reference-manifest.json +4 -0
  41. package/.next/standalone/.next/server/app/api/audit/run/route.js +8 -0
  42. package/.next/standalone/.next/server/app/api/audit/run/route.js.map +5 -0
  43. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -0
  44. package/.next/standalone/.next/server/app/api/audit/run/route_client-reference-manifest.js +3 -0
  45. package/.next/standalone/.next/server/app/api/audit/status/route/app-paths-manifest.json +3 -0
  46. package/.next/standalone/.next/server/app/api/audit/status/route/build-manifest.json +9 -0
  47. package/.next/standalone/.next/server/app/api/audit/status/route/server-reference-manifest.json +4 -0
  48. package/.next/standalone/.next/server/app/api/audit/status/route.js +6 -0
  49. package/.next/standalone/.next/server/app/api/audit/status/route.js.map +5 -0
  50. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -0
  51. package/.next/standalone/.next/server/app/api/audit/status/route_client-reference-manifest.js +3 -0
  52. package/.next/standalone/.next/server/app/api/auth/login-request/route/app-paths-manifest.json +3 -0
  53. package/.next/standalone/.next/server/app/api/auth/login-request/route/build-manifest.json +9 -0
  54. package/.next/standalone/.next/server/app/api/auth/login-request/route/server-reference-manifest.json +4 -0
  55. package/.next/standalone/.next/server/app/api/auth/login-request/route.js +6 -0
  56. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.map +5 -0
  57. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -0
  58. package/.next/standalone/.next/server/app/api/auth/login-request/route_client-reference-manifest.js +3 -0
  59. package/.next/standalone/.next/server/app/api/auth/login-verify/route/app-paths-manifest.json +3 -0
  60. package/.next/standalone/.next/server/app/api/auth/login-verify/route/build-manifest.json +9 -0
  61. package/.next/standalone/.next/server/app/api/auth/login-verify/route/server-reference-manifest.json +4 -0
  62. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +7 -0
  63. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.map +5 -0
  64. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -0
  65. package/.next/standalone/.next/server/app/api/auth/login-verify/route_client-reference-manifest.js +3 -0
  66. package/.next/standalone/.next/server/app/api/auth/logout/route/app-paths-manifest.json +3 -0
  67. package/.next/standalone/.next/server/app/api/auth/logout/route/build-manifest.json +9 -0
  68. package/.next/standalone/.next/server/app/api/auth/logout/route/server-reference-manifest.json +4 -0
  69. package/.next/standalone/.next/server/app/api/auth/logout/route.js +7 -0
  70. package/.next/standalone/.next/server/app/api/auth/logout/route.js.map +5 -0
  71. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -0
  72. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +3 -0
  73. package/.next/standalone/.next/server/app/api/auth/reminder/route/app-paths-manifest.json +3 -0
  74. package/.next/standalone/.next/server/app/api/auth/reminder/route/build-manifest.json +9 -0
  75. package/.next/standalone/.next/server/app/api/auth/reminder/route/server-reference-manifest.json +4 -0
  76. package/.next/standalone/.next/server/app/api/auth/reminder/route.js +7 -0
  77. package/.next/standalone/.next/server/app/api/auth/reminder/route.js.map +5 -0
  78. package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -0
  79. package/.next/standalone/.next/server/app/api/auth/reminder/route_client-reference-manifest.js +3 -0
  80. package/.next/standalone/.next/server/app/api/auth/status/route/app-paths-manifest.json +3 -0
  81. package/.next/standalone/.next/server/app/api/auth/status/route/build-manifest.json +9 -0
  82. package/.next/standalone/.next/server/app/api/auth/status/route/server-reference-manifest.json +4 -0
  83. package/.next/standalone/.next/server/app/api/auth/status/route.js +7 -0
  84. package/.next/standalone/.next/server/app/api/auth/status/route.js.map +5 -0
  85. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -0
  86. package/.next/standalone/.next/server/app/api/auth/status/route_client-reference-manifest.js +3 -0
  87. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +3 -3
  88. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/audit/page/app-paths-manifest.json +3 -0
  90. package/.next/standalone/.next/server/app/audit/page/build-manifest.json +18 -0
  91. package/.next/standalone/.next/server/app/audit/page/next-font-manifest.json +6 -0
  92. package/.next/standalone/.next/server/app/audit/page/react-loadable-manifest.json +1 -0
  93. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +29 -0
  94. package/.next/standalone/.next/server/app/audit/page.js +17 -0
  95. package/.next/standalone/.next/server/app/audit/page.js.map +5 -0
  96. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -0
  97. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +3 -0
  98. package/.next/standalone/.next/server/app/index.html +1 -1
  99. package/.next/standalone/.next/server/app/index.rsc +16 -17
  100. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  101. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -17
  102. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  103. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
  104. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -3
  105. package/.next/standalone/.next/server/app/page/build-manifest.json +7 -7
  106. package/.next/standalone/.next/server/app/page/next-font-manifest.json +2 -6
  107. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  108. package/.next/standalone/.next/server/app/page.js +14 -15
  109. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  110. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  111. package/.next/standalone/.next/server/app/policies/page/build-manifest.json +7 -7
  112. package/.next/standalone/.next/server/app/policies/page/next-font-manifest.json +2 -6
  113. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
  114. package/.next/standalone/.next/server/app/policies/page.js +16 -16
  115. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +7 -7
  118. package/.next/standalone/.next/server/app/project/[name]/page/next-font-manifest.json +2 -6
  119. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  120. package/.next/standalone/.next/server/app/project/[name]/page.js +16 -17
  121. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +7 -7
  124. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/next-font-manifest.json +2 -6
  125. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  126. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  127. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +19 -20
  128. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  129. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/projects/page/build-manifest.json +7 -7
  131. package/.next/standalone/.next/server/app/projects/page/next-font-manifest.json +2 -6
  132. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  133. package/.next/standalone/.next/server/app/projects/page.js +15 -16
  134. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  135. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app-paths-manifest.json +9 -1
  137. package/.next/standalone/.next/server/chunks/[externals]__14odj07._.js +3 -0
  138. package/.next/standalone/.next/server/chunks/{[externals]__0z0j--b._.js โ†’ [externals]__1nl3dvw._.js} +1 -1
  139. package/.next/standalone/.next/server/chunks/{[externals]__0-p9.k~._.js โ†’ [externals]__1s61mel._.js} +1 -1
  140. package/.next/standalone/.next/server/chunks/{[externals]_node_os_06ur78j._.js โ†’ [externals]_node_os_0by37l-._.js} +1 -1
  141. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0kjo7d_._.js โ†’ [root-of-the-server]__0_0xu5z._.js} +2 -2
  142. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cag8qd._.js +3 -0
  143. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0z-180.._.js โ†’ [root-of-the-server]__0cycwg6._.js} +2 -2
  144. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__08px0ym._.js โ†’ [root-of-the-server]__0f7mikp._.js} +1 -1
  145. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q-v9z2._.js +3 -0
  146. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rv7m0k._.js +3 -0
  147. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0g48iv.._.js โ†’ [root-of-the-server]__0sb_5m8._.js} +2 -2
  148. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0j8-xkl._.js โ†’ [root-of-the-server]__0xuaoik._.js} +2 -2
  149. package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h8pzr._.js +3 -0
  150. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +3 -0
  151. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1_mqemn._.js +3 -0
  152. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0vlhtkc._.js โ†’ [root-of-the-server]__1hgv_75._.js} +1 -1
  153. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0wu7fr7._.js โ†’ [root-of-the-server]__1jm9fw6._.js} +1 -1
  154. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1legmza._.js +3 -0
  155. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__044xt9.._.js โ†’ [root-of-the-server]__1m2_4t0._.js} +2 -2
  156. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0yfq1yr._.js โ†’ [root-of-the-server]__1mhmdzs._.js} +1 -1
  157. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0zso~62._.js โ†’ [root-of-the-server]__1ou2ehh._.js} +1 -1
  158. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qxztj-._.js +3 -0
  159. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1r1h8v9._.js +3 -0
  160. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rhmvod._.js +3 -0
  161. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1uatkiv._.js +3 -0
  162. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0.~nmr9._.js โ†’ [root-of-the-server]__1w9zl9-._.js} +1 -1
  163. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1y6gxxb._.js +3 -0
  164. package/.next/standalone/.next/server/chunks/{_0ebx_lc._.js โ†’ _0p53ge1._.js} +2 -2
  165. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_invite_route_actions_0-2n5sy.js +3 -0
  166. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_run_route_actions_1qgp9io.js +3 -0
  167. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_status_route_actions_1f7pjof.js +3 -0
  168. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_login-request_route_actions_1c49co0.js +3 -0
  169. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_login-verify_route_actions_1r3slzk.js +3 -0
  170. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_logout_route_actions_0regwyr.js +3 -0
  171. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_reminder_route_actions_1kjgxf8.js +3 -0
  172. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_status_route_actions_1aho9zu.js +3 -0
  173. package/.next/standalone/.next/server/chunks/{_next-internal_server_app_api_download_[project]_[session]_route_actions_0wb00i-.js โ†’ _next-internal_server_app_api_download_[project]_[session]_route_actions_1is7vs7.js} +1 -1
  174. package/.next/standalone/.next/server/chunks/{lib_logger_ts_047tt9f._.js โ†’ lib_logger_ts_07e65t5._.js} +1 -1
  175. package/.next/standalone/.next/server/chunks/node_modules_0-tu4ot._.js +3 -0
  176. package/.next/standalone/.next/server/chunks/node_modules_0ttxbz7._.js +3 -0
  177. package/.next/standalone/.next/server/chunks/node_modules_1bnh1y0._.js +3 -0
  178. package/.next/standalone/.next/server/chunks/node_modules_1epycqa._.js +3 -0
  179. package/.next/standalone/.next/server/chunks/node_modules_1wpdcgo._.js +3 -0
  180. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +23 -0
  181. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +3 -0
  182. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +3 -0
  183. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +3 -0
  184. package/.next/standalone/.next/server/chunks/ssr/{[externals]__12dv.x0._.js โ†’ [externals]__1_g_b3t._.js} +1 -1
  185. package/.next/standalone/.next/server/chunks/ssr/{[externals]_node_async_hooks_0v0ln8c._.js โ†’ [externals]_node_async_hooks_1gjz99j._.js} +1 -1
  186. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01tn1ou._.js +3 -0
  187. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0808sha._.js +4 -0
  188. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e4-6d8._.js +4 -0
  189. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ehe24g._.js +4 -0
  190. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0f62vu9._.js +3 -0
  191. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g253ve._.js +4 -0
  192. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h12me5._.js +3 -0
  193. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0k65l27._.js +3 -0
  194. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vxf0_g._.js +4 -0
  195. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11rtg6s._.js +3 -0
  196. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12mcauo._.js +4 -0
  197. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__14dd6h8._.js +3 -0
  198. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0t5l7a5._.js โ†’ [root-of-the-server]__1d8omgc._.js} +1 -1
  199. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__10xgshr._.js โ†’ [root-of-the-server]__1dky4g0._.js} +2 -2
  200. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1e-x7j4._.js +3 -0
  201. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1fax1sl._.js +19 -0
  202. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1mt35_w._.js +221 -0
  203. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1pcxxwg._.js +4 -0
  204. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1usf8v2._.js +3 -0
  205. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1uvfwgr._.js +4 -0
  206. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1w6v_1u._.js +3 -0
  207. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__212nf49._.js +3 -0
  208. package/.next/standalone/.next/server/chunks/ssr/{_03d7qyt._.js โ†’ _05whahf._.js} +2 -2
  209. package/.next/standalone/.next/server/chunks/ssr/_0il3fl1._.js +3 -0
  210. package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +3 -0
  211. package/.next/standalone/.next/server/chunks/ssr/{_0xb8ngh._.js โ†’ _1kje4fm._.js} +1 -1
  212. package/.next/standalone/.next/server/chunks/ssr/{_0zx~s__._.js โ†’ _1p0-leb._.js} +1 -1
  213. package/.next/standalone/.next/server/chunks/ssr/{app_04qfs8z._.js โ†’ app_087bt9w._.js} +1 -1
  214. package/.next/standalone/.next/server/chunks/ssr/{app_0uosk1e._.js โ†’ app_1fvisnp._.js} +1 -1
  215. package/.next/standalone/.next/server/chunks/ssr/{app_13f0ohr._.js โ†’ app_209u41o._.js} +1 -1
  216. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +65 -0
  217. package/.next/standalone/.next/server/chunks/ssr/app_audit_loading_tsx_1j1kc6j._.js +3 -0
  218. package/.next/standalone/.next/server/chunks/ssr/{app_error_tsx_11t4ysq._.js โ†’ app_error_tsx_1zds1ns._.js} +1 -1
  219. package/.next/standalone/.next/server/chunks/ssr/{app_global-error_tsx_0m9qisk._.js โ†’ app_global-error_tsx_113y3za._.js} +1 -1
  220. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +3 -0
  221. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +8 -0
  222. package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_error_tsx_0.9-fod._.js โ†’ app_project_[name]_error_tsx_1v02_5n._.js} +1 -1
  223. package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_loading_tsx_03g9xy0._.js โ†’ app_project_[name]_loading_tsx_05-l4uf._.js} +1 -1
  224. package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_session_[sessionId]_error_tsx_0ler-mr._.js โ†’ app_project_[name]_session_[sessionId]_error_tsx_0-lj3nd._.js} +1 -1
  225. package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_session_[sessionId]_loading_tsx_0c0e3yx._.js โ†’ app_project_[name]_session_[sessionId]_loading_tsx_0l4aixs._.js} +1 -1
  226. package/.next/standalone/.next/server/chunks/ssr/app_projects_loading_tsx_20-3u8b._.js +3 -0
  227. package/.next/standalone/.next/server/chunks/ssr/{lib_codex-projects_ts_0eosib~._.js โ†’ lib_codex-projects_ts_0pqlw37._.js} +1 -1
  228. package/.next/standalone/.next/server/chunks/ssr/{lib_copilot-projects_ts_0r8xkn8._.js โ†’ lib_copilot-projects_ts_19wl7tp._.js} +1 -1
  229. package/.next/standalone/.next/server/chunks/ssr/{lib_cursor-projects_ts_0qt1scg._.js โ†’ lib_cursor-projects_ts_18-iwyk._.js} +1 -1
  230. package/.next/standalone/.next/server/chunks/ssr/{lib_gemini-projects_ts_0sl~yqr._.js โ†’ lib_gemini-projects_ts_1c7bgx-._.js} +1 -1
  231. package/.next/standalone/.next/server/chunks/ssr/{lib_opencode-projects_ts_0op9gyp._.js โ†’ lib_opencode-projects_ts_15bjxkm._.js} +1 -1
  232. package/.next/standalone/.next/server/chunks/ssr/{lib_pi-projects_ts_103tsh1._.js โ†’ lib_pi-projects_ts_1wikofb._.js} +1 -1
  233. package/.next/standalone/.next/server/chunks/ssr/lib_utils_ts_0az0sfq._.js +3 -0
  234. package/.next/standalone/.next/server/chunks/ssr/node_modules_1ynf7el._.js +3 -0
  235. package/.next/standalone/.next/server/chunks/ssr/node_modules_html-to-image_es_index_0nye1s3.js +3 -0
  236. package/.next/standalone/.next/server/chunks/ssr/node_modules_html-to-image_es_index_1ao30b1.js +3 -0
  237. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_0rd0oc-._.js โ†’ node_modules_next_1a1kch7._.js} +1 -1
  238. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0uboya6._.js +6 -0
  239. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_11dij6w._.js โ†’ node_modules_next_dist_1d_onnt._.js} +2 -2
  240. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_0inhx6q._.js โ†’ node_modules_next_dist_client_components_0wpq8j3._.js} +1 -1
  241. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js โ†’ node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js} +1 -1
  242. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js โ†’ node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js} +1 -1
  243. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0-uvagv.js +4 -0
  244. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03c7gi5.js +4 -0
  245. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09p-8om.js +4 -0
  246. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0v-kfiu.js +4 -0
  247. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0xrgzyz.js +4 -0
  248. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1806lsc.js +4 -0
  249. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1j6dd-e.js +4 -0
  250. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1sa65r-.js +4 -0
  251. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +3 -0
  252. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1ezd2jf._.js +5 -0
  253. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1tnuifj._.js +5 -0
  254. package/.next/standalone/.next/server/functions-config-manifest.json +2 -2
  255. package/.next/standalone/.next/server/instrumentation.js +1 -1
  256. package/.next/standalone/.next/server/middleware-build-manifest.js +10 -10
  257. package/.next/standalone/.next/server/middleware.js +2 -2
  258. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  259. package/.next/standalone/.next/server/next-font-manifest.json +2 -21
  260. package/.next/standalone/.next/server/pages/404.html +1 -1
  261. package/.next/standalone/.next/server/pages/500.html +1 -1
  262. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  263. package/.next/standalone/.next/server/server-reference-manifest.json +27 -9
  264. package/.next/standalone/.next/static/{dAuQps6jUwCz9X1Q5FFOO โ†’ DOSSF5hRUtt3-QZEm-ZIk}/_clientMiddlewareManifest.js +2 -2
  265. package/.next/standalone/.next/static/chunks/{0pkl..xgo-qox.js โ†’ 02e80j0576qfu.js} +1 -1
  266. package/.next/standalone/.next/static/chunks/{07uz2g0_38qia.js โ†’ 03fmihek9n986.js} +1 -1
  267. package/.next/standalone/.next/static/chunks/0f7d7hnbh4djs.js +1 -0
  268. package/.next/standalone/.next/static/chunks/0h7auy7hzjyhw.js +1 -0
  269. package/.next/standalone/.next/static/chunks/0wwt5o04i4zwh.js +1 -0
  270. package/.next/standalone/.next/static/chunks/0zbxssxh53n-3.js +1 -0
  271. package/.next/standalone/.next/static/chunks/13f1kmjea-0md.js +2 -0
  272. package/.next/standalone/.next/static/chunks/13xzda05yw19e.js +1 -0
  273. package/.next/standalone/.next/static/chunks/{150i0n26fnvso.js โ†’ 1__i9af9g78vd.js} +1 -1
  274. package/.next/standalone/.next/static/chunks/1uxa5lm6yco79.js +1 -0
  275. package/.next/standalone/.next/static/chunks/20dqelk3xz_ya.css +1 -0
  276. package/.next/standalone/.next/static/chunks/{0j171xiqge4rv.js โ†’ 29lzaddhez98q.js} +1 -1
  277. package/.next/standalone/.next/static/chunks/29nrs5xs9c4hx.css +2 -0
  278. package/.next/standalone/.next/static/chunks/{0lt8ko3lw.5yt.js โ†’ 2b_e9tyly10lo.js} +1 -1
  279. package/.next/standalone/.next/static/chunks/{0rnqmir4cd5p9.js โ†’ 2h0dkzyy0vocp.js} +1 -1
  280. package/.next/standalone/.next/static/chunks/2lp3a3a3_4_9o.js +63 -0
  281. package/.next/standalone/.next/static/chunks/{179yytvmam0ug.js โ†’ 2nt_slonrn0rw.js} +1 -1
  282. package/.next/standalone/.next/static/chunks/2plcgtv_tkv9t.js +1 -0
  283. package/.next/standalone/.next/static/chunks/33k2epr1iz8_z.js +6 -0
  284. package/.next/standalone/.next/static/chunks/{0d3shmwh5_nmn.js โ†’ 33u59vf_8xpd-.js} +1 -1
  285. package/.next/standalone/.next/static/chunks/3zkg2s2vzxc3d.js +1 -0
  286. package/.next/standalone/.next/static/chunks/{turbopack-05z7a19q43zfq.js โ†’ turbopack-3lrm4f20fz89b.js} +1 -1
  287. package/.next/standalone/SECURITY.md +73 -0
  288. package/.next/standalone/app/actions/get-audit-result.ts +35 -0
  289. package/.next/standalone/app/api/audit/_state.ts +79 -0
  290. package/.next/standalone/app/api/audit/invite/route.ts +183 -0
  291. package/.next/standalone/app/api/audit/run/route.ts +103 -0
  292. package/.next/standalone/app/api/audit/status/route.ts +24 -0
  293. package/.next/standalone/app/api/auth/login-request/route.ts +91 -0
  294. package/.next/standalone/app/api/auth/login-verify/route.ts +98 -0
  295. package/.next/standalone/app/api/auth/logout/route.ts +48 -0
  296. package/.next/standalone/app/api/auth/reminder/route.ts +213 -0
  297. package/.next/standalone/app/api/auth/status/route.ts +42 -0
  298. package/.next/standalone/app/audit/_components/audit-dashboard.tsx +397 -0
  299. package/.next/standalone/app/audit/_components/audit-poster.tsx +326 -0
  300. package/.next/standalone/app/audit/_components/audit-progress-strip.tsx +98 -0
  301. package/.next/standalone/app/audit/_components/auth-dialog.tsx +375 -0
  302. package/.next/standalone/app/audit/_components/come-back-better-section.tsx +333 -0
  303. package/.next/standalone/app/audit/_components/empty-state.tsx +152 -0
  304. package/.next/standalone/app/audit/_components/how-to-improve-section.tsx +187 -0
  305. package/.next/standalone/app/audit/_components/invite-dialog.tsx +227 -0
  306. package/.next/standalone/app/audit/_components/quirks-section.tsx +75 -0
  307. package/.next/standalone/app/audit/_components/report-footer.tsx +35 -0
  308. package/.next/standalone/app/audit/_components/rerun-button.tsx +119 -0
  309. package/.next/standalone/app/audit/_components/run-progress.tsx +120 -0
  310. package/.next/standalone/app/audit/_components/share-templates.ts +94 -0
  311. package/.next/standalone/app/audit/_components/sigil.tsx +36 -0
  312. package/.next/standalone/app/audit/_components/strengths-section.tsx +45 -0
  313. package/.next/standalone/app/audit/audit-styles.css +1178 -0
  314. package/.next/standalone/app/audit/loading.tsx +24 -0
  315. package/.next/standalone/app/audit/page.tsx +63 -0
  316. package/.next/standalone/app/components/sessions-list.tsx +77 -80
  317. package/.next/standalone/app/globals.css +754 -139
  318. package/.next/standalone/app/layout.tsx +6 -8
  319. package/.next/standalone/app/policies/hooks-client.tsx +340 -141
  320. package/.next/standalone/app/project/[name]/page.tsx +31 -37
  321. package/.next/standalone/app/projects/loading.tsx +30 -8
  322. package/.next/standalone/app/projects/page.tsx +66 -17
  323. package/.next/standalone/assets/audit/Audit Report.html +22 -0
  324. package/.next/standalone/assets/audit/Show Off Your Agent.html +22 -0
  325. package/.next/standalone/assets/audit/archetypes.jsx +277 -0
  326. package/.next/standalone/assets/audit/assets/fonts/bitcount-prop-single.woff2 +0 -0
  327. package/.next/standalone/assets/audit/audit.jsx +825 -0
  328. package/.next/standalone/assets/audit/poster-styles.css +424 -0
  329. package/.next/standalone/assets/audit/poster.jsx +247 -0
  330. package/.next/standalone/assets/audit/screenshots/poster-optimist.png +0 -0
  331. package/.next/standalone/assets/audit/screenshots/poster-scrolled.png +0 -0
  332. package/.next/standalone/assets/audit/styles.css +1225 -0
  333. package/.next/standalone/assets/audit/tweaks-panel.jsx +425 -0
  334. package/.next/standalone/assets/logos/company/icon.svg +1 -0
  335. package/.next/standalone/assets/logos/company/logo.svg +1 -0
  336. package/.next/standalone/components/navbar.tsx +119 -65
  337. package/.next/standalone/components/reach-developers.tsx +39 -11
  338. package/.next/standalone/lib/atomic-write.ts +67 -0
  339. package/.next/standalone/lib/auth/api-server-client.ts +306 -0
  340. package/.next/standalone/lib/auth/auth-store.ts +250 -0
  341. package/.next/standalone/lib/claude-sessions.ts +181 -0
  342. package/.next/standalone/lib/client-telemetry.ts +2 -0
  343. package/.next/standalone/lib/fetch-with-timeout.ts +59 -0
  344. package/.next/standalone/lib/share-card.ts +144 -0
  345. package/.next/standalone/lib/telemetry.ts +12 -7
  346. package/.next/standalone/node_modules/@next/env/package.json +2 -2
  347. package/.next/standalone/node_modules/next/dist/build/static-paths/app.js +2 -1
  348. package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
  349. package/.next/standalone/node_modules/next/dist/build/utils.js +2 -1
  350. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/fetch-server-response.js +2 -2
  351. package/.next/standalone/node_modules/next/dist/client/components/router-reducer/set-cache-busting-search-param.js +8 -2
  352. package/.next/standalone/node_modules/next/dist/client/dev/debug-channel.js +102 -2
  353. package/.next/standalone/node_modules/next/dist/client/route-params.js +23 -6
  354. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +13 -13
  355. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +13 -13
  356. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +2 -2
  357. package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +10 -10
  358. package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
  359. package/.next/standalone/node_modules/next/dist/server/app-render/action-handler.js +21 -14
  360. package/.next/standalone/node_modules/next/dist/server/app-render/app-render.js +62 -9
  361. package/.next/standalone/node_modules/next/dist/server/app-render/collect-segment-data.js +16 -0
  362. package/.next/standalone/node_modules/next/dist/server/app-render/create-component-tree.js +49 -19
  363. package/.next/standalone/node_modules/next/dist/server/app-render/get-script-nonce-from-header.js +8 -20
  364. package/.next/standalone/node_modules/next/dist/server/app-render/metadata-insertion/create-server-inserted-metadata.js +8 -7
  365. package/.next/standalone/node_modules/next/dist/server/app-render/use-flight-response.js +2 -2
  366. package/.next/standalone/node_modules/next/dist/server/async-storage/work-store.js +2 -1
  367. package/.next/standalone/node_modules/next/dist/server/base-server.js +13 -5
  368. package/.next/standalone/node_modules/next/dist/server/config-schema.js +1 -0
  369. package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
  370. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
  371. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
  372. package/.next/standalone/node_modules/next/dist/server/dev/static-paths-worker.js +2 -1
  373. package/.next/standalone/node_modules/next/dist/server/image-optimizer.js +22 -2
  374. package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
  375. package/.next/standalone/node_modules/next/dist/server/lib/encode-cache-tag.js +45 -0
  376. package/.next/standalone/node_modules/next/dist/server/lib/implicit-tags.js +6 -3
  377. package/.next/standalone/node_modules/next/dist/server/lib/is-rsc-request.js +18 -0
  378. package/.next/standalone/node_modules/next/dist/server/lib/mock-request.js +30 -5
  379. package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +5 -1
  380. package/.next/standalone/node_modules/next/dist/server/lib/patch-set-header.js +7 -0
  381. package/.next/standalone/node_modules/next/dist/server/lib/router-server.js +6 -3
  382. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/resolve-routes.js +18 -4
  383. package/.next/standalone/node_modules/next/dist/server/lib/server-ipc/utils.js +3 -1
  384. package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
  385. package/.next/standalone/node_modules/next/dist/server/next-server.js +1 -1
  386. package/.next/standalone/node_modules/next/dist/server/request/fallback-params.js +27 -1
  387. package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/module.js +1 -0
  388. package/.next/standalone/node_modules/next/dist/server/route-modules/route-module.js +11 -1
  389. package/.next/standalone/node_modules/next/dist/server/server-utils.js +19 -2
  390. package/.next/standalone/node_modules/next/dist/server/stream-utils/node-web-streams-helper.js +5 -5
  391. package/.next/standalone/node_modules/next/dist/server/use-cache/use-cache-wrapper.js +1 -1
  392. package/.next/standalone/node_modules/next/dist/server/web/adapter.js +4 -1
  393. package/.next/standalone/node_modules/next/dist/server/web/edge-route-module-wrapper.js +2 -1
  394. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/revalidate.js +4 -3
  395. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/unstable-cache.js +6 -2
  396. package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
  397. package/.next/standalone/node_modules/next/dist/{server โ†’ shared/lib}/htmlescape.js +15 -0
  398. package/.next/standalone/node_modules/next/dist/shared/lib/router/routes/app.js +13 -1
  399. package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/cache-busting-search-param.js +56 -10
  400. package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
  401. package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
  402. package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
  403. package/.next/standalone/node_modules/next/package.json +15 -15
  404. package/.next/standalone/node_modules/react/cjs/react.development.js +1 -1
  405. package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
  406. package/.next/standalone/node_modules/react/package.json +1 -1
  407. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
  408. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
  409. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +3 -3
  410. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +3 -3
  411. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +3 -3
  412. package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
  413. package/.next/standalone/node_modules/react-dom/package.json +2 -2
  414. package/.next/standalone/osv-scanner.toml +17 -0
  415. package/.next/standalone/package.json +26 -18
  416. package/.next/standalone/proxy.ts +1 -1
  417. package/.next/standalone/public/audit/fonts/bitcount-prop-single.woff2 +0 -0
  418. package/.next/standalone/public/icon.svg +1 -0
  419. package/.next/standalone/public/logo.svg +1 -0
  420. package/.next/standalone/server.js +1 -1
  421. package/.next/standalone/templates/bitcount-font/README.md +42 -0
  422. package/.next/standalone/templates/bitcount-font/bitcount-prop-single.woff2 +0 -0
  423. package/.next/standalone/templates/bitcount-font/bitcount.css +49 -0
  424. package/.next/standalone/templates/bitcount-font/fonts.ts.example +23 -0
  425. package/README.md +12 -5
  426. package/bin/failproofai.mjs +263 -70
  427. package/dist/cli.mjs +3830 -1617
  428. package/lib/atomic-write.ts +67 -0
  429. package/lib/auth/api-server-client.ts +306 -0
  430. package/lib/auth/auth-store.ts +250 -0
  431. package/lib/claude-sessions.ts +181 -0
  432. package/lib/client-telemetry.ts +2 -0
  433. package/lib/fetch-with-timeout.ts +59 -0
  434. package/lib/share-card.ts +144 -0
  435. package/lib/telemetry.ts +12 -7
  436. package/package.json +26 -18
  437. package/scripts/install-telemetry.mjs +4 -0
  438. package/scripts/launch.ts +2 -2
  439. package/scripts/postinstall.mjs +89 -1
  440. package/src/audit/archetypes.ts +944 -0
  441. package/src/audit/cache.ts +151 -0
  442. package/src/audit/cli-adapters/claude.ts +97 -0
  443. package/src/audit/cli-adapters/codex.ts +56 -0
  444. package/src/audit/cli-adapters/copilot.ts +51 -0
  445. package/src/audit/cli-adapters/cursor.ts +51 -0
  446. package/src/audit/cli-adapters/gemini.ts +51 -0
  447. package/src/audit/cli-adapters/index.ts +70 -0
  448. package/src/audit/cli-adapters/opencode.ts +52 -0
  449. package/src/audit/cli-adapters/pi.ts +51 -0
  450. package/src/audit/cli-adapters/shared.ts +85 -0
  451. package/src/audit/cli.ts +319 -0
  452. package/src/audit/dashboard-cache.ts +158 -0
  453. package/src/audit/detectors/find-from-root.ts +27 -0
  454. package/src/audit/detectors/git-commit-no-verify.ts +22 -0
  455. package/src/audit/detectors/index.ts +33 -0
  456. package/src/audit/detectors/prefer-edit-over-read-cat.ts +31 -0
  457. package/src/audit/detectors/prefer-edit-over-sed-awk.ts +27 -0
  458. package/src/audit/detectors/prefer-write-over-heredoc.ts +36 -0
  459. package/src/audit/detectors/redundant-cd-cwd.ts +28 -0
  460. package/src/audit/detectors/reread-after-edit.ts +58 -0
  461. package/src/audit/detectors/sleep-polling-loop.ts +34 -0
  462. package/src/audit/features.ts +314 -0
  463. package/src/audit/findings.ts +298 -0
  464. package/src/audit/index.ts +387 -0
  465. package/src/audit/open-browser.ts +69 -0
  466. package/src/audit/replay.ts +147 -0
  467. package/src/audit/report.ts +349 -0
  468. package/src/audit/scoring.ts +174 -0
  469. package/src/audit/social-proof.ts +34 -0
  470. package/src/audit/strengths.ts +138 -0
  471. package/src/audit/types.ts +216 -0
  472. package/src/auth/cli.ts +359 -0
  473. package/src/hooks/builtin-policies.ts +81 -2
  474. package/src/hooks/custom-hooks-loader.ts +19 -3
  475. package/src/hooks/first-run-nudge.ts +146 -0
  476. package/src/hooks/handler.ts +21 -102
  477. package/src/hooks/hook-telemetry.ts +2 -2
  478. package/src/hooks/install-prompt.ts +34 -4
  479. package/src/hooks/manager.ts +72 -5
  480. package/src/hooks/policy-evaluator.ts +19 -4
  481. package/src/hooks/policy-registry.ts +21 -1
  482. package/src/hooks/policy-types.ts +9 -0
  483. package/src/hooks/tool-name-canonicalize.ts +65 -0
  484. package/src/posthog-key.ts +9 -0
  485. package/.next/standalone/.next/server/app/icon.png/route/app-paths-manifest.json +0 -3
  486. package/.next/standalone/.next/server/app/icon.png/route.js +0 -7
  487. package/.next/standalone/.next/server/app/icon.png/route.js.nft.json +0 -1
  488. package/.next/standalone/.next/server/app/icon.png.body +0 -0
  489. package/.next/standalone/.next/server/app/icon.png.meta +0 -1
  490. package/.next/standalone/.next/server/chunks/[externals]_next_dist_0sqmaqd._.js +0 -3
  491. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06.arfm._.js +0 -3
  492. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0__i0h0._.js +0 -3
  493. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0d_ob4n._.js +0 -3
  494. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fe7_q_._.js +0 -3
  495. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fw.e.h._.js +0 -3
  496. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pxn0e1._.js +0 -3
  497. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xv0jh2._.js +0 -3
  498. package/.next/standalone/.next/server/chunks/_next-internal_server_app_icon_png_route_actions_12.gv.r.js +0 -3
  499. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0bdfoky.js +0 -3
  500. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_05pz9._._.js +0 -3
  501. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +0 -3
  502. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02r.cjq._.js +0 -3
  503. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0370~qj._.js +0 -3
  504. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0609ezh._.js +0 -3
  505. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__07_-mkc._.js +0 -3
  506. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09z7o2x._.js +0 -19
  507. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0_sh2n0._.js +0 -3
  508. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e9o9ri._.js +0 -4
  509. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0l6swv1._.js +0 -3
  510. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0logebz._.js +0 -3
  511. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0mi5ejy._.js +0 -4
  512. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0odijkc._.js +0 -3
  513. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0podumr._.js +0 -4
  514. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rkxer-._.js +0 -3
  515. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rl2kwi._.js +0 -4
  516. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vg0uey._.js +0 -4
  517. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0x5limi._.js +0 -3
  518. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ye1w50._.js +0 -4
  519. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ymlddl._.js +0 -223
  520. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__10._f0s._.js +0 -4
  521. package/.next/standalone/.next/server/chunks/ssr/app_0cdqd9w._.js +0 -3
  522. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +0 -3
  523. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +0 -8
  524. package/.next/standalone/.next/server/chunks/ssr/app_projects_loading_tsx_13veom4._.js +0 -3
  525. package/.next/standalone/.next/server/chunks/ssr/lib_utils_ts_068jk73._.js +0 -3
  526. package/.next/standalone/.next/server/chunks/ssr/node_modules_0ttbz1~._.js +0 -3
  527. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_06u0kr8._.js +0 -3
  528. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js +0 -6
  529. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a_7sdg.js +0 -4
  530. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ef3uwk.js +0 -4
  531. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0j79~gv.js +0 -4
  532. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0pbja1x.js +0 -4
  533. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0r6o0i2.js +0 -4
  534. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11y81~_.js +0 -4
  535. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_12or2kf.js +0 -4
  536. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.js +0 -3
  537. package/.next/standalone/.next/static/chunks/01q52wg_amm60.js +0 -2
  538. package/.next/standalone/.next/static/chunks/0kqar56yl~41o.js +0 -6
  539. package/.next/standalone/.next/static/chunks/0ml1.ck_5t36i.js +0 -1
  540. package/.next/standalone/.next/static/chunks/0w6fzf.07a24u.js +0 -1
  541. package/.next/standalone/.next/static/chunks/0zig0fh30t6ou.js +0 -1
  542. package/.next/standalone/.next/static/chunks/12l2t63hkyo2q.js +0 -1
  543. package/.next/standalone/.next/static/chunks/12pt~2f.c1sha.js +0 -1
  544. package/.next/standalone/.next/static/chunks/14lii11wmo450.js +0 -4
  545. package/.next/standalone/.next/static/chunks/17rm86uz2nd5a.css +0 -2
  546. package/.next/standalone/.next/static/media/4fa387ec64143e14-s.0q3udbd2bu5yp.woff2 +0 -0
  547. package/.next/standalone/.next/static/media/797e433ab948586e-s.p.0.q-h669a_dqa.woff2 +0 -0
  548. package/.next/standalone/.next/static/media/bbc41e54d2fcbd21-s.0gw~uztddq1df.woff2 +0 -0
  549. package/.next/standalone/.next/static/media/icon.0a.gigb3_x5pd.png +0 -0
  550. package/.next/standalone/app/icon.png +0 -0
  551. package/src/auth/login.ts +0 -104
  552. package/src/auth/logout.ts +0 -50
  553. package/src/auth/token-store.ts +0 -64
  554. package/src/relay/daemon.ts +0 -362
  555. package/src/relay/pid.ts +0 -76
  556. package/src/relay/queue.ts +0 -225
  557. /package/.next/standalone/.next/server/app/{icon.png โ†’ api/audit/invite}/route/build-manifest.json +0 -0
  558. /package/.next/standalone/.next/server/app/{icon.png โ†’ api/audit/invite}/route.js.map +0 -0
  559. /package/.next/standalone/.next/static/{dAuQps6jUwCz9X1Q5FFOO โ†’ DOSSF5hRUtt3-QZEm-ZIk}/_buildManifest.js +0 -0
  560. /package/.next/standalone/.next/static/{dAuQps6jUwCz9X1Q5FFOO โ†’ DOSSF5hRUtt3-QZEm-ZIk}/_ssgManifest.js +0 -0
  561. /package/.next/standalone/.next/static/chunks/{03~yq9q893hmn.js โ†’ 0cz1d0mv5g_q7.js} +0 -0
  562. /package/.next/standalone/.next/static/chunks/{0xbo5nl6w4lka.js โ†’ 2wbuxnsvux4di.js} +0 -0
  563. /package/.next/standalone/.next/static/chunks/{0_s0luks5tay-.js โ†’ 35fgpd_feci6x.js} +0 -0
  564. /package/.next/standalone/.next/static/chunks/{15fklyav5py5m.js โ†’ 3xpjn3cdgm-7m.js} +0 -0
  565. /package/.next/standalone/.next/static/chunks/{17.b3suj8zjjj.js โ†’ 4448_qq7bd963.js} +0 -0
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Best-effort "open the dashboard in the browser once it's actually listening".
3
+ *
4
+ * `failproofai audit` writes the dashboard cache, then starts the bundled
5
+ * dashboard server (a blocking call) and wants to pop the browser to /audit the
6
+ * moment the server answers โ€” never before (a connection-refused tab is a bad
7
+ * first impression). This polls the server root, then shells out to the
8
+ * platform's URL opener. Every failure is swallowed: the worst case is the user
9
+ * clicks the URL we already printed to the terminal.
10
+ */
11
+ import { spawn } from "node:child_process";
12
+
13
+ const POLL_INTERVAL_MS = 150;
14
+ const POLL_TIMEOUT_MS = 30_000;
15
+
16
+ /** Open a URL with the platform's default handler. Never throws. */
17
+ function openUrl(url: string): void {
18
+ let cmd: string;
19
+ let args: string[];
20
+ if (process.platform === "darwin") {
21
+ cmd = "open";
22
+ args = [url];
23
+ } else if (process.platform === "win32") {
24
+ // `start` is a cmd builtin; the empty "" is the (required) window-title arg
25
+ // so a URL containing `&` or spaces isn't mis-parsed as the title.
26
+ cmd = "cmd";
27
+ args = ["/c", "start", "", url];
28
+ } else {
29
+ cmd = "xdg-open";
30
+ args = [url];
31
+ }
32
+ try {
33
+ const child = spawn(cmd, args, { stdio: "ignore", detached: true });
34
+ // Headless Linux without xdg-open, missing `open`, etc. โ€” swallow.
35
+ child.on("error", () => {});
36
+ child.unref();
37
+ } catch {
38
+ // ignore โ€” the URL was already printed for manual use.
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Poll `http://localhost:<port>/` until it responds (any status, including a
44
+ * redirect), then open `http://localhost:<port><path>`. Detached and
45
+ * best-effort: returns immediately, does its work on the event loop, and never
46
+ * throws into the caller (which is about to make a blocking `launch()` call).
47
+ */
48
+ export function openWhenReady(port: number, path: string): void {
49
+ const base = `http://localhost:${port}`;
50
+ const target = `${base}${path}`;
51
+ void (async () => {
52
+ const deadline = Date.now() + POLL_TIMEOUT_MS;
53
+ while (Date.now() < deadline) {
54
+ try {
55
+ // `redirect: "manual"` so the dashboard's `/ โ†’ /policies` 307 counts as
56
+ // "up" without us following it and rendering an unrelated page.
57
+ await fetch(base, { method: "GET", redirect: "manual" });
58
+ openUrl(target);
59
+ return;
60
+ } catch {
61
+ // Not listening yet โ€” wait and retry.
62
+ await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
63
+ }
64
+ }
65
+ // Timed out waiting for the probe. The server may still be coming up; open
66
+ // anyway as a last resort so a slow cold boot still lands on the page.
67
+ openUrl(target);
68
+ })();
69
+ }
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Replay engine โ€” turns a NormalizedToolEvent into one (or two) synthetic hook
3
+ * payloads, runs them through the existing `evaluatePolicies` function, and
4
+ * returns the policy decisions.
5
+ *
6
+ * Why two events: builtin sanitize-* policies match on PostToolUse and inspect
7
+ * the tool result text. PreToolUse alone misses them. Per event we synthesize:
8
+ * 1. PreToolUse โ€” { tool_name, tool_input }
9
+ * 2. PostToolUse โ€” { tool_name, tool_input, tool_response } (only when the
10
+ * transcript captured a tool_result)
11
+ *
12
+ * Workflow policies (`require-*-before-stop`) match only on `Stop` and
13
+ * execSync against live git, so they never fire on PreToolUse/PostToolUse
14
+ * replay โ€” no explicit skip needed.
15
+ */
16
+ import type { EvaluationResult } from "../hooks/policy-evaluator";
17
+ import { evaluatePolicies } from "../hooks/policy-evaluator";
18
+ import { BUILTIN_POLICIES, registerBuiltinPolicies } from "../hooks/builtin-policies";
19
+ import {
20
+ clearPolicies,
21
+ getAllPolicies,
22
+ normalizePolicyName,
23
+ setAllPolicies,
24
+ } from "../hooks/policy-registry";
25
+ import type { RegisteredPolicy } from "../hooks/policy-types";
26
+ import type { SessionMetadata } from "../hooks/types";
27
+ import type { NormalizedToolEvent } from "./types";
28
+
29
+ /** Policies the audit skips on purpose. `warn-repeated-tool-calls` mutates a
30
+ * per-session sidecar file on every evaluation, which would pollute the
31
+ * user's real transcript directory during a replay (and inflate counts
32
+ * because the replay always re-traverses the full session). */
33
+ const SKIP_POLICIES = new Set(
34
+ ["warn-repeated-tool-calls"].map((n) => normalizePolicyName(n)),
35
+ );
36
+
37
+ let initialized = false;
38
+ /** Snapshot of the registry taken at `initReplay()`. Restored by
39
+ * `restoreReplay()` so embedding `runAudit()` in a long-running process
40
+ * (e.g. the Next.js dashboard) doesn't wipe any prior policy registrations. */
41
+ let savedSnapshot: RegisteredPolicy[] | null = null;
42
+
43
+ /** Register every builtin policy (regardless of user config) so the replay
44
+ * shows what *could* be caught, not just what's currently enabled. Called
45
+ * once per `runAudit` invocation. Snapshots the existing registry so it can
46
+ * be restored by `restoreReplay()` once the audit is done. */
47
+ export function initReplay(): void {
48
+ if (initialized) return;
49
+ savedSnapshot = getAllPolicies();
50
+ clearPolicies();
51
+ const enabled = BUILTIN_POLICIES
52
+ .map((p) => p.name)
53
+ .filter((n) => !SKIP_POLICIES.has(normalizePolicyName(n)));
54
+ registerBuiltinPolicies(enabled);
55
+ initialized = true;
56
+ }
57
+
58
+ /** Restore the registry to whatever was there before `initReplay()`. Safe to
59
+ * call when not initialized (no-op). Always paired with `initReplay()` in a
60
+ * try/finally inside `runAudit()`. */
61
+ export function restoreReplay(): void {
62
+ if (!initialized) return;
63
+ if (savedSnapshot !== null) {
64
+ setAllPolicies(savedSnapshot);
65
+ savedSnapshot = null;
66
+ }
67
+ initialized = false;
68
+ }
69
+
70
+ /** Reset for tests / repeated audits in the same process. Drops the snapshot
71
+ * too โ€” tests usually start with an empty registry and want it back. */
72
+ export function resetReplay(): void {
73
+ initialized = false;
74
+ savedSnapshot = null;
75
+ clearPolicies();
76
+ }
77
+
78
+ export interface ReplayHit {
79
+ policyName: string;
80
+ decision: "deny" | "instruct" | "allow";
81
+ reason: string | null;
82
+ eventType: "PreToolUse" | "PostToolUse";
83
+ }
84
+
85
+ /** Replay one normalized tool event through every registered policy. Returns
86
+ * one ReplayHit per non-allow decision (deny + instruct). Allow-with-reason
87
+ * is reported too, so sanitize policies that emit informational notes still
88
+ * surface in the audit. */
89
+ export async function replayEvent(event: NormalizedToolEvent): Promise<ReplayHit[]> {
90
+ if (!initialized) initReplay();
91
+
92
+ const session: SessionMetadata = {
93
+ sessionId: event.sessionId,
94
+ transcriptPath: event.transcriptPath,
95
+ cwd: event.cwd,
96
+ cli: event.cli,
97
+ };
98
+
99
+ const baseToolPayload: Record<string, unknown> = {
100
+ tool_name: event.toolName,
101
+ tool_input: event.toolInput,
102
+ session_id: event.sessionId,
103
+ cwd: event.cwd,
104
+ transcript_path: event.transcriptPath,
105
+ };
106
+
107
+ const out: ReplayHit[] = [];
108
+
109
+ // PreToolUse
110
+ const pre = await evaluatePolicies("PreToolUse", baseToolPayload, session);
111
+ collectHits(pre, "PreToolUse", out);
112
+
113
+ // PostToolUse โ€” only if the transcript captured a tool result.
114
+ if (event.toolResultText !== undefined) {
115
+ const postPayload = { ...baseToolPayload, tool_response: event.toolResultText };
116
+ const post = await evaluatePolicies("PostToolUse", postPayload, session);
117
+ collectHits(post, "PostToolUse", out);
118
+ }
119
+
120
+ return out;
121
+ }
122
+
123
+ function collectHits(
124
+ result: EvaluationResult,
125
+ eventType: "PreToolUse" | "PostToolUse",
126
+ out: ReplayHit[],
127
+ ): void {
128
+ // `policyNames` is set when multiple policies fired (sanitize stack);
129
+ // otherwise fall back to `policyName`.
130
+ const names = result.policyNames && result.policyNames.length > 0
131
+ ? result.policyNames
132
+ : result.policyName
133
+ ? [result.policyName]
134
+ : [];
135
+ for (const name of names) {
136
+ // The aggregate `decision` reflects the most severe firing, but the audit
137
+ // wants per-policy counts. We re-tag each name with the aggregate decision
138
+ // for now โ€” accurate enough for the table; a future audit-detail mode can
139
+ // re-evaluate per-policy if precision becomes important.
140
+ out.push({
141
+ policyName: name,
142
+ decision: result.decision,
143
+ reason: result.reason,
144
+ eventType,
145
+ });
146
+ }
147
+ }
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Output renderers for `failproofai audit`:
3
+ * โ€ข formatText โ€” ANSI table to stdout (GTM-oriented "moment of truth")
4
+ * โ€ข formatMarkdown โ€” shareable sectioned report written to a file
5
+ * โ€ข formatJson โ€” machine-readable
6
+ *
7
+ * The text renderer is the user's first impression of the audit. It leads
8
+ * with a headline-box, splits findings into "already protected" vs "slipping
9
+ * through" so the conversion ask is obvious, and ends with a copy-pasteable
10
+ * install command + report path + star link.
11
+ */
12
+ import type { AuditCount, AuditResult, RunAuditOptions } from "./types";
13
+
14
+ const ANSI = {
15
+ reset: "\x1B[0m",
16
+ dim: "\x1B[2m",
17
+ bold: "\x1B[1m",
18
+ red: "\x1B[31m",
19
+ yellow: "\x1B[33m",
20
+ green: "\x1B[32m",
21
+ cyan: "\x1B[36m",
22
+ magenta: "\x1B[35m",
23
+ };
24
+
25
+ /** Honor https://no-color.org / NO_COLOR=1 and FORCE_COLOR=0 by stripping all
26
+ * ANSI sequences from the final output. Detected once per renderer call. */
27
+ function noColorEnabled(): boolean {
28
+ if (process.env.NO_COLOR && process.env.NO_COLOR !== "") return true;
29
+ if (process.env.FORCE_COLOR === "0") return true;
30
+ return false;
31
+ }
32
+
33
+ function stripAnsi(s: string): string {
34
+ // eslint-disable-next-line no-control-regex
35
+ return s.replace(/\x1B\[[0-9;]*m/g, "");
36
+ }
37
+
38
+ /** Human-readable "time ago" โ€” "30m ago", "2h ago", "3d ago", "2w ago".
39
+ * Returns "just now" for <1 minute. */
40
+ function formatTimeAgo(iso: string | undefined): string {
41
+ if (!iso) return "โ€”";
42
+ const ms = Date.now() - new Date(iso).getTime();
43
+ if (Number.isNaN(ms) || ms < 0) return "โ€”";
44
+ const m = Math.floor(ms / 60_000);
45
+ if (m < 1) return "just now";
46
+ if (m < 60) return `${m}m ago`;
47
+ const h = Math.floor(m / 60);
48
+ if (h < 24) return `${h}h ago`;
49
+ const d = Math.floor(h / 24);
50
+ if (d < 14) return `${d}d ago`;
51
+ const w = Math.floor(d / 7);
52
+ if (w < 8) return `${w}w ago`;
53
+ return `${Math.floor(d / 30)}mo ago`;
54
+ }
55
+
56
+ /** Width of the headline box and section dividers. Adapts to narrow terminals
57
+ * down to a 60-char floor. */
58
+ function getWidth(): number {
59
+ const cols = process.stdout.columns ?? 80;
60
+ return Math.max(60, Math.min(78, cols));
61
+ }
62
+
63
+ /** Box-drawing helpers using unicode round-corner glyphs. */
64
+ function topBorder(w: number): string { return `โ•ญ${"โ”€".repeat(w - 2)}โ•ฎ`; }
65
+ function bottomBorder(w: number): string { return `โ•ฐ${"โ”€".repeat(w - 2)}โ•ฏ`; }
66
+ function boxLine(text: string, w: number): string {
67
+ const inner = w - 4; // 2 chars of border + 1 char padding each side
68
+ const visible = stripAnsi(text);
69
+ const pad = Math.max(0, inner - visible.length);
70
+ return `โ”‚ ${text}${" ".repeat(pad)} โ”‚`;
71
+ }
72
+ function divider(w: number): string { return "โ”€".repeat(w); }
73
+
74
+ /** Short, qualified policy slug โ€” `failproofai/foo` โ†’ `foo` for display. */
75
+ function shortName(name: string): string {
76
+ const slash = name.indexOf("/");
77
+ return slash >= 0 ? name.slice(slash + 1) : name;
78
+ }
79
+
80
+ /** Sum hits across an AuditCount[] subset. */
81
+ function sumHits(rows: AuditCount[]): number {
82
+ return rows.reduce((acc, r) => acc + r.hits, 0);
83
+ }
84
+
85
+ /** Render one row in the table-of-findings form:
86
+ * 31ร— Tried to read files outside your project
87
+ * Stops the agent from peeking at neighboring reposโ€ฆ
88
+ * Last seen 2h ago ยท 6 projects
89
+ * โ€บ Already enforced โ€” failproofai is blocking these in real time.
90
+ * Example: grep -n โ€ฆ
91
+ */
92
+ function renderRow(r: AuditCount, opts: { showExamples?: boolean }): string[] {
93
+ const out: string[] = [];
94
+ const sev = r.severity;
95
+ const titleColor =
96
+ sev === "deny" ? ANSI.red
97
+ : sev === "warn" ? ANSI.red
98
+ : sev === "info" || sev === "instruct" ? ANSI.yellow
99
+ : ANSI.cyan;
100
+ const countStr = String(r.hits).padStart(4);
101
+ out.push(` ${titleColor}${ANSI.bold}${countStr}ร—${ANSI.reset} ${r.displayTitle}`);
102
+ if (r.impact) {
103
+ out.push(` ${ANSI.dim}${r.impact}${ANSI.reset}`);
104
+ }
105
+ out.push(
106
+ ` ${ANSI.dim}Last seen ${formatTimeAgo(r.lastSeen)} ยท ${r.projects} project${r.projects === 1 ? "" : "s"}${ANSI.reset}`,
107
+ );
108
+ if (opts.showExamples && r.examples[0]) {
109
+ out.push(` ${ANSI.dim}Example: ${r.examples[0].example}${ANSI.reset}`);
110
+ }
111
+ if (r.installHint) {
112
+ const arrowColor = r.enabledInConfig ? ANSI.green : ANSI.cyan;
113
+ out.push(` ${arrowColor}โ€บ${ANSI.reset} ${r.installHint}`);
114
+ }
115
+ out.push("");
116
+ return out;
117
+ }
118
+
119
+ export function formatText(result: AuditResult, opts: RunAuditOptions = {}): string {
120
+ const w = getWidth();
121
+ const limit = opts.limit ?? 20;
122
+ const showExamples = !!opts.showExamples;
123
+
124
+ // Split rows by enforcement state.
125
+ const enabledRows = result.results.filter((r) => r.source === "builtin" && r.enabledInConfig);
126
+ const unenabledBuiltinRows = result.results.filter((r) => r.source === "builtin" && !r.enabledInConfig);
127
+ const detectorRows = result.results.filter((r) => r.source === "audit-detector");
128
+ // "Slipping through" combines unenabled-builtins + audit-detectors, ranked by hits.
129
+ const slippingRows = [...unenabledBuiltinRows, ...detectorRows].sort((a, b) => b.hits - a.hits);
130
+
131
+ const totalProtected = sumHits(enabledRows);
132
+ const totalSlipping = sumHits(slippingRows);
133
+ const totalHits = totalProtected + totalSlipping;
134
+ const sinceLabel = result.scope.since ? `the last ${result.scope.since}` : "all time";
135
+
136
+ const lines: string[] = [];
137
+
138
+ // โ”€โ”€ Header โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
139
+ lines.push(`${ANSI.cyan}๐Ÿ›ก failproofai audit${ANSI.reset} ${ANSI.dim}[beta]${ANSI.reset} ยท ${sinceLabel}`);
140
+ lines.push(
141
+ ` ${ANSI.dim}${result.transcripts.scanned} sessions ยท ${result.totals.projectsWithHits} project${result.totals.projectsWithHits === 1 ? "" : "s"} with hits ยท scanned in ${(result.transcripts.durationMs / 1000).toFixed(1)}s${ANSI.reset}`,
142
+ );
143
+ lines.push("");
144
+
145
+ // โ”€โ”€ Headline box โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
146
+ if (totalHits === 0) {
147
+ lines.push(topBorder(w));
148
+ lines.push(boxLine(`${ANSI.green}๐ŸŽ‰ Clean run!${ANSI.reset} Nothing matched your policies in this window.`, w));
149
+ lines.push(bottomBorder(w));
150
+ lines.push("");
151
+ return noColorEnabled() ? stripAnsi(lines.join("\n")) : lines.join("\n");
152
+ }
153
+ lines.push(topBorder(w));
154
+ lines.push(boxLine(
155
+ `${ANSI.bold}Your agent did ${totalHits} wasteful or risky things in ${sinceLabel}.${ANSI.reset}`,
156
+ w,
157
+ ));
158
+ if (totalSlipping > 0) {
159
+ lines.push(boxLine(
160
+ `${totalSlipping} of those would've been caught if more policies were on.`,
161
+ w,
162
+ ));
163
+ }
164
+ lines.push(bottomBorder(w));
165
+ lines.push("");
166
+
167
+ // โ”€โ”€ Section: ALREADY PROTECTED โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
168
+ if (enabledRows.length > 0) {
169
+ lines.push(
170
+ `${ANSI.green}โœ“ ALREADY PROTECTED${ANSI.reset} ${ANSI.dim}(${totalProtected} action${totalProtected === 1 ? "" : "s"} stopped by your current policies)${ANSI.reset}`,
171
+ );
172
+ lines.push("");
173
+ for (const row of enabledRows.slice(0, limit)) {
174
+ lines.push(...renderRow(row, { showExamples }));
175
+ }
176
+ if (enabledRows.length > limit) {
177
+ lines.push(` ${ANSI.dim}โ€ฆ ${enabledRows.length - limit} more (use --limit ${enabledRows.length})${ANSI.reset}`);
178
+ lines.push("");
179
+ }
180
+ }
181
+
182
+ // โ”€โ”€ Section: SLIPPING THROUGH โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
183
+ if (slippingRows.length > 0) {
184
+ lines.push(
185
+ `${ANSI.yellow}โ—‹ SLIPPING THROUGH${ANSI.reset} ${ANSI.dim}(${totalSlipping} action${totalSlipping === 1 ? "" : "s"} caught by audit, not blocked in real time)${ANSI.reset}`,
186
+ );
187
+ lines.push("");
188
+ for (const row of slippingRows.slice(0, limit)) {
189
+ lines.push(...renderRow(row, { showExamples }));
190
+ }
191
+ if (slippingRows.length > limit) {
192
+ lines.push(` ${ANSI.dim}โ€ฆ ${slippingRows.length - limit} more (use --limit ${slippingRows.length})${ANSI.reset}`);
193
+ lines.push("");
194
+ }
195
+ }
196
+
197
+ // โ”€โ”€ Footer / NEXT step โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
198
+ lines.push(divider(w));
199
+ if (unenabledBuiltinRows.length > 0) {
200
+ const installNames = unenabledBuiltinRows.map((r) => shortName(r.name));
201
+ lines.push(
202
+ `${ANSI.bold}NEXT${ANSI.reset} Enable the ${installNames.length} unenabled real-time polic${installNames.length === 1 ? "y" : "ies"} in one command:`,
203
+ );
204
+ lines.push("");
205
+ lines.push(` ${ANSI.cyan}failproofai policies --install ${installNames.join(" ")}${ANSI.reset}`);
206
+ lines.push("");
207
+ } else if (slippingRows.length > 0) {
208
+ lines.push(
209
+ `${ANSI.bold}NEXT${ANSI.reset} Everything blockable is already enabled. Audit-only findings will show up in your next ${ANSI.cyan}failproofai audit${ANSI.reset}.`,
210
+ );
211
+ lines.push("");
212
+ } else {
213
+ lines.push(`${ANSI.bold}NEXT${ANSI.reset} ${ANSI.green}You have the relevant policies enabled. failproofai is blocking these in real time.${ANSI.reset}`);
214
+ lines.push("");
215
+ }
216
+
217
+ // Mirror the actual --report path so the printed footer matches what was
218
+ // (or will be) written. Suppressed entirely with --no-report.
219
+ if (!opts.noReport) {
220
+ const reportPath = opts.reportPath ?? "./failproofai-audit.md";
221
+ lines.push(` ๐Ÿ“„ Shareable report: ${ANSI.cyan}${reportPath}${ANSI.reset}`);
222
+ }
223
+ lines.push(` โญ Star us: ${ANSI.cyan}https://github.com/FailproofAI/failproofai${ANSI.reset}`);
224
+ lines.push("");
225
+
226
+ return noColorEnabled() ? stripAnsi(lines.join("\n")) : lines.join("\n");
227
+ }
228
+
229
+ export function formatJson(result: AuditResult): string {
230
+ return JSON.stringify(result, null, 2);
231
+ }
232
+
233
+ /** Escape characters that would break a markdown table row. Pipes split
234
+ * columns; backslashes escape the next char; leading newlines end the row. */
235
+ function escapeTableCell(s: string): string {
236
+ return s.replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/[\r\n]+/g, " ");
237
+ }
238
+
239
+ function escapeBackticks(s: string): string {
240
+ return s.replace(/`/g, "\\`");
241
+ }
242
+
243
+ export function formatMarkdown(result: AuditResult): string {
244
+ const out: string[] = [];
245
+
246
+ const enabledRows = result.results.filter((r) => r.source === "builtin" && r.enabledInConfig);
247
+ const unenabledBuiltinRows = result.results.filter((r) => r.source === "builtin" && !r.enabledInConfig);
248
+ const detectorRows = result.results.filter((r) => r.source === "audit-detector");
249
+ const slippingRows = [...unenabledBuiltinRows, ...detectorRows].sort((a, b) => b.hits - a.hits);
250
+
251
+ const totalProtected = sumHits(enabledRows);
252
+ const totalSlipping = sumHits(slippingRows);
253
+ const totalHits = totalProtected + totalSlipping;
254
+ const sinceLabel = result.scope.since ? `last ${result.scope.since}` : "all time";
255
+
256
+ out.push(`# Agent behavior audit ยท ${sinceLabel}`);
257
+ out.push("");
258
+ out.push("> _Generated by `failproofai audit` (**beta**) โ€” flags and output may change between releases. Going live shortly._");
259
+ out.push("");
260
+ out.push(`*Generated ${result.scannedAt} โ€” scanned ${result.transcripts.scanned} sessions across ${result.totals.projectsWithHits} project(s) in ${(result.transcripts.durationMs / 1000).toFixed(1)}s.*`);
261
+ out.push("");
262
+
263
+ // TL;DR โ€” readable to someone who doesn't know failproofai.
264
+ out.push("## TL;DR");
265
+ out.push("");
266
+ if (totalHits === 0) {
267
+ out.push("Clean run โ€” the AI coding agent didn't do anything `failproofai` catches in this window.");
268
+ } else {
269
+ out.push(
270
+ `Over ${result.transcripts.scanned} sessions, my AI coding agent did **${totalHits} things \`failproofai\` would have stopped**: ` +
271
+ `${totalProtected} were already blocked in real time by my current config; ` +
272
+ `**${totalSlipping} slipped through** (would've been caught if more policies were on).`,
273
+ );
274
+ }
275
+ out.push("");
276
+ out.push("> [failproofai](https://github.com/FailproofAI/failproofai) is a hook-based policy engine for Claude Code, Codex, Copilot, Cursor, OpenCode, Pi, and Gemini CLI. The `audit` command replays past agent sessions through every builtin policy to surface patterns that were (or could've been) stopped.");
277
+ out.push("");
278
+
279
+ if (totalHits === 0) return out.join("\n");
280
+
281
+ // What was blocked
282
+ if (enabledRows.length > 0) {
283
+ out.push(`## โœ“ Already protected (${totalProtected} action${totalProtected === 1 ? "" : "s"} stopped)`);
284
+ out.push("");
285
+ out.push("These are real-time policies you have on โ€” `failproofai` blocked the agent before each action took effect.");
286
+ out.push("");
287
+ out.push("| Issue | Hits | Projects | Last seen | Policy |");
288
+ out.push("|---|---:|---:|---|---|");
289
+ for (const r of enabledRows) {
290
+ out.push(
291
+ `| ${escapeTableCell(r.displayTitle)} | ${r.hits} | ${r.projects} | ${formatTimeAgo(r.lastSeen)} | \`${escapeTableCell(shortName(r.name))}\` |`,
292
+ );
293
+ }
294
+ out.push("");
295
+ }
296
+
297
+ // What's slipping through
298
+ if (slippingRows.length > 0) {
299
+ out.push(`## โ—‹ Slipping through (${totalSlipping} action${totalSlipping === 1 ? "" : "s"} caught by audit, not yet blocked)`);
300
+ out.push("");
301
+ out.push("Patterns the audit detected but real-time enforcement isn't on for. The CTA column shows how to fix each.");
302
+ out.push("");
303
+ out.push("| Issue | Hits | Projects | Last seen | Fix |");
304
+ out.push("|---|---:|---:|---|---|");
305
+ for (const r of slippingRows) {
306
+ const fix = r.source === "builtin"
307
+ ? `\`failproofai policies --install ${shortName(r.name)}\``
308
+ : "_audit-only_";
309
+ out.push(
310
+ `| ${escapeTableCell(r.displayTitle)} | ${r.hits} | ${r.projects} | ${formatTimeAgo(r.lastSeen)} | ${fix} |`,
311
+ );
312
+ }
313
+ out.push("");
314
+
315
+ if (unenabledBuiltinRows.length > 0) {
316
+ out.push(`### Enable everything in one command`);
317
+ out.push("");
318
+ out.push("```bash");
319
+ out.push(`failproofai policies --install ${unenabledBuiltinRows.map((r) => shortName(r.name)).join(" ")}`);
320
+ out.push("```");
321
+ out.push("");
322
+ }
323
+ }
324
+
325
+ // Examples appendix (only if non-trivial)
326
+ const rowsWithExamples = [...enabledRows, ...slippingRows].filter((r) => r.examples.length > 0);
327
+ if (rowsWithExamples.length > 0) {
328
+ out.push("## Examples");
329
+ out.push("");
330
+ for (const r of rowsWithExamples) {
331
+ out.push(`### ${escapeBackticks(r.displayTitle)} (\`${escapeBackticks(shortName(r.name))}\`)`);
332
+ out.push("");
333
+ if (r.impact) {
334
+ out.push(`> ${r.impact}`);
335
+ out.push("");
336
+ }
337
+ for (const e of r.examples) {
338
+ out.push(`- \`${escapeBackticks(e.example)}\` _(${e.cwd || "?"}, ${formatTimeAgo(e.timestamp)})_`);
339
+ }
340
+ out.push("");
341
+ }
342
+ }
343
+
344
+ out.push("---");
345
+ out.push("");
346
+ out.push("โญ Star failproofai on GitHub: <https://github.com/FailproofAI/failproofai>");
347
+ out.push("");
348
+ return out.join("\n");
349
+ }