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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +0 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +5 -5
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/routes-manifest.json +0 -6
- package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js +4 -3
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +4 -3
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/audit/invite/route.js +2 -2
- package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/run/route.js +3 -3
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/status/route.js +2 -2
- package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js +4 -3
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +2 -2
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +3 -2
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route.js +4 -3
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page.js +5 -3
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js +4 -3
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +10 -10
- package/.next/standalone/.next/server/app/policies/page.js +6 -5
- package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js +5 -4
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js +6 -4
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js +5 -4
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -4
- package/.next/standalone/.next/server/app/settings/page.js +6 -4
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +0 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__05ja_05._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0agdw2a._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0d1u_na._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nne229._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ny9q5d._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0oy4kxb._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zf034w._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1hstmft._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1p8poxd._.js +3 -0
- package/.next/standalone/.next/server/chunks/_0lxbzdq._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1ek68ln._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1zuiiy3._.js +1 -1
- package/.next/standalone/.next/server/chunks/lib_telemetry_ts_0dctyyw._.js +1 -1
- 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
- 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
- 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
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_hooks_fp-home_ts_09kv0bn._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__03eykvd._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__07175vb._.js → [root-of-the-server]__07oh8b5._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cxe_2_._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g2rg69._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kgy9da._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0m98kzy._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oa1lav._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0sjzdjg._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0spkm68._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0v5_91z._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1-a3135._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1hvwiw8._.js → [root-of-the-server]__11z_299._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1apc90t._.js → [root-of-the-server]__15c_z97._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1wmno1q._.js → [root-of-the-server]__17d_ffl._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1_dfocn._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1e5g_ur._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1hmqefd._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1jiwfsj._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1kzapg5._.js +6 -0
- package/.next/standalone/.next/server/chunks/ssr/_04j57fb._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_05enntk._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0hom1s1._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1nq-35m._.js +23 -0
- package/.next/standalone/.next/server/chunks/ssr/_1q7j05x._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1ylae7o._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_settings_settings-client_tsx_20lq-mq._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_1n3w9lb._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-config_ts_04t589g._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-home_ts_0je3xkv._.js +3 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +15 -15
- package/.next/standalone/.next/static/chunks/00q6cfzuzpc85.js +1 -0
- package/.next/standalone/.next/static/chunks/{0zm3_8jpqitxy.js → 054eg7y_cjyf9.js} +22 -22
- package/.next/standalone/.next/static/chunks/{2ouq44jv_0x04.js → 0mjufa_0xxz75.js} +1 -1
- package/.next/standalone/.next/static/chunks/0u64yey446k4f.css +1 -0
- package/.next/standalone/.next/static/chunks/{0zi8zjav5a4rq.js → 1-oz4co31nvc5.js} +1 -1
- package/.next/standalone/.next/static/chunks/13--2yvqek_s1.js +1 -0
- package/.next/standalone/.next/static/chunks/136ldjmzxhush.js +1 -0
- package/.next/standalone/.next/static/chunks/18fqy3doo2ial.js +6 -0
- package/.next/standalone/.next/static/chunks/1eyl7fzkmnkf_.js +1 -0
- package/.next/standalone/.next/static/chunks/{31k3yxpy57_fy.js → 1o5sxp_mdaoci.js} +1 -1
- package/.next/standalone/.next/static/chunks/29-iqnp9v_axt.css +1 -0
- package/.next/standalone/.next/static/chunks/{2676v-lyzgo91.js → 2es4z1ei90vsv.js} +1 -1
- package/.next/standalone/.next/static/chunks/2k9f4tyv04809.css +1 -0
- package/.next/standalone/.next/static/chunks/3peix2vxzj7eh.js +1 -0
- package/.next/standalone/.next/static/chunks/3qfoeqhy5l10x.js +1 -0
- package/.next/standalone/.next/static/chunks/{0km-jn9o5xyqs.css → 3wq9x0c-7ld5d.css} +1 -1
- package/.next/standalone/app/actions/get-scheduled-audit.ts +65 -6
- package/.next/standalone/app/actions/update-scheduled-audit.ts +90 -17
- package/.next/standalone/app/api/auth/status/route.ts +7 -17
- package/.next/standalone/app/audit/_components/audit-dashboard.tsx +2 -6
- package/.next/standalone/app/audit/_components/come-back-better-section.tsx +101 -281
- package/.next/standalone/app/audit/_components/empty-state.tsx +2 -2
- package/.next/standalone/app/audit/_components/run-progress.tsx +1 -1
- package/.next/standalone/app/audit/audit-styles.css +150 -26
- package/.next/standalone/app/globals.css +39 -1
- package/.next/standalone/app/settings/page.tsx +38 -21
- package/.next/standalone/app/settings/settings-client.tsx +583 -392
- package/.next/standalone/app/settings/settings.css +354 -0
- package/.next/standalone/components/navbar.tsx +33 -4
- package/.next/standalone/lib/auth/api-server-client.ts +51 -29
- package/.next/standalone/lib/auth/auth-store.ts +44 -59
- package/.next/standalone/package.json +12 -10
- package/.next/standalone/server.js +1 -1
- package/bin/failproofai.mjs +6 -0
- package/bin/failproofaid-shim.mjs +0 -0
- package/dist/cli.mjs +1889 -426
- package/dist/worker.mjs +27 -5
- package/lib/auth/api-server-client.ts +51 -29
- package/lib/auth/auth-store.ts +44 -59
- package/package.json +12 -10
- package/scripts/docs-audit.ts +493 -0
- package/scripts/translate-docs/cli.ts +16 -2
- package/scripts/translate-docs/mdx-translator.ts +6 -1
- package/scripts/translate-docs/readme-translator.ts +4 -2
- package/src/audit/cli-login.ts +330 -0
- package/src/audit/cli.ts +124 -6
- package/src/audit/dashboard-cache.ts +44 -8
- package/src/audit/harm-report.ts +260 -0
- package/src/audit/machine-store.ts +120 -0
- package/src/audit/redact-example.ts +312 -0
- package/src/audit/report-harm.ts +167 -0
- package/src/audit/schedule-cli.ts +352 -0
- package/src/hooks/builtin-policies.ts +26 -0
- package/src/hooks/daemon-service.ts +76 -0
- package/src/hooks/fp-config.ts +96 -5
- package/src/hooks/fp-home.ts +118 -8
- package/src/hooks/fp-reset.ts +79 -9
- package/src/hooks/migrations.ts +241 -4
- package/src/hooks/tui.ts +61 -3
- package/.next/standalone/.next/server/app/api/auth/reminder/route/app-paths-manifest.json +0 -3
- package/.next/standalone/.next/server/app/api/auth/reminder/route/build-manifest.json +0 -12
- package/.next/standalone/.next/server/app/api/auth/reminder/route/server-reference-manifest.json +0 -4
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js +0 -9
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.map +0 -5
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/auth/reminder/route_client-reference-manifest.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-xggru._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__00ds05_._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__094p1f1._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1dxagv_._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1fgqj1_._.js +0 -3
- package/.next/standalone/.next/server/chunks/_084toou._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0g4t8c9._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0km521a._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0t8kefc._.js +0 -3
- package/.next/standalone/.next/server/chunks/_16dwkfn._.js +0 -3
- package/.next/standalone/.next/server/chunks/_1phm9ui._.js +0 -3
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_reminder_route_actions_1kjgxf8.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dk8r_l._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kviq2m._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ogyhu0._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1-rfu32._.js +0 -5
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1mmefsr._.js +0 -5
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1t62w37._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_032wo7w._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_08840em._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0gl2ujp._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0j0ggkc._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0kbv5-q._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0r1jgvp._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0t5xq1b._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0w_be0g._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_15gba46._.js +0 -5
- package/.next/standalone/.next/server/chunks/ssr/_1qyhb9r._.js +0 -23
- package/.next/standalone/.next/server/chunks/ssr/_1vel2ey._.js +0 -3
- package/.next/standalone/.next/static/chunks/0wd503tv801gy.js +0 -1
- package/.next/standalone/.next/static/chunks/1hfocb0sdl85c.js +0 -1
- package/.next/standalone/.next/static/chunks/1v1gqvpjk62jm.js +0 -1
- package/.next/standalone/.next/static/chunks/2kopjq_or743g.js +0 -6
- package/.next/standalone/.next/static/chunks/2uvhw57mf9lg_.css +0 -2
- package/.next/standalone/.next/static/chunks/2ynl0-6aqng_b.js +0 -1
- package/.next/standalone/.next/static/chunks/3xvtgz6arztp_.js +0 -1
- package/.next/standalone/app/api/auth/reminder/route.ts +0 -213
- /package/.next/standalone/.next/static/{Aulh3DRWwRfwh2POCvZR_ → jSKB7CQQSNTX-uSbY2bUs}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{Aulh3DRWwRfwh2POCvZR_ → jSKB7CQQSNTX-uSbY2bUs}/_clientMiddlewareManifest.js +0 -0
- /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
|
|
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
|
|
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
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
931
|
-
.
|
|
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:
|
|
934
|
-
letter-spacing: 0.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1006
|
+
padding: 0;
|
|
1007
|
+
transition: background 120ms ease;
|
|
941
1008
|
}
|
|
942
|
-
.
|
|
943
|
-
|
|
944
|
-
|
|
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
|
-
.
|
|
947
|
-
|
|
948
|
-
|
|
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
|
-
.
|
|
1048
|
+
.cbb-warn-inline { color: var(--accent-pink); }
|
|
952
1049
|
|
|
953
|
-
.cbb-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
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
|
-
|
|
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-
|
|
965
|
-
.cbb-
|
|
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
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
}
|