@assistant-ui/react 0.5.81 → 0.5.83
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/{chunk-CYIFAX4U.js → chunk-C6UZOY5A.js} +1 -1
- package/dist/chunk-C6UZOY5A.js.map +1 -0
- package/dist/{chunk-RHM73CQE.mjs → chunk-TWIMAOZR.mjs} +1 -1
- package/dist/chunk-TWIMAOZR.mjs.map +1 -0
- package/dist/{edge-rTP-G718.d.mts → edge-B3YIacNl.d.mts} +4 -1
- package/dist/{edge-rTP-G718.d.ts → edge-B3YIacNl.d.ts} +4 -1
- package/dist/edge.js.map +1 -1
- package/dist/edge.mjs.map +1 -1
- package/dist/index.d.mts +1869 -711
- package/dist/index.d.ts +1869 -711
- package/dist/index.js +769 -387
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +680 -298
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
- package/dist/chunk-CYIFAX4U.js.map +0 -1
- package/dist/chunk-RHM73CQE.mjs.map +0 -1
package/dist/index.mjs
CHANGED
@@ -10,13 +10,13 @@ import {
|
|
10
10
|
toLanguageModelMessages,
|
11
11
|
toLanguageModelTools,
|
12
12
|
toolResultStream
|
13
|
-
} from "./chunk-
|
13
|
+
} from "./chunk-TWIMAOZR.mjs";
|
14
14
|
import {
|
15
15
|
__export
|
16
16
|
} from "./chunk-BJPOCE4O.mjs";
|
17
17
|
|
18
18
|
// src/context/providers/AssistantRuntimeProvider.tsx
|
19
|
-
import { memo, useEffect as
|
19
|
+
import { memo, useEffect as useEffect3, useMemo as useMemo2, useState as useState3 } from "react";
|
20
20
|
|
21
21
|
// src/context/react/AssistantContext.ts
|
22
22
|
import { createContext } from "react";
|
@@ -86,6 +86,10 @@ var { useToolUIs, useToolUIsStore } = createContextStoreHook(
|
|
86
86
|
useAssistantContext,
|
87
87
|
"useToolUIs"
|
88
88
|
);
|
89
|
+
var { useThreadManager } = createContextStoreHook(
|
90
|
+
useAssistantContext,
|
91
|
+
"useThreadManager"
|
92
|
+
);
|
89
93
|
|
90
94
|
// src/context/stores/AssistantToolUIs.ts
|
91
95
|
import { create } from "zustand";
|
@@ -120,10 +124,10 @@ var makeAssistantToolUIsStore = () => create((set) => {
|
|
120
124
|
});
|
121
125
|
|
122
126
|
// src/context/providers/ThreadRuntimeProvider.tsx
|
123
|
-
import { useEffect, useMemo, useState } from "react";
|
127
|
+
import { useEffect as useEffect2, useMemo, useState as useState2 } from "react";
|
124
128
|
|
125
129
|
// src/context/react/ThreadContext.ts
|
126
|
-
import { createContext as createContext2 } from "react";
|
130
|
+
import { createContext as createContext2, useEffect, useState } from "react";
|
127
131
|
var ThreadContext = createContext2(null);
|
128
132
|
var useThreadContext = createContextHook(
|
129
133
|
ThreadContext,
|
@@ -156,6 +160,15 @@ var {
|
|
156
160
|
useViewport: useThreadViewport,
|
157
161
|
useViewportStore: useThreadViewportStore
|
158
162
|
} = createContextStoreHook(useThreadContext, "useViewport");
|
163
|
+
function useThreadModelConfig(options) {
|
164
|
+
const [, rerender] = useState({});
|
165
|
+
const runtime = useThreadRuntime(options);
|
166
|
+
useEffect(() => {
|
167
|
+
return runtime?.unstable_on("model-config-update", () => rerender({}));
|
168
|
+
}, [runtime]);
|
169
|
+
if (!runtime) return null;
|
170
|
+
return runtime?.getModelConfig();
|
171
|
+
}
|
159
172
|
|
160
173
|
// src/context/stores/ThreadViewport.tsx
|
161
174
|
import { create as create2 } from "zustand";
|
@@ -186,15 +199,15 @@ var writableStore = (store) => {
|
|
186
199
|
import { create as create3 } from "zustand";
|
187
200
|
import { jsx } from "react/jsx-runtime";
|
188
201
|
var useThreadRuntimeStore2 = (runtime) => {
|
189
|
-
const [store] =
|
190
|
-
|
202
|
+
const [store] = useState2(() => create3(() => runtime));
|
203
|
+
useEffect2(() => {
|
191
204
|
writableStore(store).setState(runtime, true);
|
192
205
|
}, [runtime, store]);
|
193
206
|
return store;
|
194
207
|
};
|
195
208
|
var useThreadStore2 = (runtime) => {
|
196
|
-
const [store] =
|
197
|
-
|
209
|
+
const [store] = useState2(() => create3(() => runtime.getState()));
|
210
|
+
useEffect2(() => {
|
198
211
|
const updateState = () => writableStore(store).setState(runtime.getState(), true);
|
199
212
|
updateState();
|
200
213
|
return runtime.subscribe(updateState);
|
@@ -202,8 +215,8 @@ var useThreadStore2 = (runtime) => {
|
|
202
215
|
return store;
|
203
216
|
};
|
204
217
|
var useThreadMessagesStore2 = (runtime) => {
|
205
|
-
const [store] =
|
206
|
-
|
218
|
+
const [store] = useState2(() => create3(() => runtime.messages));
|
219
|
+
useEffect2(() => {
|
207
220
|
const updateState = () => writableStore(store).setState(runtime.messages, true);
|
208
221
|
updateState();
|
209
222
|
return runtime.subscribe(updateState);
|
@@ -211,8 +224,8 @@ var useThreadMessagesStore2 = (runtime) => {
|
|
211
224
|
return store;
|
212
225
|
};
|
213
226
|
var useThreadComposerStore2 = (runtime) => {
|
214
|
-
const [store] =
|
215
|
-
|
227
|
+
const [store] = useState2(() => create3(() => runtime.getState()));
|
228
|
+
useEffect2(() => {
|
216
229
|
const updateState = () => writableStore(store).setState(runtime.getState(), true);
|
217
230
|
updateState();
|
218
231
|
return runtime.subscribe(updateState);
|
@@ -242,8 +255,8 @@ var ThreadRuntimeProvider = ({ children, runtime }) => {
|
|
242
255
|
import { create as create4 } from "zustand";
|
243
256
|
import { jsx as jsx2 } from "react/jsx-runtime";
|
244
257
|
var useAssistantRuntimeStore2 = (runtime) => {
|
245
|
-
const [store] =
|
246
|
-
|
258
|
+
const [store] = useState3(() => create4(() => runtime));
|
259
|
+
useEffect3(() => {
|
247
260
|
writableStore(store).setState(runtime, true);
|
248
261
|
}, [runtime, store]);
|
249
262
|
return store;
|
@@ -251,22 +264,35 @@ var useAssistantRuntimeStore2 = (runtime) => {
|
|
251
264
|
var useAssistantToolUIsStore = () => {
|
252
265
|
return useMemo2(() => makeAssistantToolUIsStore(), []);
|
253
266
|
};
|
267
|
+
var useThreadManagerStore = (runtime) => {
|
268
|
+
const [store] = useState3(
|
269
|
+
() => create4(() => runtime.threadManager.getState())
|
270
|
+
);
|
271
|
+
useEffect3(() => {
|
272
|
+
const updateState = () => writableStore(store).setState(runtime.threadManager.getState(), true);
|
273
|
+
updateState();
|
274
|
+
return runtime.threadManager.subscribe(updateState);
|
275
|
+
}, [runtime, store]);
|
276
|
+
return store;
|
277
|
+
};
|
254
278
|
var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
|
255
279
|
const useAssistantRuntime2 = useAssistantRuntimeStore2(runtime);
|
256
280
|
const useToolUIs2 = useAssistantToolUIsStore();
|
281
|
+
const useThreadManager2 = useThreadManagerStore(runtime);
|
257
282
|
const context = useMemo2(() => {
|
258
283
|
return {
|
259
284
|
useToolUIs: useToolUIs2,
|
260
285
|
useAssistantRuntime: useAssistantRuntime2,
|
261
|
-
useAssistantActions: useAssistantRuntime2
|
286
|
+
useAssistantActions: useAssistantRuntime2,
|
287
|
+
useThreadManager: useThreadManager2
|
262
288
|
};
|
263
|
-
}, [useAssistantRuntime2, useToolUIs2]);
|
289
|
+
}, [useAssistantRuntime2, useToolUIs2, useThreadManager2]);
|
264
290
|
return /* @__PURE__ */ jsx2(AssistantContext.Provider, { value: context, children: /* @__PURE__ */ jsx2(ThreadRuntimeProvider, { runtime: runtime.thread, children }) });
|
265
291
|
};
|
266
292
|
var AssistantRuntimeProvider = memo(AssistantRuntimeProviderImpl);
|
267
293
|
|
268
294
|
// src/context/providers/TextContentPartProvider.tsx
|
269
|
-
import { useEffect as
|
295
|
+
import { useEffect as useEffect4, useState as useState4 } from "react";
|
270
296
|
import { create as create5 } from "zustand";
|
271
297
|
|
272
298
|
// src/context/react/ContentPartContext.ts
|
@@ -295,6 +321,9 @@ var ContentPartRuntimeImpl = class {
|
|
295
321
|
this.messageApi = messageApi;
|
296
322
|
this.threadApi = threadApi;
|
297
323
|
}
|
324
|
+
get path() {
|
325
|
+
return this.contentBinding.path;
|
326
|
+
}
|
298
327
|
getState() {
|
299
328
|
return this.contentBinding.getState();
|
300
329
|
}
|
@@ -328,7 +357,7 @@ var RUNNING_STATUS = {
|
|
328
357
|
type: "running"
|
329
358
|
};
|
330
359
|
var TextContentPartProvider = ({ children, text, isRunning }) => {
|
331
|
-
const [context] =
|
360
|
+
const [context] = useState4(() => {
|
332
361
|
const useContentPartRuntime2 = create5(
|
333
362
|
// TODO
|
334
363
|
() => new ContentPartRuntimeImpl(null, null, null)
|
@@ -341,7 +370,7 @@ var TextContentPartProvider = ({ children, text, isRunning }) => {
|
|
341
370
|
}));
|
342
371
|
return { useContentPartRuntime: useContentPartRuntime2, useContentPart: useContentPart2 };
|
343
372
|
});
|
344
|
-
|
373
|
+
useEffect4(() => {
|
345
374
|
const state = context.useContentPart.getState();
|
346
375
|
const textUpdated = state.text !== text;
|
347
376
|
const targetStatus = isRunning ? RUNNING_STATUS : COMPLETE_STATUS;
|
@@ -432,11 +461,11 @@ var useSwitchToNewThread = () => {
|
|
432
461
|
};
|
433
462
|
|
434
463
|
// src/model-config/useAssistantTool.tsx
|
435
|
-
import { useEffect as
|
464
|
+
import { useEffect as useEffect5 } from "react";
|
436
465
|
var useAssistantTool = (tool) => {
|
437
466
|
const assistantRuntime = useAssistantRuntime();
|
438
467
|
const toolUIsStore = useToolUIsStore();
|
439
|
-
|
468
|
+
useEffect5(() => {
|
440
469
|
const { toolName, render, ...rest } = tool;
|
441
470
|
const config = {
|
442
471
|
tools: {
|
@@ -465,10 +494,10 @@ var makeAssistantTool = (tool) => {
|
|
465
494
|
};
|
466
495
|
|
467
496
|
// src/model-config/useAssistantToolUI.tsx
|
468
|
-
import { useEffect as
|
497
|
+
import { useEffect as useEffect6 } from "react";
|
469
498
|
var useAssistantToolUI = (tool) => {
|
470
499
|
const toolUIsStore = useToolUIsStore();
|
471
|
-
|
500
|
+
useEffect6(() => {
|
472
501
|
if (!tool) return;
|
473
502
|
const { toolName, render } = tool;
|
474
503
|
return toolUIsStore.getState().setToolUI(toolName, render);
|
@@ -486,10 +515,10 @@ var makeAssistantToolUI = (tool) => {
|
|
486
515
|
};
|
487
516
|
|
488
517
|
// src/model-config/useAssistantInstructions.tsx
|
489
|
-
import { useEffect as
|
518
|
+
import { useEffect as useEffect7 } from "react";
|
490
519
|
var useAssistantInstructions = (instruction) => {
|
491
520
|
const assistantRuntime = useAssistantRuntime();
|
492
|
-
|
521
|
+
useEffect7(() => {
|
493
522
|
const config = {
|
494
523
|
system: instruction
|
495
524
|
};
|
@@ -501,64 +530,23 @@ var useAssistantInstructions = (instruction) => {
|
|
501
530
|
|
502
531
|
// src/primitive-hooks/actionBar/useActionBarCopy.tsx
|
503
532
|
import { useCallback as useCallback3 } from "react";
|
504
|
-
|
505
|
-
// src/utils/combined/useCombinedStore.ts
|
506
|
-
import { useMemo as useMemo4 } from "react";
|
507
|
-
|
508
|
-
// src/utils/combined/createCombinedStore.ts
|
509
|
-
import { useSyncExternalStore } from "react";
|
510
|
-
var createCombinedStore = (stores) => {
|
511
|
-
const subscribe = (callback) => {
|
512
|
-
const unsubscribes = stores.map((store) => store.subscribe(callback));
|
513
|
-
return () => {
|
514
|
-
for (const unsub of unsubscribes) {
|
515
|
-
unsub();
|
516
|
-
}
|
517
|
-
};
|
518
|
-
};
|
519
|
-
return (selector) => {
|
520
|
-
const getSnapshot = () => selector(...stores.map((store) => store.getState()));
|
521
|
-
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
522
|
-
};
|
523
|
-
};
|
524
|
-
|
525
|
-
// src/utils/combined/useCombinedStore.ts
|
526
|
-
var useCombinedStore = (stores, selector) => {
|
527
|
-
const useCombined = useMemo4(() => createCombinedStore(stores), stores);
|
528
|
-
return useCombined(selector);
|
529
|
-
};
|
530
|
-
|
531
|
-
// src/utils/getThreadMessageText.tsx
|
532
|
-
var getThreadMessageText = (message) => {
|
533
|
-
const textParts = message.content.filter(
|
534
|
-
(part) => part.type === "text"
|
535
|
-
);
|
536
|
-
return textParts.map((part) => part.text).join("\n\n");
|
537
|
-
};
|
538
|
-
|
539
|
-
// src/primitive-hooks/actionBar/useActionBarCopy.tsx
|
540
533
|
var useActionBarCopy = ({
|
541
534
|
copiedDuration = 3e3
|
542
535
|
} = {}) => {
|
543
536
|
const messageRuntime = useMessageRuntime();
|
544
537
|
const composerRuntime = useComposerRuntime();
|
545
|
-
const
|
546
|
-
const hasCopyableContent =
|
547
|
-
|
548
|
-
|
549
|
-
return !c.isEditing && (message.role !== "assistant" || message.status.type !== "running") && message.content.some((c2) => c2.type === "text" && c2.text.length > 0);
|
550
|
-
}
|
551
|
-
);
|
538
|
+
const setIsCopied = useMessageUtils((s) => s.setIsCopied);
|
539
|
+
const hasCopyableContent = useMessage((message) => {
|
540
|
+
return (message.role !== "assistant" || message.status.type !== "running") && message.content.some((c) => c.type === "text" && c.text.length > 0);
|
541
|
+
});
|
552
542
|
const callback = useCallback3(() => {
|
553
|
-
const message = messageRuntime.getState();
|
554
|
-
const { setIsCopied } = messageUtilsStore.getState();
|
555
543
|
const { isEditing, text: composerValue } = composerRuntime.getState();
|
556
|
-
const valueToCopy = isEditing ? composerValue :
|
544
|
+
const valueToCopy = isEditing ? composerValue : messageRuntime.unstable_getCopyText();
|
557
545
|
navigator.clipboard.writeText(valueToCopy).then(() => {
|
558
546
|
setIsCopied(true);
|
559
547
|
setTimeout(() => setIsCopied(false), copiedDuration);
|
560
548
|
});
|
561
|
-
}, [messageRuntime,
|
549
|
+
}, [messageRuntime, setIsCopied, composerRuntime, copiedDuration]);
|
562
550
|
if (!hasCopyableContent) return null;
|
563
551
|
return callback;
|
564
552
|
};
|
@@ -577,6 +565,34 @@ var useActionBarEdit = () => {
|
|
577
565
|
|
578
566
|
// src/primitive-hooks/actionBar/useActionBarReload.tsx
|
579
567
|
import { useCallback as useCallback5 } from "react";
|
568
|
+
|
569
|
+
// src/utils/combined/useCombinedStore.ts
|
570
|
+
import { useMemo as useMemo4 } from "react";
|
571
|
+
|
572
|
+
// src/utils/combined/createCombinedStore.ts
|
573
|
+
import { useSyncExternalStore } from "react";
|
574
|
+
var createCombinedStore = (stores) => {
|
575
|
+
const subscribe = (callback) => {
|
576
|
+
const unsubscribes = stores.map((store) => store.subscribe(callback));
|
577
|
+
return () => {
|
578
|
+
for (const unsub of unsubscribes) {
|
579
|
+
unsub();
|
580
|
+
}
|
581
|
+
};
|
582
|
+
};
|
583
|
+
return (selector) => {
|
584
|
+
const getSnapshot = () => selector(...stores.map((store) => store.getState()));
|
585
|
+
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
586
|
+
};
|
587
|
+
};
|
588
|
+
|
589
|
+
// src/utils/combined/useCombinedStore.ts
|
590
|
+
var useCombinedStore = (stores, selector) => {
|
591
|
+
const useCombined = useMemo4(() => createCombinedStore(stores), stores);
|
592
|
+
return useCombined(selector);
|
593
|
+
};
|
594
|
+
|
595
|
+
// src/primitive-hooks/actionBar/useActionBarReload.tsx
|
580
596
|
var useActionBarReload = () => {
|
581
597
|
const messageRuntime = useMessageRuntime();
|
582
598
|
const threadRuntime = useThreadRuntime();
|
@@ -1084,7 +1100,7 @@ __export(assistantModal_exports, {
|
|
1084
1100
|
});
|
1085
1101
|
|
1086
1102
|
// src/primitives/assistantModal/AssistantModalRoot.tsx
|
1087
|
-
import { useEffect as
|
1103
|
+
import { useEffect as useEffect8, useState as useState5 } from "react";
|
1088
1104
|
import * as PopoverPrimitive2 from "@radix-ui/react-popover";
|
1089
1105
|
import { composeEventHandlers as composeEventHandlers6 } from "@radix-ui/primitive";
|
1090
1106
|
|
@@ -1098,10 +1114,10 @@ var useAssistantModalOpenState = ({
|
|
1098
1114
|
defaultOpen = false,
|
1099
1115
|
unstable_openOnRunStart = true
|
1100
1116
|
}) => {
|
1101
|
-
const state =
|
1117
|
+
const state = useState5(defaultOpen);
|
1102
1118
|
const [, setOpen] = state;
|
1103
1119
|
const threadRuntime = useThreadRuntime();
|
1104
|
-
|
1120
|
+
useEffect8(() => {
|
1105
1121
|
if (!unstable_openOnRunStart) return void 0;
|
1106
1122
|
return threadRuntime.unstable_on("run-start", () => {
|
1107
1123
|
setOpen(true);
|
@@ -1434,19 +1450,19 @@ MessagePrimitiveIf.displayName = "MessagePrimitive.If";
|
|
1434
1450
|
import { memo as memo2, useMemo as useMemo6 } from "react";
|
1435
1451
|
|
1436
1452
|
// src/context/providers/ContentPartRuntimeProvider.tsx
|
1437
|
-
import { useEffect as
|
1453
|
+
import { useEffect as useEffect9, useState as useState6 } from "react";
|
1438
1454
|
import { create as create6 } from "zustand";
|
1439
1455
|
import { jsx as jsx19 } from "react/jsx-runtime";
|
1440
1456
|
var useContentPartRuntimeStore = (runtime) => {
|
1441
|
-
const [store] =
|
1442
|
-
|
1457
|
+
const [store] = useState6(() => create6(() => runtime));
|
1458
|
+
useEffect9(() => {
|
1443
1459
|
writableStore(store).setState(runtime, true);
|
1444
1460
|
}, [runtime, store]);
|
1445
1461
|
return store;
|
1446
1462
|
};
|
1447
1463
|
var useContentPartStore2 = (runtime) => {
|
1448
|
-
const [store] =
|
1449
|
-
|
1464
|
+
const [store] = useState6(() => create6(() => runtime.getState()));
|
1465
|
+
useEffect9(() => {
|
1450
1466
|
const updateState = () => writableStore(store).setState(runtime.getState(), true);
|
1451
1467
|
updateState();
|
1452
1468
|
return runtime.subscribe(updateState);
|
@@ -1459,7 +1475,7 @@ var ContentPartRuntimeProvider = ({
|
|
1459
1475
|
}) => {
|
1460
1476
|
const useContentPartRuntime2 = useContentPartRuntimeStore(runtime);
|
1461
1477
|
const useContentPart2 = useContentPartStore2(runtime);
|
1462
|
-
const [context] =
|
1478
|
+
const [context] = useState6(() => {
|
1463
1479
|
return { useContentPartRuntime: useContentPartRuntime2, useContentPart: useContentPart2 };
|
1464
1480
|
});
|
1465
1481
|
return /* @__PURE__ */ jsx19(ContentPartContext.Provider, { value: context, children });
|
@@ -1471,7 +1487,7 @@ import {
|
|
1471
1487
|
} from "react";
|
1472
1488
|
|
1473
1489
|
// src/utils/smooth/useSmooth.tsx
|
1474
|
-
import { useEffect as
|
1490
|
+
import { useEffect as useEffect10, useMemo as useMemo5, useRef as useRef2, useState as useState8 } from "react";
|
1475
1491
|
import { useCallbackRef } from "@radix-ui/react-use-callback-ref";
|
1476
1492
|
|
1477
1493
|
// src/utils/smooth/SmoothContext.tsx
|
@@ -1479,7 +1495,7 @@ import {
|
|
1479
1495
|
createContext as createContext6,
|
1480
1496
|
forwardRef as forwardRef13,
|
1481
1497
|
useContext as useContext3,
|
1482
|
-
useState as
|
1498
|
+
useState as useState7
|
1483
1499
|
} from "react";
|
1484
1500
|
import { create as create7 } from "zustand";
|
1485
1501
|
import { jsx as jsx20 } from "react/jsx-runtime";
|
@@ -1491,7 +1507,7 @@ var makeSmoothContext = (initialState) => {
|
|
1491
1507
|
var SmoothContextProvider = ({ children }) => {
|
1492
1508
|
const outer = useSmoothContext({ optional: true });
|
1493
1509
|
const contentPartStore = useContentPartStore();
|
1494
|
-
const [context] =
|
1510
|
+
const [context] = useState7(
|
1495
1511
|
() => makeSmoothContext(contentPartStore.getState().status)
|
1496
1512
|
);
|
1497
1513
|
if (outer) return children;
|
@@ -1572,7 +1588,7 @@ var useSmooth = (state, smooth = false) => {
|
|
1572
1588
|
selector: (m) => m.id
|
1573
1589
|
});
|
1574
1590
|
const idRef = useRef2(id);
|
1575
|
-
const [displayedText, setDisplayedText] =
|
1591
|
+
const [displayedText, setDisplayedText] = useState8(text);
|
1576
1592
|
const smoothStatusStore = useSmoothStatusStore({ optional: true });
|
1577
1593
|
const setText = useCallbackRef((text2) => {
|
1578
1594
|
setDisplayedText(text2);
|
@@ -1582,17 +1598,17 @@ var useSmooth = (state, smooth = false) => {
|
|
1582
1598
|
);
|
1583
1599
|
}
|
1584
1600
|
});
|
1585
|
-
|
1601
|
+
useEffect10(() => {
|
1586
1602
|
if (smoothStatusStore) {
|
1587
1603
|
writableStore(smoothStatusStore).setState(
|
1588
1604
|
text !== state.text ? SMOOTH_STATUS : state.status
|
1589
1605
|
);
|
1590
1606
|
}
|
1591
1607
|
}, [smoothStatusStore, text, displayedText, state.status, state.text]);
|
1592
|
-
const [animatorRef] =
|
1608
|
+
const [animatorRef] = useState8(
|
1593
1609
|
new TextStreamAnimator(text, setText)
|
1594
1610
|
);
|
1595
|
-
|
1611
|
+
useEffect10(() => {
|
1596
1612
|
if (!smooth) {
|
1597
1613
|
animatorRef.stop();
|
1598
1614
|
return;
|
@@ -1608,7 +1624,7 @@ var useSmooth = (state, smooth = false) => {
|
|
1608
1624
|
animatorRef.targetText = text;
|
1609
1625
|
animatorRef.start();
|
1610
1626
|
}, [setText, animatorRef, id, smooth, text]);
|
1611
|
-
|
1627
|
+
useEffect10(() => {
|
1612
1628
|
return () => {
|
1613
1629
|
animatorRef.stop();
|
1614
1630
|
};
|
@@ -1656,11 +1672,22 @@ var ContentPartPrimitiveInProgress = ({ children }) => {
|
|
1656
1672
|
};
|
1657
1673
|
ContentPartPrimitiveInProgress.displayName = "ContentPartPrimitive.InProgress";
|
1658
1674
|
|
1675
|
+
// src/utils/getThreadMessageText.tsx
|
1676
|
+
var getThreadMessageText = (message) => {
|
1677
|
+
const textParts = message.content.filter(
|
1678
|
+
(part) => part.type === "text"
|
1679
|
+
);
|
1680
|
+
return textParts.map((part) => part.text).join("\n\n");
|
1681
|
+
};
|
1682
|
+
|
1659
1683
|
// src/api/AttachmentRuntime.ts
|
1660
1684
|
var AttachmentRuntimeImpl = class {
|
1661
1685
|
constructor(_core) {
|
1662
1686
|
this._core = _core;
|
1663
1687
|
}
|
1688
|
+
get path() {
|
1689
|
+
return this._core.path;
|
1690
|
+
}
|
1664
1691
|
getState() {
|
1665
1692
|
return this._core.getState();
|
1666
1693
|
}
|
@@ -1739,6 +1766,9 @@ var LazyMemoizeSubject = class extends BaseSubject {
|
|
1739
1766
|
super();
|
1740
1767
|
this.binding = binding;
|
1741
1768
|
}
|
1769
|
+
get path() {
|
1770
|
+
return this.binding.path;
|
1771
|
+
}
|
1742
1772
|
_previousStateDirty = true;
|
1743
1773
|
_previousState;
|
1744
1774
|
getState = () => {
|
@@ -1785,6 +1815,9 @@ var ShallowMemoizeSubject = class extends BaseSubject {
|
|
1785
1815
|
throw new Error("Entry not available in the store");
|
1786
1816
|
this._previousState = state;
|
1787
1817
|
}
|
1818
|
+
get path() {
|
1819
|
+
return this.binding.path;
|
1820
|
+
}
|
1788
1821
|
_previousState;
|
1789
1822
|
getState = () => {
|
1790
1823
|
if (!this.isConnected) this._syncState();
|
@@ -1851,6 +1884,9 @@ var ComposerRuntimeImpl = class {
|
|
1851
1884
|
constructor(_core) {
|
1852
1885
|
this._core = _core;
|
1853
1886
|
}
|
1887
|
+
get path() {
|
1888
|
+
return this._core.path;
|
1889
|
+
}
|
1854
1890
|
/**
|
1855
1891
|
* @deprecated Use `getState().isEditing` instead. This will be removed in 0.6.0.
|
1856
1892
|
*/
|
@@ -1936,16 +1972,21 @@ var ComposerRuntimeImpl = class {
|
|
1936
1972
|
}
|
1937
1973
|
};
|
1938
1974
|
var ThreadComposerRuntimeImpl = class extends ComposerRuntimeImpl {
|
1975
|
+
get path() {
|
1976
|
+
return this._core.path;
|
1977
|
+
}
|
1939
1978
|
get type() {
|
1940
1979
|
return "thread";
|
1941
1980
|
}
|
1942
1981
|
_getState;
|
1943
1982
|
constructor(core) {
|
1944
1983
|
const stateBinding = new LazyMemoizeSubject({
|
1984
|
+
path: core.path,
|
1945
1985
|
getState: () => getThreadComposerState(core.getState()),
|
1946
1986
|
subscribe: (callback) => core.subscribe(callback)
|
1947
1987
|
});
|
1948
1988
|
super({
|
1989
|
+
path: core.path,
|
1949
1990
|
getState: () => core.getState(),
|
1950
1991
|
subscribe: (callback) => stateBinding.subscribe(callback)
|
1951
1992
|
});
|
@@ -1960,6 +2001,12 @@ var ThreadComposerRuntimeImpl = class extends ComposerRuntimeImpl {
|
|
1960
2001
|
getAttachmentByIndex(idx) {
|
1961
2002
|
return new ThreadComposerAttachmentRuntimeImpl(
|
1962
2003
|
new ShallowMemoizeSubject({
|
2004
|
+
path: {
|
2005
|
+
...this.path,
|
2006
|
+
attachmentSource: "thread-composer",
|
2007
|
+
attachmentSelector: { type: "index", index: idx },
|
2008
|
+
ref: this.path.ref + `${this.path.ref}.attachments[${idx}]`
|
2009
|
+
},
|
1963
2010
|
getState: () => {
|
1964
2011
|
const attachments = this.getState().attachments;
|
1965
2012
|
const attachment = attachments[idx];
|
@@ -1979,16 +2026,21 @@ var ThreadComposerRuntimeImpl = class extends ComposerRuntimeImpl {
|
|
1979
2026
|
var EditComposerRuntimeImpl = class extends ComposerRuntimeImpl {
|
1980
2027
|
constructor(core, _beginEdit) {
|
1981
2028
|
const stateBinding = new LazyMemoizeSubject({
|
2029
|
+
path: core.path,
|
1982
2030
|
getState: () => getEditComposerState(core.getState(), this._beginEdit),
|
1983
2031
|
subscribe: (callback) => core.subscribe(callback)
|
1984
2032
|
});
|
1985
2033
|
super({
|
2034
|
+
path: core.path,
|
1986
2035
|
getState: () => core.getState(),
|
1987
2036
|
subscribe: (callback) => stateBinding.subscribe(callback)
|
1988
2037
|
});
|
1989
2038
|
this._beginEdit = _beginEdit;
|
1990
2039
|
this._getState = stateBinding.getState.bind(stateBinding);
|
1991
2040
|
}
|
2041
|
+
get path() {
|
2042
|
+
return this._core.path;
|
2043
|
+
}
|
1992
2044
|
get type() {
|
1993
2045
|
return "edit";
|
1994
2046
|
}
|
@@ -2008,6 +2060,12 @@ var EditComposerRuntimeImpl = class extends ComposerRuntimeImpl {
|
|
2008
2060
|
getAttachmentByIndex(idx) {
|
2009
2061
|
return new EditComposerAttachmentRuntimeImpl(
|
2010
2062
|
new ShallowMemoizeSubject({
|
2063
|
+
path: {
|
2064
|
+
...this.path,
|
2065
|
+
attachmentSource: "edit-composer",
|
2066
|
+
attachmentSelector: { type: "index", index: idx },
|
2067
|
+
ref: this.path.ref + `${this.path.ref}.attachments[${idx}]`
|
2068
|
+
},
|
2011
2069
|
getState: () => {
|
2012
2070
|
const attachments = this.getState().attachments;
|
2013
2071
|
const attachment = attachments[idx];
|
@@ -2031,6 +2089,9 @@ var NestedSubscriptionSubject = class extends BaseSubject {
|
|
2031
2089
|
super();
|
2032
2090
|
this.binding = binding;
|
2033
2091
|
}
|
2092
|
+
get path() {
|
2093
|
+
return this.binding.path;
|
2094
|
+
}
|
2034
2095
|
getState() {
|
2035
2096
|
return this.binding.getState();
|
2036
2097
|
}
|
@@ -2097,14 +2158,23 @@ var MessageRuntimeImpl = class {
|
|
2097
2158
|
constructor(_core, _threadBinding) {
|
2098
2159
|
this._core = _core;
|
2099
2160
|
this._threadBinding = _threadBinding;
|
2161
|
+
this.composer = new EditComposerRuntimeImpl(
|
2162
|
+
new NestedSubscriptionSubject({
|
2163
|
+
path: {
|
2164
|
+
...this.path,
|
2165
|
+
ref: this.path.ref + `${this.path.ref}.composer`,
|
2166
|
+
composerSource: "edit"
|
2167
|
+
},
|
2168
|
+
getState: () => this._threadBinding.getState().getEditComposer(this._core.getState().id),
|
2169
|
+
subscribe: (callback) => this._threadBinding.subscribe(callback)
|
2170
|
+
}),
|
2171
|
+
() => this._threadBinding.getState().beginEdit(this._core.getState().id)
|
2172
|
+
);
|
2100
2173
|
}
|
2101
|
-
|
2102
|
-
|
2103
|
-
|
2104
|
-
|
2105
|
-
}),
|
2106
|
-
() => this._threadBinding.getState().beginEdit(this._core.getState().id)
|
2107
|
-
);
|
2174
|
+
get path() {
|
2175
|
+
return this._core.path;
|
2176
|
+
}
|
2177
|
+
composer;
|
2108
2178
|
getState() {
|
2109
2179
|
return this._core.getState();
|
2110
2180
|
}
|
@@ -2160,13 +2230,21 @@ var MessageRuntimeImpl = class {
|
|
2160
2230
|
if (!targetBranch) throw new Error("Branch not found");
|
2161
2231
|
this._threadBinding.getState().switchToBranch(targetBranch);
|
2162
2232
|
}
|
2233
|
+
unstable_getCopyText() {
|
2234
|
+
return getThreadMessageText(this.getState());
|
2235
|
+
}
|
2163
2236
|
subscribe(callback) {
|
2164
2237
|
return this._core.subscribe(callback);
|
2165
2238
|
}
|
2166
2239
|
getContentPartByIndex(idx) {
|
2167
|
-
if (idx < 0) throw new Error("
|
2240
|
+
if (idx < 0) throw new Error("Content part index must be >= 0");
|
2168
2241
|
return new ContentPartRuntimeImpl(
|
2169
2242
|
new ShallowMemoizeSubject({
|
2243
|
+
path: {
|
2244
|
+
...this.path,
|
2245
|
+
ref: this.path.ref + `${this.path.ref}.content[${idx}]`,
|
2246
|
+
contentPartSelector: { type: "index", index: idx }
|
2247
|
+
},
|
2170
2248
|
getState: () => {
|
2171
2249
|
return getContentPartState(this.getState(), idx);
|
2172
2250
|
},
|
@@ -2176,9 +2254,37 @@ var MessageRuntimeImpl = class {
|
|
2176
2254
|
this._threadBinding
|
2177
2255
|
);
|
2178
2256
|
}
|
2257
|
+
getContentPartByToolCallId(toolCallId) {
|
2258
|
+
return new ContentPartRuntimeImpl(
|
2259
|
+
new ShallowMemoizeSubject({
|
2260
|
+
path: {
|
2261
|
+
...this.path,
|
2262
|
+
ref: this.path.ref + `${this.path.ref}.content[toolCallId=${JSON.stringify(toolCallId)}]`,
|
2263
|
+
contentPartSelector: { type: "toolCallId", toolCallId }
|
2264
|
+
},
|
2265
|
+
getState: () => {
|
2266
|
+
const state = this._core.getState();
|
2267
|
+
const idx = state.content.findIndex(
|
2268
|
+
(part) => part.type === "tool-call" && part.toolCallId === toolCallId
|
2269
|
+
);
|
2270
|
+
if (idx === -1) return SKIP_UPDATE;
|
2271
|
+
return getContentPartState(state, idx);
|
2272
|
+
},
|
2273
|
+
subscribe: (callback) => this._core.subscribe(callback)
|
2274
|
+
}),
|
2275
|
+
this._core,
|
2276
|
+
this._threadBinding
|
2277
|
+
);
|
2278
|
+
}
|
2179
2279
|
getAttachmentByIndex(idx) {
|
2180
2280
|
return new MessageAttachmentRuntimeImpl(
|
2181
2281
|
new ShallowMemoizeSubject({
|
2282
|
+
path: {
|
2283
|
+
...this.path,
|
2284
|
+
ref: this.path.ref + `${this.path.ref}.attachments[${idx}]`,
|
2285
|
+
attachmentSource: "message",
|
2286
|
+
attachmentSelector: { type: "index", index: idx }
|
2287
|
+
},
|
2182
2288
|
getState: () => {
|
2183
2289
|
const attachments = this.getState().attachments;
|
2184
2290
|
const attachment = attachments?.[idx];
|
@@ -2285,22 +2391,22 @@ import { memo as memo3, useMemo as useMemo8 } from "react";
|
|
2285
2391
|
|
2286
2392
|
// src/context/providers/AttachmentRuntimeProvider.tsx
|
2287
2393
|
import {
|
2288
|
-
useEffect as
|
2394
|
+
useEffect as useEffect11,
|
2289
2395
|
useMemo as useMemo7,
|
2290
|
-
useState as
|
2396
|
+
useState as useState9
|
2291
2397
|
} from "react";
|
2292
2398
|
import { create as create8 } from "zustand";
|
2293
2399
|
import { jsx as jsx24 } from "react/jsx-runtime";
|
2294
2400
|
var useAttachmentRuntimeStore = (runtime) => {
|
2295
|
-
const [store] =
|
2296
|
-
|
2401
|
+
const [store] = useState9(() => create8(() => runtime));
|
2402
|
+
useEffect11(() => {
|
2297
2403
|
writableStore(store).setState(runtime, true);
|
2298
2404
|
}, [runtime, store]);
|
2299
2405
|
return store;
|
2300
2406
|
};
|
2301
2407
|
var useAttachmentStore = (runtime) => {
|
2302
|
-
const [store] =
|
2303
|
-
|
2408
|
+
const [store] = useState9(() => create8(() => runtime.getState()));
|
2409
|
+
useEffect11(() => {
|
2304
2410
|
const updateState = () => writableStore(store).setState(runtime.getState(), true);
|
2305
2411
|
updateState();
|
2306
2412
|
return runtime.subscribe(updateState);
|
@@ -2426,7 +2532,7 @@ import { Slot } from "@radix-ui/react-slot";
|
|
2426
2532
|
import {
|
2427
2533
|
forwardRef as forwardRef18,
|
2428
2534
|
useCallback as useCallback20,
|
2429
|
-
useEffect as
|
2535
|
+
useEffect as useEffect13,
|
2430
2536
|
useRef as useRef3
|
2431
2537
|
} from "react";
|
2432
2538
|
import TextareaAutosize from "react-textarea-autosize";
|
@@ -2434,11 +2540,11 @@ import { useEscapeKeydown as useEscapeKeydown2 } from "@radix-ui/react-use-escap
|
|
2434
2540
|
|
2435
2541
|
// src/utils/hooks/useOnScrollToBottom.tsx
|
2436
2542
|
import { useCallbackRef as useCallbackRef2 } from "@radix-ui/react-use-callback-ref";
|
2437
|
-
import { useEffect as
|
2543
|
+
import { useEffect as useEffect12 } from "react";
|
2438
2544
|
var useOnScrollToBottom = (callback) => {
|
2439
2545
|
const callbackRef = useCallbackRef2(callback);
|
2440
2546
|
const onScrollToBottom = useThreadViewport((vp) => vp.onScrollToBottom);
|
2441
|
-
|
2547
|
+
useEffect12(() => {
|
2442
2548
|
return onScrollToBottom(callbackRef);
|
2443
2549
|
}, [onScrollToBottom, callbackRef]);
|
2444
2550
|
};
|
@@ -2497,18 +2603,18 @@ var ComposerPrimitiveInput = forwardRef18(
|
|
2497
2603
|
textareaRef.current.value.length
|
2498
2604
|
);
|
2499
2605
|
}, [autoFocusEnabled]);
|
2500
|
-
|
2606
|
+
useEffect13(() => focus2(), [focus2]);
|
2501
2607
|
useOnScrollToBottom(() => {
|
2502
2608
|
if (composerRuntime.type === "thread" && unstable_focusOnScrollToBottom) {
|
2503
2609
|
focus2();
|
2504
2610
|
}
|
2505
2611
|
});
|
2506
|
-
|
2612
|
+
useEffect13(() => {
|
2507
2613
|
if (composerRuntime.type !== "thread" || !unstable_focusOnRunStart)
|
2508
2614
|
return void 0;
|
2509
2615
|
return threadRuntime.unstable_on("run-start", focus2);
|
2510
2616
|
}, [unstable_focusOnRunStart]);
|
2511
|
-
|
2617
|
+
useEffect13(() => {
|
2512
2618
|
if (composerRuntime.type !== "thread" || !unstable_focusOnThreadSwitched)
|
2513
2619
|
return void 0;
|
2514
2620
|
return threadRuntime.unstable_on("switched-to", focus2);
|
@@ -2665,7 +2771,7 @@ import { forwardRef as forwardRef20 } from "react";
|
|
2665
2771
|
|
2666
2772
|
// src/primitive-hooks/thread/useThreadViewportAutoScroll.tsx
|
2667
2773
|
import { useComposedRefs as useComposedRefs3 } from "@radix-ui/react-compose-refs";
|
2668
|
-
import { useEffect as
|
2774
|
+
import { useEffect as useEffect14, useRef as useRef4 } from "react";
|
2669
2775
|
|
2670
2776
|
// src/utils/hooks/useOnResizeContent.tsx
|
2671
2777
|
import { useCallbackRef as useCallbackRef3 } from "@radix-ui/react-use-callback-ref";
|
@@ -2757,7 +2863,7 @@ var useThreadViewportAutoScroll = ({
|
|
2757
2863
|
scrollToBottom("auto");
|
2758
2864
|
});
|
2759
2865
|
const threadRuntime = useThreadRuntime();
|
2760
|
-
|
2866
|
+
useEffect14(() => {
|
2761
2867
|
if (!unstable_scrollToBottomOnRunStart) return void 0;
|
2762
2868
|
return threadRuntime.unstable_on("run-start", focus);
|
2763
2869
|
}, [unstable_scrollToBottomOnRunStart]);
|
@@ -2779,7 +2885,7 @@ ThreadPrimitiveViewport.displayName = "ThreadPrimitive.Viewport";
|
|
2779
2885
|
import { memo as memo5, useMemo as useMemo10 } from "react";
|
2780
2886
|
|
2781
2887
|
// src/context/providers/MessageRuntimeProvider.tsx
|
2782
|
-
import { useEffect as
|
2888
|
+
import { useEffect as useEffect15, useState as useState10 } from "react";
|
2783
2889
|
import { create as create10 } from "zustand";
|
2784
2890
|
|
2785
2891
|
// src/context/stores/MessageUtils.ts
|
@@ -2800,15 +2906,15 @@ var makeMessageUtilsStore = () => create9((set) => {
|
|
2800
2906
|
// src/context/providers/MessageRuntimeProvider.tsx
|
2801
2907
|
import { jsx as jsx32 } from "react/jsx-runtime";
|
2802
2908
|
var useMessageRuntimeStore = (runtime) => {
|
2803
|
-
const [store] =
|
2804
|
-
|
2909
|
+
const [store] = useState10(() => create10(() => runtime));
|
2910
|
+
useEffect15(() => {
|
2805
2911
|
writableStore(store).setState(runtime, true);
|
2806
2912
|
}, [runtime, store]);
|
2807
2913
|
return store;
|
2808
2914
|
};
|
2809
2915
|
var useMessageStore2 = (runtime) => {
|
2810
|
-
const [store] =
|
2811
|
-
|
2916
|
+
const [store] = useState10(() => create10(() => runtime.getState()));
|
2917
|
+
useEffect15(() => {
|
2812
2918
|
const updateState = () => writableStore(store).setState(runtime.getState(), true);
|
2813
2919
|
updateState();
|
2814
2920
|
return runtime.subscribe(updateState);
|
@@ -2816,13 +2922,13 @@ var useMessageStore2 = (runtime) => {
|
|
2816
2922
|
return store;
|
2817
2923
|
};
|
2818
2924
|
var useMessageUtilsStore2 = () => {
|
2819
|
-
const [store] =
|
2925
|
+
const [store] = useState10(() => makeMessageUtilsStore());
|
2820
2926
|
return store;
|
2821
2927
|
};
|
2822
2928
|
var useEditComposerStore2 = (useMessageRuntime2) => {
|
2823
2929
|
const runtime = useMessageRuntime2.getState().composer;
|
2824
|
-
const [store] =
|
2825
|
-
|
2930
|
+
const [store] = useState10(() => create10(() => runtime.getState()));
|
2931
|
+
useEffect15(() => {
|
2826
2932
|
const updateState = () => writableStore(store).setState(runtime.getState());
|
2827
2933
|
updateState();
|
2828
2934
|
return runtime.subscribe(updateState);
|
@@ -2837,7 +2943,7 @@ var MessageRuntimeProvider = ({
|
|
2837
2943
|
const useMessage2 = useMessageStore2(runtime);
|
2838
2944
|
const useMessageUtils2 = useMessageUtilsStore2();
|
2839
2945
|
const useEditComposer2 = useEditComposerStore2(useMessageRuntime2);
|
2840
|
-
const [context] =
|
2946
|
+
const [context] = useState10(() => {
|
2841
2947
|
return { useMessageRuntime: useMessageRuntime2, useMessage: useMessage2, useMessageUtils: useMessageUtils2, useEditComposer: useEditComposer2 };
|
2842
2948
|
});
|
2843
2949
|
return /* @__PURE__ */ jsx32(MessageContext.Provider, { value: context, children });
|
@@ -2929,13 +3035,13 @@ var subscribeToMainThread = (runtime, callback) => {
|
|
2929
3035
|
let cleanup;
|
2930
3036
|
const inner = () => {
|
2931
3037
|
cleanup?.();
|
2932
|
-
cleanup = runtime.
|
3038
|
+
cleanup = runtime.threadManager.mainThread.subscribe(callback);
|
2933
3039
|
if (!first) {
|
2934
3040
|
callback();
|
2935
3041
|
}
|
2936
3042
|
first = false;
|
2937
3043
|
};
|
2938
|
-
const unsubscribe = runtime.subscribe(inner);
|
3044
|
+
const unsubscribe = runtime.threadManager.mainThread.subscribe(inner);
|
2939
3045
|
inner();
|
2940
3046
|
return () => {
|
2941
3047
|
unsubscribe();
|
@@ -2944,29 +3050,44 @@ var subscribeToMainThread = (runtime, callback) => {
|
|
2944
3050
|
};
|
2945
3051
|
|
2946
3052
|
// src/runtimes/local/useLocalRuntime.tsx
|
2947
|
-
import {
|
3053
|
+
import { useEffect as useEffect16, useMemo as useMemo11, useState as useState12 } from "react";
|
2948
3054
|
|
2949
|
-
// src/
|
2950
|
-
var
|
2951
|
-
|
2952
|
-
|
2953
|
-
this.
|
3055
|
+
// src/utils/ProxyConfigProvider.ts
|
3056
|
+
var ProxyConfigProvider = class {
|
3057
|
+
_providers = /* @__PURE__ */ new Set();
|
3058
|
+
getModelConfig() {
|
3059
|
+
return mergeModelConfigs(this._providers);
|
2954
3060
|
}
|
2955
|
-
|
2956
|
-
|
3061
|
+
registerModelConfigProvider(provider) {
|
3062
|
+
this._providers.add(provider);
|
3063
|
+
const unsubscribe = provider.subscribe?.(() => {
|
3064
|
+
this.notifySubscribers();
|
3065
|
+
});
|
3066
|
+
this.notifySubscribers();
|
3067
|
+
return () => {
|
3068
|
+
this._providers.delete(provider);
|
3069
|
+
unsubscribe?.();
|
3070
|
+
this.notifySubscribers();
|
3071
|
+
};
|
2957
3072
|
}
|
2958
|
-
|
2959
|
-
|
2960
|
-
this.
|
3073
|
+
_subscribers = /* @__PURE__ */ new Set();
|
3074
|
+
notifySubscribers() {
|
3075
|
+
for (const callback of this._subscribers) callback();
|
2961
3076
|
}
|
2962
|
-
_subscriptions = /* @__PURE__ */ new Set();
|
2963
3077
|
subscribe(callback) {
|
2964
|
-
this.
|
2965
|
-
return () => this.
|
3078
|
+
this._subscribers.add(callback);
|
3079
|
+
return () => this._subscribers.delete(callback);
|
3080
|
+
}
|
3081
|
+
};
|
3082
|
+
|
3083
|
+
// src/runtimes/core/BaseAssistantRuntimeCore.tsx
|
3084
|
+
var BaseAssistantRuntimeCore = class {
|
3085
|
+
_proxyConfigProvider = new ProxyConfigProvider();
|
3086
|
+
constructor() {
|
3087
|
+
}
|
3088
|
+
registerModelConfigProvider(provider) {
|
3089
|
+
return this._proxyConfigProvider.registerModelConfigProvider(provider);
|
2966
3090
|
}
|
2967
|
-
subscriptionHandler = () => {
|
2968
|
-
for (const callback of this._subscriptions) callback();
|
2969
|
-
};
|
2970
3091
|
};
|
2971
3092
|
|
2972
3093
|
// src/internal.ts
|
@@ -3102,20 +3223,6 @@ var DefaultThreadComposerRuntimeCore = class extends BaseComposerRuntimeCore {
|
|
3102
3223
|
}
|
3103
3224
|
};
|
3104
3225
|
|
3105
|
-
// src/utils/ProxyConfigProvider.ts
|
3106
|
-
var ProxyConfigProvider = class {
|
3107
|
-
_providers = /* @__PURE__ */ new Set();
|
3108
|
-
getModelConfig() {
|
3109
|
-
return mergeModelConfigs(this._providers);
|
3110
|
-
}
|
3111
|
-
registerModelConfigProvider(provider) {
|
3112
|
-
this._providers.add(provider);
|
3113
|
-
return () => {
|
3114
|
-
this._providers.delete(provider);
|
3115
|
-
};
|
3116
|
-
}
|
3117
|
-
};
|
3118
|
-
|
3119
3226
|
// src/utils/idUtils.tsx
|
3120
3227
|
import { customAlphabet } from "nanoid/non-secure";
|
3121
3228
|
var generateId = customAlphabet(
|
@@ -3495,7 +3602,9 @@ var getThreadState = (runtime) => {
|
|
3495
3602
|
});
|
3496
3603
|
};
|
3497
3604
|
var ThreadRuntimeImpl = class {
|
3498
|
-
|
3605
|
+
get path() {
|
3606
|
+
return this._threadBinding.path;
|
3607
|
+
}
|
3499
3608
|
/**
|
3500
3609
|
* @deprecated Use `getState().threadId` instead. This will be removed in 0.6.0.
|
3501
3610
|
*/
|
@@ -3550,22 +3659,30 @@ var ThreadRuntimeImpl = class {
|
|
3550
3659
|
_threadBinding;
|
3551
3660
|
constructor(threadBinding) {
|
3552
3661
|
const stateBinding = new LazyMemoizeSubject({
|
3662
|
+
path: threadBinding.path,
|
3553
3663
|
getState: () => getThreadState(threadBinding.getState()),
|
3554
3664
|
subscribe: (callback) => threadBinding.subscribe(callback)
|
3555
3665
|
});
|
3556
3666
|
this._threadBinding = {
|
3667
|
+
path: threadBinding.path,
|
3557
3668
|
getState: () => threadBinding.getState(),
|
3558
3669
|
getStateState: () => stateBinding.getState(),
|
3559
3670
|
outerSubscribe: (callback) => threadBinding.outerSubscribe(callback),
|
3560
3671
|
subscribe: (callback) => threadBinding.subscribe(callback)
|
3561
3672
|
};
|
3673
|
+
this.composer = new ThreadComposerRuntimeImpl(
|
3674
|
+
new NestedSubscriptionSubject({
|
3675
|
+
path: {
|
3676
|
+
...this.path,
|
3677
|
+
ref: this.path.ref + `${this.path.ref}.composer`,
|
3678
|
+
composerSource: "thread"
|
3679
|
+
},
|
3680
|
+
getState: () => this._threadBinding.getState().composer,
|
3681
|
+
subscribe: (callback) => this._threadBinding.subscribe(callback)
|
3682
|
+
})
|
3683
|
+
);
|
3562
3684
|
}
|
3563
|
-
composer
|
3564
|
-
new NestedSubscriptionSubject({
|
3565
|
-
getState: () => this._threadBinding.getState().composer,
|
3566
|
-
subscribe: (callback) => this._threadBinding.subscribe(callback)
|
3567
|
-
})
|
3568
|
-
);
|
3685
|
+
composer;
|
3569
3686
|
getState() {
|
3570
3687
|
return this._threadBinding.getStateState();
|
3571
3688
|
}
|
@@ -3643,20 +3760,49 @@ var ThreadRuntimeImpl = class {
|
|
3643
3760
|
}
|
3644
3761
|
getMesssageByIndex(idx) {
|
3645
3762
|
if (idx < 0) throw new Error("Message index must be >= 0");
|
3763
|
+
return this._getMessageRuntime(
|
3764
|
+
{
|
3765
|
+
...this.path,
|
3766
|
+
ref: this.path.ref + `${this.path.ref}.messages[${idx}]`,
|
3767
|
+
messageSelector: { type: "index", index: idx }
|
3768
|
+
},
|
3769
|
+
() => {
|
3770
|
+
const messages2 = this._threadBinding.getState().messages;
|
3771
|
+
const message = messages2[idx];
|
3772
|
+
if (!message) return void 0;
|
3773
|
+
return {
|
3774
|
+
message,
|
3775
|
+
parentId: messages2[idx - 1]?.id ?? null
|
3776
|
+
};
|
3777
|
+
}
|
3778
|
+
);
|
3779
|
+
}
|
3780
|
+
getMesssageById(messageId) {
|
3781
|
+
return this._getMessageRuntime(
|
3782
|
+
{
|
3783
|
+
...this.path,
|
3784
|
+
ref: this.path.ref + `${this.path.ref}.messages[messageId=${JSON.stringify(messageId)}]`,
|
3785
|
+
messageSelector: { type: "messageId", messageId }
|
3786
|
+
},
|
3787
|
+
() => this._threadBinding.getState().getMessageById(messageId)
|
3788
|
+
);
|
3789
|
+
}
|
3790
|
+
_getMessageRuntime(path, callback) {
|
3646
3791
|
return new MessageRuntimeImpl(
|
3647
3792
|
new ShallowMemoizeSubject({
|
3793
|
+
path,
|
3648
3794
|
getState: () => {
|
3649
|
-
const {
|
3650
|
-
const
|
3651
|
-
if (!message) return SKIP_UPDATE;
|
3795
|
+
const { message, parentId } = callback() ?? {};
|
3796
|
+
const { messages: messages2, speech: speechState } = this._threadBinding.getState();
|
3797
|
+
if (!message || parentId === void 0) return SKIP_UPDATE;
|
3652
3798
|
const thread = this._threadBinding.getState();
|
3653
3799
|
const branches = thread.getBranches(message.id);
|
3654
3800
|
const submittedFeedback = thread.getSubmittedFeedback(message.id);
|
3655
3801
|
return {
|
3656
3802
|
...message,
|
3657
3803
|
message,
|
3658
|
-
isLast:
|
3659
|
-
parentId
|
3804
|
+
isLast: messages2.at(-1)?.id === message.id,
|
3805
|
+
parentId,
|
3660
3806
|
branches,
|
3661
3807
|
branchNumber: branches.indexOf(message.id) + 1,
|
3662
3808
|
branchCount: branches.length,
|
@@ -3664,7 +3810,7 @@ var ThreadRuntimeImpl = class {
|
|
3664
3810
|
submittedFeedback
|
3665
3811
|
};
|
3666
3812
|
},
|
3667
|
-
subscribe: (
|
3813
|
+
subscribe: (callback2) => this._threadBinding.subscribe(callback2)
|
3668
3814
|
}),
|
3669
3815
|
this._threadBinding
|
3670
3816
|
);
|
@@ -3674,6 +3820,7 @@ var ThreadRuntimeImpl = class {
|
|
3674
3820
|
let subject = this._eventListenerNestedSubscriptions.get(event);
|
3675
3821
|
if (!subject) {
|
3676
3822
|
subject = new NestedSubscriptionSubject({
|
3823
|
+
path: this.path,
|
3677
3824
|
getState: () => ({
|
3678
3825
|
subscribe: (callback2) => this._threadBinding.getState().unstable_on(event, callback2)
|
3679
3826
|
}),
|
@@ -3685,43 +3832,94 @@ var ThreadRuntimeImpl = class {
|
|
3685
3832
|
}
|
3686
3833
|
};
|
3687
3834
|
|
3835
|
+
// src/api/ThreadManagerRuntime.ts
|
3836
|
+
var getThreadManagerState = (threadManager) => {
|
3837
|
+
return {
|
3838
|
+
threads: threadManager.threads,
|
3839
|
+
archivedThreads: threadManager.archivedThreads
|
3840
|
+
};
|
3841
|
+
};
|
3842
|
+
var THREAD_MANAGER_PATH = {
|
3843
|
+
ref: "threadManager"
|
3844
|
+
};
|
3845
|
+
var ThreadManagerRuntimeImpl = class {
|
3846
|
+
constructor(_core) {
|
3847
|
+
this._core = _core;
|
3848
|
+
const stateBinding = new LazyMemoizeSubject({
|
3849
|
+
path: THREAD_MANAGER_PATH,
|
3850
|
+
getState: () => getThreadManagerState(_core),
|
3851
|
+
subscribe: (callback) => _core.subscribe(callback)
|
3852
|
+
});
|
3853
|
+
this._getState = stateBinding.getState.bind(stateBinding);
|
3854
|
+
}
|
3855
|
+
get path() {
|
3856
|
+
return THREAD_MANAGER_PATH;
|
3857
|
+
}
|
3858
|
+
_getState;
|
3859
|
+
getState() {
|
3860
|
+
return this._getState();
|
3861
|
+
}
|
3862
|
+
rename(threadId, newTitle) {
|
3863
|
+
return this._core.rename(threadId, newTitle);
|
3864
|
+
}
|
3865
|
+
archive(threadId) {
|
3866
|
+
return this._core.archive(threadId);
|
3867
|
+
}
|
3868
|
+
unarchive(threadId) {
|
3869
|
+
return this._core.unarchive(threadId);
|
3870
|
+
}
|
3871
|
+
delete(threadId) {
|
3872
|
+
return this._core.delete(threadId);
|
3873
|
+
}
|
3874
|
+
subscribe(callback) {
|
3875
|
+
return this._core.subscribe(callback);
|
3876
|
+
}
|
3877
|
+
};
|
3878
|
+
|
3688
3879
|
// src/api/AssistantRuntime.ts
|
3689
3880
|
var AssistantRuntimeImpl = class _AssistantRuntimeImpl {
|
3690
3881
|
constructor(_core, _thread) {
|
3691
3882
|
this._core = _core;
|
3692
3883
|
this._thread = _thread;
|
3884
|
+
this.threadManager = new ThreadManagerRuntimeImpl(_core.threadManager);
|
3693
3885
|
}
|
3886
|
+
threadManager;
|
3694
3887
|
get thread() {
|
3695
3888
|
return this._thread;
|
3696
3889
|
}
|
3697
3890
|
switchToNewThread() {
|
3698
|
-
return this._core.switchToNewThread();
|
3891
|
+
return this._core.threadManager.switchToNewThread();
|
3699
3892
|
}
|
3700
3893
|
switchToThread(threadId) {
|
3701
|
-
return this.
|
3894
|
+
if (threadId === null) return this.switchToNewThread();
|
3895
|
+
return this._core.threadManager.switchToThread(threadId);
|
3702
3896
|
}
|
3703
3897
|
registerModelConfigProvider(provider) {
|
3704
3898
|
return this._core.registerModelConfigProvider(provider);
|
3705
3899
|
}
|
3706
|
-
// TODO events for thread switching
|
3707
3900
|
/**
|
3708
3901
|
* @deprecated Thread is now static and never gets updated. This will be removed in 0.6.0.
|
3709
3902
|
*/
|
3710
|
-
subscribe(
|
3711
|
-
return
|
3903
|
+
subscribe() {
|
3904
|
+
return () => {
|
3905
|
+
};
|
3712
3906
|
}
|
3713
|
-
static
|
3907
|
+
static createMainThreadRuntime(_core, CustomThreadRuntime = ThreadRuntimeImpl) {
|
3714
3908
|
return new CustomThreadRuntime(
|
3715
3909
|
new NestedSubscriptionSubject({
|
3716
|
-
|
3717
|
-
|
3910
|
+
path: {
|
3911
|
+
ref: "threads.main",
|
3912
|
+
threadSelector: { type: "main" }
|
3913
|
+
},
|
3914
|
+
getState: () => _core.threadManager.mainThread,
|
3915
|
+
subscribe: (callback) => _core.threadManager.subscribe(callback)
|
3718
3916
|
})
|
3719
3917
|
);
|
3720
3918
|
}
|
3721
3919
|
static create(_core, CustomThreadRuntime = ThreadRuntimeImpl) {
|
3722
3920
|
return new _AssistantRuntimeImpl(
|
3723
3921
|
_core,
|
3724
|
-
_AssistantRuntimeImpl.
|
3922
|
+
_AssistantRuntimeImpl.createMainThreadRuntime(_core, CustomThreadRuntime)
|
3725
3923
|
);
|
3726
3924
|
}
|
3727
3925
|
};
|
@@ -3893,7 +4091,7 @@ var streamUtils = {
|
|
3893
4091
|
};
|
3894
4092
|
|
3895
4093
|
// src/runtimes/edge/useEdgeRuntime.ts
|
3896
|
-
import { useState as
|
4094
|
+
import { useState as useState11 } from "react";
|
3897
4095
|
|
3898
4096
|
// src/runtimes/edge/streams/assistantDecoderStream.ts
|
3899
4097
|
function assistantDecoderStream() {
|
@@ -4074,7 +4272,7 @@ var splitLocalRuntimeOptions = (options) => {
|
|
4074
4272
|
// src/runtimes/edge/useEdgeRuntime.ts
|
4075
4273
|
var useEdgeRuntime = (options) => {
|
4076
4274
|
const { localRuntimeOptions, otherOptions } = splitLocalRuntimeOptions(options);
|
4077
|
-
const [adapter] =
|
4275
|
+
const [adapter] = useState11(() => new EdgeChatAdapter(otherOptions));
|
4078
4276
|
return useLocalRuntime(adapter, localRuntimeOptions);
|
4079
4277
|
};
|
4080
4278
|
|
@@ -4153,6 +4351,9 @@ var BaseThreadRuntimeCore = class {
|
|
4153
4351
|
);
|
4154
4352
|
this._notifySubscribers();
|
4155
4353
|
}
|
4354
|
+
getMessageById(messageId) {
|
4355
|
+
return this.repository.getMessage(messageId);
|
4356
|
+
}
|
4156
4357
|
getBranches(messageId) {
|
4157
4358
|
return this.repository.getBranches(messageId);
|
4158
4359
|
}
|
@@ -4191,7 +4392,7 @@ var BaseThreadRuntimeCore = class {
|
|
4191
4392
|
if (!adapter) throw new Error("Speech adapter not configured");
|
4192
4393
|
const { message } = this.repository.getMessage(messageId);
|
4193
4394
|
this._stopSpeaking?.();
|
4194
|
-
const utterance = adapter.speak(message);
|
4395
|
+
const utterance = adapter.speak(getThreadMessageText(message));
|
4195
4396
|
const unsub = utterance.subscribe(() => {
|
4196
4397
|
if (utterance.status.type === "ended") {
|
4197
4398
|
this._stopSpeaking = void 0;
|
@@ -4224,6 +4425,10 @@ var BaseThreadRuntimeCore = class {
|
|
4224
4425
|
}
|
4225
4426
|
_eventSubscribers = /* @__PURE__ */ new Map();
|
4226
4427
|
unstable_on(event, callback) {
|
4428
|
+
if (event === "model-config-update") {
|
4429
|
+
return this.configProvider.subscribe?.(callback) ?? (() => {
|
4430
|
+
});
|
4431
|
+
}
|
4227
4432
|
const subscribers = this._eventSubscribers.get(event);
|
4228
4433
|
if (!subscribers) {
|
4229
4434
|
this._eventSubscribers.set(event, /* @__PURE__ */ new Set([callback]));
|
@@ -4239,19 +4444,10 @@ var BaseThreadRuntimeCore = class {
|
|
4239
4444
|
|
4240
4445
|
// src/runtimes/local/LocalThreadRuntimeCore.tsx
|
4241
4446
|
var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
4242
|
-
constructor(configProvider,
|
4447
|
+
constructor(configProvider, threadId, options) {
|
4243
4448
|
super(configProvider);
|
4244
|
-
this.
|
4245
|
-
this.
|
4246
|
-
this.options = options;
|
4247
|
-
if (initialMessages) {
|
4248
|
-
let parentId = null;
|
4249
|
-
const messages2 = fromCoreMessages(initialMessages);
|
4250
|
-
for (const message of messages2) {
|
4251
|
-
this.repository.addOrUpdateMessage(parentId, message);
|
4252
|
-
parentId = message.id;
|
4253
|
-
}
|
4254
|
-
}
|
4449
|
+
this.threadId = threadId;
|
4450
|
+
this._options = options;
|
4255
4451
|
}
|
4256
4452
|
capabilities = {
|
4257
4453
|
switchToBranch: true,
|
@@ -4264,20 +4460,17 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
4264
4460
|
feedback: false
|
4265
4461
|
};
|
4266
4462
|
abortController = null;
|
4267
|
-
threadId;
|
4268
4463
|
isDisabled = false;
|
4269
4464
|
suggestions = [];
|
4270
4465
|
get adapters() {
|
4271
|
-
return this.
|
4466
|
+
return this._options.adapters;
|
4272
4467
|
}
|
4273
4468
|
_options;
|
4274
|
-
get options() {
|
4275
|
-
return this._options;
|
4276
|
-
}
|
4277
4469
|
get extras() {
|
4278
4470
|
return void 0;
|
4279
4471
|
}
|
4280
|
-
|
4472
|
+
setOptions(options) {
|
4473
|
+
if (this._options === options) return;
|
4281
4474
|
this._options = options;
|
4282
4475
|
let hasUpdates = false;
|
4283
4476
|
const canSpeak = options.adapters?.speech !== void 0;
|
@@ -4353,7 +4546,7 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
4353
4546
|
this.repository.addOrUpdateMessage(parentId, message);
|
4354
4547
|
this._notifySubscribers();
|
4355
4548
|
};
|
4356
|
-
const maxSteps = this.
|
4549
|
+
const maxSteps = this._options.maxSteps ? this._options.maxSteps : (this._options.maxToolRoundtrips ?? 1) + 1;
|
4357
4550
|
const steps = message.metadata?.steps?.length ?? 0;
|
4358
4551
|
if (steps >= maxSteps) {
|
4359
4552
|
updateMessage({
|
@@ -4371,7 +4564,7 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
4371
4564
|
});
|
4372
4565
|
}
|
4373
4566
|
try {
|
4374
|
-
const promiseOrGenerator = this.
|
4567
|
+
const promiseOrGenerator = this.adapters.chatModel.run({
|
4375
4568
|
messages: messages2,
|
4376
4569
|
abortSignal: this.abortController.signal,
|
4377
4570
|
config: this.getModelConfig(),
|
@@ -4444,44 +4637,154 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
4444
4637
|
}
|
4445
4638
|
};
|
4446
4639
|
|
4447
|
-
// src/runtimes/local/
|
4448
|
-
var
|
4449
|
-
|
4450
|
-
|
4451
|
-
|
4452
|
-
super(new LocalThreadRuntimeCore(proxyConfigProvider, adapter, options));
|
4453
|
-
this._proxyConfigProvider = proxyConfigProvider;
|
4640
|
+
// src/runtimes/local/LocalThreadManagerRuntimeCore.tsx
|
4641
|
+
var LocalThreadManagerRuntimeCore = class {
|
4642
|
+
constructor(_threadFactory) {
|
4643
|
+
this._threadFactory = _threadFactory;
|
4644
|
+
this._mainThread = this._threadFactory(generateId(), { messages: [] });
|
4454
4645
|
}
|
4455
|
-
|
4456
|
-
|
4646
|
+
_threadData = /* @__PURE__ */ new Map();
|
4647
|
+
_threads = [];
|
4648
|
+
_archivedThreads = [];
|
4649
|
+
get threads() {
|
4650
|
+
return this._threads;
|
4457
4651
|
}
|
4458
|
-
|
4459
|
-
|
4460
|
-
|
4461
|
-
|
4462
|
-
|
4463
|
-
|
4464
|
-
);
|
4465
|
-
this.thread._notifyEventSubscribers("switched-to");
|
4652
|
+
get archivedThreads() {
|
4653
|
+
return this._archivedThreads;
|
4654
|
+
}
|
4655
|
+
_mainThread;
|
4656
|
+
get mainThread() {
|
4657
|
+
return this._mainThread;
|
4466
4658
|
}
|
4467
4659
|
switchToThread(threadId) {
|
4468
|
-
if (threadId
|
4469
|
-
|
4660
|
+
if (this._mainThread.threadId === threadId) return;
|
4661
|
+
const data = this._threadData.get(threadId);
|
4662
|
+
if (!data) throw new Error("Thread not found");
|
4663
|
+
const thread = this._threadFactory(threadId, data.data);
|
4664
|
+
this._performThreadSwitch(thread);
|
4665
|
+
}
|
4666
|
+
switchToNewThread() {
|
4667
|
+
if (!this._mainThread) return;
|
4668
|
+
const thread = this._threadFactory(generateId(), { messages: [] });
|
4669
|
+
this._performThreadSwitch(thread);
|
4670
|
+
}
|
4671
|
+
_performThreadSwitch(newThreadCore) {
|
4672
|
+
if (this._mainThread) {
|
4673
|
+
const data = this._threadData.get(this._mainThread.threadId);
|
4674
|
+
if (!data) throw new Error("Thread not found");
|
4675
|
+
const exprt = this._mainThread.export();
|
4676
|
+
data.data = exprt;
|
4677
|
+
}
|
4678
|
+
this._mainThread._notifyEventSubscribers("switched-away");
|
4679
|
+
this._mainThread = newThreadCore;
|
4680
|
+
newThreadCore._notifyEventSubscribers("switched-to");
|
4681
|
+
this._notifySubscribers();
|
4682
|
+
}
|
4683
|
+
_performMoveOp(threadId, operation) {
|
4684
|
+
const data = this._threadData.get(threadId);
|
4685
|
+
if (!data) throw new Error("Thread not found");
|
4686
|
+
if (operation === "archive" && data.isArchived) return;
|
4687
|
+
if (operation === "unarchive" && !data.isArchived) return;
|
4688
|
+
if (operation === "archive") {
|
4689
|
+
data.isArchived = true;
|
4690
|
+
this._archivedThreads = [...this._archivedThreads, data.metadata];
|
4691
|
+
}
|
4692
|
+
if (operation === "unarchive") {
|
4693
|
+
data.isArchived = false;
|
4694
|
+
this._threads = [...this._threads, data.metadata];
|
4695
|
+
}
|
4696
|
+
if (operation === "delete") {
|
4697
|
+
this._threadData.delete(threadId);
|
4698
|
+
}
|
4699
|
+
if (operation === "archive" || operation === "delete" && data.isArchived) {
|
4700
|
+
this._archivedThreads = this._archivedThreads.filter(
|
4701
|
+
(t) => t.threadId !== threadId
|
4702
|
+
);
|
4703
|
+
}
|
4704
|
+
if (operation === "unarchive" || operation === "delete" && !data.isArchived) {
|
4705
|
+
this._threads = this._threads.filter((t) => t.threadId !== threadId);
|
4470
4706
|
}
|
4471
|
-
this.
|
4707
|
+
this._notifySubscribers();
|
4708
|
+
}
|
4709
|
+
async rename(threadId, newTitle) {
|
4710
|
+
const data = this._threadData.get(threadId);
|
4711
|
+
if (!data) throw new Error("Thread not found");
|
4712
|
+
data.metadata = {
|
4713
|
+
...data.metadata,
|
4714
|
+
title: newTitle
|
4715
|
+
};
|
4716
|
+
const threadList = data.isArchived ? this.archivedThreads : this.threads;
|
4717
|
+
const idx = threadList.findIndex((t) => t.threadId === threadId);
|
4718
|
+
const updatedThreadList = threadList.toSpliced(idx, 1, data.metadata);
|
4719
|
+
if (data.isArchived) {
|
4720
|
+
this._archivedThreads = updatedThreadList;
|
4721
|
+
} else {
|
4722
|
+
this._threads = updatedThreadList;
|
4723
|
+
}
|
4724
|
+
this._notifySubscribers();
|
4725
|
+
}
|
4726
|
+
async archive(threadId) {
|
4727
|
+
this._performMoveOp(threadId, "archive");
|
4728
|
+
}
|
4729
|
+
async unarchive(threadId) {
|
4730
|
+
this._performMoveOp(threadId, "unarchive");
|
4731
|
+
}
|
4732
|
+
async delete(threadId) {
|
4733
|
+
this._performMoveOp(threadId, "delete");
|
4734
|
+
}
|
4735
|
+
_subscriptions = /* @__PURE__ */ new Set();
|
4736
|
+
subscribe(callback) {
|
4737
|
+
this._subscriptions.add(callback);
|
4738
|
+
return () => this._subscriptions.delete(callback);
|
4739
|
+
}
|
4740
|
+
_notifySubscribers() {
|
4741
|
+
for (const callback of this._subscriptions) callback();
|
4742
|
+
}
|
4743
|
+
};
|
4744
|
+
|
4745
|
+
// src/runtimes/local/LocalRuntimeCore.tsx
|
4746
|
+
var getExportFromInitialMessages = (initialMessages) => {
|
4747
|
+
const messages2 = fromCoreMessages(initialMessages);
|
4748
|
+
return {
|
4749
|
+
messages: messages2.map((m, idx) => ({
|
4750
|
+
parentId: messages2[idx - 1]?.id ?? null,
|
4751
|
+
message: m
|
4752
|
+
}))
|
4753
|
+
};
|
4754
|
+
};
|
4755
|
+
var LocalRuntimeCore = class extends BaseAssistantRuntimeCore {
|
4756
|
+
threadManager;
|
4757
|
+
_options;
|
4758
|
+
constructor(options, initialMessages) {
|
4759
|
+
super();
|
4760
|
+
this._options = options;
|
4761
|
+
this.threadManager = new LocalThreadManagerRuntimeCore((threadId, data) => {
|
4762
|
+
const thread = new LocalThreadRuntimeCore(
|
4763
|
+
this._proxyConfigProvider,
|
4764
|
+
threadId,
|
4765
|
+
this._options
|
4766
|
+
);
|
4767
|
+
thread.import(data);
|
4768
|
+
return thread;
|
4769
|
+
});
|
4770
|
+
if (initialMessages) {
|
4771
|
+
this.threadManager.mainThread.import(
|
4772
|
+
getExportFromInitialMessages(initialMessages)
|
4773
|
+
);
|
4774
|
+
}
|
4775
|
+
}
|
4776
|
+
setOptions(options) {
|
4777
|
+
this._options = options;
|
4778
|
+
this.threadManager.mainThread.setOptions(options);
|
4472
4779
|
}
|
4473
4780
|
reset({
|
4474
4781
|
initialMessages
|
4475
4782
|
} = {}) {
|
4476
|
-
this.
|
4783
|
+
this.threadManager.switchToNewThread();
|
4477
4784
|
if (!initialMessages) return;
|
4478
|
-
|
4479
|
-
|
4480
|
-
|
4481
|
-
parentId: messages2[idx - 1]?.id ?? null,
|
4482
|
-
message: m
|
4483
|
-
}))
|
4484
|
-
});
|
4785
|
+
this.threadManager.mainThread.import(
|
4786
|
+
getExportFromInitialMessages(initialMessages)
|
4787
|
+
);
|
4485
4788
|
}
|
4486
4789
|
};
|
4487
4790
|
|
@@ -4497,21 +4800,113 @@ var LocalRuntimeImpl = class _LocalRuntimeImpl extends AssistantRuntimeImpl {
|
|
4497
4800
|
static create(_core) {
|
4498
4801
|
return new _LocalRuntimeImpl(
|
4499
4802
|
_core,
|
4500
|
-
AssistantRuntimeImpl.
|
4803
|
+
AssistantRuntimeImpl.createMainThreadRuntime(_core, ThreadRuntimeImpl)
|
4501
4804
|
);
|
4502
4805
|
}
|
4503
4806
|
};
|
4504
4807
|
var useLocalRuntime = (adapter, options = {}) => {
|
4505
|
-
const
|
4506
|
-
|
4507
|
-
|
4508
|
-
|
4808
|
+
const opt = {
|
4809
|
+
...options,
|
4810
|
+
adapters: {
|
4811
|
+
...options.adapters,
|
4812
|
+
chatModel: adapter
|
4813
|
+
}
|
4814
|
+
};
|
4815
|
+
const [runtime] = useState12(() => new LocalRuntimeCore(opt));
|
4816
|
+
useEffect16(() => {
|
4817
|
+
runtime.setOptions(opt);
|
4509
4818
|
});
|
4510
4819
|
return useMemo11(() => LocalRuntimeImpl.create(runtime), [runtime]);
|
4511
4820
|
};
|
4512
4821
|
|
4513
4822
|
// src/runtimes/external-store/useExternalStoreRuntime.tsx
|
4514
|
-
import { useEffect as
|
4823
|
+
import { useEffect as useEffect17, useMemo as useMemo12, useState as useState13 } from "react";
|
4824
|
+
|
4825
|
+
// src/runtimes/external-store/ExternalStoreThreadManagementAdapter.tsx
|
4826
|
+
var EMPTY_ARRAY2 = Object.freeze([]);
|
4827
|
+
var DEFAULT_THREAD_ID = "DEFAULT_THREAD_ID";
|
4828
|
+
var ExternalStoreThreadManagerRuntimeCore = class {
|
4829
|
+
constructor(adapter = {}, threadFactory) {
|
4830
|
+
this.adapter = adapter;
|
4831
|
+
this.threadFactory = threadFactory;
|
4832
|
+
this._mainThread = this.threadFactory(DEFAULT_THREAD_ID);
|
4833
|
+
}
|
4834
|
+
get threads() {
|
4835
|
+
return this.adapter.threads ?? EMPTY_ARRAY2;
|
4836
|
+
}
|
4837
|
+
get archivedThreads() {
|
4838
|
+
return this.adapter.archivedThreads ?? EMPTY_ARRAY2;
|
4839
|
+
}
|
4840
|
+
_mainThread;
|
4841
|
+
get mainThread() {
|
4842
|
+
return this._mainThread;
|
4843
|
+
}
|
4844
|
+
setAdapter(adapter) {
|
4845
|
+
const previousAdapter = this.adapter;
|
4846
|
+
this.adapter = adapter;
|
4847
|
+
const newThreadId = adapter.threadId ?? DEFAULT_THREAD_ID;
|
4848
|
+
const newThreads = adapter.threads ?? EMPTY_ARRAY2;
|
4849
|
+
const newArchivedThreads = adapter.archivedThreads ?? EMPTY_ARRAY2;
|
4850
|
+
if (previousAdapter.threadId === newThreadId && previousAdapter.threads === newThreads && previousAdapter.archivedThreads === newArchivedThreads) {
|
4851
|
+
return;
|
4852
|
+
}
|
4853
|
+
if (previousAdapter.threadId !== newThreadId) {
|
4854
|
+
this._mainThread._notifyEventSubscribers("switched-away");
|
4855
|
+
this._mainThread = this.threadFactory(newThreadId);
|
4856
|
+
this._mainThread._notifyEventSubscribers("switched-to");
|
4857
|
+
}
|
4858
|
+
this._notifySubscribers();
|
4859
|
+
}
|
4860
|
+
switchToThread(threadId) {
|
4861
|
+
if (this._mainThread?.threadId === threadId) return;
|
4862
|
+
const onSwitchToThread = this.adapter.onSwitchToThread;
|
4863
|
+
if (!onSwitchToThread)
|
4864
|
+
throw new Error(
|
4865
|
+
"External store adapter does not support switching to thread"
|
4866
|
+
);
|
4867
|
+
onSwitchToThread(threadId);
|
4868
|
+
}
|
4869
|
+
switchToNewThread() {
|
4870
|
+
const onSwitchToNewThread = this.adapter.onSwitchToNewThread;
|
4871
|
+
if (!onSwitchToNewThread)
|
4872
|
+
throw new Error(
|
4873
|
+
"External store adapter does not support switching to new thread"
|
4874
|
+
);
|
4875
|
+
onSwitchToNewThread();
|
4876
|
+
}
|
4877
|
+
async rename(threadId, newTitle) {
|
4878
|
+
const onRename = this.adapter.onRename;
|
4879
|
+
if (!onRename)
|
4880
|
+
throw new Error("External store adapter does not support renaming");
|
4881
|
+
onRename(threadId, newTitle);
|
4882
|
+
}
|
4883
|
+
async archive(threadId) {
|
4884
|
+
const onArchive = this.adapter.onArchive;
|
4885
|
+
if (!onArchive)
|
4886
|
+
throw new Error("External store adapter does not support archiving");
|
4887
|
+
onArchive(threadId);
|
4888
|
+
}
|
4889
|
+
async unarchive(threadId) {
|
4890
|
+
const onUnarchive = this.adapter.onUnarchive;
|
4891
|
+
if (!onUnarchive)
|
4892
|
+
throw new Error("External store adapter does not support unarchiving");
|
4893
|
+
onUnarchive(threadId);
|
4894
|
+
}
|
4895
|
+
async delete(threadId) {
|
4896
|
+
const onDelete = this.adapter.onDelete;
|
4897
|
+
if (!onDelete)
|
4898
|
+
throw new Error("External store adapter does not support deleting");
|
4899
|
+
onDelete(threadId);
|
4900
|
+
}
|
4901
|
+
_subscriptions = /* @__PURE__ */ new Set();
|
4902
|
+
subscribe(callback) {
|
4903
|
+
this._subscriptions.add(callback);
|
4904
|
+
return () => this._subscriptions.delete(callback);
|
4905
|
+
}
|
4906
|
+
_notifySubscribers() {
|
4907
|
+
for (const callback of this._subscriptions) callback();
|
4908
|
+
}
|
4909
|
+
};
|
4515
4910
|
|
4516
4911
|
// src/runtimes/external-store/getExternalStoreMessage.tsx
|
4517
4912
|
var symbolInnerMessage = Symbol("innerMessage");
|
@@ -4616,7 +5011,7 @@ var fromThreadMessageLike = (like, fallbackId, fallbackStatus) => {
|
|
4616
5011
|
};
|
4617
5012
|
|
4618
5013
|
// src/runtimes/external-store/ExternalStoreThreadRuntimeCore.tsx
|
4619
|
-
var
|
5014
|
+
var EMPTY_ARRAY3 = Object.freeze([]);
|
4620
5015
|
var hasUpcomingMessage = (isRunning, messages2) => {
|
4621
5016
|
return isRunning && messages2[messages2.length - 1]?.role !== "assistant";
|
4622
5017
|
};
|
@@ -4649,26 +5044,23 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
4649
5044
|
_converter = new ThreadMessageConverter();
|
4650
5045
|
_store;
|
4651
5046
|
beginEdit(messageId) {
|
4652
|
-
if (!this.
|
5047
|
+
if (!this._store.onEdit)
|
4653
5048
|
throw new Error("Runtime does not support editing.");
|
4654
5049
|
super.beginEdit(messageId);
|
4655
5050
|
}
|
4656
|
-
constructor(configProvider, store) {
|
5051
|
+
constructor(configProvider, threadId, store) {
|
4657
5052
|
super(configProvider);
|
4658
|
-
this.
|
4659
|
-
|
4660
|
-
get store() {
|
4661
|
-
return this._store;
|
5053
|
+
this.threadId = threadId;
|
5054
|
+
this.setStore(store);
|
4662
5055
|
}
|
4663
|
-
|
5056
|
+
setStore(store) {
|
4664
5057
|
if (this._store === store) return;
|
4665
|
-
this.threadId = store.threadId ?? this.threadId ?? generateId();
|
4666
5058
|
const isRunning = store.isRunning ?? false;
|
4667
5059
|
this.isDisabled = store.isDisabled ?? false;
|
4668
5060
|
const oldStore = this._store;
|
4669
5061
|
this._store = store;
|
4670
5062
|
this.extras = store.extras;
|
4671
|
-
this.suggestions = store.suggestions ??
|
5063
|
+
this.suggestions = store.suggestions ?? EMPTY_ARRAY3;
|
4672
5064
|
this._capabilities = {
|
4673
5065
|
switchToBranch: this._store.setMessages !== void 0,
|
4674
5066
|
edit: this._store.onEdit !== void 0,
|
@@ -4677,8 +5069,8 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
4677
5069
|
speech: this._store.adapters?.speech !== void 0,
|
4678
5070
|
unstable_copy: this._store.unstable_capabilities?.copy !== false,
|
4679
5071
|
// default true
|
4680
|
-
attachments: !!this.
|
4681
|
-
feedback: !!this.
|
5072
|
+
attachments: !!this._store.adapters?.attachments,
|
5073
|
+
feedback: !!this._store.adapters?.feedback
|
4682
5074
|
};
|
4683
5075
|
if (oldStore) {
|
4684
5076
|
if (oldStore.convertMessage !== store.convertMessage) {
|
@@ -4782,57 +5174,41 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
4782
5174
|
};
|
4783
5175
|
|
4784
5176
|
// src/runtimes/external-store/ExternalStoreRuntimeCore.tsx
|
5177
|
+
var getThreadManagerAdapter = (store) => {
|
5178
|
+
return {
|
5179
|
+
threadId: store.threadId,
|
5180
|
+
onSwitchToNewThread: store.onSwitchToNewThread,
|
5181
|
+
onSwitchToThread: store.onSwitchToThread,
|
5182
|
+
...store.adapters?.threadManager
|
5183
|
+
};
|
5184
|
+
};
|
4785
5185
|
var ExternalStoreRuntimeCore = class extends BaseAssistantRuntimeCore {
|
4786
|
-
|
5186
|
+
threadManager;
|
5187
|
+
_store;
|
4787
5188
|
constructor(store) {
|
4788
|
-
|
4789
|
-
|
4790
|
-
this.
|
4791
|
-
|
4792
|
-
|
4793
|
-
return this._proxyConfigProvider.getModelConfig();
|
4794
|
-
}
|
4795
|
-
registerModelConfigProvider(provider) {
|
4796
|
-
return this._proxyConfigProvider.registerModelConfigProvider(provider);
|
4797
|
-
}
|
4798
|
-
async switchToNewThread() {
|
4799
|
-
if (!this.thread.store.onSwitchToNewThread)
|
4800
|
-
throw new Error("Runtime does not support switching to new threads.");
|
4801
|
-
this.thread = new ExternalStoreThreadRuntimeCore(
|
4802
|
-
this._proxyConfigProvider,
|
4803
|
-
{
|
4804
|
-
...this.thread.store,
|
4805
|
-
messages: []
|
4806
|
-
}
|
4807
|
-
);
|
4808
|
-
await this.thread.store.onSwitchToNewThread();
|
4809
|
-
this.thread._notifyEventSubscribers("switched-to");
|
4810
|
-
}
|
4811
|
-
async switchToThread(threadId) {
|
4812
|
-
if (threadId !== null) {
|
4813
|
-
if (!this.thread.store.onSwitchToThread)
|
4814
|
-
throw new Error("Runtime does not support switching threads.");
|
4815
|
-
this.thread = new ExternalStoreThreadRuntimeCore(
|
5189
|
+
super();
|
5190
|
+
this._store = store;
|
5191
|
+
this.threadManager = new ExternalStoreThreadManagerRuntimeCore(
|
5192
|
+
getThreadManagerAdapter(store),
|
5193
|
+
(threadId) => new ExternalStoreThreadRuntimeCore(
|
4816
5194
|
this._proxyConfigProvider,
|
4817
|
-
|
4818
|
-
|
4819
|
-
|
4820
|
-
|
4821
|
-
|
4822
|
-
|
4823
|
-
|
4824
|
-
|
4825
|
-
|
4826
|
-
this.switchToNewThread();
|
4827
|
-
}
|
5195
|
+
threadId,
|
5196
|
+
this._store
|
5197
|
+
)
|
5198
|
+
);
|
5199
|
+
}
|
5200
|
+
setStore(store) {
|
5201
|
+
this._store = store;
|
5202
|
+
this.threadManager.setAdapter(getThreadManagerAdapter(store));
|
5203
|
+
this.threadManager.mainThread.setStore(store);
|
4828
5204
|
}
|
4829
5205
|
};
|
4830
5206
|
|
4831
5207
|
// src/runtimes/external-store/useExternalStoreRuntime.tsx
|
4832
5208
|
var useExternalStoreRuntime = (store) => {
|
4833
|
-
const [runtime] =
|
4834
|
-
|
4835
|
-
runtime.
|
5209
|
+
const [runtime] = useState13(() => new ExternalStoreRuntimeCore(store));
|
5210
|
+
useEffect17(() => {
|
5211
|
+
runtime.setStore(store);
|
4836
5212
|
});
|
4837
5213
|
return useMemo12(
|
4838
5214
|
() => AssistantRuntimeImpl.create(runtime, ThreadRuntimeImpl),
|
@@ -4987,7 +5363,7 @@ var shallowArrayEqual = (a, b) => {
|
|
4987
5363
|
};
|
4988
5364
|
|
4989
5365
|
// src/runtimes/dangerous-in-browser/useDangerousInBrowserRuntime.ts
|
4990
|
-
import { useState as
|
5366
|
+
import { useState as useState14 } from "react";
|
4991
5367
|
|
4992
5368
|
// src/runtimes/dangerous-in-browser/DangerousInBrowserAdapter.ts
|
4993
5369
|
var DangerousInBrowserAdapter = class {
|
@@ -5016,14 +5392,13 @@ var DangerousInBrowserAdapter = class {
|
|
5016
5392
|
// src/runtimes/dangerous-in-browser/useDangerousInBrowserRuntime.ts
|
5017
5393
|
var useDangerousInBrowserRuntime = (options) => {
|
5018
5394
|
const { localRuntimeOptions, otherOptions } = splitLocalRuntimeOptions(options);
|
5019
|
-
const [adapter] =
|
5395
|
+
const [adapter] = useState14(() => new DangerousInBrowserAdapter(otherOptions));
|
5020
5396
|
return useLocalRuntime(adapter, localRuntimeOptions);
|
5021
5397
|
};
|
5022
5398
|
|
5023
5399
|
// src/runtimes/speech/WebSpeechSynthesisAdapter.ts
|
5024
5400
|
var WebSpeechSynthesisAdapter = class {
|
5025
|
-
speak(
|
5026
|
-
const text = getThreadMessageText(message);
|
5401
|
+
speak(text) {
|
5027
5402
|
const utterance = new SpeechSynthesisUtterance(text);
|
5028
5403
|
const subscribers = /* @__PURE__ */ new Set();
|
5029
5404
|
const handleEnd = (reason, error) => {
|
@@ -5603,8 +5978,8 @@ CircleStopIcon.displayName = "CircleStopIcon";
|
|
5603
5978
|
// src/ui/attachment.tsx
|
5604
5979
|
import {
|
5605
5980
|
forwardRef as forwardRef28,
|
5606
|
-
useEffect as
|
5607
|
-
useState as
|
5981
|
+
useEffect as useEffect18,
|
5982
|
+
useState as useState15
|
5608
5983
|
} from "react";
|
5609
5984
|
import { CircleXIcon, FileIcon } from "lucide-react";
|
5610
5985
|
|
@@ -5647,8 +6022,8 @@ var AttachmentRoot = withDefaults(attachment_exports.Root, {
|
|
5647
6022
|
});
|
5648
6023
|
AttachmentRoot.displayName = "AttachmentRoot";
|
5649
6024
|
var useFileSrc = (file) => {
|
5650
|
-
const [src, setSrc] =
|
5651
|
-
|
6025
|
+
const [src, setSrc] = useState15(void 0);
|
6026
|
+
useEffect18(() => {
|
5652
6027
|
if (!file) {
|
5653
6028
|
setSrc(void 0);
|
5654
6029
|
return;
|
@@ -5672,7 +6047,7 @@ var useAttachmentSrc = () => {
|
|
5672
6047
|
return useFileSrc(file) ?? src;
|
5673
6048
|
};
|
5674
6049
|
var AttachmentPreview = ({ src }) => {
|
5675
|
-
const [isLoaded, setIsLoaded] =
|
6050
|
+
const [isLoaded, setIsLoaded] = useState15(false);
|
5676
6051
|
return (
|
5677
6052
|
// eslint-disable-next-line @next/next/no-img-element
|
5678
6053
|
/* @__PURE__ */ jsx46(
|
@@ -5918,8 +6293,13 @@ var ThreadWelcomeMessageStyled = withDefaults("p", {
|
|
5918
6293
|
className: "aui-thread-welcome-message"
|
5919
6294
|
});
|
5920
6295
|
var ThreadWelcomeMessage = forwardRef30(({ message: messageProp, ...rest }, ref) => {
|
5921
|
-
const {
|
5922
|
-
|
6296
|
+
const {
|
6297
|
+
welcome: { message } = {},
|
6298
|
+
strings: {
|
6299
|
+
welcome: { message: defaultMessage = "How can I help you today?" } = {}
|
6300
|
+
} = {}
|
6301
|
+
} = useThreadConfig();
|
6302
|
+
return /* @__PURE__ */ jsx48(ThreadWelcomeMessageStyled, { ...rest, ref, children: messageProp ?? message ?? defaultMessage });
|
5923
6303
|
});
|
5924
6304
|
ThreadWelcomeMessage.displayName = "ThreadWelcomeMessage";
|
5925
6305
|
var ThreadWelcomeSuggestionContainer = withDefaults("div", {
|
@@ -6371,8 +6751,10 @@ export {
|
|
6371
6751
|
useThreadContext,
|
6372
6752
|
useThreadEmpty,
|
6373
6753
|
useThreadIf,
|
6754
|
+
useThreadManager,
|
6374
6755
|
useThreadMessages,
|
6375
6756
|
useThreadMessagesStore,
|
6757
|
+
useThreadModelConfig,
|
6376
6758
|
useThreadRuntime,
|
6377
6759
|
useThreadRuntimeStore,
|
6378
6760
|
useThreadScrollToBottom,
|