@mastra/react 0.0.0-dynamic-model-router-20251010230835 → 0.0.0-error-handler-fix-20251020202607

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
@@ -1,7 +1,6 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { createContext, useContext, useState, Fragment, useLayoutEffect, useRef, useEffect } from 'react';
3
3
  import { MastraClient } from '@mastra/client-js';
4
- import { flushSync } from 'react-dom';
5
4
  import { ChevronDownIcon, CheckIcon, CopyIcon } from 'lucide-react';
6
5
  import { twMerge } from 'tailwind-merge';
7
6
  import { toJsxRuntime } from 'hast-util-to-jsx-runtime';
@@ -550,6 +549,9 @@ const toAssistantUIMessage = (message) => {
550
549
  class AISdkNetworkTransformer {
551
550
  transform({ chunk, conversation, metadata }) {
552
551
  const newConversation = [...conversation];
552
+ if (chunk.type === "routing-agent-text-delta") {
553
+ return this.handleRoutingAgentConversation(chunk, newConversation);
554
+ }
553
555
  if (chunk.type.startsWith("agent-execution-")) {
554
556
  return this.handleAgentConversation(chunk, newConversation, metadata);
555
557
  }
@@ -560,22 +562,80 @@ class AISdkNetworkTransformer {
560
562
  return this.handleToolConversation(chunk, newConversation, metadata);
561
563
  }
562
564
  if (chunk.type === "network-execution-event-step-finish") {
563
- const newMessage = {
564
- id: `network-execution-event-step-finish-${chunk.runId}-${Date.now()}`,
565
- role: "assistant",
566
- parts: [
565
+ const lastMessage = newConversation[newConversation.length - 1];
566
+ if (!lastMessage || lastMessage.role !== "assistant") return newConversation;
567
+ const agentChunk = chunk.payload;
568
+ const parts = [...lastMessage.parts];
569
+ const textPartIndex = parts.findIndex((part) => part.type === "text");
570
+ if (textPartIndex === -1) {
571
+ parts.push({
572
+ type: "text",
573
+ text: agentChunk.result,
574
+ state: "done"
575
+ });
576
+ return [
577
+ ...newConversation.slice(0, -1),
567
578
  {
568
- type: "text",
569
- text: chunk.payload?.result || "",
570
- state: "done"
579
+ ...lastMessage,
580
+ parts
571
581
  }
572
- ],
573
- metadata
574
- };
575
- return [...newConversation, newMessage];
582
+ ];
583
+ }
584
+ const textPart = parts[textPartIndex];
585
+ if (textPart.type === "text") {
586
+ parts[textPartIndex] = {
587
+ ...textPart,
588
+ state: "done"
589
+ };
590
+ return [
591
+ ...newConversation.slice(0, -1),
592
+ {
593
+ ...lastMessage,
594
+ parts
595
+ }
596
+ ];
597
+ }
598
+ return newConversation;
576
599
  }
577
600
  return newConversation;
578
601
  }
602
+ handleRoutingAgentConversation = (chunk, newConversation) => {
603
+ const lastMessage = newConversation[newConversation.length - 1];
604
+ if (!lastMessage || lastMessage.role !== "assistant") return newConversation;
605
+ const agentChunk = chunk.payload;
606
+ const parts = [...lastMessage.parts];
607
+ const textPartIndex = parts.findIndex((part) => part.type === "text");
608
+ if (textPartIndex === -1) {
609
+ parts.push({
610
+ type: "text",
611
+ text: agentChunk.text,
612
+ state: "streaming"
613
+ });
614
+ return [
615
+ ...newConversation.slice(0, -1),
616
+ {
617
+ ...lastMessage,
618
+ parts
619
+ }
620
+ ];
621
+ }
622
+ const textPart = parts[textPartIndex];
623
+ if (textPart.type === "text") {
624
+ parts[textPartIndex] = {
625
+ ...textPart,
626
+ text: textPart.text + agentChunk.text,
627
+ state: "streaming"
628
+ };
629
+ return [
630
+ ...newConversation.slice(0, -1),
631
+ {
632
+ ...lastMessage,
633
+ parts
634
+ }
635
+ ];
636
+ }
637
+ return newConversation;
638
+ };
579
639
  handleAgentConversation = (chunk, newConversation, metadata) => {
580
640
  if (chunk.type === "agent-execution-start") {
581
641
  const primitiveId = chunk.payload?.args?.primitiveId;
@@ -1040,9 +1100,7 @@ const useChat = ({ agentId, initializeMessages }) => {
1040
1100
  }
1041
1101
  await response.processDataStream({
1042
1102
  onChunk: async (chunk) => {
1043
- flushSync(() => {
1044
- setMessages((prev) => toUIMessage({ chunk, conversation: prev, metadata: { mode: "stream" } }));
1045
- });
1103
+ setMessages((prev) => toUIMessage({ chunk, conversation: prev, metadata: { mode: "stream" } }));
1046
1104
  onChunk?.(chunk);
1047
1105
  }
1048
1106
  });
@@ -1082,21 +1140,29 @@ const useChat = ({ agentId, initializeMessages }) => {
1082
1140
  const transformer = new AISdkNetworkTransformer();
1083
1141
  await response.processDataStream({
1084
1142
  onChunk: async (chunk) => {
1085
- flushSync(() => {
1086
- setMessages((prev) => transformer.transform({ chunk, conversation: prev, metadata: { mode: "network" } }));
1087
- });
1143
+ setMessages((prev) => transformer.transform({ chunk, conversation: prev, metadata: { mode: "network" } }));
1088
1144
  onNetworkChunk?.(chunk);
1089
1145
  }
1090
1146
  });
1091
1147
  setIsRunning(false);
1092
1148
  };
1149
+ const sendMessage = async ({ mode = "stream", ...args }) => {
1150
+ const nextMessage = { role: "user", content: [{ type: "text", text: args.message }] };
1151
+ const messages2 = args.coreUserMessages ? [nextMessage, ...args.coreUserMessages] : [nextMessage];
1152
+ setMessages((s) => [...s, { role: "user", parts: [{ type: "text", text: args.message }] }]);
1153
+ if (mode === "generate") {
1154
+ await generate({ ...args, coreUserMessages: messages2 });
1155
+ } else if (mode === "stream") {
1156
+ await stream({ ...args, coreUserMessages: messages2 });
1157
+ } else if (mode === "network") {
1158
+ await network({ ...args, coreUserMessages: messages2 });
1159
+ }
1160
+ };
1093
1161
  return {
1094
- network,
1095
- stream,
1096
- generate,
1162
+ setMessages,
1163
+ sendMessage,
1097
1164
  isRunning,
1098
1165
  messages,
1099
- setMessages,
1100
1166
  cancelRun: () => setIsRunning(false)
1101
1167
  };
1102
1168
  };