failproofai 0.0.11-beta.1 → 0.0.11-beta.3

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 (511) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +8 -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 +45 -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/run/route/app-paths-manifest.json +3 -0
  34. package/.next/standalone/.next/server/app/api/audit/run/route/server-reference-manifest.json +4 -0
  35. package/.next/standalone/.next/server/app/api/audit/run/route.js +8 -0
  36. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -0
  37. package/.next/standalone/.next/server/app/api/audit/run/route_client-reference-manifest.js +3 -0
  38. package/.next/standalone/.next/server/app/api/audit/status/route/app-paths-manifest.json +3 -0
  39. package/.next/standalone/.next/server/app/api/audit/status/route/build-manifest.json +9 -0
  40. package/.next/standalone/.next/server/app/api/audit/status/route/server-reference-manifest.json +4 -0
  41. package/.next/standalone/.next/server/app/api/audit/status/route.js +6 -0
  42. package/.next/standalone/.next/server/app/api/audit/status/route.js.map +5 -0
  43. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -0
  44. package/.next/standalone/.next/server/app/api/audit/status/route_client-reference-manifest.js +3 -0
  45. package/.next/standalone/.next/server/app/api/auth/login-request/route/app-paths-manifest.json +3 -0
  46. package/.next/standalone/.next/server/app/api/auth/login-request/route/build-manifest.json +9 -0
  47. package/.next/standalone/.next/server/app/api/auth/login-request/route/server-reference-manifest.json +4 -0
  48. package/.next/standalone/.next/server/app/api/auth/login-request/route.js +6 -0
  49. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.map +5 -0
  50. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -0
  51. package/.next/standalone/.next/server/app/api/auth/login-request/route_client-reference-manifest.js +3 -0
  52. package/.next/standalone/.next/server/app/api/auth/login-verify/route/app-paths-manifest.json +3 -0
  53. package/.next/standalone/.next/server/app/api/auth/login-verify/route/build-manifest.json +9 -0
  54. package/.next/standalone/.next/server/app/api/auth/login-verify/route/server-reference-manifest.json +4 -0
  55. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +7 -0
  56. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.map +5 -0
  57. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -0
  58. package/.next/standalone/.next/server/app/api/auth/login-verify/route_client-reference-manifest.js +3 -0
  59. package/.next/standalone/.next/server/app/api/auth/logout/route/app-paths-manifest.json +3 -0
  60. package/.next/standalone/.next/server/app/api/auth/logout/route/build-manifest.json +9 -0
  61. package/.next/standalone/.next/server/app/api/auth/logout/route/server-reference-manifest.json +4 -0
  62. package/.next/standalone/.next/server/app/api/auth/logout/route.js +7 -0
  63. package/.next/standalone/.next/server/app/api/auth/logout/route.js.map +5 -0
  64. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -0
  65. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +3 -0
  66. package/.next/standalone/.next/server/app/api/auth/reminder/route/app-paths-manifest.json +3 -0
  67. package/.next/standalone/.next/server/app/api/auth/reminder/route/build-manifest.json +9 -0
  68. package/.next/standalone/.next/server/app/api/auth/reminder/route/server-reference-manifest.json +4 -0
  69. package/.next/standalone/.next/server/app/api/auth/reminder/route.js +7 -0
  70. package/.next/standalone/.next/server/app/api/auth/reminder/route.js.map +5 -0
  71. package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -0
  72. package/.next/standalone/.next/server/app/api/auth/reminder/route_client-reference-manifest.js +3 -0
  73. package/.next/standalone/.next/server/app/api/auth/status/route/app-paths-manifest.json +3 -0
  74. package/.next/standalone/.next/server/app/api/auth/status/route/build-manifest.json +9 -0
  75. package/.next/standalone/.next/server/app/api/auth/status/route/server-reference-manifest.json +4 -0
  76. package/.next/standalone/.next/server/app/api/auth/status/route.js +7 -0
  77. package/.next/standalone/.next/server/app/api/auth/status/route.js.map +5 -0
  78. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -0
  79. package/.next/standalone/.next/server/app/api/auth/status/route_client-reference-manifest.js +3 -0
  80. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +3 -3
  81. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/audit/page/app-paths-manifest.json +3 -0
  83. package/.next/standalone/.next/server/app/audit/page/build-manifest.json +18 -0
  84. package/.next/standalone/.next/server/app/audit/page/next-font-manifest.json +6 -0
  85. package/.next/standalone/.next/server/app/audit/page/react-loadable-manifest.json +1 -0
  86. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +29 -0
  87. package/.next/standalone/.next/server/app/audit/page.js +17 -0
  88. package/.next/standalone/.next/server/app/audit/page.js.map +5 -0
  89. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -0
  90. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +3 -0
  91. package/.next/standalone/.next/server/app/index.html +1 -1
  92. package/.next/standalone/.next/server/app/index.rsc +16 -17
  93. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  94. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -17
  95. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  96. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
  97. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -3
  98. package/.next/standalone/.next/server/app/page/build-manifest.json +7 -7
  99. package/.next/standalone/.next/server/app/page/next-font-manifest.json +2 -6
  100. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  101. package/.next/standalone/.next/server/app/page.js +14 -15
  102. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  103. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/policies/page/build-manifest.json +7 -7
  105. package/.next/standalone/.next/server/app/policies/page/next-font-manifest.json +2 -6
  106. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
  107. package/.next/standalone/.next/server/app/policies/page.js +16 -16
  108. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  109. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +7 -7
  111. package/.next/standalone/.next/server/app/project/[name]/page/next-font-manifest.json +2 -6
  112. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  113. package/.next/standalone/.next/server/app/project/[name]/page.js +16 -17
  114. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  115. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +7 -7
  117. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/next-font-manifest.json +2 -6
  118. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  119. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  120. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +19 -20
  121. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/projects/page/build-manifest.json +7 -7
  124. package/.next/standalone/.next/server/app/projects/page/next-font-manifest.json +2 -6
  125. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  126. package/.next/standalone/.next/server/app/projects/page.js +15 -16
  127. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  128. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  129. package/.next/standalone/.next/server/app-paths-manifest.json +8 -1
  130. package/.next/standalone/.next/server/chunks/[externals]__14odj07._.js +3 -0
  131. package/.next/standalone/.next/server/chunks/{[externals]__0z0j--b._.js → [externals]__1nl3dvw._.js} +1 -1
  132. package/.next/standalone/.next/server/chunks/{[externals]__0-p9.k~._.js → [externals]__1s61mel._.js} +1 -1
  133. package/.next/standalone/.next/server/chunks/{[externals]_node_os_06ur78j._.js → [externals]_node_os_0by37l-._.js} +1 -1
  134. package/.next/standalone/.next/server/chunks/[root-of-the-server]__07tgnzi._.js +3 -0
  135. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0kjo7d_._.js → [root-of-the-server]__0_0xu5z._.js} +2 -2
  136. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cag8qd._.js +3 -0
  137. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0z-180.._.js → [root-of-the-server]__0cycwg6._.js} +2 -2
  138. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__08px0ym._.js → [root-of-the-server]__0f7mikp._.js} +1 -1
  139. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0oeun7z._.js +3 -0
  140. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q-v9z2._.js +3 -0
  141. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rv7m0k._.js +3 -0
  142. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0g48iv.._.js → [root-of-the-server]__0sb_5m8._.js} +2 -2
  143. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0j8-xkl._.js → [root-of-the-server]__0xuaoik._.js} +2 -2
  144. package/.next/standalone/.next/server/chunks/[root-of-the-server]__12pit4m._.js +3 -0
  145. package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h8pzr._.js +3 -0
  146. package/.next/standalone/.next/server/chunks/[root-of-the-server]__13ra2jq._.js +3 -0
  147. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +3 -0
  148. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0d_ob4n._.js → [root-of-the-server]__1_mqemn._.js} +2 -2
  149. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1b9z5-i._.js +3 -0
  150. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0vlhtkc._.js → [root-of-the-server]__1hgv_75._.js} +1 -1
  151. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ixjiy8._.js +3 -0
  152. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0wu7fr7._.js → [root-of-the-server]__1jm9fw6._.js} +1 -1
  153. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1legmza._.js +3 -0
  154. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0fwb7ao._.js → [root-of-the-server]__1m2_4t0._.js} +2 -2
  155. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0yfq1yr._.js → [root-of-the-server]__1mhmdzs._.js} +1 -1
  156. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0zso~62._.js → [root-of-the-server]__1ou2ehh._.js} +1 -1
  157. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qxztj-._.js +3 -0
  158. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rhmvod._.js +3 -0
  159. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0.~nmr9._.js → [root-of-the-server]__1w9zl9-._.js} +1 -1
  160. package/.next/standalone/.next/server/chunks/{_0ebx_lc._.js → _0p53ge1._.js} +2 -2
  161. package/.next/standalone/.next/server/chunks/_1-1804f._.js +3 -0
  162. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_run_route_actions_1qgp9io.js +3 -0
  163. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_status_route_actions_1f7pjof.js +3 -0
  164. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_login-request_route_actions_1c49co0.js +3 -0
  165. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_login-verify_route_actions_1r3slzk.js +3 -0
  166. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_logout_route_actions_0regwyr.js +3 -0
  167. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_reminder_route_actions_1kjgxf8.js +3 -0
  168. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_status_route_actions_1aho9zu.js +3 -0
  169. 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
  170. package/.next/standalone/.next/server/chunks/{lib_logger_ts_047tt9f._.js → lib_logger_ts_07e65t5._.js} +1 -1
  171. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +23 -0
  172. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +3 -0
  173. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +3 -0
  174. package/.next/standalone/.next/server/chunks/{package_json_[json]_cjs_0z7w.hh._.js → package_json_[json]_cjs_1nxcc4v._.js} +2 -2
  175. package/.next/standalone/.next/server/chunks/ssr/{[externals]__12dv.x0._.js → [externals]__1_g_b3t._.js} +1 -1
  176. package/.next/standalone/.next/server/chunks/ssr/{[externals]_node_async_hooks_0v0ln8c._.js → [externals]_node_async_hooks_1gjz99j._.js} +1 -1
  177. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00jkjmt._.js +4 -0
  178. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013du6r._.js +4 -0
  179. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0989_dx._.js +3 -0
  180. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e85wxv._.js +4 -0
  181. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0gfxvb1._.js +3 -0
  182. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h12me5._.js +3 -0
  183. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0l13qf2._.js +3 -0
  184. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ywoypf._.js +3 -0
  185. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1-scthx._.js +3 -0
  186. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__100hdar._.js +3 -0
  187. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11rtg6s._.js +3 -0
  188. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__14dd6h8._.js +3 -0
  189. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1cd25c7._.js +4 -0
  190. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0t5l7a5._.js → [root-of-the-server]__1d8omgc._.js} +1 -1
  191. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0tcyn68._.js → [root-of-the-server]__1dky4g0._.js} +1 -1
  192. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__098zro9._.js → [root-of-the-server]__1fax1sl._.js} +4 -4
  193. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1hlrq6y._.js +4 -0
  194. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ihxdo5._.js +4 -0
  195. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1mt35_w._.js +221 -0
  196. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0-wn51s._.js → [root-of-the-server]__1pcxxwg._.js} +3 -3
  197. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1usf8v2._.js +3 -0
  198. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1vvfde2._.js +4 -0
  199. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__212nf49._.js +3 -0
  200. package/.next/standalone/.next/server/chunks/ssr/{_03d7qyt._.js → _05whahf._.js} +1 -1
  201. package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +3 -0
  202. package/.next/standalone/.next/server/chunks/ssr/{_0xb8ngh._.js → _1kje4fm._.js} +1 -1
  203. package/.next/standalone/.next/server/chunks/ssr/{_0zx~s__._.js → _1p0-leb._.js} +1 -1
  204. package/.next/standalone/.next/server/chunks/ssr/{app_04qfs8z._.js → app_087bt9w._.js} +1 -1
  205. package/.next/standalone/.next/server/chunks/ssr/{app_0uosk1e._.js → app_1fvisnp._.js} +1 -1
  206. package/.next/standalone/.next/server/chunks/ssr/{app_13f0ohr._.js → app_209u41o._.js} +1 -1
  207. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +43 -0
  208. package/.next/standalone/.next/server/chunks/ssr/app_audit_loading_tsx_1j1kc6j._.js +3 -0
  209. package/.next/standalone/.next/server/chunks/ssr/{app_error_tsx_11t4ysq._.js → app_error_tsx_1zds1ns._.js} +1 -1
  210. package/.next/standalone/.next/server/chunks/ssr/{app_global-error_tsx_0m9qisk._.js → app_global-error_tsx_113y3za._.js} +1 -1
  211. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +3 -0
  212. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +8 -0
  213. 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
  214. package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_loading_tsx_03g9xy0._.js → app_project_[name]_loading_tsx_05-l4uf._.js} +1 -1
  215. 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
  216. 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
  217. package/.next/standalone/.next/server/chunks/ssr/app_projects_loading_tsx_20-3u8b._.js +3 -0
  218. package/.next/standalone/.next/server/chunks/ssr/{lib_codex-projects_ts_0eosib~._.js → lib_codex-projects_ts_0pqlw37._.js} +1 -1
  219. package/.next/standalone/.next/server/chunks/ssr/{lib_copilot-projects_ts_0r8xkn8._.js → lib_copilot-projects_ts_19wl7tp._.js} +1 -1
  220. package/.next/standalone/.next/server/chunks/ssr/{lib_cursor-projects_ts_0qt1scg._.js → lib_cursor-projects_ts_18-iwyk._.js} +1 -1
  221. package/.next/standalone/.next/server/chunks/ssr/{lib_gemini-projects_ts_0sl~yqr._.js → lib_gemini-projects_ts_1c7bgx-._.js} +1 -1
  222. package/.next/standalone/.next/server/chunks/ssr/{lib_opencode-projects_ts_0op9gyp._.js → lib_opencode-projects_ts_15bjxkm._.js} +1 -1
  223. package/.next/standalone/.next/server/chunks/ssr/{lib_pi-projects_ts_103tsh1._.js → lib_pi-projects_ts_1wikofb._.js} +1 -1
  224. package/.next/standalone/.next/server/chunks/ssr/{lib_utils_ts_068jk73._.js → lib_utils_ts_0az0sfq._.js} +1 -1
  225. package/.next/standalone/.next/server/chunks/ssr/node_modules_1ynf7el._.js +3 -0
  226. package/.next/standalone/.next/server/chunks/ssr/node_modules_html2canvas_dist_html2canvas_esm_05gja40.js +3 -0
  227. package/.next/standalone/.next/server/chunks/ssr/node_modules_html2canvas_dist_html2canvas_esm_1n-0xws.js +3 -0
  228. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_0rd0oc-._.js → node_modules_next_1a1kch7._.js} +1 -1
  229. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_0h9llsw._.js → node_modules_next_dist_0uboya6._.js} +2 -2
  230. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_11dij6w._.js → node_modules_next_dist_1d_onnt._.js} +2 -2
  231. 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
  232. 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
  233. 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
  234. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0-uvagv.js +4 -0
  235. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03c7gi5.js +4 -0
  236. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09p-8om.js +4 -0
  237. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0v-kfiu.js +4 -0
  238. package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_0j79~gv.js → node_modules_next_dist_esm_build_templates_app-page_0xrgzyz.js} +1 -1
  239. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1806lsc.js +4 -0
  240. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1j6dd-e.js +4 -0
  241. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1sa65r-.js +4 -0
  242. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +3 -0
  243. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1ezd2jf._.js +5 -0
  244. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1tnuifj._.js +5 -0
  245. package/.next/standalone/.next/server/functions-config-manifest.json +3 -0
  246. package/.next/standalone/.next/server/instrumentation.js +1 -1
  247. package/.next/standalone/.next/server/middleware-build-manifest.js +10 -10
  248. package/.next/standalone/.next/server/middleware.js +2 -2
  249. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  250. package/.next/standalone/.next/server/next-font-manifest.json +2 -21
  251. package/.next/standalone/.next/server/pages/404.html +1 -1
  252. package/.next/standalone/.next/server/pages/500.html +1 -1
  253. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  254. package/.next/standalone/.next/server/server-reference-manifest.json +27 -9
  255. package/.next/standalone/.next/static/chunks/{07uz2g0_38qia.js → 03fmihek9n986.js} +1 -1
  256. package/.next/standalone/.next/static/chunks/09ueq8s1as8xs.css +2 -0
  257. package/.next/standalone/.next/static/chunks/0ehe4dh0grngk.js +41 -0
  258. package/.next/standalone/.next/static/chunks/{13-bt.3~irg00.js → 0gdm-xaez4l7t.js} +1 -1
  259. package/.next/standalone/.next/static/chunks/{07kfzzinhsl7e.js → 0kdglk0vtzymo.js} +1 -1
  260. package/.next/standalone/.next/static/chunks/0qassxjx1ef04.js +1 -0
  261. package/.next/standalone/.next/static/chunks/0zbxssxh53n-3.js +1 -0
  262. package/.next/standalone/.next/static/chunks/13f1kmjea-0md.js +2 -0
  263. package/.next/standalone/.next/static/chunks/1btx2c49fk9xt.css +1 -0
  264. package/.next/standalone/.next/static/chunks/1fmco3pvq_twz.js +1 -0
  265. package/.next/standalone/.next/static/chunks/2b1fzuhuk-42n.js +1 -0
  266. package/.next/standalone/.next/static/chunks/{0_vk1wsgf~q3o.js → 2dtip-mvmihiu.js} +1 -1
  267. package/.next/standalone/.next/static/chunks/2srzafd1_ha5y.js +1 -0
  268. package/.next/standalone/.next/static/chunks/{0d3shmwh5_nmn.js → 33u59vf_8xpd-.js} +1 -1
  269. package/.next/standalone/.next/static/chunks/3gti1qdk5epqn.js +1 -0
  270. package/.next/standalone/.next/static/chunks/{0wtiofzdt-l2u.js → 3krzy-lhwfrmz.js} +1 -1
  271. package/.next/standalone/.next/static/chunks/{17mubwtqwijpu.js → 3w8d8k_dca5rp.js} +1 -1
  272. package/.next/standalone/.next/static/chunks/43lnq0c1rnflb.js +6 -0
  273. package/.next/standalone/.next/static/chunks/{turbopack-0nh.aopesgj~5.js → turbopack-00qy7zfa7m--m.js} +1 -1
  274. package/.next/standalone/SECURITY.md +73 -0
  275. package/.next/standalone/app/actions/get-audit-result.ts +24 -0
  276. package/.next/standalone/app/api/audit/_state.ts +72 -0
  277. package/.next/standalone/app/api/audit/run/route.ts +89 -0
  278. package/.next/standalone/app/api/audit/status/route.ts +23 -0
  279. package/.next/standalone/app/api/auth/login-request/route.ts +91 -0
  280. package/.next/standalone/app/api/auth/login-verify/route.ts +98 -0
  281. package/.next/standalone/app/api/auth/logout/route.ts +48 -0
  282. package/.next/standalone/app/api/auth/reminder/route.ts +213 -0
  283. package/.next/standalone/app/api/auth/status/route.ts +42 -0
  284. package/.next/standalone/app/audit/_components/audit-dashboard.tsx +364 -0
  285. package/.next/standalone/app/audit/_components/auth-dialog.tsx +401 -0
  286. package/.next/standalone/app/audit/_components/empty-state.tsx +146 -0
  287. package/.next/standalone/app/audit/_components/findings-section.tsx +135 -0
  288. package/.next/standalone/app/audit/_components/identity-section.tsx +126 -0
  289. package/.next/standalone/app/audit/_components/policies-section.tsx +194 -0
  290. package/.next/standalone/app/audit/_components/report-footer.tsx +35 -0
  291. package/.next/standalone/app/audit/_components/rerun-button.tsx +81 -0
  292. package/.next/standalone/app/audit/_components/return-section.tsx +428 -0
  293. package/.next/standalone/app/audit/_components/run-progress.tsx +120 -0
  294. package/.next/standalone/app/audit/_components/score-section.tsx +179 -0
  295. package/.next/standalone/app/audit/_components/share-dock.tsx +265 -0
  296. package/.next/standalone/app/audit/_components/share-templates.ts +67 -0
  297. package/.next/standalone/app/audit/_components/show-off-cta.tsx +135 -0
  298. package/.next/standalone/app/audit/_components/sigil.tsx +93 -0
  299. package/.next/standalone/app/audit/_components/strengths-section.tsx +57 -0
  300. package/.next/standalone/app/audit/audit-styles.css +2066 -0
  301. package/.next/standalone/app/audit/loading.tsx +24 -0
  302. package/.next/standalone/app/audit/page.tsx +53 -0
  303. package/.next/standalone/app/globals.css +570 -137
  304. package/.next/standalone/app/layout.tsx +16 -9
  305. package/.next/standalone/app/policies/hooks-client.tsx +325 -142
  306. package/.next/standalone/app/project/[name]/page.tsx +89 -39
  307. package/.next/standalone/app/projects/loading.tsx +30 -8
  308. package/.next/standalone/app/projects/page.tsx +76 -18
  309. package/.next/standalone/assets/audit/Audit Report.html +22 -0
  310. package/.next/standalone/assets/audit/Show Off Your Agent.html +22 -0
  311. package/.next/standalone/assets/audit/archetypes.jsx +277 -0
  312. package/.next/standalone/assets/audit/assets/fonts/bitcount-prop-single.woff2 +0 -0
  313. package/.next/standalone/assets/audit/audit.jsx +825 -0
  314. package/.next/standalone/assets/audit/poster-styles.css +424 -0
  315. package/.next/standalone/assets/audit/poster.jsx +247 -0
  316. package/.next/standalone/assets/audit/screenshots/poster-optimist.png +0 -0
  317. package/.next/standalone/assets/audit/screenshots/poster-scrolled.png +0 -0
  318. package/.next/standalone/assets/audit/styles.css +1225 -0
  319. package/.next/standalone/assets/audit/tweaks-panel.jsx +425 -0
  320. package/.next/standalone/assets/logos/company/icon.svg +1 -0
  321. package/.next/standalone/assets/logos/company/logo.svg +1 -0
  322. package/.next/standalone/components/navbar.tsx +154 -65
  323. package/.next/standalone/components/reach-developers.tsx +37 -9
  324. package/.next/standalone/lib/atomic-write.ts +67 -0
  325. package/.next/standalone/lib/auth/api-server-client.ts +281 -0
  326. package/.next/standalone/lib/auth/auth-store.ts +250 -0
  327. package/.next/standalone/lib/claude-sessions.ts +181 -0
  328. package/.next/standalone/lib/client-telemetry.ts +2 -0
  329. package/.next/standalone/lib/fetch-with-timeout.ts +42 -0
  330. package/.next/standalone/lib/share-card.ts +120 -0
  331. package/.next/standalone/lib/telemetry.ts +12 -7
  332. package/.next/standalone/node_modules/@next/env/package.json +1 -1
  333. package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
  334. package/.next/standalone/node_modules/next/dist/client/dev/debug-channel.js +102 -2
  335. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +11 -11
  336. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +13 -13
  337. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +2 -2
  338. package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
  339. package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
  340. package/.next/standalone/node_modules/next/dist/server/app-render/action-handler.js +18 -8
  341. package/.next/standalone/node_modules/next/dist/server/config-schema.js +1 -0
  342. package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
  343. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
  344. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
  345. package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
  346. package/.next/standalone/node_modules/next/dist/server/lib/encode-cache-tag.js +45 -0
  347. package/.next/standalone/node_modules/next/dist/server/lib/implicit-tags.js +6 -3
  348. package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +5 -1
  349. package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
  350. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/revalidate.js +4 -3
  351. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/unstable-cache.js +6 -2
  352. package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
  353. package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
  354. package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
  355. package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
  356. package/.next/standalone/node_modules/next/package.json +15 -15
  357. package/.next/standalone/node_modules/react/cjs/react.development.js +1 -1
  358. package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
  359. package/.next/standalone/node_modules/react/package.json +1 -1
  360. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
  361. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
  362. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +3 -3
  363. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +3 -3
  364. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +3 -3
  365. package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
  366. package/.next/standalone/node_modules/react-dom/package.json +2 -2
  367. package/.next/standalone/osv-scanner.toml +17 -0
  368. package/.next/standalone/package.json +8 -3
  369. package/.next/standalone/public/audit/fonts/bitcount-prop-single.woff2 +0 -0
  370. package/.next/standalone/public/icon.svg +1 -0
  371. package/.next/standalone/public/logo.svg +1 -0
  372. package/.next/standalone/server.js +1 -1
  373. package/.next/standalone/templates/bitcount-font/README.md +42 -0
  374. package/.next/standalone/templates/bitcount-font/bitcount-prop-single.woff2 +0 -0
  375. package/.next/standalone/templates/bitcount-font/bitcount.css +49 -0
  376. package/.next/standalone/templates/bitcount-font/fonts.ts.example +23 -0
  377. package/README.md +4 -3
  378. package/bin/failproofai.mjs +248 -70
  379. package/dist/cli.mjs +1709 -1385
  380. package/lib/atomic-write.ts +67 -0
  381. package/lib/auth/api-server-client.ts +281 -0
  382. package/lib/auth/auth-store.ts +250 -0
  383. package/lib/claude-sessions.ts +181 -0
  384. package/lib/client-telemetry.ts +2 -0
  385. package/lib/fetch-with-timeout.ts +42 -0
  386. package/lib/share-card.ts +120 -0
  387. package/lib/telemetry.ts +12 -7
  388. package/package.json +8 -3
  389. package/scripts/install-telemetry.mjs +4 -0
  390. package/scripts/postinstall.mjs +89 -1
  391. package/src/audit/archetypes.ts +924 -0
  392. package/src/audit/cache.ts +132 -0
  393. package/src/audit/cli-adapters/claude.ts +97 -0
  394. package/src/audit/cli-adapters/codex.ts +56 -0
  395. package/src/audit/cli-adapters/copilot.ts +51 -0
  396. package/src/audit/cli-adapters/cursor.ts +51 -0
  397. package/src/audit/cli-adapters/gemini.ts +51 -0
  398. package/src/audit/cli-adapters/index.ts +70 -0
  399. package/src/audit/cli-adapters/opencode.ts +52 -0
  400. package/src/audit/cli-adapters/pi.ts +51 -0
  401. package/src/audit/cli-adapters/shared.ts +85 -0
  402. package/src/audit/dashboard-cache.ts +111 -0
  403. package/src/audit/detectors/find-from-root.ts +27 -0
  404. package/src/audit/detectors/git-commit-no-verify.ts +22 -0
  405. package/src/audit/detectors/index.ts +33 -0
  406. package/src/audit/detectors/prefer-edit-over-read-cat.ts +31 -0
  407. package/src/audit/detectors/prefer-edit-over-sed-awk.ts +27 -0
  408. package/src/audit/detectors/prefer-write-over-heredoc.ts +36 -0
  409. package/src/audit/detectors/redundant-cd-cwd.ts +28 -0
  410. package/src/audit/detectors/reread-after-edit.ts +58 -0
  411. package/src/audit/detectors/sleep-polling-loop.ts +34 -0
  412. package/src/audit/features.ts +268 -0
  413. package/src/audit/findings.ts +298 -0
  414. package/src/audit/index.ts +387 -0
  415. package/src/audit/replay.ts +147 -0
  416. package/src/audit/report.ts +349 -0
  417. package/src/audit/scoring.ts +174 -0
  418. package/src/audit/strengths.ts +138 -0
  419. package/src/audit/types.ts +216 -0
  420. package/src/auth/cli.ts +359 -0
  421. package/src/hooks/builtin-policies.ts +80 -1
  422. package/src/hooks/custom-hooks-loader.ts +19 -3
  423. package/src/hooks/first-run-nudge.ts +146 -0
  424. package/src/hooks/handler.ts +21 -102
  425. package/src/hooks/hook-telemetry.ts +2 -2
  426. package/src/hooks/install-prompt.ts +34 -4
  427. package/src/hooks/manager.ts +72 -5
  428. package/src/hooks/policy-evaluator.ts +16 -1
  429. package/src/hooks/policy-registry.ts +20 -0
  430. package/src/hooks/policy-types.ts +9 -0
  431. package/src/hooks/tool-name-canonicalize.ts +65 -0
  432. package/src/posthog-key.ts +9 -0
  433. package/.next/standalone/.next/server/app/icon.png/route/app-paths-manifest.json +0 -3
  434. package/.next/standalone/.next/server/app/icon.png/route.js +0 -7
  435. package/.next/standalone/.next/server/app/icon.png/route.js.nft.json +0 -1
  436. package/.next/standalone/.next/server/app/icon.png.body +0 -0
  437. package/.next/standalone/.next/server/app/icon.png.meta +0 -1
  438. package/.next/standalone/.next/server/chunks/[externals]_next_dist_0sqmaqd._.js +0 -3
  439. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06.arfm._.js +0 -3
  440. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0__i0h0._.js +0 -3
  441. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fe7_q_._.js +0 -3
  442. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fw.e.h._.js +0 -3
  443. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pxn0e1._.js +0 -3
  444. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xv0jh2._.js +0 -3
  445. package/.next/standalone/.next/server/chunks/_next-internal_server_app_icon_png_route_actions_12.gv.r.js +0 -3
  446. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0bdfoky.js +0 -3
  447. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_05pz9._._.js +0 -3
  448. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0370~qj._.js +0 -3
  449. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09i-rsi._.js +0 -4
  450. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09v.ljl._.js +0 -3
  451. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0agrcb8._.js +0 -4
  452. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0b7hkr~._.js +0 -3
  453. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ehh6vp._.js +0 -4
  454. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g8l0tu._.js +0 -3
  455. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j4l6hl._.js +0 -3
  456. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0lp08ll._.js +0 -3
  457. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n0yaqw._.js +0 -4
  458. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0o21f.o._.js +0 -3
  459. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0t8juvy._.js +0 -4
  460. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0uylufv._.js +0 -4
  461. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ymlddl._.js +0 -223
  462. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0~03grs._.js +0 -3
  463. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__101v4_7._.js +0 -3
  464. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12y7xmt._.js +0 -3
  465. package/.next/standalone/.next/server/chunks/ssr/app_0cdqd9w._.js +0 -3
  466. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +0 -3
  467. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +0 -8
  468. package/.next/standalone/.next/server/chunks/ssr/app_projects_loading_tsx_13veom4._.js +0 -3
  469. package/.next/standalone/.next/server/chunks/ssr/node_modules_0ttbz1~._.js +0 -3
  470. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_06u0kr8._.js +0 -3
  471. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a_7sdg.js +0 -4
  472. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ef3uwk.js +0 -4
  473. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0pbja1x.js +0 -4
  474. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0r6o0i2.js +0 -4
  475. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11y81~_.js +0 -4
  476. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_12or2kf.js +0 -4
  477. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.js +0 -3
  478. package/.next/standalone/.next/static/chunks/03xhjwk6zhi8f.js +0 -1
  479. package/.next/standalone/.next/static/chunks/0f5p9plm.aqlp.css +0 -2
  480. package/.next/standalone/.next/static/chunks/0ffvlbgzgnlw7.js +0 -2
  481. package/.next/standalone/.next/static/chunks/0wq808vlc8l04.js +0 -6
  482. package/.next/standalone/.next/static/chunks/0zg~cpc5ysg6d.js +0 -1
  483. package/.next/standalone/.next/static/chunks/12pt~2f.c1sha.js +0 -1
  484. package/.next/standalone/.next/static/chunks/16vev.do1oho7.js +0 -4
  485. package/.next/standalone/.next/static/media/4fa387ec64143e14-s.0.qu-9752pffj.woff2 +0 -0
  486. package/.next/standalone/.next/static/media/5ce348bf30bf5439-s.0ee55_hj9qcer.woff2 +0 -0
  487. package/.next/standalone/.next/static/media/6306c77e7c8268e4-s.0mao5jbfbduzp.woff2 +0 -0
  488. package/.next/standalone/.next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2 +0 -0
  489. package/.next/standalone/.next/static/media/7d817b4c03b0c5f1-s.0uzt.a6d44yda.woff2 +0 -0
  490. package/.next/standalone/.next/static/media/bbc41e54d2fcbd21-s.0mvwgmnhv29no.woff2 +0 -0
  491. package/.next/standalone/.next/static/media/icon.0a.gigb3_x5pd.png +0 -0
  492. package/.next/standalone/app/icon.png +0 -0
  493. package/src/auth/login.ts +0 -104
  494. package/src/auth/logout.ts +0 -50
  495. package/src/auth/token-store.ts +0 -64
  496. package/src/relay/daemon.ts +0 -362
  497. package/src/relay/pid.ts +0 -76
  498. package/src/relay/queue.ts +0 -225
  499. /package/.next/standalone/.next/server/app/{icon.png → api/audit/run}/route/build-manifest.json +0 -0
  500. /package/.next/standalone/.next/server/app/{icon.png → api/audit/run}/route.js.map +0 -0
  501. /package/.next/standalone/.next/static/chunks/{03~yq9q893hmn.js → 0cz1d0mv5g_q7.js} +0 -0
  502. /package/.next/standalone/.next/static/chunks/{0a40sy4tk8ioe.js → 0wwt5o04i4zwh.js} +0 -0
  503. /package/.next/standalone/.next/static/chunks/{0n1n67imq.udf.js → 1__i9af9g78vd.js} +0 -0
  504. /package/.next/standalone/.next/static/chunks/{0w6fzf.07a24u.js → 2so39wg7mjbi7.js} +0 -0
  505. /package/.next/standalone/.next/static/chunks/{0xbo5nl6w4lka.js → 2wbuxnsvux4di.js} +0 -0
  506. /package/.next/standalone/.next/static/chunks/{0_s0luks5tay-.js → 35fgpd_feci6x.js} +0 -0
  507. /package/.next/standalone/.next/static/chunks/{15fklyav5py5m.js → 3xpjn3cdgm-7m.js} +0 -0
  508. /package/.next/standalone/.next/static/chunks/{17.b3suj8zjjj.js → 4448_qq7bd963.js} +0 -0
  509. /package/.next/standalone/.next/static/{s5Nn6KwDdLpPhjG3l2WNf → wU3ot-EKa5ApKoh785wp8}/_buildManifest.js +0 -0
  510. /package/.next/standalone/.next/static/{s5Nn6KwDdLpPhjG3l2WNf → wU3ot-EKa5ApKoh785wp8}/_clientMiddlewareManifest.js +0 -0
  511. /package/.next/standalone/.next/static/{s5Nn6KwDdLpPhjG3l2WNf → wU3ot-EKa5ApKoh785wp8}/_ssgManifest.js +0 -0
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Claude Code session transcript discovery helpers.
3
+ *
4
+ * Claude stores transcripts at:
5
+ * <CLAUDE_PROJECTS_PATH>/<encoded-cwd>/<sessionId>.jsonl
6
+ *
7
+ * Subagent transcripts (when a session spawned subagents) live alongside:
8
+ * <CLAUDE_PROJECTS_PATH>/<encoded-cwd>/<sessionId>/subagents/<agentId>.jsonl
9
+ *
10
+ * The parser for these files lives in `lib/log-entries.ts` (`parseLogContent`,
11
+ * `parseSessionLog`). This module exposes discovery only — the audit pipeline
12
+ * and any future Claude-specific tool walk the directory layout via these
13
+ * helpers instead of re-implementing the path conventions.
14
+ *
15
+ * Mirrors the shape of `lib/cursor-sessions.ts` for parity across CLIs.
16
+ */
17
+ import { readdirSync, statSync, existsSync } from "node:fs";
18
+ import { join, basename } from "node:path";
19
+ import { getClaudeProjectsPath, decodeFolderName } from "./paths";
20
+
21
+ const UUID_RE = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i;
22
+
23
+ export interface ClaudeProjectFolder {
24
+ /** Encoded folder name on disk (e.g. "-home-user-project"). */
25
+ name: string;
26
+ /** Decoded filesystem path (e.g. "/home/user/project"). */
27
+ cwd: string;
28
+ /** Absolute path of the encoded folder. */
29
+ path: string;
30
+ }
31
+
32
+ export interface ClaudeTranscriptFile {
33
+ projectName: string;
34
+ /** Decoded cwd of the project. */
35
+ cwd: string;
36
+ sessionId: string;
37
+ /** Absolute path of `<sessionId>.jsonl`. */
38
+ transcriptPath: string;
39
+ mtimeMs: number;
40
+ sizeBytes: number;
41
+ /** True when this is a subagent transcript spawned from a parent session. */
42
+ isSubagent: boolean;
43
+ }
44
+
45
+ /** Returns the Claude projects root, honoring the CLAUDE_PROJECTS_PATH env var. */
46
+ export function getClaudeProjectsRoot(): string {
47
+ return getClaudeProjectsPath();
48
+ }
49
+
50
+ /** Lists all Claude project folders (one per encoded cwd). Returns [] if the
51
+ * projects root doesn't exist. Filenames that don't look like Claude project
52
+ * encodings are still included — encoding is permissive. */
53
+ export function listClaudeProjects(): ClaudeProjectFolder[] {
54
+ const root = getClaudeProjectsRoot();
55
+ let entries: import("node:fs").Dirent[];
56
+ try {
57
+ entries = readdirSync(root, { withFileTypes: true });
58
+ } catch {
59
+ return [];
60
+ }
61
+ return entries
62
+ .filter((e) => e.isDirectory())
63
+ .map((e) => ({
64
+ name: e.name,
65
+ cwd: decodeFolderName(e.name),
66
+ path: join(root, e.name),
67
+ }));
68
+ }
69
+
70
+ /** Lists every JSONL transcript under one Claude project folder, including
71
+ * subagent transcripts under `<sessionId>/subagents/`. Returns [] on missing
72
+ * or unreadable paths. */
73
+ export function listClaudeTranscripts(project: ClaudeProjectFolder): ClaudeTranscriptFile[] {
74
+ const out: ClaudeTranscriptFile[] = [];
75
+ let entries: import("node:fs").Dirent[];
76
+ try {
77
+ entries = readdirSync(project.path, { withFileTypes: true });
78
+ } catch {
79
+ return out;
80
+ }
81
+
82
+ for (const entry of entries) {
83
+ if (entry.isFile() && entry.name.endsWith(".jsonl")) {
84
+ const sessionId = entry.name.slice(0, -".jsonl".length);
85
+ if (!UUID_RE.test(sessionId)) continue;
86
+ const transcriptPath = join(project.path, entry.name);
87
+ try {
88
+ const s = statSync(transcriptPath);
89
+ out.push({
90
+ projectName: project.name,
91
+ cwd: project.cwd,
92
+ sessionId,
93
+ transcriptPath,
94
+ mtimeMs: s.mtimeMs,
95
+ sizeBytes: s.size,
96
+ isSubagent: false,
97
+ });
98
+ } catch {
99
+ // unreadable — skip
100
+ }
101
+ } else if (entry.isDirectory() && UUID_RE.test(entry.name)) {
102
+ // Subagent transcripts at <sessionId>/subagents/<agentId>.jsonl
103
+ const subDir = join(project.path, entry.name, "subagents");
104
+ if (!existsSync(subDir)) continue;
105
+ let subEntries: import("node:fs").Dirent[];
106
+ try {
107
+ subEntries = readdirSync(subDir, { withFileTypes: true });
108
+ } catch {
109
+ continue;
110
+ }
111
+ for (const sub of subEntries) {
112
+ if (!sub.isFile() || !sub.name.endsWith(".jsonl")) continue;
113
+ const agentId = sub.name.slice(0, -".jsonl".length);
114
+ const transcriptPath = join(subDir, sub.name);
115
+ try {
116
+ const s = statSync(transcriptPath);
117
+ out.push({
118
+ projectName: project.name,
119
+ cwd: project.cwd,
120
+ sessionId: agentId,
121
+ transcriptPath,
122
+ mtimeMs: s.mtimeMs,
123
+ sizeBytes: s.size,
124
+ isSubagent: true,
125
+ });
126
+ } catch {
127
+ // unreadable — skip
128
+ }
129
+ }
130
+ }
131
+ }
132
+
133
+ return out;
134
+ }
135
+
136
+ /** Convenience: locate one Claude transcript file by session ID across all
137
+ * project folders. Returns null if not found. */
138
+ export function findClaudeTranscript(sessionId: string): string | null {
139
+ if (!UUID_RE.test(sessionId)) return null;
140
+ for (const project of listClaudeProjects()) {
141
+ const candidate = join(project.path, `${sessionId}.jsonl`);
142
+ if (existsSync(candidate)) return candidate;
143
+ // Subagent fallback
144
+ let entries: import("node:fs").Dirent[];
145
+ try {
146
+ entries = readdirSync(project.path, { withFileTypes: true });
147
+ } catch {
148
+ continue;
149
+ }
150
+ for (const entry of entries) {
151
+ if (!entry.isDirectory() || !UUID_RE.test(entry.name)) continue;
152
+ const subCandidate = join(project.path, entry.name, "subagents", `${sessionId}.jsonl`);
153
+ if (existsSync(subCandidate)) return subCandidate;
154
+ }
155
+ }
156
+ return null;
157
+ }
158
+
159
+ /** For tests: list all session IDs across all projects. */
160
+ export function _listAllSessionIds(): string[] {
161
+ const ids: string[] = [];
162
+ for (const project of listClaudeProjects()) {
163
+ for (const t of listClaudeTranscripts(project)) {
164
+ ids.push(t.sessionId);
165
+ }
166
+ }
167
+ return ids;
168
+ }
169
+
170
+ /** For tests: stat one transcript file. */
171
+ export function _statTranscript(path: string): { mtimeMs: number; sizeBytes: number } | null {
172
+ try {
173
+ const s = statSync(path);
174
+ return { mtimeMs: s.mtimeMs, sizeBytes: s.size };
175
+ } catch {
176
+ return null;
177
+ }
178
+ }
179
+
180
+ /** Re-export for callers that want to construct paths from a basename. */
181
+ export { basename };
@@ -1,4 +1,5 @@
1
1
  import type { TelemetryConfig } from "@/app/actions/get-telemetry-config";
