@mastra/ai-sdk 0.0.0-bundle-recursion-20251030002519 → 0.0.0-client-js-listmessages-agentid-fix-20251119175531

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.
package/dist/index.js CHANGED
@@ -8,6 +8,26 @@ import { DefaultGeneratedFile, DefaultGeneratedFileWithType } from '@mastra/core
8
8
  var isDataChunkType = (chunk) => {
9
9
  return chunk && typeof chunk === "object" && "type" in chunk && chunk.type?.startsWith("data-");
10
10
  };
11
+ function safeParseErrorObject(obj) {
12
+ if (typeof obj !== "object" || obj === null) {
13
+ return String(obj);
14
+ }
15
+ try {
16
+ const stringified = JSON.stringify(obj);
17
+ if (stringified === "{}") {
18
+ return String(obj);
19
+ }
20
+ return stringified;
21
+ } catch {
22
+ return String(obj);
23
+ }
24
+ }
25
+ var isAgentExecutionDataChunkType = (chunk) => {
26
+ return chunk && typeof chunk === "object" && "type" in chunk && chunk.type?.startsWith("agent-execution-event-") && "payload" in chunk && typeof chunk.payload === "object" && "type" in chunk.payload && chunk.payload.type?.startsWith("data-");
27
+ };
28
+ var isWorkflowExecutionDataChunkType = (chunk) => {
29
+ return chunk && typeof chunk === "object" && "type" in chunk && chunk.type?.startsWith("workflow-execution-event-") && "payload" in chunk && typeof chunk.payload === "object" && "type" in chunk.payload && chunk.payload.type?.startsWith("data-");
30
+ };
11
31
 
12
32
  // src/helpers.ts
