@assistant-ui/ai-sdk 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/adapters/aiSDKFormatAdapter.d.ts +2 -2
- package/dist/adapters/aiSDKFormatAdapter.d.ts.map +1 -0
- package/dist/adapters/vercelAttachmentAdapter.d.ts +1 -3
- package/dist/adapters/vercelAttachmentAdapter.d.ts.map +1 -1
- package/dist/adapters/vercelAttachmentAdapter.js +3 -3
- package/dist/adapters/vercelAttachmentAdapter.js.map +1 -1
- package/dist/aiSDKExtras.d.ts +4 -6
- package/dist/aiSDKExtras.d.ts.map +1 -1
- package/dist/converters/convertMessage.d.ts +32 -24
- package/dist/converters/convertMessage.d.ts.map +1 -1
- package/dist/converters/convertMessage.js +43 -9
- package/dist/converters/convertMessage.js.map +1 -1
- package/dist/converters/modelContentEnvelope.d.ts +6 -7
- package/dist/converters/modelContentEnvelope.d.ts.map +1 -1
- package/dist/converters/toCreateMessage.d.ts +2 -4
- package/dist/converters/toCreateMessage.d.ts.map +1 -1
- package/dist/converters/toolOutputConversion.d.ts +20 -22
- package/dist/converters/toolOutputConversion.d.ts.map +1 -1
- package/dist/hooks.d.ts +2 -4
- package/dist/hooks.d.ts.map +1 -1
- package/dist/index.d.ts +17 -14
- package/dist/index.d.ts.map +1 -0
- package/dist/index.native.d.ts +15 -12
- package/dist/index.native.d.ts.map +1 -0
- package/dist/model-context/injectInteractableContext.d.ts +2 -4
- package/dist/model-context/injectInteractableContext.d.ts.map +1 -1
- package/dist/model-context/injectQuoteContext.d.ts +1 -3
- package/dist/model-context/injectQuoteContext.d.ts.map +1 -1
- package/dist/runtime/AISDKChat.d.ts +2 -4
- package/dist/runtime/AISDKChat.d.ts.map +1 -1
- package/dist/runtime/AISDKChat.js +1 -1
- package/dist/runtime/AISDKThreads.d.ts +29 -31
- package/dist/runtime/AISDKThreads.d.ts.map +1 -1
- package/dist/runtime/AISDKThreads.js +22 -23
- package/dist/runtime/AISDKThreads.js.map +1 -1
- package/dist/runtime/sdkIdentity.d.ts +1 -3
- package/dist/runtime/sdkIdentity.d.ts.map +1 -1
- package/dist/runtime/sdkIdentity.js +1 -1
- package/dist/runtime/useAISDKRuntime.d.ts +69 -70
- package/dist/runtime/useAISDKRuntime.d.ts.map +1 -1
- package/dist/runtime/useAISDKRuntime.js +112 -56
- package/dist/runtime/useAISDKRuntime.js.map +1 -1
- package/dist/runtime/useChatRuntime.d.ts +6 -8
- package/dist/runtime/useChatRuntime.d.ts.map +1 -1
- package/dist/runtime/useChatRuntime.js +14 -10
- package/dist/runtime/useChatRuntime.js.map +1 -1
- package/dist/runtime/useChatThread.d.ts +94 -89
- package/dist/runtime/useChatThread.d.ts.map +1 -1
- package/dist/runtime/useChatThread.js +4 -5
- package/dist/runtime/useChatThread.js.map +1 -1
- package/dist/runtime/useExternalHistory.d.ts +7 -7
- package/dist/runtime/useExternalHistory.d.ts.map +1 -1
- package/dist/runtime/useExternalHistory.js +229 -59
- package/dist/runtime/useExternalHistory.js.map +1 -1
- package/dist/runtime/useResourceCleanup.d.ts +1 -3
- package/dist/runtime/useResourceCleanup.d.ts.map +1 -1
- package/dist/runtime/useResourceCleanup.js +38 -14
- package/dist/runtime/useResourceCleanup.js.map +1 -1
- package/dist/runtime/useStreamingTiming.d.ts +3 -5
- package/dist/runtime/useStreamingTiming.d.ts.map +1 -1
- package/dist/runtime/useStreamingTiming.js +1 -1
- package/dist/tools/frontendTools.d.ts +21 -23
- package/dist/tools/frontendTools.d.ts.map +1 -1
- package/dist/tools/generativeTools.d.ts +24 -26
- package/dist/tools/generativeTools.d.ts.map +1 -1
- package/dist/tools/mcp-stdio.node.d.ts +2 -2
- package/dist/tools/mcp-stdio.node.d.ts.map +1 -0
- package/dist/tools/mcp-stdio.unsupported.d.ts +2 -4
- package/dist/tools/mcp-stdio.unsupported.d.ts.map +1 -1
- package/dist/transport/AssistantChatTransport.d.ts +14 -16
- package/dist/transport/AssistantChatTransport.d.ts.map +1 -1
- package/dist/transport/resumable.d.ts +25 -27
- package/dist/transport/resumable.d.ts.map +1 -1
- package/dist/usage.d.ts +8 -10
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js.map +1 -1
- package/dist/utils/getVercelAIMessages.d.ts +2 -4
- package/dist/utils/getVercelAIMessages.d.ts.map +1 -1
- package/dist/utils/sliceMessagesUntil.d.ts +1 -3
- package/dist/utils/sliceMessagesUntil.d.ts.map +1 -1
- package/package.json +9 -8
- package/src/adapters/vercelAttachmentAdapter.test.ts +23 -0
- package/src/adapters/vercelAttachmentAdapter.ts +2 -2
- package/src/converters/convertMessage.test.ts +478 -3
- package/src/converters/convertMessage.ts +100 -14
- package/src/index.native.ts +1 -1
- package/src/index.ts +1 -1
- package/src/runtime/AISDKThreads.cloud.test.ts +60 -2
- package/src/runtime/AISDKThreads.test.ts +79 -46
- package/src/runtime/AISDKThreads.ts +1 -1
- package/src/runtime/useAISDKRuntime.approval.integration.test.tsx +51 -0
- package/src/runtime/useAISDKRuntime.approval.test.tsx +225 -9
- package/src/runtime/useAISDKRuntime.test.ts +275 -5
- package/src/runtime/useAISDKRuntime.ts +141 -37
- package/src/runtime/useAISDKRuntime.voice.test.tsx +50 -1
- package/src/runtime/useChatRuntime.integration.test.tsx +56 -0
- package/src/runtime/useChatRuntime.test.ts +5 -1
- package/src/runtime/useChatRuntime.ts +6 -2
- package/src/runtime/useChatThread.transport.test.tsx +149 -0
- package/src/runtime/useChatThread.ts +33 -5
- package/src/runtime/useExternalHistory.test.ts +943 -3
- package/src/runtime/useExternalHistory.ts +366 -14
- package/src/runtime/useResourceCleanup.ts +41 -15
- package/src/usage.ts +1 -1
|
@@ -4,9 +4,10 @@ import { AI_SDK_SDK } from "./sdkIdentity.js";
|
|
|
4
4
|
import { useCloudThreadListAdapter, useRemoteThreadListRuntime } from "@assistant-ui/core/react";
|
|
5
5
|
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
6
6
|
import { useAui, useAuiState } from "@assistant-ui/store";
|
|
7
|
+
import { useHostDestroySignal } from "@assistant-ui/store/internal";
|
|
7
8
|
//#region src/runtime/useChatRuntime.ts
|
|
8
|
-
const useChatThreadRuntime = (options) => {
|
|
9
|
-
const $ = c(
|
|
9
|
+
const useChatThreadRuntime = (options, hostDestroySignal) => {
|
|
10
|
+
const $ = c(7);
|
|
10
11
|
const id = useAuiState(_temp);
|
|
11
12
|
const isMainThread = useAuiState(_temp2);
|
|
12
13
|
const aui = useAui();
|
|
@@ -17,28 +18,31 @@ const useChatThreadRuntime = (options) => {
|
|
|
17
18
|
$[1] = t0;
|
|
18
19
|
} else t0 = $[1];
|
|
19
20
|
let t1;
|
|
20
|
-
if ($[2] !==
|
|
21
|
+
if ($[2] !== hostDestroySignal || $[3] !== id || $[4] !== isMainThread || $[5] !== t0) {
|
|
21
22
|
t1 = {
|
|
22
23
|
id,
|
|
23
24
|
isMainThread,
|
|
24
25
|
getThreadListItem: t0,
|
|
25
|
-
stopOnClientDestroy: true
|
|
26
|
+
stopOnClientDestroy: true,
|
|
27
|
+
hostDestroySignal
|
|
26
28
|
};
|
|
27
|
-
$[2] =
|
|
28
|
-
$[3] =
|
|
29
|
-
$[4] =
|
|
30
|
-
$[5] =
|
|
31
|
-
|
|
29
|
+
$[2] = hostDestroySignal;
|
|
30
|
+
$[3] = id;
|
|
31
|
+
$[4] = isMainThread;
|
|
32
|
+
$[5] = t0;
|
|
33
|
+
$[6] = t1;
|
|
34
|
+
} else t1 = $[6];
|
|
32
35
|
return useChatThread(options, t1);
|
|
33
36
|
};
|
|
34
37
|
const useChatRuntime = ({ cloud, onThreadIdChange, ...options } = {}) => {
|
|
38
|
+
const hostDestroySignal = useHostDestroySignal();
|
|
35
39
|
const cloudAdapter = useCloudThreadListAdapter({
|
|
36
40
|
cloud,
|
|
37
41
|
sdk: AI_SDK_SDK
|
|
38
42
|
});
|
|
39
43
|
return useRemoteThreadListRuntime({
|
|
40
44
|
runtimeHook: function RuntimeHook() {
|
|
41
|
-
return useChatThreadRuntime(options);
|
|
45
|
+
return useChatThreadRuntime(options, hostDestroySignal);
|
|
42
46
|
},
|
|
43
47
|
adapter: cloudAdapter,
|
|
44
48
|
allowNesting: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChatRuntime.js","names":["c","_c","UIMessage","AssistantCloud","AssistantRuntime","useCloudThreadListAdapter","useRemoteThreadListRuntime","useAui","useAuiState","useChatThread","ChatThreadOptions","AI_SDK_SDK","UseChatRuntimeOptions","UI_MESSAGE","cloud","onThreadIdChange","threadId","useChatThreadRuntime","options","$","id","_temp","isMainThread","_temp2","aui","t0","threadListItem","source","undefined","t1","getThreadListItem","stopOnClientDestroy","useChatRuntime","cloudAdapter","sdk","runtimeHook","RuntimeHook","adapter","allowNesting","s","s_0","threads","mainThreadId"],"sources":["../../src/runtime/useChatRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport type { UIMessage } from \"@ai-sdk/react\";\nimport type { AssistantCloud } from \"assistant-cloud\";\nimport type { AssistantRuntime } from \"@assistant-ui/core\";\nimport {\n useCloudThreadListAdapter,\n useRemoteThreadListRuntime,\n} from \"@assistant-ui/core/react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport { useChatThread, type ChatThreadOptions } from \"./useChatThread\";\nimport { AI_SDK_SDK } from \"./sdkIdentity\";\n\nexport type UseChatRuntimeOptions<UI_MESSAGE extends UIMessage = UIMessage> =\n ChatThreadOptions<UI_MESSAGE> & {\n cloud?: AssistantCloud | undefined;\n onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;\n };\n\nconst useChatThreadRuntime = <UI_MESSAGE extends UIMessage = UIMessage>(\n options
|
|
1
|
+
{"version":3,"file":"useChatRuntime.js","names":["c","_c","UIMessage","AssistantCloud","AssistantRuntime","useCloudThreadListAdapter","useRemoteThreadListRuntime","useAui","useAuiState","useHostDestroySignal","useChatThread","ChatThreadOptions","AI_SDK_SDK","UseChatRuntimeOptions","UI_MESSAGE","cloud","onThreadIdChange","threadId","useChatThreadRuntime","options","hostDestroySignal","$","id","_temp","isMainThread","_temp2","aui","t0","threadListItem","source","undefined","t1","getThreadListItem","stopOnClientDestroy","useChatRuntime","cloudAdapter","sdk","runtimeHook","RuntimeHook","adapter","allowNesting","s","s_0","threads","mainThreadId"],"sources":["../../src/runtime/useChatRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport type { UIMessage } from \"@ai-sdk/react\";\nimport type { AssistantCloud } from \"assistant-cloud\";\nimport type { AssistantRuntime } from \"@assistant-ui/core\";\nimport {\n useCloudThreadListAdapter,\n useRemoteThreadListRuntime,\n} from \"@assistant-ui/core/react\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport { useHostDestroySignal } from \"@assistant-ui/store/internal\";\nimport { useChatThread, type ChatThreadOptions } from \"./useChatThread\";\nimport { AI_SDK_SDK } from \"./sdkIdentity\";\n\nexport type UseChatRuntimeOptions<UI_MESSAGE extends UIMessage = UIMessage> =\n ChatThreadOptions<UI_MESSAGE> & {\n cloud?: AssistantCloud | undefined;\n onThreadIdChange?: ((threadId: string | undefined) => void) | undefined;\n };\n\nconst useChatThreadRuntime = <UI_MESSAGE extends UIMessage = UIMessage>(\n options: ChatThreadOptions<UI_MESSAGE> | undefined,\n hostDestroySignal: AbortSignal,\n): AssistantRuntime => {\n const id = useAuiState((s) => s.threadListItem.id);\n const isMainThread = useAuiState(\n (s) => s.threads.mainThreadId === s.threadListItem.id,\n );\n const aui = useAui();\n return useChatThread(options, {\n id,\n isMainThread,\n getThreadListItem: () =>\n aui.threadListItem.source ? aui.threadListItem : undefined,\n stopOnClientDestroy: true,\n hostDestroySignal,\n });\n};\n\nexport const useChatRuntime = <UI_MESSAGE extends UIMessage = UIMessage>({\n cloud,\n onThreadIdChange,\n ...options\n}: UseChatRuntimeOptions<UI_MESSAGE> = {}): AssistantRuntime => {\n const hostDestroySignal = useHostDestroySignal();\n const cloudAdapter = useCloudThreadListAdapter({ cloud, sdk: AI_SDK_SDK });\n return useRemoteThreadListRuntime({\n runtimeHook: function RuntimeHook() {\n return useChatThreadRuntime(options, hostDestroySignal);\n },\n adapter: cloudAdapter,\n allowNesting: true,\n onThreadIdChange,\n });\n};\n"],"mappings":";;;;;;;;AAoBA,MAAMkB,wBAAuBC,SAAAC,sBAAA;CAAA,MAAAC,IAAApB,EAAA,CAAA;CAI3B,MAAAqB,KAAWd,YAAYe,KAA0B;CACjD,MAAAC,eAAqBhB,YACnBiB,MACF;CACA,MAAAC,MAAYnB,OAAO;CAAE,IAAAoB;CAAA,IAAAN,EAAA,OAAAK,KAAA;EAIAC,WACjBD,IAAGE,eAAeC,SAAUH,IAAGE,iBAA/BE,KAAAA;EAA0DT,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAU;CAAA,IAAAV,EAAA,OAAAD,qBAAAC,EAAA,OAAAC,MAAAD,EAAA,OAAAG,gBAAAH,EAAA,OAAAM,IAAA;EAJhCI,KAAA;GAAAT;GAAAE;GAAAQ,mBAGTL;GACyCM,qBACvC;GAAIb;EAE3B;EAACC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;EAAAD,EAAA,KAAAG;EAAAH,EAAA,KAAAM;EAAAN,EAAA,KAAAU;CAAA,OAAAA,KAAAV,EAAA;CAAA,OAPMX,cAAcS,SAASY,EAO7B;AAAC;AAGJ,MAAaG,kBAA4D,EACvEnB,OACAC,kBACA,GAAGG,YACkC,CAAC,MAAwB;CAC9D,MAAMC,oBAAoBX,qBAAqB;CAC/C,MAAM0B,eAAe9B,0BAA0B;EAAEU;EAAOqB,KAAKxB;CAAW,CAAC;CACzE,OAAON,2BAA2B;EAChC+B,aAAa,SAASC,cAAc;GAClC,OAAOpB,qBAAqBC,SAASC,iBAAiB;EACxD;EACAmB,SAASJ;EACTK,cAAc;EACdxB;CACF,CAAC;AACH;AAlC6B,SAAAO,MAAAkB,GAAA;CAAA,OAIGA,EAACb,eAAeN;AAAG;AAJtB,SAAAG,OAAAiB,KAAA;CAAA,OAMlBD,IAACE,QAAQC,iBAAkBH,IAACb,eAAeN;AAAG"}
|
|
@@ -1,104 +1,109 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
unstable_onBranchChange?: AISDKRuntimeAdapter["unstable_onBranchChange"];
|
|
1
|
+
import { Chat, type UIMessage } from "@ai-sdk/react";
|
|
2
|
+
import type { MessageRepository } from "@assistant-ui/core/internal";
|
|
3
|
+
import { type AssistantRuntime, type ExternalStoreSharedOptions } from "@assistant-ui/core";
|
|
4
|
+
import { type AISDKRuntimeAdapter, type CustomToCreateMessageFunction } from "./useAISDKRuntime.js";
|
|
5
|
+
import type { ChatInit, ChatTransport } from "ai";
|
|
6
|
+
import { type InitializableThreadListItem } from "../transport/AssistantChatTransport.js";
|
|
7
|
+
export type ChatThreadOptions<UI_MESSAGE extends UIMessage = UIMessage> = ChatInit<UI_MESSAGE> & ExternalStoreSharedOptions & {
|
|
8
|
+
throttle?: number | undefined;
|
|
9
|
+
adapters?: AISDKRuntimeAdapter["adapters"] | undefined;
|
|
10
|
+
toCreateMessage?: CustomToCreateMessageFunction;
|
|
11
|
+
onResume?: AISDKRuntimeAdapter["onResume"];
|
|
12
|
+
onResumeToolCall?: AISDKRuntimeAdapter["onResumeToolCall"];
|
|
13
|
+
onRespondToToolApproval?: AISDKRuntimeAdapter["onRespondToToolApproval"];
|
|
14
|
+
/**
|
|
15
|
+
* Called when an automatic resumable stream reconnect fails. Use this to
|
|
16
|
+
* surface a toast, report telemetry, or mark the thread as needing a
|
|
17
|
+
* retry. The failed stream id is cleared after the callback unless a
|
|
18
|
+
* newer id has replaced it.
|
|
19
|
+
*/
|
|
20
|
+
onResumeError?: ((error: unknown) => void) | undefined;
|
|
21
|
+
joinStrategy?: AISDKRuntimeAdapter["joinStrategy"];
|
|
22
|
+
messageRepository?: AISDKRuntimeAdapter<UI_MESSAGE>["messageRepository"];
|
|
23
|
+
unstable_onBranchChange?: AISDKRuntimeAdapter["unstable_onBranchChange"];
|
|
25
24
|
};
|
|
26
|
-
export type ChatThreadEnvironment<UI_MESSAGE extends UIMessage
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
25
|
+
export type ChatThreadEnvironment<UI_MESSAGE extends UIMessage = UIMessage> = {
|
|
26
|
+
id: string;
|
|
27
|
+
isMainThread: boolean;
|
|
28
|
+
getThreadListItem: () => InitializableThreadListItem | undefined;
|
|
29
|
+
stopOnClientDestroy?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Aborts when the React component hosting the runtime is deleted. A nested
|
|
32
|
+
* runtime resolves the destroy signal of the provider above it, which
|
|
33
|
+
* outlives the nested component, so this stops the chat on its own unmount.
|
|
34
|
+
*/
|
|
35
|
+
hostDestroySignal?: AbortSignal | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* An externally owned chat instance. State lives on the instance, so it
|
|
38
|
+
* survives the hosting resource unmounting; construction options are read
|
|
39
|
+
* from the instance.
|
|
40
|
+
*/
|
|
41
|
+
chat?: Chat<UI_MESSAGE> | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* An externally owned per-thread message repository. Hosts that route
|
|
44
|
+
* multiple threads through one mounting pass a distinct instance per
|
|
45
|
+
* thread so histories and branches stay isolated.
|
|
46
|
+
*/
|
|
47
|
+
messageRepositoryInstance?: MessageRepository | undefined;
|
|
43
48
|
};
|
|
44
49
|
/**
|
|
45
50
|
* Splits the combined options into the assistant-ui side and the `ChatInit`
|
|
46
51
|
* remainder the AI SDK consumes, so external `Chat` construction forwards the
|
|
47
52
|
* same fields `useChat` would.
|
|
48
53
|
*/
|
|
49
|
-
export declare const splitChatThreadOptions: <UI_MESSAGE extends UIMessage
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
54
|
+
export declare const splitChatThreadOptions: <UI_MESSAGE extends UIMessage>(options: ChatThreadOptions<UI_MESSAGE> | undefined) => {
|
|
55
|
+
adapters: ({
|
|
56
|
+
attachments?: import("@assistant-ui/core").AttachmentAdapter | undefined;
|
|
57
|
+
speech?: import("@assistant-ui/core").SpeechSynthesisAdapter | undefined;
|
|
58
|
+
dictation?: import("@assistant-ui/core").DictationAdapter | undefined;
|
|
59
|
+
voice?: import("@assistant-ui/core").RealtimeVoiceAdapter | undefined;
|
|
60
|
+
feedback?: import("@assistant-ui/core").FeedbackAdapter | undefined;
|
|
61
|
+
threadList?: import("@assistant-ui/core").ExternalStoreThreadListAdapter | undefined;
|
|
62
|
+
} & {
|
|
63
|
+
history?: import("@assistant-ui/core").ThreadHistoryAdapter | undefined;
|
|
64
|
+
suggestion?: import("@assistant-ui/core").SuggestionAdapter | undefined;
|
|
65
|
+
}) | undefined;
|
|
66
|
+
transport: ChatTransport<UI_MESSAGE> | undefined;
|
|
67
|
+
throttle: number | undefined;
|
|
68
|
+
toCreateMessage: CustomToCreateMessageFunction | undefined;
|
|
69
|
+
onResume: ((config: import("@assistant-ui/core").ResumeRunConfig) => Promise<void>) | undefined;
|
|
70
|
+
onResumeToolCall: ((options: {
|
|
71
|
+
toolCallId: string;
|
|
72
|
+
payload: unknown;
|
|
73
|
+
}) => void) | undefined;
|
|
74
|
+
onRespondToToolApproval: ((response: import("@assistant-ui/core").RespondToToolApprovalOptions, context: {
|
|
75
|
+
toolCallId: string;
|
|
76
|
+
toolName: string;
|
|
77
|
+
respondViaAISDK: () => Promise<void>;
|
|
78
|
+
}) => Promise<void> | void) | undefined;
|
|
79
|
+
onResumeError: ((error: unknown) => void) | undefined;
|
|
80
|
+
joinStrategy: import("@assistant-ui/core/store").JoinStrategy | undefined;
|
|
81
|
+
messageRepository: import("@assistant-ui/core").MessageFormatRepository<UI_MESSAGE> | undefined;
|
|
82
|
+
unstable_onBranchChange: ((event: import("@assistant-ui/core").ExternalStoreBranchChange) => void) | undefined;
|
|
83
|
+
chatInit: {
|
|
84
|
+
id?: string;
|
|
85
|
+
messageMetadataSchema?: import("ai").FlexibleSchema<UI_MESSAGE["metadata"]>;
|
|
86
|
+
dataPartSchemas?: (UI_MESSAGE extends UIMessage<unknown, infer DATA_TYPES extends import("ai").UIDataTypes, import("ai").UITools> ? DATA_TYPES : import("ai").UIDataTypes) extends infer T extends import("ai").UIDataTypes ? { [K in keyof T]: import("ai").FlexibleSchema<T[K]>; } : never;
|
|
87
|
+
messages?: UI_MESSAGE[];
|
|
88
|
+
generateId?: import("ai").IdGenerator;
|
|
89
|
+
onError?: import("ai").ChatOnErrorCallback;
|
|
90
|
+
onToolCall?: import("ai").ChatOnToolCallCallback<UI_MESSAGE>;
|
|
91
|
+
onFinish?: import("ai").ChatOnFinishCallback<UI_MESSAGE>;
|
|
92
|
+
onData?: import("ai").ChatOnDataCallback<UI_MESSAGE>;
|
|
93
|
+
sendAutomaticallyWhen?: (options: {
|
|
94
|
+
messages: UI_MESSAGE[];
|
|
95
|
+
}) => boolean | PromiseLike<boolean>;
|
|
96
|
+
};
|
|
92
97
|
};
|
|
93
|
-
type ChatCallbacks<UI_MESSAGE extends UIMessage
|
|
98
|
+
type ChatCallbacks<UI_MESSAGE extends UIMessage> = Pick<ChatInit<UI_MESSAGE>, "onToolCall" | "onData" | "onFinish" | "onError" | "sendAutomaticallyWhen">;
|
|
94
99
|
/**
|
|
95
100
|
* Constructs a `Chat` whose callbacks read the latest options through
|
|
96
101
|
* `callbacksRef`, the forwarding `useChat` applies only to a chat it
|
|
97
102
|
* constructs itself.
|
|
98
103
|
*/
|
|
99
|
-
export declare const createChat: <UI_MESSAGE extends UIMessage
|
|
100
|
-
|
|
104
|
+
export declare const createChat: <UI_MESSAGE extends UIMessage>(init: ChatInit<UI_MESSAGE>, callbacksRef: {
|
|
105
|
+
readonly current: ChatCallbacks<UI_MESSAGE> | undefined;
|
|
101
106
|
}) => Chat<UI_MESSAGE>;
|
|
102
|
-
export declare const useChatThread: <UI_MESSAGE extends UIMessage
|
|
103
|
-
|
|
107
|
+
export declare const useChatThread: <UI_MESSAGE extends UIMessage = UIMessage>(options: ChatThreadOptions<UI_MESSAGE> | undefined, env: ChatThreadEnvironment<UI_MESSAGE>) => AssistantRuntime;
|
|
108
|
+
export {};
|
|
104
109
|
//# sourceMappingURL=useChatThread.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChatThread.d.ts","
|
|
1
|
+
{"version":3,"file":"useChatThread.d.ts","sourceRoot":"","sources":["../../src/runtime/useChatThread.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import { useAISDKRuntime } from "./useAISDKRuntime.js";
|
|
3
3
|
import { AssistantChatTransport } from "../transport/AssistantChatTransport.js";
|
|
4
4
|
import { useResourceCleanup } from "./useResourceCleanup.js";
|
|
5
|
-
import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "@assistant-ui/tap/react-shim";
|
|
6
5
|
import { pickExternalStoreSharedOptions } from "@assistant-ui/core";
|
|
6
|
+
import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "@assistant-ui/tap/react-shim";
|
|
7
7
|
import { Chat, useChat } from "@ai-sdk/react";
|
|
8
8
|
//#region src/runtime/useChatThread.ts
|
|
9
9
|
const useDynamicChatTransport = (transport) => {
|
|
@@ -70,9 +70,8 @@ const createChat = (init, callbacksRef) => new Chat({
|
|
|
70
70
|
});
|
|
71
71
|
const useChatThread = (options, env) => {
|
|
72
72
|
const { adapters, transport: transportOptions, throttle, toCreateMessage, onResume, onResumeToolCall, onRespondToToolApproval, onResumeError, joinStrategy, messageRepository, unstable_onBranchChange, chatInit: chatOptions } = splitChatThreadOptions(options);
|
|
73
|
-
const { id, isMainThread, getThreadListItem, stopOnClientDestroy = true, chat: externalChat, messageRepositoryInstance } = env;
|
|
74
|
-
const
|
|
75
|
-
const sourceTransport = transportOptions ?? defaultTransport;
|
|
73
|
+
const { id, isMainThread, getThreadListItem, stopOnClientDestroy = true, hostDestroySignal, chat: externalChat, messageRepositoryInstance } = env;
|
|
74
|
+
const sourceTransport = useMemo(() => transportOptions === void 0 ? new AssistantChatTransport() : externalChat === void 0 && transportOptions instanceof AssistantChatTransport ? transportOptions.__internal_clone() : transportOptions, [transportOptions, externalChat]);
|
|
76
75
|
const transport = useDynamicChatTransport(sourceTransport);
|
|
77
76
|
const latestChatOptionsRef = useRef(chatOptions);
|
|
78
77
|
useEffect(() => {
|
|
@@ -89,7 +88,7 @@ const useChatThread = (options, env) => {
|
|
|
89
88
|
});
|
|
90
89
|
useResourceCleanup(stopOnClientDestroy, () => {
|
|
91
90
|
chat.stop().catch(() => {});
|
|
92
|
-
});
|
|
91
|
+
}, hostDestroySignal);
|
|
93
92
|
const runtime = useAISDKRuntime(chat, {
|
|
94
93
|
adapters,
|
|
95
94
|
...pickExternalStoreSharedOptions(options ?? {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChatThread.js","names":["Chat","useChat","UIMessage","MessageRepository","pickExternalStoreSharedOptions","AssistantRuntime","ExternalStoreSharedOptions","useAISDKRuntime","AISDKRuntimeAdapter","CustomToCreateMessageFunction","ChatInit","ChatTransport","AssistantChatTransport","InitializableThreadListItem","AssistantChatResumableOptions","ResumableClientStorage","useCallback","useEffect","useMemo","useRef","useState","useSyncExternalStore","useResourceCleanup","ChatThreadOptions","UI_MESSAGE","throttle","adapters","toCreateMessage","onResume","onResumeToolCall","onRespondToToolApproval","onResumeError","error","joinStrategy","messageRepository","unstable_onBranchChange","ChatThreadEnvironment","id","isMainThread","getThreadListItem","stopOnClientDestroy","chat","messageRepositoryInstance","useDynamicChatTransport","transport","transportRef","current","dynamicTransport","Proxy","get","_","prop","res","bind","getResumableAdapter","candidate","undefined","call","getNoPendingStreamId","resumedStreamIdsByStorage","WeakMap","Set","getResumedStreamIds","storage","resumedStreamIds","set","splitChatThreadOptions","options","isDisabled","_isDisabled","isSendDisabled","_isSendDisabled","unstable_capabilities","_unstable_capabilities","suggestions","_suggestions","chatInit","ChatCallbacks","Pick","createChat","init","callbacksRef","onToolCall","arg","onData","onFinish","onError","sendAutomaticallyWhen","useChatThread","env","transportOptions","chatOptions","externalChat","defaultTransport","sourceTransport","latestChatOptionsRef","ownedChat","stop","catch","runtime","unstable_messageRepositoryInstance","setRuntime","__internal_setGetThreadListItem","subscribeToRuntime","callback","thread","subscribe","getHistoryLoadingSnapshot","getState","isLoading","isLoadingHistory","resumableStorage","subscribeToResumableStorage","getPendingStreamId","getStreamId","pendingStreamId","isChatRunning","status","onResumeErrorRef","has","add","resumeStream","err","console","warn","callbackError","clear"],"sources":["../../src/runtime/useChatThread.ts"],"sourcesContent":["\"use client\";\n\nimport { Chat, useChat, type UIMessage } from \"@ai-sdk/react\";\nimport type { MessageRepository } from \"@assistant-ui/core/internal\";\nimport {\n pickExternalStoreSharedOptions,\n type AssistantRuntime,\n type ExternalStoreSharedOptions,\n} from \"@assistant-ui/core\";\nimport {\n useAISDKRuntime,\n type AISDKRuntimeAdapter,\n type CustomToCreateMessageFunction,\n} from \"./useAISDKRuntime\";\nimport type { ChatInit, ChatTransport } from \"ai\";\nimport {\n AssistantChatTransport,\n type InitializableThreadListItem,\n} from \"../transport/AssistantChatTransport\";\nimport type {\n AssistantChatResumableOptions,\n ResumableClientStorage,\n} from \"../transport/resumable\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { useResourceCleanup } from \"./useResourceCleanup\";\n\nexport type ChatThreadOptions<UI_MESSAGE extends UIMessage = UIMessage> =\n ChatInit<UI_MESSAGE> &\n ExternalStoreSharedOptions & {\n throttle?: number | undefined;\n adapters?: AISDKRuntimeAdapter[\"adapters\"] | undefined;\n toCreateMessage?: CustomToCreateMessageFunction;\n onResume?: AISDKRuntimeAdapter[\"onResume\"];\n onResumeToolCall?: AISDKRuntimeAdapter[\"onResumeToolCall\"];\n onRespondToToolApproval?: AISDKRuntimeAdapter[\"onRespondToToolApproval\"];\n /**\n * Called when an automatic resumable stream reconnect fails. Use this to\n * surface a toast, report telemetry, or mark the thread as needing a\n * retry. The failed stream id is cleared after the callback unless a\n * newer id has replaced it.\n */\n onResumeError?: ((error: unknown) => void) | undefined;\n joinStrategy?: AISDKRuntimeAdapter[\"joinStrategy\"];\n messageRepository?: AISDKRuntimeAdapter<UI_MESSAGE>[\"messageRepository\"];\n unstable_onBranchChange?: AISDKRuntimeAdapter[\"unstable_onBranchChange\"];\n };\n\nexport type ChatThreadEnvironment<UI_MESSAGE extends UIMessage = UIMessage> = {\n id: string;\n isMainThread: boolean;\n getThreadListItem: () => InitializableThreadListItem | undefined;\n stopOnClientDestroy?: boolean;\n /**\n * An externally owned chat instance. State lives on the instance, so it\n * survives the hosting resource unmounting; construction options are read\n * from the instance.\n */\n chat?: Chat<UI_MESSAGE> | undefined;\n /**\n * An externally owned per-thread message repository. Hosts that route\n * multiple threads through one mounting pass a distinct instance per\n * thread so histories and branches stay isolated.\n */\n messageRepositoryInstance?: MessageRepository | undefined;\n};\n\nconst useDynamicChatTransport = <UI_MESSAGE extends UIMessage = UIMessage>(\n transport: ChatTransport<UI_MESSAGE>,\n): ChatTransport<UI_MESSAGE> => {\n const transportRef = useRef<ChatTransport<UI_MESSAGE>>(transport);\n useEffect(() => {\n transportRef.current = transport;\n });\n const dynamicTransport = useMemo(\n () =>\n new Proxy(transportRef.current, {\n get(_, prop) {\n const res =\n transportRef.current[prop as keyof ChatTransport<UI_MESSAGE>];\n return typeof res === \"function\"\n ? res.bind(transportRef.current)\n : res;\n },\n }),\n [],\n );\n return dynamicTransport;\n};\n\nconst 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\nconst getNoPendingStreamId = () => null;\n\nconst resumedStreamIdsByStorage = new WeakMap<\n ResumableClientStorage,\n Set<string>\n>();\n\nconst getResumedStreamIds = (storage: ResumableClientStorage | undefined) => {\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\n/**\n * Splits the combined options into the assistant-ui side and the `ChatInit`\n * remainder the AI SDK consumes, so external `Chat` construction forwards the\n * same fields `useChat` would.\n */\nexport const splitChatThreadOptions = <UI_MESSAGE extends UIMessage>(\n options: ChatThreadOptions<UI_MESSAGE> | undefined,\n) => {\n const {\n adapters,\n transport,\n throttle,\n toCreateMessage,\n isDisabled: _isDisabled,\n isSendDisabled: _isSendDisabled,\n unstable_capabilities: _unstable_capabilities,\n suggestions: _suggestions,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval,\n onResumeError,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n ...chatInit\n } = options ?? {};\n // peel guard: any shared key left in `chatInit` collapses this to `never`\n true satisfies keyof typeof chatInit &\n keyof ExternalStoreSharedOptions extends never\n ? true\n : never;\n return {\n adapters,\n transport,\n throttle,\n toCreateMessage,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval,\n onResumeError,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n chatInit,\n };\n};\n\ntype ChatCallbacks<UI_MESSAGE extends UIMessage> = Pick<\n ChatInit<UI_MESSAGE>,\n \"onToolCall\" | \"onData\" | \"onFinish\" | \"onError\" | \"sendAutomaticallyWhen\"\n>;\n\n/**\n * Constructs a `Chat` whose callbacks read the latest options through\n * `callbacksRef`, the forwarding `useChat` applies only to a chat it\n * constructs itself.\n */\nexport const createChat = <UI_MESSAGE extends UIMessage>(\n init: ChatInit<UI_MESSAGE>,\n callbacksRef: { readonly current: ChatCallbacks<UI_MESSAGE> | undefined },\n): Chat<UI_MESSAGE> =>\n new Chat<UI_MESSAGE>({\n ...init,\n onToolCall: (arg) => callbacksRef.current?.onToolCall?.(arg),\n onData: (arg) => callbacksRef.current?.onData?.(arg),\n onFinish: (arg) => callbacksRef.current?.onFinish?.(arg),\n onError: (arg) => callbacksRef.current?.onError?.(arg),\n sendAutomaticallyWhen: (arg) =>\n callbacksRef.current?.sendAutomaticallyWhen?.(arg) ?? false,\n });\n\nexport const useChatThread = <UI_MESSAGE extends UIMessage = UIMessage>(\n options: ChatThreadOptions<UI_MESSAGE> | undefined,\n env: ChatThreadEnvironment<UI_MESSAGE>,\n): AssistantRuntime => {\n const {\n adapters,\n transport: transportOptions,\n throttle,\n toCreateMessage,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval,\n onResumeError,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n chatInit: chatOptions,\n } = splitChatThreadOptions(options);\n\n const {\n id,\n isMainThread,\n getThreadListItem,\n stopOnClientDestroy = true,\n chat: externalChat,\n messageRepositoryInstance,\n } = env;\n\n const defaultTransport = useMemo(() => new AssistantChatTransport(), []);\n const sourceTransport = transportOptions ?? defaultTransport;\n const transport = useDynamicChatTransport(sourceTransport);\n\n const latestChatOptionsRef = useRef(chatOptions);\n useEffect(() => {\n latestChatOptionsRef.current = chatOptions;\n });\n // `useChat` stops a chat it constructs whenever it unmounts, and a\n // resource's soft unmount runs that cleanup, so the thread owns its chat.\n const [ownedChat] = useState(\n () =>\n externalChat ??\n createChat({ ...chatOptions, id, transport }, latestChatOptionsRef),\n );\n\n const chat = useChat({\n chat: externalChat ?? ownedChat,\n ...(throttle !== undefined && { throttle }),\n });\n\n useResourceCleanup(stopOnClientDestroy, () => {\n void chat.stop().catch(() => {});\n });\n\n const runtime = useAISDKRuntime(chat, {\n adapters,\n ...pickExternalStoreSharedOptions(options ?? {}),\n ...(toCreateMessage && { toCreateMessage }),\n ...(onResume && { onResume }),\n ...(onResumeToolCall && { onResumeToolCall }),\n ...(onRespondToToolApproval && { onRespondToToolApproval }),\n ...(joinStrategy && { joinStrategy }),\n ...(messageRepository && { messageRepository }),\n ...(messageRepositoryInstance && {\n unstable_messageRepositoryInstance: messageRepositoryInstance,\n }),\n ...(unstable_onBranchChange && { unstable_onBranchChange }),\n });\n\n if (sourceTransport instanceof AssistantChatTransport) {\n sourceTransport.setRuntime(runtime);\n sourceTransport.__internal_setGetThreadListItem(getThreadListItem);\n }\n\n const subscribeToRuntime = useCallback(\n (callback: () => void) => runtime.thread.subscribe(callback),\n [runtime],\n );\n const getHistoryLoadingSnapshot = useCallback(\n () => runtime.thread.getState().isLoading,\n [runtime],\n );\n const isLoadingHistory = useSyncExternalStore(\n subscribeToRuntime,\n getHistoryLoadingSnapshot,\n getHistoryLoadingSnapshot,\n );\n\n const resumableStorage = useMemo(\n () => getResumableAdapter(sourceTransport)?.storage,\n [sourceTransport],\n );\n const subscribeToResumableStorage = useCallback(\n (callback: () => void) =>\n isMainThread\n ? (resumableStorage?.subscribe?.(callback, id) ?? (() => {}))\n : () => {},\n [id, isMainThread, resumableStorage],\n );\n const getPendingStreamId = useCallback(\n () => (isMainThread ? (resumableStorage?.getStreamId(id) ?? null) : null),\n [id, isMainThread, resumableStorage],\n );\n const pendingStreamId = useSyncExternalStore(\n subscribeToResumableStorage,\n getPendingStreamId,\n getNoPendingStreamId,\n );\n const isChatRunning =\n chat.status === \"submitted\" || chat.status === \"streaming\";\n\n const resumedStreamIds = useMemo(\n () => getResumedStreamIds(resumableStorage),\n [resumableStorage],\n );\n const onResumeErrorRef = useRef(onResumeError);\n useEffect(() => {\n onResumeErrorRef.current = onResumeError;\n });\n useEffect(() => {\n if (!pendingStreamId || resumedStreamIds.has(pendingStreamId)) {\n return;\n }\n if (isChatRunning) {\n resumedStreamIds.add(pendingStreamId);\n return;\n }\n if (isLoadingHistory) return;\n resumedStreamIds.add(pendingStreamId);\n chat.resumeStream().catch((err: unknown) => {\n console.warn(\"[assistant-ui] resumable: resume failed\", err);\n try {\n onResumeErrorRef.current?.(err);\n } catch (callbackError) {\n console.error(\n \"[assistant-ui] resumable: onResumeError callback failed\",\n callbackError,\n );\n } finally {\n if (resumableStorage?.getStreamId(id) === pendingStreamId) {\n resumableStorage.clear(id);\n }\n }\n });\n }, [\n chat,\n id,\n isChatRunning,\n isLoadingHistory,\n pendingStreamId,\n resumableStorage,\n resumedStreamIds,\n ]);\n\n return runtime;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useChatThread.js","names":["Chat","useChat","UIMessage","MessageRepository","pickExternalStoreSharedOptions","AssistantRuntime","ExternalStoreSharedOptions","useAISDKRuntime","AISDKRuntimeAdapter","CustomToCreateMessageFunction","ChatInit","ChatTransport","AssistantChatTransport","InitializableThreadListItem","AssistantChatResumableOptions","ResumableClientStorage","useCallback","useEffect","useMemo","useRef","useState","useSyncExternalStore","useResourceCleanup","ChatThreadOptions","UI_MESSAGE","throttle","adapters","toCreateMessage","onResume","onResumeToolCall","onRespondToToolApproval","onResumeError","error","joinStrategy","messageRepository","unstable_onBranchChange","ChatThreadEnvironment","id","isMainThread","getThreadListItem","stopOnClientDestroy","hostDestroySignal","AbortSignal","chat","messageRepositoryInstance","useDynamicChatTransport","transport","transportRef","current","dynamicTransport","Proxy","get","_","prop","res","bind","getResumableAdapter","candidate","undefined","call","getNoPendingStreamId","resumedStreamIdsByStorage","WeakMap","Set","getResumedStreamIds","storage","resumedStreamIds","set","splitChatThreadOptions","options","isDisabled","_isDisabled","isSendDisabled","_isSendDisabled","unstable_capabilities","_unstable_capabilities","suggestions","_suggestions","chatInit","ChatCallbacks","Pick","createChat","init","callbacksRef","onToolCall","arg","onData","onFinish","onError","sendAutomaticallyWhen","useChatThread","env","transportOptions","chatOptions","externalChat","sourceTransport","__internal_clone","latestChatOptionsRef","ownedChat","stop","catch","runtime","unstable_messageRepositoryInstance","setRuntime","__internal_setGetThreadListItem","subscribeToRuntime","callback","thread","subscribe","getHistoryLoadingSnapshot","getState","isLoading","isLoadingHistory","resumableStorage","subscribeToResumableStorage","getPendingStreamId","getStreamId","pendingStreamId","isChatRunning","status","onResumeErrorRef","has","add","resumeStream","err","console","warn","callbackError","clear"],"sources":["../../src/runtime/useChatThread.ts"],"sourcesContent":["\"use client\";\n\nimport { Chat, useChat, type UIMessage } from \"@ai-sdk/react\";\nimport type { MessageRepository } from \"@assistant-ui/core/internal\";\nimport {\n pickExternalStoreSharedOptions,\n type AssistantRuntime,\n type ExternalStoreSharedOptions,\n} from \"@assistant-ui/core\";\nimport {\n useAISDKRuntime,\n type AISDKRuntimeAdapter,\n type CustomToCreateMessageFunction,\n} from \"./useAISDKRuntime\";\nimport type { ChatInit, ChatTransport } from \"ai\";\nimport {\n AssistantChatTransport,\n type InitializableThreadListItem,\n} from \"../transport/AssistantChatTransport\";\nimport type {\n AssistantChatResumableOptions,\n ResumableClientStorage,\n} from \"../transport/resumable\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { useResourceCleanup } from \"./useResourceCleanup\";\n\nexport type ChatThreadOptions<UI_MESSAGE extends UIMessage = UIMessage> =\n ChatInit<UI_MESSAGE> &\n ExternalStoreSharedOptions & {\n throttle?: number | undefined;\n adapters?: AISDKRuntimeAdapter[\"adapters\"] | undefined;\n toCreateMessage?: CustomToCreateMessageFunction;\n onResume?: AISDKRuntimeAdapter[\"onResume\"];\n onResumeToolCall?: AISDKRuntimeAdapter[\"onResumeToolCall\"];\n onRespondToToolApproval?: AISDKRuntimeAdapter[\"onRespondToToolApproval\"];\n /**\n * Called when an automatic resumable stream reconnect fails. Use this to\n * surface a toast, report telemetry, or mark the thread as needing a\n * retry. The failed stream id is cleared after the callback unless a\n * newer id has replaced it.\n */\n onResumeError?: ((error: unknown) => void) | undefined;\n joinStrategy?: AISDKRuntimeAdapter[\"joinStrategy\"];\n messageRepository?: AISDKRuntimeAdapter<UI_MESSAGE>[\"messageRepository\"];\n unstable_onBranchChange?: AISDKRuntimeAdapter[\"unstable_onBranchChange\"];\n };\n\nexport type ChatThreadEnvironment<UI_MESSAGE extends UIMessage = UIMessage> = {\n id: string;\n isMainThread: boolean;\n getThreadListItem: () => InitializableThreadListItem | undefined;\n stopOnClientDestroy?: boolean;\n /**\n * Aborts when the React component hosting the runtime is deleted. A nested\n * runtime resolves the destroy signal of the provider above it, which\n * outlives the nested component, so this stops the chat on its own unmount.\n */\n hostDestroySignal?: AbortSignal | undefined;\n /**\n * An externally owned chat instance. State lives on the instance, so it\n * survives the hosting resource unmounting; construction options are read\n * from the instance.\n */\n chat?: Chat<UI_MESSAGE> | undefined;\n /**\n * An externally owned per-thread message repository. Hosts that route\n * multiple threads through one mounting pass a distinct instance per\n * thread so histories and branches stay isolated.\n */\n messageRepositoryInstance?: MessageRepository | undefined;\n};\n\nconst useDynamicChatTransport = <UI_MESSAGE extends UIMessage = UIMessage>(\n transport: ChatTransport<UI_MESSAGE>,\n): ChatTransport<UI_MESSAGE> => {\n const transportRef = useRef<ChatTransport<UI_MESSAGE>>(transport);\n useEffect(() => {\n transportRef.current = transport;\n });\n const dynamicTransport = useMemo(\n () =>\n new Proxy(transportRef.current, {\n get(_, prop) {\n const res =\n transportRef.current[prop as keyof ChatTransport<UI_MESSAGE>];\n return typeof res === \"function\"\n ? res.bind(transportRef.current)\n : res;\n },\n }),\n [],\n );\n return dynamicTransport;\n};\n\nconst 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\nconst getNoPendingStreamId = () => null;\n\nconst resumedStreamIdsByStorage = new WeakMap<\n ResumableClientStorage,\n Set<string>\n>();\n\nconst getResumedStreamIds = (storage: ResumableClientStorage | undefined) => {\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\n/**\n * Splits the combined options into the assistant-ui side and the `ChatInit`\n * remainder the AI SDK consumes, so external `Chat` construction forwards the\n * same fields `useChat` would.\n */\nexport const splitChatThreadOptions = <UI_MESSAGE extends UIMessage>(\n options: ChatThreadOptions<UI_MESSAGE> | undefined,\n) => {\n const {\n adapters,\n transport,\n throttle,\n toCreateMessage,\n isDisabled: _isDisabled,\n isSendDisabled: _isSendDisabled,\n unstable_capabilities: _unstable_capabilities,\n suggestions: _suggestions,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval,\n onResumeError,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n ...chatInit\n } = options ?? {};\n // peel guard: any shared key left in `chatInit` collapses this to `never`\n true satisfies keyof typeof chatInit &\n keyof ExternalStoreSharedOptions extends never\n ? true\n : never;\n return {\n adapters,\n transport,\n throttle,\n toCreateMessage,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval,\n onResumeError,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n chatInit,\n };\n};\n\ntype ChatCallbacks<UI_MESSAGE extends UIMessage> = Pick<\n ChatInit<UI_MESSAGE>,\n \"onToolCall\" | \"onData\" | \"onFinish\" | \"onError\" | \"sendAutomaticallyWhen\"\n>;\n\n/**\n * Constructs a `Chat` whose callbacks read the latest options through\n * `callbacksRef`, the forwarding `useChat` applies only to a chat it\n * constructs itself.\n */\nexport const createChat = <UI_MESSAGE extends UIMessage>(\n init: ChatInit<UI_MESSAGE>,\n callbacksRef: { readonly current: ChatCallbacks<UI_MESSAGE> | undefined },\n): Chat<UI_MESSAGE> =>\n new Chat<UI_MESSAGE>({\n ...init,\n onToolCall: (arg) => callbacksRef.current?.onToolCall?.(arg),\n onData: (arg) => callbacksRef.current?.onData?.(arg),\n onFinish: (arg) => callbacksRef.current?.onFinish?.(arg),\n onError: (arg) => callbacksRef.current?.onError?.(arg),\n sendAutomaticallyWhen: (arg) =>\n callbacksRef.current?.sendAutomaticallyWhen?.(arg) ?? false,\n });\n\nexport const useChatThread = <UI_MESSAGE extends UIMessage = UIMessage>(\n options: ChatThreadOptions<UI_MESSAGE> | undefined,\n env: ChatThreadEnvironment<UI_MESSAGE>,\n): AssistantRuntime => {\n const {\n adapters,\n transport: transportOptions,\n throttle,\n toCreateMessage,\n onResume,\n onResumeToolCall,\n onRespondToToolApproval,\n onResumeError,\n joinStrategy,\n messageRepository,\n unstable_onBranchChange,\n chatInit: chatOptions,\n } = splitChatThreadOptions(options);\n\n const {\n id,\n isMainThread,\n getThreadListItem,\n stopOnClientDestroy = true,\n hostDestroySignal,\n chat: externalChat,\n messageRepositoryInstance,\n } = env;\n\n // Wiring below is per thread and mutated on the instance, so a transport\n // shared across simultaneously mounted threads is last-writer-wins. A\n // caller-owned chat is already bound to its own clone, so cloning again\n // here would wire a copy the chat never sends through.\n const sourceTransport = useMemo(\n () =>\n transportOptions === undefined\n ? new AssistantChatTransport()\n : externalChat === undefined &&\n transportOptions instanceof AssistantChatTransport\n ? transportOptions.__internal_clone()\n : transportOptions,\n [transportOptions, externalChat],\n );\n const transport = useDynamicChatTransport(sourceTransport);\n\n const latestChatOptionsRef = useRef(chatOptions);\n useEffect(() => {\n latestChatOptionsRef.current = chatOptions;\n });\n // `useChat` stops a chat it constructs whenever it unmounts, and a\n // resource's soft unmount runs that cleanup, so the thread owns its chat.\n const [ownedChat] = useState(\n () =>\n externalChat ??\n createChat({ ...chatOptions, id, transport }, latestChatOptionsRef),\n );\n\n const chat = useChat({\n chat: externalChat ?? ownedChat,\n ...(throttle !== undefined && { throttle }),\n });\n\n useResourceCleanup(\n stopOnClientDestroy,\n () => {\n void chat.stop().catch(() => {});\n },\n hostDestroySignal,\n );\n\n const runtime = useAISDKRuntime(chat, {\n adapters,\n ...pickExternalStoreSharedOptions(options ?? {}),\n ...(toCreateMessage && { toCreateMessage }),\n ...(onResume && { onResume }),\n ...(onResumeToolCall && { onResumeToolCall }),\n ...(onRespondToToolApproval && { onRespondToToolApproval }),\n ...(joinStrategy && { joinStrategy }),\n ...(messageRepository && { messageRepository }),\n ...(messageRepositoryInstance && {\n unstable_messageRepositoryInstance: messageRepositoryInstance,\n }),\n ...(unstable_onBranchChange && { unstable_onBranchChange }),\n });\n\n // Wire in render, not an effect: a send from a descendant's mount effect\n // runs before this hook's effect would (effects fire child-first), and must\n // see a wired transport. The clone is per thread, so a discarded render's\n // wiring is discarded with it and the committed render re-wires the same\n // instance.\n if (sourceTransport instanceof AssistantChatTransport) {\n sourceTransport.setRuntime(runtime);\n sourceTransport.__internal_setGetThreadListItem(getThreadListItem);\n }\n\n const subscribeToRuntime = useCallback(\n (callback: () => void) => runtime.thread.subscribe(callback),\n [runtime],\n );\n const getHistoryLoadingSnapshot = useCallback(\n () => runtime.thread.getState().isLoading,\n [runtime],\n );\n const isLoadingHistory = useSyncExternalStore(\n subscribeToRuntime,\n getHistoryLoadingSnapshot,\n getHistoryLoadingSnapshot,\n );\n\n const resumableStorage = useMemo(\n () => getResumableAdapter(sourceTransport)?.storage,\n [sourceTransport],\n );\n const subscribeToResumableStorage = useCallback(\n (callback: () => void) =>\n isMainThread\n ? (resumableStorage?.subscribe?.(callback, id) ?? (() => {}))\n : () => {},\n [id, isMainThread, resumableStorage],\n );\n const getPendingStreamId = useCallback(\n () => (isMainThread ? (resumableStorage?.getStreamId(id) ?? null) : null),\n [id, isMainThread, resumableStorage],\n );\n const pendingStreamId = useSyncExternalStore(\n subscribeToResumableStorage,\n getPendingStreamId,\n getNoPendingStreamId,\n );\n const isChatRunning =\n chat.status === \"submitted\" || chat.status === \"streaming\";\n\n const resumedStreamIds = useMemo(\n () => getResumedStreamIds(resumableStorage),\n [resumableStorage],\n );\n const onResumeErrorRef = useRef(onResumeError);\n useEffect(() => {\n onResumeErrorRef.current = onResumeError;\n });\n useEffect(() => {\n if (!pendingStreamId || resumedStreamIds.has(pendingStreamId)) {\n return;\n }\n if (isChatRunning) {\n resumedStreamIds.add(pendingStreamId);\n return;\n }\n if (isLoadingHistory) return;\n resumedStreamIds.add(pendingStreamId);\n chat.resumeStream().catch((err: unknown) => {\n console.warn(\"[assistant-ui] resumable: resume failed\", err);\n try {\n onResumeErrorRef.current?.(err);\n } catch (callbackError) {\n console.error(\n \"[assistant-ui] resumable: onResumeError callback failed\",\n callbackError,\n );\n } finally {\n if (resumableStorage?.getStreamId(id) === pendingStreamId) {\n resumableStorage.clear(id);\n }\n }\n });\n }, [\n chat,\n id,\n isChatRunning,\n isLoadingHistory,\n pendingStreamId,\n resumableStorage,\n resumedStreamIds,\n ]);\n\n return runtime;\n};\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
//#region src/runtime/useExternalHistory.d.ts
|
|
1
|
+
import type { AssistantRuntime, ThreadHistoryAdapter, ThreadMessage, MessageFormatAdapter, MessageFormatRepository, ExportedMessageRepository, RespondToToolApprovalOptions, Unstable_ToolInteractionLog } from "@assistant-ui/core";
|
|
2
|
+
import { type RefObject } from "react";
|
|
4
3
|
export declare const toExportedMessageRepository: <TMessage>(toThreadMessages: (messages: TMessage[]) => ThreadMessage[], messages: MessageFormatRepository<TMessage>) => ExportedMessageRepository;
|
|
5
|
-
export declare const useExternalHistory: <TMessage>(runtimeRef: RefObject<AssistantRuntime>, historyAdapter: ThreadHistoryAdapter | undefined, toThreadMessages: (messages: TMessage[]) => ThreadMessage[], storageFormatAdapter: MessageFormatAdapter<TMessage, any>, onSetMessages: (messages: TMessage[]) => void) => {
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
export declare const useExternalHistory: <TMessage>(runtimeRef: RefObject<AssistantRuntime>, historyAdapter: ThreadHistoryAdapter | undefined, toThreadMessages: (messages: TMessage[]) => ThreadMessage[], storageFormatAdapter: MessageFormatAdapter<TMessage, any>, onSetMessages: (messages: TMessage[]) => void, toolArtifacts?: Map<string, unknown>, onToolArtifactsRestored?: () => void, toolInteractions?: Map<string, Unstable_ToolInteractionLog>, onToolInteractionsRestored?: () => void, toolApprovalResponses?: Map<string, RespondToToolApprovalOptions>, onToolApprovalResponsesRestored?: () => void) => {
|
|
5
|
+
isLoading: boolean;
|
|
6
|
+
deleteMessage: (messageId: string) => Promise<void>;
|
|
7
|
+
persistToolInteractions: (messageId: string) => Promise<void>;
|
|
8
|
+
persistToolApprovalResponses: (messageId: string) => Promise<void>;
|
|
8
9
|
};
|
|
9
|
-
//#endregion
|
|
10
10
|
//# sourceMappingURL=useExternalHistory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useExternalHistory.d.ts","
|
|
1
|
+
{"version":3,"file":"useExternalHistory.d.ts","sourceRoot":"","sources":["../../src/runtime/useExternalHistory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EAEpB,uBAAuB,EACvB,yBAAyB,EACzB,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EAIL,KAAK,SAAS,EAGf,MAAM,OAAO,CAAC;AAEf,eAAO,MAAM,2BAA2B,GAAI,QAAQ,EAClD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,EAC3D,UAAU,uBAAuB,CAAC,QAAQ,CAAC,KAC1C,yBAoBF,CAAC;AAwNF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,EACzC,YAAY,SAAS,CAAC,gBAAgB,CAAC,EACvC,gBAAgB,oBAAoB,GAAG,SAAS,EAChD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,EAC3D,sBAAsB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,EACzD,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,IAAI,EAC7C,gBAAgB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,0BAA0B,MAAM,IAAI,EACpC,mBAAmB,GAAG,CAAC,MAAM,EAAE,2BAA2B,CAAC,EAC3D,6BAA6B,MAAM,IAAI,EACvC,wBAAwB,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,EACjE,kCAAkC,MAAM,IAAI;;+BA+dxB,MAAM;yCA3UZ,MAAM;8CAAN,MAAM;CAyXrB,CAAC"}
|