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,250 @@
1
+ /**
2
+ * Persistence layer for the FailproofAI auth.json file.
3
+ *
4
+ * Tokens live at ~/.failproofai/auth.json with mode 0600. The dashboard's
5
+ * Next.js API routes and the CLI both read/write through here so the user's
6
+ * session survives across `failproofai` (dashboard) and `failproofai auth`
7
+ * (CLI) invocations.
8
+ */
9
+
10
+ import { existsSync, readFileSync, rmSync } from "node:fs";
11
+ import { homedir } from "node:os";
12
+ import { join } from "node:path";
13
+
14
+ import { writeJsonAtomically } from "../atomic-write";
15
+ import {
16
+ AuthApiError,
17
+ decodeJwt,
18
+ fetchMe,
19
+ refreshAccessToken,
20
+ type MeResponse,
21
+ } from "./api-server-client";
22
+
23
+ export interface StoredAuth {
24
+ access_token: string;
25
+ refresh_token: string;
26
+ access_expires_at: number; // unix seconds
27
+ refresh_expires_at: number; // unix seconds (best-effort; not strictly verified server-side)
28
+ user: { id: string; email: string };
29
+ }
30
+
31
+ export function getAuthDir(): string {
32
+ const override = process.env.FAILPROOFAI_AUTH_DIR;
33
+ if (override) return override;
34
+ return join(homedir(), ".failproofai");
35
+ }
36
+
37
+ export function getAuthFilePath(): string {
38
+ return join(getAuthDir(), "auth.json");
39
+ }
40
+
41
+ /** Location of the persisted re-audit reminder (separate from auth.json so
42
+ * the reminder survives unrelated session refreshes). */
43
+ export function getReminderFilePath(): string {
44
+ return join(getAuthDir(), "next-audit.json");
45
+ }
46
+
47
+ export interface StoredReminder {
48
+ /** Unix seconds. */
49
+ next_audit_at: number;
50
+ /** Email the reminder was set for. Used to invalidate the reminder if the
51
+ * active session belongs to a different user. */
52
+ user_email: string;
53
+ /** Unix seconds. */
54
+ set_at: number;
55
+ }
56
+
57
+ export function readReminder(): StoredReminder | null {
58
+ const p = getReminderFilePath();
59
+ if (!existsSync(p)) return null;
60
+ try {
61
+ const raw = readFileSync(p, "utf-8");
62
+ const parsed = JSON.parse(raw) as Partial<StoredReminder>;
63
+ if (
64
+ typeof parsed.next_audit_at !== "number" ||
65
+ typeof parsed.user_email !== "string" ||
66
+ typeof parsed.set_at !== "number"
67
+ ) {
68
+ return null;
69
+ }
70
+ return {
71
+ next_audit_at: parsed.next_audit_at,
72
+ user_email: parsed.user_email,
73
+ set_at: parsed.set_at,
74
+ };
75
+ } catch {
76
+ return null;
77
+ }
78
+ }
79
+
80
+ export function writeReminder(reminder: StoredReminder): void {
81
+ writeJsonAtomically(getReminderFilePath(), reminder);
82
+ }
83
+
84
+ export function deleteReminder(): void {
85
+ const p = getReminderFilePath();
86
+ if (existsSync(p)) rmSync(p, { force: true });
87
+ }
88
+
89
+ export function readAuth(): StoredAuth | null {
90
+ const p = getAuthFilePath();
91
+ if (!existsSync(p)) return null;
92
+ try {
93
+ const raw = readFileSync(p, "utf-8");
94
+ const parsed = JSON.parse(raw) as Partial<StoredAuth>;
95
+ if (
96
+ typeof parsed.access_token !== "string" ||
97
+ typeof parsed.refresh_token !== "string" ||
98
+ typeof parsed.access_expires_at !== "number" ||
99
+ typeof parsed.user !== "object" ||
100
+ !parsed.user ||
101
+ typeof (parsed.user as { id?: unknown }).id !== "string" ||
102
+ typeof (parsed.user as { email?: unknown }).email !== "string"
103
+ ) {
104
+ return null;
105
+ }
106
+ return {
107
+ access_token: parsed.access_token,
108
+ refresh_token: parsed.refresh_token,
109
+ access_expires_at: parsed.access_expires_at,
110
+ refresh_expires_at:
111
+ typeof parsed.refresh_expires_at === "number"
112
+ ? parsed.refresh_expires_at
113
+ : parsed.access_expires_at,
114
+ user: {
115
+ id: (parsed.user as { id: string }).id,
116
+ email: (parsed.user as { email: string }).email,
117
+ },
118
+ };
119
+ } catch {
120
+ return null;
121
+ }
122
+ }
123
+
124
+ export function writeAuth(auth: StoredAuth): void {
125
+ writeJsonAtomically(getAuthFilePath(), auth);
126
+ }
127
+
128
+ export function deleteAuth(): void {
129
+ const p = getAuthFilePath();
130
+ if (existsSync(p)) rmSync(p, { force: true });
131
+ }
132
+
133
+ /** Convert verify/refresh response into the on-disk shape. */
134
+ export function authFromTokenResponse(token: {
135
+ access_token: string;
136
+ refresh_token: string;
137
+ access_expires_in: number;
138
+ refresh_expires_in: number;
139
+ user?: { id: string; email: string };
140
+ }, existingUser?: { id: string; email: string }): StoredAuth {
141
+ const now = Math.floor(Date.now() / 1000);
142
+ const user = token.user ?? existingUser;
143
+ if (!user) {
144
+ throw new Error("authFromTokenResponse: missing user identity");
145
+ }
146
+ return {
147
+ access_token: token.access_token,
148
+ refresh_token: token.refresh_token,
149
+ access_expires_at: now + token.access_expires_in,
150
+ refresh_expires_at: now + token.refresh_expires_in,
151
+ user,
152
+ };
153
+ }
154
+
155
+ /**
156
+ * Return a fresh access token, refreshing in-place if the current one is
157
+ * within the leeway window of expiry. Mutates auth.json on disk on success.
158
+ * Returns null if the stored session is gone or the refresh failed (caller
159
+ * should treat that as "logged out").
160
+ */
161
+ const REFRESH_LEEWAY_SECS = 60;
162
+
163
+ /**
164
+ * In-flight refresh dedup. Without this, two concurrent callers (e.g.
165
+ * the dashboard's `/api/auth/status` poll and a `/api/auth/reminder`
166
+ * POST in flight) both observe the same expired access token, both call
167
+ * `refreshAccessToken(auth.refresh_token)` with the same refresh token,
168
+ * and the api-server treats the second call as token-replay and revokes
169
+ * every session for that user — a silent logout. Keying on the refresh
170
+ * token avoids accidentally sharing a refresh across logins/logouts in
171
+ * the same process.
172
+ */
173
+ const inFlightRefreshes = new Map<string, Promise<StoredAuth>>();
174
+
175
+ async function dedupedRefresh(auth: StoredAuth): Promise<StoredAuth> {
176
+ const existing = inFlightRefreshes.get(auth.refresh_token);
177
+ if (existing) return existing;
178
+ const p = (async () => {
179
+ const refreshed = await refreshAccessToken(auth.refresh_token);
180
+ const next = authFromTokenResponse(refreshed, auth.user);
181
+ writeAuth(next);
182
+ return next;
183
+ })();
184
+ inFlightRefreshes.set(auth.refresh_token, p);
185
+ try {
186
+ return await p;
187
+ } finally {
188
+ inFlightRefreshes.delete(auth.refresh_token);
189
+ }
190
+ }
191
+
192
+ export async function getValidAccessToken(): Promise<StoredAuth | null> {
193
+ const auth = readAuth();
194
+ if (!auth) return null;
195
+ const now = Math.floor(Date.now() / 1000);
196
+ if (auth.access_expires_at - now > REFRESH_LEEWAY_SECS) return auth;
197
+ // Either expired or close to expiring — try to refresh.
198
+ try {
199
+ return await dedupedRefresh(auth);
200
+ } catch (err) {
201
+ if (err instanceof AuthApiError && err.status === 401) {
202
+ // Session unrecoverable — wipe.
203
+ deleteAuth();
204
+ return null;
205
+ }
206
+ // Network errors etc — surface to caller as null so the UI can recover.
207
+ return null;
208
+ }
209
+ }
210
+
211
+ /**
212
+ * Verify with the server that the stored access token is still valid.
213
+ * Refreshes once on 401. Returns the live /me response and the (possibly
214
+ * refreshed) stored auth, or null if the session can't be recovered.
215
+ */
216
+ export async function whoAmI(): Promise<{ me: MeResponse; auth: StoredAuth } | null> {
217
+ const fresh = await getValidAccessToken();
218
+ if (!fresh) return null;
219
+ try {
220
+ const me = await fetchMe(fresh.access_token);
221
+ return { me, auth: fresh };
222
+ } catch (err) {
223
+ if (err instanceof AuthApiError && err.status === 401) {
224
+ // Maybe the leeway wasn't enough — try one more refresh and retry.
225
+ const reread = readAuth();
226
+ if (!reread) return null;
227
+ try {
228
+ const next = await dedupedRefresh(reread);
229
+ const me = await fetchMe(next.access_token);
230
+ return { me, auth: next };
231
+ } catch (retryErr) {
232
+ // Symmetry with `getValidAccessToken`: wipe the session only on an
233
+ // unambiguous 401. A transient timeout/5xx during the retry-fetchMe
234
+ // must NOT throw away the freshly-written valid tokens, otherwise a
235
+ // brief api-server hiccup silently logs the user out.
236
+ if (retryErr instanceof AuthApiError && retryErr.status === 401) {
237
+ deleteAuth();
238
+ }
239
+ return null;
240
+ }
241
+ }
242
+ return null;
243
+ }
244
+ }
245
+
246
+ /** Reads the JWT exp claim for diagnostics. */
247
+ export function readAccessExpiry(auth: StoredAuth): number | null {
248
+ const claims = decodeJwt(auth.access_token);
249
+ return claims?.exp ?? null;
250
+ }
@@ -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,59 @@
1
+ /**
2
+ * Shared fetch wrapper with per-request timeout and external-signal
3
+ * composition.
4
+ *
5
+ * Replaces three byte-equivalent implementations that had drifted on the
6
+ * default timeout (15s in two client components, 10s in the server-side
7
+ * api-server-client). Co-locates the `isAbortError` predicate so callers
8
+ * can classify timeout vs network failures consistently.
9
+ *
10
+ * Built on the platform primitives `AbortSignal.timeout()` — which
11
+ * aborts with a typed `DOMException(..., "TimeoutError")` rather than
12
+ * the default bare abort that surfaces as Next.js 16's dev-overlay
13
+ * "signal is aborted without reason" warning — and `AbortSignal.any()`,
14
+ * which composes the timeout signal with any caller-supplied
15
+ * `init.signal` so a component-unmount or parent-controller abort
16
+ * actually stops the in-flight fetch. The prior `AbortController` +
17
+ * `setTimeout` implementation called `controller.abort()` with no
18
+ * reason AND silently dropped `init.signal` by spreading then
19
+ * overwriting it with the controller's own signal.
20
+ *
21
+ * Both APIs are available in every runtime Next.js 16 supports:
22
+ * `AbortSignal.timeout` since Node 17.3 / 16.14, `AbortSignal.any`
23
+ * since Node 20.3 (also backported to 18.17). Next.js 16's minimum
24
+ * runtime (Node >= 20.9, per its engines field) covers both. Browser
25
+ * support: Chrome 116+, Firefox 124+, Safari 17.4+.
26
+ */
27
+
28
+ /** Hard cap on every fetch using this helper unless overridden. Picked to
29
+ * exceed the server-side `REQUEST_TIMEOUT_MS` (10s) in `api-server-client.ts`
30
+ * so a slow but successful upstream response still lands. */
31
+ export const DEFAULT_FETCH_TIMEOUT_MS = 15_000;
32
+
33
+ export function fetchWithTimeout(
34
+ input: RequestInfo | URL,
35
+ init: RequestInit = {},
36
+ timeoutMs: number = DEFAULT_FETCH_TIMEOUT_MS,
37
+ ): Promise<Response> {
38
+ const timeoutSignal = AbortSignal.timeout(timeoutMs);
39
+ const signal = init.signal
40
+ ? AbortSignal.any([init.signal, timeoutSignal])
41
+ : timeoutSignal;
42
+ return fetch(input, { ...init, signal });
43
+ }
44
+
45
+ /** True when an error came from an `AbortController.abort()` OR an
46
+ * `AbortSignal.timeout()` firing. Both surface as objects whose `name`
47
+ * is "AbortError" or "TimeoutError" respectively — depending on the
48
+ * runtime, they may be `Error` subclasses, `DOMException` instances,
49
+ * both, or neither (the jsdom polyfill, for one, breaks the Error
50
+ * prototype chain), so we duck-type on `name` rather than the
51
+ * provenance. Callers always pass values caught from a try/catch, so
52
+ * the universe of inputs is narrow enough that name-matching is
53
+ * unambiguous. Keeping the two names in one predicate prevents the
54
+ * "I forgot TimeoutError" drift class. */
55
+ export function isAbortError(err: unknown): boolean {
56
+ if (err === null || typeof err !== "object") return false;
57
+ const name = (err as { name?: unknown }).name;
58
+ return name === "AbortError" || name === "TimeoutError";
59
+ }
@@ -0,0 +1,144 @@
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
+ * Best-effort "is this a mobile device" check. On mobile, the system share
25
+ * sheet exposes the actual X / LinkedIn apps as targets so `navigator.share`
26
+ * is a one-tap UX win. On desktop (notably Windows Chromium / Edge) the same
27
+ * call opens the OS share dialog — useless for X / LinkedIn — so we
28
+ * deliberately skip it and fall back to clipboard + intent URL.
29
+ *
30
+ * Prefers `userAgentData.mobile` (Chromium UA-Client-Hints, no sniffing),
31
+ * falls back to a tight UA pattern for Safari / Firefox, and treats
32
+ * iPadOS 13+ (UA says Mac but multi-touch is available) as mobile.
33
+ */
34
+ function isLikelyMobile(): boolean {
35
+ if (typeof navigator === "undefined") return false;
36
+ type UADataNav = Navigator & { userAgentData?: { mobile?: boolean } };
37
+ const uaData = (navigator as UADataNav).userAgentData;
38
+ if (uaData && typeof uaData.mobile === "boolean") return uaData.mobile;
39
+ const ua = navigator.userAgent || "";
40
+ if (/Android|iPhone|iPad|iPod|webOS|BlackBerry|IEMobile|Opera Mini/i.test(ua)) return true;
41
+ if (ua.includes("Mac") && typeof navigator.maxTouchPoints === "number" && navigator.maxTouchPoints > 1) return true;
42
+ return false;
43
+ }
44
+
45
+ /**
46
+ * Try the native Web Share API with a file attachment. Returns `true` on
47
+ * success, `false` if the API is unavailable, files-sharing isn't
48
+ * supported, the device is desktop (where the OS share sheet doesn't
49
+ * include X / LinkedIn), or the user dismissed the sheet. Caller should
50
+ * fall back to `copyOrDownloadCard` on `false`.
51
+ */
52
+ export async function shareCardNative(
53
+ blob: Blob,
54
+ filename: string,
55
+ text: string,
56
+ ): Promise<boolean> {
57
+ if (typeof navigator === "undefined" || typeof navigator.share !== "function") {
58
+ return false;
59
+ }
60
+ if (!isLikelyMobile()) return false;
61
+ const file = new File([blob], filename, { type: "image/png" });
62
+ // Some browsers (older Chrome desktop) expose `navigator.share` but reject
63
+ // file payloads. `canShare({ files })` gates that cleanly.
64
+ type CanShareNav = Navigator & { canShare?: (data: ShareData) => boolean };
65
+ const navWithCan = navigator as CanShareNav;
66
+ if (typeof navWithCan.canShare === "function" && !navWithCan.canShare({ files: [file] })) {
67
+ return false;
68
+ }
69
+ try {
70
+ await navigator.share({ files: [file], text });
71
+ return true;
72
+ } catch (err) {
73
+ // AbortError → user dismissed the sheet. Treat as a soft failure so the
74
+ // caller can decide whether to open the intent URL anyway.
75
+ if (err instanceof Error && err.name === "AbortError") return false;
76
+ return false;
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Copy a captured share-card PNG to the system clipboard, or fall back to a
82
+ * download if the browser doesn't support image clipboard writes (or the
83
+ * user denied permission). The caller MUST be inside an active user gesture
84
+ * (click handler) — Chromium gates `navigator.clipboard.write` on user
85
+ * activation.
86
+ */
87
+ export async function copyOrDownloadCard(
88
+ blob: Blob,
89
+ filename: string,
90
+ ): Promise<Exclude<ShareCardMethod, "native">> {
91
+ if (
92
+ typeof ClipboardItem !== "undefined"
93
+ && typeof navigator !== "undefined"
94
+ && navigator.clipboard
95
+ && typeof navigator.clipboard.write === "function"
96
+ ) {
97
+ try {
98
+ await navigator.clipboard.write([
99
+ new ClipboardItem({ "image/png": blob }),
100
+ ]);
101
+ return "clipboard";
102
+ } catch {
103
+ /* permission denied, secure-context issue, browser fence, … */
104
+ }
105
+ }
106
+ return downloadCard(blob, filename) ? "download" : "failed";
107
+ }
108
+
109
+ /**
110
+ * Trigger a local download of the PNG. Returns `true` on success. No
111
+ * clipboard interaction — used by the explicit "save audit-card" CTA so the
112
+ * user reliably gets a file even when clipboard write would succeed.
113
+ */
114
+ export function downloadCard(blob: Blob, filename: string): boolean {
115
+ try {
116
+ if (typeof document === "undefined" || typeof URL === "undefined") return false;
117
+ const url = URL.createObjectURL(blob);
118
+ const a = document.createElement("a");
119
+ a.href = url;
120
+ a.download = filename;
121
+ a.style.display = "none";
122
+ document.body.appendChild(a);
123
+ a.click();
124
+ a.remove();
125
+ queueMicrotask(() => URL.revokeObjectURL(url));
126
+ return true;
127
+ } catch {
128
+ return false;
129
+ }
130
+ }
131
+
132
+ /** Human-readable toast copy keyed by share method. */
133
+ export function shareCardToastMessage(method: ShareCardMethod): string {
134
+ switch (method) {
135
+ case "native":
136
+ return "✅ image attached — pick where to post";
137
+ case "clipboard":
138
+ return "📋 image copied — paste it in the post (⌘/Ctrl+V)";
139
+ case "download":
140
+ return "⬇ image downloaded — attach it to your post";
141
+ case "failed":
142
+ return "couldn't capture image — opening text-only share";
143
+ }
144
+ }
@@ -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