13
33
  function convertMastraChunkToAISDKv5({
@@ -263,6 +283,14 @@ function convertFullStreamChunkToUIMessageStream({
263
283
  };
264
284
  }
265
285
  case "reasoning-delta": {
286
+ if (sendReasoning) {
287
+ return {
288
+ type: "reasoning-delta",
289
+ id: part.id,
290
+ delta: part.text,
291
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
292
+ };
293
+ }
266
294
  return;
267
295
  }
268
296
  case "reasoning-end": {
@@ -280,6 +308,25 @@ function convertFullStreamChunkToUIMessageStream({
280
308
  };
281
309
  }
282
310
  case "source": {
311
+ if (sendSources && part.sourceType === "url") {
312
+ return {
313
+ type: "source-url",
314
+ sourceId: part.id,
315
+ url: part.url,
316
+ title: part.title,
317
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
318
+ };
319
+ }
320
+ if (sendSources && part.sourceType === "document") {
321
+ return {
322
+ type: "source-document",
323
+ sourceId: part.id,
324
+ mediaType: part.mediaType,
325
+ title: part.title,
326
+ filename: part.filename,
327
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
328
+ };
329
+ }
283
330
  return;
284
331
  }
285
332
  case "tool-input-start": {
@@ -337,6 +384,14 @@ function convertFullStreamChunkToUIMessageStream({
337
384
  toolCallId: part.toolCallId,
338
385
  payload: part.output
339
386
  };
387
+ } else if (isDataChunkType(part.output)) {
388
+ if (!("data" in part.output)) {
389
+ throw new Error(
390
+ `UI Messages require a data property when using data- prefixed chunks
391
+ ${JSON.stringify(part)}`
392
+ );
393
+ }
394
+ return part.output;
340
395
  }
341
396
  return;
342
397
  }
@@ -362,21 +417,23 @@ function convertFullStreamChunkToUIMessageStream({
362
417
  return { type: "finish-step" };
363
418
  }
364
419
  case "start": {
365
- {
420
+ if (sendStart) {
366
421
  return {
367
422
  type: "start",
368
423
  ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {},
369
424
  ...responseMessageId != null ? { messageId: responseMessageId } : {}
370
425
  };
371
426
  }
427
+ return;
372
428
  }
373
429
  case "finish": {
374
- {
430
+ if (sendFinish) {
375
431
  return {
376
432
  type: "finish",
377
433
  ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {}
378
434
  };
379
435
  }
436
+ return;
380
437
  }
381
438
  case "abort": {
382
439
  return part;
@@ -441,20 +498,26 @@ function AgentNetworkToAISDKTransformer() {
441
498
  }
442
499
  });
443
500
  }
444
- function AgentStreamToAISDKTransformer() {
501
+ function AgentStreamToAISDKTransformer({
502
+ lastMessageId,
503
+ sendStart,
504
+ sendFinish,
505
+ sendReasoning,
506
+ sendSources
507
+ }) {
445
508
  let bufferedSteps = /* @__PURE__ */ new Map();
446
509
  return new TransformStream({
447
510
  transform(chunk, controller) {
448
511
  const part = convertMastraChunkToAISDKv5({ chunk, mode: "stream" });
449
512
  const transformedChunk = convertFullStreamChunkToUIMessageStream({
450
513
  part,
451
- sendReasoning: false,
452
- sendSources: false,
453
- sendStart: true,
454
- sendFinish: true,
455
- responseMessageId: chunk.runId,
456
- onError() {
457
- return "Error";
514
+ sendReasoning,
515
+ sendSources,
516
+ sendStart,
517
+ sendFinish,
518
+ responseMessageId: lastMessageId,
519
+ onError(error) {
520
+ return safeParseErrorObject(error);
458
521
  }
459
522
  });
460
523
  if (transformedChunk) {
@@ -636,7 +699,9 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
636
699
  name: payload.payload.id,
637
700
  status: payload.payload.status,
638
701
  input: payload.payload.payload ?? null,
639
- output: null
702
+ output: null,
703
+ suspendPayload: null,
704
+ resumePayload: null
640
705
  };
641
706
  bufferedWorkflows.set(payload.runId, current);
642
707
  return {
@@ -669,6 +734,27 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
669
734
  }
670
735
  };
671
736
  }
737
+ case "workflow-step-suspended": {
738
+ const current = bufferedWorkflows.get(payload.runId);
739
+ if (!current) return null;
740
+ current.steps[payload.payload.id] = {
741
+ ...current.steps[payload.payload.id],
742
+ status: payload.payload.status,
743
+ suspendPayload: payload.payload.suspendPayload ?? null,
744
+ resumePayload: payload.payload.resumePayload ?? null,
745
+ output: null
746
+ };
747
+ return {
748
+ type: isNested ? "data-tool-workflow" : "data-workflow",
749
+ id: payload.runId,
750
+ data: {
751
+ name: current.name,
752
+ status: "suspended",
753
+ steps: current.steps,
754
+ output: null
755
+ }
756
+ };
757
+ }
672
758
  case "workflow-finish": {
673
759
  const current = bufferedWorkflows.get(payload.runId);
674
760
  if (!current) return null;
@@ -743,7 +829,9 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
743
829
  name: payload.payload.agentId,
744
830
  status: "running",
745
831
  input: payload.payload.args || null,
746
- output: null
832
+ output: null,
833
+ suspendPayload: null,
834
+ resumePayload: null
747
835
  });
748
836
  bufferedNetworks.set(payload.runId, current);
749
837
  return {
@@ -761,7 +849,9 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
761
849
  name: payload.payload.name,
762
850
  status: "running",
763
851
  input: payload.payload.args || null,
764
- output: null
852
+ output: null,
853
+ suspendPayload: null,
854
+ resumePayload: null
765
855
  });
766
856
  bufferedNetworks.set(payload.runId, current);
767
857
  return {
@@ -779,7 +869,9 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
779
869
  name: payload.payload.args?.toolName,
780
870
  status: "running",
781
871
  input: payload.payload.args?.args || null,
782
- output: null
872
+ output: null,
873
+ suspendPayload: null,
874
+ resumePayload: null
783
875
  });
784
876
  bufferedNetworks.set(payload.runId, current);
785
877
  return {
@@ -798,7 +890,9 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
798
890
  name: payload.payload.agentId,
799
891
  status: "success",
800
892
  input: null,
801
- output: payload.payload.result
893
+ output: payload.payload.result,
894
+ suspendPayload: null,
895
+ resumePayload: null
802
896
  });
803
897
  return {
804
898
  type: isNested ? "data-tool-network" : "data-network",
@@ -818,7 +912,9 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
818
912
  name: payload.payload.toolName,
819
913
  status: "success",
820
914
  input: null,
821
- output: payload.payload.result
915
+ output: payload.payload.result,
916
+ suspendPayload: null,
917
+ resumePayload: null
822
918
  });
823
919
  return {
824
920
  type: isNested ? "data-tool-network" : "data-network",
@@ -837,7 +933,9 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
837
933
  name: payload.payload.name,
838
934
  status: "success",
839
935
  input: null,
840
- output: payload.payload.result
936
+ output: payload.payload.result,
937
+ suspendPayload: null,
938
+ resumePayload: null
841
939
  });
842
940
  return {
843
941
  type: isNested ? "data-tool-network" : "data-network",
@@ -901,13 +999,35 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
901
999
  }
902
1000
  return payload;
903
1001
  }
1002
+ if (isAgentExecutionDataChunkType(payload)) {
1003
+ if (!("data" in payload.payload)) {
1004
+ throw new Error(
1005
+ `UI Messages require a data property when using data- prefixed chunks
1006
+ ${JSON.stringify(payload)}`
1007
+ );
1008
+ }
1009
+ return payload.payload;
1010
+ }
1011
+ if (isWorkflowExecutionDataChunkType(payload)) {
1012
+ if (!("data" in payload.payload)) {
1013
+ throw new Error(
1014
+ `UI Messages require a data property when using data- prefixed chunks
1015
+ ${JSON.stringify(payload)}`
1016
+ );
1017
+ }
1018
+ return payload.payload;
1019
+ }
904
1020
  return null;
905
1021
  }
