failproofai 1.0.0 → 1.0.1-beta.0

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 (238) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +0 -1
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +5 -5
  5. package/.next/standalone/.next/required-server-files.json +1 -1
  6. package/.next/standalone/.next/routes-manifest.json +0 -6
  7. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error/page.js +4 -3
  9. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  13. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
  14. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  15. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page.js +4 -3
  18. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  21. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  22. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  23. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
  24. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  25. package/.next/standalone/.next/server/app/api/audit/invite/route.js +2 -2
  26. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/audit/run/route.js +3 -3
  28. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/audit/status/route.js +2 -2
  30. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/auth/login-request/route.js +4 -3
  32. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +2 -2
  34. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/auth/logout/route.js +3 -2
  36. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/auth/status/route.js +4 -3
  38. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  41. package/.next/standalone/.next/server/app/audit/page.js +5 -3
  42. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/index.html +1 -1
  45. package/.next/standalone/.next/server/app/index.rsc +15 -15
  46. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
  47. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  48. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  49. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  50. package/.next/standalone/.next/server/app/page.js +4 -3
  51. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +10 -10
  54. package/.next/standalone/.next/server/app/policies/page.js +6 -5
  55. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  56. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  58. package/.next/standalone/.next/server/app/project/[name]/page.js +5 -4
  59. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  60. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  62. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  63. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +6 -4
  64. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  67. package/.next/standalone/.next/server/app/projects/page.js +5 -4
  68. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  69. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -4
  71. package/.next/standalone/.next/server/app/settings/page.js +6 -4
  72. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app-paths-manifest.json +0 -1
  75. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05ja_05._.js +3 -0
  76. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0agdw2a._.js +3 -0
  77. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0d1u_na._.js +1 -1
  78. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nne229._.js +3 -0
  79. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ny9q5d._.js +1 -1
  80. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0oy4kxb._.js +3 -0
  81. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zf034w._.js +3 -0
  82. package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +3 -0
  83. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1hstmft._.js +3 -0
  84. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1p8poxd._.js +3 -0
  85. package/.next/standalone/.next/server/chunks/_0lxbzdq._.js +1 -1
  86. package/.next/standalone/.next/server/chunks/_1ek68ln._.js +1 -1
  87. package/.next/standalone/.next/server/chunks/_1zuiiy3._.js +1 -1
  88. package/.next/standalone/.next/server/chunks/lib_telemetry_ts_0dctyyw._.js +1 -1
  89. package/.next/standalone/.next/server/chunks/{node_modules_posthog-node_dist_entrypoints_index_node_mjs_0jx6cp6._.js → node_modules_posthog-node_dist_entrypoints_index_node_mjs_0f-x2b0._.js} +1 -1
  90. package/.next/standalone/.next/server/chunks/{node_modules_posthog-node_dist_entrypoints_index_node_mjs_1f290jp._.js → node_modules_posthog-node_dist_entrypoints_index_node_mjs_0hwvl7e._.js} +1 -1
  91. package/.next/standalone/.next/server/chunks/{node_modules_posthog-node_dist_entrypoints_index_node_mjs_1g2ji1t._.js → node_modules_posthog-node_dist_entrypoints_index_node_mjs_1ctjdzl._.js} +1 -1
  92. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  93. package/.next/standalone/.next/server/chunks/src_hooks_fp-home_ts_09kv0bn._.js +3 -0
  94. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__03eykvd._.js +5 -0
  95. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__07175vb._.js → [root-of-the-server]__07oh8b5._.js} +1 -1
  96. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cxe_2_._.js +1 -1
  97. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g2rg69._.js +3 -0
  98. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kgy9da._.js +4 -0
  99. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0m98kzy._.js +4 -0
  100. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oa1lav._.js +3 -0
  101. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0sjzdjg._.js +3 -0
  102. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0spkm68._.js +2 -2
  103. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0v5_91z._.js +4 -0
  104. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1-a3135._.js +4 -0
  105. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1hvwiw8._.js → [root-of-the-server]__11z_299._.js} +1 -1
  106. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1apc90t._.js → [root-of-the-server]__15c_z97._.js} +1 -1
  107. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1wmno1q._.js → [root-of-the-server]__17d_ffl._.js} +1 -1
  108. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1_dfocn._.js +4 -0
  109. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1e5g_ur._.js +4 -0
  110. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1hmqefd._.js +4 -0
  111. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1jiwfsj._.js +1 -1
  112. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1kzapg5._.js +6 -0
  113. package/.next/standalone/.next/server/chunks/ssr/_04j57fb._.js +3 -0
  114. package/.next/standalone/.next/server/chunks/ssr/_05enntk._.js +3 -0
  115. package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +3 -0
  116. package/.next/standalone/.next/server/chunks/ssr/_0hom1s1._.js +3 -0
  117. package/.next/standalone/.next/server/chunks/ssr/_1nq-35m._.js +23 -0
  118. package/.next/standalone/.next/server/chunks/ssr/_1q7j05x._.js +3 -0
  119. package/.next/standalone/.next/server/chunks/ssr/_1ylae7o._.js +3 -0
  120. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +2 -2
  121. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  122. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +2 -2
  123. package/.next/standalone/.next/server/chunks/ssr/app_settings_settings-client_tsx_20lq-mq._.js +3 -0
  124. package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_1n3w9lb._.js +1 -1
  125. package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
  126. package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-config_ts_04t589g._.js +4 -0
  127. package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-home_ts_0je3xkv._.js +3 -0
  128. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  129. package/.next/standalone/.next/server/pages/404.html +1 -1
  130. package/.next/standalone/.next/server/pages/500.html +1 -1
  131. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/server-reference-manifest.json +15 -15
  133. package/.next/standalone/.next/static/chunks/00q6cfzuzpc85.js +1 -0
  134. package/.next/standalone/.next/static/chunks/{0zm3_8jpqitxy.js → 054eg7y_cjyf9.js} +22 -22
  135. package/.next/standalone/.next/static/chunks/{2ouq44jv_0x04.js → 0mjufa_0xxz75.js} +1 -1
  136. package/.next/standalone/.next/static/chunks/0u64yey446k4f.css +1 -0
  137. package/.next/standalone/.next/static/chunks/{0zi8zjav5a4rq.js → 1-oz4co31nvc5.js} +1 -1
  138. package/.next/standalone/.next/static/chunks/13--2yvqek_s1.js +1 -0
  139. package/.next/standalone/.next/static/chunks/136ldjmzxhush.js +1 -0
  140. package/.next/standalone/.next/static/chunks/18fqy3doo2ial.js +6 -0
  141. package/.next/standalone/.next/static/chunks/1eyl7fzkmnkf_.js +1 -0
  142. package/.next/standalone/.next/static/chunks/{31k3yxpy57_fy.js → 1o5sxp_mdaoci.js} +1 -1
  143. package/.next/standalone/.next/static/chunks/29-iqnp9v_axt.css +1 -0
  144. package/.next/standalone/.next/static/chunks/{2676v-lyzgo91.js → 2es4z1ei90vsv.js} +1 -1
  145. package/.next/standalone/.next/static/chunks/2k9f4tyv04809.css +1 -0
  146. package/.next/standalone/.next/static/chunks/3peix2vxzj7eh.js +1 -0
  147. package/.next/standalone/.next/static/chunks/3qfoeqhy5l10x.js +1 -0
  148. package/.next/standalone/.next/static/chunks/{0km-jn9o5xyqs.css → 3wq9x0c-7ld5d.css} +1 -1
  149. package/.next/standalone/app/actions/get-scheduled-audit.ts +65 -6
  150. package/.next/standalone/app/actions/update-scheduled-audit.ts +90 -17
  151. package/.next/standalone/app/api/auth/status/route.ts +7 -17
  152. package/.next/standalone/app/audit/_components/audit-dashboard.tsx +2 -6
  153. package/.next/standalone/app/audit/_components/come-back-better-section.tsx +101 -281
  154. package/.next/standalone/app/audit/_components/empty-state.tsx +2 -2
  155. package/.next/standalone/app/audit/_components/run-progress.tsx +1 -1
  156. package/.next/standalone/app/audit/audit-styles.css +150 -26
  157. package/.next/standalone/app/globals.css +39 -1
  158. package/.next/standalone/app/settings/page.tsx +38 -21
  159. package/.next/standalone/app/settings/settings-client.tsx +583 -392
  160. package/.next/standalone/app/settings/settings.css +354 -0
  161. package/.next/standalone/components/navbar.tsx +33 -4
  162. package/.next/standalone/lib/auth/api-server-client.ts +51 -29
  163. package/.next/standalone/lib/auth/auth-store.ts +44 -59
  164. package/.next/standalone/package.json +12 -10
  165. package/.next/standalone/server.js +1 -1
  166. package/bin/failproofai.mjs +6 -0
  167. package/bin/failproofaid-shim.mjs +0 -0
  168. package/dist/cli.mjs +1889 -426
  169. package/dist/worker.mjs +27 -5
  170. package/lib/auth/api-server-client.ts +51 -29
  171. package/lib/auth/auth-store.ts +44 -59
  172. package/package.json +12 -10
  173. package/scripts/docs-audit.ts +493 -0
  174. package/scripts/translate-docs/cli.ts +16 -2
  175. package/scripts/translate-docs/mdx-translator.ts +6 -1
  176. package/scripts/translate-docs/readme-translator.ts +4 -2
  177. package/src/audit/cli-login.ts +330 -0
  178. package/src/audit/cli.ts +124 -6
  179. package/src/audit/dashboard-cache.ts +44 -8
  180. package/src/audit/harm-report.ts +260 -0
  181. package/src/audit/machine-store.ts +120 -0
  182. package/src/audit/redact-example.ts +312 -0
  183. package/src/audit/report-harm.ts +167 -0
  184. package/src/audit/schedule-cli.ts +352 -0
  185. package/src/hooks/builtin-policies.ts +26 -0
  186. package/src/hooks/daemon-service.ts +76 -0
  187. package/src/hooks/fp-config.ts +96 -5
  188. package/src/hooks/fp-home.ts +118 -8
  189. package/src/hooks/fp-reset.ts +79 -9
  190. package/src/hooks/migrations.ts +241 -4
  191. package/src/hooks/tui.ts +61 -3
  192. package/.next/standalone/.next/server/app/api/auth/reminder/route/app-paths-manifest.json +0 -3
  193. package/.next/standalone/.next/server/app/api/auth/reminder/route/build-manifest.json +0 -12
  194. package/.next/standalone/.next/server/app/api/auth/reminder/route/server-reference-manifest.json +0 -4
  195. package/.next/standalone/.next/server/app/api/auth/reminder/route.js +0 -9
  196. package/.next/standalone/.next/server/app/api/auth/reminder/route.js.map +0 -5
  197. package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +0 -1
  198. package/.next/standalone/.next/server/app/api/auth/reminder/route_client-reference-manifest.js +0 -3
  199. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-xggru._.js +0 -3
  200. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00ds05_._.js +0 -3
  201. package/.next/standalone/.next/server/chunks/[root-of-the-server]__094p1f1._.js +0 -3
  202. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1dxagv_._.js +0 -3
  203. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1fgqj1_._.js +0 -3
  204. package/.next/standalone/.next/server/chunks/_084toou._.js +0 -3
  205. package/.next/standalone/.next/server/chunks/_0g4t8c9._.js +0 -3
  206. package/.next/standalone/.next/server/chunks/_0km521a._.js +0 -3
  207. package/.next/standalone/.next/server/chunks/_0t8kefc._.js +0 -3
  208. package/.next/standalone/.next/server/chunks/_16dwkfn._.js +0 -3
  209. package/.next/standalone/.next/server/chunks/_1phm9ui._.js +0 -3
  210. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_reminder_route_actions_1kjgxf8.js +0 -3
  211. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dk8r_l._.js +0 -3
  212. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kviq2m._.js +0 -3
  213. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ogyhu0._.js +0 -3
  214. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1-rfu32._.js +0 -5
  215. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1mmefsr._.js +0 -5
  216. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1t62w37._.js +0 -3
  217. package/.next/standalone/.next/server/chunks/ssr/_032wo7w._.js +0 -3
  218. package/.next/standalone/.next/server/chunks/ssr/_08840em._.js +0 -3
  219. package/.next/standalone/.next/server/chunks/ssr/_0gl2ujp._.js +0 -3
  220. package/.next/standalone/.next/server/chunks/ssr/_0j0ggkc._.js +0 -3
  221. package/.next/standalone/.next/server/chunks/ssr/_0kbv5-q._.js +0 -3
  222. package/.next/standalone/.next/server/chunks/ssr/_0r1jgvp._.js +0 -3
  223. package/.next/standalone/.next/server/chunks/ssr/_0t5xq1b._.js +0 -3
  224. package/.next/standalone/.next/server/chunks/ssr/_0w_be0g._.js +0 -3
  225. package/.next/standalone/.next/server/chunks/ssr/_15gba46._.js +0 -5
  226. package/.next/standalone/.next/server/chunks/ssr/_1qyhb9r._.js +0 -23
  227. package/.next/standalone/.next/server/chunks/ssr/_1vel2ey._.js +0 -3
  228. package/.next/standalone/.next/static/chunks/0wd503tv801gy.js +0 -1
  229. package/.next/standalone/.next/static/chunks/1hfocb0sdl85c.js +0 -1
  230. package/.next/standalone/.next/static/chunks/1v1gqvpjk62jm.js +0 -1
  231. package/.next/standalone/.next/static/chunks/2kopjq_or743g.js +0 -6
  232. package/.next/standalone/.next/static/chunks/2uvhw57mf9lg_.css +0 -2
  233. package/.next/standalone/.next/static/chunks/2ynl0-6aqng_b.js +0 -1
  234. package/.next/standalone/.next/static/chunks/3xvtgz6arztp_.js +0 -1
  235. package/.next/standalone/app/api/auth/reminder/route.ts +0 -213
  236. /package/.next/standalone/.next/static/{Aulh3DRWwRfwh2POCvZR_ → jSKB7CQQSNTX-uSbY2bUs}/_buildManifest.js +0 -0
  237. /package/.next/standalone/.next/static/{Aulh3DRWwRfwh2POCvZR_ → jSKB7CQQSNTX-uSbY2bUs}/_clientMiddlewareManifest.js +0 -0
  238. /package/.next/standalone/.next/static/{Aulh3DRWwRfwh2POCvZR_ → jSKB7CQQSNTX-uSbY2bUs}/_ssgManifest.js +0 -0
