failproofai 1.0.7-beta.0 → 1.0.7-beta.2

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