failproofai 0.0.6-beta.2 → 0.0.6-beta.4
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 +7 -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.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.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 +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +17 -17
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +17 -17
- 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 +11 -11
- 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/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +16 -16
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +16 -16
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +11 -11
- 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.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.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.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.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.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]__0g72weg._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_0z7w.hh._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__092s1ta._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__09icjsf._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g.lg8b._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h..k-e._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0okos0k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0i5kvry._.js → [root-of-the-server]__0om-5pe._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w6l33k._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__05akje6._.js → [root-of-the-server]__111.vxi._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11pa2ra._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12t-wym._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_10lm7or._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_0xerkr6._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_0q-m0y-._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_posthog-node_dist_entrypoints_index_node_mjs_0mebn66._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +2 -2
- 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 +9 -9
- package/.next/standalone/.next/static/chunks/{05j1px0r8yzh6.js → 02dqjyv6_9mhq.js} +2 -2
- package/.next/standalone/.next/static/chunks/{14cl9poem30dq.js → 070orfsl6.xal.js} +1 -1
- package/.next/standalone/.next/static/chunks/0mir9jdxn35~s.css +1 -0
- package/.next/standalone/.next/static/chunks/{00j0rr7rh8ef8.js → 0o547jv-k_k35.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0ijk_kek9_wyx.js → 0pk2h2.mjxy.m.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0xpl.oscrakvx.js → 0rcwkbh24w38b.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1052sguyd-.ka.js → 140xx_tfr~lm_.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0npb~873.wvg3.js → 169_e4dq~1~b6.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0badv41uxa56..js → 17ne4p.1sw1jy.js} +1 -1
- package/.next/standalone/next.config.ts +6 -0
- package/.next/standalone/package.json +2 -2
- package/.next/standalone/server.js +1 -1
- package/bin/failproofai.mjs +91 -4
- package/dist/cli.mjs +1155 -54
- package/package.json +2 -2
- package/scripts/prune-standalone.mjs +128 -0
- package/src/auth/login.ts +104 -0
- package/src/auth/logout.ts +50 -0
- package/src/auth/token-store.ts +64 -0
- package/src/hooks/builtin-policies.ts +22 -20
- package/src/hooks/handler.ts +35 -15
- package/src/relay/daemon.ts +362 -0
- package/src/relay/pid.ts +76 -0
- package/src/relay/queue.ts +225 -0
- package/.next/standalone/.claude/settings.json +0 -316
- package/.next/standalone/.failproofai/policies/review-policies.mjs +0 -113
- package/.next/standalone/.failproofai/policies/workflow-policies.mjs +0 -63
- package/.next/standalone/.failproofai/policies-config.json +0 -39
- package/.next/standalone/.next/static/chunks/0gu_a.a80ritd.css +0 -1
- package/.next/standalone/AGENTS.md +0 -80
- package/.next/standalone/CHANGELOG.md +0 -151
- package/.next/standalone/CLAUDE.md +0 -165
- package/.next/standalone/CONTRIBUTING.md +0 -76
- package/.next/standalone/Dockerfile.docs +0 -12
- package/.next/standalone/LICENSE +0 -42
- package/.next/standalone/README.md +0 -301
- package/.next/standalone/bin/failproofai.mjs +0 -352
- package/.next/standalone/bun.lock +0 -1119
- package/.next/standalone/components.json +0 -23
- package/.next/standalone/dist/cli.mjs +0 -3595
- package/.next/standalone/dist/index.js +0 -80
- package/.next/standalone/docs/ar/architecture.mdx +0 -334
- package/.next/standalone/docs/ar/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/ar/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ar/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ar/cli/hook.mdx +0 -31
- package/.next/standalone/docs/ar/cli/install-policies.mdx +0 -48
- package/.next/standalone/docs/ar/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ar/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ar/cli/version.mdx +0 -13
- package/.next/standalone/docs/ar/configuration.mdx +0 -223
- package/.next/standalone/docs/ar/custom-policies.mdx +0 -354
- package/.next/standalone/docs/ar/dashboard.mdx +0 -142
- package/.next/standalone/docs/ar/examples.mdx +0 -307
- package/.next/standalone/docs/ar/for-agents.mdx +0 -39
- package/.next/standalone/docs/ar/getting-started.mdx +0 -187
- package/.next/standalone/docs/ar/introduction.mdx +0 -58
- package/.next/standalone/docs/ar/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ar/testing.mdx +0 -261
- package/.next/standalone/docs/architecture.mdx +0 -332
- package/.next/standalone/docs/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/cli/hook.mdx +0 -30
- package/.next/standalone/docs/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/cli/version.mdx +0 -12
- package/.next/standalone/docs/configuration.mdx +0 -222
- package/.next/standalone/docs/custom-policies.mdx +0 -353
- package/.next/standalone/docs/dashboard.mdx +0 -142
- package/.next/standalone/docs/de/architecture.mdx +0 -332
- package/.next/standalone/docs/de/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/de/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/de/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/de/cli/hook.mdx +0 -30
- package/.next/standalone/docs/de/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/de/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/de/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/de/cli/version.mdx +0 -12
- package/.next/standalone/docs/de/configuration.mdx +0 -222
- package/.next/standalone/docs/de/custom-policies.mdx +0 -353
- package/.next/standalone/docs/de/dashboard.mdx +0 -142
- package/.next/standalone/docs/de/examples.mdx +0 -307
- package/.next/standalone/docs/de/for-agents.mdx +0 -38
- package/.next/standalone/docs/de/getting-started.mdx +0 -186
- package/.next/standalone/docs/de/introduction.mdx +0 -57
- package/.next/standalone/docs/de/package-aliases.mdx +0 -82
- package/.next/standalone/docs/de/testing.mdx +0 -260
- package/.next/standalone/docs/docs.json +0 -1002
- package/.next/standalone/docs/es/architecture.mdx +0 -332
- package/.next/standalone/docs/es/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/es/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/es/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/es/cli/hook.mdx +0 -30
- package/.next/standalone/docs/es/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/es/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/es/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/es/cli/version.mdx +0 -12
- package/.next/standalone/docs/es/configuration.mdx +0 -222
- package/.next/standalone/docs/es/custom-policies.mdx +0 -353
- package/.next/standalone/docs/es/dashboard.mdx +0 -142
- package/.next/standalone/docs/es/examples.mdx +0 -307
- package/.next/standalone/docs/es/for-agents.mdx +0 -38
- package/.next/standalone/docs/es/getting-started.mdx +0 -186
- package/.next/standalone/docs/es/introduction.mdx +0 -57
- package/.next/standalone/docs/es/package-aliases.mdx +0 -82
- package/.next/standalone/docs/es/testing.mdx +0 -260
- package/.next/standalone/docs/examples.mdx +0 -307
- package/.next/standalone/docs/favicon.ico +0 -0
- package/.next/standalone/docs/for-agents.mdx +0 -38
- package/.next/standalone/docs/fr/architecture.mdx +0 -332
- package/.next/standalone/docs/fr/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/fr/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/fr/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/fr/cli/hook.mdx +0 -30
- package/.next/standalone/docs/fr/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/fr/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/fr/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/fr/cli/version.mdx +0 -12
- package/.next/standalone/docs/fr/configuration.mdx +0 -222
- package/.next/standalone/docs/fr/custom-policies.mdx +0 -353
- package/.next/standalone/docs/fr/dashboard.mdx +0 -142
- package/.next/standalone/docs/fr/examples.mdx +0 -307
- package/.next/standalone/docs/fr/for-agents.mdx +0 -38
- package/.next/standalone/docs/fr/getting-started.mdx +0 -186
- package/.next/standalone/docs/fr/introduction.mdx +0 -57
- package/.next/standalone/docs/fr/package-aliases.mdx +0 -82
- package/.next/standalone/docs/fr/testing.mdx +0 -260
- package/.next/standalone/docs/getting-started.mdx +0 -186
- package/.next/standalone/docs/he/architecture.mdx +0 -333
- package/.next/standalone/docs/he/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/he/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/he/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/he/cli/hook.mdx +0 -30
- package/.next/standalone/docs/he/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/he/cli/list-policies.mdx +0 -32
- package/.next/standalone/docs/he/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/he/cli/version.mdx +0 -12
- package/.next/standalone/docs/he/configuration.mdx +0 -223
- package/.next/standalone/docs/he/custom-policies.mdx +0 -353
- package/.next/standalone/docs/he/dashboard.mdx +0 -142
- package/.next/standalone/docs/he/examples.mdx +0 -307
- package/.next/standalone/docs/he/for-agents.mdx +0 -38
- package/.next/standalone/docs/he/getting-started.mdx +0 -186
- package/.next/standalone/docs/he/introduction.mdx +0 -57
- package/.next/standalone/docs/he/package-aliases.mdx +0 -82
- package/.next/standalone/docs/he/testing.mdx +0 -260
- package/.next/standalone/docs/hi/architecture.mdx +0 -334
- package/.next/standalone/docs/hi/built-in-policies.mdx +0 -576
- package/.next/standalone/docs/hi/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/hi/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/hi/cli/hook.mdx +0 -30
- package/.next/standalone/docs/hi/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/hi/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/hi/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/hi/cli/version.mdx +0 -12
- package/.next/standalone/docs/hi/configuration.mdx +0 -222
- package/.next/standalone/docs/hi/custom-policies.mdx +0 -354
- package/.next/standalone/docs/hi/dashboard.mdx +0 -142
- package/.next/standalone/docs/hi/examples.mdx +0 -309
- package/.next/standalone/docs/hi/for-agents.mdx +0 -38
- package/.next/standalone/docs/hi/getting-started.mdx +0 -187
- package/.next/standalone/docs/hi/introduction.mdx +0 -57
- package/.next/standalone/docs/hi/package-aliases.mdx +0 -82
- package/.next/standalone/docs/hi/testing.mdx +0 -260
- package/.next/standalone/docs/i18n/README.ar.md +0 -312
- package/.next/standalone/docs/i18n/README.de.md +0 -307
- package/.next/standalone/docs/i18n/README.es.md +0 -307
- package/.next/standalone/docs/i18n/README.fr.md +0 -307
- package/.next/standalone/docs/i18n/README.he.md +0 -312
- package/.next/standalone/docs/i18n/README.hi.md +0 -307
- package/.next/standalone/docs/i18n/README.it.md +0 -307
- package/.next/standalone/docs/i18n/README.ja.md +0 -307
- package/.next/standalone/docs/i18n/README.ko.md +0 -307
- package/.next/standalone/docs/i18n/README.pt-br.md +0 -307
- package/.next/standalone/docs/i18n/README.ru.md +0 -308
- package/.next/standalone/docs/i18n/README.tr.md +0 -307
- package/.next/standalone/docs/i18n/README.vi.md +0 -307
- package/.next/standalone/docs/i18n/README.zh.md +0 -307
- package/.next/standalone/docs/introduction.mdx +0 -57
- package/.next/standalone/docs/it/architecture.mdx +0 -334
- package/.next/standalone/docs/it/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/it/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/it/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/it/cli/hook.mdx +0 -30
- package/.next/standalone/docs/it/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/it/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/it/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/it/cli/version.mdx +0 -12
- package/.next/standalone/docs/it/configuration.mdx +0 -222
- package/.next/standalone/docs/it/custom-policies.mdx +0 -353
- package/.next/standalone/docs/it/dashboard.mdx +0 -142
- package/.next/standalone/docs/it/examples.mdx +0 -307
- package/.next/standalone/docs/it/for-agents.mdx +0 -38
- package/.next/standalone/docs/it/getting-started.mdx +0 -186
- package/.next/standalone/docs/it/introduction.mdx +0 -57
- package/.next/standalone/docs/it/package-aliases.mdx +0 -82
- package/.next/standalone/docs/it/testing.mdx +0 -260
- package/.next/standalone/docs/ja/architecture.mdx +0 -332
- package/.next/standalone/docs/ja/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/ja/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ja/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ja/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ja/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/ja/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ja/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ja/cli/version.mdx +0 -12
- package/.next/standalone/docs/ja/configuration.mdx +0 -222
- package/.next/standalone/docs/ja/custom-policies.mdx +0 -353
- package/.next/standalone/docs/ja/dashboard.mdx +0 -142
- package/.next/standalone/docs/ja/examples.mdx +0 -307
- package/.next/standalone/docs/ja/for-agents.mdx +0 -38
- package/.next/standalone/docs/ja/getting-started.mdx +0 -186
- package/.next/standalone/docs/ja/introduction.mdx +0 -57
- package/.next/standalone/docs/ja/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ja/testing.mdx +0 -260
- package/.next/standalone/docs/ko/architecture.mdx +0 -332
- package/.next/standalone/docs/ko/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/ko/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ko/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ko/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ko/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/ko/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/ko/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ko/cli/version.mdx +0 -12
- package/.next/standalone/docs/ko/configuration.mdx +0 -222
- package/.next/standalone/docs/ko/custom-policies.mdx +0 -353
- package/.next/standalone/docs/ko/dashboard.mdx +0 -142
- package/.next/standalone/docs/ko/examples.mdx +0 -307
- package/.next/standalone/docs/ko/for-agents.mdx +0 -38
- package/.next/standalone/docs/ko/getting-started.mdx +0 -186
- package/.next/standalone/docs/ko/introduction.mdx +0 -57
- package/.next/standalone/docs/ko/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ko/testing.mdx +0 -260
- package/.next/standalone/docs/logo/dark.svg +0 -21
- package/.next/standalone/docs/logo/exosphere-dark.png +0 -0
- package/.next/standalone/docs/logo/exosphere-light.png +0 -0
- package/.next/standalone/docs/logo/light.svg +0 -21
- package/.next/standalone/docs/package-aliases.mdx +0 -82
- package/.next/standalone/docs/pt-br/architecture.mdx +0 -332
- package/.next/standalone/docs/pt-br/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/pt-br/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/pt-br/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/pt-br/cli/hook.mdx +0 -30
- package/.next/standalone/docs/pt-br/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/pt-br/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/pt-br/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/pt-br/cli/version.mdx +0 -12
- package/.next/standalone/docs/pt-br/configuration.mdx +0 -222
- package/.next/standalone/docs/pt-br/custom-policies.mdx +0 -353
- package/.next/standalone/docs/pt-br/dashboard.mdx +0 -142
- package/.next/standalone/docs/pt-br/examples.mdx +0 -307
- package/.next/standalone/docs/pt-br/for-agents.mdx +0 -38
- package/.next/standalone/docs/pt-br/getting-started.mdx +0 -186
- package/.next/standalone/docs/pt-br/introduction.mdx +0 -57
- package/.next/standalone/docs/pt-br/package-aliases.mdx +0 -82
- package/.next/standalone/docs/pt-br/testing.mdx +0 -260
- package/.next/standalone/docs/ru/architecture.mdx +0 -333
- package/.next/standalone/docs/ru/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/ru/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/ru/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/ru/cli/hook.mdx +0 -30
- package/.next/standalone/docs/ru/cli/install-policies.mdx +0 -48
- package/.next/standalone/docs/ru/cli/list-policies.mdx +0 -32
- package/.next/standalone/docs/ru/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/ru/cli/version.mdx +0 -12
- package/.next/standalone/docs/ru/configuration.mdx +0 -222
- package/.next/standalone/docs/ru/custom-policies.mdx +0 -354
- package/.next/standalone/docs/ru/dashboard.mdx +0 -142
- package/.next/standalone/docs/ru/examples.mdx +0 -309
- package/.next/standalone/docs/ru/for-agents.mdx +0 -38
- package/.next/standalone/docs/ru/getting-started.mdx +0 -186
- package/.next/standalone/docs/ru/introduction.mdx +0 -57
- package/.next/standalone/docs/ru/package-aliases.mdx +0 -82
- package/.next/standalone/docs/ru/testing.mdx +0 -260
- package/.next/standalone/docs/testing.mdx +0 -260
- package/.next/standalone/docs/tr/architecture.mdx +0 -333
- package/.next/standalone/docs/tr/built-in-policies.mdx +0 -574
- package/.next/standalone/docs/tr/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/tr/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/tr/cli/hook.mdx +0 -30
- package/.next/standalone/docs/tr/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/tr/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/tr/cli/remove-policies.mdx +0 -44
- package/.next/standalone/docs/tr/cli/version.mdx +0 -12
- package/.next/standalone/docs/tr/configuration.mdx +0 -222
- package/.next/standalone/docs/tr/custom-policies.mdx +0 -353
- package/.next/standalone/docs/tr/dashboard.mdx +0 -142
- package/.next/standalone/docs/tr/examples.mdx +0 -308
- package/.next/standalone/docs/tr/for-agents.mdx +0 -38
- package/.next/standalone/docs/tr/getting-started.mdx +0 -186
- package/.next/standalone/docs/tr/introduction.mdx +0 -57
- package/.next/standalone/docs/tr/package-aliases.mdx +0 -82
- package/.next/standalone/docs/tr/testing.mdx +0 -260
- package/.next/standalone/docs/vi/architecture.mdx +0 -334
- package/.next/standalone/docs/vi/built-in-policies.mdx +0 -575
- package/.next/standalone/docs/vi/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/vi/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/vi/cli/hook.mdx +0 -30
- package/.next/standalone/docs/vi/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/vi/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/vi/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/vi/cli/version.mdx +0 -13
- package/.next/standalone/docs/vi/configuration.mdx +0 -222
- package/.next/standalone/docs/vi/custom-policies.mdx +0 -353
- package/.next/standalone/docs/vi/dashboard.mdx +0 -142
- package/.next/standalone/docs/vi/examples.mdx +0 -308
- package/.next/standalone/docs/vi/for-agents.mdx +0 -38
- package/.next/standalone/docs/vi/getting-started.mdx +0 -186
- package/.next/standalone/docs/vi/introduction.mdx +0 -57
- package/.next/standalone/docs/vi/package-aliases.mdx +0 -82
- package/.next/standalone/docs/vi/testing.mdx +0 -260
- package/.next/standalone/docs/zh/architecture.mdx +0 -332
- package/.next/standalone/docs/zh/built-in-policies.mdx +0 -572
- package/.next/standalone/docs/zh/cli/dashboard.mdx +0 -28
- package/.next/standalone/docs/zh/cli/environment-variables.mdx +0 -34
- package/.next/standalone/docs/zh/cli/hook.mdx +0 -30
- package/.next/standalone/docs/zh/cli/install-policies.mdx +0 -47
- package/.next/standalone/docs/zh/cli/list-policies.mdx +0 -31
- package/.next/standalone/docs/zh/cli/remove-policies.mdx +0 -43
- package/.next/standalone/docs/zh/cli/version.mdx +0 -12
- package/.next/standalone/docs/zh/configuration.mdx +0 -222
- package/.next/standalone/docs/zh/custom-policies.mdx +0 -353
- package/.next/standalone/docs/zh/dashboard.mdx +0 -142
- package/.next/standalone/docs/zh/examples.mdx +0 -307
- package/.next/standalone/docs/zh/for-agents.mdx +0 -38
- package/.next/standalone/docs/zh/getting-started.mdx +0 -186
- package/.next/standalone/docs/zh/introduction.mdx +0 -57
- package/.next/standalone/docs/zh/package-aliases.mdx +0 -82
- package/.next/standalone/docs/zh/testing.mdx +0 -260
- package/.next/standalone/eslint.config.mjs +0 -15
- package/.next/standalone/examples/convention-policies/security-policies.mjs +0 -40
- package/.next/standalone/examples/convention-policies/workflow-policies.mjs +0 -41
- package/.next/standalone/examples/policies-advanced/index.js +0 -103
- package/.next/standalone/examples/policies-advanced/utils.js +0 -35
- package/.next/standalone/examples/policies-basic.js +0 -77
- package/.next/standalone/examples/policies-notification.js +0 -104
- package/.next/standalone/node_modules/@img/colour/color.cjs +0 -1594
- package/.next/standalone/node_modules/@img/colour/index.cjs +0 -1
- package/.next/standalone/node_modules/@img/colour/package.json +0 -45
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/README.md +0 -46
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/package.json +0 -42
- package/.next/standalone/node_modules/@img/sharp-libvips-linux-x64/versions.json +0 -30
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +0 -46
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +0 -42
- package/.next/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +0 -30
- package/.next/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-linux-x64/package.json +0 -46
- package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
- package/.next/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +0 -46
- package/.next/standalone/node_modules/detect-libc/lib/detect-libc.js +0 -313
- package/.next/standalone/node_modules/detect-libc/lib/elf.js +0 -39
- package/.next/standalone/node_modules/detect-libc/lib/filesystem.js +0 -51
- package/.next/standalone/node_modules/detect-libc/lib/process.js +0 -24
- package/.next/standalone/node_modules/detect-libc/package.json +0 -44
- package/.next/standalone/node_modules/sharp/lib/channel.js +0 -177
- package/.next/standalone/node_modules/sharp/lib/colour.js +0 -195
- package/.next/standalone/node_modules/sharp/lib/composite.js +0 -212
- package/.next/standalone/node_modules/sharp/lib/constructor.js +0 -499
- package/.next/standalone/node_modules/sharp/lib/index.js +0 -16
- package/.next/standalone/node_modules/sharp/lib/input.js +0 -809
- package/.next/standalone/node_modules/sharp/lib/is.js +0 -143
- package/.next/standalone/node_modules/sharp/lib/libvips.js +0 -207
- package/.next/standalone/node_modules/sharp/lib/operation.js +0 -1016
- package/.next/standalone/node_modules/sharp/lib/output.js +0 -1666
- package/.next/standalone/node_modules/sharp/lib/resize.js +0 -595
- package/.next/standalone/node_modules/sharp/lib/sharp.js +0 -121
- package/.next/standalone/node_modules/sharp/lib/utility.js +0 -291
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/comparator.js +0 -143
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/range.js +0 -557
- package/.next/standalone/node_modules/sharp/node_modules/semver/classes/semver.js +0 -333
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/cmp.js +0 -54
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/coerce.js +0 -62
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/compare.js +0 -7
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/eq.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gt.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/gte.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lt.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/lte.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/neq.js +0 -5
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/parse.js +0 -18
- package/.next/standalone/node_modules/sharp/node_modules/semver/functions/satisfies.js +0 -12
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/constants.js +0 -37
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/debug.js +0 -11
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/identifiers.js +0 -29
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/lrucache.js +0 -42
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/parse-options.js +0 -17
- package/.next/standalone/node_modules/sharp/node_modules/semver/internal/re.js +0 -223
- package/.next/standalone/node_modules/sharp/node_modules/semver/package.json +0 -78
- package/.next/standalone/node_modules/sharp/package.json +0 -202
- package/.next/standalone/scripts/alias-proxy.js +0 -18
- package/.next/standalone/scripts/dev.ts +0 -3
- package/.next/standalone/scripts/install-telemetry.mjs +0 -108
- package/.next/standalone/scripts/launch.ts +0 -83
- package/.next/standalone/scripts/parse-script-args.ts +0 -87
- package/.next/standalone/scripts/postinstall.mjs +0 -121
- package/.next/standalone/scripts/preuninstall.mjs +0 -131
- package/.next/standalone/scripts/publish-aliases.mjs +0 -87
- package/.next/standalone/scripts/start.ts +0 -3
- package/.next/standalone/scripts/sync-hook-events-prompt.md +0 -60
- package/.next/standalone/scripts/translate-docs/cache.ts +0 -62
- package/.next/standalone/scripts/translate-docs/cli.ts +0 -357
- package/.next/standalone/scripts/translate-docs/config.ts +0 -248
- package/.next/standalone/scripts/translate-docs/mdx-translator.ts +0 -153
- package/.next/standalone/scripts/translate-docs/mintlify-nav.ts +0 -107
- package/.next/standalone/scripts/translate-docs/readme-translator.ts +0 -154
- package/.next/standalone/scripts/translate-docs/translator.ts +0 -68
- package/.next/standalone/scripts/translate-docs/types.ts +0 -43
- package/.next/standalone/src/cli-error.ts +0 -18
- package/.next/standalone/src/hooks/builtin-policies.ts +0 -1613
- package/.next/standalone/src/hooks/custom-hooks-loader.ts +0 -205
- package/.next/standalone/src/hooks/custom-hooks-registry.ts +0 -30
- package/.next/standalone/src/hooks/handler.ts +0 -202
- package/.next/standalone/src/hooks/hook-activity-store.ts +0 -349
- package/.next/standalone/src/hooks/hook-logger.ts +0 -133
- package/.next/standalone/src/hooks/hook-telemetry.ts +0 -43
- package/.next/standalone/src/hooks/hooks-config.ts +0 -166
- package/.next/standalone/src/hooks/install-prompt.ts +0 -357
- package/.next/standalone/src/hooks/llm-client.ts +0 -90
- package/.next/standalone/src/hooks/loader-utils.ts +0 -178
- package/.next/standalone/src/hooks/manager.ts +0 -692
- package/.next/standalone/src/hooks/policy-evaluator.ts +0 -224
- package/.next/standalone/src/hooks/policy-helpers.ts +0 -16
- package/.next/standalone/src/hooks/policy-registry.ts +0 -90
- package/.next/standalone/src/hooks/policy-types.ts +0 -77
- package/.next/standalone/src/hooks/types.ts +0 -63
- package/.next/standalone/src/index.ts +0 -19
- package/.next/standalone/src/posthog-key.ts +0 -5
- package/.next/standalone/tailwind.config.ts +0 -11
- package/.next/standalone/tsconfig.json +0 -42
- package/.next/standalone/vitest.config.e2e.mts +0 -24
- package/.next/standalone/vitest.config.mts +0 -23
- /package/.next/standalone/.next/static/{A9pNTZdoYJTVyPAYwQMx5 → wOkJXoch1UmRAmyIuKZWc}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{A9pNTZdoYJTVyPAYwQMx5 → wOkJXoch1UmRAmyIuKZWc}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{A9pNTZdoYJTVyPAYwQMx5 → wOkJXoch1UmRAmyIuKZWc}/_ssgManifest.js +0 -0
|
@@ -1,357 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Interactive searchable multi-select prompt for choosing hook policies.
|
|
3
|
-
* Uses raw mode stdin with node:readline for keypress handling.
|
|
4
|
-
* No external dependencies.
|
|
5
|
-
*
|
|
6
|
-
* Rendering strategy: track line count, use cursor-up + clear-to-end-of-screen
|
|
7
|
-
* (\x1B[NA\x1B[J) to avoid flickering. Lines are truncated to terminal width to
|
|
8
|
-
* ensure lastLineCount stays accurate when the terminal is narrow.
|
|
9
|
-
*
|
|
10
|
-
* Keybindings: ↑↓ navigate · Space toggle · Ctrl+A all · Ctrl+S save · Esc clear search
|
|
11
|
-
*/
|
|
12
|
-
import * as readline from "node:readline";
|
|
13
|
-
import { BUILTIN_POLICIES } from "./builtin-policies";
|
|
14
|
-
|
|
15
|
-
interface SelectItem {
|
|
16
|
-
name: string;
|
|
17
|
-
description: string;
|
|
18
|
-
category: string;
|
|
19
|
-
selected: boolean;
|
|
20
|
-
beta: boolean;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
type DisplayRow =
|
|
24
|
-
| { kind: "header"; category: string; enabledCount: number; totalCount: number }
|
|
25
|
-
| { kind: "item"; item: SelectItem; filteredIndex: number };
|
|
26
|
-
|
|
27
|
-
export interface PromptOptions {
|
|
28
|
-
includeBeta?: boolean;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Show interactive searchable policy selector.
|
|
33
|
-
* @param preSelected — policy names to pre-check (e.g. from existing config).
|
|
34
|
-
* When omitted, uses each policy's defaultEnabled flag.
|
|
35
|
-
* @param options — prompt options (e.g. includeBeta)
|
|
36
|
-
*/
|
|
37
|
-
export async function promptPolicySelection(
|
|
38
|
-
preSelected?: string[],
|
|
39
|
-
options: PromptOptions = {},
|
|
40
|
-
): Promise<string[]> {
|
|
41
|
-
const { includeBeta = false } = options;
|
|
42
|
-
|
|
43
|
-
// If stdin is not a TTY (piped/CI), return defaults
|
|
44
|
-
if (!process.stdin.isTTY) {
|
|
45
|
-
const available = BUILTIN_POLICIES.filter((p) => includeBeta || !p.beta);
|
|
46
|
-
if (preSelected) return preSelected.filter((name) => available.some((p) => p.name === name));
|
|
47
|
-
return available.filter((p) => p.defaultEnabled).map((p) => p.name);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const preSelectedSet = preSelected ? new Set(preSelected) : null;
|
|
51
|
-
|
|
52
|
-
const items: SelectItem[] = BUILTIN_POLICIES
|
|
53
|
-
.filter((p) => includeBeta || !p.beta)
|
|
54
|
-
.map((p) => ({
|
|
55
|
-
name: p.name,
|
|
56
|
-
description: p.description,
|
|
57
|
-
category: p.category,
|
|
58
|
-
selected: preSelectedSet ? preSelectedSet.has(p.name) : p.defaultEnabled,
|
|
59
|
-
beta: !!p.beta,
|
|
60
|
-
}));
|
|
61
|
-
|
|
62
|
-
const total = items.length;
|
|
63
|
-
const WINDOW_SIZE = 8;
|
|
64
|
-
|
|
65
|
-
let cursor = 0;
|
|
66
|
-
let search = "";
|
|
67
|
-
let lastLineCount = 0;
|
|
68
|
-
let cursorHidden = false;
|
|
69
|
-
|
|
70
|
-
function hideCursor(): void {
|
|
71
|
-
if (!cursorHidden) {
|
|
72
|
-
process.stdout.write("\x1B[?25l");
|
|
73
|
-
cursorHidden = true;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function showCursor(): void {
|
|
78
|
-
if (cursorHidden) {
|
|
79
|
-
process.stdout.write("\x1B[?25h");
|
|
80
|
-
cursorHidden = false;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Truncate a line to `width` visual columns, skipping ANSI CSI sequences.
|
|
85
|
-
function truncateLine(line: string, width: number): string {
|
|
86
|
-
let visual = 0;
|
|
87
|
-
let result = "";
|
|
88
|
-
let i = 0;
|
|
89
|
-
while (i < line.length) {
|
|
90
|
-
if (line[i] === "\x1B" && line[i + 1] === "[") {
|
|
91
|
-
let j = i + 2;
|
|
92
|
-
while (j < line.length && !/[A-Za-z]/.test(line[j])) j++;
|
|
93
|
-
j++;
|
|
94
|
-
result += line.slice(i, j);
|
|
95
|
-
i = j;
|
|
96
|
-
} else {
|
|
97
|
-
if (visual >= width) break;
|
|
98
|
-
result += line[i];
|
|
99
|
-
visual++;
|
|
100
|
-
i++;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return result;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function getFiltered(): SelectItem[] {
|
|
107
|
-
if (!search) return items;
|
|
108
|
-
const q = search.toLowerCase();
|
|
109
|
-
return items.filter(
|
|
110
|
-
(i) => i.name.toLowerCase().includes(q) || i.description.toLowerCase().includes(q),
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Build display rows: category header rows interspersed with item rows.
|
|
115
|
-
// Categories appear in the order they first appear in BUILTIN_POLICIES.
|
|
116
|
-
function buildDisplayRows(filtered: SelectItem[]): DisplayRow[] {
|
|
117
|
-
// Single pass: compute category order, enabled counts, and total counts together.
|
|
118
|
-
const categoryOrder: string[] = [];
|
|
119
|
-
const categoryEnabledCount = new Map<string, number>();
|
|
120
|
-
const categoryTotalCount = new Map<string, number>();
|
|
121
|
-
for (const p of items) {
|
|
122
|
-
if (!categoryEnabledCount.has(p.category)) {
|
|
123
|
-
categoryOrder.push(p.category);
|
|
124
|
-
categoryEnabledCount.set(p.category, 0);
|
|
125
|
-
categoryTotalCount.set(p.category, 0);
|
|
126
|
-
}
|
|
127
|
-
categoryTotalCount.set(p.category, categoryTotalCount.get(p.category)! + 1);
|
|
128
|
-
if (p.selected) categoryEnabledCount.set(p.category, categoryEnabledCount.get(p.category)! + 1);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const filteredByCategory = new Map<string, SelectItem[]>();
|
|
132
|
-
for (const item of filtered) {
|
|
133
|
-
const bucket = filteredByCategory.get(item.category) ?? [];
|
|
134
|
-
bucket.push(item);
|
|
135
|
-
filteredByCategory.set(item.category, bucket);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const rows: DisplayRow[] = [];
|
|
139
|
-
let idx = 0;
|
|
140
|
-
for (const cat of categoryOrder) {
|
|
141
|
-
const catFiltered = filteredByCategory.get(cat);
|
|
142
|
-
if (!catFiltered || catFiltered.length === 0) continue;
|
|
143
|
-
rows.push({ kind: "header", category: cat, enabledCount: categoryEnabledCount.get(cat)!, totalCount: categoryTotalCount.get(cat)! });
|
|
144
|
-
for (const item of catFiltered) {
|
|
145
|
-
rows.push({ kind: "item", item, filteredIndex: idx++ });
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
return rows;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
function render(): void {
|
|
152
|
-
const cols = process.stdout.columns || 120;
|
|
153
|
-
hideCursor();
|
|
154
|
-
|
|
155
|
-
const filtered = getFiltered();
|
|
156
|
-
const shown = filtered.length;
|
|
157
|
-
|
|
158
|
-
// Clamp cursor to filtered list bounds
|
|
159
|
-
if (shown > 0 && cursor >= shown) cursor = shown - 1;
|
|
160
|
-
|
|
161
|
-
const lines: string[] = [];
|
|
162
|
-
|
|
163
|
-
// ── Title ────────────────────────────────────────────────────
|
|
164
|
-
lines.push(" Failproof AI \u2014 Policy Manager");
|
|
165
|
-
lines.push("");
|
|
166
|
-
|
|
167
|
-
// ── Bordered search box ──────────────────────────────────────
|
|
168
|
-
const innerWidth = Math.max(20, cols - 6);
|
|
169
|
-
const topBorder = " \u250c" + "\u2500".repeat(innerWidth + 2) + "\u2510";
|
|
170
|
-
const botBorder = " \u2514" + "\u2500".repeat(innerWidth + 2) + "\u2518";
|
|
171
|
-
const cursorChar = "\x1B[7m \x1B[0m"; // reverse-video block cursor
|
|
172
|
-
const countPart = search
|
|
173
|
-
? ` \x1B[2m(${shown}/${total})\x1B[0m`
|
|
174
|
-
: ` \x1B[2m(${total} policies)\x1B[0m`;
|
|
175
|
-
const searchContent = `\x1B[1mSearch:\x1B[0m ${search}${cursorChar}${countPart}`;
|
|
176
|
-
lines.push(topBorder);
|
|
177
|
-
lines.push(` \u2502 ${searchContent}`);
|
|
178
|
-
lines.push(botBorder);
|
|
179
|
-
lines.push("");
|
|
180
|
-
|
|
181
|
-
// ── Content area ─────────────────────────────────────────────
|
|
182
|
-
if (shown === 0) {
|
|
183
|
-
lines.push(" \x1B[2mNo policies match \u201c" + search + "\u201d\x1B[0m");
|
|
184
|
-
// Pad to stable height: 1 (scroll-up) + WINDOW_SIZE (rows) + 1 (scroll-down)
|
|
185
|
-
for (let i = 0; i < WINDOW_SIZE + 1; i++) lines.push("");
|
|
186
|
-
} else {
|
|
187
|
-
const displayRows = buildDisplayRows(filtered);
|
|
188
|
-
|
|
189
|
-
// Find the display row index that corresponds to the current cursor
|
|
190
|
-
let cursorDisplayRow = 0;
|
|
191
|
-
for (let i = 0; i < displayRows.length; i++) {
|
|
192
|
-
const row = displayRows[i];
|
|
193
|
-
if (row.kind === "item" && row.filteredIndex === cursor) {
|
|
194
|
-
cursorDisplayRow = i;
|
|
195
|
-
break;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Viewport: keep cursor row roughly centred
|
|
200
|
-
let windowStart = cursorDisplayRow - Math.floor(WINDOW_SIZE / 2);
|
|
201
|
-
windowStart = Math.max(0, windowStart);
|
|
202
|
-
windowStart = Math.min(windowStart, Math.max(0, displayRows.length - WINDOW_SIZE));
|
|
203
|
-
const windowEnd = Math.min(displayRows.length, windowStart + WINDOW_SIZE);
|
|
204
|
-
|
|
205
|
-
// Scroll-up indicator (always reserve this line for stable height)
|
|
206
|
-
const aboveItems = displayRows
|
|
207
|
-
.slice(0, windowStart)
|
|
208
|
-
.filter((r) => r.kind === "item").length;
|
|
209
|
-
if (aboveItems > 0) {
|
|
210
|
-
lines.push(` \x1B[2m \u2191 ${aboveItems} more above\x1B[0m`);
|
|
211
|
-
} else {
|
|
212
|
-
lines.push("");
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// Visible display rows
|
|
216
|
-
for (let i = windowStart; i < windowEnd; i++) {
|
|
217
|
-
const row = displayRows[i];
|
|
218
|
-
if (row.kind === "header") {
|
|
219
|
-
// ── CATEGORY NAME (enabled/total) ─────
|
|
220
|
-
const label = ` ${row.category.toUpperCase()} (${row.enabledCount}/${row.totalCount}) `;
|
|
221
|
-
const prefix = "\u2500\u2500 ";
|
|
222
|
-
const prefixLen = 3 + label.length;
|
|
223
|
-
const dashLen = Math.max(2, cols - 2 - prefixLen);
|
|
224
|
-
lines.push(
|
|
225
|
-
` \x1B[2m${prefix}${label}${"\u2500".repeat(dashLen)}\x1B[0m`,
|
|
226
|
-
);
|
|
227
|
-
} else {
|
|
228
|
-
const item = row.item;
|
|
229
|
-
const isActive = row.filteredIndex === cursor;
|
|
230
|
-
const pointer = isActive ? "\x1B[36m\u276f\x1B[0m" : " ";
|
|
231
|
-
const check = item.selected ? "\x1B[32m[\u2713]\x1B[0m" : "[ ]";
|
|
232
|
-
const namePart = isActive
|
|
233
|
-
? `\x1B[1;36m${item.name}\x1B[0m`
|
|
234
|
-
: item.name;
|
|
235
|
-
const betaPart = item.beta ? " \x1B[35m[beta]\x1B[0m" : "";
|
|
236
|
-
const pad = " ".repeat(Math.max(1, 28 - item.name.length));
|
|
237
|
-
const desc = `\x1B[2m${item.description}\x1B[0m`;
|
|
238
|
-
lines.push(` ${pointer} ${check} ${namePart}${betaPart}${pad}${desc}`);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// Pad window to fixed WINDOW_SIZE rows for stable height
|
|
243
|
-
for (let i = windowEnd - windowStart; i < WINDOW_SIZE; i++) {
|
|
244
|
-
lines.push("");
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// Scroll-down indicator (always reserve this line for stable height)
|
|
248
|
-
const belowItems = displayRows
|
|
249
|
-
.slice(windowEnd)
|
|
250
|
-
.filter((r) => r.kind === "item").length;
|
|
251
|
-
if (belowItems > 0) {
|
|
252
|
-
lines.push(` \x1B[2m \u2193 ${belowItems} more below\x1B[0m`);
|
|
253
|
-
} else {
|
|
254
|
-
lines.push("");
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// ── Footer ───────────────────────────────────────────────────
|
|
259
|
-
lines.push("");
|
|
260
|
-
lines.push(" \x1B[2m" + "\u2500".repeat(cols - 2) + "\x1B[0m");
|
|
261
|
-
lines.push(
|
|
262
|
-
" [\u2191\u2193] Move [Space] Toggle [Ctrl+A] All [Ctrl+S] Save [Esc] Clear [^C] Quit",
|
|
263
|
-
);
|
|
264
|
-
lines.push("");
|
|
265
|
-
lines.push(
|
|
266
|
-
" \x1B[2mTip: `policies` for a flat list \u00b7 `policies --install <name\u2026>` to skip prompt\x1B[0m",
|
|
267
|
-
);
|
|
268
|
-
if (!includeBeta) {
|
|
269
|
-
lines.push(
|
|
270
|
-
" \x1B[2mTip: `policies --install --beta` to include beta policies\x1B[0m",
|
|
271
|
-
);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// ── Repaint: cursor-up by previous line count, clear to end, redraw ──
|
|
275
|
-
if (lastLineCount > 0) {
|
|
276
|
-
process.stdout.write(`\x1B[${lastLineCount}A\x1B[J`);
|
|
277
|
-
}
|
|
278
|
-
const output =
|
|
279
|
-
lines.map((l) => (l === "" ? l : truncateLine(l, cols))).join("\n") + "\n";
|
|
280
|
-
process.stdout.write(output);
|
|
281
|
-
lastLineCount = lines.length;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
return new Promise<string[]>((resolve) => {
|
|
285
|
-
render();
|
|
286
|
-
|
|
287
|
-
process.stdin.setRawMode(true);
|
|
288
|
-
process.stdin.resume();
|
|
289
|
-
// Use a single data→keypress pipeline with no readline.Interface.
|
|
290
|
-
// readline.createInterface would register its own competing data listener
|
|
291
|
-
// and its close() call would unexpectedly pause stdin, breaking arrow keys.
|
|
292
|
-
readline.emitKeypressEvents(process.stdin);
|
|
293
|
-
|
|
294
|
-
function keypressHandler(_str: string | undefined, key: readline.Key): void {
|
|
295
|
-
if (!key) return;
|
|
296
|
-
|
|
297
|
-
if (key.ctrl && key.name === "c") {
|
|
298
|
-
cleanup();
|
|
299
|
-
process.exit(0);
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
const filtered = getFiltered();
|
|
303
|
-
|
|
304
|
-
if (key.name === "up") {
|
|
305
|
-
if (filtered.length > 0) {
|
|
306
|
-
cursor = cursor > 0 ? cursor - 1 : filtered.length - 1;
|
|
307
|
-
}
|
|
308
|
-
render();
|
|
309
|
-
} else if (key.name === "down") {
|
|
310
|
-
if (filtered.length > 0) {
|
|
311
|
-
cursor = cursor < filtered.length - 1 ? cursor + 1 : 0;
|
|
312
|
-
}
|
|
313
|
-
render();
|
|
314
|
-
} else if (key.name === "return" || key.name === "space") {
|
|
315
|
-
const item = filtered[cursor];
|
|
316
|
-
if (item) item.selected = !item.selected;
|
|
317
|
-
render();
|
|
318
|
-
} else if (key.name === "escape") {
|
|
319
|
-
// Clear search filter
|
|
320
|
-
search = "";
|
|
321
|
-
cursor = 0;
|
|
322
|
-
render();
|
|
323
|
-
} else if (key.ctrl && key.name === "a") {
|
|
324
|
-
// Toggle all visible items
|
|
325
|
-
const allSelected = filtered.length > 0 && filtered.every((i) => i.selected);
|
|
326
|
-
for (const item of filtered) item.selected = !allSelected;
|
|
327
|
-
render();
|
|
328
|
-
} else if (key.ctrl && key.name === "s") {
|
|
329
|
-
// Submit
|
|
330
|
-
cleanup();
|
|
331
|
-
const selected = items.filter((i) => i.selected).map((i) => i.name);
|
|
332
|
-
process.stdout.write("\n");
|
|
333
|
-
resolve(selected);
|
|
334
|
-
} else if (key.name === "backspace" || key.name === "delete") {
|
|
335
|
-
if (search.length > 0) {
|
|
336
|
-
search = search.slice(0, -1);
|
|
337
|
-
cursor = 0;
|
|
338
|
-
render();
|
|
339
|
-
}
|
|
340
|
-
} else if (_str && _str.length === 1 && !key.ctrl && !key.meta) {
|
|
341
|
-
// All printable characters (including 'a', 's') go to search
|
|
342
|
-
search += _str;
|
|
343
|
-
cursor = 0;
|
|
344
|
-
render();
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
function cleanup(): void {
|
|
349
|
-
showCursor();
|
|
350
|
-
process.stdin.removeListener("keypress", keypressHandler);
|
|
351
|
-
process.stdin.setRawMode(false);
|
|
352
|
-
process.stdin.pause();
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
process.stdin.on("keypress", keypressHandler);
|
|
356
|
-
});
|
|
357
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared OpenAI-compatible chat completions client.
|
|
3
|
-
*
|
|
4
|
-
* Uses raw `fetch` — no SDK dependency. Any policy can import this
|
|
5
|
-
* to make LLM calls using the shared configuration from policies-config.json
|
|
6
|
-
* or environment variables.
|
|
7
|
-
*/
|
|
8
|
-
import { readLlmConfig } from "./hooks-config";
|
|
9
|
-
import { hookLogInfo, hookLogError } from "./hook-logger";
|
|
10
|
-
|
|
11
|
-
export interface ChatMessage {
|
|
12
|
-
role: "system" | "user" | "assistant";
|
|
13
|
-
content: string;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface ChatCompletionOptions {
|
|
17
|
-
temperature?: number;
|
|
18
|
-
maxTokens?: number;
|
|
19
|
-
responseFormat?: { type: "json_object" };
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface ChatCompletionResponse {
|
|
23
|
-
content: string;
|
|
24
|
-
usage?: {
|
|
25
|
-
promptTokens: number;
|
|
26
|
-
completionTokens: number;
|
|
27
|
-
totalTokens: number;
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export async function chatCompletion(
|
|
32
|
-
messages: ChatMessage[],
|
|
33
|
-
options?: ChatCompletionOptions & { cwd?: string },
|
|
34
|
-
): Promise<ChatCompletionResponse> {
|
|
35
|
-
const config = readLlmConfig(options?.cwd);
|
|
36
|
-
if (!config) {
|
|
37
|
-
throw new Error(
|
|
38
|
-
"No LLM API key configured. Set FAILPROOFAI_LLM_API_KEY or configure llm.apiKey in policies-config.json",
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const body: Record<string, unknown> = {
|
|
43
|
-
model: config.model,
|
|
44
|
-
messages,
|
|
45
|
-
temperature: options?.temperature ?? 0.2,
|
|
46
|
-
max_tokens: options?.maxTokens ?? 4096,
|
|
47
|
-
};
|
|
48
|
-
if (options?.responseFormat) {
|
|
49
|
-
body.response_format = options.responseFormat;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const url = `${config.baseUrl.replace(/\/+$/, "")}/chat/completions`;
|
|
53
|
-
|
|
54
|
-
hookLogInfo(`llm-client: POST ${url} model=${config.model} messages=${messages.length}`);
|
|
55
|
-
|
|
56
|
-
const response = await fetch(url, {
|
|
57
|
-
method: "POST",
|
|
58
|
-
headers: {
|
|
59
|
-
"Content-Type": "application/json",
|
|
60
|
-
Authorization: `Bearer ${config.apiKey}`,
|
|
61
|
-
},
|
|
62
|
-
body: JSON.stringify(body),
|
|
63
|
-
signal: AbortSignal.timeout(30_000),
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
if (!response.ok) {
|
|
67
|
-
let errBody = "";
|
|
68
|
-
try { errBody = await response.text(); } catch {}
|
|
69
|
-
hookLogError(`llm-client: ${response.status} ${response.statusText} — ${errBody.slice(0, 200)}`);
|
|
70
|
-
throw new Error(`LLM API error: ${response.status} ${response.statusText} — ${errBody.slice(0, 200)}`);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const json = (await response.json()) as {
|
|
74
|
-
choices?: Array<{ message?: { content?: string } }>;
|
|
75
|
-
usage?: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number };
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const content = json.choices?.[0]?.message?.content ?? "";
|
|
79
|
-
|
|
80
|
-
const usage = json.usage
|
|
81
|
-
? {
|
|
82
|
-
promptTokens: json.usage.prompt_tokens ?? 0,
|
|
83
|
-
completionTokens: json.usage.completion_tokens ?? 0,
|
|
84
|
-
totalTokens: json.usage.total_tokens ?? 0,
|
|
85
|
-
}
|
|
86
|
-
: undefined;
|
|
87
|
-
|
|
88
|
-
hookLogInfo(`llm-client: OK tokens=${usage?.totalTokens ?? "unknown"}`);
|
|
89
|
-
return { content, usage };
|
|
90
|
-
}
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Utilities for loading ESM hook/eval modules from user-provided .js files.
|
|
3
|
-
*
|
|
4
|
-
* Handles three problems:
|
|
5
|
-
* 1. ESM/CJS: .js files with `import` syntax fail if package.json lacks "type":"module".
|
|
6
|
-
* Fix: writes a temp .mjs copy (Node.js always treats .mjs as ESM).
|
|
7
|
-
* 2. Module resolution: `from 'failproofai'` (or legacy `from 'claudeye'`) won't resolve when running in-repo.
|
|
8
|
-
* Fix: rewrites the specifier to the absolute dist/index.js path via an ESM shim.
|
|
9
|
-
* 3. Transitive imports: files imported by the entry point also need rewriting.
|
|
10
|
-
* Fix: recursively follows local relative imports and rewrites all reachable files.
|
|
11
|
-
*
|
|
12
|
-
* The ESM shim includes hooks API exports.
|
|
13
|
-
*/
|
|
14
|
-
import { readFile, writeFile, unlink, access } from "fs/promises";
|
|
15
|
-
import { resolve, dirname, relative } from "path";
|
|
16
|
-
import { pathToFileURL } from "url";
|
|
17
|
-
|
|
18
|
-
export const TMP_SUFFIX = ".__failproofai_tmp__.mjs";
|
|
19
|
-
|
|
20
|
-
/** Regex to find local relative import specifiers (ESM). */
|
|
21
|
-
const LOCAL_IMPORT_RE = /(?:import\s+(?:[\s\S]*?\s+from\s+)?|export\s+(?:[\s\S]*?\s+from\s+))(['"])(\.\.?\/[^'"]+)\1/g;
|
|
22
|
-
|
|
23
|
-
/** Regex to find local relative require specifiers (CJS). */
|
|
24
|
-
const LOCAL_REQUIRE_RE = /require\s*\(\s*(['"])(\.\.?\/[^'"]+)\1\s*\)/g;
|
|
25
|
-
|
|
26
|
-
export async function fileExists(path: string): Promise<boolean> {
|
|
27
|
-
try {
|
|
28
|
-
await access(path);
|
|
29
|
-
return true;
|
|
30
|
-
} catch {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export async function findDistIndex(): Promise<string | null> {
|
|
36
|
-
// Env var set by scripts/dev.ts, scripts/start.ts, bin/failproofai.mjs
|
|
37
|
-
const distPath = process.env.FAILPROOFAI_DIST_PATH;
|
|
38
|
-
if (distPath) {
|
|
39
|
-
const candidate = resolve(distPath, "index.js");
|
|
40
|
-
if (await fileExists(candidate)) return candidate;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Fallback: check common locations
|
|
44
|
-
const candidates = [
|
|
45
|
-
// Packaged binary: dist is bundled at {binaryDir}/../assets/dist/
|
|
46
|
-
resolve(dirname(process.execPath), "..", "assets", "dist", "index.js"),
|
|
47
|
-
resolve(process.cwd(), "dist", "index.js"),
|
|
48
|
-
resolve(process.cwd(), "node_modules", "failproofai", "dist", "index.js"),
|
|
49
|
-
];
|
|
50
|
-
for (const c of candidates) {
|
|
51
|
-
if (await fileExists(c)) return c;
|
|
52
|
-
}
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Resolve a relative import specifier to an actual file path.
|
|
58
|
-
* Tries the path as-is, then with .js, .mjs, .ts, and /index.js extensions.
|
|
59
|
-
*/
|
|
60
|
-
export async function resolveLocalImport(
|
|
61
|
-
fromDir: string,
|
|
62
|
-
specifier: string,
|
|
63
|
-
): Promise<string | null> {
|
|
64
|
-
const base = resolve(fromDir, specifier);
|
|
65
|
-
const candidates = [base, `${base}.js`, `${base}.mjs`, `${base}.ts`, resolve(base, "index.js")];
|
|
66
|
-
for (const c of candidates) {
|
|
67
|
-
if (await fileExists(c)) return c;
|
|
68
|
-
}
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Create an ESM shim that re-exports from the CJS dist module.
|
|
74
|
-
* Exports the full public API of failproofai: customPolicies, allow, deny, instruct,
|
|
75
|
-
* getCustomHooks, clearCustomHooks.
|
|
76
|
-
*/
|
|
77
|
-
export async function createEsmShim(
|
|
78
|
-
distIndex: string,
|
|
79
|
-
distUrl: string,
|
|
80
|
-
): Promise<{ shimPath: string; shimUrl: string }> {
|
|
81
|
-
const shimPath = distIndex + ".__failproofai_esm_shim__.mjs";
|
|
82
|
-
const shimCode = [
|
|
83
|
-
`import _cjs from '${distUrl}';`,
|
|
84
|
-
`export const customPolicies = _cjs.customPolicies;`,
|
|
85
|
-
`export const getCustomHooks = _cjs.getCustomHooks;`,
|
|
86
|
-
`export const clearCustomHooks = _cjs.clearCustomHooks;`,
|
|
87
|
-
`export const allow = _cjs.allow;`,
|
|
88
|
-
`export const deny = _cjs.deny;`,
|
|
89
|
-
`export const instruct = _cjs.instruct;`,
|
|
90
|
-
`export default _cjs;`,
|
|
91
|
-
].join("\n");
|
|
92
|
-
await writeFile(shimPath, shimCode, "utf-8");
|
|
93
|
-
return { shimPath, shimUrl: pathToFileURL(shimPath).href };
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Rewrite `from 'failproofai'`/`from 'claudeye'` and local relative imports in all files
|
|
98
|
-
* reachable from the entry point. Returns the list of temp files created (including the shim).
|
|
99
|
-
*/
|
|
100
|
-
export async function rewriteFileTree(
|
|
101
|
-
entryPath: string,
|
|
102
|
-
distUrl: string | null,
|
|
103
|
-
distIndex: string | null,
|
|
104
|
-
): Promise<string[]> {
|
|
105
|
-
const queue: string[] = [entryPath];
|
|
106
|
-
const visited = new Set<string>();
|
|
107
|
-
const tmpFiles: string[] = [];
|
|
108
|
-
|
|
109
|
-
let esmShimUrl: string | null = null;
|
|
110
|
-
if (distIndex && distUrl) {
|
|
111
|
-
const shim = await createEsmShim(distIndex, distUrl);
|
|
112
|
-
tmpFiles.push(shim.shimPath);
|
|
113
|
-
esmShimUrl = shim.shimUrl;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
while (queue.length > 0) {
|
|
117
|
-
const filePath = queue.shift()!;
|
|
118
|
-
if (visited.has(filePath)) continue;
|
|
119
|
-
visited.add(filePath);
|
|
120
|
-
|
|
121
|
-
let code = await readFile(filePath, "utf-8");
|
|
122
|
-
|
|
123
|
-
// Rewrite 'failproofai' or legacy 'claudeye' imports to the ESM shim (or direct CJS for require)
|
|
124
|
-
if (esmShimUrl) {
|
|
125
|
-
code = code.replace(
|
|
126
|
-
/from\s+(['"])(?:claudeye|failproofai)\1/g,
|
|
127
|
-
`from '${esmShimUrl}'`,
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
if (distIndex) {
|
|
131
|
-
code = code.replace(
|
|
132
|
-
/require\s*\(\s*(['"])(?:claudeye|failproofai)\1\s*\)/g,
|
|
133
|
-
`require('${distIndex.replace(/\\/g, "\\\\")}')`
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Find local relative imports and collect specifier → replacement mappings
|
|
138
|
-
const dir = dirname(filePath);
|
|
139
|
-
const rewrites = new Map<string, string>();
|
|
140
|
-
for (const re of [LOCAL_IMPORT_RE, LOCAL_REQUIRE_RE]) {
|
|
141
|
-
const freshRe = new RegExp(re.source, re.flags);
|
|
142
|
-
let match: RegExpExecArray | null;
|
|
143
|
-
while ((match = freshRe.exec(code)) !== null) {
|
|
144
|
-
const specifier = match[2];
|
|
145
|
-
if (rewrites.has(specifier)) continue;
|
|
146
|
-
const resolved = await resolveLocalImport(dir, specifier);
|
|
147
|
-
if (!resolved) continue;
|
|
148
|
-
if (!visited.has(resolved) && !queue.includes(resolved)) {
|
|
149
|
-
queue.push(resolved);
|
|
150
|
-
}
|
|
151
|
-
let relPath = relative(dir, resolved + TMP_SUFFIX).split("\\").join("/");
|
|
152
|
-
if (!relPath.startsWith(".")) relPath = "./" + relPath;
|
|
153
|
-
rewrites.set(specifier, relPath);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// Rewrite collected specifiers to point to temp versions
|
|
158
|
-
const sortedSpecs = [...rewrites.keys()].sort((a, b) => b.length - a.length);
|
|
159
|
-
for (const specifier of sortedSpecs) {
|
|
160
|
-
const replacement = rewrites.get(specifier)!;
|
|
161
|
-
const escaped = specifier.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
162
|
-
code = code.replace(new RegExp(`'${escaped}'`, "g"), `'${replacement}'`);
|
|
163
|
-
code = code.replace(new RegExp(`"${escaped}"`, "g"), `"${replacement}"`);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
const tmpPath = filePath + TMP_SUFFIX;
|
|
167
|
-
await writeFile(tmpPath, code, "utf-8");
|
|
168
|
-
tmpFiles.push(tmpPath);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
return tmpFiles;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
export async function cleanupTmpFiles(tmpFiles: string[]): Promise<void> {
|
|
175
|
-
for (const tmp of tmpFiles) {
|
|
176
|
-
try { await unlink(tmp); } catch { /* ignore cleanup errors */ }
|
|
177
|
-
}
|
|
178
|
-
}
|