failproofai 0.0.10 → 0.0.11-beta.10
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 +9 -1
- package/.next/standalone/.next/build-manifest.json +10 -10
- package/.next/standalone/.next/prerender-manifest.json +3 -32
- package/.next/standalone/.next/required-server-files.json +2 -1
- package/.next/standalone/.next/routes-manifest.json +51 -3
- package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +7 -7
- 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 +6 -6
- 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 +7 -7
- package/.next/standalone/.next/server/app/_not-found/page/next-font-manifest.json +2 -6
- 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 +12 -13
- 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 +16 -16
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +16 -16
- 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/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/audit/invite/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/audit/invite/route.js +7 -0
- package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/audit/invite/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/audit/run/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/audit/run/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/audit/run/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/audit/run/route.js +8 -0
- package/.next/standalone/.next/server/app/api/audit/run/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/audit/run/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/audit/status/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/audit/status/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/audit/status/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/audit/status/route.js +6 -0
- package/.next/standalone/.next/server/app/api/audit/status/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/audit/status/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js +6 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/login-request/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/login-verify/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/reminder/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/status/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/auth/status/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/auth/status/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/auth/status/route.js +7 -0
- package/.next/standalone/.next/server/app/api/auth/status/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/auth/status/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +3 -3
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/audit/page/build-manifest.json +18 -0
- package/.next/standalone/.next/server/app/audit/page/next-font-manifest.json +6 -0
- package/.next/standalone/.next/server/app/audit/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +29 -0
- package/.next/standalone/.next/server/app/audit/page.js +17 -0
- package/.next/standalone/.next/server/app/audit/page.js.map +5 -0
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +16 -17
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -17
- 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 -3
- package/.next/standalone/.next/server/app/page/build-manifest.json +7 -7
- package/.next/standalone/.next/server/app/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js +14 -15
- 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 +7 -7
- package/.next/standalone/.next/server/app/policies/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js +16 -16
- 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 +7 -7
- package/.next/standalone/.next/server/app/project/[name]/page/next-font-manifest.json +2 -6
- 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 +16 -17
- 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 +7 -7
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/next-font-manifest.json +2 -6
- 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 +19 -20
- 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 +7 -7
- package/.next/standalone/.next/server/app/projects/page/next-font-manifest.json +2 -6
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js +15 -16
- 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-paths-manifest.json +9 -1
- package/.next/standalone/.next/server/chunks/[externals]__14odj07._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[externals]__0z0j--b._.js → [externals]__1nl3dvw._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]__0-p9.k~._.js → [externals]__1s61mel._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]_node_os_06ur78j._.js → [externals]_node_os_0by37l-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0kjo7d_._.js → [root-of-the-server]__0_0xu5z._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cag8qd._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0z-180.._.js → [root-of-the-server]__0cycwg6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__08px0ym._.js → [root-of-the-server]__0f7mikp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q-v9z2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rv7m0k._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0g48iv.._.js → [root-of-the-server]__0sb_5m8._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0j8-xkl._.js → [root-of-the-server]__0xuaoik._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h8pzr._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__17g9wh7._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1_mqemn._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0vlhtkc._.js → [root-of-the-server]__1hgv_75._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0wu7fr7._.js → [root-of-the-server]__1jm9fw6._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1legmza._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__044xt9.._.js → [root-of-the-server]__1m2_4t0._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0yfq1yr._.js → [root-of-the-server]__1mhmdzs._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0zso~62._.js → [root-of-the-server]__1ou2ehh._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1qxztj-._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1r1h8v9._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1rhmvod._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1uatkiv._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0.~nmr9._.js → [root-of-the-server]__1w9zl9-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1y6gxxb._.js +3 -0
- package/.next/standalone/.next/server/chunks/{_0ebx_lc._.js → _0p53ge1._.js} +2 -2
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_invite_route_actions_0-2n5sy.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_run_route_actions_1qgp9io.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_audit_status_route_actions_1f7pjof.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_login-request_route_actions_1c49co0.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_login-verify_route_actions_1r3slzk.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_logout_route_actions_0regwyr.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_reminder_route_actions_1kjgxf8.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_auth_status_route_actions_1aho9zu.js +3 -0
- package/.next/standalone/.next/server/chunks/{_next-internal_server_app_api_download_[project]_[session]_route_actions_0wb00i-.js → _next-internal_server_app_api_download_[project]_[session]_route_actions_1is7vs7.js} +1 -1
- package/.next/standalone/.next/server/chunks/{lib_logger_ts_047tt9f._.js → lib_logger_ts_07e65t5._.js} +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_0-tu4ot._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_0ttxbz7._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_1bnh1y0._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_1epycqa._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_1wpdcgo._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +23 -0
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +3 -0
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[externals]__12dv.x0._.js → [externals]__1_g_b3t._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[externals]_node_async_hooks_0v0ln8c._.js → [externals]_node_async_hooks_1gjz99j._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01tn1ou._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0808sha._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e4-6d8._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ehe24g._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0f62vu9._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g253ve._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h12me5._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0k65l27._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vxf0_g._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11rtg6s._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12mcauo._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__14dd6h8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0t5l7a5._.js → [root-of-the-server]__1d8omgc._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__10xgshr._.js → [root-of-the-server]__1dky4g0._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1e-x7j4._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1fax1sl._.js +19 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1mt35_w._.js +221 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1pcxxwg._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1usf8v2._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1uvfwgr._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1w6v_1u._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__212nf49._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_03d7qyt._.js → _05whahf._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0il3fl1._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_0xb8ngh._.js → _1kje4fm._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0zx~s__._.js → _1p0-leb._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_04qfs8z._.js → app_087bt9w._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_0uosk1e._.js → app_1fvisnp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_13f0ohr._.js → app_209u41o._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +65 -0
- package/.next/standalone/.next/server/chunks/ssr/app_audit_loading_tsx_1j1kc6j._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{app_error_tsx_11t4ysq._.js → app_error_tsx_1zds1ns._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_global-error_tsx_0m9qisk._.js → app_global-error_tsx_113y3za._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +8 -0
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_error_tsx_0.9-fod._.js → app_project_[name]_error_tsx_1v02_5n._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_loading_tsx_03g9xy0._.js → app_project_[name]_loading_tsx_05-l4uf._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_session_[sessionId]_error_tsx_0ler-mr._.js → app_project_[name]_session_[sessionId]_error_tsx_0-lj3nd._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{app_project_[name]_session_[sessionId]_loading_tsx_0c0e3yx._.js → app_project_[name]_session_[sessionId]_loading_tsx_0l4aixs._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_projects_loading_tsx_20-3u8b._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{lib_codex-projects_ts_0eosib~._.js → lib_codex-projects_ts_0pqlw37._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_copilot-projects_ts_0r8xkn8._.js → lib_copilot-projects_ts_19wl7tp._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_cursor-projects_ts_0qt1scg._.js → lib_cursor-projects_ts_18-iwyk._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_gemini-projects_ts_0sl~yqr._.js → lib_gemini-projects_ts_1c7bgx-._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_opencode-projects_ts_0op9gyp._.js → lib_opencode-projects_ts_15bjxkm._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{lib_pi-projects_ts_103tsh1._.js → lib_pi-projects_ts_1wikofb._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/lib_utils_ts_0az0sfq._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_1ynf7el._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_html-to-image_es_index_0nye1s3.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_html-to-image_es_index_1ao30b1.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_0rd0oc-._.js → node_modules_next_1a1kch7._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0uboya6._.js +6 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_11dij6w._.js → node_modules_next_dist_1d_onnt._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_0inhx6q._.js → node_modules_next_dist_client_components_0wpq8j3._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js → node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js → node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0-uvagv.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03c7gi5.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09p-8om.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0v-kfiu.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0xrgzyz.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1806lsc.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1j6dd-e.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1sa65r-.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1ezd2jf._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1tnuifj._.js +5 -0
- package/.next/standalone/.next/server/functions-config-manifest.json +2 -2
- package/.next/standalone/.next/server/instrumentation.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +10 -10
- package/.next/standalone/.next/server/middleware.js +2 -2
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +2 -21
- 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 +27 -9
- package/.next/standalone/.next/static/{dAuQps6jUwCz9X1Q5FFOO → DOSSF5hRUtt3-QZEm-ZIk}/_clientMiddlewareManifest.js +2 -2
- package/.next/standalone/.next/static/chunks/{0pkl..xgo-qox.js → 02e80j0576qfu.js} +1 -1
- package/.next/standalone/.next/static/chunks/{07uz2g0_38qia.js → 03fmihek9n986.js} +1 -1
- package/.next/standalone/.next/static/chunks/0f7d7hnbh4djs.js +1 -0
- package/.next/standalone/.next/static/chunks/0h7auy7hzjyhw.js +1 -0
- package/.next/standalone/.next/static/chunks/0wwt5o04i4zwh.js +1 -0
- package/.next/standalone/.next/static/chunks/0zbxssxh53n-3.js +1 -0
- package/.next/standalone/.next/static/chunks/13f1kmjea-0md.js +2 -0
- package/.next/standalone/.next/static/chunks/13xzda05yw19e.js +1 -0
- package/.next/standalone/.next/static/chunks/{150i0n26fnvso.js → 1__i9af9g78vd.js} +1 -1
- package/.next/standalone/.next/static/chunks/1uxa5lm6yco79.js +1 -0
- package/.next/standalone/.next/static/chunks/20dqelk3xz_ya.css +1 -0
- package/.next/standalone/.next/static/chunks/{0j171xiqge4rv.js → 29lzaddhez98q.js} +1 -1
- package/.next/standalone/.next/static/chunks/29nrs5xs9c4hx.css +2 -0
- package/.next/standalone/.next/static/chunks/{0lt8ko3lw.5yt.js → 2b_e9tyly10lo.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0rnqmir4cd5p9.js → 2h0dkzyy0vocp.js} +1 -1
- package/.next/standalone/.next/static/chunks/2lp3a3a3_4_9o.js +63 -0
- package/.next/standalone/.next/static/chunks/{179yytvmam0ug.js → 2nt_slonrn0rw.js} +1 -1
- package/.next/standalone/.next/static/chunks/2plcgtv_tkv9t.js +1 -0
- package/.next/standalone/.next/static/chunks/33k2epr1iz8_z.js +6 -0
- package/.next/standalone/.next/static/chunks/{0d3shmwh5_nmn.js → 33u59vf_8xpd-.js} +1 -1
- package/.next/standalone/.next/static/chunks/3zkg2s2vzxc3d.js +1 -0
- package/.next/standalone/.next/static/chunks/{turbopack-05z7a19q43zfq.js → turbopack-3lrm4f20fz89b.js} +1 -1
- package/.next/standalone/SECURITY.md +73 -0
- package/.next/standalone/app/actions/get-audit-result.ts +35 -0
- package/.next/standalone/app/api/audit/_state.ts +79 -0
- package/.next/standalone/app/api/audit/invite/route.ts +183 -0
- package/.next/standalone/app/api/audit/run/route.ts +103 -0
- package/.next/standalone/app/api/audit/status/route.ts +24 -0
- package/.next/standalone/app/api/auth/login-request/route.ts +91 -0
- package/.next/standalone/app/api/auth/login-verify/route.ts +98 -0
- package/.next/standalone/app/api/auth/logout/route.ts +48 -0
- package/.next/standalone/app/api/auth/reminder/route.ts +213 -0
- package/.next/standalone/app/api/auth/status/route.ts +42 -0
- package/.next/standalone/app/audit/_components/audit-dashboard.tsx +397 -0
- package/.next/standalone/app/audit/_components/audit-poster.tsx +326 -0
- package/.next/standalone/app/audit/_components/audit-progress-strip.tsx +98 -0
- package/.next/standalone/app/audit/_components/auth-dialog.tsx +375 -0
- package/.next/standalone/app/audit/_components/come-back-better-section.tsx +333 -0
- package/.next/standalone/app/audit/_components/empty-state.tsx +152 -0
- package/.next/standalone/app/audit/_components/how-to-improve-section.tsx +187 -0
- package/.next/standalone/app/audit/_components/invite-dialog.tsx +227 -0
- package/.next/standalone/app/audit/_components/quirks-section.tsx +75 -0
- package/.next/standalone/app/audit/_components/report-footer.tsx +35 -0
- package/.next/standalone/app/audit/_components/rerun-button.tsx +119 -0
- package/.next/standalone/app/audit/_components/run-progress.tsx +120 -0
- package/.next/standalone/app/audit/_components/share-templates.ts +94 -0
- package/.next/standalone/app/audit/_components/sigil.tsx +36 -0
- package/.next/standalone/app/audit/_components/strengths-section.tsx +45 -0
- package/.next/standalone/app/audit/audit-styles.css +1178 -0
- package/.next/standalone/app/audit/loading.tsx +24 -0
- package/.next/standalone/app/audit/page.tsx +63 -0
- package/.next/standalone/app/components/sessions-list.tsx +77 -80
- package/.next/standalone/app/globals.css +754 -139
- package/.next/standalone/app/layout.tsx +6 -8
- package/.next/standalone/app/policies/hooks-client.tsx +340 -141
- package/.next/standalone/app/project/[name]/page.tsx +31 -37
- package/.next/standalone/app/projects/loading.tsx +30 -8
- package/.next/standalone/app/projects/page.tsx +66 -17
- package/.next/standalone/assets/audit/Audit Report.html +22 -0
- package/.next/standalone/assets/audit/Show Off Your Agent.html +22 -0
- package/.next/standalone/assets/audit/archetypes.jsx +277 -0
- package/.next/standalone/assets/audit/assets/fonts/bitcount-prop-single.woff2 +0 -0
- package/.next/standalone/assets/audit/audit.jsx +825 -0
- package/.next/standalone/assets/audit/poster-styles.css +424 -0
- package/.next/standalone/assets/audit/poster.jsx +247 -0
- package/.next/standalone/assets/audit/screenshots/poster-optimist.png +0 -0
- package/.next/standalone/assets/audit/screenshots/poster-scrolled.png +0 -0
- package/.next/standalone/assets/audit/styles.css +1225 -0
- package/.next/standalone/assets/audit/tweaks-panel.jsx +425 -0
- package/.next/standalone/assets/logos/company/icon.svg +1 -0
- package/.next/standalone/assets/logos/company/logo.svg +1 -0
- package/.next/standalone/components/navbar.tsx +119 -65
- package/.next/standalone/components/reach-developers.tsx +39 -11
- package/.next/standalone/lib/atomic-write.ts +67 -0
- package/.next/standalone/lib/auth/api-server-client.ts +306 -0
- package/.next/standalone/lib/auth/auth-store.ts +250 -0
- package/.next/standalone/lib/claude-sessions.ts +181 -0
- package/.next/standalone/lib/client-telemetry.ts +2 -0
- package/.next/standalone/lib/fetch-with-timeout.ts +59 -0
- package/.next/standalone/lib/share-card.ts +144 -0
- package/.next/standalone/lib/telemetry.ts +12 -7
- package/.next/standalone/node_modules/@next/env/package.json +2 -2
- package/.next/standalone/node_modules/next/dist/build/static-paths/app.js +2 -1
- package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
- package/.next/standalone/node_modules/next/dist/build/utils.js +2 -1
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/fetch-server-response.js +2 -2
- package/.next/standalone/node_modules/next/dist/client/components/router-reducer/set-cache-busting-search-param.js +8 -2
- package/.next/standalone/node_modules/next/dist/client/dev/debug-channel.js +102 -2
- package/.next/standalone/node_modules/next/dist/client/route-params.js +23 -6
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +13 -13
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +13 -13
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route-turbo.runtime.prod.js +2 -2
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +10 -10
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
- package/.next/standalone/node_modules/next/dist/server/app-render/action-handler.js +21 -14
- package/.next/standalone/node_modules/next/dist/server/app-render/app-render.js +62 -9
- package/.next/standalone/node_modules/next/dist/server/app-render/collect-segment-data.js +16 -0
- package/.next/standalone/node_modules/next/dist/server/app-render/create-component-tree.js +49 -19
- package/.next/standalone/node_modules/next/dist/server/app-render/get-script-nonce-from-header.js +8 -20
- package/.next/standalone/node_modules/next/dist/server/app-render/metadata-insertion/create-server-inserted-metadata.js +8 -7
- package/.next/standalone/node_modules/next/dist/server/app-render/use-flight-response.js +2 -2
- package/.next/standalone/node_modules/next/dist/server/async-storage/work-store.js +2 -1
- package/.next/standalone/node_modules/next/dist/server/base-server.js +13 -5
- package/.next/standalone/node_modules/next/dist/server/config-schema.js +1 -0
- package/.next/standalone/node_modules/next/dist/server/config.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +2 -2
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/dev/static-paths-worker.js +2 -1
- package/.next/standalone/node_modules/next/dist/server/image-optimizer.js +22 -2
- package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/encode-cache-tag.js +45 -0
- package/.next/standalone/node_modules/next/dist/server/lib/implicit-tags.js +6 -3
- package/.next/standalone/node_modules/next/dist/server/lib/is-rsc-request.js +18 -0
- package/.next/standalone/node_modules/next/dist/server/lib/mock-request.js +30 -5
- package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +5 -1
- package/.next/standalone/node_modules/next/dist/server/lib/patch-set-header.js +7 -0
- package/.next/standalone/node_modules/next/dist/server/lib/router-server.js +6 -3
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/resolve-routes.js +18 -4
- package/.next/standalone/node_modules/next/dist/server/lib/server-ipc/utils.js +3 -1
- package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/next-server.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/request/fallback-params.js +27 -1
- package/.next/standalone/node_modules/next/dist/server/route-modules/app-route/module.js +1 -0
- package/.next/standalone/node_modules/next/dist/server/route-modules/route-module.js +11 -1
- package/.next/standalone/node_modules/next/dist/server/server-utils.js +19 -2
- package/.next/standalone/node_modules/next/dist/server/stream-utils/node-web-streams-helper.js +5 -5
- package/.next/standalone/node_modules/next/dist/server/use-cache/use-cache-wrapper.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/web/adapter.js +4 -1
- package/.next/standalone/node_modules/next/dist/server/web/edge-route-module-wrapper.js +2 -1
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/revalidate.js +4 -3
- package/.next/standalone/node_modules/next/dist/server/web/spec-extension/unstable-cache.js +6 -2
- package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
- package/.next/standalone/node_modules/next/dist/{server → shared/lib}/htmlescape.js +15 -0
- package/.next/standalone/node_modules/next/dist/shared/lib/router/routes/app.js +13 -1
- package/.next/standalone/node_modules/next/dist/shared/lib/router/utils/cache-busting-search-param.js +56 -10
- package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/swc-load-failure.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
- package/.next/standalone/node_modules/next/package.json +15 -15
- 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 +1 -1
- 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 +2 -2
- package/.next/standalone/osv-scanner.toml +17 -0
- package/.next/standalone/package.json +26 -18
- package/.next/standalone/proxy.ts +1 -1
- package/.next/standalone/public/audit/fonts/bitcount-prop-single.woff2 +0 -0
- package/.next/standalone/public/icon.svg +1 -0
- package/.next/standalone/public/logo.svg +1 -0
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/templates/bitcount-font/README.md +42 -0
- package/.next/standalone/templates/bitcount-font/bitcount-prop-single.woff2 +0 -0
- package/.next/standalone/templates/bitcount-font/bitcount.css +49 -0
- package/.next/standalone/templates/bitcount-font/fonts.ts.example +23 -0
- package/README.md +12 -5
- package/bin/failproofai.mjs +263 -70
- package/dist/cli.mjs +3830 -1617
- package/lib/atomic-write.ts +67 -0
- package/lib/auth/api-server-client.ts +306 -0
- package/lib/auth/auth-store.ts +250 -0
- package/lib/claude-sessions.ts +181 -0
- package/lib/client-telemetry.ts +2 -0
- package/lib/fetch-with-timeout.ts +59 -0
- package/lib/share-card.ts +144 -0
- package/lib/telemetry.ts +12 -7
- package/package.json +26 -18
- package/scripts/install-telemetry.mjs +4 -0
- package/scripts/launch.ts +2 -2
- package/scripts/postinstall.mjs +89 -1
- package/src/audit/archetypes.ts +944 -0
- package/src/audit/cache.ts +151 -0
- package/src/audit/cli-adapters/claude.ts +97 -0
- package/src/audit/cli-adapters/codex.ts +56 -0
- package/src/audit/cli-adapters/copilot.ts +51 -0
- package/src/audit/cli-adapters/cursor.ts +51 -0
- package/src/audit/cli-adapters/gemini.ts +51 -0
- package/src/audit/cli-adapters/index.ts +70 -0
- package/src/audit/cli-adapters/opencode.ts +52 -0
- package/src/audit/cli-adapters/pi.ts +51 -0
- package/src/audit/cli-adapters/shared.ts +85 -0
- package/src/audit/cli.ts +319 -0
- package/src/audit/dashboard-cache.ts +158 -0
- package/src/audit/detectors/find-from-root.ts +27 -0
- package/src/audit/detectors/git-commit-no-verify.ts +22 -0
- package/src/audit/detectors/index.ts +33 -0
- package/src/audit/detectors/prefer-edit-over-read-cat.ts +31 -0
- package/src/audit/detectors/prefer-edit-over-sed-awk.ts +27 -0
- package/src/audit/detectors/prefer-write-over-heredoc.ts +36 -0
- package/src/audit/detectors/redundant-cd-cwd.ts +28 -0
- package/src/audit/detectors/reread-after-edit.ts +58 -0
- package/src/audit/detectors/sleep-polling-loop.ts +34 -0
- package/src/audit/features.ts +314 -0
- package/src/audit/findings.ts +298 -0
- package/src/audit/index.ts +387 -0
- package/src/audit/open-browser.ts +69 -0
- package/src/audit/replay.ts +147 -0
- package/src/audit/report.ts +349 -0
- package/src/audit/scoring.ts +174 -0
- package/src/audit/social-proof.ts +34 -0
- package/src/audit/strengths.ts +138 -0
- package/src/audit/types.ts +216 -0
- package/src/auth/cli.ts +359 -0
- package/src/hooks/builtin-policies.ts +81 -2
- package/src/hooks/custom-hooks-loader.ts +19 -3
- package/src/hooks/first-run-nudge.ts +146 -0
- package/src/hooks/handler.ts +21 -102
- package/src/hooks/hook-telemetry.ts +2 -2
- package/src/hooks/install-prompt.ts +34 -4
- package/src/hooks/manager.ts +72 -5
- package/src/hooks/policy-evaluator.ts +19 -4
- package/src/hooks/policy-registry.ts +21 -1
- package/src/hooks/policy-types.ts +9 -0
- package/src/hooks/tool-name-canonicalize.ts +65 -0
- package/src/posthog-key.ts +9 -0
- package/.next/standalone/.next/server/app/icon.png/route/app-paths-manifest.json +0 -3
- package/.next/standalone/.next/server/app/icon.png/route.js +0 -7
- package/.next/standalone/.next/server/app/icon.png/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/icon.png.body +0 -0
- package/.next/standalone/.next/server/app/icon.png.meta +0 -1
- package/.next/standalone/.next/server/chunks/[externals]_next_dist_0sqmaqd._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__06.arfm._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0__i0h0._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0d_ob4n._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fe7_q_._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fw.e.h._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pxn0e1._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xv0jh2._.js +0 -3
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_icon_png_route_actions_12.gv.r.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0bdfoky.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_05pz9._._.js +0 -3
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02r.cjq._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0370~qj._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0609ezh._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__07_-mkc._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09z7o2x._.js +0 -19
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0_sh2n0._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e9o9ri._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0l6swv1._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0logebz._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0mi5ejy._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0odijkc._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0podumr._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rkxer-._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rl2kwi._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vg0uey._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0x5limi._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ye1w50._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ymlddl._.js +0 -223
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__10._f0s._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/app_0cdqd9w._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +0 -8
- package/.next/standalone/.next/server/chunks/ssr/app_projects_loading_tsx_13veom4._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/lib_utils_ts_068jk73._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_0ttbz1~._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_06u0kr8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_0h9llsw._.js +0 -6
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a_7sdg.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0ef3uwk.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0j79~gv.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0pbja1x.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0r6o0i2.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_11y81~_.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_12or2kf.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.js +0 -3
- package/.next/standalone/.next/static/chunks/01q52wg_amm60.js +0 -2
- package/.next/standalone/.next/static/chunks/0kqar56yl~41o.js +0 -6
- package/.next/standalone/.next/static/chunks/0ml1.ck_5t36i.js +0 -1
- package/.next/standalone/.next/static/chunks/0w6fzf.07a24u.js +0 -1
- package/.next/standalone/.next/static/chunks/0zig0fh30t6ou.js +0 -1
- package/.next/standalone/.next/static/chunks/12l2t63hkyo2q.js +0 -1
- package/.next/standalone/.next/static/chunks/12pt~2f.c1sha.js +0 -1
- package/.next/standalone/.next/static/chunks/14lii11wmo450.js +0 -4
- package/.next/standalone/.next/static/chunks/17rm86uz2nd5a.css +0 -2
- package/.next/standalone/.next/static/media/4fa387ec64143e14-s.0q3udbd2bu5yp.woff2 +0 -0
- package/.next/standalone/.next/static/media/797e433ab948586e-s.p.0.q-h669a_dqa.woff2 +0 -0
- package/.next/standalone/.next/static/media/bbc41e54d2fcbd21-s.0gw~uztddq1df.woff2 +0 -0
- package/.next/standalone/.next/static/media/icon.0a.gigb3_x5pd.png +0 -0
- package/.next/standalone/app/icon.png +0 -0
- package/src/auth/login.ts +0 -104
- package/src/auth/logout.ts +0 -50
- package/src/auth/token-store.ts +0 -64
- package/src/relay/daemon.ts +0 -362
- package/src/relay/pid.ts +0 -76
- package/src/relay/queue.ts +0 -225
- /package/.next/standalone/.next/server/app/{icon.png → api/audit/invite}/route/build-manifest.json +0 -0
- /package/.next/standalone/.next/server/app/{icon.png → api/audit/invite}/route.js.map +0 -0
- /package/.next/standalone/.next/static/{dAuQps6jUwCz9X1Q5FFOO → DOSSF5hRUtt3-QZEm-ZIk}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{dAuQps6jUwCz9X1Q5FFOO → DOSSF5hRUtt3-QZEm-ZIk}/_ssgManifest.js +0 -0
- /package/.next/standalone/.next/static/chunks/{03~yq9q893hmn.js → 0cz1d0mv5g_q7.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0xbo5nl6w4lka.js → 2wbuxnsvux4di.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{0_s0luks5tay-.js → 35fgpd_feci6x.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{15fklyav5py5m.js → 3xpjn3cdgm-7m.js} +0 -0
- /package/.next/standalone/.next/static/chunks/{17.b3suj8zjjj.js → 4448_qq7bd963.js} +0 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Score derivation for the audit dashboard.
|
|
3
|
+
*
|
|
4
|
+
* Score is on 0-100, mapped to letter grades that anchor the leaderboard
|
|
5
|
+
* + tier prose. The thresholds match the reference design (assets/audit):
|
|
6
|
+
*
|
|
7
|
+
* ≥ 90 S "s tier"
|
|
8
|
+
* ≥ 80 A "a tier"
|
|
9
|
+
* ≥ 71 B "b tier"
|
|
10
|
+
* ≥ 55 C "c tier"
|
|
11
|
+
* ≥ 40 D "d tier"
|
|
12
|
+
* < 40 F "f tier"
|
|
13
|
+
*
|
|
14
|
+
* The "projected score" is the hypothetical score after enabling every
|
|
15
|
+
* recommended unenabled-builtin policy — used by the prescription section
|
|
16
|
+
* to motivate enabling them.
|
|
17
|
+
*/
|
|
18
|
+
import type { AuditResult } from "./types";
|
|
19
|
+
|
|
20
|
+
export type Grade = "S" | "A" | "B" | "C" | "D" | "F";
|
|
21
|
+
|
|
22
|
+
export function gradeFor(score: number): Grade {
|
|
23
|
+
if (score >= 90) return "S";
|
|
24
|
+
if (score >= 80) return "A";
|
|
25
|
+
if (score >= 71) return "B";
|
|
26
|
+
if (score >= 55) return "C";
|
|
27
|
+
if (score >= 40) return "D";
|
|
28
|
+
return "F";
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const TIER_NAME: Record<Grade, string> = {
|
|
32
|
+
S: "s tier", A: "a tier", B: "b tier",
|
|
33
|
+
C: "c tier", D: "d tier", F: "f tier",
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export function tierName(g: Grade): string {
|
|
37
|
+
return TIER_NAME[g];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Heuristic score on 0-100. Three properties make it *dynamic* — distinct
|
|
42
|
+
* inputs (almost) never collide on a fixed threshold the way the old
|
|
43
|
+
* hard-capped scorer did:
|
|
44
|
+
*
|
|
45
|
+
* 1. Rate-normalised. Penalty scales with the *rate* of weighted faults per
|
|
46
|
+
* tool call (× REF_EVENTS), not the absolute count. A 1000-call session
|
|
47
|
+
* with 25 denies scores higher than a 100-call one with 25 denies — and
|
|
48
|
+
* heavy users no longer all pile onto the same cap.
|
|
49
|
+
*
|
|
50
|
+
* 2. Saturating, not clipped. Each severity bucket asymptotes to a cap via
|
|
51
|
+
* `cap·(1 − e^(−p/k))` instead of `min(p, cap)`. One bad area still can't
|
|
52
|
+
* tank the score, but the curve is *strictly monotonic*, so every extra
|
|
53
|
+
* hit still moves the number — no two counts land on the same value.
|
|
54
|
+
*
|
|
55
|
+
* 3. Credited. Up to +5 from the derived strengths, so clean agents spread
|
|
56
|
+
* upward instead of all sitting at 100.
|
|
57
|
+
*
|
|
58
|
+
* Per-hit weights (pre-normalisation): deny 1.2, warn/instruct 0.7,
|
|
59
|
+
* sanitize 0.4, audit detector 0.5. Bucket caps 50 / 28 / 16 / 30 (they sum
|
|
60
|
+
* past 100 so a multi-dimension reckless agent can bottom out at F).
|
|
61
|
+
*
|
|
62
|
+
* Sessions with zero scanned transcripts return 0 (no signal, no grade).
|
|
63
|
+
*/
|
|
64
|
+
import { MIN_EVENTS } from "./features";
|
|
65
|
+
import { deriveStrengths } from "./strengths";
|
|
66
|
+
|
|
67
|
+
/** Reference tool-call volume the rate is normalised against — chosen so a
|
|
68
|
+
* moderate footprint lands around C/B and the demo anchor (~58 → C) holds.
|
|
69
|
+
* Calibrated via __tests__/audit/scoring.test.ts. */
|
|
70
|
+
const REF_EVENTS = 300;
|
|
71
|
+
|
|
72
|
+
/** Concave saturator: → `cap` as `p → ∞`, strictly increasing for all p ≥ 0. */
|
|
73
|
+
function saturate(p: number, cap: number, k: number): number {
|
|
74
|
+
return cap * (1 - Math.exp(-p / k));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Total weighted penalty for a set of rows, rate-normalised against `events`.
|
|
78
|
+
* Shared by `deriveScore` and `projectedScore` so they can't diverge. */
|
|
79
|
+
function penaltyFor(rows: AuditResult["results"], events: number): number {
|
|
80
|
+
const norm = REF_EVENTS / Math.max(events, MIN_EVENTS);
|
|
81
|
+
let deny = 0, instruct = 0, sanitize = 0, detector = 0;
|
|
82
|
+
for (const row of rows) {
|
|
83
|
+
if (row.source === "audit-detector") {
|
|
84
|
+
detector += row.hits * 0.5;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const sev = row.severity;
|
|
88
|
+
if (sev === "deny") deny += row.hits * 1.2;
|
|
89
|
+
else if (sev === "instruct" || sev === "warn") instruct += row.hits * 0.7;
|
|
90
|
+
else sanitize += row.hits * 0.4; // sanitize-* and any other gentle category
|
|
91
|
+
}
|
|
92
|
+
// Per-bucket (cap, k). The cap bounds any single failure mode; k sets how
|
|
93
|
+
// fast it ramps. k is small relative to the cap so penalties bite early and
|
|
94
|
+
// the score uses the full S→F range rather than clustering near 100. Caps
|
|
95
|
+
// sum past 100 on purpose, so a multi-dimension reckless agent can reach F.
|
|
96
|
+
return (
|
|
97
|
+
saturate(deny * norm, 50, 12) +
|
|
98
|
+
saturate(instruct * norm, 28, 10) +
|
|
99
|
+
saturate(sanitize * norm, 16, 8) +
|
|
100
|
+
saturate(detector * norm, 30, 14)
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Positive credit (0-5) from the heuristic strengths. Deliberately small so a
|
|
105
|
+
* reckless agent's "absence" strengths (e.g. "no credential leaks") can't
|
|
106
|
+
* inflate it back into the top tier. */
|
|
107
|
+
function creditFor(result: AuditResult): number {
|
|
108
|
+
return Math.min(deriveStrengths(result).length * 1.0, 5);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Exact (unrounded) score — used by tests to prove strict monotonicity and
|
|
112
|
+
* the absence of threshold collisions. */
|
|
113
|
+
export function deriveScoreExact(result: AuditResult): number {
|
|
114
|
+
if (result.transcripts.scanned === 0) return 0;
|
|
115
|
+
const events = result.eventsScanned ?? 0;
|
|
116
|
+
const score = 100 - penaltyFor(result.results, events) + creditFor(result);
|
|
117
|
+
return Math.max(0, Math.min(100, score));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function deriveScore(result: AuditResult): number {
|
|
121
|
+
return Math.round(deriveScoreExact(result));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Projected score after enabling every unenabled builtin. Doesn't actually
|
|
126
|
+
* re-run the audit — instead it credits back the hits the user would have
|
|
127
|
+
* blocked by enabling those policies, applying the same weighted penalty
|
|
128
|
+
* scheme used by `deriveScore`.
|
|
129
|
+
*
|
|
130
|
+
* Caps at 92 so the prescription never promises a guaranteed S — the user
|
|
131
|
+
* still has to keep the policies on.
|
|
132
|
+
*/
|
|
133
|
+
export function projectedScore(result: AuditResult, currentScore: number): number {
|
|
134
|
+
const events = result.eventsScanned ?? 0;
|
|
135
|
+
// Penalty as-is vs. penalty with every unenabled builtin's hits removed
|
|
136
|
+
// (enabling those policies would have blocked them). The delta is what the
|
|
137
|
+
// user recovers — computed through the same saturating, rate-normalised
|
|
138
|
+
// curve as `deriveScore`, so the projection is consistent rather than a
|
|
139
|
+
// naive per-hit sum.
|
|
140
|
+
const full = penaltyFor(result.results, events);
|
|
141
|
+
const fixedRows = result.results.filter(
|
|
142
|
+
(r) => !(r.source === "builtin" && !r.enabledInConfig),
|
|
143
|
+
);
|
|
144
|
+
const fixed = penaltyFor(fixedRows, events);
|
|
145
|
+
const recoverable = Math.max(0, full - fixed);
|
|
146
|
+
// Cap at 92 so the prescription never promises a guaranteed S.
|
|
147
|
+
const proj = Math.min(92, currentScore + Math.round(recoverable));
|
|
148
|
+
return Math.max(currentScore, proj);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Approximate global rank in the cohort. We don't have a real leaderboard
|
|
153
|
+
* yet — this is a deterministic synthetic rank derived from the score so
|
|
154
|
+
* the UI doesn't feel jittery as the user re-runs.
|
|
155
|
+
*
|
|
156
|
+
* Distribution roughly matches a bell-shape centered at 60. Cohort size
|
|
157
|
+
* is fixed at 2316 to match the reference design.
|
|
158
|
+
*/
|
|
159
|
+
export const COHORT_SIZE = 2316;
|
|
160
|
+
|
|
161
|
+
export function syntheticRank(score: number): number {
|
|
162
|
+
// Roughly: 100 → top of leaderboard, 0 → bottom. Use a smooth curve so
|
|
163
|
+
// small score changes feel meaningful but not catastrophic.
|
|
164
|
+
const percentile = scoreToPercentile(score);
|
|
165
|
+
return Math.max(1, Math.min(COHORT_SIZE, Math.round((1 - percentile) * COHORT_SIZE)));
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function scoreToPercentile(score: number): number {
|
|
169
|
+
// Logistic mapping centered at 58 — agents below 58 fall into the long
|
|
170
|
+
// tail, agents above climb steeply. Anchors the default demo (58 → ~p20).
|
|
171
|
+
const z = (score - 58) / 14;
|
|
172
|
+
const p = 1 / (1 + Math.exp(-z));
|
|
173
|
+
return p;
|
|
174
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Population-level signals shown on the audit poster: how rare your
|
|
3
|
+
* archetype is and where your score sits in the cohort. Seeded with
|
|
4
|
+
* snapshot values; swap for live aggregates once that pipeline lands.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { ArchetypeKey } from "./archetypes";
|
|
8
|
+
|
|
9
|
+
/** Percentage of audited agents that map to a given archetype. */
|
|
10
|
+
const ARCHETYPE_RARITY: Record<ArchetypeKey, number> = {
|
|
11
|
+
optimist: 18,
|
|
12
|
+
cowboy: 9,
|
|
13
|
+
explorer: 14,
|
|
14
|
+
goldfish: 11,
|
|
15
|
+
architect: 7,
|
|
16
|
+
precision: 16,
|
|
17
|
+
hammer: 13,
|
|
18
|
+
ghost: 12,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** Map a 0-100 score to a "top N%" rank band. Bands roughly mirror the
|
|
22
|
+
* S/A/B/C/D/F tiers in scoring.ts. */
|
|
23
|
+
export function getScoreRank(score: number): string {
|
|
24
|
+
if (score >= 90) return "top 5%";
|
|
25
|
+
if (score >= 80) return "top 15%";
|
|
26
|
+
if (score >= 71) return "top 35%";
|
|
27
|
+
if (score >= 55) return "top 60%";
|
|
28
|
+
if (score >= 40) return "top 85%";
|
|
29
|
+
return "bottom tier";
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function getArchetypeRarityPct(key: ArchetypeKey): number {
|
|
33
|
+
return ARCHETYPE_RARITY[key];
|
|
34
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derive the StrengthsSection rows from a live AuditResult.
|
|
3
|
+
*
|
|
4
|
+
* The reference (assets/audit/audit.jsx) ships 5 hand-curated strengths
|
|
5
|
+
* with placeholder numbers. Here we compute each one off the actual
|
|
6
|
+
* scanned data. Output shape mirrors the original.
|
|
7
|
+
*
|
|
8
|
+
* Most strengths are "absences" — the cleaner the agent, the more
|
|
9
|
+
* strengths we surface (e.g. "0 credential leaks" only counts as a
|
|
10
|
+
* strength when no sanitize-* policies fired).
|
|
11
|
+
*/
|
|
12
|
+
import type { AuditResult } from "./types";
|
|
13
|
+
|
|
14
|
+
export interface Strength {
|
|
15
|
+
metric: string;
|
|
16
|
+
unit: string;
|
|
17
|
+
headline: string;
|
|
18
|
+
detail: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function shortName(name: string): string {
|
|
22
|
+
const slash = name.indexOf("/");
|
|
23
|
+
return slash >= 0 ? name.slice(slash + 1) : name;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function hitsForShort(result: AuditResult, names: string[]): number {
|
|
27
|
+
const set = new Set(names);
|
|
28
|
+
let total = 0;
|
|
29
|
+
for (const r of result.results) {
|
|
30
|
+
if (set.has(shortName(r.name))) total += r.hits;
|
|
31
|
+
}
|
|
32
|
+
return total;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Pick up to 5 derived strengths. Each strength has a true-or-not test —
|
|
36
|
+
* only included when the agent actually demonstrates the behavior. */
|
|
37
|
+
export function deriveStrengths(result: AuditResult): Strength[] {
|
|
38
|
+
const out: Strength[] = [];
|
|
39
|
+
const events = result.eventsScanned ?? 0;
|
|
40
|
+
const totalHits = result.totals.hits;
|
|
41
|
+
const detectorsTriggered = result.results.filter((r) => r.source === "audit-detector").length;
|
|
42
|
+
const cleanRate = events > 0 ? Math.max(0, Math.min(100, Math.round(((events - totalHits) / events) * 100))) : 100;
|
|
43
|
+
|
|
44
|
+
// 1. Always show the "X tool calls, Y detectors triggered" headline.
|
|
45
|
+
if (events > 0) {
|
|
46
|
+
out.push({
|
|
47
|
+
metric: `${cleanRate}%`,
|
|
48
|
+
unit: "clean tool calls",
|
|
49
|
+
headline: `ran ${events.toLocaleString()} tool calls. ${detectorsTriggered} detector${detectorsTriggered === 1 ? "" : "s"} triggered.`,
|
|
50
|
+
detail: `${cleanRate}% of tool calls came back clean before today's audit.`,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// 2. Zero credential exposure to stdout — only when no sanitize-* and no
|
|
55
|
+
// block-env-files / block-secrets-write / block-read-outside-cwd hits.
|
|
56
|
+
const credentialPolicies = [
|
|
57
|
+
"sanitize-api-keys", "sanitize-jwt", "sanitize-connection-strings",
|
|
58
|
+
"sanitize-private-key-content", "sanitize-bearer-tokens",
|
|
59
|
+
"block-env-files", "block-secrets-write", "block-read-outside-cwd",
|
|
60
|
+
"protect-env-vars",
|
|
61
|
+
];
|
|
62
|
+
if (hitsForShort(result, credentialPolicies) === 0) {
|
|
63
|
+
out.push({
|
|
64
|
+
metric: "0",
|
|
65
|
+
unit: "credential leaks",
|
|
66
|
+
headline: "zero credential exposure to stdout.",
|
|
67
|
+
detail: "no env files, secret writes, or sanitize hits across the audit window.",
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// 3. Average sessions task length — `events / sessions`. Faster than
|
|
72
|
+
// median (50) is celebrated; slower than it is mentioned in findings.
|
|
73
|
+
if (result.transcripts.scanned > 0 && events > 0) {
|
|
74
|
+
const avgTurns = Math.max(1, Math.round(events / result.transcripts.scanned));
|
|
75
|
+
if (avgTurns < 30) {
|
|
76
|
+
out.push({
|
|
77
|
+
metric: String(avgTurns),
|
|
78
|
+
unit: "avg turns / session",
|
|
79
|
+
headline: `sessions complete in ${avgTurns} turns on average.`,
|
|
80
|
+
detail: avgTurns < 15
|
|
81
|
+
? "faster than the median agent in this cohort."
|
|
82
|
+
: "comfortably within the typical session length envelope.",
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// 4. No retry storms — `warn-repeated-tool-calls` + `sleep-polling-loop`
|
|
88
|
+
// are both quiet.
|
|
89
|
+
const retryHits = hitsForShort(result, ["warn-repeated-tool-calls", "sleep-polling-loop"]);
|
|
90
|
+
if (retryHits === 0) {
|
|
91
|
+
out.push({
|
|
92
|
+
metric: "0",
|
|
93
|
+
unit: "retry storms",
|
|
94
|
+
headline: "no retry storms or polling loops detected.",
|
|
95
|
+
detail: "failed calls were diagnosed or moved on from. no six-times-in-a-row spirals.",
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// 5. No production-shape git mistakes.
|
|
100
|
+
const gitHits = hitsForShort(result, [
|
|
101
|
+
"block-push-master", "block-force-push", "block-work-on-main",
|
|
102
|
+
"git-commit-no-verify",
|
|
103
|
+
]);
|
|
104
|
+
if (gitHits === 0) {
|
|
105
|
+
out.push({
|
|
106
|
+
metric: "0",
|
|
107
|
+
unit: "push-to-main attempts",
|
|
108
|
+
headline: "kept changes off main without prompting.",
|
|
109
|
+
detail: "no direct pushes, force pushes, or hook bypasses across every session.",
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// 6. No double-writes / re-reads — agent is efficient with edits.
|
|
114
|
+
const wastefulEdits = hitsForShort(result, [
|
|
115
|
+
"reread-after-edit", "prefer-edit-over-sed-awk", "prefer-write-over-heredoc",
|
|
116
|
+
]);
|
|
117
|
+
if (wastefulEdits === 0 && events > 0) {
|
|
118
|
+
out.push({
|
|
119
|
+
metric: "0",
|
|
120
|
+
unit: "double-writes",
|
|
121
|
+
headline: "no double-writes across production projects.",
|
|
122
|
+
detail: "the agent never re-read a file it had just edited, or rewrote via shell.",
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Cap to 5. If we somehow have <2 strengths, surface a generic "no
|
|
127
|
+
// findings in this category" so the section never looks empty.
|
|
128
|
+
if (out.length < 2) {
|
|
129
|
+
out.push({
|
|
130
|
+
metric: "—",
|
|
131
|
+
unit: "audit window",
|
|
132
|
+
headline: "audit complete.",
|
|
133
|
+
detail: `${result.transcripts.scanned} session${result.transcripts.scanned === 1 ? "" : "s"} scanned across ${result.totals.projectsWithHits} project${result.totals.projectsWithHits === 1 ? "" : "s"}.`,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return out.slice(0, 5);
|
|
138
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for the `failproofai audit` command.
|
|
3
|
+
*
|
|
4
|
+
* The audit walks past agent-CLI transcripts, replays each tool-use event
|
|
5
|
+
* through the existing policy engine, and runs each event through a separate
|
|
6
|
+
* set of audit-only detectors. Counts are aggregated per (policy|detector) and
|
|
7
|
+
* rendered as a table to stdout plus a markdown report.
|
|
8
|
+
*/
|
|
9
|
+
import type { IntegrationType } from "../hooks/types";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A single tool-use event extracted from a transcript, canonicalized to the
|
|
13
|
+
* shape failproofai's policy engine + audit detectors expect.
|
|
14
|
+
*/
|
|
15
|
+
export interface NormalizedToolEvent {
|
|
16
|
+
cli: IntegrationType;
|
|
17
|
+
sessionId: string;
|
|
18
|
+
transcriptPath: string;
|
|
19
|
+
/** Working directory of the session at the time of the event. */
|
|
20
|
+
cwd: string;
|
|
21
|
+
/** ISO-8601 timestamp from the transcript line. */
|
|
22
|
+
timestamp: string;
|
|
23
|
+
/** Canonical Claude PascalCase tool name (Bash, Read, Edit, …). */
|
|
24
|
+
toolName: string;
|
|
25
|
+
/** Canonicalized tool input (snake_case keys for OpenCode/Pi). */
|
|
26
|
+
toolInput: Record<string, unknown>;
|
|
27
|
+
/** Pre-canonicalization tool name (e.g. "run_shell_command" for Gemini). */
|
|
28
|
+
rawToolName: string;
|
|
29
|
+
/**
|
|
30
|
+
* Result text from the matching tool_result block, if present in the
|
|
31
|
+
* transcript. Used to synthesize PostToolUse events for sanitize-* policies.
|
|
32
|
+
* Truncated to AUDIT_TOOL_RESULT_MAX_BYTES at the adapter to bound memory.
|
|
33
|
+
*/
|
|
34
|
+
toolResultText?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Metadata about a single transcript (one session's JSONL file). */
|
|
38
|
+
export interface TranscriptMetadata {
|
|
39
|
+
cli: IntegrationType;
|
|
40
|
+
/** Encoded project folder name (e.g. "-home-user-project"). */
|
|
41
|
+
projectName: string;
|
|
42
|
+
sessionId: string;
|
|
43
|
+
transcriptPath: string;
|
|
44
|
+
/** mtime of the transcript file. Used for cache invalidation + --since filtering. */
|
|
45
|
+
mtimeMs: number;
|
|
46
|
+
/** Byte size of the transcript file. Used for cache invalidation. */
|
|
47
|
+
sizeBytes: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Per-session detector state. Detectors mutate this freely. */
|
|
51
|
+
export type DetectorSessionState = Record<string, unknown>;
|
|
52
|
+
|
|
53
|
+
/** One detected occurrence of a "stupid behavior". */
|
|
54
|
+
export interface DetectorHit {
|
|
55
|
+
/** A short, one-line summary of what triggered the detector. Used as the
|
|
56
|
+
* example column in the table and the example list in the markdown report.
|
|
57
|
+
* Truncated to 80 chars upstream. */
|
|
58
|
+
example: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** A pure function over a normalized event (plus optional per-session state).
|
|
62
|
+
* Returns a DetectorHit when the event matches, null otherwise. */
|
|
63
|
+
export type DetectorFn = (
|
|
64
|
+
event: NormalizedToolEvent,
|
|
65
|
+
state: DetectorSessionState,
|
|
66
|
+
) => DetectorHit | null;
|
|
67
|
+
|
|
68
|
+
/** Audit-only detector definition. */
|
|
69
|
+
export interface Detector {
|
|
70
|
+
name: string;
|
|
71
|
+
description: string;
|
|
72
|
+
/** Display group in the markdown report (Wasteful / Risky / …). */
|
|
73
|
+
category: string;
|
|
74
|
+
/** Severity tier — drives row color in the table. */
|
|
75
|
+
severity: "warn" | "info";
|
|
76
|
+
detect: DetectorFn;
|
|
77
|
+
/** User-facing past-tense phrase, e.g. "Re-read a file just edited". Falls
|
|
78
|
+
* back to `description` when omitted. */
|
|
79
|
+
displayTitle?: string;
|
|
80
|
+
/** One short clause describing the consequence. */
|
|
81
|
+
impact?: string;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Aggregated count for one policy or detector. */
|
|
85
|
+
export interface AuditCount {
|
|
86
|
+
/** Either a policy name ("failproofai/block-force-push") or a detector name
|
|
87
|
+
* ("redundant-cd-cwd"). */
|
|
88
|
+
name: string;
|
|
89
|
+
/** "builtin" for replayed policies, "audit-detector" for audit-only patterns. */
|
|
90
|
+
source: "builtin" | "audit-detector";
|
|
91
|
+
category: string;
|
|
92
|
+
/** Decision label for builtin replays (deny|instruct|allow|sanitize). For
|
|
93
|
+
* audit-detector entries this is the detector's severity. */
|
|
94
|
+
severity: string;
|
|
95
|
+
hits: number;
|
|
96
|
+
/** Number of distinct projects (transcript folders) where this fired. */
|
|
97
|
+
projects: number;
|
|
98
|
+
/** ISO-8601 timestamp of the first matching event seen. */
|
|
99
|
+
firstSeen?: string;
|
|
100
|
+
/** ISO-8601 timestamp of the last matching event seen. */
|
|
101
|
+
lastSeen?: string;
|
|
102
|
+
/** Up to N example commands/snippets that triggered this (80 chars each). */
|
|
103
|
+
examples: { sessionId: string; cwd: string; timestamp: string; example: string }[];
|
|
104
|
+
/** User-facing past-tense phrase used in the report. Always populated by the
|
|
105
|
+
* orchestrator — falls back to the policy/detector description when no
|
|
106
|
+
* `displayTitle` was authored. */
|
|
107
|
+
displayTitle: string;
|
|
108
|
+
/** One short clause describing the consequence. May be empty for legacy
|
|
109
|
+
* policies without authored impact copy. */
|
|
110
|
+
impact: string;
|
|
111
|
+
/** Whether the user currently has this builtin enabled. Drives the
|
|
112
|
+
* "already protected" vs "slipping through" split in the report. Always
|
|
113
|
+
* `false` for audit-only detectors (they don't have a runtime enforcement
|
|
114
|
+
* path today). */
|
|
115
|
+
enabledInConfig: boolean;
|
|
116
|
+
/** Pre-built one-line install command (or audit-only notice) the report
|
|
117
|
+
* shows next to each row, so users can copy-paste to remediate. */
|
|
118
|
+
installHint: string;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Per-transcript scan result (also the per-transcript cache value). */
|
|
122
|
+
export interface TranscriptAuditResult {
|
|
123
|
+
/** Cache key: matches TranscriptMetadata.transcriptPath. */
|
|
124
|
+
transcriptPath: string;
|
|
125
|
+
cli: IntegrationType;
|
|
126
|
+
projectName: string;
|
|
127
|
+
sessionId: string;
|
|
128
|
+
mtimeMs: number;
|
|
129
|
+
sizeBytes: number;
|
|
130
|
+
/** Cwd of the session (taken from the first event with a cwd field).
|
|
131
|
+
* Empty string when no events carried cwd. Surfaced up to `AuditResult.
|
|
132
|
+
* projectsScanned` so the dashboard's project filter can show every
|
|
133
|
+
* scanned project, not just those with examples. */
|
|
134
|
+
cwd?: string;
|
|
135
|
+
/** Total normalized tool-use events scanned in this transcript. Surfaced
|
|
136
|
+
* via `AuditResult.eventsScanned` so the report can show "X tool calls"
|
|
137
|
+
* across the whole audit. */
|
|
138
|
+
eventsScanned?: number;
|
|
139
|
+
/** Per-policy/detector hit count for this one transcript. */
|
|
140
|
+
hitsByName: Record<string, number>;
|
|
141
|
+
/** Up to 3 example commands per policy/detector (later coalesced upstream). */
|
|
142
|
+
examplesByName: Record<string, { timestamp: string; cwd: string; example: string }[]>;
|
|
143
|
+
/** First/last timestamp per name. */
|
|
144
|
+
rangeByName: Record<string, { first: string; last: string }>;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** Top-level result of `runAudit()`. */
|
|
148
|
+
export interface AuditResult {
|
|
149
|
+
/** Schema version of this JSON shape. Increment on incompatible changes.
|
|
150
|
+
* v2: added `projectsScanned`. */
|
|
151
|
+
version: number;
|
|
152
|
+
scannedAt: string;
|
|
153
|
+
scope: {
|
|
154
|
+
cli: IntegrationType[];
|
|
155
|
+
projects: string[] | "all";
|
|
156
|
+
since: string | null;
|
|
157
|
+
};
|
|
158
|
+
transcripts: {
|
|
159
|
+
scanned: number;
|
|
160
|
+
skipped: number;
|
|
161
|
+
errors: number;
|
|
162
|
+
durationMs: number;
|
|
163
|
+
};
|
|
164
|
+
results: AuditCount[];
|
|
165
|
+
totals: {
|
|
166
|
+
hits: number;
|
|
167
|
+
projectsWithHits: number;
|
|
168
|
+
};
|
|
169
|
+
/** Sorted, deduped list of cwds across every transcript that was scanned
|
|
170
|
+
* (including those with zero hits). Drives the dashboard's project filter.
|
|
171
|
+
* Transcripts without a usable cwd are excluded. */
|
|
172
|
+
projectsScanned: string[];
|
|
173
|
+
/** Total normalized tool-use events the audit walked across every
|
|
174
|
+
* scanned transcript. The audit dashboard surfaces this as the
|
|
175
|
+
* "X tool calls" headline counter. */
|
|
176
|
+
eventsScanned: number;
|
|
177
|
+
/** Short names (without `failproofai/` namespace) of every builtin
|
|
178
|
+
* policy that was enabled in the user's merged config at scan time.
|
|
179
|
+
* Lets the dashboard answer "is this policy already on?" for
|
|
180
|
+
* detector-mapped policies that may not have hit during this audit. */
|
|
181
|
+
enabledBuiltinNames: string[];
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** CLI-supplied options for `runAudit()`. Set by `bin/failproofai.mjs`. */
|
|
185
|
+
export interface RunAuditOptions {
|
|
186
|
+
/** Restrict to one or more CLIs. Default: all 7. */
|
|
187
|
+
clis?: IntegrationType[];
|
|
188
|
+
/** Restrict to sessions whose cwd matches one of these paths. */
|
|
189
|
+
projects?: string[];
|
|
190
|
+
/** "7d", "30d", or an ISO date. Filters on transcript mtime. */
|
|
191
|
+
since?: string;
|
|
192
|
+
/** Restrict to one or more policy/detector names. */
|
|
193
|
+
policies?: string[];
|
|
194
|
+
/** Top-N rows in the table output. */
|
|
195
|
+
limit?: number;
|
|
196
|
+
/** Include example column in the table. */
|
|
197
|
+
showExamples?: boolean;
|
|
198
|
+
/** Output path for the markdown report. Default: ./failproofai-audit.md */
|
|
199
|
+
reportPath?: string;
|
|
200
|
+
/** Skip writing the markdown report. */
|
|
201
|
+
noReport?: boolean;
|
|
202
|
+
/** Emit JSON to stdout instead of the table. */
|
|
203
|
+
json?: boolean;
|
|
204
|
+
/** Bypass the per-transcript cache. */
|
|
205
|
+
noCache?: boolean;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/** Truncation budget for `NormalizedToolEvent.toolResultText`. Bounds memory
|
|
209
|
+
* for sanitize-* policy replay without losing the typical match window. */
|
|
210
|
+
export const AUDIT_TOOL_RESULT_MAX_BYTES = 64 * 1024;
|
|
211
|
+
|
|
212
|
+
/** Truncation budget for example strings shown in table + markdown. */
|
|
213
|
+
export const AUDIT_EXAMPLE_MAX_CHARS = 80;
|
|
214
|
+
|
|
215
|
+
/** Max examples kept per policy/detector in the final report. */
|
|
216
|
+
export const AUDIT_MAX_EXAMPLES_PER_NAME = 3;
|