failproofai 1.0.0-beta.2 → 1.0.0-beta.20

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 (381) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +2 -1
  3. package/.next/standalone/.next/build-manifest.json +6 -6
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/required-server-files.json +1 -1
  6. package/.next/standalone/.next/routes-manifest.json +6 -0
  7. package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +3 -3
  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 +3 -1
  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 +3 -3
  20. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  21. package/.next/standalone/.next/server/app/_not-found/page.js +3 -1
  22. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  25. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  26. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  27. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  28. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
  29. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  30. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  31. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  32. package/.next/standalone/.next/server/app/api/audit/invite/route.js +3 -2
  33. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/audit/run/route.js +4 -3
  35. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/audit/status/route.js +1 -1
  37. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/auth/login-request/route.js +3 -1
  39. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +3 -2
  41. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/auth/logout/route.js +3 -2
  43. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/api/auth/reminder/route.js +3 -2
  45. package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/api/auth/status/route.js +3 -2
  47. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +1 -1
  49. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/audit/page/build-manifest.json +3 -3
  51. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  52. package/.next/standalone/.next/server/app/audit/page.js +5 -3
  53. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/index.html +1 -1
  56. package/.next/standalone/.next/server/app/index.rsc +15 -15
  57. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  58. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  59. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  60. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
  61. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  62. package/.next/standalone/.next/server/app/page/build-manifest.json +3 -3
  63. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  64. package/.next/standalone/.next/server/app/page.js +3 -1
  65. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/policies/page/build-manifest.json +3 -3
  68. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +30 -18
  69. package/.next/standalone/.next/server/app/policies/page.js +5 -3
  70. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/project/[name]/page/build-manifest.json +3 -3
  73. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  74. package/.next/standalone/.next/server/app/project/[name]/page.js +4 -2
  75. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/build-manifest.json +3 -3
  78. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  79. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  80. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +6 -4
  81. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/projects/page/build-manifest.json +3 -3
  84. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  85. package/.next/standalone/.next/server/app/projects/page.js +4 -2
  86. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  87. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  89. package/.next/standalone/.next/server/app/settings/page/build-manifest.json +18 -0
  90. package/.next/standalone/.next/server/app/settings/page/next-font-manifest.json +6 -0
  91. package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
  92. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +53 -0
  93. package/.next/standalone/.next/server/app/settings/page.js +18 -0
  94. package/.next/standalone/.next/server/app/settings/page.js.map +5 -0
  95. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -0
  96. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +3 -0
  97. package/.next/standalone/.next/server/app-paths-manifest.json +2 -1
  98. package/.next/standalone/.next/server/chunks/[externals]__0h9_83k._.js +3 -0
  99. package/.next/standalone/.next/server/chunks/{[externals]__1nl3dvw._.js → [externals]__0r-zamh._.js} +2 -2
  100. package/.next/standalone/.next/server/chunks/[externals]__1ifpkx-._.js +3 -0
  101. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0l4vuqm._.js → [root-of-the-server]__00ni9za._.js} +2 -2
  102. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06hexd0._.js +3 -0
  103. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08y94xv._.js +3 -0
  104. package/.next/standalone/.next/server/chunks/[root-of-the-server]__094p1f1._.js +3 -0
  105. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_0xu5z._.js +1 -1
  106. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ed01_d._.js +3 -0
  107. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0-dh5jy._.js → [root-of-the-server]__0effm9m._.js} +2 -2
  108. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g0vcwt._.js +3 -0
  109. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__18d-9oi._.js → [root-of-the-server]__0ix8gm7._.js} +2 -2
  110. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0h3lfmp._.js → [root-of-the-server]__0ji11a-._.js} +2 -2
  111. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__10oa-v9._.js → [root-of-the-server]__0ojwjxl._.js} +2 -2
  112. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__16le-kd._.js → [root-of-the-server]__0pbp9fe._.js} +2 -2
  113. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q-v9z2._.js +1 -1
  114. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vb5fl2._.js +3 -0
  115. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0sb_5m8._.js → [root-of-the-server]__131ebum._.js} +4 -4
  116. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ibjy5x._.js +3 -0
  117. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tvn4wf._.js +1 -1
  118. package/.next/standalone/.next/server/chunks/[root-of-the-server]__20d06rh._.js +3 -0
  119. package/.next/standalone/.next/server/chunks/_0lxbzdq._.js +3 -0
  120. package/.next/standalone/.next/server/chunks/_1zuiiy3._.js +3 -0
  121. package/.next/standalone/.next/server/chunks/lib_telemetry_ts_0dctyyw._.js +3 -0
  122. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +5 -5
  123. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +2 -1
  124. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +2 -1
  125. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  126. package/.next/standalone/.next/server/chunks/ssr/[externals]__1aq139v._.js +3 -0
  127. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__06bp_fg._.js +5 -0
  128. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__074qmkp._.js +3 -0
  129. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1apb7k_._.js → [root-of-the-server]__0_1tiya._.js} +2 -2
  130. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__170799-._.js → [root-of-the-server]__0spkm68._.js} +11 -11
  131. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1-to0ij._.js +3 -0
  132. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__103o_0c._.js +3 -0
  133. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__17itmx-._.js +5 -0
  134. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__01od0m6._.js → [root-of-the-server]__1n2vcv4._.js} +2 -2
  135. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1qapotl._.js +1 -1
  136. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1rv-sc9._.js +3 -0
  137. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1tlvv9a._.js +3 -0
  138. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1u-wx42._.js +4 -0
  139. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1v185mo._.js +3 -0
  140. package/.next/standalone/.next/server/chunks/ssr/_0-yi74u._.js +3 -0
  141. package/.next/standalone/.next/server/chunks/ssr/_0rjgfln._.js +3 -0
  142. package/.next/standalone/.next/server/chunks/ssr/_0vo2qyt._.js +3 -0
  143. package/.next/standalone/.next/server/chunks/ssr/_0xej-0e._.js +3 -0
  144. package/.next/standalone/.next/server/chunks/ssr/_10399ge._.js +3 -0
  145. package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +1 -1
  146. package/.next/standalone/.next/server/chunks/ssr/_149k9oy._.js +3 -0
  147. package/.next/standalone/.next/server/chunks/ssr/_1_hwp06._.js +3 -0
  148. package/.next/standalone/.next/server/chunks/ssr/_1e19atl._.js +1 -1
  149. package/.next/standalone/.next/server/chunks/ssr/_1mnhi_r._.js +3 -0
  150. package/.next/standalone/.next/server/chunks/ssr/_1ror7k9._.js +3 -0
  151. package/.next/standalone/.next/server/chunks/ssr/_1sdgprl._.js +5 -0
  152. package/.next/standalone/.next/server/chunks/ssr/_1uc72nw._.js +3 -0
  153. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +2 -2
  154. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  155. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +2 -2
  156. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0dwo94s.js +4 -0
  157. package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +2 -1
  158. package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +3 -0
  159. package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-config_ts_04t589g._.js +4 -0
  160. package/.next/standalone/.next/server/middleware-build-manifest.js +6 -6
  161. package/.next/standalone/.next/server/middleware.js +2 -2
  162. package/.next/standalone/.next/server/pages/404.html +1 -1
  163. package/.next/standalone/.next/server/pages/500.html +1 -1
  164. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  165. package/.next/standalone/.next/server/server-reference-manifest.json +74 -20
  166. package/.next/standalone/.next/static/chunks/{03fmihek9n986.js → 06zgzyh3wv1ig.js} +1 -1
  167. package/.next/standalone/.next/static/chunks/0km-jn9o5xyqs.css +2 -0
  168. package/.next/standalone/.next/static/chunks/{1hdhteui932bq.js → 0qmo2t50kpb30.js} +1 -1
  169. package/.next/standalone/.next/static/chunks/0w8acammgupgr.js +1 -0
  170. package/.next/standalone/.next/static/chunks/{0fi645si-uiiq.js → 0wlpo3_hq9rci.js} +1 -1
  171. package/.next/standalone/.next/static/chunks/10cm1i5jw2mzj.js +1 -0
  172. package/.next/standalone/.next/static/chunks/16p68cybetr31.js +1 -0
  173. package/.next/standalone/.next/static/chunks/{31feojxhjyjpl.js → 1k4hl320zivte.js} +1 -1
  174. package/.next/standalone/.next/static/chunks/{2j94uwkb4s3qr.js → 1n9ggslx2aygw.js} +1 -1
  175. package/.next/standalone/.next/static/chunks/1v1gqvpjk62jm.js +1 -0
  176. package/.next/standalone/.next/static/chunks/{3vs4ay36tjds_.js → 1v6gjavx4sbjs.js} +1 -1
  177. package/.next/standalone/.next/static/chunks/23kev26by1e4f.js +1 -0
  178. package/.next/standalone/.next/static/chunks/{18rvdw5v72364.js → 2nn1vawt_bjg9.js} +1 -1
  179. package/.next/standalone/.next/static/chunks/{2sbelanzvxvv0.js → 2okwe7pwbns9r.js} +22 -22
  180. package/.next/standalone/.next/static/chunks/2phcxvhudl43n.js +6 -0
  181. package/.next/standalone/.next/static/chunks/2uvhw57mf9lg_.css +2 -0
  182. package/.next/standalone/.next/static/chunks/31coz11ia5vc4.js +1 -0
  183. package/.next/standalone/.next/static/chunks/{3hp8ulqknybil.js → 34xx-flmxe4nt.js} +1 -1
  184. package/.next/standalone/.next/static/chunks/{turbopack-1lsv92x7klwrn.js → turbopack-3diub4ctvn1n0.js} +1 -1
  185. package/.next/standalone/SECURITY.md +8 -2
  186. package/.next/standalone/app/actions/get-active-pauses.ts +16 -0
  187. package/.next/standalone/app/actions/get-hooks-config.ts +2 -2
  188. package/.next/standalone/app/actions/get-scheduled-audit.ts +70 -0
  189. package/.next/standalone/app/actions/update-scheduled-audit.ts +44 -0
  190. package/.next/standalone/app/api/audit/run/route.ts +28 -0
  191. package/.next/standalone/app/api/audit/status/route.ts +13 -1
  192. package/.next/standalone/app/api/auth/status/route.ts +1 -1
  193. package/.next/standalone/app/audit/_components/audit-dashboard.tsx +1 -3
  194. package/.next/standalone/app/audit/_components/audit-progress-strip.tsx +1 -1
  195. package/.next/standalone/app/audit/_components/auth-dialog.css +159 -0
  196. package/.next/standalone/app/audit/_components/auth-dialog.tsx +3 -0
  197. package/.next/standalone/app/audit/_components/come-back-better-section.tsx +1 -1
  198. package/.next/standalone/app/audit/_components/empty-state.tsx +0 -1
  199. package/.next/standalone/app/audit/_components/how-to-improve-section.tsx +1 -1
  200. package/.next/standalone/app/audit/_components/quirks-section.tsx +0 -1
  201. package/.next/standalone/app/audit/_components/report-footer.tsx +0 -2
  202. package/.next/standalone/app/audit/_components/run-progress.tsx +1 -1
  203. package/.next/standalone/app/audit/_components/strengths-section.tsx +0 -1
  204. package/.next/standalone/app/audit/audit-styles.css +6 -149
  205. package/.next/standalone/app/components/pause-notices.tsx +111 -0
  206. package/.next/standalone/app/components/raw-log-viewer.tsx +1 -1
  207. package/.next/standalone/app/components/toast.tsx +1 -1
  208. package/.next/standalone/app/policies/hooks-client.tsx +84 -8
  209. package/.next/standalone/app/settings/page.tsx +31 -0
  210. package/.next/standalone/app/settings/settings-client.tsx +487 -0
  211. package/.next/standalone/components/navbar.tsx +2 -0
  212. package/.next/standalone/lib/auth/api-server-client.ts +2 -3
  213. package/.next/standalone/lib/auth/auth-store.ts +4 -5
  214. package/.next/standalone/lib/codex-sessions.ts +2 -1
  215. package/.next/standalone/lib/dashboard-host.ts +101 -0
  216. package/.next/standalone/lib/install-check.ts +22 -7
  217. package/.next/standalone/lib/pi-sessions.ts +99 -14
  218. package/.next/standalone/lib/telemetry-enabled.ts +54 -0
  219. package/.next/standalone/lib/telemetry-id.ts +52 -1
  220. package/.next/standalone/lib/telemetry.ts +8 -4
  221. package/.next/standalone/node_modules/react/cjs/react.development.js +1 -1
  222. package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
  223. package/.next/standalone/node_modules/react/package.json +3 -3
  224. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
  225. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
  226. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +3 -3
  227. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +3 -3
  228. package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +3 -3
  229. package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
  230. package/.next/standalone/node_modules/react-dom/package.json +4 -4
  231. package/.next/standalone/package.json +23 -12
  232. package/.next/standalone/proxy.ts +111 -1
  233. package/.next/standalone/server.js +1 -1
  234. package/bin/failproofai-worker.mjs +1 -1
  235. package/bin/failproofai.mjs +1041 -81
  236. package/bin/failproofaid-shim.mjs +4 -4
  237. package/dist/cli.mjs +18513 -10474
  238. package/dist/worker.mjs +1223 -299
  239. package/lib/auth/api-server-client.ts +2 -3
  240. package/lib/auth/auth-store.ts +4 -5
  241. package/lib/codex-sessions.ts +2 -1
  242. package/lib/dashboard-host.ts +101 -0
  243. package/lib/install-check.ts +22 -7
  244. package/lib/pi-sessions.ts +99 -14
  245. package/lib/telemetry-enabled.ts +54 -0
  246. package/lib/telemetry-id.ts +52 -1
  247. package/lib/telemetry.ts +8 -4
  248. package/package.json +23 -12
  249. package/scripts/build-daemon-packages.mjs +247 -0
  250. package/scripts/daemon-platforms.mjs +42 -0
  251. package/scripts/dev-hook.mjs +46 -5
  252. package/scripts/install-telemetry.mjs +8 -1
  253. package/scripts/launch.ts +25 -3
  254. package/scripts/parse-script-args.ts +27 -1
  255. package/scripts/prune-standalone.mjs +26 -0
  256. package/scripts/publish-aliases.mjs +62 -41
  257. package/scripts/repro-npm-install.sh +155 -0
  258. package/scripts/translate-docs/cache.ts +1 -1
  259. package/scripts/translate-docs/cli.ts +2 -2
  260. package/scripts/translate-docs/mintlify-nav.ts +1 -1
  261. package/scripts/translate-docs/readme-translator.ts +163 -4
  262. package/scripts/validate-mdx.ts +153 -13
  263. package/src/audit/audit-lock.ts +285 -0
  264. package/src/audit/audit-schedule.ts +111 -0
  265. package/src/audit/cache.ts +18 -5
  266. package/src/audit/cli-adapters/goose.ts +2 -1
  267. package/src/audit/cli-adapters/hermes.ts +28 -10
  268. package/src/audit/cli.ts +191 -35
  269. package/src/audit/dashboard-cache.ts +2 -3
  270. package/src/audit/report.ts +0 -1
  271. package/src/hooks/backfill-cli.ts +247 -0
  272. package/src/hooks/builtin-policies.ts +391 -3
  273. package/src/hooks/cloud-connection.ts +354 -0
  274. package/src/hooks/cloud-enrollment-cli.ts +439 -0
  275. package/src/hooks/cloud-enrollment.ts +284 -0
  276. package/src/hooks/cloud-introspect.ts +147 -0
  277. package/src/hooks/cloud-managed-policies.ts +206 -0
  278. package/src/hooks/collector-config.ts +218 -0
  279. package/src/hooks/configure-wizard.ts +1211 -233
  280. package/src/hooks/custom-hooks-loader.ts +243 -37
  281. package/src/hooks/daemon-client.ts +136 -33
  282. package/src/hooks/daemon-download.ts +264 -31
  283. package/src/hooks/daemon-service.ts +1124 -76
  284. package/src/hooks/first-run-gate.ts +50 -0
  285. package/src/hooks/flush-cli.ts +180 -0
  286. package/src/hooks/fp-config.ts +835 -0
  287. package/src/hooks/fp-home.ts +714 -0
  288. package/src/hooks/fp-reset.ts +1363 -0
  289. package/src/hooks/handler.ts +185 -6
  290. package/src/hooks/harness-cli.ts +386 -0
  291. package/src/hooks/hook-activity-store.ts +171 -24
  292. package/src/hooks/hook-logger.ts +2 -2
  293. package/src/hooks/hook-telemetry.ts +5 -1
  294. package/src/hooks/hooks-config.ts +4 -3
  295. package/src/hooks/integrations.ts +0 -1
  296. package/src/hooks/loader-utils.ts +172 -9
  297. package/src/hooks/manager.ts +41 -5
  298. package/src/hooks/migrations.ts +450 -0
  299. package/src/hooks/onboarding-attempt.ts +195 -0
  300. package/src/hooks/onboarding-lock.ts +118 -0
  301. package/src/hooks/policy-types.ts +28 -0
  302. package/src/hooks/session-pause-cli.ts +159 -0
  303. package/src/hooks/session-pause.ts +267 -0
  304. package/src/hooks/setup-state.ts +256 -0
  305. package/src/hooks/tui.ts +209 -9
  306. package/src/hooks/uninstall-cli.ts +418 -0
  307. package/src/hooks/worker-server.ts +134 -15
  308. package/.next/standalone/.next/server/chunks/[externals]__14odj07._.js +0 -3
  309. package/.next/standalone/.next/server/chunks/[externals]__1s61mel._.js +0 -3
  310. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0id_xf7._.js +0 -3
  311. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0longh-._.js +0 -3
  312. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +0 -3
  313. package/.next/standalone/.next/server/chunks/[root-of-the-server]__19120tr._.js +0 -3
  314. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1fwl2mz._.js +0 -3
  315. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1myjm-d._.js +0 -3
  316. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rhmvod._.js +0 -3
  317. package/.next/standalone/.next/server/chunks/ssr/[externals]__1_g_b3t._.js +0 -3
  318. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0114ewg._.js +0 -4
  319. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02r5bgf._.js +0 -4
  320. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e8sjqm._.js +0 -4
  321. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0lkzqax._.js +0 -4
  322. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0nb0syg._.js +0 -3
  323. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qucxyj._.js +0 -4
  324. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0u02miy._.js +0 -4
  325. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0uno39i._.js +0 -3
  326. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__14dd6h8._.js +0 -3
  327. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ath6v_._.js +0 -4
  328. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1psjybo._.js +0 -3
  329. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1zqz4v8._.js +0 -4
  330. package/.next/standalone/.next/server/chunks/ssr/_1m_p7pi._.js +0 -3
  331. package/.next/standalone/.next/server/chunks/ssr/node_modules_html-to-image_es_index_0oy_-36.js +0 -3
  332. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1ezd2jf._.js +0 -5
  333. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1tnuifj._.js +0 -5
  334. package/.next/standalone/.next/static/chunks/0h7auy7hzjyhw.js +0 -1
  335. package/.next/standalone/.next/static/chunks/0zbxssxh53n-3.js +0 -1
  336. package/.next/standalone/.next/static/chunks/2mazwb1qmur1p.js +0 -1
  337. package/.next/standalone/.next/static/chunks/2pujpnfx4pws6.css +0 -2
  338. package/.next/standalone/.next/static/chunks/33u59vf_8xpd-.js +0 -1
  339. package/.next/standalone/.next/static/chunks/3i27c3hcriawq.css +0 -1
  340. package/.next/standalone/.next/static/chunks/3s7myk_co0gbh.js +0 -1
  341. package/.next/standalone/.next/static/chunks/40k1_v4os4cw6.js +0 -6
  342. package/.next/standalone/Cargo.lock +0 -428
  343. package/.next/standalone/Cargo.toml +0 -9
  344. package/.next/standalone/crates/PROTOCOL.md +0 -122
  345. package/.next/standalone/crates/failproofaid/Cargo.toml +0 -18
  346. package/.next/standalone/crates/failproofaid/src/lock.rs +0 -81
  347. package/.next/standalone/crates/failproofaid/src/main.rs +0 -83
  348. package/.next/standalone/crates/failproofaid/src/paths.rs +0 -172
  349. package/.next/standalone/crates/failproofaid/src/server.rs +0 -502
  350. package/.next/standalone/crates/failproofaid/src/worker.rs +0 -400
  351. package/.next/standalone/crates/failproofaid/tests/daemon_e2e.rs +0 -241
  352. package/.next/standalone/crates/fpai-ipc/Cargo.toml +0 -16
  353. package/.next/standalone/crates/fpai-ipc/src/envelope.rs +0 -175
  354. package/.next/standalone/crates/fpai-ipc/src/framing.rs +0 -177
  355. package/.next/standalone/crates/fpai-ipc/src/lib.rs +0 -10
  356. package/.next/standalone/crates/fpai-ipc/src/peer.rs +0 -80
  357. package/.next/standalone/docker-hook-sync/Dockerfile +0 -79
  358. package/.next/standalone/docker-hook-sync/entrypoint.sh +0 -109
  359. package/.next/standalone/integration-suite/Dockerfile +0 -47
  360. package/.next/standalone/integration-suite/README.md +0 -129
  361. package/.next/standalone/integration-suite/canary-policies.mjs +0 -45
  362. package/.next/standalone/integration-suite/capture-tokens.sh +0 -48
  363. package/.next/standalone/integration-suite/ci-entrypoint.sh +0 -179
  364. package/.next/standalone/integration-suite/inject-tokens.sh +0 -44
  365. package/.next/standalone/integration-suite/install-clis.sh +0 -136
  366. package/.next/standalone/integration-suite/probe-cli.sh +0 -248
  367. package/.next/standalone/integration-suite/report.js +0 -120
  368. package/.next/standalone/integration-suite/run.sh +0 -159
  369. package/.next/standalone/openclaw-plugin/index.js +0 -223
  370. package/.next/standalone/openclaw-plugin/openclaw.plugin.json +0 -6
  371. package/.next/standalone/openclaw-plugin/package.json +0 -12
  372. package/.next/standalone/osv-scanner.toml +0 -17
  373. package/.next/standalone/pi-extension/index.ts +0 -524
  374. package/.next/standalone/pi-extension/package.json +0 -12
  375. package/.next/standalone/postcss.config.mjs +0 -8
  376. package/.next/standalone/readme-arch-hq.gif +0 -0
  377. package/.next/standalone/rust-toolchain.toml +0 -4
  378. package/src/auth/cli.ts +0 -371
  379. /package/.next/standalone/.next/static/{NWAjs0tHFyzk97gRGG09r → V-J6_45cTPR52rYs_4UES}/_buildManifest.js +0 -0
  380. /package/.next/standalone/.next/static/{NWAjs0tHFyzk97gRGG09r → V-J6_45cTPR52rYs_4UES}/_clientMiddlewareManifest.js +0 -0
  381. /package/.next/standalone/.next/static/{NWAjs0tHFyzk97gRGG09r → V-J6_45cTPR52rYs_4UES}/_ssgManifest.js +0 -0
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { NextResponse } from "next/server";
10
10
  import { readDashboardCache } from "@/src/audit/dashboard-cache";