2
+ import { POSTHOG_PRODUCT } from "@/src/posthog-key";
2
3
 
3
4
  let config: TelemetryConfig | null = null;
4
5
 
@@ -21,6 +22,7 @@ export function captureClientEvent(
21
22
  ...properties,
22
23
  $lib: "failproofai-web",
23
24
  failproofai_version: config.version,
25
+ product: POSTHOG_PRODUCT,
24
26
  $current_url: window.location.href,
25
27
  $pathname: window.location.pathname,
26
28
  },
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Shared fetch wrapper with per-request timeout via AbortController.
3
+ *
4
+ * Replaces three byte-equivalent implementations that had drifted on the
5
+ * default timeout (15s in two client components, 10s in the server-side
6
+ * api-server-client). Co-locates the `isAbortError` predicate so callers
7
+ * can classify timeout vs network failures consistently.
8
+ *
9
+ * Server-side uses `AbortSignal.timeout` where available (cheaper); this
10
+ * helper uses the AbortController+setTimeout form because the client
11
+ * code-paths need a guaranteed cleanup hook.
12
+ */
13
+
14
+ /** Hard cap on every fetch using this helper unless overridden. Picked to
15
+ * exceed the server-side `REQUEST_TIMEOUT_MS` (10s) in `api-server-client.ts`
16
+ * so a slow but successful upstream response still lands. */
17
+ export const DEFAULT_FETCH_TIMEOUT_MS = 15_000;
18
+
19
+ export async function fetchWithTimeout(
20
+ input: RequestInfo | URL,
21
+ init: RequestInit = {},
22
+ timeoutMs: number = DEFAULT_FETCH_TIMEOUT_MS,
23
+ ): Promise<Response> {
24
+ const controller = new AbortController();
25
+ const id = setTimeout(() => controller.abort(), timeoutMs);
26
+ try {
27
+ return await fetch(input, { ...init, signal: controller.signal });
28
+ } finally {
29
+ clearTimeout(id);
30
+ }
31
+ }
32
+
33
+ /** True when an error came from an AbortController.abort() OR a
34
+ * `AbortSignal.timeout` firing. Both surface as `Error` with `name`
35
+ * set to "AbortError" or "TimeoutError" respectively. Keeping the two
36
+ * in one predicate prevents the "I forgot TimeoutError" drift class. */
37
+ export function isAbortError(err: unknown): boolean {
38
+ return (
39
+ err instanceof Error
40
+ && (err.name === "AbortError" || err.name === "TimeoutError")
41
+ );
42
+ }
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Helpers for attaching the audit-card PNG to a social share.
3
+ *
4
+ * X and LinkedIn intent URLs cannot carry image attachments — only text
5
+ * and a target URL. To actually get an image into a post we have three
6
+ * options at different levels of "automatic":
7
+ *
8
+ * 1. `shareCardNative` → `navigator.share({ files })` — the system
9
+ * share sheet handles the image + text in one step. Works on
10
+ * iOS, Android, recent Safari, recent Chrome desktop. When the
11
+ * user picks their target (X / LinkedIn / …) the image is
12
+ * already attached.
13
+ * 2. `copyOrDownloadCard` → clipboard + open intent URL — the user
14
+ * pastes (⌘/Ctrl+V) in the share dialog and the image attaches.
15
+ * 3. `downloadCard` → straight download to disk, no other side
16
+ * effects. Used by the dedicated "save audit-card" button so
17
+ * the user gets a file every time, regardless of clipboard
18
+ * permissions.
19
+ */
20
+
21
+ export type ShareCardMethod = "native" | "clipboard" | "download" | "failed";
22
+
23
+ /**
24
+ * Try the native Web Share API with a file attachment. Returns `true` on
25
+ * success, `false` if the API is unavailable, files-sharing isn't
26
+ * supported, or the user dismissed the sheet. Caller should fall back to
27
+ * `copyOrDownloadCard` on `false`.
28
+ */
29
+ export async function shareCardNative(
30
+ blob: Blob,
31
+ filename: string,
32
+ text: string,
33
+ ): Promise<boolean> {
34
+ if (typeof navigator === "undefined" || typeof navigator.share !== "function") {
35
+ return false;
36
+ }
37
+ const file = new File([blob], filename, { type: "image/png" });
38
+ // Some browsers (older Chrome desktop) expose `navigator.share` but reject
39
+ // file payloads. `canShare({ files })` gates that cleanly.
40
+ type CanShareNav = Navigator & { canShare?: (data: ShareData) => boolean };
41
+ const navWithCan = navigator as CanShareNav;
42
+ if (typeof navWithCan.canShare === "function" && !navWithCan.canShare({ files: [file] })) {
43
+ return false;
44
+ }
45
+ try {
46
+ await navigator.share({ files: [file], text });
47
+ return true;
48
+ } catch (err) {
49
+ // AbortError → user dismissed the sheet. Treat as a soft failure so the
50
+ // caller can decide whether to open the intent URL anyway.
51
+ if (err instanceof Error && err.name === "AbortError") return false;
52
+ return false;
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Copy a captured share-card PNG to the system clipboard, or fall back to a
58
+ * download if the browser doesn't support image clipboard writes (or the
59
+ * user denied permission). The caller MUST be inside an active user gesture
60
+ * (click handler) — Chromium gates `navigator.clipboard.write` on user
61
+ * activation.
62
+ */
63
+ export async function copyOrDownloadCard(
64
+ blob: Blob,
65
+ filename: string,
66
+ ): Promise<Exclude<ShareCardMethod, "native">> {
67
+ if (
68
+ typeof ClipboardItem !== "undefined"
69
+ && typeof navigator !== "undefined"
70
+ && navigator.clipboard
71
+ && typeof navigator.clipboard.write === "function"
72
+ ) {
73
+ try {
74
+ await navigator.clipboard.write([
75
+ new ClipboardItem({ "image/png": blob }),
76
+ ]);
77
+ return "clipboard";
78
+ } catch {
79
+ /* permission denied, secure-context issue, browser fence, … */
80
+ }
81
+ }
82
+ return downloadCard(blob, filename) ? "download" : "failed";
83
+ }
84
+
85
+ /**
86
+ * Trigger a local download of the PNG. Returns `true` on success. No
87
+ * clipboard interaction — used by the explicit "save audit-card" CTA so the
88
+ * user reliably gets a file even when clipboard write would succeed.
89
+ */
90
+ export function downloadCard(blob: Blob, filename: string): boolean {
91
+ try {
92
+ if (typeof document === "undefined" || typeof URL === "undefined") return false;
93
+ const url = URL.createObjectURL(blob);
94
+ const a = document.createElement("a");
95
+ a.href = url;
96
+ a.download = filename;
97
+ a.style.display = "none";
98
+ document.body.appendChild(a);
99
+ a.click();
100
+ a.remove();
101
+ queueMicrotask(() => URL.revokeObjectURL(url));
102
+ return true;
103
+ } catch {
104
+ return false;
105
+ }
106
+ }
107
+
108
+ /** Human-readable toast copy keyed by share method. */
109
+ export function shareCardToastMessage(method: ShareCardMethod): string {
110
+ switch (method) {
111
+ case "native":
112
+ return "✅ image attached — pick where to post";
113
+ case "clipboard":
114
+ return "📋 image copied — paste it in the post (⌘/Ctrl+V)";
115
+ case "download":
116
+ return "⬇ image downloaded — attach it to your post";
117
+ case "failed":
118
+ return "couldn't capture image — opening text-only share";
119
+ }
120
+ }
package/lib/telemetry.ts CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  import { getInstanceId } from "./telemetry-id";
12
12
  import { version } from "../package.json";
13
- import { POSTHOG_API_KEY } from "../src/posthog-key";
13
+ import { POSTHOG_API_KEY, POSTHOG_PRODUCT } from "../src/posthog-key";
14
14
 
15
15
  const DEFAULT_API_KEY = POSTHOG_API_KEY;
16
16
  const DEFAULT_HOST = "https://us.i.posthog.com";
@@ -81,13 +81,18 @@ export function isTelemetryEnabled(): boolean {
81
81
 
82
82
  /**
83
83
  * Lazily import posthog-node and create a client.
84
- * No-op when telemetry is disabled.
84
+ *
85
+ * No-op when telemetry is disabled. **Never throws** — callers (the
86
+ * Next.js API routes and the CLI subcommands) can `await initTelemetry()`
87
+ * unguarded and a posthog init failure can't 500 a valid auth response.
88
+ * The outer try/catch is the single source of truth; do NOT add a
89
+ * per-call wrapper at the call sites.
85
90
  */
86
91
  export async function initTelemetry(): Promise<void> {
87
- if (!isTelemetryEnabled()) return;
88
- if (globalThis.__FAILPROOFAI_POSTHOG__) return;
89
-
90
92
  try {
93
+ if (!isTelemetryEnabled()) return;
94
+ if (globalThis.__FAILPROOFAI_POSTHOG__) return;
95
+
91
96
  const mod: { PostHog: new (key: string, opts: PostHogOptions) => PostHogClient } =
92
97
  await import("posthog-node");
93
98
  const apiKey = process.env.FAILPROOFAI_POSTHOG_KEY ?? DEFAULT_API_KEY;
@@ -110,7 +115,7 @@ export async function initTelemetry(): Promise<void> {
110
115
  process.on("SIGINT", onExit);
111
116
  } catch (err) {
112
117
  // Always log init failures — silent swallowing makes standalone debugging impossible
113
- console.warn("[failproofai:telemetry] PostHog init failed:", err instanceof Error ? err.message : err);
118
+ console.warn("[failproofai:telemetry] init failed:", err instanceof Error ? err.message : err);
114
119
  }
115
120
  }
116
121
 
@@ -129,7 +134,7 @@ export function trackEvent(
129
134
  client.capture({
130
135
  distinctId: getInstanceId(),
131
136
  event: name,
132
- properties: { ...properties, $lib: "failproofai", failproofai_version: version },
137
+ properties: { ...properties, $lib: "failproofai", failproofai_version: version, product: POSTHOG_PRODUCT },
133
138
  });
134
139
  }
135
140
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "failproofai",
3
- "version": "0.0.11-beta.1",
3
+ "version": "0.0.11-beta.3",
4
4
  "description": "The easiest way to manage policies that keep your AI agents reliable, on-task, and running autonomously — for Claude Code & the Agents SDK",
5
5
  "bin": {
6
6
  "failproofai": "./dist/cli.mjs"
@@ -71,7 +71,7 @@
71
71
  "access": "public"
72
72
  },
73
73
  "devDependencies": {
74
- "@anthropic-ai/sdk": "^0.96.0",
74
+ "@anthropic-ai/sdk": "^0.102.0",
75
75
  "@tailwindcss/postcss": "^4.1.18",
76
76
  "@tanstack/react-virtual": "^3.13.18",
77
77
  "@testing-library/jest-dom": "^6.9.1",
@@ -84,7 +84,7 @@
84
84
  "clsx": "^2.1.1",
85
85
  "eslint": "^10.2.0",
86
86
  "eslint-config-next": "^16.2.2",
87
- "happy-dom": "^20.7.0",
87
+ "jsdom": "^29.1.1",
88
88
  "lucide-react": "^1.0.1",
89
89
  "next": "^16.2.2",
90
90
  "react": "^19.2.4",
@@ -95,6 +95,11 @@
95
95
  "vitest": "^4.0.18"
96
96
  },
97
97
  "dependencies": {
98
+ "html2canvas": "^1.4.1",
98
99
  "posthog-node": "^5.28.11"
100
+ },
101
+ "overrides": {
102
+ "postcss": "8.5.14",
103
+ "eslint-plugin-react-hooks": "7.0.1"
99
104
  }
100
105
  }
@@ -13,6 +13,9 @@ import { join } from "node:path";
13
13
  const NAMESPACE = "failproofai-telemetry-v1";
14
14
  const API_KEY = "phc_Ac1Ww1GqKc0z1SyrRWbmatEeQdlOQIsDEEdP8l8JRgX";
15
15
  const CAPTURE_URL = "https://us.i.posthog.com/capture/";
16
+ // Mirrors POSTHOG_PRODUCT in src/posthog-key.ts — this standalone npm-lifecycle
17
+ // script can't import the TS module at install time, so the literal is inlined.
18
+ const PRODUCT = "failproofai-oss";
16
19
 
17
20
  function hashToId(raw) {
18
21
  return createHmac("sha256", NAMESPACE).update(raw).digest("hex");
@@ -91,6 +94,7 @@ export async function trackInstallEvent(event, properties = {}) {
91
94
  ...properties,
92
95
  $lib: "failproofai-install",
93
96
  failproofai_version: version,
97
+ product: PRODUCT,
94
98
  },
95
99
  });
96
100
 
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * No external dependencies — Node.js built-ins only.
9
9
  */
10
- import { existsSync, readFileSync } from "node:fs";
10
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
11
11
  import { resolve } from "node:path";
12
12
  import { platform, arch, release, homedir, hostname } from "node:os";
13
13
  import { createHmac } from "node:crypto";
@@ -134,6 +134,94 @@ try {
134
134
  // Non-critical — don't fail the install
135
135
  }
136
136
 
137
+ if (!hooksResult.configured && !hooksResult.registered) {
138
+ console.log(
139
+ `\n[failproofai] Installed. Next steps:\n` +
140
+ ` 1. Run \`failproofai policies --install\` to enable safety policies.\n` +
141
+ ` 2. Run \`failproofai\` to open the dashboard (or just \`failproofai\` to start now — it'll offer to set up policies for you).\n` +
142
+ ` Disable first-run prompt: FAILPROOFAI_NO_FIRST_RUN=1\n`
143
+ );
144
+ }
145
+
146
+ // First-run + version_changed detection. The presence of ~/.failproofai/last-version
147
+ // is a stable signal: written on every postinstall, absent before the first one.
148
+ // Cannot piggy-back on instance-id because most users hit Tier 2 (OS machine ID)
149
+ // and never create that file.
150
+ //
151
+ // Semver comparison: a release (no prerelease tag) is greater than the same
152
+ // version with a prerelease tag (semver §11). Inside the prerelease, numeric
153
+ // identifiers are lower than non-numeric ones of the same length.
154
+ function compareSemver(a, b) {
155
+ const parse = (v) => {
156
+ const m = /^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$/.exec(v);
157
+ if (!m) return null;
158
+ return { nums: [Number(m[1]), Number(m[2]), Number(m[3])], pre: m[4] ?? null };
159
+ };
160
+ const pa = parse(a);
161
+ const pb = parse(b);
162
+ if (!pa || !pb) return a < b ? -1 : a > b ? 1 : 0;
163
+ for (let i = 0; i < 3; i++) {
164
+ if (pa.nums[i] !== pb.nums[i]) return pa.nums[i] < pb.nums[i] ? -1 : 1;
165
+ }
166
+ if (pa.pre === null && pb.pre === null) return 0;
167
+ if (pa.pre === null) return 1;
168
+ if (pb.pre === null) return -1;
169
+ const ax = pa.pre.split(/[.-]/);
170
+ const bx = pb.pre.split(/[.-]/);
171
+ for (let i = 0; i < Math.max(ax.length, bx.length); i++) {
172
+ const ai = ax[i], bi = bx[i];
173
+ if (ai === undefined) return -1;
174
+ if (bi === undefined) return 1;
175
+ const aNum = /^\d+$/.test(ai), bNum = /^\d+$/.test(bi);
176
+ if (aNum && bNum) {
177
+ const d = Number(ai) - Number(bi);
178
+ if (d !== 0) return d < 0 ? -1 : 1;
179
+ } else if (aNum) {
180
+ return -1;
181
+ } else if (bNum) {
182
+ return 1;
183
+ } else if (ai !== bi) {
184
+ return ai < bi ? -1 : 1;
185
+ }
186
+ }
187
+ return 0;
188
+ }
189
+
190
+ const currentVersion = process.env.npm_package_version ?? "unknown";
191
+ const lastVersionFile = resolve(homedir(), ".failproofai", "last-version");
192
+ let previousVersion = null;
193
+ try {
194
+ if (existsSync(lastVersionFile)) {
195
+ previousVersion = readFileSync(lastVersionFile, "utf8").trim() || null;
196
+ }
197
+ } catch {}
198
+
199
+ if (previousVersion === null) {
200
+ trackInstallEvent("first_install", {
201
+ platform: platform(),
202
+ arch: arch(),
203
+ os_release: release(),
204
+ node_version: process.versions.node,
205
+ version: currentVersion,
206
+ }).catch(() => {});
207
+ } else {
208
+ // Same version is a reinstall — still worth tracking; users hitting `npm install -g`
209
+ // repeatedly is itself signal. Drop the `!==` guard so cmp===0 reaches the event.
210
+ const cmp = compareSemver(previousVersion, currentVersion);
211
+ trackInstallEvent("version_changed", {
212
+ from_version: previousVersion,
213
+ to_version: currentVersion,
214
+ direction: cmp < 0 ? "upgrade" : cmp > 0 ? "downgrade" : "reinstall",
215
+ platform: platform(),
216
+ arch: arch(),
217
+ }).catch(() => {});
218
+ }
219
+
220
+ try {
221
+ mkdirSync(resolve(homedir(), ".failproofai"), { recursive: true });
222
+ writeFileSync(lastVersionFile, currentVersion, "utf8");
223
+ } catch {}
224
+
137
225
  // Telemetry (best-effort, fire-and-forget)
138
226
  trackInstallEvent("package_installed", {
139
227
  platform: platform(),