@mastra/ai-sdk 0.0.0-playground-studio-cloud-20251031080052 → 0.0.0-playground-studio-again-20251114100107

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({
@@ -339,6 +359,14 @@ function convertFullStreamChunkToUIMessageStream({
339
359
  toolCallId: part.toolCallId,
340
360
  payload: part.output
341
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;
342
370
  }
343
371
  return;
344
372
  }
@@ -443,7 +471,7 @@ function AgentNetworkToAISDKTransformer() {
443
471
  }
444
472
  });
445
473
  }
446
- function AgentStreamToAISDKTransformer() {
474
+ function AgentStreamToAISDKTransformer(lastMessageId) {
447
475
  let bufferedSteps = /* @__PURE__ */ new Map();
448
476
  return new TransformStream({
449
477
  transform(chunk, controller) {
@@ -454,9 +482,9 @@ function AgentStreamToAISDKTransformer() {
454
482
  sendSources: false,
455
483
  sendStart: true,
456
484
  sendFinish: true,
457
- responseMessageId: chunk.runId,
458
- onError() {
459
- return "Error";
485
+ responseMessageId: lastMessageId,
486
+ onError(error) {
487
+ return safeParseErrorObject(error);
460
488
  }
461
489
  });
462
490
  if (transformedChunk) {
@@ -638,7 +666,9 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
638
666
  name: payload.payload.id,
639
667
  status: payload.payload.status,
640
668
  input: payload.payload.payload ?? null,
641
- output: null
669
+ output: null,
670
+ suspendPayload: null,
671
+ resumePayload: null
642
672
  };
643
673
  bufferedWorkflows.set(payload.runId, current);
644
674
  return {
@@ -671,6 +701,27 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
671
701
  }
672
702
  };
673
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
+ }
674
725
  case "workflow-finish": {
675
726
  const current = bufferedWorkflows.get(payload.runId);
676
727
  if (!current) return null;
@@ -702,19 +753,22 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
702
753
  function transformNetwork(payload, bufferedNetworks, isNested) {
703
754
  switch (payload.type) {
704
755
  case "routing-agent-start": {
705
- if (!bufferedNetworks.has(payload.payload.runId)) {
706
- bufferedNetworks.set(payload.payload.runId, {
756
+ if (!bufferedNetworks.has(payload.runId)) {
757
+ bufferedNetworks.set(payload.runId, {
707
758
  name: payload.payload.agentId,
708
- steps: []
759
+ steps: [],
760
+ usage: null,
761
+ output: null
709
762
  });
710
763
  }
711
764
  return {
712
765
  type: isNested ? "data-tool-network" : "data-network",
713
- id: payload.payload.runId,
766
+ id: payload.runId,
714
767
  data: {
715
- name: bufferedNetworks.get(payload.payload.runId).name,
768
+ name: bufferedNetworks.get(payload.runId).name,
716
769
  status: "running",
717
- steps: bufferedNetworks.get(payload.payload.runId).steps,
770
+ usage: null,
771
+ steps: bufferedNetworks.get(payload.runId).steps,
718
772
  output: null
719
773
  }
720
774
  };
@@ -737,62 +791,62 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
737
791
  };
738
792
  }
739
793
  case "agent-execution-start": {
740
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
794
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
741
795
  current.steps.push({
742
796
  name: payload.payload.agentId,
743
797
  status: "running",
744
798
  input: payload.payload.args || null,
745
- output: null
799
+ output: null,
800
+ suspendPayload: null,
801
+ resumePayload: null
746
802
  });
747
- bufferedNetworks.set(payload.payload.runId, current);
803
+ bufferedNetworks.set(payload.runId, current);
748
804
  return {
749
805
  type: isNested ? "data-tool-network" : "data-network",
750
- id: payload.payload.runId,
806
+ id: payload.runId,
751
807
  data: {
752
- name: current.name,
753
- status: "running",
754
- steps: current.steps,
755
- output: null
808
+ ...current,
809
+ status: "running"
756
810
  }
757
811
  };
758
812
  }
759
813
  case "workflow-execution-start": {
760
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
814
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
761
815
  current.steps.push({
762
816
  name: payload.payload.name,
763
817
  status: "running",
764
818
  input: payload.payload.args || null,
765
- output: null
819
+ output: null,
820
+ suspendPayload: null,
821
+ resumePayload: null
766
822
  });
767
- bufferedNetworks.set(payload.payload.runId, current);
823
+ bufferedNetworks.set(payload.runId, current);
768
824
  return {
769
825
  type: isNested ? "data-tool-network" : "data-network",
770
- id: payload.payload.runId,
826
+ id: payload.runId,
771
827
  data: {
772
- name: current.name,
773
- status: "running",
774
- steps: current.steps,
775
- output: null
828
+ ...current,
829
+ status: "running"
776
830
  }
777
831
  };
778
832
  }
779
833
  case "tool-execution-start": {
780
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
834
+ const current = bufferedNetworks.get(payload.runId) || { name: "", steps: [], usage: null, output: null };
781
835
  current.steps.push({
782
836
  name: payload.payload.args?.toolName,
783
837
  status: "running",
784
838
  input: payload.payload.args?.args || null,
785
- output: null
839
+ output: null,
840
+ suspendPayload: null,
841
+ resumePayload: null
786
842
  });
787
- bufferedNetworks.set(payload.payload.runId, current);
843
+ bufferedNetworks.set(payload.runId, current);
788
844
  return {
789
845
  type: isNested ? "data-tool-network" : "data-network",
790
- id: payload.payload.runId,
846
+ id: payload.runId,
791
847
  data: {
792
- name: current.name,
793
- status: "running",
794
- steps: current.steps,
795
- output: null
848
+ ...current,
849
+ status: "running"
796
850
  }
797
851
  };
798
852
  }
@@ -803,16 +857,18 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
803
857
  name: payload.payload.agentId,
804
858
  status: "success",
805
859
  input: null,
806
- output: payload.payload.result
860
+ output: payload.payload.result,
861
+ suspendPayload: null,
862
+ resumePayload: null
807
863
  });
808
864
  return {
809
865
  type: isNested ? "data-tool-network" : "data-network",
810
866
  id: payload.runId,
811
867
  data: {
812
- name: current.name,
868
+ ...current,
869
+ usage: payload.payload?.usage ?? current.usage,
813
870
  status: "running",
814
- steps: current.steps,
815
- output: payload.payload.result ?? null
871
+ output: payload.payload.result ?? current.output
816
872
  }
817
873
  };
818
874
  }
@@ -823,16 +879,17 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
823
879
  name: payload.payload.toolName,
824
880
  status: "success",
825
881
  input: null,
826
- output: payload.payload.result
882
+ output: payload.payload.result,
883
+ suspendPayload: null,
884
+ resumePayload: null
827
885
  });
828
886
  return {
829
887
  type: isNested ? "data-tool-network" : "data-network",
830
888
  id: payload.runId,
831
889
  data: {
832
- name: current.name,
890
+ ...current,
833
891
  status: "running",
834
- steps: current.steps,
835
- output: payload.payload.result ?? null
892
+ output: payload.payload.result ?? current.output
836
893
  }
837
894
  };
838
895
  }
@@ -843,44 +900,45 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
843
900
  name: payload.payload.name,
844
901
  status: "success",
845
902
  input: null,
846
- output: payload.payload.result
903
+ output: payload.payload.result,
904
+ suspendPayload: null,
905
+ resumePayload: null
847
906
  });
