failproofai 1.0.7-beta.1 → 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/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.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]__0yxwl6j._.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/{_214wgrp._.js → _1mel6y1._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{_0bn2oo8._.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/0fqd7m_u81mi5.js +1 -0
- package/.next/standalone/.next/static/chunks/129ag2bw93bdh.js +1 -0
- package/.next/standalone/.next/static/chunks/{29fql3nbnfc9q.js → 1qd741hzlmjbo.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0vmd180qfntfb.js → 2_pltstd8-xgs.js} +1 -1
- package/.next/standalone/.next/static/chunks/{1u5zsejmgrir_.js → 2c8j9l6j_b1ci.js} +1 -1
- package/.next/standalone/.next/static/chunks/3-k569wzcli8q.js +1 -0
- package/.next/standalone/.next/static/chunks/{258668t68du6b.js → 3brze37td_wnc.js} +1 -1
- package/.next/standalone/.next/static/chunks/3otmypm6j_xfo.js +6 -0
- package/.next/standalone/.next/static/chunks/{12tvm75t5ffui.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 +208 -27
- 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 +150 -18
- 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/0cd-_8-c-m1ea.js +0 -6
- package/.next/standalone/.next/static/chunks/0qrbdkv9qmvli.js +0 -69
- package/.next/standalone/.next/static/chunks/0uldbut9y2-e8.js +0 -1
- package/.next/standalone/.next/static/chunks/285spx855h_3r.css +0 -2
- package/.next/standalone/.next/static/chunks/2vkvu9-opa_1z.js +0 -1
- package/.next/standalone/.next/static/chunks/37lhv7wa3ywt6.js +0 -1
- /package/.next/standalone/.next/static/{T8YAYM9h_64fKv705vug7 → gbEOjBgZAxF2UIUwZVHNu}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{T8YAYM9h_64fKv705vug7 → gbEOjBgZAxF2UIUwZVHNu}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{T8YAYM9h_64fKv705vug7 → gbEOjBgZAxF2UIUwZVHNu}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for the Evaluator v2 worker protocol.
|
|
3
|
+
*
|
|
4
|
+
* Built on the global `fetch` (Node 18+), so it adds no dependency. Four things
|
|
5
|
+
* in here are security or correctness properties rather than style:
|
|
6
|
+
*
|
|
7
|
+
* * **Redirects are refused**, not followed. A redirect carries the
|
|
8
|
+
* `Authorization` header to wherever it points, so following one turns a
|
|
9
|
+
* compromised or misconfigured server into credential exfiltration.
|
|
10
|
+
* * **Every URL is pinned to the configured origin.** The server supplies
|
|
11
|
+
* `transcript_url` and `definitions_url`; a URL outside the origin we
|
|
12
|
+
* authenticated to is refused before a request is made.
|
|
13
|
+
* * **Responses are bounded while they are read**, not after. A limit checked
|
|
14
|
+
* on a fully-buffered body is a limit that has already been exceeded.
|
|
15
|
+
* * **`claim` is never retried at the transport layer.** A lost claim response
|
|
16
|
+
* may already have leased work; a blind retry would lease it twice. The
|
|
17
|
+
* runtime recalculates capacity and claims again on its own schedule.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
CLAIM_PATH,
|
|
22
|
+
DEFINITIONS_PATH,
|
|
23
|
+
HEARTBEAT_PATH,
|
|
24
|
+
LEASE_GENERATION_HEADER,
|
|
25
|
+
MAX_TRANSCRIPT_BYTES,
|
|
26
|
+
PLAN_PATH,
|
|
27
|
+
REGISTER_PATH,
|
|
28
|
+
RESULT_PATH,
|
|
29
|
+
WORKER_ID_HEADER,
|
|
30
|
+
claimRequestToWire,
|
|
31
|
+
claimResponseFromWire,
|
|
32
|
+
definitionsResponseFromWire,
|
|
33
|
+
errorResponseFromWire,
|
|
34
|
+
heartbeatRequestToWire,
|
|
35
|
+
heartbeatResponseFromWire,
|
|
36
|
+
planRequestToWire,
|
|
37
|
+
planResponseFromWire,
|
|
38
|
+
registerRequestToWire,
|
|
39
|
+
registerResponseFromWire,
|
|
40
|
+
resultRequestToWire,
|
|
41
|
+
resultResponseFromWire,
|
|
42
|
+
sessionTranscriptFromWire,
|
|
43
|
+
} from "./protocol.js";
|
|
44
|
+
import type {
|
|
45
|
+
Assignment,
|
|
46
|
+
ClaimRequest,
|
|
47
|
+
ClaimResponse,
|
|
48
|
+
DefinitionsResponse,
|
|
49
|
+
HeartbeatRequest,
|
|
50
|
+
HeartbeatResponse,
|
|
51
|
+
PlanRequest,
|
|
52
|
+
PlanResponse,
|
|
53
|
+
RegisterRequest,
|
|
54
|
+
RegisterResponse,
|
|
55
|
+
ResultRequest,
|
|
56
|
+
ResultResponse,
|
|
57
|
+
SessionTranscript,
|
|
58
|
+
WireObject,
|
|
59
|
+
} from "./protocol.js";
|
|
60
|
+
|
|
61
|
+
const DEFAULT_RESPONSE_LIMIT = 2 * 1024 * 1024;
|
|
62
|
+
const RETRYABLE_HTTP_STATUSES = new Set([429, 502, 503, 504]);
|
|
63
|
+
|
|
64
|
+
export class EvaluatorAPIError extends Error {
|
|
65
|
+
readonly status: number | null;
|
|
66
|
+
readonly code: string;
|
|
67
|
+
readonly retryable: boolean;
|
|
68
|
+
readonly requestId: string | null;
|
|
69
|
+
|
|
70
|
+
constructor(options: {
|
|
71
|
+
status: number | null;
|
|
72
|
+
code: string;
|
|
73
|
+
message: string;
|
|
74
|
+
retryable: boolean;
|
|
75
|
+
requestId?: string | null;
|
|
76
|
+
}) {
|
|
77
|
+
super(`${options.code}: ${options.message}`);
|
|
78
|
+
this.name = "EvaluatorAPIError";
|
|
79
|
+
this.status = options.status;
|
|
80
|
+
this.code = options.code;
|
|
81
|
+
this.retryable = options.retryable;
|
|
82
|
+
this.requestId = options.requestId ?? null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface EvaluatorClientOptions {
|
|
87
|
+
baseUrl: string;
|
|
88
|
+
credential: string;
|
|
89
|
+
timeoutSeconds?: number;
|
|
90
|
+
maxRetries?: number;
|
|
91
|
+
allowInsecureHttp?: boolean;
|
|
92
|
+
/** Injected by the tests; defaults to the global `fetch`. */
|
|
93
|
+
fetchImpl?: typeof fetch;
|
|
94
|
+
/** Injected by the tests, so a retry schedule does not cost real seconds. */
|
|
95
|
+
sleep?: (ms: number) => Promise<void>;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function isLoopback(hostname: string): boolean {
|
|
99
|
+
if (hostname === "localhost") return true;
|
|
100
|
+
const bare = hostname.startsWith("[") && hostname.endsWith("]") ? hostname.slice(1, -1) : hostname;
|
|
101
|
+
if (bare === "::1") return true;
|
|
102
|
+
// 127.0.0.0/8 — the whole block, not just 127.0.0.1, because a dev server on
|
|
103
|
+
// 127.0.0.2 is as local as one on .1 and refusing it helps nobody.
|
|
104
|
+
const parts = bare.split(".");
|
|
105
|
+
if (parts.length !== 4 || parts.some((part) => !/^\d{1,3}$/.test(part))) return false;
|
|
106
|
+
const octets = parts.map(Number);
|
|
107
|
+
return octets[0] === 127 && octets.every((octet) => octet >= 0 && octet <= 255);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async function defaultSleep(ms: number): Promise<void> {
|
|
111
|
+
await new Promise<void>((resolve) => {
|
|
112
|
+
const timer = setTimeout(resolve, ms);
|
|
113
|
+
timer.unref?.();
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Client for the public Evaluator v2 machine API.
|
|
119
|
+
*
|
|
120
|
+
* Hosted workers normally use the FailproofAI dashboard origin. Its `/v1`
|
|
121
|
+
* passthrough forwards this worker's bearer credential to the private server.
|
|
122
|
+
*/
|
|
123
|
+
export class EvaluatorClient {
|
|
124
|
+
private readonly baseUrl: string;
|
|
125
|
+
private readonly origin: string;
|
|
126
|
+
private readonly credential: string;
|
|
127
|
+
private readonly timeoutMs: number;
|
|
128
|
+
private readonly maxRetries: number;
|
|
129
|
+
private readonly fetchImpl: typeof fetch;
|
|
130
|
+
private readonly sleep: (ms: number) => Promise<void>;
|
|
131
|
+
|
|
132
|
+
constructor(options: EvaluatorClientOptions) {
|
|
133
|
+
let parsed: URL;
|
|
134
|
+
try {
|
|
135
|
+
parsed = new URL(options.baseUrl);
|
|
136
|
+
} catch {
|
|
137
|
+
throw new Error("baseUrl must be an absolute http(s) URL");
|
|
138
|
+
}
|
|
139
|
+
if ((parsed.protocol !== "http:" && parsed.protocol !== "https:") || !parsed.host) {
|
|
140
|
+
throw new Error("baseUrl must be an absolute http(s) URL");
|
|
141
|
+
}
|
|
142
|
+
if (
|
|
143
|
+
parsed.protocol !== "https:" &&
|
|
144
|
+
!isLoopback(parsed.hostname) &&
|
|
145
|
+
options.allowInsecureHttp !== true
|
|
146
|
+
) {
|
|
147
|
+
throw new Error("baseUrl must use https unless it targets loopback");
|
|
148
|
+
}
|
|
149
|
+
if (!options.credential || options.credential.trim() === "") {
|
|
150
|
+
throw new Error("credential must not be empty");
|
|
151
|
+
}
|
|
152
|
+
for (const char of options.credential) {
|
|
153
|
+
const code = char.codePointAt(0)!;
|
|
154
|
+
// A control character in a header value is a header-injection primitive
|
|
155
|
+
// and `fetch` rejects it with an opaque error; refusing here names the
|
|
156
|
+
// real problem.
|
|
157
|
+
if (code < 32 || code === 127) {
|
|
158
|
+
throw new Error("credential must not contain control characters");
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const timeoutSeconds = options.timeoutSeconds ?? 30;
|
|
162
|
+
if (!(timeoutSeconds > 0)) throw new Error("timeoutSeconds must be greater than zero");
|
|
163
|
+
const maxRetries = options.maxRetries ?? 3;
|
|
164
|
+
if (maxRetries < 0) throw new Error("maxRetries must not be negative");
|
|
165
|
+
|
|
166
|
+
this.baseUrl = `${options.baseUrl.replace(/\/+$/, "")}/`;
|
|
167
|
+
this.origin = parsed.origin;
|
|
168
|
+
this.credential = options.credential;
|
|
169
|
+
this.timeoutMs = timeoutSeconds * 1000;
|
|
170
|
+
this.maxRetries = maxRetries;
|
|
171
|
+
this.fetchImpl = options.fetchImpl ?? globalThis.fetch;
|
|
172
|
+
this.sleep = options.sleep ?? defaultSleep;
|
|
173
|
+
if (typeof this.fetchImpl !== "function") {
|
|
174
|
+
throw new Error(
|
|
175
|
+
"no global fetch is available; pass fetchImpl, or run on Node 18 or newer",
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
async register(request: RegisterRequest): Promise<RegisterResponse> {
|
|
181
|
+
return registerResponseFromWire(
|
|
182
|
+
await this.json("POST", REGISTER_PATH, registerRequestToWire(request), { retry: true }),
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
async claim(request: ClaimRequest): Promise<ClaimResponse> {
|
|
187
|
+
return claimResponseFromWire(
|
|
188
|
+
await this.json("POST", CLAIM_PATH, claimRequestToWire(request), { retry: false }),
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async transcript(assignment: Assignment, workerId: string): Promise<SessionTranscript> {
|
|
193
|
+
return sessionTranscriptFromWire(
|
|
194
|
+
await this.json("GET", assignment.transcriptUrl, null, {
|
|
195
|
+
retry: true,
|
|
196
|
+
headers: this.leaseHeaders(assignment, workerId),
|
|
197
|
+
responseLimit: MAX_TRANSCRIPT_BYTES,
|
|
198
|
+
}),
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
async definitions(assignment: Assignment, workerId: string): Promise<DefinitionsResponse> {
|
|
203
|
+
const path =
|
|
204
|
+
assignment.definitionsUrl ||
|
|
205
|
+
DEFINITIONS_PATH.replace("{assignment_id}", encodeURIComponent(assignment.assignmentId));
|
|
206
|
+
return definitionsResponseFromWire(
|
|
207
|
+
await this.json("GET", path, null, {
|
|
208
|
+
retry: true,
|
|
209
|
+
headers: this.leaseHeaders(assignment, workerId),
|
|
210
|
+
}),
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async plan(assignmentId: string, request: PlanRequest): Promise<PlanResponse> {
|
|
215
|
+
return planResponseFromWire(
|
|
216
|
+
await this.json(
|
|
217
|
+
"POST",
|
|
218
|
+
PLAN_PATH.replace("{assignment_id}", encodeURIComponent(assignmentId)),
|
|
219
|
+
planRequestToWire(request),
|
|
220
|
+
{ retry: true },
|
|
221
|
+
),
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
async heartbeat(request: HeartbeatRequest): Promise<HeartbeatResponse> {
|
|
226
|
+
return heartbeatResponseFromWire(
|
|
227
|
+
await this.json("POST", HEARTBEAT_PATH, heartbeatRequestToWire(request), { retry: true }),
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
async submitResult(runId: string, request: ResultRequest): Promise<ResultResponse> {
|
|
232
|
+
return resultResponseFromWire(
|
|
233
|
+
await this.json(
|
|
234
|
+
"POST",
|
|
235
|
+
RESULT_PATH.replace("{evaluation_run_id}", encodeURIComponent(runId)),
|
|
236
|
+
resultRequestToWire(request),
|
|
237
|
+
{ retry: true },
|
|
238
|
+
),
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
private leaseHeaders(assignment: Assignment, workerId: string): Record<string, string> {
|
|
243
|
+
return {
|
|
244
|
+
[WORKER_ID_HEADER]: workerId,
|
|
245
|
+
[LEASE_GENERATION_HEADER]: String(assignment.leaseGeneration),
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
private url(path: string): string {
|
|
250
|
+
const resolved = new URL(path, this.baseUrl);
|
|
251
|
+
if (resolved.origin !== this.origin) {
|
|
252
|
+
throw new EvaluatorAPIError({
|
|
253
|
+
status: null,
|
|
254
|
+
code: "invalid_transcript_url",
|
|
255
|
+
message: "server supplied a URL outside the configured API origin",
|
|
256
|
+
retryable: false,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
return resolved.toString();
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
private async json(
|
|
263
|
+
method: string,
|
|
264
|
+
path: string,
|
|
265
|
+
body: WireObject | null,
|
|
266
|
+
options: { retry: boolean; headers?: Record<string, string>; responseLimit?: number },
|
|
267
|
+
): Promise<WireObject> {
|
|
268
|
+
const responseLimit = options.responseLimit ?? DEFAULT_RESPONSE_LIMIT;
|
|
269
|
+
const headers: Record<string, string> = {
|
|
270
|
+
Accept: "application/json",
|
|
271
|
+
Authorization: `Bearer ${this.credential}`,
|
|
272
|
+
"User-Agent": "failproofai-sdk-evaluator/2",
|
|
273
|
+
...options.headers,
|
|
274
|
+
};
|
|
275
|
+
let encoded: string | undefined;
|
|
276
|
+
if (body !== null) {
|
|
277
|
+
encoded = JSON.stringify(body);
|
|
278
|
+
headers["Content-Type"] = "application/json";
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const attempts = options.retry ? this.maxRetries + 1 : 1;
|
|
282
|
+
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
283
|
+
const url = this.url(path);
|
|
284
|
+
let response: Response;
|
|
285
|
+
try {
|
|
286
|
+
response = await this.fetchImpl(url, {
|
|
287
|
+
method,
|
|
288
|
+
headers,
|
|
289
|
+
body: encoded,
|
|
290
|
+
// Never follow a redirect: it would carry the Authorization header to
|
|
291
|
+
// wherever the redirect points.
|
|
292
|
+
redirect: "error",
|
|
293
|
+
signal: AbortSignal.timeout(this.timeoutMs),
|
|
294
|
+
});
|
|
295
|
+
} catch (error) {
|
|
296
|
+
if (attempt + 1 === attempts) {
|
|
297
|
+
throw new EvaluatorAPIError({
|
|
298
|
+
status: null,
|
|
299
|
+
code: "transport_error",
|
|
300
|
+
message: error instanceof Error ? error.message : String(error),
|
|
301
|
+
retryable: true,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
await this.backoff(attempt);
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (response.ok) return decode(await readLimited(response, responseLimit), responseLimit);
|
|
309
|
+
|
|
310
|
+
const apiError = await this.httpError(response, responseLimit);
|
|
311
|
+
if (attempt + 1 === attempts || !apiError.retryable) throw apiError;
|
|
312
|
+
await this.backoff(attempt);
|
|
313
|
+
}
|
|
314
|
+
// Unreachable: the loop either returns or throws on its last attempt.
|
|
315
|
+
throw new Error("retry loop exhausted without returning or throwing");
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
private async backoff(attempt: number): Promise<void> {
|
|
319
|
+
// Jitter is scheduling noise, not a security decision, so `Math.random` is
|
|
320
|
+
// the right tool — a CSPRNG here would buy nothing and cost entropy.
|
|
321
|
+
await this.sleep(Math.random() * Math.min(250 * 2 ** attempt, 2000));
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
private async httpError(response: Response, limit: number): Promise<EvaluatorAPIError> {
|
|
325
|
+
let raw: string;
|
|
326
|
+
try {
|
|
327
|
+
raw = await readLimited(response, limit);
|
|
328
|
+
} catch {
|
|
329
|
+
raw = "";
|
|
330
|
+
}
|
|
331
|
+
try {
|
|
332
|
+
const parsed = errorResponseFromWire(decode(raw, limit));
|
|
333
|
+
return new EvaluatorAPIError({
|
|
334
|
+
status: response.status,
|
|
335
|
+
code: parsed.error.code,
|
|
336
|
+
message: parsed.error.message,
|
|
337
|
+
retryable: parsed.error.retryable,
|
|
338
|
+
requestId: parsed.error.requestId,
|
|
339
|
+
});
|
|
340
|
+
} catch {
|
|
341
|
+
return new EvaluatorAPIError({
|
|
342
|
+
status: response.status,
|
|
343
|
+
code: "http_error",
|
|
344
|
+
message: `server returned HTTP ${response.status}`,
|
|
345
|
+
retryable: RETRYABLE_HTTP_STATUSES.has(response.status),
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Read a response body, stopping the moment it exceeds `limit`.
|
|
353
|
+
*
|
|
354
|
+
* Checking the size after buffering is checking it too late — the memory has
|
|
355
|
+
* already been allocated, which on a 25 MiB transcript ceiling and a hostile or
|
|
356
|
+
* broken server is the whole problem. `response.body` may be absent (a 204, or
|
|
357
|
+
* a mocked response in a test), in which case `text()` is bounded by whatever
|
|
358
|
+
* produced it.
|
|
359
|
+
*/
|
|
360
|
+
async function readLimited(response: Response, limit: number): Promise<string> {
|
|
361
|
+
const body = response.body;
|
|
362
|
+
if (!body) return await response.text();
|
|
363
|
+
|
|
364
|
+
const reader = body.getReader();
|
|
365
|
+
const chunks: Uint8Array[] = [];
|
|
366
|
+
let total = 0;
|
|
367
|
+
try {
|
|
368
|
+
for (;;) {
|
|
369
|
+
const { done, value } = await reader.read();
|
|
370
|
+
if (done) break;
|
|
371
|
+
if (value === undefined) continue;
|
|
372
|
+
total += value.byteLength;
|
|
373
|
+
if (total > limit) {
|
|
374
|
+
throw new EvaluatorAPIError({
|
|
375
|
+
status: null,
|
|
376
|
+
code: "response_too_large",
|
|
377
|
+
message: `server response exceeds ${limit} bytes`,
|
|
378
|
+
retryable: false,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
chunks.push(value);
|
|
382
|
+
}
|
|
383
|
+
} finally {
|
|
384
|
+
// Releasing the lock lets the connection be reused; cancelling an
|
|
385
|
+
// over-limit body stops the server streaming the rest of it at us.
|
|
386
|
+
if (total > limit) await reader.cancel().catch(() => undefined);
|
|
387
|
+
reader.releaseLock();
|
|
388
|
+
}
|
|
389
|
+
return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk))).toString("utf8");
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
function decode(raw: string, limit: number): WireObject {
|
|
393
|
+
if (Buffer.byteLength(raw, "utf8") > limit) {
|
|
394
|
+
throw new EvaluatorAPIError({
|
|
395
|
+
status: null,
|
|
396
|
+
code: "response_too_large",
|
|
397
|
+
message: `server response exceeds ${limit} bytes`,
|
|
398
|
+
retryable: false,
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
let value: unknown;
|
|
402
|
+
try {
|
|
403
|
+
value = JSON.parse(raw);
|
|
404
|
+
} catch {
|
|
405
|
+
throw new EvaluatorAPIError({
|
|
406
|
+
status: null,
|
|
407
|
+
code: "invalid_response",
|
|
408
|
+
message: "server response was not valid JSON",
|
|
409
|
+
retryable: false,
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
413
|
+
throw new EvaluatorAPIError({
|
|
414
|
+
status: null,
|
|
415
|
+
code: "invalid_response",
|
|
416
|
+
message: "server response must be a JSON object",
|
|
417
|
+
retryable: false,
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
return value as WireObject;
|
|
421
|
+
}
|