@assistant-ui/ai-sdk 0.0.7 → 0.0.9

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.
Files changed (115) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/dist/adapters/aiSDKFormatAdapter.d.ts +2 -2
  4. package/dist/adapters/aiSDKFormatAdapter.d.ts.map +1 -0
  5. package/dist/adapters/vercelAttachmentAdapter.d.ts +1 -3
  6. package/dist/adapters/vercelAttachmentAdapter.d.ts.map +1 -1
  7. package/dist/adapters/vercelAttachmentAdapter.js +3 -3
  8. package/dist/adapters/vercelAttachmentAdapter.js.map +1 -1
  9. package/dist/aiSDKExtras.d.ts +4 -6
  10. package/dist/aiSDKExtras.d.ts.map +1 -1
  11. package/dist/converters/convertMessage.d.ts +34 -24
  12. package/dist/converters/convertMessage.d.ts.map +1 -1
  13. package/dist/converters/convertMessage.js +56 -12
  14. package/dist/converters/convertMessage.js.map +1 -1
  15. package/dist/converters/modelContentEnvelope.d.ts +6 -7
  16. package/dist/converters/modelContentEnvelope.d.ts.map +1 -1
  17. package/dist/converters/toCreateMessage.d.ts +2 -4
  18. package/dist/converters/toCreateMessage.d.ts.map +1 -1
  19. package/dist/converters/toolOutputConversion.d.ts +20 -22
  20. package/dist/converters/toolOutputConversion.d.ts.map +1 -1
  21. package/dist/hooks.d.ts +2 -4
  22. package/dist/hooks.d.ts.map +1 -1
  23. package/dist/index.d.ts +17 -14
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.native.d.ts +15 -12
  26. package/dist/index.native.d.ts.map +1 -0
  27. package/dist/model-context/injectInteractableContext.d.ts +2 -4
  28. package/dist/model-context/injectInteractableContext.d.ts.map +1 -1
  29. package/dist/model-context/injectQuoteContext.d.ts +1 -3
  30. package/dist/model-context/injectQuoteContext.d.ts.map +1 -1
  31. package/dist/runtime/AISDKChat.d.ts +2 -4
  32. package/dist/runtime/AISDKChat.d.ts.map +1 -1
  33. package/dist/runtime/AISDKChat.js +1 -1
  34. package/dist/runtime/AISDKChat.js.map +1 -1
  35. package/dist/runtime/AISDKThreads.d.ts +29 -31
  36. package/dist/runtime/AISDKThreads.d.ts.map +1 -1
  37. package/dist/runtime/AISDKThreads.js +22 -23
  38. package/dist/runtime/AISDKThreads.js.map +1 -1
  39. package/dist/runtime/sdkIdentity.d.ts +1 -3
  40. package/dist/runtime/sdkIdentity.d.ts.map +1 -1
  41. package/dist/runtime/sdkIdentity.js +1 -1
  42. package/dist/runtime/useAISDKRuntime.d.ts +76 -70
  43. package/dist/runtime/useAISDKRuntime.d.ts.map +1 -1
  44. package/dist/runtime/useAISDKRuntime.js +311 -77
  45. package/dist/runtime/useAISDKRuntime.js.map +1 -1
  46. package/dist/runtime/useChatRuntime.d.ts +6 -8
  47. package/dist/runtime/useChatRuntime.d.ts.map +1 -1
  48. package/dist/runtime/useChatRuntime.js +14 -10
  49. package/dist/runtime/useChatRuntime.js.map +1 -1
  50. package/dist/runtime/useChatThread.d.ts +94 -89
  51. package/dist/runtime/useChatThread.d.ts.map +1 -1
  52. package/dist/runtime/useChatThread.js +44 -15
  53. package/dist/runtime/useChatThread.js.map +1 -1
  54. package/dist/runtime/useExternalHistory.d.ts +7 -7
  55. package/dist/runtime/useExternalHistory.d.ts.map +1 -1
  56. package/dist/runtime/useExternalHistory.js +231 -60
  57. package/dist/runtime/useExternalHistory.js.map +1 -1
  58. package/dist/runtime/useResourceCleanup.d.ts +1 -3
  59. package/dist/runtime/useResourceCleanup.d.ts.map +1 -1
  60. package/dist/runtime/useResourceCleanup.js +38 -14
  61. package/dist/runtime/useResourceCleanup.js.map +1 -1
  62. package/dist/runtime/useStreamingTiming.d.ts +3 -5
  63. package/dist/runtime/useStreamingTiming.d.ts.map +1 -1
  64. package/dist/runtime/useStreamingTiming.js +1 -1
  65. package/dist/tools/frontendTools.d.ts +21 -23
  66. package/dist/tools/frontendTools.d.ts.map +1 -1
  67. package/dist/tools/generativeTools.d.ts +24 -26
  68. package/dist/tools/generativeTools.d.ts.map +1 -1
  69. package/dist/tools/mcp-stdio.node.d.ts +2 -2
  70. package/dist/tools/mcp-stdio.node.d.ts.map +1 -0
  71. package/dist/tools/mcp-stdio.unsupported.d.ts +2 -4
  72. package/dist/tools/mcp-stdio.unsupported.d.ts.map +1 -1
  73. package/dist/transport/AssistantChatTransport.d.ts +14 -16
  74. package/dist/transport/AssistantChatTransport.d.ts.map +1 -1
  75. package/dist/transport/AssistantChatTransport.js +9 -2
  76. package/dist/transport/AssistantChatTransport.js.map +1 -1
  77. package/dist/transport/resumable.d.ts +25 -27
  78. package/dist/transport/resumable.d.ts.map +1 -1
  79. package/dist/usage.d.ts +8 -10
  80. package/dist/usage.d.ts.map +1 -1
  81. package/dist/usage.js.map +1 -1
  82. package/dist/utils/getVercelAIMessages.d.ts +2 -4
  83. package/dist/utils/getVercelAIMessages.d.ts.map +1 -1
  84. package/dist/utils/sliceMessagesUntil.d.ts +1 -3
  85. package/dist/utils/sliceMessagesUntil.d.ts.map +1 -1
  86. package/package.json +13 -9
  87. package/src/adapters/vercelAttachmentAdapter.test.ts +23 -0
  88. package/src/adapters/vercelAttachmentAdapter.ts +2 -2
  89. package/src/converters/convertMessage.test.ts +541 -3
  90. package/src/converters/convertMessage.ts +123 -15
  91. package/src/index.native.ts +1 -1
  92. package/src/index.ts +1 -1
  93. package/src/runtime/AISDKChat.ts +0 -4
  94. package/src/runtime/AISDKThreads.cloud.test.ts +60 -2
  95. package/src/runtime/AISDKThreads.test.ts +105 -46
  96. package/src/runtime/AISDKThreads.ts +1 -1
  97. package/src/runtime/useAISDKRuntime.approval.integration.test.tsx +1639 -19
  98. package/src/runtime/useAISDKRuntime.approval.test.tsx +252 -9
  99. package/src/runtime/useAISDKRuntime.fast-refresh.test.tsx +182 -0
  100. package/src/runtime/useAISDKRuntime.test.ts +275 -5
  101. package/src/runtime/useAISDKRuntime.ts +533 -60
  102. package/src/runtime/useAISDKRuntime.voice.test.tsx +50 -1
  103. package/src/runtime/useChatRuntime.fast-refresh.test.tsx +94 -0
  104. package/src/runtime/useChatRuntime.integration.test.tsx +143 -65
  105. package/src/runtime/useChatRuntime.test.ts +11 -7
  106. package/src/runtime/useChatRuntime.ts +6 -2
  107. package/src/runtime/useChatThread.test.ts +166 -2
  108. package/src/runtime/useChatThread.transport.test.tsx +152 -0
  109. package/src/runtime/useChatThread.ts +89 -22
  110. package/src/runtime/useExternalHistory.test.ts +943 -3
  111. package/src/runtime/useExternalHistory.ts +378 -15
  112. package/src/runtime/useResourceCleanup.ts +41 -15
  113. package/src/transport/AssistantChatTransport.test.ts +164 -0
  114. package/src/transport/AssistantChatTransport.ts +22 -2
  115. package/src/usage.ts +1 -1
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { useCallback, useEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
2
+ import { MessageRepository, readToolInteractionLog } from "@assistant-ui/core/internal";
3
3
  import { getExternalStoreMessages } from "@assistant-ui/core";
4
- import { MessageRepository } from "@assistant-ui/core/internal";
4
+ import { useCallback, useEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
5
5
  import { useAui } from "@assistant-ui/store";
6
6
  //#region src/runtime/useExternalHistory.ts
7
7
  const toExportedMessageRepository = (toThreadMessages, messages) => {
@@ -24,10 +24,109 @@ const toExportedMessageRepository = (toThreadMessages, messages) => {
24
24
  messages: survivors
25
25
  };
26
26
  };
27
- const isAwaitingToolApproval = (message) => message.status?.type === "requires-action" && message.status.reason === "tool-calls";
27
+ const hasUnansweredApproval = (message) => message.content.some((part) => part.type === "tool-call" && part.approval != null && part.approval.approved === void 0 && part.approval.resolution === void 0);
28
+ const isAwaitingToolApproval = (message) => message.status?.type === "requires-action" && (message.status.reason === "tool-calls" || message.status.reason === "interrupt" && hasUnansweredApproval(message));
28
29
  const isTerminalMessage = (message) => message.status === void 0 || message.status.type === "complete" || message.status.type === "incomplete";
30
+ const TOOL_ARTIFACTS_METADATA_KEY = "__aui_toolArtifacts";
31
+ const TOOL_INTERACTIONS_METADATA_KEY = "__aui_toolInteractions";
32
+ const TOOL_APPROVAL_RESPONSES_METADATA_KEY = "__aui_toolApprovalResponses";
33
+ const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
34
+ const collectToolArtifacts = (message, toolArtifacts) => {
35
+ if (!toolArtifacts) return void 0;
36
+ const entries = message.content.flatMap((part) => {
37
+ if (part.type !== "tool-call") return [];
38
+ const artifact = toolArtifacts.get(part.toolCallId);
39
+ return artifact === void 0 ? [] : [[part.toolCallId, artifact]];
40
+ });
41
+ return entries.length > 0 ? Object.fromEntries(entries) : void 0;
42
+ };
43
+ const collectToolInteractions = (message, toolInteractions) => {
44
+ if (!toolInteractions) return void 0;
45
+ const entries = message.content.flatMap((part) => {
46
+ if (part.type !== "tool-call") return [];
47
+ const interactions = toolInteractions.get(part.toolCallId);
48
+ return interactions === void 0 ? [] : [[part.toolCallId, interactions]];
49
+ });
50
+ return entries.length > 0 ? Object.fromEntries(entries) : void 0;
51
+ };
52
+ const collectToolApprovalResponses = (message, toolApprovalResponses) => {
53
+ if (!toolApprovalResponses) return void 0;
54
+ const entries = message.content.flatMap((part) => {
55
+ if (part.type !== "tool-call" || !part.approval) return [];
56
+ const response = toolApprovalResponses.get(part.approval.id);
57
+ if (!response) return [];
58
+ return [[part.approval.id, {
59
+ approved: response.approved,
60
+ ...response.optionId != null && { optionId: response.optionId },
61
+ ...response.text != null && { text: response.text },
62
+ ...response.reason != null && { reason: response.reason }
63
+ }]];
64
+ });
65
+ return entries.length > 0 ? Object.fromEntries(entries) : void 0;
66
+ };
67
+ const addToolData = (message, toolArtifacts, toolInteractions, toolApprovalResponses) => {
68
+ if (!toolArtifacts && !toolInteractions && !toolApprovalResponses || !isRecord(message) || !Array.isArray(message.parts)) return message;
69
+ const toolCallIds = message.parts.flatMap((part) => {
70
+ if (!isRecord(part) || typeof part.toolCallId !== "string") return [];
71
+ return [part.toolCallId];
72
+ });
73
+ const artifacts = toolArtifacts ? Object.fromEntries(toolCallIds.flatMap((toolCallId) => Object.hasOwn(toolArtifacts, toolCallId) ? [[toolCallId, toolArtifacts[toolCallId]]] : [])) : void 0;
74
+ const interactions = toolInteractions ? Object.fromEntries(toolCallIds.flatMap((toolCallId) => Object.hasOwn(toolInteractions, toolCallId) ? [[toolCallId, toolInteractions[toolCallId]]] : [])) : void 0;
75
+ const approvalIds = message.parts.flatMap((part) => {
76
+ if (!isRecord(part) || !isRecord(part.approval)) return [];
77
+ const approvalId = part.approval.id;
78
+ return typeof approvalId === "string" ? [approvalId] : [];
79
+ });
80
+ const approvalResponses = toolApprovalResponses ? Object.fromEntries(approvalIds.flatMap((approvalId) => Object.hasOwn(toolApprovalResponses, approvalId) ? [[approvalId, toolApprovalResponses[approvalId]]] : [])) : void 0;
81
+ const hasArtifacts = !!artifacts && Object.keys(artifacts).length > 0;
82
+ const hasInteractions = !!interactions && Object.keys(interactions).length > 0;
83
+ const hasApprovalResponses = !!approvalResponses && Object.keys(approvalResponses).length > 0;
84
+ if (!hasArtifacts && !hasInteractions && !hasApprovalResponses) return message;
85
+ const metadata = isRecord(message.metadata) ? message.metadata : {};
86
+ return {
87
+ ...message,
88
+ metadata: {
89
+ ...metadata,
90
+ ...hasArtifacts && { [TOOL_ARTIFACTS_METADATA_KEY]: artifacts },
91
+ ...hasInteractions && { [TOOL_INTERACTIONS_METADATA_KEY]: interactions },
92
+ ...hasApprovalResponses && { [TOOL_APPROVAL_RESPONSES_METADATA_KEY]: approvalResponses }
93
+ }
94
+ };
95
+ };
96
+ const restoreToolData = (message, toolArtifacts, toolInteractions, toolApprovalResponses) => {
97
+ if (!isRecord(message) || !isRecord(message.metadata)) return message;
98
+ const metadata = message.metadata;
99
+ const hasArtifacts = Object.hasOwn(metadata, TOOL_ARTIFACTS_METADATA_KEY);
100
+ const hasInteractions = Object.hasOwn(metadata, TOOL_INTERACTIONS_METADATA_KEY);
101
+ const hasApprovalResponses = Object.hasOwn(metadata, TOOL_APPROVAL_RESPONSES_METADATA_KEY);
102
+ if (!hasArtifacts && !hasInteractions && !hasApprovalResponses) return message;
103
+ const artifacts = metadata[TOOL_ARTIFACTS_METADATA_KEY];
104
+ if (toolArtifacts && isRecord(artifacts)) for (const [toolCallId, artifact] of Object.entries(artifacts)) toolArtifacts.set(toolCallId, artifact);
105
+ const interactions = metadata[TOOL_INTERACTIONS_METADATA_KEY];
106
+ if (toolInteractions && isRecord(interactions)) for (const [toolCallId, value] of Object.entries(interactions)) {
107
+ const log = readToolInteractionLog(value);
108
+ if (log) toolInteractions.set(toolCallId, log);
109
+ }
110
+ const approvalResponses = metadata[TOOL_APPROVAL_RESPONSES_METADATA_KEY];
111
+ if (toolApprovalResponses && isRecord(approvalResponses)) for (const [approvalId, value] of Object.entries(approvalResponses)) {
112
+ if (!isRecord(value) || typeof value.approved !== "boolean") continue;
113
+ toolApprovalResponses.set(approvalId, {
114
+ approvalId,
115
+ approved: value.approved,
116
+ ...typeof value.optionId === "string" && { optionId: value.optionId },
117
+ ...typeof value.text === "string" && { text: value.text },
118
+ ...typeof value.reason === "string" && { reason: value.reason }
119
+ });
120
+ }
121
+ const { [TOOL_ARTIFACTS_METADATA_KEY]: _, [TOOL_INTERACTIONS_METADATA_KEY]: __, [TOOL_APPROVAL_RESPONSES_METADATA_KEY]: ___, ...restMetadata } = metadata;
122
+ const { metadata: _metadata, ...restMessage } = message;
123
+ return Object.keys(restMetadata).length === 0 ? restMessage : {
124
+ ...restMessage,
125
+ metadata: restMetadata
126
+ };
127
+ };
29
128
  const encodeContent = (storageFormatAdapter, item) => JSON.stringify(storageFormatAdapter.encode(item));
30
- const useExternalHistory = (runtimeRef, historyAdapter, toThreadMessages, storageFormatAdapter, onSetMessages) => {
129
+ const useExternalHistory = (runtimeRef, historyAdapter, toThreadMessages, storageFormatAdapter, onSetMessages, toolArtifacts, onToolArtifactsRestored, toolInteractions, onToolInteractionsRestored, toolApprovalResponses, onToolApprovalResponsesRestored) => {
31
130
  const loadedRef = useRef(false);
32
131
  const [itemEpoch, setItemEpoch] = useState(0);
33
132
  const aui = useAui();
@@ -51,12 +150,26 @@ const useExternalHistory = (runtimeRef, historyAdapter, toThreadMessages, storag
51
150
  const loadHistory = async () => {
52
151
  try {
53
152
  const repo = await formatAdapter.load();
54
- if (repo && repo.messages.length > 0) {
55
- for (const m of repo.messages) persistedInnerMessages.current.set(storageFormatAdapter.getId(m.message), {
56
- source: m.message,
153
+ toolArtifacts?.clear();
154
+ toolInteractions?.clear();
155
+ toolApprovalResponses?.clear();
156
+ const restoredMessages = repo?.messages.map((item) => ({
157
+ ...item,
158
+ message: restoreToolData(item.message, toolArtifacts, toolInteractions, toolApprovalResponses)
159
+ })) ?? [];
160
+ onToolArtifactsRestored?.();
161
+ onToolInteractionsRestored?.();
162
+ onToolApprovalResponsesRestored?.();
163
+ if (repo && restoredMessages.length > 0) {
164
+ const restoredRepo = {
165
+ ...repo,
166
+ messages: restoredMessages
167
+ };
168
+ for (const [index, m] of repo.messages.entries()) persistedInnerMessages.current.set(storageFormatAdapter.getId(m.message), {
169
+ source: restoredMessages[index].message,
57
170
  content: encodeContent(storageFormatAdapter, m)
58
171
  });
59
- const converted = toExportedMessageRepository(toThreadMessages, repo);
172
+ const converted = toExportedMessageRepository(toThreadMessages, restoredRepo);
60
173
  runtimeRef.current.thread.import(converted);
61
174
  const tempRepo = new MessageRepository();
62
175
  tempRepo.import(converted);
@@ -96,7 +209,13 @@ const useExternalHistory = (runtimeRef, historyAdapter, toThreadMessages, storag
96
209
  optionalThreadListItem,
97
210
  aui,
98
211
  itemEpoch,
99
- storageFormatAdapter
212
+ storageFormatAdapter,
213
+ toolArtifacts,
214
+ onToolArtifactsRestored,
215
+ toolInteractions,
216
+ onToolInteractionsRestored,
217
+ toolApprovalResponses,
218
+ onToolApprovalResponsesRestored
100
219
  ]);
101
220
  const runStartRef = useRef(null);
102
221
  const persistTimerRef = useRef(null);
@@ -104,11 +223,55 @@ const useExternalHistory = (runtimeRef, historyAdapter, toThreadMessages, storag
104
223
  const stepBoundariesRef = useRef([]);
105
224
  const wasRunningRef = useRef(false);
106
225
  const toolCallCountRef = useRef(0);
226
+ const persistToolInteractions = useCallback((messageId) => {
227
+ const persistence = persistInFlightRef.current.then(async () => {
228
+ if (!formatAdapter?.update) return;
229
+ const messages_0 = runtimeRef.current.thread.getState().messages;
230
+ const message = messages_0.find((item_0) => item_0.id === messageId || getExternalStoreMessages(item_0).some((innerMessage) => storageFormatAdapter.getId(innerMessage) === messageId));
231
+ if (!message) return;
232
+ const previousMessages = messages_0.slice(0, messages_0.indexOf(message)).flatMap(getExternalStoreMessages);
233
+ let parentId = previousMessages.at(-1) ? storageFormatAdapter.getId(previousMessages.at(-1)) : null;
234
+ const storedToolArtifacts = collectToolArtifacts(message, toolArtifacts);
235
+ const storedToolInteractions = collectToolInteractions(message, toolInteractions);
236
+ const storedToolApprovalResponses = collectToolApprovalResponses(message, toolApprovalResponses);
237
+ for (const innerMessage_0 of getExternalStoreMessages(message)) {
238
+ const item_1 = {
239
+ parentId,
240
+ message: addToolData(innerMessage_0, storedToolArtifacts, storedToolInteractions, storedToolApprovalResponses)
241
+ };
242
+ const innerId = storageFormatAdapter.getId(item_1.message);
243
+ const persisted = persistedInnerMessages.current.get(innerId);
244
+ if (persisted) {
245
+ const content = encodeContent(storageFormatAdapter, item_1);
246
+ if (content === persisted.content) persisted.source = item_1.message;
247
+ else {
248
+ await formatAdapter.update(item_1, innerId);
249
+ persistedInnerMessages.current.set(innerId, {
250
+ source: item_1.message,
251
+ content
252
+ });
253
+ }
254
+ }
255
+ parentId = innerId;
256
+ }
257
+ });
258
+ persistInFlightRef.current = persistence.catch(() => {});
259
+ return persistence.catch((error_0) => {
260
+ console.error("Failed to persist tool data:", error_0);
261
+ });
262
+ }, [
263
+ formatAdapter,
264
+ runtimeRef,
265
+ storageFormatAdapter,
266
+ toolArtifacts,
267
+ toolInteractions,
268
+ toolApprovalResponses
269
+ ]);
107
270
  useEffect(() => {
108
271
  if (!formatAdapter) return;
109
272
  const adapter = formatAdapter;
110
273
  const idleScheduledInnerIds = /* @__PURE__ */ new Set();
111
- const unpersistedInnerIds = (message) => isTerminalMessage(message) ? getExternalStoreMessages(message).map((innerMessage) => storageFormatAdapter.getId(innerMessage)).filter((innerId) => !persistedInnerMessages.current.has(innerId)) : [];
274
+ const unpersistedInnerIds = (message_0) => isTerminalMessage(message_0) ? getExternalStoreMessages(message_0).map((innerMessage_1) => storageFormatAdapter.getId(innerMessage_1)).filter((innerId_0) => !persistedInnerMessages.current.has(innerId_0)) : [];
112
275
  const unsubscribe = runtimeRef.current.thread.subscribe(() => {
113
276
  const threadState_0 = runtimeRef.current.thread.getState();
114
277
  const { isRunning } = threadState_0;
@@ -141,8 +304,8 @@ const useExternalHistory = (runtimeRef, historyAdapter, toThreadMessages, storag
141
304
  if (runStartRef.current != null) stepBoundariesRef.current.push(Date.now() - runStartRef.current);
142
305
  } else {
143
306
  const pending = threadState_0.messages.flatMap(unpersistedInnerIds);
144
- if (pending.every((innerId_0) => idleScheduledInnerIds.has(innerId_0))) return;
145
- for (const innerId_1 of pending) idleScheduledInnerIds.add(innerId_1);
307
+ if (pending.every((innerId_1) => idleScheduledInnerIds.has(innerId_1))) return;
308
+ for (const innerId_2 of pending) idleScheduledInnerIds.add(innerId_2);
146
309
  }
147
310
  if (persistTimerRef.current) clearTimeout(persistTimerRef.current);
148
311
  persistTimerRef.current = setTimeout(() => {
@@ -188,58 +351,61 @@ const useExternalHistory = (runtimeRef, historyAdapter, toThreadMessages, storag
188
351
  ...stepTimestamps != null ? { stepTimestamps } : void 0
189
352
  };
190
353
  persistInFlightRef.current = persistInFlightRef.current.then(async () => {
191
- const { messages: messages_0 } = latest;
354
+ const { messages: messages_1 } = latest;
192
355
  let lastInnerMessageId = null;
193
356
  const getLastInnerId = (msgs) => msgs.length > 0 ? storageFormatAdapter.getId(msgs.at(-1)) : null;
194
- const toBatchItems = (msgs_0) => msgs_0.map((msg, idx) => ({
357
+ const toBatchItems = (msgs_0, toolArtifacts_0, toolInteractions_0, toolApprovalResponses_0) => msgs_0.map((msg, idx) => ({
195
358
  parentId: idx === 0 ? lastInnerMessageId : storageFormatAdapter.getId(msgs_0[idx - 1]),
196
- message: msg
359
+ message: addToolData(msg, toolArtifacts_0, toolInteractions_0, toolApprovalResponses_0)
197
360
  }));
198
- for (const message_0 of messages_0) {
199
- const innerMessages = getExternalStoreMessages(message_0);
200
- const isTerminal = isTerminalMessage(message_0);
201
- const isAwaitingToolCalls = isAwaitingToolApproval(message_0);
361
+ for (const message_1 of messages_1) {
362
+ const innerMessages = getExternalStoreMessages(message_1);
363
+ const isTerminal = isTerminalMessage(message_1);
364
+ const isAwaitingToolCalls = isAwaitingToolApproval(message_1);
202
365
  if (!(isTerminal || isAwaitingToolCalls && adapter.update !== void 0)) {
203
366
  lastInnerMessageId = getLastInnerId(innerMessages) ?? lastInnerMessageId;
204
367
  continue;
205
368
  }
206
- if (!historyIds.current.has(message_0.id)) {
207
- historyIds.current.add(message_0.id);
208
- deferredTelemetryIds.current.add(message_0.id);
369
+ if (!historyIds.current.has(message_1.id)) {
370
+ historyIds.current.add(message_1.id);
371
+ deferredTelemetryIds.current.add(message_1.id);
209
372
  }
210
- const batchItems = toBatchItems(innerMessages);
211
- for (const item of batchItems) {
212
- const innerId_2 = storageFormatAdapter.getId(item.message);
213
- const persisted = persistedInnerMessages.current.get(innerId_2);
214
- if (!persisted) {
215
- await adapter.append(item);
216
- persistedInnerMessages.current.set(innerId_2, {
217
- source: item.message,
218
- content: encodeContent(storageFormatAdapter, item)
373
+ const batchItems = toBatchItems(innerMessages, collectToolArtifacts(message_1, toolArtifacts), collectToolInteractions(message_1, toolInteractions), collectToolApprovalResponses(message_1, toolApprovalResponses));
374
+ for (const item_2 of batchItems) {
375
+ const innerId_3 = storageFormatAdapter.getId(item_2.message);
376
+ const persisted_0 = persistedInnerMessages.current.get(innerId_3);
377
+ if (!persisted_0) {
378
+ await adapter.append(item_2);
379
+ persistedInnerMessages.current.set(innerId_3, {
380
+ source: item_2.message,
381
+ content: encodeContent(storageFormatAdapter, item_2)
219
382
  });
220
- } else if (persisted.source !== item.message && durationMs !== void 0 && adapter.update) {
221
- const content = encodeContent(storageFormatAdapter, item);
222
- if (content === persisted.content) persisted.source = item.message;
383
+ } else if (persisted_0.source !== item_2.message && durationMs !== void 0 && adapter.update) {
384
+ const content_0 = encodeContent(storageFormatAdapter, item_2);
385
+ if (content_0 === persisted_0.content) persisted_0.source = item_2.message;
223
386
  else try {
224
- await adapter.update(item, innerId_2);
225
- persistedInnerMessages.current.set(innerId_2, {
226
- source: item.message,
227
- content
387
+ await adapter.update(item_2, innerId_3);
388
+ persistedInnerMessages.current.set(innerId_3, {
389
+ source: item_2.message,
390
+ content: content_0
228
391
  });
229
392
  } catch {}
230
393
  }
231
394
  }
232
395
  lastInnerMessageId = getLastInnerId(innerMessages) ?? lastInnerMessageId;
233
- if (deferredTelemetryIds.current.has(message_0.id) && isTerminal) {
234
- deferredTelemetryIds.current.delete(message_0.id);
235
- adapter.reportTelemetry?.(batchItems, {
396
+ if (deferredTelemetryIds.current.has(message_1.id) && isTerminal) {
397
+ deferredTelemetryIds.current.delete(message_1.id);
398
+ adapter.reportTelemetry?.(batchItems.map((item_3, index_0) => ({
399
+ ...item_3,
400
+ message: innerMessages[index_0]
401
+ })), {
236
402
  ...telemetryOptions,
237
- message: message_0
403
+ message: message_1
238
404
  });
239
405
  }
240
406
  }
241
- }).catch((error_0) => {
242
- console.error("Failed to persist message history:", error_0);
407
+ }).catch((error_1) => {
408
+ console.error("Failed to persist message history:", error_1);
243
409
  });
244
410
  }
245
411
  return () => {
@@ -253,31 +419,34 @@ const useExternalHistory = (runtimeRef, historyAdapter, toThreadMessages, storag
253
419
  }, [
254
420
  formatAdapter,
255
421
  storageFormatAdapter,
256
- runtimeRef
422
+ runtimeRef,
423
+ toolArtifacts,
424
+ toolInteractions,
425
+ toolApprovalResponses
257
426
  ]);
258
427
  return {
259
428
  isLoading,
260
- deleteMessage: useCallback(async (messageId) => {
429
+ deleteMessage: useCallback(async (messageId_0) => {
261
430
  const deleteMessages = formatAdapter?.delete?.bind(formatAdapter);
262
431
  if (!deleteMessages) return;
263
- const messages_1 = runtimeRef.current.thread.getState().messages;
264
- const messageIndex = messages_1.findIndex((m_2) => m_2.id === messageId);
432
+ const messages_2 = runtimeRef.current.thread.getState().messages;
433
+ const messageIndex = messages_2.findIndex((m_2) => m_2.id === messageId_0);
265
434
  if (messageIndex === -1) return;
266
- const previousInnerMessages = messages_1.slice(0, messageIndex).flatMap(getExternalStoreMessages);
267
- let parentId = previousInnerMessages.at(-1) ? storageFormatAdapter.getId(previousInnerMessages.at(-1)) : null;
268
- const itemsToDelete = getExternalStoreMessages(messages_1[messageIndex]).map((message_1) => {
269
- const item_0 = {
270
- parentId,
271
- message: message_1
435
+ const previousInnerMessages = messages_2.slice(0, messageIndex).flatMap(getExternalStoreMessages);
436
+ let parentId_0 = previousInnerMessages.at(-1) ? storageFormatAdapter.getId(previousInnerMessages.at(-1)) : null;
437
+ const itemsToDelete = getExternalStoreMessages(messages_2[messageIndex]).map((message_2) => {
438
+ const item_4 = {
439
+ parentId: parentId_0,
440
+ message: message_2
272
441
  };
273
- parentId = storageFormatAdapter.getId(message_1);
274
- return item_0;
442
+ parentId_0 = storageFormatAdapter.getId(message_2);
443
+ return item_4;
275
444
  });
276
445
  const deletion = persistInFlightRef.current.then(async () => {
277
446
  await deleteMessages(itemsToDelete);
278
- historyIds.current.delete(messageId);
279
- deferredTelemetryIds.current.delete(messageId);
280
- for (const item_1 of itemsToDelete) persistedInnerMessages.current.delete(storageFormatAdapter.getId(item_1.message));
447
+ historyIds.current.delete(messageId_0);
448
+ deferredTelemetryIds.current.delete(messageId_0);
449
+ for (const item_5 of itemsToDelete) persistedInnerMessages.current.delete(storageFormatAdapter.getId(item_5.message));
281
450
  });
282
451
  persistInFlightRef.current = deletion.catch(() => {});
283
452
  await deletion;
@@ -285,7 +454,9 @@ const useExternalHistory = (runtimeRef, historyAdapter, toThreadMessages, storag
285
454
  formatAdapter,
286
455
  runtimeRef,
287
456
  storageFormatAdapter
288
- ])
457
+ ]),
458
+ persistToolInteractions,
459
+ persistToolApprovalResponses: persistToolInteractions
289
460
  };
290
461
  };
291
462
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useExternalHistory.js","names":["AssistantRuntime","ThreadHistoryAdapter","ThreadMessage","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepository","getExternalStoreMessages","MessageRepository","useAui","useRef","useEffect","useState","RefObject","useCallback","useMemo","toExportedMessageRepository","toThreadMessages","messages","TMessage","survivingIds","Set","survivors","flatMap","m","message","console","warn","parentId","has","add","id","headId","isAwaitingToolApproval","status","type","reason","isTerminalMessage","undefined","encodeContent","storageFormatAdapter","item","JSON","stringify","encode","useExternalHistory","runtimeRef","historyAdapter","onSetMessages","loadedRef","itemEpoch","setItemEpoch","aui","optionalThreadListItem","threadListItem","source","hasLoaded","setHasLoaded","historyIds","deferredTelemetryIds","persistedInnerMessages","Map","content","onSetMessagesRef","current","formatAdapter","withFormat","Error","isLoading","loadHistory","repo","load","length","set","getId","converted","thread","import","tempRepo","getMessages","error","pin","remoteId","getState","subscribe","n","threadState","isRunning","runStartRef","persistTimerRef","ReturnType","setTimeout","persistInFlightRef","Promise","resolve","stepBoundariesRef","wasRunningRef","toolCallCountRef","adapter","idleScheduledInnerIds","unpersistedInnerIds","map","innerMessage","filter","innerId","unsubscribe","wasRunning","lastMsg","at","role","currentToolCallCount","p","push","Date","now","clearTimeout","pending","every","persistSettled","initialThreadState","ignoreRunning","latest","boundaries","durationMs","lastAssistant","findLast","tcCount","totalSteps","stepDur","i","Math","round","stepTimestamps","endMs","start_ms","end_ms","telemetryOptions","then","lastInnerMessageId","getLastInnerId","msgs","toBatchItems","msg","idx","innerMessages","isTerminal","isAwaitingToolCalls","isReady","update","batchItems","persisted","get","append","delete","reportTelemetry","catch","deleteMessage","messageId","deleteMessages","bind","messageIndex","findIndex","previousInnerMessages","slice","itemsToDelete","deletion"],"sources":["../../src/runtime/useExternalHistory.ts"],"sourcesContent":["\"use client\";\n\nimport type {\n AssistantRuntime,\n ThreadHistoryAdapter,\n ThreadMessage,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n ExportedMessageRepository,\n} from \"@assistant-ui/core\";\nimport { getExternalStoreMessages } from \"@assistant-ui/core\";\nimport { MessageRepository } from \"@assistant-ui/core/internal\";\nimport { useAui } from \"@assistant-ui/store\";\nimport {\n useRef,\n useEffect,\n useState,\n type RefObject,\n useCallback,\n useMemo,\n} from \"react\";\n\nexport const toExportedMessageRepository = <TMessage>(\n toThreadMessages: (messages: TMessage[]) => ThreadMessage[],\n messages: MessageFormatRepository<TMessage>,\n): ExportedMessageRepository => {\n const survivingIds = new Set<string>();\n const survivors = messages.messages.flatMap((m) => {\n const message = toThreadMessages([m.message])[0];\n if (!message) {\n console.warn(\"Skipping a stored message that could not be loaded.\");\n return [];\n }\n if (m.parentId && !survivingIds.has(m.parentId)) return [];\n survivingIds.add(message.id);\n return [{ ...m, message }];\n });\n\n return {\n headId:\n messages.headId && survivingIds.has(messages.headId)\n ? messages.headId\n : null,\n messages: survivors,\n };\n};\n\nconst isAwaitingToolApproval = (message: ThreadMessage) =>\n message.status?.type === \"requires-action\" &&\n message.status.reason === \"tool-calls\";\n\nconst isTerminalMessage = (message: ThreadMessage) =>\n message.status === undefined ||\n message.status.type === \"complete\" ||\n message.status.type === \"incomplete\";\n\nconst encodeContent = <TMessage>(\n storageFormatAdapter: MessageFormatAdapter<TMessage, any>,\n item: MessageFormatItem<TMessage>,\n) => JSON.stringify(storageFormatAdapter.encode(item));\n\nexport const useExternalHistory = <TMessage>(\n runtimeRef: RefObject<AssistantRuntime>,\n historyAdapter: ThreadHistoryAdapter | undefined,\n toThreadMessages: (messages: TMessage[]) => ThreadMessage[],\n storageFormatAdapter: MessageFormatAdapter<TMessage, any>,\n onSetMessages: (messages: TMessage[]) => void,\n) => {\n const loadedRef = useRef(false);\n const [itemEpoch, setItemEpoch] = useState(0);\n\n const aui = useAui();\n const optionalThreadListItem = useCallback(\n () => (aui.threadListItem.source ? aui.threadListItem : null),\n [aui],\n );\n\n const [hasLoaded, setHasLoaded] = useState(false);\n\n const historyIds = useRef(new Set<string>());\n const deferredTelemetryIds = useRef(new Set<string>());\n // `content` is a snapshot taken at write time rather than a re-encode of `source`, because a retained message object can be mutated in place by the runtime that produced it.\n const persistedInnerMessages = useRef(\n new Map<string, { source: TMessage; content: string }>(),\n );\n\n const onSetMessagesRef = useRef(onSetMessages);\n useEffect(() => {\n onSetMessagesRef.current = onSetMessages;\n });\n\n const formatAdapter = useMemo(() => {\n if (!historyAdapter) return undefined;\n if (!historyAdapter.withFormat) {\n throw new Error(\n \"useAISDKRuntime: ThreadHistoryAdapter is missing the required `withFormat` method.\",\n );\n }\n return historyAdapter.withFormat<TMessage, any>(storageFormatAdapter);\n }, [historyAdapter, storageFormatAdapter]);\n\n const isLoading = formatAdapter != null && !hasLoaded;\n\n useEffect(() => {\n if (!formatAdapter || loadedRef.current) return undefined;\n\n const loadHistory = async () => {\n try {\n const repo = await formatAdapter.load();\n if (repo && repo.messages.length > 0) {\n for (const m of repo.messages) {\n persistedInnerMessages.current.set(\n storageFormatAdapter.getId(m.message),\n {\n source: m.message,\n content: encodeContent(storageFormatAdapter, m),\n },\n );\n }\n const converted = toExportedMessageRepository(toThreadMessages, repo);\n runtimeRef.current.thread.import(converted);\n\n const tempRepo = new MessageRepository();\n tempRepo.import(converted);\n const messages = tempRepo.getMessages();\n\n onSetMessagesRef.current(\n messages.flatMap(getExternalStoreMessages<TMessage>),\n );\n\n historyIds.current = new Set();\n for (const m of converted.messages) {\n historyIds.current.add(m.message.id);\n if (isAwaitingToolApproval(m.message)) {\n deferredTelemetryIds.current.add(m.message.id);\n }\n }\n }\n } catch (error) {\n console.error(\"Failed to load message history:\", error);\n } finally {\n setHasLoaded(true);\n }\n };\n\n formatAdapter.pin?.();\n\n const remoteId = optionalThreadListItem()?.getState().remoteId;\n if (!remoteId) {\n // History loads asynchronously against the thread list item; without a\n // remote id there is nothing to await, so the flag settles here.\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setHasLoaded(true);\n return aui.subscribe(() => {\n if (optionalThreadListItem()?.getState().remoteId) {\n setItemEpoch((n) => n + 1);\n }\n });\n }\n\n const threadState = runtimeRef.current.thread.getState();\n if (threadState.isRunning || threadState.messages.length > 0) {\n loadedRef.current = true;\n setHasLoaded(true);\n return undefined;\n }\n\n loadedRef.current = true;\n void loadHistory();\n return undefined;\n }, [\n formatAdapter,\n toThreadMessages,\n runtimeRef,\n optionalThreadListItem,\n aui,\n itemEpoch,\n storageFormatAdapter,\n ]);\n\n const runStartRef = useRef<number | null>(null);\n const persistTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const persistInFlightRef = useRef<Promise<void>>(Promise.resolve());\n const stepBoundariesRef = useRef<number[]>([]);\n const wasRunningRef = useRef(false);\n const toolCallCountRef = useRef(0);\n\n useEffect(() => {\n if (!formatAdapter) return;\n const adapter = formatAdapter;\n\n const idleScheduledInnerIds = new Set<string>();\n const unpersistedInnerIds = (message: ThreadMessage) =>\n isTerminalMessage(message)\n ? getExternalStoreMessages<TMessage>(message)\n .map((innerMessage) => storageFormatAdapter.getId(innerMessage))\n .filter((innerId) => !persistedInnerMessages.current.has(innerId))\n : [];\n\n const unsubscribe = runtimeRef.current.thread.subscribe(() => {\n const threadState = runtimeRef.current.thread.getState();\n const { isRunning } = threadState;\n const wasRunning = wasRunningRef.current;\n wasRunningRef.current = isRunning;\n\n // Track step boundaries by content changes (more reliable than isRunning)\n if (runStartRef.current != null) {\n const lastMsg = threadState.messages.at(-1);\n if (lastMsg?.role === \"assistant\") {\n const currentToolCallCount = lastMsg.content.filter(\n (p) => p.type === \"tool-call\",\n ).length;\n while (toolCallCountRef.current < currentToolCallCount) {\n stepBoundariesRef.current.push(Date.now() - runStartRef.current);\n toolCallCountRef.current++;\n }\n }\n }\n\n if (isRunning) {\n if (runStartRef.current == null) {\n runStartRef.current = Date.now();\n stepBoundariesRef.current = [];\n toolCallCountRef.current = 0;\n adapter.pin?.();\n }\n // Cancel any pending persist — isRunning went back to true\n if (persistTimerRef.current) {\n clearTimeout(persistTimerRef.current);\n persistTimerRef.current = null;\n }\n return;\n }\n\n if (wasRunning) {\n // Record step boundary offset (synchronous for accuracy)\n if (runStartRef.current != null) {\n stepBoundariesRef.current.push(Date.now() - runStartRef.current);\n }\n } else {\n const pending = threadState.messages.flatMap(unpersistedInnerIds);\n if (pending.every((innerId) => idleScheduledInnerIds.has(innerId)))\n return;\n for (const innerId of pending) idleScheduledInnerIds.add(innerId);\n }\n\n // Debounce: wait one macrotask so agentic step flickers are absorbed\n if (persistTimerRef.current) clearTimeout(persistTimerRef.current);\n persistTimerRef.current = setTimeout(() => {\n persistSettled(false);\n }, 0);\n });\n\n const initialThreadState = runtimeRef.current.thread.getState();\n wasRunningRef.current = initialThreadState.isRunning;\n if (initialThreadState.isRunning) {\n if (runStartRef.current == null) {\n runStartRef.current = Date.now();\n stepBoundariesRef.current = [];\n toolCallCountRef.current = 0;\n adapter.pin?.();\n }\n } else if (initialThreadState.messages.length > 0) {\n persistSettled(true);\n }\n\n function persistSettled(ignoreRunning: boolean) {\n persistTimerRef.current = null;\n const latest = runtimeRef.current.thread.getState();\n if (!ignoreRunning && latest.isRunning) return;\n\n const boundaries = stepBoundariesRef.current;\n const durationMs = boundaries.length > 0 ? boundaries.at(-1) : undefined;\n\n // Fallback: if only 1 boundary but message has multiple steps, distribute evenly\n if (boundaries.length === 1 && durationMs != null) {\n const lastAssistant = latest.messages.findLast(\n (m) => m.role === \"assistant\",\n );\n if (lastAssistant) {\n const tcCount = lastAssistant.content.filter(\n (p) => p.type === \"tool-call\",\n ).length;\n if (tcCount > 0) {\n const totalSteps = tcCount + 1;\n const stepDur = durationMs / totalSteps;\n boundaries.length = 0;\n for (let i = 0; i < totalSteps; i++) {\n boundaries.push(Math.round((i + 1) * stepDur));\n }\n }\n }\n }\n\n // Build per-step timestamps when there are multiple steps\n const stepTimestamps =\n boundaries.length > 1\n ? boundaries.map((endMs, i) => ({\n start_ms: i === 0 ? 0 : boundaries[i - 1]!,\n end_ms: endMs,\n }))\n : undefined;\n\n runStartRef.current = null;\n stepBoundariesRef.current = [];\n\n const telemetryOptions = {\n ...(durationMs != null ? { durationMs } : undefined),\n ...(stepTimestamps != null ? { stepTimestamps } : undefined),\n };\n\n persistInFlightRef.current = persistInFlightRef.current\n .then(async () => {\n const { messages } = latest;\n let lastInnerMessageId: string | null = null;\n\n const getLastInnerId = (msgs: TMessage[]): string | null =>\n msgs.length > 0 ? storageFormatAdapter.getId(msgs.at(-1)!) : null;\n\n const toBatchItems = (msgs: TMessage[]) =>\n msgs.map((msg, idx) => ({\n parentId:\n idx === 0\n ? lastInnerMessageId\n : storageFormatAdapter.getId(msgs[idx - 1]!),\n message: msg,\n }));\n\n for (const message of messages) {\n const innerMessages = getExternalStoreMessages<TMessage>(message);\n\n const isTerminal = isTerminalMessage(message);\n const isAwaitingToolCalls = isAwaitingToolApproval(message);\n // A paused message's later content can only reach storage via update, so it is persisted early only when the adapter supports update.\n const isReady =\n isTerminal ||\n (isAwaitingToolCalls && adapter.update !== undefined);\n\n if (!isReady) {\n lastInnerMessageId =\n getLastInnerId(innerMessages) ?? lastInnerMessageId;\n continue;\n }\n\n if (!historyIds.current.has(message.id)) {\n historyIds.current.add(message.id);\n deferredTelemetryIds.current.add(message.id);\n }\n\n const batchItems = toBatchItems(innerMessages);\n for (const item of batchItems) {\n const innerId = storageFormatAdapter.getId(item.message);\n const persisted = persistedInnerMessages.current.get(innerId);\n if (!persisted) {\n await adapter.append(item);\n persistedInnerMessages.current.set(innerId, {\n source: item.message,\n content: encodeContent(storageFormatAdapter, item),\n });\n } else if (\n persisted.source !== item.message &&\n durationMs !== undefined &&\n adapter.update\n ) {\n const content = encodeContent(storageFormatAdapter, item);\n if (content === persisted.content) {\n persisted.source = item.message;\n } else {\n try {\n await adapter.update(item, innerId);\n persistedInnerMessages.current.set(innerId, {\n source: item.message,\n content,\n });\n } catch {\n // A failed update leaves the stale baseline behind so the next run stop retries it.\n }\n }\n }\n }\n\n lastInnerMessageId =\n getLastInnerId(innerMessages) ?? lastInnerMessageId;\n\n if (deferredTelemetryIds.current.has(message.id) && isTerminal) {\n deferredTelemetryIds.current.delete(message.id);\n adapter.reportTelemetry?.(batchItems, {\n ...telemetryOptions,\n message,\n });\n }\n }\n })\n .catch((error) => {\n console.error(\"Failed to persist message history:\", error);\n });\n }\n\n return () => {\n unsubscribe();\n if (persistTimerRef.current) {\n clearTimeout(persistTimerRef.current);\n persistTimerRef.current = null;\n persistSettled(false);\n }\n };\n }, [formatAdapter, storageFormatAdapter, runtimeRef]);\n\n const deleteMessage = useCallback(\n async (messageId: string) => {\n const deleteMessages = formatAdapter?.delete?.bind(formatAdapter);\n if (!deleteMessages) return;\n\n const messages = runtimeRef.current.thread.getState().messages;\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) return;\n\n const previousInnerMessages = messages\n .slice(0, messageIndex)\n .flatMap(getExternalStoreMessages<TMessage>);\n let parentId = previousInnerMessages.at(-1)\n ? storageFormatAdapter.getId(previousInnerMessages.at(-1)!)\n : null;\n const itemsToDelete = getExternalStoreMessages<TMessage>(\n messages[messageIndex]!,\n ).map((message) => {\n const item = { parentId, message };\n parentId = storageFormatAdapter.getId(message);\n return item;\n });\n\n const deletion = persistInFlightRef.current.then(async () => {\n await deleteMessages(itemsToDelete);\n\n historyIds.current.delete(messageId);\n deferredTelemetryIds.current.delete(messageId);\n for (const item of itemsToDelete) {\n persistedInnerMessages.current.delete(\n storageFormatAdapter.getId(item.message),\n );\n }\n });\n\n persistInFlightRef.current = deletion.catch(() => {});\n await deletion;\n },\n [formatAdapter, runtimeRef, storageFormatAdapter],\n );\n\n return { isLoading, deleteMessage };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useExternalHistory.js","names":["AssistantRuntime","ThreadHistoryAdapter","ThreadMessage","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","ExportedMessageRepository","RespondToToolApprovalOptions","Unstable_ToolInteractionLog","getExternalStoreMessages","MessageRepository","readToolInteractionLog","useAui","useRef","useEffect","useState","RefObject","useCallback","useMemo","toExportedMessageRepository","toThreadMessages","messages","TMessage","survivingIds","Set","survivors","flatMap","m","message","console","warn","parentId","has","add","id","headId","hasUnansweredApproval","content","some","part","type","approval","approved","undefined","resolution","isAwaitingToolApproval","status","reason","isTerminalMessage","TOOL_ARTIFACTS_METADATA_KEY","TOOL_INTERACTIONS_METADATA_KEY","TOOL_APPROVAL_RESPONSES_METADATA_KEY","StoredToolApprovalResponse","Omit","isRecord","value","Record","Array","isArray","collectToolArtifacts","toolArtifacts","ReadonlyMap","entries","artifact","get","toolCallId","const","length","Object","fromEntries","collectToolInteractions","toolInteractions","interactions","collectToolApprovalResponses","toolApprovalResponses","response","optionId","text","addToolData","parts","toolCallIds","artifacts","hasOwn","approvalIds","approvalId","approvalResponses","hasArtifacts","keys","hasInteractions","hasApprovalResponses","metadata","restoreToolData","Map","set","log","_","__","___","restMetadata","_metadata","restMessage","encodeContent","storageFormatAdapter","item","JSON","stringify","encode","useExternalHistory","runtimeRef","historyAdapter","onSetMessages","onToolArtifactsRestored","onToolInteractionsRestored","onToolApprovalResponsesRestored","loadedRef","itemEpoch","setItemEpoch","aui","optionalThreadListItem","threadListItem","source","hasLoaded","setHasLoaded","historyIds","deferredTelemetryIds","persistedInnerMessages","onSetMessagesRef","current","formatAdapter","withFormat","Error","isLoading","loadHistory","repo","load","clear","restoredMessages","map","restoredRepo","index","getId","converted","thread","import","tempRepo","getMessages","error","pin","remoteId","getState","subscribe","n","threadState","isRunning","runStartRef","persistTimerRef","ReturnType","setTimeout","persistInFlightRef","Promise","resolve","stepBoundariesRef","wasRunningRef","toolCallCountRef","persistToolInteractions","messageId","persistence","then","update","find","innerMessage","previousMessages","slice","indexOf","at","storedToolArtifacts","storedToolInteractions","storedToolApprovalResponses","innerId","persisted","catch","adapter","idleScheduledInnerIds","unpersistedInnerIds","filter","unsubscribe","wasRunning","lastMsg","role","currentToolCallCount","p","push","Date","now","clearTimeout","pending","every","persistSettled","initialThreadState","ignoreRunning","latest","boundaries","durationMs","lastAssistant","findLast","tcCount","totalSteps","stepDur","i","Math","round","stepTimestamps","endMs","start_ms","end_ms","telemetryOptions","lastInnerMessageId","getLastInnerId","msgs","toBatchItems","msg","idx","innerMessages","isTerminal","isAwaitingToolCalls","isReady","batchItems","append","delete","reportTelemetry","deleteMessage","deleteMessages","bind","messageIndex","findIndex","previousInnerMessages","itemsToDelete","deletion","persistToolApprovalResponses"],"sources":["../../src/runtime/useExternalHistory.ts"],"sourcesContent":["\"use client\";\n\nimport type {\n AssistantRuntime,\n ThreadHistoryAdapter,\n ThreadMessage,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n ExportedMessageRepository,\n RespondToToolApprovalOptions,\n Unstable_ToolInteractionLog,\n} from \"@assistant-ui/core\";\nimport { getExternalStoreMessages } from \"@assistant-ui/core\";\nimport {\n MessageRepository,\n readToolInteractionLog,\n} from \"@assistant-ui/core/internal\";\nimport { useAui } from \"@assistant-ui/store\";\nimport {\n useRef,\n useEffect,\n useState,\n type RefObject,\n useCallback,\n useMemo,\n} from \"react\";\n\nexport const toExportedMessageRepository = <TMessage>(\n toThreadMessages: (messages: TMessage[]) => ThreadMessage[],\n messages: MessageFormatRepository<TMessage>,\n): ExportedMessageRepository => {\n const survivingIds = new Set<string>();\n const survivors = messages.messages.flatMap((m) => {\n const message = toThreadMessages([m.message])[0];\n if (!message) {\n console.warn(\"Skipping a stored message that could not be loaded.\");\n return [];\n }\n if (m.parentId && !survivingIds.has(m.parentId)) return [];\n survivingIds.add(message.id);\n return [{ ...m, message }];\n });\n\n return {\n headId:\n messages.headId && survivingIds.has(messages.headId)\n ? messages.headId\n : null,\n messages: survivors,\n };\n};\n\nconst hasUnansweredApproval = (message: ThreadMessage) =>\n message.content.some(\n (part) =>\n part.type === \"tool-call\" &&\n part.approval != null &&\n part.approval.approved === undefined &&\n part.approval.resolution === undefined,\n );\n\n// Core reports a run paused on an unanswered approval as an interrupt, not as tool calls.\nconst isAwaitingToolApproval = (message: ThreadMessage) =>\n message.status?.type === \"requires-action\" &&\n (message.status.reason === \"tool-calls\" ||\n (message.status.reason === \"interrupt\" && hasUnansweredApproval(message)));\n\nconst isTerminalMessage = (message: ThreadMessage) =>\n message.status === undefined ||\n message.status.type === \"complete\" ||\n message.status.type === \"incomplete\";\n\nconst TOOL_ARTIFACTS_METADATA_KEY = \"__aui_toolArtifacts\";\nconst TOOL_INTERACTIONS_METADATA_KEY = \"__aui_toolInteractions\";\nconst TOOL_APPROVAL_RESPONSES_METADATA_KEY = \"__aui_toolApprovalResponses\";\n\ntype StoredToolApprovalResponse = Omit<\n RespondToToolApprovalOptions,\n \"approvalId\"\n>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nconst collectToolArtifacts = (\n message: ThreadMessage,\n toolArtifacts: ReadonlyMap<string, unknown> | undefined,\n) => {\n if (!toolArtifacts) return undefined;\n const entries = message.content.flatMap((part) => {\n if (part.type !== \"tool-call\") return [];\n const artifact = toolArtifacts.get(part.toolCallId);\n return artifact === undefined ? [] : [[part.toolCallId, artifact] as const];\n });\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nconst collectToolInteractions = (\n message: ThreadMessage,\n toolInteractions:\n | ReadonlyMap<string, Unstable_ToolInteractionLog>\n | undefined,\n) => {\n if (!toolInteractions) return undefined;\n const entries = message.content.flatMap((part) => {\n if (part.type !== \"tool-call\") return [];\n const interactions = toolInteractions.get(part.toolCallId);\n return interactions === undefined\n ? []\n : [[part.toolCallId, interactions] as const];\n });\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nconst collectToolApprovalResponses = (\n message: ThreadMessage,\n toolApprovalResponses:\n | ReadonlyMap<string, RespondToToolApprovalOptions>\n | undefined,\n) => {\n if (!toolApprovalResponses) return undefined;\n const entries = message.content.flatMap((part) => {\n if (part.type !== \"tool-call\" || !part.approval) return [];\n const response = toolApprovalResponses.get(part.approval.id);\n if (!response) return [];\n return [\n [\n part.approval.id,\n {\n approved: response.approved,\n ...(response.optionId != null && { optionId: response.optionId }),\n ...(response.text != null && { text: response.text }),\n ...(response.reason != null && { reason: response.reason }),\n },\n ] as const,\n ];\n });\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nconst addToolData = <TMessage>(\n message: TMessage,\n toolArtifacts: Record<string, unknown> | undefined,\n toolInteractions: Record<string, Unstable_ToolInteractionLog> | undefined,\n toolApprovalResponses: Record<string, StoredToolApprovalResponse> | undefined,\n): TMessage => {\n if (\n (!toolArtifacts && !toolInteractions && !toolApprovalResponses) ||\n !isRecord(message) ||\n !Array.isArray(message.parts)\n )\n return message;\n const toolCallIds = message.parts.flatMap((part) => {\n if (!isRecord(part) || typeof part.toolCallId !== \"string\") return [];\n return [part.toolCallId];\n });\n const artifacts = toolArtifacts\n ? Object.fromEntries(\n toolCallIds.flatMap((toolCallId) =>\n Object.hasOwn(toolArtifacts, toolCallId)\n ? [[toolCallId, toolArtifacts[toolCallId]] as const]\n : [],\n ),\n )\n : undefined;\n const interactions = toolInteractions\n ? Object.fromEntries(\n toolCallIds.flatMap((toolCallId) =>\n Object.hasOwn(toolInteractions, toolCallId)\n ? [[toolCallId, toolInteractions[toolCallId]] as const]\n : [],\n ),\n )\n : undefined;\n const approvalIds = message.parts.flatMap((part) => {\n if (!isRecord(part) || !isRecord(part.approval)) return [];\n const approvalId = part.approval.id;\n return typeof approvalId === \"string\" ? [approvalId] : [];\n });\n const approvalResponses = toolApprovalResponses\n ? Object.fromEntries(\n approvalIds.flatMap((approvalId) =>\n Object.hasOwn(toolApprovalResponses, approvalId)\n ? [[approvalId, toolApprovalResponses[approvalId]] as const]\n : [],\n ),\n )\n : undefined;\n const hasArtifacts = !!artifacts && Object.keys(artifacts).length > 0;\n const hasInteractions =\n !!interactions && Object.keys(interactions).length > 0;\n const hasApprovalResponses =\n !!approvalResponses && Object.keys(approvalResponses).length > 0;\n if (!hasArtifacts && !hasInteractions && !hasApprovalResponses)\n return message;\n const metadata = isRecord(message.metadata) ? message.metadata : {};\n return {\n ...message,\n metadata: {\n ...metadata,\n ...(hasArtifacts && { [TOOL_ARTIFACTS_METADATA_KEY]: artifacts }),\n ...(hasInteractions && {\n [TOOL_INTERACTIONS_METADATA_KEY]: interactions,\n }),\n ...(hasApprovalResponses && {\n [TOOL_APPROVAL_RESPONSES_METADATA_KEY]: approvalResponses,\n }),\n },\n } as TMessage;\n};\n\nconst restoreToolData = <TMessage>(\n message: TMessage,\n toolArtifacts: Map<string, unknown> | undefined,\n toolInteractions: Map<string, Unstable_ToolInteractionLog> | undefined,\n toolApprovalResponses: Map<string, RespondToToolApprovalOptions> | undefined,\n): TMessage => {\n if (!isRecord(message) || !isRecord(message.metadata)) return message;\n const metadata = message.metadata;\n const hasArtifacts = Object.hasOwn(metadata, TOOL_ARTIFACTS_METADATA_KEY);\n const hasInteractions = Object.hasOwn(\n metadata,\n TOOL_INTERACTIONS_METADATA_KEY,\n );\n const hasApprovalResponses = Object.hasOwn(\n metadata,\n TOOL_APPROVAL_RESPONSES_METADATA_KEY,\n );\n if (!hasArtifacts && !hasInteractions && !hasApprovalResponses)\n return message;\n const artifacts = metadata[TOOL_ARTIFACTS_METADATA_KEY];\n if (toolArtifacts && isRecord(artifacts)) {\n for (const [toolCallId, artifact] of Object.entries(artifacts)) {\n toolArtifacts.set(toolCallId, artifact);\n }\n }\n const interactions = metadata[TOOL_INTERACTIONS_METADATA_KEY];\n if (toolInteractions && isRecord(interactions)) {\n for (const [toolCallId, value] of Object.entries(interactions)) {\n const log = readToolInteractionLog(value);\n if (log) toolInteractions.set(toolCallId, log);\n }\n }\n const approvalResponses = metadata[TOOL_APPROVAL_RESPONSES_METADATA_KEY];\n if (toolApprovalResponses && isRecord(approvalResponses)) {\n for (const [approvalId, value] of Object.entries(approvalResponses)) {\n if (!isRecord(value) || typeof value.approved !== \"boolean\") continue;\n toolApprovalResponses.set(approvalId, {\n approvalId,\n approved: value.approved,\n ...(typeof value.optionId === \"string\" && {\n optionId: value.optionId,\n }),\n ...(typeof value.text === \"string\" && { text: value.text }),\n ...(typeof value.reason === \"string\" && { reason: value.reason }),\n });\n }\n }\n const {\n [TOOL_ARTIFACTS_METADATA_KEY]: _,\n [TOOL_INTERACTIONS_METADATA_KEY]: __,\n [TOOL_APPROVAL_RESPONSES_METADATA_KEY]: ___,\n ...restMetadata\n } = metadata;\n const { metadata: _metadata, ...restMessage } = message;\n return (\n Object.keys(restMetadata).length === 0\n ? restMessage\n : { ...restMessage, metadata: restMetadata }\n ) as TMessage;\n};\n\nconst encodeContent = <TMessage>(\n storageFormatAdapter: MessageFormatAdapter<TMessage, any>,\n item: MessageFormatItem<TMessage>,\n) => JSON.stringify(storageFormatAdapter.encode(item));\n\nexport const useExternalHistory = <TMessage>(\n runtimeRef: RefObject<AssistantRuntime>,\n historyAdapter: ThreadHistoryAdapter | undefined,\n toThreadMessages: (messages: TMessage[]) => ThreadMessage[],\n storageFormatAdapter: MessageFormatAdapter<TMessage, any>,\n onSetMessages: (messages: TMessage[]) => void,\n toolArtifacts?: Map<string, unknown>,\n onToolArtifactsRestored?: () => void,\n toolInteractions?: Map<string, Unstable_ToolInteractionLog>,\n onToolInteractionsRestored?: () => void,\n toolApprovalResponses?: Map<string, RespondToToolApprovalOptions>,\n onToolApprovalResponsesRestored?: () => void,\n) => {\n const loadedRef = useRef(false);\n const [itemEpoch, setItemEpoch] = useState(0);\n\n const aui = useAui();\n const optionalThreadListItem = useCallback(\n () => (aui.threadListItem.source ? aui.threadListItem : null),\n [aui],\n );\n\n const [hasLoaded, setHasLoaded] = useState(false);\n\n const historyIds = useRef(new Set<string>());\n const deferredTelemetryIds = useRef(new Set<string>());\n // `content` is a snapshot taken at write time rather than a re-encode of `source`, because a retained message object can be mutated in place by the runtime that produced it.\n const persistedInnerMessages = useRef(\n new Map<string, { source: TMessage; content: string }>(),\n );\n\n const onSetMessagesRef = useRef(onSetMessages);\n useEffect(() => {\n onSetMessagesRef.current = onSetMessages;\n });\n\n const formatAdapter = useMemo(() => {\n if (!historyAdapter) return undefined;\n if (!historyAdapter.withFormat) {\n throw new Error(\n \"useAISDKRuntime: ThreadHistoryAdapter is missing the required `withFormat` method.\",\n );\n }\n return historyAdapter.withFormat<TMessage, any>(storageFormatAdapter);\n }, [historyAdapter, storageFormatAdapter]);\n\n const isLoading = formatAdapter != null && !hasLoaded;\n\n useEffect(() => {\n if (!formatAdapter || loadedRef.current) return undefined;\n\n const loadHistory = async () => {\n try {\n const repo = await formatAdapter.load();\n toolArtifacts?.clear();\n toolInteractions?.clear();\n toolApprovalResponses?.clear();\n const restoredMessages =\n repo?.messages.map((item) => ({\n ...item,\n message: restoreToolData(\n item.message,\n toolArtifacts,\n toolInteractions,\n toolApprovalResponses,\n ),\n })) ?? [];\n onToolArtifactsRestored?.();\n onToolInteractionsRestored?.();\n onToolApprovalResponsesRestored?.();\n if (repo && restoredMessages.length > 0) {\n const restoredRepo = { ...repo, messages: restoredMessages };\n for (const [index, m] of repo.messages.entries()) {\n persistedInnerMessages.current.set(\n storageFormatAdapter.getId(m.message),\n {\n source: restoredMessages[index]!.message,\n content: encodeContent(storageFormatAdapter, m),\n },\n );\n }\n const converted = toExportedMessageRepository(\n toThreadMessages,\n restoredRepo,\n );\n runtimeRef.current.thread.import(converted);\n\n const tempRepo = new MessageRepository();\n tempRepo.import(converted);\n const messages = tempRepo.getMessages();\n\n onSetMessagesRef.current(\n messages.flatMap(getExternalStoreMessages<TMessage>),\n );\n\n historyIds.current = new Set();\n for (const m of converted.messages) {\n historyIds.current.add(m.message.id);\n if (isAwaitingToolApproval(m.message)) {\n deferredTelemetryIds.current.add(m.message.id);\n }\n }\n }\n } catch (error) {\n console.error(\"Failed to load message history:\", error);\n } finally {\n setHasLoaded(true);\n }\n };\n\n formatAdapter.pin?.();\n\n const remoteId = optionalThreadListItem()?.getState().remoteId;\n if (!remoteId) {\n // History loads asynchronously against the thread list item; without a\n // remote id there is nothing to await, so the flag settles here.\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setHasLoaded(true);\n return aui.subscribe(() => {\n if (optionalThreadListItem()?.getState().remoteId) {\n setItemEpoch((n) => n + 1);\n }\n });\n }\n\n const threadState = runtimeRef.current.thread.getState();\n if (threadState.isRunning || threadState.messages.length > 0) {\n loadedRef.current = true;\n setHasLoaded(true);\n return undefined;\n }\n\n loadedRef.current = true;\n void loadHistory();\n return undefined;\n }, [\n formatAdapter,\n toThreadMessages,\n runtimeRef,\n optionalThreadListItem,\n aui,\n itemEpoch,\n storageFormatAdapter,\n toolArtifacts,\n onToolArtifactsRestored,\n toolInteractions,\n onToolInteractionsRestored,\n toolApprovalResponses,\n onToolApprovalResponsesRestored,\n ]);\n\n const runStartRef = useRef<number | null>(null);\n const persistTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const persistInFlightRef = useRef<Promise<void>>(Promise.resolve());\n const stepBoundariesRef = useRef<number[]>([]);\n const wasRunningRef = useRef(false);\n const toolCallCountRef = useRef(0);\n\n const persistToolInteractions = useCallback(\n (messageId: string) => {\n const persistence = persistInFlightRef.current.then(async () => {\n if (!formatAdapter?.update) return;\n const messages = runtimeRef.current.thread.getState().messages;\n const message = messages.find(\n (item) =>\n item.id === messageId ||\n getExternalStoreMessages<TMessage>(item).some(\n (innerMessage) =>\n storageFormatAdapter.getId(innerMessage) === messageId,\n ),\n );\n if (!message) return;\n\n const previousMessages = messages\n .slice(0, messages.indexOf(message))\n .flatMap(getExternalStoreMessages<TMessage>);\n let parentId = previousMessages.at(-1)\n ? storageFormatAdapter.getId(previousMessages.at(-1)!)\n : null;\n const storedToolArtifacts = collectToolArtifacts(\n message,\n toolArtifacts,\n );\n const storedToolInteractions = collectToolInteractions(\n message,\n toolInteractions,\n );\n const storedToolApprovalResponses = collectToolApprovalResponses(\n message,\n toolApprovalResponses,\n );\n\n for (const innerMessage of getExternalStoreMessages<TMessage>(\n message,\n )) {\n const item = {\n parentId,\n message: addToolData(\n innerMessage,\n storedToolArtifacts,\n storedToolInteractions,\n storedToolApprovalResponses,\n ),\n };\n const innerId = storageFormatAdapter.getId(item.message);\n const persisted = persistedInnerMessages.current.get(innerId);\n if (persisted) {\n const content = encodeContent(storageFormatAdapter, item);\n if (content === persisted.content) {\n persisted.source = item.message;\n } else {\n await formatAdapter.update(item, innerId);\n persistedInnerMessages.current.set(innerId, {\n source: item.message,\n content,\n });\n }\n }\n parentId = innerId;\n }\n });\n persistInFlightRef.current = persistence.catch(() => {});\n return persistence.catch((error) => {\n console.error(\"Failed to persist tool data:\", error);\n });\n },\n [\n formatAdapter,\n runtimeRef,\n storageFormatAdapter,\n toolArtifacts,\n toolInteractions,\n toolApprovalResponses,\n ],\n );\n\n useEffect(() => {\n if (!formatAdapter) return;\n const adapter = formatAdapter;\n\n const idleScheduledInnerIds = new Set<string>();\n const unpersistedInnerIds = (message: ThreadMessage) =>\n isTerminalMessage(message)\n ? getExternalStoreMessages<TMessage>(message)\n .map((innerMessage) => storageFormatAdapter.getId(innerMessage))\n .filter((innerId) => !persistedInnerMessages.current.has(innerId))\n : [];\n\n const unsubscribe = runtimeRef.current.thread.subscribe(() => {\n const threadState = runtimeRef.current.thread.getState();\n const { isRunning } = threadState;\n const wasRunning = wasRunningRef.current;\n wasRunningRef.current = isRunning;\n\n // Track step boundaries by content changes (more reliable than isRunning)\n if (runStartRef.current != null) {\n const lastMsg = threadState.messages.at(-1);\n if (lastMsg?.role === \"assistant\") {\n const currentToolCallCount = lastMsg.content.filter(\n (p) => p.type === \"tool-call\",\n ).length;\n while (toolCallCountRef.current < currentToolCallCount) {\n stepBoundariesRef.current.push(Date.now() - runStartRef.current);\n toolCallCountRef.current++;\n }\n }\n }\n\n if (isRunning) {\n if (runStartRef.current == null) {\n runStartRef.current = Date.now();\n stepBoundariesRef.current = [];\n toolCallCountRef.current = 0;\n adapter.pin?.();\n }\n // Cancel any pending persist — isRunning went back to true\n if (persistTimerRef.current) {\n clearTimeout(persistTimerRef.current);\n persistTimerRef.current = null;\n }\n return;\n }\n\n if (wasRunning) {\n // Record step boundary offset (synchronous for accuracy)\n if (runStartRef.current != null) {\n stepBoundariesRef.current.push(Date.now() - runStartRef.current);\n }\n } else {\n const pending = threadState.messages.flatMap(unpersistedInnerIds);\n if (pending.every((innerId) => idleScheduledInnerIds.has(innerId)))\n return;\n for (const innerId of pending) idleScheduledInnerIds.add(innerId);\n }\n\n // Debounce: wait one macrotask so agentic step flickers are absorbed\n if (persistTimerRef.current) clearTimeout(persistTimerRef.current);\n persistTimerRef.current = setTimeout(() => {\n persistSettled(false);\n }, 0);\n });\n\n const initialThreadState = runtimeRef.current.thread.getState();\n wasRunningRef.current = initialThreadState.isRunning;\n if (initialThreadState.isRunning) {\n if (runStartRef.current == null) {\n runStartRef.current = Date.now();\n stepBoundariesRef.current = [];\n toolCallCountRef.current = 0;\n adapter.pin?.();\n }\n } else if (initialThreadState.messages.length > 0) {\n persistSettled(true);\n }\n\n function persistSettled(ignoreRunning: boolean) {\n persistTimerRef.current = null;\n const latest = runtimeRef.current.thread.getState();\n if (!ignoreRunning && latest.isRunning) return;\n\n const boundaries = stepBoundariesRef.current;\n const durationMs = boundaries.length > 0 ? boundaries.at(-1) : undefined;\n\n // Fallback: if only 1 boundary but message has multiple steps, distribute evenly\n if (boundaries.length === 1 && durationMs != null) {\n const lastAssistant = latest.messages.findLast(\n (m) => m.role === \"assistant\",\n );\n if (lastAssistant) {\n const tcCount = lastAssistant.content.filter(\n (p) => p.type === \"tool-call\",\n ).length;\n if (tcCount > 0) {\n const totalSteps = tcCount + 1;\n const stepDur = durationMs / totalSteps;\n boundaries.length = 0;\n for (let i = 0; i < totalSteps; i++) {\n boundaries.push(Math.round((i + 1) * stepDur));\n }\n }\n }\n }\n\n // Build per-step timestamps when there are multiple steps\n const stepTimestamps =\n boundaries.length > 1\n ? boundaries.map((endMs, i) => ({\n start_ms: i === 0 ? 0 : boundaries[i - 1]!,\n end_ms: endMs,\n }))\n : undefined;\n\n runStartRef.current = null;\n stepBoundariesRef.current = [];\n\n const telemetryOptions = {\n ...(durationMs != null ? { durationMs } : undefined),\n ...(stepTimestamps != null ? { stepTimestamps } : undefined),\n };\n\n persistInFlightRef.current = persistInFlightRef.current\n .then(async () => {\n const { messages } = latest;\n let lastInnerMessageId: string | null = null;\n\n const getLastInnerId = (msgs: TMessage[]): string | null =>\n msgs.length > 0 ? storageFormatAdapter.getId(msgs.at(-1)!) : null;\n\n const toBatchItems = (\n msgs: TMessage[],\n toolArtifacts: Record<string, unknown> | undefined,\n toolInteractions:\n | Record<string, Unstable_ToolInteractionLog>\n | undefined,\n toolApprovalResponses:\n | Record<string, StoredToolApprovalResponse>\n | undefined,\n ) =>\n msgs.map((msg, idx) => ({\n parentId:\n idx === 0\n ? lastInnerMessageId\n : storageFormatAdapter.getId(msgs[idx - 1]!),\n message: addToolData(\n msg,\n toolArtifacts,\n toolInteractions,\n toolApprovalResponses,\n ),\n }));\n\n for (const message of messages) {\n const innerMessages = getExternalStoreMessages<TMessage>(message);\n\n const isTerminal = isTerminalMessage(message);\n const isAwaitingToolCalls = isAwaitingToolApproval(message);\n // A paused message's later content can only reach storage via update, so it is persisted early only when the adapter supports update.\n const isReady =\n isTerminal ||\n (isAwaitingToolCalls && adapter.update !== undefined);\n\n if (!isReady) {\n lastInnerMessageId =\n getLastInnerId(innerMessages) ?? lastInnerMessageId;\n continue;\n }\n\n if (!historyIds.current.has(message.id)) {\n historyIds.current.add(message.id);\n deferredTelemetryIds.current.add(message.id);\n }\n\n const batchItems = toBatchItems(\n innerMessages,\n collectToolArtifacts(message, toolArtifacts),\n collectToolInteractions(message, toolInteractions),\n collectToolApprovalResponses(message, toolApprovalResponses),\n );\n for (const item of batchItems) {\n const innerId = storageFormatAdapter.getId(item.message);\n const persisted = persistedInnerMessages.current.get(innerId);\n if (!persisted) {\n await adapter.append(item);\n persistedInnerMessages.current.set(innerId, {\n source: item.message,\n content: encodeContent(storageFormatAdapter, item),\n });\n } else if (\n persisted.source !== item.message &&\n durationMs !== undefined &&\n adapter.update\n ) {\n const content = encodeContent(storageFormatAdapter, item);\n if (content === persisted.content) {\n persisted.source = item.message;\n } else {\n try {\n await adapter.update(item, innerId);\n persistedInnerMessages.current.set(innerId, {\n source: item.message,\n content,\n });\n } catch {\n // A failed update leaves the stale baseline behind so the next run stop retries it.\n }\n }\n }\n }\n\n lastInnerMessageId =\n getLastInnerId(innerMessages) ?? lastInnerMessageId;\n\n if (deferredTelemetryIds.current.has(message.id) && isTerminal) {\n deferredTelemetryIds.current.delete(message.id);\n adapter.reportTelemetry?.(\n batchItems.map((item, index) => ({\n ...item,\n message: innerMessages[index]!,\n })),\n {\n ...telemetryOptions,\n message,\n },\n );\n }\n }\n })\n .catch((error) => {\n console.error(\"Failed to persist message history:\", error);\n });\n }\n\n return () => {\n unsubscribe();\n if (persistTimerRef.current) {\n clearTimeout(persistTimerRef.current);\n persistTimerRef.current = null;\n persistSettled(false);\n }\n };\n }, [\n formatAdapter,\n storageFormatAdapter,\n runtimeRef,\n toolArtifacts,\n toolInteractions,\n toolApprovalResponses,\n ]);\n\n const deleteMessage = useCallback(\n async (messageId: string) => {\n const deleteMessages = formatAdapter?.delete?.bind(formatAdapter);\n if (!deleteMessages) return;\n\n const messages = runtimeRef.current.thread.getState().messages;\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) return;\n\n const previousInnerMessages = messages\n .slice(0, messageIndex)\n .flatMap(getExternalStoreMessages<TMessage>);\n let parentId = previousInnerMessages.at(-1)\n ? storageFormatAdapter.getId(previousInnerMessages.at(-1)!)\n : null;\n const itemsToDelete = getExternalStoreMessages<TMessage>(\n messages[messageIndex]!,\n ).map((message) => {\n const item = { parentId, message };\n parentId = storageFormatAdapter.getId(message);\n return item;\n });\n\n const deletion = persistInFlightRef.current.then(async () => {\n await deleteMessages(itemsToDelete);\n\n historyIds.current.delete(messageId);\n deferredTelemetryIds.current.delete(messageId);\n for (const item of itemsToDelete) {\n persistedInnerMessages.current.delete(\n storageFormatAdapter.getId(item.message),\n );\n }\n });\n\n persistInFlightRef.current = deletion.catch(() => {});\n await deletion;\n },\n [formatAdapter, runtimeRef, storageFormatAdapter],\n );\n\n return {\n isLoading,\n deleteMessage,\n persistToolInteractions,\n persistToolApprovalResponses: persistToolInteractions,\n };\n};\n"],"mappings":"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"}
@@ -1,4 +1,2 @@
1
- //#region src/runtime/useResourceCleanup.d.ts
2
- export declare const useResourceCleanup: (enabled: boolean, cleanup: () => void) => void;
3
- //#endregion
1
+ export declare const useResourceCleanup: (enabled: boolean, cleanup: () => void, hostDestroySignal?: AbortSignal) => void;
4
2
  //# sourceMappingURL=useResourceCleanup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useResourceCleanup.d.ts","names":[],"sources":["../../src/runtime/useResourceCleanup.ts"],"mappings":";qBAGa,qBAAsB,kBAAkB"}
1
+ {"version":3,"file":"useResourceCleanup.d.ts","sourceRoot":"","sources":["../../src/runtime/useResourceCleanup.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,GAC7B,SAAS,OAAO,EAChB,SAAS,MAAM,IAAI,EACnB,oBAAoB,WAAW,SAmDhC,CAAC"}