906
1022
  }
907
1023
  }
908
1024
 
909
- // src/to-ai-sdk-format.ts
910
- function toAISdkFormat(stream, options = { from: "agent" }) {
1025
+ // src/convert-streams.ts
1026
+ function toAISdkV5Stream(stream, options = {
1027
+ from: "agent",
1028
+ sendStart: true,
1029
+ sendFinish: true
1030
+ }) {
911
1031
  const from = options?.from;
912
1032
  if (from === "workflow") {
913
1033
  return stream.pipeThrough(WorkflowStreamToAISDKTransformer());
@@ -916,14 +1036,26 @@ function toAISdkFormat(stream, options = { from: "agent" }) {
916
1036
  return stream.pipeThrough(AgentNetworkToAISDKTransformer());
917
1037
  }
918
1038
  const agentReadable = "fullStream" in stream ? stream.fullStream : stream;
919
- return agentReadable.pipeThrough(AgentStreamToAISDKTransformer());
1039
+ return agentReadable.pipeThrough(
1040
+ AgentStreamToAISDKTransformer({
1041
+ lastMessageId: options?.lastMessageId,
1042
+ sendStart: options?.sendStart,
1043
+ sendFinish: options?.sendFinish,
1044
+ sendReasoning: options?.sendReasoning,
1045
+ sendSources: options?.sendSources
1046
+ })
1047
+ );
920
1048
  }
921
1049
 
922
1050
  // src/chat-route.ts
923
1051
  function chatRoute({
924
1052
  path = "/chat/:agentId",
925
1053
  agent,
926
- defaultOptions
1054
+ defaultOptions,
1055
+ sendStart = true,
1056
+ sendFinish = true,
1057
+ sendReasoning = false,
1058
+ sendSources = false
927
1059
  }) {
928
1060
  if (!agent && !path.includes("/:agentId")) {
929
1061
  throw new Error("Path must include :agentId to route to the correct agent or pass the agent explicitly");
@@ -1024,7 +1156,7 @@ function chatRoute({
1024
1156
  handler: async (c) => {
1025
1157
  const { messages, ...rest } = await c.req.json();
1026
1158
  const mastra = c.get("mastra");
1027
- const runtimeContext = c.get("runtimeContext");
1159
+ const requestContext = c.get("requestContext");
1028
1160
  let agentToUse = agent;
1029
1161
  if (!agent) {
1030
1162
  const agentId = c.req.param("agentId");
@@ -1035,8 +1167,8 @@ function chatRoute({
1035
1167
  `Fixed agent ID was set together with an agentId path parameter. This can lead to unexpected behavior.`
1036
1168
  );
1037
1169
  }
1038
- if (runtimeContext && defaultOptions?.runtimeContext) {
1039
- mastra.getLogger()?.warn(`"runtimeContext" set in the route options will be overridden by the request's "runtimeContext".`);
1170
+ if (requestContext && defaultOptions?.requestContext) {
1171
+ mastra.getLogger()?.warn(`"requestContext" set in the route options will be overridden by the request's "requestContext".`);
1040
1172
  }
1041
1173
  if (!agentToUse) {
1042
1174
  throw new Error("Agent ID is required");
@@ -1048,12 +1180,23 @@ function chatRoute({
1048
1180
  const result = await agentObj.stream(messages, {
1049
1181
  ...defaultOptions,
1050
1182
  ...rest,
1051
- runtimeContext: runtimeContext || defaultOptions?.runtimeContext
1183
+ requestContext: requestContext || defaultOptions?.requestContext
1052
1184
  });
1185
+ let lastMessageId;
1186
+ if (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
1187
+ lastMessageId = messages[messages.length - 1].id;
1188
+ }
1053
1189
  const uiMessageStream = createUIMessageStream({
1054
1190
  originalMessages: messages,
1055
1191
  execute: async ({ writer }) => {
1056
- for await (const part of toAISdkFormat(result, { from: "agent" })) {
1192
+ for await (const part of toAISdkV5Stream(result, {
1193
+ from: "agent",
1194
+ lastMessageId,
1195
+ sendStart,
1196
+ sendFinish,
1197
+ sendReasoning,
1198
+ sendSources
1199
+ })) {
1057
1200
  writer.write(part);
1058
1201
  }
1059
1202
  }
@@ -1093,9 +1236,13 @@ function workflowRoute({
1093
1236
  schema: {
1094
1237
  type: "object",
1095
1238
  properties: {
1239
+ runId: { type: "string" },
1240
+ resourceId: { type: "string" },
1096
1241
  inputData: { type: "object", additionalProperties: true },
1097
- runtimeContext: { type: "object", additionalProperties: true },
1098
- tracingOptions: { type: "object", additionalProperties: true }
1242
+ resumeData: { type: "object", additionalProperties: true },
1243
+ requestContext: { type: "object", additionalProperties: true },
1244
+ tracingOptions: { type: "object", additionalProperties: true },
1245
+ step: { type: "string" }
1099
1246
  }
1100
1247
  }
1101
1248
  }
@@ -1113,7 +1260,7 @@ function workflowRoute({
1113
1260
  }
1114
1261
  },
1115
1262
  handler: async (c) => {
1116
- const { inputData, ...rest } = await c.req.json();
1263
+ const { runId, resourceId, inputData, resumeData, ...rest } = await c.req.json();
1117
1264
  const mastra = c.get("mastra");
1118
1265
  let workflowToUse = workflow;
1119
1266
  if (!workflow) {
@@ -1132,11 +1279,11 @@ function workflowRoute({
1132
1279
  if (!workflowObj) {
1133
1280
  throw new Error(`Workflow ${workflowToUse} not found`);
1134
1281
  }
1135
- const run = await workflowObj.createRunAsync();
1136
- const stream = run.streamVNext({ inputData, ...rest });
1282
+ const run = await workflowObj.createRun({ runId, resourceId, ...rest });
1283
+ const stream = resumeData ? run.resumeStream({ resumeData, ...rest }) : run.stream({ inputData, ...rest });
1137
1284
  const uiMessageStream = createUIMessageStream({
1138
1285
  execute: async ({ writer }) => {
1139
- for await (const part of toAISdkFormat(stream, { from: "workflow" })) {
1286
+ for await (const part of toAISdkV5Stream(stream, { from: "workflow" })) {
1140
1287
  writer.write(part);
1141
1288
  }
1142
1289
  }
@@ -1176,7 +1323,7 @@ function networkRoute({
1176
1323
  type: "object",
1177
1324
  properties: {
1178
1325
  messages: { type: "array", items: { type: "object" } },
1179
- runtimeContext: { type: "object", additionalProperties: true },
1326
+ requestContext: { type: "object", additionalProperties: true },
1180
1327
  runId: { type: "string" },
1181
1328
  maxSteps: { type: "number" },
1182
1329
  threadId: { type: "string" },
@@ -1230,7 +1377,7 @@ function networkRoute({
1230
1377
  });
1231
1378
  const uiMessageStream = createUIMessageStream({
1232
1379
  execute: async ({ writer }) => {
1233
- for await (const part of toAISdkFormat(result, { from: "network" })) {
1380
+ for await (const part of toAISdkV5Stream(result, { from: "network" })) {
1234
1381
  writer.write(part);
1235
1382
  }
1236
1383
  }
@@ -1240,6 +1387,13 @@ function networkRoute({
1240
1387
  });
1241
1388
  }
1242
1389
 
1243
- export { chatRoute, networkRoute, toAISdkFormat, workflowRoute };
1390
+ // src/to-ai-sdk-format.ts
1391
+ function toAISdkFormat() {
1392
+ throw new Error(
1393
+ 'toAISdkFormat() has been deprecated. Please use toAISdkStream() instead.\n\nMigration:\n import { toAISdkFormat } from "@mastra/ai-sdk";\n // Change to:\n import { toAISdkStream } from "@mastra/ai-sdk";\n\nThe function signature remains the same.'
1394
+ );
1395
+ }
1396
+
1397
+ export { chatRoute, networkRoute, toAISdkFormat, toAISdkV5Stream as toAISdkStream, workflowRoute };
1244
1398
  //# sourceMappingURL=index.js.map
1245
1399
  //# sourceMappingURL=index.js.map