@mastra/core 0.15.3-alpha.1 → 0.15.3-alpha.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 (131) hide show
  1. package/dist/agent/index.cjs +11 -11
  2. package/dist/agent/index.js +2 -2
  3. package/dist/agent/input-processor/index.cjs +6 -6
  4. package/dist/agent/input-processor/index.js +1 -1
  5. package/dist/agent/message-list/index.d.ts +5 -1
  6. package/dist/agent/message-list/index.d.ts.map +1 -1
  7. package/dist/agent/message-list/prompt/convert-file.d.ts +7 -0
  8. package/dist/agent/message-list/prompt/convert-file.d.ts.map +1 -0
  9. package/dist/agent/message-list/prompt/download-assets.d.ts +15 -0
  10. package/dist/agent/message-list/prompt/download-assets.d.ts.map +1 -0
  11. package/dist/{chunk-6VROHRAR.cjs → chunk-24TFSB6Z.cjs} +30 -7
  12. package/dist/chunk-24TFSB6Z.cjs.map +1 -0
  13. package/dist/{chunk-BRNBKCHE.js → chunk-5TFCIXWE.js} +10 -8
  14. package/dist/chunk-5TFCIXWE.js.map +1 -0
  15. package/dist/{chunk-TINMY4WA.js → chunk-APVV75XG.js} +3 -3
  16. package/dist/{chunk-TINMY4WA.js.map → chunk-APVV75XG.js.map} +1 -1
  17. package/dist/{chunk-HRDADYVX.cjs → chunk-AYFN43FB.cjs} +4 -4
  18. package/dist/{chunk-HRDADYVX.cjs.map → chunk-AYFN43FB.cjs.map} +1 -1
  19. package/dist/{chunk-FGCA6CCM.js → chunk-BGOXFBFK.js} +295 -275
  20. package/dist/chunk-BGOXFBFK.js.map +1 -0
  21. package/dist/{chunk-XEY3CWQW.cjs → chunk-D2GH2HAK.cjs} +9 -9
  22. package/dist/{chunk-XEY3CWQW.cjs.map → chunk-D2GH2HAK.cjs.map} +1 -1
  23. package/dist/{chunk-6Z7D7CA3.cjs → chunk-DJKIK6ZB.cjs} +326 -306
  24. package/dist/chunk-DJKIK6ZB.cjs.map +1 -0
  25. package/dist/{chunk-XOZ737RO.js → chunk-EMAAAVRA.js} +3 -3
  26. package/dist/{chunk-XOZ737RO.js.map → chunk-EMAAAVRA.js.map} +1 -1
  27. package/dist/chunk-GOG77M6R.js +103 -0
  28. package/dist/chunk-GOG77M6R.js.map +1 -0
  29. package/dist/{chunk-UG3KS3XV.cjs → chunk-HXEHQLBD.cjs} +4 -4
  30. package/dist/{chunk-UG3KS3XV.cjs.map → chunk-HXEHQLBD.cjs.map} +1 -1
  31. package/dist/{chunk-MKWJKRSX.js → chunk-MEROMP3Z.js} +3 -3
  32. package/dist/{chunk-MKWJKRSX.js.map → chunk-MEROMP3Z.js.map} +1 -1
  33. package/dist/{chunk-C5C4PN54.js → chunk-O7IQL4DX.js} +288 -5
  34. package/dist/chunk-O7IQL4DX.js.map +1 -0
  35. package/dist/{chunk-VBAWR62U.cjs → chunk-QHEB6ZLO.cjs} +13 -11
  36. package/dist/chunk-QHEB6ZLO.cjs.map +1 -0
  37. package/dist/{chunk-5MCNXLGT.js → chunk-TQRLZH64.js} +4 -4
  38. package/dist/{chunk-5MCNXLGT.js.map → chunk-TQRLZH64.js.map} +1 -1
  39. package/dist/{chunk-QA2TWVUS.cjs → chunk-TWNFR6MQ.cjs} +288 -5
  40. package/dist/chunk-TWNFR6MQ.cjs.map +1 -0
  41. package/dist/{chunk-CDLIHAX2.cjs → chunk-UGN2UU3K.cjs} +4 -4
  42. package/dist/{chunk-CDLIHAX2.cjs.map → chunk-UGN2UU3K.cjs.map} +1 -1
  43. package/dist/{chunk-E3LAPNKY.js → chunk-WUQSFK7W.js} +4 -4
  44. package/dist/{chunk-E3LAPNKY.js.map → chunk-WUQSFK7W.js.map} +1 -1
  45. package/dist/{chunk-QBNRMJAN.cjs → chunk-YTVX52NU.cjs} +6 -6
  46. package/dist/{chunk-QBNRMJAN.cjs.map → chunk-YTVX52NU.cjs.map} +1 -1
  47. package/dist/chunk-ZAJTIZZF.cjs +108 -0
  48. package/dist/chunk-ZAJTIZZF.cjs.map +1 -0
  49. package/dist/{chunk-FLXWZUIG.js → chunk-ZC64CG7J.js} +26 -4
  50. package/dist/chunk-ZC64CG7J.js.map +1 -0
  51. package/dist/index.cjs +47 -43
  52. package/dist/index.js +10 -10
  53. package/dist/integration/index.cjs +3 -3
  54. package/dist/integration/index.js +1 -1
  55. package/dist/llm/model/model.d.ts.map +1 -1
  56. package/dist/llm/model/model.loop.d.ts +1 -1
  57. package/dist/llm/model/model.loop.d.ts.map +1 -1
  58. package/dist/loop/index.cjs +2 -2
  59. package/dist/loop/index.js +1 -1
  60. package/dist/loop/types.d.ts +2 -0
  61. package/dist/loop/types.d.ts.map +1 -1
  62. package/dist/loop/workflow/llm-execution.d.ts +1 -1
  63. package/dist/loop/workflow/llm-execution.d.ts.map +1 -1
  64. package/dist/mastra/index.cjs +2 -2
  65. package/dist/mastra/index.js +1 -1
  66. package/dist/memory/index.cjs +4 -4
  67. package/dist/memory/index.js +1 -1
  68. package/dist/network/index.cjs +4 -4
  69. package/dist/network/index.js +2 -2
  70. package/dist/network/vNext/index.cjs +14 -14
  71. package/dist/network/vNext/index.js +2 -2
  72. package/dist/processors/index.cjs +8 -8
  73. package/dist/processors/index.js +2 -2
  74. package/dist/relevance/index.cjs +4 -4
  75. package/dist/relevance/index.js +1 -1
  76. package/dist/scores/index.cjs +5 -5
  77. package/dist/scores/index.js +1 -1
  78. package/dist/storage/index.cjs +3 -3
  79. package/dist/storage/index.js +1 -1
  80. package/dist/stream/aisdk/v5/compat/consume-stream.d.ts +8 -0
  81. package/dist/stream/aisdk/v5/compat/consume-stream.d.ts.map +1 -0
  82. package/dist/stream/aisdk/v5/compat/content.d.ts +7 -0
  83. package/dist/stream/aisdk/v5/compat/content.d.ts.map +1 -0
  84. package/dist/stream/aisdk/v5/compat/delayed-promise.d.ts +23 -0
  85. package/dist/stream/aisdk/v5/compat/delayed-promise.d.ts.map +1 -0
  86. package/dist/stream/aisdk/v5/compat/index.d.ts +8 -0
  87. package/dist/stream/aisdk/v5/compat/index.d.ts.map +1 -0
  88. package/dist/stream/aisdk/v5/compat/media.d.ts +91 -0
  89. package/dist/stream/aisdk/v5/compat/media.d.ts.map +1 -0
  90. package/dist/stream/aisdk/v5/compat/prepare-tools.d.ts +11 -0
  91. package/dist/stream/aisdk/v5/compat/prepare-tools.d.ts.map +1 -0
  92. package/dist/stream/aisdk/v5/compat/ui-message.d.ts +20 -0
  93. package/dist/stream/aisdk/v5/compat/ui-message.d.ts.map +1 -0
  94. package/dist/stream/aisdk/v5/compat/validation.d.ts +17 -0
  95. package/dist/stream/aisdk/v5/compat/validation.d.ts.map +1 -0
  96. package/dist/stream/aisdk/v5/output.d.ts +1 -1
  97. package/dist/stream/base/output.d.ts +1 -1
  98. package/dist/stream/index.cjs +3 -3
  99. package/dist/stream/index.js +1 -1
  100. package/dist/test-utils/llm-mock.cjs +2 -2
  101. package/dist/test-utils/llm-mock.js +1 -1
  102. package/dist/tools/index.cjs +4 -4
  103. package/dist/tools/index.js +1 -1
  104. package/dist/tools/is-vercel-tool.cjs +2 -2
  105. package/dist/tools/is-vercel-tool.js +1 -1
  106. package/dist/tools/validation.d.ts.map +1 -1
  107. package/dist/utils.cjs +20 -16
  108. package/dist/utils.d.ts +9 -0
  109. package/dist/utils.d.ts.map +1 -1
  110. package/dist/utils.js +1 -1
  111. package/dist/workflows/evented/index.cjs +10 -10
  112. package/dist/workflows/evented/index.js +1 -1
  113. package/dist/workflows/index.cjs +10 -10
  114. package/dist/workflows/index.js +1 -1
  115. package/dist/workflows/legacy/index.cjs +22 -22
  116. package/dist/workflows/legacy/index.js +1 -1
  117. package/package.json +3 -3
  118. package/dist/chunk-6VROHRAR.cjs.map +0 -1
  119. package/dist/chunk-6Z7D7CA3.cjs.map +0 -1
  120. package/dist/chunk-BRNBKCHE.js.map +0 -1
  121. package/dist/chunk-C5C4PN54.js.map +0 -1
  122. package/dist/chunk-E4XQMNEI.cjs +0 -77
  123. package/dist/chunk-E4XQMNEI.cjs.map +0 -1
  124. package/dist/chunk-FGCA6CCM.js.map +0 -1
  125. package/dist/chunk-FLXWZUIG.js.map +0 -1
  126. package/dist/chunk-IVGAHFAJ.js +0 -72
  127. package/dist/chunk-IVGAHFAJ.js.map +0 -1
  128. package/dist/chunk-QA2TWVUS.cjs.map +0 -1
  129. package/dist/chunk-VBAWR62U.cjs.map +0 -1
  130. package/dist/stream/aisdk/v5/compat.d.ts +0 -182
  131. package/dist/stream/aisdk/v5/compat.d.ts.map +0 -1
