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
@@ -4,7 +4,6 @@ import React, { useState, useEffect, useCallback, useMemo, useRef, useTransition
4
4
  import { createPortal } from "react-dom";
5
5
  import Link from "next/link";
6
6
  import {
7
- ArrowLeft,
8
7
  ShieldCheck,
9
8
  ShieldX,
10
9
  ShieldAlert,
@@ -26,6 +25,7 @@ import { togglePolicyAction } from "@/app/actions/update-hooks-config";
26
25
  import { installHooksWebAction, removeHooksWebAction } from "@/app/actions/install-hooks-web";
27
26
  import { updatePolicyParamsAction } from "@/app/actions/update-policy-params";
28
27
  import { useAutoRefresh } from "@/contexts/AutoRefreshContext";
28
+ import { usePostHog } from "@/contexts/PostHogContext";
29
29
  import { useUrlParams } from "@/lib/use-url-params";
30
30
  import { pageToParam, paramToPage } from "@/lib/url-filter-serializers";
31
31
  import { getCliLabel, getCliBadgeClasses, KNOWN_CLI_IDS, isKnownCli, type CliId } from "@/lib/cli-registry";
@@ -208,10 +208,12 @@ function DurationDisplay({ ms }: { ms: number }) {
208
208
 
209
209
  // -- Copy Button --
210
210
 
211
- function CopyButton({ text }: { text: string }) {
211
+ function CopyButton({ text, field }: { text: string; field?: string }) {
212
212
  const [copied, setCopied] = useState(false);
213
+ const { capture } = usePostHog();
213
214
  const handleCopy = async (e: React.MouseEvent) => {
214
215
  e.stopPropagation();
216
+ capture("activity_copy_clicked", { field: field ?? "unknown" });
215
217
  try {
216
218
  await navigator.clipboard.writeText(text);
217
219
  setCopied(true);
@@ -283,22 +285,41 @@ function DecisionPills({
283
285
  // -- Stats Bar --
284
286
 
285
287
  function StatsBar({ stats }: { stats: HookActivityPayload["stats"] }) {
286
- const denyRate = stats.totalEvents > 0 ? ((stats.denyCount / stats.totalEvents) * 100).toFixed(0) : "0";
288
+ const denyRatePct = stats.totalEvents > 0 ? (stats.denyCount / stats.totalEvents) * 100 : 0;
289
+ const denyRateLabel = denyRatePct.toFixed(denyRatePct >= 10 ? 0 : 1);
290
+ // amber once >2%, pink once >5% \u2014 keeps the bar honest at a glance
291
+ const denyTone =
292
+ stats.denyCount === 0 ? "" : denyRatePct >= 5 ? " is-deny" : denyRatePct >= 2 ? " is-warn" : "";
287
293
 
288
294
  return (
289
- <div className="flex items-center gap-6 text-[0.7rem] text-muted-foreground">
290
- <div>
291
- <span className="text-foreground font-mono font-semibold">{stats.totalEvents}</span> total events
295
+ <div className="stat-bar" role="group" aria-label="Activity stats">
296
+ <div className="stat-cell">
297
+ <span className="eyebrow">total events</span>
298
+ <span className="value">{stats.totalEvents.toLocaleString()}</span>
299
+ <span className="meta">across all installed agents</span>
292
300
  </div>
293
- <div>
294
- <span className={`font-mono font-semibold ${stats.denyCount > 0 ? "text-red-400" : "text-foreground"}`}>
295
- {denyRate}%
296
- </span>{" "}
297
- deny rate
301
+ <div className="stat-cell">
302
+ <span className="eyebrow">deny rate</span>
303
+ <span className={`value${denyTone}`}>{denyRateLabel}%</span>
304
+ <span className="meta">{stats.denyCount.toLocaleString()} of {stats.totalEvents.toLocaleString()} denied</span>
298
305
  </div>
299
- <div className="hidden sm:block">
300
- top policy:{" "}
301
- <span className="font-mono text-foreground">{stats.topPolicy ?? "\u2014"}</span>
306
+ <div className="stat-cell">
307
+ <span className="eyebrow">top policy</span>
308
+ <span
309
+ className="value"
310
+ style={{
311
+ fontSize: 16,
312
+ fontWeight: 500,
313
+ color: stats.topPolicy ? "var(--accent-pink)" : "var(--dim)",
314
+ overflow: "hidden",
315
+ textOverflow: "ellipsis",
316
+ whiteSpace: "nowrap",
317
+ }}
318
+ title={stats.topPolicy ?? undefined}
319
+ >
320
+ {stats.topPolicy ?? "\u2014"}
321
+ </span>
322
+ <span className="meta">most-evaluated policy in scope</span>
302
323
  </div>
303
324
  </div>
304
325
  );
@@ -313,20 +334,24 @@ function DetailPanel({
313
334
  }) {
314
335
  return (
315
336
  <tr>
316
- <td colSpan={10} className="px-0 py-0">
317
- <div className="px-6 py-3 bg-muted/20 border-t border-border/30 space-y-2 text-xs animate-expand">
318
- <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-x-8 gap-y-1.5">
337
+ <td colSpan={11} className="px-0 py-0">
338
+ <div className="activity-detail animate-expand text-xs">
339
+ <span className="activity-detail-eyebrow">
340
+ <span aria-hidden="true">\u25be</span>
341
+ event detail
342
+ </span>
343
+ <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-x-8 gap-y-2">
319
344
  <div>
320
345
  <span className="text-muted-foreground">Session ID: </span>
321
346
  <span className="font-mono text-foreground">
322
347
  {item.sessionId ?? "\u2014"}
323
348
  </span>
324
- {item.sessionId && <CopyButton text={item.sessionId} />}
349
+ {item.sessionId && <CopyButton text={item.sessionId} field="session_id" />}
325
350
  </div>
326
351
  <div>
327
352
  <span className="text-muted-foreground">CWD: </span>
328
353
  <span className="font-mono text-foreground">{item.cwd ?? "\u2014"}</span>
329
- {item.cwd && <CopyButton text={item.cwd} />}
354
+ {item.cwd && <CopyButton text={item.cwd} field="cwd" />}
330
355
  </div>
331
356
  <div>
332
357
  <span className="text-muted-foreground">Transcript: </span>
@@ -339,13 +364,13 @@ function DetailPanel({
339
364
  </div>
340
365
  </div>
341
366
  {item.policyNames && item.policyNames.length > 1 && (
342
- <div>
367
+ <div style={{ marginTop: 8 }}>
343
368
  <span className="text-muted-foreground">Policies: </span>
344
369
  <span className="font-mono text-foreground">{item.policyNames.join(", ")}</span>
345
370
  </div>
346
371
  )}
347
372
  {item.reason && (
348
- <div>
373
+ <div style={{ marginTop: 8 }}>
349
374
  <span className="text-muted-foreground">Full reason: </span>
350
375
  <span className="text-foreground">{item.reason}</span>
351
376
  </div>
@@ -366,6 +391,7 @@ function ActivityTab({
366
391
  onSwitchTab?: (tab: "activity" | "policies") => void;
367
392
  }) {
368
393
  const { intervalSec } = useAutoRefresh();
394
+ const { capture } = usePostHog();
369
395
  const url = useUrlParams();
370
396
  const mountedRef = useRef(false);
371
397
 
@@ -385,6 +411,7 @@ function ActivityTab({
385
411
  return isKnownCli(v) ? v : "";
386
412
  });
387
413
  const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);
414
+ const filterTelemetryFirstRunRef = useRef(true);
388
415
  const filtersRef = useRef({ filterDecision, filterEventType, filterPolicy, filterSessionId, filterCli });
389
416
  filtersRef.current = { filterDecision, filterEventType, filterPolicy, filterSessionId, filterCli };
390
417
 
@@ -444,6 +471,28 @@ function ActivityTab({
444
471
  setPage(1);
445
472
  setExpandedRow(null);
446
473
  fetchData(1);
474
+ // Skip the initial render — filters are initialized from URL params, not
475
+ // from a user action. Only fire on real user-driven changes.
476
+ if (filterTelemetryFirstRunRef.current) {
477
+ filterTelemetryFirstRunRef.current = false;
478
+ return;
479
+ }
480
+ capture("activity_filter_changed", {
481
+ active_filter_count:
482
+ (filterDecision !== "" ? 1 : 0) +
483
+ (filterEventType !== "" ? 1 : 0) +
484
+ (filterPolicy !== "" ? 1 : 0) +
485
+ (filterSessionId !== "" ? 1 : 0) +
486
+ (filterCli !== "" ? 1 : 0),
487
+ has_decision: filterDecision !== "",
488
+ has_event_type: filterEventType !== "",
489
+ has_policy: filterPolicy !== "",
490
+ has_session: filterSessionId !== "",
491
+ has_cli: filterCli !== "",
492
+ decision: filterDecision || null,
493
+ event_type: filterEventType || null,
494
+ cli: filterCli || null,
495
+ });
447
496
  }, 300);
448
497
  return () => {
449
498
  if (debounceRef.current) clearTimeout(debounceRef.current);
@@ -455,67 +504,104 @@ function ActivityTab({
455
504
  const totalPages = data?.totalPages ?? 1;
456
505
 
457
506
  const toggleRow = (idx: number) => {
458
- setExpandedRow((prev) => (prev === idx ? null : idx));
507
+ setExpandedRow((prev) => {
508
+ const next = prev === idx ? null : idx;
509
+ const item = items[idx];
510
+ capture("activity_row_toggled", {
511
+ expanded: next !== null,
512
+ decision: item?.decision ?? null,
513
+ policy_name: item?.policyName ?? null,
514
+ event_type: item?.eventType ?? null,
515
+ });
516
+ return next;
517
+ });
459
518
  };
460
519
 
461
520
  return (
462
521
  <>
463
522
  {data?.stats && data.stats.totalEvents > 0 && (
464
- <div className="mb-4">
523
+ <div style={{ marginBottom: 18 }}>
465
524
  <StatsBar stats={data.stats} />
466
525
  </div>
467
526
  )}
468
- <div className="bg-card border border-border rounded-lg overflow-hidden">
469
- {/* Filter bar */}
470
- <div className="flex flex-wrap items-center gap-3 px-4 py-2.5 border-b border-border bg-muted/20">
471
- <DecisionPills value={filterDecision} onChange={setFilterDecision} />
472
- <select
473
- value={filterEventType}
474
- onChange={(e) => setFilterEventType(e.target.value)}
475
- className="h-7 rounded-md border border-border bg-background px-2 text-xs text-foreground focus:outline-none focus:ring-2 focus:ring-primary/40 focus:border-primary/40 transition-shadow"
476
- >
477
- <option value="">All Events</option>
478
- <option value="PreToolUse">PreToolUse</option>
479
- <option value="PostToolUse">PostToolUse</option>
480
- <option value="SessionStart">SessionStart</option>
481
- <option value="SessionEnd">SessionEnd</option>
482
- <option value="UserPromptSubmit">UserPromptSubmit</option>
483
- <option value="PermissionRequest">PermissionRequest</option>
484
- </select>
485
- <select
486
- value={filterCli}
487
- onChange={(e) => {
488
- const v = e.target.value;
489
- setFilterCli(v === "" || isKnownCli(v) ? v : "");
490
- }}
491
- className="h-7 rounded-md border border-border bg-background px-2 text-xs text-foreground focus:outline-none focus:ring-2 focus:ring-primary/40 focus:border-primary/40 transition-shadow"
492
- aria-label="Filter by CLI"
493
- >
494
- <option value="">All CLIs</option>
495
- {KNOWN_CLI_IDS.map((id) => (
496
- <option key={id} value={id}>
497
- {getCliLabel(id)}
498
- </option>
499
- ))}
500
- </select>
501
- <div className="relative">
527
+ <div>
528
+ {/* Filter console — elastic row that fills the container at every width */}
529
+ <div className="filter-bar">
530
+ <div className="filter-group">
531
+ <span className="filter-label">decision</span>
532
+ <DecisionPills value={filterDecision} onChange={setFilterDecision} />
533
+ </div>
534
+ <div className="filter-group">
535
+ <span className="filter-label">event</span>
536
+ <select
537
+ value={filterEventType}
538
+ onChange={(e) => setFilterEventType(e.target.value)}
539
+ className="filter-input"
540
+ >
541
+ <option value="">all events</option>
542
+ <option value="PreToolUse">PreToolUse</option>
543
+ <option value="PostToolUse">PostToolUse</option>
544
+ <option value="SessionStart">SessionStart</option>
545
+ <option value="SessionEnd">SessionEnd</option>
546
+ <option value="UserPromptSubmit">UserPromptSubmit</option>
547
+ <option value="PermissionRequest">PermissionRequest</option>
548
+ </select>
549
+ </div>
550
+ <div className="filter-group">
551
+ <span className="filter-label">cli</span>
552
+ <select
553
+ value={filterCli}
554
+ onChange={(e) => {
555
+ const v = e.target.value;
556
+ setFilterCli(v === "" || isKnownCli(v) ? v : "");
557
+ }}
558
+ className="filter-input"
559
+ aria-label="Filter by CLI"
560
+ >
561
+ <option value="">all clis</option>
562
+ {KNOWN_CLI_IDS.map((id) => (
563
+ <option key={id} value={id}>
564
+ {getCliLabel(id)}
565
+ </option>
566
+ ))}
567
+ </select>
568
+ </div>
569
+ <div className="filter-group filter-group--grow">
570
+ <span className="filter-label">policy</span>
502
571
  <input
503
572
  type="text"
504
573
  value={filterPolicy}
505
574
  onChange={(e) => setFilterPolicy(e.target.value)}
506
- placeholder="Filter by policy\u2026"
507
- className="h-7 rounded-md border border-border bg-background px-2.5 text-xs text-foreground placeholder:text-muted-foreground w-44 focus:outline-none focus:ring-2 focus:ring-primary/40 focus:border-primary/40 transition-shadow"
575
+ placeholder="filter by policy\u2026"
576
+ className="filter-input"
508
577
  />
509
578
  </div>
510
- <div className="relative">
579
+ <div className="filter-group filter-group--grow">
580
+ <span className="filter-label">session</span>
511
581
  <input
512
582
  type="text"
513
583
  value={filterSessionId}
514
584
  onChange={(e) => setFilterSessionId(e.target.value)}
515
- placeholder="Filter by session…"
516
- className="h-7 rounded-md border border-border bg-background px-2.5 text-xs text-foreground placeholder:text-muted-foreground w-44 focus:outline-none focus:ring-2 focus:ring-primary/40 focus:border-primary/40 transition-shadow"
585
+ placeholder="filter by session…"
586
+ className="filter-input"
517
587
  />
518
588
  </div>
589
+ {hasActiveFilters && (
590
+ <button
591
+ type="button"
592
+ className="filter-clear"
593
+ onClick={() => {
594
+ setFilterDecision("");
595
+ setFilterEventType("");
596
+ setFilterCli("");
597
+ setFilterPolicy("");
598
+ setFilterSessionId("");
599
+ }}
600
+ aria-label="Clear all filters"
601
+ >
602
+ [ clear ]
603
+ </button>
604
+ )}
519
605
  </div>
520
606
 
521
607
  {items.length === 0 ? (
@@ -544,21 +630,34 @@ function ActivityTab({
544
630
  )}
545
631
  </div>
546
632
  ) : (
547
- <div className="overflow-x-auto">
548
- <table className="w-full text-xs">
549
- <thead>
550
- <tr className="text-left text-muted-foreground border-b border-border bg-muted/30">
551
- <th className="px-4 py-2.5 font-medium w-6" />
552
- <th className="px-3 py-2.5 font-medium">Decision</th>
553
- <th className="px-3 py-2.5 font-medium">Event</th>
554
- <th className="px-3 py-2.5 font-medium">CLI</th>
555
- <th className="px-3 py-2.5 font-medium">Tool</th>
556
- <th className="px-3 py-2.5 font-medium">Policy</th>
557
- <th className="px-3 py-2.5 font-medium">Reason</th>
558
- <th className="px-3 py-2.5 font-medium">Duration</th>
559
- <th className="px-3 py-2.5 font-medium">Session</th>
560
- <th className="px-3 py-2.5 font-medium">Mode</th>
561
- <th className="px-3 py-2.5 font-medium text-right">Time</th>
633
+ <div className="overflow-x-auto activity-table-wrap">
634
+ <table className="w-full text-xs activity-table" style={{ tableLayout: "fixed" }}>
635
+ <colgroup>
636
+ <col style={{ width: 32 }} />
637
+ <col style={{ width: "8%" }} />
638
+ <col style={{ width: "8%" }} />
639
+ <col style={{ width: "8%" }} />
640
+ <col style={{ width: "7%" }} />
641
+ <col style={{ width: "18%" }} />
642
+ <col style={{ width: "22%" }} />
643
+ <col style={{ width: "6%" }} />
644
+ <col style={{ width: "8%" }} />
645
+ <col style={{ width: "8%" }} />
646
+ <col style={{ width: "7%" }} />
647
+ </colgroup>
648
+ <thead className="activity-thead">
649
+ <tr>
650
+ <th className="px-4 py-3" />
651
+ <th className="px-3 py-3 activity-th">Decision</th>
652
+ <th className="px-3 py-3 activity-th">Event</th>
653
+ <th className="px-3 py-3 activity-th">CLI</th>
654
+ <th className="px-3 py-3 activity-th">Tool</th>
655
+ <th className="px-3 py-3 activity-th">Policy</th>
656
+ <th className="px-3 py-3 activity-th">Reason</th>
657
+ <th className="px-3 py-3 activity-th">Duration</th>
658
+ <th className="px-3 py-3 activity-th">Session</th>
659
+ <th className="px-3 py-3 activity-th">Mode</th>
660
+ <th className="px-3 py-3 activity-th text-right">Time</th>
562
661
  </tr>
563
662
  </thead>
564
663
  <tbody className="divide-y divide-border/30">
@@ -610,7 +709,7 @@ function ActivityTab({
610
709
  )}
611
710
  </td>
612
711
  <td
613
- className="px-3 py-2 text-muted-foreground truncate max-w-[240px]"
712
+ className="px-3 py-2 text-muted-foreground truncate"
614
713
  title={item.reason ?? ""}
615
714
  >
616
715
  {item.reason ?? "\u2014"}
@@ -652,6 +751,11 @@ function ActivityTab({
652
751
  currentPage={page}
653
752
  totalPages={totalPages}
654
753
  onPageChange={(p) => {
754
+ capture("activity_pagination_changed", {
755
+ from_page: page,
756
+ to_page: p,
757
+ total_pages: totalPages,
758
+ });
655
759
  setPage(p);
656
760
  setExpandedRow(null);
657
761
  }}
@@ -886,6 +990,7 @@ function ErrorToast({
886
990
  onInstall: () => void;
887
991
  isPending: boolean;
888
992
  }) {
993
+ const { capture } = usePostHog();
889
994
  return createPortal(
890
995
  <div
891
996
  className="fixed top-4 right-4 z-[9999] w-full max-w-sm"
@@ -923,7 +1028,11 @@ function ErrorToast({
923
1028
  <div className="mt-3 flex gap-2">
924
1029
  <Button
925
1030
  size="sm"
926
- onClick={() => { onDismiss(); onInstall(); }}
1031
+ onClick={() => {
1032
+ capture("hooks_install_from_error_clicked", { error_message: message.slice(0, 200) });
1033
+ onDismiss();
1034
+ onInstall();
1035
+ }}
927
1036
  disabled={isPending}
928
1037
  className="h-7 flex-1 border-0 bg-red-500 px-3 text-xs font-semibold text-white hover:bg-red-400 disabled:opacity-50"
929
1038
  >
@@ -953,6 +1062,15 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
953
1062
  const [configuringPolicy, setConfiguringPolicy] = useState<PolicyInfo | null>(null);
954
1063
  const [checkedClis, setCheckedClis] = useState<Set<IntegrationType>>(() => new Set());
955
1064
  const cliCheckboxesInitializedRef = useRef(false);
1065
+ const { capture } = usePostHog();
1066
+
1067
+ const fireActionError = useCallback(
1068
+ (errorType: string, message: string) => {
1069
+ capture("action_error_displayed", { error_type: errorType, error_message: message.slice(0, 200) });
1070
+ setActionError(message);
1071
+ },
1072
+ [capture],
1073
+ );
956
1074
 
957
1075
  const reload = useCallback(async () => {
958
1076
  try {
@@ -1002,8 +1120,15 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1002
1120
  const toggleCli = (id: IntegrationType) => {
1003
1121
  setCheckedClis((prev) => {
1004
1122
  const next = new Set(prev);
1005
- if (next.has(id)) next.delete(id);
1006
- else next.add(id);
1123
+ const willCheck = !next.has(id);
1124
+ if (willCheck) next.add(id);
1125
+ else next.delete(id);
1126
+ const cliInfo = config?.clis.find((c) => c.id === id);
1127
+ capture("cli_selection_toggled", {
1128
+ cli_id: id,
1129
+ checked: willCheck,
1130
+ current_state: cliInfo?.installed ? "installed" : cliInfo?.detected ? "detected" : "inactive",
1131
+ });
1007
1132
  return next;
1008
1133
  });
1009
1134
  };
@@ -1033,7 +1158,7 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1033
1158
  try {
1034
1159
  await togglePolicyAction(name, !currentlyEnabled);
1035
1160
  } catch {
1036
- setActionError("Failed to save policy change.");
1161
+ fireActionError("policy_toggle", "Failed to save policy change.");
1037
1162
  reload();
1038
1163
  }
1039
1164
  });
@@ -1042,13 +1167,19 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1042
1167
  const handleApply = () => {
1043
1168
  const { toInstall, toRemove } = pendingChanges;
1044
1169
  if (toInstall.length === 0 && toRemove.length === 0) return;
1170
+ capture("cli_install_remove_submitted", {
1171
+ to_install: toInstall,
1172
+ to_remove: toRemove,
1173
+ count_install: toInstall.length,
1174
+ count_remove: toRemove.length,
1175
+ });
1045
1176
  startTransition(async () => {
1046
1177
  try {
1047
1178
  setActionError(null);
1048
1179
  if (toInstall.length > 0) await installHooksWebAction("user", toInstall);
1049
1180
  if (toRemove.length > 0) await removeHooksWebAction("user", toRemove);
1050
1181
  } catch (e) {
1051
- setActionError(e instanceof Error ? e.message : "Failed to apply changes.");
1182
+ fireActionError("cli_apply", e instanceof Error ? e.message : "Failed to apply changes.");
1052
1183
  } finally {
1053
1184
  // Always resync so a partial-success batch (install OK, remove failed)
1054
1185
  // doesn't leave the UI showing stale install state on the next click.
@@ -1064,12 +1195,13 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1064
1195
  // Reinstall button. Use Apply for first-time installs.
1065
1196
  const targets = Array.from(installedCliSet).filter((id) => checkedClis.has(id));
1066
1197
  if (targets.length === 0) return;
1198
+ capture("cli_reinstall_submitted", { cli_ids: targets, count: targets.length });
1067
1199
  startTransition(async () => {
1068
1200
  try {
1069
1201
  setActionError(null);
1070
1202
  await installHooksWebAction("user", targets);
1071
1203
  } catch (e) {
1072
- setActionError(e instanceof Error ? e.message : "Failed to reinstall.");
1204
+ fireActionError("cli_reinstall", e instanceof Error ? e.message : "Failed to reinstall.");
1073
1205
  } finally {
1074
1206
  await reload();
1075
1207
  }
@@ -1086,7 +1218,7 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1086
1218
  await updatePolicyParamsAction(policyName, params);
1087
1219
  await reload();
1088
1220
  } catch (e) {
1089
- setActionError(e instanceof Error ? e.message : "Failed to save configuration.");
1221
+ fireActionError("param_update", e instanceof Error ? e.message : "Failed to save configuration.");
1090
1222
  }
1091
1223
  });
1092
1224
  };
@@ -1111,7 +1243,10 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1111
1243
  {configuringPolicy && (
1112
1244
  <PolicyConfigModal
1113
1245
  policy={configuringPolicy}
1114
- onClose={() => setConfiguringPolicy(null)}
1246
+ onClose={() => {
1247
+ capture("policy_config_modal_closed", { policy_name: configuringPolicy.name, action: "cancel" });
1248
+ setConfiguringPolicy(null);
1249
+ }}
1115
1250
  onSave={handleSaveParams}
1116
1251
  />
1117
1252
  )}
@@ -1379,7 +1514,19 @@ function PoliciesTab({ onHooksInstallChange }: { onHooksInstallChange?: (install
1379
1514
  {policy.params && Object.keys(policy.params).length > 0 && (
1380
1515
  <button
1381
1516
  className="shrink-0 mt-0.5 text-muted-foreground hover:text-primary transition-colors"
1382
- onClick={() => setConfiguringPolicy(policy)}
1517
+ onClick={() => {
1518
+ const customizedCount = Object.entries(policy.params ?? {}).filter(([k, spec]) => {
1519
+ const currentVal = policy.currentParams?.[k] ?? spec.default;
1520
+ return JSON.stringify(currentVal) !== JSON.stringify(spec.default);
1521
+ }).length;
1522
+ capture("policy_config_modal_opened", {
1523
+ policy_name: policy.name,
1524
+ param_count: Object.keys(policy.params ?? {}).length,
1525
+ has_customized_params: customizedCount > 0,
1526
+ customized_count: customizedCount,
1527
+ });
1528
+ setConfiguringPolicy(policy);
1529
+ }}
1383
1530
  title="Edit parameters"
1384
1531
  >
1385
1532
  <Settings className="h-3.5 w-3.5" />
@@ -1461,18 +1608,15 @@ function TabBar({
1461
1608
  { id: "policies", label: "Configure" },
1462
1609
  ];
1463
1610
  return (
1464
- <div className="inline-flex items-center rounded-md border border-border bg-muted/30 p-0.5 mb-5">
1611
+ <div className="tabs" style={{ padding: 0, marginBottom: 24 }}>
1465
1612
  {tabs.map((tab) => (
1466
1613
  <button
1467
1614
  key={tab.id}
1615
+ type="button"
1468
1616
  onClick={() => onChange(tab.id)}
1469
- className={`px-3 py-1.5 text-xs font-medium rounded transition-all ${
1470
- activeTab === tab.id
1471
- ? "bg-background text-foreground shadow-sm"
1472
- : "text-muted-foreground hover:text-foreground"
1473
- }`}
1617
+ className={`tab${activeTab === tab.id ? " is-active" : ""}`}
1474
1618
  >
1475
- {tab.label}
1619
+ {tab.label.toLowerCase()}
1476
1620
  </button>
1477
1621
  ))}
1478
1622
  </div>
@@ -1483,9 +1627,11 @@ function TabBar({
1483
1627
 
1484
1628
  export default function HooksClient({ initialTab = "activity" }: { initialTab?: "activity" | "policies" }) {
1485
1629
  const url = useUrlParams();
1630
+ const { capture } = usePostHog();
1486
1631
  const [activeTab, setActiveTab] = useState<"activity" | "policies">(initialTab);
1487
1632
  const [hooksInstalled, setHooksInstalled] = useState<boolean | undefined>(undefined);
1488
1633
  const [policyCounts, setPolicyCounts] = useState<{ enabled: number; total: number } | null>(null);
1634
+ const [installedCliLabels, setInstalledCliLabels] = useState<string[]>([]);
1489
1635
 
1490
1636
  useEffect(() => {
1491
1637
  getHooksConfigAction()
@@ -1495,70 +1641,123 @@ export default function HooksClient({ initialTab = "activity" }: { initialTab?:
1495
1641
  enabled: cfg.enabledPolicies.length,
1496
1642
  total: cfg.policies.length + (cfg.customPolicies?.length ?? 0),
1497
1643
  });
1644
+ setInstalledCliLabels(cfg.clis.filter((c) => c.installed).map((c) => c.label));
1498
1645
  })
1499
1646
  .catch(() => setHooksInstalled(undefined));
1500
1647
  }, []);
1501
1648
 
1649
+ const evaluationsHeading = installedCliLabels.length === 0
1650
+ ? "Policy evaluations"
1651
+ : installedCliLabels.length <= 3
1652
+ ? `Policy evaluations across ${installedCliLabels.join(", ")}`
1653
+ : `Policy evaluations across ${installedCliLabels.length} agents`;
1654
+
1502
1655
  const handleTabChange = (tab: "activity" | "policies") => {
1656
+ if (tab !== activeTab) {
1657
+ capture("policies_tab_switched", { tab, from_tab: activeTab });
1658
+ }
1503
1659
  setActiveTab(tab);
1504
1660
  url.setAll({ tab: tab === "activity" ? undefined : tab });
1505
1661
  };
1506
1662
 
1507
1663
  return (
1508
- <div className="min-h-screen bg-background px-4 py-6 sm:px-6 lg:px-10">
1509
- {/* Header */}
1510
- <div className="mb-6">
1511
- <Link
1512
- href="/projects"
1513
- className="inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors"
1664
+ <main className="report">
1665
+ <section className="section" data-screen-label="policies">
1666
+ <h2
1667
+ style={{
1668
+ fontFamily: "var(--font-mono)",
1669
+ fontSize: 24,
1670
+ fontWeight: 600,
1671
+ letterSpacing: "-0.01em",
1672
+ color: "var(--ink)",
1673
+ margin: "0 0 16px",
1674
+ }}
1514
1675
  >
1515
- <ArrowLeft className="h-3.5 w-3.5" />
1516
- Back
1517
- </Link>
1518
- <div className="flex items-center gap-3 mt-3">
1519
- <h1 className="text-2xl font-bold text-foreground tracking-tight">
1520
- Policies
1521
- </h1>
1522
- {activeTab === "activity" && (
1523
- <span className="relative flex h-2.5 w-2.5 mt-0.5">
1524
- <span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75" />
1525
- <span className="relative inline-flex rounded-full h-2.5 w-2.5 bg-emerald-500" />
1526
- </span>
1527
- )}
1528
- </div>
1529
- <p className="text-sm text-muted-foreground mt-1">
1530
- {activeTab === "activity" ? (
1531
- <>
1532
- Policy evaluations for Claude
1676
+ {activeTab === "activity" ? "Policies" : "Configure Policies"}
1677
+ </h2>
1678
+ {activeTab === "activity" ? (
1679
+ <div
1680
+ style={{
1681
+ display: "flex",
1682
+ alignItems: "flex-start",
1683
+ justifyContent: "space-between",
1684
+ gap: 32,
1685
+ flexWrap: "wrap",
1686
+ margin: "0 0 24px",
1687
+ }}
1688
+ >
1689
+ <div
1690
+ style={{
1691
+ fontFamily: "var(--font-mono)",
1692
+ fontSize: 14,
1693
+ color: "var(--ink-2)",
1694
+ lineHeight: 1.7,
1695
+ flex: "1 1 480px",
1696
+ minWidth: 0,
1697
+ }}
1698
+ >
1699
+ {evaluationsHeading}
1533
1700
  {policyCounts && (
1534
- <span className="text-muted-foreground/60">
1701
+ <span style={{ color: "var(--dim)" }}>
1535
1702
  {" · "}enabled policies{" "}
1536
- <span className="font-mono text-foreground/70">{policyCounts.enabled}/{policyCounts.total}</span>
1703
+ <span style={{ color: "var(--ink)", fontVariantNumeric: "tabular-nums" }}>
1704
+ {policyCounts.enabled}/{policyCounts.total}
1705
+ </span>
1537
1706
  </span>
1538
1707
  )}
1539
- <span className="block text-xs text-muted-foreground/50 mt-0.5">
1540
- To configure policies,{" "}
1541
- <button
1542
- className="underline underline-offset-2 hover:text-foreground transition-colors"
1543
- onClick={() => handleTabChange("policies")}
1544
- >
1545
- go here
1546
- </button>
1708
+ </div>
1709
+ <div
1710
+ style={{
1711
+ display: "flex",
1712
+ flexDirection: "column",
1713
+ alignItems: "flex-end",
1714
+ gap: 6,
1715
+ flex: "0 0 auto",
1716
+ }}
1717
+ >
1718
+ <span
1719
+ style={{
1720
+ fontFamily: "var(--font-mono)",
1721
+ fontSize: 10,
1722
+ letterSpacing: "0.22em",
1723
+ textTransform: "uppercase",
1724
+ color: "var(--dim)",
1725
+ }}
1726
+ >
1727
+ want to change which policies fire?
1547
1728
  </span>
1548
- </>
1549
- ) : (
1550
- "Configure Policies"
1551
- )}
1552
- </p>
1553
- </div>
1729
+ <button
1730
+ type="button"
1731
+ className="btn btn-primary"
1732
+ onClick={() => handleTabChange("policies")}
1733
+ >
1734
+ [ configure policies → ]
1735
+ </button>
1736
+ </div>
1737
+ </div>
1738
+ ) : (
1739
+ <p
1740
+ style={{
1741
+ fontFamily: "var(--font-mono)",
1742
+ fontSize: 14,
1743
+ color: "var(--ink-2)",
1744
+ lineHeight: 1.7,
1745
+ maxWidth: 720,
1746
+ margin: "0 0 24px",
1747
+ }}
1748
+ >
1749
+ switch policies on or off across your installed agent CLIs.
1750
+ </p>
1751
+ )}
1554
1752
 
1555
- <TabBar activeTab={activeTab} onChange={handleTabChange} />
1753
+ <TabBar activeTab={activeTab} onChange={handleTabChange} />
1556
1754
 
1557
- {activeTab === "activity" ? (
1558
- <ActivityTab hooksInstalled={hooksInstalled} onSwitchTab={handleTabChange} />
1559
- ) : (
1560
- <PoliciesTab onHooksInstallChange={setHooksInstalled} />
1561
- )}
1562
- </div>
1755
+ {activeTab === "activity" ? (
1756
+ <ActivityTab hooksInstalled={hooksInstalled} onSwitchTab={handleTabChange} />
1757
+ ) : (
1758
+ <PoliciesTab onHooksInstallChange={setHooksInstalled} />
1759
+ )}
1760
+ </section>
1761
+ </main>
1563
1762
  );
1564
1763
  }