failproofai 0.0.11-beta.2 → 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 (475) 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]__0ts150~._.js → [root-of-the-server]__0ywoypf._.js} +2 -2
  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/{0bke.~atnsbeb.js → 0gdm-xaez4l7t.js} +1 -1
  259. package/.next/standalone/.next/static/chunks/{11w14gnqzprir.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/{0bv1oyxspkpkb.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/{0dvhi-prcsh3~.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 +223 -129
  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/client-telemetry.ts +2 -0
  328. package/.next/standalone/lib/fetch-with-timeout.ts +42 -0
  329. package/.next/standalone/lib/share-card.ts +120 -0
  330. package/.next/standalone/lib/telemetry.ts +12 -7
  331. package/.next/standalone/node_modules/@next/env/package.json +1 -1
  332. package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
  333. package/.next/standalone/node_modules/next/dist/client/dev/debug-channel.js +102 -2
  334. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +11 -11
  335. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +13 -13
  336. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +2 -2
  337. package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
  338. package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
  339. package/.next/standalone/node_modules/next/dist/server/app-render/action-handler.js +18 -8
  340. package/.next/standalone/node_modules/next/dist/server/config-schema.js +1 -0
  341. package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
  342. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
  343. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
  344. package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
  345. package/.next/standalone/node_modules/next/dist/server/lib/encode-cache-tag.js +45 -0
  346. package/.next/standalone/node_modules/next/dist/server/lib/implicit-tags.js +6 -3
  347. package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +5 -1
  348. package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
  349. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/revalidate.js +4 -3
  350. package/.next/standalone/node_modules/next/dist/server/web/spec-extension/unstable-cache.js +6 -2
  351. package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
  352. package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
  353. package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
  354. package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
  355. package/.next/standalone/node_modules/next/package.json +15 -15
  356. package/.next/standalone/node_modules/react/cjs/react.development.js +1 -1
  357. package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
  358. package/.next/standalone/node_modules/react/package.json +1 -1
  359. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
  360. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
  361. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +3 -3
  362. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +3 -3
  363. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +3 -3
  364. package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
  365. package/.next/standalone/node_modules/react-dom/package.json +2 -2
  366. package/.next/standalone/osv-scanner.toml +17 -0
  367. package/.next/standalone/package.json +8 -3
  368. package/.next/standalone/public/audit/fonts/bitcount-prop-single.woff2 +0 -0
  369. package/.next/standalone/public/icon.svg +1 -0
  370. package/.next/standalone/public/logo.svg +1 -0
  371. package/.next/standalone/server.js +1 -1
  372. package/.next/standalone/templates/bitcount-font/README.md +42 -0
  373. package/.next/standalone/templates/bitcount-font/bitcount-prop-single.woff2 +0 -0
  374. package/.next/standalone/templates/bitcount-font/bitcount.css +49 -0
  375. package/.next/standalone/templates/bitcount-font/fonts.ts.example +23 -0
  376. package/README.md +2 -1
  377. package/bin/failproofai.mjs +165 -144
  378. package/dist/cli.mjs +607 -1858
  379. package/lib/atomic-write.ts +67 -0
  380. package/lib/auth/api-server-client.ts +281 -0
  381. package/lib/auth/auth-store.ts +250 -0
  382. package/lib/client-telemetry.ts +2 -0
  383. package/lib/fetch-with-timeout.ts +42 -0
  384. package/lib/share-card.ts +120 -0
  385. package/lib/telemetry.ts +12 -7
  386. package/package.json +8 -3
  387. package/scripts/install-telemetry.mjs +4 -0
  388. package/src/audit/archetypes.ts +924 -0
  389. package/src/audit/cache.ts +21 -2
  390. package/src/audit/dashboard-cache.ts +111 -0
  391. package/src/audit/features.ts +268 -0
  392. package/src/audit/findings.ts +298 -0
  393. package/src/audit/index.ts +39 -21
  394. package/src/audit/replay.ts +29 -3
  395. package/src/audit/scoring.ts +174 -0
  396. package/src/audit/strengths.ts +138 -0
  397. package/src/audit/types.ts +24 -1
  398. package/src/auth/cli.ts +359 -0
  399. package/src/hooks/builtin-policies.ts +2 -1
  400. package/src/hooks/hook-telemetry.ts +2 -2
  401. package/src/hooks/policy-registry.ts +20 -0
  402. package/src/posthog-key.ts +9 -0
  403. package/.next/standalone/.next/server/app/icon.png/route/app-paths-manifest.json +0 -3
  404. package/.next/standalone/.next/server/app/icon.png/route.js +0 -7
  405. package/.next/standalone/.next/server/app/icon.png/route.js.nft.json +0 -1
  406. package/.next/standalone/.next/server/app/icon.png.body +0 -0
  407. package/.next/standalone/.next/server/app/icon.png.meta +0 -1
  408. package/.next/standalone/.next/server/chunks/[externals]_next_dist_0sqmaqd._.js +0 -3
  409. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06.arfm._.js +0 -3
  410. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0__i0h0._.js +0 -3
  411. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fe7_q_._.js +0 -3
  412. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fw.e.h._.js +0 -3
  413. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pxn0e1._.js +0 -3
  414. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xv0jh2._.js +0 -3
  415. package/.next/standalone/.next/server/chunks/_next-internal_server_app_icon_png_route_actions_12.gv.r.js +0 -3
  416. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0bdfoky.js +0 -3
  417. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_05pz9._._.js +0 -3
  418. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01as125._.js +0 -3
  419. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0370~qj._.js +0 -3
  420. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09v.ljl._.js +0 -3
  421. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0agrcb8._.js +0 -4
  422. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0b7hkr~._.js +0 -3
  423. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ehh6vp._.js +0 -4
  424. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g8l0tu._.js +0 -3
  425. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j4l6hl._.js +0 -3
  426. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0k5n2kz._.js +0 -4
  427. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0lp08ll._.js +0 -3
  428. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n0yaqw._.js +0 -4
  429. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0o21f.o._.js +0 -3
  430. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0t8juvy._.js +0 -4
  431. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0uylufv._.js +0 -4
  432. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ymlddl._.js +0 -223
  433. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0~03grs._.js +0 -3
  434. package/.next/standalone/.next/server/chunks/ssr/app_0cdqd9w._.js +0 -3
  435. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +0 -3
  436. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +0 -8
  437. package/.next/standalone/.next/server/chunks/ssr/app_projects_loading_tsx_13veom4._.js +0 -3
  438. package/.next/standalone/.next/server/chunks/ssr/node_modules_0ttbz1~._.js +0 -3
  439. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_06u0kr8._.js +0 -3
  440. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a_7sdg.js +0 -4
  441. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ef3uwk.js +0 -4
  442. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0pbja1x.js +0 -4
  443. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0r6o0i2.js +0 -4
  444. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11y81~_.js +0 -4
  445. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_12or2kf.js +0 -4
  446. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.js +0 -3
  447. package/.next/standalone/.next/static/chunks/07kpqoo7kuckx.js +0 -6
  448. package/.next/standalone/.next/static/chunks/0azb~vy9ds_uy.js +0 -1
  449. package/.next/standalone/.next/static/chunks/0f5p9plm.aqlp.css +0 -2
  450. package/.next/standalone/.next/static/chunks/0ffvlbgzgnlw7.js +0 -2
  451. package/.next/standalone/.next/static/chunks/0spktq7xqab9h.js +0 -1
  452. package/.next/standalone/.next/static/chunks/118q3uljozd5z.js +0 -4
  453. package/.next/standalone/.next/static/chunks/12pt~2f.c1sha.js +0 -1
  454. package/.next/standalone/.next/static/media/4fa387ec64143e14-s.0.qu-9752pffj.woff2 +0 -0
  455. package/.next/standalone/.next/static/media/5ce348bf30bf5439-s.0ee55_hj9qcer.woff2 +0 -0
  456. package/.next/standalone/.next/static/media/6306c77e7c8268e4-s.0mao5jbfbduzp.woff2 +0 -0
  457. package/.next/standalone/.next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2 +0 -0
  458. package/.next/standalone/.next/static/media/7d817b4c03b0c5f1-s.0uzt.a6d44yda.woff2 +0 -0
  459. package/.next/standalone/.next/static/media/bbc41e54d2fcbd21-s.0mvwgmnhv29no.woff2 +0 -0
  460. package/.next/standalone/.next/static/media/icon.0a.gigb3_x5pd.png +0 -0
  461. package/.next/standalone/app/icon.png +0 -0
  462. package/src/audit/telemetry.ts +0 -113
  463. /package/.next/standalone/.next/server/app/{icon.png → api/audit/run}/route/build-manifest.json +0 -0
  464. /package/.next/standalone/.next/server/app/{icon.png → api/audit/run}/route.js.map +0 -0
  465. /package/.next/standalone/.next/static/chunks/{03~yq9q893hmn.js → 0cz1d0mv5g_q7.js} +0 -0
  466. /package/.next/standalone/.next/static/chunks/{0a40sy4tk8ioe.js → 0wwt5o04i4zwh.js} +0 -0
  467. /package/.next/standalone/.next/static/chunks/{0n1n67imq.udf.js → 1__i9af9g78vd.js} +0 -0
  468. /package/.next/standalone/.next/static/chunks/{0w6fzf.07a24u.js → 2so39wg7mjbi7.js} +0 -0
  469. /package/.next/standalone/.next/static/chunks/{0xbo5nl6w4lka.js → 2wbuxnsvux4di.js} +0 -0
  470. /package/.next/standalone/.next/static/chunks/{0_s0luks5tay-.js → 35fgpd_feci6x.js} +0 -0
  471. /package/.next/standalone/.next/static/chunks/{15fklyav5py5m.js → 3xpjn3cdgm-7m.js} +0 -0
  472. /package/.next/standalone/.next/static/chunks/{17.b3suj8zjjj.js → 4448_qq7bd963.js} +0 -0
  473. /package/.next/standalone/.next/static/{tGVQM5SE3NvbVu0gbAJm7 → wU3ot-EKa5ApKoh785wp8}/_buildManifest.js +0 -0
  474. /package/.next/standalone/.next/static/{tGVQM5SE3NvbVu0gbAJm7 → wU3ot-EKa5ApKoh785wp8}/_clientMiddlewareManifest.js +0 -0
  475. /package/.next/standalone/.next/static/{tGVQM5SE3NvbVu0gbAJm7 → wU3ot-EKa5ApKoh785wp8}/_ssgManifest.js +0 -0
@@ -0,0 +1,48 @@
1
+ /**
2
+ * POST /api/auth/logout
3
+ *
4
+ * Reads the locally-stored session, asks the api-server to revoke it, and
5
+ * deletes ~/.failproofai/auth.json regardless of upstream success — local
6
+ * intent to log out takes precedence.
7
+ */
8
+ import { NextResponse } from "next/server";
9
+ import { AuthApiError, logoutSession } from "@/lib/auth/api-server-client";
10
+ import { deleteAuth, readAuth } from "@/lib/auth/auth-store";
11
+ import { initTelemetry, trackEvent } from "@/lib/telemetry";
12
+
13
+ export const dynamic = "force-dynamic";
14
+
15
+ export async function POST(): Promise<NextResponse> {
16
+ await initTelemetry();
17
+ const existing = readAuth();
18
+ if (!existing) {
19
+ trackEvent("audit_user_logged_out", {
20
+ source: "dashboard",
21
+ had_session: false,
22
+ upstream: "noop",
23
+ });
24
+ return NextResponse.json({ authenticated: false }, { status: 200 });
25
+ }
26
+ let upstream: "revoked" | "skipped" | "failed" = "skipped";
27
+ let upstreamError: string | null = null;
28
+ try {
29
+ await logoutSession(existing.access_token, existing.refresh_token);
30
+ upstream = "revoked";
31
+ } catch (err) {
32
+ if (err instanceof AuthApiError && err.status === 401) {
33
+ upstream = "revoked"; // token already invalid server-side
34
+ } else {
35
+ upstream = "failed";
36
+ upstreamError = err instanceof Error ? err.message.slice(0, 200) : String(err).slice(0, 200);
37
+ }
38
+ }
39
+ deleteAuth();
40
+ trackEvent("audit_user_logged_out", {
41
+ source: "dashboard",
42
+ had_session: true,
43
+ upstream,
44
+ upstream_error: upstreamError,
45
+ user_id: existing.user.id,
46
+ });
47
+ return NextResponse.json({ authenticated: false, upstream }, { status: 200 });
48
+ }
@@ -0,0 +1,213 @@
1
+ /**
2
+ * /api/auth/reminder
3
+ *
4
+ * GET — current reminder state (if any, scoped to the signed-in user)
5
+ * POST — set or update the next-audit reminder; requires an active session
6
+ * DELETE — clear the reminder
7
+ *
8
+ * Reminder timestamp lives in ~/.failproofai/next-audit.json. The dashboard
9
+ * AND the CLI can read it later (we just persist intent here; the actual
10
+ * email send is wired separately when the scheduler is built).
11
+ */
12
+ import { NextRequest, NextResponse } from "next/server";
13
+ import {
14
+ deleteReminder,
15
+ readReminder,
16
+ whoAmI,
17
+ writeReminder,
18
+ } from "@/lib/auth/auth-store";
19
+ import {
20
+ AuthApiError,
21
+ cancelReminder,
22
+ scheduleReminder,
23
+ } from "@/lib/auth/api-server-client";
24
+ import { initTelemetry, trackEvent } from "@/lib/telemetry";
25
+
26
+ export const dynamic = "force-dynamic";
27
+
28
+ const DEFAULT_OFFSET_DAYS = 7;
29
+ const MAX_OFFSET_DAYS = 365;
30
+
31
+ export async function GET(): Promise<NextResponse> {
32
+ const who = await whoAmI();
33
+ const reminder = readReminder();
34
+ if (!reminder) {
35
+ return NextResponse.json({ authenticated: !!who, reminder: null });
36
+ }
37
+ // If the reminder belongs to a different user (or no one is signed in),
38
+ // surface it as null so the UI doesn't show "next audit set for alice"
39
+ // when bob is the current session.
40
+ if (!who || who.me.email !== reminder.user_email) {
41
+ return NextResponse.json({ authenticated: !!who, reminder: null });
42
+ }
43
+ return NextResponse.json({
44
+ authenticated: true,
45
+ reminder: {
46
+ next_audit_at: reminder.next_audit_at,
47
+ user_email: reminder.user_email,
48
+ set_at: reminder.set_at,
49
+ },
50
+ });
51
+ }
52
+
53
+ interface SetBody {
54
+ /** Days from now until the reminder fires. Default: 7. */
55
+ in_days?: unknown;
56
+ /** Absolute unix-seconds timestamp. Wins over in_days when both are sent. */
57
+ at?: unknown;
58
+ }
59
+
60
+ export async function POST(req: NextRequest): Promise<NextResponse> {
61
+ await initTelemetry();
62
+ const who = await whoAmI();
63
+ if (!who) {
64
+ trackEvent("audit_reminder_set", { status: "unauthorized", source: "dashboard" });
65
+ return NextResponse.json(
66
+ { code: "unauthorized", message: "Sign in before setting a reminder." },
67
+ { status: 401 },
68
+ );
69
+ }
70
+ let body: SetBody = {};
71
+ // Distinguish three cases:
72
+ // 1. empty body → defaults (7d from now)
73
+ // 2. malformed JSON → 400 Bad Request (don't silently swap to {})
74
+ // 3. valid JSON, not obj → 400 Bad Request (arrays/primitives are not SetBody)
75
+ const raw = await req.text();
76
+ if (raw.trim().length > 0) {
77
+ let parsed: unknown;
78
+ try {
79
+ parsed = JSON.parse(raw);
80
+ } catch {
81
+ trackEvent("audit_reminder_set", {
82
+ status: "validation_error",
83
+ source: "dashboard",
84
+ reason: "malformed_json",
85
+ user_id: who.me.id,
86
+ });
87
+ return NextResponse.json(
88
+ { code: "validation_error", message: "Request body is not valid JSON." },
89
+ { status: 400 },
90
+ );
91
+ }
92
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
93
+ trackEvent("audit_reminder_set", {
94
+ status: "validation_error",
95
+ source: "dashboard",
96
+ reason: "not_an_object",
97
+ user_id: who.me.id,
98
+ });
99
+ return NextResponse.json(
100
+ { code: "validation_error", message: "Request body must be a JSON object." },
101
+ { status: 400 },
102
+ );
103
+ }
104
+ body = parsed as SetBody;
105
+ }
106
+ const nowSecs = Math.floor(Date.now() / 1000);
107
+ const maxAt = nowSecs + MAX_OFFSET_DAYS * 86400;
108
+ let nextAuditAt: number;
109
+ if (typeof body.at === "number" && Number.isFinite(body.at)) {
110
+ nextAuditAt = Math.floor(body.at);
111
+ } else {
112
+ const offsetDays =
113
+ typeof body.in_days === "number" && Number.isFinite(body.in_days)
114
+ ? Math.max(1, Math.min(MAX_OFFSET_DAYS, Math.floor(body.in_days)))
115
+ : DEFAULT_OFFSET_DAYS;
116
+ nextAuditAt = nowSecs + offsetDays * 86400;
117
+ }
118
+ if (nextAuditAt <= nowSecs) {
119
+ trackEvent("audit_reminder_set", {
120
+ status: "validation_error",
121
+ source: "dashboard",
122
+ reason: "in_the_past",
123
+ user_id: who.me.id,
124
+ });
125
+ return NextResponse.json(
126
+ { code: "validation_error", message: "Reminder must be in the future." },
127
+ { status: 400 },
128
+ );
129
+ }
130
+ // Upper-bound guard: catches the common foot-gun where a caller passes
131
+ // `Date.now()` (ms) instead of unix-seconds — would otherwise persist a
132
+ // year-55000 reminder, render "in 19000000 days", and send nonsense
133
+ // fire_at to the upstream scheduler.
134
+ if (nextAuditAt > maxAt) {
135
+ trackEvent("audit_reminder_set", {
136
+ status: "validation_error",
137
+ source: "dashboard",
138
+ reason: "too_far_in_future",
139
+ user_id: who.me.id,
140
+ });
141
+ return NextResponse.json(
142
+ {
143
+ code: "validation_error",
144
+ message: `Reminder must be within ${MAX_OFFSET_DAYS} days. Did you pass milliseconds instead of seconds?`,
145
+ },
146
+ { status: 400 },
147
+ );
148
+ }
149
+ const reminder = {
150
+ next_audit_at: nextAuditAt,
151
+ user_email: who.me.email,
152
+ set_at: nowSecs,
153
+ };
154
+ writeReminder(reminder);
155
+ // Forward to the api-server scheduler so it can deliver via SES. The local
156
+ // file is the dashboard/CLI source-of-truth; the api-server holds the
157
+ // delivery slot. We tolerate upstream failure — the local write already
158
+ // succeeded and the user gets a usable response.
159
+ let upstream: "scheduled" | "failed" | "skipped" = "skipped";
160
+ let upstreamError: string | null = null;
161
+ try {
162
+ await scheduleReminder(who.auth.access_token, { at: nextAuditAt });
163
+ upstream = "scheduled";
164
+ } catch (err) {
165
+ upstream = "failed";
166
+ upstreamError =
167
+ err instanceof AuthApiError
168
+ ? `${err.code}: ${err.message}`.slice(0, 200)
169
+ : err instanceof Error
170
+ ? err.message.slice(0, 200)
171
+ : String(err).slice(0, 200);
172
+ }
173
+ trackEvent("audit_reminder_set", {
174
+ status: "success",
175
+ source: "dashboard",
176
+ user_id: who.me.id,
177
+ offset_days: Math.round((nextAuditAt - nowSecs) / 86400),
178
+ upstream,
179
+ upstream_error: upstreamError,
180
+ });
181
+ return NextResponse.json({ authenticated: true, reminder });
182
+ }
183
+
184
+ export async function DELETE(): Promise<NextResponse> {
185
+ await initTelemetry();
186
+ const who = await whoAmI();
187
+ const existing = readReminder();
188
+ deleteReminder();
189
+ let upstream: "cancelled" | "failed" | "skipped" = "skipped";
190
+ let upstreamError: string | null = null;
191
+ if (who) {
192
+ try {
193
+ await cancelReminder(who.auth.access_token);
194
+ upstream = "cancelled";
195
+ } catch (err) {
196
+ upstream = "failed";
197
+ upstreamError =
198
+ err instanceof AuthApiError
199
+ ? `${err.code}: ${err.message}`.slice(0, 200)
200
+ : err instanceof Error
201
+ ? err.message.slice(0, 200)
202
+ : String(err).slice(0, 200);
203
+ }
204
+ }
205
+ trackEvent("audit_reminder_cleared", {
206
+ source: "dashboard",
207
+ had_local_reminder: existing !== null,
208
+ user_id: who?.me.id ?? null,
209
+ upstream,
210
+ upstream_error: upstreamError,
211
+ });
212
+ return NextResponse.json({ ok: true });
213
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * GET /api/auth/status
3
+ *
4
+ * Returns the currently signed-in identity by reading the local
5
+ * `~/.failproofai/auth.json` cache. No round-trip to the api-server — the
6
+ * file is the source of truth, same as the CLI's `failproofai auth whoami`.
7
+ * This keeps the dashboard UI and the CLI consistent regardless of whether
8
+ * the api-server is reachable.
9
+ *
10
+ * Also returns the user's persisted re-audit reminder (if any). The reminder
11
+ * lives in ~/.failproofai/next-audit.json and is only surfaced when its
12
+ * `user_email` matches the active session — so swapping accounts via CLI
13
+ * does not leak a previous user's reminder into the dashboard.
14
+ */
15
+ import { NextResponse } from "next/server";
16
+ import { readAuth, readReminder } from "@/lib/auth/auth-store";
17
+
18
+ export const dynamic = "force-dynamic";
19
+
20
+ export async function GET(): Promise<NextResponse> {
21
+ const auth = readAuth();
22
+ if (!auth) {
23
+ return NextResponse.json({ authenticated: false, reminder: null }, { status: 200 });
24
+ }
25
+ const reminderRaw = readReminder();
26
+ const reminder =
27
+ reminderRaw && reminderRaw.user_email === auth.user.email
28
+ ? {
29
+ next_audit_at: reminderRaw.next_audit_at,
30
+ user_email: reminderRaw.user_email,
31
+ set_at: reminderRaw.set_at,
32
+ }
33
+ : null;
34
+ return NextResponse.json(
35
+ {
36
+ authenticated: true,
37
+ user: { id: auth.user.id, email: auth.user.email },
38
+ reminder,
39
+ },
40
+ { status: 200 },
41
+ );
42
+ }
@@ -0,0 +1,364 @@
1
+ "use client";
2
+
3
+ /**
4
+ * Top-level client wrapper for /audit.
5
+ *
6
+ * Composes the personality report: classify the agent into one of 8
7
+ * archetypes, derive a score + tier, render the IdentitySection +
8
+ * ShowOff + Strengths + Score (with leaderboard) + Findings + Policies
9
+ * + Return-loop CTA.
10
+ *
11
+ * Empty / running states fall back to the existing EmptyState and
12
+ * RunProgress components.
13
+ */
14
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
15
+ import { getAuditResultAction } from "@/app/actions/get-audit-result";
16
+ import type { AuditResult, RunAuditOptions } from "@/src/audit/types";
17
+ import { classifyAgent } from "@/src/audit/archetypes";
18
+ import { COHORT_SIZE, deriveScore, gradeFor, projectedScore, type Grade } from "@/src/audit/scoring";
19
+ import { deriveStrengths } from "@/src/audit/strengths";
20
+ import { deriveFindings } from "@/src/audit/findings";
21
+ import { usePostHog } from "@/contexts/PostHogContext";
22
+
23
+ import { IdentitySection } from "./identity-section";
24
+ import { ShareDock } from "./share-dock";
25
+ import { StrengthsSection } from "./strengths-section";
26
+ import { ScoreSection } from "./score-section";
27
+ import { FindingsSection } from "./findings-section";
28
+ import { PoliciesSection } from "./policies-section";
29
+ import { ReturnSection } from "./return-section";
30
+ import { ReportFooter } from "./report-footer";
31
+ import { EmptyState } from "./empty-state";
32
+ import { RunProgress } from "./run-progress";
33
+
34
+ // IMPORTANT: do NOT import BUILTIN_POLICIES or AUDIT_DETECTORS here.
35
+ // Both pull in node:fs and execSync (workflow policies), which Next.js
36
+ // refuses to bundle for the client. The total catalog size is computed
37
+ // server-side in page.tsx and passed in as a plain number prop.
38
+
39
+ type Initial =
40
+ | { status: "cached"; cachedAt: string; params: RunAuditOptions; result: AuditResult }
41
+ | { status: "empty" };
42
+
43
+ interface Props {
44
+ initial: Initial;
45
+ /** ?p=... URL param override for the project name in the leaderboard
46
+ * row. Defaults to whichever cwd has the most hits, falling back to
47
+ * "your agent". */
48
+ projectFromUrl?: string;
49
+ /** Total number of detectors + builtin policies. Computed server-side
50
+ * in page.tsx — the modules can't ship to the client. */
51
+ totalCatalogSize: number;
52
+ }
53
+
54
+ function inferWindow(params: RunAuditOptions | undefined): string {
55
+ if (!params?.since) return "all time";
56
+ return params.since;
57
+ }
58
+
59
+ function inferProjectName(result: AuditResult, override?: string): string {
60
+ if (override && override.trim()) return override;
61
+ // Pick the cwd that appears in the most examples — proxy for "your
62
+ // most-active project". Falls back to "your agent".
63
+ const counts = new Map<string, number>();
64
+ for (const row of result.results) {
65
+ for (const ex of row.examples) {
66
+ if (!ex.cwd) continue;
67
+ counts.set(ex.cwd, (counts.get(ex.cwd) ?? 0) + 1);
68
+ }
69
+ }
70
+ let bestCwd = "";
71
+ let bestCount = 0;
72
+ for (const [cwd, n] of counts) {
73
+ if (n > bestCount) { bestCwd = cwd; bestCount = n; }
74
+ }
75
+ if (!bestCwd) return "your agent";
76
+ const segs = bestCwd.replace(/\/+$/, "").split(/[\\/]/);
77
+ // Use last two path segments — like "blrnow / api-coder".
78
+ if (segs.length >= 2) return `${segs[segs.length - 2]} / ${segs[segs.length - 1]}`;
79
+ return segs[segs.length - 1] ?? "your agent";
80
+ }
81
+
82
+ export function AuditDashboard({ initial, projectFromUrl, totalCatalogSize }: Props) {
83
+ const [cache, setCache] = useState<Initial>(initial);
84
+ const [running, setRunning] = useState(false);
85
+ const { capture } = usePostHog();
86
+ const pageViewStateRef = useRef<string | null>(null);
87
+ const scrollTrackedRef = useRef(false);
88
+ const transcriptsScanned = cache.status === "cached" ? cache.result.transcripts.scanned : 0;
89
+ const resultsCount = cache.status === "cached" ? cache.result.results.length : 0;
90
+
91
+ const refreshFromCache = useCallback(async () => {
92
+ const payload = await getAuditResultAction();
93
+ if (payload.status === "cached") setCache(payload);
94
+ }, []);
95
+
96
+ // Body class for audit-only background + grain texture. Applied once on
97
+ // mount so the body bg switches from the global #0a0a0a to the audit
98
+ // #131316 only on this route.
99
+ useEffect(() => {
100
+ document.body.classList.add("audit-body");
101
+ return () => document.body.classList.remove("audit-body");
102
+ }, []);
103
+
104
+ useEffect(() => {
105
+ const viewState =
106
+ running
107
+ ? "running"
108
+ : cache.status === "empty"
109
+ ? "empty"
110
+ : transcriptsScanned === 0
111
+ ? "zero_sessions"
112
+ : "report";
113
+ if (pageViewStateRef.current === viewState) return;
114
+ pageViewStateRef.current = viewState;
115
+ capture("audit_page_viewed", {
116
+ state: viewState,
117
+ has_cache: cache.status === "cached",
118
+ });
119
+ }, [cache.status, capture, running, transcriptsScanned]);
120
+
121
+ useEffect(() => {
122
+ scrollTrackedRef.current = false;
123
+ }, [cache.status, running, transcriptsScanned]);
124
+
125
+ useEffect(() => {
126
+ if (running || cache.status !== "cached" || transcriptsScanned === 0) return;
127
+ let raf = 0;
128
+ const measure = () => {
129
+ raf = 0;
130
+ if (scrollTrackedRef.current) return;
131
+ const maxScroll = document.documentElement.scrollHeight - window.innerHeight;
132
+ if (maxScroll <= 0) return;
133
+ const reachedBottom = window.scrollY >= maxScroll - 24;
134
+ if (!reachedBottom) return;
135
+ scrollTrackedRef.current = true;
136
+ capture("audit_page_scrolled_to_end", {
137
+ results_count: resultsCount,
138
+ transcripts_scanned: transcriptsScanned,
139
+ });
140
+ };
141
+ // Coalesce scroll events to one rAF — reading scrollHeight forces a
142
+ // layout reflow, which we don't want firing 60+ times per second.
143
+ const onScroll = () => {
144
+ if (raf !== 0) return;
145
+ raf = requestAnimationFrame(measure);
146
+ };
147
+ measure();
148
+ window.addEventListener("scroll", onScroll, { passive: true });
149
+ return () => {
150
+ window.removeEventListener("scroll", onScroll);
151
+ if (raf !== 0) cancelAnimationFrame(raf);
152
+ };
153
+ }, [cache.status, capture, resultsCount, running, transcriptsScanned]);
154
+
155
+ /* ---- empty / first-run ----------------------------------------- */
156
+ if (cache.status === "empty" && !running) {
157
+ return (
158
+ <ShellEmpty
159
+ running={false}
160
+ onStarted={() => setRunning(true)}
161
+ onCompleted={async () => { setRunning(false); await refreshFromCache(); }}
162
+ />
163
+ );
164
+ }
165
+ if (cache.status === "empty" && running) {
166
+ return (
167
+ <ShellEmpty
168
+ running
169
+ onStarted={() => {}}
170
+ onCompleted={async () => { setRunning(false); await refreshFromCache(); }}
171
+ />
172
+ );
173
+ }
174
+
175
+ // cache.status === "cached"
176
+ const result = cache.status === "cached" ? cache.result : null;
177
+ if (!result) return null;
178
+ const cachedAt = cache.status === "cached" ? cache.cachedAt : null;
179
+ const params = cache.status === "cached" ? cache.params : undefined;
180
+
181
+ /* ---- scanned but zero sessions --------------------------------- */
182
+ if (result.transcripts.scanned === 0) {
183
+ return (
184
+ <ShellEmpty
185
+ running={running}
186
+ mode="zero-sessions"
187
+ onStarted={() => setRunning(true)}
188
+ onCompleted={async () => { setRunning(false); await refreshFromCache(); }}
189
+ />
190
+ );
191
+ }
192
+
193
+ /* ---- in-flight re-run ------------------------------------------ */
194
+ if (running) {
195
+ return (
196
+ <div className="app">
197
+ <div className="scanline-overlay" />
198
+ <div className="app-shell">
199
+ <div className="report">
200
+ <RunProgress />
201
+ </div>
202
+ <ReportFooter cachedAt={cachedAt} />
203
+ </div>
204
+ </div>
205
+ );
206
+ }
207
+
208
+ /* ---- main report ----------------------------------------------- */
209
+ return (
210
+ <MainReport
211
+ result={result}
212
+ cachedAt={cachedAt}
213
+ params={params}
214
+ projectFromUrl={projectFromUrl}
215
+ totalCatalogSize={totalCatalogSize}
216
+ />
217
+ );
218
+ }
219
+
220
+ interface MainReportProps {
221
+ result: AuditResult;
222
+ cachedAt: string | null;
223
+ params: RunAuditOptions | undefined;
224
+ projectFromUrl?: string;
225
+ totalCatalogSize: number;
226
+ }
227
+
228
+ function MainReport({ result, cachedAt, params, projectFromUrl, totalCatalogSize }: MainReportProps) {
229
+ const { capture } = usePostHog();
230
+ const project = useMemo(() => inferProjectName(result, projectFromUrl), [result, projectFromUrl]);
231
+ // Seed classification with the project name so the behaviour fingerprint
232
+ // (used for tie-breaks + copy variants) is stable per project.
233
+ const classification = useMemo(() => classifyAgent(result, project), [result, project]);
234
+ const score = useMemo(() => deriveScore(result), [result]);
235
+ const projected = useMemo(() => projectedScore(result, score), [result, score]);
236
+ const grade = gradeFor(score);
237
+ const projectedGrade = gradeFor(projected);
238
+ const strengths = useMemo(() => deriveStrengths(result), [result]);
239
+ const findings = useMemo(() => deriveFindings(result), [result]);
240
+ // Renamed from `window` to avoid shadowing the browser global — any
241
+ // future `window.*` reference added inside MainReport would silently
242
+ // bind to a string and crash at runtime.
243
+ const scopeWindow = inferWindow(params);
244
+
245
+ // One pass over result.results derives both counts; score-section and
246
+ // return-section also need `missing` but they take it from us via props
247
+ // / `result` shape, so deduplicate the scan here.
248
+ const { detectorsTriggered, missing } = useMemo(() => {
249
+ let detectorsTriggered = 0;
250
+ let missing = 0;
251
+ for (const r of result.results) {
252
+ if (r.hits > 0) detectorsTriggered++;
253
+ if (r.source === "builtin" && !r.enabledInConfig && r.hits > 0) missing++;
254
+ }
255
+ return { detectorsTriggered, missing };
256
+ }, [result]);
257
+
258
+ // Fire-once dashboard-rendered event so we can compute click-through
259
+ // rates against the share/download/rerun click events we already track.
260
+ const dashboardViewedRef = useRef(false);
261
+ useEffect(() => {
262
+ if (dashboardViewedRef.current) return;
263
+ dashboardViewedRef.current = true;
264
+ capture("audit_dashboard_viewed", {
265
+ score,
266
+ grade,
267
+ archetype: classification.archetype,
268
+ secondary: classification.secondary ?? null,
269
+ missing,
270
+ transcripts_scanned: result.transcripts.scanned,
271
+ results_count: result.results.length,
272
+ detectors_triggered: detectorsTriggered,
273
+ });
274
+ }, [
275
+ capture,
276
+ score,
277
+ grade,
278
+ classification.archetype,
279
+ classification.secondary,
280
+ missing,
281
+ result.transcripts.scanned,
282
+ result.results.length,
283
+ detectorsTriggered,
284
+ ]);
285
+
286
+ /** Identity hero ref — captured to PNG by the share buttons. */
287
+ const identityFrameRef = useRef<HTMLDivElement>(null);
288
+
289
+ return (
290
+ <div className="app">
291
+ <div className="scanline-overlay" />
292
+ <div className="app-shell">
293
+ <div className="report">
294
+ <IdentitySection
295
+ ref={identityFrameRef}
296
+ archetypeKey={classification.archetype}
297
+ secondaryKey={classification.secondary}
298
+ toolCalls={result.eventsScanned ?? 0}
299
+ sessions={result.transcripts.scanned}
300
+ window={scopeWindow}
301
+ seed={classification.variantSeed}
302
+ />
303
+ <StrengthsSection
304
+ strengths={strengths}
305
+ totalDetectorsTriggered={detectorsTriggered}
306
+ totalDetectorsAvailable={totalCatalogSize}
307
+ />
308
+ <ScoreSection
309
+ result={result}
310
+ score={score}
311
+ grade={grade}
312
+ archetypeKey={classification.archetype}
313
+ project={project}
314
+ />
315
+ <ReturnSection result={result} />
316
+ <FindingsSection findings={findings} />
317
+ <PoliciesSection result={result} projected={projected} projectedGrade={projectedGrade} />
318
+ </div>
319
+ <ReportFooter cachedAt={cachedAt} />
320
+ </div>
321
+ <ShareDock
322
+ frameRef={identityFrameRef}
323
+ archetypeKey={classification.archetype}
324
+ seed={classification.variantSeed}
325
+ score={score}
326
+ grade={grade}
327
+ missing={missing}
328
+ />
329
+ </div>
330
+ );
331
+ }
332
+
333
+ interface ShellEmptyProps {
334
+ running: boolean;
335
+ mode?: "no-cache" | "zero-sessions";
336
+ onStarted: () => void;
337
+ onCompleted: () => Promise<void> | void;
338
+ }
339
+
340
+ function ShellEmpty({ running, mode = "no-cache", onStarted, onCompleted }: ShellEmptyProps) {
341
+ // Use the archetype "optimist" sigil for the empty-state visual so the
342
+ // page doesn't render with a dead box. EmptyState itself is unchanged
343
+ // from the previous build.
344
+ return (
345
+ <div className="app">
346
+ <div className="scanline-overlay" />
347
+ <div className="app-shell">
348
+ <div className="report">
349
+ {running ? (
350
+ <RunProgress />
351
+ ) : (
352
+ <EmptyState
353
+ mode={mode}
354
+ running={running}
355
+ onStarted={onStarted}
356
+ onCompleted={onCompleted}
357
+ />
358
+ )}
359
+ </div>
360
+ <ReportFooter cachedAt={null} fixed />
361
+ </div>
362
+ </div>
363
+ );
364
+ }