@assistant-ui/ai-sdk 0.0.7 → 0.0.8
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/README.md +1 -1
- package/dist/adapters/aiSDKFormatAdapter.d.ts +2 -2
- package/dist/adapters/aiSDKFormatAdapter.d.ts.map +1 -0
- package/dist/adapters/vercelAttachmentAdapter.d.ts +1 -3
- package/dist/adapters/vercelAttachmentAdapter.d.ts.map +1 -1
- package/dist/adapters/vercelAttachmentAdapter.js +3 -3
- package/dist/adapters/vercelAttachmentAdapter.js.map +1 -1
- package/dist/aiSDKExtras.d.ts +4 -6
- package/dist/aiSDKExtras.d.ts.map +1 -1
- package/dist/converters/convertMessage.d.ts +32 -24
- package/dist/converters/convertMessage.d.ts.map +1 -1
- package/dist/converters/convertMessage.js +43 -9
- package/dist/converters/convertMessage.js.map +1 -1
- package/dist/converters/modelContentEnvelope.d.ts +6 -7
- package/dist/converters/modelContentEnvelope.d.ts.map +1 -1
- package/dist/converters/toCreateMessage.d.ts +2 -4
- package/dist/converters/toCreateMessage.d.ts.map +1 -1
- package/dist/converters/toolOutputConversion.d.ts +20 -22
- package/dist/converters/toolOutputConversion.d.ts.map +1 -1
- package/dist/hooks.d.ts +2 -4
- package/dist/hooks.d.ts.map +1 -1
- package/dist/index.d.ts +17 -14
- package/dist/index.d.ts.map +1 -0
- package/dist/index.native.d.ts +15 -12
- package/dist/index.native.d.ts.map +1 -0
- package/dist/model-context/injectInteractableContext.d.ts +2 -4
- package/dist/model-context/injectInteractableContext.d.ts.map +1 -1
- package/dist/model-context/injectQuoteContext.d.ts +1 -3
- package/dist/model-context/injectQuoteContext.d.ts.map +1 -1
- package/dist/runtime/AISDKChat.d.ts +2 -4
- package/dist/runtime/AISDKChat.d.ts.map +1 -1
- package/dist/runtime/AISDKChat.js +1 -1
- package/dist/runtime/AISDKThreads.d.ts +29 -31
- package/dist/runtime/AISDKThreads.d.ts.map +1 -1
- package/dist/runtime/AISDKThreads.js +22 -23
- package/dist/runtime/AISDKThreads.js.map +1 -1
- package/dist/runtime/sdkIdentity.d.ts +1 -3
- package/dist/runtime/sdkIdentity.d.ts.map +1 -1
- package/dist/runtime/sdkIdentity.js +1 -1
- package/dist/runtime/useAISDKRuntime.d.ts +69 -70
- package/dist/runtime/useAISDKRuntime.d.ts.map +1 -1
- package/dist/runtime/useAISDKRuntime.js +112 -56
- package/dist/runtime/useAISDKRuntime.js.map +1 -1
- package/dist/runtime/useChatRuntime.d.ts +6 -8
- package/dist/runtime/useChatRuntime.d.ts.map +1 -1
- package/dist/runtime/useChatRuntime.js +14 -10
- package/dist/runtime/useChatRuntime.js.map +1 -1
- package/dist/runtime/useChatThread.d.ts +94 -89
- package/dist/runtime/useChatThread.d.ts.map +1 -1
- package/dist/runtime/useChatThread.js +4 -5
- package/dist/runtime/useChatThread.js.map +1 -1
- package/dist/runtime/useExternalHistory.d.ts +7 -7
- package/dist/runtime/useExternalHistory.d.ts.map +1 -1
- package/dist/runtime/useExternalHistory.js +229 -59
- package/dist/runtime/useExternalHistory.js.map +1 -1
- package/dist/runtime/useResourceCleanup.d.ts +1 -3
- package/dist/runtime/useResourceCleanup.d.ts.map +1 -1
- package/dist/runtime/useResourceCleanup.js +38 -14
- package/dist/runtime/useResourceCleanup.js.map +1 -1
- package/dist/runtime/useStreamingTiming.d.ts +3 -5
- package/dist/runtime/useStreamingTiming.d.ts.map +1 -1
- package/dist/runtime/useStreamingTiming.js +1 -1
- package/dist/tools/frontendTools.d.ts +21 -23
- package/dist/tools/frontendTools.d.ts.map +1 -1
- package/dist/tools/generativeTools.d.ts +24 -26
- package/dist/tools/generativeTools.d.ts.map +1 -1
- package/dist/tools/mcp-stdio.node.d.ts +2 -2
- package/dist/tools/mcp-stdio.node.d.ts.map +1 -0
- package/dist/tools/mcp-stdio.unsupported.d.ts +2 -4
- package/dist/tools/mcp-stdio.unsupported.d.ts.map +1 -1
- package/dist/transport/AssistantChatTransport.d.ts +14 -16
- package/dist/transport/AssistantChatTransport.d.ts.map +1 -1
- package/dist/transport/resumable.d.ts +25 -27
- package/dist/transport/resumable.d.ts.map +1 -1
- package/dist/usage.d.ts +8 -10
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js.map +1 -1
- package/dist/utils/getVercelAIMessages.d.ts +2 -4
- package/dist/utils/getVercelAIMessages.d.ts.map +1 -1
- package/dist/utils/sliceMessagesUntil.d.ts +1 -3
- package/dist/utils/sliceMessagesUntil.d.ts.map +1 -1
- package/package.json +9 -8
- package/src/adapters/vercelAttachmentAdapter.test.ts +23 -0
- package/src/adapters/vercelAttachmentAdapter.ts +2 -2
- package/src/converters/convertMessage.test.ts +478 -3
- package/src/converters/convertMessage.ts +100 -14
- package/src/index.native.ts +1 -1
- package/src/index.ts +1 -1
- package/src/runtime/AISDKThreads.cloud.test.ts +60 -2
- package/src/runtime/AISDKThreads.test.ts +79 -46
- package/src/runtime/AISDKThreads.ts +1 -1
- package/src/runtime/useAISDKRuntime.approval.integration.test.tsx +51 -0
- package/src/runtime/useAISDKRuntime.approval.test.tsx +225 -9
- package/src/runtime/useAISDKRuntime.test.ts +275 -5
- package/src/runtime/useAISDKRuntime.ts +141 -37
- package/src/runtime/useAISDKRuntime.voice.test.tsx +50 -1
- package/src/runtime/useChatRuntime.integration.test.tsx +56 -0
- package/src/runtime/useChatRuntime.test.ts +5 -1
- package/src/runtime/useChatRuntime.ts +6 -2
- package/src/runtime/useChatThread.transport.test.tsx +149 -0
- package/src/runtime/useChatThread.ts +33 -5
- package/src/runtime/useExternalHistory.test.ts +943 -3
- package/src/runtime/useExternalHistory.ts +366 -14
- package/src/runtime/useResourceCleanup.ts +41 -15
- package/src/usage.ts +1 -1
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
import { sliceMessagesUntil } from "../utils/sliceMessagesUntil.js";
|
|
4
|
-
import { toCreateMessage } from "../converters/toCreateMessage.js";
|
|
2
|
+
import { aiSDKV6FormatAdapter } from "../adapters/aiSDKFormatAdapter.js";
|
|
5
3
|
import { vercelAttachmentAdapter } from "../adapters/vercelAttachmentAdapter.js";
|
|
6
|
-
import {
|
|
4
|
+
import { aiSDKExtras } from "../aiSDKExtras.js";
|
|
7
5
|
import { wrapModelContentEnvelope } from "../converters/modelContentEnvelope.js";
|
|
8
6
|
import { AISDKMessageConverter } from "../converters/convertMessage.js";
|
|
9
|
-
import {
|
|
7
|
+
import { toCreateMessage } from "../converters/toCreateMessage.js";
|
|
8
|
+
import { sliceMessagesUntil } from "../utils/sliceMessagesUntil.js";
|
|
9
|
+
import { getVercelAIMessages } from "../utils/getVercelAIMessages.js";
|
|
10
10
|
import { toExportedMessageRepository, useExternalHistory } from "./useExternalHistory.js";
|
|
11
11
|
import { useStreamingTiming as useStreamingTiming$1 } from "./useStreamingTiming.js";
|
|
12
|
+
import { MessageRepository, appendToolInteraction, consumeSuggestionResult } from "@assistant-ui/core/internal";
|
|
13
|
+
import { generateId, getToolName, isToolUIPart } from "ai";
|
|
12
14
|
import { useExternalStoreRuntime, useRuntimeAdapters } from "@assistant-ui/core/react";
|
|
15
|
+
import { getExternalStoreMessages, pickExternalStoreSharedOptions } from "@assistant-ui/core";
|
|
13
16
|
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
14
17
|
import { useCallback, useEffect, useInsertionEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
|
|
15
|
-
import { generateId, getToolName, isToolUIPart } from "ai";
|
|
16
|
-
import { getExternalStoreMessages, pickExternalStoreSharedOptions } from "@assistant-ui/core";
|
|
17
|
-
import { MessageRepository, consumeSuggestionResult } from "@assistant-ui/core/internal";
|
|
18
18
|
//#region src/runtime/useAISDKRuntime.ts
|
|
19
19
|
const toUIMessage = (createMessage, fallbackRole) => ({
|
|
20
20
|
...createMessage,
|
|
@@ -29,7 +29,7 @@ const toVoiceTranscriptUIMessage = (message) => ({
|
|
|
29
29
|
text: part.text
|
|
30
30
|
})),
|
|
31
31
|
metadata: {
|
|
32
|
-
modality:
|
|
32
|
+
...message.metadata.modality && { modality: message.metadata.modality },
|
|
33
33
|
...Object.keys(message.metadata.custom).length > 0 && { custom: message.metadata.custom }
|
|
34
34
|
}
|
|
35
35
|
});
|
|
@@ -156,11 +156,23 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
156
156
|
const [toolStatuses, setToolStatuses] = useState({});
|
|
157
157
|
const [cancelledMessages, setCancelledMessages] = useState(null);
|
|
158
158
|
const [toolApprovalResponses, setToolApprovalResponses] = useState(NO_TOOL_APPROVAL_RESPONSES);
|
|
159
|
+
const [toolArtifactEpoch, setToolArtifactEpoch] = useState(0);
|
|
160
|
+
const [toolInteractionEpoch, setToolInteractionEpoch] = useState(0);
|
|
159
161
|
const hostApprovalIdsRef = useRef(/* @__PURE__ */ new Set());
|
|
162
|
+
const toolApprovalResponsesRef = useRef(/* @__PURE__ */ new Map());
|
|
160
163
|
const toolArgsKeyOrderCacheRef = useRef(/* @__PURE__ */ new Map());
|
|
161
164
|
const toolLastInputCacheRef = useRef(/* @__PURE__ */ new Map());
|
|
165
|
+
const toolArgsTextCacheRef = useRef(/* @__PURE__ */ new WeakMap());
|
|
162
166
|
const mcpAppMetadataCacheRef = useRef(/* @__PURE__ */ new Map());
|
|
167
|
+
const toolArtifactsRef = useRef(/* @__PURE__ */ new Map());
|
|
168
|
+
const toolInteractionsRef = useRef(/* @__PURE__ */ new Map());
|
|
163
169
|
const lastRunConfigRef = useRef(void 0);
|
|
170
|
+
const markToolArtifactsChanged = useCallback(() => {
|
|
171
|
+
setToolArtifactEpoch((epoch) => epoch + 1);
|
|
172
|
+
}, []);
|
|
173
|
+
const markToolInteractionsChanged = useCallback(() => {
|
|
174
|
+
setToolInteractionEpoch((epoch_0) => epoch_0 + 1);
|
|
175
|
+
}, []);
|
|
164
176
|
const hasExecutingTools = Object.values(toolStatuses).some((s) => s?.type === "executing");
|
|
165
177
|
const providerIsRunning = chatHelpers.status === "submitted" || chatHelpers.status === "streaming";
|
|
166
178
|
const isRunning = providerIsRunning || hasExecutingTools;
|
|
@@ -171,7 +183,12 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
171
183
|
const cancelledMessageIds = cancelledMessages?.chatId === chatHelpers.id ? cancelledMessages.ids : NO_CANCELLED_MESSAGE_IDS;
|
|
172
184
|
const supportsRichToolApprovalResponses = customOnRespondToToolApproval != null;
|
|
173
185
|
const toThreadMessages = useCallback((sourceMessages) => {
|
|
174
|
-
const metadata = {
|
|
186
|
+
const metadata = {
|
|
187
|
+
supportsRichToolApprovalResponses,
|
|
188
|
+
toolArtifacts: toolArtifactsRef.current,
|
|
189
|
+
toolInteractions: toolInteractionsRef.current,
|
|
190
|
+
toolApprovalResponses: toolApprovalResponsesRef.current
|
|
191
|
+
};
|
|
175
192
|
return AISDKMessageConverter.toThreadMessages(sourceMessages, false, metadata);
|
|
176
193
|
}, [supportsRichToolApprovalResponses]);
|
|
177
194
|
const retractCancellation = useCallback((chatId, messageId) => {
|
|
@@ -205,8 +222,11 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
205
222
|
toolStatuses,
|
|
206
223
|
messageTiming,
|
|
207
224
|
toolArgsKeyOrderCache: toolArgsKeyOrderCacheRef.current,
|
|
225
|
+
toolArgsTextCache: toolArgsTextCacheRef.current,
|
|
208
226
|
toolLastInputCache: toolLastInputCacheRef.current,
|
|
209
227
|
mcpAppMetadataCache: mcpAppMetadataCacheRef.current,
|
|
228
|
+
toolArtifacts: toolArtifactsRef.current,
|
|
229
|
+
toolInteractions: toolInteractionsRef.current,
|
|
210
230
|
supportsRichToolApprovalResponses,
|
|
211
231
|
...optimisticMessageId && { optimisticMessageId },
|
|
212
232
|
...chatHelpers.error && { error: toChatError(chatHelpers.error) },
|
|
@@ -219,7 +239,9 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
219
239
|
chatHelpers.error,
|
|
220
240
|
cancelledMessageIds,
|
|
221
241
|
toolApprovalResponses,
|
|
222
|
-
supportsRichToolApprovalResponses
|
|
242
|
+
supportsRichToolApprovalResponses,
|
|
243
|
+
toolArtifactEpoch,
|
|
244
|
+
toolInteractionEpoch
|
|
223
245
|
])
|
|
224
246
|
});
|
|
225
247
|
const exportedMessageRepository = useMemo(() => {
|
|
@@ -231,8 +253,11 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
231
253
|
const [runtimeRef] = useState(() => ({ get current() {
|
|
232
254
|
return runtime;
|
|
233
255
|
} }));
|
|
234
|
-
const { isLoading, deleteMessage: deleteHistoryMessage } = useExternalHistory(runtimeRef, adapters?.history ?? contextAdapters?.history, toThreadMessages, aiSDKV6FormatAdapter, (messages_0) => {
|
|
256
|
+
const { isLoading, deleteMessage: deleteHistoryMessage, persistToolInteractions, persistToolApprovalResponses } = useExternalHistory(runtimeRef, adapters?.history ?? contextAdapters?.history, toThreadMessages, aiSDKV6FormatAdapter, (messages_0) => {
|
|
235
257
|
chatHelpers.setMessages(messages_0);
|
|
258
|
+
}, toolArtifactsRef.current, markToolArtifactsChanged, toolInteractionsRef.current, markToolInteractionsChanged, toolApprovalResponsesRef.current, () => {
|
|
259
|
+
hostApprovalIdsRef.current = new Set(toolApprovalResponsesRef.current.keys());
|
|
260
|
+
setToolApprovalResponses(new Map(toolApprovalResponsesRef.current));
|
|
236
261
|
});
|
|
237
262
|
const { id: chatId_0, messages: chatMessages, status: chatStatus, error } = chatHelpers;
|
|
238
263
|
const extras = useMemo(() => aiSDKExtras.provide({
|
|
@@ -247,25 +272,30 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
247
272
|
const completePendingToolCalls = async () => {
|
|
248
273
|
if (!cancelPendingToolCallsOnSend) return;
|
|
249
274
|
chatHelpers.setMessages((messages_1) => {
|
|
250
|
-
const lastMessage_0 = messages_1.at(-1);
|
|
251
|
-
if (lastMessage_0?.role !== "assistant") return messages_1;
|
|
252
275
|
let hasChanges = false;
|
|
253
|
-
const
|
|
254
|
-
if (
|
|
255
|
-
|
|
276
|
+
const next = messages_1.map((message) => {
|
|
277
|
+
if (message.role !== "assistant") return message;
|
|
278
|
+
let messageChanged = false;
|
|
279
|
+
const parts = message.parts?.map((part) => {
|
|
280
|
+
if (!isToolUIPart(part)) return part;
|
|
281
|
+
if (part.state === "output-available" || part.state === "output-error" || part.state === "output-denied") return part;
|
|
282
|
+
messageChanged = true;
|
|
283
|
+
const { approval: _approval, ...rest } = part;
|
|
284
|
+
return {
|
|
285
|
+
...rest,
|
|
286
|
+
state: "output-error",
|
|
287
|
+
errorText: "User cancelled tool call by sending a new message."
|
|
288
|
+
};
|
|
289
|
+
});
|
|
290
|
+
if (!messageChanged) return message;
|
|
256
291
|
hasChanges = true;
|
|
257
|
-
const { approval: _approval, ...rest } = part;
|
|
258
292
|
return {
|
|
259
|
-
...
|
|
260
|
-
|
|
261
|
-
errorText: "User cancelled tool call by sending a new message."
|
|
293
|
+
...message,
|
|
294
|
+
parts
|
|
262
295
|
};
|
|
263
296
|
});
|
|
264
297
|
if (!hasChanges) return messages_1;
|
|
265
|
-
return
|
|
266
|
-
...lastMessage_0,
|
|
267
|
-
parts
|
|
268
|
-
}];
|
|
298
|
+
return next;
|
|
269
299
|
});
|
|
270
300
|
};
|
|
271
301
|
const respondViaAISDK = ({ approvalId, approved, reason }) => Promise.resolve(chatHelpers.addToolApprovalResponse({
|
|
@@ -276,23 +306,23 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
276
306
|
}));
|
|
277
307
|
const respondViaHost = async (onRespond, response) => {
|
|
278
308
|
const { approvalId: approvalId_0 } = response;
|
|
279
|
-
const requested = chatHelpers.messages.flatMap((
|
|
309
|
+
const requested = chatHelpers.messages.flatMap((message_0) => message_0.parts.flatMap((part_0) => isToolUIPart(part_0) ? [{
|
|
310
|
+
messageId: message_0.id,
|
|
311
|
+
part: part_0
|
|
312
|
+
}] : [])).find(({ part: part_1 }) => part_1.state === "approval-requested" && part_1.approval.id === approvalId_0);
|
|
280
313
|
if (!requested || hostApprovalIdsRef.current.has(approvalId_0)) throw new Error(`Tool approval ${approvalId_0} is not waiting for a response.`);
|
|
281
314
|
const applyResponse = (applied) => {
|
|
282
315
|
if (applied) hostApprovalIdsRef.current.add(approvalId_0);
|
|
283
316
|
else hostApprovalIdsRef.current.delete(approvalId_0);
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
else responses.delete(approvalId_0);
|
|
288
|
-
return responses;
|
|
289
|
-
});
|
|
317
|
+
if (applied) toolApprovalResponsesRef.current.set(approvalId_0, response);
|
|
318
|
+
else toolApprovalResponsesRef.current.delete(approvalId_0);
|
|
319
|
+
setToolApprovalResponses(new Map(toolApprovalResponsesRef.current));
|
|
290
320
|
};
|
|
291
321
|
applyResponse(true);
|
|
292
322
|
try {
|
|
293
323
|
await onRespond(response, {
|
|
294
|
-
toolCallId: requested.toolCallId,
|
|
295
|
-
toolName: getToolName(requested),
|
|
324
|
+
toolCallId: requested.part.toolCallId,
|
|
325
|
+
toolName: getToolName(requested.part),
|
|
296
326
|
respondViaAISDK: async () => {
|
|
297
327
|
try {
|
|
298
328
|
await respondViaAISDK(response);
|
|
@@ -305,17 +335,19 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
305
335
|
if (hostApprovalIdsRef.current.has(approvalId_0)) applyResponse(false);
|
|
306
336
|
throw error_0;
|
|
307
337
|
}
|
|
338
|
+
if (hostApprovalIdsRef.current.has(approvalId_0)) await persistToolApprovalResponses(requested.messageId);
|
|
308
339
|
};
|
|
309
340
|
const hasSeededRepositoryRef = useRef(false);
|
|
310
341
|
const shouldFeedRepository = exportedMessageRepository != null && !hasSeededRepositoryRef.current && messages.length === 0;
|
|
311
342
|
const runtime = useExternalStoreRuntime({
|
|
343
|
+
unstable_persistsHistory: true,
|
|
312
344
|
isRunning: providerIsRunning,
|
|
313
345
|
...shouldFeedRepository ? { messageRepository: exportedMessageRepository } : { messages },
|
|
314
346
|
unstable_enableToolInvocations: true,
|
|
315
347
|
setToolStatuses,
|
|
316
348
|
setMessages: (messages_2) => chatHelpers.setMessages(messages_2.map(getVercelAIMessages).filter(Boolean).flat()),
|
|
317
349
|
onImport: (messages_3) => chatHelpers.setMessages(messages_3.map(getVercelAIMessages).filter(Boolean).flat()),
|
|
318
|
-
onVoiceTranscript: (
|
|
350
|
+
onVoiceTranscript: (message_1) => chatHelpers.setMessages((current) => [...current, toVoiceTranscriptUIMessage(message_1)]),
|
|
319
351
|
onExportExternalState: () => {
|
|
320
352
|
const exported = runtimeRef.current.thread.export();
|
|
321
353
|
const expandedMessages = [];
|
|
@@ -341,12 +373,12 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
341
373
|
runtimeRef.current.thread.import(exportedRepo);
|
|
342
374
|
},
|
|
343
375
|
onCancel: async () => {
|
|
344
|
-
const
|
|
345
|
-
const cancelledId = isRunning &&
|
|
376
|
+
const message_2 = chatHelpers.messages.at(-1);
|
|
377
|
+
const cancelledId = isRunning && message_2?.role === "assistant" ? message_2.id : void 0;
|
|
346
378
|
if (cancelledId) {
|
|
347
379
|
const liveIds = new Set(chatHelpers.messages.map((m) => m.id));
|
|
348
|
-
setCancelledMessages((
|
|
349
|
-
const kept =
|
|
380
|
+
setCancelledMessages((prev_0) => {
|
|
381
|
+
const kept = prev_0?.chatId === chatHelpers.id ? [...prev_0.ids].filter((id) => liveIds.has(id)) : [];
|
|
350
382
|
return {
|
|
351
383
|
chatId: chatHelpers.id,
|
|
352
384
|
ids: /* @__PURE__ */ new Set([...kept, cancelledId])
|
|
@@ -362,33 +394,48 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
362
394
|
}
|
|
363
395
|
}
|
|
364
396
|
},
|
|
365
|
-
onNew: async (
|
|
366
|
-
const createMessage = (customToCreateMessage ?? toCreateMessage)(
|
|
367
|
-
if (!(
|
|
368
|
-
chatHelpers.setMessages((current_0) => [...current_0, toUIMessage(createMessage,
|
|
397
|
+
onNew: async (message_3) => {
|
|
398
|
+
const createMessage = (customToCreateMessage ?? toCreateMessage)(message_3);
|
|
399
|
+
if (!(message_3.startRun ?? message_3.role === "user")) {
|
|
400
|
+
chatHelpers.setMessages((current_0) => [...current_0, toUIMessage(createMessage, message_3.role)]);
|
|
369
401
|
return;
|
|
370
402
|
}
|
|
371
|
-
lastRunConfigRef.current =
|
|
403
|
+
lastRunConfigRef.current = message_3.runConfig;
|
|
372
404
|
await completePendingToolCalls();
|
|
373
|
-
await chatHelpers.sendMessage(createMessage, { metadata:
|
|
405
|
+
await chatHelpers.sendMessage(createMessage, { metadata: message_3.runConfig });
|
|
374
406
|
},
|
|
375
|
-
onEdit: async (
|
|
376
|
-
const createMessage_0 = (customToCreateMessage ?? toCreateMessage)(
|
|
377
|
-
if (!(
|
|
378
|
-
chatHelpers.setMessages((current_1) => [...sliceMessagesUntil(current_1,
|
|
407
|
+
onEdit: async (message_4) => {
|
|
408
|
+
const createMessage_0 = (customToCreateMessage ?? toCreateMessage)(message_4);
|
|
409
|
+
if (!(message_4.startRun ?? message_4.role === "user")) {
|
|
410
|
+
chatHelpers.setMessages((current_1) => [...sliceMessagesUntil(current_1, message_4.parentId), toUIMessage(createMessage_0, message_4.role)]);
|
|
379
411
|
return;
|
|
380
412
|
}
|
|
381
|
-
lastRunConfigRef.current =
|
|
382
|
-
chatHelpers.setMessages((current_2) => sliceMessagesUntil(current_2,
|
|
383
|
-
await chatHelpers.sendMessage(createMessage_0, { metadata:
|
|
413
|
+
lastRunConfigRef.current = message_4.runConfig;
|
|
414
|
+
chatHelpers.setMessages((current_2) => sliceMessagesUntil(current_2, message_4.parentId));
|
|
415
|
+
await chatHelpers.sendMessage(createMessage_0, { metadata: message_4.runConfig });
|
|
384
416
|
},
|
|
385
417
|
onDelete: async (messageId_0) => {
|
|
386
418
|
const threadMessages = runtimeRef.current.thread.getState().messages;
|
|
387
|
-
const messageIndex = threadMessages.findIndex((
|
|
419
|
+
const messageIndex = threadMessages.findIndex((message_5) => message_5.id === messageId_0);
|
|
388
420
|
if (messageIndex === -1) return;
|
|
389
421
|
await deleteHistoryMessage(messageId_0);
|
|
390
|
-
|
|
391
|
-
|
|
422
|
+
let removedToolArtifact = false;
|
|
423
|
+
let removedToolInteractions = false;
|
|
424
|
+
let removedToolApprovalResponse = false;
|
|
425
|
+
let removedHostApprovalId = false;
|
|
426
|
+
for (const part_2 of threadMessages[messageIndex].content) if (part_2.type === "tool-call") {
|
|
427
|
+
removedToolArtifact = toolArtifactsRef.current.delete(part_2.toolCallId) || removedToolArtifact;
|
|
428
|
+
removedToolInteractions = toolInteractionsRef.current.delete(part_2.toolCallId) || removedToolInteractions;
|
|
429
|
+
if (part_2.approval) {
|
|
430
|
+
removedToolApprovalResponse = toolApprovalResponsesRef.current.delete(part_2.approval.id) || removedToolApprovalResponse;
|
|
431
|
+
removedHostApprovalId = hostApprovalIdsRef.current.delete(part_2.approval.id) || removedHostApprovalId;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
if (removedToolArtifact) markToolArtifactsChanged();
|
|
435
|
+
if (removedToolInteractions) markToolInteractionsChanged();
|
|
436
|
+
if (removedToolApprovalResponse || removedHostApprovalId) setToolApprovalResponses(new Map(toolApprovalResponsesRef.current));
|
|
437
|
+
const deleteIds = new Set(getExternalStoreMessages(threadMessages[messageIndex]).map((message_6) => message_6.id));
|
|
438
|
+
chatHelpers.setMessages((current_3) => current_3.filter((message_7) => !deleteIds.has(message_7.id)));
|
|
392
439
|
},
|
|
393
440
|
onReload: async (parentId_0, config) => {
|
|
394
441
|
lastRunConfigRef.current = config.runConfig;
|
|
@@ -396,7 +443,11 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
396
443
|
chatHelpers.setMessages(newMessages);
|
|
397
444
|
await chatHelpers.regenerate({ metadata: config.runConfig });
|
|
398
445
|
},
|
|
399
|
-
onAddToolResult: ({ toolCallId, toolName, result: result_0, isError, modelContent }) => {
|
|
446
|
+
onAddToolResult: ({ toolCallId, toolName, result: result_0, isError, artifact, modelContent }) => {
|
|
447
|
+
if (artifact !== void 0) {
|
|
448
|
+
toolArtifactsRef.current.set(toolCallId, artifact);
|
|
449
|
+
markToolArtifactsChanged();
|
|
450
|
+
}
|
|
400
451
|
const options = { metadata: lastRunConfigRef.current };
|
|
401
452
|
if (isError) return Promise.resolve(chatHelpers.addToolOutput({
|
|
402
453
|
state: "output-error",
|
|
@@ -416,6 +467,11 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
416
467
|
}
|
|
417
468
|
},
|
|
418
469
|
onRespondToToolApproval: customOnRespondToToolApproval ? (response_0) => respondViaHost(customOnRespondToToolApproval, response_0) : respondViaAISDK,
|
|
470
|
+
unstable_onRecordToolInteraction: ({ messageId: messageId_1, toolCallId: toolCallId_0, interaction }) => {
|
|
471
|
+
toolInteractionsRef.current.set(toolCallId_0, appendToolInteraction(toolInteractionsRef.current.get(toolCallId_0), interaction));
|
|
472
|
+
markToolInteractionsChanged();
|
|
473
|
+
return persistToolInteractions(messageId_1);
|
|
474
|
+
},
|
|
419
475
|
...pickExternalStoreSharedOptions(adapter),
|
|
420
476
|
...adapter.unstable_messageRepositoryInstance && { unstable_messageRepositoryInstance: adapter.unstable_messageRepositoryInstance },
|
|
421
477
|
...suggestionAdapter ? { suggestions: generatedSuggestions } : {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAISDKRuntime.js","names":["c","_c","useCallback","useEffect","useInsertionEffect","useMemo","useRef","useState","UIMessage","useChat","CreateUIMessage","UseChatHelpers","isToolUIPart","generateId","getToolName","useExternalStoreRuntime","useRuntimeAdapters","JoinStrategy","SuggestionAdapter","ThreadSuggestion","ToolExecutionStatus","ExternalStoreAdapter","ExternalStoreSharedOptions","ThreadHistoryAdapter","AssistantRuntime","ThreadMessage","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","AppendMessage","RunConfig","McpAppMetadata","RespondToToolApprovalOptions","getExternalStoreMessages","pickExternalStoreSharedOptions","consumeSuggestionResult","MessageRepository","ReadonlyJSONObject","AssistantError","sliceMessagesUntil","toCreateMessage","vercelAttachmentAdapter","getVercelAIMessages","AISDKMessageConverter","AISDKMessageConverterMetadata","wrapModelContentEnvelope","AISDKStorageFormat","aiSDKV6FormatAdapter","useExternalHistory","toExportedMessageRepository","useStreamingTiming","aiSDKExtras","CustomToCreateMessageFunction","message","UI_MESSAGE","toUIMessage","createMessage","fallbackRole","id","role","toVoiceTranscriptUIMessage","parts","content","filter","part","type","map","text","metadata","modality","Object","keys","custom","length","AISDKRuntimeAdapter","adapters","NonNullable","history","suggestion","unstable_messageRepositoryInstance","cancelPendingToolCallsOnSend","onResume","onResumeToolCall","onRespondToToolApproval","response","context","toolCallId","toolName","respondViaAISDK","Promise","joinStrategy","messageRepository","unstable_onBranchChange","EMPTY_SUGGESTIONS","useGeneratedSuggestions","suggestionAdapter","messages","isRunning","$","suggestions","setSuggestions","controllerRef","wasRunningRef","messagesRef","t0","t1","current","adapterRef","t2","t3","hasAdapter","t4","clearSuggestions","abort","_temp","adapter","currentMessages","last","at","status","controller","AbortController","signal","promiseOrGenerator","generate","onUpdate","t5","t6","t7","Symbol","for","NO_CANCELLED_MESSAGE_IDS","ReadonlySet","Set","NO_TOOL_APPROVAL_RESPONSES","ReadonlyMap","Map","toChatError","error","Error","code","name","useAISDKRuntime","chatHelpers","ReturnType","customToCreateMessage","customOnRespondToToolApproval","contextAdapters","toolStatuses","setToolStatuses","Record","cancelledMessages","setCancelledMessages","chatId","ids","toolApprovalResponses","setToolApprovalResponses","hostApprovalIdsRef","toolArgsKeyOrderCacheRef","toolLastInputCacheRef","mcpAppMetadataCacheRef","lastRunConfigRef","undefined","hasExecutingTools","values","some","s","providerIsRunning","wasProviderRunningRef","messageTiming","lastMessage","optimisticMessageId","cancelledMessageIds","supportsRichToolApprovalResponses","toThreadMessages","sourceMessages","retractCancellation","messageId","prev","has","delete","resumedMessageId","wasProviderRunning","useThreadMessages","toolArgsKeyOrderCache","toolLastInputCache","mcpAppMetadataCache","size","exportedMessageRepository","converted","generatedSuggestions","runtimeRef","runtime","isLoading","deleteMessage","deleteHistoryMessage","setMessages","chatMessages","chatStatus","extras","provide","chat","completePendingToolCalls","hasChanges","state","approval","_approval","rest","const","errorText","slice","approvalId","approved","reason","resolve","addToolApprovalResponse","options","respondViaHost","onRespond","requested","flatMap","find","applyResponse","applied","add","responses","set","hasSeededRepositoryRef","shouldFeedRepository","unstable_enableToolInvocations","Boolean","flat","onImport","onVoiceTranscript","onExportExternalState","exported","thread","export","expandedMessages","lastInnerIdMap","item","innerMessages","parentId","get","innerMessage","push","getId","result","headId","onLoadExternalState","repo","exportedRepo","import","onCancel","cancelledId","liveIds","m","kept","stop","onNew","startRun","runConfig","sendMessage","onEdit","onDelete","threadMessages","getState","messageIndex","findIndex","deleteIds","onReload","config","newMessages","regenerate","onAddToolResult","isError","modelContent","addToolOutput","tool","JSON","stringify","output","attachments","setMessagesRef","tempRepo","getMessages"],"sources":["../../src/runtime/useAISDKRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useInsertionEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n UIMessage,\n useChat,\n CreateUIMessage,\n UseChatHelpers,\n} from \"@ai-sdk/react\";\nimport { isToolUIPart, generateId, getToolName } from \"ai\";\nimport {\n useExternalStoreRuntime,\n useRuntimeAdapters,\n type JoinStrategy,\n} from \"@assistant-ui/core/react\";\nimport type {\n SuggestionAdapter,\n ThreadSuggestion,\n ToolExecutionStatus,\n} from \"@assistant-ui/core\";\nimport type {\n ExternalStoreAdapter,\n ExternalStoreSharedOptions,\n ThreadHistoryAdapter,\n AssistantRuntime,\n ThreadMessage,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n AppendMessage,\n RunConfig,\n McpAppMetadata,\n RespondToToolApprovalOptions,\n} from \"@assistant-ui/core\";\nimport {\n getExternalStoreMessages,\n pickExternalStoreSharedOptions,\n} from \"@assistant-ui/core\";\nimport {\n consumeSuggestionResult,\n MessageRepository,\n} from \"@assistant-ui/core/internal\";\nimport type { ReadonlyJSONObject } from \"assistant-stream/utils\";\nimport type { AssistantError } from \"@assistant-ui/core\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../converters/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../adapters/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../utils/getVercelAIMessages\";\nimport {\n AISDKMessageConverter,\n type AISDKMessageConverterMetadata,\n} from \"../converters/convertMessage\";\nimport { wrapModelContentEnvelope } from \"../converters/modelContentEnvelope\";\nimport {\n type AISDKStorageFormat,\n aiSDKV6FormatAdapter,\n} from \"../adapters/aiSDKFormatAdapter\";\nimport {\n useExternalHistory,\n toExportedMessageRepository,\n} from \"./useExternalHistory\";\nimport { useStreamingTiming } from \"./useStreamingTiming\";\nimport { aiSDKExtras } from \"../aiSDKExtras\";\n\nexport type CustomToCreateMessageFunction = <\n UI_MESSAGE extends UIMessage = UIMessage,\n>(\n message: AppendMessage,\n) => CreateUIMessage<UI_MESSAGE>;\n\nconst toUIMessage = <UI_MESSAGE extends UIMessage>(\n createMessage: CreateUIMessage<UI_MESSAGE>,\n fallbackRole: UI_MESSAGE[\"role\"],\n): UI_MESSAGE =>\n ({\n ...createMessage,\n id: createMessage.id ?? generateId(),\n role: createMessage.role ?? fallbackRole,\n }) as UI_MESSAGE;\n\nconst toVoiceTranscriptUIMessage = <UI_MESSAGE extends UIMessage>(\n message: ThreadMessage,\n): UI_MESSAGE =>\n ({\n id: message.id,\n role: message.role,\n parts: message.content\n .filter((part) => part.type === \"text\")\n .map((part) => ({ type: \"text\", text: part.text })),\n metadata: {\n modality: \"voice\",\n ...(Object.keys(message.metadata.custom).length > 0 && {\n custom: message.metadata.custom,\n }),\n },\n }) as UI_MESSAGE;\n\nexport type AISDKRuntimeAdapter<UI_MESSAGE extends UIMessage = UIMessage> =\n ExternalStoreSharedOptions & {\n adapters?:\n | (NonNullable<ExternalStoreAdapter[\"adapters\"]> & {\n history?: ThreadHistoryAdapter | undefined;\n suggestion?: SuggestionAdapter | undefined;\n })\n | undefined;\n toCreateMessage?: CustomToCreateMessageFunction;\n unstable_messageRepositoryInstance?: MessageRepository | undefined;\n /**\n * Whether to automatically cancel pending interactive tool calls when the user sends a new message.\n *\n * When enabled (default), the pending tool calls will be marked as failed with an error message\n * indicating the user cancelled the tool call by sending a new message.\n *\n * @default true\n */\n cancelPendingToolCallsOnSend?: boolean | undefined;\n /**\n * Called when `runtime.thread.resumeRun(config)` is invoked.\n *\n * When omitted, `resumeRun` throws `\"Runtime does not support resuming runs.\"`.\n * Provide this to bridge resume invocations into a custom replay channel\n * (for example, an SSE reconnect endpoint keyed by turn id).\n */\n onResume?: ExternalStoreAdapter[\"onResume\"];\n /**\n * Called when `runtime.thread.resumeToolCall(options)` is invoked for a tool call the in-process tracker does not own.\n *\n * When omitted, `resumeToolCall` throws `\"Tool call ${toolCallId} is not waiting for resume.\"`.\n * Provide this to bridge resume-tool-call invocations into a custom handler.\n */\n onResumeToolCall?: ExternalStoreAdapter[\"onResumeToolCall\"];\n /**\n * Answers tool approval requests through a host-owned channel instead of the AI SDK's `addToolApprovalResponse`.\n *\n * Called for every approval request in the thread with the complete response, including option and free-form answers. Hand requests the host does not own to `respondViaAISDK`, which is what runs when this option is omitted. The answer applies to the approval when the handler starts and is removed if it throws. It is never written into the `useChat` messages, so `sendAutomaticallyWhen` cannot forward it, and it lasts as long as this runtime: until then a second response to the same request rejects, and a runtime mounted again over the same chat shows the request open until the resumed run records its resolution in the chat.\n *\n * While a handler is set, an approval's `display`, `allowFreeform` and `options` reach the renderer, because the handler can receive answers the AI SDK cannot carry.\n */\n onRespondToToolApproval?:\n | ((\n response: RespondToToolApprovalOptions,\n context: {\n toolCallId: string;\n toolName: string;\n /** Sends this response through the AI SDK's `addToolApprovalResponse`, which carries only `approved` and `reason`. */\n respondViaAISDK: () => Promise<void>;\n },\n ) => Promise<void> | void)\n | undefined;\n /**\n * How consecutive assistant messages are rendered.\n *\n * `\"concat-content\"` (the default) merges them into a single thread message.\n * `\"none\"` keeps each assistant message as its own thread message, which is\n * useful when a backend persists proactive or consecutive assistant messages\n * as separate entries.\n */\n joinStrategy?: JoinStrategy | undefined;\n /**\n * A branch-aware AI SDK message tree seeded once when `useChat` is empty.\n * After that seed, live updates come only from `useChat`. A later empty\n * chat or a new object identity does not reload the tree.\n */\n messageRepository?: MessageFormatRepository<UI_MESSAGE>;\n /**\n * Called after an explicit `switchToBranch` (for example a BranchPicker\n * click). Complements `setMessages` and does not enable switching by itself.\n *\n * @deprecated This API is still under active development and might change without notice.\n */\n unstable_onBranchChange?: ExternalStoreAdapter[\"unstable_onBranchChange\"];\n };\n\nconst EMPTY_SUGGESTIONS: readonly ThreadSuggestion[] = [];\n\nconst useGeneratedSuggestions = (\n suggestionAdapter: SuggestionAdapter | undefined,\n messages: readonly ThreadMessage[],\n isRunning: boolean,\n): readonly ThreadSuggestion[] => {\n const [suggestions, setSuggestions] =\n useState<readonly ThreadSuggestion[]>(EMPTY_SUGGESTIONS);\n const controllerRef = useRef<AbortController | null>(null);\n const wasRunningRef = useRef(false);\n const messagesRef = useRef(messages);\n useInsertionEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n const adapterRef = useRef(suggestionAdapter);\n useInsertionEffect(() => {\n adapterRef.current = suggestionAdapter;\n }, [suggestionAdapter]);\n const hasAdapter = suggestionAdapter != null;\n\n useEffect(() => {\n const clearSuggestions = () => {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setSuggestions((prev) => (prev.length === 0 ? prev : EMPTY_SUGGESTIONS));\n };\n\n const adapter = adapterRef.current;\n if (!adapter) {\n clearSuggestions();\n wasRunningRef.current = isRunning;\n return;\n }\n\n if (isRunning) {\n if (!wasRunningRef.current) {\n clearSuggestions();\n }\n wasRunningRef.current = true;\n return;\n }\n\n if (!wasRunningRef.current) return;\n wasRunningRef.current = false;\n\n const currentMessages = messagesRef.current;\n const last = currentMessages.at(-1);\n if (last?.role !== \"assistant\") return;\n if (last.status?.type === \"requires-action\") return;\n\n const controller = new AbortController();\n controllerRef.current = controller;\n const { signal } = controller;\n\n void (async () => {\n try {\n const promiseOrGenerator = adapter.generate({\n messages: currentMessages,\n signal,\n });\n\n await consumeSuggestionResult(promiseOrGenerator, {\n signal,\n onUpdate: setSuggestions,\n });\n } catch {}\n })();\n }, [hasAdapter, isRunning]);\n\n useEffect(() => {\n return () => {\n controllerRef.current?.abort();\n };\n }, []);\n\n return suggestions;\n};\n\nconst NO_CANCELLED_MESSAGE_IDS: ReadonlySet<string> = new Set();\n\nconst NO_TOOL_APPROVAL_RESPONSES: ReadonlyMap<\n string,\n RespondToToolApprovalOptions\n> = new Map();\n\nconst toChatError = (error: Error): AssistantError => {\n const code = (error as { code?: unknown }).code;\n return {\n code:\n typeof code === \"string\"\n ? code\n : error.name !== \"Error\"\n ? error.name\n : \"unknown\",\n message: error.message,\n };\n};\n\nexport const useAISDKRuntime = <UI_MESSAGE extends UIMessage = UIMessage>(\n chatHelpers: ReturnType<typeof useChat<UI_MESSAGE>>,\n adapter: AISDKRuntimeAdapter<UI_MESSAGE> = {},\n) => {\n const {\n adapters,\n toCreateMessage: customToCreateMessage,\n cancelPendingToolCallsOnSend = true,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval: customOnRespondToToolApproval,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n } = adapter;\n const suggestionAdapter = adapters?.suggestion;\n const contextAdapters = useRuntimeAdapters();\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n const [cancelledMessages, setCancelledMessages] = useState<{\n chatId: string;\n ids: ReadonlySet<string>;\n } | null>(null);\n const [toolApprovalResponses, setToolApprovalResponses] = useState<\n ReadonlyMap<string, RespondToToolApprovalOptions>\n >(NO_TOOL_APPROVAL_RESPONSES);\n const hostApprovalIdsRef = useRef(new Set<string>());\n const toolArgsKeyOrderCacheRef = useRef<Map<string, Map<string, string[]>>>(\n new Map(),\n );\n const toolLastInputCacheRef = useRef<Map<string, ReadonlyJSONObject>>(\n new Map(),\n );\n const mcpAppMetadataCacheRef = useRef<Map<string, McpAppMetadata>>(new Map());\n const lastRunConfigRef = useRef<RunConfig | undefined>(undefined);\n\n const hasExecutingTools = Object.values(toolStatuses).some(\n (s) => s?.type === \"executing\",\n );\n const providerIsRunning =\n chatHelpers.status === \"submitted\" || chatHelpers.status === \"streaming\";\n const isRunning = providerIsRunning || hasExecutingTools;\n const wasProviderRunningRef = useRef(providerIsRunning);\n\n const messageTiming = useStreamingTiming(chatHelpers.messages, isRunning);\n\n // Flag the streaming message optimistic: its id can be swapped for a server\n // id mid-run, and the repository then drops the orphaned pre-swap id (#4037).\n const lastMessage = chatHelpers.messages.at(-1);\n const optimisticMessageId =\n isRunning && lastMessage?.role === \"assistant\" ? lastMessage.id : undefined;\n\n const cancelledMessageIds =\n cancelledMessages?.chatId === chatHelpers.id\n ? cancelledMessages.ids\n : NO_CANCELLED_MESSAGE_IDS;\n const supportsRichToolApprovalResponses =\n customOnRespondToToolApproval != null;\n\n const toThreadMessages = useCallback(\n (sourceMessages: UI_MESSAGE[]) => {\n const metadata: AISDKMessageConverterMetadata = {\n supportsRichToolApprovalResponses,\n };\n return AISDKMessageConverter.toThreadMessages(\n sourceMessages,\n false,\n metadata,\n );\n },\n [supportsRichToolApprovalResponses],\n );\n\n const retractCancellation = useCallback(\n (chatId: string, messageId: string) => {\n setCancelledMessages((prev) => {\n if (prev?.chatId !== chatId || !prev.ids.has(messageId)) return prev;\n const ids = new Set(prev.ids);\n ids.delete(messageId);\n return { chatId, ids };\n });\n },\n [],\n );\n\n // A provider run that resumes the stopped response retracts its cancellation;\n // a run that starts a new response leaves the stopped one marked.\n const resumedMessageId =\n providerIsRunning && lastMessage?.role === \"assistant\"\n ? lastMessage.id\n : undefined;\n\n useEffect(() => {\n const wasProviderRunning = wasProviderRunningRef.current;\n wasProviderRunningRef.current = providerIsRunning;\n if (wasProviderRunning || !resumedMessageId) return;\n retractCancellation(chatHelpers.id, resumedMessageId);\n }, [\n providerIsRunning,\n resumedMessageId,\n chatHelpers.id,\n retractCancellation,\n ]);\n\n const messages = AISDKMessageConverter.useThreadMessages({\n isRunning,\n messages: chatHelpers.messages,\n joinStrategy,\n metadata: useMemo<AISDKMessageConverterMetadata>(\n () => ({\n toolStatuses,\n messageTiming,\n toolArgsKeyOrderCache: toolArgsKeyOrderCacheRef.current,\n toolLastInputCache: toolLastInputCacheRef.current,\n mcpAppMetadataCache: mcpAppMetadataCacheRef.current,\n supportsRichToolApprovalResponses,\n ...(optimisticMessageId && { optimisticMessageId }),\n ...(chatHelpers.error && {\n error: toChatError(chatHelpers.error),\n }),\n ...(cancelledMessageIds.size > 0 && { cancelledMessageIds }),\n ...(toolApprovalResponses.size > 0 && { toolApprovalResponses }),\n }),\n [\n toolStatuses,\n messageTiming,\n optimisticMessageId,\n chatHelpers.error,\n cancelledMessageIds,\n toolApprovalResponses,\n supportsRichToolApprovalResponses,\n ],\n ),\n });\n\n const exportedMessageRepository = useMemo(() => {\n if (!messageRepository) return undefined;\n const converted = toExportedMessageRepository(\n toThreadMessages,\n messageRepository,\n );\n return converted.messages.length > 0 ? converted : undefined;\n }, [messageRepository, toThreadMessages]);\n\n const generatedSuggestions = useGeneratedSuggestions(\n suggestionAdapter,\n messages,\n isRunning,\n );\n\n const [runtimeRef] = useState(() => ({\n get current(): AssistantRuntime {\n return runtime;\n },\n }));\n\n const { isLoading, deleteMessage: deleteHistoryMessage } = useExternalHistory(\n runtimeRef,\n adapters?.history ?? contextAdapters?.history,\n toThreadMessages,\n aiSDKV6FormatAdapter as MessageFormatAdapter<\n UI_MESSAGE,\n AISDKStorageFormat\n >,\n (messages) => {\n chatHelpers.setMessages(messages);\n },\n );\n\n const {\n id: chatId,\n messages: chatMessages,\n status: chatStatus,\n error,\n } = chatHelpers;\n const extras = useMemo(\n () =>\n aiSDKExtras.provide({\n chat: chatHelpers as unknown as UseChatHelpers<UIMessage>,\n error,\n }),\n // oxlint-disable-next-line react/exhaustive-deps -- keyed on the chat's identity and reactive snapshots; useChat re-mints the helpers object every render while its remaining fields are instance-bound methods, and a render-stable extras identity is what lets the external-store core dedupe adapter updates\n [chatId, chatMessages, chatStatus, error],\n );\n\n const completePendingToolCalls = async () => {\n if (!cancelPendingToolCallsOnSend) return;\n\n // The runtime auto-aborts in-flight tool invocations when a new run\n // is dispatched (append() / startRun()). All we need to do here is\n // mark any tool without a result as cancelled in the UI message list.\n\n // Mark any tool without a result as cancelled (uses setMessages to avoid triggering sendAutomaticallyWhen)\n chatHelpers.setMessages((messages) => {\n const lastMessage = messages.at(-1);\n if (lastMessage?.role !== \"assistant\") return messages;\n\n let hasChanges = false;\n const parts = lastMessage.parts?.map((part) => {\n if (!isToolUIPart(part)) return part;\n if (\n part.state === \"output-available\" ||\n part.state === \"output-error\" ||\n part.state === \"output-denied\"\n )\n return part;\n\n hasChanges = true;\n const { approval: _approval, ...rest } = part;\n return {\n ...rest,\n state: \"output-error\" as const,\n errorText: \"User cancelled tool call by sending a new message.\",\n };\n });\n\n if (!hasChanges) return messages;\n return [...messages.slice(0, -1), { ...lastMessage, parts }];\n });\n };\n\n const respondViaAISDK = ({\n approvalId,\n approved,\n reason,\n }: RespondToToolApprovalOptions) =>\n Promise.resolve(\n chatHelpers.addToolApprovalResponse({\n id: approvalId,\n approved,\n ...(reason != null && { reason }),\n options: { metadata: lastRunConfigRef.current },\n }),\n );\n\n const respondViaHost = async (\n onRespond: NonNullable<AISDKRuntimeAdapter[\"onRespondToToolApproval\"]>,\n response: RespondToToolApprovalOptions,\n ) => {\n const { approvalId } = response;\n const requested = chatHelpers.messages\n .flatMap((message) => message.parts)\n .filter(isToolUIPart)\n .find(\n (part) =>\n part.state === \"approval-requested\" &&\n part.approval.id === approvalId,\n );\n if (!requested || hostApprovalIdsRef.current.has(approvalId))\n throw new Error(\n `Tool approval ${approvalId} is not waiting for a response.`,\n );\n\n // A host answer stays out of the useChat messages, where sendAutomaticallyWhen would forward it to the chat route.\n const applyResponse = (applied: boolean) => {\n if (applied) hostApprovalIdsRef.current.add(approvalId);\n else hostApprovalIdsRef.current.delete(approvalId);\n setToolApprovalResponses((prev) => {\n const responses = new Map(prev);\n if (applied) responses.set(approvalId, response);\n else responses.delete(approvalId);\n return responses;\n });\n };\n\n applyResponse(true);\n try {\n await onRespond(response, {\n toolCallId: requested.toolCallId,\n toolName: getToolName(requested),\n respondViaAISDK: async () => {\n try {\n await respondViaAISDK(response);\n } finally {\n applyResponse(false);\n }\n },\n });\n } catch (error) {\n if (hostApprovalIdsRef.current.has(approvalId)) applyResponse(false);\n throw error;\n }\n };\n\n const hasSeededRepositoryRef = useRef(false);\n const shouldFeedRepository =\n exportedMessageRepository != null &&\n !hasSeededRepositoryRef.current &&\n messages.length === 0;\n\n const runtime = useExternalStoreRuntime({\n isRunning: providerIsRunning,\n ...(shouldFeedRepository\n ? { messageRepository: exportedMessageRepository }\n : { messages }),\n unstable_enableToolInvocations: true,\n setToolStatuses,\n setMessages: (messages) =>\n chatHelpers.setMessages(\n messages\n .map(getVercelAIMessages<UI_MESSAGE>)\n .filter(Boolean)\n .flat(),\n ),\n onImport: (messages) =>\n chatHelpers.setMessages(\n messages\n .map(getVercelAIMessages<UI_MESSAGE>)\n .filter(Boolean)\n .flat(),\n ),\n onVoiceTranscript: (message: ThreadMessage) =>\n chatHelpers.setMessages((current) => [\n ...current,\n toVoiceTranscriptUIMessage<UI_MESSAGE>(message),\n ]),\n onExportExternalState: (): MessageFormatRepository<UI_MESSAGE> => {\n const exported = runtimeRef.current.thread.export();\n\n const expandedMessages: MessageFormatItem<UI_MESSAGE>[] = [];\n const lastInnerIdMap = new Map<string, string>();\n\n for (const item of exported.messages) {\n const innerMessages = getExternalStoreMessages<UI_MESSAGE>(\n item.message,\n );\n let parentId =\n item.parentId != null\n ? (lastInnerIdMap.get(item.parentId) ?? item.parentId)\n : null;\n for (const innerMessage of innerMessages) {\n expandedMessages.push({ parentId, message: innerMessage });\n parentId = aiSDKV6FormatAdapter.getId(innerMessage as UIMessage);\n }\n if (innerMessages.length > 0) {\n lastInnerIdMap.set(\n item.message.id,\n aiSDKV6FormatAdapter.getId(\n innerMessages[innerMessages.length - 1]! as UIMessage,\n ),\n );\n }\n }\n\n const result: MessageFormatRepository<UI_MESSAGE> = {\n messages: expandedMessages,\n };\n\n if (exported.headId != null) {\n result.headId = lastInnerIdMap.get(exported.headId) ?? exported.headId;\n }\n\n return result;\n },\n onLoadExternalState: (repo: MessageFormatRepository<UI_MESSAGE>) => {\n // Convert MessageFormatRepository to ExportedMessageRepository\n const exportedRepo = toExportedMessageRepository(toThreadMessages, repo);\n\n // Import into the thread's MessageRepository\n runtimeRef.current.thread.import(exportedRepo);\n },\n onCancel: async () => {\n const message = chatHelpers.messages.at(-1);\n const cancelledId =\n isRunning && message?.role === \"assistant\" ? message.id : undefined;\n if (cancelledId) {\n const liveIds = new Set(chatHelpers.messages.map((m) => m.id));\n setCancelledMessages((prev) => {\n const kept =\n prev?.chatId === chatHelpers.id\n ? [...prev.ids].filter((id) => liveIds.has(id))\n : [];\n return {\n chatId: chatHelpers.id,\n ids: new Set([...kept, cancelledId]),\n };\n });\n }\n try {\n await chatHelpers.stop();\n } catch (error) {\n if (!(error instanceof Error && error.name === \"AbortError\")) {\n if (cancelledId) retractCancellation(chatHelpers.id, cancelledId);\n throw error;\n }\n }\n },\n onNew: async (message) => {\n const createMessage = (\n customToCreateMessage ?? toCreateMessage\n )<UI_MESSAGE>(message);\n\n if (!(message.startRun ?? message.role === \"user\")) {\n chatHelpers.setMessages((current) => [\n ...current,\n toUIMessage<UI_MESSAGE>(createMessage, message.role),\n ]);\n return;\n }\n\n lastRunConfigRef.current = message.runConfig;\n await completePendingToolCalls();\n await chatHelpers.sendMessage(createMessage, {\n metadata: message.runConfig,\n });\n },\n onEdit: async (message) => {\n const createMessage = (\n customToCreateMessage ?? toCreateMessage\n )<UI_MESSAGE>(message);\n\n if (!(message.startRun ?? message.role === \"user\")) {\n chatHelpers.setMessages((current) => [\n ...sliceMessagesUntil(current, message.parentId),\n toUIMessage<UI_MESSAGE>(createMessage, message.role),\n ]);\n return;\n }\n\n lastRunConfigRef.current = message.runConfig;\n chatHelpers.setMessages((current) =>\n sliceMessagesUntil(current, message.parentId),\n );\n await chatHelpers.sendMessage(createMessage, {\n metadata: message.runConfig,\n });\n },\n onDelete: async (messageId) => {\n const threadMessages = runtimeRef.current.thread.getState().messages;\n const messageIndex = threadMessages.findIndex(\n (message) => message.id === messageId,\n );\n if (messageIndex === -1) return;\n\n await deleteHistoryMessage(messageId);\n\n const deleteIds = new Set(\n getExternalStoreMessages<UI_MESSAGE>(threadMessages[messageIndex]!).map(\n (message) => message.id,\n ),\n );\n chatHelpers.setMessages((current) =>\n current.filter((message) => !deleteIds.has(message.id)),\n );\n },\n onReload: async (parentId: string | null, config) => {\n lastRunConfigRef.current = config.runConfig;\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.regenerate({ metadata: config.runConfig });\n },\n onAddToolResult: ({\n toolCallId,\n toolName,\n result,\n isError,\n modelContent,\n }) => {\n const options = { metadata: lastRunConfigRef.current };\n if (isError) {\n return Promise.resolve(\n chatHelpers.addToolOutput({\n state: \"output-error\",\n tool: toolName ?? toolCallId,\n toolCallId,\n errorText:\n typeof result === \"string\" ? result : JSON.stringify(result),\n options,\n }),\n );\n } else {\n const output =\n modelContent !== undefined\n ? wrapModelContentEnvelope(result, modelContent)\n : result;\n return Promise.resolve(\n chatHelpers.addToolOutput({\n tool: toolName,\n toolCallId,\n output,\n options,\n }),\n );\n }\n },\n onRespondToToolApproval: customOnRespondToToolApproval\n ? (response) => respondViaHost(customOnRespondToToolApproval, response)\n : respondViaAISDK,\n ...pickExternalStoreSharedOptions(adapter),\n ...(adapter.unstable_messageRepositoryInstance && {\n unstable_messageRepositoryInstance:\n adapter.unstable_messageRepositoryInstance,\n }),\n ...(suggestionAdapter ? { suggestions: generatedSuggestions } : {}),\n ...(onResume && { onResume }),\n ...(onResumeToolCall && { onResumeToolCall }),\n ...(unstable_onBranchChange && { unstable_onBranchChange }),\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...contextAdapters,\n ...adapters,\n },\n extras,\n isLoading,\n });\n\n const setMessagesRef = useRef(chatHelpers.setMessages);\n useInsertionEffect(() => {\n setMessagesRef.current = chatHelpers.setMessages;\n }, [chatHelpers.setMessages]);\n\n useEffect(() => {\n if (hasSeededRepositoryRef.current) return;\n if (!exportedMessageRepository) return;\n if (chatHelpers.messages.length > 0) {\n hasSeededRepositoryRef.current = true;\n return;\n }\n const tempRepo = new MessageRepository();\n tempRepo.import(exportedMessageRepository);\n setMessagesRef.current(\n tempRepo.getMessages().flatMap(getExternalStoreMessages<UI_MESSAGE>),\n );\n hasSeededRepositoryRef.current = true;\n }, [exportedMessageRepository, chatHelpers.messages.length]);\n return runtime;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAISDKRuntime.js","names":["c","_c","useCallback","useEffect","useInsertionEffect","useMemo","useRef","useState","UIMessage","useChat","CreateUIMessage","UseChatHelpers","isToolUIPart","generateId","getToolName","useExternalStoreRuntime","useRuntimeAdapters","JoinStrategy","SuggestionAdapter","ThreadSuggestion","ToolExecutionStatus","ExternalStoreAdapter","ExternalStoreSharedOptions","ThreadHistoryAdapter","AssistantRuntime","ThreadMessage","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","AppendMessage","RunConfig","McpAppMetadata","RespondToToolApprovalOptions","Unstable_ToolInteractionLog","getExternalStoreMessages","pickExternalStoreSharedOptions","appendToolInteraction","consumeSuggestionResult","MessageRepository","ReadonlyJSONObject","AssistantError","sliceMessagesUntil","toCreateMessage","vercelAttachmentAdapter","getVercelAIMessages","AISDKMessageConverter","AISDKMessageConverterMetadata","wrapModelContentEnvelope","AISDKStorageFormat","aiSDKV6FormatAdapter","useExternalHistory","toExportedMessageRepository","useStreamingTiming","aiSDKExtras","CustomToCreateMessageFunction","message","UI_MESSAGE","toUIMessage","createMessage","fallbackRole","id","role","toVoiceTranscriptUIMessage","parts","content","filter","part","type","map","text","metadata","modality","Object","keys","custom","length","AISDKRuntimeAdapter","adapters","NonNullable","history","suggestion","unstable_messageRepositoryInstance","cancelPendingToolCallsOnSend","onResume","onResumeToolCall","onRespondToToolApproval","response","context","toolCallId","toolName","respondViaAISDK","Promise","joinStrategy","messageRepository","unstable_onBranchChange","EMPTY_SUGGESTIONS","useGeneratedSuggestions","suggestionAdapter","messages","isRunning","$","suggestions","setSuggestions","controllerRef","wasRunningRef","messagesRef","t0","t1","current","adapterRef","t2","t3","hasAdapter","t4","clearSuggestions","abort","_temp","adapter","currentMessages","last","at","status","controller","AbortController","signal","promiseOrGenerator","generate","onUpdate","t5","t6","t7","Symbol","for","NO_CANCELLED_MESSAGE_IDS","ReadonlySet","Set","NO_TOOL_APPROVAL_RESPONSES","ReadonlyMap","Map","toChatError","error","Error","code","name","useAISDKRuntime","chatHelpers","ReturnType","customToCreateMessage","customOnRespondToToolApproval","contextAdapters","toolStatuses","setToolStatuses","Record","cancelledMessages","setCancelledMessages","chatId","ids","toolApprovalResponses","setToolApprovalResponses","toolArtifactEpoch","setToolArtifactEpoch","toolInteractionEpoch","setToolInteractionEpoch","hostApprovalIdsRef","toolApprovalResponsesRef","toolArgsKeyOrderCacheRef","toolLastInputCacheRef","toolArgsTextCacheRef","WeakMap","mcpAppMetadataCacheRef","toolArtifactsRef","toolInteractionsRef","lastRunConfigRef","undefined","markToolArtifactsChanged","epoch","markToolInteractionsChanged","hasExecutingTools","values","some","s","providerIsRunning","wasProviderRunningRef","messageTiming","lastMessage","optimisticMessageId","cancelledMessageIds","supportsRichToolApprovalResponses","toThreadMessages","sourceMessages","toolArtifacts","toolInteractions","retractCancellation","messageId","prev","has","delete","resumedMessageId","wasProviderRunning","useThreadMessages","toolArgsKeyOrderCache","toolArgsTextCache","toolLastInputCache","mcpAppMetadataCache","size","exportedMessageRepository","converted","generatedSuggestions","runtimeRef","runtime","isLoading","deleteMessage","deleteHistoryMessage","persistToolInteractions","persistToolApprovalResponses","setMessages","chatMessages","chatStatus","extras","provide","chat","completePendingToolCalls","hasChanges","next","messageChanged","state","approval","_approval","rest","const","errorText","approvalId","approved","reason","resolve","addToolApprovalResponse","options","respondViaHost","onRespond","requested","flatMap","find","applyResponse","applied","add","set","hasSeededRepositoryRef","shouldFeedRepository","unstable_persistsHistory","unstable_enableToolInvocations","Boolean","flat","onImport","onVoiceTranscript","onExportExternalState","exported","thread","export","expandedMessages","lastInnerIdMap","item","innerMessages","parentId","get","innerMessage","push","getId","result","headId","onLoadExternalState","repo","exportedRepo","import","onCancel","cancelledId","liveIds","m","kept","stop","onNew","startRun","runConfig","sendMessage","onEdit","onDelete","threadMessages","getState","messageIndex","findIndex","removedToolArtifact","removedToolInteractions","removedToolApprovalResponse","removedHostApprovalId","deleteIds","onReload","config","newMessages","regenerate","onAddToolResult","isError","artifact","modelContent","addToolOutput","tool","JSON","stringify","output","unstable_onRecordToolInteraction","interaction","attachments","setMessagesRef","tempRepo","getMessages"],"sources":["../../src/runtime/useAISDKRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useInsertionEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n UIMessage,\n useChat,\n CreateUIMessage,\n UseChatHelpers,\n} from \"@ai-sdk/react\";\nimport { isToolUIPart, generateId, getToolName } from \"ai\";\nimport {\n useExternalStoreRuntime,\n useRuntimeAdapters,\n type JoinStrategy,\n} from \"@assistant-ui/core/react\";\nimport type {\n SuggestionAdapter,\n ThreadSuggestion,\n ToolExecutionStatus,\n} from \"@assistant-ui/core\";\nimport type {\n ExternalStoreAdapter,\n ExternalStoreSharedOptions,\n ThreadHistoryAdapter,\n AssistantRuntime,\n ThreadMessage,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n AppendMessage,\n RunConfig,\n McpAppMetadata,\n RespondToToolApprovalOptions,\n Unstable_ToolInteractionLog,\n} from \"@assistant-ui/core\";\nimport {\n getExternalStoreMessages,\n pickExternalStoreSharedOptions,\n} from \"@assistant-ui/core\";\nimport {\n appendToolInteraction,\n consumeSuggestionResult,\n MessageRepository,\n} from \"@assistant-ui/core/internal\";\nimport type { ReadonlyJSONObject } from \"assistant-stream/utils\";\nimport type { AssistantError } from \"@assistant-ui/core\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../converters/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../adapters/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../utils/getVercelAIMessages\";\nimport {\n AISDKMessageConverter,\n type AISDKMessageConverterMetadata,\n} from \"../converters/convertMessage\";\nimport { wrapModelContentEnvelope } from \"../converters/modelContentEnvelope\";\nimport {\n type AISDKStorageFormat,\n aiSDKV6FormatAdapter,\n} from \"../adapters/aiSDKFormatAdapter\";\nimport {\n useExternalHistory,\n toExportedMessageRepository,\n} from \"./useExternalHistory\";\nimport { useStreamingTiming } from \"./useStreamingTiming\";\nimport { aiSDKExtras } from \"../aiSDKExtras\";\n\nexport type CustomToCreateMessageFunction = <\n UI_MESSAGE extends UIMessage = UIMessage,\n>(\n message: AppendMessage,\n) => CreateUIMessage<UI_MESSAGE>;\n\nconst toUIMessage = <UI_MESSAGE extends UIMessage>(\n createMessage: CreateUIMessage<UI_MESSAGE>,\n fallbackRole: UI_MESSAGE[\"role\"],\n): UI_MESSAGE =>\n ({\n ...createMessage,\n id: createMessage.id ?? generateId(),\n role: createMessage.role ?? fallbackRole,\n }) as UI_MESSAGE;\n\nconst toVoiceTranscriptUIMessage = <UI_MESSAGE extends UIMessage>(\n message: ThreadMessage,\n): UI_MESSAGE =>\n ({\n id: message.id,\n role: message.role,\n parts: message.content\n .filter((part) => part.type === \"text\")\n .map((part) => ({ type: \"text\", text: part.text })),\n metadata: {\n ...(message.metadata.modality && { modality: message.metadata.modality }),\n ...(Object.keys(message.metadata.custom).length > 0 && {\n custom: message.metadata.custom,\n }),\n },\n }) as UI_MESSAGE;\n\nexport type AISDKRuntimeAdapter<UI_MESSAGE extends UIMessage = UIMessage> =\n ExternalStoreSharedOptions & {\n adapters?:\n | (NonNullable<ExternalStoreAdapter[\"adapters\"]> & {\n history?: ThreadHistoryAdapter | undefined;\n suggestion?: SuggestionAdapter | undefined;\n })\n | undefined;\n toCreateMessage?: CustomToCreateMessageFunction;\n unstable_messageRepositoryInstance?: MessageRepository | undefined;\n /**\n * Whether to automatically cancel pending interactive tool calls when the user sends a new message.\n *\n * When enabled (default), the pending tool calls will be marked as failed with an error message\n * indicating the user cancelled the tool call by sending a new message.\n *\n * @default true\n */\n cancelPendingToolCallsOnSend?: boolean | undefined;\n /**\n * Called when `runtime.thread.resumeRun(config)` is invoked.\n *\n * When omitted, `resumeRun` throws `\"Runtime does not support resuming runs.\"`.\n * Provide this to bridge resume invocations into a custom replay channel\n * (for example, an SSE reconnect endpoint keyed by turn id).\n */\n onResume?: ExternalStoreAdapter[\"onResume\"];\n /**\n * Called when `runtime.thread.resumeToolCall(options)` is invoked for a tool call the in-process tracker does not own.\n *\n * When omitted, `resumeToolCall` throws `\"Tool call ${toolCallId} is not waiting for resume.\"`.\n * Provide this to bridge resume-tool-call invocations into a custom handler.\n */\n onResumeToolCall?: ExternalStoreAdapter[\"onResumeToolCall\"];\n /**\n * Answers tool approval requests through a host-owned channel instead of the AI SDK's `addToolApprovalResponse`.\n *\n * Called for every approval request in the thread with the complete response, including option and free-form answers. Hand requests the host does not own to `respondViaAISDK`, which is what runs when this option is omitted. The answer applies to the approval when the handler starts and is removed if it throws. It is never written into the `useChat` messages, so `sendAutomaticallyWhen` cannot forward it. With a history adapter, the answer is stored with its message once the handler resolves and returns on reload, and a second response to the same request rejects; without one it lasts as long as this runtime, and a runtime mounted again over the same chat shows the request open until the resumed run records its resolution in the chat.\n *\n * While a handler is set, an approval's `display`, `allowFreeform`, `dismissible` and `options` reach the renderer, because the handler can receive answers the AI SDK cannot carry. A stream declares them through the `approvalDescriptor` of its `tool-approval-request` chunk, the one approval field the AI SDK keeps opaque; the converter reads the request and answer fields from that descriptor when the approval itself lacks them.\n */\n onRespondToToolApproval?:\n | ((\n response: RespondToToolApprovalOptions,\n context: {\n toolCallId: string;\n toolName: string;\n /** Sends this response through the AI SDK's `addToolApprovalResponse`, which carries only `approved` and `reason`. */\n respondViaAISDK: () => Promise<void>;\n },\n ) => Promise<void> | void)\n | undefined;\n /**\n * How consecutive assistant messages are rendered.\n *\n * `\"concat-content\"` (the default) merges them into a single thread message.\n * `\"none\"` keeps each assistant message as its own thread message, which is\n * useful when a backend persists proactive or consecutive assistant messages\n * as separate entries.\n */\n joinStrategy?: JoinStrategy | undefined;\n /**\n * A branch-aware AI SDK message tree seeded once when `useChat` is empty.\n * After that seed, live updates come only from `useChat`. A later empty\n * chat or a new object identity does not reload the tree.\n */\n messageRepository?: MessageFormatRepository<UI_MESSAGE>;\n /**\n * Called after an explicit `switchToBranch` (for example a BranchPicker\n * click). Complements `setMessages` and does not enable switching by itself.\n *\n * @deprecated This API is still under active development and might change without notice.\n */\n unstable_onBranchChange?: ExternalStoreAdapter[\"unstable_onBranchChange\"];\n };\n\nconst EMPTY_SUGGESTIONS: readonly ThreadSuggestion[] = [];\n\nconst useGeneratedSuggestions = (\n suggestionAdapter: SuggestionAdapter | undefined,\n messages: readonly ThreadMessage[],\n isRunning: boolean,\n): readonly ThreadSuggestion[] => {\n const [suggestions, setSuggestions] =\n useState<readonly ThreadSuggestion[]>(EMPTY_SUGGESTIONS);\n const controllerRef = useRef<AbortController | null>(null);\n const wasRunningRef = useRef(false);\n const messagesRef = useRef(messages);\n useInsertionEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n const adapterRef = useRef(suggestionAdapter);\n useInsertionEffect(() => {\n adapterRef.current = suggestionAdapter;\n }, [suggestionAdapter]);\n const hasAdapter = suggestionAdapter != null;\n\n useEffect(() => {\n const clearSuggestions = () => {\n controllerRef.current?.abort();\n controllerRef.current = null;\n setSuggestions((prev) => (prev.length === 0 ? prev : EMPTY_SUGGESTIONS));\n };\n\n const adapter = adapterRef.current;\n if (!adapter) {\n clearSuggestions();\n wasRunningRef.current = isRunning;\n return;\n }\n\n if (isRunning) {\n if (!wasRunningRef.current) {\n clearSuggestions();\n }\n wasRunningRef.current = true;\n return;\n }\n\n if (!wasRunningRef.current) return;\n wasRunningRef.current = false;\n\n const currentMessages = messagesRef.current;\n const last = currentMessages.at(-1);\n if (last?.role !== \"assistant\") return;\n if (last.status?.type === \"requires-action\") return;\n\n const controller = new AbortController();\n controllerRef.current = controller;\n const { signal } = controller;\n\n void (async () => {\n try {\n const promiseOrGenerator = adapter.generate({\n messages: currentMessages,\n signal,\n });\n\n await consumeSuggestionResult(promiseOrGenerator, {\n signal,\n onUpdate: setSuggestions,\n });\n } catch {}\n })();\n }, [hasAdapter, isRunning]);\n\n useEffect(() => {\n return () => {\n controllerRef.current?.abort();\n };\n }, []);\n\n return suggestions;\n};\n\nconst NO_CANCELLED_MESSAGE_IDS: ReadonlySet<string> = new Set();\n\nconst NO_TOOL_APPROVAL_RESPONSES: ReadonlyMap<\n string,\n RespondToToolApprovalOptions\n> = new Map();\n\nconst toChatError = (error: Error): AssistantError => {\n const code = (error as { code?: unknown }).code;\n return {\n code:\n typeof code === \"string\"\n ? code\n : error.name !== \"Error\"\n ? error.name\n : \"unknown\",\n message: error.message,\n };\n};\n\nexport const useAISDKRuntime = <UI_MESSAGE extends UIMessage = UIMessage>(\n chatHelpers: ReturnType<typeof useChat<UI_MESSAGE>>,\n adapter: AISDKRuntimeAdapter<UI_MESSAGE> = {},\n) => {\n const {\n adapters,\n toCreateMessage: customToCreateMessage,\n cancelPendingToolCallsOnSend = true,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval: customOnRespondToToolApproval,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n } = adapter;\n const suggestionAdapter = adapters?.suggestion;\n const contextAdapters = useRuntimeAdapters();\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n const [cancelledMessages, setCancelledMessages] = useState<{\n chatId: string;\n ids: ReadonlySet<string>;\n } | null>(null);\n const [toolApprovalResponses, setToolApprovalResponses] = useState<\n ReadonlyMap<string, RespondToToolApprovalOptions>\n >(NO_TOOL_APPROVAL_RESPONSES);\n const [toolArtifactEpoch, setToolArtifactEpoch] = useState(0);\n const [toolInteractionEpoch, setToolInteractionEpoch] = useState(0);\n const hostApprovalIdsRef = useRef(new Set<string>());\n const toolApprovalResponsesRef = useRef<\n Map<string, RespondToToolApprovalOptions>\n >(new Map());\n const toolArgsKeyOrderCacheRef = useRef<Map<string, Map<string, string[]>>>(\n new Map(),\n );\n const toolLastInputCacheRef = useRef<Map<string, ReadonlyJSONObject>>(\n new Map(),\n );\n const toolArgsTextCacheRef = useRef<\n WeakMap<ReadonlyJSONObject, Map<string, string>>\n >(new WeakMap());\n const mcpAppMetadataCacheRef = useRef<Map<string, McpAppMetadata>>(new Map());\n const toolArtifactsRef = useRef<Map<string, unknown>>(new Map());\n const toolInteractionsRef = useRef<Map<string, Unstable_ToolInteractionLog>>(\n new Map(),\n );\n const lastRunConfigRef = useRef<RunConfig | undefined>(undefined);\n const markToolArtifactsChanged = useCallback(() => {\n setToolArtifactEpoch((epoch) => epoch + 1);\n }, []);\n const markToolInteractionsChanged = useCallback(() => {\n setToolInteractionEpoch((epoch) => epoch + 1);\n }, []);\n\n const hasExecutingTools = Object.values(toolStatuses).some(\n (s) => s?.type === \"executing\",\n );\n const providerIsRunning =\n chatHelpers.status === \"submitted\" || chatHelpers.status === \"streaming\";\n const isRunning = providerIsRunning || hasExecutingTools;\n const wasProviderRunningRef = useRef(providerIsRunning);\n\n const messageTiming = useStreamingTiming(chatHelpers.messages, isRunning);\n\n // Flag the streaming message optimistic: its id can be swapped for a server\n // id mid-run, and the repository then drops the orphaned pre-swap id (#4037).\n const lastMessage = chatHelpers.messages.at(-1);\n const optimisticMessageId =\n isRunning && lastMessage?.role === \"assistant\" ? lastMessage.id : undefined;\n\n const cancelledMessageIds =\n cancelledMessages?.chatId === chatHelpers.id\n ? cancelledMessages.ids\n : NO_CANCELLED_MESSAGE_IDS;\n const supportsRichToolApprovalResponses =\n customOnRespondToToolApproval != null;\n\n const toThreadMessages = useCallback(\n (sourceMessages: UI_MESSAGE[]) => {\n const metadata: AISDKMessageConverterMetadata = {\n supportsRichToolApprovalResponses,\n toolArtifacts: toolArtifactsRef.current,\n toolInteractions: toolInteractionsRef.current,\n toolApprovalResponses: toolApprovalResponsesRef.current,\n };\n return AISDKMessageConverter.toThreadMessages(\n sourceMessages,\n false,\n metadata,\n );\n },\n [supportsRichToolApprovalResponses],\n );\n\n const retractCancellation = useCallback(\n (chatId: string, messageId: string) => {\n setCancelledMessages((prev) => {\n if (prev?.chatId !== chatId || !prev.ids.has(messageId)) return prev;\n const ids = new Set(prev.ids);\n ids.delete(messageId);\n return { chatId, ids };\n });\n },\n [],\n );\n\n // A provider run that resumes the stopped response retracts its cancellation;\n // a run that starts a new response leaves the stopped one marked.\n const resumedMessageId =\n providerIsRunning && lastMessage?.role === \"assistant\"\n ? lastMessage.id\n : undefined;\n\n useEffect(() => {\n const wasProviderRunning = wasProviderRunningRef.current;\n wasProviderRunningRef.current = providerIsRunning;\n if (wasProviderRunning || !resumedMessageId) return;\n retractCancellation(chatHelpers.id, resumedMessageId);\n }, [\n providerIsRunning,\n resumedMessageId,\n chatHelpers.id,\n retractCancellation,\n ]);\n\n const messages = AISDKMessageConverter.useThreadMessages({\n isRunning,\n messages: chatHelpers.messages,\n joinStrategy,\n metadata: useMemo<AISDKMessageConverterMetadata>(\n () => ({\n toolStatuses,\n messageTiming,\n toolArgsKeyOrderCache: toolArgsKeyOrderCacheRef.current,\n toolArgsTextCache: toolArgsTextCacheRef.current,\n toolLastInputCache: toolLastInputCacheRef.current,\n mcpAppMetadataCache: mcpAppMetadataCacheRef.current,\n toolArtifacts: toolArtifactsRef.current,\n toolInteractions: toolInteractionsRef.current,\n supportsRichToolApprovalResponses,\n ...(optimisticMessageId && { optimisticMessageId }),\n ...(chatHelpers.error && {\n error: toChatError(chatHelpers.error),\n }),\n ...(cancelledMessageIds.size > 0 && { cancelledMessageIds }),\n ...(toolApprovalResponses.size > 0 && { toolApprovalResponses }),\n }),\n [\n toolStatuses,\n messageTiming,\n optimisticMessageId,\n chatHelpers.error,\n cancelledMessageIds,\n toolApprovalResponses,\n supportsRichToolApprovalResponses,\n toolArtifactEpoch,\n toolInteractionEpoch,\n ],\n ),\n });\n\n const exportedMessageRepository = useMemo(() => {\n if (!messageRepository) return undefined;\n const converted = toExportedMessageRepository(\n toThreadMessages,\n messageRepository,\n );\n return converted.messages.length > 0 ? converted : undefined;\n }, [messageRepository, toThreadMessages]);\n\n const generatedSuggestions = useGeneratedSuggestions(\n suggestionAdapter,\n messages,\n isRunning,\n );\n\n const [runtimeRef] = useState(() => ({\n get current(): AssistantRuntime {\n return runtime;\n },\n }));\n\n const {\n isLoading,\n deleteMessage: deleteHistoryMessage,\n persistToolInteractions,\n persistToolApprovalResponses,\n } = useExternalHistory(\n runtimeRef,\n adapters?.history ?? contextAdapters?.history,\n toThreadMessages,\n aiSDKV6FormatAdapter as MessageFormatAdapter<\n UI_MESSAGE,\n AISDKStorageFormat\n >,\n (messages) => {\n chatHelpers.setMessages(messages);\n },\n toolArtifactsRef.current,\n markToolArtifactsChanged,\n toolInteractionsRef.current,\n markToolInteractionsChanged,\n toolApprovalResponsesRef.current,\n () => {\n hostApprovalIdsRef.current = new Set(\n toolApprovalResponsesRef.current.keys(),\n );\n setToolApprovalResponses(new Map(toolApprovalResponsesRef.current));\n },\n );\n\n const {\n id: chatId,\n messages: chatMessages,\n status: chatStatus,\n error,\n } = chatHelpers;\n const extras = useMemo(\n () =>\n aiSDKExtras.provide({\n chat: chatHelpers as unknown as UseChatHelpers<UIMessage>,\n error,\n }),\n // oxlint-disable-next-line react/exhaustive-deps -- keyed on the chat's identity and reactive snapshots; useChat re-mints the helpers object every render while its remaining fields are instance-bound methods, and a render-stable extras identity is what lets the external-store core dedupe adapter updates\n [chatId, chatMessages, chatStatus, error],\n );\n\n const completePendingToolCalls = async () => {\n if (!cancelPendingToolCallsOnSend) return;\n\n // The runtime auto-aborts in-flight tool invocations when a new run\n // is dispatched (append() / startRun()), so this only has to mark the\n // abandoned tools cancelled in the UI message list. Every non-terminal\n // tool call qualifies wherever it sits: the run that produced it is over,\n // and a staged `startRun: false` message can sit between it and the tail.\n // Uses setMessages to avoid triggering sendAutomaticallyWhen.\n chatHelpers.setMessages((messages) => {\n let hasChanges = false;\n\n const next = messages.map((message) => {\n if (message.role !== \"assistant\") return message;\n\n let messageChanged = false;\n const parts = message.parts?.map((part) => {\n if (!isToolUIPart(part)) return part;\n if (\n part.state === \"output-available\" ||\n part.state === \"output-error\" ||\n part.state === \"output-denied\"\n )\n return part;\n\n messageChanged = true;\n const { approval: _approval, ...rest } = part;\n return {\n ...rest,\n state: \"output-error\" as const,\n errorText: \"User cancelled tool call by sending a new message.\",\n };\n });\n\n if (!messageChanged) return message;\n hasChanges = true;\n return { ...message, parts };\n });\n\n if (!hasChanges) return messages;\n return next;\n });\n };\n\n const respondViaAISDK = ({\n approvalId,\n approved,\n reason,\n }: RespondToToolApprovalOptions) =>\n Promise.resolve(\n chatHelpers.addToolApprovalResponse({\n id: approvalId,\n approved,\n ...(reason != null && { reason }),\n options: { metadata: lastRunConfigRef.current },\n }),\n );\n\n const respondViaHost = async (\n onRespond: NonNullable<AISDKRuntimeAdapter[\"onRespondToToolApproval\"]>,\n response: RespondToToolApprovalOptions,\n ) => {\n const { approvalId } = response;\n const requested = chatHelpers.messages\n .flatMap((message) =>\n message.parts.flatMap((part) =>\n isToolUIPart(part) ? [{ messageId: message.id, part }] : [],\n ),\n )\n .find(\n ({ part }) =>\n part.state === \"approval-requested\" &&\n part.approval.id === approvalId,\n );\n if (!requested || hostApprovalIdsRef.current.has(approvalId))\n throw new Error(\n `Tool approval ${approvalId} is not waiting for a response.`,\n );\n\n // A host answer stays out of the useChat messages, where sendAutomaticallyWhen would forward it to the chat route.\n const applyResponse = (applied: boolean) => {\n if (applied) hostApprovalIdsRef.current.add(approvalId);\n else hostApprovalIdsRef.current.delete(approvalId);\n if (applied) toolApprovalResponsesRef.current.set(approvalId, response);\n else toolApprovalResponsesRef.current.delete(approvalId);\n setToolApprovalResponses(new Map(toolApprovalResponsesRef.current));\n };\n\n applyResponse(true);\n try {\n await onRespond(response, {\n toolCallId: requested.part.toolCallId,\n toolName: getToolName(requested.part),\n respondViaAISDK: async () => {\n try {\n await respondViaAISDK(response);\n } finally {\n applyResponse(false);\n }\n },\n });\n } catch (error) {\n if (hostApprovalIdsRef.current.has(approvalId)) applyResponse(false);\n throw error;\n }\n if (hostApprovalIdsRef.current.has(approvalId)) {\n await persistToolApprovalResponses(requested.messageId);\n }\n };\n\n const hasSeededRepositoryRef = useRef(false);\n const shouldFeedRepository =\n exportedMessageRepository != null &&\n !hasSeededRepositoryRef.current &&\n messages.length === 0;\n\n const runtime = useExternalStoreRuntime({\n unstable_persistsHistory: true,\n isRunning: providerIsRunning,\n ...(shouldFeedRepository\n ? { messageRepository: exportedMessageRepository }\n : { messages }),\n unstable_enableToolInvocations: true,\n setToolStatuses,\n setMessages: (messages) =>\n chatHelpers.setMessages(\n messages\n .map(getVercelAIMessages<UI_MESSAGE>)\n .filter(Boolean)\n .flat(),\n ),\n onImport: (messages) =>\n chatHelpers.setMessages(\n messages\n .map(getVercelAIMessages<UI_MESSAGE>)\n .filter(Boolean)\n .flat(),\n ),\n onVoiceTranscript: (message: ThreadMessage) =>\n chatHelpers.setMessages((current) => [\n ...current,\n toVoiceTranscriptUIMessage<UI_MESSAGE>(message),\n ]),\n onExportExternalState: (): MessageFormatRepository<UI_MESSAGE> => {\n const exported = runtimeRef.current.thread.export();\n\n const expandedMessages: MessageFormatItem<UI_MESSAGE>[] = [];\n const lastInnerIdMap = new Map<string, string>();\n\n for (const item of exported.messages) {\n const innerMessages = getExternalStoreMessages<UI_MESSAGE>(\n item.message,\n );\n let parentId =\n item.parentId != null\n ? (lastInnerIdMap.get(item.parentId) ?? item.parentId)\n : null;\n for (const innerMessage of innerMessages) {\n expandedMessages.push({ parentId, message: innerMessage });\n parentId = aiSDKV6FormatAdapter.getId(innerMessage as UIMessage);\n }\n if (innerMessages.length > 0) {\n lastInnerIdMap.set(\n item.message.id,\n aiSDKV6FormatAdapter.getId(\n innerMessages[innerMessages.length - 1]! as UIMessage,\n ),\n );\n }\n }\n\n const result: MessageFormatRepository<UI_MESSAGE> = {\n messages: expandedMessages,\n };\n\n if (exported.headId != null) {\n result.headId = lastInnerIdMap.get(exported.headId) ?? exported.headId;\n }\n\n return result;\n },\n onLoadExternalState: (repo: MessageFormatRepository<UI_MESSAGE>) => {\n // Convert MessageFormatRepository to ExportedMessageRepository\n const exportedRepo = toExportedMessageRepository(toThreadMessages, repo);\n\n // Import into the thread's MessageRepository\n runtimeRef.current.thread.import(exportedRepo);\n },\n onCancel: async () => {\n const message = chatHelpers.messages.at(-1);\n const cancelledId =\n isRunning && message?.role === \"assistant\" ? message.id : undefined;\n if (cancelledId) {\n const liveIds = new Set(chatHelpers.messages.map((m) => m.id));\n setCancelledMessages((prev) => {\n const kept =\n prev?.chatId === chatHelpers.id\n ? [...prev.ids].filter((id) => liveIds.has(id))\n : [];\n return {\n chatId: chatHelpers.id,\n ids: new Set([...kept, cancelledId]),\n };\n });\n }\n try {\n await chatHelpers.stop();\n } catch (error) {\n if (!(error instanceof Error && error.name === \"AbortError\")) {\n if (cancelledId) retractCancellation(chatHelpers.id, cancelledId);\n throw error;\n }\n }\n },\n onNew: async (message) => {\n const createMessage = (\n customToCreateMessage ?? toCreateMessage\n )<UI_MESSAGE>(message);\n\n if (!(message.startRun ?? message.role === \"user\")) {\n chatHelpers.setMessages((current) => [\n ...current,\n toUIMessage<UI_MESSAGE>(createMessage, message.role),\n ]);\n return;\n }\n\n lastRunConfigRef.current = message.runConfig;\n await completePendingToolCalls();\n await chatHelpers.sendMessage(createMessage, {\n metadata: message.runConfig,\n });\n },\n onEdit: async (message) => {\n const createMessage = (\n customToCreateMessage ?? toCreateMessage\n )<UI_MESSAGE>(message);\n\n if (!(message.startRun ?? message.role === \"user\")) {\n chatHelpers.setMessages((current) => [\n ...sliceMessagesUntil(current, message.parentId),\n toUIMessage<UI_MESSAGE>(createMessage, message.role),\n ]);\n return;\n }\n\n lastRunConfigRef.current = message.runConfig;\n chatHelpers.setMessages((current) =>\n sliceMessagesUntil(current, message.parentId),\n );\n await chatHelpers.sendMessage(createMessage, {\n metadata: message.runConfig,\n });\n },\n onDelete: async (messageId) => {\n const threadMessages = runtimeRef.current.thread.getState().messages;\n const messageIndex = threadMessages.findIndex(\n (message) => message.id === messageId,\n );\n if (messageIndex === -1) return;\n\n await deleteHistoryMessage(messageId);\n\n let removedToolArtifact = false;\n let removedToolInteractions = false;\n let removedToolApprovalResponse = false;\n let removedHostApprovalId = false;\n for (const part of threadMessages[messageIndex]!.content) {\n if (part.type === \"tool-call\") {\n removedToolArtifact =\n toolArtifactsRef.current.delete(part.toolCallId) ||\n removedToolArtifact;\n removedToolInteractions =\n toolInteractionsRef.current.delete(part.toolCallId) ||\n removedToolInteractions;\n if (part.approval) {\n removedToolApprovalResponse =\n toolApprovalResponsesRef.current.delete(part.approval.id) ||\n removedToolApprovalResponse;\n removedHostApprovalId =\n hostApprovalIdsRef.current.delete(part.approval.id) ||\n removedHostApprovalId;\n }\n }\n }\n if (removedToolArtifact) markToolArtifactsChanged();\n if (removedToolInteractions) markToolInteractionsChanged();\n if (removedToolApprovalResponse || removedHostApprovalId) {\n setToolApprovalResponses(new Map(toolApprovalResponsesRef.current));\n }\n\n const deleteIds = new Set(\n getExternalStoreMessages<UI_MESSAGE>(threadMessages[messageIndex]!).map(\n (message) => message.id,\n ),\n );\n chatHelpers.setMessages((current) =>\n current.filter((message) => !deleteIds.has(message.id)),\n );\n },\n onReload: async (parentId: string | null, config) => {\n lastRunConfigRef.current = config.runConfig;\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.regenerate({ metadata: config.runConfig });\n },\n onAddToolResult: ({\n toolCallId,\n toolName,\n result,\n isError,\n artifact,\n modelContent,\n }) => {\n if (artifact !== undefined) {\n toolArtifactsRef.current.set(toolCallId, artifact);\n markToolArtifactsChanged();\n }\n const options = { metadata: lastRunConfigRef.current };\n if (isError) {\n return Promise.resolve(\n chatHelpers.addToolOutput({\n state: \"output-error\",\n tool: toolName ?? toolCallId,\n toolCallId,\n errorText:\n typeof result === \"string\" ? result : JSON.stringify(result),\n options,\n }),\n );\n } else {\n const output =\n modelContent !== undefined\n ? wrapModelContentEnvelope(result, modelContent)\n : result;\n return Promise.resolve(\n chatHelpers.addToolOutput({\n tool: toolName,\n toolCallId,\n output,\n options,\n }),\n );\n }\n },\n onRespondToToolApproval: customOnRespondToToolApproval\n ? (response) => respondViaHost(customOnRespondToToolApproval, response)\n : respondViaAISDK,\n unstable_onRecordToolInteraction: ({\n messageId,\n toolCallId,\n interaction,\n }) => {\n toolInteractionsRef.current.set(\n toolCallId,\n appendToolInteraction(\n toolInteractionsRef.current.get(toolCallId),\n interaction,\n ),\n );\n markToolInteractionsChanged();\n return persistToolInteractions(messageId);\n },\n ...pickExternalStoreSharedOptions(adapter),\n ...(adapter.unstable_messageRepositoryInstance && {\n unstable_messageRepositoryInstance:\n adapter.unstable_messageRepositoryInstance,\n }),\n ...(suggestionAdapter ? { suggestions: generatedSuggestions } : {}),\n ...(onResume && { onResume }),\n ...(onResumeToolCall && { onResumeToolCall }),\n ...(unstable_onBranchChange && { unstable_onBranchChange }),\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...contextAdapters,\n ...adapters,\n },\n extras,\n isLoading,\n });\n\n const setMessagesRef = useRef(chatHelpers.setMessages);\n useInsertionEffect(() => {\n setMessagesRef.current = chatHelpers.setMessages;\n }, [chatHelpers.setMessages]);\n\n useEffect(() => {\n if (hasSeededRepositoryRef.current) return;\n if (!exportedMessageRepository) return;\n if (chatHelpers.messages.length > 0) {\n hasSeededRepositoryRef.current = true;\n return;\n }\n const tempRepo = new MessageRepository();\n tempRepo.import(exportedMessageRepository);\n setMessagesRef.current(\n tempRepo.getMessages().flatMap(getExternalStoreMessages<UI_MESSAGE>),\n );\n hasSeededRepositoryRef.current = true;\n }, [exportedMessageRepository, chatHelpers.messages.length]);\n return runtime;\n};\n"],"mappings":"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"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
//#region src/runtime/useChatRuntime.d.ts
|
|
1
|
+
import type { UIMessage } from "@ai-sdk/react";
|
|
2
|
+
import type { AssistantCloud } from "assistant-cloud";
|
|
3
|
+
import type { AssistantRuntime } from "@assistant-ui/core";
|
|
4
|
+
import { type ChatThreadOptions } from "./useChatThread.js";
|
|
6
5
|
export type UseChatRuntimeOptions<UI_MESSAGE extends UIMessage = UIMessage> = ChatThreadOptions<UI_MESSAGE> & {
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
cloud?: AssistantCloud | undefined;
|
|
7
|
+
onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;
|
|
9
8
|
};
|
|
10
9
|
export declare const useChatRuntime: <UI_MESSAGE extends UIMessage = UIMessage>({ cloud, onThreadIdChange, ...options }?: UseChatRuntimeOptions<UI_MESSAGE>) => AssistantRuntime;
|
|
11
|
-
//#endregion
|
|
12
10
|
//# sourceMappingURL=useChatRuntime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChatRuntime.d.ts","
|
|
1
|
+
{"version":3,"file":"useChatRuntime.d.ts","sourceRoot":"","sources":["../../src/runtime/useChatRuntime.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAO3D,OAAO,EAAiB,KAAK,iBAAiB,EAAE,2BAAwB;AAGxE,MAAM,MAAM,qBAAqB,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,IACxE,iBAAiB,CAAC,UAAU,CAAC,GAAG;IAC9B,KAAK,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACnC,gBAAgB,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACzE,CAAC;AAqBJ,eAAO,MAAM,cAAc,GAAI,UAAU,SAAS,SAAS,GAAG,SAAS,EAAE,0CAItE,qBAAqB,CAAC,UAAU,CAAM,KAAG,gBAW3C,CAAC"}
|