11
+ import { readActiveAuditLock } from "@/src/audit/audit-lock";
11
12
  import { getRunState } from "../_state";
12
13
 
13
14
  export const dynamic = "force-dynamic";
@@ -15,8 +16,19 @@ export const dynamic = "force-dynamic";
15
16
  export async function GET(): Promise<NextResponse> {
16
17
  const state = getRunState();
17
18
  const cache = readDashboardCache();
19
+ // `running` must answer "is a scan running on this MACHINE", not just "in this
20
+ // process". The in-memory state only sees dashboard-initiated runs; a
21
+ // scheduled daemon child or a `failproofai audit` writes the same cache from
22
+ // another process and holds the cross-process lock instead. Fold that in so a
23
+ // client polling after a 409 (or the settings page on mount) sees the machine
24
+ // as busy and waits it out, rather than reading idle and clobbering a live
25
+ // scan's cache. `readActiveAuditLock` applies the same dead-pid/age staleness
26
+ // rules as acquire, so a crashed run's leftover lockfile never wedges this at
27
+ // "running" forever.
28
+ const externalLock = readActiveAuditLock();
29
+ const externallyRunning = externalLock !== null && externalLock.pid !== process.pid;
18
30
  return NextResponse.json({
19
- running: state.running,
31
+ running: state.running || externallyRunning,
20
32
  startedAt: state.startedAt ?? null,
21
33
  cachedAt: cache?.cachedAt ?? null,
22
34
  error: state.error,
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Returns the currently signed-in identity by reading the local
5
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`.
6
+ * file is the source of truth for who is signed in on this machine.
7
7
  * This keeps the dashboard UI and the CLI consistent regardless of whether
8
8
  * the api-server is reachable.
9
9
  *
@@ -14,7 +14,7 @@
14
14
  *
15
15
  * Empty / running states fall back to EmptyState and RunProgress.
16
16
  */
17
- import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
17
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
18
18
  import { getAuditResultAction } from "@/app/actions/get-audit-result";
19
19
  import type { AuditResult, RunAuditOptions } from "@/src/audit/types";
20
20
  import { classifyAgent } from "@/src/audit/archetypes";
@@ -227,8 +227,6 @@ export function AuditDashboard({ initial, projectFromUrl, totalCatalogSize }: Pr
227
227
  const result = cache.status === "cached" ? cache.result : null;
228
228
  if (!result) return null;
229
229
  const cachedAt = cache.status === "cached" ? cache.cachedAt : null;
230
- const params = cache.status === "cached" ? cache.params : undefined;
231
-
232
230
  /* ---- scanned but zero sessions --------------------------------- */
233
231
  if (result.transcripts.scanned === 0) {
234
232
  return (
@@ -15,7 +15,7 @@
15
15
  * Reuses the existing `RerunError.kind` discrimination to render a red
16
16
  * error strip with kind-specific copy when a run dies.
17
17
  */
18
- import React, { useEffect, useState } from "react";
18
+ import { useEffect, useState } from "react";
19
19
  import type { RerunError } from "./rerun-button";
20
20
 
21
21
  export type RerunStatus =
@@ -0,0 +1,159 @@
1
+ /* Styles for <AuthDialog> — co-located with the component and imported by it,
2
+ * NOT living in a route stylesheet.
3
+ *
4
+ * Why here: the dialog was first used only on /audit, so these rules used to sit
5
+ * in audit-styles.css (route-scoped to /audit). The /settings page reuses the
6
+ * same component to lead a signed-out user into the existing OTP login flow, and
7
+ * a route stylesheet would not load there — the modal would render unstyled.
8
+ * Importing this file from auth-dialog.tsx makes the CSS travel with the
9
+ * component to every route that renders it. Every var below is defined in
10
+ * globals.css :root, so it resolves anywhere.
11
+ */
12
+
13
+ .auth-dialog-backdrop {
14
+ position: fixed; inset: 0; z-index: 10000;
15
+ display: grid; place-items: center;
16
+ padding: 32px 16px;
17
+ background: rgba(8,8,10,0.7);
18
+ backdrop-filter: blur(6px);
19
+ -webkit-backdrop-filter: blur(6px);
20
+ }
21
+
22
+ .auth-dialog {
23
+ position: relative;
24
+ width: 100%;
25
+ max-width: 420px;
26
+ padding: 28px 28px 24px;
27
+ border: 1px solid var(--line-2);
28
+ background: var(--bg-2);
29
+ font-family: var(--font-mono);
30
+ color: var(--ink);
31
+ }
32
+
33
+ .auth-close {
34
+ position: absolute; top: 12px; right: 14px;
35
+ font-family: var(--font-mono); font-size: 20px;
36
+ line-height: 1;
37
+ color: var(--dim);
38
+ background: transparent; border: none; padding: 4px 8px;
39
+ cursor: pointer;
40
+ transition: color 120ms;
41
+ }
42
+ .auth-close:hover { color: var(--accent-pink); }
43
+ .auth-close:disabled { color: var(--line-2); cursor: not-allowed; }
44
+
45
+ .auth-headline {
46
+ font-family: var(--font-mono);
47
+ font-size: 18px;
48
+ font-weight: 600;
49
+ letter-spacing: 0;
50
+ line-height: 1.3;
51
+ text-transform: none;
52
+ color: var(--ink);
53
+ margin: 0 0 8px;
54
+ }
55
+
56
+ .auth-sub {
57
+ font-family: var(--font-mono); font-size: 12px;
58
+ line-height: 1.55; color: var(--ink-2);
59
+ margin: 0 0 18px;
60
+ }
61
+ .auth-sub .auth-email {
62
+ color: var(--accent-pink);
63
+ }
64
+ .auth-sub .auth-ok {
65
+ color: var(--accent-green);
66
+ margin-right: 6px;
67
+ }
68
+
69
+ .auth-form { display: flex; flex-direction: column; gap: 10px; }
70
+
71
+ .auth-field-label {
72
+ font-family: var(--font-mono); font-size: 10px;
73
+ letter-spacing: 0.22em; text-transform: uppercase;
74
+ color: var(--accent-green);
75
+ }
76
+
77
+ .auth-input {
78
+ width: 100%;
79
+ padding: 11px 14px;
80
+ background: var(--bg);
81
+ border: 1px solid var(--line-2);
82
+ color: var(--ink);
83
+ font-family: var(--font-mono); font-size: 14px;
84
+ letter-spacing: 0.03em;
85
+ outline: none;
86
+ transition: border-color 120ms, box-shadow 120ms;
87
+ }
88
+ .auth-input:focus {
89
+ border-color: var(--accent-pink);
90
+ box-shadow: 0 0 0 1px var(--accent-pink-soft);
91
+ }
92
+ .auth-input:disabled {
93
+ opacity: 0.55; cursor: not-allowed;
94
+ }
95
+ .auth-input-code {
96
+ letter-spacing: 0.5em;
97
+ text-align: center;
98
+ font-size: 18px;
99
+ font-variant-numeric: tabular-nums;
100
+ }
101
+ .auth-input::placeholder { color: var(--dim); }
102
+
103
+ .auth-error {
104
+ font-family: var(--font-mono); font-size: 12px;
105
+ color: var(--accent-pink);
106
+ padding: 8px 12px;
107
+ background: var(--accent-pink-bg);
108
+ border: 1px solid var(--accent-pink);
109
+ border-left-width: 3px;
110
+ letter-spacing: 0.02em;
111
+ margin-top: 4px;
112
+ }
113
+
114
+ .auth-actions {
115
+ display: flex; gap: 10px; flex-wrap: wrap;
116
+ margin-top: 14px;
117
+ }
118
+
119
+ .auth-btn {
120
+ display: inline-flex; align-items: center; gap: 8px;
121
+ padding: 10px 16px;
122
+ font-family: var(--font-mono); font-size: 12px;
123
+ letter-spacing: 0.06em;
124
+ background: transparent;
125
+ border: 1px solid var(--line-2);
126
+ color: var(--ink);
127
+ cursor: pointer;
128
+ transition: all 120ms ease;
129
+ }
130
+ .auth-btn:hover:not(:disabled) {
131
+ border-color: var(--ink); background: rgba(255,255,255,0.04);
132
+ }
133
+ .auth-btn:disabled { opacity: 0.45; cursor: not-allowed; }
134
+ .auth-btn.primary {
135
+ border-color: var(--accent-pink);
136
+ color: var(--accent-pink);
137
+ background: var(--accent-pink-bg);
138
+ }
139
+ .auth-btn.primary:hover:not(:disabled) {
140
+ background: var(--accent-pink); color: var(--bg);
141
+ }
142
+
143
+ .auth-back {
144
+ align-self: flex-start;
145
+ margin-top: 4px;
146
+ background: transparent; border: none; padding: 6px 0;
147
+ font-family: var(--font-mono); font-size: 11px;
148
+ letter-spacing: 0.1em; color: var(--dim);
149
+ cursor: pointer;
150
+ transition: color 120ms;
151
+ }
152
+ .auth-back:hover:not(:disabled) { color: var(--ink-2); }
153
+ .auth-back:disabled { opacity: 0.45; cursor: not-allowed; }
154
+
155
+ @media (max-width: 520px) {
156
+ .auth-dialog { padding: 26px 22px 22px; }
157
+ .auth-actions { flex-direction: column; align-items: stretch; }
158
+ .auth-btn { justify-content: center; }
159
+ }
@@ -16,6 +16,9 @@
16
16
  import React, { useCallback, useEffect, useRef, useState } from "react";
17
17
  import { usePostHog } from "@/contexts/PostHogContext";
18
18
  import { fetchWithTimeout, isAbortError } from "@/lib/fetch-with-timeout";
19
+ // Co-located so the dialog is styled on EVERY route that renders it (/audit and
20
+ // /settings), not only the one route stylesheet these rules used to live in.
21
+ import "./auth-dialog.css";
19
22
 
20
23
  export interface AuthedUser {
21
24
  id: string;
@@ -18,7 +18,7 @@
18
18
  * link sits under the reminder card so the affordance survives without
19
19
  * dominating the layout.
20
20
  */
21
- import React, { useCallback, useEffect, useRef, useState } from "react";
21
+ import { useCallback, useEffect, useRef, useState } from "react";
22
22
  import { usePostHog } from "@/contexts/PostHogContext";
23
23
  import { isAbortError } from "@/lib/fetch-with-timeout";
24
24
  import { AuthDialog, type AuthedUser } from "./auth-dialog";
@@ -12,7 +12,6 @@
12
12
  * sharp `.btn-press` action button. Sized so it occupies the same vertical
13
13
  * space as the loaded dashboard does on its hero — no more cramped popover.
14
14
  */
15
- import React from "react";
16
15
  import { triggerRun } from "./rerun-button";
17
16
  import { usePostHog } from "@/contexts/PostHogContext";
18
17
 
@@ -10,7 +10,7 @@
10
10
  * A single "install all" button at the section header copies the
11
11
  * combined install command for every prescribed policy.
12
12
  */
13
- import React, { useMemo, useState } from "react";
13
+ import { useMemo, useState } from "react";
14
14
  import type { AuditResult } from "@/src/audit/types";
15
15
  import { type Grade, tierName } from "@/src/audit/scoring";
16
16
  import { usePostHog } from "@/contexts/PostHogContext";
@@ -8,7 +8,6 @@
8
8
  * detector. No per-finding card chrome, no 4-quad body, no corner
9
9
  * crosshairs — evidence and fix live in section 04 (How to improve).
10
10
  */
11
- import React from "react";
12
11
  import type { FindingCard } from "@/src/audit/findings";
13
12
 
14
13
  interface Props {
@@ -1,7 +1,5 @@
1
1
  "use client";
2
2
 
3
- import React from "react";
4
-
5
3
  interface Props {
6
4
  cachedAt: string | null;
7
5
  fixed?: boolean;
@@ -16,7 +16,7 @@
16
16
  * pink "▮▮" / dim "○" markers, and a marquee progress bar at the bottom
17
17
  * filling pink-on-dark as the run advances.
18
18
  */
19
- import React, { useEffect, useState } from "react";
19
+ import { useEffect, useState } from "react";
20
20
 
21
21
  const STAGES = [
22
22
  { label: "discovering transcripts", detail: "walking ~/.claude, ~/.codex, ~/.cursor, …" },
@@ -5,7 +5,6 @@
5
5
  * ✓ glyph · headline + sub · right-aligned metric. No card chrome,
6
6
  * no hover backgrounds, no checkmark backdrop.
7
7
  */
8
- import React from "react";
9
8
  import type { Strength } from "@/src/audit/strengths";
10
9
 
11
10
  interface Props {
@@ -255,155 +255,12 @@
255
255
  margin-right: 6px;
256
256
  }
257
257
 
258
- /* ───────────────────────── auth dialog (set-a-reminder gate) ───────────────────────── */
259
-
260
- .auth-dialog-backdrop {
261
- position: fixed; inset: 0; z-index: 10000;
262
- display: grid; place-items: center;
263
- padding: 32px 16px;
264
- background: rgba(8,8,10,0.7);
265
- backdrop-filter: blur(6px);
266
- -webkit-backdrop-filter: blur(6px);
267
- }
268
-
269
- .auth-dialog {
270
- position: relative;
271
- width: 100%;
272
- max-width: 420px;
273
- padding: 28px 28px 24px;
274
- border: 1px solid var(--line-2);
275
- background: var(--bg-2);
276
- font-family: var(--font-mono);
277
- color: var(--ink);
278
- }
279
-
280
- .auth-close {
281
- position: absolute; top: 12px; right: 14px;
282
- font-family: var(--font-mono); font-size: 20px;
283
- line-height: 1;
284
- color: var(--dim);
285
- background: transparent; border: none; padding: 4px 8px;
286
- cursor: pointer;
287
- transition: color 120ms;
288
- }
289
- .auth-close:hover { color: var(--accent-pink); }
290
- .auth-close:disabled { color: var(--line-2); cursor: not-allowed; }
291
-
292
- .auth-headline {
293
- font-family: var(--font-mono);
294
- font-size: 18px;
295
- font-weight: 600;
296
- letter-spacing: 0;
297
- line-height: 1.3;
298
- text-transform: none;
299
- color: var(--ink);
300
- margin: 0 0 8px;
301
- }
302
-
303
- .auth-sub {
304
- font-family: var(--font-mono); font-size: 12px;
305
- line-height: 1.55; color: var(--ink-2);
306
- margin: 0 0 18px;
307
- }
308
- .auth-sub .auth-email {
309
- color: var(--accent-pink);
310
- }
311
- .auth-sub .auth-ok {
312
- color: var(--accent-green);
313
- margin-right: 6px;
314
- }
315
-
316
- .auth-form { display: flex; flex-direction: column; gap: 10px; }
317
-
318
- .auth-field-label {
319
- font-family: var(--font-mono); font-size: 10px;
320
- letter-spacing: 0.22em; text-transform: uppercase;
321
- color: var(--accent-green);
322
- }
323
-
324
- .auth-input {
325
- width: 100%;
326
- padding: 11px 14px;
327
- background: var(--bg);
328
- border: 1px solid var(--line-2);
329
- color: var(--ink);
330
- font-family: var(--font-mono); font-size: 14px;
331
- letter-spacing: 0.03em;
332
- outline: none;
333
- transition: border-color 120ms, box-shadow 120ms;
334
- }
335
- .auth-input:focus {
336
- border-color: var(--accent-pink);
337
- box-shadow: 0 0 0 1px var(--accent-pink-soft);
338
- }
339
- .auth-input:disabled {
340
- opacity: 0.55; cursor: not-allowed;
341
- }
342
- .auth-input-code {
343
- letter-spacing: 0.5em;
344
- text-align: center;
345
- font-size: 18px;
346
- font-variant-numeric: tabular-nums;
347
- }
348
- .auth-input::placeholder { color: var(--dim); }
349
-
350
- .auth-error {
351
- font-family: var(--font-mono); font-size: 12px;
352
- color: var(--accent-pink);
353
- padding: 8px 12px;
354
- background: var(--accent-pink-bg);
355
- border: 1px solid var(--accent-pink);
356
- border-left-width: 3px;
357
- letter-spacing: 0.02em;
358
- margin-top: 4px;
359
- }
360
-
361
- .auth-actions {
362
- display: flex; gap: 10px; flex-wrap: wrap;
363
- margin-top: 14px;
364
- }
365
-
366
- .auth-btn {
367
- display: inline-flex; align-items: center; gap: 8px;
368
- padding: 10px 16px;
369
- font-family: var(--font-mono); font-size: 12px;
370
- letter-spacing: 0.06em;
371
- background: transparent;
372
- border: 1px solid var(--line-2);
373
- color: var(--ink);
374
- cursor: pointer;
375
- transition: all 120ms ease;
376
- }
377
- .auth-btn:hover:not(:disabled) {
378
- border-color: var(--ink); background: rgba(255,255,255,0.04);
379
- }
380
- .auth-btn:disabled { opacity: 0.45; cursor: not-allowed; }
381
- .auth-btn.primary {
382
- border-color: var(--accent-pink);
383
- color: var(--accent-pink);
384
- background: var(--accent-pink-bg);
385
- }
386
- .auth-btn.primary:hover:not(:disabled) {
387
- background: var(--accent-pink); color: var(--bg);
388
- }
389
-
390
- .auth-back {
391
- align-self: flex-start;
392
- margin-top: 4px;
393
- background: transparent; border: none; padding: 6px 0;
394
- font-family: var(--font-mono); font-size: 11px;
395
- letter-spacing: 0.1em; color: var(--dim);
396
- cursor: pointer;
397
- transition: color 120ms;
398
- }
399
- .auth-back:hover:not(:disabled) { color: var(--ink-2); }
400
- .auth-back:disabled { opacity: 0.45; cursor: not-allowed; }
401
-
402
- @media (max-width: 520px) {
403
- .auth-dialog { padding: 26px 22px 22px; }
404
- .auth-actions { flex-direction: column; align-items: stretch; }
405
- .auth-btn { justify-content: center; }
406
- }
258
+ /* ───────────────────────── auth dialog (set-a-reminder gate) ─────────────────────────
259
+ * The dialog's own styles moved to app/audit/_components/auth-dialog.css, which
260
+ * <AuthDialog> imports directly, so the modal is styled on every route that
261
+ * renders it (/audit and now /settings) rather than only this route stylesheet.
262
+ * The `.auth-status-pill` below stays here — it belongs to the /audit return
263
+ * CTA (come-back-better-section), not the dialog. */
407
264
 
408
265
  /* status pill in the return CTA: shows current logged-in email */
409
266
  .auth-status-pill {
@@ -0,0 +1,111 @@
1
+ "use client";
2
+
3
+ /**
4
+ * The dashboard's rendering of a paused machine.
5
+ *
6
+ * Split out of `hooks-client.tsx` because these are the pieces that keep the
7
+ * activity view honest: a row evaluated during a pause looks identical to one
8
+ * where every policy ran and allowed, and without saying so the log asserts a
9
+ * clean window over exactly the window that was not enforced.
10
+ */
11
+ import { useEffect, useState } from "react";
12
+ import { ShieldAlert, TriangleAlert } from "lucide-react";
13
+ import type { ActivePause } from "@/src/hooks/session-pause";
14
+
15
+ /** Compact "time left" for a future timestamp. */
16
+ export function formatRemaining(ms: number): string {
17
+ if (ms <= 0) return "expiring now";
18
+ // Sub-minute is checked before rounding: Math.round(30s) is "1m", which tells
19
+ // someone they have more time than they do. On a countdown to enforcement
20
+ // coming back, never round up.
21
+ if (ms < 60_000) return "under a minute";
22
+ const minutes = Math.round(ms / 60_000);
23
+ if (minutes < 60) return `${minutes}m`;
24
+ const hours = Math.floor(minutes / 60);
25
+ const rest = minutes % 60;
26
+ return rest === 0 ? `${hours}h` : `${hours}h${rest}m`;
27
+ }
28
+
29
+ /**
30
+ * Live state, not history: enforcement is paused RIGHT NOW.
31
+ *
32
+ * The rows below cannot carry this on their own — a pause set seconds ago has
33
+ * produced none yet, and that is precisely when someone needs telling that the
34
+ * machine is unguarded. An absent banner has to mean "enforcing", so this is fed
35
+ * from live pause state rather than inferred from whatever is on screen.
36
+ */
37
+ export function PausedBanner({ pauses, now: nowProp }: { pauses: ActivePause[]; now?: number }) {
38
+ const [tick, setTick] = useState(() => Date.now());
39
+ // Re-render on a timer so "22m left" does not sit frozen while the pause
40
+ // silently drains away.
41
+ useEffect(() => {
42
+ const id = setInterval(() => setTick(Date.now()), 30_000);
43
+ return () => clearInterval(id);
44
+ }, []);
45
+ const now = nowProp ?? tick;
46
+
47
+ // Filter again here rather than trusting the fetch: the list was accurate
48
+ // when it arrived, and a short pause can expire between polls.
49
+ const live = pauses.filter((p) => p.expiresAt > now);
50
+ if (live.length === 0) return null;
51
+ const soonest = live.reduce((a, b) => (a.expiresAt < b.expiresAt ? a : b));
52
+
53
+ return (
54
+ <div
55
+ role="status"
56
+ className="mb-4 flex items-start gap-2.5 rounded border border-amber-500/40 bg-amber-500/[0.07] px-3 py-2.5"
57
+ >
58
+ <ShieldAlert className="h-4 w-4 shrink-0 text-amber-500 mt-0.5" aria-hidden="true" />
59
+ <div className="text-xs leading-relaxed">
60
+ <p className="font-medium text-foreground">
61
+ Enforcement is paused for {live.length} session{live.length === 1 ? "" : "s"} —{" "}
62
+ {formatRemaining(soonest.expiresAt - now)} left
63
+ {live.length > 1 ? " on the next to expire" : ""}.
64
+ </p>
65
+ <p className="text-muted-foreground mt-0.5">
66
+ Builtin, custom and convention policies are suspended for{" "}
67
+ {live.length === 1 ? "that session" : "those sessions"}; cloud-managed policies keep
68
+ enforcing. It lifts on its own — or run{" "}
69
+ <span className="font-mono text-foreground">failproofai config --resume</span>.
70
+ </p>
71
+ </div>
72
+ </div>
73
+ );
74
+ }
75
+
76
+ /** Marks a row that was evaluated while enforcement was paused. */
77
+ export function PausedPill() {
78
+ return (
79
+ <span
80
+ title="Enforcement was paused for this session — local policies did not run"
81
+ className="ml-1.5 inline-flex items-center rounded px-1.5 py-0.5 text-[0.6rem] font-medium uppercase tracking-wide border border-amber-500/40 bg-amber-500/10 text-amber-600 dark:text-amber-500"
82
+ >
83
+ paused
84
+ </span>
85
+ );
86
+ }
87
+
88
+ /** Why an `allow` on this row proves nothing. */
89
+ export function PausedNote({
90
+ item,
91
+ }: {
92
+ item: { pausedBy?: string; pauseExpiresAt?: number };
93
+ }) {
94
+ if (!item.pausedBy) return null;
95
+ const lifted =
96
+ typeof item.pauseExpiresAt === "number"
97
+ ? new Date(item.pauseExpiresAt).toLocaleTimeString()
98
+ : null;
99
+ return (
100
+ <div className="sm:col-span-2 lg:col-span-3 mt-1 flex items-start gap-2 rounded border border-amber-500/30 bg-amber-500/5 px-2.5 py-2">
101
+ <TriangleAlert className="h-3.5 w-3.5 shrink-0 text-amber-500/80 mt-0.5" aria-hidden="true" />
102
+ <p className="text-[0.7rem] leading-relaxed text-muted-foreground">
103
+ <span className="font-medium text-foreground">Not enforced — paused.</span> Enforcement was
104
+ suspended for this session
105
+ {item.pausedBy === "cli" ? " from the CLI" : ` by ${item.pausedBy}`}
106
+ {lifted ? `, lifting at ${lifted}` : ""}. Builtin, custom and convention policies did not
107
+ run for this event; cloud-managed policies did.
108
+ </p>
109
+ </div>
110
+ );
111
+ }
@@ -5,7 +5,7 @@
5
5
  */
6
6
  "use client";
7
7
 
8
- import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
8
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
9
9
  import { useWindowVirtualizer } from "@tanstack/react-virtual";
10
10
  import { ChevronDown, Wrench } from "lucide-react";
11
11
  import type { LogEntry, ToolUseBlock } from "@/lib/log-entries";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useSyncExternalStore, useCallback, useEffect, useState } from "react";
3
+ import { useSyncExternalStore, useEffect, useState } from "react";
4
4
 
5
5
  interface Toast {
6
6
  id: number;