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