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.
Files changed (324) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/required-server-files.json +1 -1
  5. package/.next/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +1 -1
  6. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.rsc +7 -7
  10. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +6 -6
  11. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  12. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  17. package/.next/standalone/.next/server/app/_not-found.rsc +15 -15
  18. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  19. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +14 -14
  20. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/.next/standalone/.next/server/app/api/audit/invite/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/audit/run/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/audit/status/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/auth/login-request/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/auth/login-verify/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/download/[project]/[session]/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/audit/page/server-reference-manifest.json +2 -2
  30. package/.next/standalone/.next/server/app/audit/page.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/audit/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/index.html +1 -1
  33. package/.next/standalone/.next/server/app/index.rsc +15 -15
  34. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +14 -14
  35. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +15 -15
  36. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  37. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +1 -1
  38. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/policies/page/server-reference-manifest.json +14 -14
  41. package/.next/standalone/.next/server/app/policies/page.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/policies/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/project/[name]/page/server-reference-manifest.json +1 -1
  44. package/.next/standalone/.next/server/app/project/[name]/page.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/project/[name]/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/react-loadable-manifest.json +2 -2
  47. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page/server-reference-manifest.json +2 -2
  48. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/project/[name]/session/[sessionId]/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/projects/page/server-reference-manifest.json +1 -1
  51. package/.next/standalone/.next/server/app/projects/page.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +7 -7
  54. package/.next/standalone/.next/server/app/settings/page.js +2 -2
  55. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  56. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l3yhx4._.js +2 -2
  58. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o07qi9._.js +1 -1
  59. package/.next/standalone/.next/server/chunks/_0tovk6q._.js +1 -1
  60. package/.next/standalone/.next/server/chunks/_0trp3yc._.js +1 -1
  61. package/.next/standalone/.next/server/chunks/node_modules_posthog-node_dist_entrypoints_index_node_mjs_09z9-p7._.js +1 -1
  62. package/.next/standalone/.next/server/chunks/package_json_[json]_cjs_1nxcc4v._.js +1 -1
  63. package/.next/standalone/.next/server/chunks/src_hooks_18qtd42._.js +1 -1
  64. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04usis8._.js +2 -2
  65. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__056wjo4._.js +2 -2
  66. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0yxwl6j._.js → [root-of-the-server]__0l44ual._.js} +2 -2
  67. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n0xg95._.js +2 -2
  68. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rwtwpm._.js +2 -2
  69. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s_yomn._.js +2 -2
  70. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11mayhe._.js +2 -2
  71. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1pprgri._.js +2 -2
  72. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1q4p5b8._.js +2 -2
  73. package/.next/standalone/.next/server/chunks/ssr/_042cgl1._.js +1 -1
  74. package/.next/standalone/.next/server/chunks/ssr/_08x1r5t._.js +1 -1
  75. package/.next/standalone/.next/server/chunks/ssr/_0bqoto4._.js +1 -1
  76. package/.next/standalone/.next/server/chunks/ssr/{_214wgrp._.js → _1mel6y1._.js} +2 -2
  77. package/.next/standalone/.next/server/chunks/ssr/{_0bn2oo8._.js → _1v-jvrv._.js} +1 -1
  78. package/.next/standalone/.next/server/chunks/ssr/_1zopuov._.js +1 -1
  79. package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_policies_page_actions_1sp2-yo.js +2 -2
  80. package/.next/standalone/.next/server/chunks/ssr/app_actions_get-scheduled-audit_ts_0ei9sni._.js +1 -1
  81. package/.next/standalone/.next/server/chunks/ssr/app_audit__components_audit-dashboard_tsx_0p9ud47._.js +1 -1
  82. package/.next/standalone/.next/server/chunks/ssr/app_global-error_tsx_1kp6l3x._.js +1 -1
  83. package/.next/standalone/.next/server/chunks/ssr/app_policies_hooks-client_tsx_19dqvpc._.js +1 -1
  84. package/.next/standalone/.next/server/chunks/ssr/app_settings_02tf1h4._.js +1 -1
  85. package/.next/standalone/.next/server/chunks/ssr/src_hooks_15t8kqj._.js +1 -1
  86. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1fm2w5z._.js +1 -1
  87. package/.next/standalone/.next/server/chunks/ssr/src_hooks_1j0zy3v._.js +1 -1
  88. package/.next/standalone/.next/server/chunks/ssr/src_hooks_builtin-policies_ts_09j2ndl._.js +1 -1
  89. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  90. package/.next/standalone/.next/server/pages/404.html +1 -1
  91. package/.next/standalone/.next/server/pages/500.html +1 -1
  92. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  93. package/.next/standalone/.next/server/server-reference-manifest.json +22 -22
  94. package/.next/standalone/.next/static/chunks/043j99m8ykg__.css +2 -0
  95. package/.next/standalone/.next/static/chunks/0fqd7m_u81mi5.js +1 -0
  96. package/.next/standalone/.next/static/chunks/129ag2bw93bdh.js +1 -0
  97. package/.next/standalone/.next/static/chunks/{29fql3nbnfc9q.js → 1qd741hzlmjbo.js} +1 -1
  98. package/.next/standalone/.next/static/chunks/{0vmd180qfntfb.js → 2_pltstd8-xgs.js} +1 -1
  99. package/.next/standalone/.next/static/chunks/{1u5zsejmgrir_.js → 2c8j9l6j_b1ci.js} +1 -1
  100. package/.next/standalone/.next/static/chunks/3-k569wzcli8q.js +1 -0
  101. package/.next/standalone/.next/static/chunks/{258668t68du6b.js → 3brze37td_wnc.js} +1 -1
  102. package/.next/standalone/.next/static/chunks/3otmypm6j_xfo.js +6 -0
  103. package/.next/standalone/.next/static/chunks/{12tvm75t5ffui.js → 3ugmd_7dyn0id.js} +1 -1
  104. package/.next/standalone/.next/static/chunks/3yxro_r2_o9ad.js +69 -0
  105. package/.next/standalone/PROBE-FOLLOWUP.md +186 -0
  106. package/.next/standalone/app/actions/get-jev-config.ts +38 -23
  107. package/.next/standalone/app/actions/update-jev-config.ts +1 -1
  108. package/.next/standalone/app/settings/jev-panel.tsx +33 -29
  109. package/.next/standalone/package.json +10 -10
  110. package/.next/standalone/sdk/python/skill/SKILL.md +60 -14
  111. package/.next/standalone/sdk/python/skill/agents/openai.yaml +2 -1
  112. package/.next/standalone/sdk/python/skill/references/evaluator.md +255 -0
  113. package/.next/standalone/sdk/python/skill/references/events.md +17 -8
  114. package/.next/standalone/sdk/python/skill/references/frameworks.md +3 -0
  115. package/.next/standalone/sdk/python/skill/references/install.md +3 -0
  116. package/.next/standalone/sdk/python/skill/references/integration.md +6 -2
  117. package/.next/standalone/sdk/python/skill/references/typescript.md +568 -0
  118. package/.next/standalone/sdk/typescript/CHANGELOG.md +119 -0
  119. package/.next/standalone/sdk/typescript/LICENSE +42 -0
  120. package/.next/standalone/sdk/typescript/README.md +552 -0
  121. package/.next/standalone/sdk/typescript/eslint.config.mjs +59 -0
  122. package/.next/standalone/sdk/typescript/examples/research-agent.ts +197 -0
  123. package/.next/standalone/sdk/typescript/integration/ai.test.ts +920 -0
  124. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/agent.ts +337 -0
  125. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package-lock.json +281 -0
  126. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/package.json +13 -0
  127. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/surfaces.ts +605 -0
  128. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/tsconfig.json +12 -0
  129. package/.next/standalone/sdk/typescript/integration/fixtures/ai-4/tsconfig.surfaces.json +4 -0
  130. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/agent.ts +342 -0
  131. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package-lock.json +168 -0
  132. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/package.json +13 -0
  133. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/surfaces.ts +628 -0
  134. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/tsconfig.json +12 -0
  135. package/.next/standalone/sdk/typescript/integration/fixtures/ai-5/tsconfig.surfaces.json +4 -0
  136. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/agent.ts +346 -0
  137. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package-lock.json +156 -0
  138. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/package.json +13 -0
  139. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/surfaces.ts +651 -0
  140. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/tsconfig.json +12 -0
  141. package/.next/standalone/sdk/typescript/integration/fixtures/ai-6/tsconfig.surfaces.json +4 -0
  142. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/agent.ts +350 -0
  143. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package-lock.json +153 -0
  144. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/package.json +13 -0
  145. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/surfaces.ts +651 -0
  146. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/tsconfig.json +12 -0
  147. package/.next/standalone/sdk/typescript/integration/fixtures/ai-7/tsconfig.surfaces.json +4 -0
  148. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/agent.ts +623 -0
  149. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package-lock.json +463 -0
  150. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/package.json +15 -0
  151. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-0.3/tsconfig.json +12 -0
  152. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/agent-v1.ts +99 -0
  153. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/agent.ts +623 -0
  154. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package-lock.json +336 -0
  155. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/package.json +15 -0
  156. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-1/tsconfig.json +12 -0
  157. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/agent.ts +96 -0
  158. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package-lock.json +579 -0
  159. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/package.json +15 -0
  160. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/tsconfig.json +12 -0
  161. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/index.cjs +53 -0
  162. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/index.mjs +55 -0
  163. package/.next/standalone/sdk/typescript/integration/fixtures/langchain-dup-core/vendor/lc-weather-provider/package.json +18 -0
  164. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/agent.ts +659 -0
  165. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package-lock.json +635 -0
  166. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/package.json +15 -0
  167. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.11/tsconfig.json +12 -0
  168. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/agent.ts +659 -0
  169. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package-lock.json +553 -0
  170. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/package.json +15 -0
  171. package/.next/standalone/sdk/typescript/integration/fixtures/llamaindex-0.12/tsconfig.json +12 -0
  172. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/agent.ts +877 -0
  173. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/mcp-server.mjs +66 -0
  174. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package-lock.json +6417 -0
  175. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/package.json +15 -0
  176. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-0/tsconfig.json +12 -0
  177. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/agent.ts +872 -0
  178. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/mcp-server.mjs +66 -0
  179. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package-lock.json +2540 -0
  180. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/package.json +15 -0
  181. package/.next/standalone/sdk/typescript/integration/fixtures/mastra-1/tsconfig.json +12 -0
  182. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/actions.ts +18 -0
  183. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/ai/route.ts +42 -0
  184. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/edge/route.ts +29 -0
  185. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/langgraph/route.ts +21 -0
  186. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/llamaindex/route.ts +11 -0
  187. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/mastra/route.ts +19 -0
  188. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/api/status/route.ts +7 -0
  189. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/layout.tsx +9 -0
  190. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/app/page.tsx +15 -0
  191. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/instrumentation.ts +15 -0
  192. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/ai.ts +61 -0
  193. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/langgraph.ts +68 -0
  194. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/llamaindex.ts +98 -0
  195. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/lib/mastra.ts +90 -0
  196. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/next.config.ts +52 -0
  197. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package-lock.json +4343 -0
  198. package/.next/standalone/sdk/typescript/integration/fixtures/nextjs/package.json +28 -0
  199. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/agent.ts +51 -0
  200. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/deno-npm.ts +76 -0
  201. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package-lock.json +484 -0
  202. package/.next/standalone/sdk/typescript/integration/fixtures/runtimes/package.json +15 -0
  203. package/.next/standalone/sdk/typescript/integration/fixtures/types/agent.ts +79 -0
  204. package/.next/standalone/sdk/typescript/integration/fixtures/types/package-lock.json +740 -0
  205. package/.next/standalone/sdk/typescript/integration/fixtures/types/package.json +11 -0
  206. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/agent.ts +197 -0
  207. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/package-lock.json +70 -0
  208. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/package.json +12 -0
  209. package/.next/standalone/sdk/typescript/integration/fixtures/vanilla/tsconfig.json +12 -0
  210. package/.next/standalone/sdk/typescript/integration/global-setup.ts +29 -0
  211. package/.next/standalone/sdk/typescript/integration/harness.ts +451 -0
  212. package/.next/standalone/sdk/typescript/integration/langchain.test.ts +682 -0
  213. package/.next/standalone/sdk/typescript/integration/llamaindex.test.ts +709 -0
  214. package/.next/standalone/sdk/typescript/integration/mastra-coverage.test.ts +386 -0
  215. package/.next/standalone/sdk/typescript/integration/mastra.test.ts +311 -0
  216. package/.next/standalone/sdk/typescript/integration/nextjs.test.ts +341 -0
  217. package/.next/standalone/sdk/typescript/integration/runtime-parity.ts +180 -0
  218. package/.next/standalone/sdk/typescript/integration/runtimes.bun.test.ts +15 -0
  219. package/.next/standalone/sdk/typescript/integration/runtimes.core.test.ts +113 -0
  220. package/.next/standalone/sdk/typescript/integration/runtimes.deno.test.ts +19 -0
  221. package/.next/standalone/sdk/typescript/integration/types.test.ts +141 -0
  222. package/.next/standalone/sdk/typescript/integration/vanilla.test.ts +255 -0
  223. package/.next/standalone/sdk/typescript/package-lock.json +2640 -0
  224. package/.next/standalone/sdk/typescript/package.json +401 -0
  225. package/.next/standalone/sdk/typescript/scripts/finalize-build.mjs +123 -0
  226. package/.next/standalone/sdk/typescript/scripts/release.mjs +177 -0
  227. package/.next/standalone/sdk/typescript/src/clock.ts +58 -0
  228. package/.next/standalone/sdk/typescript/src/context.ts +214 -0
  229. package/.next/standalone/sdk/typescript/src/edge/adapter.ts +18 -0
  230. package/.next/standalone/sdk/typescript/src/edge/ai.ts +116 -0
  231. package/.next/standalone/sdk/typescript/src/edge/index.ts +238 -0
  232. package/.next/standalone/sdk/typescript/src/edge/langchain.ts +18 -0
  233. package/.next/standalone/sdk/typescript/src/edge/llamaindex.ts +12 -0
  234. package/.next/standalone/sdk/typescript/src/edge/mastra.ts +17 -0
  235. package/.next/standalone/sdk/typescript/src/edge/notice.ts +33 -0
  236. package/.next/standalone/sdk/typescript/src/environment.ts +75 -0
  237. package/.next/standalone/sdk/typescript/src/evaluator/authoring.ts +480 -0
  238. package/.next/standalone/sdk/typescript/src/evaluator/cli.ts +96 -0
  239. package/.next/standalone/sdk/typescript/src/evaluator/client.ts +421 -0
  240. package/.next/standalone/sdk/typescript/src/evaluator/expression.ts +1292 -0
  241. package/.next/standalone/sdk/typescript/src/evaluator/index.ts +144 -0
  242. package/.next/standalone/sdk/typescript/src/evaluator/protocol.ts +747 -0
  243. package/.next/standalone/sdk/typescript/src/evaluator/runtime.ts +930 -0
  244. package/.next/standalone/sdk/typescript/src/evaluator/sandbox-worker.ts +171 -0
  245. package/.next/standalone/sdk/typescript/src/evaluator/source-limits.ts +27 -0
  246. package/.next/standalone/sdk/typescript/src/evaluator/source.ts +509 -0
  247. package/.next/standalone/sdk/typescript/src/events.ts +879 -0
  248. package/.next/standalone/sdk/typescript/src/exit.ts +117 -0
  249. package/.next/standalone/sdk/typescript/src/index.ts +186 -0
  250. package/.next/standalone/sdk/typescript/src/integrations/ai.ts +1566 -0
  251. package/.next/standalone/sdk/typescript/src/integrations/compat.ts +322 -0
  252. package/.next/standalone/sdk/typescript/src/integrations/core.ts +1321 -0
  253. package/.next/standalone/sdk/typescript/src/integrations/index.ts +355 -0
  254. package/.next/standalone/sdk/typescript/src/integrations/langchain.ts +2340 -0
  255. package/.next/standalone/sdk/typescript/src/integrations/llamaindex.ts +2111 -0
  256. package/.next/standalone/sdk/typescript/src/integrations/mastra.ts +1802 -0
  257. package/.next/standalone/sdk/typescript/src/logger.ts +98 -0
  258. package/.next/standalone/sdk/typescript/src/next.ts +115 -0
  259. package/.next/standalone/sdk/typescript/src/node-require.ts +446 -0
  260. package/.next/standalone/sdk/typescript/src/redact.ts +305 -0
  261. package/.next/standalone/sdk/typescript/src/resolver.ts +120 -0
  262. package/.next/standalone/sdk/typescript/src/runtime.ts +29 -0
  263. package/.next/standalone/sdk/typescript/src/schema.ts +410 -0
  264. package/.next/standalone/sdk/typescript/src/scopes.ts +701 -0
  265. package/.next/standalone/sdk/typescript/src/shared.ts +33 -0
  266. package/.next/standalone/sdk/typescript/src/version.ts +5 -0
  267. package/.next/standalone/sdk/typescript/src/writer.ts +934 -0
  268. package/.next/standalone/sdk/typescript/test/adapters.test.ts +397 -0
  269. package/.next/standalone/sdk/typescript/test/ai.test.ts +1076 -0
  270. package/.next/standalone/sdk/typescript/test/copies.test.ts +204 -0
  271. package/.next/standalone/sdk/typescript/test/edge.test.ts +183 -0
  272. package/.next/standalone/sdk/typescript/test/evaluator-client.test.ts +234 -0
  273. package/.next/standalone/sdk/typescript/test/evaluator-protocol.test.ts +225 -0
  274. package/.next/standalone/sdk/typescript/test/events.test.ts +193 -0
  275. package/.next/standalone/sdk/typescript/test/expression.test.ts +181 -0
  276. package/.next/standalone/sdk/typescript/test/global-setup.ts +26 -0
  277. package/.next/standalone/sdk/typescript/test/helpers.ts +130 -0
  278. package/.next/standalone/sdk/typescript/test/integrations.test.ts +369 -0
  279. package/.next/standalone/sdk/typescript/test/langchain-copies.test.ts +204 -0
  280. package/.next/standalone/sdk/typescript/test/langchain.test.ts +999 -0
  281. package/.next/standalone/sdk/typescript/test/llamaindex.test.ts +1760 -0
  282. package/.next/standalone/sdk/typescript/test/mastra-coverage.test.ts +501 -0
  283. package/.next/standalone/sdk/typescript/test/mastra-lifecycle.test.ts +479 -0
  284. package/.next/standalone/sdk/typescript/test/mastra.test.ts +285 -0
  285. package/.next/standalone/sdk/typescript/test/next.test.ts +109 -0
  286. package/.next/standalone/sdk/typescript/test/packaging.test.ts +312 -0
  287. package/.next/standalone/sdk/typescript/test/redaction.test.ts +171 -0
  288. package/.next/standalone/sdk/typescript/test/runtimes.test.ts +101 -0
  289. package/.next/standalone/sdk/typescript/test/sandbox.test.ts +189 -0
  290. package/.next/standalone/sdk/typescript/test/scopes.test.ts +271 -0
  291. package/.next/standalone/sdk/typescript/test/setup.ts +19 -0
  292. package/.next/standalone/sdk/typescript/test/skill-snippets.test.ts +73 -0
  293. package/.next/standalone/sdk/typescript/test/spool-contract.test.ts +124 -0
  294. package/.next/standalone/sdk/typescript/test/tracker-bounds.test.ts +191 -0
  295. package/.next/standalone/sdk/typescript/test/wire-format.test.ts +214 -0
  296. package/.next/standalone/sdk/typescript/test/writer.test.ts +407 -0
  297. package/.next/standalone/sdk/typescript/tsconfig.build.json +15 -0
  298. package/.next/standalone/sdk/typescript/tsconfig.cjs.json +19 -0
  299. package/.next/standalone/sdk/typescript/tsconfig.json +28 -0
  300. package/.next/standalone/sdk/typescript/vitest.config.ts +33 -0
  301. package/.next/standalone/sdk/typescript/vitest.integration.config.ts +23 -0
  302. package/.next/standalone/server.js +1 -1
  303. package/README.md +2 -2
  304. package/dist/cli.mjs +208 -27
  305. package/dist/worker.mjs +120 -14
  306. package/package.json +10 -10
  307. package/scripts/build-policy-pack.mjs +14 -0
  308. package/src/audit/features.ts +3 -2
  309. package/src/hooks/builtin-policies.ts +156 -5
  310. package/src/hooks/jev-cli.ts +57 -1
  311. package/src/hooks/manager.ts +1 -1
  312. package/src/hooks/pack-cli.ts +150 -18
  313. package/src/hooks/pack-store.ts +1 -1
  314. package/src/hooks/policy-catalog.ts +148 -9
  315. package/src/hooks/types.ts +1 -1
  316. package/.next/standalone/.next/static/chunks/0cd-_8-c-m1ea.js +0 -6
  317. package/.next/standalone/.next/static/chunks/0qrbdkv9qmvli.js +0 -69
  318. package/.next/standalone/.next/static/chunks/0uldbut9y2-e8.js +0 -1
  319. package/.next/standalone/.next/static/chunks/285spx855h_3r.css +0 -2
  320. package/.next/standalone/.next/static/chunks/2vkvu9-opa_1z.js +0 -1
  321. package/.next/standalone/.next/static/chunks/37lhv7wa3ywt6.js +0 -1
  322. /package/.next/standalone/.next/static/{T8YAYM9h_64fKv705vug7 → gbEOjBgZAxF2UIUwZVHNu}/_buildManifest.js +0 -0
  323. /package/.next/standalone/.next/static/{T8YAYM9h_64fKv705vug7 → gbEOjBgZAxF2UIUwZVHNu}/_clientMiddlewareManifest.js +0 -0
  324. /package/.next/standalone/.next/static/{T8YAYM9h_64fKv705vug7 → gbEOjBgZAxF2UIUwZVHNu}/_ssgManifest.js +0 -0
