@assistant-ui/ai-sdk 0.0.2 → 0.0.4
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/converters/convertMessage.d.ts.map +1 -1
- package/dist/converters/convertMessage.js +23 -2
- package/dist/converters/convertMessage.js.map +1 -1
- package/dist/converters/toCreateMessage.d.ts.map +1 -1
- package/dist/converters/toCreateMessage.js +6 -2
- package/dist/converters/toCreateMessage.js.map +1 -1
- package/dist/model-context/injectInteractableContext.d.ts +1 -1
- package/dist/model-context/injectInteractableContext.js +1 -1
- package/dist/model-context/injectInteractableContext.js.map +1 -1
- package/dist/model-context/injectQuoteContext.d.ts +1 -1
- package/dist/model-context/injectQuoteContext.js +1 -1
- package/dist/model-context/injectQuoteContext.js.map +1 -1
- package/dist/runtime/AISDKChat.js +1 -1
- package/dist/runtime/AISDKThreads.d.ts +10 -8
- package/dist/runtime/AISDKThreads.d.ts.map +1 -1
- package/dist/runtime/AISDKThreads.js +34 -27
- package/dist/runtime/AISDKThreads.js.map +1 -1
- package/dist/runtime/useAISDKRuntime.d.ts +18 -3
- package/dist/runtime/useAISDKRuntime.d.ts.map +1 -1
- package/dist/runtime/useAISDKRuntime.js +199 -73
- package/dist/runtime/useAISDKRuntime.js.map +1 -1
- package/dist/runtime/useChatRuntime.js +1 -1
- package/dist/runtime/useChatThread.d.ts +14 -1
- package/dist/runtime/useChatThread.d.ts.map +1 -1
- package/dist/runtime/useChatThread.js +11 -4
- package/dist/runtime/useChatThread.js.map +1 -1
- package/dist/runtime/useExternalHistory.d.ts.map +1 -1
- package/dist/runtime/useExternalHistory.js +52 -47
- package/dist/runtime/useExternalHistory.js.map +1 -1
- package/dist/runtime/useResourceCleanup.js +1 -1
- package/dist/usage.d.ts +1 -2
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +5 -7
- package/dist/usage.js.map +1 -1
- package/package.json +12 -12
- package/src/converters/convertMessage.test.ts +22 -0
- package/src/converters/convertMessage.ts +26 -2
- package/src/converters/toCreateMessage.ts +6 -5
- package/src/model-context/injectInteractableContext.ts +1 -1
- package/src/model-context/injectQuoteContext.ts +1 -1
- package/src/runtime/AISDKThreads.cloud.test.ts +11 -1
- package/src/runtime/AISDKThreads.test.ts +102 -0
- package/src/runtime/AISDKThreads.ts +16 -9
- package/src/runtime/useAISDKRuntime.denied-tool.test.tsx +122 -0
- package/src/runtime/useAISDKRuntime.test.ts +479 -10
- package/src/runtime/useAISDKRuntime.ts +199 -55
- package/src/runtime/useChatRuntime.integration.test.tsx +46 -0
- package/src/runtime/useChatRuntime.test.ts +16 -0
- package/src/runtime/useChatThread.ts +26 -0
- package/src/runtime/useExternalHistory.test.ts +143 -1
- package/src/runtime/useExternalHistory.ts +53 -56
- package/src/usage.test.ts +26 -8
- package/src/usage.ts +4 -9
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { JoinStrategy } from "@assistant-ui/core/react";
|
|
2
|
-
import { AppendMessage, AssistantRuntime, ExternalStoreAdapter, ExternalStoreSharedOptions, SuggestionAdapter, ThreadHistoryAdapter } from "@assistant-ui/core";
|
|
2
|
+
import { AppendMessage, AssistantRuntime, ExternalStoreAdapter, ExternalStoreSharedOptions, MessageFormatRepository, SuggestionAdapter, ThreadHistoryAdapter } from "@assistant-ui/core";
|
|
3
|
+
import { MessageRepository } from "@assistant-ui/core/internal";
|
|
3
4
|
import { CreateUIMessage, UIMessage, useChat } from "@ai-sdk/react";
|
|
4
5
|
//#region src/runtime/useAISDKRuntime.d.ts
|
|
5
6
|
type CustomToCreateMessageFunction = <UI_MESSAGE extends UIMessage = UIMessage>(message: AppendMessage) => CreateUIMessage<UI_MESSAGE>;
|
|
6
|
-
type AISDKRuntimeAdapter = ExternalStoreSharedOptions & {
|
|
7
|
+
type AISDKRuntimeAdapter<UI_MESSAGE extends UIMessage = UIMessage> = ExternalStoreSharedOptions & {
|
|
7
8
|
adapters?: (NonNullable<ExternalStoreAdapter["adapters"]> & {
|
|
8
9
|
history?: ThreadHistoryAdapter | undefined;
|
|
9
10
|
suggestion?: SuggestionAdapter | undefined;
|
|
10
11
|
}) | undefined;
|
|
11
12
|
toCreateMessage?: CustomToCreateMessageFunction;
|
|
13
|
+
unstable_messageRepositoryInstance?: MessageRepository | undefined;
|
|
12
14
|
/**
|
|
13
15
|
* Whether to automatically cancel pending interactive tool calls when the user sends a new message.
|
|
14
16
|
*
|
|
@@ -42,8 +44,21 @@ type AISDKRuntimeAdapter = ExternalStoreSharedOptions & {
|
|
|
42
44
|
* as separate entries.
|
|
43
45
|
*/
|
|
44
46
|
joinStrategy?: JoinStrategy | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* A branch-aware AI SDK message tree seeded once when `useChat` is empty.
|
|
49
|
+
* After that seed, live updates come only from `useChat`. A later empty
|
|
50
|
+
* chat or a new object identity does not reload the tree.
|
|
51
|
+
*/
|
|
52
|
+
messageRepository?: MessageFormatRepository<UI_MESSAGE>;
|
|
53
|
+
/**
|
|
54
|
+
* Called after an explicit `switchToBranch` (for example a BranchPicker
|
|
55
|
+
* click). Complements `setMessages` and does not enable switching by itself.
|
|
56
|
+
*
|
|
57
|
+
* @deprecated This API is still under active development and might change without notice.
|
|
58
|
+
*/
|
|
59
|
+
unstable_onBranchChange?: ExternalStoreAdapter["unstable_onBranchChange"];
|
|
45
60
|
};
|
|
46
|
-
declare const useAISDKRuntime: <UI_MESSAGE extends UIMessage = UIMessage>(chatHelpers: ReturnType<typeof useChat<UI_MESSAGE>>, adapter?: AISDKRuntimeAdapter) => AssistantRuntime;
|
|
61
|
+
declare const useAISDKRuntime: <UI_MESSAGE extends UIMessage = UIMessage>(chatHelpers: ReturnType<typeof useChat<UI_MESSAGE>>, adapter?: AISDKRuntimeAdapter<UI_MESSAGE>) => AssistantRuntime;
|
|
47
62
|
//#endregion
|
|
48
63
|
export { AISDKRuntimeAdapter, CustomToCreateMessageFunction, useAISDKRuntime };
|
|
49
64
|
//# sourceMappingURL=useAISDKRuntime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAISDKRuntime.d.ts","names":[],"sources":["../../src/runtime/useAISDKRuntime.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"useAISDKRuntime.d.ts","names":[],"sources":["../../src/runtime/useAISDKRuntime.ts"],"mappings":";;;;;KAkEY,iCACV,mBAAmB,YAAY,WAE/B,SAAS,kBACN,gBAAgB;KAYT,oBAAoB,mBAAmB,YAAY,aAC7D;EACE,YACK,YAAY;IACX,UAAU;IACV,aAAa;;EAGnB,kBAAkB;EAClB,qCAAqC;;;;;;;;;EASrC;;;;;;;;EAQA,WAAW;;;;;;;EAOX,mBAAmB;;;;;;;;;EASnB,eAAe;;;;;;EAMf,oBAAoB,wBAAwB;;;;;;;EAO5C,0BAA0B;;cAoFjB,kBAAmB,mBAAmB,YAAY,WAC7D,aAAa,kBAAkB,QAAQ,cACvC,UAAS,oBAAoB,gBAAgB"}
|
|
@@ -10,10 +10,11 @@ import { aiSDKV6FormatAdapter } from "../adapters/aiSDKFormatAdapter.js";
|
|
|
10
10
|
import { toExportedMessageRepository, useExternalHistory } from "./useExternalHistory.js";
|
|
11
11
|
import { useStreamingTiming as useStreamingTiming$1 } from "./useStreamingTiming.js";
|
|
12
12
|
import { useExternalStoreRuntime, useRuntimeAdapters } from "@assistant-ui/core/react";
|
|
13
|
-
import {
|
|
13
|
+
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
14
|
+
import { useCallback, useEffect, useInsertionEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
|
|
14
15
|
import { generateId, isToolUIPart } from "ai";
|
|
15
16
|
import { getExternalStoreMessages, pickExternalStoreSharedOptions } from "@assistant-ui/core";
|
|
16
|
-
import { consumeSuggestionResult } from "@assistant-ui/core/internal";
|
|
17
|
+
import { MessageRepository, consumeSuggestionResult } from "@assistant-ui/core/internal";
|
|
17
18
|
//#region src/runtime/useAISDKRuntime.ts
|
|
18
19
|
const toUIMessage = (createMessage, fallbackRole) => ({
|
|
19
20
|
...createMessage,
|
|
@@ -22,73 +23,153 @@ const toUIMessage = (createMessage, fallbackRole) => ({
|
|
|
22
23
|
});
|
|
23
24
|
const EMPTY_SUGGESTIONS = [];
|
|
24
25
|
const useGeneratedSuggestions = (suggestionAdapter, messages, isRunning) => {
|
|
26
|
+
const $ = c(13);
|
|
25
27
|
const [suggestions, setSuggestions] = useState(EMPTY_SUGGESTIONS);
|
|
26
28
|
const controllerRef = useRef(null);
|
|
27
29
|
const wasRunningRef = useRef(false);
|
|
28
30
|
const messagesRef = useRef(messages);
|
|
29
|
-
|
|
31
|
+
let t0;
|
|
32
|
+
let t1;
|
|
33
|
+
if ($[0] !== messages) {
|
|
34
|
+
t0 = () => {
|
|
35
|
+
messagesRef.current = messages;
|
|
36
|
+
};
|
|
37
|
+
t1 = [messages];
|
|
38
|
+
$[0] = messages;
|
|
39
|
+
$[1] = t0;
|
|
40
|
+
$[2] = t1;
|
|
41
|
+
} else {
|
|
42
|
+
t0 = $[1];
|
|
43
|
+
t1 = $[2];
|
|
44
|
+
}
|
|
45
|
+
useInsertionEffect(t0, t1);
|
|
30
46
|
const adapterRef = useRef(suggestionAdapter);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
setSuggestions((prev) => prev.length === 0 ? prev : EMPTY_SUGGESTIONS);
|
|
47
|
+
let t2;
|
|
48
|
+
let t3;
|
|
49
|
+
if ($[3] !== suggestionAdapter) {
|
|
50
|
+
t2 = () => {
|
|
51
|
+
adapterRef.current = suggestionAdapter;
|
|
37
52
|
};
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
53
|
+
t3 = [suggestionAdapter];
|
|
54
|
+
$[3] = suggestionAdapter;
|
|
55
|
+
$[4] = t2;
|
|
56
|
+
$[5] = t3;
|
|
57
|
+
} else {
|
|
58
|
+
t2 = $[4];
|
|
59
|
+
t3 = $[5];
|
|
60
|
+
}
|
|
61
|
+
useInsertionEffect(t2, t3);
|
|
62
|
+
const hasAdapter = suggestionAdapter != null;
|
|
63
|
+
let t4;
|
|
64
|
+
if ($[6] !== isRunning) {
|
|
65
|
+
t4 = () => {
|
|
66
|
+
const clearSuggestions = () => {
|
|
67
|
+
controllerRef.current?.abort();
|
|
68
|
+
controllerRef.current = null;
|
|
69
|
+
setSuggestions(_temp);
|
|
70
|
+
};
|
|
71
|
+
const adapter = adapterRef.current;
|
|
72
|
+
if (!adapter) {
|
|
73
|
+
clearSuggestions();
|
|
74
|
+
wasRunningRef.current = isRunning;
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (isRunning) {
|
|
78
|
+
if (!wasRunningRef.current) clearSuggestions();
|
|
79
|
+
wasRunningRef.current = true;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (!wasRunningRef.current) return;
|
|
83
|
+
wasRunningRef.current = false;
|
|
84
|
+
const currentMessages = messagesRef.current;
|
|
85
|
+
const last = currentMessages.at(-1);
|
|
86
|
+
if (last?.role !== "assistant") return;
|
|
87
|
+
if (last.status?.type === "requires-action") return;
|
|
88
|
+
const controller = new AbortController();
|
|
89
|
+
controllerRef.current = controller;
|
|
90
|
+
const { signal } = controller;
|
|
91
|
+
(async () => {
|
|
92
|
+
try {
|
|
93
|
+
const promiseOrGenerator = adapter.generate({
|
|
94
|
+
messages: currentMessages,
|
|
95
|
+
signal
|
|
96
|
+
});
|
|
97
|
+
await consumeSuggestionResult(promiseOrGenerator, {
|
|
98
|
+
signal,
|
|
99
|
+
onUpdate: setSuggestions
|
|
100
|
+
});
|
|
101
|
+
} catch {}
|
|
102
|
+
})();
|
|
103
|
+
};
|
|
104
|
+
$[6] = isRunning;
|
|
105
|
+
$[7] = t4;
|
|
106
|
+
} else t4 = $[7];
|
|
107
|
+
let t5;
|
|
108
|
+
if ($[8] !== hasAdapter || $[9] !== isRunning) {
|
|
109
|
+
t5 = [hasAdapter, isRunning];
|
|
110
|
+
$[8] = hasAdapter;
|
|
111
|
+
$[9] = isRunning;
|
|
112
|
+
$[10] = t5;
|
|
113
|
+
} else t5 = $[10];
|
|
114
|
+
useEffect(t4, t5);
|
|
115
|
+
let t6;
|
|
116
|
+
let t7;
|
|
117
|
+
if ($[11] === Symbol.for("react.memo_cache_sentinel")) {
|
|
118
|
+
t6 = () => () => {
|
|
73
119
|
controllerRef.current?.abort();
|
|
74
120
|
};
|
|
75
|
-
|
|
121
|
+
t7 = [];
|
|
122
|
+
$[11] = t6;
|
|
123
|
+
$[12] = t7;
|
|
124
|
+
} else {
|
|
125
|
+
t6 = $[11];
|
|
126
|
+
t7 = $[12];
|
|
127
|
+
}
|
|
128
|
+
useEffect(t6, t7);
|
|
76
129
|
return suggestions;
|
|
77
130
|
};
|
|
131
|
+
const NO_CANCELLED_MESSAGE_IDS = /* @__PURE__ */ new Set();
|
|
78
132
|
const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
79
|
-
const { adapters, toCreateMessage: customToCreateMessage, cancelPendingToolCallsOnSend = true, onResume, onResumeToolCall, joinStrategy } = adapter;
|
|
133
|
+
const { adapters, toCreateMessage: customToCreateMessage, cancelPendingToolCallsOnSend = true, onResume, onResumeToolCall, joinStrategy, messageRepository, unstable_onBranchChange } = adapter;
|
|
80
134
|
const suggestionAdapter = adapters?.suggestion;
|
|
81
135
|
const contextAdapters = useRuntimeAdapters();
|
|
82
136
|
const [toolStatuses, setToolStatuses] = useState({});
|
|
137
|
+
const [cancelledMessages, setCancelledMessages] = useState(null);
|
|
83
138
|
const toolArgsKeyOrderCacheRef = useRef(/* @__PURE__ */ new Map());
|
|
84
139
|
const toolLastInputCacheRef = useRef(/* @__PURE__ */ new Map());
|
|
85
140
|
const mcpAppMetadataCacheRef = useRef(/* @__PURE__ */ new Map());
|
|
86
141
|
const lastRunConfigRef = useRef(void 0);
|
|
87
142
|
const hasExecutingTools = Object.values(toolStatuses).some((s) => s?.type === "executing");
|
|
88
|
-
const
|
|
143
|
+
const providerIsRunning = chatHelpers.status === "submitted" || chatHelpers.status === "streaming";
|
|
144
|
+
const isRunning = providerIsRunning || hasExecutingTools;
|
|
145
|
+
const wasProviderRunningRef = useRef(providerIsRunning);
|
|
89
146
|
const messageTiming = useStreamingTiming$1(chatHelpers.messages, isRunning);
|
|
90
147
|
const lastMessage = chatHelpers.messages.at(-1);
|
|
91
148
|
const optimisticMessageId = isRunning && lastMessage?.role === "assistant" ? lastMessage.id : void 0;
|
|
149
|
+
const cancelledMessageIds = cancelledMessages?.chatId === chatHelpers.id ? cancelledMessages.ids : NO_CANCELLED_MESSAGE_IDS;
|
|
150
|
+
const retractCancellation = useCallback((chatId, messageId) => {
|
|
151
|
+
setCancelledMessages((prev) => {
|
|
152
|
+
if (prev?.chatId !== chatId || !prev.ids.has(messageId)) return prev;
|
|
153
|
+
const ids = new Set(prev.ids);
|
|
154
|
+
ids.delete(messageId);
|
|
155
|
+
return {
|
|
156
|
+
chatId,
|
|
157
|
+
ids
|
|
158
|
+
};
|
|
159
|
+
});
|
|
160
|
+
}, []);
|
|
161
|
+
const resumedMessageId = providerIsRunning && lastMessage?.role === "assistant" ? lastMessage.id : void 0;
|
|
162
|
+
useEffect(() => {
|
|
163
|
+
const wasProviderRunning = wasProviderRunningRef.current;
|
|
164
|
+
wasProviderRunningRef.current = providerIsRunning;
|
|
165
|
+
if (wasProviderRunning || !resumedMessageId) return;
|
|
166
|
+
retractCancellation(chatHelpers.id, resumedMessageId);
|
|
167
|
+
}, [
|
|
168
|
+
providerIsRunning,
|
|
169
|
+
resumedMessageId,
|
|
170
|
+
chatHelpers.id,
|
|
171
|
+
retractCancellation
|
|
172
|
+
]);
|
|
92
173
|
const messages = AISDKMessageConverter.useThreadMessages({
|
|
93
174
|
isRunning,
|
|
94
175
|
messages: chatHelpers.messages,
|
|
@@ -100,14 +181,21 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
100
181
|
toolLastInputCache: toolLastInputCacheRef.current,
|
|
101
182
|
mcpAppMetadataCache: mcpAppMetadataCacheRef.current,
|
|
102
183
|
...optimisticMessageId && { optimisticMessageId },
|
|
103
|
-
...chatHelpers.error && { error: chatHelpers.error.message }
|
|
184
|
+
...chatHelpers.error && { error: chatHelpers.error.message },
|
|
185
|
+
...cancelledMessageIds.size > 0 && { cancelledMessageIds }
|
|
104
186
|
}), [
|
|
105
187
|
toolStatuses,
|
|
106
188
|
messageTiming,
|
|
107
189
|
optimisticMessageId,
|
|
108
|
-
chatHelpers.error
|
|
190
|
+
chatHelpers.error,
|
|
191
|
+
cancelledMessageIds
|
|
109
192
|
])
|
|
110
193
|
});
|
|
194
|
+
const exportedMessageRepository = useMemo(() => {
|
|
195
|
+
if (!messageRepository) return void 0;
|
|
196
|
+
const converted = toExportedMessageRepository(AISDKMessageConverter.toThreadMessages, messageRepository);
|
|
197
|
+
return converted.messages.length > 0 ? converted : void 0;
|
|
198
|
+
}, [messageRepository]);
|
|
111
199
|
const generatedSuggestions = useGeneratedSuggestions(suggestionAdapter, messages, isRunning);
|
|
112
200
|
const [runtimeRef] = useState(() => ({ get current() {
|
|
113
201
|
return runtime;
|
|
@@ -115,12 +203,12 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
115
203
|
const { isLoading, deleteMessage: deleteHistoryMessage } = useExternalHistory(runtimeRef, adapters?.history ?? contextAdapters?.history, AISDKMessageConverter.toThreadMessages, aiSDKV6FormatAdapter, (messages_0) => {
|
|
116
204
|
chatHelpers.setMessages(messages_0);
|
|
117
205
|
});
|
|
118
|
-
const { id:
|
|
206
|
+
const { id: chatId_0, messages: chatMessages, status: chatStatus, error } = chatHelpers;
|
|
119
207
|
const extras = useMemo(() => aiSDKExtras.provide({
|
|
120
208
|
chat: chatHelpers,
|
|
121
209
|
error
|
|
122
210
|
}), [
|
|
123
|
-
|
|
211
|
+
chatId_0,
|
|
124
212
|
chatMessages,
|
|
125
213
|
chatStatus,
|
|
126
214
|
error
|
|
@@ -133,7 +221,7 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
133
221
|
let hasChanges = false;
|
|
134
222
|
const parts = lastMessage_0.parts?.map((part) => {
|
|
135
223
|
if (!isToolUIPart(part)) return part;
|
|
136
|
-
if (part.state === "output-available" || part.state === "output-error") return part;
|
|
224
|
+
if (part.state === "output-available" || part.state === "output-error" || part.state === "output-denied") return part;
|
|
137
225
|
hasChanges = true;
|
|
138
226
|
const { approval: _approval, ...rest } = part;
|
|
139
227
|
return {
|
|
@@ -149,9 +237,11 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
149
237
|
}];
|
|
150
238
|
});
|
|
151
239
|
};
|
|
240
|
+
const hasSeededRepositoryRef = useRef(false);
|
|
241
|
+
const shouldFeedRepository = exportedMessageRepository != null && !hasSeededRepositoryRef.current && messages.length === 0;
|
|
152
242
|
const runtime = useExternalStoreRuntime({
|
|
153
|
-
isRunning,
|
|
154
|
-
messages,
|
|
243
|
+
isRunning: providerIsRunning,
|
|
244
|
+
...shouldFeedRepository ? { messageRepository: exportedMessageRepository } : { messages },
|
|
155
245
|
unstable_enableToolInvocations: true,
|
|
156
246
|
setToolStatuses,
|
|
157
247
|
setMessages: (messages_2) => chatHelpers.setMessages(messages_2.map(getVercelAIMessages).filter(Boolean).flat()),
|
|
@@ -181,39 +271,54 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
181
271
|
runtimeRef.current.thread.import(exportedRepo);
|
|
182
272
|
},
|
|
183
273
|
onCancel: async () => {
|
|
274
|
+
const message = chatHelpers.messages.at(-1);
|
|
275
|
+
const cancelledId = isRunning && message?.role === "assistant" ? message.id : void 0;
|
|
276
|
+
if (cancelledId) {
|
|
277
|
+
const liveIds = new Set(chatHelpers.messages.map((m) => m.id));
|
|
278
|
+
setCancelledMessages((prev_0) => {
|
|
279
|
+
const kept = prev_0?.chatId === chatHelpers.id ? [...prev_0.ids].filter((id) => liveIds.has(id)) : [];
|
|
280
|
+
return {
|
|
281
|
+
chatId: chatHelpers.id,
|
|
282
|
+
ids: /* @__PURE__ */ new Set([...kept, cancelledId])
|
|
283
|
+
};
|
|
284
|
+
});
|
|
285
|
+
}
|
|
184
286
|
try {
|
|
185
287
|
await chatHelpers.stop();
|
|
186
288
|
} catch (error_0) {
|
|
187
|
-
if (!(error_0 instanceof Error && error_0.name === "AbortError"))
|
|
289
|
+
if (!(error_0 instanceof Error && error_0.name === "AbortError")) {
|
|
290
|
+
if (cancelledId) retractCancellation(chatHelpers.id, cancelledId);
|
|
291
|
+
throw error_0;
|
|
292
|
+
}
|
|
188
293
|
}
|
|
189
294
|
},
|
|
190
|
-
onNew: async (
|
|
191
|
-
const createMessage = (customToCreateMessage ?? toCreateMessage)(
|
|
192
|
-
if (!(
|
|
193
|
-
chatHelpers.setMessages((current) => [...current, toUIMessage(createMessage,
|
|
295
|
+
onNew: async (message_0) => {
|
|
296
|
+
const createMessage = (customToCreateMessage ?? toCreateMessage)(message_0);
|
|
297
|
+
if (!(message_0.startRun ?? message_0.role === "user")) {
|
|
298
|
+
chatHelpers.setMessages((current) => [...current, toUIMessage(createMessage, message_0.role)]);
|
|
194
299
|
return;
|
|
195
300
|
}
|
|
196
|
-
lastRunConfigRef.current =
|
|
301
|
+
lastRunConfigRef.current = message_0.runConfig;
|
|
197
302
|
await completePendingToolCalls();
|
|
198
|
-
await chatHelpers.sendMessage(createMessage, { metadata:
|
|
303
|
+
await chatHelpers.sendMessage(createMessage, { metadata: message_0.runConfig });
|
|
199
304
|
},
|
|
200
|
-
onEdit: async (
|
|
201
|
-
const createMessage_0 = (customToCreateMessage ?? toCreateMessage)(
|
|
202
|
-
if (!(
|
|
203
|
-
chatHelpers.setMessages((current_0) => [...sliceMessagesUntil(current_0,
|
|
305
|
+
onEdit: async (message_1) => {
|
|
306
|
+
const createMessage_0 = (customToCreateMessage ?? toCreateMessage)(message_1);
|
|
307
|
+
if (!(message_1.startRun ?? message_1.role === "user")) {
|
|
308
|
+
chatHelpers.setMessages((current_0) => [...sliceMessagesUntil(current_0, message_1.parentId), toUIMessage(createMessage_0, message_1.role)]);
|
|
204
309
|
return;
|
|
205
310
|
}
|
|
206
|
-
lastRunConfigRef.current =
|
|
207
|
-
chatHelpers.setMessages((current_1) => sliceMessagesUntil(current_1,
|
|
208
|
-
await chatHelpers.sendMessage(createMessage_0, { metadata:
|
|
311
|
+
lastRunConfigRef.current = message_1.runConfig;
|
|
312
|
+
chatHelpers.setMessages((current_1) => sliceMessagesUntil(current_1, message_1.parentId));
|
|
313
|
+
await chatHelpers.sendMessage(createMessage_0, { metadata: message_1.runConfig });
|
|
209
314
|
},
|
|
210
|
-
onDelete: async (
|
|
315
|
+
onDelete: async (messageId_0) => {
|
|
211
316
|
const threadMessages = runtimeRef.current.thread.getState().messages;
|
|
212
|
-
const messageIndex = threadMessages.findIndex((
|
|
317
|
+
const messageIndex = threadMessages.findIndex((message_2) => message_2.id === messageId_0);
|
|
213
318
|
if (messageIndex === -1) return;
|
|
214
|
-
await deleteHistoryMessage(
|
|
215
|
-
const deleteIds = new Set(getExternalStoreMessages(threadMessages[messageIndex]).map((
|
|
216
|
-
chatHelpers.setMessages((current_2) => current_2.filter((
|
|
319
|
+
await deleteHistoryMessage(messageId_0);
|
|
320
|
+
const deleteIds = new Set(getExternalStoreMessages(threadMessages[messageIndex]).map((message_3) => message_3.id));
|
|
321
|
+
chatHelpers.setMessages((current_2) => current_2.filter((message_4) => !deleteIds.has(message_4.id)));
|
|
217
322
|
},
|
|
218
323
|
onReload: async (parentId_0, config) => {
|
|
219
324
|
lastRunConfigRef.current = config.runConfig;
|
|
@@ -247,9 +352,11 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
247
352
|
options: { metadata: lastRunConfigRef.current }
|
|
248
353
|
})),
|
|
249
354
|
...pickExternalStoreSharedOptions(adapter),
|
|
355
|
+
...adapter.unstable_messageRepositoryInstance && { unstable_messageRepositoryInstance: adapter.unstable_messageRepositoryInstance },
|
|
250
356
|
...suggestionAdapter ? { suggestions: generatedSuggestions } : {},
|
|
251
357
|
...onResume && { onResume },
|
|
252
358
|
...onResumeToolCall && { onResumeToolCall },
|
|
359
|
+
...unstable_onBranchChange && { unstable_onBranchChange },
|
|
253
360
|
adapters: {
|
|
254
361
|
attachments: vercelAttachmentAdapter,
|
|
255
362
|
...contextAdapters,
|
|
@@ -258,8 +365,27 @@ const useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
|
258
365
|
extras,
|
|
259
366
|
isLoading
|
|
260
367
|
});
|
|
368
|
+
const setMessagesRef = useRef(chatHelpers.setMessages);
|
|
369
|
+
useInsertionEffect(() => {
|
|
370
|
+
setMessagesRef.current = chatHelpers.setMessages;
|
|
371
|
+
}, [chatHelpers.setMessages]);
|
|
372
|
+
useEffect(() => {
|
|
373
|
+
if (hasSeededRepositoryRef.current) return;
|
|
374
|
+
if (!exportedMessageRepository) return;
|
|
375
|
+
if (chatHelpers.messages.length > 0) {
|
|
376
|
+
hasSeededRepositoryRef.current = true;
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
const tempRepo = new MessageRepository();
|
|
380
|
+
tempRepo.import(exportedMessageRepository);
|
|
381
|
+
setMessagesRef.current(tempRepo.getMessages().flatMap(getExternalStoreMessages));
|
|
382
|
+
hasSeededRepositoryRef.current = true;
|
|
383
|
+
}, [exportedMessageRepository, chatHelpers.messages.length]);
|
|
261
384
|
return runtime;
|
|
262
385
|
};
|
|
386
|
+
function _temp(prev) {
|
|
387
|
+
return prev.length === 0 ? prev : EMPTY_SUGGESTIONS;
|
|
388
|
+
}
|
|
263
389
|
//#endregion
|
|
264
390
|
export { useAISDKRuntime };
|
|
265
391
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAISDKRuntime.js","names":["useEffect","useMemo","useRef","useState","UIMessage","useChat","CreateUIMessage","UseChatHelpers","isToolUIPart","generateId","useExternalStoreRuntime","useRuntimeAdapters","JoinStrategy","SuggestionAdapter","ThreadSuggestion","ToolExecutionStatus","ExternalStoreAdapter","ExternalStoreSharedOptions","ThreadHistoryAdapter","AssistantRuntime","ThreadMessage","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","AppendMessage","RunConfig","McpAppMetadata","getExternalStoreMessages","pickExternalStoreSharedOptions","consumeSuggestionResult","ReadonlyJSONObject","sliceMessagesUntil","toCreateMessage","vercelAttachmentAdapter","getVercelAIMessages","AISDKMessageConverter","wrapModelContentEnvelope","AISDKStorageFormat","aiSDKV6FormatAdapter","useExternalHistory","toExportedMessageRepository","useStreamingTiming","aiSDKExtras","CustomToCreateMessageFunction","message","UI_MESSAGE","toUIMessage","createMessage","fallbackRole","id","role","AISDKRuntimeAdapter","adapters","NonNullable","history","suggestion","cancelPendingToolCallsOnSend","onResume","onResumeToolCall","joinStrategy","EMPTY_SUGGESTIONS","useGeneratedSuggestions","suggestionAdapter","messages","isRunning","suggestions","setSuggestions","controllerRef","AbortController","wasRunningRef","messagesRef","current","adapterRef","hasAdapter","clearSuggestions","abort","prev","length","adapter","currentMessages","last","at","status","type","controller","signal","promiseOrGenerator","generate","onUpdate","useAISDKRuntime","chatHelpers","ReturnType","customToCreateMessage","contextAdapters","toolStatuses","setToolStatuses","Record","toolArgsKeyOrderCacheRef","Map","toolLastInputCacheRef","mcpAppMetadataCacheRef","lastRunConfigRef","undefined","hasExecutingTools","Object","values","some","s","messageTiming","lastMessage","optimisticMessageId","useThreadMessages","metadata","toolArgsKeyOrderCache","toolLastInputCache","mcpAppMetadataCache","error","generatedSuggestions","runtimeRef","runtime","isLoading","deleteMessage","deleteHistoryMessage","toThreadMessages","setMessages","chatId","chatMessages","chatStatus","extras","provide","chat","completePendingToolCalls","hasChanges","parts","map","part","state","approval","_approval","rest","const","errorText","slice","unstable_enableToolInvocations","filter","Boolean","flat","onImport","onExportExternalState","exported","thread","export","expandedMessages","lastInnerIdMap","item","innerMessages","parentId","get","innerMessage","push","getId","set","result","headId","onLoadExternalState","repo","exportedRepo","import","onCancel","stop","Error","name","onNew","startRun","runConfig","sendMessage","onEdit","onDelete","messageId","threadMessages","getState","messageIndex","findIndex","deleteIds","Set","has","onReload","config","newMessages","regenerate","onAddToolResult","toolCallId","toolName","isError","modelContent","options","Promise","resolve","addToolOutput","tool","JSON","stringify","output","onRespondToToolApproval","approvalId","approved","reason","addToolApprovalResponse","attachments"],"sources":["../../src/runtime/useAISDKRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n UIMessage,\n useChat,\n CreateUIMessage,\n UseChatHelpers,\n} from \"@ai-sdk/react\";\nimport { isToolUIPart, generateId } 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} from \"@assistant-ui/core\";\nimport {\n getExternalStoreMessages,\n pickExternalStoreSharedOptions,\n} from \"@assistant-ui/core\";\nimport { consumeSuggestionResult } from \"@assistant-ui/core/internal\";\nimport type { ReadonlyJSONObject } from \"assistant-stream/utils\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../converters/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../adapters/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../utils/getVercelAIMessages\";\nimport { AISDKMessageConverter } 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\nexport type AISDKRuntimeAdapter = ExternalStoreSharedOptions & {\n adapters?:\n | (NonNullable<ExternalStoreAdapter[\"adapters\"]> & {\n history?: ThreadHistoryAdapter | undefined;\n suggestion?: SuggestionAdapter | undefined;\n })\n | undefined;\n toCreateMessage?: CustomToCreateMessageFunction;\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 * 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\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 messagesRef.current = messages;\n const adapterRef = useRef(suggestionAdapter);\n adapterRef.current = 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\nexport const useAISDKRuntime = <UI_MESSAGE extends UIMessage = UIMessage>(\n chatHelpers: ReturnType<typeof useChat<UI_MESSAGE>>,\n adapter: AISDKRuntimeAdapter = {},\n) => {\n const {\n adapters,\n toCreateMessage: customToCreateMessage,\n cancelPendingToolCallsOnSend = true,\n onResume,\n onResumeToolCall,\n joinStrategy,\n } = adapter;\n const suggestionAdapter = adapters?.suggestion;\n const contextAdapters = useRuntimeAdapters();\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\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 isRunning =\n chatHelpers.status === \"submitted\" ||\n chatHelpers.status === \"streaming\" ||\n hasExecutingTools;\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 messages = AISDKMessageConverter.useThreadMessages({\n isRunning,\n messages: chatHelpers.messages,\n joinStrategy,\n metadata: useMemo(\n () => ({\n toolStatuses,\n messageTiming,\n toolArgsKeyOrderCache: toolArgsKeyOrderCacheRef.current,\n toolLastInputCache: toolLastInputCacheRef.current,\n mcpAppMetadataCache: mcpAppMetadataCacheRef.current,\n ...(optimisticMessageId && { optimisticMessageId }),\n ...(chatHelpers.error && { error: chatHelpers.error.message }),\n }),\n [toolStatuses, messageTiming, optimisticMessageId, chatHelpers.error],\n ),\n });\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 AISDKMessageConverter.toThreadMessages as (\n messages: UI_MESSAGE[],\n ) => ThreadMessage[],\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 (part.state === \"output-available\" || part.state === \"output-error\")\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 runtime = useExternalStoreRuntime({\n isRunning,\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 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(\n AISDKMessageConverter.toThreadMessages,\n repo,\n );\n\n // Import into the thread's MessageRepository\n runtimeRef.current.thread.import(exportedRepo);\n },\n onCancel: async () => {\n try {\n await chatHelpers.stop();\n } catch (error) {\n if (!(error instanceof Error && error.name === \"AbortError\")) {\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: ({ approvalId, approved, reason }) =>\n Promise.resolve(\n chatHelpers.addToolApprovalResponse({\n id: approvalId,\n approved,\n ...(reason != null && { reason }),\n options: { metadata: lastRunConfigRef.current },\n }),\n ),\n ...pickExternalStoreSharedOptions(adapter),\n ...(suggestionAdapter ? { suggestions: generatedSuggestions } : {}),\n ...(onResume && { onResume }),\n ...(onResumeToolCall && { onResumeToolCall }),\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...contextAdapters,\n ...adapters,\n },\n extras,\n isLoading,\n });\n\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","useExternalStoreRuntime","useRuntimeAdapters","JoinStrategy","SuggestionAdapter","ThreadSuggestion","ToolExecutionStatus","ExternalStoreAdapter","ExternalStoreSharedOptions","ThreadHistoryAdapter","AssistantRuntime","ThreadMessage","MessageFormatAdapter","MessageFormatItem","MessageFormatRepository","AppendMessage","RunConfig","McpAppMetadata","getExternalStoreMessages","pickExternalStoreSharedOptions","consumeSuggestionResult","MessageRepository","ReadonlyJSONObject","sliceMessagesUntil","toCreateMessage","vercelAttachmentAdapter","getVercelAIMessages","AISDKMessageConverter","wrapModelContentEnvelope","AISDKStorageFormat","aiSDKV6FormatAdapter","useExternalHistory","toExportedMessageRepository","useStreamingTiming","aiSDKExtras","CustomToCreateMessageFunction","message","UI_MESSAGE","toUIMessage","createMessage","fallbackRole","id","role","AISDKRuntimeAdapter","adapters","NonNullable","history","suggestion","unstable_messageRepositoryInstance","cancelPendingToolCallsOnSend","onResume","onResumeToolCall","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","type","controller","AbortController","signal","promiseOrGenerator","generate","onUpdate","t5","t6","t7","Symbol","for","NO_CANCELLED_MESSAGE_IDS","ReadonlySet","Set","useAISDKRuntime","chatHelpers","ReturnType","customToCreateMessage","contextAdapters","toolStatuses","setToolStatuses","Record","cancelledMessages","setCancelledMessages","chatId","ids","toolArgsKeyOrderCacheRef","Map","toolLastInputCacheRef","mcpAppMetadataCacheRef","lastRunConfigRef","undefined","hasExecutingTools","Object","values","some","s","providerIsRunning","wasProviderRunningRef","messageTiming","lastMessage","optimisticMessageId","cancelledMessageIds","retractCancellation","messageId","prev","has","delete","resumedMessageId","wasProviderRunning","useThreadMessages","metadata","toolArgsKeyOrderCache","toolLastInputCache","mcpAppMetadataCache","error","size","exportedMessageRepository","converted","toThreadMessages","length","generatedSuggestions","runtimeRef","runtime","isLoading","deleteMessage","deleteHistoryMessage","setMessages","chatMessages","chatStatus","extras","provide","chat","completePendingToolCalls","hasChanges","parts","map","part","state","approval","_approval","rest","const","errorText","slice","hasSeededRepositoryRef","shouldFeedRepository","unstable_enableToolInvocations","filter","Boolean","flat","onImport","onExportExternalState","exported","thread","export","expandedMessages","lastInnerIdMap","item","innerMessages","parentId","get","innerMessage","push","getId","set","result","headId","onLoadExternalState","repo","exportedRepo","import","onCancel","cancelledId","liveIds","m","kept","stop","Error","name","onNew","startRun","runConfig","sendMessage","onEdit","onDelete","threadMessages","getState","messageIndex","findIndex","deleteIds","onReload","config","newMessages","regenerate","onAddToolResult","toolCallId","toolName","isError","modelContent","options","Promise","resolve","addToolOutput","tool","JSON","stringify","output","onRespondToToolApproval","approvalId","approved","reason","addToolApprovalResponse","attachments","setMessagesRef","tempRepo","getMessages","flatMap"],"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 } 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} 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 { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../converters/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../adapters/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../utils/getVercelAIMessages\";\nimport { AISDKMessageConverter } 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\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 * 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\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 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 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\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(\n () => ({\n toolStatuses,\n messageTiming,\n toolArgsKeyOrderCache: toolArgsKeyOrderCacheRef.current,\n toolLastInputCache: toolLastInputCacheRef.current,\n mcpAppMetadataCache: mcpAppMetadataCacheRef.current,\n ...(optimisticMessageId && { optimisticMessageId }),\n ...(chatHelpers.error && { error: chatHelpers.error.message }),\n ...(cancelledMessageIds.size > 0 && { cancelledMessageIds }),\n }),\n [\n toolStatuses,\n messageTiming,\n optimisticMessageId,\n chatHelpers.error,\n cancelledMessageIds,\n ],\n ),\n });\n\n const exportedMessageRepository = useMemo(() => {\n if (!messageRepository) return undefined;\n const converted = toExportedMessageRepository(\n AISDKMessageConverter.toThreadMessages as (\n messages: UI_MESSAGE[],\n ) => ThreadMessage[],\n messageRepository,\n );\n return converted.messages.length > 0 ? converted : undefined;\n }, [messageRepository]);\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 AISDKMessageConverter.toThreadMessages as (\n messages: UI_MESSAGE[],\n ) => ThreadMessage[],\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 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 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(\n AISDKMessageConverter.toThreadMessages,\n repo,\n );\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: ({ approvalId, approved, reason }) =>\n Promise.resolve(\n chatHelpers.addToolApprovalResponse({\n id: approvalId,\n approved,\n ...(reason != null && { reason }),\n options: { metadata: lastRunConfigRef.current },\n }),\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,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useChatThread } from "./useChatThread.js";
|
|
3
3
|
import { useCloudThreadListAdapter, useRemoteThreadListRuntime } from "@assistant-ui/core/react";
|
|
4
|
-
import { useAui, useAuiState } from "@assistant-ui/store";
|
|
5
4
|
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
5
|
+
import { useAui, useAuiState } from "@assistant-ui/store";
|
|
6
6
|
//#region src/runtime/useChatRuntime.ts
|
|
7
7
|
const useChatThreadRuntime = (options) => {
|
|
8
8
|
const $ = c(6);
|