@mastra/ai-sdk 0.2.5 → 0.2.6-alpha.0

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,12 @@ 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
+ var isAgentExecutionDataChunkType = (chunk) => {
12
+ 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-");
13
+ };
14
+ var isWorkflowExecutionDataChunkType = (chunk) => {
15
+ 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-");
16
+ };
11
17
 
12
18
  // src/helpers.ts
13
19
  function convertMastraChunkToAISDKv5({
@@ -441,7 +447,7 @@ function AgentNetworkToAISDKTransformer() {
441
447
  }
442
448
  });
443
449
  }
444
- function AgentStreamToAISDKTransformer() {
450
+ function AgentStreamToAISDKTransformer(lastMessageId) {
445
451
  let bufferedSteps = /* @__PURE__ */ new Map();
446
452
  return new TransformStream({
447
453
  transform(chunk, controller) {
@@ -452,7 +458,7 @@ function AgentStreamToAISDKTransformer() {
452
458
  sendSources: false,
453
459
  sendStart: true,
454
460
  sendFinish: true,
455
- responseMessageId: chunk.runId,
461
+ responseMessageId: lastMessageId,
456
462
  onError() {
457
463
  return "Error";
458
464
  }
@@ -636,7 +642,9 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
636
642
  name: payload.payload.id,
637
643
  status: payload.payload.status,
638
644
  input: payload.payload.payload ?? null,
639
- output: null
645
+ output: null,
646
+ suspendPayload: null,
647
+ resumePayload: null
640
648
  };
641
649
  bufferedWorkflows.set(payload.runId, current);
642
650
  return {
@@ -669,6 +677,27 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
669
677
  }
670
678
  };
671
679
  }
680
+ case "workflow-step-suspended": {
681
+ const current = bufferedWorkflows.get(payload.runId);
682
+ if (!current) return null;
683
+ current.steps[payload.payload.id] = {
684
+ ...current.steps[payload.payload.id],
685
+ status: payload.payload.status,
686
+ suspendPayload: payload.payload.suspendPayload ?? null,
687
+ resumePayload: payload.payload.resumePayload ?? null,
688
+ output: null
689
+ };
690
+ return {
691
+ type: isNested ? "data-tool-workflow" : "data-workflow",
692
+ id: payload.runId,
693
+ data: {
694
+ name: current.name,
695
+ status: "suspended",
696
+ steps: current.steps,
697
+ output: null
698
+ }
699
+ };
700
+ }
672
701
  case "workflow-finish": {
673
702
  const current = bufferedWorkflows.get(payload.runId);
674
703
  if (!current) return null;
@@ -743,7 +772,9 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
743
772
  name: payload.payload.agentId,
744
773
  status: "running",
745
774
  input: payload.payload.args || null,
746
- output: null
775
+ output: null,
776
+ suspendPayload: null,
777
+ resumePayload: null
747
778
  });
748
779
  bufferedNetworks.set(payload.runId, current);
749
780
  return {
@@ -761,7 +792,9 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
761
792
  name: payload.payload.name,
762
793
  status: "running",
763
794
  input: payload.payload.args || null,
764
- output: null
795
+ output: null,
796
+ suspendPayload: null,
797
+ resumePayload: null
765
798
  });
766
799
  bufferedNetworks.set(payload.runId, current);
767
800
  return {
@@ -779,7 +812,9 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
779
812
  name: payload.payload.args?.toolName,
780
813
  status: "running",
781
814
  input: payload.payload.args?.args || null,
782
- output: null
815
+ output: null,
816
+ suspendPayload: null,
817
+ resumePayload: null
783
818
  });
784
819
  bufferedNetworks.set(payload.runId, current);
785
820
  return {
@@ -798,7 +833,9 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
798
833
  name: payload.payload.agentId,
799
834
  status: "success",
800
835
  input: null,
801
- output: payload.payload.result
836
+ output: payload.payload.result,
837
+ suspendPayload: null,
838
+ resumePayload: null
802
839
  });
