failproofai 1.0.0-beta.5 → 1.0.0-beta.7
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 +2 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/routes-manifest.json +6 -0
- 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 +3 -1
- 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 +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- 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 +3 -1
- 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/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- 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 +3 -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 +4 -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 +1 -1
- 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 +2 -1
- 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 +3 -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/reminder/route.js +3 -2
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route.js +3 -2
- 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 +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 +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
- 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 +3 -1
- 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 +4 -2
- 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 +4 -2
- 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 +4 -2
- 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/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/settings/page/build-manifest.json +18 -0
- package/.next/standalone/.next/server/app/settings/page/next-font-manifest.json +6 -0
- package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +53 -0
- package/.next/standalone/.next/server/app/settings/page.js +18 -0
- package/.next/standalone/.next/server/app/settings/page.js.map +5 -0
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app-paths-manifest.json +2 -1
- package/.next/standalone/.next/server/chunks/{[externals]__1nl3dvw._.js → [externals]__0r-zamh._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06hexd0._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__094p1f1._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_0xu5z._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ed01_d._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g0vcwt._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0h3lfmp._.js → [root-of-the-server]__0ky_n0r._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__18d-9oi._.js → [root-of-the-server]__0lk_935._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1p7s8-d._.js → [root-of-the-server]__0pbp9fe._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q-v9z2._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__10oa-v9._.js → [root-of-the-server]__0v2fpxe._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0sb_5m8._.js → [root-of-the-server]__131ebum._.js} +3 -3
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0-dh5jy._.js → [root-of-the-server]__1_ps0jw._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0l4vuqm._.js → [root-of-the-server]__1a7i2q4._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ibjy5x._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1iny24d._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tvn4wf._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1tyedjt._.js +3 -0
- package/.next/standalone/.next/server/chunks/_0lxbzdq._.js +5 -0
- package/.next/standalone/.next/server/chunks/_1zuiiy3._.js +5 -0
- package/.next/standalone/.next/server/chunks/lib_telemetry_ts_0dctyyw._.js +5 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +5 -5
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__06bp_fg._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__074qmkp._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0c_qcgp._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kbc9bs._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0spkm68._.js +10 -10
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1a2hcb_._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0rtdfof._.js → [root-of-the-server]__1rdruw4._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1rv-sc9._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1tyf0tc._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1u-wx42._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1v185mo._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0rag5dg._.js → [root-of-the-server]__1yw368c._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0-yi74u._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_04mekdy._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0r-dsre._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0rjgfln._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0se484m._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0uz7o9y._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_194yh9u._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1fahg9e._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1gmzkwj._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/_1w8sola._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1w_6p9g._.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/node_modules_next_dist_esm_build_templates_app-page_0dwo94s.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-config_ts_04t589g._.js +5 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/middleware.js +2 -2
- 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 +54 -12
- package/.next/standalone/.next/static/chunks/0945ybz3fsvba.js +1 -0
- package/.next/standalone/.next/static/chunks/{0cr85wuc9gc9k.js → 0gr76ps8_zm26.js} +1 -1
- package/.next/standalone/.next/static/chunks/{2cqk4a9s893oy.js → 0m-m7wgtxdoav.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1tp9dex23zs8y.js → 11l6oh9cyb35a.js} +1 -1
- package/.next/standalone/.next/static/chunks/166f8qnh03jqc.js +6 -0
- package/.next/standalone/.next/static/chunks/1bm0q12hgs22l.css +2 -0
- package/.next/standalone/.next/static/chunks/1v1gqvpjk62jm.js +1 -0
- package/.next/standalone/.next/static/chunks/{2s9g1dsde_ts1.js → 2aej0vi1fm87m.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1bkynffp3q1f7.js → 2bxld6-rym3ah.js} +22 -22
- package/.next/standalone/.next/static/chunks/{2v1rpzrh2i1wv.js → 2p2kz4aj1tooj.js} +1 -1
- package/.next/standalone/.next/static/chunks/2uvhw57mf9lg_.css +2 -0
- package/.next/standalone/.next/static/chunks/36pc3_8fpb6ic.js +1 -0
- package/.next/standalone/.next/static/chunks/{2k285z07qce47.js → 3t1wr_kx6brwc.js} +1 -1
- package/.next/standalone/app/actions/get-hooks-config.ts +2 -1
- package/.next/standalone/app/actions/get-scheduled-audit.ts +70 -0
- package/.next/standalone/app/actions/update-scheduled-audit.ts +44 -0
- package/.next/standalone/app/api/audit/run/route.ts +28 -0
- package/.next/standalone/app/api/audit/status/route.ts +13 -1
- package/.next/standalone/app/api/auth/status/route.ts +1 -1
- package/.next/standalone/app/audit/_components/auth-dialog.css +159 -0
- package/.next/standalone/app/audit/_components/auth-dialog.tsx +3 -0
- package/.next/standalone/app/audit/audit-styles.css +6 -149
- package/.next/standalone/app/settings/page.tsx +31 -0
- package/.next/standalone/app/settings/settings-client.tsx +488 -0
- package/.next/standalone/components/navbar.tsx +2 -0
- package/.next/standalone/lib/auth/api-server-client.ts +2 -3
- package/.next/standalone/lib/auth/auth-store.ts +4 -4
- package/.next/standalone/lib/codex-sessions.ts +2 -1
- package/.next/standalone/lib/dashboard-host.ts +101 -0
- package/.next/standalone/lib/install-check.ts +22 -7
- package/.next/standalone/lib/pi-sessions.ts +99 -14
- package/.next/standalone/lib/telemetry-enabled.ts +54 -0
- package/.next/standalone/lib/telemetry-id.ts +52 -1
- package/.next/standalone/lib/telemetry.ts +8 -4
- package/.next/standalone/node_modules/react/cjs/react.development.js +1 -1
- package/.next/standalone/node_modules/react/cjs/react.production.js +1 -1
- package/.next/standalone/node_modules/react/package.json +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.browser.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.edge.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom-server.node.production.js +3 -3
- package/.next/standalone/node_modules/react-dom/cjs/react-dom.production.js +1 -1
- package/.next/standalone/node_modules/react-dom/package.json +4 -4
- package/.next/standalone/package.json +7 -6
- package/.next/standalone/proxy.ts +89 -1
- package/.next/standalone/server.js +1 -1
- package/bin/failproofai.mjs +202 -86
- package/dist/cli.mjs +17803 -15346
- package/dist/worker.mjs +1620 -257
- package/lib/auth/api-server-client.ts +2 -3
- package/lib/auth/auth-store.ts +4 -4
- package/lib/codex-sessions.ts +2 -1
- package/lib/dashboard-host.ts +101 -0
- package/lib/install-check.ts +22 -7
- package/lib/pi-sessions.ts +99 -14
- package/lib/telemetry-enabled.ts +54 -0
- package/lib/telemetry-id.ts +52 -1
- package/lib/telemetry.ts +8 -4
- package/package.json +7 -6
- package/scripts/install-telemetry.mjs +8 -1
- package/scripts/launch.ts +25 -3
- package/scripts/parse-script-args.ts +17 -1
- package/scripts/prune-standalone.mjs +20 -0
- package/scripts/translate-docs/readme-translator.ts +163 -4
- package/scripts/validate-mdx.ts +153 -13
- package/src/audit/audit-lock.ts +285 -0
- package/src/audit/audit-schedule.ts +111 -0
- package/src/audit/cache.ts +18 -4
- package/src/audit/cli-adapters/goose.ts +2 -1
- package/src/audit/cli-adapters/hermes.ts +28 -10
- package/src/audit/cli.ts +191 -35
- package/src/audit/dashboard-cache.ts +2 -1
- package/src/hooks/builtin-policies.ts +100 -3
- package/src/hooks/cloud-connection.ts +160 -14
- package/src/hooks/cloud-enrollment-cli.ts +119 -21
- package/src/hooks/cloud-enrollment.ts +87 -17
- package/src/hooks/cloud-introspect.ts +147 -0
- package/src/hooks/cloud-managed-policies.ts +33 -2
- package/src/hooks/collector-config.ts +25 -43
- package/src/hooks/configure-wizard.ts +750 -318
- package/src/hooks/custom-hooks-loader.ts +125 -11
- package/src/hooks/daemon-client.ts +83 -17
- package/src/hooks/daemon-download.ts +54 -2
- package/src/hooks/daemon-service.ts +605 -29
- package/src/hooks/first-run-gate.ts +39 -0
- package/src/hooks/fp-config.ts +497 -0
- package/src/hooks/fp-home.ts +355 -0
- package/src/hooks/fp-reset.ts +332 -0
- package/src/hooks/handler.ts +42 -1
- package/src/hooks/hook-activity-store.ts +35 -20
- package/src/hooks/hook-logger.ts +2 -1
- package/src/hooks/hook-telemetry.ts +5 -1
- package/src/hooks/hooks-config.ts +4 -3
- package/src/hooks/loader-utils.ts +166 -5
- package/src/hooks/manager.ts +5 -4
- package/src/hooks/onboarding-attempt.ts +179 -0
- package/src/hooks/onboarding-lock.ts +119 -0
- package/src/hooks/policy-types.ts +0 -7
- package/src/hooks/session-pause-cli.ts +15 -13
- package/src/hooks/session-pause.ts +36 -4
- package/src/hooks/setup-state.ts +256 -0
- package/src/hooks/tui.ts +4 -4
- package/src/hooks/worker-server.ts +53 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0f8nu8d._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0szqzl8._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__19120tr._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1fwl2mz._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1myjm-d._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rhmvod._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02r5bgf._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__094nop3._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e8sjqm._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0lkzqax._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ls0gsr._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n_uvv0._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qucxyj._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0u02miy._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__14dd6h8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1gak4pd._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1j4u3yd._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1zqz4v8._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/_1m_p7pi._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_html-to-image_es_index_12c_2cz.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1ezd2jf._.js +0 -5
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1tnuifj._.js +0 -5
- package/.next/standalone/.next/static/chunks/0h7auy7hzjyhw.js +0 -1
- package/.next/standalone/.next/static/chunks/1bw4dfzflelcv.js +0 -1
- package/.next/standalone/.next/static/chunks/34sjdw8lv46e3.js +0 -6
- package/.next/standalone/.next/static/chunks/3i27c3hcriawq.css +0 -1
- package/.next/standalone/.next/static/chunks/3zdwnnthucs_1.css +0 -2
- package/.next/standalone/Cargo.lock +0 -2222
- package/.next/standalone/Cargo.toml +0 -9
- package/.next/standalone/crates/CLOUD_POLICIES.md +0 -136
- package/.next/standalone/crates/PROTOCOL.md +0 -122
- package/.next/standalone/crates/failproofaid/Cargo.toml +0 -25
- package/.next/standalone/crates/failproofaid/src/cloud_client.rs +0 -484
- package/.next/standalone/crates/failproofaid/src/cloud_policies.rs +0 -921
- package/.next/standalone/crates/failproofaid/src/lock.rs +0 -81
- package/.next/standalone/crates/failproofaid/src/main.rs +0 -639
- package/.next/standalone/crates/failproofaid/src/paths.rs +0 -201
- package/.next/standalone/crates/failproofaid/src/server.rs +0 -502
- package/.next/standalone/crates/failproofaid/src/worker.rs +0 -400
- package/.next/standalone/crates/failproofaid/tests/daemon_e2e.rs +0 -241
- package/.next/standalone/crates/fpai-collect/Cargo.toml +0 -43
- package/.next/standalone/crates/fpai-collect/src/config.rs +0 -420
- package/.next/standalone/crates/fpai-collect/src/cursor.rs +0 -520
- package/.next/standalone/crates/fpai-collect/src/delivery.rs +0 -472
- package/.next/standalone/crates/fpai-collect/src/filetail.rs +0 -487
- package/.next/standalone/crates/fpai-collect/src/health.rs +0 -369
- package/.next/standalone/crates/fpai-collect/src/lib.rs +0 -34
- package/.next/standalone/crates/fpai-collect/src/redact.rs +0 -516
- package/.next/standalone/crates/fpai-collect/src/sources/claude/mod.rs +0 -279
- package/.next/standalone/crates/fpai-collect/src/sources/claude/transform.rs +0 -619
- package/.next/standalone/crates/fpai-collect/src/sources/codex/mod.rs +0 -156
- package/.next/standalone/crates/fpai-collect/src/sources/codex/transform.rs +0 -715
- package/.next/standalone/crates/fpai-collect/src/sources/copilot/mod.rs +0 -158
- package/.next/standalone/crates/fpai-collect/src/sources/copilot/transform.rs +0 -512
- package/.next/standalone/crates/fpai-collect/src/sources/goose/mod.rs +0 -511
- package/.next/standalone/crates/fpai-collect/src/sources/goose/transform.rs +0 -586
- package/.next/standalone/crates/fpai-collect/src/sources/hermes/mod.rs +0 -318
- package/.next/standalone/crates/fpai-collect/src/sources/hermes/transform.rs +0 -579
- package/.next/standalone/crates/fpai-collect/src/sources/hooks/mod.rs +0 -314
- package/.next/standalone/crates/fpai-collect/src/sources/hooks/transform.rs +0 -448
- package/.next/standalone/crates/fpai-collect/src/sources/mod.rs +0 -23
- package/.next/standalone/crates/fpai-collect/src/sources/openclaw/mod.rs +0 -176
- package/.next/standalone/crates/fpai-collect/src/sources/openclaw/transform.rs +0 -500
- package/.next/standalone/crates/fpai-collect/src/sources/opencode/mod.rs +0 -315
- package/.next/standalone/crates/fpai-collect/src/sources/opencode/transform.rs +0 -493
- package/.next/standalone/crates/fpai-collect/src/sources/pi/mod.rs +0 -201
- package/.next/standalone/crates/fpai-collect/src/sources/pi/transform.rs +0 -533
- package/.next/standalone/crates/fpai-collect/src/spool.rs +0 -535
- package/.next/standalone/crates/fpai-collect/src/sqlitepoll.rs +0 -390
- package/.next/standalone/crates/fpai-collect/src/supervisor.rs +0 -423
- package/.next/standalone/crates/fpai-collect/src/uploader.rs +0 -600
- package/.next/standalone/crates/fpai-collect/tests/claude_source.rs +0 -739
- package/.next/standalone/crates/fpai-collect/tests/claude_subagents.rs +0 -394
- package/.next/standalone/crates/fpai-collect/tests/codex_source.rs +0 -976
- package/.next/standalone/crates/fpai-collect/tests/config.rs +0 -286
- package/.next/standalone/crates/fpai-collect/tests/copilot_source.rs +0 -1020
- package/.next/standalone/crates/fpai-collect/tests/delivery.rs +0 -281
- package/.next/standalone/crates/fpai-collect/tests/goose_source.rs +0 -1009
- package/.next/standalone/crates/fpai-collect/tests/hermes_source.rs +0 -1130
- package/.next/standalone/crates/fpai-collect/tests/hooks_source.rs +0 -622
- package/.next/standalone/crates/fpai-collect/tests/openclaw_source.rs +0 -855
- package/.next/standalone/crates/fpai-collect/tests/opencode_source.rs +0 -1478
- package/.next/standalone/crates/fpai-collect/tests/pi_source.rs +0 -1192
- package/.next/standalone/crates/fpai-collect/tests/supervisor.rs +0 -290
- package/.next/standalone/crates/fpai-collect/tests/uploader.rs +0 -506
- package/.next/standalone/crates/fpai-ipc/Cargo.toml +0 -16
- package/.next/standalone/crates/fpai-ipc/src/envelope.rs +0 -175
- package/.next/standalone/crates/fpai-ipc/src/framing.rs +0 -177
- package/.next/standalone/crates/fpai-ipc/src/lib.rs +0 -10
- package/.next/standalone/crates/fpai-ipc/src/peer.rs +0 -80
- package/.next/standalone/docker-hook-sync/Dockerfile +0 -79
- package/.next/standalone/docker-hook-sync/entrypoint.sh +0 -109
- package/.next/standalone/integration-suite/Dockerfile +0 -47
- package/.next/standalone/integration-suite/README.md +0 -129
- package/.next/standalone/integration-suite/canary-policies.mjs +0 -45
- package/.next/standalone/integration-suite/capture-tokens.sh +0 -48
- package/.next/standalone/integration-suite/ci-entrypoint.sh +0 -179
- package/.next/standalone/integration-suite/inject-tokens.sh +0 -44
- package/.next/standalone/integration-suite/install-clis.sh +0 -136
- package/.next/standalone/integration-suite/probe-cli.sh +0 -248
- package/.next/standalone/integration-suite/report.js +0 -120
- package/.next/standalone/integration-suite/run.sh +0 -159
- package/.next/standalone/openclaw-plugin/index.js +0 -223
- package/.next/standalone/openclaw-plugin/openclaw.plugin.json +0 -6
- package/.next/standalone/openclaw-plugin/package.json +0 -12
- package/.next/standalone/osv-scanner.toml +0 -17
- package/.next/standalone/pi-extension/index.ts +0 -524
- package/.next/standalone/pi-extension/package.json +0 -12
- package/.next/standalone/postcss.config.mjs +0 -8
- package/.next/standalone/readme-arch-hq.gif +0 -0
- package/.next/standalone/rust-toolchain.toml +0 -4
- package/src/auth/cli.ts +0 -371
- /package/.next/standalone/.next/static/{LOuwMmfomO6hQYfMQYs4K → LUaLkKg40nSkHrIajexIk}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{LOuwMmfomO6hQYfMQYs4K → LUaLkKg40nSkHrIajexIk}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{LOuwMmfomO6hQYfMQYs4K → LUaLkKg40nSkHrIajexIk}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,8734,e=>{"use strict";let t=(0,e.i(56420).default)("copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);e.s(["Copy",0,t],8734)},89664,e=>{"use strict";let t=(0,e.i(56420).default)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);e.s(["Check",0,t],89664)},24380,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(8734),o=e.i(89664),l=e.i(47163);function u(e){let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t);try{return t.select(),document.execCommand("copy")}finally{document.body.removeChild(t)}}e.s(["CopyButton",0,function({text:e,className:i}){let[a,s]=(0,r.useState)(!1),c=(0,r.useRef)(void 0);(0,r.useEffect)(()=>()=>{c.current&&clearTimeout(c.current)},[]);let d=(0,r.useCallback)(()=>{c.current&&clearTimeout(c.current),s(!0),c.current=setTimeout(()=>s(!1),2e3)},[]),f=(0,r.useCallback)(async()=>{try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(e);else if(!u(e))throw Error("Both clipboard methods failed");d()}catch(t){console.error("Failed to copy to clipboard:",t);try{u(e)&&d()}catch{}}},[e,d]);return(0,t.jsx)("button",{type:"button",onClick:f,title:"Copy to clipboard",className:(0,l.cn)("inline-flex items-center justify-center rounded p-1 text-muted-foreground hover:text-foreground hover:bg-muted/80 transition-colors",i),children:a?(0,t.jsx)(o.Check,{className:"w-3.5 h-3.5 text-green-500"}):(0,t.jsx)(n.Copy,{className:"w-3.5 h-3.5"})})}])},67585,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"BailoutToCSR",{enumerable:!0,get:function(){return o}});let n=e.r(32061);function o({reason:e,children:t}){if("u"<typeof window)throw Object.defineProperty(new n.BailoutToCSRError(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return t}},9885,(e,t,r)=>{"use strict";function n(e){return e.split("/").map(e=>encodeURIComponent(e)).join("/")}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"encodeURIPath",{enumerable:!0,get:function(){return n}})},52157,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"PreloadChunks",{enumerable:!0,get:function(){return a}});let n=e.r(43476),o=e.r(74080),l=e.r(63599),u=e.r(9885),i=e.r(43369);function a({moduleIds:e}){if("u">typeof window)return null;let t=l.workAsyncStorage.getStore();if(void 0===t)return null;let r=[];if(t.reactLoadableManifest&&e){let n=t.reactLoadableManifest;for(let t of e){if(!n[t])continue;let e=n[t].files;r.push(...e)}}if(0===r.length)return null;let s=(0,i.getAssetTokenQuery)();return(0,n.jsx)(n.Fragment,{children:r.map(e=>{let r=`${t.assetPrefix}/_next/${(0,u.encodeURIPath)(e)}${s}`;return e.endsWith(".css")?(0,n.jsx)("link",{precedence:"dynamic",href:r,rel:"stylesheet",as:"style",nonce:t.nonce},e):((0,o.preload)(r,{as:"script",fetchPriority:"low",nonce:t.nonce}),null)})})}},69093,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return s}});let n=e.r(43476),o=e.r(71645),l=e.r(67585),u=e.r(52157);function i(e){return{default:e&&"default"in e?e.default:e}}let a={loader:()=>Promise.resolve(i(()=>null)),loading:null,ssr:!0},s=function(e){let t={...a,...e},r=(0,o.lazy)(()=>t.loader().then(i)),s=t.loading;function c(e){let i=s?(0,n.jsx)(s,{isLoading:!0,pastDelay:!0,error:null}):null,a=!t.ssr||!!t.loading,c=a?o.Suspense:o.Fragment,d=t.ssr?(0,n.jsxs)(n.Fragment,{children:["u"<typeof window?(0,n.jsx)(u.PreloadChunks,{moduleIds:t.modules}):null,(0,n.jsx)(r,{...e})]}):(0,n.jsx)(l.BailoutToCSR,{reason:"next/dynamic",children:(0,n.jsx)(r,{...e})});return(0,n.jsx)(c,{...a?{fallback:i}:{},children:d})}return c.displayName="LoadableComponent",c}},70703,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return o}});let n=e.r(55682)._(e.r(69093));function o(e,t){let r={};"function"==typeof e&&(r.loader=e);let o={...r,...t};return(0,n.default)({...o,modules:o.loadableGenerated?.modules})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},69186,e=>{"use strict";var t=e.i(43476);let r=(0,e.i(70703).default)(()=>e.A(79348),{loadableGenerated:{modules:[5780]},ssr:!1,loading:()=>(0,t.jsx)("div",{className:"bg-card border border-border rounded-lg p-4 shadow-sm",children:(0,t.jsx)("div",{className:"flex items-center justify-center py-16",children:(0,t.jsx)("div",{className:"animate-pulse text-muted-foreground",children:"Loading log viewer..."})})})});e.s(["default",0,function({entries:e,projectName:n,sessionId:o}){return(0,t.jsx)(r,{entries:e,projectName:n,sessionId:o})}])},79348,e=>{e.v(t=>Promise.all(["static/chunks/
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,8734,e=>{"use strict";let t=(0,e.i(56420).default)("copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);e.s(["Copy",0,t],8734)},89664,e=>{"use strict";let t=(0,e.i(56420).default)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);e.s(["Check",0,t],89664)},24380,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(8734),o=e.i(89664),l=e.i(47163);function u(e){let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t);try{return t.select(),document.execCommand("copy")}finally{document.body.removeChild(t)}}e.s(["CopyButton",0,function({text:e,className:i}){let[a,s]=(0,r.useState)(!1),c=(0,r.useRef)(void 0);(0,r.useEffect)(()=>()=>{c.current&&clearTimeout(c.current)},[]);let d=(0,r.useCallback)(()=>{c.current&&clearTimeout(c.current),s(!0),c.current=setTimeout(()=>s(!1),2e3)},[]),f=(0,r.useCallback)(async()=>{try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(e);else if(!u(e))throw Error("Both clipboard methods failed");d()}catch(t){console.error("Failed to copy to clipboard:",t);try{u(e)&&d()}catch{}}},[e,d]);return(0,t.jsx)("button",{type:"button",onClick:f,title:"Copy to clipboard",className:(0,l.cn)("inline-flex items-center justify-center rounded p-1 text-muted-foreground hover:text-foreground hover:bg-muted/80 transition-colors",i),children:a?(0,t.jsx)(o.Check,{className:"w-3.5 h-3.5 text-green-500"}):(0,t.jsx)(n.Copy,{className:"w-3.5 h-3.5"})})}])},67585,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"BailoutToCSR",{enumerable:!0,get:function(){return o}});let n=e.r(32061);function o({reason:e,children:t}){if("u"<typeof window)throw Object.defineProperty(new n.BailoutToCSRError(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return t}},9885,(e,t,r)=>{"use strict";function n(e){return e.split("/").map(e=>encodeURIComponent(e)).join("/")}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"encodeURIPath",{enumerable:!0,get:function(){return n}})},52157,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"PreloadChunks",{enumerable:!0,get:function(){return a}});let n=e.r(43476),o=e.r(74080),l=e.r(63599),u=e.r(9885),i=e.r(43369);function a({moduleIds:e}){if("u">typeof window)return null;let t=l.workAsyncStorage.getStore();if(void 0===t)return null;let r=[];if(t.reactLoadableManifest&&e){let n=t.reactLoadableManifest;for(let t of e){if(!n[t])continue;let e=n[t].files;r.push(...e)}}if(0===r.length)return null;let s=(0,i.getAssetTokenQuery)();return(0,n.jsx)(n.Fragment,{children:r.map(e=>{let r=`${t.assetPrefix}/_next/${(0,u.encodeURIPath)(e)}${s}`;return e.endsWith(".css")?(0,n.jsx)("link",{precedence:"dynamic",href:r,rel:"stylesheet",as:"style",nonce:t.nonce},e):((0,o.preload)(r,{as:"script",fetchPriority:"low",nonce:t.nonce}),null)})})}},69093,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return s}});let n=e.r(43476),o=e.r(71645),l=e.r(67585),u=e.r(52157);function i(e){return{default:e&&"default"in e?e.default:e}}let a={loader:()=>Promise.resolve(i(()=>null)),loading:null,ssr:!0},s=function(e){let t={...a,...e},r=(0,o.lazy)(()=>t.loader().then(i)),s=t.loading;function c(e){let i=s?(0,n.jsx)(s,{isLoading:!0,pastDelay:!0,error:null}):null,a=!t.ssr||!!t.loading,c=a?o.Suspense:o.Fragment,d=t.ssr?(0,n.jsxs)(n.Fragment,{children:["u"<typeof window?(0,n.jsx)(u.PreloadChunks,{moduleIds:t.modules}):null,(0,n.jsx)(r,{...e})]}):(0,n.jsx)(l.BailoutToCSR,{reason:"next/dynamic",children:(0,n.jsx)(r,{...e})});return(0,n.jsx)(c,{...a?{fallback:i}:{},children:d})}return c.displayName="LoadableComponent",c}},70703,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return o}});let n=e.r(55682)._(e.r(69093));function o(e,t){let r={};"function"==typeof e&&(r.loader=e);let o={...r,...t};return(0,n.default)({...o,modules:o.loadableGenerated?.modules})}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},69186,e=>{"use strict";var t=e.i(43476);let r=(0,e.i(70703).default)(()=>e.A(79348),{loadableGenerated:{modules:[5780]},ssr:!1,loading:()=>(0,t.jsx)("div",{className:"bg-card border border-border rounded-lg p-4 shadow-sm",children:(0,t.jsx)("div",{className:"flex items-center justify-center py-16",children:(0,t.jsx)("div",{className:"animate-pulse text-muted-foreground",children:"Loading log viewer..."})})})});e.s(["default",0,function({entries:e,projectName:n,sessionId:o}){return(0,t.jsx)(r,{entries:e,projectName:n,sessionId:o})}])},79348,e=>{e.v(t=>Promise.all(["static/chunks/3t1wr_kx6brwc.js","static/chunks/0m-m7wgtxdoav.js"].map(t=>e.l(t))).then(()=>t(5780)))}]);
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
.auth-dialog-backdrop{z-index:10000;-webkit-backdrop-filter:blur(6px);background:#08080ab3;place-items:center;padding:32px 16px;display:grid;position:fixed;inset:0}.auth-dialog{border:1px solid var(--line-2);background:var(--bg-2);width:100%;max-width:420px;font-family:var(--font-mono);color:var(--ink);padding:28px 28px 24px;position:relative}.auth-close{font-family:var(--font-mono);color:var(--dim);cursor:pointer;background:0 0;border:none;padding:4px 8px;font-size:20px;line-height:1;transition:color .12s;position:absolute;top:12px;right:14px}.auth-close:hover{color:var(--accent-pink)}.auth-close:disabled{color:var(--line-2);cursor:not-allowed}.auth-headline{font-family:var(--font-mono);letter-spacing:0;text-transform:none;color:var(--ink);margin:0 0 8px;font-size:18px;font-weight:600;line-height:1.3}.auth-sub{font-family:var(--font-mono);color:var(--ink-2);margin:0 0 18px;font-size:12px;line-height:1.55}.auth-sub .auth-email{color:var(--accent-pink)}.auth-sub .auth-ok{color:var(--accent-green);margin-right:6px}.auth-form{flex-direction:column;gap:10px;display:flex}.auth-field-label{font-family:var(--font-mono);letter-spacing:.22em;text-transform:uppercase;color:var(--accent-green);font-size:10px}.auth-input{background:var(--bg);border:1px solid var(--line-2);width:100%;color:var(--ink);font-family:var(--font-mono);letter-spacing:.03em;outline:none;padding:11px 14px;font-size:14px;transition:border-color .12s,box-shadow .12s}.auth-input:focus{border-color:var(--accent-pink);box-shadow:0 0 0 1px var(--accent-pink-soft)}.auth-input:disabled{opacity:.55;cursor:not-allowed}.auth-input-code{letter-spacing:.5em;text-align:center;font-variant-numeric:tabular-nums;font-size:18px}.auth-input::placeholder{color:var(--dim)}.auth-error{font-family:var(--font-mono);color:var(--accent-pink);background:var(--accent-pink-bg);border:1px solid var(--accent-pink);letter-spacing:.02em;border-left-width:3px;margin-top:4px;padding:8px 12px;font-size:12px}.auth-actions{flex-wrap:wrap;gap:10px;margin-top:14px;display:flex}.auth-btn{font-family:var(--font-mono);letter-spacing:.06em;border:1px solid var(--line-2);color:var(--ink);cursor:pointer;background:0 0;align-items:center;gap:8px;padding:10px 16px;font-size:12px;transition:all .12s;display:inline-flex}.auth-btn:hover:not(:disabled){border-color:var(--ink);background:#ffffff0a}.auth-btn:disabled{opacity:.45;cursor:not-allowed}.auth-btn.primary{border-color:var(--accent-pink);color:var(--accent-pink);background:var(--accent-pink-bg)}.auth-btn.primary:hover:not(:disabled){background:var(--accent-pink);color:var(--bg)}.auth-back{font-family:var(--font-mono);letter-spacing:.1em;color:var(--dim);cursor:pointer;background:0 0;border:none;align-self:flex-start;margin-top:4px;padding:6px 0;font-size:11px;transition:color .12s}.auth-back:hover:not(:disabled){color:var(--ink-2)}.auth-back:disabled{opacity:.45;cursor:not-allowed}@media (max-width:520px){.auth-dialog{padding:26px 22px 22px}.auth-actions{flex-direction:column;align-items:stretch}.auth-btn{justify-content:center}}
|
|
2
|
+
.empty-section,.running-section{padding-top:80px;padding-bottom:96px}.empty-panel,.running-panel{background:var(--bg-2);border:1px solid var(--line-2);flex-direction:column;padding:48px 56px;display:flex}.empty-glyph{text-align:center;align-self:center;margin-bottom:28px}.empty-glyph-grid{border:1px solid var(--line-2);background:var(--bg);grid-template-rows:repeat(6,14px);grid-template-columns:repeat(6,14px);gap:3px;margin:0 auto 14px;padding:16px;display:grid}.empty-glyph-grid .px{background:0 0}.empty-glyph-grid .px.on{background:var(--accent-pink)}.empty-glyph-label{font-family:var(--font-mono);letter-spacing:.22em;text-transform:uppercase;color:var(--dim);font-size:11px}.empty-headline{font-family:var(--font-display);letter-spacing:.1em;text-transform:lowercase;color:var(--ink);text-wrap:balance;text-align:center;margin:0 0 16px;font-size:clamp(32px,4.6vw,48px);line-height:1.05}.empty-sub{font-family:var(--font-mono);color:var(--ink-2);text-align:center;max-width:580px;margin:0 auto 32px;font-size:14px;line-height:1.65}.empty-actions{flex-direction:column;align-items:center;gap:12px;display:flex}.empty-cta{letter-spacing:.08em;padding:12px 24px;font-size:14px;text-decoration:none}.empty-meta{font-family:var(--font-mono);letter-spacing:.15em;text-transform:uppercase;color:var(--dim);font-size:11px}.running-panel{padding:36px 40px}.running-header{border-bottom:1px dashed var(--line);font-family:var(--font-mono);align-items:center;gap:10px;margin-bottom:22px;padding-bottom:18px;font-size:13px;display:flex}.running-prompt{color:var(--accent-green)}.running-cmd{color:var(--ink);letter-spacing:.02em}.running-cursor{color:var(--accent-pink);margin-left:4px;animation:.9s steps(2,end) infinite cursor-blink}@keyframes cursor-blink{50%{opacity:0}}.running-stages{flex-direction:column;margin:0 0 28px;padding:0;list-style:none;display:flex}.running-stage{border-bottom:1px dashed var(--line);font-family:var(--font-mono);grid-template-columns:28px 1fr auto;align-items:start;gap:14px;padding:12px 0;display:grid}.running-stage:last-child{border-bottom:none}.running-marker{font-family:var(--font-mono);letter-spacing:-1px;margin-top:1px;font-size:12px}.running-stage.queued{color:var(--dim)}.running-stage.queued .running-marker{color:var(--line-2)}.running-stage.active{color:var(--ink)}.running-stage.active .running-marker{color:var(--accent-pink)}.running-stage.done{color:var(--ink-2)}.running-stage.done .running-marker{color:var(--accent-green)}.running-stage.done .running-stage-label{text-decoration:line-through;-webkit-text-decoration-color:var(--line-2);text-decoration-color:var(--line-2)}.running-stage-label{letter-spacing:.04em;font-size:13px}.running-stage-detail{color:var(--ink-2);letter-spacing:.02em;margin-top:4px;font-size:11px}.running-stage-spin{font-family:var(--font-mono);color:var(--accent-pink);align-self:center;font-size:16px;animation:.7s steps(4,end) infinite spin-step}@keyframes spin-step{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.running-bar-label{font-family:var(--font-mono);letter-spacing:.22em;text-transform:uppercase;color:var(--ink-2);justify-content:space-between;margin-bottom:8px;font-size:10px;display:flex}.running-bar-track{background:var(--bg);border:1px solid var(--line);height:6px;position:relative;overflow:hidden}.running-bar-fill{background:linear-gradient(90deg, var(--accent-pink) 0%, #e89aaf 100%);height:100%;transition:width .6s cubic-bezier(.22,1,.36,1);position:relative}.running-bar-fill:after{content:"";background:linear-gradient(90deg,#0000 0% 40%,#ffffff59 50%,#0000 60% 100%);animation:1.6s linear infinite bar-shine;position:absolute;inset:0}@keyframes bar-shine{0%{transform:translate(-100%)}to{transform:translate(100%)}}.running-foot{font-family:var(--font-mono);letter-spacing:.05em;color:var(--dim);text-align:center;margin-top:22px;font-size:11px}@media (max-width:720px){.empty-panel,.running-panel{padding:32px 24px}}.report{width:100%;max-width:clamp(720px,92vw,1480px);margin:0 auto;padding:0 clamp(20px,3vw,48px)}.section{border-bottom:1px solid var(--line);padding:64px 0;position:relative}.section:last-child{border-bottom:none}.section-mast{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:24px;margin-bottom:28px;display:flex}.section-label{font-family:var(--font-mono);letter-spacing:.2em;text-transform:uppercase;color:var(--accent-green);align-items:baseline;gap:10px;font-size:11px;display:inline-flex}.section-label .glyph{color:var(--accent-pink);letter-spacing:-2px}.section-meta{font-family:var(--font-mono);letter-spacing:.18em;text-transform:uppercase;color:var(--dim);font-size:11px}.section-meta .g{color:var(--accent-green)}.section-meta .p{color:var(--accent-pink)}.section-h{font-family:var(--font-display);letter-spacing:.11em;color:var(--ink);text-transform:lowercase;text-wrap:balance;margin:0 0 18px;font-size:clamp(28px,4vw,44px);font-weight:400;line-height:1.05}.report-footer{border-top:1px solid var(--line);background:var(--bg);text-align:center;font-family:var(--font-mono);letter-spacing:.15em;text-transform:uppercase;color:var(--dim);padding:48px 32px 24px;font-size:11px}.report-footer--fixed{z-index:10;padding:16px 32px;position:fixed;bottom:0;left:0;right:0}.report-footer .brand-mark{color:var(--accent-pink);font-family:var(--font-mono);letter-spacing:-2px;margin-right:6px;font-size:14px;font-weight:700}.auth-status-pill{border:1px dashed var(--line-2);font-family:var(--font-mono);letter-spacing:.1em;color:var(--ink-2);align-items:center;gap:8px;margin-top:16px;padding:6px 10px;font-size:11px;display:inline-flex}.auth-status-pill .dot{background:var(--accent-green);width:7px;height:7px;display:inline-block;box-shadow:0 0 6px #66d1b58c}.auth-status-pill .email{color:var(--accent-green)}@media (max-width:960px){.report{padding:0 20px}.archetype-frame{padding:32px 24px}.arch-body{grid-template-columns:1fr;gap:32px}.arch-meta-grid,.score-grid{grid-template-columns:1fr;gap:16px}.finding-body{grid-template-columns:1fr}.finding-block{border-right:none!important}.policies-grid,.share-grid{grid-template-columns:1fr}.strength-row{grid-template-columns:40px 1fr}.strength-metric{text-align:left;grid-column:2;margin-top:6px}.return-hook{padding:28px 24px}}@media (prefers-reduced-motion:reduce){.running-cursor,.running-stage-spin,.running-bar-fill:after,.auth-status-pill .dot{animation:none}.running-bar-fill{transition:none}}.audit-progress-strip{z-index:60;background:var(--bg-2);border-bottom:1px solid var(--accent-pink);font-family:var(--font-mono);animation:.22s cubic-bezier(.22,1,.36,1) audit-progress-slide-in;position:sticky;top:0;left:0;right:0}.audit-progress-strip--failed{border-bottom-color:var(--accent-pink);background:linear-gradient(to right, var(--accent-pink-bg), var(--bg-2))}.audit-progress-strip__inner{justify-content:space-between;align-items:center;gap:16px;max-width:1480px;margin:0 auto;padding:12px clamp(20px,3vw,48px);display:flex;position:relative}.audit-progress-strip__label{color:var(--ink);letter-spacing:.06em;text-transform:lowercase;align-items:center;gap:10px;font-size:12px;display:inline-flex}.audit-progress-strip--failed .audit-progress-strip__label{color:var(--accent-pink)}.audit-progress-strip__elapsed{font-variant-numeric:tabular-nums;color:var(--accent-pink);letter-spacing:.08em;font-size:12px}.audit-progress-strip__spinner{border:1.5px solid var(--accent-pink);background:0 0;border-top-color:#0000;border-radius:50%;width:9px;height:9px;animation:.8s linear infinite audit-progress-spin}.audit-progress-strip__x{border:1px solid var(--accent-pink);width:14px;height:14px;color:var(--accent-pink);justify-content:center;align-items:center;font-size:11px;line-height:1;display:inline-flex}.audit-progress-strip__dismiss{border:1px solid var(--line-2);color:var(--ink-2);font-family:var(--font-mono);text-transform:lowercase;letter-spacing:.06em;cursor:pointer;background:0 0;padding:5px 10px;font-size:11px;transition:border-color .14s,color .14s}.audit-progress-strip__dismiss:hover{border-color:var(--accent-pink);color:var(--accent-pink)}.audit-progress-strip__pulse{background:linear-gradient(90deg, transparent 0%, var(--accent-pink) 20%, var(--accent-pink) 80%, transparent 100%);transform-origin:0;height:1px;animation:2.4s cubic-bezier(.55,.1,.45,.9) infinite audit-progress-pulse;position:absolute;bottom:-1px;left:0;right:0}@keyframes audit-progress-spin{to{transform:rotate(360deg)}}@keyframes audit-progress-pulse{0%{opacity:.4;transform:scaleX(0)translate(0%)}50%{opacity:1;transform:scaleX(.6)translate(20%)}to{opacity:.2;transform:scaleX(0)translate(100%)}}@keyframes audit-progress-slide-in{0%{opacity:0;transform:translateY(-100%)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.audit-progress-strip{animation:none}.audit-progress-strip__spinner{border-top-color:var(--accent-pink);animation:none}.audit-progress-strip__pulse{opacity:.4;animation:none;transform:scaleX(.4)translate(30%)}}.poster-section{border-bottom:1px solid var(--line);flex-direction:column;gap:14px;height:calc(100vh - 52px);padding:20px 0 16px;display:flex}.poster{border:1px dashed var(--accent-pink-soft);background:var(--bg-2);flex-direction:column;flex:auto;width:100%;max-width:980px;min-height:0;margin:0 auto;padding:22px 40px;display:flex;position:relative;overflow:hidden}.poster-head{flex:none}.poster-body{flex:auto}.poster-foot{flex:none}.poster-head{border-bottom:1px dashed var(--line);font-family:var(--font-mono);letter-spacing:.04em;flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:18px;padding-bottom:12px;font-size:14px;display:flex}.poster-wordmark{color:var(--ink);align-items:center;gap:8px;display:inline-flex}.poster-wordmark .poster-logo{width:auto;height:18px;display:block}.poster-wordmark .poster-sep{color:var(--dim);margin:0 2px}.poster-meta{color:var(--dim)}.poster-meta .poster-ix{color:var(--accent-pink)}.poster-meta .of,.poster-meta .poster-sep{color:var(--dim)}.poster-body{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:clamp(14px,2.6vh,30px);min-height:0;padding:clamp(6px,1.4vh,16px) 0;display:flex}.poster-sigil .sigil{background:var(--bg);border:1px solid var(--line-2);grid-template-rows:repeat(8,clamp(10px,1.7vh,16px));grid-template-columns:repeat(8,clamp(10px,1.7vh,16px));gap:2px;padding:clamp(6px,1vh,10px);display:grid}.poster-persona{flex-direction:column;align-items:center;gap:clamp(6px,1.2vh,14px);min-width:0;display:flex}.poster-persona .persona-name{font-family:var(--font-display);letter-spacing:.03em;color:var(--ink);text-transform:lowercase;text-wrap:balance;margin:0;font-size:clamp(32px,6.5vh,64px);line-height:.95}.poster-persona .persona-keywords{font-family:var(--font-display);letter-spacing:.06em;text-transform:lowercase;font-size:clamp(16px,2.2vh,22px)}.poster-persona .persona-keywords .kw-0{color:var(--accent-green)}.poster-persona .persona-keywords .kw-1{color:var(--ink)}.poster-persona .persona-keywords .kw-2{color:var(--accent-pink)}.poster-persona .persona-keywords .kw-sep{color:var(--dim);margin:0 10px}.poster-persona .persona-rarity{font-family:var(--font-mono);color:var(--accent-green);letter-spacing:.02em;font-size:clamp(11px,1.3vh,13px)}.poster-persona .persona-rarity .lbl{color:var(--dim)}.poster-persona .persona-rarity .pct{color:var(--accent-pink);font-weight:600}.poster-score{justify-content:center;align-items:baseline;gap:clamp(10px,1.4vh,16px);display:flex}.poster-score .score-n{font-family:var(--font-mono);letter-spacing:-.02em;color:var(--accent-pink);font-variant-numeric:tabular-nums;font-size:clamp(56px,11vh,112px);font-weight:700;line-height:1}.poster-score .score-of{font-family:var(--font-mono);color:var(--dim);letter-spacing:.04em;font-size:clamp(16px,2vh,22px);line-height:1}.poster-sigil .sigil .px{background:0 0}.poster-sigil .sigil .px.on{background:var(--ink)}.poster-sigil .sigil .px.p{background:var(--accent-pink)}.poster-sigil .sigil .px.g{background:var(--accent-green)}.poster-sigil .sigil .px.d{background:var(--dim)}.poster-foot{border-top:1px dashed var(--line);font-family:var(--font-mono);justify-content:space-between;align-items:baseline;padding-top:10px;font-size:14px;display:flex}.poster-brand{color:var(--ink);letter-spacing:.04em;text-shadow:0 0 6px #ffffff80,0 0 14px #ffffff38}.poster-cta{color:var(--accent-green);letter-spacing:.04em}.poster-cta .arrow{color:var(--accent-pink);margin:0 4px}.poster-cta .cta-cmd{text-shadow:0 0 6px #66d1b599,0 0 14px #66d1b54d}.poster-share-row{flex:none;grid-template-columns:repeat(3,1fr);gap:10px;max-width:980px;margin:0 auto;display:grid}.poster-share-btn{border:1px solid var(--line-2);background:var(--bg-2);color:var(--ink);font-family:var(--font-mono);letter-spacing:.04em;cursor:pointer;justify-content:center;align-items:center;gap:10px;padding:12px 16px;font-size:12px;transition:border-color .14s,color .14s,background .14s;display:inline-flex}.poster-share-btn:hover{border-color:var(--accent-pink);color:var(--accent-pink);background:var(--accent-pink-bg)}.poster-share-btn:disabled{opacity:.55;cursor:wait}.poster-share-btn:focus-visible,.cadence-btn:focus-visible,.invite-btn:focus-visible,.install-all-btn:focus-visible,.copy-icon-btn:focus-visible,.fix-install-btn:focus-visible{outline:2px solid var(--accent-pink);outline-offset:2px}.poster-share-btn .mark{color:var(--accent-pink);font-weight:700}.poster-scroll-hint{text-align:center;font-family:var(--font-mono);letter-spacing:.22em;text-transform:uppercase;color:var(--dim);flex:none;margin:0;font-size:10px}.poster-scroll-hint .arrow{color:var(--accent-pink);margin-left:6px}@media (max-width:720px){.poster{padding:24px 22px}.poster-body{gap:28px;padding:12px 0}.poster-share-row{grid-template-columns:1fr}.poster-head{font-size:12px}.poster-score .score-n{font-size:clamp(72px,18vw,120px)}.poster-persona .persona-name{font-size:clamp(36px,9vw,56px)}}.audit-sec{border-bottom:1px solid var(--line);padding:48px 0}.audit-sec:last-child{border-bottom:none}.audit-sec-head{justify-content:space-between;align-items:baseline;gap:16px;margin-bottom:6px;display:flex}.audit-sec-eyebrow{font-family:var(--font-mono);letter-spacing:.2em;text-transform:uppercase;color:var(--accent-green);font-size:11px}.audit-sec-eyebrow .ix{color:var(--dim);margin-right:8px}.audit-sec-meta{font-family:var(--font-mono);color:var(--dim);letter-spacing:.04em;font-size:11px}.audit-sec-meta strong{color:var(--ink);font-weight:600}.audit-sec-title{font-family:var(--font-mono);letter-spacing:-.01em;color:var(--ink);margin:4px 0 18px;font-size:18px;font-weight:600}.strength-list{flex-direction:column;display:flex}.strength-row{border-bottom:1px dashed var(--line);font-family:var(--font-mono);grid-template-columns:24px 1fr auto;align-items:baseline;gap:14px;padding:12px 0;display:grid}.strength-row:last-child{border-bottom:none}.strength-check{color:var(--accent-green);font-size:14px;line-height:1}.strength-body{flex-direction:column;gap:2px;min-width:0;display:flex}.strength-headline{color:var(--ink);letter-spacing:.02em;font-size:13px}.strength-detail{color:var(--ink-2);letter-spacing:.02em;font-size:11px}.strength-metric{font-family:var(--font-display);letter-spacing:.04em;color:var(--accent-green);text-align:right;white-space:nowrap;font-size:22px;line-height:1}.strength-metric .unit{font-family:var(--font-mono);letter-spacing:.18em;text-transform:uppercase;color:var(--dim);margin-top:4px;font-size:9px;display:block}.quirks-table{font-family:var(--font-mono)}.quirks-thead,.quirks-row{grid-template-columns:80px 1fr 90px 100px;align-items:center;gap:14px;display:grid}.quirks-thead{border-bottom:1px solid var(--line);color:var(--dim);letter-spacing:.18em;text-transform:uppercase;padding:0 0 8px;font-size:10px}.quirks-thead span:last-child{text-align:right}.quirks-row{border-bottom:1px dashed var(--line);padding:12px 0;font-size:12px}.quirks-row:last-child{border-bottom:none}.q-when{color:var(--dim);font-size:11px}.q-what{flex-direction:column;gap:2px;min-width:0;display:flex}.q-title{color:var(--ink);font-size:12px}.q-policy{color:var(--dim);font-size:10px}.q-policy code{color:var(--accent-green);background:0 0}.q-pill{border:1px solid var(--line-2);text-align:center;letter-spacing:.12em;text-transform:uppercase;justify-self:start;padding:2px 8px;font-size:10px}.q-pill-high{color:var(--accent-pink);background:#e4587c0f;border-color:#e4587c66}.q-pill-medium{color:var(--amber);background:var(--amber-bg);border-color:#e8c46a66}.q-pill-low{color:var(--ink-2)}.q-recur{text-align:right;color:var(--dim);letter-spacing:.04em;font-size:10px}.audit-sec-sub{font-family:var(--font-mono);color:var(--ink-2);margin:-10px 0 18px;font-size:12px;line-height:1.55}.audit-sec-sub strong{color:var(--ink);font-weight:600}.install-all-btn{border:1px solid var(--accent-pink);background:var(--accent-pink-bg);color:var(--accent-pink);font-family:var(--font-mono);letter-spacing:.18em;text-transform:uppercase;cursor:pointer;padding:8px 14px;font-size:11px;transition:background-color .14s}.install-all-btn:hover{background:#e4587c2e}.fix-list{flex-direction:column;display:flex}.fix-row{border-bottom:1px dashed var(--line);grid-template-columns:1fr minmax(280px,auto);align-items:center;gap:24px;padding:14px 0;display:grid}.fix-row:last-child{border-bottom:none}.fix-row-info{flex-direction:column;gap:4px;min-width:0;display:flex}.fix-name{font-family:var(--font-mono);color:var(--ink);letter-spacing:.01em;font-size:13px;font-weight:500}.fix-desc{font-family:var(--font-mono);color:var(--ink-2);font-size:11px;line-height:1.55}.fix-row-cmd{align-items:stretch;gap:6px;min-width:0;display:flex}.fix-cmd-code{min-width:0;font-family:var(--font-mono);color:var(--accent-green);background:var(--bg);border:1px solid var(--line);letter-spacing:.02em;white-space:nowrap;flex:1;align-items:center;padding:8px 12px;font-size:11px;display:flex;overflow-x:auto}.copy-icon-btn{border:1px solid var(--line);background:var(--bg);color:var(--ink-2);font-family:var(--font-mono);cursor:pointer;justify-content:center;align-items:center;min-width:36px;padding:0 10px;font-size:12px;transition:color .14s,border-color .14s;display:inline-flex}.copy-icon-btn:hover{color:var(--accent-pink);border-color:var(--accent-pink)}.cbb-grid{grid-template-columns:1fr 1fr;gap:14px;display:grid}.cbb-card{border:1px solid var(--line-2);background:var(--bg-2);flex-direction:column;gap:12px;padding:18px 20px;display:flex}.cbb-card-title{font-family:var(--font-mono);color:var(--ink);letter-spacing:.02em;font-size:14px}.cbb-card-sub{font-family:var(--font-mono);color:var(--ink-2);font-size:11px;line-height:1.55}.cadence-row{flex-wrap:wrap;gap:8px;margin-top:2px;display:flex}.cadence-btn{font-family:var(--font-mono);letter-spacing:.04em;border:1px solid var(--line-2);color:var(--ink);cursor:pointer;background:0 0;padding:6px 12px;font-size:11px;transition:border-color .14s,color .14s,background-color .14s}.cadence-btn:hover{border-color:var(--accent-pink);color:var(--accent-pink)}.cadence-btn.on{border-color:var(--accent-pink);background:var(--accent-pink-bg);color:var(--accent-pink)}.cadence-btn:disabled{opacity:.5;cursor:not-allowed}.cbb-link{color:var(--accent-green);font-family:var(--font-mono);letter-spacing:.04em;cursor:pointer;background:0 0;border:none;align-self:flex-start;padding:0;font-size:11px}.cbb-link:hover{color:var(--accent-pink)}.cbb-link:disabled{opacity:.55;cursor:wait}.perks-progress{background:var(--bg);border:1px solid var(--line-2);height:6px;margin:4px 0;position:relative}.perks-progress span{background:var(--accent-pink);height:100%;transition:width .24s;display:block}.perks-meta{font-family:var(--font-mono);color:var(--ink-2);font-size:11px}.perks-meta strong{color:var(--accent-pink);font-weight:600}.invite-btn{border:1px solid var(--accent-pink);background:var(--accent-pink-bg);color:var(--accent-pink);font-family:var(--font-mono);letter-spacing:.18em;text-transform:uppercase;cursor:pointer;align-self:flex-start;padding:8px 14px;font-size:11px;transition:background-color .14s}.invite-btn:hover{background:#e4587c2e}.invite-textarea{resize:vertical;letter-spacing:.02em;width:100%;min-height:90px;font-size:13px;line-height:1.45}.invite-summary{font-family:var(--font-mono);color:var(--dim);flex-wrap:wrap;gap:12px;margin-top:6px;font-size:11px;display:flex}.invite-summary .invite-valid{color:var(--accent-green)}.invite-summary .invite-invalid{color:var(--accent-pink)}.cbb-foot{font-family:var(--font-mono);color:var(--dim);margin-top:4px;font-size:10px}@media (max-width:720px){.cbb-grid{grid-template-columns:1fr}.fix-row{grid-template-columns:1fr;gap:8px}.fix-row-cmd{min-width:0}.quirks-thead,.quirks-row{grid-template-columns:1fr;gap:6px;padding:16px 0}.quirks-thead{display:none}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,34713,e=>{"use strict";e.s(["formatDuration",0,function(e){if(e<1e3)return`${e}ms`;let t=Math.round(e/100);if(t<600)return`${(t/10).toFixed(1)}s`;let n=Math.round(e/1e3);if(n<3600){let e=Math.floor(n/60);return`${e}m ${n%60}s`}let a=Math.round(e/6e4),r=Math.floor(a/60);return`${r}h ${a%60}m`},"formatRelativeTime",0,function(e){let t=Date.now()-e;return t<6e4?`${Math.max(1,Math.floor(t/1e3))}s ago`:t<36e5?`${Math.floor(t/6e4)}m ago`:t<864e5?`${Math.floor(t/36e5)}h ago`:`${Math.floor(t/864e5)}d ago`}])},86616,29054,e=>{"use strict";function t(e,n={},a=15e3){let r=AbortSignal.timeout(a),i=n.signal?AbortSignal.any([n.signal,r]):r;return fetch(e,{...n,signal:i})}function n(e){if(null===e||"object"!=typeof e)return!1;let t=e.name;return"AbortError"===t||"TimeoutError"===t}e.s(["fetchWithTimeout",0,t,"isAbortError",0,n],29054);class a extends Error{kind;constructor(e,t){super(t),this.kind=e,this.name="RerunError"}}async function r(e){try{let n=await t("/api/audit/run",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({cli:e.cli.length>0?e.cli:void 0,since:"all"===e.since?void 0:e.since,noCache:!!e.noCache||void 0})});if(!n.ok&&409!==n.status){let e=await n.text().catch(()=>"");throw console.error("audit run failed:",n.status,e),new a("post_failed",`audit run failed (${n.status})`)}}catch(e){if(e instanceof a)throw e;throw console.error("audit run request failed:",e),new a(n(e)?"timeout":"network","audit run request failed")}let r=0;for(;;){await new Promise(e=>setTimeout(e,1e3));let e=null;try{let n=await t("/api/audit/status",{cache:"no-store"});n.ok&&(e=await n.json())}catch{}if(null===e){if(++r>=10)throw new a("network","audit status poll lost the server");continue}if(r=0,!e.running){if(e.error)throw new a("post_failed",e.error);return}}}e.s(["RerunError",0,a,"triggerRun",0,r],86616)},93237,e=>{"use strict";var t=e.i(43476),n=e.i(71645),a=e.i(95187);let r=(0,a.createServerReference)("0075fc0acfe318e45ceb23fb5fd23941b66dd3beec",a.callServer,void 0,a.findSourceMapURL,"getScheduledAuditAction"),i=(0,a.createServerReference)("40a988a2444a72107721f91defe3ad94cc8de4159d",a.callServer,void 0,a.findSourceMapURL,"setAutoAuditAction"),s=(0,a.createServerReference)("40e94dfb38dbea8e7a1215a1cd56852cbb3e4a1b32",a.callServer,void 0,a.findSourceMapURL,"setAuditIntervalAction");var l=e.i(86616),o=e.i(55574),c=e.i(29054),d=e.i(34713);function u(e){return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}function h({enabled:e,onChange:n,disabled:a,label:r}){return(0,t.jsx)("button",{type:"button",onClick:n,disabled:a,role:"switch","aria-checked":e,"aria-label":r,className:`relative inline-flex h-4 w-7 shrink-0 items-center rounded-full transition-colors disabled:opacity-40 ${e?"bg-emerald-500":"bg-muted-foreground/30"}`,children:(0,t.jsx)("span",{className:`inline-block h-3 w-3 rounded-full bg-white shadow transition-transform ${e?"translate-x-3.5":"translate-x-0.5"}`})})}let f={ok:{fg:"var(--accent-green)",bg:"rgba(102,209,181,0.10)",bd:"rgba(102,209,181,0.30)"},warn:{fg:"var(--amber)",bg:"rgba(232,196,106,0.10)",bd:"rgba(232,196,106,0.30)"},bad:{fg:"var(--accent-pink)",bg:"rgba(228,88,124,0.10)",bd:"rgba(228,88,124,0.30)"},muted:{fg:"var(--ink-2)",bg:"transparent",bd:"var(--line-2)"}};function p({tone:e,children:n}){let a=f[e];return(0,t.jsx)("span",{style:{display:"inline-flex",alignItems:"center",gap:6,padding:"3px 9px",fontFamily:"var(--font-mono)",fontSize:11,letterSpacing:"0.04em",color:a.fg,background:a.bg,border:`1px solid ${a.bd}`,textTransform:"uppercase"},children:n})}let g={fontFamily:"var(--font-mono)",fontSize:16,fontWeight:600,letterSpacing:"-0.01em",color:"var(--ink)",margin:"0 0 4px"},m={fontFamily:"var(--font-mono)",fontSize:13,color:"var(--ink-2)",lineHeight:1.65,margin:0},y={...m,color:"var(--dim)",fontSize:12},x={color:"var(--ink)",fontVariantLigatures:"none"};function b({children:e}){return(0,t.jsx)("code",{style:{fontFamily:"var(--font-mono)",fontSize:12,color:"var(--accent-green)",background:"var(--bg-2)",border:"1px solid var(--line-2)",padding:"1px 6px",whiteSpace:"nowrap"},children:e})}function v({view:e,onReload:a}){let r,[f,j]=(0,n.useState)(e.auto),[w,S]=(0,n.useState)(e.intervalDays),[k,T]=(0,n.useState)(!1),[A,M]=(0,n.useState)(!1),[R,C]=(0,n.useState)(!1),[D,$]=(0,n.useState)(!1);(0,n.useEffect)(()=>j(e.auto),[e.auto]),(0,n.useEffect)(()=>S(e.intervalDays),[e.intervalDays]),(0,n.useEffect)(()=>{let e=!1;return(async()=>{try{let t=await (0,c.fetchWithTimeout)("/api/audit/status",{cache:"no-store"});if(t.ok&&!e){let e=await t.json();C(!!e.running)}}catch{}})(),()=>{e=!0}},[]);let E="running"!==e.daemon,N="unsupported-platform"===e.daemon,F=(0,n.useCallback)(async()=>{let e=!f;j(e),T(!0);try{let t=await i(e);j(t.auto),(0,o.toast)(t.auto?"Scheduled scanning on.":"Scheduled scanning off."),await a()}catch{j(!e),(0,o.toast)("Could not save that.")}finally{T(!1)}},[f,a]),I=(0,n.useCallback)(async t=>{M(!0);try{let e=await s(t);S(e.intervalDays),(0,o.toast)(`Scanning every ${e.intervalDays} day${1===e.intervalDays?"":"s"}.`)}catch{S(e.intervalDays),(0,o.toast)("Could not save that.")}finally{M(!1)}},[e.intervalDays]),L=(0,n.useCallback)(async()=>{if(!D&&!R){$(!0),C(!0);try{await (0,l.triggerRun)({cli:[],since:"all",noCache:!1}),(0,o.toast)("Audit complete."),await a()}catch(t){let e=t instanceof l.RerunError&&"timeout"===t.kind?"The scan is taking a while — it will finish in the background.":"The scan could not be completed.";(0,o.toast)(e)}finally{$(!1),C(!1)}}},[D,R,a]),W=e.schedule,z=W?.lastExitCode!=null&&0!==W.lastExitCode&&75!==W.lastExitCode;return(0,t.jsxs)("div",{className:"panel",style:{padding:20,marginBottom:20},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:12,flexWrap:"wrap"},children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{style:g,children:"Scheduled audit"}),(0,t.jsx)("p",{style:y,children:"Scan this machine on a timer, in the background."})]}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10},children:["running"===e.daemon&&(0,t.jsx)(p,{tone:"ok",children:"daemon running"}),"stopped"===e.daemon&&(0,t.jsx)(p,{tone:"warn",children:"daemon stopped"}),"not-installed"===e.daemon&&(0,t.jsx)(p,{tone:"warn",children:"daemon not installed"}),"unsupported-platform"===e.daemon&&(0,t.jsx)(p,{tone:"muted",children:"daemon unavailable"})]})]}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"flex-start",gap:12,marginTop:18},children:[(0,t.jsx)("div",{style:{marginTop:2},children:(0,t.jsx)(h,{enabled:f,onChange:F,disabled:k||N,label:f?"Turn off scheduled scanning":"Turn on scheduled scanning"})}),(0,t.jsxs)("div",{style:{minWidth:0},children:[(0,t.jsx)("p",{style:{...m,color:"var(--ink)"},children:f?"Scanning this machine on a schedule.":"Scan this machine on a schedule."}),(0,t.jsxs)("p",{style:{...m,marginTop:6},children:["The scan reads the ",(0,t.jsx)("span",{style:x,children:"contents"})," of every session transcript on disk across all installed agent CLIs — your prompts, the files they read and wrote, and command output. It runs entirely on this machine. Nothing is sent anywhere unless you also turn on emailed reports below."]})]})]}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10,marginTop:16,flexWrap:"wrap"},children:[(0,t.jsx)("label",{htmlFor:"scan-interval",style:{...m},children:"Scan every"}),(0,t.jsx)("input",{id:"scan-interval",type:"number",min:1,max:90,step:1,value:w,disabled:A||N,onChange:e=>S(Number(e.target.value)),onBlur:t=>{let n=Number(t.target.value);Number.isFinite(n)?n!==e.intervalDays&&I(n):S(e.intervalDays)},style:{width:64,padding:"6px 8px",background:"var(--bg)",border:"1px solid var(--line-2)",color:"var(--ink)",fontFamily:"var(--font-mono)",fontSize:13,textAlign:"center"}}),(0,t.jsxs)("span",{style:m,children:["day",1===w?"":"s","."]}),(0,t.jsx)("span",{style:y,children:"1–90; the config keeps it in range."})]}),(0,t.jsxs)("div",{style:{marginTop:18,paddingTop:16,borderTop:"1px dashed var(--line)",display:"flex",flexDirection:"column",gap:6},children:[R&&(0,t.jsx)("p",{style:{...m,color:"var(--accent-green)"},children:"A scan is running now…"}),W?.lastRunAtMs!=null?(0,t.jsxs)("p",{style:m,children:["Last scheduled scan:"," ",(0,t.jsx)("span",{style:x,children:u(W.lastRunAtMs)})," ",(0,t.jsxs)("span",{style:y,children:["(",(0,d.formatRelativeTime)(W.lastRunAtMs),")"]})]}):e.lastResultAt?(0,t.jsxs)("p",{style:m,children:["Last audit result:"," ",(0,t.jsx)("span",{style:x,children:u(new Date(e.lastResultAt).getTime())})," ",(0,t.jsx)("span",{style:y,children:"(no scheduled scan has run yet)"})]}):(0,t.jsx)("p",{style:m,children:"No scan has run yet."}),f?W?.nextDueAtMs!=null?(0,t.jsxs)("p",{style:m,children:["Next scan due:"," ",(0,t.jsx)("span",{style:x,children:u(W.nextDueAtMs)})," ",(0,t.jsxs)("span",{style:y,children:["(",(r=W.nextDueAtMs-Date.now())<=0?"now":r<36e5?`in ${Math.max(1,Math.floor(r/6e4))}m`:r<864e5?`in ${Math.floor(r/36e5)}h`:`in ${Math.floor(r/864e5)}d`,")"]})]}):(0,t.jsxs)("p",{style:m,children:["Next scan:"," ",(0,t.jsx)("span",{style:y,children:"the daemon will schedule it shortly."})]}):(0,t.jsx)("p",{style:y,children:"Scheduled scanning is off — no scan is scheduled."}),z&&(0,t.jsxs)("p",{style:{...m,color:"var(--amber)"},children:["The last scheduled scan exited with code ",W?.lastExitCode,". It will retry on the next tick."]}),W?.schemaAhead&&(0,t.jsx)("p",{style:y,children:"A newer daemon wrote this schedule; some fields may not be shown."})]}),f&&E&&(0,t.jsx)("p",{style:{...m,color:"var(--amber)",marginTop:14},children:N?(0,t.jsx)(t.Fragment,{children:"The background daemon isn't available on this platform, so scheduled scans can't run here. You can still run one now, and use the audit page."}):"not-installed"===e.daemon?(0,t.jsxs)(t.Fragment,{children:["Scheduled scanning is on, but the background service isn't installed, so nothing will run on the timer yet. Install it with ",(0,t.jsx)(b,{children:"failproofai config"}),"."]}):(0,t.jsxs)(t.Fragment,{children:["Scheduled scanning is on, but the background service is stopped, so nothing will run until it starts. Reinstall or repair it with ",(0,t.jsx)(b,{children:"failproofai config"}),"."]})}),(0,t.jsx)("div",{style:{marginTop:18},children:(0,t.jsx)("button",{type:"button",className:"btn",onClick:L,disabled:D||R,children:D||R?"[ scanning… ]":"[ run a scan now ]"})})]})}e.s(["default",0,function(){let[e,a]=(0,n.useState)(null),[i,s]=(0,n.useState)(!0),[l,o]=(0,n.useState)(!1),c=(0,n.useRef)(!0),d=(0,n.useCallback)(async()=>{let e=await r();c.current&&a(e)},[]);return(0,n.useEffect)(()=>(c.current=!0,(async()=>{try{await d()}catch{c.current&&o(!0)}finally{c.current&&s(!1)}})(),()=>{c.current=!1}),[d]),(0,t.jsx)("main",{className:"report",children:(0,t.jsxs)("section",{className:"section","data-screen-label":"settings",children:[(0,t.jsx)("h2",{style:{fontFamily:"var(--font-mono)",fontSize:24,fontWeight:600,letterSpacing:"-0.01em",color:"var(--ink)",margin:"0 0 8px"},children:"Settings"}),(0,t.jsx)("p",{style:{...m,maxWidth:720,margin:"0 0 24px"},children:"Machine-level controls for scheduled scanning and emailed reports."}),i?(0,t.jsx)("p",{style:y,children:"Loading…"}):l||!e?(0,t.jsx)("p",{style:{...m,color:"var(--accent-pink)"},children:"Could not load settings. Refresh to try again."}):(0,t.jsx)(v,{view:e,onReload:d})]})})}],93237)}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,67927,e=>{"use strict";let t=(0,e.i(56420).default)("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);e.s(["ChevronRight",0,t],67927)},24071,e=>{"use strict";let t=(0,e.i(56420).default)("chevron-left",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);e.s(["ChevronLeft",0,t],24071)},73520,e=>{"use strict";var t=e.i(43476),a=e.i(24071),r=e.i(67927);e.s(["default",0,function({currentPage:e,totalPages:s,onPageChange:i}){if(s<=1)return null;let l=e=>`px-3 py-2 text-sm rounded-md transition-colors flex items-center gap-1 bg-muted text-muted-foreground ${e?"opacity-50 cursor-not-allowed":"hover:bg-muted/80"}`;return(0,t.jsxs)("div",{className:"flex items-center justify-center gap-2 py-4",children:[(0,t.jsxs)("button",{onClick:()=>i(e-1),disabled:1===e,className:l(1===e),"aria-label":"Previous page",children:[(0,t.jsx)(a.ChevronLeft,{className:"w-4 h-4"}),(0,t.jsx)("span",{className:"hidden sm:inline",children:"Previous"})]}),(0,t.jsx)("div",{className:"flex items-center gap-1",children:(()=>{if(s<=7)return Array.from({length:s},(e,t)=>t+1);let t=[1],a=Math.max(2,e-1),r=Math.min(s-1,e+1);e<=3&&(r=Math.min(5,s-1)),e>=s-2&&(a=Math.max(2,s-4)),a>2&&t.push("ellipsis-start");for(let e=a;e<=r;e++)t.push(e);return r<s-1&&t.push("ellipsis-end"),t.push(s),t})().map(a=>"string"==typeof a?(0,t.jsx)("span",{className:"px-2 text-muted-foreground",children:"..."},a):(0,t.jsx)("button",{onClick:()=>i(a),className:`min-w-[2.5rem] px-3 py-2 text-sm rounded-md transition-colors ${e===a?"bg-primary text-primary-foreground":"bg-muted text-muted-foreground hover:bg-muted/80"}`,"aria-label":`Page ${a}`,"aria-current":e===a?"page":void 0,children:a},a))}),(0,t.jsxs)("button",{onClick:()=>i(e+1),disabled:e===s,className:l(e===s),"aria-label":"Next page",children:[(0,t.jsx)("span",{className:"hidden sm:inline",children:"Next"}),(0,t.jsx)(r.ChevronRight,{className:"w-4 h-4"})]})]})}])},34713,e=>{"use strict";e.s(["formatDuration",0,function(e){if(e<1e3)return`${e}ms`;let t=Math.round(e/100);if(t<600)return`${(t/10).toFixed(1)}s`;let a=Math.round(e/1e3);if(a<3600){let e=Math.floor(a/60);return`${e}m ${a%60}s`}let r=Math.round(e/6e4),s=Math.floor(r/60);return`${s}h ${r%60}m`},"formatRelativeTime",0,function(e){let t=Date.now()-e;return t<6e4?`${Math.max(1,Math.floor(t/1e3))}s ago`:t<36e5?`${Math.floor(t/6e4)}m ago`:t<864e5?`${Math.floor(t/36e5)}h ago`:`${Math.floor(t/864e5)}d ago`}])},66794,e=>{"use strict";let t=(0,e.i(56420).default)("settings",[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);e.s(["Settings",0,t],66794)},
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,67927,e=>{"use strict";let t=(0,e.i(56420).default)("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);e.s(["ChevronRight",0,t],67927)},24071,e=>{"use strict";let t=(0,e.i(56420).default)("chevron-left",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);e.s(["ChevronLeft",0,t],24071)},73520,e=>{"use strict";var t=e.i(43476),a=e.i(24071),r=e.i(67927);e.s(["default",0,function({currentPage:e,totalPages:s,onPageChange:i}){if(s<=1)return null;let l=e=>`px-3 py-2 text-sm rounded-md transition-colors flex items-center gap-1 bg-muted text-muted-foreground ${e?"opacity-50 cursor-not-allowed":"hover:bg-muted/80"}`;return(0,t.jsxs)("div",{className:"flex items-center justify-center gap-2 py-4",children:[(0,t.jsxs)("button",{onClick:()=>i(e-1),disabled:1===e,className:l(1===e),"aria-label":"Previous page",children:[(0,t.jsx)(a.ChevronLeft,{className:"w-4 h-4"}),(0,t.jsx)("span",{className:"hidden sm:inline",children:"Previous"})]}),(0,t.jsx)("div",{className:"flex items-center gap-1",children:(()=>{if(s<=7)return Array.from({length:s},(e,t)=>t+1);let t=[1],a=Math.max(2,e-1),r=Math.min(s-1,e+1);e<=3&&(r=Math.min(5,s-1)),e>=s-2&&(a=Math.max(2,s-4)),a>2&&t.push("ellipsis-start");for(let e=a;e<=r;e++)t.push(e);return r<s-1&&t.push("ellipsis-end"),t.push(s),t})().map(a=>"string"==typeof a?(0,t.jsx)("span",{className:"px-2 text-muted-foreground",children:"..."},a):(0,t.jsx)("button",{onClick:()=>i(a),className:`min-w-[2.5rem] px-3 py-2 text-sm rounded-md transition-colors ${e===a?"bg-primary text-primary-foreground":"bg-muted text-muted-foreground hover:bg-muted/80"}`,"aria-label":`Page ${a}`,"aria-current":e===a?"page":void 0,children:a},a))}),(0,t.jsxs)("button",{onClick:()=>i(e+1),disabled:e===s,className:l(e===s),"aria-label":"Next page",children:[(0,t.jsx)("span",{className:"hidden sm:inline",children:"Next"}),(0,t.jsx)(r.ChevronRight,{className:"w-4 h-4"})]})]})}])},34713,e=>{"use strict";e.s(["formatDuration",0,function(e){if(e<1e3)return`${e}ms`;let t=Math.round(e/100);if(t<600)return`${(t/10).toFixed(1)}s`;let a=Math.round(e/1e3);if(a<3600){let e=Math.floor(a/60);return`${e}m ${a%60}s`}let r=Math.round(e/6e4),s=Math.floor(r/60);return`${s}h ${r%60}m`},"formatRelativeTime",0,function(e){let t=Date.now()-e;return t<6e4?`${Math.max(1,Math.floor(t/1e3))}s ago`:t<36e5?`${Math.floor(t/6e4)}m ago`:t<864e5?`${Math.floor(t/36e5)}h ago`:`${Math.floor(t/864e5)}d ago`}])},66794,e=>{"use strict";let t=(0,e.i(56420).default)("settings",[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);e.s(["Settings",0,t],66794)},9664,e=>{"use strict";var t=e.i(95187);let a=(0,t.createServerReference)("60bc8735851848b551cc67d557ca8e9436f98e135f",t.callServer,void 0,t.findSourceMapURL,"searchHookActivityAction");e.s(["searchHookActivityAction",0,a])},84026,54959,e=>{"use strict";var t=e.i(56420);let a=(0,t.default)("shield-check",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);e.s(["ShieldCheck",0,a],84026);let r=(0,t.default)("shield-x",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m14.5 9.5-5 5",key:"17q4r4"}],["path",{d:"m9.5 9.5 5 5",key:"18nt4w"}]]);e.s(["ShieldX",0,r],54959)},16306,e=>{"use strict";let t=(0,e.i(56420).default)("shield-alert",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]]);e.s(["ShieldAlert",0,t],16306)},82954,e=>{"use strict";let t=(0,e.i(56420).default)("shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);e.s(["Shield",0,t],82954)}]);
|
|
@@ -13,6 +13,7 @@ import { readFile } from "node:fs/promises";
|
|
|
13
13
|
import { existsSync } from "node:fs";
|
|
14
14
|
import { homedir } from "node:os";
|
|
15
15
|
import { basename, resolve } from "node:path";
|
|
16
|
+
import { customPoliciesDir } from "@/src/hooks/fp-home";
|
|
16
17
|
|
|
17
18
|
export interface PolicyParamSpec {
|
|
18
19
|
type: string;
|
|
@@ -108,7 +109,7 @@ async function discoverConventionPolicies(
|
|
|
108
109
|
// resolving at the exact cwd disagrees with it from any subdirectory.
|
|
109
110
|
const launchCwd = process.env.FAILPROOFAI_LAUNCH_CWD || process.cwd();
|
|
110
111
|
const projectDir = resolve(findProjectConfigDir(launchCwd), ".failproofai", "policies");
|
|
111
|
-
const userDir =
|
|
112
|
+
const userDir = customPoliciesDir();
|
|
112
113
|
|
|
113
114
|
const dirs: { scope: "project" | "user"; dir: string }[] = [
|
|
114
115
|
{ scope: "project", dir: projectDir },
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Read side of the /settings "Scheduled audit" section. Reads only — the write
|
|
5
|
+
* counterparts live in `update-scheduled-audit.ts`, mirroring the
|
|
6
|
+
* get-hooks-config / update-hooks-config split.
|
|
7
|
+
*
|
|
8
|
+
* ## CLI ⟷ dashboard parity (state it here so the two cannot silently diverge)
|
|
9
|
+
*
|
|
10
|
+
* Every field this returns is the same `config.toml` / state the CLI reads:
|
|
11
|
+
* - `auto` ⟷ `config.toml [audit] auto` (readConfig / updateConfig;
|
|
12
|
+
* the same key the `failproofai config` wizard sets)
|
|
13
|
+
* - `intervalDays` ⟷ `config.toml [audit] interval_days` (readConfig owns the
|
|
14
|
+
* 1..90 clamp — see fp-config.readIntervalDays)
|
|
15
|
+
* - `daemon` ⟷ `systemctl status failproofaid@<user>` (daemonServiceStatus)
|
|
16
|
+
* - `schedule` ⟷ `state/audit-schedule.json` (daemon-written; readAuditSchedule)
|
|
17
|
+
* There is no bespoke dashboard storage here: writing goes through the exact
|
|
18
|
+
* same `updateConfig` the CLI uses, so a value set on either side is identical.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { readConfig } from "@/src/hooks/fp-config";
|
|
22
|
+
import { readAuditSchedule } from "@/src/audit/audit-schedule";
|
|
23
|
+
import { daemonServiceStatus, type DaemonServiceStatus } from "@/src/hooks/daemon-service";
|
|
24
|
+
import { readDashboardCacheMeta } from "@/src/audit/dashboard-cache";
|
|
25
|
+
|
|
26
|
+
export interface ScheduledAuditSchedule {
|
|
27
|
+
nextDueAtMs: number | null;
|
|
28
|
+
lastAttemptAtMs: number | null;
|
|
29
|
+
lastRunAtMs: number | null;
|
|
30
|
+
lastExitCode: number | null;
|
|
31
|
+
schemaAhead: boolean;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ScheduledAuditView {
|
|
35
|
+
/** `[audit] auto` — whether the daemon scans on a timer. */
|
|
36
|
+
auto: boolean;
|
|
37
|
+
/** `[audit] interval_days`, already clamped to 1..90 by readConfig. */
|
|
38
|
+
intervalDays: number;
|
|
39
|
+
/** The systemd/launchd service state. The scheduler cannot run without a
|
|
40
|
+
* running daemon, so a settings page that hides this reads "on but silent". */
|
|
41
|
+
daemon: DaemonServiceStatus;
|
|
42
|
+
/** The daemon's persisted schedule, or null when no scheduled scan has run. */
|
|
43
|
+
schedule: ScheduledAuditSchedule | null;
|
|
44
|
+
/** ISO time of the most recent audit RESULT on disk (scheduled OR manual),
|
|
45
|
+
* or null if no audit has ever produced a dashboard. Distinct from
|
|
46
|
+
* `schedule.lastRunAtMs`, which is scheduled runs only. */
|
|
47
|
+
lastResultAt: string | null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export async function getScheduledAuditAction(): Promise<ScheduledAuditView> {
|
|
51
|
+
const config = readConfig();
|
|
52
|
+
const schedule = readAuditSchedule();
|
|
53
|
+
const meta = readDashboardCacheMeta();
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
auto: config.audit.auto,
|
|
57
|
+
intervalDays: config.audit.intervalDays,
|
|
58
|
+
daemon: daemonServiceStatus(),
|
|
59
|
+
schedule: schedule
|
|
60
|
+
? {
|
|
61
|
+
nextDueAtMs: schedule.nextDueAtMs,
|
|
62
|
+
lastAttemptAtMs: schedule.lastAttemptAtMs,
|
|
63
|
+
lastRunAtMs: schedule.lastRunAtMs,
|
|
64
|
+
lastExitCode: schedule.lastExitCode,
|
|
65
|
+
schemaAhead: schedule.schemaAhead,
|
|
66
|
+
}
|
|
67
|
+
: null,
|
|
68
|
+
lastResultAt: meta?.cachedAt ?? null,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Write side of the /settings "Scheduled audit" section. Every write goes
|
|
5
|
+
* through `updateConfig` — never a raw file write — so the layout-2 config
|
|
6
|
+
* helpers stay the single writer of `config.toml` and the dashboard can never
|
|
7
|
+
* disagree with what the CLI reads.
|
|
8
|
+
*
|
|
9
|
+
* ## CLI ⟷ dashboard parity
|
|
10
|
+
* - `setAutoAuditAction(enabled)` ⟷ `[audit] auto` (updateConfig)
|
|
11
|
+
* - `setAuditIntervalAction(days)` ⟷ `[audit] interval_days` (updateConfig)
|
|
12
|
+
* Both keys are exactly what the `failproofai config` wizard writes, so a value
|
|
13
|
+
* set here is indistinguishable from one set on the CLI.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { readConfig, updateConfig } from "@/src/hooks/fp-config";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Turn the scheduled scan on or off.
|
|
20
|
+
*
|
|
21
|
+
* Returns the value actually stored (re-read), so an optimistic UI can confirm
|
|
22
|
+
* against the source of truth rather than assume its own guess landed.
|
|
23
|
+
*/
|
|
24
|
+
export async function setAutoAuditAction(enabled: boolean): Promise<{ auto: boolean }> {
|
|
25
|
+
const next = updateConfig({ audit: { auto: enabled } });
|
|
26
|
+
return { auto: next.audit.auto };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Set the days between scheduled scans.
|
|
31
|
+
*
|
|
32
|
+
* The clamp lives in `fp-config.readIntervalDays` (1..90, with 0/negatives/
|
|
33
|
+
* fractions falling back to the default) and is DELIBERATELY not reimplemented
|
|
34
|
+
* here: we write the raw value and then RE-READ, so what we return to the UI is
|
|
35
|
+
* exactly what the config decided to keep. Reflecting the re-read value is how a
|
|
36
|
+
* hand-typed 3650 shows up in the dashboard as the 90 the config actually
|
|
37
|
+
* enforces, with no second copy of the bounds to drift.
|
|
38
|
+
*/
|
|
39
|
+
export async function setAuditIntervalAction(days: number): Promise<{ intervalDays: number }> {
|
|
40
|
+
updateConfig({ audit: { intervalDays: days } });
|
|
41
|
+
// Re-read through readConfig so the returned value carries the config's own
|
|
42
|
+
// clamp, not the raw input.
|
|
43
|
+
return { intervalDays: readConfig().audit.intervalDays };
|
|
44
|
+
}
|
|
@@ -17,6 +17,7 @@ import { writeDashboardCache } from "@/src/audit/dashboard-cache";
|
|
|
17
17
|
import { INTEGRATION_TYPES, type IntegrationType } from "@/src/hooks/types";
|
|
18
18
|
import type { RunAuditOptions } from "@/src/audit/types";
|
|
19
19
|
import { finishRun, tryAcquireRun } from "../_state";
|
|
20
|
+
import { acquireAuditLock } from "@/src/audit/audit-lock";
|
|
20
21
|
import { initTelemetry, trackEvent } from "@/lib/telemetry";
|
|
21
22
|
import { sanitizeErrorMessage } from "@/lib/telemetry-sanitize";
|
|
22
23
|
|
|
@@ -90,6 +91,26 @@ export async function POST(request: NextRequest): Promise<NextResponse> {
|
|
|
90
91
|
);
|
|
91
92
|
}
|
|
92
93
|
|
|
94
|
+
// The in-memory lock above only serialises runs WITHIN this Next.js process.
|
|
95
|
+
// The scheduled daemon child and a manual `failproofai audit` are separate
|
|
96
|
+
// processes writing the same sha1-keyed per-transcript cache and the same
|
|
97
|
+
// single-slot dashboard cache — three writers, and the module singleton is
|
|
98
|
+
// blind to the other two. Take the cross-process lock as well so this run
|
|
99
|
+
// cannot co-write that cache with one of them. Held ⇒ back the in-memory lock
|
|
100
|
+
// out and report "already running" — the same 409 the client already treats
|
|
101
|
+
// as "poll the in-flight run"; /api/audit/status reflects the cross-process
|
|
102
|
+
// lock via readActiveAuditLock, so the poll waits out the external scan rather
|
|
103
|
+
// than reading the machine as idle. This is information, not an error.
|
|
104
|
+
const auditLock = acquireAuditLock("dashboard");
|
|
105
|
+
if (!auditLock.ok) {
|
|
106
|
+
finishRun(null); // release the in-memory lock we just took
|
|
107
|
+
trackEvent("audit_run_rejected", { source: "dashboard", reason: "cross_process_lock" });
|
|
108
|
+
return NextResponse.json(
|
|
109
|
+
{ error: "Audit already running", status: "already-running" },
|
|
110
|
+
{ status: 409 },
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
93
114
|
// Mirror the CLI's cli_audit_* funnel for the dashboard path (which shares the
|
|
94
115
|
// same runAudit() core but previously emitted no server telemetry at all).
|
|
95
116
|
trackEvent("audit_run_started", {
|
|
@@ -133,6 +154,13 @@ export async function POST(request: NextRequest): Promise<NextResponse> {
|
|
|
133
154
|
error_message: sanitizeErrorMessage(err),
|
|
134
155
|
});
|
|
135
156
|
finishRun(err instanceof Error ? err.message : String(err));
|
|
157
|
+
} finally {
|
|
158
|
+
// Release the cross-process lock the moment the scan settles — before the
|
|
159
|
+
// in-memory lock is even relevant again — so the next scheduled tick or a
|
|
160
|
+
// `failproofai audit` is not locked out longer than the scan actually ran.
|
|
161
|
+
// Idempotent and never throws; the process-exit hook is the backstop if
|
|
162
|
+
// this task is killed outright.
|
|
163
|
+
auditLock.lock.release();
|
|
136
164
|
}
|
|
137
165
|
})();
|
|
138
166
|
|
|
@@ -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
|
|
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
|
*
|
|
@@ -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;
|