@@ -49,7 +49,7 @@ export function EmptyState({ mode, running, onStarted, onCompleted }: Props) {
49
49
  <div className="section-mast">
50
50
  <div className="section-label">
51
51
  <span className="glyph">━━</span> audit{" "}
52
- <span style={{ color: "var(--dim)" }}>·</span> first run
52
+ <span className="sep">·</span> first run
53
53
  </div>
54
54
  <div className="section-meta">
55
55
  <span style={{ color: "var(--dim)" }}>○</span> no cache yet
@@ -101,7 +101,7 @@ export function EmptyState({ mode, running, onStarted, onCompleted }: Props) {
101
101
  <div className="section-mast">
102
102
  <div className="section-label">
103
103
  <span className="glyph">━━</span> audit{" "}
104
- <span style={{ color: "var(--dim)" }}>·</span> zero transcripts
104
+ <span className="sep">·</span> zero transcripts
105
105
  </div>
106
106
  <div className="section-meta">
107
107
  <span style={{ color: "var(--amber)" }}>●</span> hooks not installed
@@ -55,7 +55,7 @@ export function RunProgress() {
55
55
  <div className="section-mast">
56
56
  <div className="section-label">
57
57
  <span className="glyph">━━</span> audit{" "}
58
- <span style={{ color: "var(--dim)" }}>·</span> in progress
58
+ <span className="sep">·</span> in progress
59
59
  </div>
60
60
  <div className="section-meta">
61
61
  <span style={{ color: "var(--accent-pink)" }}>●</span> scanning
@@ -211,7 +211,11 @@
211
211
  color: var(--accent-green);
212
212
  display: inline-flex; align-items: baseline; gap: 10px;
213
213
  }
214
- .section-label .glyph { color: var(--accent-pink); letter-spacing: -2px; }
214
+ /* Kept in step with globals.css, which declares the same selector: this file
215
+ * loads after it, so a value left behind here silently wins. The leader and
216
+ * separator inherit the label's colour — one label, one colour. */
217
+ .section-label .glyph { color: inherit; letter-spacing: -2px; }
218
+ .section-label .sep { color: inherit; }
215
219
  .section-meta {
216
220
  font-family: var(--font-mono);
217
221
  font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase;
@@ -904,8 +908,12 @@
904
908
  ============================================================ */
905
909
  .cbb-grid {
906
910
  display: grid;
907
- grid-template-columns: 1fr 1fr;
911
+ grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr);
908
912
  gap: 14px;
913
+ align-items: stretch;
914
+ }
915
+ @media (max-width: 720px) {
916
+ .cbb-grid { grid-template-columns: 1fr; }
909
917
  }
910
918
  .cbb-card {
911
919
  border: 1px solid var(--line-2);
@@ -927,42 +935,150 @@
927
935
  line-height: 1.55;
928
936
  }
929
937
 
930
- .cadence-row { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 2px; }
931
- .cadence-btn {
938
+ /* ── Section 05: scheduled audit panel ───────────────────────────────────────
939
+ The mock puts the scan controls at 1.3fr against the share card's 1fr, with
940
+ a pink rail on the panel that acts. Colours are the design-system tokens the
941
+ rest of the app already uses (--accent-pink #e4587c, --accent-green #66d1b5);
942
+ the mock's #ff2d78 / #35d07f were approximations of them. */
943
+ .cbb-card-primary {
944
+ border-left: 2px solid var(--accent-pink);
945
+ }
946
+ .cbb-card-head {
947
+ display: flex;
948
+ align-items: flex-start;
949
+ justify-content: space-between;
950
+ gap: 10px;
951
+ flex-wrap: wrap;
952
+ }
953
+ .cbb-pill {
932
954
  font-family: var(--font-mono);
933
- font-size: 11px;
934
- letter-spacing: 0.04em;
955
+ font-size: 9.5px;
956
+ letter-spacing: 0.1em;
957
+ padding: 4px 8px;
958
+ white-space: nowrap;
935
959
  border: 1px solid var(--line-2);
936
- background: transparent;
960
+ color: var(--dim);
961
+ }
962
+ .cbb-pill.on {
963
+ border-color: var(--accent-green-shadow);
964
+ color: var(--accent-green);
965
+ }
966
+
967
+ .cbb-row {
968
+ display: flex;
969
+ align-items: center;
970
+ gap: 10px;
971
+ font-family: var(--font-mono);
972
+ font-size: 12px;
937
973
  color: var(--ink);
938
- padding: 6px 12px;
974
+ line-height: 1.5;
975
+ }
976
+ .cbb-row-interval { gap: 9px; flex-wrap: wrap; }
977
+ .cbb-muted { color: var(--ink-2); }
978
+ .cbb-hint { color: var(--dim); font-size: 10.5px; }
979
+ .cbb-strong { color: var(--ink); }
980
+
981
+ .cbb-num {
982
+ font-family: var(--font-mono);
983
+ font-size: 12px;
984
+ width: 58px;
985
+ padding: 5px 10px;
986
+ background: var(--bg);
987
+ border: 1px solid var(--line-2);
988
+ color: var(--ink);
989
+ border-radius: 0;
990
+ }
991
+ .cbb-num:focus-visible {
992
+ outline: 2px solid var(--accent-pink);
993
+ outline-offset: 1px;
994
+ }
995
+
996
+ /* The switch /policies uses — copied shape, not a new control. */
997
+ .cbb-toggle {
998
+ position: relative;
999
+ flex: none;
1000
+ width: 34px;
1001
+ height: 18px;
1002
+ border-radius: 9px;
1003
+ border: none;
1004
+ background: var(--line-2);
939
1005
  cursor: pointer;
940
- transition: border-color 140ms ease, color 140ms ease, background-color 140ms ease;
1006
+ padding: 0;
1007
+ transition: background 120ms ease;
941
1008
  }
942
- .cadence-btn:hover {
943
- border-color: var(--accent-pink);
944
- color: var(--accent-pink);
1009
+ .cbb-toggle[data-on="true"] { background: var(--accent-pink); }
1010
+ .cbb-toggle:disabled { opacity: 0.5; cursor: not-allowed; }
1011
+ .cbb-toggle:focus-visible { outline: 2px solid var(--accent-pink); outline-offset: 2px; }
1012
+ .cbb-toggle-knob {
1013
+ position: absolute;
1014
+ top: 2px;
1015
+ left: 2px;
1016
+ width: 14px;
1017
+ height: 14px;
1018
+ border-radius: 50%;
1019
+ background: var(--bg);
1020
+ transition: transform 120ms ease;
945
1021
  }
946
- .cadence-btn.on {
947
- border-color: var(--accent-pink);
948
- background: var(--accent-pink-bg);
1022
+ .cbb-toggle[data-on="true"] .cbb-toggle-knob { transform: translateX(16px); }
1023
+
1024
+ .cbb-identity {
1025
+ font-family: var(--font-mono);
1026
+ font-size: 11px;
1027
+ color: var(--ink-2);
1028
+ display: flex;
1029
+ align-items: baseline;
1030
+ gap: 8px;
1031
+ flex-wrap: wrap;
1032
+ }
1033
+ .cbb-email { color: var(--accent-green); }
1034
+ .cbb-link-inline {
1035
+ font-size: 11px;
1036
+ color: var(--dim);
1037
+ text-decoration: underline;
1038
+ text-underline-offset: 2px;
1039
+ }
1040
+ .cbb-link-inline:hover { color: var(--ink); }
1041
+
1042
+ .cbb-warn {
1043
+ font-family: var(--font-mono);
1044
+ font-size: 11px;
1045
+ line-height: 1.6;
949
1046
  color: var(--accent-pink);
950
1047
  }
951
- .cadence-btn:disabled { opacity: 0.5; cursor: not-allowed; }
1048
+ .cbb-warn-inline { color: var(--accent-pink); }
952
1049
 
953
- .cbb-link {
954
- align-self: flex-start;
955
- background: transparent;
956
- border: none;
957
- color: var(--accent-green);
1050
+ .cbb-foot-block {
1051
+ border-top: 1px dashed var(--line);
1052
+ padding-top: 12px;
1053
+ margin-top: auto;
1054
+ display: flex;
1055
+ flex-direction: column;
1056
+ gap: 6px;
958
1057
  font-family: var(--font-mono);
959
1058
  font-size: 11px;
960
- letter-spacing: 0.04em;
1059
+ }
1060
+ .cbb-run-btn {
1061
+ margin-top: 6px;
1062
+ font-family: var(--font-mono);
1063
+ font-size: 12px;
1064
+ text-align: center;
1065
+ padding: 8px 12px;
1066
+ border: 1px solid var(--line-2);
1067
+ background: transparent;
1068
+ color: var(--ink);
961
1069
  cursor: pointer;
962
- padding: 0;
963
1070
  }
964
- .cbb-link:hover { color: var(--accent-pink); }
965
- .cbb-link:disabled { opacity: 0.55; cursor: wait; }
1071
+ .cbb-run-btn:hover:not(:disabled) { border-color: var(--accent-pink); color: var(--accent-pink); }
1072
+ .cbb-run-btn:disabled { opacity: 0.5; cursor: not-allowed; }
1073
+ .cbb-run-btn:focus-visible { outline: 2px solid var(--accent-pink); outline-offset: 2px; }
1074
+
1075
+ .cbb-note {
1076
+ font-family: var(--font-mono);
1077
+ font-size: 10.5px;
1078
+ color: var(--dim);
1079
+ line-height: 1.55;
1080
+ margin-top: 14px;
1081
+ }
966
1082
 
967
1083
  .perks-progress {
968
1084
  height: 6px;
@@ -1032,4 +1148,12 @@
1032
1148
  padding: 16px 0;
1033
1149
  }
1034
1150
  .quirks-thead { display: none; }
1035
- }
1151
+ }
1152
+ /* ── Section 05: the share card, now alone ───────────────────────────────────
1153
+ The scheduled-audit panel moved to /settings, so this is the only card in
1154
+ the section. Capped rather than left full-bleed: a single card stretched
1155
+ across the report width reads as an empty row with something in the corner,
1156
+ and the invite is a small ask that should look like one. */
1157
+ .share-card {
1158
+ max-width: 420px;
1159
+ }
@@ -245,6 +245,39 @@ input[type="date"] { color-scheme: dark; }
245
245
  }
246
246
  .h-actions { display: flex; align-items: center; gap: 8px; flex: none; }
247
247
 
248
+ /* Icon-only chrome control (settings). Sized to sit level with the refresh
249
+ group beside it, and dim until touched so the bar stays text-forward — the
250
+ icon is an affordance, not a highlight. */
251
+ .h-icon-btn {
252
+ display: inline-flex;
253
+ align-items: center;
254
+ justify-content: center;
255
+ width: 26px;
256
+ height: 26px;
257
+ color: var(--ink-2);
258
+ border: 1px solid transparent;
259
+ transition:
260
+ color 140ms cubic-bezier(0.22, 1, 0.36, 1),
261
+ border-color 140ms cubic-bezier(0.22, 1, 0.36, 1),
262
+ background-color 140ms cubic-bezier(0.22, 1, 0.36, 1);
263
+ }
264
+ .h-icon-btn:hover {
265
+ color: var(--ink);
266
+ border-color: var(--line-2);
267
+ background: rgba(255, 255, 255, 0.03);
268
+ }
269
+ .h-icon-btn.is-active {
270
+ color: var(--accent-pink);
271
+ border-color: var(--accent-pink);
272
+ }
273
+ .h-icon-btn:focus-visible {
274
+ outline: 2px solid var(--accent-pink);
275
+ outline-offset: 2px;
276
+ }
277
+ @media (prefers-reduced-motion: reduce) {
278
+ .h-icon-btn { transition: none; }
279
+ }
280
+
248
281
  /* header meta cluster (version + section label) — never wrap mid-token */
249
282
  .h-meta { display: flex; align-items: center; gap: 6px; white-space: nowrap; flex: none; }
250
283
  .h-version {
@@ -371,7 +404,12 @@ input[type="date"] { color-scheme: dark; }
371
404
  color: var(--accent-green);
372
405
  display: inline-flex; align-items: baseline; gap: 10px;
373
406
  }
374
- .section-label .glyph { color: var(--accent-pink); letter-spacing: -2px; }
407
+ /* The leader and the separator take the label's own colour rather than each
408
+ * carrying their own. A three-colour eyebrow (pink rule, dim dot, mint text)
409
+ * read as three things happening on one line instead of one label; the line
410
+ * names a section, which is a single fact, so it is a single colour. */
411
+ .section-label .glyph { color: inherit; letter-spacing: -2px; }
412
+ .section-label .sep { color: inherit; }
375
413
  .section-meta {
376
414
  font-family: var(--font-mono);
377
415
  font-size: 12px; letter-spacing: 0.18em; text-transform: uppercase;
@@ -1,31 +1,48 @@
1
- /**
2
- * /settings — one page, sections. The single home for the machine-level
3
- * controls the design plan collected here: the scheduled local audit and
4
- * emailed audit reports.
5
- *
6
- * Deliberately NOT a home for telemetry: the product decision is that telemetry
7
- * is documented but not advertised in-product, so there is no telemetry control
8
- * or status on this page. `config.toml` plus the docs are the whole story.
9
- *
10
- * Thin server wrapper (Suspense boundary + the disabled-pages gate every route
11
- * uses); all the reads/writes live in the client and its server actions.
12
- */
13
- import { Suspense } from "react";
1
+ import type { Metadata } from "next";
14
2
  import { notFound } from "next/navigation";
3
+ import {
4
+ getScheduledAuditAction,
5
+ type ScheduledAuditView,
6
+ } from "@/app/actions/get-scheduled-audit";
15
7
  import SettingsClient from "./settings-client";
16
8
 
9
+ export const metadata: Metadata = {
10
+ title: "settings · failproof_ai",
11
+ description: "Scheduled audits for this machine.",
12
+ };
13
+
17
14
  export const dynamic = "force-dynamic";
18
15
 
16
+ /**
17
+ * Machine-scoped settings.
18
+ *
19
+ * The state is read HERE, on the server, and handed to the client as its
20
+ * initial value — rather than fetched from a `useEffect` after mount. The
21
+ * difference is visible: with a client-side load the page paints "off. nothing
22
+ * runs and nothing is sent." and then flips to the truth a moment later, so a
23
+ * page whose whole job is to tell you whether a security feature is on spends
24
+ * its first frame telling you the opposite. It reads from local files, so there
25
+ * is no latency argument for deferring it either.
26
+ *
27
+ * `force-dynamic` because that state is `~/.failproofai/config.json` and the
28
+ * daemon's status — a cached render would show a stale machine.
29
+ */
19
30
  export default async function SettingsPage() {
31
+ // Same gate the audit, policies and projects pages carry. It was dropped in
32
+ // the rewrite, and this is the page that least deserves to lose it: it shows
33
+ // the address digests go to and can sign the machine out, on a dashboard an
34
+ // operator may deliberately be exposing beyond localhost.
20
35
  const disabled = (process.env.FAILPROOFAI_DISABLE_PAGES ?? "")
21
- .split(",")
22
- .map((s) => s.trim())
23
- .filter(Boolean);
36
+ .split(",").map((s) => s.trim()).filter(Boolean);
24
37
  if (disabled.includes("settings")) notFound();
25
38
 
26
- return (
27
- <Suspense>
28
- <SettingsClient />
29
- </Suspense>
30
- );
39
+ let initial: ScheduledAuditView | null = null;
40
+ try {
41
+ initial = await getScheduledAuditAction();
42
+ } catch {
43
+ // Left null; the client renders the unreadable-config message. Throwing
44
+ // here would replace a page that can explain itself with an error boundary
45
+ // that cannot.
46
+ }
47
+ return <SettingsClient initial={initial} />;
31
48
  }