@mastra/ai-sdk 0.3.1 → 0.3.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.stream.d.ts","sourceRoot":"","sources":["../../../src/__tests__/__fixtures__/network.stream.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAu9FhC,CAAC"}
package/dist/helpers.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- import type { ChunkType } from '@mastra/core';
2
- import type { PartialSchemaOutput, OutputSchema, DataChunkType } from '@mastra/core/stream';
1
+ import type { ChunkType, PartialSchemaOutput, OutputSchema, DataChunkType } from '@mastra/core/stream';
3
2
  import type { InferUIMessageChunk, ObjectStreamPart, TextStreamPart, ToolSet, UIMessage } from 'ai';
4
3
  export type OutputChunkType<OUTPUT extends OutputSchema = undefined> = TextStreamPart<ToolSet> | ObjectStreamPart<PartialSchemaOutput<OUTPUT>> | DataChunkType | undefined;
5
4
  export type ToolAgentChunkType = {
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE5F,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAGpG,MAAM,MAAM,eAAe,CAAC,MAAM,SAAS,YAAY,GAAG,SAAS,IAC/D,cAAc,CAAC,OAAO,CAAC,GACvB,gBAAgB,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,GAC7C,aAAa,GACb,SAAS,CAAC;AAEd,MAAM,MAAM,kBAAkB,GAAG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC;AAC1F,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC;AAChG,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC;AAE9F,wBAAgB,2BAA2B,CAAC,MAAM,SAAS,YAAY,GAAG,SAAS,EAAE,EACnF,KAAK,EACL,IAAe,GAChB,EAAE;IACD,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACzB,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;CAC9B,GAAG,eAAe,CAAC,MAAM,CAAC,CAiP1B;AAED,wBAAgB,uCAAuC,CAAC,UAAU,SAAS,SAAS,EAAE,EACpF,IAAI,EACJ,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,OAAO,EACP,SAAS,EACT,UAAU,EACV,iBAAiB,GAClB,EAAE;IAED,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,aAAa,GAAG;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,GAAG,CAAA;KAAE,CAAC;IACzG,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,mBAAmB,CAAC,UAAU,CAAC,GAAG,kBAAkB,GAAG,qBAAqB,GAAG,oBAAoB,GAAG,SAAS,CAwOlH"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEvG,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAGpG,MAAM,MAAM,eAAe,CAAC,MAAM,SAAS,YAAY,GAAG,SAAS,IAC/D,cAAc,CAAC,OAAO,CAAC,GACvB,gBAAgB,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,GAC7C,aAAa,GACb,SAAS,CAAC;AAEd,MAAM,MAAM,kBAAkB,GAAG;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC;AAC1F,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC;AAChG,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC;AAE9F,wBAAgB,2BAA2B,CAAC,MAAM,SAAS,YAAY,GAAG,SAAS,EAAE,EACnF,KAAK,EACL,IAAe,GAChB,EAAE;IACD,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACzB,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;CAC9B,GAAG,eAAe,CAAC,MAAM,CAAC,CAiP1B;AAED,wBAAgB,uCAAuC,CAAC,UAAU,SAAS,SAAS,EAAE,EACpF,IAAI,EACJ,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,OAAO,EACP,SAAS,EACT,UAAU,EACV,iBAAiB,GAClB,EAAE;IAED,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,aAAa,GAAG;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,GAAG,CAAA;KAAE,CAAC;IACzG,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,mBAAmB,CAAC,UAAU,CAAC,GAAG,kBAAkB,GAAG,qBAAqB,GAAG,oBAAoB,GAAG,SAAS,CAyOlH"}
package/dist/index.cjs CHANGED
@@ -10,6 +10,45 @@ 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
+ var isMastraTextStreamChunk = (chunk) => {
14
+ return chunk && typeof chunk === "object" && "type" in chunk && typeof chunk.type === "string" && [
15
+ "text-start",
16
+ "text-delta",
17
+ "text-end",
18
+ "reasoning-start",
19
+ "reasoning-delta",
20
+ "reasoning-end",
21
+ "file",
22
+ "source",
23
+ "tool-input-start",
24
+ "tool-input-delta",
25
+ "tool-call",
26
+ "tool-result",
27
+ "tool-error",
28
+ "error",
29
+ "start-step",
30
+ "finish-step",
31
+ "start",
32
+ "finish",
33
+ "abort",
34
+ "tool-input-end",
35
+ "raw"
36
+ ].includes(chunk.type);
37
+ };
38
+ function safeParseErrorObject(obj) {
39
+ if (typeof obj !== "object" || obj === null) {
40
+ return String(obj);
41
+ }
42
+ try {
43
+ const stringified = JSON.stringify(obj);
44
+ if (stringified === "{}") {
45
+ return String(obj);
46
+ }
47
+ return stringified;
48
+ } catch {
49
+ return String(obj);
50
+ }
51
+ }
13
52
  var isAgentExecutionDataChunkType = (chunk) => {
14
53
  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-");
15
54
  };
