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,501 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+
3
+ import { setLogger } from "../src/logger.js";
4
+ import * as core from "../src/integrations/core.js";
5
+ import { _internals, adapter } from "../src/integrations/mastra.js";
6
+ import { agent as agentScope, session } from "../src/scopes.js";
7
+ import { flushed, useSpool } from "./helpers.js";
8
+ import type { Spool } from "./helpers.js";
9
+
10
+ /**
11
+ * The Mastra surfaces beyond a bare `generate()` / `stream()` — memory
12
+ * threads, agent networks, processor tripwires, workflow suspend/resume —
13
+ * against hand-written stand-ins for `@mastra/core` shaped like the real
14
+ * call sequences (the module loader is the only thing mocked).
15
+ * `integration/mastra.test.ts` proves each against real 0.x and 1.x releases.
16
+ */
17
+
18
+ const modules = vi.hoisted(() => ({ agent: [] as unknown[], workflows: [] as unknown[] }));
19
+
20
+ vi.mock("../src/integrations/compat.js", async (importOriginal) => {
21
+ const actual = await importOriginal<typeof import("../src/integrations/compat.js")>();
22
+ return {
23
+ ...actual,
24
+ requireModuleCopies: async (specifier: string): Promise<unknown[]> =>
25
+ specifier.endsWith("/agent") ? modules.agent : modules.workflows,
26
+ };
27
+ });
28
+
29
+ const {
30
+ conversationOf,
31
+ isRoutingAgent,
32
+ suspendedStepsOf,
33
+ resumeTargetOf,
34
+ humanText,
35
+ } = _internals;
36
+
37
+ // ---------------------------------------------------------------------------
38
+ // Stand-ins
39
+ // ---------------------------------------------------------------------------
40
+
41
+ class FakeModel {
42
+ modelId = "fake-model";
43
+ constructor(private usage: [number, number] = [3, 4]) {}
44
+ async doGenerate(): Promise<unknown> {
45
+ return {
46
+ content: [{ type: "text", text: "sunny" }],
47
+ finishReason: "stop",
48
+ usage: { inputTokens: this.usage[0], outputTokens: this.usage[1] },
49
+ };
50
+ }
51
+ }
52
+
53
+ interface StreamOptions {
54
+ onFinish?: (result: unknown) => unknown;
55
+ onError?: (error: unknown) => unknown;
56
+ onAbort?: (event: unknown) => unknown;
57
+ }
58
+
59
+ /**
60
+ * A stream's output the way Mastra's is: consuming it calls `onFinish` unless
61
+ * a processor blocked it, and then finishes — which only `_waitUntilFinished()`
62
+ * reports.
63
+ */
64
+ class FakeOutput {
65
+ tripwire: unknown = undefined;
66
+ private finished: () => void = () => undefined;
67
+ private readonly done = new Promise<void>((resolve) => (this.finished = resolve));
68
+ constructor(private readonly options: StreamOptions = {}) {}
69
+ _waitUntilFinished(): Promise<void> {
70
+ return this.done;
71
+ }
72
+ consume(): void {
73
+ if (!this.tripwire) this.options.onFinish?.({ finishReason: "stop" });
74
+ this.finished();
75
+ }
76
+ }
77
+
78
+ class FakeAgent {
79
+ model: FakeModel;
80
+ /** What `__runInputProcessors` reports, in the 0.x or 1.x shape. */
81
+ guard: Record<string, unknown> = {};
82
+ /** Runs inside the agent's own call, before its model step. */
83
+ inside: (() => Promise<unknown>) | null = null;
84
+ /** What each generate() / network() call was handed. */
85
+ calls: unknown[][] = [];
86
+ constructor(
87
+ public name: string,
88
+ public id: string = name,
89
+ usage?: [number, number],
90
+ ) {
91
+ this.model = new FakeModel(usage);
92
+ }
93
+
94
+ resolveModelConfig(): FakeModel {
95
+ return this.model;
96
+ }
97
+
98
+ convertTools(): Record<string, unknown> {
99
+ return {};
100
+ }
101
+
102
+ __runInputProcessors(): Promise<Record<string, unknown>> {
103
+ return Promise.resolve(this.guard);
104
+ }
105
+
106
+ async generate(prompt: string, options?: unknown): Promise<unknown> {
107
+ this.calls.push([prompt, options]);
108
+ await this.inside?.();
109
+ const model = await this.resolveModelConfig();
110
+ await model.doGenerate();
111
+ return { text: "sunny", finishReason: "stop" };
112
+ }
113
+
114
+ /** A stream whose input processors ran first; a blocked one never calls the model. */
115
+ async stream(_prompt: string, options: StreamOptions = {}): Promise<FakeOutput> {
116
+ const guard = await this.__runInputProcessors();
117
+ const output = new FakeOutput(options);
118
+ if (guard.tripwire || guard.tripwireTriggered) {
119
+ output.tripwire = guard.tripwire ?? true;
120
+ return output;
121
+ }
122
+ const model = await this.resolveModelConfig();
123
+ await model.doGenerate();
124
+ return output;
125
+ }
126
+
127
+ /**
128
+ * `agent.network()` as Mastra runs it: a fresh `routing-agent` on this
129
+ * agent's model decides, a sub-agent runs, the router judges it complete,
130
+ * and the stream settles its `status` by itself.
131
+ */
132
+ async network(prompt: string, options?: unknown): Promise<{ status: Promise<string> }> {
133
+ this.calls.push([prompt, options]);
134
+ const route = (): FakeAgent => {
135
+ const router = new FakeAgent("Routing Agent", "routing-agent");
136
+ router.model = this.model;
137
+ return router;
138
+ };
139
+ let settle!: (status: string) => void;
140
+ let fail!: (error: unknown) => void;
141
+ const status = new Promise<string>((resolve, reject) => {
142
+ settle = resolve;
143
+ fail = reject;
144
+ });
145
+ void (async () => {
146
+ await route().generate("route");
147
+ if (this.name === "broken") {
148
+ fail(new Error("network exploded"));
149
+ return;
150
+ }
151
+ await new FakeAgent("helper", "helper", [11, 7]).generate("weather");
152
+ await route().generate("complete?");
153
+ settle("success");
154
+ })();
155
+ return { status };
156
+ }
157
+ }
158
+
159
+ class FakeEngine {
160
+ static inner: ((runId: string) => Promise<void>) | null = null;
161
+ async executeStep(params: { step: { id: string }; executionContext: { runId: string } }): Promise<unknown> {
162
+ if (params.step.id === "agent" && FakeEngine.inner) await FakeEngine.inner(params.executionContext.runId);
163
+ return { result: { status: params.step.id === "approve-wait" ? "suspended" : "success", output: { ok: true } } };
164
+ }
165
+ }
166
+
167
+ /** A workflow run whose `_start` / `_resume` resolve with the given results. */
168
+ class FakeRun {
169
+ workflowId = "approval-flow";
170
+ resumedWith: unknown[] = [];
171
+ constructor(
172
+ public runId: string,
173
+ private results: unknown[],
174
+ private startSteps: string[] = ["city", "approve-wait"],
175
+ ) {}
176
+
177
+ private async next(steps: string[]): Promise<unknown> {
178
+ const engine = new FakeEngine();
179
+ for (const id of steps) await engine.executeStep({ step: { id }, executionContext: { runId: this.runId } });
180
+ return this.results.shift();
181
+ }
182
+
183
+ _start(): Promise<unknown> {
184
+ return this.next(this.startSteps);
185
+ }
186
+
187
+ _resume(params: unknown): Promise<unknown> {
188
+ this.resumedWith.push(params);
189
+ return this.next(["approve", "done"]);
190
+ }
191
+ }
192
+
193
+ const suspended = (...ids: string[]): Record<string, unknown> => ({
194
+ status: "suspended",
195
+ suspended: ids.map((id) => [id]),
196
+ steps: Object.fromEntries(ids.map((id) => [id, { status: "suspended", suspendPayload: { prompt: `Approve ${id}?` } }])),
197
+ });
198
+
199
+ // ---------------------------------------------------------------------------
200
+
201
+ let spool: Spool;
202
+
203
+ beforeEach(() => {
204
+ spool = useSpool();
205
+ core.resetFailures();
206
+ FakeEngine.inner = null;
207
+ modules.agent = [{ Agent: FakeAgent }];
208
+ modules.workflows = [{ Run: FakeRun, DefaultExecutionEngine: FakeEngine }];
209
+ });
210
+ afterEach(async () => {
211
+ adapter.uninstall();
212
+ await spool.cleanup();
213
+ setLogger(null);
214
+ });
215
+
216
+ const shape = (events: Array<Record<string, unknown>>): string[] =>
217
+ events.map((e) => `${String(e.agent_id)} ${String(e.type)}`);
218
+
219
+ describe("readers", () => {
220
+ it("reads a memory thread and resource in both majors' shapes", () => {
221
+ expect(conversationOf({ memory: { thread: "t-1", resource: "u-1" } })).toEqual({ thread: "t-1", resource: "u-1" });
222
+ expect(conversationOf({ memory: { thread: { id: "t-2", title: "x" }, resource: "u-1" } })).toEqual({
223
+ thread: "t-2",
224
+ resource: "u-1",
225
+ });
226
+ // 0.x's deprecated top-level options.
227
+ expect(conversationOf({ threadId: "t-3", resourceId: "u-3" })).toEqual({ thread: "t-3", resource: "u-3" });
228
+ expect(conversationOf({ memory: { thread: "" } })).toEqual({ thread: undefined, resource: undefined });
229
+ expect(conversationOf(undefined)).toEqual({ thread: undefined, resource: undefined });
230
+ });
231
+
232
+ it("recognises a network's router by its id or name, and nothing else", () => {
233
+ expect(isRoutingAgent({ id: "routing-agent", name: "Routing Agent" })).toBe(true);
234
+ expect(isRoutingAgent({ name: "routing-agent" })).toBe(true);
235
+ expect(isRoutingAgent({ id: "router", name: "Router" })).toBe(false);
236
+ });
237
+
238
+ it("reads which steps a suspended result waits on, and what each asked", () => {
239
+ expect(suspendedStepsOf(suspended("approve"))).toEqual([{ path: "approve", payload: { prompt: "Approve approve?" } }]);
240
+ // A step inside a nested workflow: the path, with the outer step's payload.
241
+ expect(
242
+ suspendedStepsOf({ suspended: [["inner", "approve"]], suspendPayload: { inner: { prompt: "nested?" } } }),
243
+ ).toEqual([{ path: "inner.approve", payload: { prompt: "nested?" } }]);
244
+ // No `suspended` list: the steps' own status.
245
+ expect(suspendedStepsOf({ steps: { a: { status: "success" }, b: { status: "suspended", suspendPayload: 1 } } })).toEqual([
246
+ { path: "b", payload: 1 },
247
+ ]);
248
+ expect(suspendedStepsOf(undefined)).toEqual([]);
249
+ });
250
+
251
+ it("reads the step a resume names, in every form Mastra accepts", () => {
252
+ expect(resumeTargetOf({ step: "approve", resumeData: { ok: true } })).toEqual({ path: "approve", answer: { ok: true } });
253
+ expect(resumeTargetOf({ step: { id: "approve" } }).path).toBe("approve");
254
+ expect(resumeTargetOf({ step: ["inner", { id: "approve" }] }).path).toBe("inner.approve");
255
+ expect(resumeTargetOf({ resumeData: 1 })).toEqual({ path: undefined, answer: 1 });
256
+ });
257
+
258
+ it("renders what a human read or wrote as text", () => {
259
+ expect(humanText("yes")).toBe("yes");
260
+ expect(humanText({ prompt: "Approve?", extra: 1 })).toBe("Approve?");
261
+ expect(humanText({ approved: true })).toBe('{"approved":true}');
262
+ expect(humanText(undefined)).toBeUndefined();
263
+ });
264
+ });
265
+
266
+ describe("memory threads", () => {
267
+ it("makes a root run's memory thread its session", async () => {
268
+ await adapter.install({});
269
+ const agent = new FakeAgent("weather-agent");
270
+ await agent.generate("Paris", { memory: { thread: "thread-42", resource: "user-7" } });
271
+ await agent.generate("Rome", { threadId: "thread-42", resourceId: "user-7" });
272
+ const events = await flushed(spool);
273
+ expect(new Set(events.map((e) => e.session_id))).toEqual(new Set(["thread-42"]));
274
+ const starts = events.filter((e) => e.type === "agent_start");
275
+ expect(starts).toHaveLength(2);
276
+ for (const start of starts) expect(start).toMatchObject({ fw_thread_id: "thread-42", fw_resource_id: "user-7" });
277
+ });
278
+
279
+ it("lets an enclosing scope win over the thread, and nests a threaded sub-run", async () => {
280
+ await adapter.install({});
281
+ await session({ sessionId: "req-1" }, () =>
282
+ new FakeAgent("weather-agent").generate("Paris", { memory: { thread: "thread-42", resource: "u" } }),
283
+ );
284
+ await agentScope("planner", {}, () =>
285
+ new FakeAgent("weather-agent").generate("Paris", { memory: { thread: "thread-43", resource: "u" } }),
286
+ );
287
+ const events = await flushed(spool);
288
+ expect(events.filter((e) => e.session_id === "thread-42" || e.session_id === "thread-43")).toEqual([]);
289
+ const starts = events.filter((e) => e.type === "agent_start" && e.agent_id === "weather-agent");
290
+ expect(starts.map((e) => [e.session_id === "req-1", e.parent_id, e.fw_thread_id])).toEqual([
291
+ [true, undefined, "thread-42"],
292
+ [false, "planner", "thread-43"],
293
+ ]);
294
+ });
295
+ });
296
+
297
+ describe("processor tripwires", () => {
298
+ for (const [label, guard] of [
299
+ ["1.x", { tripwire: { reason: "blocked", processorId: "guard" } }],
300
+ ["0.x", { tripwireTriggered: true, tripwireReason: "blocked" }],
301
+ ] as const) {
302
+ it(`closes a stream an input processor blocks, rejected (${label})`, async () => {
303
+ await adapter.install({});
304
+ const agent = new FakeAgent("weather-agent");
305
+ agent.guard = guard;
306
+ const run = await agent.stream("Paris", {});
307
+ run.consume();
308
+ await new Promise((resolve) => setTimeout(resolve, 0));
309
+ const events = await flushed(spool);
310
+ expect(shape(events)).toEqual(["weather-agent agent_start", "weather-agent agent_end"]);
311
+ expect(events[1]!.outcome).toBe("rejected");
312
+ expect(_internals.openSpans().agents).toBe(0);
313
+ });
314
+ }
315
+
316
+ it("closes a blocked stream from its finish when nothing reports the block earlier", async () => {
317
+ await adapter.install({});
318
+ const agent = new FakeAgent("weather-agent");
319
+ const run = await agent.stream("Paris", {});
320
+ // Blocked later, on the output stream: no callback, only the finish.
321
+ run.tripwire = { reason: "answer blocked" };
322
+ run.consume();
323
+ await new Promise((resolve) => setTimeout(resolve, 0));
324
+ const events = await flushed(spool);
325
+ expect(events.filter((e) => e.type === "agent_end").map((e) => e.outcome)).toEqual(["rejected"]);
326
+ });
327
+
328
+ it("closes an unblocked stream once, from its callback", async () => {
329
+ await adapter.install({});
330
+ const run = await new FakeAgent("weather-agent").stream("Paris", {});
331
+ run.consume();
332
+ await new Promise((resolve) => setTimeout(resolve, 0));
333
+ const events = await flushed(spool);
334
+ expect(events.filter((e) => e.type === "agent_end").map((e) => e.outcome)).toEqual(["success"]);
335
+ });
336
+ });
337
+
338
+ describe("agent networks", () => {
339
+ it("records a network as one agent whose router steps are its own", async () => {
340
+ await adapter.install({});
341
+ const planner = new FakeAgent("planner", "planner", [50, 10]);
342
+ const stream = await planner.network("Weather?", { memory: { thread: "thread-net", resource: "u" } });
343
+ await stream.status;
344
+ await new Promise((resolve) => setTimeout(resolve, 0));
345
+ const events = await flushed(spool);
346
+ expect(shape(events)).toEqual([
347
+ "planner agent_start",
348
+ "planner model_request",
349
+ "planner model_response",
350
+ "helper agent_start",
351
+ "helper model_request",
352
+ "helper model_response",
353
+ "helper agent_end",
354
+ "planner model_request",
355
+ "planner model_response",
356
+ "planner agent_end",
357
+ ]);
358
+ expect(new Set(events.map((e) => e.session_id))).toEqual(new Set(["thread-net"]));
359
+ expect(events[0]).toMatchObject({ fw_method: "network" });
360
+ expect(events[3]).toMatchObject({ parent_id: "planner" });
361
+ expect(events.at(-1)).toMatchObject({ outcome: "success" });
362
+ expect(_internals.openSpans().agents).toBe(0);
363
+ });
364
+
365
+ it("closes a network whose stream fails, failed", async () => {
366
+ await adapter.install({});
367
+ const stream = await new FakeAgent("broken").network("Weather?");
368
+ await expect(stream.status).rejects.toThrow("network exploded");
369
+ await new Promise((resolve) => setTimeout(resolve, 0));
370
+ const events = await flushed(spool);
371
+ expect(events.at(-1)).toMatchObject({ type: "agent_end", agent_id: "broken", outcome: "failed" });
372
+ });
373
+
374
+ it("records a routing-agent called outside any network as an agent like any other", async () => {
375
+ await adapter.install({});
376
+ await new FakeAgent("Routing Agent", "routing-agent").generate("hi");
377
+ const events = await flushed(spool);
378
+ expect(shape(events)).toEqual([
379
+ "Routing Agent agent_start",
380
+ "Routing Agent model_request",
381
+ "Routing Agent model_response",
382
+ "Routing Agent agent_end",
383
+ ]);
384
+ });
385
+ });
386
+
387
+ describe("workflow suspend / resume", () => {
388
+ it("pauses on suspend and continues the same span on resume", async () => {
389
+ await adapter.install({});
390
+ const run = new FakeRun("run-1", [suspended("approve"), { status: "success" }]);
391
+ await run._start();
392
+ expect(_internals.pausedRuns()).toBe(1);
393
+ await run._resume({ step: "approve", resumeData: { approved: true } });
394
+ expect(_internals.pausedRuns()).toBe(0);
395
+
396
+ const events = await flushed(spool);
397
+ expect(events.map((e) => e.type)).toEqual([
398
+ "agent_start",
399
+ "hook_triggered",
400
+ "hook_completed",
401
+ "hook_triggered",
402
+ "hook_completed",
403
+ "human_wait",
404
+ "agent_pause",
405
+ "agent_resume",
406
+ "human_input",
407
+ "hook_triggered",
408
+ "hook_completed",
409
+ "hook_triggered",
410
+ "hook_completed",
411
+ "agent_end",
412
+ ]);
413
+ // A root run's session is its run id: what its resume is sure to share.
414
+ expect(new Set(events.map((e) => e.session_id))).toEqual(new Set(["run-1"]));
415
+ const wait = events.find((e) => e.type === "human_wait")!;
416
+ expect(wait).toMatchObject({ input_id: "run-1:approve", prompt: "Approve approve?", reason: "mastra_suspend" });
417
+ expect(events.find((e) => e.type === "agent_pause")).toMatchObject({ pause_id: "run-1:approve" });
418
+ expect(events.find((e) => e.type === "agent_resume")).toMatchObject({ pause_id: "run-1:approve" });
419
+ expect(events.find((e) => e.type === "human_input")).toMatchObject({
420
+ input_id: "run-1:approve",
421
+ response: '{"approved":true}',
422
+ });
423
+ expect(events.at(-1)).toMatchObject({ type: "agent_end", outcome: "success" });
424
+ expect(_internals.openSpans().agents).toBe(0);
425
+ });
426
+
427
+ it("pauses again only for steps newly suspended, and resumes only the step named", async () => {
428
+ await adapter.install({});
429
+ const run = new FakeRun("run-2", [suspended("a", "b"), suspended("b"), { status: "success" }]);
430
+ await run._start();
431
+ await run._resume({ step: "a", resumeData: "yes" });
432
+ await run._resume({ step: "b", resumeData: "no" });
433
+ const events = await flushed(spool);
434
+ const pick = (type: string): unknown[] => events.filter((e) => e.type === type).map((e) => e.input_id ?? e.pause_id);
435
+ expect(pick("human_wait")).toEqual(["run-2:a", "run-2:b"]);
436
+ expect(pick("agent_resume")).toEqual(["run-2:a", "run-2:b"]);
437
+ expect(events.filter((e) => e.type === "human_input").map((e) => e.response)).toEqual(["yes", "no"]);
438
+ expect(events.filter((e) => e.type === "agent_start")).toHaveLength(1);
439
+ expect(events.filter((e) => e.type === "agent_end")).toHaveLength(1);
440
+ });
441
+
442
+ it("closes a pause opened by another process under the same ids", async () => {
443
+ await adapter.install({});
444
+ await new FakeRun("run-3", [suspended("approve")])._start();
445
+ // This process forgets it — as a different worker would never have seen it.
446
+ adapter.uninstall();
447
+ await adapter.install({});
448
+ await new FakeRun("run-3", [{ status: "success" }])._resume({ step: "approve", resumeData: { approved: true } });
449
+
450
+ const events = await flushed(spool);
451
+ expect(new Set(events.map((e) => e.session_id))).toEqual(new Set(["run-3"]));
452
+ const resumed = events.slice(events.findIndex((e) => e.fw_method === "resume"));
453
+ expect(resumed.map((e) => e.type)).toEqual([
454
+ "agent_start",
455
+ "agent_resume",
456
+ "human_input",
457
+ "hook_triggered",
458
+ "hook_completed",
459
+ "hook_triggered",
460
+ "hook_completed",
461
+ "agent_end",
462
+ ]);
463
+ expect(resumed[1]).toMatchObject({ pause_id: "run-3:approve", fw_resumed_elsewhere: true });
464
+ expect(resumed[2]).toMatchObject({ input_id: "run-3:approve", fw_resumed_elsewhere: true });
465
+ });
466
+
467
+ it("keeps a nested run's session: the run id is only a ROOT run's session", async () => {
468
+ await adapter.install({});
469
+ await session({ sessionId: "req-1" }, () => new FakeRun("run-4", [{ status: "success" }])._start());
470
+ const events = await flushed(spool);
471
+ expect(new Set(events.map((e) => e.session_id))).toEqual(new Set(["req-1"]));
472
+ });
473
+ });
474
+
475
+ describe("workflow steps", () => {
476
+ it("records only the run's own steps, not those of an agent run handed its id", async () => {
477
+ await adapter.install({});
478
+ // An agent inside a step executes its loop as internal workflows whose
479
+ // steps carry the SAME run id when the agent is handed it — as 0.x's
480
+ // network does with its sub-agents. Those run in the agent's frame.
481
+ FakeEngine.inner = async (runId: string) => {
482
+ const helper = new FakeAgent("helper");
483
+ helper.inside = () => new FakeEngine().executeStep({ step: { id: "llm-execution" }, executionContext: { runId } });
484
+ await helper.generate("weather");
485
+ await new FakeEngine().executeStep({ step: { id: "after-agent" }, executionContext: { runId } });
486
+ };
487
+ await new FakeRun("run-5", [{ status: "success" }], ["city", "agent"])._start();
488
+ const events = await flushed(spool);
489
+ expect(events.filter((e) => e.type === "hook_triggered").map((e) => e.hook_name)).toEqual([
490
+ "city",
491
+ "agent",
492
+ "after-agent",
493
+ ]);
494
+ expect(events.filter((e) => e.agent_id === "helper").map((e) => e.type)).toEqual([
495
+ "agent_start",
496
+ "model_request",
497
+ "model_response",
498
+ "agent_end",
499
+ ]);
500
+ });
501
+ });