@assistant-ui/react 0.0.29 → 0.1.1
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/AssistantRuntime-BM_jVV3g.d.mts +23 -0
- package/dist/AssistantRuntime-CBMSAJqH.d.mts +23 -0
- package/dist/AssistantRuntime-C_BvM7ZT.d.ts +23 -0
- package/dist/AssistantRuntime-DELpXWfG.d.ts +23 -0
- package/dist/ModelConfigTypes-B9UY4zxv.d.mts +55 -0
- package/dist/ModelConfigTypes-B9UY4zxv.d.ts +55 -0
- package/dist/ModelConfigTypes-BF5HxVrH.d.mts +55 -0
- package/dist/ModelConfigTypes-BF5HxVrH.d.ts +55 -0
- package/dist/ModelConfigTypes-Cf3yjaDu.d.mts +55 -0
- package/dist/ModelConfigTypes-Cf3yjaDu.d.ts +55 -0
- package/dist/ModelConfigTypes-CzmXY3sn.d.mts +55 -0
- package/dist/ModelConfigTypes-CzmXY3sn.d.ts +55 -0
- package/dist/Thread-BMASJT4a.d.ts +15 -0
- package/dist/Thread-UEVsUmvl.d.mts +15 -0
- package/dist/chunk-3XZUKECF.mjs +207 -0
- package/dist/chunk-3XZUKECF.mjs.map +1 -0
- package/dist/chunk-4DQ2CIAD.mjs +69 -0
- package/dist/chunk-4DQ2CIAD.mjs.map +1 -0
- package/dist/chunk-5YONSDN4.mjs +200 -0
- package/dist/chunk-5YONSDN4.mjs.map +1 -0
- package/dist/chunk-CY4TTHR7.mjs +76 -0
- package/dist/chunk-CY4TTHR7.mjs.map +1 -0
- package/dist/chunk-DKAWDNW5.mjs +22 -0
- package/dist/chunk-DKAWDNW5.mjs.map +1 -0
- package/dist/chunk-GQKH2ADD.mjs +165 -0
- package/dist/chunk-GQKH2ADD.mjs.map +1 -0
- package/dist/chunk-J5LGTIGS.mjs +10 -0
- package/dist/chunk-J5LGTIGS.mjs.map +1 -0
- package/dist/chunk-NSBOH42A.mjs +200 -0
- package/dist/chunk-NSBOH42A.mjs.map +1 -0
- package/dist/chunk-X4HBDEFP.mjs +30 -0
- package/dist/chunk-X4HBDEFP.mjs.map +1 -0
- package/dist/experimental.d.mts +86 -0
- package/dist/experimental.d.ts +86 -0
- package/dist/experimental.js +123 -0
- package/dist/experimental.js.map +1 -0
- package/dist/experimental.mjs +34 -0
- package/dist/experimental.mjs.map +1 -0
- package/dist/index.d.mts +11 -230
- package/dist/index.d.ts +11 -230
- package/dist/index.js +189 -577
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +140 -757
- package/dist/index.mjs.map +1 -1
- package/dist/internal-dlLjX30u.d.mts +75 -0
- package/dist/internal-dlLjX30u.d.ts +75 -0
- package/dist/internal.d.mts +25 -0
- package/dist/internal.d.ts +25 -0
- package/dist/internal.js +225 -0
- package/dist/internal.js.map +1 -0
- package/dist/internal.mjs +10 -0
- package/dist/internal.mjs.map +1 -0
- package/package.json +23 -3
package/dist/index.mjs
CHANGED
@@ -1,24 +1,26 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
import {
|
2
|
+
MessageRepository,
|
3
|
+
ProxyConfigProvider,
|
4
|
+
generateId,
|
5
|
+
mergeModelConfigs
|
6
|
+
} from "./chunk-NSBOH42A.mjs";
|
7
|
+
import {
|
8
|
+
AssistantContext,
|
9
|
+
ContentPartContext,
|
10
|
+
MessageContext,
|
11
|
+
ThreadContext,
|
12
|
+
useComposerContext,
|
13
|
+
useContentPartContext,
|
14
|
+
useMessageContext,
|
15
|
+
useThreadContext
|
16
|
+
} from "./chunk-CY4TTHR7.mjs";
|
17
|
+
import {
|
18
|
+
__export
|
19
|
+
} from "./chunk-J5LGTIGS.mjs";
|
6
20
|
|
7
21
|
// src/actions/useCopyMessage.tsx
|
8
22
|
import { useCallback } from "react";
|
9
23
|
|
10
|
-
// src/context/MessageContext.ts
|
11
|
-
import { createContext, useContext } from "react";
|
12
|
-
var MessageContext = createContext(null);
|
13
|
-
var useMessageContext = () => {
|
14
|
-
const context = useContext(MessageContext);
|
15
|
-
if (!context)
|
16
|
-
throw new Error(
|
17
|
-
"This component can only be used inside a component passed to <ThreadPrimitive.Messages components={...} />."
|
18
|
-
);
|
19
|
-
return context;
|
20
|
-
};
|
21
|
-
|
22
24
|
// src/utils/combined/useCombinedStore.ts
|
23
25
|
import { useMemo } from "react";
|
24
26
|
|
@@ -76,18 +78,6 @@ var useCopyMessage = ({ copiedDuration = 3e3 }) => {
|
|
76
78
|
|
77
79
|
// src/actions/useReloadMessage.tsx
|
78
80
|
import { useCallback as useCallback2 } from "react";
|
79
|
-
|
80
|
-
// src/context/ThreadContext.ts
|
81
|
-
import { createContext as createContext2, useContext as useContext2 } from "react";
|
82
|
-
var ThreadContext = createContext2(null);
|
83
|
-
var useThreadContext = () => {
|
84
|
-
const context = useContext2(ThreadContext);
|
85
|
-
if (!context)
|
86
|
-
throw new Error("This component must be used within an AssistantProvider.");
|
87
|
-
return context;
|
88
|
-
};
|
89
|
-
|
90
|
-
// src/actions/useReloadMessage.tsx
|
91
81
|
var useReloadMessage = () => {
|
92
82
|
const { useThread, useViewport } = useThreadContext();
|
93
83
|
const { useMessage } = useMessageContext();
|
@@ -436,20 +426,6 @@ var MessageProvider = ({
|
|
436
426
|
return /* @__PURE__ */ jsx4(MessageContext.Provider, { value: context, children });
|
437
427
|
};
|
438
428
|
|
439
|
-
// src/context/ComposerContext.ts
|
440
|
-
import { useContext as useContext3, useMemo as useMemo2 } from "react";
|
441
|
-
var useComposerContext = () => {
|
442
|
-
const { useComposer } = useThreadContext();
|
443
|
-
const { useComposer: useEditComposer } = useContext3(MessageContext) ?? {};
|
444
|
-
return useMemo2(
|
445
|
-
() => ({
|
446
|
-
useComposer: useEditComposer ?? useComposer,
|
447
|
-
type: useEditComposer ? "edit" : "new"
|
448
|
-
}),
|
449
|
-
[useEditComposer, useComposer]
|
450
|
-
);
|
451
|
-
};
|
452
|
-
|
453
429
|
// src/primitives/composer/ComposerIf.tsx
|
454
430
|
var useComposerIf = (props) => {
|
455
431
|
const { useComposer } = useComposerContext();
|
@@ -769,22 +745,6 @@ var MessageRoot = forwardRef9(
|
|
769
745
|
// src/context/providers/ContentPartProvider.tsx
|
770
746
|
import { useEffect as useEffect5, useState as useState2 } from "react";
|
771
747
|
import { create as create3 } from "zustand";
|
772
|
-
|
773
|
-
// src/context/ContentPartContext.ts
|
774
|
-
import { createContext as createContext3, useContext as useContext4 } from "react";
|
775
|
-
var ContentPartContext = createContext3(
|
776
|
-
null
|
777
|
-
);
|
778
|
-
var useContentPartContext = () => {
|
779
|
-
const context = useContext4(ContentPartContext);
|
780
|
-
if (!context)
|
781
|
-
throw new Error(
|
782
|
-
"This component can only be used inside a component passed to <MessagePrimitive.Content components={...} >."
|
783
|
-
);
|
784
|
-
return context;
|
785
|
-
};
|
786
|
-
|
787
|
-
// src/context/providers/ContentPartProvider.tsx
|
788
748
|
import { jsx as jsx13 } from "react/jsx-runtime";
|
789
749
|
var syncContentPart = ({ message }, useContentPart, partIndex) => {
|
790
750
|
const part = message.content[partIndex];
|
@@ -883,11 +843,11 @@ var MessageContent = ({
|
|
883
843
|
import {
|
884
844
|
Primitive as Primitive9
|
885
845
|
} from "@radix-ui/react-primitive";
|
886
|
-
import { forwardRef as forwardRef10, useMemo as
|
846
|
+
import { forwardRef as forwardRef10, useMemo as useMemo2 } from "react";
|
887
847
|
import { jsx as jsx15 } from "react/jsx-runtime";
|
888
848
|
var MessageInProgress = forwardRef10((props, ref) => {
|
889
849
|
const { useMessage } = useMessageContext();
|
890
|
-
|
850
|
+
useMemo2(() => {
|
891
851
|
useMessage.getState().setInProgressIndicator(/* @__PURE__ */ jsx15(Primitive9.span, { ...props, ref }));
|
892
852
|
}, [useMessage, props, ref]);
|
893
853
|
return null;
|
@@ -1016,585 +976,135 @@ __export(contentPart_exports, {
|
|
1016
976
|
InProgressIndicator: () => ContentPartInProgressIndicator
|
1017
977
|
});
|
1018
978
|
|
1019
|
-
//
|
1020
|
-
import {
|
1021
|
-
|
1022
|
-
// ../react-ai-sdk/src/rsc/VercelRSCRuntime.tsx
|
1023
|
-
import { create as create4 } from "zustand";
|
1024
|
-
|
1025
|
-
// ../react-ai-sdk/src/rsc/useVercelRSCSync.tsx
|
1026
|
-
import { useEffect as useEffect6, useMemo as useMemo4 } from "react";
|
1027
|
-
|
1028
|
-
// ../react-ai-sdk/src/utils/ThreadMessageConverter.ts
|
1029
|
-
var ThreadMessageConverter = class {
|
1030
|
-
cache = /* @__PURE__ */ new WeakMap();
|
1031
|
-
convertMessages(messages, converter, keyMapper = (key) => key) {
|
1032
|
-
return messages.map((m) => {
|
1033
|
-
const key = keyMapper(m);
|
1034
|
-
const cached = this.cache.get(key);
|
1035
|
-
const newMessage = converter(m, cached);
|
1036
|
-
this.cache.set(key, newMessage);
|
1037
|
-
return newMessage;
|
1038
|
-
});
|
1039
|
-
}
|
1040
|
-
};
|
1041
|
-
|
1042
|
-
// ../react-ai-sdk/src/rsc/getVercelRSCMessage.tsx
|
1043
|
-
var symbolInnerRSCMessage = Symbol("innerVercelRSCMessage");
|
1044
|
-
var getVercelRSCMessage = (message) => {
|
1045
|
-
return message[symbolInnerRSCMessage];
|
1046
|
-
};
|
1047
|
-
|
1048
|
-
// ../react-ai-sdk/src/rsc/useVercelRSCSync.tsx
|
1049
|
-
var vercelToThreadMessage = (converter, rawMessage) => {
|
1050
|
-
const message = converter(rawMessage);
|
1051
|
-
return {
|
1052
|
-
id: message.id,
|
1053
|
-
role: message.role,
|
1054
|
-
content: [{ type: "ui", display: message.display }],
|
1055
|
-
createdAt: message.createdAt ?? /* @__PURE__ */ new Date(),
|
1056
|
-
...{ status: "done" },
|
1057
|
-
[symbolInnerRSCMessage]: rawMessage
|
1058
|
-
};
|
1059
|
-
};
|
1060
|
-
var useVercelRSCSync = (adapter, updateData) => {
|
1061
|
-
const [converter, convertCallback] = useMemo4(() => {
|
1062
|
-
const rscConverter = adapter.convertMessage ?? ((m) => m);
|
1063
|
-
const convertCallback2 = (m, cache) => {
|
1064
|
-
if (cache) return cache;
|
1065
|
-
return vercelToThreadMessage(rscConverter, m);
|
1066
|
-
};
|
1067
|
-
return [new ThreadMessageConverter(), convertCallback2];
|
1068
|
-
}, [adapter.convertMessage]);
|
1069
|
-
useEffect6(() => {
|
1070
|
-
updateData(converter.convertMessages(adapter.messages, convertCallback));
|
1071
|
-
}, [updateData, converter, convertCallback, adapter.messages]);
|
1072
|
-
};
|
979
|
+
// src/runtime/local/useLocalRuntime.tsx
|
980
|
+
import { useInsertionEffect, useState as useState3 } from "react";
|
1073
981
|
|
1074
|
-
//
|
1075
|
-
var
|
1076
|
-
var VercelRSCRuntime = class {
|
982
|
+
// src/runtime/local/LocalRuntime.tsx
|
983
|
+
var LocalRuntime = class {
|
1077
984
|
constructor(adapter) {
|
1078
985
|
this.adapter = adapter;
|
1079
|
-
this.useAdapter = create4(() => ({
|
1080
|
-
adapter
|
1081
|
-
}));
|
1082
986
|
}
|
1083
|
-
useAdapter;
|
1084
987
|
_subscriptions = /* @__PURE__ */ new Set();
|
1085
|
-
|
1086
|
-
|
1087
|
-
|
1088
|
-
|
1089
|
-
return
|
1090
|
-
this.isRunning = false;
|
1091
|
-
});
|
1092
|
-
};
|
1093
|
-
getBranches() {
|
1094
|
-
return EMPTY_BRANCHES;
|
1095
|
-
}
|
1096
|
-
switchToBranch() {
|
1097
|
-
throw new Error(
|
1098
|
-
"Branch switching is not supported by VercelRSCAssistantProvider."
|
1099
|
-
);
|
1100
|
-
}
|
1101
|
-
async append(message) {
|
1102
|
-
if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {
|
1103
|
-
if (!this.adapter.edit)
|
1104
|
-
throw new Error(
|
1105
|
-
"Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider."
|
1106
|
-
);
|
1107
|
-
await this.withRunning(this.adapter.edit(message));
|
1108
|
-
} else {
|
1109
|
-
await this.withRunning(this.adapter.append(message));
|
1110
|
-
}
|
1111
|
-
}
|
1112
|
-
async startRun(parentId) {
|
1113
|
-
if (!this.adapter.reload)
|
1114
|
-
throw new Error(
|
1115
|
-
"Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider."
|
1116
|
-
);
|
1117
|
-
await this.withRunning(this.adapter.reload(parentId));
|
1118
|
-
}
|
1119
|
-
cancelRun() {
|
1120
|
-
if (process.env["NODE_ENV"] === "development") {
|
1121
|
-
console.warn(
|
1122
|
-
"Run cancellation is not supported by VercelRSCAssistantProvider."
|
1123
|
-
);
|
1124
|
-
}
|
1125
|
-
}
|
1126
|
-
subscribe(callback) {
|
1127
|
-
this._subscriptions.add(callback);
|
1128
|
-
return () => this._subscriptions.delete(callback);
|
1129
|
-
}
|
1130
|
-
onAdapterUpdated() {
|
1131
|
-
if (this.useAdapter.getState().adapter !== this.adapter) {
|
1132
|
-
this.useAdapter.setState({ adapter: this.adapter });
|
1133
|
-
}
|
1134
|
-
}
|
1135
|
-
updateData = (messages) => {
|
1136
|
-
this.messages = messages;
|
1137
|
-
for (const callback of this._subscriptions) callback();
|
1138
|
-
};
|
1139
|
-
unstable_synchronizer = () => {
|
1140
|
-
const { adapter } = this.useAdapter();
|
1141
|
-
useVercelRSCSync(adapter, this.updateData);
|
1142
|
-
return null;
|
1143
|
-
};
|
1144
|
-
};
|
1145
|
-
|
1146
|
-
// ../react-ai-sdk/src/rsc/useVercelRSCRuntime.tsx
|
1147
|
-
var useVercelRSCRuntime = (adapter) => {
|
1148
|
-
const [runtime] = useState3(() => new VercelRSCRuntime(adapter));
|
1149
|
-
useInsertionEffect(() => {
|
1150
|
-
runtime.adapter = adapter;
|
1151
|
-
});
|
1152
|
-
useEffect7(() => {
|
1153
|
-
runtime.onAdapterUpdated();
|
1154
|
-
});
|
1155
|
-
return runtime;
|
1156
|
-
};
|
1157
|
-
|
1158
|
-
// ../react-ai-sdk/src/ui/use-chat/useVercelUseChatRuntime.tsx
|
1159
|
-
import { useEffect as useEffect10, useInsertionEffect as useInsertionEffect2, useState as useState4 } from "react";
|
1160
|
-
|
1161
|
-
// ../react-ai-sdk/src/ui/VercelAIRuntime.tsx
|
1162
|
-
import { create as create5 } from "zustand";
|
1163
|
-
|
1164
|
-
// ../react-ai-sdk/src/ui/getVercelAIMessage.tsx
|
1165
|
-
var symbolInnerAIMessage = Symbol("innerVercelAIUIMessage");
|
1166
|
-
var getVercelAIMessage = (message) => {
|
1167
|
-
return message[symbolInnerAIMessage];
|
1168
|
-
};
|
1169
|
-
|
1170
|
-
// ../react-ai-sdk/src/ui/utils/sliceMessagesUntil.tsx
|
1171
|
-
var sliceMessagesUntil = (messages, messageId) => {
|
1172
|
-
if (messageId == null) return [];
|
1173
|
-
let messageIdx = messages.findIndex((m) => m.id === messageId);
|
1174
|
-
if (messageIdx === -1)
|
1175
|
-
throw new Error(
|
1176
|
-
"useVercelAIThreadState: Message not found. This is liekly an internal bug in assistant-ui."
|
1177
|
-
);
|
1178
|
-
while (messages[messageIdx + 1]?.role === "assistant") {
|
1179
|
-
messageIdx++;
|
1180
|
-
}
|
1181
|
-
return messages.slice(0, messageIdx + 1);
|
1182
|
-
};
|
1183
|
-
|
1184
|
-
// ../react-ai-sdk/src/ui/utils/useVercelAIComposerSync.tsx
|
1185
|
-
import { useEffect as useEffect8 } from "react";
|
1186
|
-
var useVercelAIComposerSync = (vercel) => {
|
1187
|
-
const { useComposer } = useThreadContext();
|
1188
|
-
useEffect8(() => {
|
1189
|
-
useComposer.setState({
|
1190
|
-
value: vercel.input,
|
1191
|
-
setValue: vercel.setInput
|
1192
|
-
});
|
1193
|
-
}, [useComposer, vercel.input, vercel.setInput]);
|
1194
|
-
};
|
1195
|
-
|
1196
|
-
// ../react-ai-sdk/src/ui/utils/useVercelAIThreadSync.tsx
|
1197
|
-
import { useEffect as useEffect9, useMemo as useMemo5 } from "react";
|
1198
|
-
var getIsRunning = (vercel) => {
|
1199
|
-
if ("isLoading" in vercel) return vercel.isLoading;
|
1200
|
-
return vercel.status === "in_progress";
|
1201
|
-
};
|
1202
|
-
var vercelToThreadMessage2 = (messages, status) => {
|
1203
|
-
const firstMessage = messages[0];
|
1204
|
-
if (!firstMessage) throw new Error("No messages found");
|
1205
|
-
const common = {
|
1206
|
-
id: firstMessage.id,
|
1207
|
-
createdAt: firstMessage.createdAt ?? /* @__PURE__ */ new Date(),
|
1208
|
-
[symbolInnerAIMessage]: messages
|
1209
|
-
};
|
1210
|
-
switch (firstMessage.role) {
|
1211
|
-
case "user":
|
1212
|
-
if (messages.length > 1) {
|
1213
|
-
throw new Error(
|
1214
|
-
"Multiple user messages found. This is likely an internal bug in assistant-ui."
|
1215
|
-
);
|
1216
|
-
}
|
1217
|
-
return {
|
1218
|
-
...common,
|
1219
|
-
role: "user",
|
1220
|
-
content: [{ type: "text", text: firstMessage.content }]
|
1221
|
-
};
|
1222
|
-
case "assistant":
|
1223
|
-
return {
|
1224
|
-
...common,
|
1225
|
-
role: "assistant",
|
1226
|
-
content: messages.flatMap((message) => [
|
1227
|
-
...message.content ? [{ type: "text", text: message.content }] : [],
|
1228
|
-
...message.toolInvocations?.map(
|
1229
|
-
(t) => ({
|
1230
|
-
type: "tool-call",
|
1231
|
-
name: t.toolName,
|
1232
|
-
args: t.args,
|
1233
|
-
result: "result" in t ? t.result : void 0
|
1234
|
-
})
|
1235
|
-
) ?? []
|
1236
|
-
]),
|
1237
|
-
status
|
1238
|
-
};
|
1239
|
-
default:
|
1240
|
-
throw new Error(
|
1241
|
-
`You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`
|
1242
|
-
);
|
1243
|
-
}
|
1244
|
-
};
|
1245
|
-
var hasItems = (messages) => messages.length > 0;
|
1246
|
-
var chunkedMessages = (messages) => {
|
1247
|
-
const chunks = [];
|
1248
|
-
let currentChunk = [];
|
1249
|
-
for (const message of messages) {
|
1250
|
-
if (message.role === "assistant") {
|
1251
|
-
currentChunk.push(message);
|
1252
|
-
} else {
|
1253
|
-
if (hasItems(currentChunk)) {
|
1254
|
-
chunks.push(currentChunk);
|
1255
|
-
currentChunk = [];
|
1256
|
-
}
|
1257
|
-
chunks.push([message]);
|
1258
|
-
}
|
1259
|
-
}
|
1260
|
-
if (hasItems(currentChunk)) {
|
1261
|
-
chunks.push(currentChunk);
|
1262
|
-
}
|
1263
|
-
return chunks;
|
1264
|
-
};
|
1265
|
-
var shallowArrayEqual = (a, b) => {
|
1266
|
-
if (a.length !== b.length) return false;
|
1267
|
-
for (let i = 0; i < a.length; i++) {
|
1268
|
-
if (a[i] !== b[i]) return false;
|
988
|
+
_configProviders = /* @__PURE__ */ new Set();
|
989
|
+
abortController = null;
|
990
|
+
repository = new MessageRepository();
|
991
|
+
get messages() {
|
992
|
+
return this.repository.getMessages();
|
1269
993
|
}
|
1270
|
-
|
1271
|
-
|
1272
|
-
var useVercelAIThreadSync = (vercel, updateData) => {
|
1273
|
-
const isRunning = getIsRunning(vercel);
|
1274
|
-
const converter = useMemo5(() => new ThreadMessageConverter(), []);
|
1275
|
-
useEffect9(() => {
|
1276
|
-
const lastMessageId = vercel.messages.at(-1)?.id;
|
1277
|
-
const convertCallback = (messages2, cache) => {
|
1278
|
-
const status = lastMessageId === messages2[0].id && isRunning ? "in_progress" : "done";
|
1279
|
-
if (cache && shallowArrayEqual(cache.content, messages2) && (cache.role === "user" || cache.status === status))
|
1280
|
-
return cache;
|
1281
|
-
return vercelToThreadMessage2(messages2, status);
|
1282
|
-
};
|
1283
|
-
const messages = converter.convertMessages(
|
1284
|
-
chunkedMessages(vercel.messages),
|
1285
|
-
convertCallback,
|
1286
|
-
(m) => m[0]
|
1287
|
-
);
|
1288
|
-
updateData(isRunning, messages);
|
1289
|
-
}, [updateData, isRunning, vercel.messages, converter]);
|
1290
|
-
};
|
1291
|
-
|
1292
|
-
// ../react-ai-sdk/src/ui/VercelAIRuntime.tsx
|
1293
|
-
var hasUpcomingMessage = (isRunning, messages) => {
|
1294
|
-
return isRunning && messages[messages.length - 1]?.role !== "assistant";
|
1295
|
-
};
|
1296
|
-
var VercelAIRuntime = class {
|
1297
|
-
constructor(vercel) {
|
1298
|
-
this.vercel = vercel;
|
1299
|
-
this.useVercel = create5(() => ({
|
1300
|
-
vercel
|
1301
|
-
}));
|
994
|
+
get isRunning() {
|
995
|
+
return this.abortController != null;
|
1302
996
|
}
|
1303
|
-
_subscriptions = /* @__PURE__ */ new Set();
|
1304
|
-
repository = new MessageRepository();
|
1305
|
-
assistantOptimisticId = null;
|
1306
|
-
useVercel;
|
1307
|
-
messages = [];
|
1308
|
-
isRunning = false;
|
1309
997
|
getBranches(messageId) {
|
1310
998
|
return this.repository.getBranches(messageId);
|
1311
999
|
}
|
1312
1000
|
switchToBranch(branchId) {
|
1313
1001
|
this.repository.switchToBranch(branchId);
|
1314
|
-
this.
|
1002
|
+
this.notifySubscribers();
|
1315
1003
|
}
|
1316
1004
|
async append(message) {
|
1317
|
-
|
1318
|
-
|
1319
|
-
|
1320
|
-
this.vercel.messages,
|
1321
|
-
message.parentId
|
1322
|
-
);
|
1323
|
-
this.vercel.setMessages(newMessages);
|
1324
|
-
await this.vercel.append({
|
1005
|
+
const userMessageId = generateId();
|
1006
|
+
const userMessage = {
|
1007
|
+
id: userMessageId,
|
1325
1008
|
role: "user",
|
1326
|
-
content: message.content
|
1327
|
-
|
1009
|
+
content: message.content,
|
1010
|
+
createdAt: /* @__PURE__ */ new Date()
|
1011
|
+
};
|
1012
|
+
this.repository.addOrUpdateMessage(message.parentId, userMessage);
|
1013
|
+
await this.startRun(userMessageId);
|
1328
1014
|
}
|
1329
1015
|
async startRun(parentId) {
|
1330
|
-
const
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
|
1337
|
-
|
1016
|
+
const id = generateId();
|
1017
|
+
this.repository.resetHead(parentId);
|
1018
|
+
const messages = this.repository.getMessages();
|
1019
|
+
const message = {
|
1020
|
+
id,
|
1021
|
+
role: "assistant",
|
1022
|
+
status: "in_progress",
|
1023
|
+
content: [{ type: "text", text: "" }],
|
1024
|
+
createdAt: /* @__PURE__ */ new Date()
|
1025
|
+
};
|
1026
|
+
this.repository.addOrUpdateMessage(parentId, { ...message });
|
1027
|
+
this.abortController?.abort();
|
1028
|
+
this.abortController = new AbortController();
|
1029
|
+
this.notifySubscribers();
|
1030
|
+
try {
|
1031
|
+
const updateHandler = ({ content }) => {
|
1032
|
+
message.content = content;
|
1033
|
+
this.repository.addOrUpdateMessage(parentId, { ...message });
|
1034
|
+
this.notifySubscribers();
|
1035
|
+
};
|
1036
|
+
const result = await this.adapter.run({
|
1037
|
+
messages,
|
1038
|
+
abortSignal: this.abortController.signal,
|
1039
|
+
config: mergeModelConfigs([...this._configProviders].map((p) => p())),
|
1040
|
+
onUpdate: updateHandler
|
1041
|
+
});
|
1042
|
+
updateHandler(result);
|
1043
|
+
message.status = "done";
|
1044
|
+
this.repository.addOrUpdateMessage(parentId, { ...message });
|
1045
|
+
} catch (e) {
|
1046
|
+
message.status = "error";
|
1047
|
+
this.repository.addOrUpdateMessage(parentId, { ...message });
|
1048
|
+
console.error(e);
|
1049
|
+
} finally {
|
1050
|
+
this.abortController = null;
|
1051
|
+
this.notifySubscribers();
|
1052
|
+
}
|
1338
1053
|
}
|
1339
1054
|
cancelRun() {
|
1340
|
-
|
1341
|
-
this.
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1347
|
-
if (previousMessage?.role === "user" && previousMessage.id === messages.at(-1)?.id) {
|
1348
|
-
this.vercel.setInput(previousMessage.content);
|
1349
|
-
this.repository.deleteMessage(previousMessage.id);
|
1350
|
-
messages = this.repository.getMessages();
|
1351
|
-
}
|
1352
|
-
setTimeout(() => {
|
1353
|
-
this.updateVercelMessages(messages);
|
1354
|
-
}, 0);
|
1055
|
+
if (!this.abortController) return;
|
1056
|
+
this.abortController.abort();
|
1057
|
+
this.abortController = null;
|
1058
|
+
this.notifySubscribers();
|
1059
|
+
}
|
1060
|
+
notifySubscribers() {
|
1061
|
+
for (const callback of this._subscriptions) callback();
|
1355
1062
|
}
|
1356
1063
|
subscribe(callback) {
|
1357
1064
|
this._subscriptions.add(callback);
|
1358
1065
|
return () => this._subscriptions.delete(callback);
|
1359
1066
|
}
|
1360
|
-
|
1361
|
-
this.
|
1362
|
-
|
1363
|
-
);
|
1364
|
-
};
|
1365
|
-
onVercelUpdated() {
|
1366
|
-
if (this.useVercel.getState().vercel !== this.vercel) {
|
1367
|
-
this.useVercel.setState({ vercel: this.vercel });
|
1368
|
-
}
|
1067
|
+
registerModelConfigProvider(provider) {
|
1068
|
+
this._configProviders.add(provider);
|
1069
|
+
return () => this._configProviders.delete(provider);
|
1369
1070
|
}
|
1370
|
-
updateData = (isRunning, vm) => {
|
1371
|
-
for (let i = 0; i < vm.length; i++) {
|
1372
|
-
const message = vm[i];
|
1373
|
-
const parent = vm[i - 1];
|
1374
|
-
this.repository.addOrUpdateMessage(parent?.id ?? null, message);
|
1375
|
-
}
|
1376
|
-
if (this.assistantOptimisticId) {
|
1377
|
-
this.repository.deleteMessage(this.assistantOptimisticId);
|
1378
|
-
this.assistantOptimisticId = null;
|
1379
|
-
}
|
1380
|
-
if (hasUpcomingMessage(isRunning, vm)) {
|
1381
|
-
this.assistantOptimisticId = this.repository.appendOptimisticMessage(
|
1382
|
-
vm.at(-1)?.id ?? null,
|
1383
|
-
{
|
1384
|
-
role: "assistant",
|
1385
|
-
content: [{ type: "text", text: "" }]
|
1386
|
-
}
|
1387
|
-
);
|
1388
|
-
}
|
1389
|
-
this.repository.resetHead(
|
1390
|
-
this.assistantOptimisticId ?? vm.at(-1)?.id ?? null
|
1391
|
-
);
|
1392
|
-
this.messages = this.repository.getMessages();
|
1393
|
-
this.isRunning = isRunning;
|
1394
|
-
for (const callback of this._subscriptions) callback();
|
1395
|
-
};
|
1396
|
-
unstable_synchronizer = () => {
|
1397
|
-
const { vercel } = this.useVercel();
|
1398
|
-
useVercelAIThreadSync(vercel, this.updateData);
|
1399
|
-
useVercelAIComposerSync(vercel);
|
1400
|
-
return null;
|
1401
|
-
};
|
1402
1071
|
};
|
1403
1072
|
|
1404
|
-
//
|
1405
|
-
var
|
1406
|
-
const [runtime] =
|
1407
|
-
|
1408
|
-
runtime.
|
1409
|
-
});
|
1410
|
-
useEffect10(() => {
|
1411
|
-
runtime.onVercelUpdated();
|
1073
|
+
// src/runtime/local/useLocalRuntime.tsx
|
1074
|
+
var useLocalRuntime = (adapter) => {
|
1075
|
+
const [runtime] = useState3(() => new LocalRuntime(adapter));
|
1076
|
+
useInsertionEffect(() => {
|
1077
|
+
runtime.adapter = adapter;
|
1412
1078
|
});
|
1413
1079
|
return runtime;
|
1414
1080
|
};
|
1415
1081
|
|
1416
|
-
//
|
1417
|
-
import {
|
1418
|
-
var useVercelUseAssistantRuntime = (assistantHelpers) => {
|
1419
|
-
const [runtime] = useState5(() => new VercelAIRuntime(assistantHelpers));
|
1420
|
-
useInsertionEffect3(() => {
|
1421
|
-
runtime.vercel = assistantHelpers;
|
1422
|
-
});
|
1423
|
-
useEffect11(() => {
|
1424
|
-
runtime.onVercelUpdated();
|
1425
|
-
});
|
1426
|
-
return runtime;
|
1427
|
-
};
|
1082
|
+
// src/context/providers/AssistantRuntimeProvider.tsx
|
1083
|
+
import { memo } from "react";
|
1428
1084
|
|
1429
|
-
// src/
|
1430
|
-
import {
|
1431
|
-
var generateId = customAlphabet(
|
1432
|
-
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
|
1433
|
-
7
|
1434
|
-
);
|
1435
|
-
var optimisticPrefix = "__optimistic__";
|
1436
|
-
var generateOptimisticId = () => `${optimisticPrefix}${generateId()}`;
|
1085
|
+
// src/context/providers/AssistantProvider.tsx
|
1086
|
+
import { useEffect as useEffect7, useInsertionEffect as useInsertionEffect3, useRef as useRef5, useState as useState5 } from "react";
|
1437
1087
|
|
1438
|
-
// src/
|
1439
|
-
|
1440
|
-
|
1441
|
-
|
1442
|
-
|
1443
|
-
|
1444
|
-
|
1445
|
-
|
1446
|
-
|
1447
|
-
|
1448
|
-
children: []
|
1449
|
-
};
|
1450
|
-
performOp(newParent, child, operation) {
|
1451
|
-
const parentOrRoot = child.prev ?? this.root;
|
1452
|
-
const newParentOrRoot = newParent ?? this.root;
|
1453
|
-
if (operation === "relink" && parentOrRoot === newParentOrRoot) return;
|
1454
|
-
if (operation !== "link") {
|
1455
|
-
parentOrRoot.children = parentOrRoot.children.filter(
|
1456
|
-
(m) => m !== child.current.id
|
1457
|
-
);
|
1458
|
-
if (child.prev?.next === child) {
|
1459
|
-
const fallbackId = child.prev.children.at(-1);
|
1460
|
-
const fallback = fallbackId ? this.messages.get(fallbackId) : null;
|
1461
|
-
if (fallback === void 0) {
|
1462
|
-
throw new Error(
|
1463
|
-
"MessageRepository(performOp/cut): Fallback sibling message not found. This is likely an internal bug in assistant-ui."
|
1464
|
-
);
|
1465
|
-
}
|
1466
|
-
child.prev.next = fallback;
|
1467
|
-
}
|
1468
|
-
}
|
1469
|
-
if (operation !== "cut") {
|
1470
|
-
newParentOrRoot.children = [
|
1471
|
-
...newParentOrRoot.children,
|
1472
|
-
child.current.id
|
1473
|
-
];
|
1474
|
-
if (newParent && (findHead(child) === this.head || newParent.next === null)) {
|
1475
|
-
newParent.next = child;
|
1476
|
-
}
|
1477
|
-
child.prev = newParent;
|
1478
|
-
}
|
1479
|
-
}
|
1480
|
-
getMessages() {
|
1481
|
-
const messages = new Array(this.head?.level ?? 0);
|
1482
|
-
for (let current = this.head; current; current = current.prev) {
|
1483
|
-
messages[current.level] = current.current;
|
1484
|
-
}
|
1485
|
-
return messages;
|
1486
|
-
}
|
1487
|
-
addOrUpdateMessage(parentId, message) {
|
1488
|
-
const existingItem = this.messages.get(message.id);
|
1489
|
-
const prev = parentId ? this.messages.get(parentId) : null;
|
1490
|
-
if (prev === void 0)
|
1491
|
-
throw new Error(
|
1492
|
-
"MessageRepository(addOrUpdateMessage): Parent message not found. This is likely an internal bug in assistant-ui."
|
1493
|
-
);
|
1494
|
-
if (existingItem) {
|
1495
|
-
existingItem.current = message;
|
1496
|
-
this.performOp(prev, existingItem, "relink");
|
1497
|
-
return;
|
1498
|
-
}
|
1499
|
-
const newItem = {
|
1500
|
-
prev,
|
1501
|
-
current: message,
|
1502
|
-
next: null,
|
1503
|
-
children: [],
|
1504
|
-
level: prev ? prev.level + 1 : 0
|
1505
|
-
};
|
1506
|
-
this.messages.set(message.id, newItem);
|
1507
|
-
this.performOp(prev, newItem, "link");
|
1508
|
-
if (this.head === prev) {
|
1509
|
-
this.head = newItem;
|
1510
|
-
}
|
1511
|
-
}
|
1512
|
-
appendOptimisticMessage(parentId, message) {
|
1513
|
-
let optimisticId;
|
1514
|
-
do {
|
1515
|
-
optimisticId = generateOptimisticId();
|
1516
|
-
} while (this.messages.has(optimisticId));
|
1517
|
-
this.addOrUpdateMessage(parentId, {
|
1518
|
-
...message,
|
1519
|
-
id: optimisticId,
|
1520
|
-
createdAt: /* @__PURE__ */ new Date(),
|
1521
|
-
...message.role === "assistant" ? { status: "in_progress" } : void 0
|
1522
|
-
});
|
1523
|
-
return optimisticId;
|
1524
|
-
}
|
1525
|
-
deleteMessage(messageId, replacementId) {
|
1526
|
-
const message = this.messages.get(messageId);
|
1527
|
-
if (!message)
|
1528
|
-
throw new Error(
|
1529
|
-
"MessageRepository(deleteMessage): Optimistic message not found. This is likely an internal bug in assistant-ui."
|
1530
|
-
);
|
1531
|
-
const replacement = replacementId === void 0 ? message.prev : replacementId === null ? null : this.messages.get(replacementId);
|
1532
|
-
if (replacement === void 0)
|
1533
|
-
throw new Error(
|
1534
|
-
"MessageRepository(deleteMessage): Replacement not found. This is likely an internal bug in assistant-ui."
|
1535
|
-
);
|
1536
|
-
for (const child of message.children) {
|
1537
|
-
const childMessage = this.messages.get(child);
|
1538
|
-
if (!childMessage)
|
1539
|
-
throw new Error(
|
1540
|
-
"MessageRepository(deleteMessage): Child message not found. This is likely an internal bug in assistant-ui."
|
1541
|
-
);
|
1542
|
-
this.performOp(replacement, childMessage, "relink");
|
1543
|
-
}
|
1544
|
-
this.performOp(null, message, "cut");
|
1545
|
-
this.messages.delete(messageId);
|
1546
|
-
if (this.head === message) {
|
1547
|
-
this.head = replacement ? findHead(replacement) : null;
|
1548
|
-
}
|
1549
|
-
}
|
1550
|
-
getBranches(messageId) {
|
1551
|
-
const message = this.messages.get(messageId);
|
1552
|
-
if (!message)
|
1553
|
-
throw new Error(
|
1554
|
-
"MessageRepository(getBranches): Message not found. This is likely an internal bug in assistant-ui."
|
1555
|
-
);
|
1556
|
-
const { children } = message.prev ?? this.root;
|
1557
|
-
return children;
|
1558
|
-
}
|
1559
|
-
switchToBranch(messageId) {
|
1560
|
-
const message = this.messages.get(messageId);
|
1561
|
-
if (!message)
|
1562
|
-
throw new Error(
|
1563
|
-
"MessageRepository(switchToBranch): Branch not found. This is likely an internal bug in assistant-ui."
|
1564
|
-
);
|
1565
|
-
if (message.prev) {
|
1566
|
-
message.prev.next = message;
|
1567
|
-
}
|
1568
|
-
this.head = findHead(message);
|
1569
|
-
}
|
1570
|
-
resetHead(messageId) {
|
1571
|
-
if (messageId === null) {
|
1572
|
-
this.head = null;
|
1573
|
-
return;
|
1574
|
-
}
|
1575
|
-
const message = this.messages.get(messageId);
|
1576
|
-
if (!message)
|
1577
|
-
throw new Error(
|
1578
|
-
"MessageRepository(resetHead): Branch not found. This is likely an internal bug in assistant-ui."
|
1579
|
-
);
|
1580
|
-
this.head = message;
|
1581
|
-
for (let current = message; current; current = current.prev) {
|
1582
|
-
if (current.prev) {
|
1583
|
-
current.prev.next = current;
|
1584
|
-
}
|
1088
|
+
// src/context/stores/AssistantModelConfig.ts
|
1089
|
+
import { create as create4 } from "zustand";
|
1090
|
+
var makeAssistantModelConfigStore = () => create4(() => {
|
1091
|
+
const proxy = new ProxyConfigProvider();
|
1092
|
+
return {
|
1093
|
+
getModelConfig: () => {
|
1094
|
+
return proxy.getModelConfig();
|
1095
|
+
},
|
1096
|
+
registerModelConfigProvider: (provider) => {
|
1097
|
+
return proxy.registerModelConfigProvider(provider);
|
1585
1098
|
}
|
1586
|
-
}
|
1587
|
-
};
|
1588
|
-
|
1589
|
-
// src/context/providers/AssistantRuntimeProvider.tsx
|
1590
|
-
import { memo } from "react";
|
1099
|
+
};
|
1100
|
+
});
|
1591
1101
|
|
1592
1102
|
// src/context/providers/ThreadProvider.tsx
|
1593
|
-
import { useEffect as
|
1103
|
+
import { useEffect as useEffect6, useInsertionEffect as useInsertionEffect2, useRef as useRef4, useState as useState4 } from "react";
|
1594
1104
|
|
1595
1105
|
// src/context/stores/Composer.ts
|
1596
|
-
import { create as
|
1597
|
-
var makeComposerStore = (useThread) =>
|
1106
|
+
import { create as create5 } from "zustand";
|
1107
|
+
var makeComposerStore = (useThread) => create5()((set, get, store) => {
|
1598
1108
|
return {
|
1599
1109
|
...makeBaseComposer(set, get, store),
|
1600
1110
|
isEditing: true,
|
@@ -1616,9 +1126,9 @@ var makeComposerStore = (useThread) => create6()((set, get, store) => {
|
|
1616
1126
|
});
|
1617
1127
|
|
1618
1128
|
// src/context/stores/Thread.ts
|
1619
|
-
import { create as
|
1129
|
+
import { create as create6 } from "zustand";
|
1620
1130
|
var makeThreadStore = (runtimeRef) => {
|
1621
|
-
const useThread =
|
1131
|
+
const useThread = create6(() => ({
|
1622
1132
|
messages: runtimeRef.current.messages,
|
1623
1133
|
isRunning: runtimeRef.current.isRunning,
|
1624
1134
|
getBranches: (messageId) => runtimeRef.current.getBranches(messageId),
|
@@ -1640,10 +1150,10 @@ var makeThreadStore = (runtimeRef) => {
|
|
1640
1150
|
};
|
1641
1151
|
|
1642
1152
|
// src/context/stores/ThreadViewport.tsx
|
1643
|
-
import { create as
|
1153
|
+
import { create as create7 } from "zustand";
|
1644
1154
|
var makeThreadViewportStore = () => {
|
1645
1155
|
const scrollToBottomListeners = /* @__PURE__ */ new Set();
|
1646
|
-
return
|
1156
|
+
return create7(() => ({
|
1647
1157
|
isAtBottom: true,
|
1648
1158
|
scrollToBottom: () => {
|
1649
1159
|
for (const listener of scrollToBottomListeners) {
|
@@ -1666,10 +1176,10 @@ var ThreadProvider = ({
|
|
1666
1176
|
runtime
|
1667
1177
|
}) => {
|
1668
1178
|
const runtimeRef = useRef4(runtime);
|
1669
|
-
|
1179
|
+
useInsertionEffect2(() => {
|
1670
1180
|
runtimeRef.current = runtime;
|
1671
1181
|
});
|
1672
|
-
const [{ context, onRuntimeUpdate }] =
|
1182
|
+
const [{ context, onRuntimeUpdate }] = useState4(() => {
|
1673
1183
|
const { useThread, onRuntimeUpdate: onRuntimeUpdate2 } = makeThreadStore(runtimeRef);
|
1674
1184
|
const useViewport = makeThreadViewportStore();
|
1675
1185
|
const useComposer = makeComposerStore(useThread);
|
@@ -1682,7 +1192,7 @@ var ThreadProvider = ({
|
|
1682
1192
|
onRuntimeUpdate: onRuntimeUpdate2
|
1683
1193
|
};
|
1684
1194
|
});
|
1685
|
-
|
1195
|
+
useEffect6(() => {
|
1686
1196
|
onRuntimeUpdate();
|
1687
1197
|
return runtime.subscribe(onRuntimeUpdate);
|
1688
1198
|
}, [onRuntimeUpdate, runtime]);
|
@@ -1693,145 +1203,30 @@ var ThreadProvider = ({
|
|
1693
1203
|
] });
|
1694
1204
|
};
|
1695
1205
|
|
1696
|
-
// src/context/providers/
|
1206
|
+
// src/context/providers/AssistantProvider.tsx
|
1697
1207
|
import { jsx as jsx22 } from "react/jsx-runtime";
|
1698
|
-
var
|
1699
|
-
|
1208
|
+
var AssistantProvider = ({ children, runtime }) => {
|
1209
|
+
const runtimeRef = useRef5(runtime);
|
1210
|
+
useInsertionEffect3(() => {
|
1211
|
+
runtimeRef.current = runtime;
|
1212
|
+
});
|
1213
|
+
const [context] = useState5(() => {
|
1214
|
+
const useModelConfig = makeAssistantModelConfigStore();
|
1215
|
+
return { useModelConfig };
|
1216
|
+
});
|
1217
|
+
const getModelCOnfig = context.useModelConfig((c) => c.getModelConfig);
|
1218
|
+
useEffect7(() => {
|
1219
|
+
return runtime.registerModelConfigProvider(getModelCOnfig);
|
1220
|
+
}, [runtime, getModelCOnfig]);
|
1221
|
+
return /* @__PURE__ */ jsx22(AssistantContext.Provider, { value: context, children: /* @__PURE__ */ jsx22(ThreadProvider, { runtime, children }) });
|
1700
1222
|
};
|
1701
|
-
var AssistantRuntimeProvider = memo(AssistantRuntimeProviderImpl);
|
1702
1223
|
|
1703
|
-
// src/
|
1224
|
+
// src/context/providers/AssistantRuntimeProvider.tsx
|
1704
1225
|
import { jsx as jsx23 } from "react/jsx-runtime";
|
1705
|
-
var
|
1706
|
-
|
1707
|
-
children
|
1708
|
-
}) => {
|
1709
|
-
const runtime = useVercelUseChatRuntime(chat);
|
1710
|
-
return /* @__PURE__ */ jsx23(AssistantRuntimeProvider, { runtime, children });
|
1711
|
-
};
|
1712
|
-
var VercelUseAssistantRuntimeProvider = ({
|
1713
|
-
assistant,
|
1714
|
-
children
|
1715
|
-
}) => {
|
1716
|
-
const runtime = useVercelUseAssistantRuntime(assistant);
|
1717
|
-
return /* @__PURE__ */ jsx23(AssistantRuntimeProvider, { runtime, children });
|
1718
|
-
};
|
1719
|
-
var VercelAIAssistantProvider = ({
|
1720
|
-
children,
|
1721
|
-
...rest
|
1722
|
-
}) => {
|
1723
|
-
if ("chat" in rest) {
|
1724
|
-
return /* @__PURE__ */ jsx23(VercelUseChatRuntimeProvider, { chat: rest.chat, children });
|
1725
|
-
}
|
1726
|
-
return /* @__PURE__ */ jsx23(VercelUseAssistantRuntimeProvider, { assistant: rest.assistant, children });
|
1727
|
-
};
|
1728
|
-
|
1729
|
-
// src/runtime/vercel-deprecated/VercelRSCAssistantProvider.tsx
|
1730
|
-
import { jsx as jsx24 } from "react/jsx-runtime";
|
1731
|
-
var VercelRSCAssistantProvider = ({
|
1732
|
-
children,
|
1733
|
-
...adapter
|
1734
|
-
}) => {
|
1735
|
-
const runtime = useVercelRSCRuntime(adapter);
|
1736
|
-
return /* @__PURE__ */ jsx24(AssistantRuntimeProvider, { runtime, children });
|
1737
|
-
};
|
1738
|
-
|
1739
|
-
// src/runtime/local/useLocalRuntime.tsx
|
1740
|
-
import { useInsertionEffect as useInsertionEffect5, useState as useState7 } from "react";
|
1741
|
-
|
1742
|
-
// src/runtime/local/LocalRuntime.tsx
|
1743
|
-
var LocalRuntime = class {
|
1744
|
-
constructor(adapter) {
|
1745
|
-
this.adapter = adapter;
|
1746
|
-
}
|
1747
|
-
_subscriptions = /* @__PURE__ */ new Set();
|
1748
|
-
abortController = null;
|
1749
|
-
repository = new MessageRepository();
|
1750
|
-
get messages() {
|
1751
|
-
return this.repository.getMessages();
|
1752
|
-
}
|
1753
|
-
get isRunning() {
|
1754
|
-
return this.abortController != null;
|
1755
|
-
}
|
1756
|
-
getBranches(messageId) {
|
1757
|
-
return this.repository.getBranches(messageId);
|
1758
|
-
}
|
1759
|
-
switchToBranch(branchId) {
|
1760
|
-
this.repository.switchToBranch(branchId);
|
1761
|
-
this.notifySubscribers();
|
1762
|
-
}
|
1763
|
-
async append(message) {
|
1764
|
-
const userMessageId = generateId();
|
1765
|
-
const userMessage = {
|
1766
|
-
id: userMessageId,
|
1767
|
-
role: "user",
|
1768
|
-
content: message.content,
|
1769
|
-
createdAt: /* @__PURE__ */ new Date()
|
1770
|
-
};
|
1771
|
-
this.repository.addOrUpdateMessage(message.parentId, userMessage);
|
1772
|
-
await this.startRun(userMessageId);
|
1773
|
-
}
|
1774
|
-
async startRun(parentId) {
|
1775
|
-
const id = generateId();
|
1776
|
-
this.repository.resetHead(parentId);
|
1777
|
-
const messages = this.repository.getMessages();
|
1778
|
-
const message = {
|
1779
|
-
id,
|
1780
|
-
role: "assistant",
|
1781
|
-
status: "in_progress",
|
1782
|
-
content: [{ type: "text", text: "" }],
|
1783
|
-
createdAt: /* @__PURE__ */ new Date()
|
1784
|
-
};
|
1785
|
-
this.repository.addOrUpdateMessage(parentId, { ...message });
|
1786
|
-
this.abortController?.abort();
|
1787
|
-
this.abortController = new AbortController();
|
1788
|
-
this.notifySubscribers();
|
1789
|
-
try {
|
1790
|
-
const updateHandler = ({ content }) => {
|
1791
|
-
message.content = content;
|
1792
|
-
this.repository.addOrUpdateMessage(parentId, { ...message });
|
1793
|
-
this.notifySubscribers();
|
1794
|
-
};
|
1795
|
-
const result = await this.adapter.run({
|
1796
|
-
messages,
|
1797
|
-
abortSignal: this.abortController.signal,
|
1798
|
-
onUpdate: updateHandler
|
1799
|
-
});
|
1800
|
-
updateHandler(result);
|
1801
|
-
message.status = "done";
|
1802
|
-
this.repository.addOrUpdateMessage(parentId, { ...message });
|
1803
|
-
} catch (e) {
|
1804
|
-
message.status = "error";
|
1805
|
-
this.repository.addOrUpdateMessage(parentId, { ...message });
|
1806
|
-
console.error(e);
|
1807
|
-
} finally {
|
1808
|
-
this.abortController = null;
|
1809
|
-
this.notifySubscribers();
|
1810
|
-
}
|
1811
|
-
}
|
1812
|
-
cancelRun() {
|
1813
|
-
if (!this.abortController) return;
|
1814
|
-
this.abortController.abort();
|
1815
|
-
this.abortController = null;
|
1816
|
-
this.notifySubscribers();
|
1817
|
-
}
|
1818
|
-
notifySubscribers() {
|
1819
|
-
for (const callback of this._subscriptions) callback();
|
1820
|
-
}
|
1821
|
-
subscribe(callback) {
|
1822
|
-
this._subscriptions.add(callback);
|
1823
|
-
return () => this._subscriptions.delete(callback);
|
1824
|
-
}
|
1825
|
-
};
|
1826
|
-
|
1827
|
-
// src/runtime/local/useLocalRuntime.tsx
|
1828
|
-
var useLocalRuntime = (adapter) => {
|
1829
|
-
const [runtime] = useState7(() => new LocalRuntime(adapter));
|
1830
|
-
useInsertionEffect5(() => {
|
1831
|
-
runtime.adapter = adapter;
|
1832
|
-
});
|
1833
|
-
return runtime;
|
1226
|
+
var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
|
1227
|
+
return /* @__PURE__ */ jsx23(AssistantProvider, { runtime, children });
|
1834
1228
|
};
|
1229
|
+
var AssistantRuntimeProvider = memo(AssistantRuntimeProviderImpl);
|
1835
1230
|
export {
|
1836
1231
|
actionBar_exports as ActionBarPrimitive,
|
1837
1232
|
AssistantRuntimeProvider,
|
@@ -1840,23 +1235,11 @@ export {
|
|
1840
1235
|
contentPart_exports as ContentPartPrimitive,
|
1841
1236
|
message_exports as MessagePrimitive,
|
1842
1237
|
thread_exports as ThreadPrimitive,
|
1843
|
-
VercelAIAssistantProvider,
|
1844
|
-
VercelRSCAssistantProvider,
|
1845
|
-
getVercelAIMessage,
|
1846
|
-
getVercelRSCMessage,
|
1847
|
-
MessageRepository as unstable_MessageRepository,
|
1848
|
-
useComposerContext as unstable_useComposerContext,
|
1849
|
-
useContentPartContext as unstable_useContentPartContext,
|
1850
|
-
useLocalRuntime as unstable_useLocalRuntime,
|
1851
|
-
useMessageContext as unstable_useMessageContext,
|
1852
|
-
useThreadContext as unstable_useThreadContext,
|
1853
1238
|
useBeginMessageEdit,
|
1854
1239
|
useCopyMessage,
|
1855
1240
|
useGoToNextBranch,
|
1856
1241
|
useGoToPreviousBranch,
|
1857
|
-
|
1858
|
-
|
1859
|
-
useVercelUseAssistantRuntime,
|
1860
|
-
useVercelUseChatRuntime
|
1242
|
+
useLocalRuntime,
|
1243
|
+
useReloadMessage
|
1861
1244
|
};
|
1862
1245
|
//# sourceMappingURL=index.mjs.map
|