@mastra/ai-sdk 0.0.0-add-crumb-action-20251028111500 → 0.0.0-add-stepgraph-to-run-exec-result-20251112113541

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({
@@ -337,6 +357,14 @@ function convertFullStreamChunkToUIMessageStream({
337
357
  toolCallId: part.toolCallId,
338
358
  payload: part.output
339
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;
340
368
  }
341
369
  return;
342
370
  }
@@ -441,7 +469,7 @@ function AgentNetworkToAISDKTransformer() {
441
469
  }
442
470
  });
443
471
  }
444
- function AgentStreamToAISDKTransformer() {
472
+ function AgentStreamToAISDKTransformer(lastMessageId) {
445
473
  let bufferedSteps = /* @__PURE__ */ new Map();
446
474
  return new TransformStream({
447
475
  transform(chunk, controller) {
@@ -452,9 +480,9 @@ function AgentStreamToAISDKTransformer() {
452
480
  sendSources: false,
453
481
  sendStart: true,
454
482
  sendFinish: true,
455
- responseMessageId: chunk.runId,
456
- onError() {
457
- return "Error";
483
+ responseMessageId: lastMessageId,
484
+ onError(error) {
485
+ return safeParseErrorObject(error);
458
486
  }
459
487
  });
460
488
  if (transformedChunk) {
@@ -636,7 +664,9 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
636
664
  name: payload.payload.id,
637
665
  status: payload.payload.status,
638
666
  input: payload.payload.payload ?? null,
639
- output: null
667
+ output: null,
668
+ suspendPayload: null,
669
+ resumePayload: null
640
670
  };
641
671
  bufferedWorkflows.set(payload.runId, current);
642
672
  return {
@@ -669,6 +699,27 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
669
699
  }
670
700
  };
671
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
+ }
672
723
  case "workflow-finish": {
673
724
  const current = bufferedWorkflows.get(payload.runId);
674
725
  if (!current) return null;
@@ -700,19 +751,22 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
700
751
  function transformNetwork(payload, bufferedNetworks, isNested) {
701
752
  switch (payload.type) {
702
753
  case "routing-agent-start": {
703
- if (!bufferedNetworks.has(payload.payload.runId)) {
704
- bufferedNetworks.set(payload.payload.runId, {
754
+ if (!bufferedNetworks.has(payload.runId)) {
755
+ bufferedNetworks.set(payload.runId, {
705
756
  name: payload.payload.agentId,
706
- steps: []
757
+ steps: [],
758
+ usage: null,
759
+ output: null
707
760
  });
708
761
  }
709
762
  return {
710
763
  type: isNested ? "data-tool-network" : "data-network",
711
- id: payload.payload.runId,
764
+ id: payload.runId,
712
765
  data: {
713
- name: bufferedNetworks.get(payload.payload.runId).name,
766
+ name: bufferedNetworks.get(payload.runId).name,
714
767
  status: "running",
715
- steps: bufferedNetworks.get(payload.payload.runId).steps,
768
+ usage: null,
769
+ steps: bufferedNetworks.get(payload.runId).steps,
716
770
  output: null
717
771
  }
718
772
  };
@@ -735,62 +789,62 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
735
789
  };
736
790
  }
737
791
  case "agent-execution-start": {
738
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
792
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
739
793
  current.steps.push({
740
794
  name: payload.payload.agentId,
741
795
  status: "running",
742
796
  input: payload.payload.args || null,
743
- output: null
797
+ output: null,
798
+ suspendPayload: null,
799
+ resumePayload: null
744
800
  });
745
- bufferedNetworks.set(payload.payload.runId, current);
801
+ bufferedNetworks.set(payload.runId, current);
746
802
  return {
747
803
  type: isNested ? "data-tool-network" : "data-network",
748
- id: payload.payload.runId,
804
+ id: payload.runId,
749
805
  data: {
750
- name: current.name,
751
- status: "running",
752
- steps: current.steps,
753
- output: null
806
+ ...current,
807
+ status: "running"
754
808
  }
755
809
  };
756
810
  }
757
811
  case "workflow-execution-start": {
758
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
812
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
759
813
  current.steps.push({
760
814
  name: payload.payload.name,
761
815
  status: "running",
762
816
  input: payload.payload.args || null,
763
- output: null
817
+ output: null,
818
+ suspendPayload: null,
819
+ resumePayload: null
764
820
  });
765
- bufferedNetworks.set(payload.payload.runId, current);
821
+ bufferedNetworks.set(payload.runId, current);
766
822
  return {
767
823
  type: isNested ? "data-tool-network" : "data-network",
768
- id: payload.payload.runId,
824
+ id: payload.runId,
769
825
  data: {
770
- name: current.name,
771
- status: "running",
772
- steps: current.steps,
773
- output: null
826
+ ...current,
827
+ status: "running"
774
828
  }
775
829
  };
776
830
  }
777
831
  case "tool-execution-start": {
778
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
832
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
779
833
  current.steps.push({
780
834
  name: payload.payload.args?.toolName,
781
835
  status: "running",
782
836
  input: payload.payload.args?.args || null,
783
- output: null
837
+ output: null,
838
+ suspendPayload: null,
839
+ resumePayload: null
784
840
  });
785
- bufferedNetworks.set(payload.payload.runId, current);
841
+ bufferedNetworks.set(payload.runId, current);
786
842
  return {
787
843
  type: isNested ? "data-tool-network" : "data-network",
788
- id: payload.payload.runId,
844
+ id: payload.runId,
789
845
  data: {
790
- name: current.name,
791
- status: "running",
792
- steps: current.steps,
793
- output: null
846
+ ...current,
847
+ status: "running"
794
848
  }
795
849
  };
796
850
  }
@@ -801,16 +855,18 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
801
855
  name: payload.payload.agentId,
802
856
  status: "success",
803
857
  input: null,
804
- output: payload.payload.result
858
+ output: payload.payload.result,
859
+ suspendPayload: null,
860
+ resumePayload: null
805
861
  });
806
862
  return {
807
863
  type: isNested ? "data-tool-network" : "data-network",
808
864
  id: payload.runId,
809
865
  data: {
810
- name: current.name,
866
+ ...current,
867
+ usage: payload.payload?.usage ?? current.usage,
811
868
  status: "running",
812
- steps: current.steps,
813
- output: payload.payload.result ?? null
869
+ output: payload.payload.result ?? current.output
814
870
  }
815
871
  };
816
872
  }
@@ -821,16 +877,17 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
821
877
  name: payload.payload.toolName,
822
878
  status: "success",
823
879
  input: null,
824
- output: payload.payload.result
880
+ output: payload.payload.result,
881
+ suspendPayload: null,
882
+ resumePayload: null
825
883
  });
826
884
  return {
827
885
  type: isNested ? "data-tool-network" : "data-network",
828
886
  id: payload.runId,
829
887
  data: {
830
- name: current.name,
888
+ ...current,
831
889
  status: "running",
832
- steps: current.steps,
833
- output: payload.payload.result ?? null
890
+ output: payload.payload.result ?? current.output
834
891
  }
835
892
  };
836
893
  }
@@ -841,44 +898,45 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
841
898
  name: payload.payload.name,
842
899
  status: "success",
843
900
  input: null,
844
- output: payload.payload.result
901
+ output: payload.payload.result,
902
+ suspendPayload: null,
903
+ resumePayload: null
845
904
  });