@@ -1,10 +1,12 @@
1
1
  'use strict';
2
2
 
3
+ var chunk24TFSB6Z_cjs = require('./chunk-24TFSB6Z.cjs');
3
4
  var chunkC73WLCY3_cjs = require('./chunk-C73WLCY3.cjs');
4
5
  var crypto = require('crypto');
5
6
  var AIV4 = require('ai');
6
7
  var AIV5 = require('ai-v5');
7
8
  var providerUtils = require('@ai-sdk/provider-utils');
9
+ var providerUtilsV5 = require('@ai-sdk/provider-utils-v5');
8
10
  var zod = require('zod');
9
11
 
10
12
  function _interopNamespace(e) {
@@ -60,6 +62,178 @@ var DefaultGeneratedFileWithType = class extends DefaultGeneratedFile {
60
62
  }
61
63
  };
62
64
 
65
+ // src/stream/aisdk/v5/compat/content.ts
66
+ function splitDataUrl(dataUrl) {
67
+ try {
68
+ const [header, base64Content] = dataUrl.split(",");
69
+ return {
70
+ mediaType: header?.split(";")[0]?.split(":")[1],
71
+ base64Content
72
+ };
73
+ } catch {
74
+ return {
75
+ mediaType: void 0,
76
+ base64Content: void 0
77
+ };
78
+ }
79
+ }
80
+ function convertToDataContent(content) {
81
+ if (content instanceof Uint8Array) {
82
+ return { data: content, mediaType: void 0 };
83
+ }
84
+ if (content instanceof ArrayBuffer) {
85
+ return { data: new Uint8Array(content), mediaType: void 0 };
86
+ }
87
+ if (typeof content === "string") {
88
+ try {
89
+ content = new URL(content);
90
+ } catch {
91
+ }
92
+ }
93
+ if (content instanceof URL && content.protocol === "data:") {
94
+ const { mediaType: dataUrlMediaType, base64Content } = splitDataUrl(content.toString());
95
+ if (dataUrlMediaType == null || base64Content == null) {
96
+ throw new chunkC73WLCY3_cjs.MastraError({
97
+ id: "INVALID_DATA_URL_FORMAT",
98
+ text: `Invalid data URL format in content ${content.toString()}`,
99
+ domain: "LLM" /* LLM */,
100
+ category: "USER" /* USER */
101
+ });
102
+ }
103
+ return { data: base64Content, mediaType: dataUrlMediaType };
104
+ }
105
+ return { data: content, mediaType: void 0 };
106
+ }
107
+ var imageMediaTypeSignatures = [
108
+ {
109
+ mediaType: "image/gif",
110
+ bytesPrefix: [71, 73, 70],
111
+ base64Prefix: "R0lG"
112
+ },
113
+ {
114
+ mediaType: "image/png",
115
+ bytesPrefix: [137, 80, 78, 71],
116
+ base64Prefix: "iVBORw"
117
+ },
118
+ {
119
+ mediaType: "image/jpeg",
120
+ bytesPrefix: [255, 216],
121
+ base64Prefix: "/9j/"
122
+ },
123
+ {
124
+ mediaType: "image/webp",
125
+ bytesPrefix: [82, 73, 70, 70],
126
+ base64Prefix: "UklGRg"
127
+ },
128
+ {
129
+ mediaType: "image/bmp",
130
+ bytesPrefix: [66, 77],
131
+ base64Prefix: "Qk"
132
+ },
133
+ {
134
+ mediaType: "image/tiff",
135
+ bytesPrefix: [73, 73, 42, 0],
136
+ base64Prefix: "SUkqAA"
137
+ },
138
+ {
139
+ mediaType: "image/tiff",
140
+ bytesPrefix: [77, 77, 0, 42],
141
+ base64Prefix: "TU0AKg"
142
+ },
143
+ {
144
+ mediaType: "image/avif",
145
+ bytesPrefix: [0, 0, 0, 32, 102, 116, 121, 112, 97, 118, 105, 102],
146
+ base64Prefix: "AAAAIGZ0eXBhdmlm"
147
+ },
148
+ {
149
+ mediaType: "image/heic",
150
+ bytesPrefix: [0, 0, 0, 32, 102, 116, 121, 112, 104, 101, 105, 99],
151
+ base64Prefix: "AAAAIGZ0eXBoZWlj"
152
+ }
153
+ ];
154
+ var stripID3 = (data) => {
155
+ const bytes = typeof data === "string" ? providerUtilsV5.convertBase64ToUint8Array(data) : data;
156
+ const id3Size = (
157
+ // @ts-ignore
158
+ (bytes[6] & 127) << 21 | // @ts-ignore
159
+ (bytes[7] & 127) << 14 | // @ts-ignore
160
+ (bytes[8] & 127) << 7 | // @ts-ignore
161
+ bytes[9] & 127
162
+ );
163
+ return bytes.slice(id3Size + 10);
164
+ };
165
+ function stripID3TagsIfPresent(data) {
166
+ const hasId3 = typeof data === "string" && data.startsWith("SUQz") || typeof data !== "string" && data.length > 10 && data[0] === 73 && // 'I'
167
+ data[1] === 68 && // 'D'
168
+ data[2] === 51;
169
+ return hasId3 ? stripID3(data) : data;
170
+ }
171
+ function detectMediaType({
172
+ data,
173
+ signatures
174
+ }) {
175
+ const processedData = stripID3TagsIfPresent(data);
176
+ for (const signature of signatures) {
177
+ if (typeof processedData === "string" ? processedData.startsWith(signature.base64Prefix) : processedData.length >= signature.bytesPrefix.length && signature.bytesPrefix.every((byte, index) => processedData[index] === byte)) {
178
+ return signature.mediaType;
179
+ }
180
+ }
181
+ return void 0;
182
+ }
183
+
184
+ // src/agent/message-list/prompt/convert-file.ts
185
+ function convertImageFilePart(part, downloadedAssets) {
186
+ let originalData;
187
+ const type = part.type;
188
+ switch (type) {
189
+ case "image":
190
+ originalData = part.image;
191
+ break;
192
+ case "file":
193
+ originalData = part.data;
194
+ break;
195
+ default:
196
+ throw new Error(`Unsupported part type: ${type}`);
197
+ }
198
+ const { data: convertedData, mediaType: convertedMediaType } = convertToDataContent(originalData);
199
+ let mediaType = convertedMediaType ?? part.mediaType;
200
+ let data = convertedData;
201
+ if (data instanceof URL) {
202
+ const downloadedFile = downloadedAssets[data.toString()];
203
+ if (downloadedFile) {
204
+ data = downloadedFile.data;
205
+ mediaType ??= downloadedFile.mediaType;
206
+ }
207
+ }
208
+ switch (type) {
209
+ case "image": {
210
+ if (data instanceof Uint8Array || typeof data === "string") {
211
+ mediaType = detectMediaType({ data, signatures: imageMediaTypeSignatures }) ?? mediaType;
212
+ }
213
+ return {
214
+ type: "file",
215
+ mediaType: mediaType ?? "image/*",
216
+ // any image
217
+ filename: void 0,
218
+ data,
219
+ providerOptions: part.providerOptions
220
+ };
221
+ }
222
+ case "file": {
223
+ if (mediaType == null) {
224
+ throw new Error(`Media type is missing for file part`);
225
+ }
226
+ return {
227
+ type: "file",
228
+ mediaType,
229
+ filename: part.filename,
230
+ data,
231
+ providerOptions: part.providerOptions
232
+ };
233
+ }
234
+ }
235
+ }
236
+
63
237
  // src/agent/message-list/prompt/attachments-to-parts.ts
