failproofai 1.0.4-beta.1 → 1.0.4-beta.2
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/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +5 -5
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page/build-manifest.json +2 -2
- 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.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 +6 -6
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- 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 +2 -2
- 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.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/invite/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/audit/run/route.js +4 -4
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/run/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/status/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-request/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-verify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/audit/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +37 -4
- package/.next/standalone/.next/server/app/audit/page.js +2 -2
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/policies/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
- package/.next/standalone/.next/server/app/policies/page.js +1 -1
- 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 +2 -2
- 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 +3 -3
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js +1 -1
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings/page/build-manifest.json +2 -2
- package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +4 -4
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]__1zndo1i._.js → [externals]__1lh7m5d._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{[externals]__0_gzk8q._.js → [externals]__1rqkg_y._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08dchfu._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cuho4x._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1adacul._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1le9jqc._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1p-qi2t._.js +5 -0
- package/.next/standalone/.next/server/chunks/_08w6xzm._.js +3 -0
- package/.next/standalone/.next/server/chunks/_09dz7xv._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0tovk6q._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0trp3yc._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1ek68ln._.js +14 -21
- package/.next/standalone/.next/server/chunks/lib_telemetry_ts_0dctyyw._.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_01r25oi._.js +2 -2
- package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +2 -2
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_hooks_0iu54mz._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_hooks_fp-home_ts_09kv0bn._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00-s7h8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__013jr2b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01wy8d-._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02npjtd._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0da85px._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ftmoxc._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0wvusu0._.js → [root-of-the-server]__0n_lxhg._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oa1lav._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0p-5p8u._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rgu2r3._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s740oi._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__190won8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ctpynv._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1p2otjt._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1qapotl._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1sc84bb._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1zl_r0t._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0-oij9d._.js +23 -0
- package/.next/standalone/.next/server/chunks/ssr/_0-yi74u._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0l2hi_d._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0oq1dh6._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0wso5d3._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1es2j7i._.js +48 -168
- package/.next/standalone/.next/server/chunks/ssr/{_08f0jd2._.js → _1if9ixi._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1u8-lu2._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -69
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_rerun-button_tsx_0blihgw._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_settings_settings-client_tsx_20lq-mq._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_13n822a._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-config_ts_04t589g._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_fp-home_ts_0je3xkv._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +5 -5
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +54 -21
- package/.next/standalone/.next/static/chunks/{1_bxotmf9qngs.js → 010bv1w6j171t.js} +1 -1
- package/.next/standalone/.next/static/chunks/04r6ch8uf_n8m.js +1 -0
- package/.next/standalone/.next/static/chunks/{29-iqnp9v_axt.css → 0o-hh5_turzlz.css} +1 -1
- package/.next/standalone/.next/static/chunks/0qmsunv04x4na.css +2 -0
- package/.next/standalone/.next/static/chunks/{00gv0v91mycm-.js → 0wz8yftk18ts2.js} +1 -1
- package/.next/standalone/.next/static/chunks/0zebh1n9jkfbt.js +1 -0
- package/.next/standalone/.next/static/chunks/{0qn9khv0oo9ex.js → 1pb1oztsbwcss.js} +1 -1
- package/.next/standalone/.next/static/chunks/2aquitk72k2op.js +1 -0
- package/.next/standalone/.next/static/chunks/2bi_1y0a_smt7.js +6 -0
- package/.next/standalone/.next/static/chunks/{1po3lirgk2riw.js → 2ej3b8gk5ittu.js} +1 -1
- package/.next/standalone/.next/static/chunks/{01hvwwrhvbzyh.js → 2zafgs90r_leq.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1_2jsatfuthrw.js → 32spub4wqjem-.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3_--3ibia6ba1.js → 3l36d73kj18zw.js} +1 -1
- package/.next/standalone/.next/static/chunks/{2bvwsyu6x__ia.js → 3m4upvybtrexd.js} +1 -1
- package/.next/standalone/.next/static/chunks/{2k9f4tyv04809.css → 3uyhmm01g64k4.css} +1 -0
- package/.next/standalone/.next/static/chunks/{2bnf_4pgyk1rq.js → 40lpt2o2b283e.js} +1 -1
- package/.next/standalone/.next/static/chunks/{turbopack-18qf4jodtft6b.js → turbopack-3s3c-u_u_l0u9.js} +1 -1
- package/.next/standalone/.opencode/plugins/failproofai.mjs +51 -27
- package/.next/standalone/app/actions/get-leaks.ts +100 -0
- package/.next/standalone/app/audit/_components/audit-dashboard.tsx +112 -33
- package/.next/standalone/app/audit/_components/audit-poster.tsx +29 -10
- package/.next/standalone/app/audit/_components/come-back-better-section.tsx +6 -1
- package/.next/standalone/app/audit/_components/empty-state.tsx +4 -1
- package/.next/standalone/app/audit/_components/how-to-improve-section.tsx +19 -5
- package/.next/standalone/app/audit/_components/leak-section.tsx +179 -0
- package/.next/standalone/app/audit/_components/share-templates.ts +110 -44
- package/.next/standalone/app/audit/audit-styles.css +114 -1
- package/.next/standalone/app/project/[name]/page.tsx +4 -24
- package/.next/standalone/fp-cloud-cli/CHANGELOG.md +26 -3
- package/.next/standalone/fp-cloud-cli/fp_cli/_click_compat.py +31 -8
- package/.next/standalone/fp-cloud-cli/fp_cli/permissions.py +1 -0
- package/.next/standalone/fp-cloud-cli/pyproject.toml +9 -2
- package/.next/standalone/fp-cloud-cli/tests/test_click_compat.py +54 -0
- package/.next/standalone/fp-cloud-cli/uv.lock +9 -12
- package/.next/standalone/lib/auth/api-server-client.ts +28 -0
- package/.next/standalone/lib/claude-sessions.ts +101 -27
- package/.next/standalone/lib/cli-registry.ts +1 -33
- package/.next/standalone/lib/download-session.ts +0 -37
- package/.next/standalone/lib/projects.ts +3 -27
- package/.next/standalone/node_modules/@next/env/package.json +1 -1
- package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
- package/.next/standalone/node_modules/next/dist/experimental/testmode/fetch.js +10 -2
- package/.next/standalone/node_modules/next/dist/lib/patch-incorrect-lockfile.js +3 -3
- package/.next/standalone/node_modules/next/dist/lib/typescript/runTypeScriptCli.js +2 -2
- package/.next/standalone/node_modules/next/dist/lib/verify-typescript-setup.js +3 -1
- 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/image-optimizer.js +2 -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/start-server.js +1 -1
- 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 +11 -11
- package/.next/standalone/package.json +15 -14
- package/.next/standalone/sdk/python/CHANGELOG.md +155 -0
- package/.next/standalone/sdk/python/README.md +8 -0
- package/.next/standalone/sdk/python/examples/evaluator_worker.py +121 -0
- package/.next/standalone/sdk/python/failproofai_sdk/_version.py +1 -1
- package/.next/standalone/sdk/python/failproofai_sdk/evaluator/__init__.py +101 -0
- package/.next/standalone/sdk/python/failproofai_sdk/evaluator/__main__.py +49 -0
- package/.next/standalone/sdk/python/failproofai_sdk/evaluator/_sandbox_runner.py +63 -0
- package/.next/standalone/sdk/python/failproofai_sdk/evaluator/authoring.py +404 -0
- package/.next/standalone/sdk/python/failproofai_sdk/evaluator/client.py +299 -0
- package/.next/standalone/sdk/python/failproofai_sdk/evaluator/protocol.py +754 -0
- package/.next/standalone/sdk/python/failproofai_sdk/evaluator/runtime.py +936 -0
- package/.next/standalone/sdk/python/failproofai_sdk/evaluator/source.py +684 -0
- package/.next/standalone/sdk/python/tests/fixtures/evaluator_v2/README.md +28 -0
- package/.next/standalone/sdk/python/tests/fixtures/evaluator_v2/contract.json +252 -0
- package/.next/standalone/sdk/python/tests/test_evaluator_authoring.py +124 -0
- package/.next/standalone/sdk/python/tests/test_evaluator_client.py +253 -0
- package/.next/standalone/sdk/python/tests/test_evaluator_example.py +35 -0
- package/.next/standalone/sdk/python/tests/test_evaluator_http_e2e.py +636 -0
- package/.next/standalone/sdk/python/tests/test_evaluator_main.py +47 -0
- package/.next/standalone/sdk/python/tests/test_evaluator_protocol.py +246 -0
- package/.next/standalone/sdk/python/tests/test_evaluator_review_fixes.py +164 -0
- package/.next/standalone/sdk/python/tests/test_evaluator_runtime.py +1103 -0
- package/.next/standalone/sdk/python/tests/test_evaluator_source.py +430 -0
- package/.next/standalone/sdk/python/tests/test_zero_dependencies.py +17 -0
- package/.next/standalone/sdk/python/uv.lock +18 -18
- package/.next/standalone/server.js +1 -1
- package/README.md +19 -95
- package/bin/failproofai.mjs +7 -24
- package/dist/cli.mjs +19910 -25855
- package/dist/worker.mjs +4818 -6344
- package/lib/auth/api-server-client.ts +28 -0
- package/lib/claude-sessions.ts +101 -27
- package/lib/cli-registry.ts +1 -33
- package/lib/download-session.ts +0 -37
- package/lib/projects.ts +3 -27
- package/package.json +15 -14
- package/pi-extension/index.ts +42 -4
- package/scripts/changelog-open.py +115 -0
- package/src/audit/cli-adapters/index.ts +0 -24
- package/src/audit/cli.ts +134 -0
- package/src/audit/desktop-notify.ts +420 -0
- package/src/audit/harm-report.ts +101 -0
- package/src/audit/index.ts +141 -13
- package/src/audit/leak-fingerprint.ts +200 -0
- package/src/audit/leak-notice.ts +161 -0
- package/src/audit/leak-record.ts +232 -0
- package/src/audit/leak-scan.ts +292 -0
- package/src/audit/leak-store.ts +217 -0
- package/src/audit/macos-notifier.ts +310 -0
- package/src/audit/redact-example.ts +266 -14
- package/src/audit/report-harm.ts +12 -1
- package/src/audit/report.ts +6 -3
- package/src/audit/schedule-cli.ts +37 -0
- package/src/audit/scoring.ts +49 -0
- package/src/audit/types.ts +41 -0
- package/src/hooks/builtin-policies.ts +71 -8
- package/src/hooks/configure-wizard.ts +20 -0
- package/src/hooks/enforcement-capability.ts +0 -97
- package/src/hooks/fp-config.ts +71 -11
- package/src/hooks/fp-home.ts +27 -0
- package/src/hooks/handler.ts +64 -62
- package/src/hooks/harness-cli.ts +1 -3
- package/src/hooks/integrations.ts +49 -769
- package/src/hooks/normalize-cli-payload.ts +0 -126
- package/src/hooks/notice.ts +155 -0
- package/src/hooks/policy-evaluator.ts +6 -297
- package/src/hooks/resolve-transcript-path.ts +0 -10
- package/src/hooks/tool-name-canonicalize.ts +0 -64
- package/src/hooks/types.ts +2 -533
- package/src/hooks/uninstall-cli.ts +15 -0
- package/.next/standalone/.grok/hooks/failproofai.json +0 -172
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__07hor7h._.js +0 -5
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0elsuli._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gnj_qa._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ljuzm_._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0w23bpg._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0x5c7sh._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0yik9_w._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1jg6s9m._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1s6qci9._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1xfm05z._.js +0 -3
- package/.next/standalone/.next/server/chunks/_0tdy_6l._.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_grok-projects_ts_1i2epl_._.js +0 -3
- package/.next/standalone/.next/server/chunks/lib_qwen-projects_ts_0wu_a8e._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0_4gcz8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0d--wmy._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qqrlf_._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s11fx1._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__16gamwq._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1bbk-si._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1c3ybxr._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1izi7zn._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__21bj7uw._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_00z5uuq._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1byck5v._.js +0 -23
- package/.next/standalone/.next/server/chunks/ssr/_1ylae7o._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/lib_cline-projects_ts_13_hbdd._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/lib_grok-projects_ts_0rc-d0o._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/lib_ori-projects_ts_04tofqo._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/lib_qwen-projects_ts_0w3i9o7._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_html-to-image_es_index_1ao30b1.js +0 -3
- package/.next/standalone/.next/static/chunks/0hzmxwb2pvk5p.js +0 -6
- package/.next/standalone/.next/static/chunks/0j884dwnwtyrt.js +0 -1
- package/.next/standalone/.next/static/chunks/0mr9dg3bnloa1.js +0 -1
- package/.next/standalone/.next/static/chunks/0u64yey446k4f.css +0 -1
- package/.next/standalone/.next/static/chunks/3gf1jg-5m-u1t.css +0 -2
- package/.next/standalone/.next/static/chunks/3qfoeqhy5l10x.js +0 -1
- package/.next/standalone/.next/static/chunks/3ws7eljkq25wg.js +0 -69
- package/.next/standalone/.next/static/chunks/3zkg2s2vzxc3d.js +0 -1
- package/.next/standalone/.qwen/settings.json +0 -251
- package/.next/standalone/assets/logos/cline.png +0 -0
- package/.next/standalone/assets/logos/grok-dark.svg +0 -1
- package/.next/standalone/assets/logos/grok-light.svg +0 -1
- package/.next/standalone/assets/logos/ori-dark.svg +0 -1
- package/.next/standalone/assets/logos/ori-light.svg +0 -1
- package/.next/standalone/assets/logos/qwen.svg +0 -1
- package/.next/standalone/lib/cline-projects.ts +0 -155
- package/.next/standalone/lib/cline-sessions.ts +0 -268
- package/.next/standalone/lib/grok-projects.ts +0 -123
- package/.next/standalone/lib/grok-sessions.ts +0 -355
- package/.next/standalone/lib/ori-projects.ts +0 -141
- package/.next/standalone/lib/ori-sessions.ts +0 -221
- package/.next/standalone/lib/qwen-projects.ts +0 -106
- package/.next/standalone/lib/qwen-sessions.ts +0 -313
- package/lib/cline-projects.ts +0 -155
- package/lib/cline-sessions.ts +0 -268
- package/lib/grok-projects.ts +0 -123
- package/lib/grok-sessions.ts +0 -355
- package/lib/ori-projects.ts +0 -141
- package/lib/ori-sessions.ts +0 -221
- package/lib/qwen-projects.ts +0 -106
- package/lib/qwen-sessions.ts +0 -313
- package/src/audit/cli-adapters/cline.ts +0 -50
- package/src/audit/cli-adapters/grok.ts +0 -70
- package/src/audit/cli-adapters/ori.ts +0 -55
- package/src/audit/cli-adapters/qwen.ts +0 -71
- package/src/hooks/batch-expand.ts +0 -380
- package/src/hooks/batch-fanout.ts +0 -142
- package/src/hooks/risk-patterns.ts +0 -26
- /package/.next/standalone/.next/static/{qJx3mbOQV-5ElrcRb4Sp7 → aKNv4Kmv98Xpwns0Xa-C-}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{qJx3mbOQV-5ElrcRb4Sp7 → aKNv4Kmv98Xpwns0Xa-C-}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{qJx3mbOQV-5ElrcRb4Sp7 → aKNv4Kmv98Xpwns0Xa-C-}/_ssgManifest.js +0 -0
|
@@ -26,7 +26,7 @@ ${b.comment}`:b.comment}this.doc.range[2]=b.offset;break}default:this.errors.pus
|
|
|
26
26
|
// Re-generate via: failproofai policies --install --cli opencode
|
|
27
27
|
// Plugin shim that bridges OpenCode's plugin API to the failproofai binary.
|
|
28
28
|
// See: https://opencode.ai/docs/plugins/
|
|
29
|
-
import {
|
|
29
|
+
import { spawn } from "node:child_process";
|
|
30
30
|
|
|
31
31
|
// Map opencode bus-event types → canonical failproofai event names.
|
|
32
32
|
// (The binary sees PascalCase — the binary's --cli=opencode flag is for
|
|
@@ -89,18 +89,52 @@ function canonicalizeToolInput(canonicalToolName, args) {
|
|
|
89
89
|
const FAILPROOFAI_BIN = ${h};
|
|
90
90
|
const USE_NPX = ${g};
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
/**
|
|
93
|
+
* Run failproofai for one event WITHOUT blocking opencode's event loop.
|
|
94
|
+
*
|
|
95
|
+
* This was spawnSync, and opencode loads the plugin in-process in the TUI —
|
|
96
|
+
* so every hook froze rendering and input for the subprocess's full duration,
|
|
97
|
+
* with a 60s ceiling. The verdicts are unchanged: every caller already awaits
|
|
98
|
+
* applyDecision, so the deny still lands before the tool runs. What changes
|
|
99
|
+
* is that the wait is now a promise rather than a blocked thread, and the TUI
|
|
100
|
+
* keeps painting while it happens.
|
|
101
|
+
*
|
|
102
|
+
* Fail-open on spawn error, and on the timeout — a policy that never ran must
|
|
103
|
+
* not read as a deny.
|
|
104
|
+
*/
|
|
105
|
+
async function runFailproofai(eventName, payload, directory) {
|
|
93
106
|
const cmd = USE_NPX ? "npx" : FAILPROOFAI_BIN;
|
|
94
107
|
const args = USE_NPX
|
|
95
108
|
? ["-y", "failproofai", "--hook", eventName, "--cli", "opencode"]
|
|
96
109
|
: ["--hook", eventName, "--cli", "opencode"];
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
110
|
+
return await new Promise((resolveRun) => {
|
|
111
|
+
let child;
|
|
112
|
+
try {
|
|
113
|
+
child = spawn(cmd, args, { cwd: directory });
|
|
114
|
+
} catch {
|
|
115
|
+
resolveRun({ exitCode: 0, stdout: "", stderr: "" });
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
let stdout = "";
|
|
119
|
+
let stderr = "";
|
|
120
|
+
let settled = false;
|
|
121
|
+
const finish = (exitCode) => {
|
|
122
|
+
if (settled) return;
|
|
123
|
+
settled = true;
|
|
124
|
+
clearTimeout(timer);
|
|
125
|
+
resolveRun({ exitCode, stdout, stderr });
|
|
126
|
+
};
|
|
127
|
+
const timer = setTimeout(() => {
|
|
128
|
+
try { child.kill("SIGKILL"); } catch { /* already gone */ }
|
|
129
|
+
finish(0);
|
|
130
|
+
}, 60_000);
|
|
131
|
+
child.stdout.on("data", (d) => { stdout += d; });
|
|
132
|
+
child.stderr.on("data", (d) => { stderr += d; });
|
|
133
|
+
child.on("error", () => finish(0));
|
|
134
|
+
child.on("close", (code) => finish(code ?? 0));
|
|
135
|
+
child.stdin.on("error", () => {});
|
|
136
|
+
child.stdin.end(JSON.stringify(payload));
|
|
102
137
|
});
|
|
103
|
-
return { exitCode: r.status ?? 0, stdout: r.stdout ?? "", stderr: r.stderr ?? "" };
|
|
104
138
|
}
|
|
105
139
|
|
|
106
140
|
async function applyDecision(result, ctx, eventName) {
|
|
@@ -165,7 +199,7 @@ export default async function failproofaiPlugin({ client, directory }) {
|
|
|
165
199
|
}
|
|
166
200
|
}
|
|
167
201
|
if (!prompt) prompt = (info.text || info.content || props.text || "").toString();
|
|
168
|
-
const r = runFailproofai("UserPromptSubmit", {
|
|
202
|
+
const r = await runFailproofai("UserPromptSubmit", {
|
|
169
203
|
session_id: sessionID, cwd: directory, hook_event_name: "UserPromptSubmit", prompt,
|
|
170
204
|
}, directory);
|
|
171
205
|
await applyDecision(r, { client, sessionID }, "UserPromptSubmit");
|
|
@@ -176,7 +210,7 @@ export default async function failproofaiPlugin({ client, directory }) {
|
|
|
176
210
|
if (!claudeEvent) return;
|
|
177
211
|
const props = event.properties || {};
|
|
178
212
|
const sessionID = props.sessionID || (props.session && props.session.id) || props.id;
|
|
179
|
-
const r = runFailproofai(claudeEvent, {
|
|
213
|
+
const r = await runFailproofai(claudeEvent, {
|
|
180
214
|
session_id: sessionID, cwd: directory, hook_event_name: claudeEvent,
|
|
181
215
|
}, directory);
|
|
182
216
|
await applyDecision(r, { client, sessionID }, claudeEvent);
|
|
@@ -185,7 +219,7 @@ export default async function failproofaiPlugin({ client, directory }) {
|
|
|
185
219
|
// First-class PreToolUse hook. Note: tool args live on output.args (mutable).
|
|
186
220
|
"tool.execute.before": async (input, output) => {
|
|
187
221
|
const canonicalTool = canonicalizeTool(input.tool);
|
|
188
|
-
const r = runFailproofai("PreToolUse", {
|
|
222
|
+
const r = await runFailproofai("PreToolUse", {
|
|
189
223
|
session_id: input.sessionID,
|
|
190
224
|
cwd: directory,
|
|
191
225
|
tool_name: canonicalTool,
|
|
@@ -198,7 +232,7 @@ export default async function failproofaiPlugin({ client, directory }) {
|
|
|
198
232
|
// First-class PostToolUse hook. Note: tool args live on input.args here.
|
|
199
233
|
"tool.execute.after": async (input, output) => {
|
|
200
234
|
const canonicalTool = canonicalizeTool(input.tool);
|
|
201
|
-
const r = runFailproofai("PostToolUse", {
|
|
235
|
+
const r = await runFailproofai("PostToolUse", {
|
|
202
236
|
session_id: input.sessionID,
|
|
203
237
|
cwd: directory,
|
|
204
238
|
tool_name: canonicalTool,
|
|
@@ -212,7 +246,7 @@ export default async function failproofaiPlugin({ client, directory }) {
|
|
|
212
246
|
// Cleaner deny UX for prompted tools — mutate output.status instead of throwing.
|
|
213
247
|
"permission.ask": async (input, output) => {
|
|
214
248
|
const canonicalTool = canonicalizeTool(input.tool);
|
|
215
|
-
const r = runFailproofai("PermissionRequest", {
|
|
249
|
+
const r = await runFailproofai("PermissionRequest", {
|
|
216
250
|
session_id: input.sessionID,
|
|
217
251
|
cwd: directory,
|
|
218
252
|
tool_name: canonicalTool || input.command || "permission",
|
|
@@ -227,160 +261,6 @@ export default async function failproofaiPlugin({ client, directory }) {
|
|
|
227
261
|
},
|
|
228
262
|
};
|
|
229
263
|
}
|
|
230
|
-
`),"utf8"),Array.isArray(a.plugin)||(a.plugin=[]);let l="user"===j?`file://${k}`:x,m=a.plugin.findIndex(a=>this.isFailproofaiHook(a));m>=0?a.plugin[m]=l:a.plugin.push(l)},removeHooksFromFile(a){let b=0,d=this.readSettings(a);if(Array.isArray(d.plugin)){let a=d.plugin.length;d.plugin=d.plugin.filter(a=>!this.isFailproofaiHook(a)),b+=a-d.plugin.length,0===d.plugin.length&&delete d.plugin}this.writeSettings(a,d);let e=y(a);if((0,c.existsSync)(e))try{(0,c.readFileSync)(e,"utf8").includes(i.FAILPROOFAI_HOOK_MARKER)&&((0,c.unlinkSync)(e),0===b&&(b=1))}catch{}return b},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d);if(!Array.isArray(a.plugin)||!a.plugin.some(a=>this.isFailproofaiHook(a)))return!1;let b=y(d);if(!(0,c.existsSync)(b))return!1;return(0,c.readFileSync)(b,"utf8").includes(i.FAILPROOFAI_HOOK_MARKER)}catch{return!1}},detectInstalled:()=>q("opencode")};function A(){let a=process.env.FAILPROOFAI_PACKAGE_ROOT;return a?(0,d.resolve)(a,"pi-extension"):(0,d.resolve)((0,e.fileURLToPath)(j.url),"..","..","..","pi-extension")}function B(a){return"string"==typeof a&&(!!/(?:^|\/)pi-extension\/?$/.test(a)||a.includes("pi-extension")&&a.includes("failproofai"))}let C={id:"pi",displayName:"Pi",scopes:i.PI_HOOK_SCOPES,eventTypes:i.PI_HOOK_EVENT_TYPES,getSettingsPath(a,b){let c=b?(0,d.resolve)(b):process.cwd();switch(a){case"user":return(0,d.resolve)((0,f.homedir)(),".pi","agent","settings.json");case"project":case"local":return(0,d.resolve)(c,".pi","settings.json")}},readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b,c)=>({[i.FAILPROOFAI_HOOK_MARKER]:!0,_piPackagePath:A(),_piScope:c}),isFailproofaiHook:a=>"string"==typeof a?B(a):!!a&&"object"==typeof a&&(!0===a[i.FAILPROOFAI_HOOK_MARKER]||"string"==typeof a.source&&B(a.source)),writeHookEntries(a,b,c){var e;let f,g,h;Array.isArray(a.packages)||(a.packages=[]);let i=A(),j="project"===c?(e=i,f=process.cwd(),g=(0,d.resolve)(f),(h=(0,d.resolve)(e)).startsWith(g+"/")||h===g?"../"+h.slice(g.length+1):h):i,k=a.packages.findIndex(a=>B(a));k>=0?a.packages[k]=j:a.packages.push(j)},removeHooksFromFile(a){if(!(0,c.existsSync)(a))return 0;let b=this.readSettings(a);if(!Array.isArray(b.packages))return 0;let d=b.packages.length;b.packages=b.packages.filter(a=>!B(a));let e=d-b.packages.length;return 0===b.packages.length&&delete b.packages,this.writeSettings(a,b),e},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d);if(!Array.isArray(a.packages))return!1;return a.packages.some(a=>B(a))}catch{return!1}},detectInstalled:()=>q("pi")},D={id:"hermes",displayName:"Hermes",scopes:i.HERMES_HOOK_SCOPES,eventTypes:i.HERMES_HOOK_EVENT_TYPES,getSettingsPath:()=>(0,d.resolve)((0,h.hermesRoot)(),"config.yaml"),getSettingsPaths:()=>(0,h.listHermesProfiles)().map(a=>(0,d.resolve)(a.home,"config.yaml")),readSettings:a=>m(a),writeSettings(a,b){n(a,b)},buildHookEntry:(a,b,c)=>({command:"project"===c?`npx -y failproofai --hook ${b} --cli hermes`:`"${a}" --hook ${b} --cli hermes`,timeout:30,[i.FAILPROOFAI_HOOK_MARKER]:!0}),isFailproofaiHook:o,writeHookEntries(a,b,c){let d=a.toJS()??{},e=d.hooks&&"object"==typeof d.hooks?d.hooks:{};for(let a of i.HERMES_HOOK_EVENT_TYPES){let d=this.buildHookEntry(b,a,c),f=Array.isArray(e[a])?e[a]:[],g=f.findIndex(a=>o(a));g>=0?f[g]=d:f.push(d),e[a]=f}a.set("hooks",e),a.set("hooks_auto_accept",!0)},removeHooksFromFile(a){if(!(0,c.existsSync)(a))return 0;let b=m(a),d=(b.toJS()??{}).hooks,e=0;if(d&&"object"==typeof d){for(let a of Object.keys(d)){let b=d[a];if(!Array.isArray(b))continue;let c=b.length,f=b.filter(a=>!o(a));e+=c-f.length,0===f.length?delete d[a]:d[a]=f}e>0&&(0===Object.keys(d).length?b.delete("hooks"):b.set("hooks",d))}let f=b.delete("hooks_auto_accept");return(e>0||f)&&n(a,b),e},hooksInstalledInSettings(a,b){let d=r(this,a,b);return d.length>0&&d.every(a=>(function(a){if(!(0,c.existsSync)(a))return!1;try{let b=(m(a).toJS()??{}).hooks;if(!b||"object"!=typeof b)return!1;for(let a of Object.values(b))if(Array.isArray(a)&&a.some(a=>o(a)))return!0}catch{}return!1})(a))},detectInstalled:()=>q("hermes")},E="failproofai";function F(){let a=process.env.FAILPROOFAI_PACKAGE_ROOT;return a?(0,d.resolve)(a,"openclaw-plugin"):(0,d.resolve)((0,e.fileURLToPath)(j.url),"..","..","..","openclaw-plugin")}function G(a){return"string"==typeof a&&(/(?:^|\/)openclaw-plugin\/?$/.test(a)||a.includes("openclaw-plugin")&&a.includes("failproofai"))}let H={id:"openclaw",displayName:"OpenClaw",scopes:i.OPENCLAW_HOOK_SCOPES,eventTypes:i.OPENCLAW_HOOK_EVENT_TYPES,getSettingsPath:()=>(0,d.resolve)((0,f.homedir)(),".openclaw","openclaw.json"),readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:()=>({[i.FAILPROOFAI_HOOK_MARKER]:!0,_openclawPluginPath:F()}),isFailproofaiHook:a=>"string"==typeof a?G(a):!!a&&"object"==typeof a&&(!0===a[i.FAILPROOFAI_HOOK_MARKER]||"string"==typeof a.source&&G(a.source)),writeHookEntries(a){let b=a.plugins??={},c=b.load??={};Array.isArray(c.paths)||(c.paths=[]);let d=F(),e=c.paths.findIndex(a=>G(a));e>=0?c.paths[e]=d:c.paths.push(d);let f=b.entries??={},g=f[E]??={};g.enabled=!0,(g.hooks??={}).allowConversationAccess=!0},removeHooksFromFile(a){if(!(0,c.existsSync)(a))return 0;let b=this.readSettings(a),d=b.plugins;if(!d)return 0;let e=0;if(Array.isArray(d.load?.paths)){let a=d.load.paths.length;d.load.paths=d.load.paths.filter(a=>!G(a)),e+=a-d.load.paths.length,0===d.load.paths.length&&delete d.load.paths,d.load&&0===Object.keys(d.load).length&&delete d.load}return d.entries&&E in d.entries&&(delete d.entries[E],e+=1,0===Object.keys(d.entries).length&&delete d.entries),0===Object.keys(d).length&&delete b.plugins,this.writeSettings(a,b),e},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d),b=a.plugins?.load?.paths,c=Array.isArray(b)&&b.some(a=>G(a)),e=a.plugins?.entries?.[E]?.enabled===!0;return c&&e}catch{return!1}},detectInstalled:()=>q("openclaw")},I={id:"factory",displayName:"Factory Droid",scopes:i.FACTORY_HOOK_SCOPES,eventTypes:i.FACTORY_HOOK_EVENT_TYPES,getSettingsPath(a,b){let c=b?(0,d.resolve)(b):process.cwd();switch(a){case"user":return(0,d.resolve)((0,f.homedir)(),".factory","hooks.json");case"project":case"local":return(0,d.resolve)(c,".factory","hooks.json")}},readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b} --cli factory`:`"${a}" --hook ${b} --cli factory`,timeout:30,[i.FAILPROOFAI_HOOK_MARKER]:!0}),isFailproofaiHook:o,writeHookEntries(a,b,c){for(let d of i.FACTORY_HOOK_EVENT_TYPES){let e=this.buildHookEntry(b,d,c);Array.isArray(a[d])||(a[d]=[]);let f=a[d],g=!1;for(let a of f){if(!a.hooks)continue;let b=a.hooks.findIndex(a=>o(a));if(b>=0){a.hooks[b]=e,g=!0;break}}if(!g){let a="PreToolUse"===d||"PostToolUse"===d;f.push(a?{matcher:"*",hooks:[e]}:{hooks:[e]})}}},removeHooksFromFile(a){let b=this.readSettings(a),c=0;for(let a of Object.keys(b)){let d=b[a];if(Array.isArray(d)){for(let a=d.length-1;a>=0;a--){let b=d[a];if(!b||!b.hooks)continue;let e=b.hooks.length;b.hooks=b.hooks.filter(a=>!o(a)),c+=e-b.hooks.length,0===b.hooks.length&&d.splice(a,1)}0===d.length&&delete b[a]}}return this.writeSettings(a,b),c},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d);for(let b of Object.values(a))if(Array.isArray(b)){for(let a of b)if(a&&a.hooks&&a.hooks.some(a=>o(a)))return!0}}catch{}return!1},detectInstalled:()=>q("droid")},J={id:"devin",displayName:"Devin CLI",scopes:i.DEVIN_HOOK_SCOPES,eventTypes:i.DEVIN_HOOK_EVENT_TYPES,getSettingsPath(a,b){let c=b?(0,d.resolve)(b):process.cwd();switch(a){case"user":return(0,d.resolve)((0,f.homedir)(),".config","devin","config.json");case"project":case"local":return(0,d.resolve)(c,".devin","config.json")}},readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b} --cli devin`:`"${a}" --hook ${b} --cli devin`,timeout:60,[i.FAILPROOFAI_HOOK_MARKER]:!0}),isFailproofaiHook:o,writeHookEntries(a,b,c){for(let d of(a.hooks||(a.hooks={}),i.DEVIN_HOOK_EVENT_TYPES)){let e=this.buildHookEntry(b,d,c);a.hooks[d]||(a.hooks[d]=[]);let f=a.hooks[d],g=!1;for(let a of f){if(!a.hooks)continue;let b=a.hooks.findIndex(a=>o(a));if(b>=0){a.hooks[b]=e,g=!0;break}}g||f.push({hooks:[e]})}},removeHooksFromFile(a){let b=this.readSettings(a);if(!b.hooks)return 0;let c=0;for(let a of Object.keys(b.hooks)){let d=b.hooks[a];if(Array.isArray(d)){for(let a=d.length-1;a>=0;a--){let b=d[a];if(!b.hooks)continue;let e=b.hooks.length;b.hooks=b.hooks.filter(a=>!o(a)),c+=e-b.hooks.length,0===b.hooks.length&&d.splice(a,1)}0===d.length&&delete b.hooks[a]}}return 0===Object.keys(b.hooks).length&&delete b.hooks,this.writeSettings(a,b),c},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d);if(!a.hooks)return!1;for(let b of Object.values(a.hooks))if(Array.isArray(b)){for(let a of b)if(a.hooks&&a.hooks.some(a=>o(a)))return!0}}catch{}return!1},detectInstalled:()=>q("devin")},K="failproofai",L=new Set(["PreToolUse","PostToolUse"]),M={id:"antigravity",displayName:"Antigravity CLI",scopes:i.ANTIGRAVITY_HOOK_SCOPES,eventTypes:i.ANTIGRAVITY_HOOK_EVENT_TYPES,getSettingsPath(a,b){let c=b?(0,d.resolve)(b):process.cwd();switch(a){case"user":return(0,d.resolve)((0,f.homedir)(),".gemini","config","hooks.json");case"project":case"local":return(0,d.resolve)(c,".agents","hooks.json")}},readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b} --cli antigravity`:`"${a}" --hook ${b} --cli antigravity`,timeout:30,[i.FAILPROOFAI_HOOK_MARKER]:!0}),isFailproofaiHook:o,writeHookEntries(a,b,c){a[K]&&"object"==typeof a[K]||(a[K]={});let d=a[K];for(let a of i.ANTIGRAVITY_HOOK_EVENT_TYPES){let e=this.buildHookEntry(b,a,c);if(L.has(a)){Array.isArray(d[a])||(d[a]=[]);let b=d[a],c=!1;for(let a of b){if(!a.hooks)continue;let b=a.hooks.findIndex(a=>o(a));if(b>=0){a.hooks[b]=e,c=!0;break}}c||b.push({matcher:"*",hooks:[e]})}else{Array.isArray(d[a])||(d[a]=[]);let b=d[a],c=b.findIndex(a=>o(a));c>=0?b[c]=e:b.push(e)}}},removeHooksFromFile(a){let b=this.readSettings(a),c=b[K];if(!c||"object"!=typeof c)return this.writeSettings(a,b),0;let d=0;for(let a of Object.keys(c)){let b=c[a];if(Array.isArray(b))if(L.has(a)){for(let a=b.length-1;a>=0;a--){let c=b[a];if(!c||!c.hooks)continue;let e=c.hooks.length;c.hooks=c.hooks.filter(a=>!o(a)),d+=e-c.hooks.length,0===c.hooks.length&&b.splice(a,1)}0===b.length&&delete c[a]}else{let e=b.length,f=b.filter(a=>!o(a));d+=e-f.length,0===f.length?delete c[a]:c[a]=f}}return 0===Object.keys(c).length&&delete b[K],this.writeSettings(a,b),d},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d)[K];if(!a||"object"!=typeof a)return!1;for(let b of Object.values(a))if(Array.isArray(b)){for(let a of b)if(o(a)||a&&Array.isArray(a.hooks)&&a.hooks.some(a=>o(a)))return!0}}catch{}return!1},detectInstalled:()=>q("agy")};function N(a){if(!a||"object"!=typeof a)return!1;let b=a.command;return"string"==typeof b&&b.includes("failproofai")&&b.includes("--cli goose")}let O={id:"goose",displayName:"Goose",scopes:i.GOOSE_HOOK_SCOPES,eventTypes:i.GOOSE_HOOK_EVENT_TYPES,getSettingsPath(a,b){let c=b?(0,d.resolve)(b):process.cwd();switch(a){case"user":return(0,d.resolve)((0,f.homedir)(),".agents","plugins","failproofai","hooks","hooks.json");case"project":case"local":return(0,d.resolve)(c,".agents","plugins","failproofai","hooks","hooks.json")}},readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b} --cli goose`:`"${a}" --hook ${b} --cli goose`}),isFailproofaiHook:N,writeHookEntries(a,b,c){for(let d of(a.hooks||(a.hooks={}),i.GOOSE_HOOK_EVENT_TYPES)){let e=this.buildHookEntry(b,d,c);Array.isArray(a.hooks[d])||(a.hooks[d]=[]);let f=a.hooks[d],g=!1;for(let a of f){if(!a.hooks)continue;let b=a.hooks.findIndex(a=>N(a));if(b>=0){a.hooks[b]=e,g=!0;break}}g||f.push({hooks:[e]})}},removeHooksFromFile(a){let b=this.readSettings(a);if(!b.hooks)return 0;let c=0;for(let a of Object.keys(b.hooks)){let d=b.hooks[a];if(Array.isArray(d)){for(let a=d.length-1;a>=0;a--){let b=d[a];if(!b||!b.hooks)continue;let e=b.hooks.length;b.hooks=b.hooks.filter(a=>!N(a)),c+=e-b.hooks.length,0===b.hooks.length&&d.splice(a,1)}0===d.length&&delete b.hooks[a]}}return 0===Object.keys(b.hooks).length&&delete b.hooks,this.writeSettings(a,b),c},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d);if(!a.hooks)return!1;for(let b of Object.values(a.hooks))if(Array.isArray(b)){for(let a of b)if(a&&a.hooks&&a.hooks.some(a=>N(a)))return!0}}catch{}return!1},detectInstalled:()=>q("goose")};function P(){return(0,d.resolve)(process.env.ORI_HOME||(0,d.resolve)((0,f.homedir)(),".ori"),"global","features","failproofai")}let Q=`${JSON.stringify({name:"failproofai",private:!0,type:"module"},null,2)}
|
|
231
|
-
`,R={id:"ori",displayName:"Ori",scopes:i.ORI_HOOK_SCOPES,eventTypes:i.ORI_HOOK_EVENT_TYPES,getSettingsPath:()=>(0,d.resolve)(P(),"failproofai.json"),readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b)=>({type:"command",command:`"${a}" --hook ${b} --cli ori`,[i.FAILPROOFAI_HOOK_MARKER]:!0}),isFailproofaiHook:a=>!!a&&"object"==typeof a&&!0===a[i.FAILPROOFAI_HOOK_MARKER],writeHookEntries(a,b){let e=P();(0,c.mkdirSync)(e,{recursive:!0}),(0,c.writeFileSync)((0,d.resolve)(e,"feature.ts"),`// AUTO-GENERATED by failproofai. ${i.FAILPROOFAI_HOOK_MARKER}
|
|
232
|
-
// Re-generate via: failproofai policies --install --cli ori
|
|
233
|
-
//
|
|
234
|
-
// Bridges ori's approval extension points to the failproofai binary. Ships NO
|
|
235
|
-
// inline tool maps: it forwards ori's raw tool name and arguments, and the
|
|
236
|
-
// binary canonicalizes them via ORI_TOOL_MAP / ORI_TOOL_INPUT_MAP (one source
|
|
237
|
-
// of truth), exactly as the OpenClaw plugin does.
|
|
238
|
-
import { spawn } from "node:child_process";
|
|
239
|
-
|
|
240
|
-
import { ApprovalAskers, ApprovalPolicies, UnattendedApprovals } from "ori";
|
|
241
|
-
|
|
242
|
-
const BIN = ${JSON.stringify(b)};
|
|
243
|
-
const FAIL_OPEN = process.env.FAILPROOFAI_ORI_FAIL_OPEN === "1";
|
|
244
|
-
|
|
245
|
-
/** ori hands arguments as a flat {name, value} string array. Rebuild the object
|
|
246
|
-
* the binary's tool-input canonicalization expects. The synthetic
|
|
247
|
-
* \`escalated\` entry ori appends on the second pass of its escalation ladder
|
|
248
|
-
* is metadata, not a tool argument, so it is dropped from the tool input. */
|
|
249
|
-
function toToolInput(request) {
|
|
250
|
-
const out = {};
|
|
251
|
-
for (const a of request.arguments ?? []) {
|
|
252
|
-
if (request.escalated && a.name === "escalated" && a.value === "true") continue;
|
|
253
|
-
out[a.name] = a.value;
|
|
254
|
-
}
|
|
255
|
-
return out;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
function callPolicy(request) {
|
|
259
|
-
return new Promise((done, fail) => {
|
|
260
|
-
let child;
|
|
261
|
-
try {
|
|
262
|
-
child = spawn("node", [BIN, "--hook", "PreToolUse", "--cli", "ori"], {
|
|
263
|
-
stdio: ["pipe", "pipe", "inherit"],
|
|
264
|
-
});
|
|
265
|
-
} catch (err) {
|
|
266
|
-
FAIL_OPEN ? done({ permission: "allow" }) : fail(err);
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
let out = "";
|
|
270
|
-
let settled = false;
|
|
271
|
-
const finish = (fn, arg) => {
|
|
272
|
-
if (settled) return;
|
|
273
|
-
settled = true;
|
|
274
|
-
clearTimeout(timer);
|
|
275
|
-
fn(arg);
|
|
276
|
-
};
|
|
277
|
-
const timer = setTimeout(() => {
|
|
278
|
-
try { child.kill(); } catch { /* already gone */ }
|
|
279
|
-
FAIL_OPEN
|
|
280
|
-
? finish(done, { permission: "allow" })
|
|
281
|
-
: finish(fail, new Error("failproofai timed out"));
|
|
282
|
-
}, 30_000);
|
|
283
|
-
child.stdout.on("data", (d) => { out += d; });
|
|
284
|
-
child.on("error", (err) => {
|
|
285
|
-
FAIL_OPEN ? finish(done, { permission: "allow" }) : finish(fail, err);
|
|
286
|
-
});
|
|
287
|
-
child.on("close", (code, signal) => {
|
|
288
|
-
// A non-zero exit or a signal means failproofai produced NO verdict — a
|
|
289
|
-
// missing bundle, a crashed evaluator, an OOM kill. Resolving that to
|
|
290
|
-
// "allow" is exactly the silent non-enforcement ori's
|
|
291
|
-
// failureBehavior deny exists to prevent, and it could never fire,
|
|
292
|
-
// because resolving is what tells ori the provider succeeded. Only a
|
|
293
|
-
// REJECT reaches that guarantee.
|
|
294
|
-
if (signal || (typeof code === "number" && code !== 0)) {
|
|
295
|
-
const err = new Error(
|
|
296
|
-
"failproofai produced no verdict (" +
|
|
297
|
-
(signal ? "killed by " + signal : "exit code " + code) +
|
|
298
|
-
")",
|
|
299
|
-
);
|
|
300
|
-
FAIL_OPEN ? finish(done, { permission: "allow" }) : finish(fail, err);
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
const stdout = out.trim();
|
|
304
|
-
// Exit 0 with empty stdout IS the evaluator's clean-allow shape — the one
|
|
305
|
-
// case where no output is a real verdict rather than a failure.
|
|
306
|
-
if (!stdout) { finish(done, { permission: "allow" }); return; }
|
|
307
|
-
let verdict;
|
|
308
|
-
try {
|
|
309
|
-
verdict = JSON.parse(stdout);
|
|
310
|
-
} catch (err) {
|
|
311
|
-
FAIL_OPEN ? finish(done, { permission: "allow" }) : finish(fail, err);
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
// Anything that is not an explicit allow/deny is an unrecognised answer,
|
|
315
|
-
// not an allow. decide() maps every non-"deny" to allow, so an
|
|
316
|
-
// unvalidated object would silently become one.
|
|
317
|
-
if (!verdict || (verdict.permission !== "allow" && verdict.permission !== "deny")) {
|
|
318
|
-
const err = new Error("failproofai returned an unrecognised verdict: " + stdout.slice(0, 200));
|
|
319
|
-
FAIL_OPEN ? finish(done, { permission: "allow" }) : finish(fail, err);
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
finish(done, verdict);
|
|
323
|
-
});
|
|
324
|
-
try {
|
|
325
|
-
child.stdin.end(JSON.stringify({
|
|
326
|
-
hook_event_name: "PreToolUse",
|
|
327
|
-
tool_name: request.tool,
|
|
328
|
-
tool_input: toToolInput(request),
|
|
329
|
-
cwd: process.cwd(),
|
|
330
|
-
ori: {
|
|
331
|
-
capabilities: request.capabilities ?? [],
|
|
332
|
-
escalated: request.escalated === true,
|
|
333
|
-
},
|
|
334
|
-
}));
|
|
335
|
-
} catch (err) {
|
|
336
|
-
FAIL_OPEN ? finish(done, { permission: "allow" }) : finish(fail, err);
|
|
337
|
-
}
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
async function decide(request) {
|
|
342
|
-
const verdict = await callPolicy(request);
|
|
343
|
-
return { outcome: verdict.permission === "deny" ? "deny" : "allow" };
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
export const provisions = [
|
|
347
|
-
// Claimed so no other feature can take it; inert on purpose — see above.
|
|
348
|
-
ApprovalPolicies.provide({ defaultAction: "ask", rules: [] }),
|
|
349
|
-
// The gate that fires when a human is present (\`ori --approvals manual\`).
|
|
350
|
-
ApprovalAskers.provide(decide),
|
|
351
|
-
// The gate that fires on unattended runs.
|
|
352
|
-
UnattendedApprovals.provide(decide),
|
|
353
|
-
];
|
|
354
|
-
`,"utf8"),(0,c.writeFileSync)((0,d.resolve)(e,"package.json"),Q,"utf8"),a.hooks=i.ORI_HOOK_EVENT_TYPES.map(a=>this.buildHookEntry(b,a,"user"))},removeHooksFromFile(a){let b=(0,d.dirname)(a),e=(0,d.resolve)(b,"feature.ts"),f=0,g=this.readSettings(a);return(Array.isArray(g.hooks)&&(f=g.hooks.filter(a=>this.isFailproofaiHook(a)).length),(0,c.existsSync)(e)&&(0,c.readFileSync)(e,"utf8").includes(i.FAILPROOFAI_HOOK_MARKER))?((0,c.rmSync)(b,{recursive:!0,force:!0}),f||1):(delete g.hooks,this.writeSettings(a,g),f)},hooksInstalledInSettings(){let a=(0,d.resolve)(P(),"feature.ts");if(!(0,c.existsSync)(a))return!1;try{return(0,c.readFileSync)(a,"utf8").includes(i.FAILPROOFAI_HOOK_MARKER)}catch{return!1}},detectInstalled:()=>q("ori")};function S(a,b){let c=b?(0,d.resolve)(b):process.cwd();return"user"===a?(0,d.resolve)(process.env.CLINE_HOME||process.env.CLINE_DIR||(0,d.resolve)((0,f.homedir)(),".cline"),"hooks"):(0,d.resolve)(c,".clinerules","hooks")}let T={id:"cline",displayName:"Cline",scopes:i.CLINE_HOOK_SCOPES,eventTypes:i.CLINE_HOOK_EVENT_TYPES,getSettingsPath:(a,b)=>(0,d.resolve)(S("local"===a?"project":a,b),"failproofai.json"),readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b,c)=>({type:"command",file:`${b}.sh`,command:`${"project"===("local"===c?"project":c??"user")?"npx -y failproofai":`"${a}"`} --hook ${b} --cli cline`,[i.FAILPROOFAI_HOOK_MARKER]:!0}),isFailproofaiHook:a=>!!a&&"object"==typeof a&&!0===a[i.FAILPROOFAI_HOOK_MARKER],writeHookEntries(a,b,e){let f="local"===e?"project":e??"user",g=S(f);for(let a of((0,c.mkdirSync)(g,{recursive:!0}),i.CLINE_HOOK_EVENT_TYPES)){let e=(0,d.resolve)(g,`${a}.sh`);if((0,c.existsSync)(e)){let a="";try{a=(0,c.readFileSync)(e,"utf8")}catch{continue}if(!a.includes(i.FAILPROOFAI_HOOK_MARKER))continue}(0,c.writeFileSync)(e,function(a,b,c){let d="project"===c?"npx -y failproofai":`"${a}"`;return`#!/usr/bin/env bash
|
|
355
|
-
# AUTO-GENERATED by failproofai. ${i.FAILPROOFAI_HOOK_MARKER}
|
|
356
|
-
# Re-generate via: failproofai policies --install --cli cline
|
|
357
|
-
#
|
|
358
|
-
# THE FILENAME IS THE EVENT. cline binds this file to its ${b} event by
|
|
359
|
-
# basename (case-insensitively) and by nothing else: renaming it silently
|
|
360
|
-
# unsubscribes it, and an extension outside cline's allowlist is skipped without
|
|
361
|
-
# a log line. Verified against cline v3.0.60.
|
|
362
|
-
#
|
|
363
|
-
# cline IGNORES THE EXIT CODE. The verdict is the single JSON object on stdout,
|
|
364
|
-
# so this script must ALWAYS print exactly one object, and must print '{}' when
|
|
365
|
-
# failproofai produced nothing: unparseable stdout makes cline skip the hook and
|
|
366
|
-
# run the tool anyway (fail-open, 120s default timeout).
|
|
367
|
-
#
|
|
368
|
-
# Blocking shape, the only one cline reads: {"cancel":true,"errorMessage":"..."}.
|
|
369
|
-
# There is no decision/block/permissionDecision field in cline's schema.
|
|
370
|
-
set -u
|
|
371
|
-
|
|
372
|
-
payload="$(cat)"
|
|
373
|
-
|
|
374
|
-
# stderr is deliberately NOT redirected: failproofai's diagnostics belong in
|
|
375
|
-
# cline's own hook log, and stdout stays clean because the evaluator writes
|
|
376
|
-
# every operator note to stderr.
|
|
377
|
-
verdict="$(printf '%s' "$payload" | ${d} --hook ${b} --cli cline)"
|
|
378
|
-
|
|
379
|
-
if [ -z "$verdict" ]; then
|
|
380
|
-
verdict='{}'
|
|
381
|
-
fi
|
|
382
|
-
printf '%s\\n' "$verdict"
|
|
383
|
-
exit 0
|
|
384
|
-
`}(b,a,f),"utf8");try{(0,c.chmodSync)(e,493)}catch{}}a.hooks=i.CLINE_HOOK_EVENT_TYPES.map(a=>this.buildHookEntry(b,a,f))},removeHooksFromFile(a){let b=(0,d.dirname)(a),e=0;for(let a of i.CLINE_HOOK_EVENT_TYPES){let f=(0,d.resolve)(b,`${a}.sh`);if(!(0,c.existsSync)(f))continue;let g="";try{g=(0,c.readFileSync)(f,"utf8")}catch{continue}if(g.includes(i.FAILPROOFAI_HOOK_MARKER))try{(0,c.unlinkSync)(f),e++}catch{}}let f=this.readSettings(a);return delete f.hooks,this.writeSettings(a,f),e},hooksInstalledInSettings(a,b){let e=(0,d.resolve)(S("local"===a?"project":a,b),"PreToolUse.sh");if(!(0,c.existsSync)(e))return!1;try{return(0,c.readFileSync)(e,"utf8").includes(i.FAILPROOFAI_HOOK_MARKER)}catch{return!1}},detectInstalled:()=>q("cline")},U={claude:s,codex:t,copilot:v,cursor:w,opencode:z,pi:C,hermes:D,openclaw:H,factory:I,devin:J,antigravity:M,goose:O,grok:{id:"grok",displayName:"grok CLI",scopes:i.GROK_HOOK_SCOPES,eventTypes:i.GROK_HOOK_EVENT_TYPES,getSettingsPath(a,b){let c=b?(0,d.resolve)(b):process.cwd();switch(a){case"user":return(0,d.resolve)((0,f.homedir)(),".grok","hooks","failproofai.json");case"project":case"local":return(0,d.resolve)(c,".grok","hooks","failproofai.json")}},readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b} --cli grok`:`"${a}" --hook ${b} --cli grok`,timeout:30,[i.FAILPROOFAI_HOOK_MARKER]:!0}),isFailproofaiHook:o,writeHookEntries(a,b,c){for(let d of(a.hooks||(a.hooks={}),i.GROK_HOOK_EVENT_TYPES)){let e=this.buildHookEntry(b,d,c);a.hooks[d]||(a.hooks[d]=[]);let f=a.hooks[d],g=!1;for(let a of f){if(!a.hooks)continue;let b=a.hooks.findIndex(a=>o(a));if(b>=0){a.hooks[b]=e,g=!0;break}}g||f.push({hooks:[e]})}},removeHooksFromFile(a){let b=this.readSettings(a);if(!b.hooks)return 0;let c=0;for(let a of Object.keys(b.hooks)){let d=b.hooks[a];if(Array.isArray(d)){for(let a=d.length-1;a>=0;a--){let b=d[a];if(!b.hooks)continue;let e=b.hooks.length;b.hooks=b.hooks.filter(a=>!o(a)),c+=e-b.hooks.length,0===b.hooks.length&&d.splice(a,1)}0===d.length&&delete b.hooks[a]}}return 0===Object.keys(b.hooks).length&&delete b.hooks,this.writeSettings(a,b),c},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d);if(!a.hooks)return!1;for(let b of Object.values(a.hooks))if(Array.isArray(b)){for(let a of b)if(a.hooks&&a.hooks.some(a=>o(a)))return!0}}catch{}return!1},detectInstalled:()=>q("grok")},qwen:{id:"qwen",displayName:"Qwen Code",scopes:i.QWEN_HOOK_SCOPES,eventTypes:i.QWEN_HOOK_EVENT_TYPES,getSettingsPath(a,b){let c=b?(0,d.resolve)(b):process.cwd();switch(a){case"user":return(0,d.resolve)((0,f.homedir)(),".qwen","settings.json");case"project":case"local":return(0,d.resolve)(c,".qwen","settings.json")}},readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b} --cli qwen`:`"${a}" --hook ${b} --cli qwen`,name:`failproofai-${b}`,timeout:3e4,[i.FAILPROOFAI_HOOK_MARKER]:!0}),isFailproofaiHook:o,writeHookEntries(a,b,c){for(let d of(a.hooks||(a.hooks={}),i.QWEN_HOOK_EVENT_TYPES)){let e=this.buildHookEntry(b,d,c);a.hooks[d]||(a.hooks[d]=[]);let f=a.hooks[d],g=!1;for(let a of f){if(!a.hooks)continue;let b=a.hooks.findIndex(a=>o(a));if(b>=0){a.hooks[b]=e,g=!0;break}}g||f.push({hooks:[e]})}},removeHooksFromFile(a){let b=this.readSettings(a);if(!b.hooks)return 0;let c=0;for(let a of Object.keys(b.hooks)){let d=b.hooks[a];if(Array.isArray(d)){for(let a=d.length-1;a>=0;a--){let b=d[a];if(!b.hooks)continue;let e=b.hooks.length;b.hooks=b.hooks.filter(a=>!o(a)),c+=e-b.hooks.length,0===b.hooks.length&&d.splice(a,1)}0===d.length&&delete b.hooks[a]}}return 0===Object.keys(b.hooks).length&&delete b.hooks,this.writeSettings(a,b),c},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d);if(!a.hooks)return!1;for(let b of Object.values(a.hooks))if(Array.isArray(b)){for(let a of b)if(a.hooks&&a.hooks.some(a=>o(a)))return!0}}catch{}return!1},detectInstalled:()=>q("qwen")},ori:R,cline:T};a.s(["claudeCode",0,s,"detectInstalledClis",0,function(){return i.INTEGRATION_TYPES.filter(a=>U[a]?.detectInstalled())},"getIntegration",0,function(a){let b=U[a];if(!b)throw Error(`"${a}" is audit-only — live-hook install is not supported for it yet. Installable: ${i.INTEGRATION_TYPES.filter(a=>void 0!==U[a]).join(", ")}`);return b},"listIntegrations",0,function(){return i.INTEGRATION_TYPES.map(a=>U[a]).filter(a=>void 0!==a)},"settingsPathsFor",0,r])},9909,89790,a=>{"use strict";var b=a.i(66680),c=a.i(2157),d=a.i(50227),e=a.i(75818);function f(a,b){if(!b||(0,d.isAbsolute)(b))throw Error(`unsafe managed policy path ${JSON.stringify(b)}`);let e=(0,d.resolve)(a,b),f=(0,d.relative)(a,e);if(f.startsWith("..")||(0,d.isAbsolute)(f))throw Error(`managed policy path escapes its root: ${JSON.stringify(b)}`);let g=(0,c.realpathSync)(a),h=(0,c.realpathSync)(e),i=(0,d.relative)(g,h);if(i.startsWith("..")||(0,d.isAbsolute)(i))throw Error(`managed policy symlink escapes its root: ${JSON.stringify(b)}`);return h}a.s(["resolveManagedPath",0,f],89790);let g=[1],h=/^[a-f0-9]{64}$/,i=/^[A-Za-z0-9._-]{1,64}\/[A-Za-z0-9._-]{1,64}$/,j=/^[A-Za-z0-9][A-Za-z0-9._+-]{0,63}$/,k=/^[0-9a-f]{7,40}$/,l=/^[A-Za-z0-9._-]{1,128}$/;function m(){return process.env.FAILPROOFAI_PACK_DIR??(0,e.packsDir)()}function n(a){if("string"!=typeof a.id||!i.test(a.id))throw Error(`unsafe pack id ${JSON.stringify(a.id)}`);if("string"!=typeof a.version||!j.test(a.version))throw Error(`invalid version for pack ${a.id}`);if(void 0!==a.effect&&"enforce"!==a.effect&&"observe"!==a.effect)throw Error(`unknown effect ${JSON.stringify(a.effect)} for pack ${a.id}`);let b="string"==typeof a.commit&&k.test(a.commit.trim().toLowerCase())?a.commit.trim().toLowerCase():void 0;return{id:a.id,version:a.version,effect:a.effect??"enforce",...b?{commit:b}:{}}}function o(){return process.env.FAILPROOFAI_PACK_DIR?(0,d.resolve)(process.env.FAILPROOFAI_PACK_DIR,"installed.json"):(0,e.packsInstalledFile)()}function p(a,b,c){let d=`${a} policy #${c}`;if(!b||"object"!=typeof b)throw Error(`${d} is not an object`);let e=b.name;if("string"!=typeof e||!l.test(e))throw Error(`${d} has an unsafe name ${JSON.stringify(e)}`);if("alwaysOn"in b)throw Error(`${d} declares alwaysOn, which packs may not set`);if("string"!=typeof b.description||0===b.description.length)throw Error(`${d} is missing a description`);if("string"!=typeof b.category||0===b.category.length)throw Error(`${d} is missing a category`);if("boolean"!=typeof b.defaultEnabled)throw Error(`${d} is missing defaultEnabled`);if(!b.match||"object"!=typeof b.match)throw Error(`${d} is missing a match`);let f=b.match;for(let a of["events","toolNames"]){let b=f[a];if(void 0!==b&&(!Array.isArray(b)||b.some(a=>"string"!=typeof a||0===a.length)))throw Error(`${d} has a match.${a} that is not a list of names`)}return b}function q(a){return a instanceof Error?a.message:String(a)}a.s(["PACK_COMMIT_RE",0,k,"hasInstalledPacks",0,function(){try{let a=JSON.parse((0,c.readFileSync)(o(),"utf8"));return Array.isArray(a.packs)&&a.packs.length>0}catch{return!1}},"packsRoot",0,m,"parsePackIdentity",0,n,"parsePackPolicy",0,p,"readInstalledPacks",0,function(){let a,d=o();if(!(0,c.existsSync)(d))return{packs:[],errors:[]};try{a=JSON.parse((0,c.readFileSync)(d,"utf8"))}catch(a){return{packs:[],errors:[{id:null,reason:`unreadable pack manifest: ${q(a)}`}]}}if(!a||"object"!=typeof a)return{packs:[],errors:[{id:null,reason:"pack manifest is not an object"}]};let e=a;if(!g.includes(e.schemaVersion))return{packs:[],errors:[{id:null,reason:`unsupported pack manifest schema ${String(e.schemaVersion)} (supported: ${g.join(", ")})`}]};if(!Array.isArray(e.packs))return{packs:[],errors:[{id:null,reason:"pack manifest packs is not an array"}]};let i=m(),j=[],k=[],l=new Set;for(let a of e.packs){let d=a&&"object"==typeof a&&"string"==typeof a.id?a.id:null;try{let d=function(a,d){if(!d||"object"!=typeof d)throw Error("pack entry is not an object");let e=n(d);if("string"!=typeof d.source||0===d.source.length)throw Error(`pack ${d.id} has no source`);if("string"!=typeof d.sha256||!h.test(d.sha256))throw Error(`invalid SHA-256 for pack ${d.id}`);let g=e.effect,i=f(a,d.entry),j=(0,b.createHash)("sha256").update((0,c.readFileSync)(i)).digest("hex");if(j!==d.sha256)throw Error(`pack ${d.id} failed integrity verification: expected ${d.sha256}, got ${j}`);if(!Array.isArray(d.policies))throw Error(`pack ${d.id} policies is not an array`);let k=d.policies.map((a,b)=>p(d.id,a,b)),l=new Set;for(let a of k){if(l.has(a.name))throw Error(`pack ${d.id} declares ${a.name} twice`);l.add(a.name)}let m=null;if(void 0!==d.enabled){if(!Array.isArray(d.enabled)||d.enabled.some(a=>"string"!=typeof a))throw Error(`pack ${d.id} enabled is not an array of names`);m=d.enabled.filter(a=>l.has(a))}let o=null;if(void 0!==d.clis){if(!Array.isArray(d.clis)||d.clis.some(a=>"string"!=typeof a))throw Error(`pack ${d.id} clis is not an array of agent names`);o=d.clis}return{clis:o,id:e.id,version:e.version,source:d.source,path:i,sha256:d.sha256,effect:g,policies:k,enabled:m}}(i,a);if(l.has(d.id))throw Error(`duplicate pack id ${d.id}`);l.add(d.id),j.push(d)}catch(c){let b=a&&("observe"===a.effect||"enforce"===a.effect)?a.effect:"enforce";k.push({id:d,reason:q(c),effect:b,...Array.isArray(a?.policies)?{declared:function(a){let b=[];for(let c of a)c&&"object"==typeof c&&"string"==typeof c.name&&c.match&&"object"==typeof c.match&&b.push(c);return b}(a.policies)}:{},...Array.isArray(a?.clis)&&a.clis.every(a=>"string"==typeof a)?{clis:a.clis}:{}})}}return{packs:j,errors:k}}],9909)},17280,a=>{"use strict";var b=a.i(66680),c=a.i(2157),d=a.i(50227),e=a.i(9909);let f="failproofai-pack.json",g="failproofai-pack.mjs",h="SHA256SUMS";function i(){return(process.env.FAILPROOFAI_PACK_BASE_URL||"https://github.com").replace(/\/+$/,"")}let j=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,k=/^[A-Za-z0-9][A-Za-z0-9._/-]{0,127}$/,l="FailproofAI/policies",m=new Set(["core","failproofai","official"]);function n(a){let b=a.trim();if(0===b.length)throw Error("pack source is empty");let c=b.match(/^(?:https?:\/\/)?(?:www\.)?github\.com\/(.+)$/i);if(c){let[a,b,...d]=c[1].replace(/\/+$/,"").split("/"),e=null;if("releases"===d[0]&&("tag"===d[1]||"download"===d[1])){let a=d.slice(2);e=("download"===d[1]?a.slice(0,-1):a).join("/")||null}else"releases"===d[0]&&"latest"===d[1]&&(e=null);return o(a,b,e)}let d=b.replace(/^github:/i,""),e=d.lastIndexOf("@"),f=e>0?d.slice(0,e):d,g=e>0?d.slice(e+1):null,h=f.indexOf("/");if(h<=0||h===f.length-1){if(m.has(f.trim().toLowerCase()))throw Error(`${JSON.stringify(a)} is no longer a pack name — ours is a pack like anyone else's now. Use ${l} instead.`);throw Error(`pack source must be owner/repo, owner/repo@tag, or a github.com URL — got ${JSON.stringify(a)}`)}return o(f.slice(0,h),f.slice(h+1),g)}function o(a,b,c){if(!a||!j.test(a))throw Error(`unsafe owner ${JSON.stringify(a)}`);if(!b||!j.test(b))throw Error(`unsafe repo ${JSON.stringify(b)}`);if(null!==c&&!k.test(c))throw Error(`unsafe tag ${JSON.stringify(c)}`);return{owner:a,repo:b,tag:c}}async function p(a){let b=`${i()}/${a.owner}/${a.repo}/releases/latest`,c=await fetch(b,{signal:AbortSignal.timeout(3e4),redirect:"manual"}),d=c.headers.get("location");if(!d)throw Error(`could not resolve the newest release of ${a.owner}/${a.repo} (GET ${b} returned ${c.status} with no redirect). That redirect is issued only for a published, non-prerelease release, so either the repository has no releases at all or every release it has is a prerelease or a draft. Name a tag explicitly.`);let e=d.match(/\/releases\/tag\/(.+)$/);if(!e)throw Error(`unexpected redirect from ${b}: ${d}`);let f=decodeURIComponent(e[1]).replace(/\/+$/,"");if(!k.test(f))throw Error(`unsafe tag ${JSON.stringify(f)} from ${b}`);return f}async function q(b,c){let d,e=c.toLowerCase(),f=`${(process.env.FAILPROOFAI_GITHUB_API??"https://api.github.com").replace(/\/+$/,"")}/repos/${b.owner}/${b.repo}/releases?per_page=100`;try{let a=(process.env.GITHUB_TOKEN||process.env.GH_TOKEN||"").trim(),b=await fetch(f,{headers:{...a?{Authorization:`Bearer ${a}`}:{},Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28","User-Agent":"failproofai"},signal:AbortSignal.timeout(3e4),redirect:"follow"});if(!b.ok)throw Error(`GET ${f} returned ${b.status}`);d=await b.json()}catch(a){throw Error(`could not resolve commit ${c} in ${b.owner}/${b.repo}: ${G(a)}. Name the release tag instead if you know it.`)}let{parseReleaseBody:g}=await a.A(49679),h=Array.isArray(d)?d:[],i=[];for(let a of h){let b="string"==typeof a.tag_name?a.tag_name:"";if(!b||!k.test(b))continue;let c=g("string"==typeof a.body?a.body:"");c.commit&&c.commit.startsWith(e)&&i.push({tag:b,commit:c.commit})}if(i.length>1)throw Error(`commit ${c} matches ${i.length} releases of ${b.owner}/${b.repo}: `+i.map(a=>`${a.tag} (${a.commit})`).join(", ")+". Name one of those tags, or type more of the commit.");return 1===i.length?i[0].tag:null}async function r(a){return null===a.tag?p(a):e.PACK_COMMIT_RE.test(a.tag)?await q(a,a.tag)??a.tag:a.tag}function s(a){return`github:${a.owner}/${a.repo}@${a.tag}`}function t(a,b){return`${i()}/${a.owner}/${a.repo}/releases/download/${a.tag}/${b}`}async function u(a){let b=await fetch(a,{signal:AbortSignal.timeout(3e4),redirect:"follow"});if(!b.ok)throw Error(`GET ${a} returned ${b.status}`);let c=b.headers.get("content-length");if(null!==c){let d=Number(c);if(Number.isFinite(d)&&d>8388608)throw await b.body?.cancel(),Error(`${a} declares ${d} bytes, over the 8388608 limit`)}if(!b.body)return Buffer.alloc(0);let d=[],e=b.body.getReader(),f=0;try{for(;;){let{done:b,value:c}=await e.read();if(b)break;if((f+=c.byteLength)>8388608)throw await e.cancel(),Error(`${a} is over the 8388608 byte limit`);d.push(Buffer.from(c))}}finally{e.releaseLock()}return Buffer.concat(d,f)}function v(a,b){for(let c of a.split("\n")){let a=c.trim().match(/^([0-9a-f]{64})\s+\*?(.+)$/i);if(a&&a[2].trim()===b)return a[1].toLowerCase()}return null}function w(a){return(0,b.createHash)("sha256").update(a).digest("hex")}function x(a,b){let e=`${a}.${process.pid}.tmp`;try{(0,c.mkdirSync)((0,d.dirname)(a),{recursive:!0}),(0,c.writeFileSync)(e,b),(0,c.renameSync)(e,a)}catch(a){throw(0,c.rmSync)(e,{force:!0}),a}}async function y(a,b={}){let c=await D(a,b);return{id:c.id,version:c.version,enabled:c.enabled,available:c.available,bundled:!1,source:c.source,tag:c.tag,resolvedFromLatest:c.resolvedFromLatest,selection:c.selection,categories:c.categories}}async function z(a){let b;if("1"===process.env.FAILPROOFAI_NO_DOWNLOAD)throw Error("FAILPROOFAI_NO_DOWNLOAD is set, so nothing can be fetched to preview");let c=n(a),d=null===c.tag,g={...c,tag:await r(c)},i=(await u(t(g,h))).toString("utf8"),j=await u(t(g,f)),k=v(i,f);if(!k)throw Error(`${h} has no entry for ${f}`);if(w(j)!==k)throw Error(`${f} failed integrity verification`);try{b=JSON.parse(j.toString("utf8"))}catch(a){throw Error(`${f} is not valid JSON: ${G(a)}`)}if(!b||"object"!=typeof b)throw Error(`${f} is not an object`);let l=b,m=(0,e.parsePackIdentity)(l);if(!Array.isArray(l.policies)||0===l.policies.length)throw Error("pack manifest declares no policies");return{id:m.id,version:m.version,effect:m.effect,...m.commit?{commit:m.commit}:{},policies:l.policies.map((a,b)=>(0,e.parsePackPolicy)(m.id,a,b)),source:s(g),resolvedFromLatest:d}}async function A(a){let b,c=(await u(t(a,h))).toString("utf8"),d=await u(t(a,f)),i=v(c,f);if(!i)throw Error(`${h} has no entry for ${f}`);if(w(d)!==i)throw Error(`${f} failed integrity verification`);let j=await u(t(a,g)),k=v(c,g);if(!k)throw Error(`${h} has no entry for ${g}`);let l=w(j);if(l!==k)throw Error(`${g} failed integrity verification`);try{b=JSON.parse(d.toString("utf8"))}catch(a){throw Error(`${f} is not valid JSON: ${G(a)}`)}if(!b||"object"!=typeof b)throw Error(`${f} is not an object`);let m=b,n=(0,e.parsePackIdentity)(m);if(!Array.isArray(m.policies)||0===m.policies.length)throw Error("pack manifest declares no policies");let o=m.policies.map((a,b)=>(0,e.parsePackPolicy)(n.id,a,b));return{id:n.id,version:n.version,policies:o,...void 0!==m.effect?{effect:n.effect}:{},...n.commit?{commit:n.commit}:{},artifact:j,artifactDigest:l}}function B(a){return a.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}async function C(b,c){let d,{loadCustomHooks:e}=await a.A(6188);try{d=(await e(b,{strict:!0})).map(a=>a.name)}catch(a){throw Error(`its artifact could not be loaded: ${a instanceof Error?a.message:String(a)}`)}let f=c.filter(a=>!d.includes(a)),g=d.filter(a=>!c.includes(a));if(f.length>0)throw Error(`its manifest declares ${f.join(", ")} but the artifact does not register ${1===f.length?"it":"them"} — that would install as protection that never runs`);if(g.length>0)throw Error(`its artifact registers undeclared ${g.join(", ")} — a policy that enforces but appears in no listing cannot be reviewed or switched off`)}async function D(a,b){var f,g,h,i;let j,k;if(process.env.FAILPROOFAI_NO_DOWNLOAD)throw Error("pack downloads are disabled (FAILPROOFAI_NO_DOWNLOAD). Already-installed packs keep enforcing.");let l=n(a),m={...l,tag:await r(l)},o=null===l.tag,p=await A(m);if(f=m.tag,g=p.version,(j=f.slice(f.lastIndexOf("/")+1))!==g&&j!==`v${g}`){let a=m.tag.slice(m.tag.lastIndexOf("/")+1).replace(/^v/,""),b=`re-tag the release ${p.version} (a leading v is fine), or rebuild the pack with --version ${a}`;throw Error(`${p.id} was not installed: release tag ${m.tag} does not match the version its manifest declares (${p.version}). `+(o?`That is the newest release of ${m.owner}/${m.repo}, so the release and the pack disagree at the source — ask the publisher to ${b}.`:`Name the tag whose manifest says ${p.version}, or fix the pack: ${b}.`))}let q=p.policies.map(a=>a.name),t=(h=p.id,i=p.artifactDigest,(k=(0,e.readInstalledPacks)().packs).find(a=>a.id===h)??k.find(a=>a.sha256===i)),{enabled:u,reason:v}=function(a,b,c,d){let e=a.map(a=>a.name);if(b?.all)return{enabled:null,reason:"all"};let f=new Set;if(b?.categories?.length){let c=new Set(b.categories.map(B)),d=new Map(a.map(a=>[B(a.category),a.category])),e=[...c].filter(a=>!d.has(a));if(e.length>0)throw Error(`no such categor${1===e.length?"y":"ies"}: ${e.join(", ")} (has: ${[...new Set(a.map(a=>B(a.category)))].join(", ")})`);for(let b of a)c.has(B(b.category))&&f.add(b.name)}if(b?.only?.length){let a=b.only.filter(a=>!e.includes(a));if(a.length>0)throw Error(`pack does not contain ${a.join(", ")}`);for(let a of b.only)f.add(a)}if(b?.only!==void 0||b?.categories?.length){if(b.merge&&d){if(null===c)return{enabled:null,reason:"carried"};for(let a of c??[])f.add(a);return{enabled:e.filter(a=>f.has(a)),reason:"added"}}return{enabled:e.filter(a=>f.has(a)),reason:"selected"}}return d?{enabled:null===c?null:c??null,reason:"carried"}:{enabled:a.filter(a=>a.defaultEnabled).map(a=>a.name),reason:"defaults"}}(p.policies,b,t?.enabled?t.enabled.filter(a=>q.includes(a)):t?.enabled,!!t),w=(0,e.packsRoot)(),y=`artifacts/${p.artifactDigest}.mjs`,z=(0,d.resolve)(w,y);(0,c.existsSync)(z)||x(z,p.artifact);try{await C(z,q)}catch(a){throw Error(`${p.id}@${p.version} was not installed: ${a instanceof Error?a.message:String(a)}`)}let D=a=>{let b=a.lastIndexOf("@");return b>a.indexOf(":")?a.slice(0,b):a};if(t&&t.id===p.id&&!t.source.startsWith("bundled:")&&D(t.source)!==D(s(m)))throw Error(`pack id ${p.id} is already installed from ${t.source}. Refusing to replace it with ${s(m)} — remove it first if that is what you mean.`);let E={id:p.id,version:p.version,source:s(m),entry:y,sha256:p.artifactDigest,policies:p.policies,...p.commit?{commit:p.commit}:{},...p.effect?{effect:p.effect}:{},...u?{enabled:u}:{},...b?.clis?{clis:b.clis}:b?.merge!==!1&&t?.clis?{clis:t.clis}:{}};return{replaced:function(a,b=!0){let f=(0,d.resolve)((0,e.packsRoot)(),"installed.json"),g=[];if((0,c.existsSync)(f))try{let a=JSON.parse((0,c.readFileSync)(f,"utf8"));Array.isArray(a.packs)&&(g=a.packs)}catch{throw Error(`existing pack manifest at ${f} is unreadable; move it aside and re-add`)}let h=g.filter(b=>b?.sha256===a.sha256&&b?.id!==a.id).map(a=>a.id);if(b&&!a.enabled){let b=g.find(a=>h.includes(a?.id)),c=b?.enabled?.filter(b=>a.policies?.some(a=>a?.name===b));c&&c.length>0&&(a.enabled=c)}let i=g.filter(a=>!h.includes(a?.id)),j=i.findIndex(b=>b?.id===a.id);return j>=0?i[j]=a:i.push(a),x(f,JSON.stringify({schemaVersion:1,packs:i},null,2)+"\n"),h}(E,"all"!==v),id:p.id,version:p.version,source:E.source,tag:m.tag,resolvedFromLatest:o,enabled:u??q,available:q,selection:v,categories:[...new Set(p.policies.map(a=>B(a.category)))],artifact:z}}function E(a){let b=a.trim(),c=b.lastIndexOf("@");return(c>0?b.slice(0,c):b).trim()}class F extends Error{candidates;constructor(a,b){super(`${b} matches ${a.length} installed packs: ${a.join(", ")}. Name one of them exactly.`),this.candidates=a,this.name="AmbiguousPackId"}}function G(a){return a instanceof Error?a.message:String(a)}a.s(["CORE_SOURCE",0,l,"PACK_CHECKSUMS_ASSET",0,h,"PACK_ENTRY_ASSET",0,g,"PACK_MANIFEST_ASSET",0,f,"addPack",0,D,"addPackFromSource",0,y,"fetchPackPreview",0,z,"removePack",0,function(a){let b,f=(0,d.resolve)((0,e.packsRoot)(),"installed.json");if(!(0,c.existsSync)(f))return null;try{b=JSON.parse((0,c.readFileSync)(f,"utf8"))}catch{return null}let g=Array.isArray(b.packs)?b.packs:[],h=g.find(b=>b?.id===E(a)),i=g.filter(b=>{var c;return b?.id&&(c=b.id,E(c).toLowerCase()===E(a).toLowerCase())});if(!h&&i.length>1)throw new F(i.map(a=>a.id).filter(a=>"string"==typeof a),a);let j=h??i[0],k=g.filter(a=>a!==j);return j&&k.length!==g.length?(x(f,JSON.stringify({schemaVersion:1,packs:k},null,2)+"\n"),j.id):null},"setPackPolicyEnabled",0,function(a,b,f){let g,h=(0,d.resolve)((0,e.packsRoot)(),"installed.json");if(!(0,c.existsSync)(h))return{ok:!1,reason:"no packs are installed"};try{g=JSON.parse((0,c.readFileSync)(h,"utf8"))}catch{return{ok:!1,reason:`pack manifest at ${h} is unreadable`}}let i=Array.isArray(g.packs)?g.packs:[],j=i.find(b=>b?.id===a);if(!j)return{ok:!1,reason:`no installed pack with id ${a}`};let k=(Array.isArray(j.policies)?j.policies:[]).map(a=>"string"==typeof a?.name?a.name:null).filter(a=>null!==a);if(!k.includes(b))return{ok:!1,reason:`pack ${a} declares no policy named ${b}`};let l=j.enabled??k,m=f?[...new Set([...l,b])]:l.filter(a=>a!==b);return j.enabled=k.filter(a=>m.includes(a)),x(h,JSON.stringify({schemaVersion:1,packs:i},null,2)+"\n"),{ok:!0}}])},1459,a=>{"use strict";a.i(1457);Symbol("failproofai.back"),Object.values({on:"✓ ON",off:"· OFF",mixed:"◐ MIXED",locked:"✓ LOCK",cloud:"✓ CLOUD",pack:"✓ PACK",failed:"▲ FAIL",observe:"◉ OBS"}).map(a=>a.length),a.s([])},91997,a=>{"use strict";let b=["SessionStart","SessionEnd","UserPromptSubmit","PreToolUse","PermissionRequest","PermissionDenied","PostToolUse","PostToolUseFailure","Notification","SubagentStart","SubagentStop","TaskCreated","TaskCompleted","Stop","StopFailure","TeammateIdle","InstructionsLoaded","ConfigChange","CwdChanged","FileChanged","WorktreeCreate","WorktreeRemove","PreCompact","PostCompact","Elicitation","ElicitationResult","UserPromptExpansion","PostToolBatch","Setup"].filter(a=>"WorktreeCreate"!==a);a.s(["ANTIGRAVITY_HOOK_EVENT_TYPES",0,["PreToolUse","PostToolUse","PreInvocation","Stop"],"ANTIGRAVITY_HOOK_SCOPES",0,["user","project"],"CLAUDE_INSTALL_EVENT_TYPES",0,b,"CLINE_HOOK_EVENT_TYPES",0,["TaskStart","TaskResume","TaskCancel","TaskComplete","TaskError","PreToolUse","PostToolUse","UserPromptSubmit","SessionShutdown"],"CLINE_HOOK_SCOPES",0,["user","project"],"CODEX_EVENT_MAP",0,{session_start:"SessionStart",pre_tool_use:"PreToolUse",permission_request:"PermissionRequest",post_tool_use:"PostToolUse",user_prompt_submit:"UserPromptSubmit",stop:"Stop",subagent_start:"SubagentStart",pre_compact:"PreCompact",post_compact:"PostCompact",subagent_stop:"SubagentStop"},"CODEX_HOOK_EVENT_TYPES",0,["session_start","pre_tool_use","permission_request","post_tool_use","user_prompt_submit","stop","subagent_start","pre_compact","post_compact","subagent_stop"],"CODEX_HOOK_SCOPES",0,["user","project"],"COPILOT_HOOK_EVENT_TYPES",0,["SessionStart","SessionEnd","UserPromptSubmit","PreToolUse","PostToolUse","Stop","SubagentStop","PostToolUseFailure","ErrorOccurred","PreCompact","PermissionRequest","Notification"],"COPILOT_HOOK_SCOPES",0,["user","project"],"CURSOR_HOOK_EVENT_TYPES",0,["sessionStart","sessionEnd","beforeSubmitPrompt","preToolUse","postToolUse","stop","subagentStop"],"CURSOR_HOOK_SCOPES",0,["user","project"],"DEVIN_HOOK_EVENT_TYPES",0,["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","PermissionRequest","Stop","SessionEnd"],"DEVIN_HOOK_SCOPES",0,["user","project"],"FACTORY_HOOK_EVENT_TYPES",0,["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","Notification","Stop","SubagentStop","PreCompact","SessionEnd"],"FACTORY_HOOK_SCOPES",0,["user","project"],"FAILPROOFAI_HOOK_MARKER",0,"__failproofai_hook__","GOOSE_HOOK_EVENT_TYPES",0,["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","SessionEnd"],"GOOSE_HOOK_SCOPES",0,["user","project"],"GROK_HOOK_EVENT_TYPES",0,["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","PostToolUseFailure","PermissionDenied","Stop","StopFailure","Notification","SubagentStart","SubagentStop","PreCompact","PostCompact","SessionEnd"],"GROK_HOOK_SCOPES",0,["user","project"],"HERMES_HOOK_EVENT_TYPES",0,["pre_tool_call","post_tool_call","on_session_start","on_session_end","subagent_stop"],"HERMES_HOOK_SCOPES",0,["user"],"HOOK_SCOPES",0,["user","project","local"],"INTEGRATION_TYPES",0,["claude","codex","copilot","cursor","opencode","pi","hermes","openclaw","factory","devin","antigravity","goose","grok","qwen","ori","cline"],"OPENCLAW_HOOK_EVENT_TYPES",0,["before_tool_call","after_tool_call","before_agent_run","before_agent_finalize","session_start","session_end","subagent_ended","before_compaction"],"OPENCLAW_HOOK_SCOPES",0,["user"],"OPENCODE_HOOK_EVENT_TYPES",0,["tool.execute.before","tool.execute.after","session.created","session.deleted","session.idle","message.updated","permission.ask"],"OPENCODE_HOOK_SCOPES",0,["user","project"],"ORI_HOOK_EVENT_TYPES",0,["PreToolUse"],"ORI_HOOK_SCOPES",0,["user"],"PI_HOOK_EVENT_TYPES",0,["session_start","session_shutdown","input","tool_call","user_bash","tool_result","agent_end"],"PI_HOOK_SCOPES",0,["user","project"],"QWEN_HOOK_EVENT_TYPES",0,["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","PostToolUseFailure","PermissionRequest","PermissionDenied","Stop","StopFailure","SubagentStart","SubagentStop","PreCompact","PostCompact","Notification","InstructionsLoaded","UserPromptExpansion","TodoCreated","TodoCompleted","SessionEnd"],"QWEN_HOOK_SCOPES",0,["user","project"]])}];
|
|
264
|
+
`),"utf8"),Array.isArray(a.plugin)||(a.plugin=[]);let l="user"===j?`file://${k}`:x,m=a.plugin.findIndex(a=>this.isFailproofaiHook(a));m>=0?a.plugin[m]=l:a.plugin.push(l)},removeHooksFromFile(a){let b=0,d=this.readSettings(a);if(Array.isArray(d.plugin)){let a=d.plugin.length;d.plugin=d.plugin.filter(a=>!this.isFailproofaiHook(a)),b+=a-d.plugin.length,0===d.plugin.length&&delete d.plugin}this.writeSettings(a,d);let e=y(a);if((0,c.existsSync)(e))try{(0,c.readFileSync)(e,"utf8").includes(i.FAILPROOFAI_HOOK_MARKER)&&((0,c.unlinkSync)(e),0===b&&(b=1))}catch{}return b},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d);if(!Array.isArray(a.plugin)||!a.plugin.some(a=>this.isFailproofaiHook(a)))return!1;let b=y(d);if(!(0,c.existsSync)(b))return!1;return(0,c.readFileSync)(b,"utf8").includes(i.FAILPROOFAI_HOOK_MARKER)}catch{return!1}},detectInstalled:()=>q("opencode")};function A(){let a=process.env.FAILPROOFAI_PACKAGE_ROOT;return a?(0,d.resolve)(a,"pi-extension"):(0,d.resolve)((0,e.fileURLToPath)(j.url),"..","..","..","pi-extension")}function B(a){return"string"==typeof a&&(!!/(?:^|\/)pi-extension\/?$/.test(a)||a.includes("pi-extension")&&a.includes("failproofai"))}let C={id:"pi",displayName:"Pi",scopes:i.PI_HOOK_SCOPES,eventTypes:i.PI_HOOK_EVENT_TYPES,getSettingsPath(a,b){let c=b?(0,d.resolve)(b):process.cwd();switch(a){case"user":return(0,d.resolve)((0,f.homedir)(),".pi","agent","settings.json");case"project":case"local":return(0,d.resolve)(c,".pi","settings.json")}},readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b,c)=>({[i.FAILPROOFAI_HOOK_MARKER]:!0,_piPackagePath:A(),_piScope:c}),isFailproofaiHook:a=>"string"==typeof a?B(a):!!a&&"object"==typeof a&&(!0===a[i.FAILPROOFAI_HOOK_MARKER]||"string"==typeof a.source&&B(a.source)),writeHookEntries(a,b,c){var e;let f,g,h;Array.isArray(a.packages)||(a.packages=[]);let i=A(),j="project"===c?(e=i,f=process.cwd(),g=(0,d.resolve)(f),(h=(0,d.resolve)(e)).startsWith(g+"/")||h===g?"../"+h.slice(g.length+1):h):i,k=a.packages.findIndex(a=>B(a));k>=0?a.packages[k]=j:a.packages.push(j)},removeHooksFromFile(a){if(!(0,c.existsSync)(a))return 0;let b=this.readSettings(a);if(!Array.isArray(b.packages))return 0;let d=b.packages.length;b.packages=b.packages.filter(a=>!B(a));let e=d-b.packages.length;return 0===b.packages.length&&delete b.packages,this.writeSettings(a,b),e},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d);if(!Array.isArray(a.packages))return!1;return a.packages.some(a=>B(a))}catch{return!1}},detectInstalled:()=>q("pi")},D={id:"hermes",displayName:"Hermes",scopes:i.HERMES_HOOK_SCOPES,eventTypes:i.HERMES_HOOK_EVENT_TYPES,getSettingsPath:()=>(0,d.resolve)((0,h.hermesRoot)(),"config.yaml"),getSettingsPaths:()=>(0,h.listHermesProfiles)().map(a=>(0,d.resolve)(a.home,"config.yaml")),readSettings:a=>m(a),writeSettings(a,b){n(a,b)},buildHookEntry:(a,b,c)=>({command:"project"===c?`npx -y failproofai --hook ${b} --cli hermes`:`"${a}" --hook ${b} --cli hermes`,timeout:30,[i.FAILPROOFAI_HOOK_MARKER]:!0}),isFailproofaiHook:o,writeHookEntries(a,b,c){let d=a.toJS()??{},e=d.hooks&&"object"==typeof d.hooks?d.hooks:{};for(let a of i.HERMES_HOOK_EVENT_TYPES){let d=this.buildHookEntry(b,a,c),f=Array.isArray(e[a])?e[a]:[],g=f.findIndex(a=>o(a));g>=0?f[g]=d:f.push(d),e[a]=f}a.set("hooks",e),a.set("hooks_auto_accept",!0)},removeHooksFromFile(a){if(!(0,c.existsSync)(a))return 0;let b=m(a),d=(b.toJS()??{}).hooks,e=0;if(d&&"object"==typeof d){for(let a of Object.keys(d)){let b=d[a];if(!Array.isArray(b))continue;let c=b.length,f=b.filter(a=>!o(a));e+=c-f.length,0===f.length?delete d[a]:d[a]=f}e>0&&(0===Object.keys(d).length?b.delete("hooks"):b.set("hooks",d))}let f=b.delete("hooks_auto_accept");return(e>0||f)&&n(a,b),e},hooksInstalledInSettings(a,b){let d=r(this,a,b);return d.length>0&&d.every(a=>(function(a){if(!(0,c.existsSync)(a))return!1;try{let b=(m(a).toJS()??{}).hooks;if(!b||"object"!=typeof b)return!1;for(let a of Object.values(b))if(Array.isArray(a)&&a.some(a=>o(a)))return!0}catch{}return!1})(a))},detectInstalled:()=>q("hermes")},E="failproofai";function F(){let a=process.env.FAILPROOFAI_PACKAGE_ROOT;return a?(0,d.resolve)(a,"openclaw-plugin"):(0,d.resolve)((0,e.fileURLToPath)(j.url),"..","..","..","openclaw-plugin")}function G(a){return"string"==typeof a&&(/(?:^|\/)openclaw-plugin\/?$/.test(a)||a.includes("openclaw-plugin")&&a.includes("failproofai"))}let H={id:"openclaw",displayName:"OpenClaw",scopes:i.OPENCLAW_HOOK_SCOPES,eventTypes:i.OPENCLAW_HOOK_EVENT_TYPES,getSettingsPath:()=>(0,d.resolve)((0,f.homedir)(),".openclaw","openclaw.json"),readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:()=>({[i.FAILPROOFAI_HOOK_MARKER]:!0,_openclawPluginPath:F()}),isFailproofaiHook:a=>"string"==typeof a?G(a):!!a&&"object"==typeof a&&(!0===a[i.FAILPROOFAI_HOOK_MARKER]||"string"==typeof a.source&&G(a.source)),writeHookEntries(a){let b=a.plugins??={},c=b.load??={};Array.isArray(c.paths)||(c.paths=[]);let d=F(),e=c.paths.findIndex(a=>G(a));e>=0?c.paths[e]=d:c.paths.push(d);let f=b.entries??={},g=f[E]??={};g.enabled=!0,(g.hooks??={}).allowConversationAccess=!0},removeHooksFromFile(a){if(!(0,c.existsSync)(a))return 0;let b=this.readSettings(a),d=b.plugins;if(!d)return 0;let e=0;if(Array.isArray(d.load?.paths)){let a=d.load.paths.length;d.load.paths=d.load.paths.filter(a=>!G(a)),e+=a-d.load.paths.length,0===d.load.paths.length&&delete d.load.paths,d.load&&0===Object.keys(d.load).length&&delete d.load}return d.entries&&E in d.entries&&(delete d.entries[E],e+=1,0===Object.keys(d.entries).length&&delete d.entries),0===Object.keys(d).length&&delete b.plugins,this.writeSettings(a,b),e},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d),b=a.plugins?.load?.paths,c=Array.isArray(b)&&b.some(a=>G(a)),e=a.plugins?.entries?.[E]?.enabled===!0;return c&&e}catch{return!1}},detectInstalled:()=>q("openclaw")},I={id:"factory",displayName:"Factory Droid",scopes:i.FACTORY_HOOK_SCOPES,eventTypes:i.FACTORY_HOOK_EVENT_TYPES,getSettingsPath(a,b){let c=b?(0,d.resolve)(b):process.cwd();switch(a){case"user":return(0,d.resolve)((0,f.homedir)(),".factory","hooks.json");case"project":case"local":return(0,d.resolve)(c,".factory","hooks.json")}},readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b} --cli factory`:`"${a}" --hook ${b} --cli factory`,timeout:30,[i.FAILPROOFAI_HOOK_MARKER]:!0}),isFailproofaiHook:o,writeHookEntries(a,b,c){for(let d of i.FACTORY_HOOK_EVENT_TYPES){let e=this.buildHookEntry(b,d,c);Array.isArray(a[d])||(a[d]=[]);let f=a[d],g=!1;for(let a of f){if(!a.hooks)continue;let b=a.hooks.findIndex(a=>o(a));if(b>=0){a.hooks[b]=e,g=!0;break}}if(!g){let a="PreToolUse"===d||"PostToolUse"===d;f.push(a?{matcher:"*",hooks:[e]}:{hooks:[e]})}}},removeHooksFromFile(a){let b=this.readSettings(a),c=0;for(let a of Object.keys(b)){let d=b[a];if(Array.isArray(d)){for(let a=d.length-1;a>=0;a--){let b=d[a];if(!b||!b.hooks)continue;let e=b.hooks.length;b.hooks=b.hooks.filter(a=>!o(a)),c+=e-b.hooks.length,0===b.hooks.length&&d.splice(a,1)}0===d.length&&delete b[a]}}return this.writeSettings(a,b),c},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d);for(let b of Object.values(a))if(Array.isArray(b)){for(let a of b)if(a&&a.hooks&&a.hooks.some(a=>o(a)))return!0}}catch{}return!1},detectInstalled:()=>q("droid")},J={id:"devin",displayName:"Devin CLI",scopes:i.DEVIN_HOOK_SCOPES,eventTypes:i.DEVIN_HOOK_EVENT_TYPES,getSettingsPath(a,b){let c=b?(0,d.resolve)(b):process.cwd();switch(a){case"user":return(0,d.resolve)((0,f.homedir)(),".config","devin","config.json");case"project":case"local":return(0,d.resolve)(c,".devin","config.json")}},readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b} --cli devin`:`"${a}" --hook ${b} --cli devin`,timeout:60,[i.FAILPROOFAI_HOOK_MARKER]:!0}),isFailproofaiHook:o,writeHookEntries(a,b,c){for(let d of(a.hooks||(a.hooks={}),i.DEVIN_HOOK_EVENT_TYPES)){let e=this.buildHookEntry(b,d,c);a.hooks[d]||(a.hooks[d]=[]);let f=a.hooks[d],g=!1;for(let a of f){if(!a.hooks)continue;let b=a.hooks.findIndex(a=>o(a));if(b>=0){a.hooks[b]=e,g=!0;break}}g||f.push({hooks:[e]})}},removeHooksFromFile(a){let b=this.readSettings(a);if(!b.hooks)return 0;let c=0;for(let a of Object.keys(b.hooks)){let d=b.hooks[a];if(Array.isArray(d)){for(let a=d.length-1;a>=0;a--){let b=d[a];if(!b.hooks)continue;let e=b.hooks.length;b.hooks=b.hooks.filter(a=>!o(a)),c+=e-b.hooks.length,0===b.hooks.length&&d.splice(a,1)}0===d.length&&delete b.hooks[a]}}return 0===Object.keys(b.hooks).length&&delete b.hooks,this.writeSettings(a,b),c},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d);if(!a.hooks)return!1;for(let b of Object.values(a.hooks))if(Array.isArray(b)){for(let a of b)if(a.hooks&&a.hooks.some(a=>o(a)))return!0}}catch{}return!1},detectInstalled:()=>q("devin")},K="failproofai",L=new Set(["PreToolUse","PostToolUse"]);function M(a){if(!a||"object"!=typeof a)return!1;let b=a.command;return"string"==typeof b&&b.includes("failproofai")&&b.includes("--cli goose")}let N={claude:s,codex:t,copilot:v,cursor:w,opencode:z,pi:C,hermes:D,openclaw:H,factory:I,devin:J,antigravity:{id:"antigravity",displayName:"Antigravity CLI",scopes:i.ANTIGRAVITY_HOOK_SCOPES,eventTypes:i.ANTIGRAVITY_HOOK_EVENT_TYPES,getSettingsPath(a,b){let c=b?(0,d.resolve)(b):process.cwd();switch(a){case"user":return(0,d.resolve)((0,f.homedir)(),".gemini","config","hooks.json");case"project":case"local":return(0,d.resolve)(c,".agents","hooks.json")}},readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b} --cli antigravity`:`"${a}" --hook ${b} --cli antigravity`,timeout:30,[i.FAILPROOFAI_HOOK_MARKER]:!0}),isFailproofaiHook:o,writeHookEntries(a,b,c){a[K]&&"object"==typeof a[K]||(a[K]={});let d=a[K];for(let a of i.ANTIGRAVITY_HOOK_EVENT_TYPES){let e=this.buildHookEntry(b,a,c);if(L.has(a)){Array.isArray(d[a])||(d[a]=[]);let b=d[a],c=!1;for(let a of b){if(!a.hooks)continue;let b=a.hooks.findIndex(a=>o(a));if(b>=0){a.hooks[b]=e,c=!0;break}}c||b.push({matcher:"*",hooks:[e]})}else{Array.isArray(d[a])||(d[a]=[]);let b=d[a],c=b.findIndex(a=>o(a));c>=0?b[c]=e:b.push(e)}}},removeHooksFromFile(a){let b=this.readSettings(a),c=b[K];if(!c||"object"!=typeof c)return this.writeSettings(a,b),0;let d=0;for(let a of Object.keys(c)){let b=c[a];if(Array.isArray(b))if(L.has(a)){for(let a=b.length-1;a>=0;a--){let c=b[a];if(!c||!c.hooks)continue;let e=c.hooks.length;c.hooks=c.hooks.filter(a=>!o(a)),d+=e-c.hooks.length,0===c.hooks.length&&b.splice(a,1)}0===b.length&&delete c[a]}else{let e=b.length,f=b.filter(a=>!o(a));d+=e-f.length,0===f.length?delete c[a]:c[a]=f}}return 0===Object.keys(c).length&&delete b[K],this.writeSettings(a,b),d},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d)[K];if(!a||"object"!=typeof a)return!1;for(let b of Object.values(a))if(Array.isArray(b)){for(let a of b)if(o(a)||a&&Array.isArray(a.hooks)&&a.hooks.some(a=>o(a)))return!0}}catch{}return!1},detectInstalled:()=>q("agy")},goose:{id:"goose",displayName:"Goose",scopes:i.GOOSE_HOOK_SCOPES,eventTypes:i.GOOSE_HOOK_EVENT_TYPES,getSettingsPath(a,b){let c=b?(0,d.resolve)(b):process.cwd();switch(a){case"user":return(0,d.resolve)((0,f.homedir)(),".agents","plugins","failproofai","hooks","hooks.json");case"project":case"local":return(0,d.resolve)(c,".agents","plugins","failproofai","hooks","hooks.json")}},readSettings:a=>k(a),writeSettings(a,b){l(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b} --cli goose`:`"${a}" --hook ${b} --cli goose`}),isFailproofaiHook:M,writeHookEntries(a,b,c){for(let d of(a.hooks||(a.hooks={}),i.GOOSE_HOOK_EVENT_TYPES)){let e=this.buildHookEntry(b,d,c);Array.isArray(a.hooks[d])||(a.hooks[d]=[]);let f=a.hooks[d],g=!1;for(let a of f){if(!a.hooks)continue;let b=a.hooks.findIndex(a=>M(a));if(b>=0){a.hooks[b]=e,g=!0;break}}g||f.push({hooks:[e]})}},removeHooksFromFile(a){let b=this.readSettings(a);if(!b.hooks)return 0;let c=0;for(let a of Object.keys(b.hooks)){let d=b.hooks[a];if(Array.isArray(d)){for(let a=d.length-1;a>=0;a--){let b=d[a];if(!b||!b.hooks)continue;let e=b.hooks.length;b.hooks=b.hooks.filter(a=>!M(a)),c+=e-b.hooks.length,0===b.hooks.length&&d.splice(a,1)}0===d.length&&delete b.hooks[a]}}return 0===Object.keys(b.hooks).length&&delete b.hooks,this.writeSettings(a,b),c},hooksInstalledInSettings(a,b){let d=this.getSettingsPath(a,b);if(!(0,c.existsSync)(d))return!1;try{let a=this.readSettings(d);if(!a.hooks)return!1;for(let b of Object.values(a.hooks))if(Array.isArray(b)){for(let a of b)if(a&&a.hooks&&a.hooks.some(a=>M(a)))return!0}}catch{}return!1},detectInstalled:()=>q("goose")}};a.s(["claudeCode",0,s,"detectInstalledClis",0,function(){return i.INTEGRATION_TYPES.filter(a=>N[a]?.detectInstalled())},"getIntegration",0,function(a){let b=N[a];if(!b)throw Error(`"${a}" is audit-only — live-hook install is not supported for it yet. Installable: ${i.INTEGRATION_TYPES.filter(a=>void 0!==N[a]).join(", ")}`);return b},"listIntegrations",0,function(){return i.INTEGRATION_TYPES.map(a=>N[a]).filter(a=>void 0!==a)},"settingsPathsFor",0,r])},9909,89790,a=>{"use strict";var b=a.i(66680),c=a.i(2157),d=a.i(50227),e=a.i(75818);function f(a,b){if(!b||(0,d.isAbsolute)(b))throw Error(`unsafe managed policy path ${JSON.stringify(b)}`);let e=(0,d.resolve)(a,b),f=(0,d.relative)(a,e);if(f.startsWith("..")||(0,d.isAbsolute)(f))throw Error(`managed policy path escapes its root: ${JSON.stringify(b)}`);let g=(0,c.realpathSync)(a),h=(0,c.realpathSync)(e),i=(0,d.relative)(g,h);if(i.startsWith("..")||(0,d.isAbsolute)(i))throw Error(`managed policy symlink escapes its root: ${JSON.stringify(b)}`);return h}a.s(["resolveManagedPath",0,f],89790);let g=[1],h=/^[a-f0-9]{64}$/,i=/^[A-Za-z0-9._-]{1,64}\/[A-Za-z0-9._-]{1,64}$/,j=/^[A-Za-z0-9][A-Za-z0-9._+-]{0,63}$/,k=/^[0-9a-f]{7,40}$/,l=/^[A-Za-z0-9._-]{1,128}$/;function m(){return process.env.FAILPROOFAI_PACK_DIR??(0,e.packsDir)()}function n(a){if("string"!=typeof a.id||!i.test(a.id))throw Error(`unsafe pack id ${JSON.stringify(a.id)}`);if("string"!=typeof a.version||!j.test(a.version))throw Error(`invalid version for pack ${a.id}`);if(void 0!==a.effect&&"enforce"!==a.effect&&"observe"!==a.effect)throw Error(`unknown effect ${JSON.stringify(a.effect)} for pack ${a.id}`);let b="string"==typeof a.commit&&k.test(a.commit.trim().toLowerCase())?a.commit.trim().toLowerCase():void 0;return{id:a.id,version:a.version,effect:a.effect??"enforce",...b?{commit:b}:{}}}function o(){return process.env.FAILPROOFAI_PACK_DIR?(0,d.resolve)(process.env.FAILPROOFAI_PACK_DIR,"installed.json"):(0,e.packsInstalledFile)()}function p(a,b,c){let d=`${a} policy #${c}`;if(!b||"object"!=typeof b)throw Error(`${d} is not an object`);let e=b.name;if("string"!=typeof e||!l.test(e))throw Error(`${d} has an unsafe name ${JSON.stringify(e)}`);if("alwaysOn"in b)throw Error(`${d} declares alwaysOn, which packs may not set`);if("string"!=typeof b.description||0===b.description.length)throw Error(`${d} is missing a description`);if("string"!=typeof b.category||0===b.category.length)throw Error(`${d} is missing a category`);if("boolean"!=typeof b.defaultEnabled)throw Error(`${d} is missing defaultEnabled`);if(!b.match||"object"!=typeof b.match)throw Error(`${d} is missing a match`);let f=b.match;for(let a of["events","toolNames"]){let b=f[a];if(void 0!==b&&(!Array.isArray(b)||b.some(a=>"string"!=typeof a||0===a.length)))throw Error(`${d} has a match.${a} that is not a list of names`)}return b}function q(a){return a instanceof Error?a.message:String(a)}a.s(["PACK_COMMIT_RE",0,k,"hasInstalledPacks",0,function(){try{let a=JSON.parse((0,c.readFileSync)(o(),"utf8"));return Array.isArray(a.packs)&&a.packs.length>0}catch{return!1}},"packsRoot",0,m,"parsePackIdentity",0,n,"parsePackPolicy",0,p,"readInstalledPacks",0,function(){let a,d=o();if(!(0,c.existsSync)(d))return{packs:[],errors:[]};try{a=JSON.parse((0,c.readFileSync)(d,"utf8"))}catch(a){return{packs:[],errors:[{id:null,reason:`unreadable pack manifest: ${q(a)}`}]}}if(!a||"object"!=typeof a)return{packs:[],errors:[{id:null,reason:"pack manifest is not an object"}]};let e=a;if(!g.includes(e.schemaVersion))return{packs:[],errors:[{id:null,reason:`unsupported pack manifest schema ${String(e.schemaVersion)} (supported: ${g.join(", ")})`}]};if(!Array.isArray(e.packs))return{packs:[],errors:[{id:null,reason:"pack manifest packs is not an array"}]};let i=m(),j=[],k=[],l=new Set;for(let a of e.packs){let d=a&&"object"==typeof a&&"string"==typeof a.id?a.id:null;try{let d=function(a,d){if(!d||"object"!=typeof d)throw Error("pack entry is not an object");let e=n(d);if("string"!=typeof d.source||0===d.source.length)throw Error(`pack ${d.id} has no source`);if("string"!=typeof d.sha256||!h.test(d.sha256))throw Error(`invalid SHA-256 for pack ${d.id}`);let g=e.effect,i=f(a,d.entry),j=(0,b.createHash)("sha256").update((0,c.readFileSync)(i)).digest("hex");if(j!==d.sha256)throw Error(`pack ${d.id} failed integrity verification: expected ${d.sha256}, got ${j}`);if(!Array.isArray(d.policies))throw Error(`pack ${d.id} policies is not an array`);let k=d.policies.map((a,b)=>p(d.id,a,b)),l=new Set;for(let a of k){if(l.has(a.name))throw Error(`pack ${d.id} declares ${a.name} twice`);l.add(a.name)}let m=null;if(void 0!==d.enabled){if(!Array.isArray(d.enabled)||d.enabled.some(a=>"string"!=typeof a))throw Error(`pack ${d.id} enabled is not an array of names`);m=d.enabled.filter(a=>l.has(a))}let o=null;if(void 0!==d.clis){if(!Array.isArray(d.clis)||d.clis.some(a=>"string"!=typeof a))throw Error(`pack ${d.id} clis is not an array of agent names`);o=d.clis}return{clis:o,id:e.id,version:e.version,source:d.source,path:i,sha256:d.sha256,effect:g,policies:k,enabled:m}}(i,a);if(l.has(d.id))throw Error(`duplicate pack id ${d.id}`);l.add(d.id),j.push(d)}catch(c){let b=a&&("observe"===a.effect||"enforce"===a.effect)?a.effect:"enforce";k.push({id:d,reason:q(c),effect:b,...Array.isArray(a?.policies)?{declared:function(a){let b=[];for(let c of a)c&&"object"==typeof c&&"string"==typeof c.name&&c.match&&"object"==typeof c.match&&b.push(c);return b}(a.policies)}:{},...Array.isArray(a?.clis)&&a.clis.every(a=>"string"==typeof a)?{clis:a.clis}:{}})}}return{packs:j,errors:k}}],9909)},17280,a=>{"use strict";var b=a.i(66680),c=a.i(2157),d=a.i(50227),e=a.i(9909);let f="failproofai-pack.json",g="failproofai-pack.mjs",h="SHA256SUMS";function i(){return(process.env.FAILPROOFAI_PACK_BASE_URL||"https://github.com").replace(/\/+$/,"")}let j=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,k=/^[A-Za-z0-9][A-Za-z0-9._/-]{0,127}$/,l="FailproofAI/policies",m=new Set(["core","failproofai","official"]);function n(a){let b=a.trim();if(0===b.length)throw Error("pack source is empty");let c=b.match(/^(?:https?:\/\/)?(?:www\.)?github\.com\/(.+)$/i);if(c){let[a,b,...d]=c[1].replace(/\/+$/,"").split("/"),e=null;if("releases"===d[0]&&("tag"===d[1]||"download"===d[1])){let a=d.slice(2);e=("download"===d[1]?a.slice(0,-1):a).join("/")||null}else"releases"===d[0]&&"latest"===d[1]&&(e=null);return o(a,b,e)}let d=b.replace(/^github:/i,""),e=d.lastIndexOf("@"),f=e>0?d.slice(0,e):d,g=e>0?d.slice(e+1):null,h=f.indexOf("/");if(h<=0||h===f.length-1){if(m.has(f.trim().toLowerCase()))throw Error(`${JSON.stringify(a)} is no longer a pack name — ours is a pack like anyone else's now. Use ${l} instead.`);throw Error(`pack source must be owner/repo, owner/repo@tag, or a github.com URL — got ${JSON.stringify(a)}`)}return o(f.slice(0,h),f.slice(h+1),g)}function o(a,b,c){if(!a||!j.test(a))throw Error(`unsafe owner ${JSON.stringify(a)}`);if(!b||!j.test(b))throw Error(`unsafe repo ${JSON.stringify(b)}`);if(null!==c&&!k.test(c))throw Error(`unsafe tag ${JSON.stringify(c)}`);return{owner:a,repo:b,tag:c}}async function p(a){let b=`${i()}/${a.owner}/${a.repo}/releases/latest`,c=await fetch(b,{signal:AbortSignal.timeout(3e4),redirect:"manual"}),d=c.headers.get("location");if(!d)throw Error(`could not resolve the newest release of ${a.owner}/${a.repo} (GET ${b} returned ${c.status} with no redirect). That redirect is issued only for a published, non-prerelease release, so either the repository has no releases at all or every release it has is a prerelease or a draft. Name a tag explicitly.`);let e=d.match(/\/releases\/tag\/(.+)$/);if(!e)throw Error(`unexpected redirect from ${b}: ${d}`);let f=decodeURIComponent(e[1]).replace(/\/+$/,"");if(!k.test(f))throw Error(`unsafe tag ${JSON.stringify(f)} from ${b}`);return f}async function q(b,c){let d,e=c.toLowerCase(),f=`${(process.env.FAILPROOFAI_GITHUB_API??"https://api.github.com").replace(/\/+$/,"")}/repos/${b.owner}/${b.repo}/releases?per_page=100`;try{let a=(process.env.GITHUB_TOKEN||process.env.GH_TOKEN||"").trim(),b=await fetch(f,{headers:{...a?{Authorization:`Bearer ${a}`}:{},Accept:"application/vnd.github+json","X-GitHub-Api-Version":"2022-11-28","User-Agent":"failproofai"},signal:AbortSignal.timeout(3e4),redirect:"follow"});if(!b.ok)throw Error(`GET ${f} returned ${b.status}`);d=await b.json()}catch(a){throw Error(`could not resolve commit ${c} in ${b.owner}/${b.repo}: ${G(a)}. Name the release tag instead if you know it.`)}let{parseReleaseBody:g}=await a.A(49679),h=Array.isArray(d)?d:[],i=[];for(let a of h){let b="string"==typeof a.tag_name?a.tag_name:"";if(!b||!k.test(b))continue;let c=g("string"==typeof a.body?a.body:"");c.commit&&c.commit.startsWith(e)&&i.push({tag:b,commit:c.commit})}if(i.length>1)throw Error(`commit ${c} matches ${i.length} releases of ${b.owner}/${b.repo}: `+i.map(a=>`${a.tag} (${a.commit})`).join(", ")+". Name one of those tags, or type more of the commit.");return 1===i.length?i[0].tag:null}async function r(a){return null===a.tag?p(a):e.PACK_COMMIT_RE.test(a.tag)?await q(a,a.tag)??a.tag:a.tag}function s(a){return`github:${a.owner}/${a.repo}@${a.tag}`}function t(a,b){return`${i()}/${a.owner}/${a.repo}/releases/download/${a.tag}/${b}`}async function u(a){let b=await fetch(a,{signal:AbortSignal.timeout(3e4),redirect:"follow"});if(!b.ok)throw Error(`GET ${a} returned ${b.status}`);let c=b.headers.get("content-length");if(null!==c){let d=Number(c);if(Number.isFinite(d)&&d>8388608)throw await b.body?.cancel(),Error(`${a} declares ${d} bytes, over the 8388608 limit`)}if(!b.body)return Buffer.alloc(0);let d=[],e=b.body.getReader(),f=0;try{for(;;){let{done:b,value:c}=await e.read();if(b)break;if((f+=c.byteLength)>8388608)throw await e.cancel(),Error(`${a} is over the 8388608 byte limit`);d.push(Buffer.from(c))}}finally{e.releaseLock()}return Buffer.concat(d,f)}function v(a,b){for(let c of a.split("\n")){let a=c.trim().match(/^([0-9a-f]{64})\s+\*?(.+)$/i);if(a&&a[2].trim()===b)return a[1].toLowerCase()}return null}function w(a){return(0,b.createHash)("sha256").update(a).digest("hex")}function x(a,b){let e=`${a}.${process.pid}.tmp`;try{(0,c.mkdirSync)((0,d.dirname)(a),{recursive:!0}),(0,c.writeFileSync)(e,b),(0,c.renameSync)(e,a)}catch(a){throw(0,c.rmSync)(e,{force:!0}),a}}async function y(a,b={}){let c=await D(a,b);return{id:c.id,version:c.version,enabled:c.enabled,available:c.available,bundled:!1,source:c.source,tag:c.tag,resolvedFromLatest:c.resolvedFromLatest,selection:c.selection,categories:c.categories}}async function z(a){let b;if("1"===process.env.FAILPROOFAI_NO_DOWNLOAD)throw Error("FAILPROOFAI_NO_DOWNLOAD is set, so nothing can be fetched to preview");let c=n(a),d=null===c.tag,g={...c,tag:await r(c)},i=(await u(t(g,h))).toString("utf8"),j=await u(t(g,f)),k=v(i,f);if(!k)throw Error(`${h} has no entry for ${f}`);if(w(j)!==k)throw Error(`${f} failed integrity verification`);try{b=JSON.parse(j.toString("utf8"))}catch(a){throw Error(`${f} is not valid JSON: ${G(a)}`)}if(!b||"object"!=typeof b)throw Error(`${f} is not an object`);let l=b,m=(0,e.parsePackIdentity)(l);if(!Array.isArray(l.policies)||0===l.policies.length)throw Error("pack manifest declares no policies");return{id:m.id,version:m.version,effect:m.effect,...m.commit?{commit:m.commit}:{},policies:l.policies.map((a,b)=>(0,e.parsePackPolicy)(m.id,a,b)),source:s(g),resolvedFromLatest:d}}async function A(a){let b,c=(await u(t(a,h))).toString("utf8"),d=await u(t(a,f)),i=v(c,f);if(!i)throw Error(`${h} has no entry for ${f}`);if(w(d)!==i)throw Error(`${f} failed integrity verification`);let j=await u(t(a,g)),k=v(c,g);if(!k)throw Error(`${h} has no entry for ${g}`);let l=w(j);if(l!==k)throw Error(`${g} failed integrity verification`);try{b=JSON.parse(d.toString("utf8"))}catch(a){throw Error(`${f} is not valid JSON: ${G(a)}`)}if(!b||"object"!=typeof b)throw Error(`${f} is not an object`);let m=b,n=(0,e.parsePackIdentity)(m);if(!Array.isArray(m.policies)||0===m.policies.length)throw Error("pack manifest declares no policies");let o=m.policies.map((a,b)=>(0,e.parsePackPolicy)(n.id,a,b));return{id:n.id,version:n.version,policies:o,...void 0!==m.effect?{effect:n.effect}:{},...n.commit?{commit:n.commit}:{},artifact:j,artifactDigest:l}}function B(a){return a.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}async function C(b,c){let d,{loadCustomHooks:e}=await a.A(6188);try{d=(await e(b,{strict:!0})).map(a=>a.name)}catch(a){throw Error(`its artifact could not be loaded: ${a instanceof Error?a.message:String(a)}`)}let f=c.filter(a=>!d.includes(a)),g=d.filter(a=>!c.includes(a));if(f.length>0)throw Error(`its manifest declares ${f.join(", ")} but the artifact does not register ${1===f.length?"it":"them"} — that would install as protection that never runs`);if(g.length>0)throw Error(`its artifact registers undeclared ${g.join(", ")} — a policy that enforces but appears in no listing cannot be reviewed or switched off`)}async function D(a,b){var f,g,h,i;let j,k;if(process.env.FAILPROOFAI_NO_DOWNLOAD)throw Error("pack downloads are disabled (FAILPROOFAI_NO_DOWNLOAD). Already-installed packs keep enforcing.");let l=n(a),m={...l,tag:await r(l)},o=null===l.tag,p=await A(m);if(f=m.tag,g=p.version,(j=f.slice(f.lastIndexOf("/")+1))!==g&&j!==`v${g}`){let a=m.tag.slice(m.tag.lastIndexOf("/")+1).replace(/^v/,""),b=`re-tag the release ${p.version} (a leading v is fine), or rebuild the pack with --version ${a}`;throw Error(`${p.id} was not installed: release tag ${m.tag} does not match the version its manifest declares (${p.version}). `+(o?`That is the newest release of ${m.owner}/${m.repo}, so the release and the pack disagree at the source — ask the publisher to ${b}.`:`Name the tag whose manifest says ${p.version}, or fix the pack: ${b}.`))}let q=p.policies.map(a=>a.name),t=(h=p.id,i=p.artifactDigest,(k=(0,e.readInstalledPacks)().packs).find(a=>a.id===h)??k.find(a=>a.sha256===i)),{enabled:u,reason:v}=function(a,b,c,d){let e=a.map(a=>a.name);if(b?.all)return{enabled:null,reason:"all"};let f=new Set;if(b?.categories?.length){let c=new Set(b.categories.map(B)),d=new Map(a.map(a=>[B(a.category),a.category])),e=[...c].filter(a=>!d.has(a));if(e.length>0)throw Error(`no such categor${1===e.length?"y":"ies"}: ${e.join(", ")} (has: ${[...new Set(a.map(a=>B(a.category)))].join(", ")})`);for(let b of a)c.has(B(b.category))&&f.add(b.name)}if(b?.only?.length){let a=b.only.filter(a=>!e.includes(a));if(a.length>0)throw Error(`pack does not contain ${a.join(", ")}`);for(let a of b.only)f.add(a)}if(b?.only!==void 0||b?.categories?.length){if(b.merge&&d){if(null===c)return{enabled:null,reason:"carried"};for(let a of c??[])f.add(a);return{enabled:e.filter(a=>f.has(a)),reason:"added"}}return{enabled:e.filter(a=>f.has(a)),reason:"selected"}}return d?{enabled:null===c?null:c??null,reason:"carried"}:{enabled:a.filter(a=>a.defaultEnabled).map(a=>a.name),reason:"defaults"}}(p.policies,b,t?.enabled?t.enabled.filter(a=>q.includes(a)):t?.enabled,!!t),w=(0,e.packsRoot)(),y=`artifacts/${p.artifactDigest}.mjs`,z=(0,d.resolve)(w,y);(0,c.existsSync)(z)||x(z,p.artifact);try{await C(z,q)}catch(a){throw Error(`${p.id}@${p.version} was not installed: ${a instanceof Error?a.message:String(a)}`)}let D=a=>{let b=a.lastIndexOf("@");return b>a.indexOf(":")?a.slice(0,b):a};if(t&&t.id===p.id&&!t.source.startsWith("bundled:")&&D(t.source)!==D(s(m)))throw Error(`pack id ${p.id} is already installed from ${t.source}. Refusing to replace it with ${s(m)} — remove it first if that is what you mean.`);let E={id:p.id,version:p.version,source:s(m),entry:y,sha256:p.artifactDigest,policies:p.policies,...p.commit?{commit:p.commit}:{},...p.effect?{effect:p.effect}:{},...u?{enabled:u}:{},...b?.clis?{clis:b.clis}:b?.merge!==!1&&t?.clis?{clis:t.clis}:{}};return{replaced:function(a,b=!0){let f=(0,d.resolve)((0,e.packsRoot)(),"installed.json"),g=[];if((0,c.existsSync)(f))try{let a=JSON.parse((0,c.readFileSync)(f,"utf8"));Array.isArray(a.packs)&&(g=a.packs)}catch{throw Error(`existing pack manifest at ${f} is unreadable; move it aside and re-add`)}let h=g.filter(b=>b?.sha256===a.sha256&&b?.id!==a.id).map(a=>a.id);if(b&&!a.enabled){let b=g.find(a=>h.includes(a?.id)),c=b?.enabled?.filter(b=>a.policies?.some(a=>a?.name===b));c&&c.length>0&&(a.enabled=c)}let i=g.filter(a=>!h.includes(a?.id)),j=i.findIndex(b=>b?.id===a.id);return j>=0?i[j]=a:i.push(a),x(f,JSON.stringify({schemaVersion:1,packs:i},null,2)+"\n"),h}(E,"all"!==v),id:p.id,version:p.version,source:E.source,tag:m.tag,resolvedFromLatest:o,enabled:u??q,available:q,selection:v,categories:[...new Set(p.policies.map(a=>B(a.category)))],artifact:z}}function E(a){let b=a.trim(),c=b.lastIndexOf("@");return(c>0?b.slice(0,c):b).trim()}class F extends Error{candidates;constructor(a,b){super(`${b} matches ${a.length} installed packs: ${a.join(", ")}. Name one of them exactly.`),this.candidates=a,this.name="AmbiguousPackId"}}function G(a){return a instanceof Error?a.message:String(a)}a.s(["CORE_SOURCE",0,l,"PACK_CHECKSUMS_ASSET",0,h,"PACK_ENTRY_ASSET",0,g,"PACK_MANIFEST_ASSET",0,f,"addPack",0,D,"addPackFromSource",0,y,"fetchPackPreview",0,z,"removePack",0,function(a){let b,f=(0,d.resolve)((0,e.packsRoot)(),"installed.json");if(!(0,c.existsSync)(f))return null;try{b=JSON.parse((0,c.readFileSync)(f,"utf8"))}catch{return null}let g=Array.isArray(b.packs)?b.packs:[],h=g.find(b=>b?.id===E(a)),i=g.filter(b=>{var c;return b?.id&&(c=b.id,E(c).toLowerCase()===E(a).toLowerCase())});if(!h&&i.length>1)throw new F(i.map(a=>a.id).filter(a=>"string"==typeof a),a);let j=h??i[0],k=g.filter(a=>a!==j);return j&&k.length!==g.length?(x(f,JSON.stringify({schemaVersion:1,packs:k},null,2)+"\n"),j.id):null},"setPackPolicyEnabled",0,function(a,b,f){let g,h=(0,d.resolve)((0,e.packsRoot)(),"installed.json");if(!(0,c.existsSync)(h))return{ok:!1,reason:"no packs are installed"};try{g=JSON.parse((0,c.readFileSync)(h,"utf8"))}catch{return{ok:!1,reason:`pack manifest at ${h} is unreadable`}}let i=Array.isArray(g.packs)?g.packs:[],j=i.find(b=>b?.id===a);if(!j)return{ok:!1,reason:`no installed pack with id ${a}`};let k=(Array.isArray(j.policies)?j.policies:[]).map(a=>"string"==typeof a?.name?a.name:null).filter(a=>null!==a);if(!k.includes(b))return{ok:!1,reason:`pack ${a} declares no policy named ${b}`};let l=j.enabled??k,m=f?[...new Set([...l,b])]:l.filter(a=>a!==b);return j.enabled=k.filter(a=>m.includes(a)),x(h,JSON.stringify({schemaVersion:1,packs:i},null,2)+"\n"),{ok:!0}}])},1459,a=>{"use strict";a.i(1457);Symbol("failproofai.back"),Object.values({on:"✓ ON",off:"· OFF",mixed:"◐ MIXED",locked:"✓ LOCK",cloud:"✓ CLOUD",pack:"✓ PACK",failed:"▲ FAIL",observe:"◉ OBS"}).map(a=>a.length),a.s([])},91997,a=>{"use strict";let b=["SessionStart","SessionEnd","UserPromptSubmit","PreToolUse","PermissionRequest","PermissionDenied","PostToolUse","PostToolUseFailure","Notification","SubagentStart","SubagentStop","TaskCreated","TaskCompleted","Stop","StopFailure","TeammateIdle","InstructionsLoaded","ConfigChange","CwdChanged","FileChanged","WorktreeCreate","WorktreeRemove","PreCompact","PostCompact","Elicitation","ElicitationResult","UserPromptExpansion","PostToolBatch","Setup"].filter(a=>"WorktreeCreate"!==a);a.s(["ANTIGRAVITY_HOOK_EVENT_TYPES",0,["PreToolUse","PostToolUse","PreInvocation","Stop"],"ANTIGRAVITY_HOOK_SCOPES",0,["user","project"],"CLAUDE_INSTALL_EVENT_TYPES",0,b,"CODEX_EVENT_MAP",0,{session_start:"SessionStart",pre_tool_use:"PreToolUse",permission_request:"PermissionRequest",post_tool_use:"PostToolUse",user_prompt_submit:"UserPromptSubmit",stop:"Stop",subagent_start:"SubagentStart",pre_compact:"PreCompact",post_compact:"PostCompact",subagent_stop:"SubagentStop"},"CODEX_HOOK_EVENT_TYPES",0,["session_start","pre_tool_use","permission_request","post_tool_use","user_prompt_submit","stop","subagent_start","pre_compact","post_compact","subagent_stop"],"CODEX_HOOK_SCOPES",0,["user","project"],"COPILOT_HOOK_EVENT_TYPES",0,["SessionStart","SessionEnd","UserPromptSubmit","PreToolUse","PostToolUse","Stop","SubagentStop","PostToolUseFailure","ErrorOccurred","PreCompact","PermissionRequest","Notification"],"COPILOT_HOOK_SCOPES",0,["user","project"],"CURSOR_HOOK_EVENT_TYPES",0,["sessionStart","sessionEnd","beforeSubmitPrompt","preToolUse","postToolUse","stop","subagentStop"],"CURSOR_HOOK_SCOPES",0,["user","project"],"DEVIN_HOOK_EVENT_TYPES",0,["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","PermissionRequest","Stop","SessionEnd"],"DEVIN_HOOK_SCOPES",0,["user","project"],"FACTORY_HOOK_EVENT_TYPES",0,["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","Notification","Stop","SubagentStop","PreCompact","SessionEnd"],"FACTORY_HOOK_SCOPES",0,["user","project"],"FAILPROOFAI_HOOK_MARKER",0,"__failproofai_hook__","GOOSE_HOOK_EVENT_TYPES",0,["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","SessionEnd"],"GOOSE_HOOK_SCOPES",0,["user","project"],"HERMES_HOOK_EVENT_TYPES",0,["pre_tool_call","post_tool_call","on_session_start","on_session_end","subagent_stop"],"HERMES_HOOK_SCOPES",0,["user"],"HOOK_SCOPES",0,["user","project","local"],"INTEGRATION_TYPES",0,["claude","codex","copilot","cursor","opencode","pi","hermes","openclaw","factory","devin","antigravity","goose"],"OPENCLAW_HOOK_EVENT_TYPES",0,["before_tool_call","after_tool_call","before_agent_run","before_agent_finalize","session_start","session_end","subagent_ended","before_compaction"],"OPENCLAW_HOOK_SCOPES",0,["user"],"OPENCODE_HOOK_EVENT_TYPES",0,["tool.execute.before","tool.execute.after","session.created","session.deleted","session.idle","message.updated","permission.ask"],"OPENCODE_HOOK_SCOPES",0,["user","project"],"PI_HOOK_EVENT_TYPES",0,["session_start","session_shutdown","input","tool_call","user_bash","tool_result","agent_end"],"PI_HOOK_SCOPES",0,["user","project"]])}];
|
|
385
265
|
|
|
386
266
|
//# sourceMappingURL=_1es2j7i._.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
module.exports=[99910,a=>{"use strict";var b=a.i(12714),c=a.i(2157),d=a.i(60526),e=a.i(50227),f=a.i(34900),g=a.i(83397),h=a.i(92246);let i=/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/,j=new Set(["CONVERSATION_HISTORY","CHECKPOINT"]);function k(){return process.env.ANTIGRAVITY_HOME||(0,e.join)((0,d.homedir)(),".gemini","antigravity-cli")}function l(){return(0,e.join)(k(),"brain")}function m(){return(0,e.join)(".system_generated","logs","transcript_full.jsonl")}function n(a){return!!a&&"object"==typeof a&&!Array.isArray(a)}async function o(a){let d,f=function(a){if(!i.test(a))return null;let b=(0,e.join)(l(),a,m());try{if((0,c.statSync)(b).isFile())return b}catch{}return null}(a);if(!f)return null;try{d=await (0,b.readFile)(f,"utf-8")}catch{return null}let k=(0,g.parseRawLines)(d,"session"),o=function(a,b="session"){let c=[],d=new Map,e=Date.now();for(let f=0;f<a.length;f++){let i=a[f];if(!n(i))continue;let k="string"==typeof i.type?i.type:"";if(!k||j.has(k))continue;let l=function(a,b){if("number"==typeof a&&Number.isFinite(a)){if(a>1e12)return new Date(a);if(a>1e9)return new Date(1e3*a)}if("string"==typeof a){let b=Date.parse(a);if(!Number.isNaN(b))return new Date(b)}return new Date(b)}(i.created_at,e+f),m=l.toISOString(),o="number"==typeof i.step_index?i.step_index:f,p={uuid:`antigravity-${o}`,parentUuid:null},q=(0,g.baseEntry)(p,m,l,b);if("USER_INPUT"===k){let a="string"==typeof i.content?i.content:"";c.push({type:"user",...q,message:{role:"user",content:a}});continue}if("PLANNER_RESPONSE"===k){let a=[];if("string"==typeof i.content&&i.content.length>0&&a.push({type:"text",text:i.content}),Array.isArray(i.tool_calls))for(let b=0;b<i.tool_calls.length;b++){let c=i.tool_calls[b];if(!n(c))continue;let e="string"==typeof c.name?c.name:"tool",f={type:"tool_use",id:`${e}-${o}-${b}`,name:e,input:n(c.args)?c.args:{}};a.push(f);let g=e.toUpperCase(),h=d.get(g)??[];h.push({block:f,startMs:l.getTime()}),d.set(g,h)}if(0===a.length)continue;c.push({type:"assistant",...q,message:{role:"assistant",content:a}});continue}let r=d.get(k);if(r&&r.length>0){let{block:a,startMs:b}=r.shift(),c=Math.max(0,l.getTime()-b);a.result={timestamp:m,timestampFormatted:(0,g.formatTimestamp)(l),content:"string"==typeof i.content?i.content:"",durationMs:c,durationFormatted:(0,h.formatDuration)(c)};continue}c.push({type:"system",...q,raw:p})}return c.sort((a,b)=>a.timestampMs-b.timestampMs),c}(k,"session"),p=function(a){for(let b of a)if(n(b)&&Array.isArray(b.tool_calls))for(let a of b.tool_calls){if(!n(a)||!n(a.args))continue;let b=a.args.Cwd??a.args.cwd;if("string"==typeof b&&b.length>0)return b}}(k);return{entries:o,rawLines:k,cwd:p,filePath:f}}let p=(0,f.runtimeCache)(a=>o(a),60,{maxSize:50});a.s(["antigravityHome",0,k,"getAntigravitySessionLog",0,o,"getCachedAntigravitySessionLog",0,p,"listAntigravityTranscripts",0,function(){let a,b=l(),d=m(),f=[];try{a=(0,c.readdirSync)(b,{withFileTypes:!0}).filter(a=>a.isDirectory())}catch{return f}for(let g of a){let a=g.name;if(!i.test(a))continue;let h=(0,e.join)(b,a,d);try{let b=(0,c.statSync)(h);if(!b.isFile())continue;f.push({conversationId:a,transcriptPath:h,mtimeMs:b.mtimeMs,sizeBytes:b.size})}catch{}}return f}])},33559,a=>{"use strict";var b=a.i(60526),c=a.i(50227),d=a.i(94431),e=a.i(34900),f=a.i(83397),g=a.i(92246);let h=/^[A-Za-z0-9_-]+$/;function i(){return process.env.DEVIN_DB_PATH||(0,c.join)(process.env.DEVIN_HOME||(0,c.join)((0,b.homedir)(),".local","share","devin"),"cli","sessions.db")}function j(a){if("string"==typeof a&&0!==a.length)try{return JSON.parse(a)}catch{return}}function k(a){return!!a&&"object"==typeof a&&!Array.isArray(a)}function l(a){return"string"==typeof a?a:Array.isArray(a)?a.map(a=>k(a)&&"string"==typeof a.text?a.text:"").filter(Boolean).join("\n"):""}function m(a,b){if("number"==typeof a&&Number.isFinite(a)){if(a>1e12)return new Date(a);if(a>1e9)return new Date(1e3*a)}if("string"==typeof a){let b=Date.parse(a);if(!Number.isNaN(b))return new Date(b)}return new Date(b)}async function n(a){if(!a||!h.test(a))return null;let b=await (0,d.openSqliteReadonly)(i());if(!b)return null;try{let c=b.query("SELECT working_directory FROM sessions WHERE id = ?",[a]);if(0===c.length)return null;let d=c[0].working_directory,e=b.query("SELECT node_id, parent_node_id, chat_message, created_at FROM message_nodes WHERE session_id = ? ORDER BY node_id ASC",[a]),h=function(a){let b=[];for(let c of a){let a=j(c.chat_message);k(a)&&(null!=c.created_at&&null==a._created_at&&(a._created_at=c.created_at),b.push(a))}return b}(function(a){if(0===a.length)return a;let b=new Map;for(let c of a)"number"==typeof c.node_id&&b.set(c.node_id,c);let c=a.reduce((a,b)=>(a.node_id??-1)>(b.node_id??-1)?a:b),d=[],e=new Set;for(;c&&"number"==typeof c.node_id&&!e.has(c.node_id);)e.add(c.node_id),d.push(c),c=null!=c.parent_node_id?b.get(c.parent_node_id):void 0;return d.reverse()}(e)),i=function(a,b="session"){let c=[],d=new Map,e=new Map,h=Date.now();for(let i=0;i<a.length;i++){let n=a[i];if(!k(n))continue;let o="string"==typeof n.role?n.role:"system",p=function(a,b){let c=k(a.metadata)?a.metadata:void 0;return c&&null!=c.created_at?m(c.created_at,b):null!=a._created_at?m(a._created_at,b):new Date(b)}(n,h+i),q=p.toISOString(),r={uuid:null!=n.message_id?String(n.message_id):`devin-${i}`,parentUuid:null},s=(0,f.baseEntry)(r,q,p,b);if("user"===o){c.push({type:"user",...s,message:{role:"user",content:l(n.content)}});continue}if("assistant"===o){let a=[],b=l(n.content);for(let c of(b&&a.push({type:"text",text:b}),function(a){let b=Array.isArray(a)?a:j(a);if(!Array.isArray(b))return[];let c=[];for(let a of b){if(!k(a))continue;let b=k(a.function)?a.function:{},d="string"==typeof a.name?a.name:"string"==typeof b.name?b.name:"tool",e="string"==typeof a.id&&a.id||"string"==typeof a.call_id&&a.call_id||`${d}-${c.length}`,f=a.arguments??b.arguments,g=k(f)?f:j(f);c.push({id:e,name:d,input:k(g)?g:{}})}return c}(n.tool_calls))){let b={type:"tool_use",id:c.id,name:c.name,input:c.input};a.push(b),d.set(c.id,b),e.set(c.id,p.getTime())}if(0===a.length)continue;c.push({type:"assistant",...s,message:{role:"assistant",content:a,model:"string"==typeof n.model?n.model:void 0}});continue}if("tool"===o){let a="string"==typeof n.tool_call_id?n.tool_call_id:void 0,b=a?d.get(a):void 0;if(b){let c=a&&e.get(a)||p.getTime(),d=Math.max(0,p.getTime()-c);b.result={timestamp:q,timestampFormatted:(0,f.formatTimestamp)(p),content:l(n.content),durationMs:d,durationFormatted:(0,g.formatDuration)(d)};continue}}c.push({type:"system",...s,raw:r})}return c.sort((a,b)=>a.timestampMs-b.timestampMs),c}(h,"session"),n=d&&d.length>0?d:void 0;return{entries:i,rawLines:h,cwd:n,filePath:`devin-db://${a}`}}catch{return null}finally{b.close()}}let o=(0,e.runtimeCache)(a=>n(a),2,{maxSize:50});a.s(["devinDbPath",0,i,"devinEpochToMs",0,function(a){if("number"==typeof a&&Number.isFinite(a)){if(a>1e12)return a;if(a>1e9)return 1e3*a}return Date.now()},"getCachedDevinSessionLog",0,o])},89901,a=>{"use strict";var b=a.i(12714),c=a.i(2157),d=a.i(60526),e=a.i(50227),f=a.i(90798),g=a.i(34900),h=a.i(83397),i=a.i(92246);let j=/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;function k(a){return!!a&&"object"==typeof a&&!Array.isArray(a)}function l(a){return"string"==typeof a?a:Array.isArray(a)?a.map(a=>k(a)&&"string"==typeof a.text?a.text:"").filter(Boolean).join("\n"):""}function m(){let a,b=(0,e.join)(process.env.FACTORY_HOME||(0,e.join)((0,d.homedir)(),".factory"),"sessions"),g=[];try{a=(0,c.readdirSync)(b,{withFileTypes:!0}).filter(a=>a.isDirectory())}catch{return g}for(let d of a){let a,h=d.name,i=(0,f.decodeFolderName)(h),k=(0,e.join)(b,h);try{a=(0,c.readdirSync)(k)}catch{continue}for(let b of a){if(!b.endsWith(".jsonl"))continue;let a=b.slice(0,-6);if(!j.test(a))continue;let d=(0,e.join)(k,b);try{let b=(0,c.statSync)(d);g.push({projectName:h,cwd:i,sessionId:a,transcriptPath:d,mtimeMs:b.mtimeMs,sizeBytes:b.size})}catch{}}}return g}async function n(a){let c,d,e=function(a){if(!j.test(a))return null;for(let b of m())if(b.sessionId===a)return b.transcriptPath;return null}(a);if(!e)return null;try{c=await (0,b.readFile)(e,"utf-8")}catch{return null}let f=(0,h.parseRawLines)(c,"session"),g=function(a,b="session"){let c=[],d=new Map,e=new Map,f=Date.now();for(let g=0;g<a.length;g++){let j=a[g];if(!k(j)||"message"!==j.type)continue;let m=k(j.message)?j.message:void 0;if(!m)continue;let n="string"==typeof m.role?m.role:"system",o=function(a,b){if("number"==typeof a&&Number.isFinite(a)){if(a>1e12)return new Date(a);if(a>1e9)return new Date(1e3*a)}if("string"==typeof a){let b=Date.parse(a);if(!Number.isNaN(b))return new Date(b)}return new Date(b)}(j.timestamp??m.timestamp,f+g),p=o.toISOString(),q={uuid:null!=j.id?String(j.id):`factory-${g}`,parentUuid:null!=j.parentId?String(j.parentId):null},r=(0,h.baseEntry)(q,p,o,b),s=m.content;if("assistant"===n){let a=[];if(Array.isArray(s)){for(let b of s)if(k(b)){if("text"===b.type&&"string"==typeof b.text)a.push({type:"text",text:b.text});else if("tool_use"===b.type){let c="string"==typeof b.id?b.id:`${String(b.name??"tool")}-${a.length}`,f={type:"tool_use",id:c,name:"string"==typeof b.name?b.name:"tool",input:k(b.input)?b.input:{}};a.push(f),d.set(c,f),e.set(c,o.getTime())}}}else{let b=l(s);b&&a.push({type:"text",text:b})}if(0===a.length)continue;c.push({type:"assistant",...r,message:{role:"assistant",content:a,model:"string"==typeof m.model?m.model:void 0}});continue}if(Array.isArray(s)){let a=!1,b=[];for(let c of s)if(k(c)){if("tool_result"===c.type){let b="string"==typeof c.tool_use_id?c.tool_use_id:"string"==typeof c.toolUseId?c.toolUseId:void 0,f=b?d.get(b):void 0;if(f){let d=b&&e.get(b)||o.getTime(),g=Math.max(0,o.getTime()-d);f.result={timestamp:p,timestampFormatted:(0,h.formatTimestamp)(o),content:l(c.content),durationMs:g,durationFormatted:(0,i.formatDuration)(g)},a=!0;continue}}"text"===c.type&&"string"==typeof c.text&&b.push(c.text)}b.length>0?c.push({type:"user",...r,message:{role:"user",content:b.join("\n")}}):a||c.push({type:"system",...r,raw:q});continue}if("user"===n){c.push({type:"user",...r,message:{role:"user",content:l(s)}});continue}c.push({type:"system",...r,raw:q})}return c.sort((a,b)=>a.timestampMs-b.timestampMs),c}(f,"session");for(let a of f)if(k(a)&&"session_start"===a.type&&"string"==typeof a.cwd&&a.cwd.length>0){d=a.cwd;break}return{entries:g,rawLines:f,cwd:d,filePath:e}}let o=(0,g.runtimeCache)(a=>n(a),60,{maxSize:50});a.s(["getCachedFactorySessionLog",0,o,"getFactorySessionLog",0,n,"listFactoryTranscripts",0,m])},74615,a=>{"use strict";var b=a.i(60526),c=a.i(50227),d=a.i(94431),e=a.i(34900),f=a.i(83397),g=a.i(92246);let h=/^\d{8}_\d+$/;function i(){return process.env.GOOSE_DB_PATH||(0,c.join)(function(){if(process.env.GOOSE_HOME)return process.env.GOOSE_HOME;let a=process.env.XDG_DATA_HOME;return(0,c.join)(a&&a.length>0?a:(0,c.join)((0,b.homedir)(),".local","share"),"goose")}(),"sessions","sessions.db")}function j(a){if("number"==typeof a&&Number.isFinite(a)){if(a>1e12)return a;if(a>1e9)return 1e3*a}if("string"==typeof a&&a.length>0){let b=Date.parse(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(a)?a.replace(" ","T")+"Z":a);if(!Number.isNaN(b))return b}return Date.now()}function k(a){return!!a&&"object"==typeof a&&!Array.isArray(a)}function l(a){return"string"==typeof a?a:Array.isArray(a)?a.map(a=>k(a)&&"string"==typeof a.text?a.text:"").filter(Boolean).join("\n"):""}async function m(a){if(!a||!h.test(a))return null;let b=await (0,d.openSqliteReadonly)(i());if(!b)return null;try{let c=b.query("SELECT working_dir FROM sessions WHERE id = ?",[a]);if(0===c.length)return null;let d=c[0].working_dir,e=b.query("SELECT role, content_json, created_timestamp FROM messages WHERE session_id = ? ORDER BY id ASC",[a]),h=function(a,b="session"){let c=[],d=new Map,e=new Map,h=Date.now();for(let i=0;i<a.length;i++){let m=a[i],n=function(a){if("string"==typeof a&&0!==a.length)try{return JSON.parse(a)}catch{return}}(m.content_json);if(!Array.isArray(n))continue;let o="string"==typeof m.role?m.role:"system",p=function(a,b){let c="number"==typeof a||"string"==typeof a?j(a):NaN;return new Date(Number.isNaN(c)?b:c)}(m.created_timestamp,h+i),q=p.toISOString(),r={uuid:`goose-${i}`,parentUuid:null},s=(0,f.baseEntry)(r,q,p,b),t=[],u=[],v=[];for(let a of n)k(a)&&("text"===a.type&&"string"==typeof a.text?t.push(a.text):"toolRequest"===a.type?u.push(a):"toolResponse"===a.type&&v.push(a));for(let a of v){let b="string"==typeof a.id?a.id:void 0,c=b?d.get(b):void 0;if(!c)continue;let h=b&&e.get(b)||p.getTime(),i=Math.max(0,p.getTime()-h);c.result={timestamp:q,timestampFormatted:(0,f.formatTimestamp)(p),content:function(a){let b=(k(a.toolResult)?a.toolResult:{}).value;return k(b)&&Array.isArray(b.content)?l(b.content):"string"==typeof b?b:Array.isArray(b)?l(b):""}(a),durationMs:i,durationFormatted:(0,g.formatDuration)(i)}}let w=t.join("\n").trim();if(u.length>0||"assistant"===o&&w){let a=[];for(let b of(w&&a.push({type:"text",text:w}),u)){let{id:c,name:f,input:g}=function(a,b){let c="string"==typeof a.id&&a.id?a.id:`goose-tool-${b}`,d=k(a.toolCall)?a.toolCall:{},e=k(d.value)?d.value:{},f="string"==typeof e.name?e.name:"tool";return{id:c,name:f,input:k(e.arguments)?e.arguments:{}}}(b,a.length),h={type:"tool_use",id:c,name:f,input:g};a.push(h),d.set(c,h),e.set(c,p.getTime())}if(0===a.length)continue;c.push({type:"assistant",...s,message:{role:"assistant",content:a}});continue}if("user"===o&&w){c.push({type:"user",...s,message:{role:"user",content:w}});continue}w&&c.push({type:"system",...s,raw:r})}return c.sort((a,b)=>a.timestampMs-b.timestampMs),c}(e,"session"),i=d&&d.length>0?d:void 0;return{entries:h,rawLines:e,cwd:i,filePath:`goose-db://${a}`}}catch{return null}finally{b.close()}}let n=(0,e.runtimeCache)(a=>m(a),2,{maxSize:50});a.s(["getCachedGooseSessionLog",0,n,"gooseDbPath",0,i,"gooseTimestampToMs",0,j])},43600,a=>{"use strict";var b=a.i(2157),c=a.i(60526),d=a.i(50227);let e="profiles",f="default";function g(){let a=(process.env.HERMES_HOME||"").trim();if(a){let b=(0,d.resolve)(a),c=(0,d.dirname)(b);return(0,d.basename)(c)===e?(0,d.dirname)(c):b}return(0,d.join)((0,c.homedir)(),".hermes")}function h(){let a,c=g(),h=[{name:f,home:c}],i=new Set([f]);try{a=(0,b.readdirSync)((0,d.join)(c,e),{withFileTypes:!0}).filter(a=>(a.isDirectory()||a.isSymbolicLink())&&!a.name.startsWith(".")).map(a=>a.name).sort()}catch{return h}for(let b of a)i.has(b)||(i.add(b),h.push({name:b,home:(0,d.join)(c,e,b)}));return h}a.s(["HERMES_DEFAULT_PROFILE",0,f,"hermesProjectName",0,function(a,b){return`hermes-${a}-${b}`},"hermesProjectNameCandidates",0,function(a){if(!a.startsWith("hermes-"))return[];let b=a.slice(7);if(!b)return[];let c=[];for(let a of h().map(a=>a.name).sort((a,b)=>b.length-a.length)){let d=`${a}-`;b.startsWith(d)&&b.length>d.length&&c.push({profile:a,source:b.slice(d.length)})}return c.push({profile:f,source:b}),c},"hermesProjectPath",0,function(a,b){return`hermes:${a}:${b}`},"hermesRoot",0,g,"listHermesProfiles",0,h])},54563,a=>{"use strict";var b=a.i(50227),c=a.i(94431),d=a.i(43600),e=a.i(34900),f=a.i(83397),g=a.i(92246);function h(){let a=process.env.HERMES_DB_PATH;return a?[{profile:d.HERMES_DEFAULT_PROFILE,dbPath:a}]:(0,d.listHermesProfiles)().map(a=>({profile:a.name,dbPath:(0,b.join)(a.home,"state.db")}))}function i(a){if("string"==typeof a&&0!==a.length)try{return JSON.parse(a)}catch{return}}function j(a){return!!a&&"object"==typeof a&&!Array.isArray(a)}function k(a){return"string"==typeof a?a:Array.isArray(a)?a.map(a=>j(a)&&"string"==typeof a.text?a.text:"").filter(Boolean).join("\n"):""}async function l(a){if(!a||!/^[A-Za-z0-9_-]+$/.test(a))return null;for(let{profile:b,dbPath:c}of h()){let d=await m(c,b,a);if(d)return d}return null}async function m(a,b,e){let h=await (0,c.openSqliteReadonly)(a);if(!h)return null;try{let a=h.query("SELECT source, cwd FROM sessions WHERE id = ?",[e]);if(0===a.length)return null;let{source:c,cwd:l}=a[0],m=h.query("SELECT id, role, content, tool_call_id, tool_calls, tool_name, timestamp FROM messages WHERE session_id = ? ORDER BY timestamp ASC",[e]),n=function(a,b="session"){let c=[],d=new Map,e=new Map,h=Date.now();for(let l=0;l<a.length;l++){let m=a[l];if(!j(m))continue;let n="string"==typeof m.role?m.role:"system",o=function(a,b){if("number"==typeof a&&Number.isFinite(a)){if(a>1e12)return new Date(a);if(a>1e9)return new Date(1e3*a)}if("string"==typeof a){let b=Date.parse(a);if(!Number.isNaN(b))return new Date(b)}return new Date(b)}(m.timestamp??m.time_created,h+l),p=o.toISOString(),q={uuid:null!=m.id?String(m.id):`hermes-${l}`,parentUuid:null},r=(0,f.baseEntry)(q,p,o,b);if("user"===n){c.push({type:"user",...r,message:{role:"user",content:k(m.content)}});continue}if("assistant"===n){let a=[],b=k(m.content);for(let c of(b&&a.push({type:"text",text:b}),function(a){let b=Array.isArray(a)?a:i(a);if(!Array.isArray(b))return[];let c=[];for(let a of b){if(!j(a))continue;let b=j(a.function)?a.function:{},d="string"==typeof b.name?b.name:"string"==typeof a.name?a.name:"tool",e="string"==typeof a.id&&a.id||"string"==typeof a.call_id&&a.call_id||`${d}-${c.length}`,f=j(b.arguments)?b.arguments:i(b.arguments);c.push({id:e,name:d,input:j(f)?f:{}})}return c}(m.tool_calls))){let b={type:"tool_use",id:c.id,name:c.name,input:c.input};a.push(b),d.set(c.id,b),e.set(c.id,o.getTime())}if(0===a.length)continue;c.push({type:"assistant",...r,message:{role:"assistant",content:a}});continue}if("tool"===n){let a="string"==typeof m.tool_call_id?m.tool_call_id:void 0,b=a?d.get(a):void 0;if(b){let c=a&&e.get(a)||o.getTime(),d=Math.max(0,o.getTime()-c);b.result={timestamp:p,timestampFormatted:(0,f.formatTimestamp)(o),content:k(m.content),durationMs:d,durationFormatted:(0,g.formatDuration)(d)};continue}}c.push({type:"system",...r,raw:q})}return c.sort((a,b)=>a.timestampMs-b.timestampMs),c}(m,"session"),o=l&&l.length>0?l:c?(0,d.hermesProjectPath)(b,c):void 0;return{entries:n,rawLines:m,cwd:o,filePath:`hermes://${e}`,profile:b}}catch{return null}finally{h.close()}}let n=(0,e.runtimeCache)(a=>l(a),2,{maxSize:50});a.s(["epochToMs",0,function(a){if("number"==typeof a&&Number.isFinite(a)){if(a>1e12)return a;if(a>1e9)return 1e3*a}return Date.now()},"getCachedHermesSessionLog",0,n,"hermesDbPaths",0,h])},87488,a=>{"use strict";var b=a.i(12714),c=a.i(2157),d=a.i(60526),e=a.i(50227),f=a.i(34900),g=a.i(83397),h=a.i(92246);let i=/^[0-9a-fA-F-]{36}$/;function j(){return process.env.OPENCLAW_HOME||(0,e.join)((0,d.homedir)(),".openclaw")}function k(a){return!!a&&"object"==typeof a&&!Array.isArray(a)}function l(a){return"string"==typeof a?a:Array.isArray(a)?a.map(a=>k(a)&&"string"==typeof a.text?a.text:"").filter(Boolean).join("\n"):""}function m(){let a,b=(0,e.join)(j(),"agents"),d=[];try{a=(0,c.readdirSync)(b,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name)}catch{return d}for(let f of a){let a,g=(0,e.join)(b,f,"sessions");try{a=(0,c.readdirSync)(g)}catch{continue}for(let b of a){if(!b.endsWith(".jsonl")||b.endsWith(".trajectory.jsonl"))continue;let a=b.slice(0,-6);if(!i.test(a))continue;let h=(0,e.join)(g,b);try{let b=(0,c.statSync)(h);d.push({agentId:f,sessionId:a,transcriptPath:h,mtimeMs:b.mtimeMs,sizeBytes:b.size})}catch{}}}return d}async function n(a){let c,d,e=function(a){if(!i.test(a))return null;for(let b of m())if(b.sessionId===a)return b.transcriptPath;return null}(a);if(!e)return null;try{c=await (0,b.readFile)(e,"utf-8")}catch{return null}let f=(0,g.parseRawLines)(c,"session"),j=function(a,b="session"){let c=[],d=new Map,e=new Map,f=Date.now();for(let i=0;i<a.length;i++){let j=a[i];if(!k(j)||"message"!==j.type)continue;let m=k(j.message)?j.message:void 0;if(!m)continue;let n="string"==typeof m.role?m.role:"system",o=function(a,b){if("number"==typeof a&&Number.isFinite(a)){if(a>1e12)return new Date(a);if(a>1e9)return new Date(1e3*a)}if("string"==typeof a){let b=Date.parse(a);if(!Number.isNaN(b))return new Date(b)}return new Date(b)}(j.timestamp??m.timestamp,f+i),p=o.toISOString(),q={uuid:null!=j.id?String(j.id):`openclaw-${i}`,parentUuid:null!=j.parentId?String(j.parentId):null},r=(0,g.baseEntry)(q,p,o,b);if("user"===n){c.push({type:"user",...r,message:{role:"user",content:l(m.content)}});continue}if("assistant"===n){let a=[],b=m.content;if(Array.isArray(b)){for(let c of b)if(k(c)){if("text"===c.type&&"string"==typeof c.text)a.push({type:"text",text:c.text});else if("toolCall"===c.type){let b="string"==typeof c.id?c.id:`${String(c.name??"tool")}-${a.length}`,f={type:"tool_use",id:b,name:"string"==typeof c.name?c.name:"tool",input:k(c.arguments)?c.arguments:{}};a.push(f),d.set(b,f),e.set(b,o.getTime())}}}else{let c=l(b);c&&a.push({type:"text",text:c})}if(0===a.length)continue;c.push({type:"assistant",...r,message:{role:"assistant",content:a,model:"string"==typeof m.model?m.model:void 0}});continue}if("toolResult"===n){let a="string"==typeof m.toolCallId?m.toolCallId:void 0,b=a?d.get(a):void 0;if(b){let c=k(m.details)?m.details:void 0,d=a&&e.get(a)||o.getTime(),f=c&&"number"==typeof c.durationMs?c.durationMs:Math.max(0,o.getTime()-d);b.result={timestamp:p,timestampFormatted:(0,g.formatTimestamp)(o),content:l(m.content),durationMs:f,durationFormatted:(0,h.formatDuration)(f)};continue}}c.push({type:"system",...r,raw:q})}return c.sort((a,b)=>a.timestampMs-b.timestampMs),c}(f,"session");for(let a of f)if(k(a)&&"session"===a.type&&"string"==typeof a.cwd&&a.cwd.length>0){d=a.cwd;break}return{entries:j,rawLines:f,cwd:d,filePath:e}}let o=(0,f.runtimeCache)(a=>n(a),2,{maxSize:50});a.s(["getCachedOpenClawSessionLog",0,o,"listOpenClawAgents",0,function(){try{return(0,c.readdirSync)((0,e.join)(j(),"agents"),{withFileTypes:!0}).filter(a=>a.isDirectory()&&!a.name.startsWith(".")).map(a=>a.name).sort()}catch{return[]}},"listOpenClawTranscripts",0,m,"openclawHome",0,j])},84794,a=>{"use strict";var b=a.i(60526),c=a.i(50227),d=a.i(94431);async function e(a){let e=await (0,d.openSqliteReadonly)(function(){if(process.env.OPENCODE_DB_PATH)return process.env.OPENCODE_DB_PATH;let a=process.env.OPENCODE_HOME??(0,c.join)((0,b.homedir)(),".local","share","opencode");return(0,c.join)(a,"opencode.db")}());if(!e)return null;try{return a(e)}catch{return null}finally{try{e.close()}catch{}}}async function f(a,b=[]){return e(c=>c.query(a,b))}a.s(["queryOpenCodeDb",0,f,"withOpenCodeDb",0,e])},64240,(a,b,c)=>{"use strict";function d(a){if("function"!=typeof WeakMap)return null;var b=new WeakMap,c=new WeakMap;return(d=function(a){return a?c:b})(a)}c._=function(a,b){if(!b&&a&&a.__esModule)return a;if(null===a||"object"!=typeof a&&"function"!=typeof a)return{default:a};var c=d(b);if(c&&c.has(a))return c.get(a);var e={__proto__:null},f=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var g in a)if("default"!==g&&Object.prototype.hasOwnProperty.call(a,g)){var h=f?Object.getOwnPropertyDescriptor(a,g):null;h&&(h.get||h.set)?Object.defineProperty(e,g,h):e[g]=a[g]}return e.default=a,c&&c.set(a,e),e}},84707,(a,b,c)=>{let{createClientModuleProxy:d}=a.r(11857);a.n(d("[project]/node_modules/next/dist/client/app-dir/link.js"))},97647,a=>{"use strict";var b=a.i(84707);a.n(b)},95936,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={default:function(){return i},useLinkStatus:function(){return h.useLinkStatus}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});let f=a.r(64240),g=a.r(7997),h=f._(a.r(97647));function i(a){let b=a.legacyBehavior,c="string"==typeof a.children||"number"==typeof a.children||"string"==typeof a.children?.type,d=a.children?.type?.$$typeof===Symbol.for("react.client.reference");return!b||c||d||(a.children?.type?.$$typeof===Symbol.for("react.lazy")?console.error("Using a Lazy Component as a direct child of `<Link legacyBehavior>` from a Server Component is not supported. If you need legacyBehavior, wrap your Lazy Component in a Client Component that renders the Link's `<a>` tag."):console.error("Using a Server Component as a direct child of `<Link legacyBehavior>` is not supported. If you need legacyBehavior, wrap your Server Component in a Client Component that renders the Link's `<a>` tag.")),(0,g.jsx)(h.default,{...a})}("function"==typeof c.default||"object"==typeof c.default&&null!==c.default)&&void 0===c.default.__esModule&&(Object.defineProperty(c.default,"__esModule",{value:!0}),Object.assign(c.default,c),b.exports=c.default)}];
|
|
2
2
|
|
|
3
|
-
//# sourceMappingURL=
|
|
3
|
+
//# sourceMappingURL=_1if9ixi._.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[21776,a=>{"use strict";var b=a.i(36359),c=a.i(7292);a.s([],84740),a.i(84740),a.s(["
|
|
1
|
+
module.exports=[21776,a=>{"use strict";var b=a.i(36359),c=a.i(7292);a.s([],84740),a.i(84740),a.s(["000ae5b9f039195740b0697383b66ef36475abe12d",()=>b.getTelemetryConfig,"60d4b56a98077468792db89d8812f1e5e786583628",()=>c.searchHookActivityAction],21776)},2726,a=>{a.v(b=>Promise.all(["server/chunks/ssr/[externals]__0vmspq5._.js","server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js"].map(b=>a.l(b))).then(()=>b(74493)))}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=_1u8-lu2._.js.map
|