@assistant-ui/ai-sdk 0.0.11 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/converters/convertMessage.d.ts +8 -6
- package/dist/converters/convertMessage.d.ts.map +1 -1
- package/dist/converters/convertMessage.js +48 -22
- package/dist/converters/convertMessage.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.native.d.ts +1 -1
- package/dist/index.native.d.ts.map +1 -1
- package/dist/index.native.js +1 -1
- package/dist/model-context/injectInteractableContext.d.ts +3 -0
- package/dist/model-context/injectInteractableContext.d.ts.map +1 -1
- package/dist/model-context/injectInteractableContext.js +3 -0
- package/dist/model-context/injectInteractableContext.js.map +1 -1
- package/dist/model-context/injectQuoteContext.d.ts +1 -0
- package/dist/model-context/injectQuoteContext.d.ts.map +1 -1
- package/dist/model-context/injectQuoteContext.js +1 -0
- package/dist/model-context/injectQuoteContext.js.map +1 -1
- package/dist/runtime/AISDKChat.js +1 -1
- package/dist/runtime/AISDKThreads.d.ts +5 -0
- package/dist/runtime/AISDKThreads.d.ts.map +1 -1
- package/dist/runtime/AISDKThreads.js +37 -4
- package/dist/runtime/AISDKThreads.js.map +1 -1
- package/dist/runtime/DynamicChatTransport.d.ts +49 -0
- package/dist/runtime/DynamicChatTransport.d.ts.map +1 -0
- package/dist/runtime/DynamicChatTransport.js +147 -0
- package/dist/runtime/DynamicChatTransport.js.map +1 -0
- package/dist/runtime/getResumableAdapter.d.ts +5 -0
- package/dist/runtime/getResumableAdapter.d.ts.map +1 -0
- package/dist/runtime/getResumableAdapter.js +12 -0
- package/dist/runtime/getResumableAdapter.js.map +1 -0
- package/dist/runtime/sdkIdentity.js +1 -1
- package/dist/runtime/toolHistoryCodec.d.ts +20 -0
- package/dist/runtime/toolHistoryCodec.d.ts.map +1 -0
- package/dist/runtime/toolHistoryCodec.js +107 -0
- package/dist/runtime/toolHistoryCodec.js.map +1 -0
- package/dist/runtime/useAISDKRuntime.d.ts +4 -1
- package/dist/runtime/useAISDKRuntime.d.ts.map +1 -1
- package/dist/runtime/useAISDKRuntime.js +154 -155
- package/dist/runtime/useAISDKRuntime.js.map +1 -1
- package/dist/runtime/useChatRuntime.d.ts +14 -2
- package/dist/runtime/useChatRuntime.d.ts.map +1 -1
- package/dist/runtime/useChatRuntime.js +12 -3
- package/dist/runtime/useChatRuntime.js.map +1 -1
- package/dist/runtime/useChatThread.d.ts +3 -2
- package/dist/runtime/useChatThread.d.ts.map +1 -1
- package/dist/runtime/useChatThread.js +56 -36
- package/dist/runtime/useChatThread.js.map +1 -1
- package/dist/runtime/useDynamicChatTransport.d.ts +4 -0
- package/dist/runtime/useDynamicChatTransport.d.ts.map +1 -0
- package/dist/runtime/useDynamicChatTransport.js +64 -0
- package/dist/runtime/useDynamicChatTransport.js.map +1 -0
- package/dist/runtime/useExternalHistory.d.ts.map +1 -1
- package/dist/runtime/useExternalHistory.js +11 -109
- package/dist/runtime/useExternalHistory.js.map +1 -1
- package/dist/runtime/useResourceCleanup.js +1 -1
- package/dist/runtime/useStreamingTiming.js +2 -2
- package/dist/runtime/useStreamingTiming.js.map +1 -1
- package/dist/tools/generativeTools.d.ts +2 -1
- package/dist/tools/generativeTools.d.ts.map +1 -1
- package/dist/tools/generativeTools.js +5 -5
- package/dist/tools/generativeTools.js.map +1 -1
- package/dist/usage.js +1 -1
- package/dist/utils/sliceMessagesUntil.d.ts.map +1 -1
- package/dist/utils/sliceMessagesUntil.js +1 -2
- package/dist/utils/sliceMessagesUntil.js.map +1 -1
- package/package.json +11 -10
- package/src/converters/convertMessage.test.ts +120 -2
- package/src/converters/convertMessage.tool-args-status.test.tsx +185 -0
- package/src/converters/convertMessage.ts +60 -19
- package/src/converters/toCreateMessage.test.ts +27 -0
- package/src/index.native.ts +1 -1
- package/src/index.ts +1 -1
- package/src/model-context/injectInteractableContext.ts +3 -0
- package/src/model-context/injectQuoteContext.ts +1 -0
- package/src/runtime/AISDKChat.integration.test.tsx +57 -2
- package/src/runtime/AISDKThreads.cloud.test.ts +3 -0
- package/src/runtime/AISDKThreads.test.ts +181 -0
- package/src/runtime/AISDKThreads.ts +31 -4
- package/src/runtime/DynamicChatTransport.test.ts +203 -0
- package/src/runtime/DynamicChatTransport.ts +273 -0
- package/src/runtime/__tests__/controlled-transport.ts +3 -0
- package/src/runtime/getResumableAdapter.ts +16 -0
- package/src/runtime/toolHistoryCodec.test.ts +161 -0
- package/src/runtime/toolHistoryCodec.ts +207 -0
- package/src/runtime/useAISDKRuntime.approval.test.tsx +12 -0
- package/src/runtime/useAISDKRuntime.reload.test.tsx +219 -0
- package/src/runtime/useAISDKRuntime.test.ts +538 -5
- package/src/runtime/useAISDKRuntime.ts +161 -51
- package/src/runtime/useChatRuntime.integration.test.tsx +319 -4
- package/src/runtime/useChatRuntime.local-storage.test.tsx +123 -0
- package/src/runtime/useChatRuntime.test.ts +107 -1
- package/src/runtime/useChatRuntime.ts +26 -4
- package/src/runtime/useChatThread.binding.test.tsx +143 -0
- package/src/runtime/useChatThread.ts +98 -81
- package/src/runtime/useDynamicChatTransport.ts +26 -0
- package/src/runtime/useExternalHistory.test.ts +111 -0
- package/src/runtime/useExternalHistory.ts +14 -210
- package/src/runtime/useStreamingTiming.ts +2 -2
- package/src/tools/generativeTools.test.ts +1 -1
- package/src/tools/generativeTools.ts +5 -6
- package/src/utils/sliceMessagesUntil.test.ts +2 -6
- package/src/utils/sliceMessagesUntil.ts +1 -5
- package/dist/converters/modelContentEnvelope.d.ts +0 -14
- package/dist/converters/modelContentEnvelope.d.ts.map +0 -1
- package/dist/converters/modelContentEnvelope.js +0 -22
- package/dist/converters/modelContentEnvelope.js.map +0 -1
- package/dist/converters/toolOutputConversion.d.ts +0 -26
- package/dist/converters/toolOutputConversion.d.ts.map +0 -1
- package/dist/converters/toolOutputConversion.js +0 -31
- package/dist/converters/toolOutputConversion.js.map +0 -1
- package/dist/tools/frontendTools.d.ts +0 -30
- package/dist/tools/frontendTools.d.ts.map +0 -1
- package/dist/tools/frontendTools.js +0 -33
- package/dist/tools/frontendTools.js.map +0 -1
- package/src/converters/modelContentEnvelope.ts +0 -41
- package/src/converters/toolOutputConversion.ts +0 -26
- package/src/tools/frontendTools.test.ts +0 -205
- package/src/tools/frontendTools.ts +0 -83
|
@@ -5,9 +5,9 @@ import { createChat, splitChatThreadOptions, useChatThread } from "./useChatThre
|
|
|
5
5
|
import { AI_SDK_SDK } from "./sdkIdentity.js";
|
|
6
6
|
import { MessageRepository } from "@assistant-ui/core/internal";
|
|
7
7
|
import { useCloudThreadListAdapter } from "@assistant-ui/core/react";
|
|
8
|
-
import {
|
|
9
|
-
import { useEffect, useState } from "@assistant-ui/tap/react-shim";
|
|
8
|
+
import { useEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
|
|
10
9
|
import { useAui } from "@assistant-ui/store";
|
|
10
|
+
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
11
11
|
import { resource, useResource, withKey } from "@assistant-ui/tap";
|
|
12
12
|
import { InMemoryThreadList, RemoteThreadList, inMemoryThreadListTransformScopes } from "@assistant-ui/core/store";
|
|
13
13
|
import { attachTransformScopes, useAssistantClientRef, useAssistantScopeEffect } from "@assistant-ui/store/client";
|
|
@@ -158,8 +158,8 @@ const useAISDKChatThread = (t0) => {
|
|
|
158
158
|
};
|
|
159
159
|
const AISDKChatThread = resource(useAISDKChatThread);
|
|
160
160
|
const useAISDKThreads = (options) => {
|
|
161
|
-
const $ = c(
|
|
162
|
-
const { cloud, threadId, onThreadIdChange, ...threadOptions } = options ?? {};
|
|
161
|
+
const $ = c(7);
|
|
162
|
+
const { cloud, scopeId, threadId, onThreadIdChange, ...threadOptions } = options ?? {};
|
|
163
163
|
const [chats] = useState(_temp2);
|
|
164
164
|
const bindCloud = cloud !== void 0;
|
|
165
165
|
useEffect(() => {
|
|
@@ -176,8 +176,41 @@ const useAISDKThreads = (options) => {
|
|
|
176
176
|
useResourceCleanup(true, t0);
|
|
177
177
|
const cloudAdapter = useCloudThreadListAdapter({
|
|
178
178
|
cloud,
|
|
179
|
+
scopeId,
|
|
179
180
|
sdk: AI_SDK_SDK
|
|
180
181
|
});
|
|
182
|
+
const clientRef = useAssistantClientRef();
|
|
183
|
+
const previousCloudAdapter = useRef(bindCloud ? cloudAdapter : void 0);
|
|
184
|
+
let t1;
|
|
185
|
+
let t2;
|
|
186
|
+
if ($[2] !== bindCloud || $[3] !== clientRef || $[4] !== cloudAdapter) {
|
|
187
|
+
t1 = () => {
|
|
188
|
+
const previous = previousCloudAdapter.current;
|
|
189
|
+
previousCloudAdapter.current = bindCloud ? cloudAdapter : void 0;
|
|
190
|
+
if (!bindCloud || previous === void 0 || previous === cloudAdapter) return;
|
|
191
|
+
let cancelled = false;
|
|
192
|
+
queueMicrotask(() => {
|
|
193
|
+
if (!cancelled) clientRef.current.threads.reload();
|
|
194
|
+
});
|
|
195
|
+
return () => {
|
|
196
|
+
cancelled = true;
|
|
197
|
+
};
|
|
198
|
+
};
|
|
199
|
+
t2 = [
|
|
200
|
+
bindCloud,
|
|
201
|
+
clientRef,
|
|
202
|
+
cloudAdapter
|
|
203
|
+
];
|
|
204
|
+
$[2] = bindCloud;
|
|
205
|
+
$[3] = clientRef;
|
|
206
|
+
$[4] = cloudAdapter;
|
|
207
|
+
$[5] = t1;
|
|
208
|
+
$[6] = t2;
|
|
209
|
+
} else {
|
|
210
|
+
t1 = $[5];
|
|
211
|
+
t2 = $[6];
|
|
212
|
+
}
|
|
213
|
+
useEffect(t1, t2);
|
|
181
214
|
const thread = (id) => {
|
|
182
215
|
const element = AISDKChatThread({
|
|
183
216
|
threadId: id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AISDKThreads.js","names":["c","_c","resource","useResource","withKey","useEffect","useMemo","useState","Chat","UIMessage","ChatTransport","AssistantCloud","InMemoryThreadList","RemoteThreadList","inMemoryThreadListTransformScopes","ThreadClient","useCloudThreadListAdapter","attachTransformScopes","useAssistantClientRef","useAssistantScopeEffect","useAui","AssistantChatTransport","createChat","splitChatThreadOptions","useChatThread","ChatThreadOptions","MessageRepository","useResourceCleanup","AI_SDK_SDK","AISDKThreadsOptions","Omit","UI_MESSAGE","transport","cloud","threadId","onThreadIdChange","AISDKThreadChatOptions","ChatOptionsRef","current","ChatEntry","chat","repository","optionsRef","createChatEntry","options","chatInit","undefined","__internal_clone","id","getOrCreateChatEntry","chats","Map","existing","get","created","set","useAISDKChatThread","t0","$","t1","owned","t2","t3","t4","t5","stop","catch","_temp","aui","t6","initialize","remoteId","externalId","fallbackItem","t7","t8","threadListItem","source","t9","isMainThread","getThreadListItem","messageRepositoryInstance","stopOnClientDestroy","runtime","clientRef","t10","registerModelContextProvider","modelContext","t11","t12","thread","AISDKChatThread","useAISDKThreads","threadOptions","_temp2","bindCloud","values","_temp3","cloudAdapter","sdk","element","adapter","backgroundThreads","onDelete","id_0","_temp4","delete","AISDKThreads","_c"],"sources":["../../src/runtime/AISDKThreads.ts"],"sourcesContent":["\"use client\";\n\nimport { resource, useResource, withKey } from \"@assistant-ui/tap\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport type { Chat, UIMessage } from \"@ai-sdk/react\";\nimport type { ChatTransport } from \"ai\";\nimport type { AssistantCloud } from \"assistant-cloud\";\nimport {\n InMemoryThreadList,\n RemoteThreadList,\n inMemoryThreadListTransformScopes,\n} from \"@assistant-ui/core/store\";\nimport { ThreadClient } from \"@assistant-ui/core/store/internal\";\nimport { useCloudThreadListAdapter } from \"@assistant-ui/core/react\";\nimport {\n attachTransformScopes,\n useAssistantClientRef,\n useAssistantScopeEffect,\n} from \"@assistant-ui/store/client\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { AssistantChatTransport } from \"../transport/AssistantChatTransport\";\nimport {\n createChat,\n splitChatThreadOptions,\n useChatThread,\n type ChatThreadOptions,\n} from \"./useChatThread\";\nimport { MessageRepository } from \"@assistant-ui/core/internal\";\nimport { useResourceCleanup } from \"./useResourceCleanup\";\nimport { AI_SDK_SDK } from \"./sdkIdentity\";\n\nexport type AISDKThreadsOptions<UI_MESSAGE extends UIMessage = UIMessage> =\n Omit<ChatThreadOptions<UI_MESSAGE>, \"id\" | \"transport\" | \"messages\"> & {\n /**\n * The transport threads send through. A factory is invoked once per\n * thread so each thread owns its instance. A plain\n * `AssistantChatTransport` instance is cloned per thread (its\n * assistant-ui wiring is per thread); any other transport instance is\n * shared as-is. Defaults to one `AssistantChatTransport` per thread.\n */\n transport?:\n | ChatTransport<UI_MESSAGE>\n | (() => ChatTransport<UI_MESSAGE>)\n | undefined;\n /**\n * When set, the thread list is a `RemoteThreadList` backed by this\n * assistant-cloud. Omit it to keep the in-memory list. Every visited\n * cloud thread stays mounted, so an in-flight run continues after a\n * switch and stops on delete; per-thread history loads once per thread.\n */\n cloud?: AssistantCloud | undefined;\n /**\n * Controlled thread id for the cloud list. Ignored without `cloud`.\n */\n threadId?: string | undefined;\n /**\n * Called with the settled remote id when the cloud list changes thread.\n */\n onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;\n };\n\ntype AISDKThreadChatOptions<UI_MESSAGE extends UIMessage = UIMessage> = Omit<\n AISDKThreadsOptions<UI_MESSAGE>,\n \"cloud\" | \"threadId\" | \"onThreadIdChange\"\n>;\n\ntype ChatOptionsRef<UI_MESSAGE extends UIMessage> = {\n current: AISDKThreadChatOptions<UI_MESSAGE> | undefined;\n};\n\ntype ChatEntry<UI_MESSAGE extends UIMessage> = {\n chat: Chat<UI_MESSAGE>;\n transport: ChatTransport<UI_MESSAGE>;\n repository: MessageRepository;\n optionsRef: ChatOptionsRef<UI_MESSAGE>;\n};\n\nconst createChatEntry = <UI_MESSAGE extends UIMessage>(\n threadId: string,\n options: AISDKThreadChatOptions<UI_MESSAGE> | undefined,\n): ChatEntry<UI_MESSAGE> => {\n const optionsRef: ChatOptionsRef<UI_MESSAGE> = { current: options };\n const { chatInit } = splitChatThreadOptions(\n options as ChatThreadOptions<UI_MESSAGE> | undefined,\n );\n const transport =\n typeof options?.transport === \"function\"\n ? options.transport()\n : options?.transport === undefined\n ? new AssistantChatTransport()\n : options.transport instanceof AssistantChatTransport\n ? options.transport.__internal_clone()\n : options.transport;\n return {\n chat: createChat({ ...chatInit, id: threadId, transport }, optionsRef),\n transport,\n repository: new MessageRepository(),\n optionsRef,\n };\n};\n\nconst getOrCreateChatEntry = <UI_MESSAGE extends UIMessage>(\n threadId: string,\n options: AISDKThreadChatOptions<UI_MESSAGE> | undefined,\n chats: Map<string, ChatEntry<UI_MESSAGE>>,\n): ChatEntry<UI_MESSAGE> => {\n const existing = chats.get(threadId);\n if (existing) return existing;\n const created = createChatEntry(threadId, options);\n chats.set(threadId, created);\n return created;\n};\n\nconst useAISDKChatThread = <UI_MESSAGE extends UIMessage = UIMessage>({\n threadId,\n options,\n chats,\n cloud,\n}: {\n threadId: string;\n options: AISDKThreadChatOptions<UI_MESSAGE> | undefined;\n chats: Map<string, ChatEntry<UI_MESSAGE>>;\n cloud: boolean;\n}) => {\n const [owned] = useState(() =>\n cloud ? createChatEntry(threadId, options) : undefined,\n );\n const { chat, transport, repository, optionsRef } =\n owned ?? getOrCreateChatEntry(threadId, options, chats);\n\n useEffect(() => {\n if (cloud) optionsRef.current = options;\n });\n\n useEffect(() => {\n if (!cloud) return undefined;\n return () => {\n void chat.stop().catch(() => {});\n };\n }, [chat, cloud]);\n\n const aui = useAui();\n const fallbackItem = useMemo(\n () => ({\n initialize: async () => ({\n remoteId: threadId,\n externalId: undefined,\n }),\n }),\n [threadId],\n );\n const runtime = useChatThread(\n { ...options, transport } as ChatThreadOptions<UI_MESSAGE>,\n {\n id: threadId,\n isMainThread: true,\n getThreadListItem: () =>\n cloud\n ? aui.threadListItem.source\n ? aui.threadListItem\n : undefined\n : fallbackItem,\n chat,\n messageRepositoryInstance: repository,\n stopOnClientDestroy: false,\n },\n );\n\n const clientRef = useAssistantClientRef();\n useAssistantScopeEffect(\n \"modelContext\",\n () =>\n runtime.registerModelContextProvider(clientRef.current!.modelContext()),\n [runtime],\n );\n\n return useResource(ThreadClient({ runtime: runtime.thread }));\n};\n\nconst AISDKChatThread = resource(useAISDKChatThread);\n\nconst useAISDKThreads = <UI_MESSAGE extends UIMessage = UIMessage>(\n options?: AISDKThreadsOptions<UI_MESSAGE>,\n) => {\n const { cloud, threadId, onThreadIdChange, ...threadOptions } = options ?? {};\n const [chats] = useState(() => new Map<string, ChatEntry<UI_MESSAGE>>());\n const bindCloud = cloud !== undefined;\n\n useEffect(() => {\n for (const { optionsRef } of chats.values()) {\n optionsRef.current = threadOptions;\n }\n });\n\n useResourceCleanup(true, () => {\n for (const { chat } of chats.values()) {\n void chat.stop().catch(() => {});\n }\n });\n\n const cloudAdapter = useCloudThreadListAdapter({ cloud, sdk: AI_SDK_SDK });\n const thread = (id: string) => {\n const element = AISDKChatThread({\n threadId: id,\n options: threadOptions,\n chats,\n cloud: bindCloud,\n });\n return bindCloud ? withKey(id, element) : element;\n };\n\n return useResource(\n bindCloud\n ? RemoteThreadList({\n adapter: cloudAdapter,\n backgroundThreads: true,\n thread,\n threadId,\n onThreadIdChange,\n })\n : InMemoryThreadList({\n thread,\n onDelete: (id) => {\n void chats\n .get(id)\n ?.chat.stop()\n .catch(() => {});\n chats.delete(id);\n },\n }),\n );\n};\n\n/**\n * `AuiConfig` entry that runs one AI SDK chat per thread. Hosts the same\n * per-thread orchestration as {@link AISDKChat} inside the client's own\n * resource tree, so it works with any `AssistantClient` host, React or not.\n * Without `cloud`, threads live in memory for the client's lifetime and keep\n * their history across switches; only the visible thread is mounted, and a\n * switched-away chat keeps streaming into its stored state until it settles\n * or the thread is deleted. With `cloud`, the list is a\n * `RemoteThreadList` with `backgroundThreads`: every visited thread stays\n * mounted with its own history, a run continues after a switch and stops on\n * delete, and a freshly created thread titles itself. Model context is\n * registered on every mounted thread.\n */\nexport const AISDKThreads = resource(useAISDKThreads);\n\nattachTransformScopes(useAISDKThreads, inMemoryThreadListTransformScopes);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AISDKThreads.js","names":["c","_c","resource","useResource","withKey","useEffect","useMemo","useRef","useState","Chat","UIMessage","ChatTransport","AssistantCloud","InMemoryThreadList","RemoteThreadList","inMemoryThreadListTransformScopes","ThreadClient","useCloudThreadListAdapter","attachTransformScopes","useAssistantClientRef","useAssistantScopeEffect","useAui","AssistantChatTransport","createChat","splitChatThreadOptions","useChatThread","ChatThreadOptions","MessageRepository","useResourceCleanup","AI_SDK_SDK","AISDKThreadsOptions","Omit","UI_MESSAGE","transport","cloud","scopeId","threadId","onThreadIdChange","AISDKThreadChatOptions","ChatOptionsRef","current","ChatEntry","chat","repository","optionsRef","createChatEntry","options","chatInit","undefined","__internal_clone","id","getOrCreateChatEntry","chats","Map","existing","get","created","set","useAISDKChatThread","t0","$","t1","owned","t2","t3","t4","t5","stop","catch","_temp","aui","t6","initialize","remoteId","externalId","fallbackItem","t7","t8","threadListItem","source","t9","isMainThread","getThreadListItem","messageRepositoryInstance","stopOnClientDestroy","runtime","clientRef","t10","registerModelContextProvider","modelContext","t11","t12","thread","AISDKChatThread","useAISDKThreads","threadOptions","_temp2","bindCloud","values","_temp3","cloudAdapter","sdk","previousCloudAdapter","previous","cancelled","queueMicrotask","threads","reload","element","adapter","backgroundThreads","onDelete","id_0","_temp4","delete","AISDKThreads","_c"],"sources":["../../src/runtime/AISDKThreads.ts"],"sourcesContent":["\"use client\";\n\nimport { resource, useResource, withKey } from \"@assistant-ui/tap\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { Chat, UIMessage } from \"@ai-sdk/react\";\nimport type { ChatTransport } from \"ai\";\nimport type { AssistantCloud } from \"assistant-cloud\";\nimport {\n InMemoryThreadList,\n RemoteThreadList,\n inMemoryThreadListTransformScopes,\n} from \"@assistant-ui/core/store\";\nimport { ThreadClient } from \"@assistant-ui/core/store/internal\";\nimport { useCloudThreadListAdapter } from \"@assistant-ui/core/react\";\nimport {\n attachTransformScopes,\n useAssistantClientRef,\n useAssistantScopeEffect,\n} from \"@assistant-ui/store/client\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { AssistantChatTransport } from \"../transport/AssistantChatTransport\";\nimport {\n createChat,\n splitChatThreadOptions,\n useChatThread,\n type ChatThreadOptions,\n} from \"./useChatThread\";\nimport { MessageRepository } from \"@assistant-ui/core/internal\";\nimport { useResourceCleanup } from \"./useResourceCleanup\";\nimport { AI_SDK_SDK } from \"./sdkIdentity\";\n\nexport type AISDKThreadsOptions<UI_MESSAGE extends UIMessage = UIMessage> =\n Omit<ChatThreadOptions<UI_MESSAGE>, \"id\" | \"transport\" | \"messages\"> & {\n /**\n * The transport threads send through. A factory is invoked once per\n * thread so each thread owns its instance. A plain\n * `AssistantChatTransport` instance is cloned per thread (its\n * assistant-ui wiring is per thread); any other transport instance is\n * shared as-is. Defaults to one `AssistantChatTransport` per thread.\n */\n transport?:\n | ChatTransport<UI_MESSAGE>\n | (() => ChatTransport<UI_MESSAGE>)\n | undefined;\n /**\n * When set, the thread list is a `RemoteThreadList` backed by this\n * assistant-cloud. Omit it to keep the in-memory list. Every visited\n * cloud thread stays mounted, so an in-flight run continues after a\n * switch and stops on delete; per-thread history loads once per thread.\n */\n cloud?: AssistantCloud | undefined;\n /**\n * Stable identity for the account or workspace owning Cloud runtime state.\n * Provide it from the first render and change it when that scope changes.\n */\n scopeId?: string | undefined;\n /**\n * Controlled thread id for the cloud list. Ignored without `cloud`.\n */\n threadId?: string | undefined;\n /**\n * Called with the settled remote id when the cloud list changes thread.\n */\n onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;\n };\n\ntype AISDKThreadChatOptions<UI_MESSAGE extends UIMessage = UIMessage> = Omit<\n AISDKThreadsOptions<UI_MESSAGE>,\n \"cloud\" | \"scopeId\" | \"threadId\" | \"onThreadIdChange\"\n>;\n\ntype ChatOptionsRef<UI_MESSAGE extends UIMessage> = {\n current: AISDKThreadChatOptions<UI_MESSAGE> | undefined;\n};\n\ntype ChatEntry<UI_MESSAGE extends UIMessage> = {\n chat: Chat<UI_MESSAGE>;\n transport: ChatTransport<UI_MESSAGE>;\n repository: MessageRepository;\n optionsRef: ChatOptionsRef<UI_MESSAGE>;\n};\n\nconst createChatEntry = <UI_MESSAGE extends UIMessage>(\n threadId: string,\n options: AISDKThreadChatOptions<UI_MESSAGE> | undefined,\n): ChatEntry<UI_MESSAGE> => {\n const optionsRef: ChatOptionsRef<UI_MESSAGE> = { current: options };\n const { chatInit } = splitChatThreadOptions(\n options as ChatThreadOptions<UI_MESSAGE> | undefined,\n );\n const transport =\n typeof options?.transport === \"function\"\n ? options.transport()\n : options?.transport === undefined\n ? new AssistantChatTransport()\n : options.transport instanceof AssistantChatTransport\n ? options.transport.__internal_clone()\n : options.transport;\n return {\n chat: createChat({ ...chatInit, id: threadId, transport }, optionsRef),\n transport,\n repository: new MessageRepository(),\n optionsRef,\n };\n};\n\nconst getOrCreateChatEntry = <UI_MESSAGE extends UIMessage>(\n threadId: string,\n options: AISDKThreadChatOptions<UI_MESSAGE> | undefined,\n chats: Map<string, ChatEntry<UI_MESSAGE>>,\n): ChatEntry<UI_MESSAGE> => {\n const existing = chats.get(threadId);\n if (existing) return existing;\n const created = createChatEntry(threadId, options);\n chats.set(threadId, created);\n return created;\n};\n\nconst useAISDKChatThread = <UI_MESSAGE extends UIMessage = UIMessage>({\n threadId,\n options,\n chats,\n cloud,\n}: {\n threadId: string;\n options: AISDKThreadChatOptions<UI_MESSAGE> | undefined;\n chats: Map<string, ChatEntry<UI_MESSAGE>>;\n cloud: boolean;\n}) => {\n const [owned] = useState(() =>\n cloud ? createChatEntry(threadId, options) : undefined,\n );\n const { chat, transport, repository, optionsRef } =\n owned ?? getOrCreateChatEntry(threadId, options, chats);\n\n useEffect(() => {\n if (cloud) optionsRef.current = options;\n });\n\n useEffect(() => {\n if (!cloud) return undefined;\n return () => {\n void chat.stop().catch(() => {});\n };\n }, [chat, cloud]);\n\n const aui = useAui();\n const fallbackItem = useMemo(\n () => ({\n initialize: async () => ({\n remoteId: threadId,\n externalId: undefined,\n }),\n }),\n [threadId],\n );\n const runtime = useChatThread(\n { ...options, transport } as ChatThreadOptions<UI_MESSAGE>,\n {\n id: threadId,\n isMainThread: true,\n getThreadListItem: () =>\n cloud\n ? aui.threadListItem.source\n ? aui.threadListItem\n : undefined\n : fallbackItem,\n chat,\n messageRepositoryInstance: repository,\n stopOnClientDestroy: false,\n },\n );\n\n const clientRef = useAssistantClientRef();\n useAssistantScopeEffect(\n \"modelContext\",\n () =>\n runtime.registerModelContextProvider(clientRef.current!.modelContext()),\n [runtime],\n );\n\n return useResource(ThreadClient({ runtime: runtime.thread }));\n};\n\nconst AISDKChatThread = resource(useAISDKChatThread);\n\nconst useAISDKThreads = <UI_MESSAGE extends UIMessage = UIMessage>(\n options?: AISDKThreadsOptions<UI_MESSAGE>,\n) => {\n const { cloud, scopeId, threadId, onThreadIdChange, ...threadOptions } =\n options ?? {};\n const [chats] = useState(() => new Map<string, ChatEntry<UI_MESSAGE>>());\n const bindCloud = cloud !== undefined;\n\n useEffect(() => {\n for (const { optionsRef } of chats.values()) {\n optionsRef.current = threadOptions;\n }\n });\n\n useResourceCleanup(true, () => {\n for (const { chat } of chats.values()) {\n void chat.stop().catch(() => {});\n }\n });\n\n const cloudAdapter = useCloudThreadListAdapter({\n cloud,\n scopeId,\n sdk: AI_SDK_SDK,\n });\n const clientRef = useAssistantClientRef();\n const previousCloudAdapter = useRef(bindCloud ? cloudAdapter : undefined);\n useEffect(() => {\n const previous = previousCloudAdapter.current;\n previousCloudAdapter.current = bindCloud ? cloudAdapter : undefined;\n if (!bindCloud || previous === undefined || previous === cloudAdapter)\n return;\n // Wait until RemoteThreadList commits the replacement adapter before\n // requesting its explicit reload.\n let cancelled = false;\n queueMicrotask(() => {\n if (!cancelled) void clientRef.current!.threads.reload();\n });\n return () => {\n cancelled = true;\n };\n }, [bindCloud, clientRef, cloudAdapter]);\n const thread = (id: string) => {\n const element = AISDKChatThread({\n threadId: id,\n options: threadOptions,\n chats,\n cloud: bindCloud,\n });\n return bindCloud ? withKey(id, element) : element;\n };\n\n return useResource(\n bindCloud\n ? RemoteThreadList({\n adapter: cloudAdapter,\n backgroundThreads: true,\n thread,\n threadId,\n onThreadIdChange,\n })\n : InMemoryThreadList({\n thread,\n onDelete: (id) => {\n void chats\n .get(id)\n ?.chat.stop()\n .catch(() => {});\n chats.delete(id);\n },\n }),\n );\n};\n\n/**\n * `AuiConfig` entry that runs one AI SDK chat per thread. Hosts the same\n * per-thread orchestration as {@link AISDKChat} inside the client's own\n * resource tree, so it works with any `AssistantClient` host, React or not.\n * Without `cloud`, threads live in memory for the client's lifetime and keep\n * their history across switches; only the visible thread is mounted, and a\n * switched-away chat keeps streaming into its stored state until it settles\n * or the thread is deleted. With `cloud`, the list is a\n * `RemoteThreadList` with `backgroundThreads`: every visited thread stays\n * mounted with its own history, a run continues after a switch and stops on\n * delete, and a freshly created thread titles itself. Model context is\n * registered on every mounted thread.\n */\nexport const AISDKThreads = resource(useAISDKThreads);\n\nattachTransformScopes(useAISDKThreads, inMemoryThreadListTransformScopes);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { AssistantRuntime } from "@assistant-ui/core";
|
|
2
|
+
import type { UIMessage } from "@ai-sdk/react";
|
|
3
|
+
import type { ChatTransport } from "ai";
|
|
4
|
+
import { type InitializableThreadListItem } from "../transport/AssistantChatTransport.js";
|
|
5
|
+
import type { ResumableClientStorage } from "../transport/resumable.js";
|
|
6
|
+
export declare const getResumedStreamIds: (storage: ResumableClientStorage | undefined) => Set<string>;
|
|
7
|
+
declare class DynamicResumableStorage implements ResumableClientStorage {
|
|
8
|
+
private readonly subscriptions;
|
|
9
|
+
private storage;
|
|
10
|
+
private resumedStreamIds;
|
|
11
|
+
private hasPendingNotification;
|
|
12
|
+
constructor(storage: ResumableClientStorage | undefined);
|
|
13
|
+
setStorage(storage: ResumableClientStorage | undefined): void;
|
|
14
|
+
flushChange(): void;
|
|
15
|
+
getResumedStreamIds(): Set<string>;
|
|
16
|
+
getStreamId(threadId?: string): string | null;
|
|
17
|
+
setStreamId(id: string, threadId?: string): void;
|
|
18
|
+
clear(threadId?: string): void;
|
|
19
|
+
subscribe(listener: () => void, threadId?: string): () => void;
|
|
20
|
+
}
|
|
21
|
+
type ThreadTransportBinding = {
|
|
22
|
+
runtime: AssistantRuntime;
|
|
23
|
+
getThreadListItem: () => InitializableThreadListItem | undefined;
|
|
24
|
+
};
|
|
25
|
+
export declare class DynamicChatTransport<UI_MESSAGE extends UIMessage> implements ChatTransport<UI_MESSAGE> {
|
|
26
|
+
private readonly threadContexts;
|
|
27
|
+
private transport;
|
|
28
|
+
private readonly resumableStorage;
|
|
29
|
+
constructor(transport: ChatTransport<UI_MESSAGE>);
|
|
30
|
+
readonly sendMessages: ChatTransport<UI_MESSAGE>["sendMessages"];
|
|
31
|
+
readonly reconnectToStream: ChatTransport<UI_MESSAGE>["reconnectToStream"];
|
|
32
|
+
readonly getCurrentTransport: (chatId: string) => ChatTransport<UI_MESSAGE>;
|
|
33
|
+
readonly getCurrentResumableStorage: () => DynamicResumableStorage;
|
|
34
|
+
readonly getResumedStreamIds: () => Set<string>;
|
|
35
|
+
createThreadProxy(owner: object, getBinding: () => ThreadTransportBinding): ChatTransport<UI_MESSAGE>;
|
|
36
|
+
setTransport(transport: ChatTransport<UI_MESSAGE>): void;
|
|
37
|
+
flushTransportChange(): void;
|
|
38
|
+
registerThread(chatId: string, owner: object): void;
|
|
39
|
+
setThreadContext(chatId: string, owner: object, runtime: AssistantRuntime, getThreadListItem: () => InitializableThreadListItem | undefined): void;
|
|
40
|
+
unregisterThread(chatId: string, owner: object): void;
|
|
41
|
+
private getTransport;
|
|
42
|
+
private getBoundTransport;
|
|
43
|
+
private getOrCreateBoundTransport;
|
|
44
|
+
private getThreadTransport;
|
|
45
|
+
private createThreadTransport;
|
|
46
|
+
private wireTransport;
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=DynamicChatTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicChatTransport.d.ts","sourceRoot":"","sources":["../../src/runtime/DynamicChatTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAEL,KAAK,2BAA2B,EACjC,+CAA4C;AAC7C,OAAO,KAAK,EAAE,sBAAsB,EAAE,kCAA+B;AAQrE,eAAO,MAAM,mBAAmB,GAC9B,SAAS,sBAAsB,GAAG,SAAS,gBAS5C,CAAC;AAQF,cAAM,uBAAwB,YAAW,sBAAsB;IAC7D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2C;IACzE,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,gBAAgB,CAAc;IACtC,OAAO,CAAC,sBAAsB,CAAS;gBAE3B,OAAO,EAAE,sBAAsB,GAAG,SAAS;IAKhD,UAAU,CAAC,OAAO,EAAE,sBAAsB,GAAG,SAAS;IAWtD,WAAW;IAaX,mBAAmB;IAInB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM;IAI7B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAIzC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM;IAIvB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM;CAYzD;AAYD,KAAK,sBAAsB,GAAG;IAC5B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,iBAAiB,EAAE,MAAM,2BAA2B,GAAG,SAAS,CAAC;CAClE,CAAC;AAEF,qBAAa,oBAAoB,CAC/B,UAAU,SAAS,SAAS,CAC5B,YAAW,aAAa,CAAC,UAAU,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAG3B;IACJ,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;gBAE/C,SAAS,EAAE,aAAa,CAAC,UAAU,CAAC;IAOhD,SAAgB,YAAY,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,CAEV;IAE7D,SAAgB,iBAAiB,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,mBAAmB,CAAC,CACL;IAE5E,SAAgB,mBAAmB,GAAI,QAAQ,MAAM,+BACwB;IAE7E,SAAgB,0BAA0B,gCAA+B;IAEzE,SAAgB,mBAAmB,oBACW;IAEvC,iBAAiB,CACtB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,sBAAsB,GACvC,aAAa,CAAC,UAAU,CAAC;IAiBrB,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,UAAU,CAAC;IAMjD,oBAAoB;IAIpB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAQ5C,gBAAgB,CACrB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,EACzB,iBAAiB,EAAE,MAAM,2BAA2B,GAAG,SAAS;IAkB3D,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAMrD,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,yBAAyB;IAWjC,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,qBAAqB;IAM7B,OAAO,CAAC,aAAa;CAUtB"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { AssistantChatTransport } from "../transport/AssistantChatTransport.js";
|
|
2
|
+
import { getResumableAdapter } from "./getResumableAdapter.js";
|
|
3
|
+
//#region src/runtime/DynamicChatTransport.ts
|
|
4
|
+
const resumedStreamIdsByStorage = /* @__PURE__ */ new WeakMap();
|
|
5
|
+
const getResumedStreamIds = (storage) => {
|
|
6
|
+
if (!storage) return /* @__PURE__ */ new Set();
|
|
7
|
+
let resumedStreamIds = resumedStreamIdsByStorage.get(storage);
|
|
8
|
+
if (!resumedStreamIds) {
|
|
9
|
+
resumedStreamIds = /* @__PURE__ */ new Set();
|
|
10
|
+
resumedStreamIdsByStorage.set(storage, resumedStreamIds);
|
|
11
|
+
}
|
|
12
|
+
return resumedStreamIds;
|
|
13
|
+
};
|
|
14
|
+
var DynamicResumableStorage = class {
|
|
15
|
+
subscriptions = /* @__PURE__ */ new Set();
|
|
16
|
+
storage;
|
|
17
|
+
resumedStreamIds;
|
|
18
|
+
hasPendingNotification = false;
|
|
19
|
+
constructor(storage) {
|
|
20
|
+
this.storage = storage;
|
|
21
|
+
this.resumedStreamIds = getResumedStreamIds(storage);
|
|
22
|
+
}
|
|
23
|
+
setStorage(storage) {
|
|
24
|
+
if (this.storage === storage) return;
|
|
25
|
+
this.storage = storage;
|
|
26
|
+
const nextResumedStreamIds = getResumedStreamIds(storage);
|
|
27
|
+
for (const streamId of this.resumedStreamIds) nextResumedStreamIds.add(streamId);
|
|
28
|
+
this.resumedStreamIds = nextResumedStreamIds;
|
|
29
|
+
this.hasPendingNotification = true;
|
|
30
|
+
}
|
|
31
|
+
flushChange() {
|
|
32
|
+
if (!this.hasPendingNotification) return;
|
|
33
|
+
this.hasPendingNotification = false;
|
|
34
|
+
for (const subscription of this.subscriptions) {
|
|
35
|
+
subscription.unsubscribe?.();
|
|
36
|
+
subscription.unsubscribe = this.storage?.subscribe?.(subscription.listener, subscription.threadId);
|
|
37
|
+
subscription.listener();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
getResumedStreamIds() {
|
|
41
|
+
return this.resumedStreamIds;
|
|
42
|
+
}
|
|
43
|
+
getStreamId(threadId) {
|
|
44
|
+
return this.storage?.getStreamId(threadId) ?? null;
|
|
45
|
+
}
|
|
46
|
+
setStreamId(id, threadId) {
|
|
47
|
+
this.storage?.setStreamId(id, threadId);
|
|
48
|
+
}
|
|
49
|
+
clear(threadId) {
|
|
50
|
+
this.storage?.clear(threadId);
|
|
51
|
+
}
|
|
52
|
+
subscribe(listener, threadId) {
|
|
53
|
+
const subscription = {
|
|
54
|
+
listener,
|
|
55
|
+
threadId,
|
|
56
|
+
unsubscribe: this.storage?.subscribe?.(listener, threadId)
|
|
57
|
+
};
|
|
58
|
+
this.subscriptions.add(subscription);
|
|
59
|
+
return () => {
|
|
60
|
+
this.subscriptions.delete(subscription);
|
|
61
|
+
subscription.unsubscribe?.();
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
var DynamicChatTransport = class {
|
|
66
|
+
threadContexts = /* @__PURE__ */ new Map();
|
|
67
|
+
transport;
|
|
68
|
+
resumableStorage;
|
|
69
|
+
constructor(transport) {
|
|
70
|
+
this.transport = transport;
|
|
71
|
+
this.resumableStorage = new DynamicResumableStorage(getResumableAdapter(transport)?.storage);
|
|
72
|
+
}
|
|
73
|
+
sendMessages = (options) => this.getTransport(options.chatId).sendMessages(options);
|
|
74
|
+
reconnectToStream = (options) => this.getTransport(options.chatId).reconnectToStream(options);
|
|
75
|
+
getCurrentTransport = (chatId) => this.getThreadTransport(this.threadContexts.get(chatId)) ?? this.transport;
|
|
76
|
+
getCurrentResumableStorage = () => this.resumableStorage;
|
|
77
|
+
getResumedStreamIds = () => this.resumableStorage.getResumedStreamIds();
|
|
78
|
+
createThreadProxy(owner, getBinding) {
|
|
79
|
+
return {
|
|
80
|
+
sendMessages: (options) => this.getOrCreateBoundTransport(options.chatId, owner, getBinding).sendMessages(options),
|
|
81
|
+
reconnectToStream: (options) => this.getOrCreateBoundTransport(options.chatId, owner, getBinding).reconnectToStream(options)
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
setTransport(transport) {
|
|
85
|
+
if (this.transport === transport) return;
|
|
86
|
+
this.transport = transport;
|
|
87
|
+
this.resumableStorage.setStorage(getResumableAdapter(transport)?.storage);
|
|
88
|
+
}
|
|
89
|
+
flushTransportChange() {
|
|
90
|
+
this.resumableStorage.flushChange();
|
|
91
|
+
}
|
|
92
|
+
registerThread(chatId, owner) {
|
|
93
|
+
if (this.threadContexts.get(chatId)?.owner === owner) return;
|
|
94
|
+
this.threadContexts.set(chatId, { owner });
|
|
95
|
+
}
|
|
96
|
+
setThreadContext(chatId, owner, runtime, getThreadListItem) {
|
|
97
|
+
this.registerThread(chatId, owner);
|
|
98
|
+
const context = this.threadContexts.get(chatId);
|
|
99
|
+
context.runtime = runtime;
|
|
100
|
+
context.getThreadListItem = getThreadListItem;
|
|
101
|
+
if (context.transport === void 0) {
|
|
102
|
+
this.getThreadTransport(context);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (context.sourceTransport === this.transport && context.transport !== void 0) this.wireTransport(context, context.transport);
|
|
106
|
+
}
|
|
107
|
+
unregisterThread(chatId, owner) {
|
|
108
|
+
if (this.threadContexts.get(chatId)?.owner === owner) this.threadContexts.delete(chatId);
|
|
109
|
+
}
|
|
110
|
+
getTransport(chatId) {
|
|
111
|
+
const context = this.threadContexts.get(chatId);
|
|
112
|
+
if (!context) throw new Error(`DynamicChatTransport has no registered context for chat "${chatId}"`);
|
|
113
|
+
return this.getThreadTransport(context);
|
|
114
|
+
}
|
|
115
|
+
getBoundTransport(chatId, owner, binding) {
|
|
116
|
+
this.registerThread(chatId, owner);
|
|
117
|
+
const context = this.threadContexts.get(chatId);
|
|
118
|
+
context.runtime = binding.runtime;
|
|
119
|
+
context.getThreadListItem = binding.getThreadListItem;
|
|
120
|
+
return this.getThreadTransport(context);
|
|
121
|
+
}
|
|
122
|
+
getOrCreateBoundTransport(chatId, owner, getBinding) {
|
|
123
|
+
const context = this.threadContexts.get(chatId);
|
|
124
|
+
return context?.owner === owner ? this.getThreadTransport(context) : this.getBoundTransport(chatId, owner, getBinding());
|
|
125
|
+
}
|
|
126
|
+
getThreadTransport(context) {
|
|
127
|
+
if (!context) return void 0;
|
|
128
|
+
if (context.sourceTransport !== this.transport) {
|
|
129
|
+
context.transport = this.createThreadTransport(this.transport);
|
|
130
|
+
context.sourceTransport = this.transport;
|
|
131
|
+
}
|
|
132
|
+
this.wireTransport(context, context.transport);
|
|
133
|
+
return context.transport;
|
|
134
|
+
}
|
|
135
|
+
createThreadTransport(transport) {
|
|
136
|
+
return transport instanceof AssistantChatTransport ? transport.__internal_clone() : transport;
|
|
137
|
+
}
|
|
138
|
+
wireTransport(context, transport) {
|
|
139
|
+
if (!(transport instanceof AssistantChatTransport)) return;
|
|
140
|
+
if (context.runtime) transport.setRuntime(context.runtime);
|
|
141
|
+
if (context.getThreadListItem) transport.__internal_setGetThreadListItem(context.getThreadListItem);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
//#endregion
|
|
145
|
+
export { DynamicChatTransport, getResumedStreamIds };
|
|
146
|
+
|
|
147
|
+
//# sourceMappingURL=DynamicChatTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicChatTransport.js","names":["AssistantRuntime","UIMessage","ChatTransport","AssistantChatTransport","InitializableThreadListItem","ResumableClientStorage","getResumableAdapter","resumedStreamIdsByStorage","WeakMap","Set","getResumedStreamIds","storage","resumedStreamIds","get","set","ResumableStorageSubscription","listener","threadId","unsubscribe","DynamicResumableStorage","subscriptions","hasPendingNotification","constructor","setStorage","nextResumedStreamIds","streamId","add","flushChange","subscription","subscribe","getStreamId","setStreamId","id","clear","delete","ThreadTransportContext","owner","sourceTransport","UI_MESSAGE","transport","runtime","getThreadListItem","ThreadTransportBinding","DynamicChatTransport","threadContexts","Map","resumableStorage","sendMessages","options","getTransport","chatId","reconnectToStream","getCurrentTransport","getThreadTransport","getCurrentResumableStorage","createThreadProxy","getBinding","getOrCreateBoundTransport","setTransport","flushTransportChange","registerThread","existing","setThreadContext","context","undefined","wireTransport","unregisterThread","Error","getBoundTransport","binding","createThreadTransport","__internal_clone","setRuntime","__internal_setGetThreadListItem"],"sources":["../../src/runtime/DynamicChatTransport.ts"],"sourcesContent":["import type { AssistantRuntime } from \"@assistant-ui/core\";\nimport type { UIMessage } from \"@ai-sdk/react\";\nimport type { ChatTransport } from \"ai\";\nimport {\n AssistantChatTransport,\n type InitializableThreadListItem,\n} from \"../transport/AssistantChatTransport\";\nimport type { ResumableClientStorage } from \"../transport/resumable\";\nimport { getResumableAdapter } from \"./getResumableAdapter\";\n\nconst resumedStreamIdsByStorage = new WeakMap<\n ResumableClientStorage,\n Set<string>\n>();\n\nexport const getResumedStreamIds = (\n storage: ResumableClientStorage | undefined,\n) => {\n if (!storage) return new Set<string>();\n let resumedStreamIds = resumedStreamIdsByStorage.get(storage);\n if (!resumedStreamIds) {\n resumedStreamIds = new Set();\n resumedStreamIdsByStorage.set(storage, resumedStreamIds);\n }\n return resumedStreamIds;\n};\n\ntype ResumableStorageSubscription = {\n listener: () => void;\n threadId: string | undefined;\n unsubscribe: (() => void) | undefined;\n};\n\nclass DynamicResumableStorage implements ResumableClientStorage {\n private readonly subscriptions = new Set<ResumableStorageSubscription>();\n private storage: ResumableClientStorage | undefined;\n private resumedStreamIds: Set<string>;\n private hasPendingNotification = false;\n\n constructor(storage: ResumableClientStorage | undefined) {\n this.storage = storage;\n this.resumedStreamIds = getResumedStreamIds(storage);\n }\n\n public setStorage(storage: ResumableClientStorage | undefined) {\n if (this.storage === storage) return;\n this.storage = storage;\n const nextResumedStreamIds = getResumedStreamIds(storage);\n for (const streamId of this.resumedStreamIds) {\n nextResumedStreamIds.add(streamId);\n }\n this.resumedStreamIds = nextResumedStreamIds;\n this.hasPendingNotification = true;\n }\n\n public flushChange() {\n if (!this.hasPendingNotification) return;\n this.hasPendingNotification = false;\n for (const subscription of this.subscriptions) {\n subscription.unsubscribe?.();\n subscription.unsubscribe = this.storage?.subscribe?.(\n subscription.listener,\n subscription.threadId,\n );\n subscription.listener();\n }\n }\n\n public getResumedStreamIds() {\n return this.resumedStreamIds;\n }\n\n public getStreamId(threadId?: string) {\n return this.storage?.getStreamId(threadId) ?? null;\n }\n\n public setStreamId(id: string, threadId?: string) {\n this.storage?.setStreamId(id, threadId);\n }\n\n public clear(threadId?: string) {\n this.storage?.clear(threadId);\n }\n\n public subscribe(listener: () => void, threadId?: string) {\n const subscription: ResumableStorageSubscription = {\n listener,\n threadId,\n unsubscribe: this.storage?.subscribe?.(listener, threadId),\n };\n this.subscriptions.add(subscription);\n return () => {\n this.subscriptions.delete(subscription);\n subscription.unsubscribe?.();\n };\n }\n}\n\ntype ThreadTransportContext<UI_MESSAGE extends UIMessage> = {\n owner: object;\n sourceTransport?: ChatTransport<UI_MESSAGE> | undefined;\n transport?: ChatTransport<UI_MESSAGE> | undefined;\n runtime?: AssistantRuntime | undefined;\n getThreadListItem?:\n | (() => InitializableThreadListItem | undefined)\n | undefined;\n};\n\ntype ThreadTransportBinding = {\n runtime: AssistantRuntime;\n getThreadListItem: () => InitializableThreadListItem | undefined;\n};\n\nexport class DynamicChatTransport<\n UI_MESSAGE extends UIMessage,\n> implements ChatTransport<UI_MESSAGE> {\n private readonly threadContexts = new Map<\n string,\n ThreadTransportContext<UI_MESSAGE>\n >();\n private transport: ChatTransport<UI_MESSAGE>;\n private readonly resumableStorage: DynamicResumableStorage;\n\n constructor(transport: ChatTransport<UI_MESSAGE>) {\n this.transport = transport;\n this.resumableStorage = new DynamicResumableStorage(\n getResumableAdapter(transport)?.storage,\n );\n }\n\n public readonly sendMessages: ChatTransport<UI_MESSAGE>[\"sendMessages\"] = (\n options,\n ) => this.getTransport(options.chatId).sendMessages(options);\n\n public readonly reconnectToStream: ChatTransport<UI_MESSAGE>[\"reconnectToStream\"] =\n (options) => this.getTransport(options.chatId).reconnectToStream(options);\n\n public readonly getCurrentTransport = (chatId: string) =>\n this.getThreadTransport(this.threadContexts.get(chatId)) ?? this.transport;\n\n public readonly getCurrentResumableStorage = () => this.resumableStorage;\n\n public readonly getResumedStreamIds = () =>\n this.resumableStorage.getResumedStreamIds();\n\n public createThreadProxy(\n owner: object,\n getBinding: () => ThreadTransportBinding,\n ): ChatTransport<UI_MESSAGE> {\n return {\n sendMessages: (options) =>\n this.getOrCreateBoundTransport(\n options.chatId,\n owner,\n getBinding,\n ).sendMessages(options),\n reconnectToStream: (options) =>\n this.getOrCreateBoundTransport(\n options.chatId,\n owner,\n getBinding,\n ).reconnectToStream(options),\n };\n }\n\n public setTransport(transport: ChatTransport<UI_MESSAGE>) {\n if (this.transport === transport) return;\n this.transport = transport;\n this.resumableStorage.setStorage(getResumableAdapter(transport)?.storage);\n }\n\n public flushTransportChange() {\n this.resumableStorage.flushChange();\n }\n\n public registerThread(chatId: string, owner: object) {\n const existing = this.threadContexts.get(chatId);\n if (existing?.owner === owner) return;\n this.threadContexts.set(chatId, {\n owner,\n });\n }\n\n public setThreadContext(\n chatId: string,\n owner: object,\n runtime: AssistantRuntime,\n getThreadListItem: () => InitializableThreadListItem | undefined,\n ) {\n this.registerThread(chatId, owner);\n const context = this.threadContexts.get(chatId)!;\n context.runtime = runtime;\n context.getThreadListItem = getThreadListItem;\n if (context.transport === undefined) {\n this.getThreadTransport(context);\n return;\n }\n if (\n context.sourceTransport === this.transport &&\n context.transport !== undefined\n ) {\n this.wireTransport(context, context.transport);\n }\n }\n\n public unregisterThread(chatId: string, owner: object) {\n if (this.threadContexts.get(chatId)?.owner === owner) {\n this.threadContexts.delete(chatId);\n }\n }\n\n private getTransport(chatId: string) {\n const context = this.threadContexts.get(chatId);\n if (!context) {\n throw new Error(\n `DynamicChatTransport has no registered context for chat \"${chatId}\"`,\n );\n }\n return this.getThreadTransport(context)!;\n }\n\n private getBoundTransport(\n chatId: string,\n owner: object,\n binding: ThreadTransportBinding,\n ) {\n this.registerThread(chatId, owner);\n const context = this.threadContexts.get(chatId)!;\n context.runtime = binding.runtime;\n context.getThreadListItem = binding.getThreadListItem;\n return this.getThreadTransport(context)!;\n }\n\n private getOrCreateBoundTransport(\n chatId: string,\n owner: object,\n getBinding: () => ThreadTransportBinding,\n ) {\n const context = this.threadContexts.get(chatId);\n return context?.owner === owner\n ? this.getThreadTransport(context)!\n : this.getBoundTransport(chatId, owner, getBinding());\n }\n\n private getThreadTransport(\n context: ThreadTransportContext<UI_MESSAGE> | undefined,\n ) {\n if (!context) return undefined;\n if (context.sourceTransport !== this.transport) {\n context.transport = this.createThreadTransport(this.transport);\n context.sourceTransport = this.transport;\n }\n this.wireTransport(context, context.transport!);\n return context.transport!;\n }\n\n private createThreadTransport(transport: ChatTransport<UI_MESSAGE>) {\n return transport instanceof AssistantChatTransport\n ? transport.__internal_clone()\n : transport;\n }\n\n private wireTransport(\n context: ThreadTransportContext<UI_MESSAGE>,\n transport: ChatTransport<UI_MESSAGE>,\n ) {\n if (!(transport instanceof AssistantChatTransport)) return;\n if (context.runtime) transport.setRuntime(context.runtime);\n if (context.getThreadListItem) {\n transport.__internal_setGetThreadListItem(context.getThreadListItem);\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { UIMessage } from "@ai-sdk/react";
|
|
2
|
+
import type { ChatTransport } from "ai";
|
|
3
|
+
import type { AssistantChatResumableOptions } from "../transport/resumable.js";
|
|
4
|
+
export declare const getResumableAdapter: <UI_MESSAGE extends UIMessage>(transport: ChatTransport<UI_MESSAGE>) => AssistantChatResumableOptions | undefined;
|
|
5
|
+
//# sourceMappingURL=getResumableAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getResumableAdapter.d.ts","sourceRoot":"","sources":["../../src/runtime/getResumableAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC,OAAO,KAAK,EAAE,6BAA6B,EAAE,kCAA+B;AAE5E,eAAO,MAAM,mBAAmB,GAAI,UAAU,SAAS,SAAS,EAC9D,WAAW,aAAa,CAAC,UAAU,CAAC,KACnC,6BAA6B,GAAG,SAQlC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AssistantChatTransport } from "../transport/AssistantChatTransport.js";
|
|
2
|
+
//#region src/runtime/getResumableAdapter.ts
|
|
3
|
+
const getResumableAdapter = (transport) => {
|
|
4
|
+
if (transport instanceof AssistantChatTransport) return transport.getResumableAdapter();
|
|
5
|
+
const candidate = transport.getResumableAdapter;
|
|
6
|
+
if (typeof candidate !== "function") return void 0;
|
|
7
|
+
return candidate.call(transport);
|
|
8
|
+
};
|
|
9
|
+
//#endregion
|
|
10
|
+
export { getResumableAdapter };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=getResumableAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getResumableAdapter.js","names":["UIMessage","ChatTransport","AssistantChatTransport","AssistantChatResumableOptions","getResumableAdapter","transport","UI_MESSAGE","candidate","undefined","call"],"sources":["../../src/runtime/getResumableAdapter.ts"],"sourcesContent":["import type { UIMessage } from \"@ai-sdk/react\";\nimport type { ChatTransport } from \"ai\";\nimport { AssistantChatTransport } from \"../transport/AssistantChatTransport\";\nimport type { AssistantChatResumableOptions } from \"../transport/resumable\";\n\nexport const getResumableAdapter = <UI_MESSAGE extends UIMessage>(\n transport: ChatTransport<UI_MESSAGE>,\n): AssistantChatResumableOptions | undefined => {\n if (transport instanceof AssistantChatTransport) {\n return transport.getResumableAdapter();\n }\n const candidate = (transport as { getResumableAdapter?: () => unknown })\n .getResumableAdapter;\n if (typeof candidate !== \"function\") return undefined;\n return candidate.call(transport) as AssistantChatResumableOptions | undefined;\n};\n"],"mappings":";;AAKA,MAAaI,uBACXC,cAC8C;CAC9C,IAAIA,qBAAqBH,wBACvB,OAAOG,UAAUD,oBAAoB;CAEvC,MAAMG,YAAaF,UAChBD;CACH,IAAI,OAAOG,cAAc,YAAY,OAAOC,KAAAA;CAC5C,OAAOD,UAAUE,KAAKJ,SAAS;AACjC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { RespondToToolApprovalOptions, ThreadMessage, Unstable_ToolInteractionLog } from "@assistant-ui/core";
|
|
2
|
+
export type StoredToolApprovalResponse = Omit<RespondToToolApprovalOptions, "approvalId">;
|
|
3
|
+
export declare const collectToolArtifacts: (message: ThreadMessage, toolArtifacts: ReadonlyMap<string, unknown> | undefined) => {
|
|
4
|
+
[k: string]: {} | null;
|
|
5
|
+
} | undefined;
|
|
6
|
+
export declare const collectToolInteractions: (message: ThreadMessage, toolInteractions: ReadonlyMap<string, Unstable_ToolInteractionLog> | undefined) => {
|
|
7
|
+
[k: string]: Unstable_ToolInteractionLog;
|
|
8
|
+
} | undefined;
|
|
9
|
+
export declare const collectToolApprovalResponses: (message: ThreadMessage, toolApprovalResponses: ReadonlyMap<string, RespondToToolApprovalOptions> | undefined) => {
|
|
10
|
+
[k: string]: {
|
|
11
|
+
readonly reason?: string;
|
|
12
|
+
readonly answers?: Readonly<Record<string, import("@assistant-ui/core").ToolApprovalAnswer>>;
|
|
13
|
+
readonly text?: string;
|
|
14
|
+
readonly optionId?: string;
|
|
15
|
+
readonly approved: boolean;
|
|
16
|
+
};
|
|
17
|
+
} | undefined;
|
|
18
|
+
export declare const addToolData: <TMessage>(message: TMessage, toolArtifacts: Record<string, unknown> | undefined, toolInteractions: Record<string, Unstable_ToolInteractionLog> | undefined, toolApprovalResponses: Record<string, StoredToolApprovalResponse> | undefined) => TMessage;
|
|
19
|
+
export declare const restoreToolData: <TMessage>(message: TMessage, toolArtifacts: Map<string, unknown> | undefined, toolInteractions: Map<string, Unstable_ToolInteractionLog> | undefined, toolApprovalResponses: Map<string, RespondToToolApprovalOptions> | undefined) => TMessage;
|
|
20
|
+
//# sourceMappingURL=toolHistoryCodec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolHistoryCodec.d.ts","sourceRoot":"","sources":["../../src/runtime/toolHistoryCodec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,aAAa,EACb,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAQ5B,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,4BAA4B,EAC5B,YAAY,CACb,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,aAAa,EACtB,eAAe,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;;aASxD,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,SAAS,aAAa,EACtB,kBACI,WAAW,CAAC,MAAM,EAAE,2BAA2B,CAAC,GAChD,SAAS;;aAWd,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,SAAS,aAAa,EACtB,uBACI,WAAW,CAAC,MAAM,EAAE,4BAA4B,CAAC,GACjD,SAAS;;;;;;;;aAqBd,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,QAAQ,EAClC,SAAS,QAAQ,EACjB,eAAe,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAClD,kBAAkB,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,GAAG,SAAS,EACzE,uBAAuB,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,GAAG,SAAS,KAC5E,QAgEF,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,QAAQ,EACtC,SAAS,QAAQ,EACjB,eAAe,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC/C,kBAAkB,GAAG,CAAC,MAAM,EAAE,2BAA2B,CAAC,GAAG,SAAS,EACtE,uBAAuB,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,GAAG,SAAS,KAC3E,QAwDF,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { normalizeToolApprovalAnswers } from "../converters/toolApprovalAnswers.js";
|
|
2
|
+
import { isRecord, readToolInteractionLog } from "@assistant-ui/core/internal";
|
|
3
|
+
//#region src/runtime/toolHistoryCodec.ts
|
|
4
|
+
const TOOL_ARTIFACTS_METADATA_KEY = "__aui_toolArtifacts";
|
|
5
|
+
const TOOL_INTERACTIONS_METADATA_KEY = "__aui_toolInteractions";
|
|
6
|
+
const TOOL_APPROVAL_RESPONSES_METADATA_KEY = "__aui_toolApprovalResponses";
|
|
7
|
+
const collectToolArtifacts = (message, toolArtifacts) => {
|
|
8
|
+
if (!toolArtifacts) return void 0;
|
|
9
|
+
const entries = message.content.flatMap((part) => {
|
|
10
|
+
if (part.type !== "tool-call") return [];
|
|
11
|
+
const artifact = toolArtifacts.get(part.toolCallId);
|
|
12
|
+
return artifact === void 0 ? [] : [[part.toolCallId, artifact]];
|
|
13
|
+
});
|
|
14
|
+
return entries.length > 0 ? Object.fromEntries(entries) : void 0;
|
|
15
|
+
};
|
|
16
|
+
const collectToolInteractions = (message, toolInteractions) => {
|
|
17
|
+
if (!toolInteractions) return void 0;
|
|
18
|
+
const entries = message.content.flatMap((part) => {
|
|
19
|
+
if (part.type !== "tool-call") return [];
|
|
20
|
+
const interactions = toolInteractions.get(part.toolCallId);
|
|
21
|
+
return interactions === void 0 ? [] : [[part.toolCallId, interactions]];
|
|
22
|
+
});
|
|
23
|
+
return entries.length > 0 ? Object.fromEntries(entries) : void 0;
|
|
24
|
+
};
|
|
25
|
+
const collectToolApprovalResponses = (message, toolApprovalResponses) => {
|
|
26
|
+
if (!toolApprovalResponses) return void 0;
|
|
27
|
+
const entries = message.content.flatMap((part) => {
|
|
28
|
+
if (part.type !== "tool-call" || !part.approval) return [];
|
|
29
|
+
const response = toolApprovalResponses.get(part.approval.id);
|
|
30
|
+
if (!response) return [];
|
|
31
|
+
return [[part.approval.id, {
|
|
32
|
+
approved: response.approved,
|
|
33
|
+
...response.optionId != null && { optionId: response.optionId },
|
|
34
|
+
...response.text != null && { text: response.text },
|
|
35
|
+
...response.answers != null && { answers: response.answers },
|
|
36
|
+
...response.reason != null && { reason: response.reason }
|
|
37
|
+
}]];
|
|
38
|
+
});
|
|
39
|
+
return entries.length > 0 ? Object.fromEntries(entries) : void 0;
|
|
40
|
+
};
|
|
41
|
+
const addToolData = (message, toolArtifacts, toolInteractions, toolApprovalResponses) => {
|
|
42
|
+
if (!toolArtifacts && !toolInteractions && !toolApprovalResponses || !isRecord(message) || !Array.isArray(message.parts)) return message;
|
|
43
|
+
const toolCallIds = message.parts.flatMap((part) => {
|
|
44
|
+
if (!isRecord(part) || typeof part.toolCallId !== "string") return [];
|
|
45
|
+
return [part.toolCallId];
|
|
46
|
+
});
|
|
47
|
+
const artifacts = toolArtifacts ? Object.fromEntries(toolCallIds.flatMap((toolCallId) => Object.hasOwn(toolArtifacts, toolCallId) ? [[toolCallId, toolArtifacts[toolCallId]]] : [])) : void 0;
|
|
48
|
+
const interactions = toolInteractions ? Object.fromEntries(toolCallIds.flatMap((toolCallId) => Object.hasOwn(toolInteractions, toolCallId) ? [[toolCallId, toolInteractions[toolCallId]]] : [])) : void 0;
|
|
49
|
+
const approvalIds = message.parts.flatMap((part) => {
|
|
50
|
+
if (!isRecord(part) || !isRecord(part.approval)) return [];
|
|
51
|
+
const approvalId = part.approval.id;
|
|
52
|
+
return typeof approvalId === "string" ? [approvalId] : [];
|
|
53
|
+
});
|
|
54
|
+
const approvalResponses = toolApprovalResponses ? Object.fromEntries(approvalIds.flatMap((approvalId) => Object.hasOwn(toolApprovalResponses, approvalId) ? [[approvalId, toolApprovalResponses[approvalId]]] : [])) : void 0;
|
|
55
|
+
const hasArtifacts = !!artifacts && Object.keys(artifacts).length > 0;
|
|
56
|
+
const hasInteractions = !!interactions && Object.keys(interactions).length > 0;
|
|
57
|
+
const hasApprovalResponses = !!approvalResponses && Object.keys(approvalResponses).length > 0;
|
|
58
|
+
if (!hasArtifacts && !hasInteractions && !hasApprovalResponses) return message;
|
|
59
|
+
const metadata = isRecord(message.metadata) ? message.metadata : {};
|
|
60
|
+
return {
|
|
61
|
+
...message,
|
|
62
|
+
metadata: {
|
|
63
|
+
...metadata,
|
|
64
|
+
...hasArtifacts && { [TOOL_ARTIFACTS_METADATA_KEY]: artifacts },
|
|
65
|
+
...hasInteractions && { [TOOL_INTERACTIONS_METADATA_KEY]: interactions },
|
|
66
|
+
...hasApprovalResponses && { [TOOL_APPROVAL_RESPONSES_METADATA_KEY]: approvalResponses }
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
const restoreToolData = (message, toolArtifacts, toolInteractions, toolApprovalResponses) => {
|
|
71
|
+
if (!isRecord(message) || !isRecord(message.metadata)) return message;
|
|
72
|
+
const metadata = message.metadata;
|
|
73
|
+
const hasArtifacts = Object.hasOwn(metadata, TOOL_ARTIFACTS_METADATA_KEY);
|
|
74
|
+
const hasInteractions = Object.hasOwn(metadata, TOOL_INTERACTIONS_METADATA_KEY);
|
|
75
|
+
const hasApprovalResponses = Object.hasOwn(metadata, TOOL_APPROVAL_RESPONSES_METADATA_KEY);
|
|
76
|
+
if (!hasArtifacts && !hasInteractions && !hasApprovalResponses) return message;
|
|
77
|
+
const artifacts = metadata[TOOL_ARTIFACTS_METADATA_KEY];
|
|
78
|
+
if (toolArtifacts && isRecord(artifacts)) for (const [toolCallId, artifact] of Object.entries(artifacts)) toolArtifacts.set(toolCallId, artifact);
|
|
79
|
+
const interactions = metadata[TOOL_INTERACTIONS_METADATA_KEY];
|
|
80
|
+
if (toolInteractions && isRecord(interactions)) for (const [toolCallId, value] of Object.entries(interactions)) {
|
|
81
|
+
const log = readToolInteractionLog(value);
|
|
82
|
+
if (log) toolInteractions.set(toolCallId, log);
|
|
83
|
+
}
|
|
84
|
+
const approvalResponses = metadata[TOOL_APPROVAL_RESPONSES_METADATA_KEY];
|
|
85
|
+
if (toolApprovalResponses && isRecord(approvalResponses)) for (const [approvalId, value] of Object.entries(approvalResponses)) {
|
|
86
|
+
if (!isRecord(value) || typeof value.approved !== "boolean") continue;
|
|
87
|
+
const answers = normalizeToolApprovalAnswers(value.answers);
|
|
88
|
+
toolApprovalResponses.set(approvalId, {
|
|
89
|
+
approvalId,
|
|
90
|
+
approved: value.approved,
|
|
91
|
+
...typeof value.optionId === "string" && { optionId: value.optionId },
|
|
92
|
+
...typeof value.text === "string" && { text: value.text },
|
|
93
|
+
...answers && Object.keys(answers).length > 0 && { answers },
|
|
94
|
+
...typeof value.reason === "string" && { reason: value.reason }
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const { [TOOL_ARTIFACTS_METADATA_KEY]: _, [TOOL_INTERACTIONS_METADATA_KEY]: __, [TOOL_APPROVAL_RESPONSES_METADATA_KEY]: ___, ...restMetadata } = metadata;
|
|
98
|
+
const { metadata: _metadata, ...restMessage } = message;
|
|
99
|
+
return Object.keys(restMetadata).length === 0 ? restMessage : {
|
|
100
|
+
...restMessage,
|
|
101
|
+
metadata: restMetadata
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
//#endregion
|
|
105
|
+
export { addToolData, collectToolApprovalResponses, collectToolArtifacts, collectToolInteractions, restoreToolData };
|
|
106
|
+
|
|
107
|
+
//# sourceMappingURL=toolHistoryCodec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolHistoryCodec.js","names":["RespondToToolApprovalOptions","ThreadMessage","Unstable_ToolInteractionLog","isRecord","readToolInteractionLog","normalizeToolApprovalAnswers","TOOL_ARTIFACTS_METADATA_KEY","TOOL_INTERACTIONS_METADATA_KEY","TOOL_APPROVAL_RESPONSES_METADATA_KEY","StoredToolApprovalResponse","Omit","collectToolArtifacts","message","toolArtifacts","ReadonlyMap","undefined","entries","content","flatMap","part","type","artifact","get","toolCallId","const","length","Object","fromEntries","collectToolInteractions","toolInteractions","interactions","collectToolApprovalResponses","toolApprovalResponses","approval","response","id","approved","optionId","text","answers","reason","addToolData","TMessage","Record","Array","isArray","parts","toolCallIds","artifacts","hasOwn","approvalIds","approvalId","approvalResponses","hasArtifacts","keys","hasInteractions","hasApprovalResponses","metadata","restoreToolData","Map","set","value","log","_","__","___","restMetadata","_metadata","restMessage"],"sources":["../../src/runtime/toolHistoryCodec.ts"],"sourcesContent":["import type {\n RespondToToolApprovalOptions,\n ThreadMessage,\n Unstable_ToolInteractionLog,\n} from \"@assistant-ui/core\";\nimport { isRecord, readToolInteractionLog } from \"@assistant-ui/core/internal\";\nimport { normalizeToolApprovalAnswers } from \"../converters/toolApprovalAnswers\";\n\nconst TOOL_ARTIFACTS_METADATA_KEY = \"__aui_toolArtifacts\";\nconst TOOL_INTERACTIONS_METADATA_KEY = \"__aui_toolInteractions\";\nconst TOOL_APPROVAL_RESPONSES_METADATA_KEY = \"__aui_toolApprovalResponses\";\n\nexport type StoredToolApprovalResponse = Omit<\n RespondToToolApprovalOptions,\n \"approvalId\"\n>;\n\nexport const collectToolArtifacts = (\n message: ThreadMessage,\n toolArtifacts: ReadonlyMap<string, unknown> | undefined,\n) => {\n if (!toolArtifacts) return undefined;\n const entries = message.content.flatMap((part) => {\n if (part.type !== \"tool-call\") return [];\n const artifact = toolArtifacts.get(part.toolCallId);\n return artifact === undefined ? [] : [[part.toolCallId, artifact] as const];\n });\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nexport const collectToolInteractions = (\n message: ThreadMessage,\n toolInteractions:\n | ReadonlyMap<string, Unstable_ToolInteractionLog>\n | undefined,\n) => {\n if (!toolInteractions) return undefined;\n const entries = message.content.flatMap((part) => {\n if (part.type !== \"tool-call\") return [];\n const interactions = toolInteractions.get(part.toolCallId);\n return interactions === undefined\n ? []\n : [[part.toolCallId, interactions] as const];\n });\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nexport const collectToolApprovalResponses = (\n message: ThreadMessage,\n toolApprovalResponses:\n | ReadonlyMap<string, RespondToToolApprovalOptions>\n | undefined,\n) => {\n if (!toolApprovalResponses) return undefined;\n const entries = message.content.flatMap((part) => {\n if (part.type !== \"tool-call\" || !part.approval) return [];\n const response = toolApprovalResponses.get(part.approval.id);\n if (!response) return [];\n return [\n [\n part.approval.id,\n {\n approved: response.approved,\n ...(response.optionId != null && { optionId: response.optionId }),\n ...(response.text != null && { text: response.text }),\n ...(response.answers != null && { answers: response.answers }),\n ...(response.reason != null && { reason: response.reason }),\n },\n ] as const,\n ];\n });\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nexport const addToolData = <TMessage>(\n message: TMessage,\n toolArtifacts: Record<string, unknown> | undefined,\n toolInteractions: Record<string, Unstable_ToolInteractionLog> | undefined,\n toolApprovalResponses: Record<string, StoredToolApprovalResponse> | undefined,\n): TMessage => {\n if (\n (!toolArtifacts && !toolInteractions && !toolApprovalResponses) ||\n !isRecord(message) ||\n !Array.isArray(message.parts)\n )\n return message;\n const toolCallIds = message.parts.flatMap((part) => {\n if (!isRecord(part) || typeof part.toolCallId !== \"string\") return [];\n return [part.toolCallId];\n });\n const artifacts = toolArtifacts\n ? Object.fromEntries(\n toolCallIds.flatMap((toolCallId) =>\n Object.hasOwn(toolArtifacts, toolCallId)\n ? [[toolCallId, toolArtifacts[toolCallId]] as const]\n : [],\n ),\n )\n : undefined;\n const interactions = toolInteractions\n ? Object.fromEntries(\n toolCallIds.flatMap((toolCallId) =>\n Object.hasOwn(toolInteractions, toolCallId)\n ? [[toolCallId, toolInteractions[toolCallId]] as const]\n : [],\n ),\n )\n : undefined;\n const approvalIds = message.parts.flatMap((part) => {\n if (!isRecord(part) || !isRecord(part.approval)) return [];\n const approvalId = part.approval.id;\n return typeof approvalId === \"string\" ? [approvalId] : [];\n });\n const approvalResponses = toolApprovalResponses\n ? Object.fromEntries(\n approvalIds.flatMap((approvalId) =>\n Object.hasOwn(toolApprovalResponses, approvalId)\n ? [[approvalId, toolApprovalResponses[approvalId]] as const]\n : [],\n ),\n )\n : undefined;\n const hasArtifacts = !!artifacts && Object.keys(artifacts).length > 0;\n const hasInteractions =\n !!interactions && Object.keys(interactions).length > 0;\n const hasApprovalResponses =\n !!approvalResponses && Object.keys(approvalResponses).length > 0;\n if (!hasArtifacts && !hasInteractions && !hasApprovalResponses)\n return message;\n const metadata = isRecord(message.metadata) ? message.metadata : {};\n return {\n ...message,\n metadata: {\n ...metadata,\n ...(hasArtifacts && { [TOOL_ARTIFACTS_METADATA_KEY]: artifacts }),\n ...(hasInteractions && {\n [TOOL_INTERACTIONS_METADATA_KEY]: interactions,\n }),\n ...(hasApprovalResponses && {\n [TOOL_APPROVAL_RESPONSES_METADATA_KEY]: approvalResponses,\n }),\n },\n } as TMessage;\n};\n\nexport const restoreToolData = <TMessage>(\n message: TMessage,\n toolArtifacts: Map<string, unknown> | undefined,\n toolInteractions: Map<string, Unstable_ToolInteractionLog> | undefined,\n toolApprovalResponses: Map<string, RespondToToolApprovalOptions> | undefined,\n): TMessage => {\n if (!isRecord(message) || !isRecord(message.metadata)) return message;\n const metadata = message.metadata;\n const hasArtifacts = Object.hasOwn(metadata, TOOL_ARTIFACTS_METADATA_KEY);\n const hasInteractions = Object.hasOwn(\n metadata,\n TOOL_INTERACTIONS_METADATA_KEY,\n );\n const hasApprovalResponses = Object.hasOwn(\n metadata,\n TOOL_APPROVAL_RESPONSES_METADATA_KEY,\n );\n if (!hasArtifacts && !hasInteractions && !hasApprovalResponses)\n return message;\n const artifacts = metadata[TOOL_ARTIFACTS_METADATA_KEY];\n if (toolArtifacts && isRecord(artifacts)) {\n for (const [toolCallId, artifact] of Object.entries(artifacts)) {\n toolArtifacts.set(toolCallId, artifact);\n }\n }\n const interactions = metadata[TOOL_INTERACTIONS_METADATA_KEY];\n if (toolInteractions && isRecord(interactions)) {\n for (const [toolCallId, value] of Object.entries(interactions)) {\n const log = readToolInteractionLog(value);\n if (log) toolInteractions.set(toolCallId, log);\n }\n }\n const approvalResponses = metadata[TOOL_APPROVAL_RESPONSES_METADATA_KEY];\n if (toolApprovalResponses && isRecord(approvalResponses)) {\n for (const [approvalId, value] of Object.entries(approvalResponses)) {\n if (!isRecord(value) || typeof value.approved !== \"boolean\") continue;\n const answers = normalizeToolApprovalAnswers(value.answers);\n toolApprovalResponses.set(approvalId, {\n approvalId,\n approved: value.approved,\n ...(typeof value.optionId === \"string\" && {\n optionId: value.optionId,\n }),\n ...(typeof value.text === \"string\" && { text: value.text }),\n ...(answers && Object.keys(answers).length > 0 && { answers }),\n ...(typeof value.reason === \"string\" && { reason: value.reason }),\n });\n }\n }\n const {\n [TOOL_ARTIFACTS_METADATA_KEY]: _,\n [TOOL_INTERACTIONS_METADATA_KEY]: __,\n [TOOL_APPROVAL_RESPONSES_METADATA_KEY]: ___,\n ...restMetadata\n } = metadata;\n const { metadata: _metadata, ...restMessage } = message;\n return (\n Object.keys(restMetadata).length === 0\n ? restMessage\n : { ...restMessage, metadata: restMetadata }\n ) as TMessage;\n};\n"],"mappings":"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"}
|
|
@@ -10,12 +10,15 @@ export type AISDKRuntimeAdapter<UI_MESSAGE extends UIMessage = UIMessage> = Exte
|
|
|
10
10
|
suggestion?: SuggestionAdapter | undefined;
|
|
11
11
|
}) | undefined;
|
|
12
12
|
toCreateMessage?: CustomToCreateMessageFunction;
|
|
13
|
+
/** @deprecated Experimental since 2026-08-28. Not scheduled for removal; the API may change in any release. */
|
|
13
14
|
unstable_messageRepositoryInstance?: MessageRepository | undefined;
|
|
14
15
|
/**
|
|
15
16
|
* The object a host answer belongs to, normally the `Chat` the runtime
|
|
16
17
|
* renders. A host answer never reaches the `useChat` messages, so without
|
|
17
18
|
* an owner it lives only as long as this runtime. With an owner, it
|
|
18
19
|
* survives runtime remounts over the same chat.
|
|
20
|
+
*
|
|
21
|
+
* @deprecated Experimental since 2026-09-29. Not scheduled for removal; the API may change in any release.
|
|
19
22
|
*/
|
|
20
23
|
unstable_hostApprovalOwner?: object | undefined;
|
|
21
24
|
/**
|
|
@@ -74,7 +77,7 @@ export type AISDKRuntimeAdapter<UI_MESSAGE extends UIMessage = UIMessage> = Exte
|
|
|
74
77
|
* Called after an explicit `switchToBranch` (for example a BranchPicker
|
|
75
78
|
* click). Complements `setMessages` and does not enable switching by itself.
|
|
76
79
|
*
|
|
77
|
-
* @deprecated
|
|
80
|
+
* @deprecated Experimental since 2026-06-23. Not scheduled for removal; the API may change in any release.
|
|
78
81
|
*/
|
|
79
82
|
unstable_onBranchChange?: ExternalStoreAdapter["unstable_onBranchChange"];
|
|
80
83
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAISDKRuntime.d.ts","sourceRoot":"","sources":["../../src/runtime/useAISDKRuntime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useAISDKRuntime.d.ts","sourceRoot":"","sources":["../../src/runtime/useAISDKRuntime.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EACP,eAAe,EAEhB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,iBAAiB,EAGlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,gBAAgB,EAIhB,uBAAuB,EACvB,aAAa,EAGb,4BAA4B,EAE7B,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAGL,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AAuBrC,MAAM,MAAM,6BAA6B,GAAG,CAC1C,UAAU,SAAS,SAAS,GAAG,SAAS,EAExC,OAAO,EAAE,aAAa,KACnB,eAAe,CAAC,UAAU,CAAC,CAAC;AA6BjC,MAAM,MAAM,mBAAmB,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,IACtE,0BAA0B,GAAG;IAC3B,QAAQ,CAAC,EACL,CAAC,WAAW,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,GAAG;QAC/C,OAAO,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;QAC3C,UAAU,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;KAC5C,CAAC,GACF,SAAS,CAAC;IACd,eAAe,CAAC,EAAE,6BAA6B,CAAC;IAChD,+GAA+G;IAC/G,kCAAkC,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACnE;;;;;;;OAOG;IACH,0BAA0B,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD;;;;;;;OAOG;IACH,4BAA4B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnD;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC5C;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;IAC5D;;;;;;OAMG;IACH,uBAAuB,CAAC,EACpB,CAAC,CACC,QAAQ,EAAE,4BAA4B,EACtC,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,sHAAsH;QACtH,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KACtC,KACE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAC1B,SAAS,CAAC;IACd;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACxC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,uBAAuB,CAAC,UAAU,CAAC,CAAC;IACxD;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,oBAAoB,CAAC,yBAAyB,CAAC,CAAC;CAC3E,CAAC;AAqUJ,eAAO,MAAM,eAAe,GAAI,UAAU,SAAS,SAAS,GAAG,SAAS,EACtE,aAAa,UAAU,CAAC,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC,EACnD,UAAS,mBAAmB,CAAC,UAAU,CAAM,qBAu2B9C,CAAC"}
|