@@ -477,7 +516,10 @@ function convertFullStreamChunkToUIMessageStream({
477
516
  }
478
517
 
479
518
  // src/transformers.ts
480
- function WorkflowStreamToAISDKTransformer() {
519
+ var PRIMITIVE_CACHE_SYMBOL = Symbol("primitive-cache");
520
+ function WorkflowStreamToAISDKTransformer({
521
+ includeTextStreamParts
522
+ } = {}) {
481
523
  const bufferedWorkflows = /* @__PURE__ */ new Map();
482
524
  return new TransformStream({
483
525
  start(controller) {
@@ -491,7 +533,7 @@ function WorkflowStreamToAISDKTransformer() {
491
533
  });
492
534
  },
493
535
  transform(chunk, controller) {
494
- const transformed = transformWorkflow(chunk, bufferedWorkflows);
536
+ const transformed = transformWorkflow(chunk, bufferedWorkflows, false, includeTextStreamParts);
495
537
  if (transformed) controller.enqueue(transformed);
496
538
  }
497
539
  });
@@ -520,7 +562,9 @@ function AgentStreamToAISDKTransformer({
520
562
  sendStart,
521
563
  sendFinish,
522
564
  sendReasoning,
523
- sendSources
565
+ sendSources,
566
+ messageMetadata,
567
+ onError
524
568
  }) {
525
569
  let bufferedSteps = /* @__PURE__ */ new Map();
526
570
  let tripwireOccurred = false;
@@ -538,11 +582,12 @@ function AgentStreamToAISDKTransformer({
538
582
  part,
539
583
  sendReasoning,
540
584
  sendSources,
585
+ messageMetadataValue: messageMetadata?.({ part }),
541
586
  sendStart,
542
587
  sendFinish,
543
588
  responseMessageId: lastMessageId,
544
- onError() {
545
- return "Error";
589
+ onError(error) {
590
+ return onError ? onError(error) : safeParseErrorObject(error);
546
591
  }
547
592
  });
548
593
  if (transformedChunk) {
@@ -709,7 +754,7 @@ function transformAgent(payload, bufferedSteps) {
709
754
  }
710
755
  return null;
711
756
  }
712
- function transformWorkflow(payload, bufferedWorkflows, isNested) {
757
+ function transformWorkflow(payload, bufferedWorkflows, isNested, includeTextStreamParts) {
713
758
  switch (payload.type) {
714
759
  case "workflow-start":
715
760
  bufferedWorkflows.set(payload.runId, {
@@ -802,6 +847,29 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
802
847
  }
803
848
  };
804
849
  }
850
+ case "workflow-step-output": {
851
+ const output = payload.payload.output;
852
+ if (includeTextStreamParts && output && isMastraTextStreamChunk(output)) {
853
+ const part = convertMastraChunkToAISDKv5({ chunk: output, mode: "stream" });
854
+ const transformedChunk = convertFullStreamChunkToUIMessageStream({
855
+ part,
856
+ onError(error) {
857
+ return safeParseErrorObject(error);
858
+ }
859
+ });
860
+ return transformedChunk;
861
+ }
862
+ if (output && isDataChunkType(output)) {
863
+ if (!("data" in output)) {
864
+ throw new Error(
865
+ `UI Messages require a data property when using data- prefixed chunks
866
+ ${JSON.stringify(output)}`
867
+ );
868
+ }
869
+ return output;
870
+ }
871
+ return null;
872
+ }
805
873
  default: {
806
874
  if (isDataChunkType(payload)) {
807
875
  if (!("data" in payload)) {
@@ -821,12 +889,29 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
821
889
  case "routing-agent-start": {
822
890
  if (!bufferedNetworks.has(payload.runId)) {
823
891
  bufferedNetworks.set(payload.runId, {
824
- name: payload.payload.agentId,
892
+ name: payload.payload.networkId,
825
893
  steps: [],
826
894
  usage: null,
827
895
  output: null
828
896
  });
829
897
  }
898
+ const current = bufferedNetworks.get(payload.runId);
899
+ current.steps.push({
900
+ id: payload.payload.runId,
901
+ name: payload.payload.agentId,
902
+ status: "running",
903
+ iteration: payload.payload.inputData.iteration,
904
+ input: {
905
+ task: payload.payload.inputData.task,
906
+ threadId: payload.payload.inputData.threadId,
907
+ threadResourceId: payload.payload.inputData.threadResourceId
908
+ },
909
+ output: "",
910
+ task: null,
911
+ suspendPayload: null,
912
+ resumePayload: null,
913
+ [PRIMITIVE_CACHE_SYMBOL]: /* @__PURE__ */ new Map()
914
+ });
830
915
  return {
831
916
  type: isNested ? "data-tool-network" : "data-network",
832
917
  id: payload.runId,
@@ -857,14 +942,19 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
857
942
  };
858
943
  }
859
944
  case "agent-execution-start": {
860
- const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
945
+ const current = bufferedNetworks.get(payload.runId);
946
+ if (!current) return null;
861
947
  current.steps.push({
948
+ id: payload.payload.runId,
862
949
  name: payload.payload.agentId,
863
950
  status: "running",
864
- input: payload.payload.args || null,
951
+ iteration: payload.payload.args?.iteration ?? 0,
952
+ input: { prompt: payload.payload.args?.prompt ?? "" },
865
953
  output: null,
954
+ task: null,
866
955
  suspendPayload: null,
867
- resumePayload: null
956
+ resumePayload: null,
957
+ [PRIMITIVE_CACHE_SYMBOL]: /* @__PURE__ */ new Map()
868
958
  });
869
959
  bufferedNetworks.set(payload.runId, current);
870
960
  return {
@@ -877,14 +967,19 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
877
967
  };
878
968
  }
879
969
  case "workflow-execution-start": {
880
- const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
970
+ const current = bufferedNetworks.get(payload.runId);
971
+ if (!current) return null;
881
972
  current.steps.push({
882
- name: payload.payload.name,
973
+ id: payload.payload.runId,
974
+ name: payload.payload.workflowId,
883
975
  status: "running",
884
- input: payload.payload.args || null,
976
+ iteration: payload.payload.args?.iteration ?? 0,
977
+ input: { prompt: payload.payload.args?.prompt ?? "" },
885
978
  output: null,
979
+ task: null,
886
980
  suspendPayload: null,
887
- resumePayload: null
981
+ resumePayload: null,
982
+ [PRIMITIVE_CACHE_SYMBOL]: /* @__PURE__ */ new Map()
888
983
  });
889
984
  bufferedNetworks.set(payload.runId, current);
890
985
  return {
@@ -897,14 +992,21 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
897
992
  };
898
993
  }
899
994
  case "tool-execution-start": {
900
- const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
995
+ const current = bufferedNetworks.get(payload.runId);
996
+ if (!current) return null;
901
997
  current.steps.push({
998
+ id: payload.payload.args.toolCallId,
902
999
  name: payload.payload.args?.toolName,
903
1000
  status: "running",
1001
+ iteration: payload.payload.args?.iteration ? Number(payload.payload.args.iteration) : 0,
1002
+ task: {
1003
+ id: payload.payload.args?.toolName
1004
+ },
904
1005
  input: payload.payload.args?.args || null,
905
1006
  output: null,
906
1007
  suspendPayload: null,
907
- resumePayload: null
1008
+ resumePayload: null,
1009
+ [PRIMITIVE_CACHE_SYMBOL]: /* @__PURE__ */ new Map()
908
1010
  });
909
1011
  bufferedNetworks.set(payload.runId, current);
910
1012
  return {
@@ -919,14 +1021,13 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
919
1021
  case "agent-execution-end": {
920
1022
  const current = bufferedNetworks.get(payload.runId);
921
1023
  if (!current) return null;
922
- current.steps.push({
923
- name: payload.payload.agentId,
924
- status: "success",
925
- input: null,
926
- output: payload.payload.result,
927
- suspendPayload: null,
928
- resumePayload: null
929
- });
1024
+ const stepId = payload.payload.runId;
1025
+ const step = current.steps.find((step2) => step2.id === stepId);
1026
+ if (!step) {
1027
+ return null;
1028
+ }
1029
+ step.status = "success";
1030
+ step.output = payload.payload.result;
930
1031
  return {
931
1032
  type: isNested ? "data-tool-network" : "data-network",
932
1033
  id: payload.runId,
@@ -941,14 +1042,13 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
941
1042
  case "tool-execution-end": {
942
1043
  const current = bufferedNetworks.get(payload.runId);
943
1044
  if (!current) return null;
944
- current.steps.push({
945
- name: payload.payload.toolName,
946
- status: "success",
947
- input: null,
948
- output: payload.payload.result,
949
- suspendPayload: null,
950
- resumePayload: null
951
- });
1045
+ const stepId = payload.payload.toolCallId;
1046
+ const step = current.steps.find((step2) => step2.id === stepId);
1047
+ if (!step) {
1048
+ return null;
1049
+ }
1050
+ step.status = "success";
1051
+ step.output = payload.payload.result;
952
1052
  return {
953
1053
  type: isNested ? "data-tool-network" : "data-network",
954
1054
  id: payload.runId,
@@ -962,14 +1062,13 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
962
1062
  case "workflow-execution-end": {
963
1063
  const current = bufferedNetworks.get(payload.runId);
964
1064
  if (!current) return null;
965
- current.steps.push({
966
- name: payload.payload.name,
967
- status: "success",
968
- input: null,
969
- output: payload.payload.result,
970
- suspendPayload: null,
971
- resumePayload: null
972
- });
1065
+ const stepId = payload.payload.runId;
1066
+ const step = current.steps.find((step2) => step2.id === stepId);
1067
+ if (!step) {
1068
+ return null;
1069
+ }
1070
+ step.status = "success";
1071
+ step.output = payload.payload.result;
973
1072
  return {
974
1073
  type: isNested ? "data-tool-network" : "data-network",
975
1074
  id: payload.runId,
@@ -984,12 +1083,24 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
984
1083
  case "routing-agent-end": {
985
1084
  const current = bufferedNetworks.get(payload.runId);
986
1085
  if (!current) return null;
1086
+ const stepId = payload.payload.runId;
1087
+ const step = current.steps.find((step2) => step2.id === stepId);
1088
+ if (!step) {
1089
+ return null;
1090
+ }
1091
+ step.status = "success";
1092
+ step.task = {
1093
+ id: payload.payload.primitiveId,
1094
+ type: payload.payload.primitiveType,
1095
+ name: payload.payload.task,
1096
+ reason: payload.payload.selectionReason
1097
+ };
1098
+ step.output = payload.payload.result;
987
1099
  return {
988
1100
  type: isNested ? "data-tool-network" : "data-network",
989
1101
  id: payload.runId,
990
1102
  data: {
991
1103
  ...current,
992
- status: "finished",
993
1104
  usage: payload.payload?.usage ?? current.usage,
994
1105
  output: payload.payload?.result ?? current.output
995
1106
  }
@@ -1023,6 +1134,39 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
1023
1134
  };
1024
1135
  }
1025
1136
  default: {
1137
+ if (payload.type.startsWith("agent-execution-event-")) {
1138
+ const stepId = payload.payload.runId;
1139
+ const current = bufferedNetworks.get(payload.runId);
1140
+ if (!current) return null;
1141
+ const step = current.steps.find((step2) => step2.id === stepId);
1142
+ if (!step) {
1143
+ return null;
1144
+ }
1145
+ step[PRIMITIVE_CACHE_SYMBOL] = step[PRIMITIVE_CACHE_SYMBOL] || /* @__PURE__ */ new Map();
1146
+ const result = transformAgent(payload.payload, step[PRIMITIVE_CACHE_SYMBOL]);
1147
+ if (result) {
1148
+ const { request, response, ...data } = result.data;
1149
+ step.task = data;
1150
+ }
1151
+ }
1152
+ if (payload.type.startsWith("workflow-execution-event-")) {
1153
+ const stepId = payload.payload.runId;
1154
+ const current = bufferedNetworks.get(payload.runId);
1155
+ if (!current) return null;
1156
+ const step = current.steps.find((step2) => step2.id === stepId);
1157
+ if (!step) {
1158
+ return null;
1159
+ }
1160
+ step[PRIMITIVE_CACHE_SYMBOL] = step[PRIMITIVE_CACHE_SYMBOL] || /* @__PURE__ */ new Map();
1161
+ const result = transformWorkflow(payload.payload, step[PRIMITIVE_CACHE_SYMBOL]);
1162
+ if (result && "data" in result) {
1163
+ const data = result.data;
1164
+ step.task = data;
1165
+ if (data.name && step.task) {
1166
+ step.task.id = data.name;
1167
+ }
1168
+ }
1169
+ }
1026
1170
  if (isDataChunkType(payload)) {
1027
1171
  if (!("data" in payload)) {
1028
1172
  throw new Error(
@@ -1030,7 +1174,8 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
1030
1174
  ${JSON.stringify(payload)}`
1031
1175
  );
1032
1176
  }
1033
- return payload;
1177
+ const { type, data } = payload;
1178
+ return { type, data };
1034
1179
  }
1035
1180
  if (isAgentExecutionDataChunkType(payload)) {
1036
1181
  if (!("data" in payload.payload)) {
@@ -1039,7 +1184,8 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
1039
1184
  ${JSON.stringify(payload)}`
1040
1185
  );
1041
1186
  }
1042
- return payload.payload;
1187
+ const { type, data } = payload.payload;
1188
+ return { type, data };
1043
1189
  }
1044
1190
  if (isWorkflowExecutionDataChunkType(payload)) {
1045
1191
  if (!("data" in payload.payload)) {
@@ -1048,7 +1194,8 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
1048
1194
  ${JSON.stringify(payload)}`
1049
1195
  );
1050
1196
  }
1051
- return payload.payload;
1197
+ const { type, data } = payload.payload;
1198
+ return { type, data };
1052
1199
  }
1053
1200
  return null;
1054
1201
  }
@@ -1063,7 +1210,10 @@ function toAISdkFormat(stream, options = {
1063
1210
  }) {
1064
1211
  const from = options?.from;
1065
1212
  if (from === "workflow") {
1066
- return stream.pipeThrough(WorkflowStreamToAISDKTransformer());
1213
+ const includeTextStreamParts = options?.includeTextStreamParts ?? false;
1214
+ return stream.pipeThrough(
1215
+ WorkflowStreamToAISDKTransformer({ includeTextStreamParts })
1216
+ );
1067
1217
  }
1068
1218
  if (from === "network") {
1069
1219
  return stream.pipeThrough(AgentNetworkToAISDKTransformer());
@@ -1075,7 +1225,9 @@ function toAISdkFormat(stream, options = {
1075
1225
  sendStart: options?.sendStart,
1076
1226
  sendFinish: options?.sendFinish,
1077
1227
  sendReasoning: options?.sendReasoning,
1078
- sendSources: options?.sendSources
1228
+ sendSources: options?.sendSources,
1229
+ messageMetadata: options?.messageMetadata,
1230
+ onError: options?.onError
1079
1231
  })
1080
1232
  );
1081
1233
  }
@@ -1206,7 +1358,7 @@ function chatRoute({
1206
1358
  if (!agentToUse) {
1207
1359
  throw new Error("Agent ID is required");
1208
1360
  }
1209
- const agentObj = mastra.getAgent(agentToUse);
1361
+ const agentObj = mastra.getAgentById(agentToUse);
1210
1362
  if (!agentObj) {
1211
1363
  throw new Error(`Agent ${agentToUse} not found`);
1212
1364
  }
@@ -1242,7 +1394,8 @@ function chatRoute({
1242
1394
  }
1243
1395
  function workflowRoute({
1244
1396
  path = "/api/workflows/:workflowId/stream",
1245
- workflow
1397
+ workflow,
1398
+ includeTextStreamParts = false
1246
1399
  }) {
1247
1400
  if (!workflow && !path.includes("/:workflowId")) {
1248
1401
  throw new Error("Path must include :workflowId to route to the correct workflow or pass the workflow explicitly");
@@ -1295,6 +1448,7 @@ function workflowRoute({
1295
1448
  handler: async (c) => {
1296
1449
  const { runId, resourceId, inputData, resumeData, ...rest } = await c.req.json();
1297
1450
  const mastra = c.get("mastra");
1451
+ const runtimeContext = c.get("runtimeContext");
1298
1452
  let workflowToUse = workflow;
1299
1453
  if (!workflow) {
1300
1454
  const workflowId = c.req.param("workflowId");
@@ -1308,15 +1462,20 @@ function workflowRoute({
1308
1462
  if (!workflowToUse) {
1309
1463
  throw new Error("Workflow ID is required");
1310
1464
  }
1311
- const workflowObj = mastra.getWorkflow(workflowToUse);
1465
+ const workflowObj = mastra.getWorkflowById(workflowToUse);
1312
1466
  if (!workflowObj) {
1313
1467
  throw new Error(`Workflow ${workflowToUse} not found`);
1314
1468
  }
1469
+ if (runtimeContext && rest.runtimeContext) {
1470
+ mastra.getLogger()?.warn(
1471
+ `"runtimeContext" from the request body will be ignored because "runtimeContext" is already set in the route options.`
1472
+ );
1473
+ }
1315
1474
  const run = await workflowObj.createRunAsync({ runId, resourceId, ...rest });
1316
- const stream = resumeData ? run.resumeStream({ resumeData, ...rest }) : run.stream({ inputData, ...rest });
1475
+ const stream = resumeData ? run.resumeStream({ resumeData, ...rest, runtimeContext: runtimeContext || rest.runtimeContext }) : run.stream({ inputData, ...rest, runtimeContext: runtimeContext || rest.runtimeContext });
1317
1476
  const uiMessageStream = ai.createUIMessageStream({
1318
1477
  execute: async ({ writer }) => {
1319
- for await (const part of toAISdkFormat(stream, { from: "workflow" })) {
1478
+ for await (const part of toAISdkFormat(stream, { from: "workflow", includeTextStreamParts })) {
1320
1479
  writer.write(part);
1321
1480
  }
1322
1481
  }
@@ -1401,7 +1560,7 @@ function networkRoute({
1401
1560
  if (!agentToUse) {
1402
1561
  throw new Error("Agent ID is required");
1403
1562
  }
1404
- const agentObj = mastra.getAgent(agentToUse);
1563
+ const agentObj = mastra.getAgentById(agentToUse);
1405
1564
  if (!agentObj) {
1406
1565
  throw new Error(`Agent ${agentToUse} not found`);
1407
1566
  }