failproofai 1.0.0-beta.2 → 1.0.0-beta.21
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 +6 -6
- 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/build-manifest.json +3 -3
- 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/build-manifest.json +3 -3
- 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 +3 -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/build-manifest.json +3 -3
- 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/build-manifest.json +3 -3
- 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/build-manifest.json +3 -3
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +30 -18
- package/.next/standalone/.next/server/app/policies/page.js +5 -3
- 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/build-manifest.json +3 -3
- 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/build-manifest.json +3 -3
- 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/build-manifest.json +3 -3
- 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]__0h9_83k._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[externals]__1nl3dvw._.js → [externals]__0r-zamh._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[externals]__1ifpkx-._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0l4vuqm._.js → [root-of-the-server]__00ni9za._.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]__08y94xv._.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]__0-dh5jy._.js → [root-of-the-server]__0effm9m._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g0vcwt._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__18d-9oi._.js → [root-of-the-server]__0ix8gm7._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0h3lfmp._.js → [root-of-the-server]__0ji11a-._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__10oa-v9._.js → [root-of-the-server]__0ojwjxl._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__16le-kd._.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]__0vb5fl2._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0sb_5m8._.js → [root-of-the-server]__131ebum._.js} +4 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ibjy5x._.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]__20d06rh._.js +3 -0
- package/.next/standalone/.next/server/chunks/_0lxbzdq._.js +3 -0
- package/.next/standalone/.next/server/chunks/_1zuiiy3._.js +3 -0
- package/.next/standalone/.next/server/chunks/lib_telemetry_ts_0dctyyw._.js +3 -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/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +2 -1
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +2 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[externals]__1aq139v._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0-wfhrp._.js +3 -0
- 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]__1apb7k_._.js → [root-of-the-server]__0_1tiya._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__170799-._.js → [root-of-the-server]__0spkm68._.js} +11 -11
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0t281d4._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__17itmx-._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__01od0m6._.js → [root-of-the-server]__1n2vcv4._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1qapotl._.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]__1tlvv9a._.js +3 -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/_0-yi74u._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0rjgfln._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0vo2qyt._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0xej-0e._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_10399ge._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_149k9oy._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1_hwp06._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1ctse6u._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1e19atl._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1mnhi_r._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1ror7k9._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1sdgprl._.js +5 -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/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +2 -1
- 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 +4 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +6 -6
- 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 +74 -20
- package/.next/standalone/.next/static/chunks/{03fmihek9n986.js → 06zgzyh3wv1ig.js} +1 -1
- package/.next/standalone/.next/static/chunks/0km-jn9o5xyqs.css +2 -0
- package/.next/standalone/.next/static/chunks/{1hdhteui932bq.js → 0qmo2t50kpb30.js} +1 -1
- package/.next/standalone/.next/static/chunks/{2sbelanzvxvv0.js → 113g8wtal6_c4.js} +22 -22
- package/.next/standalone/.next/static/chunks/16p68cybetr31.js +1 -0
- package/.next/standalone/.next/static/chunks/18wqn0_3mzylf.js +1 -0
- package/.next/standalone/.next/static/chunks/1v1gqvpjk62jm.js +1 -0
- package/.next/standalone/.next/static/chunks/{0fi645si-uiiq.js → 1xq1m8h14tnlj.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3hp8ulqknybil.js → 1y3vwogqb88dx.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3vs4ay36tjds_.js → 1zmh-b0ulrqu7.js} +1 -1
- package/.next/standalone/.next/static/chunks/23kev26by1e4f.js +1 -0
- package/.next/standalone/.next/static/chunks/299lhw60e8gr6.js +1 -0
- package/.next/standalone/.next/static/chunks/{18rvdw5v72364.js → 2adbpdaxp5ygq.js} +1 -1
- package/.next/standalone/.next/static/chunks/{2j94uwkb4s3qr.js → 2kbqcw-6swmav.js} +1 -1
- package/.next/standalone/.next/static/chunks/2n9n5m0963pdg.js +6 -0
- package/.next/standalone/.next/static/chunks/2uvhw57mf9lg_.css +2 -0
- package/.next/standalone/.next/static/chunks/{31feojxhjyjpl.js → 30nrrpwymht5m.js} +1 -1
- package/.next/standalone/.next/static/chunks/31coz11ia5vc4.js +1 -0
- package/.next/standalone/.next/static/chunks/{turbopack-1lsv92x7klwrn.js → turbopack-3diub4ctvn1n0.js} +1 -1
- package/.next/standalone/SECURITY.md +8 -2
- package/.next/standalone/app/actions/get-active-pauses.ts +16 -0
- package/.next/standalone/app/actions/get-hooks-config.ts +2 -2
- 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/audit-dashboard.tsx +1 -3
- package/.next/standalone/app/audit/_components/audit-progress-strip.tsx +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/_components/come-back-better-section.tsx +1 -1
- package/.next/standalone/app/audit/_components/empty-state.tsx +0 -1
- package/.next/standalone/app/audit/_components/how-to-improve-section.tsx +1 -1
- package/.next/standalone/app/audit/_components/quirks-section.tsx +0 -1
- package/.next/standalone/app/audit/_components/report-footer.tsx +0 -2
- package/.next/standalone/app/audit/_components/run-progress.tsx +1 -1
- package/.next/standalone/app/audit/_components/strengths-section.tsx +0 -1
- package/.next/standalone/app/audit/audit-styles.css +6 -149
- package/.next/standalone/app/components/pause-notices.tsx +111 -0
- package/.next/standalone/app/components/raw-log-viewer.tsx +1 -1
- package/.next/standalone/app/components/toast.tsx +1 -1
- package/.next/standalone/app/policies/hooks-client.tsx +84 -8
- package/.next/standalone/app/settings/page.tsx +31 -0
- package/.next/standalone/app/settings/settings-client.tsx +487 -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 -5
- 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 +23 -12
- package/.next/standalone/proxy.ts +111 -1
- package/.next/standalone/server.js +1 -1
- package/bin/failproofai-worker.mjs +1 -1
- package/bin/failproofai.mjs +1041 -81
- package/bin/failproofaid-shim.mjs +4 -4
- package/dist/cli.mjs +18513 -10474
- package/dist/worker.mjs +1223 -299
- package/lib/auth/api-server-client.ts +2 -3
- package/lib/auth/auth-store.ts +4 -5
- 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 +23 -12
- package/scripts/build-daemon-packages.mjs +247 -0
- package/scripts/daemon-platforms.mjs +42 -0
- package/scripts/dev-hook.mjs +46 -5
- package/scripts/install-telemetry.mjs +8 -1
- package/scripts/launch.ts +25 -3
- package/scripts/parse-script-args.ts +27 -1
- package/scripts/prune-standalone.mjs +26 -0
- package/scripts/publish-aliases.mjs +62 -41
- package/scripts/repro-npm-install.sh +155 -0
- package/scripts/translate-docs/cache.ts +1 -1
- package/scripts/translate-docs/cli.ts +2 -2
- package/scripts/translate-docs/mintlify-nav.ts +1 -1
- 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 -5
- 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 -3
- package/src/audit/report.ts +0 -1
- package/src/hooks/backfill-cli.ts +247 -0
- package/src/hooks/builtin-policies.ts +391 -3
- package/src/hooks/cloud-connection.ts +354 -0
- package/src/hooks/cloud-enrollment-cli.ts +439 -0
- package/src/hooks/cloud-enrollment.ts +284 -0
- package/src/hooks/cloud-introspect.ts +147 -0
- package/src/hooks/cloud-managed-policies.ts +206 -0
- package/src/hooks/collector-config.ts +218 -0
- package/src/hooks/configure-wizard.ts +1211 -233
- package/src/hooks/custom-hooks-loader.ts +243 -37
- package/src/hooks/daemon-client.ts +136 -33
- package/src/hooks/daemon-download.ts +264 -31
- package/src/hooks/daemon-service.ts +1124 -76
- package/src/hooks/first-run-gate.ts +50 -0
- package/src/hooks/flush-cli.ts +180 -0
- package/src/hooks/fp-config.ts +835 -0
- package/src/hooks/fp-home.ts +714 -0
- package/src/hooks/fp-reset.ts +1363 -0
- package/src/hooks/handler.ts +185 -6
- package/src/hooks/harness-cli.ts +386 -0
- package/src/hooks/hook-activity-store.ts +171 -24
- package/src/hooks/hook-logger.ts +2 -2
- package/src/hooks/hook-telemetry.ts +5 -1
- package/src/hooks/hooks-config.ts +4 -3
- package/src/hooks/integrations.ts +0 -1
- package/src/hooks/loader-utils.ts +172 -9
- package/src/hooks/manager.ts +41 -5
- package/src/hooks/migrations.ts +450 -0
- package/src/hooks/onboarding-attempt.ts +195 -0
- package/src/hooks/onboarding-lock.ts +118 -0
- package/src/hooks/policy-types.ts +28 -0
- package/src/hooks/session-pause-cli.ts +159 -0
- package/src/hooks/session-pause.ts +267 -0
- package/src/hooks/setup-state.ts +256 -0
- package/src/hooks/tui.ts +209 -9
- package/src/hooks/uninstall-cli.ts +418 -0
- package/src/hooks/worker-server.ts +134 -15
- package/.next/standalone/.next/server/chunks/[externals]__14odj07._.js +0 -3
- package/.next/standalone/.next/server/chunks/[externals]__1s61mel._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0id_xf7._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0longh-._.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/[externals]__1_g_b3t._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0114ewg._.js +0 -4
- 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]__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]__0nb0syg._.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]__0uno39i._.js +0 -3
- 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]__1ath6v_._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1psjybo._.js +0 -3
- 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_0oy_-36.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/0zbxssxh53n-3.js +0 -1
- package/.next/standalone/.next/static/chunks/2mazwb1qmur1p.js +0 -1
- package/.next/standalone/.next/static/chunks/2pujpnfx4pws6.css +0 -2
- package/.next/standalone/.next/static/chunks/33u59vf_8xpd-.js +0 -1
- package/.next/standalone/.next/static/chunks/3i27c3hcriawq.css +0 -1
- package/.next/standalone/.next/static/chunks/3s7myk_co0gbh.js +0 -1
- package/.next/standalone/.next/static/chunks/40k1_v4os4cw6.js +0 -6
- package/.next/standalone/Cargo.lock +0 -428
- package/.next/standalone/Cargo.toml +0 -9
- package/.next/standalone/crates/PROTOCOL.md +0 -122
- package/.next/standalone/crates/failproofaid/Cargo.toml +0 -18
- package/.next/standalone/crates/failproofaid/src/lock.rs +0 -81
- package/.next/standalone/crates/failproofaid/src/main.rs +0 -83
- package/.next/standalone/crates/failproofaid/src/paths.rs +0 -172
- 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-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/{NWAjs0tHFyzk97gRGG09r → VjEdIL6W5uBsvEzknXqV9}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{NWAjs0tHFyzk97gRGG09r → VjEdIL6W5uBsvEzknXqV9}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{NWAjs0tHFyzk97gRGG09r → VjEdIL6W5uBsvEzknXqV9}/_ssgManifest.js +0 -0
package/src/auth/cli.ts
DELETED
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `failproofai auth` CLI surface.
|
|
3
|
-
*
|
|
4
|
-
* failproofai auth login Email + OTP flow; writes ~/.failproofai/auth.json
|
|
5
|
-
* failproofai auth logout Wipe auth.json (best-effort server revoke)
|
|
6
|
-
* failproofai auth whoami Print the cached identity (or "not signed in")
|
|
7
|
-
* failproofai auth help Usage
|
|
8
|
-
*
|
|
9
|
-
* Source of truth is the local cache (~/.failproofai/auth.json). Server-side
|
|
10
|
-
* validation is intentionally avoided — once a token is on disk we trust it.
|
|
11
|
-
* That keeps `login`, `logout`, and `whoami` consistent with each other and
|
|
12
|
-
* with the dashboard, even when the api-server is unreachable.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import * as readline from "node:readline";
|
|
16
|
-
|
|
17
|
-
import {
|
|
18
|
-
AuthApiError,
|
|
19
|
-
getApiBase,
|
|
20
|
-
logoutSession,
|
|
21
|
-
requestLoginCode,
|
|
22
|
-
verifyLoginCode,
|
|
23
|
-
} from "../../lib/auth/api-server-client";
|
|
24
|
-
import {
|
|
25
|
-
authFromTokenResponse,
|
|
26
|
-
deleteAuth,
|
|
27
|
-
readAuth,
|
|
28
|
-
writeAuth,
|
|
29
|
-
} from "../../lib/auth/auth-store";
|
|
30
|
-
import { CliError } from "../cli-error";
|
|
31
|
-
import { brandAnsi, colorsEnabled, ANSI_RESET, ANSI_DIM } from "../hooks/tui";
|
|
32
|
-
import { trackHookEvent } from "../hooks/hook-telemetry";
|
|
33
|
-
import { getInstanceId } from "../../lib/telemetry-id";
|
|
34
|
-
|
|
35
|
-
interface AuthCliOptions {
|
|
36
|
-
mode: "login" | "logout" | "whoami" | "help";
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const HELP = `
|
|
40
|
-
failproofai auth — sign in to FailproofAI from the CLI
|
|
41
|
-
|
|
42
|
-
USAGE
|
|
43
|
-
failproofai auth login Start the email + OTP login flow
|
|
44
|
-
failproofai auth logout Remove ~/.failproofai/auth.json
|
|
45
|
-
failproofai auth whoami Print the currently signed-in identity
|
|
46
|
-
failproofai auth help Show this help (also: --help, -h)
|
|
47
|
-
|
|
48
|
-
ENVIRONMENT
|
|
49
|
-
FAILPROOF_API_URL Override the api-server base URL
|
|
50
|
-
(default: https://api.befailproof.ai)
|
|
51
|
-
FAILPROOFAI_AUTH_DIR Override where auth.json is stored
|
|
52
|
-
(default: ~/.failproofai)
|
|
53
|
-
|
|
54
|
-
EXAMPLES
|
|
55
|
-
failproofai auth login
|
|
56
|
-
failproofai auth whoami
|
|
57
|
-
failproofai auth logout
|
|
58
|
-
`.trimStart();
|
|
59
|
-
|
|
60
|
-
/** Deprecated `--login` / `--logout` / `--whoami` flags map back to subcommands
|
|
61
|
-
* so shell history and older docs keep working silently. */
|
|
62
|
-
const LEGACY_FLAG_TO_SUB: Record<string, "login" | "logout" | "whoami"> = {
|
|
63
|
-
"--login": "login",
|
|
64
|
-
"--logout": "logout",
|
|
65
|
-
"--whoami": "whoami",
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
const SUBCOMMANDS = new Set(["login", "logout", "whoami", "help"]);
|
|
69
|
-
|
|
70
|
-
export function parseAuthArgs(args: string[]): AuthCliOptions {
|
|
71
|
-
if (args.includes("--help") || args.includes("-h")) return { mode: "help" };
|
|
72
|
-
|
|
73
|
-
const positional: string[] = [];
|
|
74
|
-
const legacy: ("login" | "logout" | "whoami")[] = [];
|
|
75
|
-
for (const a of args) {
|
|
76
|
-
if (a === "--help" || a === "-h") continue;
|
|
77
|
-
if (a in LEGACY_FLAG_TO_SUB) {
|
|
78
|
-
legacy.push(LEGACY_FLAG_TO_SUB[a]);
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
if (a.startsWith("-")) {
|
|
82
|
-
throw new CliError(
|
|
83
|
-
`Unknown flag for auth: ${a}\nRun \`failproofai auth help\` for usage.`,
|
|
84
|
-
);
|
|
85
|
-
}
|
|
86
|
-
positional.push(a);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
const subs = [...positional, ...legacy];
|
|
90
|
-
if (subs.length === 0) return { mode: "help" };
|
|
91
|
-
if (subs.length > 1) {
|
|
92
|
-
throw new CliError(
|
|
93
|
-
`Pick one of login, logout, whoami.\nRun \`failproofai auth help\` for usage.`,
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
const sub = subs[0];
|
|
97
|
-
if (!SUBCOMMANDS.has(sub)) {
|
|
98
|
-
throw new CliError(
|
|
99
|
-
`Unknown auth subcommand: ${sub}\nRun \`failproofai auth help\` for usage.`,
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
return { mode: sub as AuthCliOptions["mode"] };
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function prompt(question: string, opts: { hidden?: boolean } = {}): Promise<string> {
|
|
106
|
-
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
107
|
-
if (opts.hidden && process.stdin.isTTY) {
|
|
108
|
-
const r = rl as unknown as {
|
|
109
|
-
_writeToOutput: (s: string) => void;
|
|
110
|
-
output: NodeJS.WritableStream;
|
|
111
|
-
};
|
|
112
|
-
const orig = r._writeToOutput.bind(rl);
|
|
113
|
-
r._writeToOutput = (s: string): void => {
|
|
114
|
-
if (s.length > 0 && s !== "\r\n" && s !== "\n") orig("*");
|
|
115
|
-
else orig(s);
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
return new Promise((resolve) => {
|
|
119
|
-
rl.question(question, (answer: string) => {
|
|
120
|
-
rl.close();
|
|
121
|
-
if (opts.hidden && process.stdin.isTTY) process.stdout.write("\n");
|
|
122
|
-
resolve(answer.trim());
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Brand palette (see hooks/tui.ts) rather than this file's former private
|
|
128
|
-
// 256-colour set, so `auth` matches `config` and `audit`. Resolved once here
|
|
129
|
-
// and blanked when colour is off — these are interpolated directly into
|
|
130
|
-
// template literals at ~15 call sites, which previously meant `auth` emitted
|
|
131
|
-
// escape codes even under NO_COLOR. Blanking the constants fixes every call
|
|
132
|
-
// site at once. The palette has no red, and both uses are recoverable input
|
|
133
|
-
// errors ("try again") rather than failures, so they take the amber warn hue.
|
|
134
|
-
const COLOR = colorsEnabled(process.stdout);
|
|
135
|
-
const DIM = COLOR ? ANSI_DIM : "";
|
|
136
|
-
const RESET = COLOR ? ANSI_RESET : "";
|
|
137
|
-
const PINK = COLOR ? brandAnsi("pink") : "";
|
|
138
|
-
const GREEN = COLOR ? brandAnsi("guide") : "";
|
|
139
|
-
const RED = COLOR ? brandAnsi("warn") : "";
|
|
140
|
-
|
|
141
|
-
function emailLooksValid(email: string): boolean {
|
|
142
|
-
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
async function runLogin(): Promise<void> {
|
|
146
|
-
const existing = readAuth();
|
|
147
|
-
if (existing) {
|
|
148
|
-
// Treat the on-disk session as valid only when its refresh window hasn't
|
|
149
|
-
// already lapsed locally. We don't hit /me here (the file header explicitly
|
|
150
|
-
// avoids server validation so login/logout/whoami stay coherent offline),
|
|
151
|
-
// but the local exp claim is enough to recognise an obviously-stale file
|
|
152
|
-
// and let the user re-authenticate instead of bouncing them out.
|
|
153
|
-
const nowSecs = Math.floor(Date.now() / 1000);
|
|
154
|
-
const refreshUsable = existing.refresh_expires_at > nowSecs;
|
|
155
|
-
if (refreshUsable) {
|
|
156
|
-
await trackHookEvent(getInstanceId(), "audit_cli_auth_login_completed", {
|
|
157
|
-
source: "cli",
|
|
158
|
-
status: "already_signed_in",
|
|
159
|
-
user_id: existing.user.id,
|
|
160
|
-
});
|
|
161
|
-
process.stdout.write(
|
|
162
|
-
`${DIM}already signed in as${RESET} ${existing.user.email} ${DIM}(use \`failproofai auth logout\` to switch accounts)${RESET}\n`,
|
|
163
|
-
);
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
process.stdout.write(
|
|
167
|
-
`${DIM}stored session for ${existing.user.email} has expired — re-authenticating.${RESET}\n`,
|
|
168
|
-
);
|
|
169
|
-
// Overwrite cleanly so a half-broken file doesn't survive next startup.
|
|
170
|
-
deleteAuth();
|
|
171
|
-
}
|
|
172
|
-
// Fire-and-forget: the interactive `email:` / `code:` prompts that follow keep
|
|
173
|
-
// the process alive well past the 5s fetch, and awaiting would stall the prompt.
|
|
174
|
-
void trackHookEvent(getInstanceId(), "audit_cli_auth_login_started", {
|
|
175
|
-
source: "cli",
|
|
176
|
-
api_base: getApiBase(),
|
|
177
|
-
replaced_stale: existing !== null,
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
process.stdout.write(`${PINK}━━ failproofai auth ━━${RESET}\n`);
|
|
181
|
-
process.stdout.write(`${DIM}api: ${getApiBase()}${RESET}\n\n`);
|
|
182
|
-
|
|
183
|
-
let email = "";
|
|
184
|
-
for (let attempt = 0; attempt < 3; attempt++) {
|
|
185
|
-
email = await prompt("email: ");
|
|
186
|
-
if (emailLooksValid(email)) break;
|
|
187
|
-
process.stdout.write(`${RED}that doesn't look like an email — try again.${RESET}\n`);
|
|
188
|
-
email = "";
|
|
189
|
-
}
|
|
190
|
-
if (!email) {
|
|
191
|
-
await trackHookEvent(getInstanceId(), "audit_cli_auth_login_completed", {
|
|
192
|
-
source: "cli",
|
|
193
|
-
status: "aborted_invalid_email",
|
|
194
|
-
});
|
|
195
|
-
throw new CliError("Could not read a valid email after 3 attempts.");
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
try {
|
|
199
|
-
const r = await requestLoginCode(email);
|
|
200
|
-
// Fire-and-forget: the `code:` prompt loop below keeps the process alive.
|
|
201
|
-
void trackHookEvent(getInstanceId(), "audit_otp_requested", {
|
|
202
|
-
source: "cli",
|
|
203
|
-
status: "success",
|
|
204
|
-
expires_in: r.expires_in,
|
|
205
|
-
resend_available_in: r.resend_available_in,
|
|
206
|
-
});
|
|
207
|
-
process.stdout.write(
|
|
208
|
-
`\n${GREEN}code sent.${RESET} ${DIM}check ${email} — expires in ${r.expires_in}s.${RESET}\n`,
|
|
209
|
-
);
|
|
210
|
-
} catch (err) {
|
|
211
|
-
const isApi = err instanceof AuthApiError;
|
|
212
|
-
await trackHookEvent(getInstanceId(), "audit_otp_requested", {
|
|
213
|
-
source: "cli",
|
|
214
|
-
status: "failed",
|
|
215
|
-
error_code: isApi ? err.code : "upstream_unreachable",
|
|
216
|
-
http_status: isApi ? err.status : null,
|
|
217
|
-
});
|
|
218
|
-
if (isApi && err.code === "rate_limited") {
|
|
219
|
-
throw new CliError(
|
|
220
|
-
`Rate limited — try again in ${err.retryAfterSecs ?? "a few"} seconds.`,
|
|
221
|
-
);
|
|
222
|
-
}
|
|
223
|
-
if (isApi) {
|
|
224
|
-
throw new CliError(`Login request failed (${err.code}): ${err.message}`);
|
|
225
|
-
}
|
|
226
|
-
throw new CliError(
|
|
227
|
-
`Could not reach the api-server at ${getApiBase()}.\n` +
|
|
228
|
-
`Check your network, or set FAILPROOF_API_URL to point at a different host.`,
|
|
229
|
-
);
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
let tokenResp;
|
|
233
|
-
let verifyAttempts = 0;
|
|
234
|
-
for (let attempt = 0; attempt < 5; attempt++) {
|
|
235
|
-
const code = await prompt("code: ", { hidden: true });
|
|
236
|
-
if (!code) continue;
|
|
237
|
-
verifyAttempts += 1;
|
|
238
|
-
try {
|
|
239
|
-
tokenResp = await verifyLoginCode(email, code);
|
|
240
|
-
break;
|
|
241
|
-
} catch (err) {
|
|
242
|
-
const isApi = err instanceof AuthApiError;
|
|
243
|
-
await trackHookEvent(getInstanceId(), "audit_otp_verified", {
|
|
244
|
-
source: "cli",
|
|
245
|
-
status: "failed",
|
|
246
|
-
attempt: verifyAttempts,
|
|
247
|
-
error_code: isApi ? err.code : "upstream_unreachable",
|
|
248
|
-
http_status: isApi ? err.status : null,
|
|
249
|
-
});
|
|
250
|
-
if (isApi && err.status === 401) {
|
|
251
|
-
process.stdout.write(`${RED}code rejected — try again.${RESET}\n`);
|
|
252
|
-
continue;
|
|
253
|
-
}
|
|
254
|
-
if (isApi) {
|
|
255
|
-
throw new CliError(`Verify failed (${err.code}): ${err.message}`);
|
|
256
|
-
}
|
|
257
|
-
throw new CliError(
|
|
258
|
-
`Could not reach the api-server at ${getApiBase()}.`,
|
|
259
|
-
);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
if (!tokenResp) {
|
|
263
|
-
await trackHookEvent(getInstanceId(), "audit_cli_auth_login_completed", {
|
|
264
|
-
source: "cli",
|
|
265
|
-
status: "exhausted_attempts",
|
|
266
|
-
attempts: verifyAttempts,
|
|
267
|
-
});
|
|
268
|
-
throw new CliError("Too many bad codes — start over.");
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
writeAuth(authFromTokenResponse(tokenResp));
|
|
272
|
-
await trackHookEvent(getInstanceId(), "audit_otp_verified", {
|
|
273
|
-
source: "cli",
|
|
274
|
-
status: "success",
|
|
275
|
-
attempt: verifyAttempts,
|
|
276
|
-
user_id: tokenResp.user.id,
|
|
277
|
-
email: tokenResp.user.email,
|
|
278
|
-
});
|
|
279
|
-
// Bridge the anonymous local instance ID to the server-issued user identity.
|
|
280
|
-
// PostHog can stitch together "anonymous machine X did Y" events emitted
|
|
281
|
-
// before sign-in with "user Z" events that follow, by joining on
|
|
282
|
-
// `local_random_id` (== this event's distinct_id). The verified email +
|
|
283
|
-
// `$set` persist the account onto the device person. The dashboard's
|
|
284
|
-
// /api/auth/login-verify emits the same event with
|
|
285
|
-
// `source: "audit_set_reminder_auth_dialog"`; this is the CLI sibling —
|
|
286
|
-
// without it, anyone who signs in via `failproofai auth login` stays
|
|
287
|
-
// unjoined to their pre-auth events.
|
|
288
|
-
await trackHookEvent(getInstanceId(), "audit_user_identity_linked", {
|
|
289
|
-
source: "cli",
|
|
290
|
-
user_id: tokenResp.user.id,
|
|
291
|
-
email: tokenResp.user.email,
|
|
292
|
-
local_random_id: getInstanceId(),
|
|
293
|
-
$set: { email: tokenResp.user.email, user_id: tokenResp.user.id },
|
|
294
|
-
});
|
|
295
|
-
await trackHookEvent(getInstanceId(), "audit_cli_auth_login_completed", {
|
|
296
|
-
source: "cli",
|
|
297
|
-
status: "success",
|
|
298
|
-
attempts: verifyAttempts,
|
|
299
|
-
user_id: tokenResp.user.id,
|
|
300
|
-
});
|
|
301
|
-
process.stdout.write(
|
|
302
|
-
`\n${GREEN}✓ signed in as ${tokenResp.user.email}${RESET}\n` +
|
|
303
|
-
`${DIM}session saved to ~/.failproofai/auth.json (mode 0600)${RESET}\n`,
|
|
304
|
-
);
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
async function runLogout(): Promise<void> {
|
|
308
|
-
const existing = readAuth();
|
|
309
|
-
if (!existing) {
|
|
310
|
-
await trackHookEvent(getInstanceId(), "audit_cli_auth_logout_completed", {
|
|
311
|
-
source: "cli",
|
|
312
|
-
had_session: false,
|
|
313
|
-
upstream: "noop",
|
|
314
|
-
});
|
|
315
|
-
process.stdout.write(`${DIM}not signed in. nothing to do.${RESET}\n`);
|
|
316
|
-
return;
|
|
317
|
-
}
|
|
318
|
-
// Best-effort server revoke — failure does not block the local wipe.
|
|
319
|
-
let upstream: "revoked" | "failed" = "revoked";
|
|
320
|
-
try {
|
|
321
|
-
await logoutSession(existing.access_token, existing.refresh_token);
|
|
322
|
-
} catch (err) {
|
|
323
|
-
if (err instanceof AuthApiError && err.status === 401) {
|
|
324
|
-
// already invalid server-side
|
|
325
|
-
} else {
|
|
326
|
-
upstream = "failed";
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
deleteAuth();
|
|
330
|
-
await trackHookEvent(getInstanceId(), "audit_cli_auth_logout_completed", {
|
|
331
|
-
source: "cli",
|
|
332
|
-
had_session: true,
|
|
333
|
-
upstream,
|
|
334
|
-
user_id: existing.user.id,
|
|
335
|
-
});
|
|
336
|
-
process.stdout.write(
|
|
337
|
-
`${GREEN}✓ signed out as ${existing.user.email}.${RESET}\n`,
|
|
338
|
-
);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
async function runWhoami(): Promise<void> {
|
|
342
|
-
const existing = readAuth();
|
|
343
|
-
if (!existing) {
|
|
344
|
-
await trackHookEvent(getInstanceId(), "audit_cli_auth_whoami", {
|
|
345
|
-
source: "cli",
|
|
346
|
-
authenticated: false,
|
|
347
|
-
});
|
|
348
|
-
process.stdout.write(`${DIM}not signed in — run \`failproofai auth login\` to sign in.${RESET}\n`);
|
|
349
|
-
process.exitCode = 1;
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
await trackHookEvent(getInstanceId(), "audit_cli_auth_whoami", {
|
|
353
|
-
source: "cli",
|
|
354
|
-
authenticated: true,
|
|
355
|
-
user_id: existing.user.id,
|
|
356
|
-
});
|
|
357
|
-
process.stdout.write(
|
|
358
|
-
`${GREEN}✓${RESET} ${existing.user.email} ${DIM}(${existing.user.id})${RESET}\n`,
|
|
359
|
-
);
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
export async function runAuthCli(args: string[]): Promise<void> {
|
|
363
|
-
const opts = parseAuthArgs(args);
|
|
364
|
-
if (opts.mode === "help") {
|
|
365
|
-
process.stdout.write(HELP);
|
|
366
|
-
return;
|
|
367
|
-
}
|
|
368
|
-
if (opts.mode === "login") return runLogin();
|
|
369
|
-
if (opts.mode === "logout") return runLogout();
|
|
370
|
-
return runWhoami();
|
|
371
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|