@mastra/react 1.7.0-alpha.1 → 1.7.0-alpha.10

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;
@@ -2170,6 +2208,13 @@ const useChat = ({ agentId, resourceId, threadId, initialMessages, requestContex
2170
2208
  pendingToolApprovalIdsRef.current.add(toolCallId);
2171
2209
  setIsAwaitingToolApproval(true);
2172
2210
  }
2211
+ if (runId) {
2212
+ if (!liveRunId.current || liveRunFinished.current) {
2213
+ liveRunId.current = runId;
2214
+ liveRunFinished.current = false;
2215
+ }
2216
+ if (liveRunId.current === runId) _currentRunId.current = runId;
2217
+ }
2173
2218
  setIsRunning(false);
2174
2219
  }
2175
2220
  if (isTerminal) {
@@ -2216,13 +2261,12 @@ const useChat = ({ agentId, resourceId, threadId, initialMessages, requestContex
2216
2261
  subscription.processDataStream({ onChunk: (chunk) => {
2217
2262
  if (chunk.type === "thread-history") {
2218
2263
  const history = resolveInitialMessages(chunk.payload.messages);
2219
- const previousById = new Map((lastHydration.current?.formattedMessages ?? []).map((message) => [message.id, message]));
2220
- setMessages((current) => {
2221
- const live = current.filter((message) => previousById.get(message.id) !== message);
2222
- const liveById = new Map(live.map((message) => [message.id, message]));
2223
- const historyIds = new Set(history.map((message) => message.id));
2224
- return [...history.map((message) => liveById.get(message.id) ?? message), ...live.filter((message) => !historyIds.has(message.id))];
2225
- });
2264
+ const previousHistory = lastHydration.current?.formattedMessages ?? [];
2265
+ setMessages((current) => mergeHistoryIntoConversation({
2266
+ conversation: current,
2267
+ history,
2268
+ previousHistory
2269
+ }));
2226
2270
  setSubscriptionHistory({
2227
2271
  key: `${agentId}:${resourceId ?? ""}:${threadId}`,
2228
2272
  messages: chunk.payload.messages