failproofai 0.0.13-beta.0 → 0.0.13-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 +3 -3
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +1 -1
- 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 +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 +2 -2
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +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/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/audit/invite/route.js +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/run/route.js +3 -2
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login-request/route.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-verify/route.js +2 -2
- package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +2 -2
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js +2 -2
- package/.next/standalone/.next/server/app/api/auth/reminder/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route.js +2 -2
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
- package/.next/standalone/.next/server/app/audit/page.js +1 -1
- package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/page.js +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/server-reference-manifest.json +8 -8
- package/.next/standalone/.next/server/app/policies/page.js +2 -2
- 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/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page.js +3 -2
- package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/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 +3 -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/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/projects/page.js +2 -2
- package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_0xu5z._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cefjd9._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ekj92q._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0hv08mx._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0obaznk._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xvsnvt._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__12v-lma._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__136y39g._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13h8pzr._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1fwl2mz._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1hkdkmz._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1i9rknc._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1mrihkj._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1myjm-d._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0cycwg6._.js → [root-of-the-server]__1tvn4wf._.js} +2 -2
- package/.next/standalone/.next/server/chunks/_1z062h5._.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_17k9e3w.js +5 -5
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__015_i4t._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__03lv-pe._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04bqvos._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0bbpv2d._.js → [root-of-the-server]__09u1pcy._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dqgs96._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1uvfwgr._.js → [root-of-the-server]__0hdsupo._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0q5rfxg._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qeuy9c._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qukut7._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s89hoe._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ehe24g._.js → [root-of-the-server]__0ynf7tx._.js} +3 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__170799-._.js +245 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1d8omgc._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ql-mch._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1-m1rhq._.js → [root-of-the-server]__1rlmypf._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1tkjqka._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/_05whahf._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0ul5rf_._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_11_p9y8._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_11v0g3z._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_1p0-leb._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -1
- 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/lib_hermes-projects_ts_05b8-it._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_html-to-image_es_index_1u91ynr.js → node_modules_html-to-image_es_index_09fe3kb.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1ezd2jf._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1tnuifj._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- 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 +10 -10
- package/.next/standalone/.next/static/chunks/{39rn602wszcbd.js → 06cw8nbn5c4_r.js} +1 -1
- package/.next/standalone/.next/static/chunks/0fa7j157kg9_d.js +1 -0
- package/.next/standalone/.next/static/chunks/{03zg3ms7uaoq3.js → 0i0joc040j999.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1h569gia53ant.js → 0l2n5ftar65ox.js} +1 -1
- package/.next/standalone/.next/static/chunks/1c8i78p7t1i-5.js +1 -0
- package/.next/standalone/.next/static/chunks/{2ks4pzu5b-l_q.js → 1sg8kx5szx42y.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3jka0hvhqouyv.js → 23t-i9s-q--nu.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0byua6ng1f_ka.js → 25qvspmcbb_5y.js} +1 -1
- package/.next/standalone/.next/static/chunks/25s52un3k_wht.css +2 -0
- package/.next/standalone/.next/static/chunks/{41mhnhfkmglpp.js → 2a-k91nsa1lgf.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0azkpcy8eb1gr.js → 2oz8ok8fzxaj3.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1zxtyef-iqede.js → 2rkvn4znvuy4o.js} +1 -1
- package/.next/standalone/app/components/sessions-list.tsx +19 -0
- package/.next/standalone/app/project/[name]/page.tsx +9 -4
- package/.next/standalone/app/project/[name]/session/[sessionId]/page.tsx +26 -5
- package/.next/standalone/assets/logos/hermes-dark.svg +1 -0
- package/.next/standalone/assets/logos/hermes-light.svg +1 -0
- package/.next/standalone/lib/cli-registry.ts +6 -1
- package/.next/standalone/lib/download-session.ts +16 -0
- package/.next/standalone/lib/hermes-projects.ts +164 -0
- package/.next/standalone/lib/hermes-sessions.ts +273 -0
- package/.next/standalone/lib/projects.ts +14 -3
- package/.next/standalone/lib/sqlite-reader.ts +102 -0
- package/.next/standalone/package.json +5 -3
- package/.next/standalone/server.js +1 -1
- package/README.md +10 -1
- package/bin/failproofai.mjs +17 -16
- package/dist/cli.mjs +7774 -225
- package/lib/cli-registry.ts +6 -1
- package/lib/download-session.ts +16 -0
- package/lib/hermes-projects.ts +164 -0
- package/lib/hermes-sessions.ts +273 -0
- package/lib/projects.ts +14 -3
- package/lib/sql-js-asm.d.ts +26 -0
- package/lib/sqlite-reader.ts +102 -0
- package/package.json +5 -3
- package/src/audit/cli-adapters/hermes.ts +58 -0
- package/src/audit/cli-adapters/index.ts +6 -0
- package/src/hooks/builtin-policies.ts +16 -0
- package/src/hooks/handler.ts +8 -0
- package/src/hooks/install-prompt.ts +7 -3
- package/src/hooks/integrations.ts +179 -5
- package/src/hooks/policy-evaluator.ts +42 -0
- package/src/hooks/resolve-transcript-path.ts +4 -0
- package/src/hooks/tool-name-canonicalize.ts +6 -0
- package/src/hooks/types.ts +67 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0dwpg-h._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0lnenda._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13i_sva._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1_mqemn._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1m2_4t0._.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_0-tu4ot._.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_0ttxbz7._.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_1bnh1y0._.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_1epycqa._.js +0 -3
- package/.next/standalone/.next/server/chunks/node_modules_1wpdcgo._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0808sha._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e4-6d8._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0f62vu9._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g253ve._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0k65l27._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vxf0_g._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12mcauo._.js +0 -4
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1e-x7j4._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1mt35_w._.js +0 -221
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1pcxxwg._.js +0 -4
- package/.next/standalone/.next/static/chunks/0f7d7hnbh4djs.js +0 -1
- package/.next/standalone/.next/static/chunks/1o0xa47736gi9.css +0 -2
- package/.next/standalone/.next/static/chunks/2wbuxnsvux4di.js +0 -1
- /package/.next/standalone/.next/static/{W6ELw5VwHTFy2amS2px6e → HgG0mizCfOM3XyN1EW-sL}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{W6ELw5VwHTFy2amS2px6e → HgG0mizCfOM3XyN1EW-sL}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{W6ELw5VwHTFy2amS2px6e → HgG0mizCfOM3XyN1EW-sL}/_ssgManifest.js +0 -0
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
module.exports=[74533,(a,b,c)=>{b.exports=a.x("node:child_process",()=>require("node:child_process"))},50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},60526,(a,b,c)=>{b.exports=a.x("node:os",()=>require("node:os"))},2157,(a,b,c)=>{b.exports=a.x("node:fs",()=>require("node:fs"))},66680,(a,b,c)=>{b.exports=a.x("node:crypto",()=>require("node:crypto"))},37936,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"registerServerReference",{enumerable:!0,get:function(){return d.registerServerReference}});let d=a.r(11857)},12072,(a,b,c)=>{b.exports={name:"failproofai",version:"0.0.13-beta.0",description:"The easiest way to manage policies that keep your AI agents reliable, on-task, and running autonomously — for Claude Code & the Agents SDK",bin:{failproofai:"./dist/cli.mjs"},files:["bin/","src/","scripts/","lib/","pi-extension/",".next/standalone/","dist/","README.md"],engines:{node:">=20.9.0",bun:">=1.3.0"},scripts:{predev:"bun run build:cli && bun link",dev:"FAILPROOFAI_TELEMETRY_DISABLED=1 bun scripts/dev.ts --port 8020","build:cli":"bun build --target=node --format=esm --outfile=dist/cli.mjs bin/failproofai.mjs --external posthog-node && node -e \"const fs=require('fs');const c=fs.readFileSync('dist/cli.mjs','utf8');fs.writeFileSync('dist/cli.mjs',c.replace('#!/usr/bin/env bun','#!/usr/bin/env node').replace('// @bun\\n',''))\"",build:"bun build --target=node --format=cjs --outfile=dist/index.js src/index.ts && bun run build:cli && bun --bun next build && node -e \"const {cpSync}=require('fs');cpSync('.next/static','.next/standalone/.next/static',{recursive:true});\" && node scripts/prune-standalone.mjs",prestart:"bun run build:cli && bun link",start:"FAILPROOFAI_TELEMETRY_DISABLED=1 bun scripts/start.ts",test:"vitest","test:run":"vitest run",lint:"eslint . --config eslint.config.mjs",postinstall:"node scripts/postinstall.mjs",preuninstall:"node scripts/preuninstall.mjs",prepare:"bun run build","test:e2e":"vitest run --config vitest.config.e2e.mts","test:e2e:watch":"vitest --config vitest.config.e2e.mts",translate:"bun scripts/translate-docs/cli.ts","translate:readme":"bun scripts/translate-docs/cli.ts --readme-only","translate:docs":"bun scripts/translate-docs/cli.ts --docs-only","translate:dry-run":"bun scripts/translate-docs/cli.ts --dry-run","translate:validate":"bun scripts/translate-docs/cli.ts --validate","validate:mdx":"bun scripts/validate-mdx.ts"},keywords:["claude","claude-code","claude-agents-sdk","anthropic","ai-agent","agent-reliability","agent-monitoring","autonomous-agent","failure-prevention","developer-tools","devtools","cli","local-first","hooks","policies"],author:"ExosphereHost Inc. <failproofai@exosphere.host>",license:"SEE LICENSE IN LICENSE",homepage:"https://github.com/FailproofAI/failproofai",repository:{type:"git",url:"https://github.com/FailproofAI/failproofai.git"},bugs:{url:"https://github.com/FailproofAI/failproofai/issues"},publishConfig:{access:"public"},devDependencies:{"@anthropic-ai/sdk":"^0.110.0","@mdx-js/mdx":"^3.1.1","@tailwindcss/postcss":"^4.3.1","@tanstack/react-virtual":"^3.14.3","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@testing-library/user-event":"^14.6.1","@types/node":"26.1.0","@types/react":"19.2.17","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1",clsx:"^2.1.1",eslint:"^10.5.0","eslint-config-next":"^16.2.9",jsdom:"^29.1.1","lucide-react":"^1.18.0",next:"^16.2.9",react:"^19.2.4","react-dom":"^19.2.4","tailwind-merge":"^3.4.0",tailwindcss:"^4.3.1",typescript:"6.0.3",vitest:"^4.1.9"},dependencies:{"html-to-image":"^1.11.13",html2canvas:"^1.4.1","posthog-node":"^5.37.1"},overrides:{postcss:"8.5.14","eslint-plugin-react-hooks":"7.0.1",vite:"8.0.16",undici:"7.28.0"}}},13095,(a,b,c)=>{"use strict";function d(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
|
|
2
|
-
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ensureServerEntryExports",{enumerable:!0,get:function(){return d}})},36359,69839,79779,a=>{"use strict";let b;var c=a.i(37936),d=a.i(2157),e=a.i(50227),f=a.i(60526),g=a.i(66680);a.i(74533);let h=e.default.join(f.default.homedir(),".failproofai"),i=e.default.join(h,"instance-id");function j(a){return g.default.createHmac("sha256","failproofai-telemetry-v1").update(a).digest("hex")}function k(){if(b)return b;let a=function(){try{for(let a of(f.default.platform(),["/etc/machine-id","/var/lib/dbus/machine-id"]))try{let b=d.default.readFileSync(a,"utf-8").trim();if(b)return b}catch{}}catch{}}();if(a)return b=j(a);let c=[f.default.hostname(),f.default.homedir(),f.default.platform(),f.default.arch(),f.default.cpus()[0]?.model??""].join(":");return b=c?j(c):function(){try{let a=d.default.readFileSync(i,"utf-8").trim();if(a)return a}catch{}let a=g.default.randomUUID();try{d.default.mkdirSync(h,{recursive:!0}),d.default.writeFileSync(i,a,"utf-8")}catch{}return a}()}a.s(["getInstanceId",0,k,"hashToId",0,j],69839),a.s(["POSTHOG_API_KEY",0,"phc_Ac1Ww1GqKc0z1SyrRWbmatEeQdlOQIsDEEdP8l8JRgX","POSTHOG_PRODUCT",0,"failproofai-oss"],79779);var l=a.i(12072);async function m(){let a="1"!==process.env.FAILPROOFAI_TELEMETRY_DISABLED;return{enabled:a,distinctId:a?k():"",apiKey:process.env.FAILPROOFAI_POSTHOG_KEY??"phc_Ac1Ww1GqKc0z1SyrRWbmatEeQdlOQIsDEEdP8l8JRgX",host:process.env.FAILPROOFAI_POSTHOG_HOST??"https://us.i.posthog.com",version:l.version}}(0,a.i(13095).ensureServerEntryExports)([m]),(0,c.registerServerReference)(m,"002043545864f67de0561dce1d8f496b97ff0978b5",null),a.s(["getTelemetryConfig",0,m],36359)},165,a=>{"use strict";var b=a.i(36359);a.s([],84833),a.i(84833),a.s(["002043545864f67de0561dce1d8f496b97ff0978b5",()=>b.getTelemetryConfig],165)},2726,a=>{a.v(b=>Promise.all(["server/chunks/ssr/[externals]__1_g_b3t._.js","server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js"].map(b=>a.l(b))).then(()=>b(74493)))}];
|
|
3
|
-
|
|
4
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__0g253ve._.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[46786,(a,b,c)=>{b.exports=a.x("os",()=>require("os"))},12714,(a,b,c)=>{b.exports=a.x("node:fs/promises",()=>require("node:fs/promises"))},24868,(a,b,c)=>{b.exports=a.x("fs/promises",()=>require("fs/promises"))},93695,(a,b,c)=>{b.exports=a.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},71306,(a,b,c)=>{b.exports=a.r(18622)},79847,a=>{a.n(a.i(3343))},9185,a=>{a.n(a.i(29432))},72842,a=>{a.n(a.i(75164))},54897,a=>{a.n(a.i(30106))},56157,a=>{a.n(a.i(18970))},94331,a=>{a.n(a.i(60644))},15988,a=>{a.n(a.i(56952))},25766,a=>{a.n(a.i(77341))},29725,a=>{a.n(a.i(94290))},90833,a=>{a.n(a.i(46994))},5785,a=>{a.n(a.i(90588))},74793,a=>{a.n(a.i(33169))},85826,a=>{a.n(a.i(37111))},21565,a=>{a.n(a.i(41763))},65911,a=>{a.n(a.i(8950))},25128,a=>{a.n(a.i(91562))},40781,a=>{a.n(a.i(49670))},69411,a=>{a.n(a.i(75700))},63081,a=>{a.n(a.i(276))},62837,a=>{a.n(a.i(40795))},34607,a=>{a.n(a.i(11614))},96338,a=>{a.n(a.i(21751))},50642,a=>{a.n(a.i(12213))},32242,a=>{a.n(a.i(22693))},88530,a=>{a.n(a.i(10531))},8583,a=>{a.n(a.i(1082))},38534,a=>{a.n(a.i(98175))},70408,a=>{a.n(a.i(9095))},22922,a=>{a.n(a.i(96772))},78294,a=>{a.n(a.i(71717))},16625,a=>{a.n(a.i(85034))},88648,a=>{a.n(a.i(68113))},51914,a=>{a.n(a.i(66482))},25466,a=>{a.n(a.i(91505))},90798,a=>{"use strict";var b=a.i(46786),c=a.i(14747);a.s(["decodeFolderName",0,function(a){return/^[A-Za-z]--/.test(a)?a[0]+":/"+a.slice(3).replace(/-/g,"/"):a.replace(/-/g,"/")},"encodeFolderName",0,function(a){let b=/^([A-Za-z]):[\\/](.*)$/.exec(a);return b?b[1]+"--"+b[2].replace(/[\\/]/g,"-"):a.replace(/[\\/]/g,"-")},"getClaudeProjectsPath",0,function(){let a=process.env.CLAUDE_PROJECTS_PATH;return a||(0,c.join)((0,b.homedir)(),".claude","projects")}])},34900,a=>{"use strict";a.s(["runtimeCache",0,function(a,b,c){let d=new Map,e=new Map,f=c?.maxSize;return async(...c)=>{let g=JSON.stringify(c),h=d.get(g);if(h&&Date.now()<h.expiry)return h.data;let i=e.get(g);if(i)return i;let j=a(...c).then(a=>{if(e.delete(g),f&&d.size>=f){let a=d.keys().next().value;d.delete(a)}return d.set(g,{data:a,expiry:Date.now()+1e3*b}),a},a=>{throw e.delete(g),a});return e.set(g,j),j}}])},76668,a=>{"use strict";let b=1;function c(a){return`[failproofai${new Date().toISOString()}] ${a}`}a.s(["logError",0,function(a,b){void 0!==b?console.error(c("ERROR"),a,b):console.error(c("ERROR"),a)},"logWarn",0,function(a,d){b>=b&&(void 0!==d?console.warn(c("WARN"),a,d):console.warn(c("WARN"),a))}])},33432,a=>{"use strict";a.s(["formatDate",0,function(a){return new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0}).format(a)}])},26192,a=>{"use strict";async function b(a,b){let c=Array(a.length),d=0;async function e(){for(;d<a.length;){let b=d++;try{c[b]={status:"fulfilled",value:await a[b]()}}catch(a){c[b]={status:"rejected",reason:a}}}}let f=Array.from({length:Math.min(b,a.length)},()=>e());return await Promise.all(f),c}a.s(["batchAll",0,b])},24282,a=>{"use strict";let b={claude:{id:"claude",label:"Claude Code",badgeClasses:"bg-orange-500/10 text-orange-400 border-orange-500/20"},codex:{id:"codex",label:"OpenAI Codex",badgeClasses:"bg-purple-500/10 text-purple-400 border-purple-500/20"},copilot:{id:"copilot",label:"GitHub Copilot",badgeClasses:"bg-blue-500/10 text-blue-400 border-blue-500/20"},cursor:{id:"cursor",label:"Cursor Agent",badgeClasses:"bg-emerald-500/10 text-emerald-400 border-emerald-500/20"},opencode:{id:"opencode",label:"OpenCode",badgeClasses:"bg-amber-500/10 text-amber-400 border-amber-500/20"},pi:{id:"pi",label:"Pi",badgeClasses:"bg-pink-500/10 text-pink-400 border-pink-500/20"},gemini:{id:"gemini",label:"Gemini CLI",badgeClasses:"bg-sky-500/10 text-sky-400 border-sky-500/20"}};a.s(["getCliBadgeClasses",0,function(a){return b[a]?.badgeClasses??b.claude.badgeClasses},"getCliLabel",0,function(a){return b[a]?.label??a}])},69191,a=>{"use strict";var b=a.i(12714),c=a.i(50227),d=a.i(90798),e=a.i(34900),f=a.i(26192),g=a.i(76668),h=a.i(33432);async function i(a,c){try{return(await (0,b.stat)(a)).mtime}catch(a){return(0,g.logWarn)(`Failed to stat ${c}:`,a),new Date(0)}}async function j(a){try{if(!(await (0,b.stat)(a)).isDirectory())return null;return await (0,b.readdir)(a,{withFileTypes:!0})}catch{return null}}async function k(){try{let a=(0,d.getClaudeProjectsPath)(),b=await j(a);if(!b)return[];let e=(await (0,f.batchAll)(b.filter(a=>a.isDirectory()).map(b=>async()=>{let d=(0,c.join)(a,b.name),e=await i(d,b.name);return{name:b.name,path:d,isDirectory:!0,lastModified:e,lastModifiedFormatted:(0,h.formatDate)(e),cli:["claude"]}}),16)).filter(a=>"fulfilled"===a.status).map(a=>a.value);return e.sort((a,b)=>b.lastModified.getTime()-a.lastModified.getTime()),e}catch(a){return(0,g.logError)("Error reading Claude project folders:",a),[]}}async function l(){let[{getCodexProjects:b},{getCopilotProjects:c},{getCursorProjects:d},{getOpenCodeProjects:e},{getPiProjects:f},{getGeminiProjects:h}]=await Promise.all([a.A(93658),a.A(60956),a.A(26244),a.A(2164),a.A(92351),a.A(26396)]),[i,j,l,m,n,o,p]=await Promise.all([k(),b().catch(a=>((0,g.logError)("Error reading Codex projects:",a),[])),c().catch(a=>((0,g.logError)("Error reading Copilot projects:",a),[])),d().catch(a=>((0,g.logError)("Error reading Cursor projects:",a),[])),e().catch(a=>((0,g.logError)("Error reading OpenCode projects:",a),[])),f().catch(a=>((0,g.logError)("Error reading Pi projects:",a),[])),h().catch(a=>((0,g.logError)("Error reading Gemini projects:",a),[]))]);return function(...a){let b=new Map;for(let c of a)for(let a of c){let c=b.get(a.name);if(!c){b.set(a.name,{...a,cli:[...a.cli]});continue}let d=[...c.cli];for(let b of a.cli)d.includes(b)||d.push(b);let e=a.lastModified.getTime()>c.lastModified.getTime()?a:c;b.set(a.name,{...c,cli:d,lastModified:e.lastModified,lastModifiedFormatted:e.lastModifiedFormatted})}let c=Array.from(b.values());return c.sort((a,b)=>b.lastModified.getTime()-a.lastModified.getTime()),c}(i,j,l,m,n,o,p)}function m(a){let b=a.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i);return b?b[0]:void 0}async function n(a){try{let b=await j(a);if(!b)return[];let d=b.filter(a=>a.isFile()&&a.name.endsWith(".jsonl")&&m(a.name)),e=(await (0,f.batchAll)(d.map(b=>async()=>{let d=(0,c.join)(a,b.name),e=await i(d,b.name);return{name:b.name,path:d,lastModified:e,lastModifiedFormatted:(0,h.formatDate)(e),sessionId:m(b.name),cli:"claude"}}),16)).filter(a=>"fulfilled"===a.status).map(a=>a.value);return e.sort((a,b)=>b.lastModified.getTime()-a.lastModified.getTime()),e}catch(a){return(0,g.logError)("Error reading session files:",a),[]}}let o=(0,e.runtimeCache)(l,30),p=(0,e.runtimeCache)(a=>n(a),30);a.s(["UUID_RE",0,/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/,"getCachedProjectFolders",0,o,"getCachedSessionFiles",0,p,"resolveProjectPath",0,function(a){if(!a)throw RangeError("Empty project name");if(/^[/\\]/.test(a))throw RangeError("Absolute project name");let b=(0,c.resolve)((0,d.getClaudeProjectsPath)()),e=(0,c.resolve)((0,c.join)(b,a));if(!e.startsWith(b+c.sep))throw RangeError("Project path escapes root");return 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}},790,(a,b,c)=>{let{createClientModuleProxy:d}=a.r(11857);a.n(d("[project]/node_modules/next/dist/client/app-dir/link.js <module evaluation>"))},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";a.i(790);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)},93658,a=>{a.v(b=>Promise.all(["server/chunks/ssr/lib_codex-projects_ts_0pqlw37._.js"].map(b=>a.l(b))).then(()=>b(1024)))},60956,a=>{a.v(b=>Promise.all(["server/chunks/ssr/lib_copilot-projects_ts_19wl7tp._.js"].map(b=>a.l(b))).then(()=>b(88890)))},26244,a=>{a.v(b=>Promise.all(["server/chunks/ssr/lib_cursor-projects_ts_18-iwyk._.js"].map(b=>a.l(b))).then(()=>b(93087)))},2164,a=>{a.v(b=>Promise.all(["server/chunks/ssr/lib_opencode-projects_ts_15bjxkm._.js"].map(b=>a.l(b))).then(()=>b(64458)))},92351,a=>{a.v(b=>Promise.all(["server/chunks/ssr/lib_pi-projects_ts_1wikofb._.js"].map(b=>a.l(b))).then(()=>b(2727)))},26396,a=>{a.v(b=>Promise.all(["server/chunks/ssr/lib_gemini-projects_ts_1c7bgx-._.js"].map(b=>a.l(b))).then(()=>b(62074)))}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__0k65l27._.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
module.exports=[74533,(a,b,c)=>{b.exports=a.x("node:child_process",()=>require("node:child_process"))},50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},60526,(a,b,c)=>{b.exports=a.x("node:os",()=>require("node:os"))},2157,(a,b,c)=>{b.exports=a.x("node:fs",()=>require("node:fs"))},66680,(a,b,c)=>{b.exports=a.x("node:crypto",()=>require("node:crypto"))},37936,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"registerServerReference",{enumerable:!0,get:function(){return d.registerServerReference}});let d=a.r(11857)},12072,(a,b,c)=>{b.exports={name:"failproofai",version:"0.0.13-beta.0",description:"The easiest way to manage policies that keep your AI agents reliable, on-task, and running autonomously — for Claude Code & the Agents SDK",bin:{failproofai:"./dist/cli.mjs"},files:["bin/","src/","scripts/","lib/","pi-extension/",".next/standalone/","dist/","README.md"],engines:{node:">=20.9.0",bun:">=1.3.0"},scripts:{predev:"bun run build:cli && bun link",dev:"FAILPROOFAI_TELEMETRY_DISABLED=1 bun scripts/dev.ts --port 8020","build:cli":"bun build --target=node --format=esm --outfile=dist/cli.mjs bin/failproofai.mjs --external posthog-node && node -e \"const fs=require('fs');const c=fs.readFileSync('dist/cli.mjs','utf8');fs.writeFileSync('dist/cli.mjs',c.replace('#!/usr/bin/env bun','#!/usr/bin/env node').replace('// @bun\\n',''))\"",build:"bun build --target=node --format=cjs --outfile=dist/index.js src/index.ts && bun run build:cli && bun --bun next build && node -e \"const {cpSync}=require('fs');cpSync('.next/static','.next/standalone/.next/static',{recursive:true});\" && node scripts/prune-standalone.mjs",prestart:"bun run build:cli && bun link",start:"FAILPROOFAI_TELEMETRY_DISABLED=1 bun scripts/start.ts",test:"vitest","test:run":"vitest run",lint:"eslint . --config eslint.config.mjs",postinstall:"node scripts/postinstall.mjs",preuninstall:"node scripts/preuninstall.mjs",prepare:"bun run build","test:e2e":"vitest run --config vitest.config.e2e.mts","test:e2e:watch":"vitest --config vitest.config.e2e.mts",translate:"bun scripts/translate-docs/cli.ts","translate:readme":"bun scripts/translate-docs/cli.ts --readme-only","translate:docs":"bun scripts/translate-docs/cli.ts --docs-only","translate:dry-run":"bun scripts/translate-docs/cli.ts --dry-run","translate:validate":"bun scripts/translate-docs/cli.ts --validate","validate:mdx":"bun scripts/validate-mdx.ts"},keywords:["claude","claude-code","claude-agents-sdk","anthropic","ai-agent","agent-reliability","agent-monitoring","autonomous-agent","failure-prevention","developer-tools","devtools","cli","local-first","hooks","policies"],author:"ExosphereHost Inc. <failproofai@exosphere.host>",license:"SEE LICENSE IN LICENSE",homepage:"https://github.com/FailproofAI/failproofai",repository:{type:"git",url:"https://github.com/FailproofAI/failproofai.git"},bugs:{url:"https://github.com/FailproofAI/failproofai/issues"},publishConfig:{access:"public"},devDependencies:{"@anthropic-ai/sdk":"^0.110.0","@mdx-js/mdx":"^3.1.1","@tailwindcss/postcss":"^4.3.1","@tanstack/react-virtual":"^3.14.3","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@testing-library/user-event":"^14.6.1","@types/node":"26.1.0","@types/react":"19.2.17","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1",clsx:"^2.1.1",eslint:"^10.5.0","eslint-config-next":"^16.2.9",jsdom:"^29.1.1","lucide-react":"^1.18.0",next:"^16.2.9",react:"^19.2.4","react-dom":"^19.2.4","tailwind-merge":"^3.4.0",tailwindcss:"^4.3.1",typescript:"6.0.3",vitest:"^4.1.9"},dependencies:{"html-to-image":"^1.11.13",html2canvas:"^1.4.1","posthog-node":"^5.37.1"},overrides:{postcss:"8.5.14","eslint-plugin-react-hooks":"7.0.1",vite:"8.0.16",undici:"7.28.0"}}},13095,(a,b,c)=>{"use strict";function d(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
|
|
2
|
-
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ensureServerEntryExports",{enumerable:!0,get:function(){return d}})},36359,69839,79779,a=>{"use strict";let b;var c=a.i(37936),d=a.i(2157),e=a.i(50227),f=a.i(60526),g=a.i(66680);a.i(74533);let h=e.default.join(f.default.homedir(),".failproofai"),i=e.default.join(h,"instance-id");function j(a){return g.default.createHmac("sha256","failproofai-telemetry-v1").update(a).digest("hex")}function k(){if(b)return b;let a=function(){try{for(let a of(f.default.platform(),["/etc/machine-id","/var/lib/dbus/machine-id"]))try{let b=d.default.readFileSync(a,"utf-8").trim();if(b)return b}catch{}}catch{}}();if(a)return b=j(a);let c=[f.default.hostname(),f.default.homedir(),f.default.platform(),f.default.arch(),f.default.cpus()[0]?.model??""].join(":");return b=c?j(c):function(){try{let a=d.default.readFileSync(i,"utf-8").trim();if(a)return a}catch{}let a=g.default.randomUUID();try{d.default.mkdirSync(h,{recursive:!0}),d.default.writeFileSync(i,a,"utf-8")}catch{}return a}()}a.s(["getInstanceId",0,k,"hashToId",0,j],69839),a.s(["POSTHOG_API_KEY",0,"phc_Ac1Ww1GqKc0z1SyrRWbmatEeQdlOQIsDEEdP8l8JRgX","POSTHOG_PRODUCT",0,"failproofai-oss"],79779);var l=a.i(12072);async function m(){let a="1"!==process.env.FAILPROOFAI_TELEMETRY_DISABLED;return{enabled:a,distinctId:a?k():"",apiKey:process.env.FAILPROOFAI_POSTHOG_KEY??"phc_Ac1Ww1GqKc0z1SyrRWbmatEeQdlOQIsDEEdP8l8JRgX",host:process.env.FAILPROOFAI_POSTHOG_HOST??"https://us.i.posthog.com",version:l.version}}(0,a.i(13095).ensureServerEntryExports)([m]),(0,c.registerServerReference)(m,"002043545864f67de0561dce1d8f496b97ff0978b5",null),a.s(["getTelemetryConfig",0,m],36359)},24190,a=>{"use strict";var b=a.i(36359);a.s([],40488),a.i(40488),a.s(["002043545864f67de0561dce1d8f496b97ff0978b5",()=>b.getTelemetryConfig],24190)},2726,a=>{a.v(b=>Promise.all(["server/chunks/ssr/[externals]__1_g_b3t._.js","server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js"].map(b=>a.l(b))).then(()=>b(74493)))}];
|
|
3
|
-
|
|
4
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__0vxf0_g._.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
module.exports=[74533,(a,b,c)=>{b.exports=a.x("node:child_process",()=>require("node:child_process"))},50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},60526,(a,b,c)=>{b.exports=a.x("node:os",()=>require("node:os"))},2157,(a,b,c)=>{b.exports=a.x("node:fs",()=>require("node:fs"))},66680,(a,b,c)=>{b.exports=a.x("node:crypto",()=>require("node:crypto"))},37936,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"registerServerReference",{enumerable:!0,get:function(){return d.registerServerReference}});let d=a.r(11857)},12072,(a,b,c)=>{b.exports={name:"failproofai",version:"0.0.13-beta.0",description:"The easiest way to manage policies that keep your AI agents reliable, on-task, and running autonomously — for Claude Code & the Agents SDK",bin:{failproofai:"./dist/cli.mjs"},files:["bin/","src/","scripts/","lib/","pi-extension/",".next/standalone/","dist/","README.md"],engines:{node:">=20.9.0",bun:">=1.3.0"},scripts:{predev:"bun run build:cli && bun link",dev:"FAILPROOFAI_TELEMETRY_DISABLED=1 bun scripts/dev.ts --port 8020","build:cli":"bun build --target=node --format=esm --outfile=dist/cli.mjs bin/failproofai.mjs --external posthog-node && node -e \"const fs=require('fs');const c=fs.readFileSync('dist/cli.mjs','utf8');fs.writeFileSync('dist/cli.mjs',c.replace('#!/usr/bin/env bun','#!/usr/bin/env node').replace('// @bun\\n',''))\"",build:"bun build --target=node --format=cjs --outfile=dist/index.js src/index.ts && bun run build:cli && bun --bun next build && node -e \"const {cpSync}=require('fs');cpSync('.next/static','.next/standalone/.next/static',{recursive:true});\" && node scripts/prune-standalone.mjs",prestart:"bun run build:cli && bun link",start:"FAILPROOFAI_TELEMETRY_DISABLED=1 bun scripts/start.ts",test:"vitest","test:run":"vitest run",lint:"eslint . --config eslint.config.mjs",postinstall:"node scripts/postinstall.mjs",preuninstall:"node scripts/preuninstall.mjs",prepare:"bun run build","test:e2e":"vitest run --config vitest.config.e2e.mts","test:e2e:watch":"vitest --config vitest.config.e2e.mts",translate:"bun scripts/translate-docs/cli.ts","translate:readme":"bun scripts/translate-docs/cli.ts --readme-only","translate:docs":"bun scripts/translate-docs/cli.ts --docs-only","translate:dry-run":"bun scripts/translate-docs/cli.ts --dry-run","translate:validate":"bun scripts/translate-docs/cli.ts --validate","validate:mdx":"bun scripts/validate-mdx.ts"},keywords:["claude","claude-code","claude-agents-sdk","anthropic","ai-agent","agent-reliability","agent-monitoring","autonomous-agent","failure-prevention","developer-tools","devtools","cli","local-first","hooks","policies"],author:"ExosphereHost Inc. <failproofai@exosphere.host>",license:"SEE LICENSE IN LICENSE",homepage:"https://github.com/FailproofAI/failproofai",repository:{type:"git",url:"https://github.com/FailproofAI/failproofai.git"},bugs:{url:"https://github.com/FailproofAI/failproofai/issues"},publishConfig:{access:"public"},devDependencies:{"@anthropic-ai/sdk":"^0.110.0","@mdx-js/mdx":"^3.1.1","@tailwindcss/postcss":"^4.3.1","@tanstack/react-virtual":"^3.14.3","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@testing-library/user-event":"^14.6.1","@types/node":"26.1.0","@types/react":"19.2.17","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1",clsx:"^2.1.1",eslint:"^10.5.0","eslint-config-next":"^16.2.9",jsdom:"^29.1.1","lucide-react":"^1.18.0",next:"^16.2.9",react:"^19.2.4","react-dom":"^19.2.4","tailwind-merge":"^3.4.0",tailwindcss:"^4.3.1",typescript:"6.0.3",vitest:"^4.1.9"},dependencies:{"html-to-image":"^1.11.13",html2canvas:"^1.4.1","posthog-node":"^5.37.1"},overrides:{postcss:"8.5.14","eslint-plugin-react-hooks":"7.0.1",vite:"8.0.16",undici:"7.28.0"}}},13095,(a,b,c)=>{"use strict";function d(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
|
|
2
|
-
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ensureServerEntryExports",{enumerable:!0,get:function(){return d}})},36359,69839,79779,a=>{"use strict";let b;var c=a.i(37936),d=a.i(2157),e=a.i(50227),f=a.i(60526),g=a.i(66680);a.i(74533);let h=e.default.join(f.default.homedir(),".failproofai"),i=e.default.join(h,"instance-id");function j(a){return g.default.createHmac("sha256","failproofai-telemetry-v1").update(a).digest("hex")}function k(){if(b)return b;let a=function(){try{for(let a of(f.default.platform(),["/etc/machine-id","/var/lib/dbus/machine-id"]))try{let b=d.default.readFileSync(a,"utf-8").trim();if(b)return b}catch{}}catch{}}();if(a)return b=j(a);let c=[f.default.hostname(),f.default.homedir(),f.default.platform(),f.default.arch(),f.default.cpus()[0]?.model??""].join(":");return b=c?j(c):function(){try{let a=d.default.readFileSync(i,"utf-8").trim();if(a)return a}catch{}let a=g.default.randomUUID();try{d.default.mkdirSync(h,{recursive:!0}),d.default.writeFileSync(i,a,"utf-8")}catch{}return a}()}a.s(["getInstanceId",0,k,"hashToId",0,j],69839),a.s(["POSTHOG_API_KEY",0,"phc_Ac1Ww1GqKc0z1SyrRWbmatEeQdlOQIsDEEdP8l8JRgX","POSTHOG_PRODUCT",0,"failproofai-oss"],79779);var l=a.i(12072);async function m(){let a="1"!==process.env.FAILPROOFAI_TELEMETRY_DISABLED;return{enabled:a,distinctId:a?k():"",apiKey:process.env.FAILPROOFAI_POSTHOG_KEY??"phc_Ac1Ww1GqKc0z1SyrRWbmatEeQdlOQIsDEEdP8l8JRgX",host:process.env.FAILPROOFAI_POSTHOG_HOST??"https://us.i.posthog.com",version:l.version}}(0,a.i(13095).ensureServerEntryExports)([m]),(0,c.registerServerReference)(m,"002043545864f67de0561dce1d8f496b97ff0978b5",null),a.s(["getTelemetryConfig",0,m],36359)},26035,a=>{"use strict";var b=a.i(36359);a.s([],19459),a.i(19459),a.s(["002043545864f67de0561dce1d8f496b97ff0978b5",()=>b.getTelemetryConfig],26035)},2726,a=>{a.v(b=>Promise.all(["server/chunks/ssr/[externals]__1_g_b3t._.js","server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js"].map(b=>a.l(b))).then(()=>b(74493)))}];
|
|
3
|
-
|
|
4
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__12mcauo._.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
module.exports=[93695,(a,b,c)=>{b.exports=a.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},71306,(a,b,c)=>{b.exports=a.r(18622)},79847,a=>{a.n(a.i(3343))},9185,a=>{a.n(a.i(29432))},72842,a=>{a.n(a.i(75164))},54897,a=>{a.n(a.i(30106))},56157,a=>{a.n(a.i(18970))},94331,a=>{a.n(a.i(60644))},15988,a=>{a.n(a.i(56952))},25766,a=>{a.n(a.i(77341))},29725,a=>{a.n(a.i(94290))},90833,a=>{a.n(a.i(46994))},5785,a=>{a.n(a.i(90588))},74793,a=>{a.n(a.i(33169))},85826,a=>{a.n(a.i(37111))},21565,a=>{a.n(a.i(41763))},65911,a=>{a.n(a.i(8950))},25128,a=>{a.n(a.i(91562))},40781,a=>{a.n(a.i(49670))},69411,a=>{a.n(a.i(75700))},63081,a=>{a.n(a.i(276))},62837,a=>{a.n(a.i(40795))},34607,a=>{a.n(a.i(11614))},96338,a=>{a.n(a.i(21751))},50642,a=>{a.n(a.i(12213))},32242,a=>{a.n(a.i(22693))},88530,a=>{a.n(a.i(10531))},8583,a=>{a.n(a.i(1082))},38534,a=>{a.n(a.i(98175))},70408,a=>{a.n(a.i(9095))},22922,a=>{a.n(a.i(96772))},78294,a=>{a.n(a.i(71717))},16625,a=>{a.n(a.i(85034))},88648,a=>{a.n(a.i(68113))},51914,a=>{a.n(a.i(66482))},25466,a=>{a.n(a.i(91505))},46786,(a,b,c)=>{b.exports=a.x("os",()=>require("os"))},12714,(a,b,c)=>{b.exports=a.x("node:fs/promises",()=>require("node:fs/promises"))},90798,a=>{"use strict";var b=a.i(46786),c=a.i(14747);a.s(["decodeFolderName",0,function(a){return/^[A-Za-z]--/.test(a)?a[0]+":/"+a.slice(3).replace(/-/g,"/"):a.replace(/-/g,"/")},"encodeFolderName",0,function(a){let b=/^([A-Za-z]):[\\/](.*)$/.exec(a);return b?b[1]+"--"+b[2].replace(/[\\/]/g,"-"):a.replace(/[\\/]/g,"-")},"getClaudeProjectsPath",0,function(){let a=process.env.CLAUDE_PROJECTS_PATH;return a||(0,c.join)((0,b.homedir)(),".claude","projects")}])},34900,a=>{"use strict";a.s(["runtimeCache",0,function(a,b,c){let d=new Map,e=new Map,f=c?.maxSize;return async(...c)=>{let g=JSON.stringify(c),h=d.get(g);if(h&&Date.now()<h.expiry)return h.data;let i=e.get(g);if(i)return i;let j=a(...c).then(a=>{if(e.delete(g),f&&d.size>=f){let a=d.keys().next().value;d.delete(a)}return d.set(g,{data:a,expiry:Date.now()+1e3*b}),a},a=>{throw e.delete(g),a});return e.set(g,j),j}}])},76668,a=>{"use strict";let b=1;function c(a){return`[failproofai${new Date().toISOString()}] ${a}`}a.s(["logError",0,function(a,b){void 0!==b?console.error(c("ERROR"),a,b):console.error(c("ERROR"),a)},"logWarn",0,function(a,d){b>=b&&(void 0!==d?console.warn(c("WARN"),a,d):console.warn(c("WARN"),a))}])},33432,a=>{"use strict";a.s(["formatDate",0,function(a){return new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0}).format(a)}])},26192,a=>{"use strict";async function b(a,b){let c=Array(a.length),d=0;async function e(){for(;d<a.length;){let b=d++;try{c[b]={status:"fulfilled",value:await a[b]()}}catch(a){c[b]={status:"rejected",reason:a}}}}let f=Array.from({length:Math.min(b,a.length)},()=>e());return await Promise.all(f),c}a.s(["batchAll",0,b])},69191,a=>{"use strict";var b=a.i(12714),c=a.i(50227),d=a.i(90798),e=a.i(34900),f=a.i(26192),g=a.i(76668),h=a.i(33432);async function i(a,c){try{return(await (0,b.stat)(a)).mtime}catch(a){return(0,g.logWarn)(`Failed to stat ${c}:`,a),new Date(0)}}async function j(a){try{if(!(await (0,b.stat)(a)).isDirectory())return null;return await (0,b.readdir)(a,{withFileTypes:!0})}catch{return null}}async function k(){try{let a=(0,d.getClaudeProjectsPath)(),b=await j(a);if(!b)return[];let e=(await (0,f.batchAll)(b.filter(a=>a.isDirectory()).map(b=>async()=>{let d=(0,c.join)(a,b.name),e=await i(d,b.name);return{name:b.name,path:d,isDirectory:!0,lastModified:e,lastModifiedFormatted:(0,h.formatDate)(e),cli:["claude"]}}),16)).filter(a=>"fulfilled"===a.status).map(a=>a.value);return e.sort((a,b)=>b.lastModified.getTime()-a.lastModified.getTime()),e}catch(a){return(0,g.logError)("Error reading Claude project folders:",a),[]}}async function l(){let[{getCodexProjects:b},{getCopilotProjects:c},{getCursorProjects:d},{getOpenCodeProjects:e},{getPiProjects:f},{getGeminiProjects:h}]=await Promise.all([a.A(93658),a.A(60956),a.A(26244),a.A(2164),a.A(92351),a.A(26396)]),[i,j,l,m,n,o,p]=await Promise.all([k(),b().catch(a=>((0,g.logError)("Error reading Codex projects:",a),[])),c().catch(a=>((0,g.logError)("Error reading Copilot projects:",a),[])),d().catch(a=>((0,g.logError)("Error reading Cursor projects:",a),[])),e().catch(a=>((0,g.logError)("Error reading OpenCode projects:",a),[])),f().catch(a=>((0,g.logError)("Error reading Pi projects:",a),[])),h().catch(a=>((0,g.logError)("Error reading Gemini projects:",a),[]))]);return function(...a){let b=new Map;for(let c of a)for(let a of c){let c=b.get(a.name);if(!c){b.set(a.name,{...a,cli:[...a.cli]});continue}let d=[...c.cli];for(let b of a.cli)d.includes(b)||d.push(b);let e=a.lastModified.getTime()>c.lastModified.getTime()?a:c;b.set(a.name,{...c,cli:d,lastModified:e.lastModified,lastModifiedFormatted:e.lastModifiedFormatted})}let c=Array.from(b.values());return c.sort((a,b)=>b.lastModified.getTime()-a.lastModified.getTime()),c}(i,j,l,m,n,o,p)}function m(a){let b=a.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i);return b?b[0]:void 0}async function n(a){try{let b=await j(a);if(!b)return[];let d=b.filter(a=>a.isFile()&&a.name.endsWith(".jsonl")&&m(a.name)),e=(await (0,f.batchAll)(d.map(b=>async()=>{let d=(0,c.join)(a,b.name),e=await i(d,b.name);return{name:b.name,path:d,lastModified:e,lastModifiedFormatted:(0,h.formatDate)(e),sessionId:m(b.name),cli:"claude"}}),16)).filter(a=>"fulfilled"===a.status).map(a=>a.value);return e.sort((a,b)=>b.lastModified.getTime()-a.lastModified.getTime()),e}catch(a){return(0,g.logError)("Error reading session files:",a),[]}}let o=(0,e.runtimeCache)(l,30),p=(0,e.runtimeCache)(a=>n(a),30);a.s(["UUID_RE",0,/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/,"getCachedProjectFolders",0,o,"getCachedSessionFiles",0,p,"resolveProjectPath",0,function(a){if(!a)throw RangeError("Empty project name");if(/^[/\\]/.test(a))throw RangeError("Absolute project name");let b=(0,c.resolve)((0,d.getClaudeProjectsPath)()),e=(0,c.resolve)((0,c.join)(b,a));if(!e.startsWith(b+c.sep))throw RangeError("Project path escapes root");return e}])},82165,a=>{"use strict";a.s(["default",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call the default export of [project]/app/components/project-list.tsx <module evaluation> from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/app/components/project-list.tsx <module evaluation>","default")},92887,a=>{"use strict";a.s(["default",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call the default export of [project]/app/components/project-list.tsx from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/app/components/project-list.tsx","default")},17048,a=>{"use strict";a.i(82165);var b=a.i(92887);a.n(b)},61594,a=>{"use strict";var b=a.i(7997),c=a.i(717);a.i(70396);var d=a.i(73727),e=a.i(69191),f=a.i(17048);async function g(){(process.env.FAILPROOFAI_DISABLE_PAGES??"").split(",").map(a=>a.trim()).filter(Boolean).includes("projects")&&(0,d.notFound)();let a=await (0,e.getCachedProjectFolders)(),g=a.length;return(0,b.jsx)("main",{className:"report",children:(0,b.jsxs)("section",{className:"section","data-screen-label":"projects",children:[(0,b.jsx)("h2",{style:{fontFamily:"var(--font-mono)",fontSize:24,fontWeight:600,letterSpacing:"-0.01em",color:"var(--ink)",margin:"0 0 24px"},children:"Projects"}),0===g?(0,b.jsxs)("div",{className:"panel",style:{textAlign:"center",padding:"56px 32px"},children:[(0,b.jsx)("div",{"aria-hidden":"true",style:{marginBottom:20},children:(0,b.jsx)("div",{style:{display:"inline-grid",gridTemplateColumns:"repeat(6, 10px)",gridTemplateRows:"repeat(6, 10px)",gap:2,padding:12,border:"1px solid var(--line-2)",background:"var(--bg)"},children:Array.from({length:36}).map((a,c)=>{let d=[0,5,30,35,7,10,25,28].includes(c);return(0,b.jsx)("span",{style:{background:d?"var(--dim)":"transparent"}},c)})})}),(0,b.jsxs)("p",{style:{color:"var(--ink-2)",marginBottom:8},children:["No projects found in the ",(0,b.jsx)("code",{children:".claude/projects"})," directory."]}),(0,b.jsx)("p",{style:{color:"var(--dim)",fontSize:12,letterSpacing:"0.05em"},children:"Run an agent in any folder and it will show up here."})]}):(0,b.jsx)("div",{className:"panel",style:{padding:0},children:(0,b.jsx)(c.Suspense,{children:(0,b.jsx)(f.default,{folders:a})})})]})})}a.s(["default",0,g,"dynamic",0,"force-dynamic"])},19057,a=>{a.n(a.i(61594))},93658,a=>{a.v(b=>Promise.all(["server/chunks/ssr/lib_codex-projects_ts_0pqlw37._.js"].map(b=>a.l(b))).then(()=>b(1024)))},60956,a=>{a.v(b=>Promise.all(["server/chunks/ssr/lib_copilot-projects_ts_19wl7tp._.js"].map(b=>a.l(b))).then(()=>b(88890)))},26244,a=>{a.v(b=>Promise.all(["server/chunks/ssr/lib_cursor-projects_ts_18-iwyk._.js"].map(b=>a.l(b))).then(()=>b(93087)))},2164,a=>{a.v(b=>Promise.all(["server/chunks/ssr/lib_opencode-projects_ts_15bjxkm._.js"].map(b=>a.l(b))).then(()=>b(64458)))},92351,a=>{a.v(b=>Promise.all(["server/chunks/ssr/lib_pi-projects_ts_1wikofb._.js"].map(b=>a.l(b))).then(()=>b(2727)))},26396,a=>{a.v(b=>Promise.all(["server/chunks/ssr/lib_gemini-projects_ts_1c7bgx-._.js"].map(b=>a.l(b))).then(()=>b(62074)))}];
|
|
2
|
-
|
|
3
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__1e-x7j4._.js.map
|
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
module.exports=[57764,(a,b,c)=>{b.exports=a.x("node:url",()=>require("node:url"))},92509,(a,b,c)=>{b.exports=a.x("url",()=>require("url"))},11369,a=>{"use strict";var b=a.i(36359),c=a.i(7292),d=a.i(37936),e=a.i(2157),f=a.i(50227),g=a.i(60526),h=a.i(10695);function i(a){let b=(0,g.homedir)(),c=(0,f.resolve)(a);for(;c!==b;){let a=(0,f.resolve)(c,".failproofai");try{if((0,e.statSync)(a).isDirectory())return c}catch{}let b=(0,f.dirname)(c);if(b===c)break;c=b}return(0,f.resolve)(a)}function j(){return(0,f.resolve)((0,g.homedir)(),".failproofai","policies-config.json")}function k(){let a=j();if(!(0,e.existsSync)(a))return{enabledPolicies:[]};try{let b=(0,e.readFileSync)(a,"utf8");return JSON.parse(b)}catch(b){return(0,h.hookLogWarn)(`failed to parse config at ${a}: ${b instanceof Error?b.message:String(b)}`),{enabledPolicies:[]}}}function l(a){let b=j(),c=(0,f.dirname)(b);(0,e.existsSync)(c)||(0,e.mkdirSync)(c,{recursive:!0}),(0,e.writeFileSync)(b,JSON.stringify(a,null,2)+"\n","utf8")}function m(a,b){switch(a){case"user":return(0,f.resolve)((0,g.homedir)(),".failproofai","policies-config.json");case"project":return(0,f.resolve)(i(b??process.cwd()),".failproofai","policies-config.json");case"local":return(0,f.resolve)(i(b??process.cwd()),".failproofai","policies-config.local.json")}}function n(a,b){let c=m(a,b);if(!(0,e.existsSync)(c))return{enabledPolicies:[]};try{let a=(0,e.readFileSync)(c,"utf8");return JSON.parse(a)}catch(a){return(0,h.hookLogWarn)(`failed to parse config at ${c}: ${a instanceof Error?a.message:String(a)}`),{enabledPolicies:[]}}}function o(a,b,c){let d=m(b,c),g=(0,f.dirname)(d);(0,e.existsSync)(g)||(0,e.mkdirSync)(g,{recursive:!0}),(0,e.writeFileSync)(d,JSON.stringify(a,null,2)+"\n","utf8")}var p=a.i(74533);let q=["user","project","local"],r=["claude","codex","copilot","cursor","opencode","pi","gemini"],s=["session_start","pre_tool_use","permission_request","post_tool_use","user_prompt_submit","stop","subagent_start","pre_compact","post_compact","subagent_stop"],t={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"},u=["SessionStart","SessionEnd","UserPromptSubmit","PreToolUse","PostToolUse","Stop","SubagentStop","PostToolUseFailure","ErrorOccurred","PreCompact","PermissionRequest","Notification"],v=["sessionStart","sessionEnd","beforeSubmitPrompt","preToolUse","postToolUse","stop","subagentStop"],w=["SessionStart","SessionEnd","BeforeAgent","AfterAgent","BeforeModel","AfterModel","BeforeToolSelection","BeforeTool","AfterTool","PreCompress","Notification"],x=["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"],y="__failproofai_hook__";var z=a.i(57764);let A={get url(){return`file://${a.P("src/hooks/integrations.ts")}`}};function B(a){return(0,e.existsSync)(a)?JSON.parse((0,e.readFileSync)(a,"utf8")):{}}function C(a,b){(0,e.mkdirSync)((0,f.dirname)(a),{recursive:!0}),(0,e.writeFileSync)(a,JSON.stringify(b,null,2)+"\n","utf8")}function D(a){if(!a||"object"!=typeof a)return!1;if(!0===a[y])return!0;let b="string"==typeof a.command?a.command:"";return b.includes("failproofai")&&b.includes("--hook")}function E(a){return"version"in a&&(delete a.version,!0)}function F(a){try{let b=`which ${a}`;return(0,p.execSync)(b,{encoding:"utf8",stdio:"pipe"}),!0}catch{return!1}}let G={id:"claude",displayName:"Claude Code",scopes:q,eventTypes:x,getSettingsPath(a,b){let c=b?(0,f.resolve)(b):process.cwd();switch(a){case"user":return(0,f.resolve)((0,g.homedir)(),".claude","settings.json");case"project":return(0,f.resolve)(c,".claude","settings.json");case"local":return(0,f.resolve)(c,".claude","settings.local.json")}},readSettings:a=>B(a),writeSettings(a,b){C(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b}`:`"${a}" --hook ${b}`,timeout:60,[y]:!0}),isFailproofaiHook:D,writeHookEntries(a,b,c){for(let d of(a.hooks||(a.hooks={}),x)){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=>D(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=>!D(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 c=this.getSettingsPath(a,b);if(!(0,e.existsSync)(c))return!1;try{let a=this.readSettings(c);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=>D(a)))return!0}}catch{}return!1},detectInstalled:()=>F("claude")||F("claude-code")};function H(a){if(!0===a[y])return!0;for(let b of["string"==typeof a.bash?a.bash:"","string"==typeof a.powershell?a.powershell:""])if(b.includes("failproofai")&&b.includes("--hook"))return!0;return!1}let I="./plugins/failproofai.mjs";function J(a){return(0,f.resolve)((0,f.dirname)(a),"plugins","failproofai.mjs")}function K(){let a=process.env.FAILPROOFAI_PACKAGE_ROOT;return a?(0,f.resolve)(a,"pi-extension"):(0,f.resolve)((0,z.fileURLToPath)(A.url),"..","..","..","pi-extension")}function L(a){return"string"==typeof a&&(!!/(?:^|\/)pi-extension\/?$/.test(a)||a.includes("pi-extension")&&a.includes("failproofai"))}let M={claude:G,codex:{id:"codex",displayName:"OpenAI Codex",scopes:["user","project"],eventTypes:s,getSettingsPath(a,b){let c=b?(0,f.resolve)(b):process.cwd();switch(a){case"user":return(0,f.resolve)((0,g.homedir)(),".codex","hooks.json");case"project":case"local":return(0,f.resolve)(c,".codex","hooks.json")}},readSettings:a=>B(a),writeSettings(a,b){C(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b} --cli codex`:`"${a}" --hook ${b} --cli codex`,timeout:60,[y]:!0}),isFailproofaiHook:D,writeHookEntries(a,b,c){for(let d of(E(a),a.hooks||(a.hooks={}),s)){let e=t[d],f=this.buildHookEntry(b,d,c);a.hooks[e]||(a.hooks[e]=[]);let g=a.hooks[e],h=!1;for(let a of g){if(!a.hooks)continue;let b=a.hooks.findIndex(a=>D(a));if(b>=0){a.hooks[b]=f,h=!0;break}}h||g.push({hooks:[f]})}},removeHooksFromFile(a){let b=this.readSettings(a),c=E(b);if(!b.hooks)return c&&this.writeSettings(a,b),0;let d=0;for(let a of Object.keys(b.hooks)){let c=b.hooks[a];if(Array.isArray(c)){for(let a=c.length-1;a>=0;a--){let b=c[a];if(!b.hooks)continue;let e=b.hooks.length;b.hooks=b.hooks.filter(a=>!D(a)),d+=e-b.hooks.length,0===b.hooks.length&&c.splice(a,1)}0===c.length&&delete b.hooks[a]}}return 0===Object.keys(b.hooks).length&&delete b.hooks,(d>0||c)&&this.writeSettings(a,b),d},hooksInstalledInSettings(a,b){let c=this.getSettingsPath(a,b);if(!(0,e.existsSync)(c))return!1;try{let a=this.readSettings(c);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=>D(a)))return!0}}catch{}return!1},detectInstalled:()=>F("codex")},copilot:{id:"copilot",displayName:"GitHub Copilot",scopes:["user","project"],eventTypes:u,getSettingsPath(a,b){let c=b?(0,f.resolve)(b):process.cwd();switch(a){case"user":return(0,f.resolve)((0,g.homedir)(),".copilot","hooks","failproofai.json");case"project":case"local":return(0,f.resolve)(c,".github","hooks","failproofai.json")}},readSettings(a){let b=B(a);return void 0===b.version&&(b.version=1),b},writeSettings(a,b){C(a,b)},buildHookEntry(a,b,c){let d="project"===c?`npx -y failproofai --hook ${b} --cli copilot`:`"${a}" --hook ${b} --cli copilot`;return{type:"command",bash:d,powershell:d,timeoutSec:60,[y]:!0}},isFailproofaiHook:H,writeHookEntries(a,b,c){for(let d of(void 0===a.version&&(a.version=1),a.hooks||(a.hooks={}),u)){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=>H(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=>!H(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 c=this.getSettingsPath(a,b);if(!(0,e.existsSync)(c))return!1;try{let a=this.readSettings(c);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=>H(a)))return!0}}catch{}return!1},detectInstalled:()=>F("copilot")},cursor:{id:"cursor",displayName:"Cursor Agent",scopes:["user","project"],eventTypes:v,getSettingsPath(a,b){let c=b?(0,f.resolve)(b):process.cwd();switch(a){case"user":return(0,f.resolve)((0,g.homedir)(),".cursor","hooks.json");case"project":case"local":return(0,f.resolve)(c,".cursor","hooks.json")}},readSettings(a){let b=B(a);return void 0===b.version&&(b.version=1),b},writeSettings(a,b){C(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b} --cli cursor`:`"${a}" --hook ${b} --cli cursor`,timeout:60,[y]:!0}),isFailproofaiHook:D,writeHookEntries(a,b,c){for(let d of(void 0===a.version&&(a.version=1),a.hooks||(a.hooks={}),v)){let e=this.buildHookEntry(b,d,c),f=a.hooks[d],g=f??[];f||(a.hooks[d]=g);let h=g.findIndex(a=>D(a));h>=0?g[h]=e:g.push(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))continue;let e=d.length,f=d.filter(a=>!D(a));c+=e-f.length,0===f.length?delete b.hooks[a]:b.hooks[a]=f}return 0===Object.keys(b.hooks).length&&delete b.hooks,this.writeSettings(a,b),c},hooksInstalledInSettings(a,b){let c=this.getSettingsPath(a,b);if(!(0,e.existsSync)(c))return!1;try{let a=this.readSettings(c);if(!a.hooks)return!1;for(let b of Object.values(a.hooks))if(Array.isArray(b)&&b.some(a=>D(a)))return!0}catch{}return!1},detectInstalled:()=>F("cursor-agent")||F("agent")},opencode:{id:"opencode",displayName:"OpenCode",scopes:["user","project"],eventTypes:["tool.execute.before","tool.execute.after","session.created","session.deleted","session.idle","message.updated","permission.ask"],getSettingsPath(a,b){let c=b?(0,f.resolve)(b):process.cwd();switch(a){case"user":return(0,f.resolve)((0,g.homedir)(),".config","opencode","opencode.json");case"project":case"local":return(0,f.resolve)(c,".opencode","opencode.json")}},readSettings:a=>B(a),writeSettings(a,b){C(a,b)},buildHookEntry(a,b,c){if("user"===c){let a=(0,f.resolve)((0,g.homedir)(),".config","opencode","plugins","failproofai.mjs");return{spec:`file://${a}`,[y]:!0}}return{spec:I,[y]:!0}},isFailproofaiHook:a=>"string"==typeof a?a.includes("failproofai.mjs"):!!Array.isArray(a)&&"string"==typeof a[0]&&a[0].includes("failproofai.mjs"),writeHookEntries(a,b,c){let d,h,i=c??"project",j=J("user"===i?(0,f.resolve)((0,g.homedir)(),".config","opencode","opencode.json"):(0,f.resolve)(process.cwd(),".opencode","opencode.json"));(0,e.mkdirSync)((0,f.dirname)(j),{recursive:!0}),(0,e.writeFileSync)(j,(h=(d="project"===i)?'""':JSON.stringify(b),`// AUTO-GENERATED by failproofai. ${y}
|
|
2
|
-
// Re-generate via: failproofai policies --install --cli opencode
|
|
3
|
-
// Plugin shim that bridges OpenCode's plugin API to the failproofai binary.
|
|
4
|
-
// See: https://opencode.ai/docs/plugins/
|
|
5
|
-
import { spawnSync } from "node:child_process";
|
|
6
|
-
|
|
7
|
-
// Map opencode bus-event types → canonical failproofai event names.
|
|
8
|
-
// (The binary sees PascalCase — the binary's --cli=opencode flag is for
|
|
9
|
-
// telemetry / activity tagging only; no opencode branch in handler.ts.)
|
|
10
|
-
const BUS_EVENT_MAP = {
|
|
11
|
-
"session.created": "SessionStart",
|
|
12
|
-
"session.deleted": "SessionEnd",
|
|
13
|
-
"session.idle": "Stop",
|
|
14
|
-
// message.updated is handled separately (filter to role:user); see below.
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
// Map opencode lowercase tool IDs (\`input.tool\`) → Claude PascalCase canonical
|
|
18
|
-
// names. Builtin failproofai policies match on PascalCase via case-sensitive
|
|
19
|
-
// \`Array.includes\`, so without this every Bash/Read/Write/Edit builtin
|
|
20
|
-
// silently no-ops under opencode. Keep in sync with OPENCODE_TOOL_MAP in
|
|
21
|
-
// failproofai/src/hooks/types.ts (this shim is loaded in-process by opencode
|
|
22
|
-
// and must be self-contained — no imports from the failproofai package).
|
|
23
|
-
// Unknown tools pass through unchanged via \`?? raw\`.
|
|
24
|
-
const TOOL_NAME_MAP = {
|
|
25
|
-
bash: "Bash",
|
|
26
|
-
read: "Read",
|
|
27
|
-
write: "Write",
|
|
28
|
-
edit: "Edit",
|
|
29
|
-
apply_patch: "Edit",
|
|
30
|
-
glob: "Glob",
|
|
31
|
-
grep: "Grep",
|
|
32
|
-
list: "LS",
|
|
33
|
-
webfetch: "WebFetch",
|
|
34
|
-
websearch: "WebSearch",
|
|
35
|
-
todowrite: "TodoWrite",
|
|
36
|
-
todoread: "TodoRead",
|
|
37
|
-
};
|
|
38
|
-
function canonicalizeTool(raw) {
|
|
39
|
-
if (!raw) return raw;
|
|
40
|
-
return TOOL_NAME_MAP[raw] != null ? TOOL_NAME_MAP[raw] : raw;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Per-tool input-key translation: opencode native tools deliver args as
|
|
44
|
-
// camelCase (\`filePath\`, \`oldString\`, …) but failproofai builtin policies
|
|
45
|
-
// (\`block-read-outside-cwd\`, \`block-env-files\`, \`block-secrets-write\`)
|
|
46
|
-
// read \`ctx.toolInput.file_path\` etc. Without this map every Read/Write/Edit
|
|
47
|
-
// path-check silently no-ops on opencode. Keys are PascalCase canonical tool
|
|
48
|
-
// names so the lookup pairs with canonicalizeTool's output. Tools outside the
|
|
49
|
-
// map (MCP \`mcp_*\`, plugins) pass through unchanged. Keep in sync with
|
|
50
|
-
// OPENCODE_TOOL_INPUT_MAP in failproofai/src/hooks/types.ts.
|
|
51
|
-
const TOOL_INPUT_MAP = {
|
|
52
|
-
Read: { filePath: "file_path" },
|
|
53
|
-
Write: { filePath: "file_path" },
|
|
54
|
-
Edit: { filePath: "file_path", oldString: "old_string", newString: "new_string", replaceAll: "replace_all" },
|
|
55
|
-
};
|
|
56
|
-
function canonicalizeToolInput(canonicalToolName, args) {
|
|
57
|
-
if (!args || typeof args !== "object") return args;
|
|
58
|
-
const map = TOOL_INPUT_MAP[canonicalToolName];
|
|
59
|
-
if (!map) return args;
|
|
60
|
-
const out = {};
|
|
61
|
-
for (const k of Object.keys(args)) out[map[k] != null ? map[k] : k] = args[k];
|
|
62
|
-
return out;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const FAILPROOFAI_BIN = ${h};
|
|
66
|
-
const USE_NPX = ${d};
|
|
67
|
-
|
|
68
|
-
function runFailproofai(eventName, payload, directory) {
|
|
69
|
-
const cmd = USE_NPX ? "npx" : FAILPROOFAI_BIN;
|
|
70
|
-
const args = USE_NPX
|
|
71
|
-
? ["-y", "failproofai", "--hook", eventName, "--cli", "opencode"]
|
|
72
|
-
: ["--hook", eventName, "--cli", "opencode"];
|
|
73
|
-
const r = spawnSync(cmd, args, {
|
|
74
|
-
input: JSON.stringify(payload),
|
|
75
|
-
encoding: "utf8",
|
|
76
|
-
timeout: 60_000,
|
|
77
|
-
cwd: directory,
|
|
78
|
-
});
|
|
79
|
-
return { exitCode: r.status ?? 0, stdout: r.stdout ?? "", stderr: r.stderr ?? "" };
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
async function applyDecision(result, ctx, eventName) {
|
|
83
|
-
// Deny path 1: exit 2 (Claude Stop-style or any non-Pre/Post deny).
|
|
84
|
-
if (result.exitCode === 2) {
|
|
85
|
-
throw new Error((result.stderr || "").trim() || "Blocked by failproofai");
|
|
86
|
-
}
|
|
87
|
-
// Deny path 2: stdout JSON with hookSpecificOutput.permissionDecision === "deny".
|
|
88
|
-
let parsed = null;
|
|
89
|
-
try { parsed = JSON.parse(result.stdout); } catch { /* fail-open allow */ }
|
|
90
|
-
if (!parsed) return;
|
|
91
|
-
const out = parsed.hookSpecificOutput;
|
|
92
|
-
if (out && out.permissionDecision === "deny") {
|
|
93
|
-
throw new Error(out.permissionDecisionReason || "Blocked by failproofai");
|
|
94
|
-
}
|
|
95
|
-
// Codex-shape PermissionRequest deny: hookSpecificOutput.decision.behavior.
|
|
96
|
-
if (out && out.decision && out.decision.behavior === "deny") {
|
|
97
|
-
throw new Error((out.decision.message) || "Blocked by failproofai");
|
|
98
|
-
}
|
|
99
|
-
// Forward additional context as a prompt to the session. For Stop /
|
|
100
|
-
// SubagentStop the prompt is the only force-retry channel (session.idle
|
|
101
|
-
// already fired), so AWAIT to ensure the SDK round-trip completes before
|
|
102
|
-
// the plugin handler returns. For tool events keep fire-and-forget so we
|
|
103
|
-
// don't add latency to every tool call.
|
|
104
|
-
const ctxText = out && out.additionalContext;
|
|
105
|
-
if (ctxText && ctx && ctx.client && ctx.sessionID) {
|
|
106
|
-
const prompt = ctx.client.session.prompt({
|
|
107
|
-
path: { id: ctx.sessionID },
|
|
108
|
-
body: { parts: [{ type: "text", text: ctxText }] },
|
|
109
|
-
});
|
|
110
|
-
if (eventName === "Stop" || eventName === "SubagentStop") {
|
|
111
|
-
try { await prompt; } catch { /* swallow — agent is exiting anyway */ }
|
|
112
|
-
} else {
|
|
113
|
-
Promise.resolve(prompt).catch(() => {});
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
export default async function failproofaiPlugin({ client, directory }) {
|
|
119
|
-
return {
|
|
120
|
-
// Generic bus events: session lifecycle + user-prompt detection.
|
|
121
|
-
event: async ({ event }) => {
|
|
122
|
-
if (!event || !event.type) return;
|
|
123
|
-
|
|
124
|
-
// UserPromptSubmit — filter message.updated to user role only so we
|
|
125
|
-
// don't fire on every assistant token. Forward the prompt text so
|
|
126
|
-
// prompt-based policies (sanitize-* on input, content checks) see it.
|
|
127
|
-
if (event.type === "message.updated") {
|
|
128
|
-
const props = event.properties || {};
|
|
129
|
-
const info = props.info || props.message || {};
|
|
130
|
-
const role = info.role || props.role;
|
|
131
|
-
if (role !== "user") return;
|
|
132
|
-
const sessionID = info.sessionID || info.sessionId || info.session_id || props.sessionID;
|
|
133
|
-
// OpenCode's message shape: parts is an array of {type, text, ...}.
|
|
134
|
-
// Concatenate text parts to reconstruct the user-facing prompt.
|
|
135
|
-
// Fall back to direct text/content fields if a future shape differs.
|
|
136
|
-
let prompt = "";
|
|
137
|
-
const parts = info.parts || props.parts || [];
|
|
138
|
-
if (Array.isArray(parts)) {
|
|
139
|
-
for (const p of parts) {
|
|
140
|
-
if (p && typeof p === "object" && typeof p.text === "string") prompt += p.text;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
if (!prompt) prompt = (info.text || info.content || props.text || "").toString();
|
|
144
|
-
const r = runFailproofai("UserPromptSubmit", {
|
|
145
|
-
session_id: sessionID, cwd: directory, hook_event_name: "UserPromptSubmit", prompt,
|
|
146
|
-
}, directory);
|
|
147
|
-
await applyDecision(r, { client, sessionID }, "UserPromptSubmit");
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const claudeEvent = BUS_EVENT_MAP[event.type];
|
|
152
|
-
if (!claudeEvent) return;
|
|
153
|
-
const props = event.properties || {};
|
|
154
|
-
const sessionID = props.sessionID || (props.session && props.session.id) || props.id;
|
|
155
|
-
const r = runFailproofai(claudeEvent, {
|
|
156
|
-
session_id: sessionID, cwd: directory, hook_event_name: claudeEvent,
|
|
157
|
-
}, directory);
|
|
158
|
-
await applyDecision(r, { client, sessionID }, claudeEvent);
|
|
159
|
-
},
|
|
160
|
-
|
|
161
|
-
// First-class PreToolUse hook. Note: tool args live on output.args (mutable).
|
|
162
|
-
"tool.execute.before": async (input, output) => {
|
|
163
|
-
const canonicalTool = canonicalizeTool(input.tool);
|
|
164
|
-
const r = runFailproofai("PreToolUse", {
|
|
165
|
-
session_id: input.sessionID,
|
|
166
|
-
cwd: directory,
|
|
167
|
-
tool_name: canonicalTool,
|
|
168
|
-
tool_input: canonicalizeToolInput(canonicalTool, output.args),
|
|
169
|
-
hook_event_name: "PreToolUse",
|
|
170
|
-
}, directory);
|
|
171
|
-
await applyDecision(r, { client, sessionID: input.sessionID }, "PreToolUse");
|
|
172
|
-
},
|
|
173
|
-
|
|
174
|
-
// First-class PostToolUse hook. Note: tool args live on input.args here.
|
|
175
|
-
"tool.execute.after": async (input, output) => {
|
|
176
|
-
const canonicalTool = canonicalizeTool(input.tool);
|
|
177
|
-
const r = runFailproofai("PostToolUse", {
|
|
178
|
-
session_id: input.sessionID,
|
|
179
|
-
cwd: directory,
|
|
180
|
-
tool_name: canonicalTool,
|
|
181
|
-
tool_input: canonicalizeToolInput(canonicalTool, input.args),
|
|
182
|
-
tool_response: { title: output.title, output: output.output, metadata: output.metadata },
|
|
183
|
-
hook_event_name: "PostToolUse",
|
|
184
|
-
}, directory);
|
|
185
|
-
await applyDecision(r, { client, sessionID: input.sessionID }, "PostToolUse");
|
|
186
|
-
},
|
|
187
|
-
|
|
188
|
-
// Cleaner deny UX for prompted tools — mutate output.status instead of throwing.
|
|
189
|
-
"permission.ask": async (input, output) => {
|
|
190
|
-
const canonicalTool = canonicalizeTool(input.tool);
|
|
191
|
-
const r = runFailproofai("PermissionRequest", {
|
|
192
|
-
session_id: input.sessionID,
|
|
193
|
-
cwd: directory,
|
|
194
|
-
tool_name: canonicalTool || input.command || "permission",
|
|
195
|
-
tool_input: canonicalizeToolInput(canonicalTool, input),
|
|
196
|
-
hook_event_name: "PermissionRequest",
|
|
197
|
-
}, directory);
|
|
198
|
-
try {
|
|
199
|
-
await applyDecision(r, { client, sessionID: input.sessionID }, "PermissionRequest");
|
|
200
|
-
} catch {
|
|
201
|
-
output.status = "deny";
|
|
202
|
-
}
|
|
203
|
-
},
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
`),"utf8"),Array.isArray(a.plugin)||(a.plugin=[]);let k="user"===i?`file://${j}`:I,l=a.plugin.findIndex(a=>this.isFailproofaiHook(a));l>=0?a.plugin[l]=k:a.plugin.push(k)},removeHooksFromFile(a){let b=0,c=this.readSettings(a);if(Array.isArray(c.plugin)){let a=c.plugin.length;c.plugin=c.plugin.filter(a=>!this.isFailproofaiHook(a)),b+=a-c.plugin.length,0===c.plugin.length&&delete c.plugin}this.writeSettings(a,c);let d=J(a);if((0,e.existsSync)(d))try{(0,e.readFileSync)(d,"utf8").includes(y)&&((0,e.unlinkSync)(d),0===b&&(b=1))}catch{}return b},hooksInstalledInSettings(a,b){let c=this.getSettingsPath(a,b);if(!(0,e.existsSync)(c))return!1;try{let a=this.readSettings(c);if(!Array.isArray(a.plugin)||!a.plugin.some(a=>this.isFailproofaiHook(a)))return!1;let b=J(c);if(!(0,e.existsSync)(b))return!1;return(0,e.readFileSync)(b,"utf8").includes(y)}catch{return!1}},detectInstalled:()=>F("opencode")},pi:{id:"pi",displayName:"Pi",scopes:["user","project"],eventTypes:["session_start","session_shutdown","input","tool_call","user_bash","tool_result","agent_end"],getSettingsPath(a,b){let c=b?(0,f.resolve)(b):process.cwd();switch(a){case"user":return(0,f.resolve)((0,g.homedir)(),".pi","agent","settings.json");case"project":case"local":return(0,f.resolve)(c,".pi","settings.json")}},readSettings:a=>B(a),writeSettings(a,b){C(a,b)},buildHookEntry:(a,b,c)=>({[y]:!0,_piPackagePath:K(),_piScope:c}),isFailproofaiHook:a=>"string"==typeof a?L(a):!!a&&"object"==typeof a&&(!0===a[y]||"string"==typeof a.source&&L(a.source)),writeHookEntries(a,b,c){var d;let e,g,h;Array.isArray(a.packages)||(a.packages=[]);let i=K(),j="project"===c?(d=i,e=process.cwd(),g=(0,f.resolve)(e),(h=(0,f.resolve)(d)).startsWith(g+"/")||h===g?"../"+h.slice(g.length+1):h):i,k=a.packages.findIndex(a=>L(a));k>=0?a.packages[k]=j:a.packages.push(j)},removeHooksFromFile(a){if(!(0,e.existsSync)(a))return 0;let b=this.readSettings(a);if(!Array.isArray(b.packages))return 0;let c=b.packages.length;b.packages=b.packages.filter(a=>!L(a));let d=c-b.packages.length;return 0===b.packages.length&&delete b.packages,this.writeSettings(a,b),d},hooksInstalledInSettings(a,b){let c=this.getSettingsPath(a,b);if(!(0,e.existsSync)(c))return!1;try{let a=this.readSettings(c);if(!Array.isArray(a.packages))return!1;return a.packages.some(a=>L(a))}catch{return!1}},detectInstalled:()=>F("pi")},gemini:{id:"gemini",displayName:"Gemini CLI",scopes:["user","project"],eventTypes:w,getSettingsPath(a,b){let c=b?(0,f.resolve)(b):process.cwd();switch(a){case"user":return(0,f.resolve)((0,g.homedir)(),".gemini","settings.json");case"project":case"local":return(0,f.resolve)(c,".gemini","settings.json")}},readSettings:a=>B(a),writeSettings(a,b){C(a,b)},buildHookEntry:(a,b,c)=>({type:"command",command:"project"===c?`npx -y failproofai --hook ${b} --cli gemini`:`"${a}" --hook ${b} --cli gemini`,timeout:6e4,[y]:!0}),isFailproofaiHook:D,writeHookEntries(a,b,c){for(let d of(a.hooks||(a.hooks={}),w)){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=>D(a));if(b>=0){a.hooks[b]=e,g=!0;break}}g||f.push({matcher:"*",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=>!D(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 c=this.getSettingsPath(a,b);if(!(0,e.existsSync)(c))return!1;try{let a=this.readSettings(c);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=>D(a)))return!0}}catch{}return!1},detectInstalled:()=>F("gemini")}};function N(a){let b=M[a];if(!b)throw Error(`Unknown integration: ${a}. Valid: ${r.join(", ")}`);return b}function O(){return r.filter(a=>M[a].detectInstalled())}var P=a.i(1457),Q=a.i(92956),R=a.i(69839);async function S(a,b={}){let{includeBeta:c=!1}=b;if(!process.stdin.isTTY){let b=Q.BUILTIN_POLICIES.filter(a=>c||!a.beta);return a?a.filter(a=>b.some(b=>b.name===a)):b.filter(a=>a.defaultEnabled).map(a=>a.name)}let d=a?new Set(a):null,e=Q.BUILTIN_POLICIES.filter(a=>c||!a.beta).map(a=>({name:a.name,description:a.description,category:a.category,selected:d?d.has(a.name):a.defaultEnabled,beta:!!a.beta})),f=e.length,g=0,h="",i=0,j=!1;function k(){if(!h)return e;let a=h.toLowerCase();return e.filter(b=>b.name.toLowerCase().includes(a)||b.description.toLowerCase().includes(a))}function l(){let a=process.stdout.columns||120;j||(process.stdout.write("\x1b[?25l"),j=!0);let b=k(),d=b.length;d>0&&g>=d&&(g=d-1);let l=[];l.push(" Failproof AI — Policy Manager"),l.push("");let m=Math.max(20,a-6),n=" ┌"+"─".repeat(m+2)+"┐",o=" └"+"─".repeat(m+2)+"┘",p=h?` \x1b[2m(${d}/${f})\x1b[0m`:` \x1b[2m(${f} policies)\x1b[0m`,q=`\x1b[1mSearch:\x1b[0m ${h}\x1b[7m \x1b[0m${p}`;if(l.push(n),l.push(` \u2502 ${q}`),l.push(o),l.push(""),0===d){l.push(" \x1b[2mNo policies match “"+h+"”\x1b[0m");for(let a=0;a<9;a++)l.push("")}else{let c=function(a){let b=[],c=new Map,d=new Map;for(let a of e)c.has(a.category)||(b.push(a.category),c.set(a.category,0),d.set(a.category,0)),d.set(a.category,d.get(a.category)+1),a.selected&&c.set(a.category,c.get(a.category)+1);let f=new Map;for(let b of a){let a=f.get(b.category)??[];a.push(b),f.set(b.category,a)}let g=[],h=0;for(let a of b){let b=f.get(a);if(b&&0!==b.length)for(let e of(g.push({kind:"header",category:a,enabledCount:c.get(a),totalCount:d.get(a)}),b))g.push({kind:"item",item:e,filteredIndex:h++})}return g}(b),d=0;for(let a=0;a<c.length;a++){let b=c[a];if("item"===b.kind&&b.filteredIndex===g){d=a;break}}let f=d-Math.floor(4);f=Math.min(f=Math.max(0,f),Math.max(0,c.length-8));let h=Math.min(c.length,f+8),i=c.slice(0,f).filter(a=>"item"===a.kind).length;i>0?l.push(` \x1b[2m \u2191 ${i} more above\x1b[0m`):l.push("");for(let b=f;b<h;b++){let d=c[b];if("header"===d.kind){let b=` ${d.category.toUpperCase()} (${d.enabledCount}/${d.totalCount}) `,c=Math.max(2,a-2-(3+b.length));l.push(` \x1b[2m\u2500\u2500 ${b}${"─".repeat(c)}\x1b[0m`)}else{let a=d.item,b=d.filteredIndex===g,c=b?"\x1b[36m❯\x1b[0m":" ",e=a.selected?"\x1b[32m[✓]\x1b[0m":"[ ]",f=b?`\x1b[1;36m${a.name}\x1b[0m`:a.name,h=a.beta?" \x1b[35m[beta]\x1b[0m":"",i=" ".repeat(Math.max(1,28-a.name.length)),j=`\x1b[2m${a.description}\x1b[0m`;l.push(` ${c} ${e} ${f}${h}${i}${j}`)}}for(let a=h-f;a<8;a++)l.push("");let j=c.slice(h).filter(a=>"item"===a.kind).length;j>0?l.push(` \x1b[2m \u2193 ${j} more below\x1b[0m`):l.push("")}l.push(""),l.push(" \x1b[2m"+"─".repeat(a-2)+"\x1b[0m"),l.push(" [↑↓] Move [Space] Toggle [Ctrl+A] All [Ctrl+S] Save [Esc] Clear [^C] Quit"),l.push(""),l.push(" \x1b[2mTip: `policies` for a flat list · `policies --install <name…>` to skip prompt\x1b[0m"),c||l.push(" \x1b[2mTip: `policies --install --beta` to include beta policies\x1b[0m"),i>0&&process.stdout.write(`\x1b[${i}A\x1b[J`);let r=l.map(b=>""===b?b:function(a,b){let c=0,d="",e=0;for(;e<a.length;)if("\x1b"===a[e]&&"["===a[e+1]){let b=e+2;for(;b<a.length&&!/[A-Za-z]/.test(a[b]);)b++;b++,d+=a.slice(e,b),e=b}else{if(c>=b)break;d+=a[e],c++,e++}return d}(b,a)).join("\n")+"\n";process.stdout.write(r),i=l.length}return new Promise(a=>{function b(b,d){if(!d)return;d.ctrl&&"c"===d.name&&(c(),process.exit(0));let f=k();if("up"===d.name)f.length>0&&(g=g>0?g-1:f.length-1),l();else if("down"===d.name)f.length>0&&(g=g<f.length-1?g+1:0),l();else if("return"===d.name||"space"===d.name){let a=f[g];a&&(a.selected=!a.selected),l()}else if("escape"===d.name)h="",g=0,l();else if(d.ctrl&&"a"===d.name){let a=f.length>0&&f.every(a=>a.selected);for(let b of f)b.selected=!a;l()}else if(d.ctrl&&"s"===d.name){c();let b=e.filter(a=>a.selected).map(a=>a.name);process.stdout.write("\n"),a(b)}else"backspace"===d.name||"delete"===d.name?h.length>0&&(h=h.slice(0,-1),g=0,l()):!b||1!==b.length||d.ctrl||d.meta||(h+=b,g=0,l())}function c(){j&&(process.stdout.write("\x1b[?25h"),j=!1),process.stdin.removeListener("keypress",b),process.stdin.setRawMode(!1),process.stdin.pause()}l(),process.stdin.setRawMode(!0),process.stdin.resume(),P.emitKeypressEvents(process.stdin),process.stdin.on("keypress",b)})}let T="__failproofai_custom_hooks__";var U=a.i(24868),V=a.i(14747),W=a.i(92509);let X=".__failproofai_tmp__.mjs",Y=/(?:import\s+(?:[\s\S]*?\s+from\s+)?|export\s+(?:[\s\S]*?\s+from\s+))(['"])(\.\.?\/[^'"]+)\1/g,Z=/require\s*\(\s*(['"])(\.\.?\/[^'"]+)\1\s*\)/g;async function $(a){try{return await (0,U.access)(a),!0}catch{return!1}}async function _(){let a=process.env.FAILPROOFAI_DIST_PATH;if(a){let b=(0,V.resolve)(a,"index.js");if(await $(b))return b}for(let a of[(0,V.resolve)((0,V.dirname)(process.execPath),"..","assets","dist","index.js"),(0,V.resolve)(process.cwd(),"dist","index.js"),(0,V.resolve)(process.cwd(),"node_modules","failproofai","dist","index.js")])if(await $(a))return a;return null}async function aa(a,b){let c=(0,V.resolve)(a,b);for(let a of[c,`${c}.js`,`${c}.mjs`,`${c}.ts`,(0,V.resolve)(c,"index.js")])if(await $(a))return a;return null}async function ab(a,b){let c=a+".__failproofai_esm_shim__.mjs",d=`import _cjs from '${b}';
|
|
207
|
-
export const customPolicies = _cjs.customPolicies;
|
|
208
|
-
export const getCustomHooks = _cjs.getCustomHooks;
|
|
209
|
-
export const clearCustomHooks = _cjs.clearCustomHooks;
|
|
210
|
-
export const allow = _cjs.allow;
|
|
211
|
-
export const deny = _cjs.deny;
|
|
212
|
-
export const instruct = _cjs.instruct;
|
|
213
|
-
export default _cjs;`;return await (0,U.writeFile)(c,d,"utf-8"),{shimPath:c,shimUrl:(0,W.pathToFileURL)(c).href}}async function ac(a,b,c){let d=[a],e=new Set,f=[],g=null;if(c&&b){let a=await ab(c,b);f.push(a.shimPath),g=a.shimUrl}for(;d.length>0;){let a=d.shift();if(e.has(a))continue;e.add(a);let b=await (0,U.readFile)(a,"utf-8");g&&(b=b.replace(/from\s+(['"])(?:claudeye|failproofai)\1/g,`from '${g}'`)),c&&(b=b.replace(/require\s*\(\s*(['"])(?:claudeye|failproofai)\1\s*\)/g,`require('${c.replace(/\\/g,"\\\\")}')`));let h=(0,V.dirname)(a),i=new Map;for(let a of[Y,Z]){let c,f=new RegExp(a.source,a.flags);for(;null!==(c=f.exec(b));){let a=c[2];if(i.has(a))continue;let b=await aa(h,a);if(!b)continue;e.has(b)||d.includes(b)||d.push(b);let f=(0,V.relative)(h,b+X).split("\\").join("/");f.startsWith(".")||(f="./"+f),i.set(a,f)}}for(let a of[...i.keys()].sort((a,b)=>b.length-a.length)){let c=i.get(a),d=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");b=(b=b.replace(RegExp(`'${d}'`,"g"),`'${c}'`)).replace(RegExp(`"${d}"`,"g"),`"${c}"`)}let j=a+X;await (0,U.writeFile)(j,b,"utf-8"),f.push(j)}return f}async function ad(a){for(let b of a)try{await (0,U.unlink)(b)}catch{}}var ae=a.i(12072),af=a.i(79779);let ag=af.POSTHOG_API_KEY;async function ah(a,b,c){if("1"===process.env.FAILPROOFAI_TELEMETRY_DISABLED)return;let d=JSON.stringify({api_key:process.env.FAILPROOFAI_POSTHOG_KEY??ag,event:b,distinct_id:a,properties:{...c,$lib:"failproofai-hooks",failproofai_version:ae.version,product:af.POSTHOG_PRODUCT}});try{await fetch(process.env.FAILPROOFAI_POSTHOG_HOST?`${process.env.FAILPROOFAI_POSTHOG_HOST}/capture/`:"https://us.i.posthog.com/capture/",{method:"POST",headers:{"Content-Type":"application/json"},body:d,signal:AbortSignal.timeout(5e3)})}catch{}}let ai="__FAILPROOFAI_LOADING_HOOKS__";async function aj(a,b){let c=globalThis;c[ai]=!0;let d=[];try{let b=await _(),c=b?(0,z.pathToFileURL)(b).href:null;d=await ac(a,c,b);let e=(0,z.pathToFileURL)(a+X).href;await import(e)}catch(e){let c=e instanceof Error?e.message:String(e),d=/Cannot find module|MODULE_NOT_FOUND|ENOENT/i.test(c)?"module_not_found":/SyntaxError|Unexpected token/i.test(c)?"syntax_error":"runtime_error";if(ah((0,R.getInstanceId)(),"custom_hooks_load_error",{error_type:d,is_convention:!!b?.conventionScope,convention_scope:b?.conventionScope??null,file_basename:(0,f.basename)(a)}),b?.strict)throw Error(`Failed to load custom hooks from ${a}: ${c}`);(0,h.hookLogError)(`failed to load custom hooks from ${a}: ${c}`)}finally{c[ai]=!1,await ad(d)}}async function ak(a,b){let c;if(!a)return[];let d=(0,f.isAbsolute)(a)?a:(0,f.resolve)(b?.sessionCwd??process.cwd(),a);if(!(0,e.existsSync)(d)){if(b?.strict)throw Error(`Custom hooks file not found: ${d}`);return(0,h.hookLogWarn)(`customPoliciesPath not found: ${d}`),[]}return globalThis[T]=[],await aj(d,b),Array.isArray((c=globalThis)[T])||(c[T]=[]),c[T]}class al extends Error{exitCode;constructor(a,b=1){super(a),this.name="CliError",this.exitCode=b}}let am=new Set(Q.BUILTIN_POLICIES.map(a=>a.name));function an(a,b){return G.getSettingsPath(a,b)}function ao(a){let b=a.filter(a=>!am.has(a));if(b.length>0){let a=[...am].join(", ");throw new al(`Unknown policy name(s): ${b.join(", ")}
|
|
214
|
-
Valid policies: ${a}`)}}function ap(a,b){return G.hooksInstalledInSettings(a,b)}async function aq(a,b="user",c,d=!1,e,h,i=!1,j){let k,l;if(void 0!==a&&a.length>0){let b=a.filter(a=>"all"!==a);if(b.length>0&&ao(b),a.includes("all")&&b.length>0)throw new al(`"all" cannot be combined with specific policy names.
|
|
215
|
-
Use either: --install all or --install block-sudo sanitize-jwt ...`)}let m=j&&j.length>0?[...new Set(j)]:["claude"];for(let a of m){let c=N(a);if(!c.scopes.includes(b)){try{await ah((0,R.getInstanceId)(),"scope_validation_failed",{cli:a,scope:b,supported_scopes:c.scopes})}catch{}throw new al(`Scope "${b}" is not supported by ${c.displayName}. Valid scopes: ${c.scopes.join(", ")}`)}}let r=function(){let a=process.env.FAILPROOFAI_BINARY_OVERRIDE;if(a&&a.trim())return a.trim();try{return(0,p.execSync)("which failproofai",{encoding:"utf8"}).trim().split("\n")[0].trim()}catch{throw new al("failproofai binary not found in PATH.\nInstall it globally first: npm install -g failproofai")}}(),s=n(b,c),t=new Set(s.enabledPolicies);if(void 0!==a){let b;b=1===a.length&&"all"===a[0]?Q.BUILTIN_POLICIES.filter(a=>d||!a.beta).map(a=>a.name):a,k=[...new Set([...s.enabledPolicies,...b])]}else{let a=s.enabledPolicies.length>0?s.enabledPolicies:void 0;k=await S(a,{includeBeta:d})}let u={...s,enabledPolicies:k};if(i)delete u.customPoliciesPath;else if(h){u.customPoliciesPath=(0,f.resolve)(h);let a=[];try{a=await ak(u.customPoliciesPath,{strict:!0})}catch(c){let a=c instanceof Error?c.message:String(c);try{await ah((0,R.getInstanceId)(),"custom_policy_validation_failed",{scope:b,error_type:/not found/i.test(a)?"file_not_found":"load_error"})}catch{}console.error(`Error: ${a}`),process.exit(1)}if(0===a.length){try{await ah((0,R.getInstanceId)(),"custom_policy_validation_failed",{scope:b,error_type:"no_hooks_registered"})}catch{}console.error(`Error: no hooks registered in ${h}. Make sure your file calls customPolicies.add(...) at least once.`),process.exit(1)}console.log(`
|
|
216
|
-
Validated ${a.length} custom hook(s): ${a.map(a=>a.name).join(", ")}`)}o(u,b,c),console.log(`
|
|
217
|
-
Enabled ${k.length} policy(ies): ${k.join(", ")}
|
|
218
|
-
`),i?console.log("Custom hooks path cleared."):u.customPoliciesPath&&console.log(`Custom hooks path: ${u.customPoliciesPath}`);let v=[];for(let a of m){let d=N(a),e=d.getSettingsPath(b,c);try{let c=d.readSettings(e);d.writeHookEntries(c,r,b),d.writeSettings(e,c),v.push({cli:a,path:e})}catch(d){let c=d instanceof Error&&/EACCES|EPERM/.test(d.message)?"permission_denied":d instanceof Error&&/ENOENT|ENOTDIR/.test(d.message)?"path_not_found":"write_error";try{await ah((0,R.getInstanceId)(),"hook_write_failed",{cli:a,scope:b,error_type:c})}catch{}throw d}}try{let a=new Set(k),c=k.filter(a=>!t.has(a)),f=[...t].filter(b=>!a.has(b)),h=(0,R.getInstanceId)();if(await ah(h,"hooks_installed",{scope:b,cli:m,cli_count:m.length,policies:k,policy_count:k.length,policies_added:c,policies_removed:f,...e?{source:e}:{},platform:(0,g.platform)(),arch:(0,g.arch)(),os_release:(0,g.release)(),hostname_hash:(0,R.hashToId)((0,g.hostname)()),has_custom_hooks_path:!!u.customPoliciesPath,has_policy_params:!!(u.policyParams&&Object.keys(u.policyParams).length>0),param_policy_names:u.policyParams?Object.keys(u.policyParams):[],command_format:"project"===b?"npx":"absolute"}),d){let a=new Set(Q.BUILTIN_POLICIES.filter(a=>a.beta).map(a=>a.name)),c=k.filter(b=>a.has(b));c.length>0&&await ah(h,"beta_policies_installed",{scope:b,cli:m,beta_count:c.length,beta_policy_names:c,...e?{source:e}:{}})}}catch{}for(let{cli:a,path:c}of v){let d=N(a);console.log(`Failproof AI hooks installed for ${d.displayName} (${d.eventTypes.length} event types, scope: ${b}).`),console.log(`Settings: ${c}`)}"project"===b?(console.log("Command: npx -y failproofai"),console.log(`
|
|
219
|
-
This file can be committed to git — no machine-specific paths.`)):console.log(`Binary: ${r}`);let w=(l=new Set,q.filter(a=>{let b=an(a,c);return!l.has(b)&&(l.add(b),!0)})).filter(a=>a!==b).filter(a=>ap(a,c));if(w.length>0){let a=w.map(a=>`${a} (${function(a){switch(a){case"user":return"~/.claude/settings.json";case"project":return"{cwd}/.claude/settings.json";case"local":return"{cwd}/.claude/settings.local.json"}}(a)})`).join(", ");console.log(),console.log(`\x1b[33mWarning: Failproof AI hooks are also installed at ${a}.\x1b[0m`),console.log("Having hooks in multiple scopes may cause duplicate policy evaluation."),console.log(`Use \`failproofai policies --uninstall --scope ${w[0]}\` to remove the other installation,`),console.log("or `failproofai policies` to see all scopes.");try{await ah((0,R.getInstanceId)(),"multi_scope_warning_shown",{new_scope:b,existing_scopes:w,cli:m})}catch{}}}async function ar(a,b="user",c,d){let f="all"===b?"user":b,h=d?.cli&&d.cli.length>0?[...new Set(d.cli)]:["claude"];if(d?.removeCustomHooks){let a=n(f,c);delete a.customPoliciesPath,o(a,f,c),console.log("Custom hooks path cleared.")}if(a&&a.length>0&&(1!==a.length||"all"!==a[0])){ao(a);let e=n(f,c),i=new Set(a),j=e.enabledPolicies.filter(a=>!i.has(a)),k=a.filter(a=>!e.enabledPolicies.includes(a));k.length>0&&console.log(`Warning: policy(ies) not currently enabled: ${k.join(", ")}`);let{policyParams:l,...m}=e,p=l?Object.fromEntries(Object.entries(l).filter(([a])=>!i.has(a))):null;o({...m,enabledPolicies:j,...p&&Object.keys(p).length>0?{policyParams:p}:{}},f,c);try{let c=(0,R.getInstanceId)(),f=a.filter(a=>e.enabledPolicies.includes(a));await ah(c,"hooks_removed",{scope:b,cli:h,removal_mode:d?.betaOnly?"beta_policies":"policies",beta_only:d?.betaOnly??!1,policies_removed:f,removed_count:f.length,...d?.source?{source:d.source}:{},platform:(0,g.platform)(),arch:(0,g.arch)(),os_release:(0,g.release)(),hostname_hash:(0,R.hashToId)((0,g.hostname)())})}catch{}console.log(`Disabled ${a.length-k.length} policy(ies).`),console.log(`Remaining: ${j.length>0?j.join(", "):"(none)"}`);return}let i=n(f,c),j=0,k=!1;for(let a of h){let d=N(a);for(let a of"all"===b?[...d.scopes]:d.scopes.includes(b)?[b]:[]){let f=d.getSettingsPath(a,c);if(!(0,e.existsSync)(f)){"all"!==b&&1===h.length&&(console.log("No settings file found. Nothing to remove."),k=!0);continue}let g=d.removeHooksFromFile(f);if(0===g&&"all"!==b&&1===h.length){console.log("No hooks found in settings. Nothing to remove."),k=!0;continue}j+=g,"all"!==b&&(console.log(`Removed ${g} failproofai hook(s) from ${d.displayName} settings.`),console.log(`Settings: ${f}`))}}if(!k||0!==j){if("all"===b)for(let a of(console.log(`Removed ${j} failproofai hook(s) from all scopes.`),h)){let b=N(a);for(let a of b.scopes)console.log(` ${b.displayName} / ${a}: ${b.getSettingsPath(a,c)}`)}try{let a=(0,R.getInstanceId)();await ah(a,"hooks_removed",{scope:b,cli:h,removal_mode:"hooks",policies_removed:i.enabledPolicies,removed_count:j,...d?.source?{source:d.source}:{},platform:(0,g.platform)(),arch:(0,g.arch)(),os_release:(0,g.release)(),hostname_hash:(0,R.hashToId)((0,g.hostname)())})}catch{}if("all"===b)for(let a of q){let b=n(a,c);if(b.enabledPolicies.length>0||b.customPoliciesPath||b.policyParams){let{customPoliciesPath:d,policyParams:e,...f}=b;o({...f,enabledPolicies:[]},a,c)}}else if(!q.some(a=>ap(a,c))){let{customPoliciesPath:a,policyParams:b,...d}=n(f,c);o({...d,enabledPolicies:[]},f,c)}}}var as=a.i(24282),at=a.i(12714),au=a.i(13095);async function av(a){if(!(0,e.existsSync)(a))return[];let b=await (0,at.readFile)(a,"utf-8"),c=[],d=b.split(/customPolicies\.add\s*\(/);for(let a=1;a<d.length;a++){let b=d[a],e=b.match(/name:\s*["'`]([^"'`]+)["'`]/);if(!e)continue;let f=b.match(/description:\s*["'`]([^"'`]+)["'`]/),g=b.match(/events:\s*\[([^\]]+)\]/),h=g?g[1].replace(/["'`\s]/g,"").split(",").filter(Boolean).join(", "):void 0;c.push({name:e[1],description:f?.[1],eventScope:h})}return c}async function aw(){let a=k(),b=new Set(a.enabledPolicies),c=q.filter(a=>ap(a)),d=an(c[0]??"user"),e=r.map(a=>M[a]).map(a=>({id:a.id,label:(0,as.getCliLabel)(a.id),installed:a.hooksInstalledInSettings("user"),settingsPath:a.getSettingsPath("user"),detected:a.detectInstalled()})),f=Q.BUILTIN_POLICIES.map(c=>{var d;let e,f;return{name:c.name,description:c.description,category:c.category,defaultEnabled:c.defaultEnabled,beta:!!c.beta,enabled:b.has(c.name),eventScope:(d=c.match,e=d.events?.join(", ")??"",f=d.toolNames?` \xb7 ${d.toolNames.join(", ")}`:"",`${e}${f}`),params:c.params?Object.fromEntries(Object.entries(c.params).map(([a,b])=>[a,{type:b.type,description:b.description,default:b.default}])):void 0,currentParams:c.params?a.policyParams?.[c.name]??{}:void 0}}),g=a.customPoliciesPath?await av(a.customPoliciesPath):void 0;return{enabledPolicies:a.enabledPolicies,installedScopes:c,settingsPath:d,clis:e,policies:f,customPoliciesPath:a.customPoliciesPath,customPolicies:g?.length?g:void 0}}async function ax(a,b){let c=k(),d=new Set(c.enabledPolicies);b?d.add(a):d.delete(a),l({...c,enabledPolicies:[...d]});try{let c=(0,R.getInstanceId)();await ah(c,"policy_toggled",{policy_name:a,enabled:b,action:b?"enable":"disable",source:"web"})}catch{}}async function ay(a="user",b){let c=k(),d=c.enabledPolicies.length>0?c.enabledPolicies:Q.BUILTIN_POLICIES.filter(a=>a.defaultEnabled&&!a.beta).map(a=>a.name),e=b&&b.length>0?b:O(),f=e.length>0?e:["claude"];await aq(d,a,void 0,!1,"web",void 0,!1,f)}async function az(a="user",b){let c=b&&b.length>0?b:O(),d=c.length>0?c:["claude"];await ar(void 0,a,void 0,{source:"web",cli:d})}async function aA(a,b){let c=k(),d={...c.policyParams??{},[a]:b};l({...c,policyParams:d});try{let c=(0,R.getInstanceId)();await ah(c,"policy_params_updated",{policy_name:a,param_keys:Object.keys(b),source:"web"})}catch{}}(0,au.ensureServerEntryExports)([aw]),(0,d.registerServerReference)(aw,"00ac73278a1ec0a36f9e8cb4be1890989f7f64d496",null),(0,au.ensureServerEntryExports)([ax]),(0,d.registerServerReference)(ax,"60b2a045cdfd16d59db807ff83dc95475b141e30c0",null),(0,au.ensureServerEntryExports)([ay,az]),(0,d.registerServerReference)(ay,"60ff40d400f85e6affc45b53f7f0c50621ffe87a00",null),(0,d.registerServerReference)(az,"60dc98c5e31bb0fe9a095d876b5e4fc9769ab4a853",null),(0,au.ensureServerEntryExports)([aA]),(0,d.registerServerReference)(aA,"6053421e29bb7f50e902f2fa46c7d256843065ef29",null),a.s([],63895),a.i(63895),a.s(["002043545864f67de0561dce1d8f496b97ff0978b5",()=>b.getTelemetryConfig,"00ac73278a1ec0a36f9e8cb4be1890989f7f64d496",0,aw,"406892584b6766ac3537fa59d583245e62f03235c0",()=>c.getHookActivityAction,"60326ef27b27a730edfeadbaff35cc1e2f4def8c30",()=>c.searchHookActivityAction,"6053421e29bb7f50e902f2fa46c7d256843065ef29",0,aA,"60b2a045cdfd16d59db807ff83dc95475b141e30c0",0,ax,"60dc98c5e31bb0fe9a095d876b5e4fc9769ab4a853",0,az,"60ff40d400f85e6affc45b53f7f0c50621ffe87a00",0,ay],11369)}];
|
|
220
|
-
|
|
221
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__1mt35_w._.js.map
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
module.exports=[74533,(a,b,c)=>{b.exports=a.x("node:child_process",()=>require("node:child_process"))},50227,(a,b,c)=>{b.exports=a.x("node:path",()=>require("node:path"))},60526,(a,b,c)=>{b.exports=a.x("node:os",()=>require("node:os"))},2157,(a,b,c)=>{b.exports=a.x("node:fs",()=>require("node:fs"))},66680,(a,b,c)=>{b.exports=a.x("node:crypto",()=>require("node:crypto"))},37936,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"registerServerReference",{enumerable:!0,get:function(){return d.registerServerReference}});let d=a.r(11857)},12072,(a,b,c)=>{b.exports={name:"failproofai",version:"0.0.13-beta.0",description:"The easiest way to manage policies that keep your AI agents reliable, on-task, and running autonomously — for Claude Code & the Agents SDK",bin:{failproofai:"./dist/cli.mjs"},files:["bin/","src/","scripts/","lib/","pi-extension/",".next/standalone/","dist/","README.md"],engines:{node:">=20.9.0",bun:">=1.3.0"},scripts:{predev:"bun run build:cli && bun link",dev:"FAILPROOFAI_TELEMETRY_DISABLED=1 bun scripts/dev.ts --port 8020","build:cli":"bun build --target=node --format=esm --outfile=dist/cli.mjs bin/failproofai.mjs --external posthog-node && node -e \"const fs=require('fs');const c=fs.readFileSync('dist/cli.mjs','utf8');fs.writeFileSync('dist/cli.mjs',c.replace('#!/usr/bin/env bun','#!/usr/bin/env node').replace('// @bun\\n',''))\"",build:"bun build --target=node --format=cjs --outfile=dist/index.js src/index.ts && bun run build:cli && bun --bun next build && node -e \"const {cpSync}=require('fs');cpSync('.next/static','.next/standalone/.next/static',{recursive:true});\" && node scripts/prune-standalone.mjs",prestart:"bun run build:cli && bun link",start:"FAILPROOFAI_TELEMETRY_DISABLED=1 bun scripts/start.ts",test:"vitest","test:run":"vitest run",lint:"eslint . --config eslint.config.mjs",postinstall:"node scripts/postinstall.mjs",preuninstall:"node scripts/preuninstall.mjs",prepare:"bun run build","test:e2e":"vitest run --config vitest.config.e2e.mts","test:e2e:watch":"vitest --config vitest.config.e2e.mts",translate:"bun scripts/translate-docs/cli.ts","translate:readme":"bun scripts/translate-docs/cli.ts --readme-only","translate:docs":"bun scripts/translate-docs/cli.ts --docs-only","translate:dry-run":"bun scripts/translate-docs/cli.ts --dry-run","translate:validate":"bun scripts/translate-docs/cli.ts --validate","validate:mdx":"bun scripts/validate-mdx.ts"},keywords:["claude","claude-code","claude-agents-sdk","anthropic","ai-agent","agent-reliability","agent-monitoring","autonomous-agent","failure-prevention","developer-tools","devtools","cli","local-first","hooks","policies"],author:"ExosphereHost Inc. <failproofai@exosphere.host>",license:"SEE LICENSE IN LICENSE",homepage:"https://github.com/FailproofAI/failproofai",repository:{type:"git",url:"https://github.com/FailproofAI/failproofai.git"},bugs:{url:"https://github.com/FailproofAI/failproofai/issues"},publishConfig:{access:"public"},devDependencies:{"@anthropic-ai/sdk":"^0.110.0","@mdx-js/mdx":"^3.1.1","@tailwindcss/postcss":"^4.3.1","@tanstack/react-virtual":"^3.14.3","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@testing-library/user-event":"^14.6.1","@types/node":"26.1.0","@types/react":"19.2.17","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^6.0.1",clsx:"^2.1.1",eslint:"^10.5.0","eslint-config-next":"^16.2.9",jsdom:"^29.1.1","lucide-react":"^1.18.0",next:"^16.2.9",react:"^19.2.4","react-dom":"^19.2.4","tailwind-merge":"^3.4.0",tailwindcss:"^4.3.1",typescript:"6.0.3",vitest:"^4.1.9"},dependencies:{"html-to-image":"^1.11.13",html2canvas:"^1.4.1","posthog-node":"^5.37.1"},overrides:{postcss:"8.5.14","eslint-plugin-react-hooks":"7.0.1",vite:"8.0.16",undici:"7.28.0"}}},13095,(a,b,c)=>{"use strict";function d(a){for(let b=0;b<a.length;b++){let c=a[b];if("function"!=typeof c)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof c}.
|
|
2
|
-
Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"ensureServerEntryExports",{enumerable:!0,get:function(){return d}})},36359,69839,79779,a=>{"use strict";let b;var c=a.i(37936),d=a.i(2157),e=a.i(50227),f=a.i(60526),g=a.i(66680);a.i(74533);let h=e.default.join(f.default.homedir(),".failproofai"),i=e.default.join(h,"instance-id");function j(a){return g.default.createHmac("sha256","failproofai-telemetry-v1").update(a).digest("hex")}function k(){if(b)return b;let a=function(){try{for(let a of(f.default.platform(),["/etc/machine-id","/var/lib/dbus/machine-id"]))try{let b=d.default.readFileSync(a,"utf-8").trim();if(b)return b}catch{}}catch{}}();if(a)return b=j(a);let c=[f.default.hostname(),f.default.homedir(),f.default.platform(),f.default.arch(),f.default.cpus()[0]?.model??""].join(":");return b=c?j(c):function(){try{let a=d.default.readFileSync(i,"utf-8").trim();if(a)return a}catch{}let a=g.default.randomUUID();try{d.default.mkdirSync(h,{recursive:!0}),d.default.writeFileSync(i,a,"utf-8")}catch{}return a}()}a.s(["getInstanceId",0,k,"hashToId",0,j],69839),a.s(["POSTHOG_API_KEY",0,"phc_Ac1Ww1GqKc0z1SyrRWbmatEeQdlOQIsDEEdP8l8JRgX","POSTHOG_PRODUCT",0,"failproofai-oss"],79779);var l=a.i(12072);async function m(){let a="1"!==process.env.FAILPROOFAI_TELEMETRY_DISABLED;return{enabled:a,distinctId:a?k():"",apiKey:process.env.FAILPROOFAI_POSTHOG_KEY??"phc_Ac1Ww1GqKc0z1SyrRWbmatEeQdlOQIsDEEdP8l8JRgX",host:process.env.FAILPROOFAI_POSTHOG_HOST??"https://us.i.posthog.com",version:l.version}}(0,a.i(13095).ensureServerEntryExports)([m]),(0,c.registerServerReference)(m,"002043545864f67de0561dce1d8f496b97ff0978b5",null),a.s(["getTelemetryConfig",0,m],36359)},39027,a=>{"use strict";var b=a.i(36359);a.s([],35268),a.i(35268),a.s(["002043545864f67de0561dce1d8f496b97ff0978b5",()=>b.getTelemetryConfig],39027)},2726,a=>{a.v(b=>Promise.all(["server/chunks/ssr/[externals]__1_g_b3t._.js","server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_11bnuzn._.js"].map(b=>a.l(b))).then(()=>b(74493)))}];
|
|
3
|
-
|
|
4
|
-
//# sourceMappingURL=%5Broot-of-the-server%5D__1pcxxwg._.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,8734,89664,e=>{"use strict";var t=e.i(56420);let s=(0,t.default)("copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);e.s(["Copy",0,s],8734);let a=(0,t.default)("check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);e.s(["Check",0,a],89664)},24380,e=>{"use strict";var t=e.i(43476),s=e.i(71645),a=e.i(8734),r=e.i(89664),l=e.i(47163);function n(e){let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t);try{return t.select(),document.execCommand("copy")}finally{document.body.removeChild(t)}}e.s(["CopyButton",0,function({text:e,className:i}){let[o,d]=(0,s.useState)(!1),c=(0,s.useCallback)(async()=>{try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(e);else if(!n(e))throw Error("Both clipboard methods failed");d(!0),setTimeout(()=>d(!1),2e3)}catch(t){console.error("Failed to copy to clipboard:",t);try{n(e)&&(d(!0),setTimeout(()=>d(!1),2e3))}catch{}}},[e]);return(0,t.jsx)("button",{onClick:c,title:"Copy to clipboard",className:(0,l.cn)("inline-flex items-center justify-center rounded p-1 text-muted-foreground hover:text-foreground hover:bg-muted/80 transition-colors",i),children:o?(0,t.jsx)(r.Check,{className:"w-3.5 h-3.5 text-green-500"}):(0,t.jsx)(a.Copy,{className:"w-3.5 h-3.5"})})}])},24071,e=>{"use strict";let t=(0,e.i(56420).default)("chevron-left",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);e.s(["ChevronLeft",0,t],24071)},67927,e=>{"use strict";let t=(0,e.i(56420).default)("chevron-right",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);e.s(["ChevronRight",0,t],67927)},73520,e=>{"use strict";var t=e.i(43476),s=e.i(24071),a=e.i(67927);e.s(["default",0,function({currentPage:e,totalPages:r,onPageChange:l}){if(r<=1)return null;let n=e=>`px-3 py-2 text-sm rounded-md transition-colors flex items-center gap-1 bg-muted text-muted-foreground ${e?"opacity-50 cursor-not-allowed":"hover:bg-muted/80"}`;return(0,t.jsxs)("div",{className:"flex items-center justify-center gap-2 py-4",children:[(0,t.jsxs)("button",{onClick:()=>l(e-1),disabled:1===e,className:n(1===e),"aria-label":"Previous page",children:[(0,t.jsx)(s.ChevronLeft,{className:"w-4 h-4"}),(0,t.jsx)("span",{className:"hidden sm:inline",children:"Previous"})]}),(0,t.jsx)("div",{className:"flex items-center gap-1",children:(()=>{if(r<=7)return Array.from({length:r},(e,t)=>t+1);let t=[1],s=Math.max(2,e-1),a=Math.min(r-1,e+1);e<=3&&(a=Math.min(5,r-1)),e>=r-2&&(s=Math.max(2,r-4)),s>2&&t.push("ellipsis-start");for(let e=s;e<=a;e++)t.push(e);return a<r-1&&t.push("ellipsis-end"),t.push(r),t})().map(s=>"string"==typeof s?(0,t.jsx)("span",{className:"px-2 text-muted-foreground",children:"..."},s):(0,t.jsx)("button",{onClick:()=>l(s),className:`min-w-[2.5rem] px-3 py-2 text-sm rounded-md transition-colors ${e===s?"bg-primary text-primary-foreground":"bg-muted text-muted-foreground hover:bg-muted/80"}`,"aria-label":`Page ${s}`,"aria-current":e===s?"page":void 0,children:s},s))}),(0,t.jsxs)("button",{onClick:()=>l(e+1),disabled:e===r,className:n(e===r),"aria-label":"Next page",children:[(0,t.jsx)("span",{className:"hidden sm:inline",children:"Next"}),(0,t.jsx)(a.ChevronRight,{className:"w-4 h-4"})]})]})}])},80060,2711,e=>{"use strict";var t=e.i(18566),s=e.i(71645);function a(e){let t=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),a=String(e.getDate()).padStart(2,"0");return`${t}-${s}-${a}`}function r(e){var t;if(!e||(t=e,!/^\d{4}-\d{2}-\d{2}$/.test(t)||isNaN(Date.parse(t))))return null;let[s,a,r]=e.split("-").map(Number);return new Date(s,a-1,r,12,0,0)}e.s(["useUrlParams",0,function(){let e=(0,t.useSearchParams)(),a=(0,t.useRouter)(),r=(0,t.usePathname)(),l=(0,s.useRef)(null),n=(0,s.useCallback)(t=>e.get(t),[e]),i=(0,s.useCallback)(()=>new URLSearchParams(e.toString()),[e]),o=(0,s.useCallback)(t=>{l.current&&clearTimeout(l.current),l.current=setTimeout(()=>{let s=new URLSearchParams(e.toString());for(let[e,a]of Object.entries(t))void 0===a||""===a?s.delete(e):s.set(e,a);let l=s.toString(),n=l?`${r}?${l}`:r;a.replace(n,{scroll:!1})},150)},[e,r,a]);return(0,s.useEffect)(()=>()=>{l.current&&clearTimeout(l.current)},[]),{get:n,getAll:i,setAll:o}}],80060),e.s(["dateRangeToParams",0,function(e){let t={};return e.from&&(t.from=a(e.from)),e.to&&(t.to=a(e.to)),t},"keywordsToParam",0,function(e){if(0!==e.length)return e.map(e=>encodeURIComponent(e)).join(",")},"pageToParam",0,function(e){return e<=1?void 0:String(e)},"paramToKeywords",0,function(e){return e?e.split(",").map(e=>decodeURIComponent(e.trim())).filter(e=>e.length>0):[]},"paramToPage",0,function(e){if(!e)return 1;let t=parseInt(e,10);return Number.isFinite(t)&&t>=1?t:1},"paramToPreset",0,function(e){return e&&["all","last-hour","today","last-7-days","last-30-days","custom"].includes(e)?e:"all"},"paramsToDateRange",0,function(e,t){return{from:r(e),to:r(t)}},"presetToParam",0,function(e){return"all"===e?void 0:e}],2711)},24578,e=>{"use strict";let t={claude:{id:"claude",label:"Claude Code",badgeClasses:"bg-orange-500/10 text-orange-400 border-orange-500/20"},codex:{id:"codex",label:"OpenAI Codex",badgeClasses:"bg-purple-500/10 text-purple-400 border-purple-500/20"},copilot:{id:"copilot",label:"GitHub Copilot",badgeClasses:"bg-blue-500/10 text-blue-400 border-blue-500/20"},cursor:{id:"cursor",label:"Cursor Agent",badgeClasses:"bg-emerald-500/10 text-emerald-400 border-emerald-500/20"},opencode:{id:"opencode",label:"OpenCode",badgeClasses:"bg-amber-500/10 text-amber-400 border-amber-500/20"},pi:{id:"pi",label:"Pi",badgeClasses:"bg-pink-500/10 text-pink-400 border-pink-500/20"},gemini:{id:"gemini",label:"Gemini CLI",badgeClasses:"bg-sky-500/10 text-sky-400 border-sky-500/20"}};e.s(["KNOWN_CLI_IDS",0,["claude","codex","copilot","cursor","opencode","pi","gemini"],"getCliBadgeClasses",0,function(e){return t[e]?.badgeClasses??t.claude.badgeClasses},"getCliLabel",0,function(e){return t[e]?.label??e},"isKnownCli",0,function(e){return"string"==typeof e&&Object.prototype.hasOwnProperty.call(t,e)}])},62706,20087,30005,66595,85898,e=>{"use strict";e.s(["formatDate",0,function(e){return new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0}).format(e)}],62706),e.s(["FILTER_PRESETS",0,[{value:"all",label:"All"},{value:"last-hour",label:"Last Hour"},{value:"today",label:"Today"},{value:"last-7-days",label:"Last 7 Days"},{value:"last-30-days",label:"Last 30 Days"}],"ITEMS_PER_PAGE",0,25,"filterByDate",0,function(e,t,s){if("all"===t)return e;if("custom"===t){let t,a,r=s.from?((t=new Date(s.from)).setHours(0,0,0,0),t):null,l=s.to?((a=new Date(s.to)).setHours(23,59,59,999),a):null;return e.filter(e=>(!r||!(e.lastModified<r))&&(!l||!(e.lastModified>l)))}let a=function(e){let t=new Date;switch(e){case"last-hour":return new Date(t.getTime()-36e5);case"today":return new Date(t.getFullYear(),t.getMonth(),t.getDate());case"last-7-days":return new Date(t.getTime()-6048e5);case"last-30-days":return new Date(t.getTime()-2592e6);default:return null}}(t);return a?e.filter(e=>e.lastModified>=a):e},"rehydrateDates",0,function(e){return e.map(e=>({...e,lastModified:e.lastModified instanceof Date?e.lastModified:new Date(e.lastModified)}))}],20087);var t=e.i(71645);e.s(["useFilterState",0,function(e=[],s){let[a,r]=(0,t.useState)(s?.filterPreset??"all"),[l,n]=(0,t.useState)(s?.dateRange??{from:null,to:null}),[i,o]=(0,t.useState)(s?.currentPage??1),d=`${a}|${JSON.stringify(l)}|${JSON.stringify(e)}`,[c,u]=(0,t.useState)(d);d!==c&&(u(d),o(1));let m=(0,t.useCallback)(e=>{r(e),"custom"!==e&&n({from:null,to:null})},[]);return{filterPreset:a,dateRange:l,currentPage:i,setCurrentPage:o,handlePresetChange:m,handleDateRangeChange:(0,t.useCallback)((e,t)=>{r("custom"),n(s=>({...s,[e]:t?new Date(t):null}))},[]),clearFilters:(0,t.useCallback)(()=>{r("all"),n({from:null,to:null})},[])}}],30005);var s=e.i(56420);let a=(0,s.default)("search",[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]]);e.s(["Search",0,a],66595);var r=e.i(43476);let l=(0,s.default)("calendar",[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]]);e.s(["default",0,function({id:e,value:t,stringValue:s,onChange:a,"aria-label":n}){let i=null!=s?s:t?t.toISOString().split("T")[0]:"";return(0,r.jsxs)("div",{className:"relative group",children:[(0,r.jsx)("input",{type:"date",id:e,value:i,onChange:e=>a(e.target.value),"aria-label":n,className:"date-input px-3 py-2 pr-8 text-sm bg-input border border-border rounded-md text-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent transition-all hover:border-primary/50 w-[200px]"}),(0,r.jsx)("label",{htmlFor:e,className:"absolute right-2.5 top-1/2 -translate-y-1/2 cursor-pointer pointer-events-auto z-10 p-1 rounded hover:bg-muted/50 transition-colors",onClick:t=>{t.preventDefault();let s=document.getElementById(e);s&&"function"==typeof s.showPicker?s.showPicker():s?.click()},children:(0,r.jsx)(l,{className:"w-4 h-4 text-primary group-hover:text-primary/80 transition-colors"})})]})}],85898)},43418,e=>{"use strict";var t=e.i(43476),s=e.i(24578);e.s(["CliBadge",0,function({cli:e}){let a=(0,s.getCliLabel)(e),r=(0,s.getCliBadgeClasses)(e);return(0,t.jsx)("span",{className:`inline-flex items-center rounded px-1.5 py-0.5 text-[0.6rem] font-mono font-medium uppercase tracking-wider border ${r}`,title:`Agent CLI: ${a}`,children:a})}])},73294,e=>{"use strict";var t=e.i(43476),s=e.i(71645),a=e.i(62706),r=e.i(20087),l=e.i(30005),n=e.i(80060),i=e.i(2711);let o=(0,e.i(56420).default)("file",[["path",{d:"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",key:"1oefj6"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}]]);var d=e.i(66595),c=e.i(22016),u=e.i(73520),m=e.i(85898),h=e.i(24380),p=e.i(43418);e.s(["default",0,function({files:e,projectName:f}){let g=(0,n.useUrlParams)(),x=(0,s.useRef)(!1),[b,y]=(0,s.useState)(()=>g.get("sid")??""),{filterPreset:j,dateRange:v,currentPage:C,setCurrentPage:N,handlePresetChange:w,handleDateRangeChange:k,clearFilters:P}=(0,l.useFilterState)([b],{filterPreset:(0,i.paramToPreset)(g.get("preset")),dateRange:(0,i.paramsToDateRange)(g.get("from"),g.get("to")),currentPage:(0,i.paramToPage)(g.get("page"))});(0,s.useEffect)(()=>{if(!x.current){x.current=!0;return}g.setAll({preset:(0,i.presetToParam)(j),...(0,i.dateRangeToParams)(v),sid:b||void 0,page:(0,i.pageToParam)(C)})},[j,v,b,C]);let T=(0,s.useMemo)(()=>(0,r.rehydrateDates)(e),[e]),S=(0,s.useMemo)(()=>{var e;let t;return(e=(0,r.filterByDate)(T,j,v),!(t=b.trim().toLowerCase())?e:e.filter(e=>e.sessionId?.toLowerCase().includes(t))).sort((e,t)=>t.lastModified.getTime()-e.lastModified.getTime())},[T,b,j,v]),M=Math.max(1,Math.ceil(S.length/r.ITEMS_PER_PAGE));(0,s.useEffect)(()=>{C>M&&N(M)},[C,M,N]);let D=(C-1)*r.ITEMS_PER_PAGE,R=Math.min(D+r.ITEMS_PER_PAGE,S.length),I=S.slice(D,R),E="all"!==j||null!==v.from||null!==v.to||""!==b;return(0,t.jsxs)("div",{className:"sessions-list",children:[(0,t.jsxs)("div",{className:"sessions-filter-bar",children:[(0,t.jsxs)("div",{className:"sessions-filter-row",children:[(0,t.jsx)("span",{className:"sessions-filter-label",children:"filter by"}),r.FILTER_PRESETS.map(e=>(0,t.jsx)("button",{type:"button",onClick:()=>w(e.value),className:`sessions-chip${j===e.value?" on":""}`,children:e.label},e.value))]}),(0,t.jsxs)("div",{className:"sessions-filter-row",children:[(0,t.jsx)("span",{className:"sessions-filter-label",children:"range"}),(0,t.jsx)(m.default,{id:"date-from",value:v.from,onChange:e=>k("from",e),"aria-label":"Filter from date"}),(0,t.jsx)("span",{className:"sessions-range-sep",children:"to"}),(0,t.jsx)(m.default,{id:"date-to",value:v.to,onChange:e=>k("to",e),"aria-label":"Filter to date"})]}),(0,t.jsxs)("div",{className:"sessions-filter-row",children:[(0,t.jsxs)("span",{className:"sessions-filter-label",children:[(0,t.jsx)(d.Search,{className:"sessions-filter-icon","aria-hidden":"true"}),"session id"]}),(0,t.jsx)("input",{type:"text",value:b,onChange:e=>y(e.target.value),placeholder:"paste a session uuid",className:"sessions-input","aria-label":"Filter by session ID"}),E&&(0,t.jsx)("button",{type:"button",onClick:()=>{P(),y("")},className:"sessions-chip",style:{marginLeft:"auto"},children:"clear"})]}),(0,t.jsx)("div",{className:"sessions-results-count",children:0===S.length?(0,t.jsx)(t.Fragment,{children:"// no sessions found"}):(0,t.jsxs)(t.Fragment,{children:["// showing"," ",D+1,"–",R," of ",S.length," sessions",S.length!==T.length&&(0,t.jsxs)("span",{children:[" · filtered from ",T.length]})]})})]}),(0,t.jsxs)("div",{className:"sessions-table-wrap",children:[(0,t.jsxs)("table",{className:"sessions-table",children:[(0,t.jsx)("thead",{children:(0,t.jsxs)("tr",{children:[(0,t.jsx)("th",{scope:"col",className:"sessions-th sessions-th-icon",children:(0,t.jsx)("span",{className:"sr-only",children:"Icon"})}),(0,t.jsx)("th",{scope:"col",className:"sessions-th",children:"session id"}),(0,t.jsx)("th",{scope:"col",className:"sessions-th",children:"modified"})]})}),(0,t.jsx)("tbody",{children:0===I.length?(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:3,className:"sessions-td sessions-empty",children:"// no sessions match the filter."})}):I.map(e=>(0,t.jsxs)("tr",{className:"sessions-row",children:[(0,t.jsx)("td",{className:"sessions-td sessions-td-icon",children:(0,t.jsx)(o,{className:"sessions-file-icon","aria-hidden":"true"})}),(0,t.jsxs)("td",{className:"sessions-td sessions-td-name",children:[e.sessionId?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(c.default,{href:`/project/${encodeURIComponent(f)}/session/${encodeURIComponent(e.sessionId)}`,className:"sessions-link",children:e.name.replace(/\.jsonl$/,"")}),(0,t.jsx)(h.CopyButton,{text:e.sessionId})]}):(0,t.jsx)("span",{className:"sessions-link","aria-disabled":"true",children:e.name.replace(/\.jsonl$/,"")}),e.cli&&(0,t.jsx)(p.CliBadge,{cli:e.cli})]}),(0,t.jsx)("td",{className:"sessions-td sessions-td-date",children:e.lastModifiedFormatted||(0,a.formatDate)(e.lastModified)})]},e.path))})]}),S.length>0&&(0,t.jsx)(u.default,{currentPage:C,totalPages:M,onPageChange:N})]})]})}],73294)}]);
|