64
238
  function attachmentsToParts(attachments) {
65
239
  const parts = [];
@@ -437,6 +611,79 @@ function convertDataContentToBase64String(content) {
437
611
  }
438
612
  return providerUtils.convertUint8ArrayToBase64(content);
439
613
  }
614
+ var downloadFromUrl = async ({ url, downloadRetries }) => {
615
+ const urlText = url.toString();
616
+ try {
617
+ const response = await chunk24TFSB6Z_cjs.fetchWithRetry(
618
+ urlText,
619
+ {
620
+ method: "GET"
621
+ },
622
+ downloadRetries
623
+ );
624
+ if (!response.ok) {
625
+ throw new chunkC73WLCY3_cjs.MastraError({
626
+ id: "DOWNLOAD_ASSETS_FAILED",
627
+ text: "Failed to download asset",
628
+ domain: "LLM" /* LLM */,
629
+ category: "USER" /* USER */
630
+ });
631
+ }
632
+ return {
633
+ data: new Uint8Array(await response.arrayBuffer()),
634
+ mediaType: response.headers.get("content-type") ?? void 0
635
+ };
636
+ } catch (error) {
637
+ throw new chunkC73WLCY3_cjs.MastraError(
638
+ {
639
+ id: "DOWNLOAD_ASSETS_FAILED",
640
+ text: "Failed to download asset",
641
+ domain: "LLM" /* LLM */,
642
+ category: "USER" /* USER */
643
+ },
644
+ error
645
+ );
646
+ }
647
+ };
648
+ async function downloadAssetsFromMessages({
649
+ messages,
650
+ downloadConcurrency = 10,
651
+ downloadRetries = 3,
652
+ supportedUrls
653
+ }) {
654
+ const pMap = (await import('p-map')).default;
655
+ const filesToDownload = messages.filter((message) => message.role === "user").map((message) => message.content).filter((content) => Array.isArray(content)).flat().filter((part) => part.type === "image" || part.type === "file").map((part) => {
656
+ const mediaType = part.mediaType ?? (part.type === "image" ? "image/*" : void 0);
657
+ let data = part.type === "image" ? part.image : part.data;
658
+ if (typeof data === "string") {
659
+ try {
660
+ data = new URL(data);
661
+ } catch {
662
+ }
663
+ }
664
+ return { mediaType, data };
665
+ }).filter((part) => part.data instanceof URL).map((part) => ({
666
+ url: part.data,
667
+ isUrlSupportedByModel: part.mediaType != null && providerUtilsV5.isUrlSupported({
668
+ url: part.data.toString(),
669
+ mediaType: part.mediaType,
670
+ supportedUrls: supportedUrls ?? {}
671
+ })
672
+ }));
673
+ const downloadedFiles = await pMap(
674
+ filesToDownload,
675
+ async (fileItem) => {
676
+ return downloadFromUrl({ url: fileItem.url, downloadRetries });
677
+ },
678
+ {
679
+ concurrency: downloadConcurrency
680
+ }
681
+ );
682
+ const downloadFileList = downloadedFiles.filter(
683
+ (downloadedFile) => downloadedFile?.data != null
684
+ ).map(({ data, mediaType }, index) => [filesToDownload?.[index]?.url.toString(), { data, mediaType }]);
685
+ return Object.fromEntries(downloadFileList);
686
+ }
440
687
 