846
905
  return {
847
906
  type: isNested ? "data-tool-network" : "data-network",
848
907
  id: payload.runId,
849
908
  data: {
850
- name: current.name,
909
+ ...current,
910
+ usage: payload.payload?.usage ?? current.usage,
851
911
  status: "running",
852
- steps: current.steps,
853
- output: payload.payload.result ?? null
912
+ output: payload.payload.result ?? current.output
854
913
  }
855
914
  };
856
915
  }
857
916
  case "routing-agent-end": {
858
- const current = bufferedNetworks.get(payload.payload.runId);
917
+ const current = bufferedNetworks.get(payload.runId);
859
918
  if (!current) return null;
860
919
  return {
861
920
  type: isNested ? "data-tool-network" : "data-network",
862
- id: payload.payload.runId,
921
+ id: payload.runId,
863
922
  data: {
864
- name: current.name,
923
+ ...current,
865
924
  status: "finished",
866
- steps: current.steps,
867
- output: payload.payload?.result ?? null
925
+ usage: payload.payload?.usage ?? current.usage,
926
+ output: payload.payload?.result ?? current.output
868
927
  }
869
928
  };
870
929
  }
871
930
  case "network-execution-event-step-finish": {
872
- const current = bufferedNetworks.get(payload.payload.runId);
931
+ const current = bufferedNetworks.get(payload.runId);
873
932
  if (!current) return null;
874
933
  return {
875
934
  type: isNested ? "data-tool-network" : "data-network",
876
- id: payload.payload.runId,
935
+ id: payload.runId,
877
936
  data: {
878
- name: current.name,
937
+ ...current,
879
938
  status: "finished",
880
- steps: current.steps,
881
- output: payload.payload?.result ?? null
939
+ output: payload.payload?.result ?? current.output
882
940
  }
883
941
  };
884
942
  }
