@mastra/core 1.0.0-beta.2 → 1.0.0-beta.3

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 (286) hide show
  1. package/CHANGELOG.md +162 -0
  2. package/dist/agent/agent-legacy.d.ts +2 -2
  3. package/dist/agent/agent-legacy.d.ts.map +1 -1
  4. package/dist/agent/agent.d.ts +1 -1
  5. package/dist/agent/agent.d.ts.map +1 -1
  6. package/dist/agent/agent.types.d.ts +3 -2
  7. package/dist/agent/agent.types.d.ts.map +1 -1
  8. package/dist/agent/index.cjs +9 -9
  9. package/dist/agent/index.js +2 -2
  10. package/dist/agent/message-list/index.cjs +3 -3
  11. package/dist/agent/message-list/index.d.ts.map +1 -1
  12. package/dist/agent/message-list/index.js +1 -1
  13. package/dist/agent/message-list/prompt/convert-file.d.ts +1 -1
  14. package/dist/agent/message-list/prompt/convert-file.d.ts.map +1 -1
  15. package/dist/agent/message-list/prompt/download-assets.d.ts.map +1 -1
  16. package/dist/agent/types.d.ts +1 -0
  17. package/dist/agent/types.d.ts.map +1 -1
  18. package/dist/agent/utils.d.ts.map +1 -1
  19. package/dist/agent/workflows/prepare-stream/index.d.ts +2 -1
  20. package/dist/agent/workflows/prepare-stream/index.d.ts.map +1 -1
  21. package/dist/agent/workflows/prepare-stream/map-results-step.d.ts +3 -1
  22. package/dist/agent/workflows/prepare-stream/map-results-step.d.ts.map +1 -1
  23. package/dist/agent/workflows/prepare-stream/prepare-memory-step.d.ts +2 -1
  24. package/dist/agent/workflows/prepare-stream/prepare-memory-step.d.ts.map +1 -1
  25. package/dist/agent/workflows/prepare-stream/prepare-tools-step.d.ts +2 -1
  26. package/dist/agent/workflows/prepare-stream/prepare-tools-step.d.ts.map +1 -1
  27. package/dist/agent/workflows/prepare-stream/stream-step.d.ts +3 -1
  28. package/dist/agent/workflows/prepare-stream/stream-step.d.ts.map +1 -1
  29. package/dist/chunk-3PSWNGBF.js +3 -0
  30. package/dist/{chunk-ZV5CC35D.js.map → chunk-3PSWNGBF.js.map} +1 -1
  31. package/dist/{chunk-IQO7ANVS.cjs → chunk-3VOUB4ZU.cjs} +10 -9
  32. package/dist/chunk-3VOUB4ZU.cjs.map +1 -0
  33. package/dist/{chunk-ZGHTOYHW.js → chunk-4DWZ4Z6H.js} +155 -23
  34. package/dist/chunk-4DWZ4Z6H.js.map +1 -0
  35. package/dist/{chunk-ET6UOTTU.cjs → chunk-4IKJAKCD.cjs} +40 -4
  36. package/dist/chunk-4IKJAKCD.cjs.map +1 -0
  37. package/dist/{chunk-JYYQQEBH.cjs → chunk-4RSHBKDJ.cjs} +241 -4
  38. package/dist/chunk-4RSHBKDJ.cjs.map +1 -0
  39. package/dist/{chunk-MV7KHWUT.js → chunk-5CWWU22H.js} +25 -4
  40. package/dist/chunk-5CWWU22H.js.map +1 -0
  41. package/dist/{chunk-JV2KH24V.js → chunk-BAMR7HKO.js} +18 -13
  42. package/dist/chunk-BAMR7HKO.js.map +1 -0
  43. package/dist/{chunk-7CBEP2ZQ.js → chunk-CKGIPST2.js} +809 -89
  44. package/dist/chunk-CKGIPST2.js.map +1 -0
  45. package/dist/{chunk-4CDL2QJT.js → chunk-D6EDHNGV.js} +53 -16
  46. package/dist/chunk-D6EDHNGV.js.map +1 -0
  47. package/dist/{chunk-ZWNI5IWX.cjs → chunk-EZVRSZMK.cjs} +13 -12
  48. package/dist/chunk-EZVRSZMK.cjs.map +1 -0
  49. package/dist/{chunk-ECFXGXWO.cjs → chunk-G36A2JRR.cjs} +18 -13
  50. package/dist/chunk-G36A2JRR.cjs.map +1 -0
  51. package/dist/{chunk-7PO6SEJF.js → chunk-G3OOCXAI.js} +240 -3
  52. package/dist/chunk-G3OOCXAI.js.map +1 -0
  53. package/dist/{chunk-I4CXL4SR.js → chunk-GRGPQ32U.js} +5 -4
  54. package/dist/chunk-GRGPQ32U.js.map +1 -0
  55. package/dist/{chunk-WM6CK2F3.cjs → chunk-HBJPYQRN.cjs} +57 -19
  56. package/dist/chunk-HBJPYQRN.cjs.map +1 -0
  57. package/dist/{chunk-GGYKYORQ.cjs → chunk-JTXVR2RA.cjs} +27 -6
  58. package/dist/chunk-JTXVR2RA.cjs.map +1 -0
  59. package/dist/{chunk-XEVG546F.js → chunk-JXESKY4A.js} +3 -3
  60. package/dist/{chunk-XEVG546F.js.map → chunk-JXESKY4A.js.map} +1 -1
  61. package/dist/{chunk-7AHYOMHJ.js → chunk-KEURQGCQ.js} +40 -5
  62. package/dist/chunk-KEURQGCQ.js.map +1 -0
  63. package/dist/{chunk-JPGVRWWL.js → chunk-KOSW5PP5.js} +8 -2
  64. package/dist/chunk-KOSW5PP5.js.map +1 -0
  65. package/dist/chunk-MCUX2D5Q.js +420 -0
  66. package/dist/chunk-MCUX2D5Q.js.map +1 -0
  67. package/dist/chunk-N4SJ4YX7.cjs +424 -0
  68. package/dist/chunk-N4SJ4YX7.cjs.map +1 -0
  69. package/dist/{chunk-VOY2RXOC.cjs → chunk-O6NA3Z43.cjs} +6 -6
  70. package/dist/{chunk-VOY2RXOC.cjs.map → chunk-O6NA3Z43.cjs.map} +1 -1
  71. package/dist/{chunk-SNPVZPLB.js → chunk-OQF4H5Y2.js} +6 -5
  72. package/dist/chunk-OQF4H5Y2.js.map +1 -0
  73. package/dist/{chunk-YCVEJ3UN.cjs → chunk-OWX2PUFH.cjs} +846 -123
  74. package/dist/chunk-OWX2PUFH.cjs.map +1 -0
  75. package/dist/chunk-PE3V7GUL.cjs +4 -0
  76. package/dist/{chunk-LJFJTTZQ.cjs.map → chunk-PE3V7GUL.cjs.map} +1 -1
  77. package/dist/{chunk-HDJFSJCK.js → chunk-T3WZCEC4.js} +4 -3
  78. package/dist/chunk-T3WZCEC4.js.map +1 -0
  79. package/dist/{chunk-W7UH2PWL.js → chunk-VU6DVS7J.js} +179 -282
  80. package/dist/chunk-VU6DVS7J.js.map +1 -0
  81. package/dist/{chunk-22443P6A.cjs → chunk-VZGBVYXA.cjs} +173 -41
  82. package/dist/chunk-VZGBVYXA.cjs.map +1 -0
  83. package/dist/{chunk-2ZVKF4HP.cjs → chunk-XRIVPHXV.cjs} +184 -285
  84. package/dist/chunk-XRIVPHXV.cjs.map +1 -0
  85. package/dist/{chunk-LWBQ4P4N.cjs → chunk-YQ7NLZZ3.cjs} +54 -53
  86. package/dist/chunk-YQ7NLZZ3.cjs.map +1 -0
  87. package/dist/{chunk-CB575O6L.cjs → chunk-ZPMFINU2.cjs} +8 -2
  88. package/dist/chunk-ZPMFINU2.cjs.map +1 -0
  89. package/dist/evals/base.d.ts.map +1 -1
  90. package/dist/evals/index.cjs +4 -4
  91. package/dist/evals/index.js +1 -1
  92. package/dist/evals/scoreTraces/index.cjs +5 -4
  93. package/dist/evals/scoreTraces/index.cjs.map +1 -1
  94. package/dist/evals/scoreTraces/index.js +3 -2
  95. package/dist/evals/scoreTraces/index.js.map +1 -1
  96. package/dist/evals/scoreTraces/scoreTracesWorkflow.d.ts.map +1 -1
  97. package/dist/index.cjs +2 -2
  98. package/dist/index.js +1 -1
  99. package/dist/integration/index.cjs +2 -2
  100. package/dist/integration/index.js +1 -1
  101. package/dist/llm/index.cjs +26 -10
  102. package/dist/llm/index.d.ts +1 -0
  103. package/dist/llm/index.d.ts.map +1 -1
  104. package/dist/llm/index.js +5 -1
  105. package/dist/llm/model/aisdk/v5/model.d.ts +47 -0
  106. package/dist/llm/model/aisdk/v5/model.d.ts.map +1 -0
  107. package/dist/llm/model/gateways/base.d.ts +8 -0
  108. package/dist/llm/model/gateways/base.d.ts.map +1 -1
  109. package/dist/llm/model/gateways/models-dev.d.ts +1 -0
  110. package/dist/llm/model/gateways/models-dev.d.ts.map +1 -1
  111. package/dist/llm/model/gateways/netlify.d.ts +2 -1
  112. package/dist/llm/model/gateways/netlify.d.ts.map +1 -1
  113. package/dist/llm/model/is-v2-model.d.ts +3 -0
  114. package/dist/llm/model/is-v2-model.d.ts.map +1 -0
  115. package/dist/llm/model/model-method-from-agent.d.ts +4 -0
  116. package/dist/llm/model/model-method-from-agent.d.ts.map +1 -0
  117. package/dist/llm/model/model.loop.d.ts +2 -2
  118. package/dist/llm/model/model.loop.d.ts.map +1 -1
  119. package/dist/llm/model/model.loop.types.d.ts +2 -0
  120. package/dist/llm/model/model.loop.types.d.ts.map +1 -1
  121. package/dist/llm/model/provider-registry.d.ts +11 -1
  122. package/dist/llm/model/provider-registry.d.ts.map +1 -1
  123. package/dist/llm/model/provider-types.generated.d.ts +56 -7
  124. package/dist/llm/model/registry-generator.d.ts.map +1 -1
  125. package/dist/llm/model/resolve-model.d.ts +1 -1
  126. package/dist/llm/model/resolve-model.d.ts.map +1 -1
  127. package/dist/llm/model/router.d.ts +12 -5
  128. package/dist/llm/model/router.d.ts.map +1 -1
  129. package/dist/llm/model/shared.types.d.ts +10 -4
  130. package/dist/llm/model/shared.types.d.ts.map +1 -1
  131. package/dist/loop/index.cjs +2 -2
  132. package/dist/loop/index.js +1 -1
  133. package/dist/loop/network/index.d.ts.map +1 -1
  134. package/dist/loop/test-utils/MastraLanguageModelV2Mock.d.ts +37 -0
  135. package/dist/loop/test-utils/MastraLanguageModelV2Mock.d.ts.map +1 -0
  136. package/dist/loop/test-utils/fullStream.d.ts.map +1 -1
  137. package/dist/loop/test-utils/generateText.d.ts.map +1 -1
  138. package/dist/loop/test-utils/options.d.ts.map +1 -1
  139. package/dist/loop/test-utils/resultObject.d.ts.map +1 -1
  140. package/dist/loop/test-utils/streamObject.d.ts.map +1 -1
  141. package/dist/loop/test-utils/textStream.d.ts.map +1 -1
  142. package/dist/loop/test-utils/toUIMessageStream.d.ts.map +1 -1
  143. package/dist/loop/test-utils/tools.d.ts.map +1 -1
  144. package/dist/loop/test-utils/utils.d.ts +1 -1
  145. package/dist/loop/test-utils/utils.d.ts.map +1 -1
  146. package/dist/loop/types.d.ts +8 -3
  147. package/dist/loop/types.d.ts.map +1 -1
  148. package/dist/loop/workflows/agentic-execution/index.d.ts +12 -12
  149. package/dist/loop/workflows/agentic-execution/index.d.ts.map +1 -1
  150. package/dist/loop/workflows/agentic-execution/llm-execution-step.d.ts +9 -9
  151. package/dist/loop/workflows/agentic-execution/llm-execution-step.d.ts.map +1 -1
  152. package/dist/loop/workflows/agentic-execution/llm-mapping-step.d.ts +4 -4
  153. package/dist/loop/workflows/agentic-loop/index.d.ts +13 -12
  154. package/dist/loop/workflows/agentic-loop/index.d.ts.map +1 -1
  155. package/dist/loop/workflows/run-state.d.ts +2 -2
  156. package/dist/loop/workflows/run-state.d.ts.map +1 -1
  157. package/dist/loop/workflows/schema.d.ts +4 -4
  158. package/dist/loop/workflows/stream.d.ts.map +1 -1
  159. package/dist/mastra/index.cjs +2 -2
  160. package/dist/mastra/index.d.ts +127 -3
  161. package/dist/mastra/index.d.ts.map +1 -1
  162. package/dist/mastra/index.js +1 -1
  163. package/dist/memory/index.cjs +8 -8
  164. package/dist/memory/index.js +4 -4
  165. package/dist/models-dev-GCVENVWA.js +3 -0
  166. package/dist/{models-dev-DNBKXHT4.js.map → models-dev-GCVENVWA.js.map} +1 -1
  167. package/dist/models-dev-TIBJR6IG.cjs +12 -0
  168. package/dist/{models-dev-YBEEQIX6.cjs.map → models-dev-TIBJR6IG.cjs.map} +1 -1
  169. package/dist/netlify-NTSNNT6F.cjs +12 -0
  170. package/dist/{netlify-GWNGSIRZ.cjs.map → netlify-NTSNNT6F.cjs.map} +1 -1
  171. package/dist/netlify-O5NJW7CF.js +3 -0
  172. package/dist/{netlify-7G2L5VSH.js.map → netlify-O5NJW7CF.js.map} +1 -1
  173. package/dist/processors/index.cjs +11 -11
  174. package/dist/processors/index.js +1 -1
  175. package/dist/provider-registry-74GMFZKT.js +3 -0
  176. package/dist/provider-registry-74GMFZKT.js.map +1 -0
  177. package/dist/provider-registry-BZP3DIIV.cjs +40 -0
  178. package/dist/provider-registry-BZP3DIIV.cjs.map +1 -0
  179. package/dist/provider-registry.json +140 -18
  180. package/dist/{registry-generator-MK63POJO.cjs → registry-generator-JPCV47SC.cjs} +6 -4
  181. package/dist/registry-generator-JPCV47SC.cjs.map +1 -0
  182. package/dist/{registry-generator-H4YNODDH.js → registry-generator-XD4FPZTU.js} +6 -4
  183. package/dist/registry-generator-XD4FPZTU.js.map +1 -0
  184. package/dist/relevance/index.cjs +2 -2
  185. package/dist/relevance/index.js +1 -1
  186. package/dist/server/index.cjs +2 -1
  187. package/dist/server/index.cjs.map +1 -1
  188. package/dist/server/index.d.ts +4 -0
  189. package/dist/server/index.d.ts.map +1 -1
  190. package/dist/server/index.js +2 -1
  191. package/dist/server/index.js.map +1 -1
  192. package/dist/storage/domains/workflows/inmemory.d.ts +1 -1
  193. package/dist/storage/domains/workflows/inmemory.d.ts.map +1 -1
  194. package/dist/storage/index.cjs +29 -29
  195. package/dist/storage/index.js +1 -1
  196. package/dist/storage/types.d.ts +2 -1
  197. package/dist/storage/types.d.ts.map +1 -1
  198. package/dist/stream/RunOutput.d.ts +1 -1
  199. package/dist/stream/RunOutput.d.ts.map +1 -1
  200. package/dist/stream/aisdk/v5/execute.d.ts +6 -3
  201. package/dist/stream/aisdk/v5/execute.d.ts.map +1 -1
  202. package/dist/stream/aisdk/v5/output.d.ts.map +1 -1
  203. package/dist/stream/base/input.d.ts +1 -1
  204. package/dist/stream/base/output.d.ts.map +1 -1
  205. package/dist/stream/index.cjs +11 -11
  206. package/dist/stream/index.js +2 -2
  207. package/dist/stream/types.d.ts +4 -3
  208. package/dist/stream/types.d.ts.map +1 -1
  209. package/dist/test-utils/llm-mock.cjs +2 -2
  210. package/dist/test-utils/llm-mock.js +1 -1
  211. package/dist/tools/index.cjs +4 -4
  212. package/dist/tools/index.js +1 -1
  213. package/dist/tools/is-vercel-tool.cjs +2 -2
  214. package/dist/tools/is-vercel-tool.js +1 -1
  215. package/dist/tools/tool-builder/builder.d.ts.map +1 -1
  216. package/dist/tools/tool.d.ts.map +1 -1
  217. package/dist/tools/types.d.ts +1 -0
  218. package/dist/tools/types.d.ts.map +1 -1
  219. package/dist/tools/validation.d.ts +12 -0
  220. package/dist/tools/validation.d.ts.map +1 -1
  221. package/dist/utils.cjs +25 -21
  222. package/dist/utils.d.ts +4 -1
  223. package/dist/utils.d.ts.map +1 -1
  224. package/dist/utils.js +1 -1
  225. package/dist/workflows/default.d.ts +24 -8
  226. package/dist/workflows/default.d.ts.map +1 -1
  227. package/dist/workflows/evented/execution-engine.d.ts +3 -1
  228. package/dist/workflows/evented/execution-engine.d.ts.map +1 -1
  229. package/dist/workflows/evented/index.cjs +10 -10
  230. package/dist/workflows/evented/index.js +1 -1
  231. package/dist/workflows/evented/workflow-event-processor/index.d.ts +5 -4
  232. package/dist/workflows/evented/workflow-event-processor/index.d.ts.map +1 -1
  233. package/dist/workflows/evented/workflow-event-processor/loop.d.ts +1 -1
  234. package/dist/workflows/evented/workflow-event-processor/loop.d.ts.map +1 -1
  235. package/dist/workflows/evented/workflow-event-processor/parallel.d.ts +2 -2
  236. package/dist/workflows/evented/workflow-event-processor/parallel.d.ts.map +1 -1
  237. package/dist/workflows/evented/workflow-event-processor/sleep.d.ts +2 -2
  238. package/dist/workflows/evented/workflow-event-processor/sleep.d.ts.map +1 -1
  239. package/dist/workflows/evented/workflow.d.ts +2 -1
  240. package/dist/workflows/evented/workflow.d.ts.map +1 -1
  241. package/dist/workflows/execution-engine.d.ts +4 -2
  242. package/dist/workflows/execution-engine.d.ts.map +1 -1
  243. package/dist/workflows/index.cjs +28 -16
  244. package/dist/workflows/index.js +1 -1
  245. package/dist/workflows/step.d.ts +1 -0
  246. package/dist/workflows/step.d.ts.map +1 -1
  247. package/dist/workflows/types.d.ts +54 -2
  248. package/dist/workflows/types.d.ts.map +1 -1
  249. package/dist/workflows/utils.d.ts +20 -0
  250. package/dist/workflows/utils.d.ts.map +1 -1
  251. package/dist/workflows/workflow.d.ts +108 -40
  252. package/dist/workflows/workflow.d.ts.map +1 -1
  253. package/package.json +12 -20
  254. package/src/llm/model/provider-types.generated.d.ts +56 -7
  255. package/dist/chunk-22443P6A.cjs.map +0 -1
  256. package/dist/chunk-2ZVKF4HP.cjs.map +0 -1
  257. package/dist/chunk-4CDL2QJT.js.map +0 -1
  258. package/dist/chunk-7AHYOMHJ.js.map +0 -1
  259. package/dist/chunk-7CBEP2ZQ.js.map +0 -1
  260. package/dist/chunk-7PO6SEJF.js.map +0 -1
  261. package/dist/chunk-CB575O6L.cjs.map +0 -1
  262. package/dist/chunk-ECFXGXWO.cjs.map +0 -1
  263. package/dist/chunk-ET6UOTTU.cjs.map +0 -1
  264. package/dist/chunk-GGYKYORQ.cjs.map +0 -1
  265. package/dist/chunk-HDJFSJCK.js.map +0 -1
  266. package/dist/chunk-I4CXL4SR.js.map +0 -1
  267. package/dist/chunk-IQO7ANVS.cjs.map +0 -1
  268. package/dist/chunk-JPGVRWWL.js.map +0 -1
  269. package/dist/chunk-JV2KH24V.js.map +0 -1
  270. package/dist/chunk-JYYQQEBH.cjs.map +0 -1
  271. package/dist/chunk-LJFJTTZQ.cjs +0 -4
  272. package/dist/chunk-LWBQ4P4N.cjs.map +0 -1
  273. package/dist/chunk-MV7KHWUT.js.map +0 -1
  274. package/dist/chunk-SNPVZPLB.js.map +0 -1
  275. package/dist/chunk-W7UH2PWL.js.map +0 -1
  276. package/dist/chunk-WM6CK2F3.cjs.map +0 -1
  277. package/dist/chunk-YCVEJ3UN.cjs.map +0 -1
  278. package/dist/chunk-ZGHTOYHW.js.map +0 -1
  279. package/dist/chunk-ZV5CC35D.js +0 -3
  280. package/dist/chunk-ZWNI5IWX.cjs.map +0 -1
  281. package/dist/models-dev-DNBKXHT4.js +0 -3
  282. package/dist/models-dev-YBEEQIX6.cjs +0 -12
  283. package/dist/netlify-7G2L5VSH.js +0 -3
  284. package/dist/netlify-GWNGSIRZ.cjs +0 -12
  285. package/dist/registry-generator-H4YNODDH.js.map +0 -1
  286. package/dist/registry-generator-MK63POJO.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/stream/aisdk/v5/file.ts","../src/stream/aisdk/v5/compat/content.ts","../src/stream/aisdk/v5/compat/media.ts","../src/agent/message-list/prompt/convert-file.ts","../src/agent/message-list/prompt/attachments-to-parts.ts","../src/agent/message-list/prompt/convert-to-mastra-v1.ts","../src/agent/message-list/prompt/data-content.ts","../src/utils/fetchWithRetry.ts","../src/agent/message-list/prompt/download-assets.ts","../src/agent/message-list/prompt/image-utils.ts","../src/agent/message-list/utils/ai-v5/gemini-compatibility.ts","../src/agent/message-list/utils/ai-v5/tool.ts","../src/agent/message-list/utils/convert-messages.ts","../src/agent/message-list/index.ts"],"names":["convertUint8ArrayToBase64","convertBase64ToUint8Array","processBlock","content","toolInvocations","i","startIndex","stepParts","stepUiMessages","modelMessages","uiMessage","randomUUID"],"mappings":"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","file":"chunk-JV2KH24V.js","sourcesContent":["import { convertBase64ToUint8Array, convertUint8ArrayToBase64 } from '@ai-sdk/provider-utils-v5';\n\n/**\n * A generated file.\n */\nexport interface GeneratedFile {\n /**\n File as a base64 encoded string.\n */\n readonly base64: string;\n\n /**\n File as a Uint8Array.\n */\n readonly uint8Array: Uint8Array;\n\n /**\n The IANA media type of the file.\n \n @see https://www.iana.org/assignments/media-types/media-types.xhtml\n */\n readonly mediaType: string;\n}\n\nexport class DefaultGeneratedFile implements GeneratedFile {\n private base64Data: string | undefined;\n private uint8ArrayData: Uint8Array | undefined;\n\n readonly mediaType: string;\n\n constructor({ data, mediaType }: { data: string | Uint8Array; mediaType: string }) {\n const isUint8Array = data instanceof Uint8Array;\n this.base64Data = isUint8Array ? undefined : data;\n this.uint8ArrayData = isUint8Array ? data : undefined;\n this.mediaType = mediaType;\n }\n\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get base64() {\n if (this.base64Data == null) {\n this.base64Data = convertUint8ArrayToBase64(this.uint8ArrayData!);\n }\n return this.base64Data;\n }\n\n // lazy conversion with caching to avoid unnecessary conversion overhead:\n get uint8Array() {\n if (this.uint8ArrayData == null) {\n this.uint8ArrayData = convertBase64ToUint8Array(this.base64Data!);\n }\n return this.uint8ArrayData;\n }\n}\n\nexport class DefaultGeneratedFileWithType extends DefaultGeneratedFile {\n readonly type = 'file';\n\n constructor(options: { data: string | Uint8Array; mediaType: string }) {\n super(options);\n }\n}\n","import type { LanguageModelV2DataContent } from '@ai-sdk/provider-v5';\nimport type { DataContent } from 'ai-v5';\nimport { ErrorCategory, ErrorDomain, MastraError } from '../../../../error';\n\nfunction splitDataUrl(dataUrl: string): {\n mediaType: string | undefined;\n base64Content: string | undefined;\n} {\n try {\n const [header, base64Content] = dataUrl.split(',');\n return {\n mediaType: header?.split(';')[0]?.split(':')[1],\n base64Content,\n };\n } catch {\n return {\n mediaType: undefined,\n base64Content: undefined,\n };\n }\n}\n\nexport function convertToDataContent(content: DataContent | URL): {\n data: LanguageModelV2DataContent;\n mediaType: string | undefined;\n} {\n // Buffer & Uint8Array:\n if (content instanceof Uint8Array) {\n return { data: content, mediaType: undefined };\n }\n\n // ArrayBuffer needs conversion to Uint8Array (lightweight):\n if (content instanceof ArrayBuffer) {\n return { data: new Uint8Array(content), mediaType: undefined };\n }\n\n // Attempt to create a URL from the data. If it fails, we can assume the data\n // is not a URL and likely some other sort of data.\n if (typeof content === 'string') {\n try {\n content = new URL(content);\n } catch {\n // ignored\n }\n }\n\n // Extract data from data URL:\n if (content instanceof URL && content.protocol === 'data:') {\n const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(content.toString());\n\n if (dataUrlMediaType == null || base64Content == null) {\n throw new MastraError({\n id: 'INVALID_DATA_URL_FORMAT',\n text: `Invalid data URL format in content ${content.toString()}`,\n domain: ErrorDomain.LLM,\n category: ErrorCategory.USER,\n });\n }\n\n return { data: base64Content, mediaType: dataUrlMediaType };\n }\n\n return { data: content, mediaType: undefined };\n}\n","import { convertBase64ToUint8Array } from '@ai-sdk/provider-utils-v5';\n\nexport const imageMediaTypeSignatures = [\n {\n mediaType: 'image/gif' as const,\n bytesPrefix: [0x47, 0x49, 0x46],\n base64Prefix: 'R0lG',\n },\n {\n mediaType: 'image/png' as const,\n bytesPrefix: [0x89, 0x50, 0x4e, 0x47],\n base64Prefix: 'iVBORw',\n },\n {\n mediaType: 'image/jpeg' as const,\n bytesPrefix: [0xff, 0xd8],\n base64Prefix: '/9j/',\n },\n {\n mediaType: 'image/webp' as const,\n bytesPrefix: [0x52, 0x49, 0x46, 0x46],\n base64Prefix: 'UklGRg',\n },\n {\n mediaType: 'image/bmp' as const,\n bytesPrefix: [0x42, 0x4d],\n base64Prefix: 'Qk',\n },\n {\n mediaType: 'image/tiff' as const,\n bytesPrefix: [0x49, 0x49, 0x2a, 0x00],\n base64Prefix: 'SUkqAA',\n },\n {\n mediaType: 'image/tiff' as const,\n bytesPrefix: [0x4d, 0x4d, 0x00, 0x2a],\n base64Prefix: 'TU0AKg',\n },\n {\n mediaType: 'image/avif' as const,\n bytesPrefix: [0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66],\n base64Prefix: 'AAAAIGZ0eXBhdmlm',\n },\n {\n mediaType: 'image/heic' as const,\n bytesPrefix: [0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x63],\n base64Prefix: 'AAAAIGZ0eXBoZWlj',\n },\n] as const;\n\nexport const audioMediaTypeSignatures = [\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xfb],\n base64Prefix: '//s=',\n },\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xfa],\n base64Prefix: '//o=',\n },\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xf3],\n base64Prefix: '//M=',\n },\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xf2],\n base64Prefix: '//I=',\n },\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xe3],\n base64Prefix: '/+M=',\n },\n {\n mediaType: 'audio/mpeg' as const,\n bytesPrefix: [0xff, 0xe2],\n base64Prefix: '/+I=',\n },\n {\n mediaType: 'audio/wav' as const,\n bytesPrefix: [0x52, 0x49, 0x46, 0x46],\n base64Prefix: 'UklGR',\n },\n {\n mediaType: 'audio/ogg' as const,\n bytesPrefix: [0x4f, 0x67, 0x67, 0x53],\n base64Prefix: 'T2dnUw',\n },\n {\n mediaType: 'audio/flac' as const,\n bytesPrefix: [0x66, 0x4c, 0x61, 0x43],\n base64Prefix: 'ZkxhQw',\n },\n {\n mediaType: 'audio/aac' as const,\n bytesPrefix: [0x40, 0x15, 0x00, 0x00],\n base64Prefix: 'QBUA',\n },\n {\n mediaType: 'audio/mp4' as const,\n bytesPrefix: [0x66, 0x74, 0x79, 0x70],\n base64Prefix: 'ZnR5cA',\n },\n {\n mediaType: 'audio/webm',\n bytesPrefix: [0x1a, 0x45, 0xdf, 0xa3],\n base64Prefix: 'GkXf',\n },\n] as const;\n\nconst stripID3 = (data: Uint8Array | string) => {\n const bytes = typeof data === 'string' ? convertBase64ToUint8Array(data) : data;\n const id3Size =\n // @ts-ignore\n ((bytes[6] & 0x7f) << 21) |\n // @ts-ignore\n ((bytes[7] & 0x7f) << 14) |\n // @ts-ignore\n ((bytes[8] & 0x7f) << 7) |\n // @ts-ignore\n (bytes[9] & 0x7f);\n\n // The raw MP3 starts here\n return bytes.slice(id3Size + 10);\n};\n\nfunction stripID3TagsIfPresent(data: Uint8Array | string): Uint8Array | string {\n const hasId3 =\n (typeof data === 'string' && data.startsWith('SUQz')) ||\n (typeof data !== 'string' &&\n data.length > 10 &&\n data[0] === 0x49 && // 'I'\n data[1] === 0x44 && // 'D'\n data[2] === 0x33); // '3'\n\n return hasId3 ? stripID3(data) : data;\n}\n\nexport function detectMediaType({\n data,\n signatures,\n}: {\n data: Uint8Array | string;\n signatures: typeof audioMediaTypeSignatures | typeof imageMediaTypeSignatures;\n}): (typeof signatures)[number]['mediaType'] | undefined {\n const processedData = stripID3TagsIfPresent(data);\n\n for (const signature of signatures) {\n if (\n typeof processedData === 'string'\n ? processedData.startsWith(signature.base64Prefix)\n : processedData.length >= signature.bytesPrefix.length &&\n signature.bytesPrefix.every((byte, index) => processedData[index] === byte)\n ) {\n return signature.mediaType;\n }\n }\n\n return undefined;\n}\n","import type { DataContent, ImagePart, FilePart } from '@ai-sdk/provider-utils-v5';\nimport type { LanguageModelV2FilePart, LanguageModelV2TextPart } from '@ai-sdk/provider-v5';\nimport { convertToDataContent, detectMediaType, imageMediaTypeSignatures } from '../../../stream/aisdk/v5/compat';\n\nexport function convertImageFilePart(\n part: ImagePart | FilePart,\n downloadedAssets: Record<string, { mediaType: string | undefined; data: Uint8Array }>,\n): LanguageModelV2TextPart | LanguageModelV2FilePart {\n let originalData: DataContent | URL;\n const type = part.type;\n switch (type) {\n case 'image':\n originalData = part.image;\n break;\n case 'file':\n originalData = part.data;\n\n break;\n default:\n throw new Error(`Unsupported part type: ${type}`);\n }\n\n const { data: convertedData, mediaType: convertedMediaType } = convertToDataContent(originalData);\n\n let mediaType: string | undefined = convertedMediaType ?? part.mediaType;\n let data: Uint8Array | string | URL = convertedData; // binary | base64 | url\n\n // If the content is a URL, we check if it was downloaded:\n if (data instanceof URL) {\n const downloadedFile = downloadedAssets[data.toString()];\n if (downloadedFile) {\n data = downloadedFile.data;\n mediaType ??= downloadedFile.mediaType;\n }\n }\n\n // Now that we have the normalized data either as a URL or a Uint8Array,\n // we can create the LanguageModelV2Part.\n switch (type) {\n case 'image': {\n // When possible, try to detect the media type automatically\n // to deal with incorrect media type inputs.\n // When detection fails, use provided media type.\n if (data instanceof Uint8Array || typeof data === 'string') {\n mediaType = detectMediaType({ data, signatures: imageMediaTypeSignatures }) ?? mediaType;\n }\n\n return {\n type: 'file',\n mediaType: mediaType ?? 'image/*', // any image\n filename: undefined,\n data,\n providerOptions: part.providerOptions,\n };\n }\n\n case 'file': {\n // We must have a mediaType for files, if not, throw an error.\n if (mediaType == null) {\n throw new Error(`Media type is missing for file part`);\n }\n\n return {\n type: 'file',\n mediaType,\n filename: part.filename,\n data,\n providerOptions: part.providerOptions,\n };\n }\n }\n}\n","import type { Attachment } from '@ai-sdk/ui-utils-v5';\nimport type { FilePart, ImagePart, TextPart } from '@internal/ai-sdk-v4';\n\ntype ContentPart = TextPart | ImagePart | FilePart;\n\n/**\n * Converts a list of attachments to a list of content parts\n * for consumption by `ai/core` functions.\n * Currently only supports images and text attachments.\n */\nexport function attachmentsToParts(attachments: Attachment[]): ContentPart[] {\n const parts: ContentPart[] = [];\n\n for (const attachment of attachments) {\n let url;\n\n try {\n url = new URL(attachment.url);\n } catch {\n throw new Error(`Invalid URL: ${attachment.url}`);\n }\n\n switch (url.protocol) {\n case 'http:':\n case 'https:': {\n if (attachment.contentType?.startsWith('image/')) {\n parts.push({ type: 'image', image: url.toString(), mimeType: attachment.contentType });\n } else {\n if (!attachment.contentType) {\n throw new Error('If the attachment is not an image, it must specify a content type');\n }\n\n parts.push({\n type: 'file',\n data: url.toString(),\n mimeType: attachment.contentType,\n });\n }\n break;\n }\n\n case 'data:': {\n if (attachment.contentType?.startsWith('image/')) {\n parts.push({\n type: 'image',\n image: attachment.url,\n mimeType: attachment.contentType,\n });\n } else if (attachment.contentType?.startsWith('text/')) {\n parts.push({\n type: 'file',\n data: attachment.url,\n mimeType: attachment.contentType,\n });\n } else {\n if (!attachment.contentType) {\n throw new Error('If the attachment is not an image or text, it must specify a content type');\n }\n\n parts.push({\n type: 'file',\n data: attachment.url,\n mimeType: attachment.contentType,\n });\n }\n\n break;\n }\n\n default: {\n throw new Error(`Unsupported URL protocol: ${url.protocol}`);\n }\n }\n }\n\n return parts;\n}\n","/**\n * This file is an adaptation of https://github.com/vercel/ai/blob/e14c066bf4d02c5ee2180c56a01fa0e5216bc582/packages/ai/core/prompt/convert-to-core-messages.ts\n * But has been modified to work with Mastra storage adapter messages (MastraMessageV1)\n */\nimport type { AssistantContent, ToolResultPart } from '@internal/ai-sdk-v4';\nimport type { MastraMessageV1 } from '../../../memory/types';\nimport type { MastraMessageContentV2, MastraDBMessage } from '../../message-list';\nimport { attachmentsToParts } from './attachments-to-parts';\n\nconst makePushOrCombine = (v1Messages: MastraMessageV1[]) => {\n // Track how many times each ID has been used to create unique IDs for split messages\n const idUsageCount = new Map<string, number>();\n\n // Pattern to detect if an ID already has our split suffix\n const SPLIT_SUFFIX_PATTERN = /__split-\\d+$/;\n\n return (msg: MastraMessageV1) => {\n const previousMessage = v1Messages.at(-1);\n if (\n msg.role === previousMessage?.role &&\n Array.isArray(previousMessage.content) &&\n Array.isArray(msg.content) &&\n // we were creating new messages for tool calls before and not appending to the assistant message\n // so don't append here so everything works as before\n (msg.role !== `assistant` || (msg.role === `assistant` && msg.content.at(-1)?.type !== `tool-call`))\n ) {\n for (const part of msg.content) {\n // @ts-ignore needs type gymnastics? msg.content and previousMessage.content are the same type here since both are arrays\n // I'm not sure what's adding `never` to the union but this code definitely works..\n previousMessage.content.push(part);\n }\n } else {\n // When pushing a new message, check if we need to deduplicate the ID\n let baseId = msg.id;\n\n // Check if this ID already has a split suffix and extract the base ID\n const hasSplitSuffix = SPLIT_SUFFIX_PATTERN.test(baseId);\n if (hasSplitSuffix) {\n // This ID already has a split suffix, don't add another one\n v1Messages.push(msg);\n return;\n }\n\n const currentCount = idUsageCount.get(baseId) || 0;\n\n // If we've seen this ID before, append our unique split suffix\n if (currentCount > 0) {\n msg.id = `${baseId}__split-${currentCount}`;\n }\n\n // Increment the usage count for this base ID\n idUsageCount.set(baseId, currentCount + 1);\n\n v1Messages.push(msg);\n }\n };\n};\nexport function convertToV1Messages(messages: Array<MastraDBMessage>) {\n const v1Messages: MastraMessageV1[] = [];\n const pushOrCombine = makePushOrCombine(v1Messages);\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n const isLastMessage = i === messages.length - 1;\n if (!message?.content) continue;\n const { content, experimental_attachments: inputAttachments = [], parts: inputParts } = message.content;\n const { role } = message;\n\n const fields = {\n id: message.id,\n createdAt: message.createdAt,\n resourceId: message.resourceId!,\n threadId: message.threadId!,\n };\n\n const experimental_attachments = [...inputAttachments];\n const parts: typeof inputParts = [];\n for (const part of inputParts) {\n if (part.type === 'file') {\n experimental_attachments.push({\n url: part.data,\n contentType: part.mimeType,\n });\n } else {\n parts.push(part);\n }\n }\n\n switch (role) {\n case 'user': {\n if (parts == null) {\n const userContent = experimental_attachments\n ? [{ type: 'text', text: content || '' }, ...attachmentsToParts(experimental_attachments)]\n : { type: 'text', text: content || '' };\n pushOrCombine({\n role: 'user',\n ...fields,\n type: 'text',\n // @ts-ignore\n content: userContent,\n });\n } else {\n const textParts = message.content.parts\n .filter(part => part.type === 'text')\n .map(part => ({\n type: 'text' as const,\n text: part.text,\n }));\n\n const userContent = experimental_attachments\n ? [...textParts, ...attachmentsToParts(experimental_attachments)]\n : textParts;\n pushOrCombine({\n role: 'user',\n ...fields,\n type: 'text',\n content:\n Array.isArray(userContent) &&\n userContent.length === 1 &&\n userContent[0]?.type === `text` &&\n typeof content !== `undefined`\n ? content\n : userContent,\n });\n }\n break;\n }\n\n case 'assistant': {\n if (message.content.parts != null) {\n let currentStep = 0;\n let blockHasToolInvocations = false;\n let block: MastraMessageContentV2['parts'] = [];\n\n function processBlock() {\n const content: AssistantContent = [];\n\n for (const part of block) {\n switch (part.type) {\n case 'file':\n case 'text': {\n content.push(part);\n break;\n }\n case 'reasoning': {\n for (const detail of part.details) {\n switch (detail.type) {\n case 'text':\n content.push({\n type: 'reasoning' as const,\n text: detail.text,\n signature: detail.signature,\n });\n break;\n case 'redacted':\n content.push({\n type: 'redacted-reasoning' as const,\n data: detail.data,\n });\n break;\n }\n }\n break;\n }\n case 'tool-invocation':\n // Skip updateWorkingMemory tool calls as they should not be visible in history\n if (part.toolInvocation.toolName !== 'updateWorkingMemory') {\n content.push({\n type: 'tool-call' as const,\n toolCallId: part.toolInvocation.toolCallId,\n toolName: part.toolInvocation.toolName,\n args: part.toolInvocation.args,\n });\n }\n break;\n }\n }\n\n pushOrCombine({\n role: 'assistant',\n ...fields,\n type: content.some(c => c.type === `tool-call`) ? 'tool-call' : 'text',\n content:\n typeof content !== `string` &&\n Array.isArray(content) &&\n content.length === 1 &&\n content[0]?.type === `text`\n ? content[0].text\n : content,\n });\n\n // check if there are tool invocations with results in the block\n const stepInvocations = block\n .filter(part => `type` in part && part.type === 'tool-invocation')\n .map(part => part.toolInvocation)\n .filter(ti => ti.toolName !== 'updateWorkingMemory');\n\n // Only create tool-result message if there are actual results\n const invocationsWithResults = stepInvocations.filter(ti => ti.state === 'result' && 'result' in ti);\n\n if (invocationsWithResults.length > 0) {\n pushOrCombine({\n role: 'tool',\n ...fields,\n type: 'tool-result',\n content: invocationsWithResults.map((toolInvocation): ToolResultPart => {\n const { toolCallId, toolName, result } = toolInvocation;\n return {\n type: 'tool-result',\n toolCallId,\n toolName,\n result,\n };\n }),\n });\n }\n\n // updates for next block\n block = [];\n blockHasToolInvocations = false;\n currentStep++;\n }\n\n for (const part of message.content.parts) {\n switch (part.type) {\n case 'text': {\n if (blockHasToolInvocations) {\n processBlock(); // text must come after tool invocations\n }\n block.push(part);\n break;\n }\n case 'file':\n case 'reasoning': {\n block.push(part);\n break;\n }\n case 'tool-invocation': {\n // If we have non-tool content (text/file/reasoning) in the block, process it first\n const hasNonToolContent = block.some(\n p => p.type === 'text' || p.type === 'file' || p.type === 'reasoning',\n );\n if (hasNonToolContent || (part.toolInvocation.step ?? 0) !== currentStep) {\n processBlock();\n }\n block.push(part);\n blockHasToolInvocations = true;\n break;\n }\n }\n }\n\n processBlock();\n\n // Check if there are toolInvocations that weren't processed from parts\n const toolInvocations = message.content.toolInvocations;\n if (toolInvocations && toolInvocations.length > 0) {\n // Find tool invocations that weren't already processed from parts\n const processedToolCallIds = new Set<string>();\n for (const part of message.content.parts) {\n if (part.type === 'tool-invocation' && part.toolInvocation.toolCallId) {\n processedToolCallIds.add(part.toolInvocation.toolCallId);\n }\n }\n\n const unprocessedToolInvocations = toolInvocations.filter(\n ti => !processedToolCallIds.has(ti.toolCallId) && ti.toolName !== 'updateWorkingMemory',\n );\n\n if (unprocessedToolInvocations.length > 0) {\n // Group by step, handling undefined steps\n const invocationsByStep = new Map<number, typeof unprocessedToolInvocations>();\n\n for (const inv of unprocessedToolInvocations) {\n const step = inv.step ?? 0;\n if (!invocationsByStep.has(step)) {\n invocationsByStep.set(step, []);\n }\n invocationsByStep.get(step)!.push(inv);\n }\n\n // Process each step\n const sortedSteps = Array.from(invocationsByStep.keys()).sort((a, b) => a - b);\n\n for (const step of sortedSteps) {\n const stepInvocations = invocationsByStep.get(step)!;\n\n // Create tool-call message for all invocations (calls and results)\n pushOrCombine({\n role: 'assistant',\n ...fields,\n type: 'tool-call',\n content: [\n ...stepInvocations.map(({ toolCallId, toolName, args }) => ({\n type: 'tool-call' as const,\n toolCallId,\n toolName,\n args,\n })),\n ],\n });\n\n // Only create tool-result message if there are actual results\n const invocationsWithResults = stepInvocations.filter(ti => ti.state === 'result' && 'result' in ti);\n\n if (invocationsWithResults.length > 0) {\n pushOrCombine({\n role: 'tool',\n ...fields,\n type: 'tool-result',\n content: invocationsWithResults.map((toolInvocation): ToolResultPart => {\n const { toolCallId, toolName, result } = toolInvocation;\n return {\n type: 'tool-result',\n toolCallId,\n toolName,\n result,\n };\n }),\n });\n }\n }\n }\n }\n\n break;\n }\n\n const toolInvocations = message.content.toolInvocations;\n\n if (toolInvocations == null || toolInvocations.length === 0) {\n pushOrCombine({ role: 'assistant', ...fields, content: content || '', type: 'text' });\n break;\n }\n\n const maxStep = toolInvocations.reduce((max, toolInvocation) => {\n return Math.max(max, toolInvocation.step ?? 0);\n }, 0);\n\n for (let i = 0; i <= maxStep; i++) {\n const stepInvocations = toolInvocations.filter(\n toolInvocation => (toolInvocation.step ?? 0) === i && toolInvocation.toolName !== 'updateWorkingMemory',\n );\n\n if (stepInvocations.length === 0) {\n continue;\n }\n\n // assistant message with tool calls\n pushOrCombine({\n role: 'assistant',\n ...fields,\n type: 'tool-call',\n content: [\n ...(isLastMessage && content && i === 0 ? [{ type: 'text' as const, text: content }] : []),\n ...stepInvocations.map(({ toolCallId, toolName, args }) => ({\n type: 'tool-call' as const,\n toolCallId,\n toolName,\n args,\n })),\n ],\n });\n\n // Only create tool-result message if there are actual results\n const invocationsWithResults = stepInvocations.filter(ti => ti.state === 'result' && 'result' in ti);\n\n if (invocationsWithResults.length > 0) {\n pushOrCombine({\n role: 'tool',\n ...fields,\n type: 'tool-result',\n content: invocationsWithResults.map((toolInvocation): ToolResultPart => {\n const { toolCallId, toolName, result } = toolInvocation;\n return {\n type: 'tool-result',\n toolCallId,\n toolName,\n result,\n };\n }),\n });\n }\n }\n\n if (content && !isLastMessage) {\n pushOrCombine({ role: 'assistant', ...fields, type: 'text', content: content || '' });\n }\n\n break;\n }\n }\n }\n\n return v1Messages;\n}\n","import { convertUint8ArrayToBase64 } from '@internal/ai-sdk-v4';\nimport { z } from 'zod';\n\n/**\nData content. Can either be a base64-encoded string, a Uint8Array, an ArrayBuffer, or a Buffer.\n */\nexport type DataContent = string | Uint8Array | ArrayBuffer | Buffer;\n\n/**\n@internal\n */\nexport const dataContentSchema: z.ZodType<DataContent> = z.union([\n z.string(),\n z.instanceof(Uint8Array),\n z.instanceof(ArrayBuffer),\n z.custom(\n // Buffer might not be available in some environments such as CloudFlare:\n (value: unknown): value is Buffer => globalThis.Buffer?.isBuffer(value) ?? false,\n { message: 'Must be a Buffer' },\n ),\n]);\n\n/**\nConverts data content to a base64-encoded string.\n\n@param content - Data content to convert.\n@returns Base64-encoded string.\n*/\nexport function convertDataContentToBase64String(content: DataContent): string {\n if (typeof content === 'string') {\n return content;\n }\n\n if (content instanceof ArrayBuffer) {\n return convertUint8ArrayToBase64(new Uint8Array(content));\n }\n\n return convertUint8ArrayToBase64(content);\n}\n","/**\n * Fetches a URL with retry logic\n * @param url The URL to fetch\n * @param options Fetch options\n * @param maxRetries Maximum number of retry attempts\n * @returns The fetch Response if successful\n */\nexport async function fetchWithRetry(\n url: string,\n options: RequestInit = {},\n maxRetries: number = 3,\n): Promise<Response> {\n let retryCount = 0;\n let lastError: Error | null = null;\n\n while (retryCount < maxRetries) {\n try {\n const response = await fetch(url, options);\n\n if (!response.ok) {\n // Only retry on server errors (5xx) or network failures\n // Don't retry on client errors (4xx)\n if (response.status >= 400 && response.status < 500) {\n throw new Error(`Request failed with status: ${response.status} ${response.statusText}`);\n }\n\n lastError = new Error(`Request failed with status: ${response.status} ${response.statusText}`);\n retryCount++;\n\n if (retryCount >= maxRetries) {\n throw lastError;\n }\n\n const delay = Math.min(1000 * Math.pow(2, retryCount), 10000);\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n return response;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // If it's a client error (4xx), don't retry\n if (lastError.message.includes('status: 4')) {\n throw lastError;\n }\n\n retryCount++;\n\n if (retryCount >= maxRetries) {\n break;\n }\n\n const delay = Math.min(1000 * Math.pow(2, retryCount), 10000);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n\n throw lastError || new Error('Request failed after multiple retry attempts');\n}\n","import { isUrlSupported } from '@ai-sdk/provider-utils-v5';\nimport { ErrorCategory, ErrorDomain, MastraError } from '../../../error';\nimport { fetchWithRetry } from '../../../utils/fetchWithRetry';\nimport type { AIV5Type } from '../types';\n\nexport const downloadFromUrl = async ({ url, downloadRetries }: { url: URL; downloadRetries: number }) => {\n const urlText = url.toString();\n\n try {\n const response = await fetchWithRetry(\n urlText,\n {\n method: 'GET',\n },\n downloadRetries,\n );\n\n if (!response.ok) {\n throw new MastraError({\n id: 'DOWNLOAD_ASSETS_FAILED',\n text: 'Failed to download asset',\n domain: ErrorDomain.LLM,\n category: ErrorCategory.USER,\n });\n }\n return {\n data: new Uint8Array(await response.arrayBuffer()),\n mediaType: response.headers.get('content-type') ?? undefined,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'DOWNLOAD_ASSETS_FAILED',\n text: 'Failed to download asset',\n domain: ErrorDomain.LLM,\n category: ErrorCategory.USER,\n },\n error,\n );\n }\n};\n\nexport async function downloadAssetsFromMessages({\n messages,\n downloadConcurrency = 10,\n downloadRetries = 3,\n supportedUrls,\n}: {\n messages: AIV5Type.ModelMessage[];\n downloadConcurrency?: number;\n downloadRetries?: number;\n supportedUrls?: Record<string, RegExp[]>;\n}) {\n const pMap = (await import('p-map')).default;\n\n const filesToDownload = messages\n .filter(message => message.role === 'user')\n .map(message => message.content)\n .filter(content => Array.isArray(content))\n .flat()\n .filter(part => part.type === 'image' || part.type === 'file')\n .map(part => {\n const mediaType = part.mediaType ?? (part.type === 'image' ? 'image/*' : undefined);\n\n let data = part.type === 'image' ? part.image : part.data;\n if (typeof data === 'string') {\n try {\n data = new URL(data);\n } catch {}\n }\n\n return { mediaType, data };\n })\n\n .filter((part): part is { mediaType: string | undefined; data: URL } => part.data instanceof URL)\n .map(part => ({\n url: part.data,\n isUrlSupportedByModel:\n part.mediaType != null &&\n isUrlSupported({\n url: part.data.toString(),\n mediaType: part.mediaType,\n supportedUrls: supportedUrls ?? {},\n }),\n }));\n\n const downloadedFiles = await pMap(\n filesToDownload,\n async fileItem => {\n if (!fileItem.isUrlSupportedByModel) {\n return null;\n }\n return {\n url: fileItem.url.toString(),\n ...(await downloadFromUrl({ url: fileItem.url, downloadRetries })),\n };\n },\n {\n concurrency: downloadConcurrency,\n },\n );\n\n const downloadFileList = downloadedFiles\n .filter(\n (\n downloadedFile,\n ): downloadedFile is {\n url: string;\n mediaType: string | undefined;\n data: Uint8Array<ArrayBuffer>;\n } => downloadedFile?.data != null,\n )\n .map(({ url, data, mediaType }) => [url, { data, mediaType }]);\n\n return Object.fromEntries(downloadFileList);\n}\n","import { convertDataContentToBase64String } from './data-content';\n\n/**\n * Image content can be a string (URL or data URI), a URL object, or binary data\n */\nexport type ImageContent = string | URL | Uint8Array | ArrayBuffer | Buffer;\n\n/**\n * Represents the parsed components of a data URI\n */\nexport interface DataUriParts {\n mimeType?: string;\n base64Content: string;\n isDataUri: boolean;\n}\n\n/**\n * Parses a data URI string into its components.\n * Format: data:[<mediatype>][;base64],<data>\n *\n * @param dataUri - The data URI string to parse\n * @returns Parsed components including MIME type and base64 content\n */\nexport function parseDataUri(dataUri: string): DataUriParts {\n if (!dataUri.startsWith('data:')) {\n return {\n isDataUri: false,\n base64Content: dataUri,\n };\n }\n\n const base64Index = dataUri.indexOf(',');\n if (base64Index === -1) {\n // Malformed data URI, return as-is\n return {\n isDataUri: true,\n base64Content: dataUri,\n };\n }\n\n const header = dataUri.substring(5, base64Index); // Skip 'data:' prefix\n const base64Content = dataUri.substring(base64Index + 1);\n\n // Extract MIME type from header (before ';base64' or ';')\n const semicolonIndex = header.indexOf(';');\n const mimeType = semicolonIndex !== -1 ? header.substring(0, semicolonIndex) : header;\n\n return {\n isDataUri: true,\n mimeType: mimeType || undefined,\n base64Content,\n };\n}\n\n/**\n * Creates a data URI from base64 content and MIME type.\n *\n * @param base64Content - The base64 encoded content\n * @param mimeType - The MIME type (defaults to 'application/octet-stream')\n * @returns A properly formatted data URI\n */\nexport function createDataUri(base64Content: string, mimeType: string = 'application/octet-stream'): string {\n // If it's already a data URI, return as-is\n if (base64Content.startsWith('data:')) {\n return base64Content;\n }\n return `data:${mimeType};base64,${base64Content}`;\n}\n\n/**\n * Converts various image data formats to a string representation.\n * - Strings are returned as-is (could be URLs or data URIs)\n * - URL objects are converted to strings\n * - Binary data (Uint8Array, ArrayBuffer, Buffer) is converted to base64\n *\n * @param image - The image data in various formats\n * @param fallbackMimeType - MIME type to use when creating data URIs from binary data\n * @returns String representation of the image (URL, data URI, or base64)\n */\nexport function imageContentToString(image: ImageContent, fallbackMimeType?: string): string {\n if (typeof image === 'string') {\n return image;\n }\n\n if (image instanceof URL) {\n return image.toString();\n }\n\n if (image instanceof Uint8Array || image instanceof ArrayBuffer || (globalThis.Buffer && Buffer.isBuffer(image))) {\n // Convert binary data to base64\n const base64 = convertDataContentToBase64String(image);\n // If it's not already a data URI, create one\n if (fallbackMimeType && !base64.startsWith('data:')) {\n return `data:${fallbackMimeType};base64,${base64}`;\n }\n return base64;\n }\n\n // Fallback for unknown types - try to convert to string\n return String(image);\n}\n\n/**\n * Converts various image data formats to a data URI string.\n *\n * @param image - The image data in various formats\n * @param mimeType - MIME type for the data URI (defaults to 'image/png')\n * @returns Data URI string\n */\nexport function imageContentToDataUri(image: ImageContent, mimeType: string = 'image/png'): string {\n const imageStr = imageContentToString(image, mimeType);\n\n // If it's already a data URI, return as-is\n if (imageStr.startsWith('data:')) {\n return imageStr;\n }\n\n // If it's an HTTP(S) URL, return as-is (can't convert to data URI)\n if (imageStr.startsWith('http://') || imageStr.startsWith('https://')) {\n return imageStr;\n }\n\n // Otherwise, assume it's base64 and create a data URI\n return `data:${mimeType};base64,${imageStr}`;\n}\n\n/**\n * Gets a stable cache key component for image content.\n * Used for generating hash keys for caching purposes.\n *\n * @param image - The image data in various formats\n * @returns A string or number suitable for cache key generation\n */\nexport function getImageCacheKey(image: ImageContent): string | number {\n if (image instanceof URL) {\n return image.toString();\n }\n\n if (typeof image === 'string') {\n return image.length;\n }\n\n if (image instanceof Uint8Array) {\n return image.byteLength;\n }\n\n if (image instanceof ArrayBuffer) {\n return image.byteLength;\n }\n\n return image;\n}\n\n/**\n * Checks if a string is a valid URL (including protocol-relative URLs).\n *\n * @param str - The string to check\n * @returns true if the string is a valid URL\n */\nexport function isValidUrl(str: string): boolean {\n try {\n new URL(str);\n return true;\n } catch {\n // Try as protocol-relative URL\n if (str.startsWith('//')) {\n try {\n new URL(`https:${str}`);\n return true;\n } catch {\n return false;\n }\n }\n return false;\n }\n}\n\n/**\n * Categorizes a string as a URL, data URI, or raw data (base64/other).\n * Also extracts MIME type from data URIs when present.\n *\n * @param data - The string data to categorize\n * @param fallbackMimeType - Optional fallback MIME type\n * @returns Categorized data with type and extracted MIME type\n */\nexport function categorizeFileData(\n data: string,\n fallbackMimeType?: string,\n): {\n type: 'url' | 'dataUri' | 'raw';\n mimeType?: string;\n data: string;\n} {\n // Parse as data URI first to extract MIME type\n const parsed = parseDataUri(data);\n const mimeType = parsed.isDataUri && parsed.mimeType ? parsed.mimeType : fallbackMimeType;\n\n // Check if it's a data URI\n if (parsed.isDataUri) {\n return {\n type: 'dataUri',\n mimeType,\n data,\n };\n }\n\n // Check if it's a URL\n if (isValidUrl(data)) {\n return {\n type: 'url',\n mimeType,\n data,\n };\n }\n\n // Otherwise it's raw data (likely base64 or other string data)\n return {\n type: 'raw',\n mimeType,\n data,\n };\n}\n\n/**\n * Classifies a string as a URL, data URI, or raw data.\n *\n * @param data - The string to classify\n * @returns Object with classification and extracted metadata\n */\nexport function classifyFileData(data: string): {\n type: 'url' | 'dataUri' | 'base64' | 'other';\n mimeType?: string;\n} {\n // Check if it's a data URI\n const parsed = parseDataUri(data);\n if (parsed.isDataUri) {\n return {\n type: 'dataUri',\n mimeType: parsed.mimeType,\n };\n }\n\n // Check if it's a URL\n if (isValidUrl(data)) {\n return { type: 'url' };\n }\n\n // Check if it looks like base64 (simple heuristic)\n if (/^[A-Za-z0-9+/\\-_]+=*$/.test(data) && data.length > 20) {\n return { type: 'base64' };\n }\n\n return { type: 'other' };\n}\n","import type { CoreMessage } from '@internal/ai-sdk-v4';\nimport type { ModelMessage } from 'ai-v5';\nimport { ErrorCategory, ErrorDomain, MastraError } from '../../../../error';\n\ntype GeminiCompatibleMessage = ModelMessage | CoreMessage;\n\n/**\n * Ensures message array is compatible with Gemini API requirements.\n *\n * Gemini requires that the first non-system message must be from the user role.\n * This fixes \"single turn requests\" errors where messages start with assistant\n * or contain only system messages.\n *\n * This function modifies the messages array by inserting a placeholder user\n * message when needed to satisfy this requirement.\n *\n * @param messages - Array of model messages to validate and fix\n * @returns Modified messages array that satisfies Gemini requirements\n *\n * @see https://github.com/mastra-ai/mastra/issues/7287 - Tool call ordering\n * @see https://github.com/mastra-ai/mastra/issues/8053 - Single turn validation\n */\nexport function ensureGeminiCompatibleMessages<T extends GeminiCompatibleMessage>(messages: T[]): T[] {\n const result = [...messages];\n\n // Ensure first non-system message is user\n const firstNonSystemIndex = result.findIndex(m => m.role !== 'system');\n if (firstNonSystemIndex === -1) {\n // Only system messages or empty - this is an error condition\n throw new MastraError({\n id: 'NO_USER_OR_ASSISTANT_MESSAGES',\n domain: ErrorDomain.AGENT,\n category: ErrorCategory.USER,\n text: 'This request does not contain any user or assistant messages. At least one user or assistant message is required to generate a response.',\n });\n } else if (result[firstNonSystemIndex]?.role === 'assistant') {\n // First non-system is assistant, insert user message before it\n result.splice(firstNonSystemIndex, 0, {\n role: 'user',\n content: '.',\n } as T);\n }\n\n return result;\n}\n","/**\n * Helper functions for AI SDK v5 compatibility\n */\n\n/**\n * Extract tool name from AI SDK v5 tool type string\n *\n * V5 format: \"tool-${toolName}\" or \"dynamic-tool\"\n * V4 format: \"tool-invocation\"\n *\n * @param type - The tool type string from AI SDK v5\n * @returns The tool name or 'dynamic-tool' if it's a dynamic tool\n */\nexport function getToolName(type: string | { type: string }): string {\n // Handle objects with type property\n if (typeof type === 'object' && type && 'type' in type) {\n type = type.type;\n }\n\n // Ensure type is a string\n if (typeof type !== 'string') {\n return 'unknown';\n }\n\n if (type === 'dynamic-tool') {\n return 'dynamic-tool';\n }\n\n // Extract tool name from \"tool-${toolName}\" format\n if (type.startsWith('tool-')) {\n return type.slice('tool-'.length); // Remove \"tool-\" prefix\n }\n\n // Fallback for unexpected formats\n return type;\n}\n","import type * as AIV4 from '@internal/ai-sdk-v4';\nimport type * as AIV5 from 'ai-v5';\n\nimport type { MastraDBMessage, UIMessageWithMetadata, MessageListInput } from '../index';\n\nimport { MessageList } from '../index';\n\n/**\n * Available output formats for message conversion.\n *\n * @remarks\n * - `Mastra.V2` - Current database storage format, compatible with AI SDK v4\n * - `AIV4.UI` - AI SDK v4 UIMessage format (for frontend components)\n * - `AIV4.Core` - AI SDK v4 CoreMessage format (for LLM API calls)\n * - `AIV5.UI` - AI SDK v5 UIMessage format (for frontend components)\n * - `AIV5.Model` - AI SDK v5 ModelMessage format (for LLM API calls)\n */\nexport type OutputFormat = 'Mastra.V2' | 'AIV4.UI' | 'AIV4.Core' | 'AIV5.UI' | 'AIV5.Model';\n\nclass MessageConverter {\n private messageList: MessageList;\n\n constructor(messages: MessageListInput) {\n this.messageList = new MessageList();\n // Use 'memory' source to preserve messages exactly as provided\n // without any transformations or combinations\n this.messageList.add(messages, 'memory');\n }\n\n /**\n * Convert messages to Mastra V2 format (current database format).\n * @param format - The format 'Mastra.V2'\n * @returns Array of messages in Mastra V2 format, used for database storage\n */\n to(format: 'Mastra.V2'): MastraDBMessage[];\n /**\n * Convert messages to AI SDK v4 UIMessage format.\n * @param format - The format 'AIV4.UI'\n * @returns Array of UIMessages for use with AI SDK v4 frontend components\n */\n to(format: 'AIV4.UI'): UIMessageWithMetadata[] | AIV4.UIMessage[];\n /**\n * Convert messages to AI SDK v4 CoreMessage format.\n * @param format - The format 'AIV4.Core'\n * @returns Array of CoreMessages for AI SDK v4 LLM API calls\n */\n to(format: 'AIV4.Core'): AIV4.CoreMessage[];\n /**\n * Convert messages to AI SDK v5 UIMessage format.\n * @param format - The format 'AIV5.UI'\n * @returns Array of UIMessages for use with AI SDK v5 frontend components\n */\n to(format: 'AIV5.UI'): AIV5.UIMessage[];\n /**\n * Convert messages to AI SDK v5 ModelMessage format.\n * @param format - The format 'AIV5.Model'\n * @returns Array of ModelMessages for AI SDK v5 LLM API calls\n */\n to(format: 'AIV5.Model'): AIV5.ModelMessage[];\n to(format: OutputFormat): unknown[] {\n switch (format) {\n // Old format keys (backward compatibility)\n case 'Mastra.V2':\n return this.messageList.get.all.db();\n case 'AIV4.UI':\n return this.messageList.get.all.aiV4.ui();\n case 'AIV4.Core':\n return this.messageList.get.all.aiV4.core();\n case 'AIV5.UI':\n return this.messageList.get.all.aiV5.ui();\n case 'AIV5.Model':\n return this.messageList.get.all.aiV5.model();\n default:\n throw new Error(`Unsupported output format: ${format}`);\n }\n }\n}\n\n/**\n * Convert messages from any supported format to another format.\n *\n * @param messages - Input messages in any supported format. Accepts:\n * - AI SDK v4 formats: UIMessage, CoreMessage, Message\n * - AI SDK v5 formats: UIMessage, ModelMessage\n * - Mastra formats: MastraMessageV1 (input only), MastraDBMessage\n * - Simple strings (will be converted to user messages)\n * - Arrays of any of the above\n *\n * @returns A converter object with a `.to()` method to specify the output format\n *\n * @example\n * ```typescript\n * import { convertMessages } from '@mastra/core/agent';\n *\n * // Convert AI SDK v5 UI messages to v4 Core messages\n * const v4CoreMessages = convertMessages(v5UIMessages).to('AIV4.Core');\n *\n * // Convert database messages (Mastra V2) to AI SDK v5 UI messages for frontend\n * const v5UIMessages = convertMessages(dbMessages).to('AIV5.UI');\n *\n * // Convert any format to Mastra's V2 format for database storage\n * const mastraV2Messages = convertMessages(anyMessages).to('Mastra.V2');\n *\n * // Convert simple strings to formatted messages\n * const messages = convertMessages(['Hello', 'How are you?']).to('AIV5.UI');\n *\n * // Convert v4 UI messages to v5 Model messages for LLM calls\n * const modelMessages = convertMessages(v4UIMessages).to('AIV5.Model');\n * ```\n *\n * @remarks\n * This utility handles all message format conversions internally, including:\n * - Tool invocations and results\n * - File attachments\n * - Multi-part messages\n * - System messages\n * - Metadata preservation where possible\n */\nexport function convertMessages(messages: MessageListInput): MessageConverter {\n return new MessageConverter(messages);\n}\n","import type { LanguageModelV2Prompt } from '@ai-sdk/provider-v5';\nimport type { ToolInvocationUIPart } from '@ai-sdk/ui-utils-v5';\nimport { convertToCoreMessages as convertToCoreMessagesV4 } from '@internal/ai-sdk-v4';\nimport type {\n LanguageModelV1Message,\n IdGenerator,\n LanguageModelV1Prompt,\n CoreMessage as CoreMessageV4,\n UIMessage as UIMessageV4,\n ToolInvocation as ToolInvocationV4,\n} from '@internal/ai-sdk-v4';\nimport type * as AIV4Type from '@internal/ai-sdk-v4';\nimport { v4 as randomUUID } from '@lukeed/uuid';\nimport * as AIV5 from 'ai-v5';\n\nimport { MastraError, ErrorDomain, ErrorCategory } from '../../error';\nimport { DefaultGeneratedFileWithType } from '../../stream/aisdk/v5/file';\nimport { convertImageFilePart } from './prompt/convert-file';\nimport { convertToV1Messages } from './prompt/convert-to-mastra-v1';\nimport { convertDataContentToBase64String } from './prompt/data-content';\nimport { downloadAssetsFromMessages } from './prompt/download-assets';\nimport {\n categorizeFileData,\n createDataUri,\n getImageCacheKey,\n imageContentToString,\n parseDataUri,\n} from './prompt/image-utils';\nimport type { AIV5Type } from './types';\nimport { ensureGeminiCompatibleMessages } from './utils/ai-v5/gemini-compatibility';\nimport { getToolName } from './utils/ai-v5/tool';\n\ntype AIV5LanguageModelV2Message = LanguageModelV2Prompt[0];\nexport type AIV5ResponseMessage = AIV5Type.AssistantModelMessage | AIV5Type.ToolModelMessage;\n\ntype MastraMessageShared = {\n id: string;\n role: 'user' | 'assistant' | 'system';\n createdAt: Date;\n threadId?: string;\n resourceId?: string;\n type?: string;\n};\n\nexport type MastraMessageContentV2 = {\n format: 2; // format 2 === UIMessage in AI SDK v4\n parts: (UIMessageV4['parts'][number] & { providerMetadata?: AIV5Type.ProviderMetadata })[]; // add optional prov meta for AIV5 - v4 doesn't track this, and we're storing mmv2 in the db, so we need to extend\n experimental_attachments?: UIMessageV4['experimental_attachments'];\n content?: UIMessageV4['content'];\n toolInvocations?: UIMessageV4['toolInvocations'];\n reasoning?: UIMessageV4['reasoning'];\n annotations?: UIMessageV4['annotations'];\n metadata?: Record<string, unknown>;\n};\n\n// maps to AI SDK V4 UIMessage\nexport type MastraDBMessage = MastraMessageShared & {\n content: MastraMessageContentV2;\n};\n\n// maps to AI SDK V5 UIMessage\nexport type MastraMessageV1 = {\n id: string;\n content: string | CoreMessageV4['content'];\n role: 'system' | 'user' | 'assistant' | 'tool';\n createdAt: Date;\n threadId?: string;\n resourceId?: string;\n toolCallIds?: string[];\n toolCallArgs?: Record<string, unknown>[];\n toolNames?: string[];\n type: 'text' | 'tool-call' | 'tool-result';\n};\n\n// Extend UIMessage to include optional metadata field\nexport type UIMessageWithMetadata = UIMessageV4 & {\n metadata?: Record<string, unknown>;\n};\n\nexport type MessageInput =\n | AIV5Type.UIMessage\n | AIV5Type.ModelMessage\n | UIMessageWithMetadata\n | AIV4Type.Message\n | CoreMessageV4 // v4 CoreMessage support\n // db messages in various formats\n | MastraMessageV1\n | MastraDBMessage; // <- this is how we currently store in the DB\n\nexport { convertMessages } from './utils/convert-messages';\nexport type { OutputFormat } from './utils/convert-messages';\n\ntype MessageSource =\n | 'memory'\n | 'response'\n | 'input'\n | 'system'\n | 'context'\n /* @deprecated use input instead. \"user\" was a confusing source type because the user can send messages that don't have role: \"user\" */\n | 'user';\n\ntype MemoryInfo = { threadId: string; resourceId?: string };\n\nexport type MessageListInput = string | string[] | MessageInput | MessageInput[];\n\nexport class MessageList {\n private messages: MastraDBMessage[] = [];\n\n // passed in by dev in input or context\n private systemMessages: AIV4Type.CoreSystemMessage[] = [];\n // passed in by us for a specific purpose, eg memory system message\n private taggedSystemMessages: Record<string, AIV4Type.CoreSystemMessage[]> = {};\n\n private memoryInfo: null | MemoryInfo = null;\n\n // used to filter this.messages by how it was added: input/response/memory\n private memoryMessages = new Set<MastraDBMessage>();\n private newUserMessages = new Set<MastraDBMessage>();\n private newResponseMessages = new Set<MastraDBMessage>();\n private userContextMessages = new Set<MastraDBMessage>();\n\n private memoryMessagesPersisted = new Set<MastraDBMessage>();\n private newUserMessagesPersisted = new Set<MastraDBMessage>();\n private newResponseMessagesPersisted = new Set<MastraDBMessage>();\n private userContextMessagesPersisted = new Set<MastraDBMessage>();\n\n private generateMessageId?: IdGenerator;\n private _agentNetworkAppend = false;\n\n constructor({\n threadId,\n resourceId,\n generateMessageId,\n // @ts-ignore Flag for agent network messages\n _agentNetworkAppend,\n }: { threadId?: string; resourceId?: string; generateMessageId?: AIV4Type.IdGenerator } = {}) {\n if (threadId) {\n this.memoryInfo = { threadId, resourceId };\n }\n this.generateMessageId = generateMessageId;\n this._agentNetworkAppend = _agentNetworkAppend || false;\n }\n\n public add(messages: MessageListInput, messageSource: MessageSource) {\n if (messageSource === `user`) messageSource = `input`;\n\n if (!messages) return this;\n for (const message of Array.isArray(messages) ? messages : [messages]) {\n this.addOne(\n typeof message === `string`\n ? {\n role: 'user',\n content: message,\n }\n : message,\n messageSource,\n );\n }\n return this;\n }\n\n private serializeSet(set: Set<MastraDBMessage>) {\n return Array.from(set).map(value => value.id);\n }\n\n private deserializeSet(ids: string[]) {\n return new Set(ids.map(id => this.messages.find(m => m.id === id)).filter(Boolean) as MastraDBMessage[]);\n }\n\n private serializeMessage(message: MastraDBMessage) {\n return {\n ...message,\n createdAt: message.createdAt.toUTCString(),\n };\n }\n\n private deserializeMessage(state: ReturnType<typeof this.serializeMessage>) {\n return {\n ...state,\n createdAt: new Date(state.createdAt),\n } as MastraDBMessage;\n }\n\n public serialize() {\n return {\n messages: this.messages.map(this.serializeMessage),\n systemMessages: this.systemMessages,\n taggedSystemMessages: this.taggedSystemMessages,\n memoryInfo: this.memoryInfo,\n _agentNetworkAppend: this._agentNetworkAppend,\n memoryMessages: this.serializeSet(this.memoryMessages),\n newUserMessages: this.serializeSet(this.newUserMessages),\n newResponseMessages: this.serializeSet(this.newResponseMessages),\n userContextMessages: this.serializeSet(this.userContextMessages),\n memoryMessagesPersisted: this.serializeSet(this.memoryMessagesPersisted),\n newUserMessagesPersisted: this.serializeSet(this.newUserMessagesPersisted),\n newResponseMessagesPersisted: this.serializeSet(this.newResponseMessagesPersisted),\n userContextMessagesPersisted: this.serializeSet(this.userContextMessagesPersisted),\n };\n }\n\n public deserialize(state: ReturnType<typeof this.serialize>) {\n this.messages = state.messages.map(this.deserializeMessage);\n this.systemMessages = state.systemMessages;\n this.taggedSystemMessages = state.taggedSystemMessages;\n this.memoryInfo = state.memoryInfo;\n this._agentNetworkAppend = state._agentNetworkAppend;\n this.memoryMessages = this.deserializeSet(state.memoryMessages);\n this.newUserMessages = this.deserializeSet(state.newUserMessages);\n this.newResponseMessages = this.deserializeSet(state.newResponseMessages);\n this.userContextMessages = this.deserializeSet(state.userContextMessages);\n this.memoryMessagesPersisted = this.deserializeSet(state.memoryMessagesPersisted);\n this.newUserMessagesPersisted = this.deserializeSet(state.newUserMessagesPersisted);\n this.newResponseMessagesPersisted = this.deserializeSet(state.newResponseMessagesPersisted);\n this.userContextMessagesPersisted = this.deserializeSet(state.userContextMessagesPersisted);\n\n return this;\n }\n\n public getLatestUserContent(): string | null {\n const currentUserMessages = this.all.core().filter(m => m.role === 'user');\n const content = currentUserMessages.at(-1)?.content;\n if (!content) return null;\n return MessageList.coreContentToString(content);\n }\n\n public get get() {\n return {\n all: this.all,\n remembered: this.remembered,\n input: this.input,\n response: this.response,\n };\n }\n public get getPersisted() {\n return {\n remembered: this.rememberedPersisted,\n input: this.inputPersisted,\n taggedSystemMessages: this.taggedSystemMessages,\n response: this.responsePersisted,\n };\n }\n\n public get clear() {\n return {\n input: {\n db: (): MastraDBMessage[] => {\n const userMessages = Array.from(this.newUserMessages);\n this.messages = this.messages.filter(m => !this.newUserMessages.has(m));\n this.newUserMessages.clear();\n return userMessages;\n },\n },\n response: {\n db: () => {\n const responseMessages = Array.from(this.newResponseMessages);\n this.messages = this.messages.filter(m => !this.newResponseMessages.has(m));\n this.newResponseMessages.clear();\n return responseMessages;\n },\n },\n };\n }\n\n private all = {\n db: (): MastraDBMessage[] => this.messages,\n v1: (): MastraMessageV1[] => convertToV1Messages(this.all.db()),\n\n aiV5: {\n model: (): AIV5Type.ModelMessage[] => this.aiV5UIMessagesToAIV5ModelMessages(this.all.aiV5.ui()),\n ui: (): AIV5Type.UIMessage[] => this.all.db().map(MessageList.mastraDBMessageToAIV5UIMessage),\n\n // Used when calling AI SDK streamText/generateText\n prompt: (): AIV5Type.ModelMessage[] => {\n const systemMessages = this.aiV4CoreMessagesToAIV5ModelMessages(\n [...this.systemMessages, ...Object.values(this.taggedSystemMessages).flat()],\n `system`,\n );\n // Filter incomplete tool calls when sending messages TO the LLM\n const modelMessages = this.aiV5UIMessagesToAIV5ModelMessages(this.all.aiV5.ui(), true);\n\n const messages = [...systemMessages, ...modelMessages];\n\n return ensureGeminiCompatibleMessages(messages);\n },\n\n // Used for creating LLM prompt messages without AI SDK streamText/generateText\n llmPrompt: async (\n options: {\n downloadConcurrency?: number;\n downloadRetries?: number;\n supportedUrls?: Record<string, RegExp[]>;\n } = {\n downloadConcurrency: 10,\n downloadRetries: 3,\n },\n ): Promise<LanguageModelV2Prompt> => {\n // Filter incomplete tool calls when sending messages TO the LLM\n const modelMessages = this.aiV5UIMessagesToAIV5ModelMessages(this.all.aiV5.ui(), true);\n const systemMessages = this.aiV4CoreMessagesToAIV5ModelMessages(\n [...this.systemMessages, ...Object.values(this.taggedSystemMessages).flat()],\n `system`,\n );\n\n const downloadedAssets = await downloadAssetsFromMessages({\n messages: modelMessages,\n downloadConcurrency: options?.downloadConcurrency,\n downloadRetries: options?.downloadRetries,\n supportedUrls: options?.supportedUrls,\n });\n\n let messages = [...systemMessages, ...modelMessages];\n\n if (Object.keys(downloadedAssets || {}).length > 0) {\n messages = messages.map(message => {\n if (message.role === 'user') {\n if (typeof message.content === 'string') {\n return {\n role: 'user' as const,\n content: [{ type: 'text' as const, text: message.content }],\n providerOptions: message.providerOptions,\n } as AIV5Type.ModelMessage;\n }\n\n const convertedContent = message.content\n .map(part => {\n if (part.type === 'image' || part.type === 'file') {\n return convertImageFilePart(part, downloadedAssets);\n }\n return part;\n })\n .filter(part => part.type !== 'text' || part.text !== '');\n\n return {\n role: 'user' as const,\n content: convertedContent,\n providerOptions: message.providerOptions,\n } as AIV5Type.ModelMessage;\n }\n\n return message;\n });\n }\n\n messages = ensureGeminiCompatibleMessages(messages);\n\n return messages.map(MessageList.aiV5ModelMessageToV2PromptMessage);\n },\n },\n\n /* @deprecated use list.get.all.aiV4.prompt() instead */\n prompt: () => this.all.aiV4.prompt(),\n /* @deprecated use list.get.all.aiV4.ui() */\n ui: (): UIMessageWithMetadata[] => this.all.db().map(MessageList.mastraDBMessageToAIV4UIMessage),\n /* @deprecated use list.get.all.aiV4.core() */\n core: (): CoreMessageV4[] => this.aiV4UIMessagesToAIV4CoreMessages(this.all.aiV4.ui()),\n aiV4: {\n ui: (): UIMessageWithMetadata[] => this.all.db().map(MessageList.mastraDBMessageToAIV4UIMessage),\n core: (): CoreMessageV4[] => this.aiV4UIMessagesToAIV4CoreMessages(this.all.aiV4.ui()),\n\n // Used when calling AI SDK streamText/generateText\n prompt: () => {\n const coreMessages = this.all.aiV4.core();\n const messages = [...this.systemMessages, ...Object.values(this.taggedSystemMessages).flat(), ...coreMessages];\n\n return ensureGeminiCompatibleMessages(messages);\n },\n\n // Used for creating LLM prompt messages without AI SDK streamText/generateText\n llmPrompt: (): LanguageModelV1Prompt => {\n const coreMessages = this.all.aiV4.core();\n\n const systemMessages = [...this.systemMessages, ...Object.values(this.taggedSystemMessages).flat()];\n let messages = [...systemMessages, ...coreMessages];\n\n messages = ensureGeminiCompatibleMessages(messages);\n\n return messages.map(MessageList.aiV4CoreMessageToV1PromptMessage);\n },\n },\n };\n\n private remembered = {\n db: () => this.messages.filter(m => this.memoryMessages.has(m)),\n v1: () => convertToV1Messages(this.remembered.db()),\n\n aiV5: {\n model: () => this.aiV5UIMessagesToAIV5ModelMessages(this.remembered.aiV5.ui()),\n ui: (): AIV5Type.UIMessage[] => this.remembered.db().map(MessageList.mastraDBMessageToAIV5UIMessage),\n },\n\n /* @deprecated use list.get.remembered.aiV4.ui() */\n ui: (): UIMessageWithMetadata[] => this.remembered.db().map(MessageList.mastraDBMessageToAIV4UIMessage),\n /* @deprecated use list.get.remembered.aiV4.core() */\n core: (): CoreMessageV4[] => this.aiV4UIMessagesToAIV4CoreMessages(this.all.aiV4.ui()),\n aiV4: {\n ui: (): UIMessageWithMetadata[] => this.remembered.db().map(MessageList.mastraDBMessageToAIV4UIMessage),\n core: (): CoreMessageV4[] => this.aiV4UIMessagesToAIV4CoreMessages(this.all.aiV4.ui()),\n },\n };\n // TODO: need to update this for new .aiV4/5.x() pattern\n private rememberedPersisted = {\n db: () => this.all.db().filter(m => this.memoryMessagesPersisted.has(m)),\n v1: () => convertToV1Messages(this.rememberedPersisted.db()),\n ui: () => this.rememberedPersisted.db().map(MessageList.mastraDBMessageToAIV4UIMessage),\n core: () => this.aiV4UIMessagesToAIV4CoreMessages(this.rememberedPersisted.ui()),\n };\n\n private input = {\n db: () => this.messages.filter(m => this.newUserMessages.has(m)),\n v1: () => convertToV1Messages(this.input.db()),\n\n aiV5: {\n model: () => this.aiV5UIMessagesToAIV5ModelMessages(this.input.aiV5.ui()),\n ui: (): AIV5Type.UIMessage[] => this.input.db().map(MessageList.mastraDBMessageToAIV5UIMessage),\n },\n\n /* @deprecated use list.get.input.aiV4.ui() instead */\n ui: () => this.input.db().map(MessageList.mastraDBMessageToAIV4UIMessage),\n /* @deprecated use list.get.core.aiV4.ui() instead */\n core: () => this.aiV4UIMessagesToAIV4CoreMessages(this.input.ui()),\n aiV4: {\n ui: (): UIMessageWithMetadata[] => this.input.db().map(MessageList.mastraDBMessageToAIV4UIMessage),\n core: (): CoreMessageV4[] => this.aiV4UIMessagesToAIV4CoreMessages(this.input.aiV4.ui()),\n },\n };\n // TODO: need to update this for new .aiV4/5.x() pattern\n private inputPersisted = {\n db: (): MastraDBMessage[] => this.messages.filter(m => this.newUserMessagesPersisted.has(m)),\n v1: (): MastraMessageV1[] => convertToV1Messages(this.inputPersisted.db()),\n ui: (): UIMessageWithMetadata[] => this.inputPersisted.db().map(MessageList.mastraDBMessageToAIV4UIMessage),\n core: () => this.aiV4UIMessagesToAIV4CoreMessages(this.inputPersisted.ui()),\n };\n\n private response = {\n db: (): MastraDBMessage[] => this.messages.filter(m => this.newResponseMessages.has(m)),\n v1: (): MastraMessageV1[] => convertToV1Messages(this.response.db()),\n\n aiV5: {\n ui: (): AIV5Type.UIMessage[] => this.response.db().map(MessageList.mastraDBMessageToAIV5UIMessage),\n model: (): AIV5ResponseMessage[] =>\n this.aiV5UIMessagesToAIV5ModelMessages(this.response.aiV5.ui()).filter(\n m => m.role === `tool` || m.role === `assistant`,\n ),\n modelContent: (stepNumber?: number): AIV5Type.StepResult<any>['content'] => {\n if (typeof stepNumber === 'number') {\n const uiMessages = this.response.aiV5.ui();\n const uiMessagesParts = uiMessages.flatMap(item => item.parts);\n\n // Find step boundaries by looking for step-start markers\n const stepBoundaries: number[] = [];\n uiMessagesParts.forEach((part, index) => {\n if (part.type === 'step-start') {\n stepBoundaries.push(index);\n }\n });\n\n // Handle -1 to get the last step (the current/most recent step)\n if (stepNumber === -1) {\n // For tool-only steps without step-start markers, we need different logic\n // Each tool part represents a complete step (tool call + result)\n const toolParts = uiMessagesParts.filter(p => p.type?.startsWith('tool-'));\n const hasStepStart = stepBoundaries.length > 0;\n\n if (!hasStepStart && toolParts.length > 0) {\n // No step-start markers but we have tool parts\n // Each tool part is a separate step, so return only the last tool\n const lastToolPart = toolParts[toolParts.length - 1];\n if (!lastToolPart) {\n return [];\n }\n const lastToolIndex = uiMessagesParts.indexOf(lastToolPart);\n const previousToolPart = toolParts[toolParts.length - 2];\n const previousToolIndex = previousToolPart ? uiMessagesParts.indexOf(previousToolPart) : -1;\n\n const startIndex = previousToolIndex + 1;\n const stepParts = uiMessagesParts.slice(startIndex, lastToolIndex + 1);\n\n const stepUiMessages: AIV5Type.UIMessage[] = [\n {\n id: 'last-step',\n role: 'assistant',\n parts: stepParts,\n },\n ];\n const modelMessages = AIV5.convertToModelMessages(this.sanitizeV5UIMessages(stepUiMessages));\n return modelMessages.flatMap(this.response.aiV5.stepContent);\n }\n\n // Count total steps (1 + number of step-start markers)\n const totalSteps = stepBoundaries.length + 1;\n\n // Get the content for the last step using the regular step logic\n if (totalSteps === 1 && !hasStepStart) {\n // Only one step, return all content\n const stepUiMessages: AIV5Type.UIMessage[] = [\n {\n id: 'last-step',\n role: 'assistant',\n parts: uiMessagesParts,\n },\n ];\n const modelMessages = AIV5.convertToModelMessages(this.sanitizeV5UIMessages(stepUiMessages));\n return modelMessages.flatMap(this.response.aiV5.stepContent);\n }\n\n // Multiple steps - get content after the last step-start marker\n const lastStepStart = stepBoundaries[stepBoundaries.length - 1];\n if (lastStepStart === undefined) {\n return [];\n }\n const stepParts = uiMessagesParts.slice(lastStepStart + 1);\n\n if (stepParts.length === 0) {\n return [];\n }\n\n const stepUiMessages: AIV5Type.UIMessage[] = [\n {\n id: 'last-step',\n role: 'assistant',\n parts: stepParts,\n },\n ];\n\n const modelMessages = AIV5.convertToModelMessages(this.sanitizeV5UIMessages(stepUiMessages));\n return modelMessages.flatMap(this.response.aiV5.stepContent);\n }\n\n // Step 1 is everything before the first step-start\n if (stepNumber === 1) {\n const firstStepStart = stepBoundaries[0] ?? uiMessagesParts.length;\n if (firstStepStart === 0) {\n // No content before first step-start\n return [];\n }\n\n const stepParts = uiMessagesParts.slice(0, firstStepStart);\n const stepUiMessages: AIV5Type.UIMessage[] = [\n {\n id: 'step-1',\n role: 'assistant',\n parts: stepParts,\n },\n ];\n\n // Convert to model messages without adding extra step-start markers\n const modelMessages = AIV5.convertToModelMessages(this.sanitizeV5UIMessages(stepUiMessages));\n return modelMessages.flatMap(this.response.aiV5.stepContent);\n }\n\n // For steps 2+, content is between (stepNumber-1)th and stepNumber-th step-start markers\n const stepIndex = stepNumber - 2; // -2 because step 2 is at index 0 in boundaries\n if (stepIndex < 0 || stepIndex >= stepBoundaries.length) {\n return [];\n }\n\n const startIndex = (stepBoundaries[stepIndex] ?? 0) + 1; // Start after the step-start marker\n const endIndex = stepBoundaries[stepIndex + 1] ?? uiMessagesParts.length;\n\n if (startIndex >= endIndex) {\n return [];\n }\n\n const stepParts = uiMessagesParts.slice(startIndex, endIndex);\n const stepUiMessages: AIV5Type.UIMessage[] = [\n {\n id: `step-${stepNumber}`,\n role: 'assistant',\n parts: stepParts,\n },\n ];\n\n // Convert to model messages without adding extra step-start markers\n const modelMessages = AIV5.convertToModelMessages(this.sanitizeV5UIMessages(stepUiMessages));\n return modelMessages.flatMap(this.response.aiV5.stepContent);\n }\n\n return this.response.aiV5.model().map(this.response.aiV5.stepContent).flat();\n },\n stepContent: (message?: AIV5Type.ModelMessage): AIV5Type.StepResult<any>['content'] => {\n const latest = message ? message : this.response.aiV5.model().at(-1);\n if (!latest) return [];\n if (typeof latest.content === `string`) {\n return [{ type: 'text', text: latest.content }];\n }\n return latest.content.map(c => {\n if (c.type === `tool-result`)\n return {\n type: 'tool-result',\n input: {}, // TODO: we need to find the tool call here and add the input from it\n output: c.output,\n toolCallId: c.toolCallId,\n toolName: c.toolName,\n } satisfies AIV5Type.StaticToolResult<any>;\n if (c.type === `file`)\n return {\n type: 'file',\n file: new DefaultGeneratedFileWithType({\n data:\n typeof c.data === `string`\n ? parseDataUri(c.data).base64Content // Strip data URI prefix if present\n : c.data instanceof URL\n ? c.data.toString()\n : convertDataContentToBase64String(c.data),\n mediaType: c.mediaType,\n }),\n } satisfies Extract<AIV5Type.StepResult<any>['content'][number], { type: 'file' }>;\n if (c.type === `image`) {\n return {\n type: 'file',\n file: new DefaultGeneratedFileWithType({\n data:\n typeof c.image === `string`\n ? parseDataUri(c.image).base64Content // Strip data URI prefix if present\n : c.image instanceof URL\n ? c.image.toString()\n : convertDataContentToBase64String(c.image),\n mediaType: c.mediaType || 'unknown',\n }),\n };\n }\n return { ...c };\n });\n },\n },\n\n aiV4: {\n ui: (): UIMessageWithMetadata[] => this.response.db().map(MessageList.mastraDBMessageToAIV4UIMessage),\n core: (): CoreMessageV4[] => this.aiV4UIMessagesToAIV4CoreMessages(this.response.aiV4.ui()),\n },\n };\n // TODO: need to update this for new .aiV4/5.x() pattern\n private responsePersisted = {\n db: (): MastraDBMessage[] => this.messages.filter(m => this.newResponseMessagesPersisted.has(m)),\n ui: (): UIMessageWithMetadata[] => this.responsePersisted.db().map(MessageList.mastraDBMessageToAIV4UIMessage),\n };\n\n public drainUnsavedMessages(): MastraDBMessage[] {\n const messages = this.messages.filter(m => this.newUserMessages.has(m) || this.newResponseMessages.has(m));\n this.newUserMessages.clear();\n this.newResponseMessages.clear();\n return messages;\n }\n\n public getEarliestUnsavedMessageTimestamp(): number | undefined {\n const unsavedMessages = this.messages.filter(m => this.newUserMessages.has(m) || this.newResponseMessages.has(m));\n if (unsavedMessages.length === 0) return undefined;\n // Find the earliest createdAt among unsaved messages\n return Math.min(...unsavedMessages.map(m => new Date(m.createdAt).getTime()));\n }\n\n public getSystemMessages(tag?: string): CoreMessageV4[] {\n if (tag) {\n return this.taggedSystemMessages[tag] || [];\n }\n return this.systemMessages;\n }\n\n public addSystem(\n messages:\n | CoreMessageV4\n | CoreMessageV4[]\n | AIV5Type.ModelMessage\n | AIV5Type.ModelMessage[]\n | MastraDBMessage\n | MastraDBMessage[]\n | string\n | string[]\n | null,\n tag?: string,\n ) {\n if (!messages) return this;\n for (const message of Array.isArray(messages) ? messages : [messages]) {\n this.addOneSystem(message, tag);\n }\n return this;\n }\n\n private aiV4UIMessagesToAIV4CoreMessages(messages: UIMessageV4[]): CoreMessageV4[] {\n return convertToCoreMessagesV4(this.sanitizeAIV4UIMessages(messages));\n }\n private sanitizeAIV4UIMessages(messages: UIMessageV4[]): UIMessageV4[] {\n const msgs = messages\n .map(m => {\n if (m.parts.length === 0) return false;\n const safeParts = m.parts.filter(\n p =>\n p.type !== `tool-invocation` ||\n // calls and partial-calls should be updated to be results at this point\n // if they haven't we can't send them back to the llm and need to remove them.\n (p.toolInvocation.state !== `call` && p.toolInvocation.state !== `partial-call`),\n );\n\n // fully remove this message if it has an empty parts array after stripping out incomplete tool calls.\n if (!safeParts.length) return false;\n\n const sanitized = {\n ...m,\n parts: safeParts,\n };\n\n // ensure toolInvocations are also updated to only show results\n if (`toolInvocations` in m && m.toolInvocations) {\n sanitized.toolInvocations = m.toolInvocations.filter(t => t.state === `result`);\n }\n\n return sanitized;\n })\n .filter((m): m is UIMessageV4 => Boolean(m));\n return msgs;\n }\n\n /**\n * Converts various message formats to AIV4 CoreMessage format for system messages\n * @param message - The message to convert (can be string, MastraDBMessage, or AI SDK message types)\n * @returns AIV4 CoreMessage in the proper format\n */\n private systemMessageToAICore(\n message: CoreMessageV4 | AIV5Type.ModelMessage | MastraDBMessage | string,\n ): CoreMessageV4 {\n if (typeof message === `string`) {\n return { role: 'system', content: message };\n }\n\n if (MessageList.isAIV5CoreMessage(message)) {\n const dbMsg = MessageList.aiV5ModelMessageToMastraDBMessage(message as AIV5Type.ModelMessage, 'system');\n return MessageList.mastraDBMessageSystemToV4Core(dbMsg);\n }\n\n if (MessageList.isMastraDBMessage(message)) {\n return MessageList.mastraDBMessageSystemToV4Core(message);\n }\n\n return message;\n }\n\n private addOneSystem(message: CoreMessageV4 | AIV5Type.ModelMessage | MastraDBMessage | string, tag?: string) {\n const coreMessage = this.systemMessageToAICore(message);\n\n if (coreMessage.role !== `system`) {\n throw new Error(\n `Expected role \"system\" but saw ${coreMessage.role} for message ${JSON.stringify(coreMessage, null, 2)}`,\n );\n }\n\n if (tag && !this.isDuplicateSystem(coreMessage, tag)) {\n this.taggedSystemMessages[tag] ||= [];\n this.taggedSystemMessages[tag].push(coreMessage);\n } else if (!tag && !this.isDuplicateSystem(coreMessage)) {\n this.systemMessages.push(coreMessage);\n }\n }\n\n private isDuplicateSystem(message: CoreMessageV4, tag?: string) {\n if (tag) {\n if (!this.taggedSystemMessages[tag]) return false;\n return this.taggedSystemMessages[tag].some(\n m =>\n MessageList.cacheKeyFromAIV4CoreMessageContent(m.content) ===\n MessageList.cacheKeyFromAIV4CoreMessageContent(message.content),\n );\n }\n return this.systemMessages.some(\n m =>\n MessageList.cacheKeyFromAIV4CoreMessageContent(m.content) ===\n MessageList.cacheKeyFromAIV4CoreMessageContent(message.content),\n );\n }\n\n private static mastraDBMessageToAIV4UIMessage(m: MastraDBMessage): UIMessageWithMetadata {\n const experimentalAttachments: UIMessageWithMetadata['experimental_attachments'] = m.content\n .experimental_attachments\n ? [...m.content.experimental_attachments]\n : [];\n const contentString =\n typeof m.content.content === `string` && m.content.content !== ''\n ? m.content.content\n : m.content.parts.reduce((prev, part) => {\n if (part.type === `text`) {\n // return only the last text part like AI SDK does\n return part.text;\n }\n return prev;\n }, '');\n\n const parts: MastraMessageContentV2['parts'] = [];\n\n if (m.content.parts.length) {\n for (const part of m.content.parts) {\n if (part.type === `file`) {\n experimentalAttachments.push({\n contentType: part.mimeType,\n url: part.data,\n });\n } else if (\n part.type === 'tool-invocation' &&\n (part.toolInvocation.state === 'call' || part.toolInvocation.state === 'partial-call')\n ) {\n // Filter out tool invocations with call or partial-call states\n continue;\n } else if (part.type === 'tool-invocation') {\n // Handle tool invocations with step number logic\n const toolInvocation = { ...part.toolInvocation };\n\n // Find the step number for this tool invocation\n let currentStep = -1;\n let toolStep = -1;\n for (const innerPart of m.content.parts) {\n if (innerPart.type === `step-start`) currentStep++;\n if (\n innerPart.type === `tool-invocation` &&\n innerPart.toolInvocation.toolCallId === part.toolInvocation.toolCallId\n ) {\n toolStep = currentStep;\n break;\n }\n }\n\n if (toolStep >= 0) {\n const preparedInvocation = {\n step: toolStep,\n ...toolInvocation,\n };\n parts.push({\n type: 'tool-invocation',\n toolInvocation: preparedInvocation,\n });\n } else {\n parts.push({\n type: 'tool-invocation',\n toolInvocation,\n });\n }\n } else {\n parts.push(part);\n }\n }\n }\n\n if (parts.length === 0 && experimentalAttachments.length > 0) {\n // make sure we have atleast one part so this message doesn't get removed when converting to core message\n parts.push({ type: 'text', text: '' });\n }\n\n if (m.role === `user`) {\n const uiMessage: UIMessageWithMetadata = {\n id: m.id,\n role: m.role,\n content: m.content.content || contentString,\n createdAt: m.createdAt,\n parts,\n experimental_attachments: experimentalAttachments,\n };\n // Preserve metadata if present\n if (m.content.metadata) {\n uiMessage.metadata = m.content.metadata;\n }\n return uiMessage;\n } else if (m.role === `assistant`) {\n const isSingleTextContentArray =\n Array.isArray(m.content.content) && m.content.content.length === 1 && m.content.content[0].type === `text`;\n\n const uiMessage: UIMessageWithMetadata = {\n id: m.id,\n role: m.role,\n content: isSingleTextContentArray ? contentString : m.content.content || contentString,\n createdAt: m.createdAt,\n parts,\n reasoning: undefined,\n toolInvocations:\n `toolInvocations` in m.content ? m.content.toolInvocations?.filter(t => t.state === 'result') : undefined,\n };\n // Preserve metadata if present\n if (m.content.metadata) {\n uiMessage.metadata = m.content.metadata;\n }\n return uiMessage;\n }\n\n const uiMessage: UIMessageWithMetadata = {\n id: m.id,\n role: m.role,\n content: m.content.content || contentString,\n createdAt: m.createdAt,\n parts,\n experimental_attachments: experimentalAttachments,\n };\n // Preserve metadata if present\n if (m.content.metadata) {\n uiMessage.metadata = m.content.metadata;\n }\n return uiMessage;\n }\n\n /**\n * Converts a MastraDBMessage system message directly to AIV4 CoreMessage format\n * This is more efficient than converting to UI message first and then to core\n * @param message - The MastraDBMessage message to convert\n * @returns AIV4 CoreMessage with system role\n */\n private static mastraDBMessageSystemToV4Core(message: MastraDBMessage): CoreMessageV4 {\n if (message.role !== `system` || !message.content.content)\n throw new MastraError({\n id: 'INVALID_SYSTEM_MESSAGE_FORMAT',\n domain: ErrorDomain.AGENT,\n category: ErrorCategory.USER,\n text: `Invalid system message format. System messages must include 'role' and 'content' properties. The content should be a string.`,\n details: {\n receivedMessage: JSON.stringify(message, null, 2),\n },\n });\n\n return { role: 'system', content: message.content.content };\n }\n\n private getMessageById(id: string) {\n return this.messages.find(m => m.id === id);\n }\n\n private shouldReplaceMessage(message: MastraDBMessage): { exists: boolean; shouldReplace?: boolean; id?: string } {\n if (!this.messages.length) return { exists: false };\n\n if (!(`id` in message) || !message?.id) {\n return { exists: false };\n }\n\n const existingMessage = this.getMessageById(message.id);\n if (!existingMessage) return { exists: false };\n\n return {\n exists: true,\n shouldReplace: !MessageList.messagesAreEqual(existingMessage, message),\n id: existingMessage.id,\n };\n }\n\n private addOne(message: MessageInput, messageSource: MessageSource) {\n if (\n (!(`content` in message) ||\n (!message.content &&\n // allow empty strings\n typeof message.content !== 'string')) &&\n (!(`parts` in message) || !message.parts)\n ) {\n throw new MastraError({\n id: 'INVALID_MESSAGE_CONTENT',\n domain: ErrorDomain.AGENT,\n category: ErrorCategory.USER,\n text: `Message with role \"${message.role}\" must have either a 'content' property (string or array) or a 'parts' property (array) that is not empty, null, or undefined. Received message: ${JSON.stringify(message, null, 2)}`,\n details: {\n role: message.role as string,\n messageSource,\n hasContent: 'content' in message,\n hasParts: 'parts' in message,\n },\n });\n }\n\n if (message.role === `system`) {\n // In the past system messages were accidentally stored in the db. these should be ignored because memory is not supposed to store system messages.\n if (messageSource === `memory`) return null;\n\n // Check if the message is in a supported format for system messages\n const isSupportedSystemFormat =\n MessageList.isAIV4CoreMessage(message) ||\n MessageList.isAIV5CoreMessage(message) ||\n MessageList.isMastraDBMessage(message);\n\n if (isSupportedSystemFormat) {\n return this.addSystem(message);\n }\n\n // if we didn't add the message and we didn't ignore this intentionally, then it's a problem!\n throw new MastraError({\n id: 'INVALID_SYSTEM_MESSAGE_FORMAT',\n domain: ErrorDomain.AGENT,\n category: ErrorCategory.USER,\n text: `Invalid system message format. System messages must be CoreMessage format with 'role' and 'content' properties. The content should be a string or valid content array.`,\n details: {\n messageSource,\n receivedMessage: JSON.stringify(message, null, 2),\n },\n });\n }\n\n const messageV2 = this.inputToMastraDBMessage(message, messageSource);\n\n const { exists, shouldReplace, id } = this.shouldReplaceMessage(messageV2);\n\n const latestMessage = this.messages.at(-1);\n\n if (messageSource === `memory`) {\n for (const existingMessage of this.messages) {\n // don't double store any messages\n if (MessageList.messagesAreEqual(existingMessage, messageV2)) {\n return;\n }\n }\n }\n // If the last message is an assistant message and the new message is also an assistant message, merge them together and update tool calls with results\n const shouldAppendToLastAssistantMessage =\n latestMessage?.role === 'assistant' &&\n messageV2.role === 'assistant' &&\n latestMessage.threadId === messageV2.threadId &&\n // If the message is from memory, don't append to the last assistant message\n messageSource !== 'memory';\n // This flag is for agent network messages. We should change the agent network formatting and remove this flag after.\n const appendNetworkMessage =\n (this._agentNetworkAppend && latestMessage && !this.memoryMessages.has(latestMessage)) ||\n !this._agentNetworkAppend;\n if (shouldAppendToLastAssistantMessage && appendNetworkMessage) {\n latestMessage.createdAt = messageV2.createdAt || latestMessage.createdAt;\n\n // Used for mapping indexes for messageV2 parts to corresponding indexes in latestMessage\n const toolResultAnchorMap = new Map<number, number>();\n const partsToAdd = new Map<number, MastraMessageContentV2['parts'][number]>();\n\n for (const [index, part] of messageV2.content.parts.entries()) {\n // If the incoming part is a tool-invocation result, find the corresponding call in the latest message\n if (part.type === 'tool-invocation') {\n const existingCallPart = [...latestMessage.content.parts]\n .reverse()\n .find(p => p.type === 'tool-invocation' && p.toolInvocation.toolCallId === part.toolInvocation.toolCallId);\n\n const existingCallToolInvocation = !!existingCallPart && existingCallPart.type === 'tool-invocation';\n\n if (existingCallToolInvocation) {\n if (part.toolInvocation.state === 'result') {\n // Update the existing tool-call part with the result\n existingCallPart.toolInvocation = {\n ...existingCallPart.toolInvocation,\n step: part.toolInvocation.step,\n state: 'result',\n result: part.toolInvocation.result,\n args: {\n ...existingCallPart.toolInvocation.args,\n ...part.toolInvocation.args,\n },\n };\n if (!latestMessage.content.toolInvocations) {\n latestMessage.content.toolInvocations = [];\n }\n const toolInvocationIndex = latestMessage.content.toolInvocations.findIndex(\n t => t.toolCallId === existingCallPart.toolInvocation.toolCallId,\n );\n if (toolInvocationIndex === -1) {\n latestMessage.content.toolInvocations.push(existingCallPart.toolInvocation);\n } else {\n latestMessage.content.toolInvocations[toolInvocationIndex] = existingCallPart.toolInvocation;\n }\n }\n // Map the index of the tool call in messageV2 to the index of the tool call in latestMessage\n const existingIndex = latestMessage.content.parts.findIndex(p => p === existingCallPart);\n toolResultAnchorMap.set(index, existingIndex);\n // Otherwise we do nothing, as we're not updating the tool call\n } else {\n partsToAdd.set(index, part);\n }\n } else {\n partsToAdd.set(index, part);\n }\n }\n this.addPartsToLatestMessage({\n latestMessage,\n messageV2,\n anchorMap: toolResultAnchorMap,\n partsToAdd,\n });\n if (latestMessage.createdAt.getTime() < messageV2.createdAt.getTime()) {\n latestMessage.createdAt = messageV2.createdAt;\n }\n if (!latestMessage.content.content && messageV2.content.content) {\n latestMessage.content.content = messageV2.content.content;\n }\n if (\n latestMessage.content.content &&\n messageV2.content.content &&\n latestMessage.content.content !== messageV2.content.content\n ) {\n // Match what AI SDK does - content string is always the latest text part.\n latestMessage.content.content = messageV2.content.content;\n }\n\n // If latest message gets appended to, it should be added to the proper source\n this.pushMessageToSource(latestMessage, messageSource);\n }\n // Else the last message and this message are not both assistant messages OR an existing message has been updated and should be replaced. add a new message to the array or update an existing one.\n else {\n let existingIndex = -1;\n if (shouldReplace) {\n existingIndex = this.messages.findIndex(m => m.id === id);\n }\n const existingMessage = existingIndex !== -1 && this.messages[existingIndex];\n\n if (shouldReplace && existingMessage) {\n this.messages[existingIndex] = messageV2;\n } else if (!exists) {\n this.messages.push(messageV2);\n }\n\n this.pushMessageToSource(messageV2, messageSource);\n }\n\n // make sure messages are always stored in order of when they were created!\n this.messages.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n\n return this;\n }\n\n private pushMessageToSource(messageV2: MastraDBMessage, messageSource: MessageSource) {\n if (messageSource === `memory`) {\n this.memoryMessages.add(messageV2);\n this.memoryMessagesPersisted.add(messageV2);\n } else if (messageSource === `response`) {\n this.newResponseMessages.add(messageV2);\n this.newResponseMessagesPersisted.add(messageV2);\n } else if (messageSource === `input`) {\n this.newUserMessages.add(messageV2);\n this.newUserMessagesPersisted.add(messageV2);\n } else if (messageSource === `context`) {\n this.userContextMessages.add(messageV2);\n this.userContextMessagesPersisted.add(messageV2);\n } else {\n throw new Error(`Missing message source for message ${messageV2}`);\n }\n }\n\n /**\n * Pushes a new message part to the latest message.\n * @param latestMessage - The latest message to push the part to.\n * @param newMessage - The new message to push the part from.\n * @param part - The part to push.\n * @param insertAt - The index at which to insert the part. Optional.\n */\n private pushNewMessagePart({\n latestMessage,\n newMessage,\n part,\n insertAt, // optional\n }: {\n latestMessage: MastraDBMessage;\n newMessage: MastraDBMessage;\n part: MastraMessageContentV2['parts'][number];\n insertAt?: number;\n }) {\n const partKey = MessageList.cacheKeyFromAIV4Parts([part]);\n const latestPartCount = latestMessage.content.parts.filter(\n p => MessageList.cacheKeyFromAIV4Parts([p]) === partKey,\n ).length;\n const newPartCount = newMessage.content.parts.filter(\n p => MessageList.cacheKeyFromAIV4Parts([p]) === partKey,\n ).length;\n // If the number of parts in the latest message is less than the number of parts in the new message, insert the part\n if (latestPartCount < newPartCount) {\n // Check if we need to add a step-start before text parts when merging assistant messages\n // Only add after tool invocations, and only if the incoming message doesn't already have step-start\n const partIndex = newMessage.content.parts.indexOf(part);\n const hasStepStartBefore = partIndex > 0 && newMessage.content.parts[partIndex - 1]?.type === 'step-start';\n\n const needsStepStart =\n latestMessage.role === 'assistant' &&\n part.type === 'text' &&\n !hasStepStartBefore &&\n latestMessage.content.parts.length > 0 &&\n latestMessage.content.parts.at(-1)?.type === 'tool-invocation';\n\n if (typeof insertAt === 'number') {\n if (needsStepStart) {\n latestMessage.content.parts.splice(insertAt, 0, { type: 'step-start' });\n latestMessage.content.parts.splice(insertAt + 1, 0, part);\n } else {\n latestMessage.content.parts.splice(insertAt, 0, part);\n }\n } else {\n if (needsStepStart) {\n latestMessage.content.parts.push({ type: 'step-start' });\n }\n latestMessage.content.parts.push(part);\n }\n }\n }\n\n /**\n * Upserts parts of messageV2 into latestMessage based on the anchorMap.\n * This is used when appending a message to the last assistant message to ensure that parts are inserted in the correct order.\n * @param latestMessage - The latest message to upsert parts into.\n * @param messageV2 - The message to upsert parts from.\n * @param anchorMap - The anchor map to use for upserting parts.\n */\n private addPartsToLatestMessage({\n latestMessage,\n messageV2,\n anchorMap,\n partsToAdd,\n }: {\n latestMessage: MastraDBMessage;\n messageV2: MastraDBMessage;\n anchorMap: Map<number, number>;\n partsToAdd: Map<number, MastraMessageContentV2['parts'][number]>;\n }) {\n // Walk through messageV2, inserting any part not present at the canonical position\n for (let i = 0; i < messageV2.content.parts.length; ++i) {\n const part = messageV2.content.parts[i];\n if (!part) continue;\n const key = MessageList.cacheKeyFromAIV4Parts([part]);\n const partToAdd = partsToAdd.get(i);\n if (!key || !partToAdd) continue;\n if (anchorMap.size > 0) {\n if (anchorMap.has(i)) continue; // skip anchors\n // Find left anchor in messageV2\n const leftAnchorV2 = [...anchorMap.keys()].filter(idx => idx < i).pop() ?? -1;\n // Find right anchor in messageV2\n const rightAnchorV2 = [...anchorMap.keys()].find(idx => idx > i) ?? -1;\n\n // Map to latestMessage\n const leftAnchorLatest = leftAnchorV2 !== -1 ? anchorMap.get(leftAnchorV2)! : 0;\n\n // Compute offset from anchor\n const offset = leftAnchorV2 === -1 ? i : i - leftAnchorV2;\n\n // Insert at proportional position\n const insertAt = leftAnchorLatest + offset;\n\n const rightAnchorLatest =\n rightAnchorV2 !== -1 ? anchorMap.get(rightAnchorV2)! : latestMessage.content.parts.length;\n\n if (\n insertAt >= 0 &&\n insertAt <= rightAnchorLatest &&\n !latestMessage.content.parts\n .slice(insertAt, rightAnchorLatest)\n .some(p => MessageList.cacheKeyFromAIV4Parts([p]) === MessageList.cacheKeyFromAIV4Parts([part]))\n ) {\n this.pushNewMessagePart({\n latestMessage,\n newMessage: messageV2,\n part,\n insertAt,\n });\n for (const [v2Idx, latestIdx] of anchorMap.entries()) {\n if (latestIdx >= insertAt) {\n anchorMap.set(v2Idx, latestIdx + 1);\n }\n }\n }\n } else {\n this.pushNewMessagePart({\n latestMessage,\n newMessage: messageV2,\n part,\n });\n }\n }\n }\n\n private inputToMastraDBMessage(message: MessageInput, messageSource: MessageSource): MastraDBMessage {\n if (\n // we can't throw if the threadId doesn't match and this message came from memory\n // this is because per-user semantic recall can retrieve messages from other threads\n messageSource !== `memory` &&\n `threadId` in message &&\n message.threadId &&\n this.memoryInfo &&\n message.threadId !== this.memoryInfo.threadId\n ) {\n throw new Error(\n `Received input message with wrong threadId. Input ${message.threadId}, expected ${this.memoryInfo.threadId}`,\n );\n }\n\n if (\n `resourceId` in message &&\n message.resourceId &&\n this.memoryInfo?.resourceId &&\n message.resourceId !== this.memoryInfo.resourceId\n ) {\n throw new Error(\n `Received input message with wrong resourceId. Input ${message.resourceId}, expected ${this.memoryInfo.resourceId}`,\n );\n }\n\n if (MessageList.isMastraMessageV1(message)) {\n return this.mastraMessageV1ToMastraDBMessage(message, messageSource);\n }\n if (MessageList.isMastraDBMessage(message)) {\n return this.hydrateMastraDBMessageFields(message);\n }\n if (MessageList.isAIV4CoreMessage(message)) {\n return this.aiV4CoreMessageToMastraDBMessage(message, messageSource);\n }\n if (MessageList.isAIV4UIMessage(message)) {\n return this.aiV4UIMessageToMastraDBMessage(message, messageSource);\n }\n\n if (MessageList.isAIV5CoreMessage(message)) {\n const dbMsg = MessageList.aiV5ModelMessageToMastraDBMessage(message, messageSource);\n const result = {\n ...dbMsg,\n threadId: this.memoryInfo?.threadId,\n resourceId: this.memoryInfo?.resourceId,\n };\n return result;\n }\n if (MessageList.isAIV5UIMessage(message)) {\n const dbMsg = MessageList.aiV5UIMessageToMastraDBMessage(message);\n return {\n ...dbMsg,\n threadId: this.memoryInfo?.threadId,\n resourceId: this.memoryInfo?.resourceId,\n };\n }\n\n throw new Error(`Found unhandled message ${JSON.stringify(message)}`);\n }\n\n private lastCreatedAt?: number;\n // this makes sure messages added in order will always have a date atleast 1ms apart.\n private generateCreatedAt(messageSource: MessageSource, start?: Date | number): Date {\n start = start instanceof Date ? start : start ? new Date(start) : undefined;\n\n if (start && !this.lastCreatedAt) {\n this.lastCreatedAt = start.getTime();\n return start;\n }\n\n if (start && messageSource === `memory`) {\n // we don't want to modify start time if the message came from memory or we may accidentally re-order old messages\n return start;\n }\n\n const now = new Date();\n const nowTime = start?.getTime() || now.getTime();\n // find the latest createdAt in all stored messages\n const lastTime = this.messages.reduce((p, m) => {\n if (m.createdAt.getTime() > p) return m.createdAt.getTime();\n return p;\n }, this.lastCreatedAt || 0);\n\n // make sure our new message is created later than the latest known message time\n // it's expected that messages are added to the list in order if they don't have a createdAt date on them\n if (nowTime <= lastTime) {\n const newDate = new Date(lastTime + 1);\n this.lastCreatedAt = newDate.getTime();\n return newDate;\n }\n\n this.lastCreatedAt = nowTime;\n return now;\n }\n\n private newMessageId(): string {\n if (this.generateMessageId) {\n return this.generateMessageId();\n }\n return randomUUID();\n }\n\n private mastraMessageV1ToMastraDBMessage(message: MastraMessageV1, messageSource: MessageSource): MastraDBMessage {\n const coreV2 = this.aiV4CoreMessageToMastraDBMessage(\n {\n content: message.content,\n role: message.role,\n } as CoreMessageV4,\n messageSource,\n );\n\n return {\n id: message.id,\n role: coreV2.role,\n createdAt: this.generateCreatedAt(messageSource, message.createdAt),\n threadId: message.threadId,\n resourceId: message.resourceId,\n content: coreV2.content,\n };\n }\n\n private hydrateMastraDBMessageFields(message: MastraDBMessage): MastraDBMessage {\n // Generate ID if missing\n if (!message.id) {\n message.id = this.newMessageId();\n }\n\n if (!(message.createdAt instanceof Date)) message.createdAt = new Date(message.createdAt);\n\n // Fix toolInvocations with empty args by looking in the parts array\n // This handles messages restored from database where toolInvocations might have lost their args\n if (message.content.toolInvocations && message.content.parts) {\n message.content.toolInvocations = message.content.toolInvocations.map(ti => {\n if (!ti.args || Object.keys(ti.args).length === 0) {\n // Find the corresponding tool-invocation part with args\n const partWithArgs = message.content.parts.find(\n part =>\n part.type === 'tool-invocation' &&\n part.toolInvocation &&\n part.toolInvocation.toolCallId === ti.toolCallId &&\n part.toolInvocation.args &&\n Object.keys(part.toolInvocation.args).length > 0,\n );\n if (partWithArgs && partWithArgs.type === 'tool-invocation') {\n return { ...ti, args: partWithArgs.toolInvocation.args };\n }\n }\n return ti;\n });\n }\n\n return message;\n }\n\n private aiV4UIMessageToMastraDBMessage(\n message: UIMessageV4 | UIMessageWithMetadata,\n messageSource: MessageSource,\n ): MastraDBMessage {\n const content: MastraMessageContentV2 = {\n format: 2,\n parts: message.parts,\n };\n\n if (message.toolInvocations) content.toolInvocations = message.toolInvocations;\n if (message.reasoning) content.reasoning = message.reasoning;\n if (message.annotations) content.annotations = message.annotations;\n if (message.experimental_attachments) {\n content.experimental_attachments = message.experimental_attachments;\n }\n // Preserve metadata field if present\n if ('metadata' in message && message.metadata !== null && message.metadata !== undefined) {\n content.metadata = message.metadata as Record<string, unknown>;\n }\n\n return {\n id: message.id || this.newMessageId(),\n role: MessageList.getRole(message),\n createdAt: this.generateCreatedAt(messageSource, message.createdAt),\n threadId: this.memoryInfo?.threadId,\n resourceId: this.memoryInfo?.resourceId,\n content,\n } satisfies MastraDBMessage;\n }\n private aiV4CoreMessageToMastraDBMessage(coreMessage: CoreMessageV4, messageSource: MessageSource): MastraDBMessage {\n const id = `id` in coreMessage ? (coreMessage.id as string) : this.newMessageId();\n const parts: UIMessageV4['parts'] = [];\n const experimentalAttachments: UIMessageV4['experimental_attachments'] = [];\n const toolInvocations: ToolInvocationV4[] = [];\n\n const isSingleTextContent =\n messageSource === `response` &&\n Array.isArray(coreMessage.content) &&\n coreMessage.content.length === 1 &&\n coreMessage.content[0] &&\n coreMessage.content[0].type === `text` &&\n `text` in coreMessage.content[0] &&\n coreMessage.content[0].text;\n\n if (isSingleTextContent && messageSource === `response`) {\n coreMessage.content = isSingleTextContent;\n }\n\n if (typeof coreMessage.content === 'string') {\n parts.push({\n type: 'text',\n text: coreMessage.content,\n // Preserve providerOptions from CoreMessage (e.g., for system messages with cacheControl)\n ...('providerOptions' in coreMessage && coreMessage.providerOptions\n ? { providerMetadata: coreMessage.providerOptions }\n : {}),\n });\n } else if (Array.isArray(coreMessage.content)) {\n for (const part of coreMessage.content) {\n switch (part.type) {\n case 'text':\n // Add step-start only after tool invocations, not at the beginning\n const prevPart = parts.at(-1);\n if (coreMessage.role === 'assistant' && prevPart && prevPart.type === 'tool-invocation') {\n parts.push({ type: 'step-start' });\n }\n // Merge part-level and message-level providerOptions\n // Part-level takes precedence over message-level\n const mergedProviderMetadata = {\n ...('providerOptions' in coreMessage && coreMessage.providerOptions ? coreMessage.providerOptions : {}),\n ...('providerOptions' in part && part.providerOptions ? part.providerOptions : {}),\n };\n\n parts.push({\n type: 'text',\n text: part.text,\n ...(Object.keys(mergedProviderMetadata).length > 0 ? { providerMetadata: mergedProviderMetadata } : {}),\n });\n break;\n\n case 'tool-call':\n parts.push({\n type: 'tool-invocation',\n toolInvocation: {\n state: 'call',\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n },\n });\n break;\n\n case 'tool-result':\n // Try to find args from the corresponding tool-call in previous messages\n let toolArgs: Record<string, unknown> = {};\n\n // First, check if there's a tool-call in the same message\n const toolCallInSameMsg = coreMessage.content.find(\n p => p.type === 'tool-call' && p.toolCallId === part.toolCallId,\n );\n if (toolCallInSameMsg && toolCallInSameMsg.type === 'tool-call') {\n toolArgs = toolCallInSameMsg.args as Record<string, unknown>;\n }\n\n // If not found, look in previous messages for the corresponding tool-call\n // Search from most recent messages first (more likely to find the match)\n if (Object.keys(toolArgs).length === 0) {\n // Iterate in reverse order (most recent first) for better performance\n for (let i = this.messages.length - 1; i >= 0; i--) {\n const msg = this.messages[i];\n if (msg && msg.role === 'assistant' && msg.content.parts) {\n const toolCallPart = msg.content.parts.find(\n p =>\n p.type === 'tool-invocation' &&\n p.toolInvocation.toolCallId === part.toolCallId &&\n p.toolInvocation.state === 'call',\n );\n if (toolCallPart && toolCallPart.type === 'tool-invocation' && toolCallPart.toolInvocation.args) {\n toolArgs = toolCallPart.toolInvocation.args;\n break;\n }\n }\n }\n }\n\n const invocation = {\n state: 'result' as const,\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result ?? '', // undefined will cause AI SDK to throw an error, but for client side tool calls this really could be undefined\n args: toolArgs, // Use the args from the corresponding tool-call\n };\n parts.push({\n type: 'tool-invocation',\n toolInvocation: invocation,\n });\n toolInvocations.push(invocation);\n break;\n\n case 'reasoning':\n parts.push({\n type: 'reasoning',\n reasoning: '', // leave this blank so we aren't double storing it in the db along with details\n details: [{ type: 'text', text: part.text, signature: part.signature }],\n });\n break;\n case 'redacted-reasoning':\n parts.push({\n type: 'reasoning',\n reasoning: '', // No text reasoning for redacted parts\n details: [{ type: 'redacted', data: part.data }],\n });\n break;\n case 'image':\n parts.push({\n type: 'file',\n data: imageContentToString(part.image),\n mimeType: part.mimeType!,\n });\n break;\n case 'file':\n // CoreMessage file parts can have mimeType and data (binary/data URL) or just a URL\n if (part.data instanceof URL) {\n parts.push({\n type: 'file',\n data: part.data.toString(),\n mimeType: part.mimeType,\n });\n } else if (typeof part.data === 'string') {\n const categorized = categorizeFileData(part.data, part.mimeType);\n\n if (categorized.type === 'url' || categorized.type === 'dataUri') {\n // It's a URL or data URI, use it directly\n parts.push({\n type: 'file',\n data: part.data,\n mimeType: categorized.mimeType || 'image/png',\n });\n } else {\n // Raw data, convert to base64\n try {\n parts.push({\n type: 'file',\n mimeType: categorized.mimeType || 'image/png',\n data: convertDataContentToBase64String(part.data),\n });\n } catch (error) {\n console.error(`Failed to convert binary data to base64 in CoreMessage file part: ${error}`, error);\n }\n }\n } else {\n // If it's binary data, convert to base64 and add to parts\n try {\n parts.push({\n type: 'file',\n mimeType: part.mimeType,\n data: convertDataContentToBase64String(part.data),\n });\n } catch (error) {\n console.error(`Failed to convert binary data to base64 in CoreMessage file part: ${error}`, error);\n }\n }\n break;\n }\n }\n }\n\n const content: MastraDBMessage['content'] = {\n format: 2,\n parts,\n };\n\n if (toolInvocations.length) content.toolInvocations = toolInvocations;\n if (typeof coreMessage.content === `string`) content.content = coreMessage.content;\n\n if (experimentalAttachments.length) content.experimental_attachments = experimentalAttachments;\n\n return {\n id,\n role: MessageList.getRole(coreMessage),\n createdAt: this.generateCreatedAt(messageSource),\n threadId: this.memoryInfo?.threadId,\n resourceId: this.memoryInfo?.resourceId,\n content,\n };\n }\n\n static isAIV4UIMessage(msg: MessageInput): msg is UIMessageV4 {\n return (\n !MessageList.isMastraMessage(msg) &&\n !MessageList.isAIV4CoreMessage(msg) &&\n `parts` in msg &&\n !MessageList.hasAIV5UIMessageCharacteristics(msg)\n );\n }\n\n static isAIV5CoreMessage(msg: MessageInput): msg is AIV5Type.ModelMessage {\n return (\n !MessageList.isMastraMessage(msg) &&\n !(`parts` in msg) &&\n `content` in msg &&\n MessageList.hasAIV5CoreMessageCharacteristics(msg)\n );\n }\n static isAIV4CoreMessage(msg: MessageInput): msg is CoreMessageV4 {\n // V4 CoreMessage has role and content like V5, but content can be array of parts\n return (\n !MessageList.isMastraMessage(msg) &&\n !(`parts` in msg) &&\n `content` in msg &&\n !MessageList.hasAIV5CoreMessageCharacteristics(msg)\n );\n }\n\n static isMastraMessage(msg: MessageInput): msg is MastraDBMessage | MastraMessageV1 {\n return MessageList.isMastraDBMessage(msg) || MessageList.isMastraMessageV1(msg);\n }\n\n static isMastraMessageV1(msg: MessageInput): msg is MastraMessageV1 {\n return !MessageList.isMastraDBMessage(msg) && (`threadId` in msg || `resourceId` in msg);\n }\n\n static isMastraDBMessage(msg: MessageInput): msg is MastraDBMessage {\n return Boolean(\n `content` in msg &&\n msg.content &&\n !Array.isArray(msg.content) &&\n typeof msg.content !== `string` &&\n `format` in msg.content &&\n msg.content.format === 2,\n );\n }\n\n private static getRole(message: MessageInput): MastraDBMessage['role'] {\n if (message.role === `assistant` || message.role === `tool`) return `assistant`;\n if (message.role === `user`) return `user`;\n if (message.role === `system`) return `system`;\n throw new Error(\n `BUG: add handling for message role ${message.role} in message ${JSON.stringify(message, null, 2)}`,\n );\n }\n\n private static cacheKeyFromAIV4Parts(parts: UIMessageV4['parts']): string {\n let key = ``;\n for (const part of parts) {\n key += part.type;\n if (part.type === `text`) {\n key += part.text;\n }\n if (part.type === `tool-invocation`) {\n key += part.toolInvocation.toolCallId;\n key += part.toolInvocation.state;\n }\n if (part.type === `reasoning`) {\n key += part.reasoning;\n key += part.details.reduce((prev, current) => {\n if (current.type === `text`) {\n return prev + current.text.length + (current.signature?.length || 0);\n }\n return prev;\n }, 0);\n }\n if (part.type === `file`) {\n key += part.data;\n key += part.mimeType;\n }\n }\n return key;\n }\n\n static coreContentToString(content: CoreMessageV4['content']): string {\n if (typeof content === `string`) return content;\n\n return content.reduce((p, c) => {\n if (c.type === `text`) {\n p += c.text;\n }\n return p;\n }, '');\n }\n\n private static cacheKeyFromAIV4CoreMessageContent(content: CoreMessageV4['content']): string {\n if (typeof content === `string`) return content;\n let key = ``;\n for (const part of content) {\n key += part.type;\n if (part.type === `text`) {\n key += part.text.length;\n }\n if (part.type === `reasoning`) {\n key += part.text.length;\n }\n if (part.type === `tool-call`) {\n key += part.toolCallId;\n key += part.toolName;\n }\n if (part.type === `tool-result`) {\n key += part.toolCallId;\n key += part.toolName;\n }\n if (part.type === `file`) {\n key += part.filename;\n key += part.mimeType;\n }\n if (part.type === `image`) {\n key += getImageCacheKey(part.image);\n key += part.mimeType;\n }\n if (part.type === `redacted-reasoning`) {\n key += part.data.length;\n }\n }\n return key;\n }\n\n private static messagesAreEqual(one: MessageInput, two: MessageInput) {\n const oneUIV4 = MessageList.isAIV4UIMessage(one) && one;\n const twoUIV4 = MessageList.isAIV4UIMessage(two) && two;\n if (oneUIV4 && !twoUIV4) return false;\n if (oneUIV4 && twoUIV4) {\n return MessageList.cacheKeyFromAIV4Parts(one.parts) === MessageList.cacheKeyFromAIV4Parts(two.parts);\n }\n\n const oneCMV4 = MessageList.isAIV4CoreMessage(one) && one;\n const twoCMV4 = MessageList.isAIV4CoreMessage(two) && two;\n if (oneCMV4 && !twoCMV4) return false;\n if (oneCMV4 && twoCMV4) {\n return (\n MessageList.cacheKeyFromAIV4CoreMessageContent(oneCMV4.content) ===\n MessageList.cacheKeyFromAIV4CoreMessageContent(twoCMV4.content)\n );\n }\n\n const oneMM1 = MessageList.isMastraMessageV1(one) && one;\n const twoMM1 = MessageList.isMastraMessageV1(two) && two;\n if (oneMM1 && !twoMM1) return false;\n if (oneMM1 && twoMM1) {\n return (\n oneMM1.id === twoMM1.id &&\n MessageList.cacheKeyFromAIV4CoreMessageContent(oneMM1.content) ===\n MessageList.cacheKeyFromAIV4CoreMessageContent(twoMM1.content)\n );\n }\n\n const oneMM2 = MessageList.isMastraDBMessage(one) && one;\n const twoMM2 = MessageList.isMastraDBMessage(two) && two;\n if (oneMM2 && !twoMM2) return false;\n if (oneMM2 && twoMM2) {\n return (\n oneMM2.id === twoMM2.id &&\n MessageList.cacheKeyFromAIV4Parts(oneMM2.content.parts) ===\n MessageList.cacheKeyFromAIV4Parts(twoMM2.content.parts)\n );\n }\n\n const oneUIV5 = MessageList.isAIV5UIMessage(one) && one;\n const twoUIV5 = MessageList.isAIV5UIMessage(two) && two;\n if (oneUIV5 && !twoUIV5) return false;\n if (oneUIV5 && twoUIV5) {\n return MessageList.cacheKeyFromAIV5Parts(one.parts) === MessageList.cacheKeyFromAIV5Parts(two.parts);\n }\n\n const oneCMV5 = MessageList.isAIV5CoreMessage(one) && one;\n const twoCMV5 = MessageList.isAIV5CoreMessage(two) && two;\n if (oneCMV5 && !twoCMV5) return false;\n if (oneCMV5 && twoCMV5) {\n return (\n MessageList.cacheKeyFromAIV5ModelMessageContent(oneCMV5.content) ===\n MessageList.cacheKeyFromAIV5ModelMessageContent(twoCMV5.content)\n );\n }\n\n // default to it did change. we'll likely never reach this codepath\n return true;\n }\n\n static aiV4CoreMessageToV1PromptMessage(coreMessage: CoreMessageV4): LanguageModelV1Message {\n if (coreMessage.role === `system`) {\n return coreMessage;\n }\n\n if (typeof coreMessage.content === `string` && (coreMessage.role === `assistant` || coreMessage.role === `user`)) {\n return {\n ...coreMessage,\n content: [{ type: 'text', text: coreMessage.content }],\n };\n }\n\n if (typeof coreMessage.content === `string`) {\n throw new Error(\n `Saw text content for input CoreMessage, but the role is ${coreMessage.role}. This is only allowed for \"system\", \"assistant\", and \"user\" roles.`,\n );\n }\n\n const roleContent: {\n user: Exclude<Extract<LanguageModelV1Message, { role: 'user' }>['content'], string>;\n assistant: Exclude<Extract<LanguageModelV1Message, { role: 'assistant' }>['content'], string>;\n tool: Exclude<Extract<LanguageModelV1Message, { role: 'tool' }>['content'], string>;\n } = {\n user: [],\n assistant: [],\n tool: [],\n };\n\n const role = coreMessage.role;\n\n for (const part of coreMessage.content) {\n const incompatibleMessage = `Saw incompatible message content part type ${part.type} for message role ${role}`;\n\n switch (part.type) {\n case 'text': {\n if (role === `tool`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'redacted-reasoning':\n case 'reasoning': {\n if (role !== `assistant`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'tool-call': {\n if (role === `tool` || role === `user`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'tool-result': {\n if (role === `assistant` || role === `user`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'image': {\n if (role === `tool` || role === `assistant`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push({\n ...part,\n image:\n part.image instanceof URL || part.image instanceof Uint8Array\n ? part.image\n : Buffer.isBuffer(part.image) || part.image instanceof ArrayBuffer\n ? new Uint8Array(part.image)\n : new URL(part.image),\n });\n break;\n }\n\n case 'file': {\n if (role === `tool`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push({\n ...part,\n data:\n part.data instanceof URL\n ? part.data\n : typeof part.data === 'string'\n ? part.data\n : convertDataContentToBase64String(part.data),\n });\n break;\n }\n }\n }\n\n if (role === `tool`) {\n return {\n ...coreMessage,\n content: roleContent[role],\n };\n }\n if (role === `user`) {\n return {\n ...coreMessage,\n content: roleContent[role],\n };\n }\n if (role === `assistant`) {\n return {\n ...coreMessage,\n content: roleContent[role],\n };\n }\n\n throw new Error(\n `Encountered unknown role ${role} when converting V4 CoreMessage -> V4 LanguageModelV1Prompt, input message: ${JSON.stringify(coreMessage, null, 2)}`,\n );\n }\n\n static aiV5ModelMessageToV2PromptMessage(modelMessage: AIV5Type.ModelMessage): AIV5LanguageModelV2Message {\n if (modelMessage.role === `system`) {\n return modelMessage;\n }\n\n if (\n typeof modelMessage.content === `string` &&\n (modelMessage.role === `assistant` || modelMessage.role === `user`)\n ) {\n return {\n role: modelMessage.role,\n content: [{ type: 'text', text: modelMessage.content }],\n providerOptions: modelMessage.providerOptions,\n };\n }\n\n if (typeof modelMessage.content === `string`) {\n throw new Error(\n `Saw text content for input ModelMessage, but the role is ${modelMessage.role}. This is only allowed for \"system\", \"assistant\", and \"user\" roles.`,\n );\n }\n\n const roleContent: {\n user: Extract<AIV5LanguageModelV2Message, { role: 'user' }>['content'];\n assistant: Extract<AIV5LanguageModelV2Message, { role: 'assistant' }>['content'];\n tool: Extract<AIV5LanguageModelV2Message, { role: 'tool' }>['content'];\n } = {\n user: [],\n assistant: [],\n tool: [],\n };\n\n const role = modelMessage.role;\n\n for (const part of modelMessage.content) {\n const incompatibleMessage = `Saw incompatible message content part type ${part.type} for message role ${role}`;\n\n switch (part.type) {\n case 'text': {\n if (role === `tool`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'reasoning': {\n if (role === `tool` || role === `user`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'tool-call': {\n if (role !== `assistant`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'tool-result': {\n if (role === `assistant` || role === `user`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push(part);\n break;\n }\n\n case 'file': {\n if (role === `tool`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push({\n ...part,\n data: part.data instanceof ArrayBuffer ? new Uint8Array(part.data) : part.data,\n });\n break;\n }\n\n case 'image': {\n if (role === `tool`) {\n throw new Error(incompatibleMessage);\n }\n roleContent[role].push({\n ...part,\n mediaType: part.mediaType || 'image/unknown',\n type: 'file',\n data: part.image instanceof ArrayBuffer ? new Uint8Array(part.image) : part.image,\n });\n break;\n }\n }\n }\n\n if (role === `tool`) {\n return {\n ...modelMessage,\n content: roleContent[role],\n };\n }\n if (role === `user`) {\n return {\n ...modelMessage,\n content: roleContent[role],\n };\n }\n if (role === `assistant`) {\n return {\n ...modelMessage,\n content: roleContent[role],\n };\n }\n\n throw new Error(\n `Encountered unknown role ${role} when converting V5 ModelMessage -> V5 LanguageModelV2Message, input message: ${JSON.stringify(modelMessage, null, 2)}`,\n );\n }\n\n /**\n * Direct conversion from MastraDBMessage to AIV5 UIMessage\n */\n public static mastraDBMessageToAIV5UIMessage(dbMsg: MastraDBMessage): AIV5Type.UIMessage {\n const parts: AIV5Type.UIMessage['parts'] = [];\n const metadata: Record<string, unknown> = { ...(dbMsg.content.metadata || {}) };\n\n // Add Mastra-specific metadata\n if (dbMsg.createdAt) metadata.createdAt = dbMsg.createdAt;\n if (dbMsg.threadId) metadata.threadId = dbMsg.threadId;\n if (dbMsg.resourceId) metadata.resourceId = dbMsg.resourceId;\n\n // 1. Handle tool invocations (only if not already in parts array)\n // Parts array takes precedence because it has providerMetadata\n const hasToolInvocationParts = dbMsg.content.parts?.some(p => p.type === 'tool-invocation');\n if (dbMsg.content.toolInvocations && !hasToolInvocationParts) {\n for (const invocation of dbMsg.content.toolInvocations) {\n if (invocation.state === 'result') {\n parts.push({\n type: `tool-${invocation.toolName}`,\n toolCallId: invocation.toolCallId,\n state: 'output-available',\n input: invocation.args,\n output: invocation.result,\n } as unknown as AIV5Type.UIMessage['parts'][number]);\n } else {\n parts.push({\n type: `tool-${invocation.toolName}`,\n toolCallId: invocation.toolCallId,\n state: invocation.state === 'call' ? 'input-available' : 'input-streaming',\n input: invocation.args,\n } as unknown as AIV5Type.UIMessage['parts'][number]);\n }\n }\n }\n\n // 2. Check if we have parts with providerMetadata first\n const hasReasoningInParts = dbMsg.content.parts?.some(p => p.type === 'reasoning');\n const hasFileInParts = dbMsg.content.parts?.some(p => p.type === 'file');\n\n // 3. Handle reasoning (AIV4 reasoning is a string) - only if not in parts\n if (dbMsg.content.reasoning && !hasReasoningInParts) {\n parts.push({\n type: 'reasoning',\n text: dbMsg.content.reasoning,\n });\n }\n\n // 4. Handle files (experimental_attachments) - only if not in parts\n // Track attachment URLs to avoid duplicates when processing parts\n const attachmentUrls = new Set<string>();\n if (dbMsg.content.experimental_attachments && !hasFileInParts) {\n for (const attachment of dbMsg.content.experimental_attachments) {\n attachmentUrls.add(attachment.url);\n parts.push({\n type: 'file',\n url: attachment.url,\n mediaType: attachment.contentType || 'unknown',\n });\n }\n }\n\n // 5. Handle parts directly (if present in V2) - check this first as it has providerMetadata\n let hasNonToolReasoningParts = false;\n if (dbMsg.content.parts) {\n for (const part of dbMsg.content.parts) {\n // Handle tool-invocation parts\n if (part.type === 'tool-invocation' && part.toolInvocation) {\n const inv = part.toolInvocation;\n\n if (inv.state === 'result') {\n parts.push({\n type: `tool-${inv.toolName}`,\n toolCallId: inv.toolCallId,\n input: inv.args,\n output: inv.result,\n state: 'output-available',\n callProviderMetadata: part.providerMetadata,\n } satisfies AIV5Type.ToolUIPart);\n } else {\n parts.push({\n type: `tool-${inv.toolName}`,\n toolCallId: inv.toolCallId,\n input: inv.args,\n state: 'input-available',\n callProviderMetadata: part.providerMetadata,\n } satisfies AIV5Type.ToolUIPart);\n }\n continue;\n }\n\n // Handle reasoning parts\n if (part.type === 'reasoning') {\n // V2 reasoning parts can have either text directly or details array\n type V2ReasoningPart = {\n type: 'reasoning';\n text?: string;\n reasoning?: string;\n details?: Array<{ type: string; text?: string }>;\n providerMetadata?: AIV5Type.ProviderMetadata;\n };\n const reasoningPart = part as V2ReasoningPart;\n const text =\n reasoningPart.text ||\n reasoningPart.reasoning ||\n (reasoningPart.details?.reduce((p: string, c) => {\n if (c.type === `text` && c.text) return p + c.text;\n return p;\n }, '') ??\n '');\n if (text || reasoningPart.details?.length) {\n parts.push({\n type: 'reasoning',\n text: text || '',\n state: 'done',\n ...(part.providerMetadata && { providerMetadata: part.providerMetadata }),\n });\n }\n continue;\n }\n\n // Skip tool-invocation parts without toolInvocation object and other tool- parts\n if (part.type === 'tool-invocation' || part.type.startsWith('tool-')) {\n continue;\n }\n\n // Convert file parts from V2 format (data) to AIV5 format (url)\n if (part.type === 'file') {\n // Skip file parts that came from experimental_attachments to avoid duplicates\n if (typeof part.data === 'string' && attachmentUrls.has(part.data)) {\n continue;\n }\n\n const categorized =\n typeof part.data === 'string'\n ? categorizeFileData(part.data, part.mimeType)\n : { type: 'raw' as const, mimeType: part.mimeType, data: part.data };\n\n if (categorized.type === 'url' && typeof part.data === 'string') {\n // It's a URL, use the 'url' field directly\n parts.push({\n type: 'file',\n url: part.data,\n mediaType: categorized.mimeType || 'image/png',\n providerMetadata: part.providerMetadata,\n });\n } else {\n // For AI SDK V5 compatibility with inline images (especially Google Gemini),\n // file parts need a 'url' field with data URI\n let filePartData: string;\n let extractedMimeType = part.mimeType;\n\n // Parse data URI if present to extract base64 content and MIME type\n if (typeof part.data === 'string') {\n const parsed = parseDataUri(part.data);\n\n if (parsed.isDataUri) {\n // It's already a data URI, extract the base64 content and MIME type\n filePartData = parsed.base64Content;\n if (parsed.mimeType) {\n extractedMimeType = extractedMimeType || parsed.mimeType;\n }\n } else {\n // It's not a data URI, treat it as raw base64 or plain text\n filePartData = part.data;\n }\n } else {\n filePartData = part.data;\n }\n\n // Ensure we always have a valid MIME type - default to image/png for better compatibility\n const finalMimeType = extractedMimeType || 'image/png';\n\n // Only create a data URI if it's not already one\n let dataUri: string;\n if (typeof filePartData === 'string' && filePartData.startsWith('data:')) {\n // Already a data URI\n dataUri = filePartData;\n } else {\n // Create a data URI from the base64 data\n dataUri = createDataUri(filePartData, finalMimeType);\n }\n\n parts.push({\n type: 'file',\n url: dataUri, // Use url field with data URI\n mediaType: finalMimeType,\n providerMetadata: part.providerMetadata,\n });\n }\n } else if (part.type === 'source') {\n // Convert V2 source parts to AIV5 source-url parts\n type V2SourcePart = {\n type: 'source';\n source: {\n url: string;\n sourceType: string;\n id: string;\n providerMetadata?: AIV5Type.ProviderMetadata;\n };\n providerMetadata?: AIV5Type.ProviderMetadata;\n };\n const sourcePart = part as V2SourcePart;\n parts.push({\n type: 'source-url',\n url: sourcePart.source.url,\n ...(part.providerMetadata && { providerMetadata: part.providerMetadata }),\n } as AIV5Type.SourceUrlUIPart);\n } else if (part.type === 'text') {\n // Text parts need providerMetadata preserved (only if defined)\n parts.push({\n type: 'text',\n text: part.text,\n ...(part.providerMetadata && { providerMetadata: part.providerMetadata }),\n });\n hasNonToolReasoningParts = true;\n } else {\n // Other parts (step-start, etc.) can be pushed as-is\n parts.push(part);\n hasNonToolReasoningParts = true;\n }\n }\n }\n\n // 5. Handle text content (fallback if no parts)\n if (dbMsg.content.content && !hasNonToolReasoningParts) {\n parts.push({ type: 'text', text: dbMsg.content.content });\n }\n\n return {\n id: dbMsg.id,\n role: dbMsg.role,\n metadata,\n parts,\n };\n }\n\n /**\n * Direct conversion from AIV5 UIMessage to MastraDBMessage\n * Combines logic from aiV5UIMessageToMastraMessageV3 + mastraMessageV3ToV2\n */\n private static aiV5UIMessageToMastraDBMessage(uiMsg: AIV5Type.UIMessage): MastraDBMessage {\n const { parts, metadata: rawMetadata } = uiMsg;\n const metadata = (rawMetadata || {}) as Record<string, unknown>;\n\n // Extract Mastra-specific metadata\n const createdAtValue = metadata.createdAt;\n const createdAt = createdAtValue\n ? typeof createdAtValue === 'string'\n ? new Date(createdAtValue)\n : createdAtValue instanceof Date\n ? createdAtValue\n : new Date()\n : new Date();\n const threadId = metadata.threadId as string | undefined;\n const resourceId = metadata.resourceId as string | undefined;\n\n // Remove Mastra-specific metadata from the metadata object\n const cleanMetadata = { ...metadata };\n delete cleanMetadata.createdAt;\n delete cleanMetadata.threadId;\n delete cleanMetadata.resourceId;\n\n // Process parts to build V2 content\n const toolInvocationParts = parts.filter(p => AIV5.isToolUIPart(p));\n const reasoningParts = parts.filter(p => p.type === 'reasoning');\n const fileParts = parts.filter(p => p.type === 'file');\n const textParts = parts.filter(p => p.type === 'text');\n\n // Build tool invocations array\n let toolInvocations: MastraDBMessage['content']['toolInvocations'] = undefined;\n if (toolInvocationParts.length > 0) {\n toolInvocations = toolInvocationParts.map(p => {\n const toolName = getToolName(p);\n if (p.state === 'output-available') {\n return {\n args: p.input,\n result:\n typeof p.output === 'object' && p.output && 'value' in p.output\n ? (p.output as { value: unknown }).value\n : p.output,\n toolCallId: p.toolCallId,\n toolName,\n state: 'result',\n } satisfies NonNullable<MastraDBMessage['content']['toolInvocations']>[0];\n }\n return {\n args: p.input,\n toolCallId: p.toolCallId,\n toolName,\n state: 'call',\n } satisfies NonNullable<MastraDBMessage['content']['toolInvocations']>[0];\n });\n }\n\n // Build reasoning string (AIV4 reasoning is a string, not an array)\n let reasoning: MastraDBMessage['content']['reasoning'] = undefined;\n if (reasoningParts.length > 0) {\n reasoning = reasoningParts.map(p => p.text).join('\\n');\n }\n\n // Build experimental_attachments from file parts\n let experimental_attachments: MastraDBMessage['content']['experimental_attachments'] = undefined;\n if (fileParts.length > 0) {\n experimental_attachments = fileParts.map(p => ({\n url: p.url || '',\n contentType: p.mediaType,\n }));\n }\n\n // Build content from text parts (AIV4 content is a string)\n let content: MastraDBMessage['content']['content'] = undefined;\n if (textParts.length > 0) {\n content = textParts.map(p => p.text).join('');\n }\n // Build V2-compatible parts array\n const v2Parts = parts\n .map(p => {\n // Convert AIV5 UI parts to V2 parts\n if (AIV5.isToolUIPart(p)) {\n const toolName = getToolName(p);\n // AIV5 tool parts have callProviderMetadata, map it to V2's providerMetadata\n const callProviderMetadata = 'callProviderMetadata' in p ? p.callProviderMetadata : undefined;\n if (p.state === 'output-available') {\n return {\n type: 'tool-invocation' as const,\n toolInvocation: {\n toolCallId: p.toolCallId,\n toolName,\n args: p.input,\n result:\n typeof p.output === 'object' && p.output && 'value' in p.output\n ? (p.output as { value: unknown }).value\n : p.output,\n state: 'result' as const,\n },\n providerMetadata: callProviderMetadata,\n } satisfies ToolInvocationUIPart & { providerMetadata?: AIV5Type.ProviderMetadata };\n }\n return {\n type: 'tool-invocation' as const,\n toolInvocation: {\n toolCallId: p.toolCallId,\n toolName,\n args: p.input,\n state: 'call' as const,\n },\n providerMetadata: callProviderMetadata,\n } satisfies ToolInvocationUIPart & { providerMetadata?: AIV5Type.ProviderMetadata };\n }\n\n if (p.type === 'reasoning') {\n return {\n type: 'reasoning' as const,\n reasoning: '',\n details: [\n {\n type: 'text' as const,\n text: p.text,\n },\n ],\n providerMetadata: p.providerMetadata,\n };\n }\n\n if (p.type === 'file') {\n // Convert AIV5 file part (url) to V2 file part (data)\n return {\n type: 'file' as const,\n mimeType: p.mediaType,\n data: p.url || '',\n providerMetadata: p.providerMetadata,\n };\n }\n\n if (p.type === 'source-url') {\n return {\n type: 'source' as const,\n source: {\n url: p.url,\n sourceType: 'url',\n id: p.url, // Use URL as ID\n providerMetadata: p.providerMetadata,\n },\n providerMetadata: p.providerMetadata,\n };\n }\n\n if (p.type === 'text') {\n type V2TextPart = {\n type: 'text';\n text: string;\n providerMetadata?: AIV5Type.ProviderMetadata;\n };\n return {\n type: 'text' as const,\n text: p.text,\n providerMetadata: p.providerMetadata,\n } satisfies V2TextPart;\n }\n\n if (p.type === 'step-start') {\n return p;\n }\n\n return null;\n })\n .filter((p): p is NonNullable<typeof p> => p !== null);\n\n return {\n id: uiMsg.id,\n role: uiMsg.role,\n createdAt,\n threadId,\n resourceId,\n content: {\n format: 2,\n parts: v2Parts as MastraMessageContentV2['parts'],\n toolInvocations,\n reasoning,\n experimental_attachments,\n content,\n metadata: Object.keys(cleanMetadata).length > 0 ? cleanMetadata : undefined,\n },\n };\n }\n\n /**\n * Direct conversion from AIV5 ModelMessage to MastraDBMessage\n * Combines logic from aiV5ModelMessageToMastraMessageV3 + mastraMessageV3ToV2\n */\n private static aiV5ModelMessageToMastraDBMessage(\n modelMsg: AIV5Type.ModelMessage,\n _messageSource?: MessageSource,\n ): MastraDBMessage {\n const content = Array.isArray(modelMsg.content) ? modelMsg.content : [{ type: 'text', text: modelMsg.content }];\n\n // Process parts to build V2 content structure\n const v2Parts: MastraMessageContentV2['parts'] = [];\n const toolInvocations: NonNullable<MastraDBMessage['content']['toolInvocations']> = [];\n const reasoningParts: string[] = [];\n const experimental_attachments: NonNullable<MastraDBMessage['content']['experimental_attachments']> = [];\n const textParts: Array<{ text: string; providerMetadata?: Record<string, unknown> }> = [];\n\n let lastPartWasToolResult = false;\n\n // Type helper for objects that may have providerMetadata at runtime\n type WithProviderMetadata = { providerMetadata?: Record<string, unknown> };\n\n for (const part of content) {\n // Merge part-level and message-level providerMetadata\n const providerMetadata = {\n ...((modelMsg as WithProviderMetadata).providerMetadata || {}),\n ...((part as WithProviderMetadata).providerMetadata || {}),\n };\n const hasProviderMetadata = Object.keys(providerMetadata).length > 0;\n\n if (part.type === 'text') {\n const textPart: AIV4Type.TextPart = {\n type: 'text',\n text: part.text,\n ...(hasProviderMetadata && { experimental_providerMetadata: providerMetadata as AIV5Type.ProviderMetadata }),\n };\n v2Parts.push(textPart);\n textParts.push({ text: part.text, providerMetadata: hasProviderMetadata ? providerMetadata : undefined });\n lastPartWasToolResult = false;\n } else if (part.type === 'tool-call') {\n const toolCallPart = part as AIV5Type.ToolCallPart;\n const toolInvocationPart: UIMessageV4['parts'][number] & {\n providerMetadata?: AIV5Type.ProviderMetadata;\n } = {\n type: 'tool-invocation',\n toolInvocation: {\n toolCallId: toolCallPart.toolCallId,\n toolName: toolCallPart.toolName,\n args: toolCallPart.input,\n state: 'call',\n },\n ...(hasProviderMetadata && { providerMetadata: providerMetadata as AIV5Type.ProviderMetadata }),\n };\n v2Parts.push(toolInvocationPart);\n toolInvocations.push({\n toolCallId: toolCallPart.toolCallId,\n toolName: toolCallPart.toolName,\n args: toolCallPart.input,\n state: 'call',\n });\n lastPartWasToolResult = false;\n } else if (part.type === 'tool-result') {\n const toolResultPart = part as AIV5Type.ToolResultPart;\n // Find matching tool call and update it to result state\n const matchingCall = toolInvocations.find(inv => inv.toolCallId === toolResultPart.toolCallId);\n\n // Type guard for tool-invocation parts\n type ToolInvocationPart = Extract<UIMessageV4['parts'][number], { type: 'tool-invocation' }>;\n const matchingV2Part = v2Parts.find(\n (p): p is ToolInvocationPart =>\n p.type === 'tool-invocation' &&\n 'toolInvocation' in p &&\n p.toolInvocation.toolCallId === toolResultPart.toolCallId,\n );\n\n if (matchingCall) {\n // Update the matching call to result state\n matchingCall.state = 'result';\n (matchingCall as ToolInvocationV4 & { result: unknown }).result =\n typeof toolResultPart.output === 'object' && toolResultPart.output && 'value' in toolResultPart.output\n ? (toolResultPart.output as { value: unknown }).value\n : toolResultPart.output;\n } else {\n // No matching call, create a result-only invocation\n // toolResultPart may have toolName at runtime even though it's not in the type\n type ToolResultWithName = AIV5Type.ToolResultPart & { toolName?: string };\n const resultPartWithName = toolResultPart as ToolResultWithName;\n\n toolInvocations.push({\n toolCallId: toolResultPart.toolCallId,\n toolName: resultPartWithName.toolName || 'unknown',\n args: {},\n result:\n typeof toolResultPart.output === 'object' && toolResultPart.output && 'value' in toolResultPart.output\n ? (toolResultPart.output as { value: unknown }).value\n : toolResultPart.output,\n state: 'result',\n });\n }\n\n if (matchingV2Part && matchingV2Part.type === 'tool-invocation') {\n // Update the matching part to result state\n matchingV2Part.toolInvocation.state = 'result';\n (matchingV2Part.toolInvocation as ToolInvocationV4 & { result: unknown }).result =\n typeof toolResultPart.output === 'object' && toolResultPart.output && 'value' in toolResultPart.output\n ? (toolResultPart.output as { value: unknown }).value\n : toolResultPart.output;\n if (hasProviderMetadata) {\n (\n matchingV2Part as typeof matchingV2Part & { providerMetadata: AIV5Type.ProviderMetadata }\n ).providerMetadata = providerMetadata as AIV5Type.ProviderMetadata;\n }\n } else {\n // No matching call, create a result-only part\n // toolResultPart may have toolName at runtime even though it's not in the type\n type ToolResultWithName = AIV5Type.ToolResultPart & { toolName?: string };\n const resultPartWithName = toolResultPart as ToolResultWithName;\n\n const toolInvocationPart: UIMessageV4['parts'][number] & {\n providerMetadata?: AIV5Type.ProviderMetadata;\n } = {\n type: 'tool-invocation',\n toolInvocation: {\n toolCallId: toolResultPart.toolCallId,\n toolName: resultPartWithName.toolName || 'unknown',\n args: {},\n result:\n typeof toolResultPart.output === 'object' && toolResultPart.output && 'value' in toolResultPart.output\n ? (toolResultPart.output as { value: unknown }).value\n : toolResultPart.output,\n state: 'result',\n } as ToolInvocationV4 & { result: unknown },\n ...(hasProviderMetadata && { providerMetadata: providerMetadata as AIV5Type.ProviderMetadata }),\n };\n v2Parts.push(toolInvocationPart);\n }\n lastPartWasToolResult = true;\n } else if (part.type === 'reasoning') {\n const reasoningPart = part as AIV5Type.ReasoningUIPart;\n const v2ReasoningPart: UIMessageV4['parts'][number] & { providerMetadata?: AIV5Type.ProviderMetadata } = {\n type: 'reasoning',\n reasoning: reasoningPart.text,\n details: [{ type: 'text', text: reasoningPart.text }],\n ...(hasProviderMetadata && { providerMetadata: providerMetadata as AIV5Type.ProviderMetadata }),\n };\n v2Parts.push(v2ReasoningPart);\n reasoningParts.push(reasoningPart.text);\n lastPartWasToolResult = false;\n } else if (part.type === 'image') {\n const imagePart = part as AIV5Type.ImagePart;\n // Convert image to data URI or URL for V2 file part\n let imageData: string;\n // ImagePart may have mimeType at runtime even though it's not in the type\n type ImagePartWithMimeType = AIV5Type.ImagePart & { mimeType?: string };\n const mimeType = (imagePart as ImagePartWithMimeType).mimeType || 'image/jpeg';\n\n if ('url' in imagePart && typeof imagePart.url === 'string') {\n imageData = imagePart.url;\n } else if ('data' in imagePart) {\n if (typeof imagePart.data === 'string') {\n imageData =\n imagePart.data.startsWith('data:') || imagePart.data.startsWith('http')\n ? imagePart.data\n : `data:${mimeType};base64,${imagePart.data}`;\n } else {\n const base64 = Buffer.from(imagePart.data as Uint8Array).toString('base64');\n imageData = `data:${mimeType};base64,${base64}`;\n }\n } else {\n imageData = '';\n }\n\n const imageFilePart: UIMessageV4['parts'][number] & { providerMetadata?: AIV5Type.ProviderMetadata } = {\n type: 'file',\n data: imageData,\n mimeType,\n ...(hasProviderMetadata && { providerMetadata: providerMetadata as AIV5Type.ProviderMetadata }),\n };\n v2Parts.push(imageFilePart);\n experimental_attachments.push({\n url: imageData,\n contentType: mimeType,\n });\n lastPartWasToolResult = false;\n } else if (part.type === 'file') {\n const filePart = part as AIV5Type.FilePart;\n // AIV5 ModelMessage file parts use 'mediaType'\n // V2 file parts use 'mimeType'\n const mimeType = filePart.mediaType || 'application/octet-stream';\n let fileData: string;\n if ('url' in filePart && typeof filePart.url === 'string') {\n fileData = filePart.url;\n } else if ('data' in filePart) {\n if (typeof filePart.data === 'string') {\n fileData =\n filePart.data.startsWith('data:') || filePart.data.startsWith('http')\n ? filePart.data\n : `data:${mimeType};base64,${filePart.data}`;\n } else {\n const base64 = Buffer.from(filePart.data as Uint8Array).toString('base64');\n fileData = `data:${mimeType};base64,${base64}`;\n }\n } else {\n fileData = '';\n }\n\n const v2FilePart: UIMessageV4['parts'][number] & { providerMetadata?: AIV5Type.ProviderMetadata } = {\n type: 'file',\n data: fileData,\n mimeType,\n ...(hasProviderMetadata && { providerMetadata: providerMetadata as AIV5Type.ProviderMetadata }),\n };\n v2Parts.push(v2FilePart);\n experimental_attachments.push({\n url: fileData,\n contentType: mimeType,\n });\n lastPartWasToolResult = false;\n }\n }\n\n // Insert step-start if assistant message starts after tool result\n if (modelMsg.role === 'assistant' && lastPartWasToolResult && v2Parts.length > 0) {\n const lastPart = v2Parts[v2Parts.length - 1];\n if (lastPart && lastPart.type !== 'text') {\n const emptyTextPart: UIMessageV4['parts'][number] = { type: 'text', text: '' };\n v2Parts.push(emptyTextPart);\n textParts.push({ text: '' });\n }\n }\n\n // Build V2 content string\n let contentString: MastraDBMessage['content']['content'] = undefined;\n if (textParts.length > 0) {\n contentString = textParts.map(p => p.text).join('\\n');\n }\n\n // Store original content in metadata for round-trip\n const metadata: Record<string, unknown> = {};\n\n // Generate ID from modelMsg if available, otherwise create a new one\n const id =\n `id` in modelMsg && typeof modelMsg.id === `string`\n ? modelMsg.id\n : `msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n return {\n id,\n role: MessageList.getRole(modelMsg),\n createdAt: new Date(),\n content: {\n format: 2,\n parts: v2Parts,\n toolInvocations: toolInvocations.length > 0 ? toolInvocations : undefined,\n reasoning: reasoningParts.length > 0 ? reasoningParts.join('\\n') : undefined,\n experimental_attachments: experimental_attachments.length > 0 ? experimental_attachments : undefined,\n content: contentString,\n metadata,\n },\n };\n }\n\n private aiV4CoreMessagesToAIV5ModelMessages(\n messages: CoreMessageV4[],\n source: MessageSource,\n ): AIV5Type.ModelMessage[] {\n return this.aiV5UIMessagesToAIV5ModelMessages(\n messages\n .map(m => this.aiV4CoreMessageToMastraDBMessage(m, source))\n .map(m => MessageList.mastraDBMessageToAIV5UIMessage(m)),\n );\n }\n\n private aiV5UIMessagesToAIV5ModelMessages(\n messages: AIV5Type.UIMessage[],\n filterIncompleteToolCalls = false,\n ): AIV5Type.ModelMessage[] {\n const sanitized = this.sanitizeV5UIMessages(messages, filterIncompleteToolCalls);\n const preprocessed = this.addStartStepPartsForAIV5(sanitized);\n const result = AIV5.convertToModelMessages(preprocessed);\n return result;\n }\n\n private addStartStepPartsForAIV5(messages: AIV5Type.UIMessage[]): AIV5Type.UIMessage[] {\n for (const message of messages) {\n if (message.role !== `assistant`) continue;\n for (const [index, part] of message.parts.entries()) {\n if (!AIV5.isToolUIPart(part)) continue;\n // If we don't insert step-start between tools and other parts, AIV5.convertToModelMessages will incorrectly add extra tool parts in the wrong order\n // ex: ui message with parts: [tool-result, text] becomes [assistant-message-with-both-parts, tool-result-message], when it should become [tool-call-message, tool-result-message, text-message]\n if (message.parts.at(index + 1)?.type !== `step-start`) {\n message.parts.splice(index + 1, 0, { type: 'step-start' });\n }\n }\n }\n return messages;\n }\n\n private sanitizeV5UIMessages(\n messages: AIV5Type.UIMessage[],\n filterIncompleteToolCalls = false,\n ): AIV5Type.UIMessage[] {\n const msgs = messages\n .map(m => {\n if (m.parts.length === 0) return false;\n // Filter out streaming states and optionally input-available (which aren't supported by convertToModelMessages)\n const safeParts = m.parts.filter(p => {\n if (!AIV5.isToolUIPart(p)) return true;\n\n // When sending messages TO the LLM: only keep completed tool calls (output-available/output-error)\n // This filters out input-available (incomplete client-side tool calls) and input-streaming\n if (filterIncompleteToolCalls) {\n return p.state === 'output-available' || p.state === 'output-error';\n }\n\n // When processing response messages FROM the LLM: keep input-available states\n // (tool calls waiting for client-side execution) but filter out input-streaming\n return p.state !== 'input-streaming';\n });\n\n if (!safeParts.length) return false;\n\n const sanitized = {\n ...m,\n parts: safeParts.map(part => {\n if (AIV5.isToolUIPart(part) && part.state === 'output-available') {\n return {\n ...part,\n output:\n typeof part.output === 'object' && part.output && 'value' in part.output\n ? part.output.value\n : part.output,\n };\n }\n return part;\n }),\n };\n\n return sanitized;\n })\n .filter((m): m is AIV5Type.UIMessage => Boolean(m));\n return msgs;\n }\n\n static hasAIV5UIMessageCharacteristics(\n msg: AIV5Type.UIMessage | UIMessageV4 | AIV4Type.Message,\n ): msg is AIV5Type.UIMessage {\n // ai v4 has these separated arrays of parts that don't record overall order\n // so we can check for their presence as a faster/early check\n if (\n `toolInvocations` in msg ||\n `reasoning` in msg ||\n `experimental_attachments` in msg ||\n `data` in msg ||\n `annotations` in msg\n // don't check `content` in msg because it fully narrows the type to v5 and there's a chance someone might mess up and add content to a v5 message, that's more likely than the other keys\n )\n return false;\n\n if (!msg.parts) return false; // this is likely an AIV4Type.Message\n\n for (const part of msg.parts) {\n if (`metadata` in part) return true;\n\n // tools are annoying cause ai v5 has the type as\n // tool-${toolName}\n // in v4 we had tool-invocation\n // technically\n // v4 tool\n if (`toolInvocation` in part) return false;\n // v5 tool\n if (`toolCallId` in part) return true;\n\n if (part.type === `source`) return false;\n if (part.type === `source-url`) return true;\n\n if (part.type === `reasoning`) {\n if (`state` in part || `text` in part) return true; // v5\n if (`reasoning` in part || `details` in part) return false; // v4\n }\n\n if (part.type === `file` && `mediaType` in part) return true;\n }\n\n return false; // default to v4 for backwards compat\n }\n static isAIV5UIMessage(msg: MessageInput): msg is AIV5Type.UIMessage {\n return (\n !MessageList.isMastraMessage(msg) &&\n !MessageList.isAIV5CoreMessage(msg) &&\n `parts` in msg &&\n MessageList.hasAIV5UIMessageCharacteristics(msg)\n );\n }\n\n static hasAIV5CoreMessageCharacteristics(\n msg:\n | CoreMessageV4\n | AIV5Type.ModelMessage\n // This is here because AIV4 \"Message\" type can omit parts! 😱\n | AIV4Type.Message,\n ): msg is AIV5Type.ModelMessage {\n if (`experimental_providerMetadata` in msg) return false; // is v4 cause v5 doesn't have this property\n\n // it's compatible with either if content is a string, no difference\n if (typeof msg.content === `string`) return false; // default to v4 for backwards compat\n\n for (const part of msg.content) {\n if (part.type === `tool-result` && `output` in part) return true; // v5 renamed result->output,\n if (part.type === `tool-call` && `input` in part) return true; // v5 renamed args->input\n if (part.type === `tool-result` && `result` in part) return false; // v5 renamed result->output,\n if (part.type === `tool-call` && `args` in part) return false; // v5 renamed args->input\n\n // for file and image\n if (`mediaType` in part) return true; // v5 renamed mimeType->mediaType\n if (`mimeType` in part) return false;\n\n // applies to multiple part types\n if (`experimental_providerMetadata` in part) return false; // was in v4 but deprecated for providerOptions, v4+5 have providerOptions though, can't check the other way\n\n if (part.type === `reasoning` && `signature` in part) return false; // v5 doesn't have signature, which is optional in v4\n\n if (part.type === `redacted-reasoning`) return false; // only in v4, seems like in v5 they add it to providerOptions or something? https://github.com/vercel/ai/blob/main/packages/codemod/src/codemods/v5/replace-redacted-reasoning-type.ts#L90\n }\n\n return false; // default to v4 for backwards compat\n }\n\n private static cacheKeyFromAIV5Parts(parts: AIV5Type.UIMessage['parts']): string {\n let key = ``;\n for (const part of parts) {\n key += part.type;\n if (part.type === `text`) {\n key += part.text;\n }\n if (AIV5.isToolUIPart(part) || part.type === 'dynamic-tool') {\n key += part.toolCallId;\n key += part.state;\n }\n if (part.type === `reasoning`) {\n key += part.text;\n }\n if (part.type === `file`) {\n key += part.url.length;\n key += part.mediaType;\n key += part.filename || '';\n }\n }\n return key;\n }\n\n private static cacheKeyFromAIV5ModelMessageContent(content: AIV5Type.ModelMessage['content']): string {\n if (typeof content === `string`) return content;\n let key = ``;\n for (const part of content) {\n key += part.type;\n if (part.type === `text`) {\n key += part.text.length;\n }\n if (part.type === `reasoning`) {\n key += part.text.length;\n }\n if (part.type === `tool-call`) {\n key += part.toolCallId;\n key += part.toolName;\n }\n if (part.type === `tool-result`) {\n key += part.toolCallId;\n key += part.toolName;\n }\n if (part.type === `file`) {\n key += part.filename;\n key += part.mediaType;\n }\n if (part.type === `image`) {\n key += getImageCacheKey(part.image);\n key += part.mediaType;\n }\n }\n return key;\n }\n}\n"]}