@@ -0,0 +1,605 @@
1
+ // Vercel AI SDK 4.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 — embeddings, structured output, every tool feature,
6
+ // every way of consuming a stream, reasoning models and concurrency — against
7
+ // the same scripted, offline mock. (ai 4 has no agent class.)
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
+ embed,
17
+ embedMany,
18
+ generateObject,
19
+ generateText,
20
+ simulateReadableStream,
21
+ streamObject,
22
+ streamText,
23
+ tool,
24
+ } from "ai";
25
+ import { MockEmbeddingModelV1, MockLanguageModelV1 } from "ai/test";
26
+ import { z } from "zod";
27
+
28
+ // --- version-specific: ai 4 (LanguageModelV1, maxSteps, no agent class, no tool approval)
29
+
30
+ const MAJOR = 4;
31
+
32
+ interface Call {
33
+ id: string;
34
+ name: string;
35
+ input: Record<string, unknown>;
36
+ }
37
+ /** One scripted model step: what the model "says" on its n-th call. */
38
+ interface Step {
39
+ text?: string;
40
+ reasoning?: string;
41
+ calls?: Call[];
42
+ usage: [number, number];
43
+ reasoningTokens?: number;
44
+ fail?: string;
45
+ delayMs?: number;
46
+ }
47
+ interface ModelOptions {
48
+ modelId?: string;
49
+ chunkDelayMs?: number;
50
+ /** Break the provider stream after this many parts: the connection dropped. */
51
+ breakAfterParts?: number;
52
+ }
53
+
54
+ type StreamPart = Awaited<ReturnType<MockLanguageModelV1["doStream"]>>["stream"] extends ReadableStream<infer P> ? P : never;
55
+
56
+ const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
57
+ /** A string as two stream deltas. */
58
+ const halves = (text: string): string[] => [text.slice(0, Math.ceil(text.length / 2)), text.slice(Math.ceil(text.length / 2))];
59
+
60
+ const usageOf = (step: Step) => ({ promptTokens: step.usage[0], completionTokens: step.usage[1] });
61
+ const finishOf = (step: Step) => (step.calls?.length ? "tool-calls" : "stop");
62
+ const rawCall = { rawPrompt: null, rawSettings: {} };
63
+
64
+ function model(steps: Step[], options: ModelOptions = {}) {
65
+ let n = 0;
66
+ const next = async (): Promise<Step> => {
67
+ const step = steps[Math.min(n, steps.length - 1)]!;
68
+ n += 1;
69
+ if (step.delayMs) await sleep(step.delayMs);
70
+ if (step.fail) throw new Error(step.fail);
71
+ return step;
72
+ };
73
+ const toolCalls = (step: Step) =>
74
+ (step.calls ?? []).map((call) => ({ toolCallType: "function" as const, toolCallId: call.id, toolName: call.name, args: JSON.stringify(call.input) }));
75
+ return new MockLanguageModelV1({
76
+ provider: "mock-provider",
77
+ modelId: options.modelId ?? "mock-model",
78
+ // v4 asks the model how to produce an object; v5+ always use JSON mode.
79
+ defaultObjectGenerationMode: "json",
80
+ doGenerate: async () => {
81
+ const step = await next();
82
+ return {
83
+ ...(step.text ? { text: step.text } : {}),
84
+ ...(step.reasoning ? { reasoning: step.reasoning } : {}),
85
+ ...(step.calls?.length ? { toolCalls: toolCalls(step) } : {}),
86
+ finishReason: finishOf(step),
87
+ usage: usageOf(step),
88
+ rawCall,
89
+ };
90
+ },
91
+ doStream: async ({ abortSignal }) => {
92
+ const step = await next();
93
+ const chunks: StreamPart[] = [];
94
+ if (step.reasoning) for (const textDelta of halves(step.reasoning)) chunks.push({ type: "reasoning", textDelta });
95
+ if (step.text) for (const textDelta of halves(step.text)) chunks.push({ type: "text-delta", textDelta });
96
+ for (const call of toolCalls(step)) chunks.push({ type: "tool-call", ...call });
97
+ chunks.push({ type: "finish", finishReason: finishOf(step), usage: usageOf(step) });
98
+ return { stream: abortable(simulateReadableStream({ chunks, chunkDelayInMs: options.chunkDelayMs ?? 0 }), abortSignal, options.breakAfterParts), rawCall };
99
+ },
100
+ });
101
+ }
102
+
103
+ function embedder() {
104
+ return new MockEmbeddingModelV1<string>({
105
+ provider: "mock-provider",
106
+ modelId: "mock-embedder",
107
+ maxEmbeddingsPerCall: 2,
108
+ doEmbed: async ({ values }) => ({ embeddings: values.map((_, i) => [i, 0.5]), usage: { tokens: values.length * 3 } }),
109
+ });
110
+ }
111
+
112
+ const citySchema = z.object({ city: z.string() });
113
+ type Weather = { city: string; celsius: number };
114
+
115
+ function weatherTool(options: { fail?: boolean; delayMs?: (city: string) => number; onRun?: (city: string) => Promise<void> } = {}) {
116
+ return tool({
117
+ description: "Current weather for a city",
118
+ parameters: citySchema,
119
+ execute: async ({ city }: { city: string }): Promise<Weather> => {
120
+ if (options.delayMs) await sleep(options.delayMs(city));
121
+ if (options.onRun) await options.onRun(city);
122
+ if (options.fail) throw new Error("weather service down");
123
+ return { city, celsius: city.length * 4 };
124
+ },
125
+ });
126
+ }
127
+ /** A client-side tool: no `execute`, so the SDK hands the call back to the caller. */
128
+ const clientTool = () => tool({ description: "Ask the user", parameters: citySchema });
129
+ /** ai 4 has no tool approval (`needsApproval` arrived in 6). */
130
+ const HAS_APPROVAL = false;
131
+
132
+ const steps = (n: number) => ({ maxSteps: n });
133
+ /** ai 4 has no agent class (`Experimental_Agent` arrived in 5). */
134
+ const HAS_AGENT = false;
135
+
136
+ type Settings = Parameters<typeof generateText>[0];
137
+ type Telemetry = NonNullable<Settings["experimental_telemetry"]>;
138
+
139
+ function makeAgent(_options: { model: Settings["model"]; telemetry?: Telemetry; id?: string; tools?: Settings["tools"] }): {
140
+ generate(prompt: string): Promise<string>;
141
+ stream(prompt: string): Promise<string>;
142
+ } {
143
+ throw new Error("ai 4 has no agent class");
144
+ }
145
+
146
+ /** `generateText` / `streamText` with `experimental_output: Output.object(...)`. */
147
+ const HAS_OUTPUT = true;
148
+ async function textWithOutput(m: Settings["model"], tel: Telemetry): Promise<unknown> {
149
+ const result = await generateText({ model: m, prompt: "Where?", experimental_output: Output.object({ schema: citySchema }), experimental_telemetry: tel });
150
+ return result.experimental_output;
151
+ }
152
+ async function streamWithOutput(m: Settings["model"], tel: Telemetry): Promise<unknown[]> {
153
+ const result = streamText({ model: m, prompt: "Where?", experimental_output: Output.object({ schema: citySchema }), experimental_telemetry: tel });
154
+ const partials: unknown[] = [];
155
+ for await (const partial of result.experimental_partialOutputStream) partials.push(partial);
156
+ return partials;
157
+ }
158
+
159
+ /** What a Next.js route handler returns (ai 4: the data stream protocol). */
160
+ const toResponse = (result: { toDataStreamResponse(): Response }): Response => result.toDataStreamResponse();
161
+
162
+ const repairOption = (fixed: Record<string, unknown>) => ({
163
+ experimental_repairToolCall: async <T extends { args: string }>({ toolCall }: { toolCall: T }) => ({ ...toolCall, args: JSON.stringify(fixed) }),
164
+ });
165
+ const prepareStepOption = (second: Settings["model"]) => ({
166
+ experimental_prepareStep: async ({ stepNumber }: { stepNumber: number }) => (stepNumber === 1 ? { model: second } : undefined),
167
+ });
168
+
169
+ async function approveAndResume(_m: Settings["model"], _tel: Telemetry): Promise<{ pending: number; text: string }> {
170
+ throw new Error("ai 4 has no tool approval");
171
+ }
172
+
173
+ const partialObjects = async (m: Settings["model"], tel: Telemetry) => {
174
+ const result = streamObject({ model: m, schema: citySchema, prompt: "Where?", experimental_telemetry: tel });
175
+ const partials: unknown[] = [];
176
+ for await (const partial of result.partialObjectStream) partials.push(partial);
177
+ return { partials, object: await result.object };
178
+ };
179
+
180
+ // --- the same in every fixture
181
+
182
+ const report = (value: unknown) => console.log(JSON.stringify(value));
183
+
184
+ /**
185
+ * A provider stream that honours the call's abort signal, as a real provider's
186
+ * `fetch` does — once aborted, the next read fails with an AbortError — and
187
+ * that can drop its connection part-way (`breakAfter`).
188
+ */
189
+ function abortable<T>(stream: ReadableStream<T>, signal: AbortSignal | undefined, breakAfter?: number): ReadableStream<T> {
190
+ const reader = stream.getReader();
191
+ let parts = 0;
192
+ return new ReadableStream<T>({
193
+ async pull(controller) {
194
+ if (signal?.aborted) {
195
+ controller.error(signal.reason ?? new DOMException("aborted", "AbortError"));
196
+ return;
197
+ }
198
+ if (breakAfter !== undefined && parts++ === breakAfter) {
199
+ controller.error(new Error("connection reset"));
200
+ return;
201
+ }
202
+ const next = await reader.read();
203
+ if (next.done) controller.close();
204
+ else controller.enqueue(next.value);
205
+ },
206
+ cancel: (reason) => reader.cancel(reason),
207
+ });
208
+ }
209
+
210
+ /**
211
+ * Run the garbage collector until it has had a real chance at everything
212
+ * unreachable. `--expose-gc` switched on at runtime, so the harness needs no
213
+ * special flags.
214
+ */
215
+ async function collectGarbage(): Promise<void> {
216
+ const v8 = await import("node:v8");
217
+ const vm = await import("node:vm");
218
+ v8.setFlagsFromString("--expose-gc");
219
+ const gc = vm.runInNewContext("gc") as () => void;
220
+ for (let i = 0; i < 10; i += 1) {
221
+ gc();
222
+ await sleep(20);
223
+ }
224
+ }
225
+
226
+ /**
227
+ * A route's streamed Response whose client went away after three chunks.
228
+ * Its own function, so nothing of the stream is left on `main`'s frame
229
+ * afterwards — the garbage collector may take all of it.
230
+ */
231
+ async function disconnectedClient(withSignal = false): Promise<{ chunks: number }> {
232
+ // A Next.js route can pass `abortSignal: request.signal`; the disconnect then
233
+ // aborts the call as well as cancelling the body.
234
+ const controller = new AbortController();
235
+ const m = model([{ text: "one two three four five six seven eight", usage: [9, 8] }], { chunkDelayMs: 30 });
236
+ const result = streamText({
237
+ model: m,
238
+ prompt: "Count",
239
+ ...(withSignal ? { abortSignal: controller.signal } : {}),
240
+ experimental_telemetry: telemetry({ functionId: "counter" }),
241
+ });
242
+ const reader = toResponse(result).body!.getReader();
243
+ let chunks = 0;
244
+ while (chunks < 3 && !(await reader.read()).done) chunks += 1;
245
+ controller.abort();
246
+ await reader.cancel("client disconnected");
247
+ return { chunks };
248
+ }
249
+
250
+ /** An aborted stream, in a function of its own for the same reason. */
251
+ async function abortedStream(): Promise<{ text: string; threw: string | false }> {
252
+ const controller = new AbortController();
253
+ const m = model([{ text: "one two three four five six seven eight", usage: [9, 8] }], { chunkDelayMs: 30 });
254
+ const result = streamText({ model: m, prompt: "Count", abortSignal: controller.signal, experimental_telemetry: telemetry({ functionId: "counter" }), onError: () => undefined });
255
+ let text = "";
256
+ try {
257
+ for await (const delta of result.textStream) {
258
+ text += delta;
259
+ controller.abort();
260
+ }
261
+ return { text, threw: false };
262
+ } catch (error) {
263
+ return { text, threw: (error as Error).name };
264
+ }
265
+ }
266
+
267
+ /** A stream started and never read. */
268
+ function neverRead(): void {
269
+ streamText({ model: model(LOOP), prompt: "Weather?", tools: { weather: weatherTool() }, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
270
+ }
271
+
272
+ /** A stream whose provider connection drops part-way; the error is the caller's to see. */
273
+ async function brokenStream(): Promise<{ text: string; threw: string | false }> {
274
+ const m = model([{ text: "one two three four five six seven eight", usage: [9, 8] }], { breakAfterParts: 2 });
275
+ const result = streamText({ model: m, prompt: "Count", experimental_telemetry: telemetry({ functionId: "counter" }), onError: () => undefined });
276
+ let text = "";
277
+ try {
278
+ for await (const delta of result.textStream) text += delta;
279
+ return { text, threw: false };
280
+ } catch (error) {
281
+ return { text, threw: (error as Error).message };
282
+ }
283
+ }
284
+
285
+ /** The adapter's bookkeeping (internal, untyped): what it still holds open. */
286
+ const held = () => {
287
+ const internals = (adapter as unknown as { _internals: { openCalls(): number; tracker(): { stats(): unknown } | null } })._internals;
288
+ return { openCalls: internals.openCalls(), stats: internals.tracker()?.stats() ?? null };
289
+ };
290
+
291
+ const LOOP: Step[] = [
292
+ { calls: [{ id: "call-1", name: "weather", input: { city: "Paris" } }], usage: [11, 7] },
293
+ { text: "It is 20C in Paris.", usage: [23, 9] },
294
+ ];
295
+
296
+ async function drainText(stream: AsyncIterable<string>): Promise<string> {
297
+ let text = "";
298
+ for await (const delta of stream) text += delta;
299
+ return text;
300
+ }
301
+
302
+ async function main(scenario: string): Promise<void> {
303
+ switch (scenario) {
304
+ // ---- 1. the agent classes
305
+ case "agent-generate":
306
+ case "agent-stream": {
307
+ if (!HAS_AGENT) return report({ skipped: "no agent class" });
308
+ const agent = makeAgent({ model: model(LOOP), telemetry: telemetry({ functionId: "support-agent" }) });
309
+ report({ text: scenario === "agent-generate" ? await agent.generate("Weather in Paris?") : await agent.stream("Weather in Paris?") });
310
+ break;
311
+ }
312
+ case "agent-id": {
313
+ // The agent's own `id` never reaches telemetry: the SDK spreads it into
314
+ // generateText, which drops it. functionId is what names the agent.
315
+ if (!HAS_AGENT) return report({ skipped: "no agent class" });
316
+ const agent = makeAgent({ model: model(LOOP), id: "support-agent", telemetry: telemetry() });
317
+ report({ text: await agent.generate("Weather in Paris?") });
318
+ break;
319
+ }
320
+ case "agent-instrument":
321
+ case "agent-instrument-stream": {
322
+ if (!HAS_AGENT) return report({ skipped: "no agent class" });
323
+ report({ instrumented: await failproofai.instrument("ai") });
324
+ const agent = makeAgent({ model: model(LOOP), telemetry: { isEnabled: true, functionId: "support-agent" } });
325
+ report({ text: scenario === "agent-instrument" ? await agent.generate("Weather in Paris?") : await agent.stream("Weather in Paris?") });
326
+ break;
327
+ }
328
+ case "agent-instrument-bare": {
329
+ // No telemetry setting at all: ai 7 records every call once an
330
+ // integration is registered; ai 4–6 record nothing without isEnabled.
331
+ if (!HAS_AGENT) return report({ skipped: "no agent class" });
332
+ report({ instrumented: await failproofai.instrument("ai", { registerGlobalTracer: false }) });
333
+ report({ text: await makeAgent({ model: model(LOOP) }).generate("Weather in Paris?") });
334
+ break;
335
+ }
336
+ case "agent-wrap": {
337
+ if (!HAS_AGENT) return report({ skipped: "no agent class" });
338
+ const agent = makeAgent({ model: await wrapModel(model(LOOP)) });
339
+ report({ text: await agent.generate("Weather in Paris?") });
340
+ break;
341
+ }
342
+ case "agent-wrap-in-scope": {
343
+ if (!HAS_AGENT) return report({ skipped: "no agent class" });
344
+ const agent = makeAgent({ model: await wrapModel(model(LOOP)) });
345
+ await failproofai.session({ sessionId: "req-1" }, () =>
346
+ failproofai.agent("support-agent", { goal: "help" }, async () => report({ text: await agent.stream("Weather in Paris?") })),
347
+ );
348
+ break;
349
+ }
350
+
351
+ // ---- 2. embeddings
352
+ case "embed":
353
+ report({ embedding: (await embed({ model: embedder(), value: "Paris", experimental_telemetry: telemetry({ functionId: "indexer" }) })).embedding });
354
+ break;
355
+ case "embed-many": {
356
+ const { embeddings } = await embedMany({ model: embedder(), values: ["Paris", "Rome", "Oslo"], experimental_telemetry: telemetry() });
357
+ report({ embeddings: embeddings.length });
358
+ break;
359
+ }
360
+ case "embed-in-agent":
361
+ await failproofai.session({ sessionId: "req-1" }, () =>
362
+ failproofai.agent("rag", { goal: "answer" }, async () => {
363
+ await embed({ model: embedder(), value: "Paris", experimental_telemetry: telemetry() });
364
+ await embedMany({ model: embedder(), values: ["Paris", "Rome", "Oslo"], experimental_telemetry: telemetry() });
365
+ report({ embedded: true });
366
+ }),
367
+ );
368
+ break;
369
+ case "embed-in-tool": {
370
+ const lookup = weatherTool({
371
+ onRun: async (city) => {
372
+ await embed({ model: embedder(), value: city, experimental_telemetry: telemetry() });
373
+ },
374
+ });
375
+ const { text } = await generateText({ model: model(LOOP), prompt: "Weather?", tools: { weather: lookup }, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
376
+ report({ text });
377
+ break;
378
+ }
379
+
380
+ // ---- 3. structured output
381
+ case "object-partial": {
382
+ const m = model([{ text: '{"city":"Paris"}', usage: [5, 3] }]);
383
+ report(await partialObjects(m, telemetry({ functionId: "extractor" })));
384
+ break;
385
+ }
386
+ case "object-invalid":
387
+ try {
388
+ await generateObject({ model: model([{ text: '{"town":"Paris"}', usage: [5, 3] }]), schema: citySchema, prompt: "Where?", experimental_telemetry: telemetry({ functionId: "extractor" }) });
389
+ report({ threw: false });
390
+ } catch (error) {
391
+ report({ threw: (error as Error).name });
392
+ }
393
+ break;
394
+ case "text-output": {
395
+ if (!HAS_OUTPUT) return report({ skipped: "no Output" });
396
+ report({ output: await textWithOutput(model([{ text: '{"city":"Paris"}', usage: [5, 3] }]), telemetry({ functionId: "extractor" })) });
397
+ break;
398
+ }
399
+ case "stream-output": {
400
+ if (!HAS_OUTPUT) return report({ skipped: "no Output" });
401
+ const partials = await streamWithOutput(model([{ text: '{"city":"Paris"}', usage: [5, 3] }]), telemetry({ functionId: "extractor" }));
402
+ report({ partials: partials.length, last: partials[partials.length - 1] });
403
+ break;
404
+ }
405
+
406
+ // ---- 4. tool features
407
+ case "parallel-tools": {
408
+ const m = model([
409
+ {
410
+ calls: [
411
+ { id: "call-p1", name: "weather", input: { city: "Paris" } },
412
+ { id: "call-p2", name: "weather", input: { city: "Rome" } },
413
+ ],
414
+ usage: [11, 7],
415
+ },
416
+ { text: "Paris 20C, Rome 16C.", usage: [40, 9] },
417
+ ]);
418
+ // Rome finishes first: results arrive out of call order.
419
+ const tools = { weather: weatherTool({ delayMs: (city) => (city === "Paris" ? 40 : 5) }) };
420
+ const { text } = await generateText({ model: m, prompt: "Weather?", tools, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
421
+ report({ text });
422
+ break;
423
+ }
424
+ case "client-tool": {
425
+ const m = model([{ calls: [{ id: "call-c1", name: "ask", input: { city: "Paris" } }], usage: [11, 7] }]);
426
+ const result = await generateText({ model: m, prompt: "Weather?", tools: { ask: clientTool() }, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
427
+ report({ toolCalls: result.toolCalls.length });
428
+ break;
429
+ }
430
+ case "tool-choice-required": {
431
+ const { text } = await generateText({ model: model(LOOP), prompt: "Weather?", tools: { weather: weatherTool() }, toolChoice: "required", ...steps(1), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
432
+ report({ text });
433
+ break;
434
+ }
435
+ case "repair": {
436
+ const m = model([{ calls: [{ id: "call-r1", name: "weather", input: { town: "Paris" } }], usage: [11, 7] }, LOOP[1]!]);
437
+ const { text } = await generateText({ model: m, prompt: "Weather?", tools: { weather: weatherTool() }, ...steps(4), ...repairOption({ city: "Paris" }), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
438
+ report({ text });
439
+ break;
440
+ }
441
+ case "prepare-step": {
442
+ const second = model([LOOP[1]!], { modelId: "mock-model-large" });
443
+ const { text } = await generateText({ model: model(LOOP), prompt: "Weather?", tools: { weather: weatherTool() }, ...steps(4), ...prepareStepOption(second), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
444
+ report({ text });
445
+ break;
446
+ }
447
+ case "unknown-tool": {
448
+ const m = model([{ calls: [{ id: "call-u1", name: "teleport", input: { city: "Paris" } }], usage: [11, 7] }, LOOP[1]!]);
449
+ try {
450
+ const { text } = await generateText({ model: m, prompt: "Weather?", tools: { weather: weatherTool() }, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
451
+ report({ text });
452
+ } catch (error) {
453
+ report({ threw: (error as Error).name });
454
+ }
455
+ break;
456
+ }
457
+ case "approval": {
458
+ if (!HAS_APPROVAL) return report({ skipped: "no tool approval" });
459
+ const m = model([{ calls: [{ id: "call-a1", name: "book", input: { city: "Paris" } }], usage: [11, 7] }, { text: "Booked Paris.", usage: [30, 4] }]);
460
+ report(await approveAndResume(m, telemetry({ functionId: "travel-agent" })));
461
+ break;
462
+ }
463
+
464
+ // ---- 5. consuming a stream
465
+ case "stream-full": {
466
+ const result = streamText({ model: model(LOOP), prompt: "Weather?", tools: { weather: weatherTool() }, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
467
+ const types = new Set<string>();
468
+ for await (const part of result.fullStream) types.add(part.type);
469
+ report({ parts: [...types].sort(), text: await result.text });
470
+ break;
471
+ }
472
+ case "stream-response": {
473
+ const result = streamText({ model: model(LOOP), prompt: "Weather?", tools: { weather: weatherTool() }, ...steps(4), experimental_telemetry: telemetry({ functionId: "weather-agent" }) });
474
+ const response = toResponse(result);
475
+ const body = await response.text();
476
+ report({ status: response.status, containsAnswer: body.includes("Paris"), bytes: body.length });
477
+ break;
478
+ }
479
+ case "stream-response-cancel":
480
+ // The browser went away mid-stream. Nothing in the SDK ends the operation
481
+ // after that; the adapter closes it once the stream is garbage.
482
+ report(await disconnectedClient());
483
+ await sleep(100);
484
+ report({ before: held() });
485
+ await collectGarbage();
486
+ report({ after: held() });
487
+ break;
488
+ case "stream-response-cancel-signal":
489
+ report(await disconnectedClient(true));
490
+ await sleep(100);
491
+ report({ before: held() });
492
+ await collectGarbage();
493
+ report({ after: held() });
494
+ break;
495
+ case "stream-error":
496
+ report(await brokenStream());
497
+ await sleep(50);
498
+ await collectGarbage();
499
+ report({ after: held() });
500
+ break;
501
+ case "stream-on-finish": {
502
+ let finished = "";
503
+ const result = streamText({
504
+ model: model(LOOP),
505
+ prompt: "Weather?",
506
+ tools: { weather: weatherTool() },
507
+ ...steps(4),
508
+ experimental_telemetry: telemetry({ functionId: "weather-agent" }),
509
+ onFinish: ({ text }) => {
510
+ finished = text;
511
+ },
512
+ });
513
+ await result.consumeStream();
514
+ report({ finished });
515
+ break;
516
+ }
517
+ case "stream-abort":
518
+ report(await abortedStream());
519
+ await sleep(100);
520
+ report({ before: held() });
521
+ await collectGarbage();
522
+ report({ after: held() });
523
+ break;
524
+ case "stream-unconsumed":
525
+ // Never read. Nothing waits on it, so nothing should be held open.
526
+ neverRead();
527
+ await sleep(200);
528
+ report({ before: held() });
529
+ await collectGarbage();
530
+ report({ after: held() });
531
+ break;
532
+
533
+ // ---- 6. reasoning models
534
+ case "reasoning-generate":
535
+ case "reasoning-stream": {
536
+ const m = model([{ reasoning: "The user wants a city.", text: "Paris.", usage: [12, 20], reasoningTokens: 15 }]);
537
+ const options = { model: m, prompt: "Capital of France?", providerOptions: { mock: { reasoningEffort: "high" } }, experimental_telemetry: telemetry({ functionId: "thinker" }) };
538
+ if (scenario === "reasoning-generate") {
539
+ const result = await generateText(options);
540
+ report({ text: result.text });
541
+ } else {
542
+ const result = streamText(options);
543
+ report({ text: await drainText(result.textStream) });
544
+ }
545
+ break;
546
+ }
547
+ case "reasoning-wrap": {
548
+ const m = await wrapModel(model([{ reasoning: "The user wants a city.", text: "Paris.", usage: [12, 20], reasoningTokens: 15 }]));
549
+ const result = streamText({ model: m, prompt: "Capital of France?" });
550
+ report({ text: await drainText(result.textStream) });
551
+ break;
552
+ }
553
+
554
+ // ---- 7. concurrency
555
+ case "concurrent":
556
+ case "concurrent-stream": {
557
+ const one = async (i: number) => {
558
+ const m = model([
559
+ { calls: [{ id: `call-${i}`, name: "weather", input: { city: `city-${i}` } }], usage: [100 + i, 1], delayMs: (i * 7) % 11 },
560
+ { text: `answer ${i}`, usage: [200 + i, 2], delayMs: (i * 3) % 5 },
561
+ ]);
562
+ const tools = { weather: weatherTool({ delayMs: () => (i * 13) % 17 }) };
563
+ const options = { model: m, prompt: `q${i}`, tools, ...steps(4), experimental_telemetry: telemetry({ functionId: `worker-${i}` }) };
564
+ if (scenario === "concurrent") return (await generateText(options)).text;
565
+ return await drainText(streamText(options).textStream);
566
+ };
567
+ const texts = await failproofai.session({ sessionId: "busy" }, () => Promise.all(Array.from({ length: 10 }, (_, i) => one(i))));
568
+ report({ texts });
569
+ break;
570
+ }
571
+ case "concurrent-unscoped": {
572
+ const texts = await Promise.all(
573
+ Array.from({ length: 10 }, async (_, i) => {
574
+ const m = model([
575
+ { calls: [{ id: `call-${i}`, name: "weather", input: { city: `city-${i}` } }], usage: [100 + i, 1], delayMs: (i * 7) % 11 },
576
+ { text: `answer ${i}`, usage: [200 + i, 2] },
577
+ ]);
578
+ const tools = { weather: weatherTool({ delayMs: () => (i * 13) % 17 }) };
579
+ return (await generateText({ model: m, prompt: `q${i}`, tools, ...steps(4), experimental_telemetry: telemetry({ functionId: "worker" }) })).text;
580
+ }),
581
+ );
582
+ report({ texts });
583
+ break;
584
+ }
585
+ case "concurrent-wrap": {
586
+ const texts = await Promise.all(
587
+ Array.from({ length: 10 }, async (_, i) => {
588
+ const m = await wrapModel(model([{ text: `answer ${i}`, usage: [100 + i, 1], delayMs: (i * 7) % 11 }], { modelId: `model-${i}` }));
589
+ return (await generateText({ model: m, prompt: `q${i}` })).text;
590
+ }),
591
+ );
592
+ report({ texts });
593
+ break;
594
+ }
595
+ default:
596
+ throw new Error(`unknown scenario ${scenario}`);
597
+ }
598
+ report({ major: MAJOR });
599
+ await failproofai.flush();
600
+ }
601
+
602
+ main(process.argv[2] ?? "agent-generate").catch((error: unknown) => {
603
+ console.error("FATAL", error);
604
+ process.exit(1);
605
+ });
@@ -0,0 +1,12 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "nodenext",
5
+ "moduleResolution": "nodenext",
6
+ "strict": true,
7
+ "noEmit": true,
8
+ "skipLibCheck": true,
9
+ "types": ["node"]
10
+ },
11
+ "files": ["agent.ts"]
12
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "files": ["surfaces.ts"]
4
+ }