@mastra/ai-sdk 0.0.0-error-handler-fix-20251020202607 → 0.0.0-export-agent-memory-from-local-studio-20251112153946

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
@@ -5,6 +5,33 @@ var ai = require('ai');
5
5
  var stream = require('@mastra/core/stream');
6
6
 
7
7
  // src/chat-route.ts
8
+
9
+ // src/utils.ts
10
+ var isDataChunkType = (chunk) => {
11
+ return chunk && typeof chunk === "object" && "type" in chunk && chunk.type?.startsWith("data-");
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
+ };
33
+
34
+ // src/helpers.ts
8
35
  function convertMastraChunkToAISDKv5({
9
36
  chunk,
10
37
  mode = "stream"
@@ -332,6 +359,14 @@ function convertFullStreamChunkToUIMessageStream({
332
359
  toolCallId: part.toolCallId,
333
360
  payload: part.output
334
361
  };
362
+ } else if (isDataChunkType(part.output)) {
363
+ if (!("data" in part.output)) {
364
+ throw new Error(
365
+ `UI Messages require a data property when using data- prefixed chunks
366
+ ${JSON.stringify(part)}`
367
+ );
368
+ }
369
+ return part.output;
335
370
  }
336
371
  return;
337
372
  }
@@ -383,7 +418,7 @@ function convertFullStreamChunkToUIMessageStream({
383
418
  return;
384
419
  }
385
420
  default: {
386
- if ("type" in part && part.type?.startsWith("data-")) {
421
+ if (isDataChunkType(part)) {
387
422
  if (!("data" in part)) {
388
423
  throw new Error(
389
424
  `UI Messages require a data property when using data- prefixed chunks
@@ -436,7 +471,7 @@ function AgentNetworkToAISDKTransformer() {
436
471
  }
437
472
  });
438
473
  }
439
- function AgentStreamToAISDKTransformer() {
474
+ function AgentStreamToAISDKTransformer(lastMessageId) {
440
475
  let bufferedSteps = /* @__PURE__ */ new Map();
441
476
  return new TransformStream({
442
477
  transform(chunk, controller) {
@@ -447,9 +482,9 @@ function AgentStreamToAISDKTransformer() {
447
482
  sendSources: false,
448
483
  sendStart: true,
449
484
  sendFinish: true,
450
- responseMessageId: chunk.runId,
451
- onError() {
452
- return "Error";
485
+ responseMessageId: lastMessageId,
486
+ onError(error) {
487
+ return safeParseErrorObject(error);
453
488
  }
454
489
  });
455
490
  if (transformedChunk) {
@@ -631,7 +666,9 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
631
666
  name: payload.payload.id,
632
667
  status: payload.payload.status,
633
668
  input: payload.payload.payload ?? null,
634
- output: null
669
+ output: null,
670
+ suspendPayload: null,
671
+ resumePayload: null
635
672
  };
636
673
  bufferedWorkflows.set(payload.runId, current);
637
674
  return {
@@ -664,6 +701,27 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
664
701
  }
665
702
  };
666
703
  }
704
+ case "workflow-step-suspended": {
705
+ const current = bufferedWorkflows.get(payload.runId);
706
+ if (!current) return null;
707
+ current.steps[payload.payload.id] = {
708
+ ...current.steps[payload.payload.id],
709
+ status: payload.payload.status,
710
+ suspendPayload: payload.payload.suspendPayload ?? null,
711
+ resumePayload: payload.payload.resumePayload ?? null,
712
+ output: null
713
+ };
714
+ return {
715
+ type: isNested ? "data-tool-workflow" : "data-workflow",
716
+ id: payload.runId,
717
+ data: {
718
+ name: current.name,
719
+ status: "suspended",
720
+ steps: current.steps,
721
+ output: null
722
+ }
723
+ };
724
+ }
667
725
  case "workflow-finish": {
668
726
  const current = bufferedWorkflows.get(payload.runId);
669
727
  if (!current) return null;
@@ -678,26 +736,39 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
678
736
  }
679
737
  };
680
738
  }
681
- default:
739
+ default: {
740
+ if (isDataChunkType(payload)) {
741
+ if (!("data" in payload)) {
742
+ throw new Error(
743
+ `UI Messages require a data property when using data- prefixed chunks
744
+ ${JSON.stringify(payload)}`
745
+ );
746
+ }
747
+ return payload;
748
+ }
682
749
  return null;
750
+ }
683
751
  }
684
752
  }
685
753
  function transformNetwork(payload, bufferedNetworks, isNested) {
686
754
  switch (payload.type) {
687
755
  case "routing-agent-start": {
688
- if (!bufferedNetworks.has(payload.payload.runId)) {
689
- bufferedNetworks.set(payload.payload.runId, {
756
+ if (!bufferedNetworks.has(payload.runId)) {
757
+ bufferedNetworks.set(payload.runId, {
690
758
  name: payload.payload.agentId,
691
- steps: []
759
+ steps: [],
760
+ usage: null,
761
+ output: null
692
762
  });
693
763
  }
694
764
  return {
695
765
  type: isNested ? "data-tool-network" : "data-network",
696
- id: payload.payload.runId,
766
+ id: payload.runId,
697
767
  data: {
698
- name: bufferedNetworks.get(payload.payload.runId).name,
768
+ name: bufferedNetworks.get(payload.runId).name,
699
769
  status: "running",
700
- steps: bufferedNetworks.get(payload.payload.runId).steps,
770
+ usage: null,
771
+ steps: bufferedNetworks.get(payload.runId).steps,
701
772
  output: null
702
773
  }
703
774
  };
@@ -720,62 +791,62 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
720
791
  };
721
792
  }
722
793
  case "agent-execution-start": {
723
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
794
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
724
795
  current.steps.push({
725
796
  name: payload.payload.agentId,
726
797
  status: "running",
727
798
  input: payload.payload.args || null,
728
- output: null
799
+ output: null,
800
+ suspendPayload: null,
801
+ resumePayload: null
729
802
  });
730
- bufferedNetworks.set(payload.payload.runId, current);
803
+ bufferedNetworks.set(payload.runId, current);
731
804
  return {
732
805
  type: isNested ? "data-tool-network" : "data-network",
733
- id: payload.payload.runId,
806
+ id: payload.runId,
734
807
  data: {
735
- name: current.name,
736
- status: "running",
737
- steps: current.steps,
738
- output: null
808
+ ...current,
809
+ status: "running"
739
810
  }
740
811
  };
741
812
  }
742
813
  case "workflow-execution-start": {
743
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
814
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
744
815
  current.steps.push({
745
816
  name: payload.payload.name,
746
817
  status: "running",
747
818
  input: payload.payload.args || null,
748
- output: null
819
+ output: null,
820
+ suspendPayload: null,
821
+ resumePayload: null
749
822
  });
750
- bufferedNetworks.set(payload.payload.runId, current);
823
+ bufferedNetworks.set(payload.runId, current);
751
824
  return {
752
825
  type: isNested ? "data-tool-network" : "data-network",
753
- id: payload.payload.runId,
826
+ id: payload.runId,
754
827
  data: {
755
- name: current.name,
756
- status: "running",
757
- steps: current.steps,
758
- output: null
828
+ ...current,
829
+ status: "running"
759
830
  }
760
831
  };
761
832
  }
762
833
  case "tool-execution-start": {
763
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
834
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
764
835
  current.steps.push({
765
836
  name: payload.payload.args?.toolName,
766
837
  status: "running",
767
838
  input: payload.payload.args?.args || null,
768
- output: null
839
+ output: null,
840
+ suspendPayload: null,
841
+ resumePayload: null
769
842
  });
770
- bufferedNetworks.set(payload.payload.runId, current);
843
+ bufferedNetworks.set(payload.runId, current);
771
844
  return {
772
845
  type: isNested ? "data-tool-network" : "data-network",
773
- id: payload.payload.runId,
846
+ id: payload.runId,
774
847
  data: {
775
- name: current.name,
776
- status: "running",
777
- steps: current.steps,
778
- output: null
848
+ ...current,
849
+ status: "running"
779
850
  }
780
851
  };
781
852
  }
@@ -786,16 +857,18 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
786
857
  name: payload.payload.agentId,
787
858
  status: "success",
788
859
  input: null,
789
- output: payload.payload.result
860
+ output: payload.payload.result,
861
+ suspendPayload: null,
862
+ resumePayload: null
790
863
  });
791
864
  return {
792
865
  type: isNested ? "data-tool-network" : "data-network",
793
866
  id: payload.runId,
794
867
  data: {
795
- name: current.name,
868
+ ...current,
869
+ usage: payload.payload?.usage ?? current.usage,
796
870
  status: "running",
797
- steps: current.steps,
798
- output: payload.payload.result ?? null
871
+ output: payload.payload.result ?? current.output
799
872
  }
800
873
  };
801
874
  }
@@ -806,16 +879,17 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
806
879
  name: payload.payload.toolName,
807
880
  status: "success",
808
881
  input: null,
809
- output: payload.payload.result
882
+ output: payload.payload.result,
883
+ suspendPayload: null,
884
+ resumePayload: null
810
885
  });
811
886
  return {
812
887
  type: isNested ? "data-tool-network" : "data-network",
813
888
  id: payload.runId,
814
889
  data: {
815
- name: current.name,
890
+ ...current,
816
891
  status: "running",
817
- steps: current.steps,
818
- output: payload.payload.result ?? null
892
+ output: payload.payload.result ?? current.output
819
893
  }
820
894
  };
821
895
  }
@@ -826,44 +900,45 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
826
900
  name: payload.payload.name,
827
901
  status: "success",
828
902
  input: null,
829
- output: payload.payload.result
903
+ output: payload.payload.result,
904
+ suspendPayload: null,
905
+ resumePayload: null
830
906
  });
831
907
  return {
832
908
  type: isNested ? "data-tool-network" : "data-network",
833
909
  id: payload.runId,
834
910
  data: {
835
- name: current.name,
911
+ ...current,
912
+ usage: payload.payload?.usage ?? current.usage,
836
913
  status: "running",
837
- steps: current.steps,
838
- output: payload.payload.result ?? null
914
+ output: payload.payload.result ?? current.output
839
915
  }
840
916
  };
841
917
  }
842
918
  case "routing-agent-end": {
843
- const current = bufferedNetworks.get(payload.payload.runId);
919
+ const current = bufferedNetworks.get(payload.runId);
844
920
  if (!current) return null;
845
921
  return {
846
922
  type: isNested ? "data-tool-network" : "data-network",
847
- id: payload.payload.runId,
923
+ id: payload.runId,
848
924
  data: {
849
- name: current.name,
925
+ ...current,
850
926
  status: "finished",
851
- steps: current.steps,
852
- output: payload.payload?.result ?? null
927
+ usage: payload.payload?.usage ?? current.usage,
928
+ output: payload.payload?.result ?? current.output
853
929
  }
854
930
  };
855
931
  }
856
932
  case "network-execution-event-step-finish": {
857
- const current = bufferedNetworks.get(payload.payload.runId);
933
+ const current = bufferedNetworks.get(payload.runId);
858
934
  if (!current) return null;
859
935
  return {
860
936
  type: isNested ? "data-tool-network" : "data-network",
861
- id: payload.payload.runId,
937
+ id: payload.runId,
862
938
  data: {
863
- name: current.name,
939
+ ...current,
864
940
  status: "finished",
865
- steps: current.steps,
866
- output: payload.payload?.result ?? null
941
+ output: payload.payload?.result ?? current.output
867
942
  }
868
943
  };
869
944
  }
@@ -874,20 +949,48 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
874
949
  type: isNested ? "data-tool-network" : "data-network",
875
950
  id: payload.runId,
876
951
  data: {
877
- name: current.name,
952
+ ...current,
953
+ usage: payload.payload?.usage ?? current.usage,
878
954
  status: "finished",
879
- steps: current.steps,
880
- output: payload.payload?.result ?? null
955
+ output: payload.payload?.result ?? current.output
881
956
  }
882
957
  };
883
958
  }
884
- default:
959
+ default: {
960
+ if (isDataChunkType(payload)) {
961
+ if (!("data" in payload)) {
962
+ throw new Error(
963
+ `UI Messages require a data property when using data- prefixed chunks
964
+ ${JSON.stringify(payload)}`
965
+ );
966
+ }
967
+ return payload;
968
+ }
969
+ if (isAgentExecutionDataChunkType(payload)) {
970
+ if (!("data" in payload.payload)) {
971
+ throw new Error(
972
+ `UI Messages require a data property when using data- prefixed chunks
973
+ ${JSON.stringify(payload)}`
974
+ );
975
+ }
976
+ return payload.payload;
977
+ }
978
+ if (isWorkflowExecutionDataChunkType(payload)) {
979
+ if (!("data" in payload.payload)) {
980
+ throw new Error(
981
+ `UI Messages require a data property when using data- prefixed chunks
982
+ ${JSON.stringify(payload)}`
983
+ );
984
+ }
985
+ return payload.payload;
986
+ }
885
987
  return null;
988
+ }
886
989
  }
887
990
  }
888
991
 
889
- // src/to-ai-sdk-format.ts
890
- function toAISdkFormat(stream, options = { from: "agent" }) {
992
+ // src/convert-streams.ts
993
+ function toAISdkV5Stream(stream, options = { from: "agent" }) {
891
994
  const from = options?.from;
892
995
  if (from === "workflow") {
893
996
  return stream.pipeThrough(WorkflowStreamToAISDKTransformer());
@@ -896,7 +999,7 @@ function toAISdkFormat(stream, options = { from: "agent" }) {
896
999
  return stream.pipeThrough(AgentNetworkToAISDKTransformer());
897
1000
  }
898
1001
  const agentReadable = "fullStream" in stream ? stream.fullStream : stream;
899
- return agentReadable.pipeThrough(AgentStreamToAISDKTransformer());
1002
+ return agentReadable.pipeThrough(AgentStreamToAISDKTransformer(options?.lastMessageId));
900
1003
  }
901
1004
 
902
1005
  // src/chat-route.ts
@@ -1004,7 +1107,7 @@ function chatRoute({
1004
1107
  handler: async (c) => {
1005
1108
  const { messages, ...rest } = await c.req.json();
1006
1109
  const mastra = c.get("mastra");
1007
- const runtimeContext = c.get("runtimeContext");
1110
+ const requestContext = c.get("requestContext");
1008
1111
  let agentToUse = agent;
1009
1112
  if (!agent) {
1010
1113
  const agentId = c.req.param("agentId");
@@ -1015,8 +1118,8 @@ function chatRoute({
1015
1118
  `Fixed agent ID was set together with an agentId path parameter. This can lead to unexpected behavior.`
1016
1119
  );
1017
1120
  }
1018
- if (runtimeContext && defaultOptions?.runtimeContext) {
1019
- mastra.getLogger()?.warn(`"runtimeContext" set in the route options will be overridden by the request's "runtimeContext".`);
1121
+ if (requestContext && defaultOptions?.requestContext) {
1122
+ mastra.getLogger()?.warn(`"requestContext" set in the route options will be overridden by the request's "requestContext".`);
1020
1123
  }
1021
1124
  if (!agentToUse) {
1022
1125
  throw new Error("Agent ID is required");
@@ -1028,12 +1131,16 @@ function chatRoute({
1028
1131
  const result = await agentObj.stream(messages, {
1029
1132
  ...defaultOptions,
1030
1133
  ...rest,
1031
- runtimeContext: runtimeContext || defaultOptions?.runtimeContext
1134
+ requestContext: requestContext || defaultOptions?.requestContext
1032
1135
  });
1136
+ let lastMessageId;
1137
+ if (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
1138
+ lastMessageId = messages[messages.length - 1].id;
1139
+ }
1033
1140
  const uiMessageStream = ai.createUIMessageStream({
1034
1141
  originalMessages: messages,
1035
1142
  execute: async ({ writer }) => {
1036
- for await (const part of toAISdkFormat(result, { from: "agent" })) {
1143
+ for await (const part of toAISdkV5Stream(result, { from: "agent", lastMessageId })) {
1037
1144
  writer.write(part);
1038
1145
  }
1039
1146
  }
@@ -1074,7 +1181,7 @@ function workflowRoute({
1074
1181
  type: "object",
1075
1182
  properties: {
1076
1183
  inputData: { type: "object", additionalProperties: true },
1077
- runtimeContext: { type: "object", additionalProperties: true },
1184
+ requestContext: { type: "object", additionalProperties: true },
1078
1185
  tracingOptions: { type: "object", additionalProperties: true }
1079
1186
  }
1080
1187
  }
@@ -1093,7 +1200,7 @@ function workflowRoute({
1093
1200
  }
1094
1201
  },
1095
1202
  handler: async (c) => {
1096
- const { inputData, ...rest } = await c.req.json();
1203
+ const { inputData, resumeData, ...rest } = await c.req.json();
1097
1204
  const mastra = c.get("mastra");
1098
1205
  let workflowToUse = workflow;
1099
1206
  if (!workflow) {
@@ -1112,11 +1219,11 @@ function workflowRoute({
1112
1219
  if (!workflowObj) {
1113
1220
  throw new Error(`Workflow ${workflowToUse} not found`);
1114
1221
  }
1115
- const run = await workflowObj.createRunAsync();
1116
- const stream = run.streamVNext({ inputData, ...rest });
1222
+ const run = await workflowObj.createRun();
1223
+ const stream = resumeData ? run.resumeStream({ resumeData, ...rest }) : run.stream({ inputData, ...rest });
1117
1224
  const uiMessageStream = ai.createUIMessageStream({
1118
1225
  execute: async ({ writer }) => {
1119
- for await (const part of toAISdkFormat(stream, { from: "workflow" })) {
1226
+ for await (const part of toAISdkV5Stream(stream, { from: "workflow" })) {
1120
1227
  writer.write(part);
1121
1228
  }
1122
1229
  }
@@ -1156,13 +1263,12 @@ function networkRoute({
1156
1263
  type: "object",
1157
1264
  properties: {
1158
1265
  messages: { type: "array", items: { type: "object" } },
1159
- runtimeContext: { type: "object", additionalProperties: true },
1266
+ requestContext: { type: "object", additionalProperties: true },
1160
1267
  runId: { type: "string" },
1161
1268
  maxSteps: { type: "number" },
1162
1269
  threadId: { type: "string" },
1163
1270
  resourceId: { type: "string" },
1164
1271
  modelSettings: { type: "object", additionalProperties: true },
1165
- telemetry: { type: "object", additionalProperties: true },
1166
1272
  tools: { type: "array", items: { type: "object" } }
1167
1273
  },
1168
1274
  required: ["messages"]
@@ -1211,7 +1317,7 @@ function networkRoute({
1211
1317
  });
1212
1318
  const uiMessageStream = ai.createUIMessageStream({
1213
1319
  execute: async ({ writer }) => {
1214
- for await (const part of toAISdkFormat(result, { from: "network" })) {
1320
+ for await (const part of toAISdkV5Stream(result, { from: "network" })) {
1215
1321
  writer.write(part);
1216
1322
  }
1217
1323
  }
@@ -1221,9 +1327,17 @@ function networkRoute({
1221
1327
  });
1222
1328
  }
1223
1329
 
1330
+ // src/to-ai-sdk-format.ts
1331
+ function toAISdkFormat() {
1332
+ throw new Error(
1333
+ '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.'
1334
+ );
1335
+ }
1336
+
1224
1337
  exports.chatRoute = chatRoute;
1225
1338
  exports.networkRoute = networkRoute;
1226
1339
  exports.toAISdkFormat = toAISdkFormat;
1340
+ exports.toAISdkStream = toAISdkV5Stream;
1227
1341
  exports.workflowRoute = workflowRoute;
1228
1342
  //# sourceMappingURL=index.cjs.map
1229
1343
  //# sourceMappingURL=index.cjs.map