803
840
  return {
804
841
  type: isNested ? "data-tool-network" : "data-network",
@@ -818,7 +855,9 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
818
855
  name: payload.payload.toolName,
819
856
  status: "success",
820
857
  input: null,
821
- output: payload.payload.result
858
+ output: payload.payload.result,
859
+ suspendPayload: null,
860
+ resumePayload: null
822
861
  });
823
862
  return {
824
863
  type: isNested ? "data-tool-network" : "data-network",
@@ -837,7 +876,9 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
837
876
  name: payload.payload.name,
838
877
  status: "success",
839
878
  input: null,
840
- output: payload.payload.result
879
+ output: payload.payload.result,
880
+ suspendPayload: null,
881
+ resumePayload: null
841
882
  });
842
883
  return {
843
884
  type: isNested ? "data-tool-network" : "data-network",
@@ -901,6 +942,24 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
901
942
  }
902
943
  return payload;
903
944
  }
945
+ if (isAgentExecutionDataChunkType(payload)) {
946
+ if (!("data" in payload.payload)) {
947
+ throw new Error(
948
+ `UI Messages require a data property when using data- prefixed chunks
949
+ ${JSON.stringify(payload)}`
950
+ );
951
+ }
952
+ return payload.payload;
953
+ }
954
+ if (isWorkflowExecutionDataChunkType(payload)) {
955
+ if (!("data" in payload.payload)) {
956
+ throw new Error(
957
+ `UI Messages require a data property when using data- prefixed chunks
958
+ ${JSON.stringify(payload)}`
959
+ );
960
+ }
961
+ return payload.payload;
962
+ }
904
963
  return null;
905
964
  }
906
965
  }
@@ -916,7 +975,7 @@ function toAISdkFormat(stream, options = { from: "agent" }) {
916
975
  return stream.pipeThrough(AgentNetworkToAISDKTransformer());
917
976
  }
918
977
  const agentReadable = "fullStream" in stream ? stream.fullStream : stream;
919
- return agentReadable.pipeThrough(AgentStreamToAISDKTransformer());
978
+ return agentReadable.pipeThrough(AgentStreamToAISDKTransformer(options?.lastMessageId));
920
979
  }
921
980
 
922
981
  // src/chat-route.ts
@@ -1050,10 +1109,14 @@ function chatRoute({
1050
1109
  ...rest,
1051
1110
  runtimeContext: runtimeContext || defaultOptions?.runtimeContext
1052
1111
  });
1112
+ let lastMessageId;
1113
+ if (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
1114
+ lastMessageId = messages[messages.length - 1].id;
1115
+ }
1053
1116
  const uiMessageStream = createUIMessageStream({
1054
1117
  originalMessages: messages,
1055
1118
  execute: async ({ writer }) => {
1056
- for await (const part of toAISdkFormat(result, { from: "agent" })) {
1119
+ for await (const part of toAISdkFormat(result, { from: "agent", lastMessageId })) {
1057
1120
  writer.write(part);
1058
1121
  }
1059
1122
  }
@@ -1113,7 +1176,7 @@ function workflowRoute({
1113
1176
  }
1114
1177
  },
1115
1178
  handler: async (c) => {
1116
- const { inputData, ...rest } = await c.req.json();
1179
+ const { inputData, resumeData, ...rest } = await c.req.json();
1117
1180
  const mastra = c.get("mastra");
1118
1181
  let workflowToUse = workflow;
1119
1182
  if (!workflow) {
@@ -1133,7 +1196,7 @@ function workflowRoute({
1133
1196
  throw new Error(`Workflow ${workflowToUse} not found`);
1134
1197
  }
1135
1198
  const run = await workflowObj.createRunAsync();
1136
- const stream = run.streamVNext({ inputData, ...rest });
1199
+ const stream = resumeData ? run.resumeStream({ resumeData, ...rest }) : run.stream({ inputData, ...rest });
1137
1200
  const uiMessageStream = createUIMessageStream({
1138
1201
  execute: async ({ writer }) => {
1139
1202
  for await (const part of toAISdkFormat(stream, { from: "workflow" })) {