@@ -889,10 +947,10 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
889
947
  type: isNested ? "data-tool-network" : "data-network",
890
948
  id: payload.runId,
891
949
  data: {
892
- name: current.name,
950
+ ...current,
951
+ usage: payload.payload?.usage ?? current.usage,
893
952
  status: "finished",
894
- steps: current.steps,
895
- output: payload.payload?.result ?? null
953
+ output: payload.payload?.result ?? current.output
896
954
  }
897
955
  };
898
956
  }
@@ -906,13 +964,31 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
906
964
  }
907
965
  return payload;
908
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
+ }
909
985
  return null;
910
986
  }
911
987
  }
912
988
  }
913
989
 
914
- // src/to-ai-sdk-format.ts
915
- function toAISdkFormat(stream, options = { from: "agent" }) {
990
+ // src/convert-streams.ts
991
+ function toAISdkV5Stream(stream, options = { from: "agent" }) {
916
992
  const from = options?.from;
917
993
  if (from === "workflow") {
918
994
  return stream.pipeThrough(WorkflowStreamToAISDKTransformer());
@@ -921,7 +997,7 @@ function toAISdkFormat(stream, options = { from: "agent" }) {
921
997
  return stream.pipeThrough(AgentNetworkToAISDKTransformer());
922
998
  }
923
999
  const agentReadable = "fullStream" in stream ? stream.fullStream : stream;
924
- return agentReadable.pipeThrough(AgentStreamToAISDKTransformer());
1000
+ return agentReadable.pipeThrough(AgentStreamToAISDKTransformer(options?.lastMessageId));
925
1001
  }
926
1002
 
927
1003
  // src/chat-route.ts
@@ -1029,7 +1105,7 @@ function chatRoute({
1029
1105
  handler: async (c) => {
1030
1106
  const { messages, ...rest } = await c.req.json();
1031
1107
  const mastra = c.get("mastra");
1032
- const runtimeContext = c.get("runtimeContext");
1108
+ const requestContext = c.get("requestContext");
1033
1109
  let agentToUse = agent;
1034
1110
  if (!agent) {
1035
1111
  const agentId = c.req.param("agentId");
@@ -1040,8 +1116,8 @@ function chatRoute({
1040
1116
  `Fixed agent ID was set together with an agentId path parameter. This can lead to unexpected behavior.`
1041
1117
  );
1042
1118
  }
1043
- if (runtimeContext && defaultOptions?.runtimeContext) {
1044
- 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".`);
1045
1121
  }
1046
1122
  if (!agentToUse) {
1047
1123
  throw new Error("Agent ID is required");
@@ -1053,12 +1129,16 @@ function chatRoute({
1053
1129
  const result = await agentObj.stream(messages, {
1054
1130
  ...defaultOptions,
1055
1131
  ...rest,
1056
- runtimeContext: runtimeContext || defaultOptions?.runtimeContext
1132
+ requestContext: requestContext || defaultOptions?.requestContext
1057
1133
  });
1134
+ let lastMessageId;
1135
+ if (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
1136
+ lastMessageId = messages[messages.length - 1].id;
1137
+ }
1058
1138
  const uiMessageStream = createUIMessageStream({
1059
1139
  originalMessages: messages,
1060
1140
  execute: async ({ writer }) => {
1061
- for await (const part of toAISdkFormat(result, { from: "agent" })) {
1141
+ for await (const part of toAISdkV5Stream(result, { from: "agent", lastMessageId })) {
1062
1142
  writer.write(part);
1063
1143
  }
1064
1144
  }
@@ -1099,7 +1179,7 @@ function workflowRoute({
1099
1179
  type: "object",
1100
1180
  properties: {
1101
1181
  inputData: { type: "object", additionalProperties: true },
1102
- runtimeContext: { type: "object", additionalProperties: true },
1182
+ requestContext: { type: "object", additionalProperties: true },
1103
1183
  tracingOptions: { type: "object", additionalProperties: true }
1104
1184
  }
1105
1185
  }
@@ -1118,7 +1198,7 @@ function workflowRoute({
1118
1198
  }
1119
1199
  },
1120
1200
  handler: async (c) => {
1121
- const { inputData, ...rest } = await c.req.json();
1201
+ const { inputData, resumeData, ...rest } = await c.req.json();
1122
1202
  const mastra = c.get("mastra");
1123
1203
  let workflowToUse = workflow;
1124
1204
  if (!workflow) {
@@ -1137,11 +1217,11 @@ function workflowRoute({
1137
1217
  if (!workflowObj) {
1138
1218
  throw new Error(`Workflow ${workflowToUse} not found`);
1139
1219
  }
1140
- const run = await workflowObj.createRunAsync();
1141
- const stream = run.streamVNext({ inputData, ...rest });
1220
+ const run = await workflowObj.createRun();
1221
+ const stream = resumeData ? run.resumeStream({ resumeData, ...rest }) : run.stream({ inputData, ...rest });
1142
1222
  const uiMessageStream = createUIMessageStream({
1143
1223
  execute: async ({ writer }) => {
1144
- for await (const part of toAISdkFormat(stream, { from: "workflow" })) {
1224
+ for await (const part of toAISdkV5Stream(stream, { from: "workflow" })) {
1145
1225
  writer.write(part);
1146
1226
  }
1147
1227
  }
@@ -1181,7 +1261,7 @@ function networkRoute({
1181
1261
  type: "object",
1182
1262
  properties: {
1183
1263
  messages: { type: "array", items: { type: "object" } },
1184
- runtimeContext: { type: "object", additionalProperties: true },
1264
+ requestContext: { type: "object", additionalProperties: true },
1185
1265
  runId: { type: "string" },
1186
1266
  maxSteps: { type: "number" },
1187
1267
  threadId: { type: "string" },
@@ -1235,7 +1315,7 @@ function networkRoute({
1235
1315
  });
1236
1316
  const uiMessageStream = createUIMessageStream({
1237
1317
  execute: async ({ writer }) => {
1238
- for await (const part of toAISdkFormat(result, { from: "network" })) {
1318
+ for await (const part of toAISdkV5Stream(result, { from: "network" })) {
1239
1319
  writer.write(part);
1240
1320
  }
1241
1321
  }
@@ -1245,6 +1325,13 @@ function networkRoute({
1245
1325
  });
1246
1326
  }
1247
1327
 
1248
- 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 };
1249
1336
  //# sourceMappingURL=index.js.map
1250
1337
  //# sourceMappingURL=index.js.map