@mastra/core 1.0.0-beta.4 → 1.0.0-beta.5

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 (283) hide show
  1. package/CHANGELOG.md +325 -0
  2. package/dist/agent/agent.d.ts +2 -2
  3. package/dist/agent/agent.d.ts.map +1 -1
  4. package/dist/agent/agent.types.d.ts +2 -0
  5. package/dist/agent/agent.types.d.ts.map +1 -1
  6. package/dist/agent/index.cjs +9 -9
  7. package/dist/agent/index.js +2 -2
  8. package/dist/agent/message-list/index.cjs +3 -3
  9. package/dist/agent/message-list/index.d.ts.map +1 -1
  10. package/dist/agent/message-list/index.js +1 -1
  11. package/dist/agent/message-list/prompt/attachments-to-parts.d.ts.map +1 -1
  12. package/dist/agent/types.d.ts +2 -3
  13. package/dist/agent/types.d.ts.map +1 -1
  14. package/dist/agent/utils.d.ts.map +1 -1
  15. package/dist/agent/workflows/prepare-stream/index.d.ts.map +1 -1
  16. package/dist/agent/workflows/prepare-stream/map-results-step.d.ts.map +1 -1
  17. package/dist/agent/workflows/prepare-stream/stream-step.d.ts +8 -1
  18. package/dist/agent/workflows/prepare-stream/stream-step.d.ts.map +1 -1
  19. package/dist/{chunk-3RW5EMSB.js → chunk-3B2OPLGG.js} +13 -6
  20. package/dist/chunk-3B2OPLGG.js.map +1 -0
  21. package/dist/{chunk-RXDJL5QT.js → chunk-3ZQ7LX73.js} +13 -13
  22. package/dist/chunk-3ZQ7LX73.js.map +1 -0
  23. package/dist/{chunk-5WXEYDFI.cjs → chunk-556MJ7CL.cjs} +33 -26
  24. package/dist/chunk-556MJ7CL.cjs.map +1 -0
  25. package/dist/{chunk-HGNRQ3OG.js → chunk-5O52O25J.js} +15 -8
  26. package/dist/chunk-5O52O25J.js.map +1 -0
  27. package/dist/{chunk-WTYNK7Q4.js → chunk-5SA2EZ33.js} +421 -29
  28. package/dist/chunk-5SA2EZ33.js.map +1 -0
  29. package/dist/chunk-6XCINXZ7.cjs +194 -0
  30. package/dist/chunk-6XCINXZ7.cjs.map +1 -0
  31. package/dist/{chunk-MDKPL2R2.js → chunk-7ZADRRDW.js} +5 -4
  32. package/dist/chunk-7ZADRRDW.js.map +1 -0
  33. package/dist/{chunk-JXESKY4A.js → chunk-B5J5HYDN.js} +7 -5
  34. package/dist/chunk-B5J5HYDN.js.map +1 -0
  35. package/dist/chunk-BWYU7D33.js +192 -0
  36. package/dist/chunk-BWYU7D33.js.map +1 -0
  37. package/dist/{chunk-FVNT7VTO.js → chunk-D7CJ4HIQ.js} +240 -17
  38. package/dist/chunk-D7CJ4HIQ.js.map +1 -0
  39. package/dist/{chunk-VSM3NLUX.cjs → chunk-DQIZ5FFX.cjs} +163 -129
  40. package/dist/chunk-DQIZ5FFX.cjs.map +1 -0
  41. package/dist/{chunk-ZCVTH3CH.cjs → chunk-HNHZGFZY.cjs} +5 -4
  42. package/dist/chunk-HNHZGFZY.cjs.map +1 -0
  43. package/dist/{chunk-VZC4BWWH.cjs → chunk-IITXXVYI.cjs} +17 -17
  44. package/dist/chunk-IITXXVYI.cjs.map +1 -0
  45. package/dist/{chunk-2OTDXX73.js → chunk-KJIQGPQR.js} +4 -4
  46. package/dist/{chunk-2OTDXX73.js.map → chunk-KJIQGPQR.js.map} +1 -1
  47. package/dist/{chunk-2NVBZKZI.cjs → chunk-KP42JLXE.cjs} +370 -132
  48. package/dist/chunk-KP42JLXE.cjs.map +1 -0
  49. package/dist/{chunk-IWB65P37.cjs → chunk-KWWD3U7G.cjs} +5 -5
  50. package/dist/chunk-KWWD3U7G.cjs.map +1 -0
  51. package/dist/{chunk-3W5RQCCY.cjs → chunk-NHP6ZIDG.cjs} +248 -24
  52. package/dist/chunk-NHP6ZIDG.cjs.map +1 -0
  53. package/dist/{chunk-O6NA3Z43.cjs → chunk-OUUPUAGA.cjs} +10 -8
  54. package/dist/chunk-OUUPUAGA.cjs.map +1 -0
  55. package/dist/{chunk-D6EDHNGV.js → chunk-PC6EKOWK.js} +64 -11
  56. package/dist/chunk-PC6EKOWK.js.map +1 -0
  57. package/dist/{chunk-S6OEQHEI.cjs → chunk-QGWNF2QJ.cjs} +59 -50
  58. package/dist/chunk-QGWNF2QJ.cjs.map +1 -0
  59. package/dist/{chunk-HBJPYQRN.cjs → chunk-RROQ46B6.cjs} +69 -16
  60. package/dist/chunk-RROQ46B6.cjs.map +1 -0
  61. package/dist/{chunk-U7VECK2G.js → chunk-T2CJRA6E.js} +4 -4
  62. package/dist/chunk-T2CJRA6E.js.map +1 -0
  63. package/dist/{chunk-IHJDOC3A.js → chunk-T2UNO766.js} +16 -7
  64. package/dist/chunk-T2UNO766.js.map +1 -0
  65. package/dist/{chunk-CYVNOIXS.cjs → chunk-U3VE2EVB.cjs} +11 -11
  66. package/dist/{chunk-CYVNOIXS.cjs.map → chunk-U3VE2EVB.cjs.map} +1 -1
  67. package/dist/{chunk-4IKJAKCD.cjs → chunk-V537VSV4.cjs} +74 -16
  68. package/dist/chunk-V537VSV4.cjs.map +1 -0
  69. package/dist/{chunk-4RXG622P.cjs → chunk-VYJXTHII.cjs} +422 -30
  70. package/dist/chunk-VYJXTHII.cjs.map +1 -0
  71. package/dist/{chunk-LRSB62Z6.cjs → chunk-X7F4CSGR.cjs} +15 -8
  72. package/dist/chunk-X7F4CSGR.cjs.map +1 -0
  73. package/dist/{chunk-XXBWX7DT.js → chunk-XBO6W7LZ.js} +328 -91
  74. package/dist/chunk-XBO6W7LZ.js.map +1 -0
  75. package/dist/{chunk-KEURQGCQ.js → chunk-XIDKHXNR.js} +74 -17
  76. package/dist/chunk-XIDKHXNR.js.map +1 -0
  77. package/dist/{chunk-WQSGX6XA.cjs → chunk-XJQX54QP.cjs} +5 -5
  78. package/dist/{chunk-WQSGX6XA.cjs.map → chunk-XJQX54QP.cjs.map} +1 -1
  79. package/dist/{chunk-W3DD3XP5.js → chunk-YDFX3JR2.js} +163 -129
  80. package/dist/chunk-YDFX3JR2.js.map +1 -0
  81. package/dist/{chunk-IWQDBVJK.js → chunk-ZTTMSCLU.js} +3 -3
  82. package/dist/{chunk-IWQDBVJK.js.map → chunk-ZTTMSCLU.js.map} +1 -1
  83. package/dist/evals/base.d.ts +1 -1
  84. package/dist/evals/base.d.ts.map +1 -1
  85. package/dist/evals/base.test-utils.d.ts +25 -25
  86. package/dist/evals/index.cjs +4 -4
  87. package/dist/evals/index.js +1 -1
  88. package/dist/evals/scoreTraces/index.cjs +3 -3
  89. package/dist/evals/scoreTraces/index.js +1 -1
  90. package/dist/index.cjs +2 -2
  91. package/dist/index.js +1 -1
  92. package/dist/integration/index.cjs +2 -2
  93. package/dist/integration/index.js +1 -1
  94. package/dist/llm/index.cjs +18 -14
  95. package/dist/llm/index.d.ts +2 -1
  96. package/dist/llm/index.d.ts.map +1 -1
  97. package/dist/llm/index.js +5 -5
  98. package/dist/llm/model/gateway-resolver.d.ts.map +1 -1
  99. package/dist/llm/model/gateways/azure.d.ts +36 -0
  100. package/dist/llm/model/gateways/azure.d.ts.map +1 -0
  101. package/dist/llm/model/gateways/base.d.ts +3 -6
  102. package/dist/llm/model/gateways/base.d.ts.map +1 -1
  103. package/dist/llm/model/gateways/index.d.ts +4 -1
  104. package/dist/llm/model/gateways/index.d.ts.map +1 -1
  105. package/dist/llm/model/gateways/models-dev.d.ts +2 -2
  106. package/dist/llm/model/gateways/models-dev.d.ts.map +1 -1
  107. package/dist/llm/model/gateways/netlify.d.ts +2 -2
  108. package/dist/llm/model/gateways/netlify.d.ts.map +1 -1
  109. package/dist/llm/model/model.d.ts.map +1 -1
  110. package/dist/llm/model/model.loop.d.ts +1 -1
  111. package/dist/llm/model/model.loop.d.ts.map +1 -1
  112. package/dist/llm/model/provider-registry.d.ts.map +1 -1
  113. package/dist/llm/model/provider-types.generated.d.ts +192 -11
  114. package/dist/llm/model/registry-generator.d.ts +12 -0
  115. package/dist/llm/model/registry-generator.d.ts.map +1 -1
  116. package/dist/llm/model/router.d.ts.map +1 -1
  117. package/dist/loop/index.cjs +2 -2
  118. package/dist/loop/index.js +1 -1
  119. package/dist/loop/loop.d.ts.map +1 -1
  120. package/dist/loop/network/index.d.ts.map +1 -1
  121. package/dist/loop/test-utils/generateText.d.ts.map +1 -1
  122. package/dist/loop/test-utils/resultObject.d.ts.map +1 -1
  123. package/dist/loop/test-utils/streamObject.d.ts.map +1 -1
  124. package/dist/loop/types.d.ts +8 -0
  125. package/dist/loop/types.d.ts.map +1 -1
  126. package/dist/loop/workflows/agentic-execution/index.d.ts.map +1 -1
  127. package/dist/loop/workflows/agentic-execution/tool-call-step.d.ts +1 -1
  128. package/dist/loop/workflows/agentic-execution/tool-call-step.d.ts.map +1 -1
  129. package/dist/mastra/index.cjs +2 -2
  130. package/dist/mastra/index.d.ts +9 -9
  131. package/dist/mastra/index.d.ts.map +1 -1
  132. package/dist/mastra/index.js +1 -1
  133. package/dist/mcp/index.cjs.map +1 -1
  134. package/dist/mcp/index.d.ts +4 -4
  135. package/dist/mcp/index.d.ts.map +1 -1
  136. package/dist/mcp/index.js.map +1 -1
  137. package/dist/mcp/types.d.ts +2 -2
  138. package/dist/mcp/types.d.ts.map +1 -1
  139. package/dist/memory/index.cjs +89 -34
  140. package/dist/memory/index.cjs.map +1 -1
  141. package/dist/memory/index.js +85 -30
  142. package/dist/memory/index.js.map +1 -1
  143. package/dist/memory/mock.d.ts +9 -13
  144. package/dist/memory/mock.d.ts.map +1 -1
  145. package/dist/models-dev-F6MTIYTO.js +3 -0
  146. package/dist/{models-dev-6PRLJKVZ.js.map → models-dev-F6MTIYTO.js.map} +1 -1
  147. package/dist/models-dev-XIVR5EJV.cjs +12 -0
  148. package/dist/{models-dev-WHMI5G6Y.cjs.map → models-dev-XIVR5EJV.cjs.map} +1 -1
  149. package/dist/netlify-MXBOGAJR.cjs +12 -0
  150. package/dist/{netlify-46I3SNNV.cjs.map → netlify-MXBOGAJR.cjs.map} +1 -1
  151. package/dist/netlify-RX3JXCFQ.js +3 -0
  152. package/dist/{netlify-EBQ6YUC6.js.map → netlify-RX3JXCFQ.js.map} +1 -1
  153. package/dist/processors/index.cjs +11 -11
  154. package/dist/processors/index.d.ts +2 -2
  155. package/dist/processors/index.d.ts.map +1 -1
  156. package/dist/processors/index.js +1 -1
  157. package/dist/processors/processors/batch-parts.d.ts +1 -1
  158. package/dist/processors/processors/batch-parts.d.ts.map +1 -1
  159. package/dist/processors/processors/language-detector.d.ts +1 -1
  160. package/dist/processors/processors/language-detector.d.ts.map +1 -1
  161. package/dist/processors/processors/moderation.d.ts +1 -1
  162. package/dist/processors/processors/moderation.d.ts.map +1 -1
  163. package/dist/processors/processors/pii-detector.d.ts +1 -1
  164. package/dist/processors/processors/pii-detector.d.ts.map +1 -1
  165. package/dist/processors/processors/prompt-injection-detector.d.ts +1 -1
  166. package/dist/processors/processors/prompt-injection-detector.d.ts.map +1 -1
  167. package/dist/processors/processors/structured-output.d.ts +1 -1
  168. package/dist/processors/processors/structured-output.d.ts.map +1 -1
  169. package/dist/processors/processors/system-prompt-scrubber.d.ts +1 -1
  170. package/dist/processors/processors/system-prompt-scrubber.d.ts.map +1 -1
  171. package/dist/processors/processors/token-limiter.d.ts +1 -1
  172. package/dist/processors/processors/token-limiter.d.ts.map +1 -1
  173. package/dist/processors/processors/unicode-normalizer.d.ts +1 -1
  174. package/dist/processors/processors/unicode-normalizer.d.ts.map +1 -1
  175. package/dist/provider-registry-3LUCE7FT.js +3 -0
  176. package/dist/{provider-registry-HDG6UMUC.js.map → provider-registry-3LUCE7FT.js.map} +1 -1
  177. package/dist/provider-registry-NBRXBOQT.cjs +40 -0
  178. package/dist/{provider-registry-RP2W4B24.cjs.map → provider-registry-NBRXBOQT.cjs.map} +1 -1
  179. package/dist/provider-registry.json +400 -22
  180. package/dist/{registry-generator-JPCV47SC.cjs → registry-generator-DEPPRYYJ.cjs} +21 -6
  181. package/dist/registry-generator-DEPPRYYJ.cjs.map +1 -0
  182. package/dist/{registry-generator-XD4FPZTU.js → registry-generator-FLW6NV42.js} +21 -7
  183. package/dist/registry-generator-FLW6NV42.js.map +1 -0
  184. package/dist/relevance/index.cjs +2 -2
  185. package/dist/relevance/index.js +1 -1
  186. package/dist/server/composite-auth.d.ts +9 -0
  187. package/dist/server/composite-auth.d.ts.map +1 -0
  188. package/dist/server/index.cjs +31 -0
  189. package/dist/server/index.cjs.map +1 -1
  190. package/dist/server/index.d.ts +1 -0
  191. package/dist/server/index.d.ts.map +1 -1
  192. package/dist/server/index.js +31 -1
  193. package/dist/server/index.js.map +1 -1
  194. package/dist/storage/index.cjs +29 -29
  195. package/dist/storage/index.js +1 -1
  196. package/dist/stream/aisdk/v5/output.d.ts.map +1 -1
  197. package/dist/stream/base/output.d.ts.map +1 -1
  198. package/dist/stream/index.cjs +11 -11
  199. package/dist/stream/index.js +2 -2
  200. package/dist/stream/types.d.ts +7 -2
  201. package/dist/stream/types.d.ts.map +1 -1
  202. package/dist/test-utils/llm-mock.cjs +2 -2
  203. package/dist/test-utils/llm-mock.js +1 -1
  204. package/dist/tools/index.cjs +6 -6
  205. package/dist/tools/index.js +2 -2
  206. package/dist/tools/is-vercel-tool.cjs +2 -2
  207. package/dist/tools/is-vercel-tool.js +1 -1
  208. package/dist/tools/stream.d.ts +1 -0
  209. package/dist/tools/stream.d.ts.map +1 -1
  210. package/dist/tools/tool-builder/builder.d.ts +2 -0
  211. package/dist/tools/tool-builder/builder.d.ts.map +1 -1
  212. package/dist/tools/tool.d.ts +6 -6
  213. package/dist/tools/tool.d.ts.map +1 -1
  214. package/dist/tools/types.d.ts +6 -2
  215. package/dist/tools/types.d.ts.map +1 -1
  216. package/dist/tools/validation.d.ts +13 -1
  217. package/dist/tools/validation.d.ts.map +1 -1
  218. package/dist/utils.cjs +22 -22
  219. package/dist/utils.d.ts +1 -1
  220. package/dist/utils.d.ts.map +1 -1
  221. package/dist/utils.js +1 -1
  222. package/dist/vector/filter/index.cjs +7 -189
  223. package/dist/vector/filter/index.cjs.map +1 -1
  224. package/dist/vector/filter/index.js +1 -190
  225. package/dist/vector/filter/index.js.map +1 -1
  226. package/dist/vector/index.cjs +5 -0
  227. package/dist/vector/index.cjs.map +1 -1
  228. package/dist/vector/index.d.ts +1 -0
  229. package/dist/vector/index.d.ts.map +1 -1
  230. package/dist/vector/index.js +1 -0
  231. package/dist/vector/index.js.map +1 -1
  232. package/dist/vector/types.d.ts +86 -3
  233. package/dist/vector/types.d.ts.map +1 -1
  234. package/dist/vector/vector.d.ts +39 -2
  235. package/dist/vector/vector.d.ts.map +1 -1
  236. package/dist/workflows/default.d.ts.map +1 -1
  237. package/dist/workflows/evented/index.cjs +10 -10
  238. package/dist/workflows/evented/index.js +1 -1
  239. package/dist/workflows/evented/step-executor.d.ts.map +1 -1
  240. package/dist/workflows/index.cjs +23 -19
  241. package/dist/workflows/index.js +1 -1
  242. package/dist/workflows/types.d.ts +2 -2
  243. package/dist/workflows/types.d.ts.map +1 -1
  244. package/dist/workflows/utils.d.ts +7 -0
  245. package/dist/workflows/utils.d.ts.map +1 -1
  246. package/dist/workflows/workflow.d.ts +4 -2
  247. package/dist/workflows/workflow.d.ts.map +1 -1
  248. package/package.json +9 -8
  249. package/src/llm/model/provider-types.generated.d.ts +192 -11
  250. package/dist/chunk-2NVBZKZI.cjs.map +0 -1
  251. package/dist/chunk-3RW5EMSB.js.map +0 -1
  252. package/dist/chunk-3W5RQCCY.cjs.map +0 -1
  253. package/dist/chunk-4IKJAKCD.cjs.map +0 -1
  254. package/dist/chunk-4RXG622P.cjs.map +0 -1
  255. package/dist/chunk-5WXEYDFI.cjs.map +0 -1
  256. package/dist/chunk-D6EDHNGV.js.map +0 -1
  257. package/dist/chunk-FVNT7VTO.js.map +0 -1
  258. package/dist/chunk-HBJPYQRN.cjs.map +0 -1
  259. package/dist/chunk-HGNRQ3OG.js.map +0 -1
  260. package/dist/chunk-IHJDOC3A.js.map +0 -1
  261. package/dist/chunk-IWB65P37.cjs.map +0 -1
  262. package/dist/chunk-JXESKY4A.js.map +0 -1
  263. package/dist/chunk-KEURQGCQ.js.map +0 -1
  264. package/dist/chunk-LRSB62Z6.cjs.map +0 -1
  265. package/dist/chunk-MDKPL2R2.js.map +0 -1
  266. package/dist/chunk-O6NA3Z43.cjs.map +0 -1
  267. package/dist/chunk-RXDJL5QT.js.map +0 -1
  268. package/dist/chunk-S6OEQHEI.cjs.map +0 -1
  269. package/dist/chunk-U7VECK2G.js.map +0 -1
  270. package/dist/chunk-VSM3NLUX.cjs.map +0 -1
  271. package/dist/chunk-VZC4BWWH.cjs.map +0 -1
  272. package/dist/chunk-W3DD3XP5.js.map +0 -1
  273. package/dist/chunk-WTYNK7Q4.js.map +0 -1
  274. package/dist/chunk-XXBWX7DT.js.map +0 -1
  275. package/dist/chunk-ZCVTH3CH.cjs.map +0 -1
  276. package/dist/models-dev-6PRLJKVZ.js +0 -3
  277. package/dist/models-dev-WHMI5G6Y.cjs +0 -12
  278. package/dist/netlify-46I3SNNV.cjs +0 -12
  279. package/dist/netlify-EBQ6YUC6.js +0 -3
  280. package/dist/provider-registry-HDG6UMUC.js +0 -3
  281. package/dist/provider-registry-RP2W4B24.cjs +0 -40
  282. package/dist/registry-generator-JPCV47SC.cjs.map +0 -1
  283. package/dist/registry-generator-XD4FPZTU.js.map +0 -1
