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,651 @@
|
|
|
1
|
+
// Vercel AI SDK 6.x: every commonly used surface. Run as `node surfaces.{mjs,cjs} <case>`.
|
|
2
|
+
//
|
|
3
|
+
// The coverage companion to agent.ts. agent.ts pins the README call sites
|
|
4
|
+
// and the adapter's core paths; this program walks the rest of the SDK a
|
|
5
|
+
// customer actually uses — the agent classes, embeddings, structured output,
|
|
6
|
+
// every tool feature, every way of consuming a stream, reasoning models and
|
|
7
|
+
// concurrency — against the same scripted, offline mock.
|
|
8
|
+
//
|
|
9
|
+
// Everything below the `--- the same in every fixture` line is the same
|
|
10
|
+
// program in every ai-* fixture; the section above it spells one major's API.
|
|
11
|
+
import * as failproofai from "@failproofai/sdk";
|
|
12
|
+
import * as adapter from "@failproofai/sdk/ai";
|
|
13
|
+
import { telemetry, wrapModel } from "@failproofai/sdk/ai";
|
|
14
|
+
import {
|
|
15
|
+
Output,
|
|
16
|
+
ToolLoopAgent,
|
|
17
|
+
embed,
|
|
18
|
+
embedMany,
|
|
19
|
+
generateObject,
|
|
20
|
+
generateText,
|
|
21
|
+
simulateReadableStream,
|
|
22
|
+
stepCountIs,
|
|
23
|
+
streamObject,
|
|
24
|
+
streamText,
|
|
25
|
+
tool,
|
|
26
|
+
type ModelMessage,
|
|
27
|
+
} from "ai";
|
|
28
|
+
import { MockEmbeddingModelV3, MockLanguageModelV3 } from "ai/test";
|
|
29
|
+
import { z } from "zod";
|
|
30
|
+
|
|
31
|
+
// --- version-specific: ai 6 (LanguageModelV3, ToolLoopAgent, needsApproval)
|
|
32
|
+
|
|
33
|
+
const MAJOR = 6;
|
|
34
|
+
|
|
35
|
+
interface Call {
|
|
36
|
+
id: string;
|
|
37
|
+
name: string;
|
|
38
|
+
input: Record<string, unknown>;
|
|
39
|
+
}
|
|
40
|
+
/** One scripted model step: what the model "says" on its n-th call. */
|
|
41
|
+
interface Step {
|
|
42
|
+
text?: string;
|
|
43
|
+
reasoning?: string;
|
|
44
|
+
calls?: Call[];
|
|
45
|
+
usage: [number, number];
|
|
46
|
+
reasoningTokens?: number;
|
|
47
|
+
fail?: string;
|
|
48
|
+
delayMs?: number;
|
|
49
|
+
}
|
|
50
|
+
interface ModelOptions {
|
|
51
|
+
modelId?: string;
|
|
52
|
+
chunkDelayMs?: number;
|
|
53
|
+
/** Break the provider stream after this many parts: the connection dropped. */
|
|
54
|
+
breakAfterParts?: number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
type StreamPart = Awaited<ReturnType<MockLanguageModelV3["doStream"]>>["stream"] extends ReadableStream<infer P> ? P : never;
|
|
58
|
+
type Content = Awaited<ReturnType<MockLanguageModelV3["doGenerate"]>>["content"][number];
|
|
59
|
+
|
|
60
|
+
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
61
|
+
/** A string as two stream deltas. */
|
|
62
|
+
const halves = (text: string): string[] => [text.slice(0, Math.ceil(text.length / 2)), text.slice(Math.ceil(text.length / 2))];
|
|
63
|
+
|
|
64
|
+
const usageOf = (step: Step) => ({
|
|
65
|
+
inputTokens: { total: step.usage[0], noCache: step.usage[0], cacheRead: undefined, cacheWrite: undefined },
|
|
66
|
+
outputTokens: { total: step.usage[1], text: step.usage[1] - (step.reasoningTokens ?? 0), reasoning: step.reasoningTokens },
|
|
67
|
+
});
|
|
68
|
+
const finishOf = (step: Step) => {
|
|
69
|
+
const reason = step.calls?.length ? "tool-calls" : "stop";
|
|
70
|
+
return { unified: reason, raw: reason } as const;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
function model(steps: Step[], options: ModelOptions = {}) {
|
|
74
|
+
let n = 0;
|
|
75
|
+
const next = async (): Promise<Step> => {
|
|
76
|
+
const step = steps[Math.min(n, steps.length - 1)]!;
|
|
77
|
+
n += 1;
|
|
78
|
+
if (step.delayMs) await sleep(step.delayMs);
|
|
79
|
+
if (step.fail) throw new Error(step.fail);
|
|
80
|
+
return step;
|
|
81
|
+
};
|
|
82
|
+
return new MockLanguageModelV3({
|
|
83
|
+
provider: "mock-provider",
|
|
84
|
+
modelId: options.modelId ?? "mock-model",
|
|
85
|
+
doGenerate: async () => {
|
|
86
|
+
const step = await next();
|
|
87
|
+
const content: Content[] = [];
|
|
88
|
+
if (step.reasoning) content.push({ type: "reasoning", text: step.reasoning });
|
|
89
|
+
if (step.text) content.push({ type: "text", text: step.text });
|
|
90
|
+
for (const call of step.calls ?? []) {
|
|
91
|
+
content.push({ type: "tool-call", toolCallId: call.id, toolName: call.name, input: JSON.stringify(call.input) });
|
|
92
|
+
}
|
|
93
|
+
return { content, finishReason: finishOf(step), usage: usageOf(step), warnings: [] };
|
|
94
|
+
},
|
|
95
|
+
doStream: async ({ abortSignal }) => {
|
|
96
|
+
const step = await next();
|
|
97
|
+
const chunks: StreamPart[] = [{ type: "stream-start", warnings: [] }];
|
|
98
|
+
if (step.reasoning) {
|
|
99
|
+
chunks.push({ type: "reasoning-start", id: "r" });
|
|
100
|
+
for (const delta of halves(step.reasoning)) chunks.push({ type: "reasoning-delta", id: "r", delta });
|
|
101
|
+
chunks.push({ type: "reasoning-end", id: "r" });
|
|
102
|
+
}
|
|
103
|
+
if (step.text) {
|
|
104
|
+
chunks.push({ type: "text-start", id: "t" });
|
|
105
|
+
for (const delta of halves(step.text)) chunks.push({ type: "text-delta", id: "t", delta });
|
|
106
|
+
chunks.push({ type: "text-end", id: "t" });
|
|
107
|
+
}
|
|
108
|
+
for (const call of step.calls ?? []) {
|
|
109
|
+
chunks.push({ type: "tool-call", toolCallId: call.id, toolName: call.name, input: JSON.stringify(call.input) });
|
|
110
|
+
}
|
|
111
|
+
chunks.push({ type: "finish", finishReason: finishOf(step), usage: usageOf(step) });
|
|
112
|
+
return { stream: abortable(simulateReadableStream({ chunks, chunkDelayInMs: options.chunkDelayMs ?? 0 }), abortSignal, options.breakAfterParts) };
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function embedder() {
|
|
118
|
+
return new MockEmbeddingModelV3({
|
|
119
|
+
provider: "mock-provider",
|
|
120
|
+
modelId: "mock-embedder",
|
|
121
|
+
maxEmbeddingsPerCall: 2,
|
|
122
|
+
doEmbed: async ({ values }) => ({ embeddings: values.map((_, i) => [i, 0.5]), usage: { tokens: values.length * 3 }, warnings: [] }),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const citySchema = z.object({ city: z.string() });
|
|
127
|
+
type Weather = { city: string; celsius: number };
|
|
128
|
+
|
|
129
|
+
function weatherTool(options: { fail?: boolean; delayMs?: (city: string) => number; onRun?: (city: string) => Promise<void> } = {}) {
|
|
130
|
+
return tool({
|
|
131
|
+
description: "Current weather for a city",
|
|
132
|
+
inputSchema: citySchema,
|
|
133
|
+
execute: async ({ city }: { city: string }): Promise<Weather> => {
|
|
134
|
+
if (options.delayMs) await sleep(options.delayMs(city));
|
|
135
|
+
if (options.onRun) await options.onRun(city);
|
|
136
|
+
if (options.fail) throw new Error("weather service down");
|
|
137
|
+
return { city, celsius: city.length * 4 };
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/** A client-side tool: no `execute`, so the SDK hands the call back to the caller. */
|
|
142
|
+
const clientTool = () => tool({ description: "Ask the user", inputSchema: citySchema });
|
|
143
|
+
const HAS_APPROVAL = true;
|
|
144
|
+
const approvalTool = () =>
|
|
145
|
+
tool({
|
|
146
|
+
description: "Book a trip",
|
|
147
|
+
inputSchema: citySchema,
|
|
148
|
+
needsApproval: true,
|
|
149
|
+
execute: async ({ city }: { city: string }) => ({ booked: city }),
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
const steps = (n: number) => ({ stopWhen: stepCountIs(n) });
|
|
153
|
+
const HAS_AGENT = true;
|
|
154
|
+
|
|
155
|
+
type Settings = Parameters<typeof generateText>[0];
|
|
156
|
+
type Telemetry = NonNullable<Settings["experimental_telemetry"]>;
|
|
157
|
+
|
|
158
|
+
function makeAgent(options: { model: Settings["model"]; telemetry?: Telemetry; id?: string; tools?: Settings["tools"] }) {
|
|
159
|
+
const agent = new ToolLoopAgent({
|
|
160
|
+
model: options.model,
|
|
161
|
+
...(options.id ? { id: options.id } : {}),
|
|
162
|
+
tools: options.tools ?? { weather: weatherTool() },
|
|
163
|
+
...steps(4),
|
|
164
|
+
...(options.telemetry ? { experimental_telemetry: options.telemetry } : {}),
|
|
165
|
+
});
|
|
166
|
+
return {
|
|
167
|
+
generate: async (prompt: string) => (await agent.generate({ prompt })).text,
|
|
168
|
+
stream: async (prompt: string) => {
|
|
169
|
+
const result = await agent.stream({ prompt });
|
|
170
|
+
let text = "";
|
|
171
|
+
for await (const delta of result.textStream) text += delta;
|
|
172
|
+
return text;
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** `generateText` / `streamText` with `output: Output.object(...)`. */
|
|
178
|
+
const HAS_OUTPUT = true;
|
|
179
|
+
async function textWithOutput(m: Settings["model"], tel: Telemetry): Promise<unknown> {
|
|
180
|
+
const result = await generateText({ model: m, prompt: "Where?", output: Output.object({ schema: citySchema }), experimental_telemetry: tel });
|
|
181
|
+
return result.output;
|
|
182
|
+
}
|
|
183
|
+
async function streamWithOutput(m: Settings["model"], tel: Telemetry): Promise<unknown[]> {
|
|
184
|
+
const result = streamText({ model: m, prompt: "Where?", output: Output.object({ schema: citySchema }), experimental_telemetry: tel });
|
|
185
|
+
const partials: unknown[] = [];
|
|
186
|
+
for await (const partial of result.partialOutputStream) partials.push(partial);
|
|
187
|
+
return partials;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** What a Next.js route handler returns. */
|
|
191
|
+
const toResponse = (result: { toUIMessageStreamResponse(): Response }): Response => result.toUIMessageStreamResponse();
|
|
192
|
+
|
|
193
|
+
const repairOption = (fixed: Record<string, unknown>) => ({
|
|
194
|
+
experimental_repairToolCall: async <T extends { input: string }>({ toolCall }: { toolCall: T }) => ({ ...toolCall, input: JSON.stringify(fixed) }),
|
|
195
|
+
});
|
|
196
|
+
const prepareStepOption = (second: Settings["model"]) => ({
|
|
197
|
+
prepareStep: async ({ stepNumber }: { stepNumber: number }) => (stepNumber === 1 ? { model: second } : {}),
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
/** Run a tool that needs approval: ask, approve, resume. Returns the final text. */
|
|
201
|
+
async function approveAndResume(m: Settings["model"], tel: Telemetry): Promise<{ pending: number; text: string }> {
|
|
202
|
+
const prompt: ModelMessage[] = [{ role: "user", content: "Book Paris" }];
|
|
203
|
+
const first = await generateText({ model: m, messages: prompt, tools: { book: approvalTool() }, ...steps(4), experimental_telemetry: tel });
|
|
204
|
+
const requests = first.content.filter((part) => part.type === "tool-approval-request");
|
|
205
|
+
const approvals: ModelMessage = {
|
|
206
|
+
role: "tool",
|
|
207
|
+
content: requests.map((request) => ({ type: "tool-approval-response" as const, approvalId: request.approvalId, approved: true })),
|
|
208
|
+
};
|
|
209
|
+
const second = await generateText({
|
|
210
|
+
model: m,
|
|
211
|
+
messages: [...prompt, ...first.response.messages, approvals],
|
|
212
|
+
tools: { book: approvalTool() },
|
|
213
|
+
...steps(4),
|
|
214
|
+
experimental_telemetry: tel,
|
|
215
|
+
});
|
|
216
|
+
return { pending: requests.length, text: second.text };
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const partialObjects = async (m: Settings["model"], tel: Telemetry) => {
|
|
220
|
+
const result = streamObject({ model: m, schema: citySchema, prompt: "Where?", experimental_telemetry: tel });
|
|
221
|
+
const partials: unknown[] = [];
|
|
222
|
+
for await (const partial of result.partialObjectStream) partials.push(partial);
|
|
223
|
+
return { partials, object: await result.object };
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
// --- the same in every fixture
|
|
227
|
+
|
|
228
|
+
const report = (value: unknown) => console.log(JSON.stringify(value));
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* A provider stream that honours the call's abort signal, as a real provider's
|
|
232
|
+
* `fetch` does — once aborted, the next read fails with an AbortError — and
|
|
233
|
+
* that can drop its connection part-way (`breakAfter`).
|
|
234
|
+
*/
|
|
235
|
+
function abortable<T>(stream: ReadableStream<T>, signal: AbortSignal | undefined, breakAfter?: number): ReadableStream<T> {
|
|
236
|
+
const reader = stream.getReader();
|
|
237
|
+
let parts = 0;
|
|
238
|
+
return new ReadableStream<T>({
|
|
239
|
+
async pull(controller) {
|
|
240
|
+
if (signal?.aborted) {
|
|
241
|
+
controller.error(signal.reason ?? new DOMException("aborted", "AbortError"));
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
if (breakAfter !== undefined && parts++ === breakAfter) {
|
|
245
|
+
controller.error(new Error("connection reset"));
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const next = await reader.read();
|
|
249
|
+
if (next.done) controller.close();
|
|
250
|
+
else controller.enqueue(next.value);
|
|
251
|
+
},
|
|
252
|
+
cancel: (reason) => reader.cancel(reason),
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Run the garbage collector until it has had a real chance at everything
|
|
258
|
+
* unreachable. `--expose-gc` switched on at runtime, so the harness needs no
|
|
259
|
+
* special flags.
|
|
260
|
+
*/
|
|
261
|
+
async function collectGarbage(): Promise<void> {
|
|
262
|
+
const v8 = await import("node:v8");
|
|
263
|
+
const vm = await import("node:vm");
|
|
264
|
+
v8.setFlagsFromString("--expose-gc");
|
|
265
|
+
const gc = vm.runInNewContext("gc") as () => void;
|
|
266
|
+
for (let i = 0; i < 10; i += 1) {
|
|
267
|
+
gc();
|
|
268
|
+
await sleep(20);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* A route's streamed Response whose client went away after three chunks.
|
|
274
|
+
* Its own function, so nothing of the stream is left on `main`'s frame
|
|
275
|
+
* afterwards — the garbage collector may take all of it.
|
|
276
|
+
*/
|
|
277
|
+
async function disconnectedClient(withSignal = false): Promise<{ chunks: number }> {
|
|
278
|
+
// A Next.js route can pass `abortSignal: request.signal`; the disconnect then
|
|
279
|
+
// aborts the call as well as cancelling the body.
|
|
280
|
+
const controller = new AbortController();
|
|
281
|
+
const m = model([{ text: "one two three four five six seven eight", usage: [9, 8] }], { chunkDelayMs: 30 });
|
|
282
|
+
const result = streamText({
|
|
283
|
+
model: m,
|
|
284
|
+
prompt: "Count",
|
|
285
|
+
...(withSignal ? { abortSignal: controller.signal } : {}),
|
|
286
|
+
experimental_telemetry: telemetry({ functionId: "counter" }),
|
|
287
|
+
});
|
|
288
|
+
const reader = toResponse(result).body!.getReader();
|
|
289
|
+
let chunks = 0;
|
|
290
|
+
while (chunks < 3 && !(await reader.read()).done) chunks += 1;
|
|
291
|
+
controller.abort();
|
|
292
|
+
await reader.cancel("client disconnected");
|
|
293
|
+
return { chunks };
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/** An aborted stream, in a function of its own for the same reason. */
|
|
297
|
+
async function abortedStream(): Promise<{ text: string; threw: string | false }> {
|
|
298
|
+
const controller = new AbortController();
|
|
299
|
+
const m = model([{ text: "one two three four five six seven eight", usage: [9, 8] }], { chunkDelayMs: 30 });
|
|
300
|
+
const result = streamText({ model: m, prompt: "Count", abortSignal: controller.signal, experimental_telemetry: telemetry({ functionId: "counter" }), onError: () => undefined });
|
|
301
|
+
let text = "";
|
|
302
|
+
try {
|
|
303
|
+
for await (const delta of result.textStream) {
|
|
304
|
+
text += delta;
|
|
305
|
+
controller.abort();
|
|
306
|
+
}
|
|
307
|
+
return { text, threw: false };
|
|
308
|
+
} catch (error) {
|
|
309
|
+
return { text, threw: (error as Error).name };
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/** A stream started and never read. */
|
|
314
|
+
function neverRead(): void {
|
|
315
|
+
streamText({ model: model(LOOP), prompt: "Weather?", tools: { weather: weatherTool() }, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/** A stream whose provider connection drops part-way; the error is the caller's to see. */
|
|
319
|
+
async function brokenStream(): Promise<{ text: string; threw: string | false }> {
|
|
320
|
+
const m = model([{ text: "one two three four five six seven eight", usage: [9, 8] }], { breakAfterParts: 2 });
|
|
321
|
+
const result = streamText({ model: m, prompt: "Count", experimental_telemetry: telemetry({ functionId: "counter" }), onError: () => undefined });
|
|
322
|
+
let text = "";
|
|
323
|
+
try {
|
|
324
|
+
for await (const delta of result.textStream) text += delta;
|
|
325
|
+
return { text, threw: false };
|
|
326
|
+
} catch (error) {
|
|
327
|
+
return { text, threw: (error as Error).message };
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/** The adapter's bookkeeping (internal, untyped): what it still holds open. */
|
|
332
|
+
const held = () => {
|
|
333
|
+
const internals = (adapter as unknown as { _internals: { openCalls(): number; tracker(): { stats(): unknown } | null } })._internals;
|
|
334
|
+
return { openCalls: internals.openCalls(), stats: internals.tracker()?.stats() ?? null };
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
const LOOP: Step[] = [
|
|
338
|
+
{ calls: [{ id: "call-1", name: "weather", input: { city: "Paris" } }], usage: [11, 7] },
|
|
339
|
+
{ text: "It is 20C in Paris.", usage: [23, 9] },
|
|
340
|
+
];
|
|
341
|
+
|
|
342
|
+
async function drainText(stream: AsyncIterable<string>): Promise<string> {
|
|
343
|
+
let text = "";
|
|
344
|
+
for await (const delta of stream) text += delta;
|
|
345
|
+
return text;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
async function main(scenario: string): Promise<void> {
|
|
349
|
+
switch (scenario) {
|
|
350
|
+
// ---- 1. the agent classes
|
|
351
|
+
case "agent-generate":
|
|
352
|
+
case "agent-stream": {
|
|
353
|
+
if (!HAS_AGENT) return report({ skipped: "no agent class" });
|
|
354
|
+
const agent = makeAgent({ model: model(LOOP), telemetry: telemetry({ functionId: "support-agent" }) });
|
|
355
|
+
report({ text: scenario === "agent-generate" ? await agent.generate("Weather in Paris?") : await agent.stream("Weather in Paris?") });
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
358
|
+
case "agent-id": {
|
|
359
|
+
// The agent's own `id` never reaches telemetry: the SDK spreads it into
|
|
360
|
+
// generateText, which drops it. functionId is what names the agent.
|
|
361
|
+
if (!HAS_AGENT) return report({ skipped: "no agent class" });
|
|
362
|
+
const agent = makeAgent({ model: model(LOOP), id: "support-agent", telemetry: telemetry() });
|
|
363
|
+
report({ text: await agent.generate("Weather in Paris?") });
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
case "agent-instrument":
|
|
367
|
+
case "agent-instrument-stream": {
|
|
368
|
+
if (!HAS_AGENT) return report({ skipped: "no agent class" });
|
|
369
|
+
report({ instrumented: await failproofai.instrument("ai") });
|
|
370
|
+
const agent = makeAgent({ model: model(LOOP), telemetry: { isEnabled: true, functionId: "support-agent" } });
|
|
371
|
+
report({ text: scenario === "agent-instrument" ? await agent.generate("Weather in Paris?") : await agent.stream("Weather in Paris?") });
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
case "agent-instrument-bare": {
|
|
375
|
+
// No telemetry setting at all: ai 7 records every call once an
|
|
376
|
+
// integration is registered; ai 4–6 record nothing without isEnabled.
|
|
377
|
+
if (!HAS_AGENT) return report({ skipped: "no agent class" });
|
|
378
|
+
report({ instrumented: await failproofai.instrument("ai", { registerGlobalTracer: false }) });
|
|
379
|
+
report({ text: await makeAgent({ model: model(LOOP) }).generate("Weather in Paris?") });
|
|
380
|
+
break;
|
|
381
|
+
}
|
|
382
|
+
case "agent-wrap": {
|
|
383
|
+
if (!HAS_AGENT) return report({ skipped: "no agent class" });
|
|
384
|
+
const agent = makeAgent({ model: await wrapModel(model(LOOP)) });
|
|
385
|
+
report({ text: await agent.generate("Weather in Paris?") });
|
|
386
|
+
break;
|
|
387
|
+
}
|
|
388
|
+
case "agent-wrap-in-scope": {
|
|
389
|
+
if (!HAS_AGENT) return report({ skipped: "no agent class" });
|
|
390
|
+
const agent = makeAgent({ model: await wrapModel(model(LOOP)) });
|
|
391
|
+
await failproofai.session({ sessionId: "req-1" }, () =>
|
|
392
|
+
failproofai.agent("support-agent", { goal: "help" }, async () => report({ text: await agent.stream("Weather in Paris?") })),
|
|
393
|
+
);
|
|
394
|
+
break;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// ---- 2. embeddings
|
|
398
|
+
case "embed":
|
|
399
|
+
report({ embedding: (await embed({ model: embedder(), value: "Paris", experimental_telemetry: telemetry({ functionId: "indexer" }) })).embedding });
|
|
400
|
+
break;
|
|
401
|
+
case "embed-many": {
|
|
402
|
+
const { embeddings } = await embedMany({ model: embedder(), values: ["Paris", "Rome", "Oslo"], experimental_telemetry: telemetry() });
|
|
403
|
+
report({ embeddings: embeddings.length });
|
|
404
|
+
break;
|
|
405
|
+
}
|
|
406
|
+
case "embed-in-agent":
|
|
407
|
+
await failproofai.session({ sessionId: "req-1" }, () =>
|
|
408
|
+
failproofai.agent("rag", { goal: "answer" }, async () => {
|
|
409
|
+
await embed({ model: embedder(), value: "Paris", experimental_telemetry: telemetry() });
|
|
410
|
+
await embedMany({ model: embedder(), values: ["Paris", "Rome", "Oslo"], experimental_telemetry: telemetry() });
|
|
411
|
+
report({ embedded: true });
|
|
412
|
+
}),
|
|
413
|
+
);
|
|
414
|
+
break;
|
|
415
|
+
case "embed-in-tool": {
|
|
416
|
+
const lookup = weatherTool({
|
|
417
|
+
onRun: async (city) => {
|
|
418
|
+
await embed({ model: embedder(), value: city, experimental_telemetry: telemetry() });
|
|
419
|
+
},
|
|
420
|
+
});
|
|
421
|
+
const { text } = await generateText({ model: model(LOOP), prompt: "Weather?", tools: { weather: lookup }, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
|
|
422
|
+
report({ text });
|
|
423
|
+
break;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// ---- 3. structured output
|
|
427
|
+
case "object-partial": {
|
|
428
|
+
const m = model([{ text: '{"city":"Paris"}', usage: [5, 3] }]);
|
|
429
|
+
report(await partialObjects(m, telemetry({ functionId: "extractor" })));
|
|
430
|
+
break;
|
|
431
|
+
}
|
|
432
|
+
case "object-invalid":
|
|
433
|
+
try {
|
|
434
|
+
await generateObject({ model: model([{ text: '{"town":"Paris"}', usage: [5, 3] }]), schema: citySchema, prompt: "Where?", experimental_telemetry: telemetry({ functionId: "extractor" }) });
|
|
435
|
+
report({ threw: false });
|
|
436
|
+
} catch (error) {
|
|
437
|
+
report({ threw: (error as Error).name });
|
|
438
|
+
}
|
|
439
|
+
break;
|
|
440
|
+
case "text-output": {
|
|
441
|
+
if (!HAS_OUTPUT) return report({ skipped: "no Output" });
|
|
442
|
+
report({ output: await textWithOutput(model([{ text: '{"city":"Paris"}', usage: [5, 3] }]), telemetry({ functionId: "extractor" })) });
|
|
443
|
+
break;
|
|
444
|
+
}
|
|
445
|
+
case "stream-output": {
|
|
446
|
+
if (!HAS_OUTPUT) return report({ skipped: "no Output" });
|
|
447
|
+
const partials = await streamWithOutput(model([{ text: '{"city":"Paris"}', usage: [5, 3] }]), telemetry({ functionId: "extractor" }));
|
|
448
|
+
report({ partials: partials.length, last: partials[partials.length - 1] });
|
|
449
|
+
break;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// ---- 4. tool features
|
|
453
|
+
case "parallel-tools": {
|
|
454
|
+
const m = model([
|
|
455
|
+
{
|
|
456
|
+
calls: [
|
|
457
|
+
{ id: "call-p1", name: "weather", input: { city: "Paris" } },
|
|
458
|
+
{ id: "call-p2", name: "weather", input: { city: "Rome" } },
|
|
459
|
+
],
|
|
460
|
+
usage: [11, 7],
|
|
461
|
+
},
|
|
462
|
+
{ text: "Paris 20C, Rome 16C.", usage: [40, 9] },
|
|
463
|
+
]);
|
|
464
|
+
// Rome finishes first: results arrive out of call order.
|
|
465
|
+
const tools = { weather: weatherTool({ delayMs: (city) => (city === "Paris" ? 40 : 5) }) };
|
|
466
|
+
const { text } = await generateText({ model: m, prompt: "Weather?", tools, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
|
|
467
|
+
report({ text });
|
|
468
|
+
break;
|
|
469
|
+
}
|
|
470
|
+
case "client-tool": {
|
|
471
|
+
const m = model([{ calls: [{ id: "call-c1", name: "ask", input: { city: "Paris" } }], usage: [11, 7] }]);
|
|
472
|
+
const result = await generateText({ model: m, prompt: "Weather?", tools: { ask: clientTool() }, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
|
|
473
|
+
report({ toolCalls: result.toolCalls.length });
|
|
474
|
+
break;
|
|
475
|
+
}
|
|
476
|
+
case "tool-choice-required": {
|
|
477
|
+
const { text } = await generateText({ model: model(LOOP), prompt: "Weather?", tools: { weather: weatherTool() }, toolChoice: "required", ...steps(1), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
|
|
478
|
+
report({ text });
|
|
479
|
+
break;
|
|
480
|
+
}
|
|
481
|
+
case "repair": {
|
|
482
|
+
const m = model([{ calls: [{ id: "call-r1", name: "weather", input: { town: "Paris" } }], usage: [11, 7] }, LOOP[1]!]);
|
|
483
|
+
const { text } = await generateText({ model: m, prompt: "Weather?", tools: { weather: weatherTool() }, ...steps(4), ...repairOption({ city: "Paris" }), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
|
|
484
|
+
report({ text });
|
|
485
|
+
break;
|
|
486
|
+
}
|
|
487
|
+
case "prepare-step": {
|
|
488
|
+
const second = model([LOOP[1]!], { modelId: "mock-model-large" });
|
|
489
|
+
const { text } = await generateText({ model: model(LOOP), prompt: "Weather?", tools: { weather: weatherTool() }, ...steps(4), ...prepareStepOption(second), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
|
|
490
|
+
report({ text });
|
|
491
|
+
break;
|
|
492
|
+
}
|
|
493
|
+
case "unknown-tool": {
|
|
494
|
+
const m = model([{ calls: [{ id: "call-u1", name: "teleport", input: { city: "Paris" } }], usage: [11, 7] }, LOOP[1]!]);
|
|
495
|
+
try {
|
|
496
|
+
const { text } = await generateText({ model: m, prompt: "Weather?", tools: { weather: weatherTool() }, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
|
|
497
|
+
report({ text });
|
|
498
|
+
} catch (error) {
|
|
499
|
+
report({ threw: (error as Error).name });
|
|
500
|
+
}
|
|
501
|
+
break;
|
|
502
|
+
}
|
|
503
|
+
case "approval": {
|
|
504
|
+
if (!HAS_APPROVAL) return report({ skipped: "no tool approval" });
|
|
505
|
+
const m = model([{ calls: [{ id: "call-a1", name: "book", input: { city: "Paris" } }], usage: [11, 7] }, { text: "Booked Paris.", usage: [30, 4] }]);
|
|
506
|
+
report(await approveAndResume(m, telemetry({ functionId: "travel-agent" })));
|
|
507
|
+
break;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// ---- 5. consuming a stream
|
|
511
|
+
case "stream-full": {
|
|
512
|
+
const result = streamText({ model: model(LOOP), prompt: "Weather?", tools: { weather: weatherTool() }, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
|
|
513
|
+
const types = new Set<string>();
|
|
514
|
+
for await (const part of result.fullStream) types.add(part.type);
|
|
515
|
+
report({ parts: [...types].sort(), text: await result.text });
|
|
516
|
+
break;
|
|
517
|
+
}
|
|
518
|
+
case "stream-response": {
|
|
519
|
+
const result = streamText({ model: model(LOOP), prompt: "Weather?", tools: { weather: weatherTool() }, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
|
|
520
|
+
const response = toResponse(result);
|
|
521
|
+
const body = await response.text();
|
|
522
|
+
report({ status: response.status, containsAnswer: body.includes("Paris"), bytes: body.length });
|
|
523
|
+
break;
|
|
524
|
+
}
|
|
525
|
+
case "stream-response-cancel":
|
|
526
|
+
// The browser went away mid-stream. Nothing in the SDK ends the operation
|
|
527
|
+
// after that; the adapter closes it once the stream is garbage.
|
|
528
|
+
report(await disconnectedClient());
|
|
529
|
+
await sleep(100);
|
|
530
|
+
report({ before: held() });
|
|
531
|
+
await collectGarbage();
|
|
532
|
+
report({ after: held() });
|
|
533
|
+
break;
|
|
534
|
+
case "stream-response-cancel-signal":
|
|
535
|
+
report(await disconnectedClient(true));
|
|
536
|
+
await sleep(100);
|
|
537
|
+
report({ before: held() });
|
|
538
|
+
await collectGarbage();
|
|
539
|
+
report({ after: held() });
|
|
540
|
+
break;
|
|
541
|
+
case "stream-error":
|
|
542
|
+
report(await brokenStream());
|
|
543
|
+
await sleep(50);
|
|
544
|
+
await collectGarbage();
|
|
545
|
+
report({ after: held() });
|
|
546
|
+
break;
|
|
547
|
+
case "stream-on-finish": {
|
|
548
|
+
let finished = "";
|
|
549
|
+
const result = streamText({
|
|
550
|
+
model: model(LOOP),
|
|
551
|
+
prompt: "Weather?",
|
|
552
|
+
tools: { weather: weatherTool() },
|
|
553
|
+
...steps(4),
|
|
554
|
+
experimental_telemetry: telemetry({ functionId: "weather-agent" }),
|
|
555
|
+
onFinish: ({ text }) => {
|
|
556
|
+
finished = text;
|
|
557
|
+
},
|
|
558
|
+
});
|
|
559
|
+
await result.consumeStream();
|
|
560
|
+
report({ finished });
|
|
561
|
+
break;
|
|
562
|
+
}
|
|
563
|
+
case "stream-abort":
|
|
564
|
+
report(await abortedStream());
|
|
565
|
+
await sleep(100);
|
|
566
|
+
report({ before: held() });
|
|
567
|
+
await collectGarbage();
|
|
568
|
+
report({ after: held() });
|
|
569
|
+
break;
|
|
570
|
+
case "stream-unconsumed":
|
|
571
|
+
// Never read. Nothing waits on it, so nothing should be held open.
|
|
572
|
+
neverRead();
|
|
573
|
+
await sleep(200);
|
|
574
|
+
report({ before: held() });
|
|
575
|
+
await collectGarbage();
|
|
576
|
+
report({ after: held() });
|
|
577
|
+
break;
|
|
578
|
+
|
|
579
|
+
// ---- 6. reasoning models
|
|
580
|
+
case "reasoning-generate":
|
|
581
|
+
case "reasoning-stream": {
|
|
582
|
+
const m = model([{ reasoning: "The user wants a city.", text: "Paris.", usage: [12, 20], reasoningTokens: 15 }]);
|
|
583
|
+
const options = { model: m, prompt: "Capital of France?", providerOptions: { mock: { reasoningEffort: "high" } }, experimental_telemetry: telemetry({ functionId: "thinker" }) };
|
|
584
|
+
if (scenario === "reasoning-generate") {
|
|
585
|
+
const result = await generateText(options);
|
|
586
|
+
report({ text: result.text });
|
|
587
|
+
} else {
|
|
588
|
+
const result = streamText(options);
|
|
589
|
+
report({ text: await drainText(result.textStream) });
|
|
590
|
+
}
|
|
591
|
+
break;
|
|
592
|
+
}
|
|
593
|
+
case "reasoning-wrap": {
|
|
594
|
+
const m = await wrapModel(model([{ reasoning: "The user wants a city.", text: "Paris.", usage: [12, 20], reasoningTokens: 15 }]));
|
|
595
|
+
const result = streamText({ model: m, prompt: "Capital of France?" });
|
|
596
|
+
report({ text: await drainText(result.textStream) });
|
|
597
|
+
break;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
// ---- 7. concurrency
|
|
601
|
+
case "concurrent":
|
|
602
|
+
case "concurrent-stream": {
|
|
603
|
+
const one = async (i: number) => {
|
|
604
|
+
const m = model([
|
|
605
|
+
{ calls: [{ id: `call-${i}`, name: "weather", input: { city: `city-${i}` } }], usage: [100 + i, 1], delayMs: (i * 7) % 11 },
|
|
606
|
+
{ text: `answer ${i}`, usage: [200 + i, 2], delayMs: (i * 3) % 5 },
|
|
607
|
+
]);
|
|
608
|
+
const tools = { weather: weatherTool({ delayMs: () => (i * 13) % 17 }) };
|
|
609
|
+
const options = { model: m, prompt: `q${i}`, tools, ...steps(4), experimental_telemetry: telemetry({ functionId: `worker-${i}` }) };
|
|
610
|
+
if (scenario === "concurrent") return (await generateText(options)).text;
|
|
611
|
+
return await drainText(streamText(options).textStream);
|
|
612
|
+
};
|
|
613
|
+
const texts = await failproofai.session({ sessionId: "busy" }, () => Promise.all(Array.from({ length: 10 }, (_, i) => one(i))));
|
|
614
|
+
report({ texts });
|
|
615
|
+
break;
|
|
616
|
+
}
|
|
617
|
+
case "concurrent-unscoped": {
|
|
618
|
+
const texts = await Promise.all(
|
|
619
|
+
Array.from({ length: 10 }, async (_, i) => {
|
|
620
|
+
const m = model([
|
|
621
|
+
{ calls: [{ id: `call-${i}`, name: "weather", input: { city: `city-${i}` } }], usage: [100 + i, 1], delayMs: (i * 7) % 11 },
|
|
622
|
+
{ text: `answer ${i}`, usage: [200 + i, 2] },
|
|
623
|
+
]);
|
|
624
|
+
const tools = { weather: weatherTool({ delayMs: () => (i * 13) % 17 }) };
|
|
625
|
+
return (await generateText({ model: m, prompt: `q${i}`, tools, ...steps(4), experimental_telemetry: telemetry({ functionId: "worker" }) })).text;
|
|
626
|
+
}),
|
|
627
|
+
);
|
|
628
|
+
report({ texts });
|
|
629
|
+
break;
|
|
630
|
+
}
|
|
631
|
+
case "concurrent-wrap": {
|
|
632
|
+
const texts = await Promise.all(
|
|
633
|
+
Array.from({ length: 10 }, async (_, i) => {
|
|
634
|
+
const m = await wrapModel(model([{ text: `answer ${i}`, usage: [100 + i, 1], delayMs: (i * 7) % 11 }], { modelId: `model-${i}` }));
|
|
635
|
+
return (await generateText({ model: m, prompt: `q${i}` })).text;
|
|
636
|
+
}),
|
|
637
|
+
);
|
|
638
|
+
report({ texts });
|
|
639
|
+
break;
|
|
640
|
+
}
|
|
641
|
+
default:
|
|
642
|
+
throw new Error(`unknown scenario ${scenario}`);
|
|
643
|
+
}
|
|
644
|
+
report({ major: MAJOR });
|
|
645
|
+
await failproofai.flush();
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
main(process.argv[2] ?? "agent-generate").catch((error: unknown) => {
|
|
649
|
+
console.error("FATAL", error);
|
|
650
|
+
process.exit(1);
|
|
651
|
+
});
|