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,27 @@
|
|
|
1
|
+
import type { Detector } from "../types";
|
|
2
|
+
|
|
3
|
+
/** In-place edits with `sed -i` or `awk … > file` that should have been done
|
|
4
|
+
* with the Edit tool. */
|
|
5
|
+
export const preferEditOverSedAwk: Detector = {
|
|
6
|
+
name: "prefer-edit-over-sed-awk",
|
|
7
|
+
description: "Bash `sed -i`/`awk` in-place edits — use Edit.",
|
|
8
|
+
category: "Wasteful",
|
|
9
|
+
severity: "info",
|
|
10
|
+
displayTitle: "Used sed -i or awk for an in-place edit",
|
|
11
|
+
impact: "Edit tool is safer and produces a diff the agent can verify.",
|
|
12
|
+
detect(event) {
|
|
13
|
+
if (event.toolName !== "Bash") return null;
|
|
14
|
+
const command = (event.toolInput as { command?: unknown }).command;
|
|
15
|
+
if (typeof command !== "string") return null;
|
|
16
|
+
const cmd = command.trim();
|
|
17
|
+
// `sed -i ...` (GNU/macOS) or `sed -i'.bak' ...` (BSD-style)
|
|
18
|
+
if (/(?:^|\s|;|&&|\|\|)sed\b[^|]*\s-i(?=\b|['"])/.test(cmd)) {
|
|
19
|
+
return { example: cmd };
|
|
20
|
+
}
|
|
21
|
+
// `awk '...' file > out` or `awk '...' file > file` (in-place via redirection)
|
|
22
|
+
if (/(?:^|\s|;|&&|\|\|)awk\b[^|]*\s>\s*\S+/.test(cmd) && !/\|/.test(cmd)) {
|
|
23
|
+
return { example: cmd };
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
},
|
|
27
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Detector } from "../types";
|
|
2
|
+
|
|
3
|
+
/** `cat << EOF > file` heredoc patterns or `echo … > file` writing multi-line
|
|
4
|
+
* content. The Write tool is the right answer. */
|
|
5
|
+
export const preferWriteOverHeredoc: Detector = {
|
|
6
|
+
name: "prefer-write-over-heredoc",
|
|
7
|
+
description: "Bash heredoc / `echo > file` writing multi-line content — use Write.",
|
|
8
|
+
category: "Wasteful",
|
|
9
|
+
severity: "info",
|
|
10
|
+
displayTitle: "Used heredoc / `echo > file` to write a multi-line file",
|
|
11
|
+
impact: "Write tool handles escaping and is verifiable.",
|
|
12
|
+
detect(event) {
|
|
13
|
+
if (event.toolName !== "Bash") return null;
|
|
14
|
+
const command = (event.toolInput as { command?: unknown }).command;
|
|
15
|
+
if (typeof command !== "string") return null;
|
|
16
|
+
const cmd = command;
|
|
17
|
+
// Heredoc redirected to a file IMMEDIATELY after the delimiter:
|
|
18
|
+
// `cat <<'EOF' > path` ← match (heredoc opens AND redirects in one step)
|
|
19
|
+
// `cat <<EOF` inside `$(...)` ← skip (heredoc captured by command substitution,
|
|
20
|
+
// later `> file` is unrelated)
|
|
21
|
+
// The redirect must appear before the next whitespace/newline that ends the
|
|
22
|
+
// heredoc opener line — otherwise it's a body or downstream redirect.
|
|
23
|
+
// Heredoc delimiters are case-sensitive but `EOF`, `eof`, `Eof`, `MARKER`
|
|
24
|
+
// and digits-after-letter are all valid; match any letter/digit/underscore.
|
|
25
|
+
if (/<<-?\s*['"]?[A-Za-z_][A-Za-z0-9_]*['"]?\s*>\s*\S/.test(cmd)) {
|
|
26
|
+
const summary = cmd.replace(/\s+/g, " ").trim().slice(0, 160);
|
|
27
|
+
return { example: summary };
|
|
28
|
+
}
|
|
29
|
+
// `echo "multi\nline" > file` or `printf "..." > file` with embedded newlines.
|
|
30
|
+
if (/(?:^|\s|;|&&|\|\|)(?:echo|printf)\s+["'][^"']*\n[^"']*["']\s*>\s*\S/.test(cmd)) {
|
|
31
|
+
const summary = cmd.replace(/\s+/g, " ").trim().slice(0, 160);
|
|
32
|
+
return { example: summary };
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
},
|
|
36
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Detector } from "../types";
|
|
2
|
+
|
|
3
|
+
/** Bash command starting with `cd <absolute-path> && …` where the absolute
|
|
4
|
+
* path equals (or is the same realpath as) the session's cwd. The agent's
|
|
5
|
+
* shell already runs in cwd — the prefix is pure waste. Explicitly called
|
|
6
|
+
* out in the Claude Code system prompt for git commands. */
|
|
7
|
+
export const redundantCdCwd: Detector = {
|
|
8
|
+
name: "redundant-cd-cwd",
|
|
9
|
+
description:
|
|
10
|
+
"Bash commands prefixed with `cd <cwd> && …` even though commands already run in cwd.",
|
|
11
|
+
category: "Wasteful",
|
|
12
|
+
severity: "info",
|
|
13
|
+
displayTitle: "Prepended cd <cwd> before commands",
|
|
14
|
+
impact: "Pure waste — your agent's shell already runs in `cwd`.",
|
|
15
|
+
detect(event) {
|
|
16
|
+
if (event.toolName !== "Bash") return null;
|
|
17
|
+
const command = (event.toolInput as { command?: unknown }).command;
|
|
18
|
+
if (typeof command !== "string" || !event.cwd) return null;
|
|
19
|
+
const trimmed = command.trimStart();
|
|
20
|
+
const match = /^cd\s+(?:"([^"]+)"|'([^']+)'|(\S+))\s*&&\s*([\s\S]+)$/.exec(trimmed);
|
|
21
|
+
if (!match) return null;
|
|
22
|
+
const path = (match[1] ?? match[2] ?? match[3] ?? "").replace(/\/+$/, "");
|
|
23
|
+
const cwd = event.cwd.replace(/\/+$/, "");
|
|
24
|
+
if (path !== cwd) return null;
|
|
25
|
+
const rest = match[4].trim();
|
|
26
|
+
return { example: `cd ${path} && ${rest}` };
|
|
27
|
+
},
|
|
28
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Detector, DetectorSessionState } from "../types";
|
|
2
|
+
|
|
3
|
+
const STATE_KEY = "rereadAfterEdit";
|
|
4
|
+
const WINDOW = 5;
|
|
5
|
+
|
|
6
|
+
interface RereadState {
|
|
7
|
+
/** Map of file_path → number of remaining tool-calls in which a Read should
|
|
8
|
+
* trigger this detector. Decremented every tool event; deleted at 0. */
|
|
9
|
+
countdown: Map<string, number>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function getState(state: DetectorSessionState): RereadState {
|
|
13
|
+
let s = state[STATE_KEY] as RereadState | undefined;
|
|
14
|
+
if (!s) {
|
|
15
|
+
s = { countdown: new Map() };
|
|
16
|
+
state[STATE_KEY] = s;
|
|
17
|
+
}
|
|
18
|
+
return s;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** When Edit or Write lands on file_path, then a subsequent Read of the same
|
|
22
|
+
* file_path within N tool calls is wasteful — the editor already returned the
|
|
23
|
+
* updated content. Explicitly called out in the Claude system prompt. */
|
|
24
|
+
export const rereadAfterEdit: Detector = {
|
|
25
|
+
name: "reread-after-edit",
|
|
26
|
+
description: "Read of a file that was just Edit'd or Write'n in the same session.",
|
|
27
|
+
category: "Wasteful",
|
|
28
|
+
severity: "info",
|
|
29
|
+
displayTitle: "Re-read a file it just edited",
|
|
30
|
+
impact: "Edit/Write already returned the updated content; the second Read is wasted tokens.",
|
|
31
|
+
detect(event, sessionState) {
|
|
32
|
+
const state = getState(sessionState);
|
|
33
|
+
const filePath = (event.toolInput as { file_path?: unknown }).file_path;
|
|
34
|
+
const pathStr = typeof filePath === "string" ? filePath : null;
|
|
35
|
+
|
|
36
|
+
// Tick down every existing countdown.
|
|
37
|
+
for (const [key, n] of state.countdown) {
|
|
38
|
+
if (n <= 1) state.countdown.delete(key);
|
|
39
|
+
else state.countdown.set(key, n - 1);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (!pathStr) return null;
|
|
43
|
+
|
|
44
|
+
if (event.toolName === "Edit" || event.toolName === "Write") {
|
|
45
|
+
state.countdown.set(pathStr, WINDOW);
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (event.toolName === "Read") {
|
|
50
|
+
if (state.countdown.has(pathStr)) {
|
|
51
|
+
state.countdown.delete(pathStr); // count once per edit-then-read pair
|
|
52
|
+
return { example: `Read ${pathStr} immediately after Edit/Write` };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return null;
|
|
57
|
+
},
|
|
58
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Detector } from "../types";
|
|
2
|
+
|
|
3
|
+
const SLEEP_THRESHOLD_SECONDS = 30;
|
|
4
|
+
|
|
5
|
+
/** Bash `sleep N` where N ≥ 30 (busy polling), or `while …; sleep …; done`. */
|
|
6
|
+
export const sleepPollingLoop: Detector = {
|
|
7
|
+
name: "sleep-polling-loop",
|
|
8
|
+
description: "Bash long `sleep` or while-sleep polling loops.",
|
|
9
|
+
category: "Wasteful",
|
|
10
|
+
severity: "info",
|
|
11
|
+
displayTitle: "Used a long sleep or while-sleep polling loop",
|
|
12
|
+
impact: "Burns wall-clock; better to wait for an explicit signal.",
|
|
13
|
+
detect(event) {
|
|
14
|
+
if (event.toolName !== "Bash") return null;
|
|
15
|
+
const command = (event.toolInput as { command?: unknown }).command;
|
|
16
|
+
if (typeof command !== "string") return null;
|
|
17
|
+
const cmd = command;
|
|
18
|
+
// while-sleep loop
|
|
19
|
+
if (/\bwhile\b[\s\S]*?\bsleep\b[\s\S]*?\bdone\b/.test(cmd)) {
|
|
20
|
+
return { example: cmd.replace(/\s+/g, " ").trim().slice(0, 160) };
|
|
21
|
+
}
|
|
22
|
+
// Standalone long sleep. parseFloat so `sleep 0.5m` (= 30s) isn't dropped.
|
|
23
|
+
const match = /\bsleep\s+(\d+(?:\.\d+)?)(m|h|d)?\b/.exec(cmd);
|
|
24
|
+
if (match) {
|
|
25
|
+
const n = parseFloat(match[1]);
|
|
26
|
+
const unit = match[2] ?? "s";
|
|
27
|
+
const seconds = unit === "m" ? n * 60 : unit === "h" ? n * 3600 : unit === "d" ? n * 86400 : n;
|
|
28
|
+
if (seconds >= SLEEP_THRESHOLD_SECONDS) {
|
|
29
|
+
return { example: cmd.replace(/\s+/g, " ").trim().slice(0, 160) };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
},
|
|
34
|
+
};
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Behavioural feature layer for the audit dashboard.
|
|
3
|
+
*
|
|
4
|
+
* Both the archetype classifier (`archetypes.ts`) and the score derivation
|
|
5
|
+
* (`scoring.ts`) read from the *same* derived features so they can never
|
|
6
|
+
* drift. Everything here is a pure function of `AuditResult` (+ an optional
|
|
7
|
+
* seed string) — no I/O, no clock, no `Math.random()`. Given the same input,
|
|
8
|
+
* every output is byte-identical on every run.
|
|
9
|
+
*
|
|
10
|
+
* Design goals (see the audit redesign):
|
|
11
|
+
* 1. All 8 personas reachable. Five are mapped by *which* faults dominate
|
|
12
|
+
* (`SIGNAL_MAP`); three are relational — `precision` (low fault rate),
|
|
13
|
+
* `architect` (faults are over-verification), `goldfish` (scattered).
|
|
14
|
+
* 2. No systemic skew. Ranking is by *lift = observed-share ÷ baseline-share*
|
|
15
|
+
* where the baseline is the EMPIRICAL firing share of each cluster for a
|
|
16
|
+
* typical agent (see BASELINE_SHARE / EMPIRICAL_FIRING_SHARE), not the
|
|
17
|
+
* catalog weight share. This is what stops ambient, high-firing clusters
|
|
18
|
+
* (explorer, architect) from collapsing the whole population onto one
|
|
19
|
+
* persona: a cluster wins only when it fires *more than typical*, not
|
|
20
|
+
* merely often. `block-read-outside-cwd` is excluded from SIGNAL_MAP
|
|
21
|
+
* entirely — it is off by default and fires on ubiquitous ambient reads.
|
|
22
|
+
* 3. Deterministic personalisation. A `fingerprint` hash of the rounded
|
|
23
|
+
* behaviour vector seeds tie-breaks and copy-variant selection, so two
|
|
24
|
+
* different agents that land on the same primary still look distinct,
|
|
25
|
+
* while the same agent is always identical.
|
|
26
|
+
*/
|
|
27
|
+
import type { AuditResult } from "./types";
|
|
28
|
+
import type { ArchetypeKey } from "./archetypes";
|
|
29
|
+
|
|
30
|
+
/** djb2-style hash. Stable across renders/processes, no crypto needed.
|
|
31
|
+
* Lives here (not archetypes.ts) so the feature layer has no import cycle. */
|
|
32
|
+
export function hashSeed(s: string): number {
|
|
33
|
+
let h = 5381;
|
|
34
|
+
for (let i = 0; i < s.length; i++) h = ((h << 5) + h + s.charCodeAt(i)) | 0;
|
|
35
|
+
return h >>> 0;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Strip the `failproofai/` namespace so map keys match the bare policy name. */
|
|
39
|
+
export function shortName(name: string): string {
|
|
40
|
+
const slash = name.indexOf("/");
|
|
41
|
+
return slash >= 0 ? name.slice(slash + 1) : name;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** All eight archetype keys, including the two relational ones. */
|
|
45
|
+
export const ALL_ARCHETYPE_KEYS: ArchetypeKey[] = [
|
|
46
|
+
"optimist", "cowboy", "explorer", "goldfish",
|
|
47
|
+
"architect", "precision", "hammer", "ghost",
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Personas that receive direct signal mapping. `precision` and `goldfish`
|
|
52
|
+
* are NOT here — they are derived from the *shape* of the distribution, not
|
|
53
|
+
* from any single policy. `architect` is mapped (it owns the two "caution"
|
|
54
|
+
* detectors) but is primarily reached via its ratio rule.
|
|
55
|
+
*/
|
|
56
|
+
export const MAPPABLE_KEYS: ArchetypeKey[] = [
|
|
57
|
+
"cowboy", "explorer", "ghost", "optimist", "hammer", "architect",
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
/** Active-fault personas ranked by lift in the classifier's argmax step. */
|
|
61
|
+
export const ACTIVE_FAULT_KEYS: ArchetypeKey[] = [
|
|
62
|
+
"cowboy", "explorer", "ghost", "optimist", "hammer",
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
/** The two detectors that define "the paranoid architect" — pure
|
|
66
|
+
* over-verification. When these dominate an agent's signal it is classified
|
|
67
|
+
* architect regardless of raw weight. */
|
|
68
|
+
export const ARCHITECT_CAUTION_SIGNALS = new Set(["reread-after-edit", "redundant-cd-cwd"]);
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Mapping from policy/detector short-name → which archetype its hits feed,
|
|
72
|
+
* and how heavily (intensity within the cluster). Every one of the 39 builtin
|
|
73
|
+
* policies and 8 audit-only detectors maps exactly once — no overlaps, full
|
|
74
|
+
* coverage. Weights express *severity within* a persona; cross-persona
|
|
75
|
+
* fairness is handled later by lift normalisation, not by these numbers.
|
|
76
|
+
*/
|
|
77
|
+
export const SIGNAL_MAP: Record<string, { archetype: ArchetypeKey; weight: number }> = {
|
|
78
|
+
// ── cowboy ── destructive / forceful / bypasses guardrails (20) ───────────
|
|
79
|
+
"block-rm-rf": { archetype: "cowboy", weight: 2.0 },
|
|
80
|
+
"block-failproofai-commands":{ archetype: "cowboy", weight: 2.0 },
|
|
81
|
+
"block-sudo": { archetype: "cowboy", weight: 1.5 },
|
|
82
|
+
"block-curl-pipe-sh": { archetype: "cowboy", weight: 1.5 },
|
|
83
|
+
"block-force-push": { archetype: "cowboy", weight: 1.5 },
|
|
84
|
+
"block-push-master": { archetype: "cowboy", weight: 1.5 },
|
|
85
|
+
"block-work-on-main": { archetype: "cowboy", weight: 1.2 },
|
|
86
|
+
"warn-destructive-sql": { archetype: "cowboy", weight: 1.5 },
|
|
87
|
+
"warn-schema-alteration": { archetype: "cowboy", weight: 1.0 },
|
|
88
|
+
"git-commit-no-verify": { archetype: "cowboy", weight: 1.5 },
|
|
89
|
+
"warn-git-amend": { archetype: "cowboy", weight: 0.8 },
|
|
90
|
+
"warn-git-stash-drop": { archetype: "cowboy", weight: 1.0 },
|
|
91
|
+
"warn-all-files-staged": { archetype: "cowboy", weight: 0.6 },
|
|
92
|
+
"block-kubectl": { archetype: "cowboy", weight: 1.5 },
|
|
93
|
+
"block-terraform": { archetype: "cowboy", weight: 1.5 },
|
|
94
|
+
"block-helm": { archetype: "cowboy", weight: 1.2 },
|
|
95
|
+
"block-aws-cli": { archetype: "cowboy", weight: 1.2 },
|
|
96
|
+
"block-gcloud": { archetype: "cowboy", weight: 1.2 },
|
|
97
|
+
"block-az-cli": { archetype: "cowboy", weight: 1.2 },
|
|
98
|
+
"block-gh-pipeline": { archetype: "cowboy", weight: 1.2 },
|
|
99
|
+
|
|
100
|
+
// ── explorer ── boundary crossing / secrets exposure (9) ──────────────────
|
|
101
|
+
// NOTE: `block-read-outside-cwd` is deliberately NOT mapped to a persona. It
|
|
102
|
+
// is `defaultEnabled: false` (so real users don't even enforce it) and fires
|
|
103
|
+
// on any absolute-path read outside cwd — ambient, volume-scaled behaviour
|
|
104
|
+
// present in essentially every session, not an elective "explorer" tendency.
|
|
105
|
+
// Replay force-registers it regardless of config, so leaving it here made it
|
|
106
|
+
// the single largest signal (≈37% of all mapped signal in real audits) and
|
|
107
|
+
// collapsed the whole population onto "the explorer". It still appears in the
|
|
108
|
+
// audit report; it just no longer drives the archetype.
|
|
109
|
+
"sanitize-private-key-content":{ archetype: "explorer", weight: 1.5 },
|
|
110
|
+
"block-env-files": { archetype: "explorer", weight: 1.5 },
|
|
111
|
+
"block-secrets-write": { archetype: "explorer", weight: 1.5 },
|
|
112
|
+
"sanitize-api-keys": { archetype: "explorer", weight: 1.2 },
|
|
113
|
+
"sanitize-jwt": { archetype: "explorer", weight: 1.2 },
|
|
114
|
+
"sanitize-connection-strings":{ archetype: "explorer", weight: 1.2 },
|
|
115
|
+
"sanitize-bearer-tokens": { archetype: "explorer", weight: 1.0 },
|
|
116
|
+
"protect-env-vars": { archetype: "explorer", weight: 1.0 },
|
|
117
|
+
"find-from-root": { archetype: "explorer", weight: 1.0 },
|
|
118
|
+
|
|
119
|
+
// ── ghost ── unfinished / unsupervised work (7) ───────────────────────────
|
|
120
|
+
// NOTE: the five require-*-before-stop policies only fire on `Stop` events,
|
|
121
|
+
// which the audit replay never synthesises, so in practice ghost is reached
|
|
122
|
+
// via warn-large-file-write + warn-background-process. They are mapped here
|
|
123
|
+
// for completeness and in case a future Stop-replay path is added.
|
|
124
|
+
"require-ci-green-before-stop": { archetype: "ghost", weight: 1.2 },
|
|
125
|
+
"require-commit-before-stop": { archetype: "ghost", weight: 1.2 },
|
|
126
|
+
"require-push-before-stop": { archetype: "ghost", weight: 1.0 },
|
|
127
|
+
"require-pr-before-stop": { archetype: "ghost", weight: 1.0 },
|
|
128
|
+
"require-no-conflicts-before-stop":{ archetype: "ghost", weight: 1.0 },
|
|
129
|
+
"warn-large-file-write": { archetype: "ghost", weight: 1.0 },
|
|
130
|
+
"warn-background-process": { archetype: "ghost", weight: 0.8 },
|
|
131
|
+
|
|
132
|
+
// ── optimist ── low-friction shortcuts / sloppy tool choice (6) ───────────
|
|
133
|
+
"warn-package-publish": { archetype: "optimist", weight: 1.0 },
|
|
134
|
+
"warn-global-package-install":{ archetype: "optimist", weight: 0.8 },
|
|
135
|
+
"prefer-package-manager": { archetype: "optimist", weight: 0.8 },
|
|
136
|
+
"prefer-edit-over-sed-awk": { archetype: "optimist", weight: 0.8 },
|
|
137
|
+
"prefer-edit-over-read-cat": { archetype: "optimist", weight: 0.5 },
|
|
138
|
+
"prefer-write-over-heredoc": { archetype: "optimist", weight: 0.5 },
|
|
139
|
+
|
|
140
|
+
// ── hammer ── brute-force repetition (2) ──────────────────────────────────
|
|
141
|
+
"warn-repeated-tool-calls": { archetype: "hammer", weight: 1.5 },
|
|
142
|
+
"sleep-polling-loop": { archetype: "hammer", weight: 1.2 },
|
|
143
|
+
|
|
144
|
+
// ── architect ── over-verification "caution" signals (2) ──────────────────
|
|
145
|
+
"reread-after-edit": { archetype: "architect", weight: 1.0 },
|
|
146
|
+
"redundant-cd-cwd": { archetype: "architect", weight: 0.8 },
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
/** Builtin severity derived from the policy name prefix. The builtin
|
|
150
|
+
* definitions carry no static severity field — the runtime decision lives in
|
|
151
|
+
* the policy fn — but the name prefix encodes intent deterministically:
|
|
152
|
+
* sanitize-* → sanitize (gentle) warn-/protect-/prefer-/require-* → warn
|
|
153
|
+
* block-* → deny (severe) anything else → deny (safe default)
|
|
154
|
+
* Replaces the old hardcoded `"deny"` so the score's medium/gentle buckets
|
|
155
|
+
* actually populate. */
|
|
156
|
+
export function severityForBuiltin(name: string): string {
|
|
157
|
+
const n = shortName(name);
|
|
158
|
+
if (n.startsWith("sanitize-")) return "sanitize";
|
|
159
|
+
if (n.startsWith("block-")) return "deny";
|
|
160
|
+
if (
|
|
161
|
+
n.startsWith("warn-") || n.startsWith("protect-") ||
|
|
162
|
+
n.startsWith("prefer-") || n.startsWith("require-")
|
|
163
|
+
) return "warn";
|
|
164
|
+
return "deny";
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function emptyWeights(): Record<ArchetypeKey, number> {
|
|
168
|
+
return {
|
|
169
|
+
optimist: 0, cowboy: 0, explorer: 0, goldfish: 0,
|
|
170
|
+
architect: 0, precision: 0, hammer: 0, ghost: 0,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** A rare-but-elective cluster floor for the lift denominator. Without it a
|
|
175
|
+
* cluster that barely fires under replay (e.g. ghost) would have a near-zero
|
|
176
|
+
* baseline and explode to a huge lift off a single hit, hijacking the persona
|
|
177
|
+
* from one stray signal. 0.05 ≈ "you need a few % of your signal here to count
|
|
178
|
+
* as over-indexing", which is the right bar for the long tail. */
|
|
179
|
+
const MIN_BASELINE = 0.05;
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* EMPIRICAL firing share of each mappable cluster for a *typical* agent —
|
|
183
|
+
* measured from a corpus of real audits, NOT derived from catalog weights.
|
|
184
|
+
*
|
|
185
|
+
* The original implementation set the baseline to each persona's share of the
|
|
186
|
+
* `SIGNAL_MAP` *catalog* (Σ its weights ÷ Σ all weights), on the theory that
|
|
187
|
+
* lift would then cancel cowboy's 20-signal surface area. But catalog share ≠
|
|
188
|
+
* real firing rate. The ambient policies feeding `explorer` (env access,
|
|
189
|
+
* secrets-in-tool-output) and `architect` (reread-after-edit, redundant-cd)
|
|
190
|
+
* fire on benign, volume-scaled activity in nearly every session — far above
|
|
191
|
+
* their catalog share — while cowboy's destructive `block-*` policies almost
|
|
192
|
+
* never fire. A catalog baseline therefore kept explorer's lift > 1 for almost
|
|
193
|
+
* every real user and collapsed the entire population onto a single persona.
|
|
194
|
+
* Calibrating the denominator to real firing frequency is what removes that
|
|
195
|
+
* systemic skew: a cluster now wins only when it fires *more than typical*.
|
|
196
|
+
*
|
|
197
|
+
* These need only track the *relative* ambient firing frequency of each
|
|
198
|
+
* cluster; they don't have to sum to 1. Refine as the corpus grows.
|
|
199
|
+
*/
|
|
200
|
+
export const EMPIRICAL_FIRING_SHARE: Record<ArchetypeKey, number> = {
|
|
201
|
+
explorer: 0.38,
|
|
202
|
+
architect: 0.33,
|
|
203
|
+
hammer: 0.11,
|
|
204
|
+
cowboy: 0.11,
|
|
205
|
+
optimist: 0.07,
|
|
206
|
+
ghost: 0.01,
|
|
207
|
+
precision: 0,
|
|
208
|
+
goldfish: 0,
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
/** Lift denominator: observed-share ÷ baseline-share. Empirically calibrated
|
|
212
|
+
* (see EMPIRICAL_FIRING_SHARE) and floored at MIN_BASELINE for the long tail. */
|
|
213
|
+
export const BASELINE_SHARE: Record<ArchetypeKey, number> = (() => {
|
|
214
|
+
const out = emptyWeights();
|
|
215
|
+
for (const k of MAPPABLE_KEYS) out[k] = Math.max(EMPIRICAL_FIRING_SHARE[k], MIN_BASELINE);
|
|
216
|
+
return out;
|
|
217
|
+
})();
|
|
218
|
+
|
|
219
|
+
/** Normalised Shannon entropy of a lift vector, base = number of mappable
|
|
220
|
+
* clusters (6). 0 = all signal in one persona, 1 = perfectly even spread.
|
|
221
|
+
* Two equally-lit clusters score ~0.39 (not goldfish); ~4 even clusters
|
|
222
|
+
* cross 0.77 (goldfish territory). */
|
|
223
|
+
function normalizedEntropy(vals: number[]): number {
|
|
224
|
+
const total = vals.reduce((s, v) => s + Math.max(0, v), 0);
|
|
225
|
+
if (total <= 0) return 0;
|
|
226
|
+
let h = 0;
|
|
227
|
+
for (const v of vals) {
|
|
228
|
+
if (v <= 0) continue;
|
|
229
|
+
const p = v / total;
|
|
230
|
+
h -= p * Math.log(p);
|
|
231
|
+
}
|
|
232
|
+
return h / Math.log(vals.length);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** Volume floor — a 3-call session shouldn't divide-by-tiny and explode. */
|
|
236
|
+
export const MIN_EVENTS = 50;
|
|
237
|
+
|
|
238
|
+
export interface AuditFeatures {
|
|
239
|
+
/** Tool calls scanned, floored at MIN_EVENTS. */
|
|
240
|
+
events: number;
|
|
241
|
+
sessions: number;
|
|
242
|
+
totalHits: number;
|
|
243
|
+
/** totalHits / events — the cleanliness denominator the old scorer ignored. */
|
|
244
|
+
faultRate: number;
|
|
245
|
+
/** Per-persona Σ(hits × weight). Same shape the old classifier returned. */
|
|
246
|
+
clusterRaw: Record<ArchetypeKey, number>;
|
|
247
|
+
totalSignal: number;
|
|
248
|
+
/** Per-persona observed-share ÷ baseline-share. The ranking metric. */
|
|
249
|
+
clusterLift: Record<ArchetypeKey, number>;
|
|
250
|
+
/** Normalised entropy of the lift vector (goldfish detector). */
|
|
251
|
+
entropy: number;
|
|
252
|
+
/** Second-highest cluster lift. Goldfish requires this to be elevated:
|
|
253
|
+
* high entropy alone is satisfied by a uniform-at-baseline lift vector
|
|
254
|
+
* (every cluster fires at ambient rate → lifts ≈ 1.0 → entropy = max),
|
|
255
|
+
* which would otherwise collapse every "typical" agent onto goldfish. */
|
|
256
|
+
secondLift: number;
|
|
257
|
+
/** Share of total signal coming from the two architect caution detectors. */
|
|
258
|
+
cautionShare: number;
|
|
259
|
+
cowboyLift: number;
|
|
260
|
+
/** Deterministic hash of the rounded behaviour vector + seed. Seeds
|
|
261
|
+
* tie-breaks and copy-variant selection. */
|
|
262
|
+
fingerprint: number;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function sumHits(result: AuditResult): number {
|
|
266
|
+
let s = 0;
|
|
267
|
+
for (const r of result.results) s += r.hits;
|
|
268
|
+
return s;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/** Derive the behaviour feature vector. Pure over (result, seed). */
|
|
272
|
+
export function deriveFeatures(result: AuditResult, seed = ""): AuditFeatures {
|
|
273
|
+
const events = Math.max(result.eventsScanned ?? 0, MIN_EVENTS);
|
|
274
|
+
const sessions = result.transcripts.scanned;
|
|
275
|
+
const totalHits = result.totals?.hits ?? sumHits(result);
|
|
276
|
+
|
|
277
|
+
const clusterRaw = emptyWeights();
|
|
278
|
+
let cautionRaw = 0;
|
|
279
|
+
for (const row of result.results) {
|
|
280
|
+
const short = shortName(row.name);
|
|
281
|
+
const sig = SIGNAL_MAP[short];
|
|
282
|
+
if (!sig) continue;
|
|
283
|
+
const w = row.hits * sig.weight;
|
|
284
|
+
clusterRaw[sig.archetype] += w;
|
|
285
|
+
if (ARCHITECT_CAUTION_SIGNALS.has(short)) cautionRaw += w;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
const totalSignal = MAPPABLE_KEYS.reduce((s, k) => s + clusterRaw[k], 0);
|
|
289
|
+
|
|
290
|
+
const clusterLift = emptyWeights();
|
|
291
|
+
for (const k of MAPPABLE_KEYS) {
|
|
292
|
+
const share = totalSignal > 0 ? clusterRaw[k] / totalSignal : 0;
|
|
293
|
+
clusterLift[k] = BASELINE_SHARE[k] > 0 ? share / BASELINE_SHARE[k] : 0;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const liftVec = MAPPABLE_KEYS.map((k) => clusterLift[k]);
|
|
297
|
+
const entropy = normalizedEntropy(liftVec);
|
|
298
|
+
const sortedLifts = [...liftVec].sort((a, b) => b - a);
|
|
299
|
+
const secondLift = sortedLifts[1] ?? 0;
|
|
300
|
+
const cautionShare = totalSignal > 0 ? cautionRaw / totalSignal : 0;
|
|
301
|
+
const faultRate = totalHits / events;
|
|
302
|
+
|
|
303
|
+
// Fingerprint: stable over the rounded behaviour signature + seed. Rounding
|
|
304
|
+
// keeps it stable against floating-point noise while still varying between
|
|
305
|
+
// genuinely different agents.
|
|
306
|
+
const sig = MAPPABLE_KEYS.map((k) => Math.round(clusterRaw[k] * 10)).join(",");
|
|
307
|
+
const fingerprint = hashSeed(`${seed}|${sig}|${Math.round(faultRate * 1000)}`);
|
|
308
|
+
|
|
309
|
+
return {
|
|
310
|
+
events, sessions, totalHits, faultRate,
|
|
311
|
+
clusterRaw, totalSignal, clusterLift, entropy, secondLift,
|
|
312
|
+
cautionShare, cowboyLift: clusterLift.cowboy, fingerprint,
|
|
313
|
+
};
|
|
314
|
+
}
|