848
907
  return {
849
908
  type: isNested ? "data-tool-network" : "data-network",
850
909
  id: payload.runId,
851
910
  data: {
852
- name: current.name,
911
+ ...current,
912
+ usage: payload.payload?.usage ?? current.usage,
853
913
  status: "running",
854
- steps: current.steps,
855
- output: payload.payload.result ?? null
914
+ output: payload.payload.result ?? current.output
856
915
  }
857
916
  };
858
917
  }
859
918
  case "routing-agent-end": {
860
- const current = bufferedNetworks.get(payload.payload.runId);
919
+ const current = bufferedNetworks.get(payload.runId);
861
920
  if (!current) return null;
862
921
  return {
863
922
  type: isNested ? "data-tool-network" : "data-network",
864
- id: payload.payload.runId,
923
+ id: payload.runId,
865
924
  data: {
866
- name: current.name,
925
+ ...current,
867
926
  status: "finished",
868
- steps: current.steps,
869
- output: payload.payload?.result ?? null
927
+ usage: payload.payload?.usage ?? current.usage,
928
+ output: payload.payload?.result ?? current.output
870
929
  }
871
930
  };
872
931
  }
873
932
  case "network-execution-event-step-finish": {
874
- const current = bufferedNetworks.get(payload.payload.runId);
933
+ const current = bufferedNetworks.get(payload.runId);
875
934
  if (!current) return null;
876
935
  return {
877
936
  type: isNested ? "data-tool-network" : "data-network",
878
- id: payload.payload.runId,
937
+ id: payload.runId,
879
938
  data: {
880
- name: current.name,
939
+ ...current,
881
940
  status: "finished",
882
- steps: current.steps,
883
- output: payload.payload?.result ?? null
941
+ output: payload.payload?.result ?? current.output
884
942
  }
885
943
  };
886
944
  }
