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