@@ -12,6 +12,25 @@ function truncateForLogging(data, maxLength = 200) {
12
12
  return "[Unable to serialize data]";
13
13
  }
14
14
  }
15
+ function validateToolSuspendData(schema, suspendData, toolId) {
16
+ if (!schema || !("safeParse" in schema)) {
17
+ return { data: suspendData };
18
+ }
19
+ const validation = schema.safeParse(suspendData);
20
+ if (validation.success) {
21
+ return { data: validation.data };
22
+ }
23
+ const errorMessages = validation.error.issues.map((e) => `- ${e.path?.join(".") || "root"}: ${e.message}`).join("\n");
24
+ const error = {
25
+ error: true,
26
+ message: `Tool suspension data validation failed${toolId ? ` for ${toolId}` : ""}. Please fix the following errors and try again:
27
+ ${errorMessages}
28
+
29
+ Provided arguments: ${truncateForLogging(suspendData)}`,
30
+ validationErrors: validation.error.format()
31
+ };
32
+ return { data: suspendData, error };
33
+ }
15
34
  function validateToolInput(schema, input, toolId) {
16
35
  if (!schema || !("safeParse" in schema)) {
17
36
  return { data: input };
@@ -31,8 +50,8 @@ Provided arguments: ${truncateForLogging(input)}`,
31
50
  };
32
51
  return { data: input, error };
33
52
  }
34
- function validateToolOutput(schema, output, toolId) {
35
- if (!schema || !("safeParse" in schema)) {
53
+ function validateToolOutput(schema, output, toolId, suspendCalled) {
54
+ if (!schema || !("safeParse" in schema) || suspendCalled) {
36
55
  return { data: output };
37
56
  }
38
57
  const validation = schema.safeParse(output);
@@ -113,24 +132,34 @@ var Tool = class {
113
132
  if (error) {
114
133
  return error;
115
134
  }
116
- let organizedContext = context;
135
+ let suspendData = null;
136
+ const baseContext = context ? {
137
+ ...context,
138
+ ...context.suspend ? {
139
+ suspend: (args) => {
140
+ suspendData = args;
141
+ return context.suspend?.(args);
142
+ }
143
+ } : {}
144
+ } : {};
145
+ let organizedContext = baseContext;
117
146
  if (!context) {
118
147
  organizedContext = {
119
148
  requestContext: new RequestContext(),
120
149
  mastra: void 0
121
150
  };
122
151
  } else {
123
- const isAgentExecution = context.toolCallId && context.messages;
124
- const isWorkflowExecution = !isAgentExecution && (context.workflow || context.workflowId);
125
- if (isAgentExecution && !context.agent) {
126
- const { toolCallId, messages, suspend, resumeData, threadId, resourceId, writableStream, ...rest } = context;
152
+ const isAgentExecution = baseContext.toolCallId && baseContext.messages;
153
+ const isWorkflowExecution = !isAgentExecution && (baseContext.workflow || baseContext.workflowId);
154
+ if (isAgentExecution && !baseContext.agent) {
155
+ const { toolCallId, messages, suspend, resumeData: resumeData2, threadId, resourceId, writableStream, ...rest } = baseContext;
127
156
  organizedContext = {
128
157
  ...rest,
129
158
  agent: {
130
159
  toolCallId,
131
160
  messages,
132
161
  suspend,
133
- resumeData,
162
+ resumeData: resumeData2,
134
163
  threadId,
135
164
  resourceId,
136
165
  writableStream
@@ -138,8 +167,8 @@ var Tool = class {
138
167
  // Ensure requestContext is always present
139
168
  requestContext: rest.requestContext || new RequestContext()
140
169
  };
141
- } else if (isWorkflowExecution && !context.workflow) {
142
- const { workflowId, runId, state, setState, suspend, resumeData, ...rest } = context;
170
+ } else if (isWorkflowExecution && !baseContext.workflow) {
171
+ const { workflowId, runId, state, setState, suspend, resumeData: resumeData2, ...rest } = baseContext;
143
172
  organizedContext = {
144
173
  ...rest,
145
174
  workflow: {
@@ -148,20 +177,48 @@ var Tool = class {
148
177
  state,
149
178
  setState,
150
179
  suspend,
151
- resumeData
180
+ resumeData: resumeData2
152
181
  },
153
182
  // Ensure requestContext is always present
154
183
  requestContext: rest.requestContext || new RequestContext()
155
184
  };
156
185
  } else {
157
186
  organizedContext = {
158
- ...context,
159
- requestContext: context.requestContext || new RequestContext()
187
+ ...baseContext,
188
+ agent: baseContext.agent ? {
189
+ ...baseContext.agent,
190
+ suspend: (args) => {
191
+ suspendData = args;
192
+ return baseContext.agent?.suspend?.(args);
193
+ }
194
+ } : baseContext.agent,
195
+ workflow: baseContext.workflow ? {
196
+ ...baseContext.workflow,
197
+ suspend: (args) => {
198
+ suspendData = args;
199
+ return baseContext.workflow?.suspend?.(args);
200
+ }
201
+ } : baseContext.workflow,
202
+ requestContext: baseContext.requestContext || new RequestContext()
160
203
  };
161
204
  }
162
205
  }
206
+ const resumeData = organizedContext.agent?.resumeData ?? organizedContext.workflow?.resumeData ?? organizedContext?.resumeData;
207
+ if (resumeData) {
208
+ const resumeValidation = validateToolInput(this.resumeSchema, resumeData, this.id);
209
+ if (resumeValidation.error) {
210
+ return resumeValidation.error;
211
+ }
212
+ }
163
213
  const output = await originalExecute(data, organizedContext);
164
- const outputValidation = validateToolOutput(this.outputSchema, output, this.id);
214
+ if (suspendData) {
215
+ const suspendValidation = validateToolSuspendData(this.suspendSchema, suspendData, this.id);
216
+ if (suspendValidation.error) {
217
+ return suspendValidation.error;
218
+ }
219
+ }
220
+ const skiptOutputValidation = !!(typeof output === "undefined" && suspendData);
221
+ const outputValidation = validateToolOutput(this.outputSchema, output, this.id, skiptOutputValidation);
165
222
  if (outputValidation.error) {
166
223
  return outputValidation.error;
167
224
  }
@@ -179,6 +236,6 @@ function isVercelTool(tool) {
179
236
  return !!(tool && !(tool instanceof Tool) && "parameters" in tool);
180
237
  }
181
238
 
182
- export { Tool, createTool, isVercelTool, validateToolInput, validateToolOutput };
183
- //# sourceMappingURL=chunk-KEURQGCQ.js.map
184
- //# sourceMappingURL=chunk-KEURQGCQ.js.map
239
+ export { Tool, createTool, isVercelTool, validateToolInput, validateToolOutput, validateToolSuspendData };
240
+ //# sourceMappingURL=chunk-XIDKHXNR.js.map
241
+ //# sourceMappingURL=chunk-XIDKHXNR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/validation.ts","../src/tools/tool.ts","../src/tools/toolchecks.ts"],"names":["resumeData"],"mappings":"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","file":"chunk-XIDKHXNR.js","sourcesContent":["import type { z } from 'zod';\nimport type { ZodLikeSchema } from '../types/zod-compat';\n\nexport interface ValidationError<T = any> {\n error: true;\n message: string;\n validationErrors: z.ZodFormattedError<T>;\n}\n\n/**\n * Safely truncates data for error messages to avoid exposing sensitive information.\n * @param data The data to truncate\n * @param maxLength Maximum length of the truncated string (default: 200)\n * @returns Truncated string representation\n */\nfunction truncateForLogging(data: unknown, maxLength: number = 200): string {\n try {\n const stringified = JSON.stringify(data, null, 2);\n if (stringified.length <= maxLength) {\n return stringified;\n }\n return stringified.slice(0, maxLength) + '... (truncated)';\n } catch {\n return '[Unable to serialize data]';\n }\n}\n\n/**\n * Validates raw suspend data against a Zod schema.\n *\n * @param schema The Zod schema to validate against\n * @param suspendData The raw suspend data to validate\n * @param toolId Optional tool ID for better error messages\n * @returns The validated data or a validation error\n */\nexport function validateToolSuspendData<T = any>(\n schema: ZodLikeSchema | undefined,\n suspendData: unknown,\n toolId?: string,\n): { data: T | unknown; error?: ValidationError<T> } {\n // If no schema, return suspend data as-is\n if (!schema || !('safeParse' in schema)) {\n return { data: suspendData };\n }\n\n // Validate the input directly - no unwrapping needed in v1.0\n const validation = schema.safeParse(suspendData);\n\n if (validation.success) {\n return { data: validation.data };\n }\n\n // Validation failed, return error\n const errorMessages = validation.error.issues\n .map((e: z.ZodIssue) => `- ${e.path?.join('.') || 'root'}: ${e.message}`)\n .join('\\n');\n\n const error: ValidationError<T> = {\n error: true,\n message: `Tool suspension data validation failed${toolId ? ` for ${toolId}` : ''}. Please fix the following errors and try again:\\n${errorMessages}\\n\\nProvided arguments: ${truncateForLogging(suspendData)}`,\n validationErrors: validation.error.format() as z.ZodFormattedError<T>,\n };\n\n return { data: suspendData, error };\n}\n\n/**\n * Validates raw input data against a Zod schema.\n *\n * @param schema The Zod schema to validate against\n * @param input The raw input data to validate\n * @param toolId Optional tool ID for better error messages\n * @returns The validated data or a validation error\n */\nexport function validateToolInput<T = any>(\n schema: ZodLikeSchema | undefined,\n input: unknown,\n toolId?: string,\n): { data: T | unknown; error?: ValidationError<T> } {\n // If no schema, return input as-is\n if (!schema || !('safeParse' in schema)) {\n return { data: input };\n }\n\n // Validate the input directly - no unwrapping needed in v1.0\n const validation = schema.safeParse(input);\n\n if (validation.success) {\n return { data: validation.data };\n }\n\n // Validation failed, return error\n const errorMessages = validation.error.issues\n .map((e: z.ZodIssue) => `- ${e.path?.join('.') || 'root'}: ${e.message}`)\n .join('\\n');\n\n const error: ValidationError<T> = {\n error: true,\n message: `Tool validation failed${toolId ? ` for ${toolId}` : ''}. Please fix the following errors and try again:\\n${errorMessages}\\n\\nProvided arguments: ${truncateForLogging(input)}`,\n validationErrors: validation.error.format() as z.ZodFormattedError<T>,\n };\n\n return { data: input, error };\n}\n\n/**\n * Validates tool output data against a Zod schema.\n *\n * @param schema The Zod schema to validate against\n * @param output The output data to validate\n * @param toolId Optional tool ID for better error messages\n * @returns The validated data or a validation error\n */\nexport function validateToolOutput<T = any>(\n schema: ZodLikeSchema | undefined,\n output: unknown,\n toolId?: string,\n suspendCalled?: boolean,\n): { data: T | unknown; error?: ValidationError<T> } {\n // If no schema, return output as-is\n if (!schema || !('safeParse' in schema) || suspendCalled) {\n return { data: output };\n }\n\n // Validate the output\n const validation = schema.safeParse(output);\n\n if (validation.success) {\n return { data: validation.data };\n }\n\n // Validation failed, return error\n const errorMessages = validation.error.issues\n .map((e: z.ZodIssue) => `- ${e.path?.join('.') || 'root'}: ${e.message}`)\n .join('\\n');\n\n const error: ValidationError<T> = {\n error: true,\n message: `Tool output validation failed${toolId ? ` for ${toolId}` : ''}. The tool returned invalid output:\\n${errorMessages}\\n\\nReturned output: ${truncateForLogging(output)}`,\n validationErrors: validation.error.format() as z.ZodFormattedError<T>,\n };\n\n return { data: output, error };\n}\n","import type { Mastra } from '../mastra';\nimport { RequestContext } from '../request-context';\nimport type { ZodLikeSchema, InferZodLikeSchema } from '../types/zod-compat';\nimport type { ToolAction, ToolExecutionContext } from './types';\nimport { validateToolInput, validateToolOutput, validateToolSuspendData } from './validation';\n\n/**\n * A type-safe tool that agents and workflows can call to perform specific actions.\n *\n * @template TSchemaIn - Input schema type\n * @template TSchemaOut - Output schema type\n * @template TSuspendSchema - Suspend operation schema type\n * @template TResumeSchema - Resume operation schema type\n * @template TContext - Execution context type\n *\n * @example Basic tool with validation\n * ```typescript\n * const weatherTool = createTool({\n * id: 'get-weather',\n * description: 'Get weather for a location',\n * inputSchema: z.object({\n * location: z.string(),\n * units: z.enum(['celsius', 'fahrenheit']).optional()\n * }),\n * execute: async (inputData) => {\n * return await fetchWeather(inputData.location, inputData.units);\n * }\n * });\n * ```\n *\n * @example Tool requiring approval\n * ```typescript\n * const deleteFileTool = createTool({\n * id: 'delete-file',\n * description: 'Delete a file',\n * requireApproval: true,\n * inputSchema: z.object({ filepath: z.string() }),\n * execute: async (inputData) => {\n * await fs.unlink(inputData.filepath);\n * return { deleted: true };\n * }\n * });\n * ```\n *\n * @example Tool with Mastra integration\n * ```typescript\n * const saveTool = createTool({\n * id: 'save-data',\n * description: 'Save data to storage',\n * inputSchema: z.object({ key: z.string(), value: z.any() }),\n * execute: async (inputData, context) => {\n * const storage = context?.mastra?.getStorage();\n * await storage?.set(inputData.key, inputData.value);\n * return { saved: true };\n * }\n * });\n * ```\n */\nexport class Tool<\n TSchemaIn extends ZodLikeSchema | undefined = undefined,\n TSchemaOut extends ZodLikeSchema | undefined = undefined,\n TSuspendSchema extends ZodLikeSchema = any,\n TResumeSchema extends ZodLikeSchema = any,\n TContext extends ToolExecutionContext<TSuspendSchema, TResumeSchema> = ToolExecutionContext<\n TSuspendSchema,\n TResumeSchema\n >,\n TId extends string = string,\n> implements ToolAction<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext, TId>\n{\n /** Unique identifier for the tool */\n id: TId;\n\n /** Description of what the tool does */\n description: string;\n\n /** Schema for validating input parameters */\n inputSchema?: TSchemaIn;\n\n /** Schema for validating output structure */\n outputSchema?: TSchemaOut;\n\n /** Schema for suspend operation data */\n suspendSchema?: TSuspendSchema;\n\n /** Schema for resume operation data */\n resumeSchema?: TResumeSchema;\n\n /**\n * Tool execution function\n * @param inputData - The raw, validated input data\n * @param context - Optional execution context with metadata\n * @returns Promise resolving to tool output or a ValidationError if input validation fails\n */\n execute?: ToolAction<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext>['execute'];\n\n /** Parent Mastra instance for accessing shared resources */\n mastra?: Mastra;\n\n /**\n * Whether the tool requires explicit user approval before execution\n * @example\n * ```typescript\n * // For destructive operations\n * requireApproval: true\n * ```\n */\n requireApproval?: boolean;\n\n /**\n * Creates a new Tool instance with input validation wrapper.\n *\n * @param opts - Tool configuration and execute function\n * @example\n * ```typescript\n * const tool = new Tool({\n * id: 'my-tool',\n * description: 'Does something useful',\n * inputSchema: z.object({ name: z.string() }),\n * execute: async (inputData) => ({ greeting: `Hello ${inputData.name}` })\n * });\n * ```\n */\n constructor(opts: ToolAction<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext, TId>) {\n this.id = opts.id;\n this.description = opts.description;\n this.inputSchema = opts.inputSchema;\n this.outputSchema = opts.outputSchema;\n this.suspendSchema = opts.suspendSchema;\n this.resumeSchema = opts.resumeSchema;\n this.mastra = opts.mastra;\n this.requireApproval = opts.requireApproval || false;\n\n // Tools receive two parameters:\n // 1. input - The raw, validated input data\n // 2. context - Execution metadata (mastra, suspend, etc.)\n if (opts.execute) {\n const originalExecute = opts.execute;\n this.execute = async (inputData: unknown, context?: any) => {\n // Validate input if schema exists\n const { data, error } = validateToolInput(this.inputSchema, inputData, this.id);\n if (error) {\n return error as any;\n }\n\n let suspendData = null;\n\n const baseContext = context\n ? {\n ...context,\n ...(context.suspend\n ? {\n suspend: (args: any) => {\n suspendData = args;\n return context.suspend?.(args);\n },\n }\n : {}),\n }\n : {};\n\n // Organize context based on execution source\n let organizedContext = baseContext;\n if (!context) {\n // No context provided - create a minimal context with requestContext\n organizedContext = {\n requestContext: new RequestContext(),\n mastra: undefined,\n };\n } else {\n // Check if this is agent execution (has toolCallId and messages)\n const isAgentExecution = baseContext.toolCallId && baseContext.messages;\n\n // Check if this is workflow execution (has workflow properties)\n // Agent execution takes precedence - don't treat as workflow if it's an agent call\n const isWorkflowExecution = !isAgentExecution && (baseContext.workflow || baseContext.workflowId);\n\n if (isAgentExecution && !baseContext.agent) {\n // Reorganize agent context - nest agent-specific properties under 'agent' key\n const { toolCallId, messages, suspend, resumeData, threadId, resourceId, writableStream, ...rest } =\n baseContext;\n organizedContext = {\n ...rest,\n agent: {\n toolCallId,\n messages,\n suspend,\n resumeData,\n threadId,\n resourceId,\n writableStream,\n },\n // Ensure requestContext is always present\n requestContext: rest.requestContext || new RequestContext(),\n };\n } else if (isWorkflowExecution && !baseContext.workflow) {\n // Reorganize workflow context - nest workflow-specific properties under 'workflow' key\n const { workflowId, runId, state, setState, suspend, resumeData, ...rest } = baseContext;\n organizedContext = {\n ...rest,\n workflow: {\n workflowId,\n runId,\n state,\n setState,\n suspend,\n resumeData,\n },\n // Ensure requestContext is always present\n requestContext: rest.requestContext || new RequestContext(),\n };\n } else {\n // Ensure requestContext is always present even for direct execution\n organizedContext = {\n ...baseContext,\n agent: baseContext.agent\n ? {\n ...baseContext.agent,\n suspend: (args: any) => {\n suspendData = args;\n return baseContext.agent?.suspend?.(args);\n },\n }\n : baseContext.agent,\n workflow: baseContext.workflow\n ? {\n ...baseContext.workflow,\n suspend: (args: any) => {\n suspendData = args;\n return baseContext.workflow?.suspend?.(args);\n },\n }\n : baseContext.workflow,\n requestContext: baseContext.requestContext || new RequestContext(),\n };\n }\n }\n\n const resumeData =\n organizedContext.agent?.resumeData ?? organizedContext.workflow?.resumeData ?? organizedContext?.resumeData;\n\n if (resumeData) {\n const resumeValidation = validateToolInput(this.resumeSchema, resumeData, this.id);\n if (resumeValidation.error) {\n return resumeValidation.error as any;\n }\n }\n\n // Call the original execute with validated input and organized context\n const output = await originalExecute(data as any, organizedContext);\n\n if (suspendData) {\n const suspendValidation = validateToolSuspendData(this.suspendSchema, suspendData, this.id);\n if (suspendValidation.error) {\n return suspendValidation.error as any;\n }\n }\n\n const skiptOutputValidation = !!(typeof output === 'undefined' && suspendData);\n\n // Validate output if schema exists\n const outputValidation = validateToolOutput(this.outputSchema, output, this.id, skiptOutputValidation);\n if (outputValidation.error) {\n return outputValidation.error as any;\n }\n\n return outputValidation.data;\n };\n }\n }\n}\n\n/**\n * Creates a type-safe tool with automatic input validation.\n *\n * @template TSchemaIn - Input schema type\n * @template TSchemaOut - Output schema type\n * @template TSuspendSchema - Suspend operation schema type\n * @template TResumeSchema - Resume operation schema type\n * @template TContext - Execution context type\n * @template TExecute - Execute function type\n *\n * @param opts - Tool configuration including schemas and execute function\n * @returns Type-safe Tool instance with conditional typing based on schemas\n *\n * @example Simple tool\n * ```typescript\n * const greetTool = createTool({\n * id: 'greet',\n * description: 'Say hello',\n * execute: async () => ({ message: 'Hello!' })\n * });\n * ```\n *\n * @example Tool with input validation\n * ```typescript\n * const calculateTool = createTool({\n * id: 'calculate',\n * description: 'Perform calculations',\n * inputSchema: z.object({\n * operation: z.enum(['add', 'subtract']),\n * a: z.number(),\n * b: z.number()\n * }),\n * execute: async (inputData) => {\n * const result = inputData.operation === 'add'\n * ? inputData.a + inputData.b\n * : inputData.a - inputData.b;\n * return { result };\n * }\n * });\n * ```\n *\n * @example Tool with output schema\n * ```typescript\n * const userTool = createTool({\n * id: 'get-user',\n * description: 'Get user data',\n * inputSchema: z.object({ userId: z.string() }),\n * outputSchema: z.object({\n * id: z.string(),\n * name: z.string(),\n * email: z.string()\n * }),\n * execute: async (inputData) => {\n * return await fetchUser(inputData.userId);\n * }\n * });\n * ```\n *\n * @example Tool with external API\n * ```typescript\n * const weatherTool = createTool({\n * id: 'weather',\n * description: 'Get weather data',\n * inputSchema: z.object({\n * city: z.string(),\n * units: z.enum(['metric', 'imperial']).default('metric')\n * }),\n * execute: async (inputData) => {\n * const response = await fetch(\n * `https://api.weather.com/v1/weather?q=${inputData.city}&units=${inputData.units}`\n * );\n * return response.json();\n * }\n * });\n * ```\n */\nexport function createTool<\n TId extends string = string,\n TSchemaIn extends ZodLikeSchema | undefined = undefined,\n TSchemaOut extends ZodLikeSchema | undefined = undefined,\n TSuspendSchema extends ZodLikeSchema = any,\n TResumeSchema extends ZodLikeSchema = any,\n TContext extends ToolExecutionContext<TSuspendSchema, TResumeSchema> = ToolExecutionContext<\n TSuspendSchema,\n TResumeSchema\n >,\n TExecute extends ToolAction<\n TSchemaIn,\n TSchemaOut,\n TSuspendSchema,\n TResumeSchema,\n TContext,\n TId\n >['execute'] = ToolAction<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext, TId>['execute'],\n>(\n opts: ToolAction<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext, TId> & {\n execute?: TExecute;\n },\n): [TSchemaIn, TSchemaOut, TExecute] extends [ZodLikeSchema, ZodLikeSchema, Function]\n ? Tool<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext, TId> & {\n inputSchema: TSchemaIn;\n outputSchema: TSchemaOut;\n execute: (\n inputData: TSchemaIn extends ZodLikeSchema ? InferZodLikeSchema<TSchemaIn> : unknown,\n context?: TContext,\n ) => Promise<TSchemaOut extends ZodLikeSchema ? InferZodLikeSchema<TSchemaOut> : unknown>;\n }\n : Tool<TSchemaIn, TSchemaOut, TSuspendSchema, TResumeSchema, TContext, TId> {\n return new Tool(opts) as any;\n}\n","import { Tool } from './tool';\nimport type { ToolToConvert } from './tool-builder/builder';\nimport type { VercelTool } from './types';\n\n/**\n * Checks if a tool is a Vercel Tool\n * @param tool - The tool to check\n * @returns True if the tool is a Vercel Tool, false otherwise\n */\nexport function isVercelTool(tool?: ToolToConvert): tool is VercelTool {\n // Checks if this tool is not an instance of Tool\n return !!(tool && !(tool instanceof Tool) && 'parameters' in tool);\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkVSM3NLUX_cjs = require('./chunk-VSM3NLUX.cjs');
3
+ var chunkDQIZ5FFX_cjs = require('./chunk-DQIZ5FFX.cjs');
4
4
  var chunkTWH4PTDG_cjs = require('./chunk-TWH4PTDG.cjs');
5
5
  var chunkKEXGB7FK_cjs = require('./chunk-KEXGB7FK.cjs');
6
6
 
@@ -869,7 +869,7 @@ var InMemoryMemory = class extends MemoryStorage {
869
869
  async listMessagesById({ messageIds }) {
870
870
  this.logger.debug(`MockStore: listMessagesById called`);
871
871
  const rawMessages = messageIds.map((id) => this.collection.messages.get(id)).filter((message) => !!message);
872
- const list = new chunkVSM3NLUX_cjs.MessageList().add(rawMessages.map(this.parseStoredMessage), "memory");
872
+ const list = new chunkDQIZ5FFX_cjs.MessageList().add(rawMessages.map(this.parseStoredMessage), "memory");
873
873
  return { messages: list.get.all.db() };
874
874
  }
875
875
  async saveMessages(args) {
@@ -898,7 +898,7 @@ var InMemoryMemory = class extends MemoryStorage {
898
898
  };
899
899
  this.collection.messages.set(key, storageMessage);
900
900
  }
901
- const list = new chunkVSM3NLUX_cjs.MessageList().add(messages, "memory");
901
+ const list = new chunkDQIZ5FFX_cjs.MessageList().add(messages, "memory");
902
902
  return { messages: list.get.all.db() };
903
903
  }
904
904
  async updateMessages(args) {
@@ -2077,5 +2077,5 @@ exports.ensureDate = ensureDate;
2077
2077
  exports.normalizePerPage = normalizePerPage;
2078
2078
  exports.safelyParseJSON = safelyParseJSON;
2079
2079
  exports.serializeDate = serializeDate;
2080
- //# sourceMappingURL=chunk-WQSGX6XA.cjs.map
2081
- //# sourceMappingURL=chunk-WQSGX6XA.cjs.map
2080
+ //# sourceMappingURL=chunk-XJQX54QP.cjs.map
2081
+ //# sourceMappingURL=chunk-XJQX54QP.cjs.map