@@ -891,10 +949,10 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
891
949
  type: isNested ? "data-tool-network" : "data-network",
892
950
  id: payload.runId,
893
951
  data: {
894
- name: current.name,
952
+ ...current,
953
+ usage: payload.payload?.usage ?? current.usage,
895
954
  status: "finished",
896
- steps: current.steps,
897
- output: payload.payload?.result ?? null
955
+ output: payload.payload?.result ?? current.output
898
956
  }
899
957
  };
900
958
  }
@@ -908,13 +966,31 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
908
966
  }
909
967
  return payload;
910
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
+ }
911
987
  return null;
912
988
  }
913
989
  }
914
990
  }
915
991
 
916
- // src/to-ai-sdk-format.ts
917
- function toAISdkFormat(stream, options = { from: "agent" }) {
992
+ // src/convert-streams.ts
993
+ function toAISdkV5Stream(stream, options = { from: "agent" }) {
918
994
  const from = options?.from;
919
995
  if (from === "workflow") {
920
996
  return stream.pipeThrough(WorkflowStreamToAISDKTransformer());
@@ -923,7 +999,7 @@ function toAISdkFormat(stream, options = { from: "agent" }) {
923
999
  return stream.pipeThrough(AgentNetworkToAISDKTransformer());
924
1000
  }
925
1001
  const agentReadable = "fullStream" in stream ? stream.fullStream : stream;
926
- return agentReadable.pipeThrough(AgentStreamToAISDKTransformer());
1002
+ return agentReadable.pipeThrough(AgentStreamToAISDKTransformer(options?.lastMessageId));
927
1003
  }
928
1004
 
929
1005
  // src/chat-route.ts
@@ -1031,7 +1107,7 @@ function chatRoute({
1031
1107
  handler: async (c) => {
1032
1108
  const { messages, ...rest } = await c.req.json();
1033
1109
  const mastra = c.get("mastra");
1034
- const runtimeContext = c.get("runtimeContext");
1110
+ const requestContext = c.get("requestContext");
1035
1111
  let agentToUse = agent;
1036
1112
  if (!agent) {
1037
1113
  const agentId = c.req.param("agentId");
@@ -1042,8 +1118,8 @@ function chatRoute({
1042
1118
  `Fixed agent ID was set together with an agentId path parameter. This can lead to unexpected behavior.`
1043
1119
  );
1044
1120
  }
1045
- if (runtimeContext && defaultOptions?.runtimeContext) {
1046
- 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".`);
1047
1123
  }
1048
1124
  if (!agentToUse) {
1049
1125
  throw new Error("Agent ID is required");
@@ -1055,12 +1131,16 @@ function chatRoute({
1055
1131
  const result = await agentObj.stream(messages, {
1056
1132
  ...defaultOptions,
1057
1133
  ...rest,
1058
- runtimeContext: runtimeContext || defaultOptions?.runtimeContext
1134
+ requestContext: requestContext || defaultOptions?.requestContext
1059
1135
  });
1136
+ let lastMessageId;
1137
+ if (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
1138
+ lastMessageId = messages[messages.length - 1].id;
1139
+ }
1060
1140
  const uiMessageStream = ai.createUIMessageStream({
1061
1141
  originalMessages: messages,
1062
1142
  execute: async ({ writer }) => {
1063
- for await (const part of toAISdkFormat(result, { from: "agent" })) {
1143
+ for await (const part of toAISdkV5Stream(result, { from: "agent", lastMessageId })) {
1064
1144
  writer.write(part);
1065
1145
  }
1066
1146
  }
@@ -1100,9 +1180,13 @@ function workflowRoute({
1100
1180
  schema: {
1101
1181
  type: "object",
1102
1182
  properties: {
1183
+ runId: { type: "string" },
1184
+ resourceId: { type: "string" },
1103
1185
  inputData: { type: "object", additionalProperties: true },
1104
- runtimeContext: { type: "object", additionalProperties: true },
1105
- tracingOptions: { type: "object", additionalProperties: true }
1186
+ resumeData: { type: "object", additionalProperties: true },
1187
+ requestContext: { type: "object", additionalProperties: true },
1188
+ tracingOptions: { type: "object", additionalProperties: true },
1189
+ step: { type: "string" }
1106
1190
  }
1107
1191
  }
1108
1192
  }
@@ -1120,7 +1204,7 @@ function workflowRoute({
1120
1204
  }
1121
1205
  },
1122
1206
  handler: async (c) => {
1123
- const { inputData, ...rest } = await c.req.json();
1207
+ const { runId, resourceId, inputData, resumeData, ...rest } = await c.req.json();
1124
1208
  const mastra = c.get("mastra");
1125
1209
  let workflowToUse = workflow;
1126
1210
  if (!workflow) {
@@ -1139,11 +1223,11 @@ function workflowRoute({
1139
1223
  if (!workflowObj) {
1140
1224
  throw new Error(`Workflow ${workflowToUse} not found`);
1141
1225
  }
1142
- const run = await workflowObj.createRunAsync();
1143
- const stream = run.streamVNext({ inputData, ...rest });
1226
+ const run = await workflowObj.createRun({ runId, resourceId, ...rest });
1227
+ const stream = resumeData ? run.resumeStream({ resumeData, ...rest }) : run.stream({ inputData, ...rest });
1144
1228
  const uiMessageStream = ai.createUIMessageStream({
1145
1229
  execute: async ({ writer }) => {
1146
- for await (const part of toAISdkFormat(stream, { from: "workflow" })) {
1230
+ for await (const part of toAISdkV5Stream(stream, { from: "workflow" })) {
1147
1231
  writer.write(part);
1148
1232
  }
1149
1233
  }
@@ -1183,7 +1267,7 @@ function networkRoute({
1183
1267
  type: "object",
1184
1268
  properties: {
1185
1269
  messages: { type: "array", items: { type: "object" } },
1186
- runtimeContext: { type: "object", additionalProperties: true },
1270
+ requestContext: { type: "object", additionalProperties: true },
1187
1271
  runId: { type: "string" },
1188
1272
  maxSteps: { type: "number" },
1189
1273
  threadId: { type: "string" },
@@ -1237,7 +1321,7 @@ function networkRoute({
1237
1321
  });
1238
1322
  const uiMessageStream = ai.createUIMessageStream({
1239
1323
  execute: async ({ writer }) => {
1240
- for await (const part of toAISdkFormat(result, { from: "network" })) {
1324
+ for await (const part of toAISdkV5Stream(result, { from: "network" })) {
1241
1325
  writer.write(part);
1242
1326
  }
1243
1327
  }
@@ -1247,9 +1331,17 @@ function networkRoute({
1247
1331
  });
1248
1332
  }
1249
1333
 
1334
+ // src/to-ai-sdk-format.ts
1335
+ function toAISdkFormat() {
1336
+ throw new Error(
1337
+ '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.'
1338
+ );
1339
+ }
1340
+
1250
1341
  exports.chatRoute = chatRoute;
1251
1342
  exports.networkRoute = networkRoute;
1252
1343
  exports.toAISdkFormat = toAISdkFormat;
1344
+ exports.toAISdkStream = toAISdkV5Stream;
1253
1345
  exports.workflowRoute = workflowRoute;
1254
1346
  //# sourceMappingURL=index.cjs.map
1255
1347
  //# sourceMappingURL=index.cjs.map