441
688
  // src/agent/message-list/utils/ai-v5/tool.ts
442
689
  function getToolName(type) {
@@ -570,13 +817,47 @@ var MessageList = class _MessageList {
570
817
  return messages;
571
818
  },
572
819
  // Used for creating LLM prompt messages without AI SDK streamText/generateText
573
- llmPrompt: () => {
820
+ llmPrompt: async (options = {
821
+ downloadConcurrency: 10,
822
+ downloadRetries: 3
823
+ }) => {
574
824
  const modelMessages = this.all.aiV5.model();
575
825
  const systemMessages = this.aiV4CoreMessagesToAIV5ModelMessages(
576
826
  [...this.systemMessages, ...Object.values(this.taggedSystemMessages).flat()],
577
827
  `system`
578
828
  );
579
- const messages = [...systemMessages, ...modelMessages];
829
+ const downloadedAssets = await downloadAssetsFromMessages({
830
+ messages: modelMessages,
831
+ downloadConcurrency: options?.downloadConcurrency,
832
+ downloadRetries: options?.downloadRetries,
833
+ supportedUrls: options?.supportedUrls
834
+ });
835
+ let messages = [...systemMessages, ...modelMessages];
836
+ if (Object.keys(downloadedAssets || {}).length > 0) {
837
+ messages = messages.map((message) => {
838
+ if (message.role === "user") {
839
+ if (typeof message.content === "string") {
840
+ return {
841
+ role: "user",
842
+ content: [{ type: "text", text: message.content }],
843
+ providerOptions: message.providerOptions
844
+ };
845
+ }
846
+ const convertedContent = message.content.map((part) => {
847
+ if (part.type === "image" || part.type === "file") {
848
+ return convertImageFilePart(part, downloadedAssets);
849
+ }
850
+ return part;
851
+ }).filter((part) => part.type !== "text" || part.text !== "");
852
+ return {
853
+ role: "user",
854
+ content: convertedContent,
855
+ providerOptions: message.providerOptions
856
+ };
857
+ }
858
+ return message;
859
+ });
860
+ }
580
861
  const needsDefaultUserMessage = !messages.length || messages[0]?.role === "assistant";
581
862
  if (needsDefaultUserMessage) {
582
863
  const defaultMessage = {
@@ -2014,7 +2295,9 @@ var MessageList = class _MessageList {
2014
2295
  return v3Msg;
2015
2296
  }
2016
2297
  aiV5UIMessagesToAIV5ModelMessages(messages) {
2017
- return AIV5__namespace.convertToModelMessages(this.addStartStepPartsForAIV5(this.sanitizeV5UIMessages(messages)));
2298
+ const preprocessed = this.addStartStepPartsForAIV5(this.sanitizeV5UIMessages(messages));
2299
+ const result = AIV5__namespace.convertToModelMessages(preprocessed);
2300
+ return result;
2018
2301
  }
2019
2302
  addStartStepPartsForAIV5(messages) {
2020
2303
  for (const message of messages) {
@@ -2330,5 +2613,5 @@ exports.DefaultGeneratedFile = DefaultGeneratedFile;
2330
2613
  exports.DefaultGeneratedFileWithType = DefaultGeneratedFileWithType;
2331
2614
  exports.MessageList = MessageList;
2332
2615
  exports.convertMessages = convertMessages;
2333
- //# sourceMappingURL=chunk-QA2TWVUS.cjs.map
2334
- //# sourceMappingURL=chunk-QA2TWVUS.cjs.map
2616
+ //# sourceMappingURL=chunk-TWNFR6MQ.cjs.map
2617
+ //# sourceMappingURL=chunk-TWNFR6MQ.cjs.map