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,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-effort "open the dashboard in the browser once it's actually listening".
|
|
3
|
+
*
|
|
4
|
+
* `failproofai audit` writes the dashboard cache, then starts the bundled
|
|
5
|
+
* dashboard server (a blocking call) and wants to pop the browser to /audit the
|
|
6
|
+
* moment the server answers โ never before (a connection-refused tab is a bad
|
|
7
|
+
* first impression). This polls the server root, then shells out to the
|
|
8
|
+
* platform's URL opener. Every failure is swallowed: the worst case is the user
|
|
9
|
+
* clicks the URL we already printed to the terminal.
|
|
10
|
+
*/
|
|
11
|
+
import { spawn } from "node:child_process";
|
|
12
|
+
|
|
13
|
+
const POLL_INTERVAL_MS = 150;
|
|
14
|
+
const POLL_TIMEOUT_MS = 30_000;
|
|
15
|
+
|
|
16
|
+
/** Open a URL with the platform's default handler. Never throws. */
|
|
17
|
+
function openUrl(url: string): void {
|
|
18
|
+
let cmd: string;
|
|
19
|
+
let args: string[];
|
|
20
|
+
if (process.platform === "darwin") {
|
|
21
|
+
cmd = "open";
|
|
22
|
+
args = [url];
|
|
23
|
+
} else if (process.platform === "win32") {
|
|
24
|
+
// `start` is a cmd builtin; the empty "" is the (required) window-title arg
|
|
25
|
+
// so a URL containing `&` or spaces isn't mis-parsed as the title.
|
|
26
|
+
cmd = "cmd";
|
|
27
|
+
args = ["/c", "start", "", url];
|
|
28
|
+
} else {
|
|
29
|
+
cmd = "xdg-open";
|
|
30
|
+
args = [url];
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const child = spawn(cmd, args, { stdio: "ignore", detached: true });
|
|
34
|
+
// Headless Linux without xdg-open, missing `open`, etc. โ swallow.
|
|
35
|
+
child.on("error", () => {});
|
|
36
|
+
child.unref();
|
|
37
|
+
} catch {
|
|
38
|
+
// ignore โ the URL was already printed for manual use.
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Poll `http://localhost:<port>/` until it responds (any status, including a
|
|
44
|
+
* redirect), then open `http://localhost:<port><path>`. Detached and
|
|
45
|
+
* best-effort: returns immediately, does its work on the event loop, and never
|
|
46
|
+
* throws into the caller (which is about to make a blocking `launch()` call).
|
|
47
|
+
*/
|
|
48
|
+
export function openWhenReady(port: number, path: string): void {
|
|
49
|
+
const base = `http://localhost:${port}`;
|
|
50
|
+
const target = `${base}${path}`;
|
|
51
|
+
void (async () => {
|
|
52
|
+
const deadline = Date.now() + POLL_TIMEOUT_MS;
|
|
53
|
+
while (Date.now() < deadline) {
|
|
54
|
+
try {
|
|
55
|
+
// `redirect: "manual"` so the dashboard's `/ โ /policies` 307 counts as
|
|
56
|
+
// "up" without us following it and rendering an unrelated page.
|
|
57
|
+
await fetch(base, { method: "GET", redirect: "manual" });
|
|
58
|
+
openUrl(target);
|
|
59
|
+
return;
|
|
60
|
+
} catch {
|
|
61
|
+
// Not listening yet โ wait and retry.
|
|
62
|
+
await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Timed out waiting for the probe. The server may still be coming up; open
|
|
66
|
+
// anyway as a last resort so a slow cold boot still lands on the page.
|
|
67
|
+
openUrl(target);
|
|
68
|
+
})();
|
|
69
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replay engine โ turns a NormalizedToolEvent into one (or two) synthetic hook
|
|
3
|
+
* payloads, runs them through the existing `evaluatePolicies` function, and
|
|
4
|
+
* returns the policy decisions.
|
|
5
|
+
*
|
|
6
|
+
* Why two events: builtin sanitize-* policies match on PostToolUse and inspect
|
|
7
|
+
* the tool result text. PreToolUse alone misses them. Per event we synthesize:
|
|
8
|
+
* 1. PreToolUse โ { tool_name, tool_input }
|
|
9
|
+
* 2. PostToolUse โ { tool_name, tool_input, tool_response } (only when the
|
|
10
|
+
* transcript captured a tool_result)
|
|
11
|
+
*
|
|
12
|
+
* Workflow policies (`require-*-before-stop`) match only on `Stop` and
|
|
13
|
+
* execSync against live git, so they never fire on PreToolUse/PostToolUse
|
|
14
|
+
* replay โ no explicit skip needed.
|
|
15
|
+
*/
|
|
16
|
+
import type { EvaluationResult } from "../hooks/policy-evaluator";
|
|
17
|
+
import { evaluatePolicies } from "../hooks/policy-evaluator";
|
|
18
|
+
import { BUILTIN_POLICIES, registerBuiltinPolicies } from "../hooks/builtin-policies";
|
|
19
|
+
import {
|
|
20
|
+
clearPolicies,
|
|
21
|
+
getAllPolicies,
|
|
22
|
+
normalizePolicyName,
|
|
23
|
+
setAllPolicies,
|
|
24
|
+
} from "../hooks/policy-registry";
|
|
25
|
+
import type { RegisteredPolicy } from "../hooks/policy-types";
|
|
26
|
+
import type { SessionMetadata } from "../hooks/types";
|
|
27
|
+
import type { NormalizedToolEvent } from "./types";
|
|
28
|
+
|
|
29
|
+
/** Policies the audit skips on purpose. `warn-repeated-tool-calls` mutates a
|
|
30
|
+
* per-session sidecar file on every evaluation, which would pollute the
|
|
31
|
+
* user's real transcript directory during a replay (and inflate counts
|
|
32
|
+
* because the replay always re-traverses the full session). */
|
|
33
|
+
const SKIP_POLICIES = new Set(
|
|
34
|
+
["warn-repeated-tool-calls"].map((n) => normalizePolicyName(n)),
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
let initialized = false;
|
|
38
|
+
/** Snapshot of the registry taken at `initReplay()`. Restored by
|
|
39
|
+
* `restoreReplay()` so embedding `runAudit()` in a long-running process
|
|
40
|
+
* (e.g. the Next.js dashboard) doesn't wipe any prior policy registrations. */
|
|
41
|
+
let savedSnapshot: RegisteredPolicy[] | null = null;
|
|
42
|
+
|
|
43
|
+
/** Register every builtin policy (regardless of user config) so the replay
|
|
44
|
+
* shows what *could* be caught, not just what's currently enabled. Called
|
|
45
|
+
* once per `runAudit` invocation. Snapshots the existing registry so it can
|
|
46
|
+
* be restored by `restoreReplay()` once the audit is done. */
|
|
47
|
+
export function initReplay(): void {
|
|
48
|
+
if (initialized) return;
|
|
49
|
+
savedSnapshot = getAllPolicies();
|
|
50
|
+
clearPolicies();
|
|
51
|
+
const enabled = BUILTIN_POLICIES
|
|
52
|
+
.map((p) => p.name)
|
|
53
|
+
.filter((n) => !SKIP_POLICIES.has(normalizePolicyName(n)));
|
|
54
|
+
registerBuiltinPolicies(enabled);
|
|
55
|
+
initialized = true;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Restore the registry to whatever was there before `initReplay()`. Safe to
|
|
59
|
+
* call when not initialized (no-op). Always paired with `initReplay()` in a
|
|
60
|
+
* try/finally inside `runAudit()`. */
|
|
61
|
+
export function restoreReplay(): void {
|
|
62
|
+
if (!initialized) return;
|
|
63
|
+
if (savedSnapshot !== null) {
|
|
64
|
+
setAllPolicies(savedSnapshot);
|
|
65
|
+
savedSnapshot = null;
|
|
66
|
+
}
|
|
67
|
+
initialized = false;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Reset for tests / repeated audits in the same process. Drops the snapshot
|
|
71
|
+
* too โ tests usually start with an empty registry and want it back. */
|
|
72
|
+
export function resetReplay(): void {
|
|
73
|
+
initialized = false;
|
|
74
|
+
savedSnapshot = null;
|
|
75
|
+
clearPolicies();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface ReplayHit {
|
|
79
|
+
policyName: string;
|
|
80
|
+
decision: "deny" | "instruct" | "allow";
|
|
81
|
+
reason: string | null;
|
|
82
|
+
eventType: "PreToolUse" | "PostToolUse";
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Replay one normalized tool event through every registered policy. Returns
|
|
86
|
+
* one ReplayHit per non-allow decision (deny + instruct). Allow-with-reason
|
|
87
|
+
* is reported too, so sanitize policies that emit informational notes still
|
|
88
|
+
* surface in the audit. */
|
|
89
|
+
export async function replayEvent(event: NormalizedToolEvent): Promise<ReplayHit[]> {
|
|
90
|
+
if (!initialized) initReplay();
|
|
91
|
+
|
|
92
|
+
const session: SessionMetadata = {
|
|
93
|
+
sessionId: event.sessionId,
|
|
94
|
+
transcriptPath: event.transcriptPath,
|
|
95
|
+
cwd: event.cwd,
|
|
96
|
+
cli: event.cli,
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const baseToolPayload: Record<string, unknown> = {
|
|
100
|
+
tool_name: event.toolName,
|
|
101
|
+
tool_input: event.toolInput,
|
|
102
|
+
session_id: event.sessionId,
|
|
103
|
+
cwd: event.cwd,
|
|
104
|
+
transcript_path: event.transcriptPath,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const out: ReplayHit[] = [];
|
|
108
|
+
|
|
109
|
+
// PreToolUse
|
|
110
|
+
const pre = await evaluatePolicies("PreToolUse", baseToolPayload, session);
|
|
111
|
+
collectHits(pre, "PreToolUse", out);
|
|
112
|
+
|
|
113
|
+
// PostToolUse โ only if the transcript captured a tool result.
|
|
114
|
+
if (event.toolResultText !== undefined) {
|
|
115
|
+
const postPayload = { ...baseToolPayload, tool_response: event.toolResultText };
|
|
116
|
+
const post = await evaluatePolicies("PostToolUse", postPayload, session);
|
|
117
|
+
collectHits(post, "PostToolUse", out);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function collectHits(
|
|
124
|
+
result: EvaluationResult,
|
|
125
|
+
eventType: "PreToolUse" | "PostToolUse",
|
|
126
|
+
out: ReplayHit[],
|
|
127
|
+
): void {
|
|
128
|
+
// `policyNames` is set when multiple policies fired (sanitize stack);
|
|
129
|
+
// otherwise fall back to `policyName`.
|
|
130
|
+
const names = result.policyNames && result.policyNames.length > 0
|
|
131
|
+
? result.policyNames
|
|
132
|
+
: result.policyName
|
|
133
|
+
? [result.policyName]
|
|
134
|
+
: [];
|
|
135
|
+
for (const name of names) {
|
|
136
|
+
// The aggregate `decision` reflects the most severe firing, but the audit
|
|
137
|
+
// wants per-policy counts. We re-tag each name with the aggregate decision
|
|
138
|
+
// for now โ accurate enough for the table; a future audit-detail mode can
|
|
139
|
+
// re-evaluate per-policy if precision becomes important.
|
|
140
|
+
out.push({
|
|
141
|
+
policyName: name,
|
|
142
|
+
decision: result.decision,
|
|
143
|
+
reason: result.reason,
|
|
144
|
+
eventType,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output renderers for `failproofai audit`:
|
|
3
|
+
* โข formatText โ ANSI table to stdout (GTM-oriented "moment of truth")
|
|
4
|
+
* โข formatMarkdown โ shareable sectioned report written to a file
|
|
5
|
+
* โข formatJson โ machine-readable
|
|
6
|
+
*
|
|
7
|
+
* The text renderer is the user's first impression of the audit. It leads
|
|
8
|
+
* with a headline-box, splits findings into "already protected" vs "slipping
|
|
9
|
+
* through" so the conversion ask is obvious, and ends with a copy-pasteable
|
|
10
|
+
* install command + report path + star link.
|
|
11
|
+
*/
|
|
12
|
+
import type { AuditCount, AuditResult, RunAuditOptions } from "./types";
|
|
13
|
+
|
|
14
|
+
const ANSI = {
|
|
15
|
+
reset: "\x1B[0m",
|
|
16
|
+
dim: "\x1B[2m",
|
|
17
|
+
bold: "\x1B[1m",
|
|
18
|
+
red: "\x1B[31m",
|
|
19
|
+
yellow: "\x1B[33m",
|
|
20
|
+
green: "\x1B[32m",
|
|
21
|
+
cyan: "\x1B[36m",
|
|
22
|
+
magenta: "\x1B[35m",
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** Honor https://no-color.org / NO_COLOR=1 and FORCE_COLOR=0 by stripping all
|
|
26
|
+
* ANSI sequences from the final output. Detected once per renderer call. */
|
|
27
|
+
function noColorEnabled(): boolean {
|
|
28
|
+
if (process.env.NO_COLOR && process.env.NO_COLOR !== "") return true;
|
|
29
|
+
if (process.env.FORCE_COLOR === "0") return true;
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function stripAnsi(s: string): string {
|
|
34
|
+
// eslint-disable-next-line no-control-regex
|
|
35
|
+
return s.replace(/\x1B\[[0-9;]*m/g, "");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Human-readable "time ago" โ "30m ago", "2h ago", "3d ago", "2w ago".
|
|
39
|
+
* Returns "just now" for <1 minute. */
|
|
40
|
+
function formatTimeAgo(iso: string | undefined): string {
|
|
41
|
+
if (!iso) return "โ";
|
|
42
|
+
const ms = Date.now() - new Date(iso).getTime();
|
|
43
|
+
if (Number.isNaN(ms) || ms < 0) return "โ";
|
|
44
|
+
const m = Math.floor(ms / 60_000);
|
|
45
|
+
if (m < 1) return "just now";
|
|
46
|
+
if (m < 60) return `${m}m ago`;
|
|
47
|
+
const h = Math.floor(m / 60);
|
|
48
|
+
if (h < 24) return `${h}h ago`;
|
|
49
|
+
const d = Math.floor(h / 24);
|
|
50
|
+
if (d < 14) return `${d}d ago`;
|
|
51
|
+
const w = Math.floor(d / 7);
|
|
52
|
+
if (w < 8) return `${w}w ago`;
|
|
53
|
+
return `${Math.floor(d / 30)}mo ago`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Width of the headline box and section dividers. Adapts to narrow terminals
|
|
57
|
+
* down to a 60-char floor. */
|
|
58
|
+
function getWidth(): number {
|
|
59
|
+
const cols = process.stdout.columns ?? 80;
|
|
60
|
+
return Math.max(60, Math.min(78, cols));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Box-drawing helpers using unicode round-corner glyphs. */
|
|
64
|
+
function topBorder(w: number): string { return `โญ${"โ".repeat(w - 2)}โฎ`; }
|
|
65
|
+
function bottomBorder(w: number): string { return `โฐ${"โ".repeat(w - 2)}โฏ`; }
|
|
66
|
+
function boxLine(text: string, w: number): string {
|
|
67
|
+
const inner = w - 4; // 2 chars of border + 1 char padding each side
|
|
68
|
+
const visible = stripAnsi(text);
|
|
69
|
+
const pad = Math.max(0, inner - visible.length);
|
|
70
|
+
return `โ ${text}${" ".repeat(pad)} โ`;
|
|
71
|
+
}
|
|
72
|
+
function divider(w: number): string { return "โ".repeat(w); }
|
|
73
|
+
|
|
74
|
+
/** Short, qualified policy slug โ `failproofai/foo` โ `foo` for display. */
|
|
75
|
+
function shortName(name: string): string {
|
|
76
|
+
const slash = name.indexOf("/");
|
|
77
|
+
return slash >= 0 ? name.slice(slash + 1) : name;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Sum hits across an AuditCount[] subset. */
|
|
81
|
+
function sumHits(rows: AuditCount[]): number {
|
|
82
|
+
return rows.reduce((acc, r) => acc + r.hits, 0);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Render one row in the table-of-findings form:
|
|
86
|
+
* 31ร Tried to read files outside your project
|
|
87
|
+
* Stops the agent from peeking at neighboring reposโฆ
|
|
88
|
+
* Last seen 2h ago ยท 6 projects
|
|
89
|
+
* โบ Already enforced โ failproofai is blocking these in real time.
|
|
90
|
+
* Example: grep -n โฆ
|
|
91
|
+
*/
|
|
92
|
+
function renderRow(r: AuditCount, opts: { showExamples?: boolean }): string[] {
|
|
93
|
+
const out: string[] = [];
|
|
94
|
+
const sev = r.severity;
|
|
95
|
+
const titleColor =
|
|
96
|
+
sev === "deny" ? ANSI.red
|
|
97
|
+
: sev === "warn" ? ANSI.red
|
|
98
|
+
: sev === "info" || sev === "instruct" ? ANSI.yellow
|
|
99
|
+
: ANSI.cyan;
|
|
100
|
+
const countStr = String(r.hits).padStart(4);
|
|
101
|
+
out.push(` ${titleColor}${ANSI.bold}${countStr}ร${ANSI.reset} ${r.displayTitle}`);
|
|
102
|
+
if (r.impact) {
|
|
103
|
+
out.push(` ${ANSI.dim}${r.impact}${ANSI.reset}`);
|
|
104
|
+
}
|
|
105
|
+
out.push(
|
|
106
|
+
` ${ANSI.dim}Last seen ${formatTimeAgo(r.lastSeen)} ยท ${r.projects} project${r.projects === 1 ? "" : "s"}${ANSI.reset}`,
|
|
107
|
+
);
|
|
108
|
+
if (opts.showExamples && r.examples[0]) {
|
|
109
|
+
out.push(` ${ANSI.dim}Example: ${r.examples[0].example}${ANSI.reset}`);
|
|
110
|
+
}
|
|
111
|
+
if (r.installHint) {
|
|
112
|
+
const arrowColor = r.enabledInConfig ? ANSI.green : ANSI.cyan;
|
|
113
|
+
out.push(` ${arrowColor}โบ${ANSI.reset} ${r.installHint}`);
|
|
114
|
+
}
|
|
115
|
+
out.push("");
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function formatText(result: AuditResult, opts: RunAuditOptions = {}): string {
|
|
120
|
+
const w = getWidth();
|
|
121
|
+
const limit = opts.limit ?? 20;
|
|
122
|
+
const showExamples = !!opts.showExamples;
|
|
123
|
+
|
|
124
|
+
// Split rows by enforcement state.
|
|
125
|
+
const enabledRows = result.results.filter((r) => r.source === "builtin" && r.enabledInConfig);
|
|
126
|
+
const unenabledBuiltinRows = result.results.filter((r) => r.source === "builtin" && !r.enabledInConfig);
|
|
127
|
+
const detectorRows = result.results.filter((r) => r.source === "audit-detector");
|
|
128
|
+
// "Slipping through" combines unenabled-builtins + audit-detectors, ranked by hits.
|
|
129
|
+
const slippingRows = [...unenabledBuiltinRows, ...detectorRows].sort((a, b) => b.hits - a.hits);
|
|
130
|
+
|
|
131
|
+
const totalProtected = sumHits(enabledRows);
|
|
132
|
+
const totalSlipping = sumHits(slippingRows);
|
|
133
|
+
const totalHits = totalProtected + totalSlipping;
|
|
134
|
+
const sinceLabel = result.scope.since ? `the last ${result.scope.since}` : "all time";
|
|
135
|
+
|
|
136
|
+
const lines: string[] = [];
|
|
137
|
+
|
|
138
|
+
// โโ Header โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
139
|
+
lines.push(`${ANSI.cyan}๐ก failproofai audit${ANSI.reset} ${ANSI.dim}[beta]${ANSI.reset} ยท ${sinceLabel}`);
|
|
140
|
+
lines.push(
|
|
141
|
+
` ${ANSI.dim}${result.transcripts.scanned} sessions ยท ${result.totals.projectsWithHits} project${result.totals.projectsWithHits === 1 ? "" : "s"} with hits ยท scanned in ${(result.transcripts.durationMs / 1000).toFixed(1)}s${ANSI.reset}`,
|
|
142
|
+
);
|
|
143
|
+
lines.push("");
|
|
144
|
+
|
|
145
|
+
// โโ Headline box โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
146
|
+
if (totalHits === 0) {
|
|
147
|
+
lines.push(topBorder(w));
|
|
148
|
+
lines.push(boxLine(`${ANSI.green}๐ Clean run!${ANSI.reset} Nothing matched your policies in this window.`, w));
|
|
149
|
+
lines.push(bottomBorder(w));
|
|
150
|
+
lines.push("");
|
|
151
|
+
return noColorEnabled() ? stripAnsi(lines.join("\n")) : lines.join("\n");
|
|
152
|
+
}
|
|
153
|
+
lines.push(topBorder(w));
|
|
154
|
+
lines.push(boxLine(
|
|
155
|
+
`${ANSI.bold}Your agent did ${totalHits} wasteful or risky things in ${sinceLabel}.${ANSI.reset}`,
|
|
156
|
+
w,
|
|
157
|
+
));
|
|
158
|
+
if (totalSlipping > 0) {
|
|
159
|
+
lines.push(boxLine(
|
|
160
|
+
`${totalSlipping} of those would've been caught if more policies were on.`,
|
|
161
|
+
w,
|
|
162
|
+
));
|
|
163
|
+
}
|
|
164
|
+
lines.push(bottomBorder(w));
|
|
165
|
+
lines.push("");
|
|
166
|
+
|
|
167
|
+
// โโ Section: ALREADY PROTECTED โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
168
|
+
if (enabledRows.length > 0) {
|
|
169
|
+
lines.push(
|
|
170
|
+
`${ANSI.green}โ ALREADY PROTECTED${ANSI.reset} ${ANSI.dim}(${totalProtected} action${totalProtected === 1 ? "" : "s"} stopped by your current policies)${ANSI.reset}`,
|
|
171
|
+
);
|
|
172
|
+
lines.push("");
|
|
173
|
+
for (const row of enabledRows.slice(0, limit)) {
|
|
174
|
+
lines.push(...renderRow(row, { showExamples }));
|
|
175
|
+
}
|
|
176
|
+
if (enabledRows.length > limit) {
|
|
177
|
+
lines.push(` ${ANSI.dim}โฆ ${enabledRows.length - limit} more (use --limit ${enabledRows.length})${ANSI.reset}`);
|
|
178
|
+
lines.push("");
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// โโ Section: SLIPPING THROUGH โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
183
|
+
if (slippingRows.length > 0) {
|
|
184
|
+
lines.push(
|
|
185
|
+
`${ANSI.yellow}โ SLIPPING THROUGH${ANSI.reset} ${ANSI.dim}(${totalSlipping} action${totalSlipping === 1 ? "" : "s"} caught by audit, not blocked in real time)${ANSI.reset}`,
|
|
186
|
+
);
|
|
187
|
+
lines.push("");
|
|
188
|
+
for (const row of slippingRows.slice(0, limit)) {
|
|
189
|
+
lines.push(...renderRow(row, { showExamples }));
|
|
190
|
+
}
|
|
191
|
+
if (slippingRows.length > limit) {
|
|
192
|
+
lines.push(` ${ANSI.dim}โฆ ${slippingRows.length - limit} more (use --limit ${slippingRows.length})${ANSI.reset}`);
|
|
193
|
+
lines.push("");
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// โโ Footer / NEXT step โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
198
|
+
lines.push(divider(w));
|
|
199
|
+
if (unenabledBuiltinRows.length > 0) {
|
|
200
|
+
const installNames = unenabledBuiltinRows.map((r) => shortName(r.name));
|
|
201
|
+
lines.push(
|
|
202
|
+
`${ANSI.bold}NEXT${ANSI.reset} Enable the ${installNames.length} unenabled real-time polic${installNames.length === 1 ? "y" : "ies"} in one command:`,
|
|
203
|
+
);
|
|
204
|
+
lines.push("");
|
|
205
|
+
lines.push(` ${ANSI.cyan}failproofai policies --install ${installNames.join(" ")}${ANSI.reset}`);
|
|
206
|
+
lines.push("");
|
|
207
|
+
} else if (slippingRows.length > 0) {
|
|
208
|
+
lines.push(
|
|
209
|
+
`${ANSI.bold}NEXT${ANSI.reset} Everything blockable is already enabled. Audit-only findings will show up in your next ${ANSI.cyan}failproofai audit${ANSI.reset}.`,
|
|
210
|
+
);
|
|
211
|
+
lines.push("");
|
|
212
|
+
} else {
|
|
213
|
+
lines.push(`${ANSI.bold}NEXT${ANSI.reset} ${ANSI.green}You have the relevant policies enabled. failproofai is blocking these in real time.${ANSI.reset}`);
|
|
214
|
+
lines.push("");
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Mirror the actual --report path so the printed footer matches what was
|
|
218
|
+
// (or will be) written. Suppressed entirely with --no-report.
|
|
219
|
+
if (!opts.noReport) {
|
|
220
|
+
const reportPath = opts.reportPath ?? "./failproofai-audit.md";
|
|
221
|
+
lines.push(` ๐ Shareable report: ${ANSI.cyan}${reportPath}${ANSI.reset}`);
|
|
222
|
+
}
|
|
223
|
+
lines.push(` โญ Star us: ${ANSI.cyan}https://github.com/FailproofAI/failproofai${ANSI.reset}`);
|
|
224
|
+
lines.push("");
|
|
225
|
+
|
|
226
|
+
return noColorEnabled() ? stripAnsi(lines.join("\n")) : lines.join("\n");
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export function formatJson(result: AuditResult): string {
|
|
230
|
+
return JSON.stringify(result, null, 2);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/** Escape characters that would break a markdown table row. Pipes split
|
|
234
|
+
* columns; backslashes escape the next char; leading newlines end the row. */
|
|
235
|
+
function escapeTableCell(s: string): string {
|
|
236
|
+
return s.replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/[\r\n]+/g, " ");
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function escapeBackticks(s: string): string {
|
|
240
|
+
return s.replace(/`/g, "\\`");
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export function formatMarkdown(result: AuditResult): string {
|
|
244
|
+
const out: string[] = [];
|
|
245
|
+
|
|
246
|
+
const enabledRows = result.results.filter((r) => r.source === "builtin" && r.enabledInConfig);
|
|
247
|
+
const unenabledBuiltinRows = result.results.filter((r) => r.source === "builtin" && !r.enabledInConfig);
|
|
248
|
+
const detectorRows = result.results.filter((r) => r.source === "audit-detector");
|
|
249
|
+
const slippingRows = [...unenabledBuiltinRows, ...detectorRows].sort((a, b) => b.hits - a.hits);
|
|
250
|
+
|
|
251
|
+
const totalProtected = sumHits(enabledRows);
|
|
252
|
+
const totalSlipping = sumHits(slippingRows);
|
|
253
|
+
const totalHits = totalProtected + totalSlipping;
|
|
254
|
+
const sinceLabel = result.scope.since ? `last ${result.scope.since}` : "all time";
|
|
255
|
+
|
|
256
|
+
out.push(`# Agent behavior audit ยท ${sinceLabel}`);
|
|
257
|
+
out.push("");
|
|
258
|
+
out.push("> _Generated by `failproofai audit` (**beta**) โ flags and output may change between releases. Going live shortly._");
|
|
259
|
+
out.push("");
|
|
260
|
+
out.push(`*Generated ${result.scannedAt} โ scanned ${result.transcripts.scanned} sessions across ${result.totals.projectsWithHits} project(s) in ${(result.transcripts.durationMs / 1000).toFixed(1)}s.*`);
|
|
261
|
+
out.push("");
|
|
262
|
+
|
|
263
|
+
// TL;DR โ readable to someone who doesn't know failproofai.
|
|
264
|
+
out.push("## TL;DR");
|
|
265
|
+
out.push("");
|
|
266
|
+
if (totalHits === 0) {
|
|
267
|
+
out.push("Clean run โ the AI coding agent didn't do anything `failproofai` catches in this window.");
|
|
268
|
+
} else {
|
|
269
|
+
out.push(
|
|
270
|
+
`Over ${result.transcripts.scanned} sessions, my AI coding agent did **${totalHits} things \`failproofai\` would have stopped**: ` +
|
|
271
|
+
`${totalProtected} were already blocked in real time by my current config; ` +
|
|
272
|
+
`**${totalSlipping} slipped through** (would've been caught if more policies were on).`,
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
out.push("");
|
|
276
|
+
out.push("> [failproofai](https://github.com/FailproofAI/failproofai) is a hook-based policy engine for Claude Code, Codex, Copilot, Cursor, OpenCode, Pi, and Gemini CLI. The `audit` command replays past agent sessions through every builtin policy to surface patterns that were (or could've been) stopped.");
|
|
277
|
+
out.push("");
|
|
278
|
+
|
|
279
|
+
if (totalHits === 0) return out.join("\n");
|
|
280
|
+
|
|
281
|
+
// What was blocked
|
|
282
|
+
if (enabledRows.length > 0) {
|
|
283
|
+
out.push(`## โ Already protected (${totalProtected} action${totalProtected === 1 ? "" : "s"} stopped)`);
|
|
284
|
+
out.push("");
|
|
285
|
+
out.push("These are real-time policies you have on โ `failproofai` blocked the agent before each action took effect.");
|
|
286
|
+
out.push("");
|
|
287
|
+
out.push("| Issue | Hits | Projects | Last seen | Policy |");
|
|
288
|
+
out.push("|---|---:|---:|---|---|");
|
|
289
|
+
for (const r of enabledRows) {
|
|
290
|
+
out.push(
|
|
291
|
+
`| ${escapeTableCell(r.displayTitle)} | ${r.hits} | ${r.projects} | ${formatTimeAgo(r.lastSeen)} | \`${escapeTableCell(shortName(r.name))}\` |`,
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
out.push("");
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// What's slipping through
|
|
298
|
+
if (slippingRows.length > 0) {
|
|
299
|
+
out.push(`## โ Slipping through (${totalSlipping} action${totalSlipping === 1 ? "" : "s"} caught by audit, not yet blocked)`);
|
|
300
|
+
out.push("");
|
|
301
|
+
out.push("Patterns the audit detected but real-time enforcement isn't on for. The CTA column shows how to fix each.");
|
|
302
|
+
out.push("");
|
|
303
|
+
out.push("| Issue | Hits | Projects | Last seen | Fix |");
|
|
304
|
+
out.push("|---|---:|---:|---|---|");
|
|
305
|
+
for (const r of slippingRows) {
|
|
306
|
+
const fix = r.source === "builtin"
|
|
307
|
+
? `\`failproofai policies --install ${shortName(r.name)}\``
|
|
308
|
+
: "_audit-only_";
|
|
309
|
+
out.push(
|
|
310
|
+
`| ${escapeTableCell(r.displayTitle)} | ${r.hits} | ${r.projects} | ${formatTimeAgo(r.lastSeen)} | ${fix} |`,
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
out.push("");
|
|
314
|
+
|
|
315
|
+
if (unenabledBuiltinRows.length > 0) {
|
|
316
|
+
out.push(`### Enable everything in one command`);
|
|
317
|
+
out.push("");
|
|
318
|
+
out.push("```bash");
|
|
319
|
+
out.push(`failproofai policies --install ${unenabledBuiltinRows.map((r) => shortName(r.name)).join(" ")}`);
|
|
320
|
+
out.push("```");
|
|
321
|
+
out.push("");
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Examples appendix (only if non-trivial)
|
|
326
|
+
const rowsWithExamples = [...enabledRows, ...slippingRows].filter((r) => r.examples.length > 0);
|
|
327
|
+
if (rowsWithExamples.length > 0) {
|
|
328
|
+
out.push("## Examples");
|
|
329
|
+
out.push("");
|
|
330
|
+
for (const r of rowsWithExamples) {
|
|
331
|
+
out.push(`### ${escapeBackticks(r.displayTitle)} (\`${escapeBackticks(shortName(r.name))}\`)`);
|
|
332
|
+
out.push("");
|
|
333
|
+
if (r.impact) {
|
|
334
|
+
out.push(`> ${r.impact}`);
|
|
335
|
+
out.push("");
|
|
336
|
+
}
|
|
337
|
+
for (const e of r.examples) {
|
|
338
|
+
out.push(`- \`${escapeBackticks(e.example)}\` _(${e.cwd || "?"}, ${formatTimeAgo(e.timestamp)})_`);
|
|
339
|
+
}
|
|
340
|
+
out.push("");
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
out.push("---");
|
|
345
|
+
out.push("");
|
|
346
|
+
out.push("โญ Star failproofai on GitHub: <https://github.com/FailproofAI/failproofai>");
|
|
347
|
+
out.push("");
|
|
348
|
+
return out.join("\n");
|
|
349
|
+
}
|