@mastra/react 1.7.0-alpha.9 → 1.7.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
@@ -1871,6 +1871,46 @@ const extractRunIdFromMessages = (messages) => {
1871
1871
  for (const message of messages) for (const source of getRunIdMetadataSources(message.content?.metadata)) for (const entry of Object.values(source)) if (isRecord(entry) && typeof entry.runId === "string" && entry.runId.length > 0) return entry.runId;
1872
1872
  };
1873
1873
  //#endregion
1874
+ //#region src/agent/merge-history.ts
1875
+ const liveClientMessageId = (message) => {
1876
+ const clientMessageId = message.content.metadata?.[CLIENT_MESSAGE_ID_KEY];
1877
+ return typeof clientMessageId === "string" ? clientMessageId : void 0;
1878
+ };
1879
+ const storedClientMessageId = (message) => {
1880
+ const signal = message.content.metadata?.signal;
1881
+ const clientMessageId = isRecord$1(signal) && isRecord$1(signal.metadata) ? signal.metadata[CLIENT_MESSAGE_ID_KEY] : void 0;
1882
+ return typeof clientMessageId === "string" ? clientMessageId : void 0;
1883
+ };
1884
+ const mergeHistoryIntoConversation = ({ conversation, history, previousHistory }) => {
1885
+ const previousById = new Map(previousHistory.map((message) => [message.id, message]));
1886
+ const live = conversation.filter((message) => previousById.get(message.id) !== message);
1887
+ const liveById = new Map(live.map((message) => [message.id, message]));
1888
+ const liveClientMessageIds = new Set(live.flatMap((message) => liveClientMessageId(message) ?? []));
1889
+ const historyIds = new Set(history.map((message) => message.id));
1890
+ const storedClientMessageIds = new Set(history.flatMap((message) => storedClientMessageId(message) ?? []));
1891
+ const mergedHistory = history.map((message) => {
1892
+ const liveCopy = liveById.get(message.id);
1893
+ if (liveCopy) return liveCopy;
1894
+ const clientMessageId = storedClientMessageId(message);
1895
+ if (!clientMessageId || !liveClientMessageIds.has(clientMessageId)) return message;
1896
+ return {
1897
+ ...message,
1898
+ content: {
1899
+ ...message.content,
1900
+ metadata: {
1901
+ ...message.content.metadata,
1902
+ [CLIENT_MESSAGE_ID_KEY]: clientMessageId
1903
+ }
1904
+ }
1905
+ };
1906
+ });
1907
+ const unstoredLive = live.filter((message) => {
1908
+ const clientMessageId = liveClientMessageId(message);
1909
+ return !historyIds.has(message.id) && !(clientMessageId && storedClientMessageIds.has(clientMessageId));
1910
+ });
1911
+ return [...mergedHistory, ...unstoredLive];
1912
+ };
1913
+ //#endregion
1874
1914
  //#region src/agent/hooks.ts
1875
1915
  const extractPendingToolApprovalIdsFromMessages = (messages, runId) => {
1876
1916
  const pendingToolApprovalIds = /* @__PURE__ */ new Set();
@@ -2027,13 +2067,11 @@ const useChat = ({ agentId, resourceId, threadId, initialMessages, requestContex
2027
2067
  formattedMessages
2028
2068
  };
2029
2069
  if (sameThread) {
2030
- const previousById = new Map(previous.formattedMessages.map((message) => [message.id, message]));
2031
- setMessages((current) => {
2032
- const live = current.filter((message) => previousById.get(message.id) !== message);
2033
- const liveById = new Map(live.map((message) => [message.id, message]));
2034
- const historyIds = new Set(formattedMessages.map((message) => message.id));
2035
- return [...formattedMessages.map((message) => liveById.get(message.id) ?? message), ...live.filter((message) => !historyIds.has(message.id))];
2036
- });
2070
+ setMessages((current) => mergeHistoryIntoConversation({
2071
+ conversation: current,
2072
+ history: formattedMessages,
2073
+ previousHistory: previous.formattedMessages
2074
+ }));
2037
2075
  setTasks(liveTasks.current ?? extractLatestTasksFromMessages(formattedMessages));
2038
2076
  const historyRunId = extractRunIdFromMessages(formattedMessages);
2039
2077
  if (liveRunFinished.current) return;
@@ -2223,13 +2261,12 @@ const useChat = ({ agentId, resourceId, threadId, initialMessages, requestContex
2223
2261
  subscription.processDataStream({ onChunk: (chunk) => {
2224
2262
  if (chunk.type === "thread-history") {
2225
2263
  const history = resolveInitialMessages(chunk.payload.messages);
2226
- const previousById = new Map((lastHydration.current?.formattedMessages ?? []).map((message) => [message.id, message]));
2227
- setMessages((current) => {
2228
- const live = current.filter((message) => previousById.get(message.id) !== message);
2229
- const liveById = new Map(live.map((message) => [message.id, message]));
2230
- const historyIds = new Set(history.map((message) => message.id));
2231
- return [...history.map((message) => liveById.get(message.id) ?? message), ...live.filter((message) => !historyIds.has(message.id))];
2232
- });
2264
+ const previousHistory = lastHydration.current?.formattedMessages ?? [];
2265
+ setMessages((current) => mergeHistoryIntoConversation({
2266
+ conversation: current,
2267
+ history,
2268
+ previousHistory
2269
+ }));
2233
2270
  setSubscriptionHistory({
2234
2271
  key: `${agentId}:${resourceId ?? ""}:${threadId}`,
2235
2272
  messages: chunk.payload.messages