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,872 @@
1
+ // Mastra 1.x consumer. Run as `node agent.{mjs,cjs} <case>`.
2
+ //
3
+ // Deliberately the shape a customer writes: import the framework, instrument,
4
+ // run. The model is a hand-written AI SDK `LanguageModelV2` — Mastra's own
5
+ // model interface, so nothing here reaches a network — scripted per agent:
6
+ // the first call asks for a tool, the next one answers. Every agent gets its
7
+ // own script so the token counts in the trace say which call they came from.
8
+ import * as failproofai from "@failproofai/sdk";
9
+ import { wrapTool } from "@failproofai/sdk/mastra";
10
+ import { Agent } from "@mastra/core/agent";
11
+ import { createTool } from "@mastra/core/tools";
12
+ import { createStep, createWorkflow } from "@mastra/core/workflows";
13
+ import { Mastra } from "@mastra/core/mastra";
14
+ import { InMemoryStore } from "@mastra/core/storage";
15
+ import { MCPClient } from "@mastra/mcp";
16
+ import { Memory } from "@mastra/memory";
17
+ import { createServer } from "node:http";
18
+ import type { AddressInfo } from "node:net";
19
+ import { join } from "node:path";
20
+ import { z } from "zod";
21
+
22
+ type Turn = { tool: string; input: Record<string, unknown>; usage: [number, number] } | { text: string; usage: [number, number] };
23
+
24
+ /**
25
+ * Holds the FIRST streamed step open after its response metadata: `reached`
26
+ * fires once the stream is parked there, and it moves on when `wait` settles.
27
+ */
28
+ type Gate = { reached: () => void; wait: Promise<void> };
29
+
30
+ function barrier(): { wait: Promise<void>; open: () => void } {
31
+ let open!: () => void;
32
+ const wait = new Promise<void>((resolve) => (open = resolve));
33
+ return { wait, open };
34
+ }
35
+
36
+ /**
37
+ * A scripted `LanguageModelV2`: `turns` alternate per call, so a two-step tool
38
+ * loop is turn 0 (tool call) then turn 1 (answer). `fail` makes every call
39
+ * throw, which is how a provider error reaches Mastra. Tool call ids are
40
+ * `<callPrefix>_<n>`, so two models in one session never reuse an id.
41
+ */
42
+ function scriptedModel(turns: Turn[], options: { fail?: boolean; callPrefix?: string; gate?: Gate } = {}) {
43
+ let calls = 0;
44
+ const next = (): Turn => turns[calls++ % turns.length]!;
45
+ const usage = ([input, output]: [number, number]) => ({
46
+ inputTokens: input,
47
+ outputTokens: output,
48
+ totalTokens: input + output,
49
+ });
50
+ return {
51
+ specificationVersion: "v2" as const,
52
+ provider: "scripted",
53
+ modelId: "scripted-model",
54
+ supportedUrls: {},
55
+ async doGenerate() {
56
+ if (options.fail) throw new Error("model exploded");
57
+ const turn = next();
58
+ return "tool" in turn
59
+ ? {
60
+ content: [
61
+ { type: "tool-call" as const, toolCallId: `${options.callPrefix ?? "call"}_${calls}`, toolName: turn.tool, input: JSON.stringify(turn.input) },
62
+ ],
63
+ finishReason: "tool-calls" as const,
64
+ usage: usage(turn.usage),
65
+ warnings: [],
66
+ }
67
+ : {
68
+ content: [{ type: "text" as const, text: turn.text }],
69
+ finishReason: "stop" as const,
70
+ usage: usage(turn.usage),
71
+ warnings: [],
72
+ };
73
+ },
74
+ async doStream() {
75
+ if (options.fail) throw new Error("model exploded");
76
+ const turn = next();
77
+ const parts: unknown[] = [
78
+ { type: "stream-start", warnings: [] },
79
+ { type: "response-metadata", id: `resp_${calls}`, modelId: "scripted-model", timestamp: new Date(0) },
80
+ ];
81
+ if ("tool" in turn) {
82
+ parts.push({ type: "tool-call", toolCallId: `${options.callPrefix ?? "call"}_${calls}`, toolName: turn.tool, input: JSON.stringify(turn.input) });
83
+ parts.push({ type: "finish", finishReason: "tool-calls", usage: usage(turn.usage) });
84
+ } else {
85
+ parts.push({ type: "text-start", id: "t" });
86
+ // Two deltas, so a step's content has to be assembled from the stream.
87
+ // (Not one per word: Mastra 0.24's textStream drops the third of five
88
+ // such deltas on its own, instrumented or not.)
89
+ const cut = turn.text.indexOf(" ", turn.text.length / 2) + 1;
90
+ for (const delta of [turn.text.slice(0, cut), turn.text.slice(cut)]) {
91
+ parts.push({ type: "text-delta", id: "t", delta });
92
+ }
93
+ parts.push({ type: "text-end", id: "t" });
94
+ parts.push({ type: "finish", finishReason: "stop", usage: usage(turn.usage) });
95
+ }
96
+ const gate = calls === 1 ? options.gate : undefined;
97
+ if (gate) {
98
+ let index = 0;
99
+ return {
100
+ stream: new ReadableStream({
101
+ async pull(controller) {
102
+ if (index === 2) {
103
+ gate.reached();
104
+ await gate.wait;
105
+ }
106
+ if (index >= parts.length) controller.close();
107
+ else controller.enqueue(parts[index++]);
108
+ },
109
+ }),
110
+ };
111
+ }
112
+ return {
113
+ stream: new ReadableStream({
114
+ start(controller) {
115
+ for (const part of parts) controller.enqueue(part);
116
+ controller.close();
117
+ },
118
+ }),
119
+ };
120
+ },
121
+ };
122
+ }
123
+
124
+ const WEATHER_TURNS: Turn[] = [
125
+ { tool: "weather", input: { city: "Paris" }, usage: [11, 7] },
126
+ { text: "It is sunny in Paris.", usage: [23, 9] },
127
+ ];
128
+
129
+ const weather = createTool({
130
+ id: "weather",
131
+ description: "Current weather for a city",
132
+ inputSchema: z.object({ city: z.string() }),
133
+ execute: async (input: { city: string }) => ({ city: input.city, forecast: "sunny" }),
134
+ });
135
+
136
+ const brokenWeather = createTool({
137
+ id: "weather",
138
+ description: "Current weather for a city",
139
+ inputSchema: z.object({ city: z.string() }),
140
+ execute: async (): Promise<{ city: string }> => {
141
+ throw new Error("tool exploded");
142
+ },
143
+ });
144
+
145
+ const weatherAgent = (options: { fail?: boolean; tool?: typeof weather; gate?: Gate } = {}) =>
146
+ new Agent({
147
+ id: "weather-agent",
148
+ name: "weather-agent",
149
+ instructions: "Answer weather questions.",
150
+ model: scriptedModel(WEATHER_TURNS, options) as never,
151
+ tools: { weather: options.tool ?? weather },
152
+ });
153
+
154
+ function buildWorkflow(fail = false) {
155
+ const fetchCity = createStep({
156
+ id: "fetch-city",
157
+ inputSchema: z.object({ question: z.string() }),
158
+ outputSchema: z.object({ city: z.string() }),
159
+ execute: async () => ({ city: "Paris" }),
160
+ });
161
+ const ask = createStep({
162
+ id: "ask-agent",
163
+ inputSchema: z.object({ city: z.string() }),
164
+ outputSchema: z.object({ answer: z.string() }),
165
+ execute: async ({ inputData }) => {
166
+ if (fail) throw new Error("step exploded");
167
+ const out = await weatherAgent().generate(`Weather in ${inputData.city}?`);
168
+ return { answer: out.text };
169
+ },
170
+ });
171
+ return createWorkflow({
172
+ id: "weather-flow",
173
+ inputSchema: z.object({ question: z.string() }),
174
+ outputSchema: z.object({ answer: z.string() }),
175
+ })
176
+ .then(fetchCity)
177
+ .then(ask)
178
+ .commit();
179
+ }
180
+
181
+ const report = (value: unknown) => console.log(JSON.stringify(value));
182
+ const question = "What is the weather in Paris?";
183
+
184
+ // ---------------------------------------------------------------------------
185
+ // The coverage cases below need a model that answers from what it is ASKED
186
+ // rather than from how often it has been called: concurrent runs share one
187
+ // model, and memory, networks and structured output change what a call sees.
188
+ // ---------------------------------------------------------------------------
189
+
190
+ type Prompt = Array<{ role: string; content: unknown }>;
191
+ type CallOptions = { prompt: Prompt; responseFormat?: { type?: string; schema?: { properties?: Record<string, unknown> } } };
192
+
193
+ /** The text of the LAST user message — the question this call answers. */
194
+ function lastUserText(prompt: Prompt): string {
195
+ for (let i = prompt.length - 1; i >= 0; i -= 1) {
196
+ const message = prompt[i]!;
197
+ if (message.role !== "user") continue;
198
+ if (typeof message.content === "string") return message.content;
199
+ if (Array.isArray(message.content)) {
200
+ return message.content
201
+ .map((part: { type?: string; text?: string }) => (part.type === "text" ? (part.text ?? "") : ""))
202
+ .join("");
203
+ }
204
+ }
205
+ return "";
206
+ }
207
+
208
+ const cityOf = (text: string): string => /in ([A-Z][a-z]+)/.exec(text)?.[1] ?? "Paris";
209
+
210
+ /** Every text a call's prompt carries, system included, for routing on. */
211
+ const promptText = (prompt: Prompt): string => JSON.stringify(prompt);
212
+
213
+ let decidedCalls = 0;
214
+
215
+ /**
216
+ * A `LanguageModelV2` whose every answer is `decide(options)`. Tool call ids
217
+ * are `<prefix>_<n>` over one process-wide counter, so no two calls anywhere
218
+ * reuse one — the concurrency case needs that to tell runs apart.
219
+ */
220
+ function decidingModel(modelId: string, decide: (options: CallOptions) => Turn, prefix = "call") {
221
+ const usage = ([input, output]: [number, number]) => ({ inputTokens: input, outputTokens: output, totalTokens: input + output });
222
+ const answer = (options: CallOptions) => {
223
+ decidedCalls += 1;
224
+ return { turn: decide(options), id: `${prefix}_${decidedCalls}` };
225
+ };
226
+ return {
227
+ specificationVersion: "v2" as const,
228
+ provider: "scripted",
229
+ modelId,
230
+ supportedUrls: {},
231
+ async doGenerate(options: CallOptions) {
232
+ const { turn, id } = answer(options);
233
+ return "tool" in turn
234
+ ? {
235
+ content: [{ type: "tool-call" as const, toolCallId: id, toolName: turn.tool, input: JSON.stringify(turn.input) }],
236
+ finishReason: "tool-calls" as const,
237
+ usage: usage(turn.usage),
238
+ warnings: [],
239
+ }
240
+ : {
241
+ content: [{ type: "text" as const, text: turn.text }],
242
+ finishReason: "stop" as const,
243
+ usage: usage(turn.usage),
244
+ warnings: [],
245
+ };
246
+ },
247
+ async doStream(options: CallOptions) {
248
+ const { turn, id } = answer(options);
249
+ const parts: unknown[] = [
250
+ { type: "stream-start", warnings: [] },
251
+ { type: "response-metadata", id: `resp_${id}`, modelId, timestamp: new Date(0) },
252
+ ];
253
+ if ("tool" in turn) {
254
+ parts.push({ type: "tool-call", toolCallId: id, toolName: turn.tool, input: JSON.stringify(turn.input) });
255
+ parts.push({ type: "finish", finishReason: "tool-calls", usage: usage(turn.usage) });
256
+ } else {
257
+ parts.push({ type: "text-start", id: "t" });
258
+ parts.push({ type: "text-delta", id: "t", delta: turn.text });
259
+ parts.push({ type: "text-end", id: "t" });
260
+ parts.push({ type: "finish", finishReason: "stop", usage: usage(turn.usage) });
261
+ }
262
+ return {
263
+ stream: new ReadableStream({
264
+ start(controller) {
265
+ for (const part of parts) controller.enqueue(part);
266
+ controller.close();
267
+ },
268
+ }),
269
+ };
270
+ },
271
+ };
272
+ }
273
+
274
+ /** Ask `tool` for the city in the question, then answer from its result. */
275
+ const toolThenAnswer = (tool: string) => (options: CallOptions): Turn => {
276
+ // Memory titling a new thread (on by default in 0.x) asks the agent's model.
277
+ if (promptText(options.prompt).includes("short title")) return { text: "Weather", usage: [5, 3] };
278
+ const city = cityOf(lastUserText(options.prompt));
279
+ return options.prompt.at(-1)?.role === "tool"
280
+ ? { text: `It is sunny in ${city}.`, usage: [23, 9] }
281
+ : { tool, input: { city }, usage: [11, 7] };
282
+ };
283
+
284
+ const routedAgent = (name: string, tools: Record<string, unknown> = { weather }, extra: Record<string, unknown> = {}) =>
285
+ new Agent({
286
+ id: name,
287
+ name,
288
+ instructions: "Answer weather questions.",
289
+ model: decidingModel("routed-model", toolThenAnswer(Object.keys(tools)[0] ?? "weather")) as never,
290
+ tools: tools as never,
291
+ ...extra,
292
+ } as never);
293
+
294
+ const CITIES = ["Paris", "Rome", "Oslo", "Lima", "Cairo", "Tokyo", "Quito", "Dakar", "Hanoi", "Perth"];
295
+
296
+ const answerStep = createStep({
297
+ id: "answer",
298
+ inputSchema: z.object({ city: z.string() }),
299
+ outputSchema: z.object({ answer: z.string() }),
300
+ execute: async ({ inputData }) => ({ answer: `sunny in ${inputData.city}` }),
301
+ });
302
+
303
+ /** A two-step workflow, used on its own and nested inside another. */
304
+ function innerWorkflow() {
305
+ const pick = createStep({
306
+ id: "pick-city",
307
+ inputSchema: z.object({ question: z.string() }),
308
+ outputSchema: z.object({ city: z.string() }),
309
+ execute: async ({ inputData }) => ({ city: cityOf(inputData.question) }),
310
+ });
311
+ return createWorkflow({
312
+ id: "inner-flow",
313
+ inputSchema: z.object({ question: z.string() }),
314
+ outputSchema: z.object({ answer: z.string() }),
315
+ })
316
+ .then(pick)
317
+ .then(answerStep)
318
+ .commit();
319
+ }
320
+
321
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- one entry point for differently-typed workflows
322
+ function workflowCase(name: string): { createRun(): Promise<any> } {
323
+ const input = z.object({ question: z.string() });
324
+ const out = z.object({ answer: z.string() });
325
+ const city = createStep({
326
+ id: "city",
327
+ inputSchema: input,
328
+ outputSchema: z.object({ city: z.string() }),
329
+ execute: async ({ inputData }) => ({ city: cityOf(inputData.question) }),
330
+ });
331
+ switch (name) {
332
+ case "branch": {
333
+ const sunny = createStep({ id: "sunny", inputSchema: z.object({ city: z.string() }), outputSchema: out, execute: async () => ({ answer: "sunny" }) });
334
+ const rainy = createStep({ id: "rainy", inputSchema: z.object({ city: z.string() }), outputSchema: out, execute: async () => ({ answer: "rainy" }) });
335
+ return createWorkflow({ id: "branch-flow", inputSchema: input, outputSchema: z.any() })
336
+ .then(city)
337
+ .branch([
338
+ [async ({ inputData }) => inputData.city === "Paris", sunny],
339
+ [async ({ inputData }) => inputData.city !== "Paris", rainy],
340
+ ])
341
+ .commit();
342
+ }
343
+ case "parallel": {
344
+ const high = createStep({ id: "high", inputSchema: z.object({ city: z.string() }), outputSchema: z.object({ t: z.number() }), execute: async () => ({ t: 25 }) });
345
+ const low = createStep({ id: "low", inputSchema: z.object({ city: z.string() }), outputSchema: z.object({ t: z.number() }), execute: async () => ({ t: 12 }) });
346
+ return createWorkflow({ id: "parallel-flow", inputSchema: input, outputSchema: z.any() }).then(city).parallel([high, low]).commit();
347
+ }
348
+ case "loop": {
349
+ const count = createStep({
350
+ id: "count",
351
+ inputSchema: z.object({ n: z.number() }),
352
+ outputSchema: z.object({ n: z.number() }),
353
+ execute: async ({ inputData }) => ({ n: inputData.n + 1 }),
354
+ });
355
+ const cities = createStep({
356
+ id: "cities",
357
+ inputSchema: z.object({ n: z.number() }),
358
+ outputSchema: z.array(z.object({ city: z.string() })),
359
+ execute: async () => [{ city: "Paris" }, { city: "Rome" }],
360
+ });
361
+ return createWorkflow({ id: "loop-flow", inputSchema: z.object({ n: z.number() }), outputSchema: z.any() })
362
+ .dowhile(count, async ({ inputData }) => inputData.n < 3)
363
+ .then(cities)
364
+ .foreach(answerStep)
365
+ .commit();
366
+ }
367
+ case "nested":
368
+ return createWorkflow({ id: "outer-flow", inputSchema: input, outputSchema: out }).then(innerWorkflow()).commit();
369
+ case "agent-step": {
370
+ const toPrompt = createStep({
371
+ id: "to-prompt",
372
+ inputSchema: input,
373
+ outputSchema: z.object({ prompt: z.string() }),
374
+ execute: async ({ inputData }) => ({ prompt: inputData.question }),
375
+ });
376
+ return createWorkflow({ id: "agent-step-flow", inputSchema: input, outputSchema: z.any() })
377
+ .then(toPrompt)
378
+ .then(createStep(routedAgent("weather-agent")))
379
+ .commit();
380
+ }
381
+ case "suspend": {
382
+ const approve = createStep({
383
+ id: "approve",
384
+ inputSchema: z.object({ city: z.string() }),
385
+ outputSchema: z.object({ city: z.string(), approved: z.boolean() }),
386
+ suspendSchema: z.object({ prompt: z.string() }),
387
+ resumeSchema: z.object({ approved: z.boolean() }),
388
+ execute: async ({ inputData, resumeData, suspend }) => {
389
+ if (resumeData === undefined) return (await suspend({ prompt: `Look up ${inputData.city}?` })) as never;
390
+ return { city: inputData.city, approved: resumeData.approved };
391
+ },
392
+ });
393
+ const done = createStep({
394
+ id: "done",
395
+ inputSchema: z.object({ city: z.string(), approved: z.boolean() }),
396
+ outputSchema: out,
397
+ execute: async ({ inputData }) => ({ answer: inputData.approved ? `sunny in ${inputData.city}` : "declined" }),
398
+ });
399
+ return createWorkflow({ id: "approval-flow", inputSchema: input, outputSchema: out }).then(city).then(approve).then(done).commit();
400
+ }
401
+ default:
402
+ throw new Error(`unknown workflow ${name}`);
403
+ }
404
+ }
405
+
406
+ const mcpServer = () => ({ command: process.execPath, args: [join(process.cwd(), "mcp-server.mjs")] });
407
+
408
+ async function main(scenario: string): Promise<void> {
409
+ report({ instrumented: await failproofai.instrument("mastra") });
410
+
411
+ switch (scenario) {
412
+ case "generate": {
413
+ const out = await weatherAgent().generate(question);
414
+ report({ answer: out.text });
415
+ break;
416
+ }
417
+ case "stream": {
418
+ const out = await weatherAgent().stream(question);
419
+ let text = "";
420
+ for await (const chunk of out.textStream) text += chunk;
421
+ report({ answer: text });
422
+ break;
423
+ }
424
+ case "subagent": {
425
+ const helper = new Agent({
426
+ id: "helper",
427
+ name: "helper",
428
+ description: "Looks up the weather.",
429
+ instructions: "Answer weather questions.",
430
+ model: scriptedModel(WEATHER_TURNS) as never,
431
+ tools: { weather },
432
+ });
433
+ const boss = new Agent({
434
+ id: "boss",
435
+ name: "boss",
436
+ instructions: "Delegate weather questions.",
437
+ model: scriptedModel([
438
+ { tool: "agent-helper", input: { prompt: "Weather in Paris?" }, usage: [40, 12] },
439
+ { text: "The helper says it is sunny.", usage: [60, 8] },
440
+ ], { callPrefix: "delegate" }) as never,
441
+ agents: { helper },
442
+ });
443
+ const out = await boss.generate(question);
444
+ report({ answer: out.text });
445
+ break;
446
+ }
447
+ case "workflow": {
448
+ const run = await buildWorkflow().createRun();
449
+ const out = await run.start({ inputData: { question } });
450
+ report({ status: out.status });
451
+ break;
452
+ }
453
+ case "workflow-error": {
454
+ const run = await buildWorkflow(true).createRun();
455
+ const out = await run.start({ inputData: { question } });
456
+ report({ status: out.status });
457
+ break;
458
+ }
459
+ case "wraptool": {
460
+ const tool = wrapTool(weather);
461
+ report({ out: await tool.execute!({ city: "Rome" }, {} as never) });
462
+ break;
463
+ }
464
+ case "tool-error": {
465
+ const out = await weatherAgent({ tool: brokenWeather as never }).generate(question);
466
+ report({ answer: out.text });
467
+ break;
468
+ }
469
+ case "model-error": {
470
+ try {
471
+ await weatherAgent({ fail: true }).generate(question);
472
+ report({ threw: false });
473
+ } catch (error) {
474
+ report({ threw: (error as Error).message });
475
+ }
476
+ break;
477
+ }
478
+ case "stream-model-error": {
479
+ const out = await weatherAgent({ fail: true }).stream(question);
480
+ let chunks = 0;
481
+ for await (const _ of out.fullStream) chunks += 1;
482
+ report({ chunks, error: String(out.error) });
483
+ break;
484
+ }
485
+ case "scope": {
486
+ await failproofai.session({ sessionId: "req-1" }, () =>
487
+ failproofai.agent("planner", { goal: "plan" }, () => weatherAgent().generate(question)),
488
+ );
489
+ break;
490
+ }
491
+ case "uninstrument": {
492
+ report({ removed: failproofai.uninstrument() });
493
+ await weatherAgent().generate(question);
494
+ break;
495
+ }
496
+ case "uninstrument-midstream": {
497
+ // uninstrument() lands while the first model step's stream is parked
498
+ // mid-flight; the caller then reads the run to the end regardless.
499
+ const reached = barrier();
500
+ const gate = barrier();
501
+ await failproofai.session({ sessionId: "req-1" }, async () => {
502
+ const out = await weatherAgent({ gate: { reached: reached.open, wait: gate.wait } }).stream(question);
503
+ const reading = (async () => {
504
+ let text = "";
505
+ for await (const chunk of out.textStream) text += chunk;
506
+ return text;
507
+ })();
508
+ await reached.wait;
509
+ report({ removed: failproofai.uninstrument() });
510
+ gate.open();
511
+ report({ answer: await reading });
512
+ });
513
+ break;
514
+ }
515
+ case "uninstrument-reuse": {
516
+ // One Agent instance: run while instrumented, then again (both ways)
517
+ // after uninstrument().
518
+ await failproofai.session({ sessionId: "req-1" }, async () => {
519
+ const agent = weatherAgent();
520
+ await agent.generate(question);
521
+ report({ removed: failproofai.uninstrument() });
522
+ const again = await agent.generate(question);
523
+ const streamed = await agent.stream(question);
524
+ let text = "";
525
+ for await (const chunk of streamed.textStream) text += chunk;
526
+ report({ answers: [again.text, text] });
527
+ });
528
+ break;
529
+ }
530
+ case "reinstrument": {
531
+ report({ removed: failproofai.uninstrument() });
532
+ report({ instrumented: await failproofai.instrument("mastra") });
533
+ const out = await weatherAgent().generate(question);
534
+ report({ answer: out.text });
535
+ break;
536
+ }
537
+ case "reinstrument-reuse": {
538
+ // The same Agent instance across an uninstrument()/instrument() cycle.
539
+ const agent = weatherAgent();
540
+ await agent.generate(question);
541
+ report({ removed: failproofai.uninstrument() });
542
+ report({ instrumented: await failproofai.instrument("mastra") });
543
+ const out = await agent.generate(question);
544
+ report({ answer: out.text });
545
+ break;
546
+ }
547
+ case "mastra-instance": {
548
+ // Registered on a Mastra instance and fetched back through it — the
549
+ // shape `mastra dev` and every deployer use.
550
+ const mastra = new Mastra({
551
+ agents: { weatherAgent: weatherAgent() },
552
+ workflows: { weatherFlow: buildWorkflow() },
553
+ logger: false,
554
+ });
555
+ const out = await mastra.getAgent("weatherAgent").generate(question);
556
+ const run = await mastra.getWorkflow("weatherFlow").createRun();
557
+ const flow = await run.start({ inputData: { question } });
558
+ report({ answer: out.text, status: flow.status });
559
+ break;
560
+ }
561
+ case "concurrent": {
562
+ // Ten runs of ONE Agent instance at once, in one session.
563
+ const agent = routedAgent("weather-agent");
564
+ await failproofai.session({ sessionId: "req-1" }, async () => {
565
+ const outs = await Promise.all(CITIES.map((city) => agent.generate(`What is the weather in ${city}?`)));
566
+ report({ answers: outs.map((out) => out.text) });
567
+ });
568
+ break;
569
+ }
570
+ case "concurrent-sessions": {
571
+ // The same, with no scope: every run is its own session, so a leaked
572
+ // event would land in the wrong one where the test can see it.
573
+ const agent = routedAgent("weather-agent");
574
+ const outs = await Promise.all(
575
+ CITIES.map((city, i) =>
576
+ i % 2 === 0
577
+ ? agent.generate(`What is the weather in ${city}?`).then((out) => out.text)
578
+ : agent.stream(`What is the weather in ${city}?`).then(async (out) => {
579
+ let text = "";
580
+ for await (const chunk of out.textStream) text += chunk;
581
+ return text;
582
+ }),
583
+ ),
584
+ );
585
+ report({ answers: outs });
586
+ break;
587
+ }
588
+ case "memory": {
589
+ // Two turns of one conversation (thread) through @mastra/memory.
590
+ const agent = routedAgent("weather-agent", { weather }, {
591
+ memory: new Memory({ storage: new InMemoryStore(), options: { lastMessages: 10 } }),
592
+ });
593
+ const memory = { thread: "thread-42", resource: "user-7" };
594
+ const first = await agent.generate("What is the weather in Paris?", { memory });
595
+ const second = await agent.stream("And what is the weather in Rome?", { memory });
596
+ let text = "";
597
+ for await (const chunk of second.textStream) text += chunk;
598
+ report({ answers: [first.text, text] });
599
+ break;
600
+ }
601
+ case "memory-scoped": {
602
+ // An enclosing session scope wins over the thread.
603
+ const agent = routedAgent("weather-agent", { weather }, {
604
+ memory: new Memory({ storage: new InMemoryStore(), options: { lastMessages: 10 } }),
605
+ });
606
+ await failproofai.session({ sessionId: "req-1" }, () =>
607
+ agent.generate(question, { memory: { thread: "thread-42", resource: "user-7" } }),
608
+ );
609
+ break;
610
+ }
611
+ case "wf-branch":
612
+ case "wf-parallel":
613
+ case "wf-loop":
614
+ case "wf-nested":
615
+ case "wf-agent-step": {
616
+ const name = scenario.slice(3);
617
+ const run = await workflowCase(name).createRun();
618
+ const out = await run.start({ inputData: (name === "loop" ? { n: 0 } : { question }) as never });
619
+ report({ status: out.status, result: out.status === "success" ? out.result : undefined });
620
+ break;
621
+ }
622
+ case "wf-stream": {
623
+ // A workflow run streamed rather than awaited.
624
+ const run = await workflowCase("agent-step").createRun();
625
+ const streamed = await run.stream({ inputData: { question } });
626
+ let chunks = 0;
627
+ for await (const _ of streamed.fullStream) chunks += 1;
628
+ report({ chunks, status: await streamed.status });
629
+ break;
630
+ }
631
+ case "wf-suspend": {
632
+ // A resume reads the suspended run's snapshot back from storage.
633
+ const mastra = new Mastra({ workflows: { approval: workflowCase("suspend") as never }, storage: new InMemoryStore(), logger: false });
634
+ const run = await (mastra.getWorkflow("approval") as unknown as ReturnType<typeof workflowCase>).createRun();
635
+ const first = await run.start({ inputData: { question } });
636
+ report({ status: first.status });
637
+ const second = await run.resume({ step: "approve", resumeData: { approved: true } });
638
+ report({ status: second.status, result: second.status === "success" ? second.result : undefined });
639
+ break;
640
+ }
641
+ case "processors": {
642
+ // An input processor that rewrites the prompt and an output processor
643
+ // that rewrites the answer: neither may add or lose an event.
644
+ const agent = routedAgent("weather-agent", { weather }, {
645
+ inputProcessors: [
646
+ {
647
+ id: "tag-input",
648
+ processInput: ({ messages }: { messages: unknown[] }) => messages,
649
+ },
650
+ ],
651
+ outputProcessors: [
652
+ {
653
+ id: "shout",
654
+ processOutputResult: ({ messages }: { messages: unknown[] }) => messages,
655
+ },
656
+ ],
657
+ });
658
+ const out = await agent.generate(question);
659
+ const streamed = await agent.stream(question);
660
+ let text = "";
661
+ for await (const chunk of streamed.textStream) text += chunk;
662
+ report({ answers: [out.text, text] });
663
+ break;
664
+ }
665
+ case "tripwire": {
666
+ // A guardrail that blocks the prompt: no model call, the run rejected.
667
+ const agent = routedAgent("weather-agent", { weather }, {
668
+ inputProcessors: [
669
+ {
670
+ id: "block-paris",
671
+ processInput: ({ messages, abort }: { messages: unknown[]; abort: (reason: string) => never }) =>
672
+ JSON.stringify(messages).includes("Paris") ? abort("Paris is blocked") : messages,
673
+ },
674
+ ],
675
+ });
676
+ const out = await agent.generate(question);
677
+ const streamed = await agent.stream(question);
678
+ for await (const _ of streamed.fullStream) void _;
679
+ report({ tripwire: Boolean((out as { tripwire?: unknown }).tripwire), text: out.text });
680
+ break;
681
+ }
682
+ case "tripwire-output": {
683
+ // A guardrail on the OUTPUT stream: the model answers, the processor
684
+ // blocks the answer mid-stream.
685
+ const agent = new Agent({
686
+ id: "weather-agent",
687
+ name: "weather-agent",
688
+ instructions: "Answer weather questions.",
689
+ model: decidingModel("routed-model", () => ({ text: "It is sunny in Paris.", usage: [9, 4] })) as never,
690
+ outputProcessors: [
691
+ {
692
+ id: "block-answer",
693
+ processOutputStream: ({ part, abort }: { part: { type: string }; abort: (reason: string) => never }) =>
694
+ part.type === "text-delta" ? abort("answer blocked") : part,
695
+ },
696
+ ],
697
+ } as never);
698
+ const streamed = await agent.stream(question);
699
+ let chunks = 0;
700
+ for await (const _ of streamed.fullStream) chunks += 1;
701
+ report({ chunks, tripwire: Boolean((streamed as { tripwire?: unknown }).tripwire) });
702
+ break;
703
+ }
704
+ case "usage-openai-compatible": {
705
+ // Mastra's own model for an OpenAI-compatible endpoint (`{ id, url }`),
706
+ // against a loopback server that — like OpenAI — sends a streamed
707
+ // step's usage only when the request asks for it, or always when
708
+ // USAGE_ALWAYS=1 (as some compatible servers do).
709
+ const requests: Array<{ stream?: boolean; streamOptions?: unknown }> = [];
710
+ const usage = { prompt_tokens: 17, completion_tokens: 5, total_tokens: 22 };
711
+ const server = createServer((req, res) => {
712
+ let raw = "";
713
+ req.on("data", (chunk: Buffer) => (raw += chunk.toString()));
714
+ req.on("end", () => {
715
+ const body = JSON.parse(raw || "{}") as { stream?: boolean; stream_options?: { include_usage?: boolean } };
716
+ requests.push({ stream: body.stream, streamOptions: body.stream_options });
717
+ const base = { id: "c1", created: 0, model: "compat-model" };
718
+ if (!body.stream) {
719
+ res.setHeader("content-type", "application/json");
720
+ res.end(JSON.stringify({ ...base, object: "chat.completion", choices: [{ index: 0, message: { role: "assistant", content: "Sunny." }, finish_reason: "stop" }], usage }));
721
+ return;
722
+ }
723
+ res.setHeader("content-type", "text/event-stream");
724
+ const send = (chunk: unknown) => res.write(`data: ${JSON.stringify(chunk)}\n\n`);
725
+ send({ ...base, object: "chat.completion.chunk", choices: [{ index: 0, delta: { role: "assistant", content: "Sunny." }, finish_reason: null }] });
726
+ send({ ...base, object: "chat.completion.chunk", choices: [{ index: 0, delta: {}, finish_reason: "stop" }] });
727
+ if (process.env.USAGE_ALWAYS === "1" || body.stream_options?.include_usage) {
728
+ send({ ...base, object: "chat.completion.chunk", choices: [], usage });
729
+ }
730
+ res.end("data: [DONE]\n\n");
731
+ });
732
+ });
733
+ await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
734
+ try {
735
+ const url = `http://127.0.0.1:${(server.address() as AddressInfo).port}/v1`;
736
+ const agent = new Agent({ id: "compat-agent", name: "compat-agent", instructions: "Be brief.", model: { id: "custom/compat-model", url, apiKey: "test-key" } as never });
737
+ const streamed = await agent.stream(question);
738
+ let text = "";
739
+ for await (const chunk of streamed.textStream) text += chunk;
740
+ const streamedUsage = await streamed.usage;
741
+ const generated = await agent.generate(question);
742
+ report({ text, mastraStreamTokens: streamedUsage.inputTokens ?? 0, mastraGenerateTokens: generated.usage.inputTokens ?? 0, requests });
743
+ } finally {
744
+ // Deno's node:http keeps idle keep-alive sockets open through close(),
745
+ // so the process would outlive the test; Node closes idle ones itself.
746
+ server.closeAllConnections();
747
+ server.close();
748
+ }
749
+ break;
750
+ }
751
+ case "mcp":
752
+ case "mcp-toolsets": {
753
+ const mcp = new MCPClient({ id: `mcp-${process.pid}`, servers: { weatherServer: mcpServer() } });
754
+ try {
755
+ if (scenario === "mcp") {
756
+ const tools = await mcp.listTools();
757
+ const agent = routedAgent("weather-agent", tools);
758
+ const out = await agent.generate(question);
759
+ report({ tools: Object.keys(tools), answer: out.text });
760
+ } else {
761
+ const agent = new Agent({
762
+ id: "weather-agent",
763
+ name: "weather-agent",
764
+ instructions: "Answer weather questions.",
765
+ model: decidingModel("routed-model", toolThenAnswer("forecast")) as never,
766
+ });
767
+ const out = await agent.generate(question, { toolsets: await mcp.listToolsets() });
768
+ report({ answer: out.text });
769
+ }
770
+ } finally {
771
+ await mcp.disconnect();
772
+ }
773
+ break;
774
+ }
775
+ case "structured": {
776
+ const agent = new Agent({
777
+ id: "weather-agent",
778
+ name: "weather-agent",
779
+ instructions: "Answer weather questions.",
780
+ model: decidingModel("routed-model", (options) => ({
781
+ text: JSON.stringify({ city: cityOf(lastUserText(options.prompt)), forecast: "sunny" }),
782
+ usage: [15, 6],
783
+ })) as never,
784
+ });
785
+ const schema = z.object({ city: z.string(), forecast: z.string() });
786
+ const out = await agent.generate(question, { structuredOutput: { schema } });
787
+ const streamed = await agent.stream(question, { structuredOutput: { schema } });
788
+ report({ object: out.object, streamed: await streamed.object });
789
+ break;
790
+ }
791
+ case "structured-model": {
792
+ // Structuring by a SECOND model: Mastra runs it through an agent of
793
+ // its own, after the main loop.
794
+ const agent = routedAgent("weather-agent");
795
+ const structurer = decidingModel("structuring-model", () => ({ text: JSON.stringify({ city: "Paris", forecast: "sunny" }), usage: [30, 5] }));
796
+ const out = await agent.generate(question, {
797
+ structuredOutput: { schema: z.object({ city: z.string(), forecast: z.string() }), model: structurer as never },
798
+ });
799
+ report({ object: out.object });
800
+ break;
801
+ }
802
+ case "maxsteps-tool-error": {
803
+ // One step only, and the tool it calls throws.
804
+ const agent = routedAgent("weather-agent", { weather: brokenWeather });
805
+ const out = await agent.generate(question, { maxSteps: 1 });
806
+ report({ finishReason: out.finishReason, text: out.text });
807
+ break;
808
+ }
809
+ case "network": {
810
+ // An agent network: the planner's model routes to `helper` once, the
811
+ // helper answers with its tool, the planner's model judges it complete.
812
+ const helper = new Agent({
813
+ id: "helper",
814
+ name: "helper",
815
+ description: "Looks up the weather.",
816
+ instructions: "Answer weather questions.",
817
+ model: decidingModel("routed-model", toolThenAnswer("weather")) as never,
818
+ tools: { weather },
819
+ });
820
+ const planner = new Agent({
821
+ id: "planner",
822
+ name: "planner",
823
+ instructions: "Coordinate the specialists.",
824
+ model: decidingModel("router-model", (options) => {
825
+ // Tell the calls apart by the schema they ask for, falling back to
826
+ // the prompt when a release injects the schema as text instead. The
827
+ // completion check comes first: its prompt quotes the routing answer.
828
+ const fields = options.responseFormat?.schema?.properties ?? {};
829
+ const asked = lastUserText(options.prompt);
830
+ if ("isComplete" in fields || (asked.includes("evaluate") && asked.includes("complete"))) {
831
+ return { text: JSON.stringify({ isComplete: true, completionReason: "answered", finalResult: "It is sunny in Paris." }), usage: [40, 6] };
832
+ }
833
+ if ("primitiveId" in fields || promptText(options.prompt).includes("primitiveId")) {
834
+ return {
835
+ text: JSON.stringify({ primitiveId: "helper", primitiveType: "agent", prompt: question, selectionReason: "weather" }),
836
+ usage: [50, 10],
837
+ };
838
+ }
839
+ return { text: "Weather in Paris", usage: [5, 3] };
840
+ }) as never,
841
+ agents: { helper },
842
+ memory: new Memory({ storage: new InMemoryStore(), options: { lastMessages: 10 } }),
843
+ });
844
+ const stream = await planner.network(question, { memory: { thread: "thread-net", resource: "user-7" } });
845
+ for await (const _ of stream) void _;
846
+ report({ status: await stream.status });
847
+ break;
848
+ }
849
+ case "agent-in-tool": {
850
+ // Delegation by hand: a tool whose body runs another agent.
851
+ const helper = routedAgent("helper");
852
+ const ask = createTool({
853
+ id: "ask-helper",
854
+ description: "Ask the helper",
855
+ inputSchema: z.object({ city: z.string() }),
856
+ execute: async (input: { city: string }) => ({ answer: (await helper.generate(`What is the weather in ${input.city}?`)).text }),
857
+ });
858
+ const boss = routedAgent("boss", { "ask-helper": ask });
859
+ const out = await boss.generate(question);
860
+ report({ answer: out.text });
861
+ break;
862
+ }
863
+ default:
864
+ throw new Error(`unknown scenario ${scenario}`);
865
+ }
866
+ await failproofai.flush();
867
+ }
868
+
869
+ main(process.argv[2] ?? "generate").catch((error: unknown) => {
870
+ console.error("FATAL", error);
871
+ process.exit(1);
872
+ });