failproofai 1.0.7-beta.0 → 1.0.7-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.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +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.nft.json +1 -1
- package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page/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 +14 -14
- 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/app/settings/page/server-reference-manifest.json +7 -7
- package/.next/standalone/.next/server/app/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l3yhx4._.js +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0tovk6q._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0trp3yc._.js +1 -1
- package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_hooks_18qtd42._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04usis8._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__056wjo4._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1p28m0u._.js → [root-of-the-server]__0l44ual._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n0xg95._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rwtwpm._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s_yomn._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11mayhe._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1pprgri._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1q4p5b8._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_042cgl1._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0bqoto4._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/{_0cf1olg._.js → _1mel6y1._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_135-c3y._.js → _1v-jvrv._.js} +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/app_actions_get-scheduled-audit_ts_0ei9sni._.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/app_settings_02tf1h4._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_15t8kqj._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1fm2w5z._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_1j0zy3v._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.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 +22 -22
- package/.next/standalone/.next/static/chunks/043j99m8ykg__.css +2 -0
- package/.next/standalone/.next/static/chunks/{0289oapk24zql.js → 0fqd7m_u81mi5.js} +1 -1
- package/.next/standalone/.next/static/chunks/{2tqszh84mp_2l.js → 129ag2bw93bdh.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0pyy9m5cm8zku.js → 1qd741hzlmjbo.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3vwnzfx9q80yl.js → 2_pltstd8-xgs.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3vp7c3knkh8mr.js → 2c8j9l6j_b1ci.js} +1 -1
- package/.next/standalone/.next/static/chunks/3-k569wzcli8q.js +1 -0
- package/.next/standalone/.next/static/chunks/{3cdkxrukvlvul.js → 3brze37td_wnc.js} +1 -1
- package/.next/standalone/.next/static/chunks/{3dnd-_29uiaj3.js → 3otmypm6j_xfo.js} +2 -2
- package/.next/standalone/.next/static/chunks/{00i9thnpht4l1.js → 3ugmd_7dyn0id.js} +1 -1
- package/.next/standalone/.next/static/chunks/3yxro_r2_o9ad.js +69 -0
- package/.next/standalone/PROBE-FOLLOWUP.md +186 -0
- package/.next/standalone/app/actions/get-jev-config.ts +38 -23
- package/.next/standalone/app/actions/update-jev-config.ts +1 -1
- package/.next/standalone/app/settings/jev-panel.tsx +33 -29
- package/.next/standalone/package.json +10 -10
- package/.next/standalone/sdk/python/skill/SKILL.md +60 -14
- package/.next/standalone/sdk/python/skill/agents/openai.yaml +2 -1
- package/.next/standalone/sdk/python/skill/references/evaluator.md +255 -0
- package/.next/standalone/sdk/python/skill/references/events.md +17 -8
- package/.next/standalone/sdk/python/skill/references/frameworks.md +3 -0
- package/.next/standalone/sdk/python/skill/references/install.md +3 -0
- package/.next/standalone/sdk/python/skill/references/integration.md +6 -2
- package/.next/standalone/sdk/python/skill/references/typescript.md +568 -0
- package/.next/standalone/sdk/typescript/CHANGELOG.md +119 -0
- package/.next/standalone/sdk/typescript/LICENSE +42 -0
- package/.next/standalone/sdk/typescript/README.md +552 -0
- package/.next/standalone/sdk/typescript/eslint.config.mjs +59 -0
- package/.next/standalone/sdk/typescript/examples/research-agent.ts +197 -0
- package/.next/standalone/sdk/typescript/integration/ai.test.ts +920 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/agent.ts +337 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package-lock.json +281 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package.json +13 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/surfaces.ts +605 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/tsconfig.surfaces.json +4 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/agent.ts +342 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package-lock.json +168 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package.json +13 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/surfaces.ts +628 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/tsconfig.surfaces.json +4 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/agent.ts +346 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package-lock.json +156 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package.json +13 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/surfaces.ts +651 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/tsconfig.surfaces.json +4 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/agent.ts +350 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package-lock.json +153 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package.json +13 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/surfaces.ts +651 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/tsconfig.surfaces.json +4 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/agent.ts +623 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package-lock.json +463 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/agent-v1.ts +99 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/agent.ts +623 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package-lock.json +336 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/agent.ts +96 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package-lock.json +579 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/index.cjs +53 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/index.mjs +55 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/package.json +18 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/agent.ts +659 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package-lock.json +635 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/agent.ts +659 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package-lock.json +553 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/agent.ts +877 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/mcp-server.mjs +66 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package-lock.json +6417 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/agent.ts +872 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/mcp-server.mjs +66 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package-lock.json +2540 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/actions.ts +18 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/ai/route.ts +42 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/edge/route.ts +29 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/langgraph/route.ts +21 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/llamaindex/route.ts +11 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/mastra/route.ts +19 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/status/route.ts +7 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/layout.tsx +9 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/page.tsx +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/instrumentation.ts +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/ai.ts +61 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/langgraph.ts +68 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/llamaindex.ts +98 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/mastra.ts +90 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/next.config.ts +52 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package-lock.json +4343 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package.json +28 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/agent.ts +51 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/deno-npm.ts +76 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package-lock.json +484 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package.json +15 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/types/agent.ts +79 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/types/package-lock.json +740 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/types/package.json +11 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/agent.ts +197 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/package-lock.json +70 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/package.json +12 -0
- package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/tsconfig.json +12 -0
- package/.next/standalone/sdk/typescript/integration/global-setup.ts +29 -0
- package/.next/standalone/sdk/typescript/integration/harness.ts +451 -0
- package/.next/standalone/sdk/typescript/integration/langchain.test.ts +682 -0
- package/.next/standalone/sdk/typescript/integration/llamaindex.test.ts +709 -0
- package/.next/standalone/sdk/typescript/integration/mastra-coverage.test.ts +386 -0
- package/.next/standalone/sdk/typescript/integration/mastra.test.ts +311 -0
- package/.next/standalone/sdk/typescript/integration/nextjs.test.ts +341 -0
- package/.next/standalone/sdk/typescript/integration/runtime-parity.ts +180 -0
- package/.next/standalone/sdk/typescript/integration/runtimes.bun.test.ts +15 -0
- package/.next/standalone/sdk/typescript/integration/runtimes.core.test.ts +113 -0
- package/.next/standalone/sdk/typescript/integration/runtimes.deno.test.ts +19 -0
- package/.next/standalone/sdk/typescript/integration/types.test.ts +141 -0
- package/.next/standalone/sdk/typescript/integration/vanilla.test.ts +255 -0
- package/.next/standalone/sdk/typescript/package-lock.json +2640 -0
- package/.next/standalone/sdk/typescript/package.json +401 -0
- package/.next/standalone/sdk/typescript/scripts/finalize-build.mjs +123 -0
- package/.next/standalone/sdk/typescript/scripts/release.mjs +177 -0
- package/.next/standalone/sdk/typescript/src/clock.ts +58 -0
- package/.next/standalone/sdk/typescript/src/context.ts +214 -0
- package/.next/standalone/sdk/typescript/src/edge/adapter.ts +18 -0
- package/.next/standalone/sdk/typescript/src/edge/ai.ts +116 -0
- package/.next/standalone/sdk/typescript/src/edge/index.ts +238 -0
- package/.next/standalone/sdk/typescript/src/edge/langchain.ts +18 -0
- package/.next/standalone/sdk/typescript/src/edge/llamaindex.ts +12 -0
- package/.next/standalone/sdk/typescript/src/edge/mastra.ts +17 -0
- package/.next/standalone/sdk/typescript/src/edge/notice.ts +33 -0
- package/.next/standalone/sdk/typescript/src/environment.ts +75 -0
- package/.next/standalone/sdk/typescript/src/evaluator/authoring.ts +480 -0
- package/.next/standalone/sdk/typescript/src/evaluator/cli.ts +96 -0
- package/.next/standalone/sdk/typescript/src/evaluator/client.ts +421 -0
- package/.next/standalone/sdk/typescript/src/evaluator/expression.ts +1292 -0
- package/.next/standalone/sdk/typescript/src/evaluator/index.ts +144 -0
- package/.next/standalone/sdk/typescript/src/evaluator/protocol.ts +747 -0
- package/.next/standalone/sdk/typescript/src/evaluator/runtime.ts +930 -0
- package/.next/standalone/sdk/typescript/src/evaluator/sandbox-worker.ts +171 -0
- package/.next/standalone/sdk/typescript/src/evaluator/source-limits.ts +27 -0
- package/.next/standalone/sdk/typescript/src/evaluator/source.ts +509 -0
- package/.next/standalone/sdk/typescript/src/events.ts +879 -0
- package/.next/standalone/sdk/typescript/src/exit.ts +117 -0
- package/.next/standalone/sdk/typescript/src/index.ts +186 -0
- package/.next/standalone/sdk/typescript/src/integrations/ai.ts +1566 -0
- package/.next/standalone/sdk/typescript/src/integrations/compat.ts +322 -0
- package/.next/standalone/sdk/typescript/src/integrations/core.ts +1321 -0
- package/.next/standalone/sdk/typescript/src/integrations/index.ts +355 -0
- package/.next/standalone/sdk/typescript/src/integrations/langchain.ts +2340 -0
- package/.next/standalone/sdk/typescript/src/integrations/llamaindex.ts +2111 -0
- package/.next/standalone/sdk/typescript/src/integrations/mastra.ts +1802 -0
- package/.next/standalone/sdk/typescript/src/logger.ts +98 -0
- package/.next/standalone/sdk/typescript/src/next.ts +115 -0
- package/.next/standalone/sdk/typescript/src/node-require.ts +446 -0
- package/.next/standalone/sdk/typescript/src/redact.ts +305 -0
- package/.next/standalone/sdk/typescript/src/resolver.ts +120 -0
- package/.next/standalone/sdk/typescript/src/runtime.ts +29 -0
- package/.next/standalone/sdk/typescript/src/schema.ts +410 -0
- package/.next/standalone/sdk/typescript/src/scopes.ts +701 -0
- package/.next/standalone/sdk/typescript/src/shared.ts +33 -0
- package/.next/standalone/sdk/typescript/src/version.ts +5 -0
- package/.next/standalone/sdk/typescript/src/writer.ts +934 -0
- package/.next/standalone/sdk/typescript/test/adapters.test.ts +397 -0
- package/.next/standalone/sdk/typescript/test/ai.test.ts +1076 -0
- package/.next/standalone/sdk/typescript/test/copies.test.ts +204 -0
- package/.next/standalone/sdk/typescript/test/edge.test.ts +183 -0
- package/.next/standalone/sdk/typescript/test/evaluator-client.test.ts +234 -0
- package/.next/standalone/sdk/typescript/test/evaluator-protocol.test.ts +225 -0
- package/.next/standalone/sdk/typescript/test/events.test.ts +193 -0
- package/.next/standalone/sdk/typescript/test/expression.test.ts +181 -0
- package/.next/standalone/sdk/typescript/test/global-setup.ts +26 -0
- package/.next/standalone/sdk/typescript/test/helpers.ts +130 -0
- package/.next/standalone/sdk/typescript/test/integrations.test.ts +369 -0
- package/.next/standalone/sdk/typescript/test/langchain-copies.test.ts +204 -0
- package/.next/standalone/sdk/typescript/test/langchain.test.ts +999 -0
- package/.next/standalone/sdk/typescript/test/llamaindex.test.ts +1760 -0
- package/.next/standalone/sdk/typescript/test/mastra-coverage.test.ts +501 -0
- package/.next/standalone/sdk/typescript/test/mastra-lifecycle.test.ts +479 -0
- package/.next/standalone/sdk/typescript/test/mastra.test.ts +285 -0
- package/.next/standalone/sdk/typescript/test/next.test.ts +109 -0
- package/.next/standalone/sdk/typescript/test/packaging.test.ts +312 -0
- package/.next/standalone/sdk/typescript/test/redaction.test.ts +171 -0
- package/.next/standalone/sdk/typescript/test/runtimes.test.ts +101 -0
- package/.next/standalone/sdk/typescript/test/sandbox.test.ts +189 -0
- package/.next/standalone/sdk/typescript/test/scopes.test.ts +271 -0
- package/.next/standalone/sdk/typescript/test/setup.ts +19 -0
- package/.next/standalone/sdk/typescript/test/skill-snippets.test.ts +73 -0
- package/.next/standalone/sdk/typescript/test/spool-contract.test.ts +124 -0
- package/.next/standalone/sdk/typescript/test/tracker-bounds.test.ts +191 -0
- package/.next/standalone/sdk/typescript/test/wire-format.test.ts +214 -0
- package/.next/standalone/sdk/typescript/test/writer.test.ts +407 -0
- package/.next/standalone/sdk/typescript/tsconfig.build.json +15 -0
- package/.next/standalone/sdk/typescript/tsconfig.cjs.json +19 -0
- package/.next/standalone/sdk/typescript/tsconfig.json +28 -0
- package/.next/standalone/sdk/typescript/vitest.config.ts +33 -0
- package/.next/standalone/sdk/typescript/vitest.integration.config.ts +23 -0
- package/.next/standalone/server.js +1 -1
- package/README.md +2 -2
- package/dist/cli.mjs +225 -30
- package/dist/worker.mjs +120 -14
- package/package.json +10 -10
- package/scripts/build-policy-pack.mjs +14 -0
- package/src/audit/features.ts +3 -2
- package/src/hooks/builtin-policies.ts +156 -5
- package/src/hooks/jev-cli.ts +57 -1
- package/src/hooks/manager.ts +1 -1
- package/src/hooks/pack-cli.ts +191 -24
- package/src/hooks/pack-store.ts +1 -1
- package/src/hooks/policy-catalog.ts +148 -9
- package/src/hooks/types.ts +1 -1
- package/.next/standalone/.next/static/chunks/15heikmy3yjzc.js +0 -1
- package/.next/standalone/.next/static/chunks/285spx855h_3r.css +0 -2
- package/.next/standalone/.next/static/chunks/2plg9qae1yejv.js +0 -69
- /package/.next/standalone/.next/static/{qbVI48kgBOf9CTOKcFIk2 → gbEOjBgZAxF2UIUwZVHNu}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{qbVI48kgBOf9CTOKcFIk2 → gbEOjBgZAxF2UIUwZVHNu}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{qbVI48kgBOf9CTOKcFIk2 → gbEOjBgZAxF2UIUwZVHNu}/_ssgManifest.js +0 -0
package/dist/worker.mjs
CHANGED
|
@@ -708,7 +708,8 @@ var init_policy_catalog = __esm(() => {
|
|
|
708
708
|
impact: "Catches catastrophic `rm -rf /` and Windows equivalents.",
|
|
709
709
|
description: "Prevent catastrophic deletions",
|
|
710
710
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
711
|
-
authority: "
|
|
711
|
+
authority: "reviewable",
|
|
712
|
+
reviewedBy: ["destructive-deletion"],
|
|
712
713
|
defaultEnabled: false,
|
|
713
714
|
category: "Dangerous Commands",
|
|
714
715
|
params: {
|
|
@@ -739,7 +740,8 @@ var init_policy_catalog = __esm(() => {
|
|
|
739
740
|
impact: "kubectl can change live cluster state — gated unless allow-listed.",
|
|
740
741
|
description: "Block kubectl commands (Kubernetes cluster mutations)",
|
|
741
742
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
742
|
-
authority: "
|
|
743
|
+
authority: "reviewable",
|
|
744
|
+
reviewedBy: ["production-infra-change"],
|
|
743
745
|
defaultEnabled: false,
|
|
744
746
|
category: "Infra Commands",
|
|
745
747
|
params: {
|
|
@@ -756,7 +758,8 @@ var init_policy_catalog = __esm(() => {
|
|
|
756
758
|
impact: "Terraform mutates real infrastructure — gated unless allow-listed.",
|
|
757
759
|
description: "Block terraform and tofu (OpenTofu) commands",
|
|
758
760
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
759
|
-
authority: "
|
|
761
|
+
authority: "reviewable",
|
|
762
|
+
reviewedBy: ["production-infra-change"],
|
|
760
763
|
defaultEnabled: false,
|
|
761
764
|
category: "Infra Commands",
|
|
762
765
|
params: {
|
|
@@ -773,7 +776,8 @@ var init_policy_catalog = __esm(() => {
|
|
|
773
776
|
impact: "AWS CLI can spend money or break prod — gated.",
|
|
774
777
|
description: "Block aws CLI commands",
|
|
775
778
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
776
|
-
authority: "
|
|
779
|
+
authority: "reviewable",
|
|
780
|
+
reviewedBy: ["production-infra-change"],
|
|
777
781
|
defaultEnabled: false,
|
|
778
782
|
category: "Infra Commands",
|
|
779
783
|
params: {
|
|
@@ -790,7 +794,8 @@ var init_policy_catalog = __esm(() => {
|
|
|
790
794
|
impact: "gcloud can spend money or break prod — gated.",
|
|
791
795
|
description: "Block gcloud (Google Cloud) CLI commands",
|
|
792
796
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
793
|
-
authority: "
|
|
797
|
+
authority: "reviewable",
|
|
798
|
+
reviewedBy: ["production-infra-change"],
|
|
794
799
|
defaultEnabled: false,
|
|
795
800
|
category: "Infra Commands",
|
|
796
801
|
params: {
|
|
@@ -807,7 +812,8 @@ var init_policy_catalog = __esm(() => {
|
|
|
807
812
|
impact: "az can spend money or break prod — gated.",
|
|
808
813
|
description: "Block az (Azure) CLI commands",
|
|
809
814
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
810
|
-
authority: "
|
|
815
|
+
authority: "reviewable",
|
|
816
|
+
reviewedBy: ["production-infra-change"],
|
|
811
817
|
defaultEnabled: false,
|
|
812
818
|
category: "Infra Commands",
|
|
813
819
|
params: {
|
|
@@ -824,7 +830,8 @@ var init_policy_catalog = __esm(() => {
|
|
|
824
830
|
impact: "Helm releases mutate cluster state — gated.",
|
|
825
831
|
description: "Block helm commands",
|
|
826
832
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
827
|
-
authority: "
|
|
833
|
+
authority: "reviewable",
|
|
834
|
+
reviewedBy: ["production-infra-change"],
|
|
828
835
|
defaultEnabled: false,
|
|
829
836
|
category: "Infra Commands",
|
|
830
837
|
params: {
|
|
@@ -858,7 +865,8 @@ var init_policy_catalog = __esm(() => {
|
|
|
858
865
|
impact: "Stops the agent from creating `.pem`, `id_rsa`, `credentials.json`, etc.",
|
|
859
866
|
description: "Block writing secret key files",
|
|
860
867
|
match: { events: ["PreToolUse"], toolNames: ["Write"] },
|
|
861
|
-
authority: "
|
|
868
|
+
authority: "reviewable",
|
|
869
|
+
reviewedBy: ["secret-exposure"],
|
|
862
870
|
defaultEnabled: false,
|
|
863
871
|
category: "Dangerous Commands",
|
|
864
872
|
params: {
|
|
@@ -892,7 +900,8 @@ var init_policy_catalog = __esm(() => {
|
|
|
892
900
|
impact: "Force-pushes rewrite history and can clobber teammates' work.",
|
|
893
901
|
description: "Prevent force-pushing to any branch",
|
|
894
902
|
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
895
|
-
authority: "
|
|
903
|
+
authority: "reviewable",
|
|
904
|
+
reviewedBy: ["git-history-rewrite"],
|
|
896
905
|
defaultEnabled: false,
|
|
897
906
|
category: "Git"
|
|
898
907
|
},
|
|
@@ -934,6 +943,23 @@ var init_policy_catalog = __esm(() => {
|
|
|
934
943
|
defaultEnabled: false,
|
|
935
944
|
category: "Git"
|
|
936
945
|
},
|
|
946
|
+
{
|
|
947
|
+
name: "warn-git-clean",
|
|
948
|
+
displayTitle: "Tried to delete untracked or ignored files with git clean",
|
|
949
|
+
impact: "`git clean -fdx` takes `.env`, local config and unstaged work — git never had a copy of any of it.",
|
|
950
|
+
description: "Warns before git clean deletes untracked directories (-d) or ignored files (-x / -X)",
|
|
951
|
+
match: { events: ["PreToolUse"], toolNames: ["Bash"] },
|
|
952
|
+
authority: "hard",
|
|
953
|
+
defaultEnabled: false,
|
|
954
|
+
category: "Git",
|
|
955
|
+
params: {
|
|
956
|
+
destructiveFlags: {
|
|
957
|
+
type: "string[]",
|
|
958
|
+
description: "git clean flag letters that make it worth warning about, checked alongside --force. Narrow to ['x','X'] to allow `git clean -fd`, or widen with 'f' to warn on a bare `git clean -f`.",
|
|
959
|
+
default: ["d", "x", "X"]
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
},
|
|
937
963
|
{
|
|
938
964
|
name: "warn-all-files-staged",
|
|
939
965
|
displayTitle: "Staged all files with git add -A / .",
|
|
@@ -1136,7 +1162,7 @@ function instruct(reason) {
|
|
|
1136
1162
|
}
|
|
1137
1163
|
|
|
1138
1164
|
// package.json
|
|
1139
|
-
var version = "1.0.7-beta.
|
|
1165
|
+
var version = "1.0.7-beta.2";
|
|
1140
1166
|
var init_package = () => {};
|
|
1141
1167
|
|
|
1142
1168
|
// src/hooks/policy-types.ts
|
|
@@ -2055,7 +2081,7 @@ function stripShellQuoting(command) {
|
|
|
2055
2081
|
const ansiDecoded = joined.replace(/\$'((?:[^'\\]|\\.)*)'/g, (_, body) => decodeAnsiC(body));
|
|
2056
2082
|
return ansiDecoded.replace(/\\(.)/g, "$1").replace(/['"]/g, "");
|
|
2057
2083
|
}
|
|
2058
|
-
function
|
|
2084
|
+
function gitSubcommandIndex(args) {
|
|
2059
2085
|
for (let i = 0;i < args.length; i++) {
|
|
2060
2086
|
const arg = args[i];
|
|
2061
2087
|
if (GIT_FLAGS_WITH_OPERANDS.has(arg)) {
|
|
@@ -2064,9 +2090,13 @@ function gitSubcommand(args) {
|
|
|
2064
2090
|
}
|
|
2065
2091
|
if (arg.startsWith("-"))
|
|
2066
2092
|
continue;
|
|
2067
|
-
return
|
|
2093
|
+
return i;
|
|
2068
2094
|
}
|
|
2069
|
-
return;
|
|
2095
|
+
return -1;
|
|
2096
|
+
}
|
|
2097
|
+
function gitSubcommand(args) {
|
|
2098
|
+
const i = gitSubcommandIndex(args);
|
|
2099
|
+
return i < 0 ? undefined : args[i];
|
|
2070
2100
|
}
|
|
2071
2101
|
function globCouldNameState(raw) {
|
|
2072
2102
|
const stripped = raw.replace(/^[()]+|[()]+$/g, "");
|
|
@@ -3182,6 +3212,77 @@ function warnGitStashDrop(ctx) {
|
|
|
3182
3212
|
}
|
|
3183
3213
|
return allow();
|
|
3184
3214
|
}
|
|
3215
|
+
function readGitCleanFlags(args) {
|
|
3216
|
+
const letters = new Set;
|
|
3217
|
+
let force = false;
|
|
3218
|
+
let dryRun = false;
|
|
3219
|
+
let sawEndOfOptions = false;
|
|
3220
|
+
for (const token of args) {
|
|
3221
|
+
if (token === "--") {
|
|
3222
|
+
sawEndOfOptions = true;
|
|
3223
|
+
continue;
|
|
3224
|
+
}
|
|
3225
|
+
if (sawEndOfOptions)
|
|
3226
|
+
continue;
|
|
3227
|
+
if (token === "--force") {
|
|
3228
|
+
force = true;
|
|
3229
|
+
continue;
|
|
3230
|
+
}
|
|
3231
|
+
if (token === "--dry-run") {
|
|
3232
|
+
dryRun = true;
|
|
3233
|
+
continue;
|
|
3234
|
+
}
|
|
3235
|
+
if (token.startsWith("--"))
|
|
3236
|
+
continue;
|
|
3237
|
+
if (!SHORT_FLAG_CLUSTER_RE.test(token))
|
|
3238
|
+
continue;
|
|
3239
|
+
for (const letter of token.slice(1)) {
|
|
3240
|
+
if (letter === "f")
|
|
3241
|
+
force = true;
|
|
3242
|
+
if (letter === "n")
|
|
3243
|
+
dryRun = true;
|
|
3244
|
+
letters.add(letter);
|
|
3245
|
+
}
|
|
3246
|
+
}
|
|
3247
|
+
if (force)
|
|
3248
|
+
letters.add("f");
|
|
3249
|
+
return { force, dryRun, letters };
|
|
3250
|
+
}
|
|
3251
|
+
function gitCleanForceWaived(globalOptions) {
|
|
3252
|
+
for (let i = 0;i < globalOptions.length; i++) {
|
|
3253
|
+
const token = globalOptions[i];
|
|
3254
|
+
const value = token === "-c" ? globalOptions[i + 1] : token.startsWith("-c") ? token.slice(2) : undefined;
|
|
3255
|
+
if (value !== undefined && GIT_CLEAN_FORCE_WAIVED_RE.test(value))
|
|
3256
|
+
return true;
|
|
3257
|
+
}
|
|
3258
|
+
return false;
|
|
3259
|
+
}
|
|
3260
|
+
function warnGitClean(ctx) {
|
|
3261
|
+
if (ctx.toolName !== "Bash")
|
|
3262
|
+
return allow();
|
|
3263
|
+
const destructiveFlags = ctx.params?.destructiveFlags ?? GIT_CLEAN_DESTRUCTIVE_FLAGS;
|
|
3264
|
+
if (destructiveFlags.length === 0)
|
|
3265
|
+
return allow();
|
|
3266
|
+
for (const segment of shellSegments(getCommand(ctx))) {
|
|
3267
|
+
const tokens = parseArgvTokens(segment);
|
|
3268
|
+
const gitIdx = tokens.findIndex((t) => GIT_CMD_RE.test(t));
|
|
3269
|
+
if (gitIdx < 0)
|
|
3270
|
+
continue;
|
|
3271
|
+
const args = tokens.slice(gitIdx + 1);
|
|
3272
|
+
const subIdx = gitSubcommandIndex(args);
|
|
3273
|
+
if (subIdx < 0 || args[subIdx] !== "clean")
|
|
3274
|
+
continue;
|
|
3275
|
+
const flags = readGitCleanFlags(args.slice(subIdx + 1));
|
|
3276
|
+
if (flags.dryRun)
|
|
3277
|
+
continue;
|
|
3278
|
+
if (!flags.force && !gitCleanForceWaived(args.slice(0, subIdx)))
|
|
3279
|
+
continue;
|
|
3280
|
+
if (!destructiveFlags.some((f) => flags.letters.has(f)))
|
|
3281
|
+
continue;
|
|
3282
|
+
return instruct("STOP: This command deletes untracked files from the working tree (git clean). Git has no copy of " + "untracked or ignored files, so nothing it removes can be recovered: -d takes whole untracked " + "directories, and -x / -X also take .gitignore'd files such as .env, local config and scratch work. " + "Re-run it with --dry-run and confirm the exact paths with the user before executing.");
|
|
3283
|
+
}
|
|
3284
|
+
return allow();
|
|
3285
|
+
}
|
|
3185
3286
|
function warnAllFilesStaged(ctx) {
|
|
3186
3287
|
if (ctx.toolName !== "Bash")
|
|
3187
3288
|
return allow();
|
|
@@ -3567,7 +3668,7 @@ function registerBuiltinPolicies(enabledNames) {
|
|
|
3567
3668
|
}
|
|
3568
3669
|
}
|
|
3569
3670
|
}
|
|
3570
|
-
var isClaudeInternalPath, isClaudeSettingsFile, SHELL_OPERATORS, SHELL_METACHAR_RE, JWT_RE, API_KEY_PATTERNS, CONNECTION_STRING_RE, PRIVATE_KEY_RE, BEARER_TOKEN_RE, SECRET_PATTERNS, SQL_TOOL_RE, DESTRUCTIVE_SQL_RE, DELETE_NO_WHERE_RE, SQL_WHERE_RE, SCHEMA_ALTER_RE, PUBLISH_CMD_RE, ENV_PRINTENV_RE, ECHO_ENV_RE, EXPORT_RE, PS_ENV_VAR_RE, PS_CHILDITEM_ENV_RE, DOTNET_GETENV_RE, CMD_ECHO_ENV_RE, ENV_FILE_PATH_RE, ENV_CMD_RE, PS_ELEVATION_RE, RUNAS_RE, CURL_PIPE_SH_RE, SEGMENT_SEPARATORS, COMMAND_PREFIX_TOKENS, SELF_BINARY_TOKEN_RE, SELF_ENTRY_PATH_RE, CONFIG_SUBCOMMAND_RE, PAUSE_FLAG_RE, ENV_ASSIGNMENT_RE, RUNNER_OPERAND_RE, PS_WEB_PIPE_RE, SHORT_FLAG_BUNDLE_RE, SAFE_FORCE_PREFIXES, SECRET_FILE_RE, SECRET_FILE_ID_RSA_RE, SECRET_FILE_CREDENTIALS_RE, GIT_COMMIT_MERGE_RE, FAILPROOFAI_STATE_PATH_RE, STATE_READ_COMMANDS, SHELL_KEYWORD_PREFIXES, LOOP_HEADER_RE, COPY_COMMANDS, OPERAND_WRITE_COMMANDS, SECOND_OPERAND_WRITERS, OUTPUT_FLAG_COMMANDS, FIND_WRITE_ACTIONS, SAFE_EXEC_COMMANDS, GIT_DESTRUCTIVE_SUBCOMMANDS, GIT_FLAGS_WITH_OPERANDS, STATE_MENTION_COMMANDS, FIND_EXEC_ACTIONS, PIPELINE_SEPARATORS, VAR_REFERENCE_RE, STATE_GLOB_CANDIDATES, GLOB_DECOYS, BRACE_EXPANSION_LIMIT = 4096, BRACE_EXPANSION_ROUNDS = 24, GLOB_METACHAR_RE, REDIRECT_TARGET_RE, FAILPROOFAI_UNINSTALL_RE, GIT_AMEND_RE, GIT_STASH_DROP_RE, GIT_ADD_ALL_RE, NPM_GLOBAL_RE, YARN_GLOBAL_RE, PNPM_GLOBAL_RE, BUN_GLOBAL_RE, CARGO_INSTALL_RE, PIP_SYSTEM_RE, PKG_MANAGER_DETECTORS, NOHUP_RE, SCREEN_DETACH_RE, TMUX_DETACH_RE, DISOWN_RE, BACKGROUND_AMPERSAND_RE, KUBECTL_RE, TERRAFORM_RE, AWS_CLI_RE, GCLOUD_RE, AZ_CLI_RE, HELM_RE, GH_PIPELINE_RE, gitBranchCache, GIT_BRANCH_CACHE_MAX_ENTRIES = 500, EVAL_FLAG_RE, HOME_PREFIX_RE, RM_CMD_RE, FIND_CMD_RE, FIND_EXEC_RE, FIND_GLOBAL_OPT_RE, FIND_EXPR_START_RE, SCRATCH_ROOTS, CATASTROPHIC_DEPTH = 2, READ_LIKE_CMDS, TOOL_CALL_TRACKER_MAX_BYTES = 65536, SEGMENT_SPLIT_RE, POLICY_IMPLEMENTATIONS, BUILTIN_POLICIES;
|
|
3671
|
+
var isClaudeInternalPath, isClaudeSettingsFile, SHELL_OPERATORS, SHELL_METACHAR_RE, JWT_RE, API_KEY_PATTERNS, CONNECTION_STRING_RE, PRIVATE_KEY_RE, BEARER_TOKEN_RE, SECRET_PATTERNS, SQL_TOOL_RE, DESTRUCTIVE_SQL_RE, DELETE_NO_WHERE_RE, SQL_WHERE_RE, SCHEMA_ALTER_RE, PUBLISH_CMD_RE, ENV_PRINTENV_RE, ECHO_ENV_RE, EXPORT_RE, PS_ENV_VAR_RE, PS_CHILDITEM_ENV_RE, DOTNET_GETENV_RE, CMD_ECHO_ENV_RE, ENV_FILE_PATH_RE, ENV_CMD_RE, PS_ELEVATION_RE, RUNAS_RE, CURL_PIPE_SH_RE, SEGMENT_SEPARATORS, COMMAND_PREFIX_TOKENS, SELF_BINARY_TOKEN_RE, SELF_ENTRY_PATH_RE, CONFIG_SUBCOMMAND_RE, PAUSE_FLAG_RE, ENV_ASSIGNMENT_RE, RUNNER_OPERAND_RE, PS_WEB_PIPE_RE, SHORT_FLAG_BUNDLE_RE, SAFE_FORCE_PREFIXES, SECRET_FILE_RE, SECRET_FILE_ID_RSA_RE, SECRET_FILE_CREDENTIALS_RE, GIT_COMMIT_MERGE_RE, FAILPROOFAI_STATE_PATH_RE, STATE_READ_COMMANDS, SHELL_KEYWORD_PREFIXES, LOOP_HEADER_RE, COPY_COMMANDS, OPERAND_WRITE_COMMANDS, SECOND_OPERAND_WRITERS, OUTPUT_FLAG_COMMANDS, FIND_WRITE_ACTIONS, SAFE_EXEC_COMMANDS, GIT_DESTRUCTIVE_SUBCOMMANDS, GIT_FLAGS_WITH_OPERANDS, STATE_MENTION_COMMANDS, FIND_EXEC_ACTIONS, PIPELINE_SEPARATORS, VAR_REFERENCE_RE, STATE_GLOB_CANDIDATES, GLOB_DECOYS, BRACE_EXPANSION_LIMIT = 4096, BRACE_EXPANSION_ROUNDS = 24, GLOB_METACHAR_RE, REDIRECT_TARGET_RE, FAILPROOFAI_UNINSTALL_RE, GIT_AMEND_RE, GIT_STASH_DROP_RE, GIT_CMD_RE, SHORT_FLAG_CLUSTER_RE, GIT_CLEAN_FORCE_WAIVED_RE, GIT_CLEAN_DESTRUCTIVE_FLAGS, GIT_ADD_ALL_RE, NPM_GLOBAL_RE, YARN_GLOBAL_RE, PNPM_GLOBAL_RE, BUN_GLOBAL_RE, CARGO_INSTALL_RE, PIP_SYSTEM_RE, PKG_MANAGER_DETECTORS, NOHUP_RE, SCREEN_DETACH_RE, TMUX_DETACH_RE, DISOWN_RE, BACKGROUND_AMPERSAND_RE, KUBECTL_RE, TERRAFORM_RE, AWS_CLI_RE, GCLOUD_RE, AZ_CLI_RE, HELM_RE, GH_PIPELINE_RE, gitBranchCache, GIT_BRANCH_CACHE_MAX_ENTRIES = 500, EVAL_FLAG_RE, HOME_PREFIX_RE, RM_CMD_RE, FIND_CMD_RE, FIND_EXEC_RE, FIND_GLOBAL_OPT_RE, FIND_EXPR_START_RE, SCRATCH_ROOTS, CATASTROPHIC_DEPTH = 2, READ_LIKE_CMDS, TOOL_CALL_TRACKER_MAX_BYTES = 65536, SEGMENT_SPLIT_RE, POLICY_IMPLEMENTATIONS, BUILTIN_POLICIES;
|
|
3571
3672
|
var init_builtin_policies = __esm(() => {
|
|
3572
3673
|
init_policy_catalog();
|
|
3573
3674
|
init_policy_registry();
|
|
@@ -3836,6 +3937,10 @@ var init_builtin_policies = __esm(() => {
|
|
|
3836
3937
|
FAILPROOFAI_UNINSTALL_RE = /(?:npm\s+(?:uninstall|remove|un|r)\s.*failproofai|bun\s+remove\s.*failproofai|yarn\s+global\s+remove\s+failproofai|pnpm\s+(?:remove|uninstall|un)\s.*failproofai)/;
|
|
3837
3938
|
GIT_AMEND_RE = /\bgit\s+commit\b.*--amend\b/;
|
|
3838
3939
|
GIT_STASH_DROP_RE = /\bgit\s+stash\s+(?:drop|clear)\b/;
|
|
3940
|
+
GIT_CMD_RE = /^(?:\/\S*\/)?git$/;
|
|
3941
|
+
SHORT_FLAG_CLUSTER_RE = /^-[A-Za-z]+$/;
|
|
3942
|
+
GIT_CLEAN_FORCE_WAIVED_RE = /^clean\.requireforce=(?:false|0|no|off)$/i;
|
|
3943
|
+
GIT_CLEAN_DESTRUCTIVE_FLAGS = ["d", "x", "X"];
|
|
3839
3944
|
GIT_ADD_ALL_RE = /\bgit\s+add\s+(?:-A\b|--all\b|\.(?:\s|$|;|&&|\|\|))/;
|
|
3840
3945
|
NPM_GLOBAL_RE = /\bnpm\s+(?:install|i)\b(?=.*(?:\s-g\b|--global\b))/;
|
|
3841
3946
|
YARN_GLOBAL_RE = /\byarn\s+global\s+add\b/;
|
|
@@ -3904,6 +4009,7 @@ var init_builtin_policies = __esm(() => {
|
|
|
3904
4009
|
"block-work-on-main": blockWorkOnMain,
|
|
3905
4010
|
"warn-git-amend": warnGitAmend,
|
|
3906
4011
|
"warn-git-stash-drop": warnGitStashDrop,
|
|
4012
|
+
"warn-git-clean": warnGitClean,
|
|
3907
4013
|
"warn-all-files-staged": warnAllFilesStaged,
|
|
3908
4014
|
"warn-destructive-sql": warnDestructiveSql,
|
|
3909
4015
|
"warn-schema-alteration": warnSchemaAlteration,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "failproofai",
|
|
3
|
-
"version": "1.0.7-beta.
|
|
4
|
-
"description": "Observability and enforcement for AI agent harnesses.
|
|
3
|
+
"version": "1.0.7-beta.2",
|
|
4
|
+
"description": "Observability and enforcement for AI agent harnesses. 40 built-in policies hooked into 12 of them — Claude Code, Codex, Cursor, Hermes, OpenClaw and more — blocking the tool call before it runs. Local dashboard included, no account needed.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"failproofai": "./dist/cli.mjs",
|
|
7
7
|
"failproofaid": "./bin/failproofaid-shim.mjs"
|
|
@@ -122,15 +122,15 @@
|
|
|
122
122
|
"browserslist": "4.28.8"
|
|
123
123
|
},
|
|
124
124
|
"optionalDependencies": {
|
|
125
|
-
"@failproofai/failproofaid-linux-x64": "1.0.7-beta.
|
|
126
|
-
"@failproofai/failproofaid-linux-arm64": "1.0.7-beta.
|
|
127
|
-
"@failproofai/failproofaid-darwin-x64": "1.0.7-beta.
|
|
128
|
-
"@failproofai/failproofaid-darwin-arm64": "1.0.7-beta.
|
|
125
|
+
"@failproofai/failproofaid-linux-x64": "1.0.7-beta.2",
|
|
126
|
+
"@failproofai/failproofaid-linux-arm64": "1.0.7-beta.2",
|
|
127
|
+
"@failproofai/failproofaid-darwin-x64": "1.0.7-beta.2",
|
|
128
|
+
"@failproofai/failproofaid-darwin-arm64": "1.0.7-beta.2"
|
|
129
129
|
},
|
|
130
130
|
"failproofaidBinaries": {
|
|
131
|
-
"linux-x64": "
|
|
132
|
-
"linux-arm64": "
|
|
133
|
-
"darwin-x64": "
|
|
134
|
-
"darwin-arm64": "
|
|
131
|
+
"linux-x64": "5362ab6a4cfb23d1eee598aac67aedd9e43351e62724ee1c6b40c4fc8021c08f",
|
|
132
|
+
"linux-arm64": "f14a2548b41e14ad32b7fdd03a27ffe7160da1046e422e1f651099371b0d27e5",
|
|
133
|
+
"darwin-x64": "14189cade04f17cf5278bd8061a5ec0c2a2381aa21944ae0d05e8c35b98c2816",
|
|
134
|
+
"darwin-arm64": "4ba9f5c321894d953407efa3404f0deec07dccfd7db7bc2511bb35226816b583"
|
|
135
135
|
}
|
|
136
136
|
}
|
|
@@ -114,6 +114,20 @@ for (const policy of BUILTIN_POLICIES) {
|
|
|
114
114
|
defaultEnabled: policy.defaultEnabled === true,
|
|
115
115
|
match: policy.match,
|
|
116
116
|
fn: policy.fn,
|
|
117
|
+
// The parameter schema. It has to be registered here as well as written
|
|
118
|
+
// into the manifest this script builds, because there are TWO manifest
|
|
119
|
+
// producers for this pack and they have to agree: this script builds one
|
|
120
|
+
// from POLICY_CATALOG, and the publish command rebuilds one by importing
|
|
121
|
+
// the entry and reading back what it registered. A field the entry does
|
|
122
|
+
// not register is a field the second producer cannot know about.
|
|
123
|
+
//
|
|
124
|
+
// params is the one that fails silently STRICTER. Registration reads a
|
|
125
|
+
// pack policy's schema from the manifest, so an absent schema means the
|
|
126
|
+
// policy sees empty params: block-sudo's allowPatterns, and block-rm-rf's
|
|
127
|
+
// and block-read-outside-cwd's allowPaths, stop applying -- taking the
|
|
128
|
+
// user's own configured values with them. No backticks in this comment:
|
|
129
|
+
// see the note above entrySource.
|
|
130
|
+
...(policy.params !== undefined ? { params: policy.params } : {}),
|
|
117
131
|
// Whether Jev may clear it; see the note on authority at the top.
|
|
118
132
|
...(policy.authority !== undefined ? { authority: policy.authority } : {}),
|
|
119
133
|
...(policy.reviewedBy !== undefined ? { reviewedBy: policy.reviewedBy } : {}),
|
package/src/audit/features.ts
CHANGED
|
@@ -69,13 +69,13 @@ export const ARCHITECT_CAUTION_SIGNALS = new Set(["reread-after-edit", "redundan
|
|
|
69
69
|
|
|
70
70
|
/**
|
|
71
71
|
* Mapping from policy/detector short-name → which archetype its hits feed,
|
|
72
|
-
* and how heavily (intensity within the cluster). Every one of the
|
|
72
|
+
* and how heavily (intensity within the cluster). Every one of the 40 builtin
|
|
73
73
|
* policies and 8 audit-only detectors maps exactly once — no overlaps, full
|
|
74
74
|
* coverage. Weights express *severity within* a persona; cross-persona
|
|
75
75
|
* fairness is handled later by lift normalisation, not by these numbers.
|
|
76
76
|
*/
|
|
77
77
|
export const SIGNAL_MAP: Record<string, { archetype: ArchetypeKey; weight: number }> = {
|
|
78
|
-
// ── cowboy ── destructive / forceful / bypasses guardrails (
|
|
78
|
+
// ── cowboy ── destructive / forceful / bypasses guardrails (21) ───────────
|
|
79
79
|
"block-rm-rf": { archetype: "cowboy", weight: 2.0 },
|
|
80
80
|
"block-failproofai-commands":{ archetype: "cowboy", weight: 2.0 },
|
|
81
81
|
"block-sudo": { archetype: "cowboy", weight: 1.5 },
|
|
@@ -88,6 +88,7 @@ export const SIGNAL_MAP: Record<string, { archetype: ArchetypeKey; weight: numbe
|
|
|
88
88
|
"git-commit-no-verify": { archetype: "cowboy", weight: 1.5 },
|
|
89
89
|
"warn-git-amend": { archetype: "cowboy", weight: 0.8 },
|
|
90
90
|
"warn-git-stash-drop": { archetype: "cowboy", weight: 1.0 },
|
|
91
|
+
"warn-git-clean": { archetype: "cowboy", weight: 1.0 },
|
|
91
92
|
"warn-all-files-staged": { archetype: "cowboy", weight: 0.6 },
|
|
92
93
|
"block-kubectl": { archetype: "cowboy", weight: 1.5 },
|
|
93
94
|
"block-terraform": { archetype: "cowboy", weight: 1.5 },
|
|
@@ -623,8 +623,15 @@ const GIT_DESTRUCTIVE_SUBCOMMANDS = new Set([
|
|
|
623
623
|
*/
|
|
624
624
|
const GIT_FLAGS_WITH_OPERANDS = new Set(["-C", "-c", "--git-dir", "--work-tree", "--namespace", "--exec-path"]);
|
|
625
625
|
|
|
626
|
-
/**
|
|
627
|
-
|
|
626
|
+
/**
|
|
627
|
+
* Where the `git` subcommand sits in `args`, with git's own global options
|
|
628
|
+
* walked off first, or `-1` when there is no subcommand at all.
|
|
629
|
+
*
|
|
630
|
+
* The index rather than the value, because a caller that wants to read the
|
|
631
|
+
* SUBCOMMAND's flags (`warnGitClean`) needs to know where they start, and
|
|
632
|
+
* `args.indexOf("clean")` would land on a `-C clean` operand instead.
|
|
633
|
+
*/
|
|
634
|
+
function gitSubcommandIndex(args: string[]): number {
|
|
628
635
|
for (let i = 0; i < args.length; i++) {
|
|
629
636
|
const arg = args[i];
|
|
630
637
|
if (GIT_FLAGS_WITH_OPERANDS.has(arg)) {
|
|
@@ -632,9 +639,15 @@ function gitSubcommand(args: string[]): string | undefined {
|
|
|
632
639
|
continue;
|
|
633
640
|
}
|
|
634
641
|
if (arg.startsWith("-")) continue;
|
|
635
|
-
return
|
|
642
|
+
return i;
|
|
636
643
|
}
|
|
637
|
-
return
|
|
644
|
+
return -1;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
/** The `git` subcommand, with git's own global options walked off first. */
|
|
648
|
+
function gitSubcommand(args: string[]): string | undefined {
|
|
649
|
+
const i = gitSubcommandIndex(args);
|
|
650
|
+
return i < 0 ? undefined : args[i];
|
|
638
651
|
}
|
|
639
652
|
|
|
640
653
|
/**
|
|
@@ -1379,6 +1392,48 @@ const GIT_AMEND_RE = /\bgit\s+commit\b.*--amend\b/;
|
|
|
1379
1392
|
// warnGitStashDrop
|
|
1380
1393
|
const GIT_STASH_DROP_RE = /\bgit\s+stash\s+(?:drop|clear)\b/;
|
|
1381
1394
|
|
|
1395
|
+
// warnGitClean
|
|
1396
|
+
/**
|
|
1397
|
+
* `git`, however the command line spells it. Same shape as {@link RM_CMD_RE}:
|
|
1398
|
+
* an absolute path to the binary does not change what it does.
|
|
1399
|
+
*/
|
|
1400
|
+
const GIT_CMD_RE = /^(?:\/\S*\/)?git$/;
|
|
1401
|
+
|
|
1402
|
+
/** A short-flag cluster: `-f`, `-fdx`, `-xdf`. */
|
|
1403
|
+
const SHORT_FLAG_CLUSTER_RE = /^-[A-Za-z]+$/;
|
|
1404
|
+
|
|
1405
|
+
/**
|
|
1406
|
+
* `clean.requireForce=false`, the config that makes `git clean` delete with no
|
|
1407
|
+
* `-f` at all — and settable per invocation as `git -c
|
|
1408
|
+
* clean.requireForce=false clean -xd`. Reading the subcommand's flags alone
|
|
1409
|
+
* would call that "no force, no warning" on the one spelling that needs none.
|
|
1410
|
+
*/
|
|
1411
|
+
const GIT_CLEAN_FORCE_WAIVED_RE = /^clean\.requireforce=(?:false|0|no|off)$/i;
|
|
1412
|
+
|
|
1413
|
+
/**
|
|
1414
|
+
* The default `destructiveFlags`, and why the condition is these three letters
|
|
1415
|
+
* rather than "any `git clean`".
|
|
1416
|
+
*
|
|
1417
|
+
* `git clean` deletes nothing without `-f` / `--force` (or the config above),
|
|
1418
|
+
* and `-n` / `--dry-run` only prints — so force is the precondition and
|
|
1419
|
+
* dry-run is the exemption. What force ALONE removes is untracked files in the
|
|
1420
|
+
* current directory: the narrowest spelling, and the one people mean when they
|
|
1421
|
+
* tidy up. These are the letters that widen the blast radius past that:
|
|
1422
|
+
*
|
|
1423
|
+
* - `-x` also removes IGNORED files — `.env`, local config, editor state,
|
|
1424
|
+
* scratch work. That is the data that genuinely cannot be rebuilt by running
|
|
1425
|
+
* a command, and it is what makes `git clean -fdx` the severe spelling.
|
|
1426
|
+
* - `-X` removes ONLY ignored files: the same loss, tracked tree untouched.
|
|
1427
|
+
* - `-d` also removes untracked DIRECTORIES — whole new subtrees git has never
|
|
1428
|
+
* had a copy of.
|
|
1429
|
+
*
|
|
1430
|
+
* A bare `git clean -f` is deliberately absent. It has the smallest radius and
|
|
1431
|
+
* by far the most traffic, and a guard that fires on the ordinary spelling is
|
|
1432
|
+
* one people switch off — which would cost them the `-fdx` warning too. Add
|
|
1433
|
+
* `"f"` to `destructiveFlags` to opt into it.
|
|
1434
|
+
*/
|
|
1435
|
+
const GIT_CLEAN_DESTRUCTIVE_FLAGS = ["d", "x", "X"];
|
|
1436
|
+
|
|
1382
1437
|
// warnAllFilesStaged
|
|
1383
1438
|
const GIT_ADD_ALL_RE = /\bgit\s+add\s+(?:-A\b|--all\b|\.(?:\s|$|;|&&|\|\|))/;
|
|
1384
1439
|
|
|
@@ -2528,6 +2583,101 @@ function warnGitStashDrop(ctx: PolicyContext): PolicyResult {
|
|
|
2528
2583
|
return allow();
|
|
2529
2584
|
}
|
|
2530
2585
|
|
|
2586
|
+
/** What one `git clean` argument list asks for. */
|
|
2587
|
+
interface GitCleanFlags {
|
|
2588
|
+
force: boolean;
|
|
2589
|
+
dryRun: boolean;
|
|
2590
|
+
/** Short-flag letters, with `--force` counted as `f` so widening works either way. */
|
|
2591
|
+
letters: Set<string>;
|
|
2592
|
+
}
|
|
2593
|
+
|
|
2594
|
+
/**
|
|
2595
|
+
* Read `git clean`'s own options: clusters (`-fdx`) and the two long forms
|
|
2596
|
+
* that matter (`--force`, `--dry-run`).
|
|
2597
|
+
*
|
|
2598
|
+
* Everything after `--` is a pathspec, not a flag — `git clean -n -- -fdx`
|
|
2599
|
+
* asks about a file literally called `-fdx` and deletes nothing.
|
|
2600
|
+
*/
|
|
2601
|
+
function readGitCleanFlags(args: string[]): GitCleanFlags {
|
|
2602
|
+
const letters = new Set<string>();
|
|
2603
|
+
let force = false;
|
|
2604
|
+
let dryRun = false;
|
|
2605
|
+
let sawEndOfOptions = false;
|
|
2606
|
+
for (const token of args) {
|
|
2607
|
+
if (token === "--") {
|
|
2608
|
+
sawEndOfOptions = true;
|
|
2609
|
+
continue;
|
|
2610
|
+
}
|
|
2611
|
+
if (sawEndOfOptions) continue;
|
|
2612
|
+
if (token === "--force") {
|
|
2613
|
+
force = true;
|
|
2614
|
+
continue;
|
|
2615
|
+
}
|
|
2616
|
+
if (token === "--dry-run") {
|
|
2617
|
+
dryRun = true;
|
|
2618
|
+
continue;
|
|
2619
|
+
}
|
|
2620
|
+
if (token.startsWith("--")) continue;
|
|
2621
|
+
if (!SHORT_FLAG_CLUSTER_RE.test(token)) continue;
|
|
2622
|
+
for (const letter of token.slice(1)) {
|
|
2623
|
+
if (letter === "f") force = true;
|
|
2624
|
+
if (letter === "n") dryRun = true;
|
|
2625
|
+
letters.add(letter);
|
|
2626
|
+
}
|
|
2627
|
+
}
|
|
2628
|
+
if (force) letters.add("f");
|
|
2629
|
+
return { force, dryRun, letters };
|
|
2630
|
+
}
|
|
2631
|
+
|
|
2632
|
+
/** True when git's own `-c key=value` options waive `clean.requireForce`. */
|
|
2633
|
+
function gitCleanForceWaived(globalOptions: string[]): boolean {
|
|
2634
|
+
for (let i = 0; i < globalOptions.length; i++) {
|
|
2635
|
+
const token = globalOptions[i];
|
|
2636
|
+
const value =
|
|
2637
|
+
token === "-c" ? globalOptions[i + 1] : token.startsWith("-c") ? token.slice(2) : undefined;
|
|
2638
|
+
if (value !== undefined && GIT_CLEAN_FORCE_WAIVED_RE.test(value)) return true;
|
|
2639
|
+
}
|
|
2640
|
+
return false;
|
|
2641
|
+
}
|
|
2642
|
+
|
|
2643
|
+
/**
|
|
2644
|
+
* The gap this closes: `git clean -fdx` was caught by NEITHER tier — no regex
|
|
2645
|
+
* builtin matched the string at all, and the semantic check that covers
|
|
2646
|
+
* unrecoverable deletion cannot fire on it. See the note on the catalog entry
|
|
2647
|
+
* for the measurement and for why this policy is `hard`.
|
|
2648
|
+
*/
|
|
2649
|
+
function warnGitClean(ctx: PolicyContext): PolicyResult {
|
|
2650
|
+
if (ctx.toolName !== "Bash") return allow();
|
|
2651
|
+
const destructiveFlags = ((ctx.params?.destructiveFlags ?? GIT_CLEAN_DESTRUCTIVE_FLAGS) as string[]);
|
|
2652
|
+
if (destructiveFlags.length === 0) return allow();
|
|
2653
|
+
|
|
2654
|
+
for (const segment of shellSegments(getCommand(ctx))) {
|
|
2655
|
+
const tokens = parseArgvTokens(segment);
|
|
2656
|
+
// `findIndex`, not `tokens[0]`, so an env prefix (`GIT_DIR=x git clean …`)
|
|
2657
|
+
// and an absolute binary path both still resolve to the git invocation.
|
|
2658
|
+
const gitIdx = tokens.findIndex((t) => GIT_CMD_RE.test(t));
|
|
2659
|
+
if (gitIdx < 0) continue;
|
|
2660
|
+
const args = tokens.slice(gitIdx + 1);
|
|
2661
|
+
const subIdx = gitSubcommandIndex(args);
|
|
2662
|
+
if (subIdx < 0 || args[subIdx] !== "clean") continue;
|
|
2663
|
+
|
|
2664
|
+
const flags = readGitCleanFlags(args.slice(subIdx + 1));
|
|
2665
|
+
// `-n` / `--dry-run` prints what would go and removes nothing, whatever
|
|
2666
|
+
// else is on the line — the safe inspection form, never a warning.
|
|
2667
|
+
if (flags.dryRun) continue;
|
|
2668
|
+
if (!flags.force && !gitCleanForceWaived(args.slice(0, subIdx))) continue;
|
|
2669
|
+
if (!destructiveFlags.some((f) => flags.letters.has(f))) continue;
|
|
2670
|
+
|
|
2671
|
+
return instruct(
|
|
2672
|
+
"STOP: This command deletes untracked files from the working tree (git clean). Git has no copy of " +
|
|
2673
|
+
"untracked or ignored files, so nothing it removes can be recovered: -d takes whole untracked " +
|
|
2674
|
+
"directories, and -x / -X also take .gitignore'd files such as .env, local config and scratch work. " +
|
|
2675
|
+
"Re-run it with --dry-run and confirm the exact paths with the user before executing.",
|
|
2676
|
+
);
|
|
2677
|
+
}
|
|
2678
|
+
return allow();
|
|
2679
|
+
}
|
|
2680
|
+
|
|
2531
2681
|
function warnAllFilesStaged(ctx: PolicyContext): PolicyResult {
|
|
2532
2682
|
if (ctx.toolName !== "Bash") return allow();
|
|
2533
2683
|
const cmd = getCommand(ctx);
|
|
@@ -3090,7 +3240,7 @@ function requireCiGreenBeforeStop(ctx: PolicyContext): PolicyResult {
|
|
|
3090
3240
|
* Each value is the identical hoisted function object, never a wrapper. Two
|
|
3091
3241
|
* things depend on that and neither fails loudly: `audit/cache.ts` hashes
|
|
3092
3242
|
* `fn.toString()` into the audit cache's `engineVersion`, so wrapping every
|
|
3093
|
-
* entry would collapse
|
|
3243
|
+
* entry would collapse 40 distinct hashes into one and freeze the key — stale
|
|
3094
3244
|
* audit results would then be served for the full 30-day TTL with no symptom;
|
|
3095
3245
|
* and `gitBranchCache` is module-scoped, so a per-call factory would silently
|
|
3096
3246
|
* reset it on every hook event.
|
|
@@ -3121,6 +3271,7 @@ const POLICY_IMPLEMENTATIONS: Record<string, PolicyFunction> = {
|
|
|
3121
3271
|
"block-work-on-main": blockWorkOnMain,
|
|
3122
3272
|
"warn-git-amend": warnGitAmend,
|
|
3123
3273
|
"warn-git-stash-drop": warnGitStashDrop,
|
|
3274
|
+
"warn-git-clean": warnGitClean,
|
|
3124
3275
|
"warn-all-files-staged": warnAllFilesStaged,
|
|
3125
3276
|
"warn-destructive-sql": warnDestructiveSql,
|
|
3126
3277
|
"warn-schema-alteration": warnSchemaAlteration,
|
package/src/hooks/jev-cli.ts
CHANGED
|
@@ -345,6 +345,29 @@ function providerForUrl(url: string): JevProviderKind {
|
|
|
345
345
|
}
|
|
346
346
|
}
|
|
347
347
|
|
|
348
|
+
/**
|
|
349
|
+
* The account id a Cloudflare URL already carries, or null.
|
|
350
|
+
*
|
|
351
|
+
* Cloudflare's run endpoint IS per-account — `…/client/v4/accounts/<id>/ai/run`
|
|
352
|
+
* — so the id is in the canonical URL, and asking for it again as a flag asks
|
|
353
|
+
* for something the person has already typed. The first real attempt to
|
|
354
|
+
* configure Cloudflare pasted exactly that URL and was refused with "pass the
|
|
355
|
+
* account id as well", with the id visible in the string being rejected.
|
|
356
|
+
*
|
|
357
|
+
* Read from the path only, never from a query or fragment, and only on a host
|
|
358
|
+
* this build already recognises as Cloudflare's, so nothing else can inject one.
|
|
359
|
+
*/
|
|
360
|
+
export function accountIdFromUrl(url: string): string | null {
|
|
361
|
+
try {
|
|
362
|
+
const parsed = new URL(url);
|
|
363
|
+
if (PROVIDER_BY_HOST[parsed.hostname.toLowerCase()] !== "cloudflare") return null;
|
|
364
|
+
const m = /\/accounts\/([0-9a-f]{32})(?:\/|$)/i.exec(parsed.pathname);
|
|
365
|
+
return m ? m[1].toLowerCase() : null;
|
|
366
|
+
} catch {
|
|
367
|
+
return null;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
348
371
|
/** Whether a validated URL is exactly where this provider's requests already go. */
|
|
349
372
|
function isProviderDefaultUrl(kind: JevProviderKind, url: string): boolean {
|
|
350
373
|
const base = JEV_PROVIDER_DEFAULTS[kind].baseUrl;
|
|
@@ -468,6 +491,34 @@ async function setup(argv: string[], deps: JevCliDeps, opts: RenderOpts): Promis
|
|
|
468
491
|
}
|
|
469
492
|
const kind = explicit ?? urlProvider.kind;
|
|
470
493
|
if (explicit === null) values.set("--provider", kind);
|
|
494
|
+
// Cloudflare's endpoint IS per-account, so the run URL copied out of the
|
|
495
|
+
// dashboard already names the account. Read it from there rather than
|
|
496
|
+
// demanding a value that is sitting in the string being read — the first
|
|
497
|
+
// person to configure Cloudflare pasted exactly that URL and was told to
|
|
498
|
+
// "pass the account id as well", with the id visible in the refusal.
|
|
499
|
+
//
|
|
500
|
+
// Set into `values` here, while the URL is still in scope, because the
|
|
501
|
+
// block below deletes `--url` once it has moved the address to
|
|
502
|
+
// `--base-url`. Everything downstream then treats it as a flag that was
|
|
503
|
+
// given, including the 32-hex validation.
|
|
504
|
+
if (kind === "cloudflare") {
|
|
505
|
+
const fromUrl = accountIdFromUrl(normalized);
|
|
506
|
+
const given = values.get("--account-id");
|
|
507
|
+
if (fromUrl !== null && given === undefined) {
|
|
508
|
+
values.set("--account-id", fromUrl);
|
|
509
|
+
} else if (fromUrl !== null && given !== undefined && given.toLowerCase() !== fromUrl) {
|
|
510
|
+
// Preferring either one silently would send every request to an account
|
|
511
|
+
// the person did not name on the line they are looking at.
|
|
512
|
+
return fail([
|
|
513
|
+
"Not saved: --account-id and the account id in --url are different.",
|
|
514
|
+
` --url names ${fromUrl}`,
|
|
515
|
+
` --account-id names ${given.toLowerCase()}`,
|
|
516
|
+
"Drop one of them.",
|
|
517
|
+
"",
|
|
518
|
+
"Nothing was written.",
|
|
519
|
+
]);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
471
522
|
// The provider's own API is where its key belongs anyway, so a URL naming
|
|
472
523
|
// it clears the override instead of writing the same address into the file
|
|
473
524
|
// (`custom` has no API of its own — its URL is the whole address).
|
|
@@ -546,9 +597,14 @@ async function setup(argv: string[], deps: JevCliDeps, opts: RenderOpts): Promis
|
|
|
546
597
|
// host with another provider asked for is settled above, and nothing here
|
|
547
598
|
// demands an id the file would not keep.
|
|
548
599
|
if (kind === "cloudflare" && urlProvider?.kind === "cloudflare" && typeof next.accountId !== "string") {
|
|
600
|
+
// Reached only when the URL did not carry one either — a bare
|
|
601
|
+
// `/client/v4`, say. The URL form is named as well as the flag, because it
|
|
602
|
+
// is the address the dashboard hands out.
|
|
549
603
|
return fail([
|
|
550
604
|
`Not saved: ${urlProvider.host} is Cloudflare Workers AI, whose endpoint is per-account.`,
|
|
551
|
-
"Pass the account id as well: --account-id <32 hex characters
|
|
605
|
+
"Pass the account id as well: --account-id <32 hex characters>,",
|
|
606
|
+
"or give the full run URL, which already contains it:",
|
|
607
|
+
" https://api.cloudflare.com/client/v4/accounts/<id>/ai/run",
|
|
552
608
|
"",
|
|
553
609
|
"Nothing was written.",
|
|
554
610
|
]);
|
package/src/hooks/manager.ts
CHANGED
|
@@ -1108,7 +1108,7 @@ export async function listHooks(cwd?: string): Promise<void> {
|
|
|
1108
1108
|
// `packCount` counts ENABLED policies, so a pack installed with everything
|
|
1109
1109
|
// switched off reaches zero the same way an empty machine does — and the
|
|
1110
1110
|
// advice for the two could not be more different. Telling somebody who has
|
|
1111
|
-
// just unticked all
|
|
1111
|
+
// just unticked all 39 to `policies add FailproofAI/policies` sends them to
|
|
1112
1112
|
// install what they already have, and doing it would change nothing: the
|
|
1113
1113
|
// selection is what is empty, not the shelf.
|
|
1114
1114
|
const packsInstalled = (() => {
|