@mastra/ai-sdk 0.0.0-monorepo-binary-20251013210052 → 0.0.0-netlify-no-bundle-20251127120354

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
@@ -5,6 +5,58 @@ var ai = require('ai');
5
5
  var stream = require('@mastra/core/stream');
6
6
 
7
7
  // src/chat-route.ts
8
+
9
+ // src/utils.ts
10
+ var isDataChunkType = (chunk) => {
11
+ return chunk && typeof chunk === "object" && "type" in chunk && chunk.type?.startsWith("data-");
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
+ }
52
+ var isAgentExecutionDataChunkType = (chunk) => {
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-");
54
+ };
55
+ var isWorkflowExecutionDataChunkType = (chunk) => {
56
+ 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-");
57
+ };
58
+
59
+ // src/helpers.ts
8
60
  function convertMastraChunkToAISDKv5({
9
61
  chunk,
10
62
  mode = "stream"
@@ -113,6 +165,28 @@ function convertMastraChunkToAISDKv5({
113
165
  toolName: chunk.payload.toolName,
114
166
  input: chunk.payload.args
115
167
  };
168
+ case "tool-call-approval":
169
+ return {
170
+ type: "data-tool-call-approval",
171
+ id: chunk.payload.toolCallId,
172
+ data: {
173
+ runId: chunk.runId,
174
+ toolCallId: chunk.payload.toolCallId,
175
+ toolName: chunk.payload.toolName,
176
+ args: chunk.payload.args
177
+ }
178
+ };
179
+ case "tool-call-suspended":
180
+ return {
181
+ type: "data-tool-call-suspended",
182
+ id: chunk.payload.toolCallId,
183
+ data: {
184
+ runId: chunk.runId,
185
+ toolCallId: chunk.payload.toolCallId,
186
+ toolName: chunk.payload.toolName,
187
+ suspendPayload: chunk.payload.suspendPayload
188
+ }
189
+ };
116
190
  case "tool-call-input-streaming-start":
117
191
  return {
118
192
  type: "tool-input-start",
@@ -203,6 +277,13 @@ function convertMastraChunkToAISDKv5({
203
277
  type: "object",
204
278
  object: chunk.object
205
279
  };
280
+ case "tripwire":
281
+ return {
282
+ type: "data-tripwire",
283
+ data: {
284
+ tripwireReason: chunk.payload.tripwireReason
285
+ }
286
+ };
206
287
  default:
207
288
  if (chunk.type && "payload" in chunk && chunk.payload) {
208
289
  return {
@@ -210,6 +291,9 @@ function convertMastraChunkToAISDKv5({
210
291
  ...chunk.payload || {}
211
292
  };
212
293
  }
294
+ if ("type" in chunk && chunk.type?.startsWith("data-")) {
295
+ return chunk;
296
+ }
213
297
  return;
214
298
  }
215
299
  }
@@ -223,7 +307,7 @@ function convertFullStreamChunkToUIMessageStream({
223
307
  sendFinish,
224
308
  responseMessageId
225
309
  }) {
226
- const partType = part.type;
310
+ const partType = part?.type;
227
311
  switch (partType) {
228
312
  case "text-start": {
229
313
  return {
@@ -255,6 +339,14 @@ function convertFullStreamChunkToUIMessageStream({
255
339
  };
256
340
  }
257
341
  case "reasoning-delta": {
342
+ if (sendReasoning) {
343
+ return {
344
+ type: "reasoning-delta",
345
+ id: part.id,
346
+ delta: part.text,
347
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
348
+ };
349
+ }
258
350
  return;
259
351
  }
260
352
  case "reasoning-end": {
@@ -272,6 +364,25 @@ function convertFullStreamChunkToUIMessageStream({
272
364
  };
273
365
  }
274
366
  case "source": {
367
+ if (sendSources && part.sourceType === "url") {
368
+ return {
369
+ type: "source-url",
370
+ sourceId: part.id,
371
+ url: part.url,
372
+ title: part.title,
373
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
374
+ };
375
+ }
376
+ if (sendSources && part.sourceType === "document") {
377
+ return {
378
+ type: "source-document",
379
+ sourceId: part.id,
380
+ mediaType: part.mediaType,
381
+ title: part.title,
382
+ filename: part.filename,
383
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
384
+ };
385
+ }
275
386
  return;
276
387
  }
277
388
  case "tool-input-start": {
@@ -329,6 +440,14 @@ function convertFullStreamChunkToUIMessageStream({
329
440
  toolCallId: part.toolCallId,
330
441
  payload: part.output
331
442
  };
443
+ } else if (isDataChunkType(part.output)) {
444
+ if (!("data" in part.output)) {
445
+ throw new Error(
446
+ `UI Messages require a data property when using data- prefixed chunks
447
+ ${JSON.stringify(part)}`
448
+ );
449
+ }
450
+ return part.output;
332
451
  }
333
452
  return;
334
453
  }
@@ -354,21 +473,23 @@ function convertFullStreamChunkToUIMessageStream({
354
473
  return { type: "finish-step" };
355
474
  }
356
475
  case "start": {
357
- {
476
+ if (sendStart) {
358
477
  return {
359
478
  type: "start",
360
479
  ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {},
361
480
  ...responseMessageId != null ? { messageId: responseMessageId } : {}
362
481
  };
363
482
  }
483
+ return;
364
484
  }
365
485
  case "finish": {
366
- {
486
+ if (sendFinish) {
367
487
  return {
368
488
  type: "finish",
369
489
  ...messageMetadataValue != null ? { messageMetadata: messageMetadataValue } : {}
370
490
  };
371
491
  }
492
+ return;
372
493
  }
373
494
  case "abort": {
374
495
  return part;
@@ -380,14 +501,25 @@ function convertFullStreamChunkToUIMessageStream({
380
501
  return;
381
502
  }
382
503
  default: {
383
- const exhaustiveCheck = partType;
384
- throw new Error(`Unknown chunk type: ${exhaustiveCheck}`);
504
+ if (isDataChunkType(part)) {
505
+ if (!("data" in part)) {
506
+ throw new Error(
507
+ `UI Messages require a data property when using data- prefixed chunks
508
+ ${JSON.stringify(part)}`
509
+ );
510
+ }
511
+ return part;
512
+ }
513
+ return;
385
514
  }
386
515
  }
387
516
  }
388
517
 
389
518
  // src/transformers.ts
390
- function WorkflowStreamToAISDKTransformer() {
519
+ var PRIMITIVE_CACHE_SYMBOL = Symbol("primitive-cache");
520
+ function WorkflowStreamToAISDKTransformer({
521
+ includeTextStreamParts
522
+ } = {}) {
391
523
  const bufferedWorkflows = /* @__PURE__ */ new Map();
392
524
  return new TransformStream({
393
525
  start(controller) {
@@ -401,7 +533,7 @@ function WorkflowStreamToAISDKTransformer() {
401
533
  });
402
534
  },
403
535
  transform(chunk, controller) {
404
- const transformed = transformWorkflow(chunk, bufferedWorkflows);
536
+ const transformed = transformWorkflow(chunk, bufferedWorkflows, false, includeTextStreamParts);
405
537
  if (transformed) controller.enqueue(transformed);
406
538
  }
407
539
  });
@@ -425,20 +557,37 @@ function AgentNetworkToAISDKTransformer() {
425
557
  }
426
558
  });
427
559
  }
428
- function AgentStreamToAISDKTransformer() {
560
+ function AgentStreamToAISDKTransformer({
561
+ lastMessageId,
562
+ sendStart,
563
+ sendFinish,
564
+ sendReasoning,
565
+ sendSources,
566
+ messageMetadata,
567
+ onError
568
+ }) {
429
569
  let bufferedSteps = /* @__PURE__ */ new Map();
570
+ let tripwireOccurred = false;
571
+ let finishEventSent = false;
430
572
  return new TransformStream({
431
573
  transform(chunk, controller) {
574
+ if (chunk.type === "tripwire") {
575
+ tripwireOccurred = true;
576
+ }
577
+ if (chunk.type === "finish") {
578
+ finishEventSent = true;
579
+ }
432
580
  const part = convertMastraChunkToAISDKv5({ chunk, mode: "stream" });
433
581
  const transformedChunk = convertFullStreamChunkToUIMessageStream({
434
582
  part,
435
- sendReasoning: false,
436
- sendSources: false,
437
- sendStart: true,
438
- sendFinish: true,
439
- responseMessageId: chunk.runId,
440
- onError() {
441
- return "Error";
583
+ sendReasoning,
584
+ sendSources,
585
+ messageMetadataValue: messageMetadata?.({ part }),
586
+ sendStart,
587
+ sendFinish,
588
+ responseMessageId: lastMessageId,
589
+ onError(error) {
590
+ return onError ? onError(error) : safeParseErrorObject(error);
442
591
  }
443
592
  });
444
593
  if (transformedChunk) {
@@ -458,6 +607,14 @@ function AgentStreamToAISDKTransformer() {
458
607
  controller.enqueue(transformedChunk);
459
608
  }
460
609
  }
610
+ },
611
+ flush(controller) {
612
+ if (tripwireOccurred && !finishEventSent && sendFinish) {
613
+ controller.enqueue({
614
+ type: "finish",
615
+ finishReason: "other"
616
+ });
617
+ }
461
618
  }
462
619
  });
463
620
  }
@@ -597,7 +754,7 @@ function transformAgent(payload, bufferedSteps) {
597
754
  }
598
755
  return null;
599
756
  }
600
- function transformWorkflow(payload, bufferedWorkflows, isNested) {
757
+ function transformWorkflow(payload, bufferedWorkflows, isNested, includeTextStreamParts) {
601
758
  switch (payload.type) {
602
759
  case "workflow-start":
603
760
  bufferedWorkflows.set(payload.runId, {
@@ -620,7 +777,9 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
620
777
  name: payload.payload.id,
621
778
  status: payload.payload.status,
622
779
  input: payload.payload.payload ?? null,
623
- output: null
780
+ output: null,
781
+ suspendPayload: null,
782
+ resumePayload: null
624
783
  };
625
784
  bufferedWorkflows.set(payload.runId, current);
626
785
  return {
@@ -653,6 +812,27 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
653
812
  }
654
813
  };
655
814
  }
815
+ case "workflow-step-suspended": {
816
+ const current = bufferedWorkflows.get(payload.runId);
817
+ if (!current) return null;
818
+ current.steps[payload.payload.id] = {
819
+ ...current.steps[payload.payload.id],
820
+ status: payload.payload.status,
821
+ suspendPayload: payload.payload.suspendPayload ?? null,
822
+ resumePayload: payload.payload.resumePayload ?? null,
823
+ output: null
824
+ };
825
+ return {
826
+ type: isNested ? "data-tool-workflow" : "data-workflow",
827
+ id: payload.runId,
828
+ data: {
829
+ name: current.name,
830
+ status: "suspended",
831
+ steps: current.steps,
832
+ output: null
833
+ }
834
+ };
835
+ }
656
836
  case "workflow-finish": {
657
837
  const current = bufferedWorkflows.get(payload.runId);
658
838
  if (!current) return null;
@@ -667,175 +847,275 @@ function transformWorkflow(payload, bufferedWorkflows, isNested) {
667
847
  }
668
848
  };
669
849
  }
670
- default:
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
+ }
671
871
  return null;
872
+ }
873
+ default: {
874
+ if (isDataChunkType(payload)) {
875
+ if (!("data" in payload)) {
876
+ throw new Error(
877
+ `UI Messages require a data property when using data- prefixed chunks
878
+ ${JSON.stringify(payload)}`
879
+ );
880
+ }
881
+ return payload;
882
+ }
883
+ return null;
884
+ }
672
885
  }
673
886
  }
674
887
  function transformNetwork(payload, bufferedNetworks, isNested) {
675
888
  switch (payload.type) {
676
889
  case "routing-agent-start": {
677
- if (!bufferedNetworks.has(payload.payload.runId)) {
678
- bufferedNetworks.set(payload.payload.runId, {
679
- name: payload.payload.agentId,
680
- steps: []
890
+ if (!bufferedNetworks.has(payload.runId)) {
891
+ bufferedNetworks.set(payload.runId, {
892
+ name: payload.payload.networkId,
893
+ steps: [],
894
+ usage: null,
895
+ output: null
681
896
  });
682
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
+ });
683
915
  return {
684
916
  type: isNested ? "data-tool-network" : "data-network",
685
- id: payload.payload.runId,
917
+ id: payload.runId,
686
918
  data: {
687
- name: bufferedNetworks.get(payload.payload.runId).name,
919
+ name: bufferedNetworks.get(payload.runId).name,
688
920
  status: "running",
689
- steps: bufferedNetworks.get(payload.payload.runId).steps,
921
+ usage: null,
922
+ steps: bufferedNetworks.get(payload.runId).steps,
690
923
  output: null
691
924
  }
692
925
  };
693
926
  }
927
+ case "routing-agent-text-start": {
928
+ const current = bufferedNetworks.get(payload.runId);
929
+ if (!current) return null;
930
+ return {
931
+ type: "text-start",
932
+ id: payload.runId
933
+ };
934
+ }
935
+ case "routing-agent-text-delta": {
936
+ const current = bufferedNetworks.get(payload.runId);
937
+ if (!current) return null;
938
+ return {
939
+ type: "text-delta",
940
+ id: payload.runId,
941
+ delta: payload.payload.text
942
+ };
943
+ }
694
944
  case "agent-execution-start": {
695
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
945
+ const current = bufferedNetworks.get(payload.runId);
946
+ if (!current) return null;
696
947
  current.steps.push({
948
+ id: payload.payload.runId,
697
949
  name: payload.payload.agentId,
698
950
  status: "running",
699
- input: payload.payload.args || null,
700
- output: null
951
+ iteration: payload.payload.args?.iteration ?? 0,
952
+ input: { prompt: payload.payload.args?.prompt ?? "" },
953
+ output: null,
954
+ task: null,
955
+ suspendPayload: null,
956
+ resumePayload: null,
957
+ [PRIMITIVE_CACHE_SYMBOL]: /* @__PURE__ */ new Map()
701
958
  });
702
- bufferedNetworks.set(payload.payload.runId, current);
959
+ bufferedNetworks.set(payload.runId, current);
703
960
  return {
704
961
  type: isNested ? "data-tool-network" : "data-network",
705
- id: payload.payload.runId,
962
+ id: payload.runId,
706
963
  data: {
707
- name: current.name,
708
- status: "running",
709
- steps: current.steps,
710
- output: null
964
+ ...current,
965
+ status: "running"
711
966
  }
712
967
  };
713
968
  }
714
969
  case "workflow-execution-start": {
715
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
970
+ const current = bufferedNetworks.get(payload.runId);
971
+ if (!current) return null;
716
972
  current.steps.push({
717
- name: payload.payload.name,
973
+ id: payload.payload.runId,
974
+ name: payload.payload.workflowId,
718
975
  status: "running",
719
- input: payload.payload.args || null,
720
- output: null
976
+ iteration: payload.payload.args?.iteration ?? 0,
977
+ input: { prompt: payload.payload.args?.prompt ?? "" },
978
+ output: null,
979
+ task: null,
980
+ suspendPayload: null,
981
+ resumePayload: null,
982
+ [PRIMITIVE_CACHE_SYMBOL]: /* @__PURE__ */ new Map()
721
983
  });
722
- bufferedNetworks.set(payload.payload.runId, current);
984
+ bufferedNetworks.set(payload.runId, current);
723
985
  return {
724
986
  type: isNested ? "data-tool-network" : "data-network",
725
- id: payload.payload.runId,
987
+ id: payload.runId,
726
988
  data: {
727
- name: current.name,
728
- status: "running",
729
- steps: current.steps,
730
- output: null
989
+ ...current,
990
+ status: "running"
731
991
  }
732
992
  };
733
993
  }
734
994
  case "tool-execution-start": {
735
- const current = bufferedNetworks.get(payload.payload.runId) || { name: "", steps: [] };
995
+ const current = bufferedNetworks.get(payload.runId);
996
+ if (!current) return null;
736
997
  current.steps.push({
998
+ id: payload.payload.args.toolCallId,
737
999
  name: payload.payload.args?.toolName,
738
1000
  status: "running",
1001
+ iteration: payload.payload.args?.iteration ? Number(payload.payload.args.iteration) : 0,
1002
+ task: {
1003
+ id: payload.payload.args?.toolName
1004
+ },
739
1005
  input: payload.payload.args?.args || null,
740
- output: null
1006
+ output: null,
1007
+ suspendPayload: null,
1008
+ resumePayload: null,
1009
+ [PRIMITIVE_CACHE_SYMBOL]: /* @__PURE__ */ new Map()
741
1010
  });
742
- bufferedNetworks.set(payload.payload.runId, current);
1011
+ bufferedNetworks.set(payload.runId, current);
743
1012
  return {
744
1013
  type: isNested ? "data-tool-network" : "data-network",
745
- id: payload.payload.runId,
1014
+ id: payload.runId,
746
1015
  data: {
747
- name: current.name,
748
- status: "running",
749
- steps: current.steps,
750
- output: null
1016
+ ...current,
1017
+ status: "running"
751
1018
  }
752
1019
  };
753
1020
  }
754
1021
  case "agent-execution-end": {
755
1022
  const current = bufferedNetworks.get(payload.runId);
756
1023
  if (!current) return null;
757
- current.steps.push({
758
- name: payload.payload.agentId,
759
- status: "success",
760
- input: null,
761
- output: payload.payload.result
762
- });
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;
763
1031
  return {
764
1032
  type: isNested ? "data-tool-network" : "data-network",
765
1033
  id: payload.runId,
766
1034
  data: {
767
- name: current.name,
1035
+ ...current,
1036
+ usage: payload.payload?.usage ?? current.usage,
768
1037
  status: "running",
769
- steps: current.steps,
770
- output: payload.payload.result ?? null
1038
+ output: payload.payload.result ?? current.output
771
1039
  }
772
1040
  };
773
1041
  }
774
1042
  case "tool-execution-end": {
775
1043
  const current = bufferedNetworks.get(payload.runId);
776
1044
  if (!current) return null;
777
- current.steps.push({
778
- name: payload.payload.toolName,
779
- status: "success",
780
- input: null,
781
- output: payload.payload.result
782
- });
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;
783
1052
  return {
784
1053
  type: isNested ? "data-tool-network" : "data-network",
785
1054
  id: payload.runId,
786
1055
  data: {
787
- name: current.name,
1056
+ ...current,
788
1057
  status: "running",
789
- steps: current.steps,
790
- output: payload.payload.result ?? null
1058
+ output: payload.payload.result ?? current.output
791
1059
  }
792
1060
  };
793
1061
  }
794
1062
  case "workflow-execution-end": {
795
1063
  const current = bufferedNetworks.get(payload.runId);
796
1064
  if (!current) return null;
797
- current.steps.push({
798
- name: payload.payload.name,
799
- status: "success",
800
- input: null,
801
- output: payload.payload.result
802
- });
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;
803
1072
  return {
804
1073
  type: isNested ? "data-tool-network" : "data-network",
805
1074
  id: payload.runId,
806
1075
  data: {
807
- name: current.name,
1076
+ ...current,
1077
+ usage: payload.payload?.usage ?? current.usage,
808
1078
  status: "running",
809
- steps: current.steps,
810
- output: payload.payload.result ?? null
1079
+ output: payload.payload.result ?? current.output
811
1080
  }
812
1081
  };
813
1082
  }
814
1083
  case "routing-agent-end": {
815
- const current = bufferedNetworks.get(payload.payload.runId);
1084
+ const current = bufferedNetworks.get(payload.runId);
816
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;
817
1099
  return {
818
1100
  type: isNested ? "data-tool-network" : "data-network",
819
- id: payload.payload.runId,
1101
+ id: payload.runId,
820
1102
  data: {
821
- name: current.name,
822
- status: "finished",
823
- steps: current.steps,
824
- output: payload.payload?.result ?? null
1103
+ ...current,
1104
+ usage: payload.payload?.usage ?? current.usage,
1105
+ output: payload.payload?.result ?? current.output
825
1106
  }
826
1107
  };
827
1108
  }
828
1109
  case "network-execution-event-step-finish": {
829
- const current = bufferedNetworks.get(payload.payload.runId);
1110
+ const current = bufferedNetworks.get(payload.runId);
830
1111
  if (!current) return null;
831
1112
  return {
832
1113
  type: isNested ? "data-tool-network" : "data-network",
833
- id: payload.payload.runId,
1114
+ id: payload.runId,
834
1115
  data: {
835
- name: current.name,
1116
+ ...current,
836
1117
  status: "finished",
837
- steps: current.steps,
838
- output: payload.payload?.result ?? null
1118
+ output: payload.payload?.result ?? current.output
839
1119
  }
840
1120
  };
841
1121
  }
@@ -846,36 +1126,121 @@ function transformNetwork(payload, bufferedNetworks, isNested) {
846
1126
  type: isNested ? "data-tool-network" : "data-network",
847
1127
  id: payload.runId,
848
1128
  data: {
849
- name: current.name,
1129
+ ...current,
1130
+ usage: payload.payload?.usage ?? current.usage,
850
1131
  status: "finished",
851
- steps: current.steps,
852
- output: payload.payload?.result ?? null
1132
+ output: payload.payload?.result ?? current.output
853
1133
  }
854
1134
  };
855
1135
  }
856
- default:
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
+ }
1170
+ if (isDataChunkType(payload)) {
1171
+ if (!("data" in payload)) {
1172
+ throw new Error(
1173
+ `UI Messages require a data property when using data- prefixed chunks
1174
+ ${JSON.stringify(payload)}`
1175
+ );
1176
+ }
1177
+ const { type, data } = payload;
1178
+ return { type, data };
1179
+ }
1180
+ if (isAgentExecutionDataChunkType(payload)) {
1181
+ if (!("data" in payload.payload)) {
1182
+ throw new Error(
1183
+ `UI Messages require a data property when using data- prefixed chunks
1184
+ ${JSON.stringify(payload)}`
1185
+ );
1186
+ }
1187
+ const { type, data } = payload.payload;
1188
+ return { type, data };
1189
+ }
1190
+ if (isWorkflowExecutionDataChunkType(payload)) {
1191
+ if (!("data" in payload.payload)) {
1192
+ throw new Error(
1193
+ `UI Messages require a data property when using data- prefixed chunks
1194
+ ${JSON.stringify(payload)}`
1195
+ );
1196
+ }
1197
+ const { type, data } = payload.payload;
1198
+ return { type, data };
1199
+ }
857
1200
  return null;
1201
+ }
858
1202
  }
859
1203
  }
860
1204
 
861
- // src/to-ai-sdk-format.ts
862
- function toAISdkFormat(stream, options = { from: "agent" }) {
1205
+ // src/convert-streams.ts
1206
+ function toAISdkV5Stream(stream, options = {
1207
+ from: "agent",
1208
+ sendStart: true,
1209
+ sendFinish: true
1210
+ }) {
863
1211
  const from = options?.from;
864
1212
  if (from === "workflow") {
865
- return stream.pipeThrough(WorkflowStreamToAISDKTransformer());
1213
+ const includeTextStreamParts = options?.includeTextStreamParts ?? true;
1214
+ return stream.pipeThrough(
1215
+ WorkflowStreamToAISDKTransformer({ includeTextStreamParts })
1216
+ );
866
1217
  }
867
1218
  if (from === "network") {
868
1219
  return stream.pipeThrough(AgentNetworkToAISDKTransformer());
869
1220
  }
870
1221
  const agentReadable = "fullStream" in stream ? stream.fullStream : stream;
871
- return agentReadable.pipeThrough(AgentStreamToAISDKTransformer());
1222
+ return agentReadable.pipeThrough(
1223
+ AgentStreamToAISDKTransformer({
1224
+ lastMessageId: options?.lastMessageId,
1225
+ sendStart: options?.sendStart,
1226
+ sendFinish: options?.sendFinish,
1227
+ sendReasoning: options?.sendReasoning,
1228
+ sendSources: options?.sendSources,
1229
+ messageMetadata: options?.messageMetadata,
1230
+ onError: options?.onError
1231
+ })
1232
+ );
872
1233
  }
873
1234
 
874
1235
  // src/chat-route.ts
875
1236
  function chatRoute({
876
1237
  path = "/chat/:agentId",
877
1238
  agent,
878
- defaultOptions
1239
+ defaultOptions,
1240
+ sendStart = true,
1241
+ sendFinish = true,
1242
+ sendReasoning = false,
1243
+ sendSources = false
879
1244
  }) {
880
1245
  if (!agent && !path.includes("/:agentId")) {
881
1246
  throw new Error("Path must include :agentId to route to the correct agent or pass the agent explicitly");
@@ -976,7 +1341,7 @@ function chatRoute({
976
1341
  handler: async (c) => {
977
1342
  const { messages, ...rest } = await c.req.json();
978
1343
  const mastra = c.get("mastra");
979
- const runtimeContext = c.get("runtimeContext");
1344
+ const requestContext = c.get("requestContext");
980
1345
  let agentToUse = agent;
981
1346
  if (!agent) {
982
1347
  const agentId = c.req.param("agentId");
@@ -987,24 +1352,36 @@ function chatRoute({
987
1352
  `Fixed agent ID was set together with an agentId path parameter. This can lead to unexpected behavior.`
988
1353
  );
989
1354
  }
990
- if (runtimeContext && defaultOptions?.runtimeContext) {
991
- mastra.getLogger()?.warn(`"runtimeContext" set in the route options will be overridden by the request's "runtimeContext".`);
1355
+ if (requestContext && defaultOptions?.requestContext) {
1356
+ mastra.getLogger()?.warn(`"requestContext" set in the route options will be overridden by the request's "requestContext".`);
992
1357
  }
993
1358
  if (!agentToUse) {
994
1359
  throw new Error("Agent ID is required");
995
1360
  }
996
- const agentObj = mastra.getAgent(agentToUse);
1361
+ const agentObj = mastra.getAgentById(agentToUse);
997
1362
  if (!agentObj) {
998
1363
  throw new Error(`Agent ${agentToUse} not found`);
999
1364
  }
1000
1365
  const result = await agentObj.stream(messages, {
1001
1366
  ...defaultOptions,
1002
1367
  ...rest,
1003
- runtimeContext: runtimeContext || defaultOptions?.runtimeContext
1368
+ requestContext: requestContext || defaultOptions?.requestContext
1004
1369
  });
1370
+ let lastMessageId;
1371
+ if (messages.length > 0 && messages[messages.length - 1].role === "assistant") {
1372
+ lastMessageId = messages[messages.length - 1].id;
1373
+ }
1005
1374
  const uiMessageStream = ai.createUIMessageStream({
1375
+ originalMessages: messages,
1006
1376
  execute: async ({ writer }) => {
1007
- for await (const part of toAISdkFormat(result, { from: "agent" })) {
1377
+ for await (const part of toAISdkV5Stream(result, {
1378
+ from: "agent",
1379
+ lastMessageId,
1380
+ sendStart,
1381
+ sendFinish,
1382
+ sendReasoning,
1383
+ sendSources
1384
+ })) {
1008
1385
  writer.write(part);
1009
1386
  }
1010
1387
  }
@@ -1017,7 +1394,8 @@ function chatRoute({
1017
1394
  }
1018
1395
  function workflowRoute({
1019
1396
  path = "/api/workflows/:workflowId/stream",
1020
- workflow
1397
+ workflow,
1398
+ includeTextStreamParts = true
1021
1399
  }) {
1022
1400
  if (!workflow && !path.includes("/:workflowId")) {
1023
1401
  throw new Error("Path must include :workflowId to route to the correct workflow or pass the workflow explicitly");
@@ -1044,9 +1422,13 @@ function workflowRoute({
1044
1422
  schema: {
1045
1423
  type: "object",
1046
1424
  properties: {
1425
+ runId: { type: "string" },
1426
+ resourceId: { type: "string" },
1047
1427
  inputData: { type: "object", additionalProperties: true },
1048
- runtimeContext: { type: "object", additionalProperties: true },
1049
- tracingOptions: { type: "object", additionalProperties: true }
1428
+ resumeData: { type: "object", additionalProperties: true },
1429
+ requestContext: { type: "object", additionalProperties: true },
1430
+ tracingOptions: { type: "object", additionalProperties: true },
1431
+ step: { type: "string" }
1050
1432
  }
1051
1433
  }
1052
1434
  }
@@ -1064,8 +1446,9 @@ function workflowRoute({
1064
1446
  }
1065
1447
  },
1066
1448
  handler: async (c) => {
1067
- const { inputData, ...rest } = await c.req.json();
1449
+ const { runId, resourceId, inputData, resumeData, ...rest } = await c.req.json();
1068
1450
  const mastra = c.get("mastra");
1451
+ const requestContext = c.get("requestContext");
1069
1452
  let workflowToUse = workflow;
1070
1453
  if (!workflow) {
1071
1454
  const workflowId = c.req.param("workflowId");
@@ -1079,15 +1462,20 @@ function workflowRoute({
1079
1462
  if (!workflowToUse) {
1080
1463
  throw new Error("Workflow ID is required");
1081
1464
  }
1082
- const workflowObj = mastra.getWorkflow(workflowToUse);
1465
+ const workflowObj = mastra.getWorkflowById(workflowToUse);
1083
1466
  if (!workflowObj) {
1084
1467
  throw new Error(`Workflow ${workflowToUse} not found`);
1085
1468
  }
1086
- const run = await workflowObj.createRunAsync();
1087
- const stream = run.streamVNext({ inputData, ...rest });
1469
+ if (requestContext && rest.requestContext) {
1470
+ mastra.getLogger()?.warn(
1471
+ `"requestContext" from the request body will be ignored because "requestContext" is already set in the route options.`
1472
+ );
1473
+ }
1474
+ const run = await workflowObj.createRun({ runId, resourceId, ...rest });
1475
+ const stream = resumeData ? run.resumeStream({ resumeData, ...rest, requestContext: requestContext || rest.requestContext }) : run.stream({ inputData, ...rest, requestContext: requestContext || rest.requestContext });
1088
1476
  const uiMessageStream = ai.createUIMessageStream({
1089
1477
  execute: async ({ writer }) => {
1090
- for await (const part of toAISdkFormat(stream, { from: "workflow" })) {
1478
+ for await (const part of toAISdkV5Stream(stream, { from: "workflow", includeTextStreamParts })) {
1091
1479
  writer.write(part);
1092
1480
  }
1093
1481
  }
@@ -1127,13 +1515,12 @@ function networkRoute({
1127
1515
  type: "object",
1128
1516
  properties: {
1129
1517
  messages: { type: "array", items: { type: "object" } },
1130
- runtimeContext: { type: "object", additionalProperties: true },
1518
+ requestContext: { type: "object", additionalProperties: true },
1131
1519
  runId: { type: "string" },
1132
1520
  maxSteps: { type: "number" },
1133
1521
  threadId: { type: "string" },
1134
1522
  resourceId: { type: "string" },
1135
1523
  modelSettings: { type: "object", additionalProperties: true },
1136
- telemetry: { type: "object", additionalProperties: true },
1137
1524
  tools: { type: "array", items: { type: "object" } }
1138
1525
  },
1139
1526
  required: ["messages"]
@@ -1172,7 +1559,7 @@ function networkRoute({
1172
1559
  if (!agentToUse) {
1173
1560
  throw new Error("Agent ID is required");
1174
1561
  }
1175
- const agentObj = mastra.getAgent(agentToUse);
1562
+ const agentObj = mastra.getAgentById(agentToUse);
1176
1563
  if (!agentObj) {
1177
1564
  throw new Error(`Agent ${agentToUse} not found`);
1178
1565
  }
@@ -1182,7 +1569,7 @@ function networkRoute({
1182
1569
  });
1183
1570
  const uiMessageStream = ai.createUIMessageStream({
1184
1571
  execute: async ({ writer }) => {
1185
- for await (const part of toAISdkFormat(result, { from: "network" })) {
1572
+ for await (const part of toAISdkV5Stream(result, { from: "network" })) {
1186
1573
  writer.write(part);
1187
1574
  }
1188
1575
  }
@@ -1192,9 +1579,17 @@ function networkRoute({
1192
1579
  });
1193
1580
  }
1194
1581
 
1582
+ // src/to-ai-sdk-format.ts
1583
+ function toAISdkFormat() {
1584
+ throw new Error(
1585
+ '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.'
1586
+ );
1587
+ }
1588
+
1195
1589
  exports.chatRoute = chatRoute;
1196
1590
  exports.networkRoute = networkRoute;
1197
1591
  exports.toAISdkFormat = toAISdkFormat;
1592
+ exports.toAISdkStream = toAISdkV5Stream;
1198
1593
  exports.workflowRoute = workflowRoute;
1199
1594
  //# sourceMappingURL=index.cjs.map
1200
1595
  //# sourceMappingURL=index.cjs.map