@assistant-ui/react 0.1.1 → 0.1.3

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.
Files changed (53) hide show
  1. package/package.json +6 -15
  2. package/dist/AssistantRuntime-BM_jVV3g.d.mts +0 -23
  3. package/dist/AssistantRuntime-CBMSAJqH.d.mts +0 -23
  4. package/dist/AssistantRuntime-C_BvM7ZT.d.ts +0 -23
  5. package/dist/AssistantRuntime-DELpXWfG.d.ts +0 -23
  6. package/dist/ModelConfigTypes-B9UY4zxv.d.mts +0 -55
  7. package/dist/ModelConfigTypes-B9UY4zxv.d.ts +0 -55
  8. package/dist/ModelConfigTypes-BF5HxVrH.d.mts +0 -55
  9. package/dist/ModelConfigTypes-BF5HxVrH.d.ts +0 -55
  10. package/dist/ModelConfigTypes-Cf3yjaDu.d.mts +0 -55
  11. package/dist/ModelConfigTypes-Cf3yjaDu.d.ts +0 -55
  12. package/dist/ModelConfigTypes-CzmXY3sn.d.mts +0 -55
  13. package/dist/ModelConfigTypes-CzmXY3sn.d.ts +0 -55
  14. package/dist/Thread-BMASJT4a.d.ts +0 -15
  15. package/dist/Thread-UEVsUmvl.d.mts +0 -15
  16. package/dist/chunk-3XZUKECF.mjs +0 -207
  17. package/dist/chunk-3XZUKECF.mjs.map +0 -1
  18. package/dist/chunk-4DQ2CIAD.mjs +0 -69
  19. package/dist/chunk-4DQ2CIAD.mjs.map +0 -1
  20. package/dist/chunk-5YONSDN4.mjs +0 -200
  21. package/dist/chunk-5YONSDN4.mjs.map +0 -1
  22. package/dist/chunk-CY4TTHR7.mjs +0 -76
  23. package/dist/chunk-CY4TTHR7.mjs.map +0 -1
  24. package/dist/chunk-DKAWDNW5.mjs +0 -22
  25. package/dist/chunk-DKAWDNW5.mjs.map +0 -1
  26. package/dist/chunk-GQKH2ADD.mjs +0 -165
  27. package/dist/chunk-GQKH2ADD.mjs.map +0 -1
  28. package/dist/chunk-J5LGTIGS.mjs +0 -10
  29. package/dist/chunk-J5LGTIGS.mjs.map +0 -1
  30. package/dist/chunk-NSBOH42A.mjs +0 -200
  31. package/dist/chunk-NSBOH42A.mjs.map +0 -1
  32. package/dist/chunk-X4HBDEFP.mjs +0 -30
  33. package/dist/chunk-X4HBDEFP.mjs.map +0 -1
  34. package/dist/experimental.d.mts +0 -86
  35. package/dist/experimental.d.ts +0 -86
  36. package/dist/experimental.js +0 -123
  37. package/dist/experimental.js.map +0 -1
  38. package/dist/experimental.mjs +0 -34
  39. package/dist/experimental.mjs.map +0 -1
  40. package/dist/index.d.mts +0 -289
  41. package/dist/index.d.ts +0 -289
  42. package/dist/index.js +0 -1500
  43. package/dist/index.js.map +0 -1
  44. package/dist/index.mjs +0 -1245
  45. package/dist/index.mjs.map +0 -1
  46. package/dist/internal-dlLjX30u.d.mts +0 -75
  47. package/dist/internal-dlLjX30u.d.ts +0 -75
  48. package/dist/internal.d.mts +0 -25
  49. package/dist/internal.d.ts +0 -25
  50. package/dist/internal.js +0 -225
  51. package/dist/internal.js.map +0 -1
  52. package/dist/internal.mjs +0 -10
  53. package/dist/internal.mjs.map +0 -1
package/dist/index.mjs DELETED
@@ -1,1245 +0,0 @@
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";
20
-
21
- // src/actions/useCopyMessage.tsx
22
- import { useCallback } from "react";
23
-
24
- // src/utils/combined/useCombinedStore.ts
25
- import { useMemo } from "react";
26
-
27
- // src/utils/combined/createCombinedStore.ts
28
- import { useSyncExternalStore } from "react";
29
- var createCombinedStore = (stores) => {
30
- const subscribe = (callback) => {
31
- const unsubscribes = stores.map((store) => store.subscribe(callback));
32
- return () => {
33
- for (const unsub of unsubscribes) {
34
- unsub();
35
- }
36
- };
37
- };
38
- return (selector) => {
39
- const getSnapshot = () => selector(...stores.map((store) => store.getState()));
40
- return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
41
- };
42
- };
43
-
44
- // src/utils/combined/useCombinedStore.ts
45
- var useCombinedStore = (stores, selector) => {
46
- const useCombined = useMemo(() => createCombinedStore(stores), stores);
47
- return useCombined(selector);
48
- };
49
-
50
- // src/utils/getMessageText.tsx
51
- var getMessageText = (message) => {
52
- const textParts = message.content.filter(
53
- (part) => part.type === "text"
54
- );
55
- return textParts.map((part) => part.text).join("\n\n");
56
- };
57
-
58
- // src/actions/useCopyMessage.tsx
59
- var useCopyMessage = ({ copiedDuration = 3e3 }) => {
60
- const { useMessage, useComposer } = useMessageContext();
61
- const hasCopyableContent = useCombinedStore(
62
- [useMessage, useComposer],
63
- (m, c) => {
64
- return c.isEditing || m.message.content.some((c2) => c2.type === "text");
65
- }
66
- );
67
- const callback = useCallback(() => {
68
- const { isEditing, value: composerValue } = useComposer.getState();
69
- const { message, setIsCopied } = useMessage.getState();
70
- const valueToCopy = isEditing ? composerValue : getMessageText(message);
71
- navigator.clipboard.writeText(valueToCopy);
72
- setIsCopied(true);
73
- setTimeout(() => setIsCopied(false), copiedDuration);
74
- }, [useComposer, useMessage, copiedDuration]);
75
- if (!hasCopyableContent) return null;
76
- return callback;
77
- };
78
-
79
- // src/actions/useReloadMessage.tsx
80
- import { useCallback as useCallback2 } from "react";
81
- var useReloadMessage = () => {
82
- const { useThread, useViewport } = useThreadContext();
83
- const { useMessage } = useMessageContext();
84
- const disabled = useCombinedStore(
85
- [useThread, useMessage],
86
- (t, m) => t.isRunning || m.message.role !== "assistant"
87
- );
88
- const callback = useCallback2(() => {
89
- const { parentId } = useMessage.getState();
90
- useThread.getState().startRun(parentId);
91
- useViewport.getState().scrollToBottom();
92
- }, [useMessage, useThread, useViewport]);
93
- if (disabled) return null;
94
- return callback;
95
- };
96
-
97
- // src/actions/useBeginMessageEdit.tsx
98
- import { useCallback as useCallback3 } from "react";
99
- var useBeginMessageEdit = () => {
100
- const { useMessage, useComposer } = useMessageContext();
101
- const disabled = useCombinedStore(
102
- [useMessage, useComposer],
103
- (m, c) => m.message.role !== "user" || c.isEditing
104
- );
105
- const callback = useCallback3(() => {
106
- const { edit } = useComposer.getState();
107
- edit();
108
- }, [useComposer]);
109
- if (disabled) return null;
110
- return callback;
111
- };
112
-
113
- // src/actions/useGoToNextBranch.tsx
114
- import { useCallback as useCallback4 } from "react";
115
- var useGoToNextBranch = () => {
116
- const { useThread } = useThreadContext();
117
- const { useMessage, useComposer } = useMessageContext();
118
- const disabled = useCombinedStore(
119
- [useMessage, useComposer],
120
- (m, c) => c.isEditing || m.branches.indexOf(m.message.id) + 1 >= m.branches.length
121
- );
122
- const callback = useCallback4(() => {
123
- const { message, branches } = useMessage.getState();
124
- useThread.getState().switchToBranch(branches[branches.indexOf(message.id) + 1]);
125
- }, [useMessage, useThread]);
126
- if (disabled) return null;
127
- return callback;
128
- };
129
-
130
- // src/actions/useGoToPreviousBranch.tsx
131
- import { useCallback as useCallback5 } from "react";
132
- var useGoToPreviousBranch = () => {
133
- const { useThread } = useThreadContext();
134
- const { useMessage, useComposer } = useMessageContext();
135
- const disabled = useCombinedStore(
136
- [useMessage, useComposer],
137
- (m, c) => c.isEditing || m.branches.indexOf(m.message.id) <= 0
138
- );
139
- const callback = useCallback5(() => {
140
- const { message, branches } = useMessage.getState();
141
- useThread.getState().switchToBranch(branches[branches.indexOf(message.id) - 1]);
142
- }, [useMessage, useThread]);
143
- if (disabled) return null;
144
- return callback;
145
- };
146
-
147
- // src/primitives/thread/index.ts
148
- var thread_exports = {};
149
- __export(thread_exports, {
150
- Empty: () => ThreadEmpty,
151
- If: () => ThreadIf,
152
- Messages: () => ThreadMessages,
153
- Root: () => ThreadRoot,
154
- ScrollToBottom: () => ThreadScrollToBottom,
155
- Suggestion: () => ThreadSuggestion,
156
- Viewport: () => ThreadViewport
157
- });
158
-
159
- // src/primitives/thread/ThreadRoot.tsx
160
- import {
161
- Primitive
162
- } from "@radix-ui/react-primitive";
163
- import { forwardRef } from "react";
164
- import { jsx } from "react/jsx-runtime";
165
- var ThreadRoot = forwardRef(
166
- (props, ref) => {
167
- return /* @__PURE__ */ jsx(Primitive.div, { ...props, ref });
168
- }
169
- );
170
-
171
- // src/primitives/thread/ThreadIf.tsx
172
- var useThreadIf = (props) => {
173
- const { useThread } = useThreadContext();
174
- return useThread((thread) => {
175
- if (props.empty === true && thread.messages.length !== 0) return false;
176
- if (props.empty === false && thread.messages.length === 0) return false;
177
- if (props.running === true && !thread.isRunning) return false;
178
- if (props.running === false && thread.isRunning) return false;
179
- return true;
180
- });
181
- };
182
- var ThreadIf = ({ children, ...query }) => {
183
- const result = useThreadIf(query);
184
- return result ? children : null;
185
- };
186
-
187
- // src/primitives/thread/ThreadEmpty.tsx
188
- import { jsx as jsx2 } from "react/jsx-runtime";
189
- var ThreadEmpty = ({ children }) => {
190
- return /* @__PURE__ */ jsx2(ThreadIf, { empty: true, children });
191
- };
192
-
193
- // src/primitives/thread/ThreadViewport.tsx
194
- import { composeEventHandlers } from "@radix-ui/primitive";
195
- import { useComposedRefs } from "@radix-ui/react-compose-refs";
196
- import {
197
- Primitive as Primitive2
198
- } from "@radix-ui/react-primitive";
199
- import { forwardRef as forwardRef2, useRef } from "react";
200
-
201
- // src/utils/hooks/useOnResizeContent.tsx
202
- import { useCallbackRef } from "@radix-ui/react-use-callback-ref";
203
- import { useEffect } from "react";
204
- var useOnResizeContent = (ref, callback) => {
205
- const callbackRef = useCallbackRef(callback);
206
- useEffect(() => {
207
- const el = ref.current;
208
- if (!el) return;
209
- const resizeObserver = new ResizeObserver(() => {
210
- callbackRef();
211
- });
212
- const mutationObserver = new MutationObserver((mutations) => {
213
- for (const mutation of mutations) {
214
- for (const node of mutation.addedNodes) {
215
- if (node instanceof Element) {
216
- resizeObserver.observe(node);
217
- }
218
- }
219
- for (const node of mutation.removedNodes) {
220
- if (node instanceof Element) {
221
- resizeObserver.unobserve(node);
222
- }
223
- }
224
- }
225
- callbackRef();
226
- });
227
- resizeObserver.observe(el);
228
- mutationObserver.observe(el, { childList: true });
229
- for (const child of el.children) {
230
- resizeObserver.observe(child);
231
- }
232
- return () => {
233
- resizeObserver.disconnect();
234
- mutationObserver.disconnect();
235
- };
236
- }, [ref.current, callbackRef]);
237
- };
238
-
239
- // src/utils/hooks/useOnScrollToBottom.tsx
240
- import { useCallbackRef as useCallbackRef2 } from "@radix-ui/react-use-callback-ref";
241
- import { useEffect as useEffect2 } from "react";
242
- var useOnScrollToBottom = (callback) => {
243
- const callbackRef = useCallbackRef2(callback);
244
- const { useViewport } = useThreadContext();
245
- useEffect2(() => {
246
- return useViewport.getState().onScrollToBottom(() => {
247
- callbackRef();
248
- });
249
- }, [useViewport, callbackRef]);
250
- };
251
-
252
- // src/primitives/thread/ThreadViewport.tsx
253
- import { jsx as jsx3, jsxs } from "react/jsx-runtime";
254
- var ThreadViewport = forwardRef2(({ autoScroll = true, onScroll, children, ...rest }, forwardedRef) => {
255
- const messagesEndRef = useRef(null);
256
- const divRef = useRef(null);
257
- const ref = useComposedRefs(forwardedRef, divRef);
258
- const { useViewport } = useThreadContext();
259
- const firstRenderRef = useRef(true);
260
- const isScrollingToBottomRef = useRef(false);
261
- const lastScrollTop = useRef(0);
262
- const scrollToBottom = () => {
263
- const div = messagesEndRef.current;
264
- if (!div || !autoScroll) return;
265
- const behavior = firstRenderRef.current ? "instant" : "auto";
266
- firstRenderRef.current = false;
267
- isScrollingToBottomRef.current = true;
268
- div.scrollIntoView({ behavior });
269
- };
270
- useOnResizeContent(divRef, () => {
271
- if (!isScrollingToBottomRef.current && !useViewport.getState().isAtBottom) {
272
- handleScroll();
273
- } else {
274
- scrollToBottom();
275
- }
276
- });
277
- useOnScrollToBottom(() => {
278
- scrollToBottom();
279
- });
280
- const handleScroll = () => {
281
- const div = divRef.current;
282
- if (!div) return;
283
- const isAtBottom = useViewport.getState().isAtBottom;
284
- const newIsAtBottom = div.scrollHeight - div.scrollTop <= div.clientHeight;
285
- if (!newIsAtBottom && lastScrollTop.current < div.scrollTop) {
286
- } else if (newIsAtBottom !== isAtBottom) {
287
- isScrollingToBottomRef.current = false;
288
- useViewport.setState({ isAtBottom: newIsAtBottom });
289
- }
290
- lastScrollTop.current = div.scrollTop;
291
- };
292
- return /* @__PURE__ */ jsxs(
293
- Primitive2.div,
294
- {
295
- ...rest,
296
- onScroll: composeEventHandlers(onScroll, handleScroll),
297
- ref,
298
- children: [
299
- children,
300
- /* @__PURE__ */ jsx3("div", { ref: messagesEndRef })
301
- ]
302
- }
303
- );
304
- });
305
-
306
- // src/context/providers/MessageProvider.tsx
307
- import { useEffect as useEffect3, useState } from "react";
308
- import { create as create2 } from "zustand";
309
-
310
- // src/context/stores/MessageComposer.ts
311
- import { create } from "zustand";
312
-
313
- // src/context/stores/BaseComposer.ts
314
- var makeBaseComposer = (set) => ({
315
- value: "",
316
- setValue: (value) => {
317
- set({ value });
318
- }
319
- });
320
-
321
- // src/context/stores/MessageComposer.ts
322
- var makeEditComposerStore = ({
323
- onEdit,
324
- onSend
325
- }) => create()((set, get, store) => ({
326
- ...makeBaseComposer(set, get, store),
327
- isEditing: false,
328
- edit: () => {
329
- const value = onEdit();
330
- set({ isEditing: true, value });
331
- },
332
- send: () => {
333
- const value = get().value;
334
- set({ isEditing: false });
335
- onSend(value);
336
- },
337
- cancel: () => {
338
- if (!get().isEditing) return false;
339
- set({ isEditing: false });
340
- return true;
341
- }
342
- }));
343
-
344
- // src/context/providers/MessageProvider.tsx
345
- import { jsx as jsx4 } from "react/jsx-runtime";
346
- var getIsLast = (thread, message) => {
347
- return thread.messages[thread.messages.length - 1]?.id === message.id;
348
- };
349
- var syncMessage = (thread, useMessage, messageIndex) => {
350
- const parentId = thread.messages[messageIndex - 1]?.id ?? null;
351
- const message = thread.messages[messageIndex];
352
- if (!message) return;
353
- const isLast = getIsLast(thread, message);
354
- const branches = thread.getBranches(message.id);
355
- const currentState = useMessage.getState();
356
- if (currentState.message === message && currentState.parentId === parentId && currentState.branches === branches && currentState.isLast === isLast)
357
- return;
358
- useMessage.setState({
359
- message,
360
- parentId,
361
- branches,
362
- isLast
363
- });
364
- };
365
- var useMessageContext2 = (messageIndex) => {
366
- const { useThread } = useThreadContext();
367
- const [context] = useState(() => {
368
- const useMessage = create2((set) => ({
369
- message: null,
370
- parentId: null,
371
- branches: [],
372
- isLast: false,
373
- inProgressIndicator: null,
374
- isCopied: false,
375
- isHovering: false,
376
- setInProgressIndicator: (value) => {
377
- set({ inProgressIndicator: value });
378
- },
379
- setIsCopied: (value) => {
380
- set({ isCopied: value });
381
- },
382
- setIsHovering: (value) => {
383
- set({ isHovering: value });
384
- }
385
- }));
386
- const useComposer = makeEditComposerStore({
387
- onEdit: () => {
388
- const message = useMessage.getState().message;
389
- if (message.role !== "user")
390
- throw new Error(
391
- "Tried to edit a non-user message. Editing is only supported for user messages. This is likely an internal bug in assistant-ui."
392
- );
393
- const text = getMessageText(message);
394
- return text;
395
- },
396
- onSend: (text) => {
397
- const { message, parentId } = useMessage.getState();
398
- if (message.role !== "user")
399
- throw new Error(
400
- "Tried to edit a non-user message. Editing is only supported for user messages. This is likely an internal bug in assistant-ui."
401
- );
402
- const nonTextParts = message.content.filter(
403
- (part) => part.type !== "text" && part.type !== "ui"
404
- );
405
- useThread.getState().append({
406
- parentId,
407
- content: [{ type: "text", text }, ...nonTextParts]
408
- });
409
- }
410
- });
411
- syncMessage(useThread.getState(), useMessage, messageIndex);
412
- return { useMessage, useComposer };
413
- });
414
- useEffect3(() => {
415
- return useThread.subscribe((thread) => {
416
- syncMessage(thread, context.useMessage, messageIndex);
417
- });
418
- }, [context, useThread, messageIndex]);
419
- return context;
420
- };
421
- var MessageProvider = ({
422
- messageIndex,
423
- children
424
- }) => {
425
- const context = useMessageContext2(messageIndex);
426
- return /* @__PURE__ */ jsx4(MessageContext.Provider, { value: context, children });
427
- };
428
-
429
- // src/primitives/composer/ComposerIf.tsx
430
- var useComposerIf = (props) => {
431
- const { useComposer } = useComposerContext();
432
- return useComposer((composer) => {
433
- if (props.editing === true && !composer.isEditing) return false;
434
- if (props.editing === false && composer.isEditing) return false;
435
- return true;
436
- });
437
- };
438
- var ComposerIf = ({ children, ...query }) => {
439
- const result = useComposerIf(query);
440
- return result ? children : null;
441
- };
442
-
443
- // src/primitives/message/MessageIf.tsx
444
- var useMessageIf = (props) => {
445
- const { useMessage } = useMessageContext();
446
- return useMessage(({ message, branches, isLast, isCopied, isHovering }) => {
447
- if (props.hasBranches === true && branches.length < 2) return false;
448
- if (props.user && message.role !== "user") return false;
449
- if (props.assistant && message.role !== "assistant") return false;
450
- if (props.lastOrHover === true && !isHovering && !isLast) return false;
451
- if (props.copied === true && !isCopied) return false;
452
- if (props.copied === false && isCopied) return false;
453
- return true;
454
- });
455
- };
456
- var MessageIf = ({ children, ...query }) => {
457
- const result = useMessageIf(query);
458
- return result ? children : null;
459
- };
460
-
461
- // src/primitives/thread/ThreadMessages.tsx
462
- import { Fragment, jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
463
- var getComponents = (components) => {
464
- return {
465
- EditComposer: components.EditComposer ?? components.UserMessage ?? components.Message,
466
- UserMessage: components.UserMessage ?? components.Message,
467
- AssistantMessage: components.AssistantMessage ?? components.Message
468
- };
469
- };
470
- var ThreadMessages = ({ components }) => {
471
- const { useThread } = useThreadContext();
472
- const messagesLength = useThread((t) => t.messages.length);
473
- const { UserMessage, EditComposer, AssistantMessage } = getComponents(components);
474
- if (messagesLength === 0) return null;
475
- return /* @__PURE__ */ jsx5(Fragment, { children: new Array(messagesLength).fill(null).map((_, idx) => {
476
- const messageIndex = idx;
477
- return /* @__PURE__ */ jsxs2(
478
- MessageProvider,
479
- {
480
- messageIndex,
481
- children: [
482
- /* @__PURE__ */ jsxs2(MessageIf, { user: true, children: [
483
- /* @__PURE__ */ jsx5(ComposerIf, { editing: false, children: /* @__PURE__ */ jsx5(UserMessage, {}) }),
484
- /* @__PURE__ */ jsx5(ComposerIf, { editing: true, children: /* @__PURE__ */ jsx5(EditComposer, {}) })
485
- ] }),
486
- /* @__PURE__ */ jsx5(MessageIf, { assistant: true, children: /* @__PURE__ */ jsx5(AssistantMessage, {}) })
487
- ]
488
- },
489
- messageIndex
490
- );
491
- }) });
492
- };
493
-
494
- // src/primitives/thread/ThreadScrollToBottom.tsx
495
- import { composeEventHandlers as composeEventHandlers2 } from "@radix-ui/primitive";
496
- import {
497
- Primitive as Primitive3
498
- } from "@radix-ui/react-primitive";
499
- import { forwardRef as forwardRef3 } from "react";
500
- import { jsx as jsx6 } from "react/jsx-runtime";
501
- var ThreadScrollToBottom = forwardRef3(({ onClick, ...rest }, ref) => {
502
- const { useViewport } = useThreadContext();
503
- const isAtBottom = useViewport((s) => s.isAtBottom);
504
- const handleScrollToBottom = () => {
505
- useViewport.getState().scrollToBottom();
506
- };
507
- return /* @__PURE__ */ jsx6(
508
- Primitive3.button,
509
- {
510
- ...rest,
511
- disabled: isAtBottom,
512
- ref,
513
- onClick: composeEventHandlers2(onClick, handleScrollToBottom)
514
- }
515
- );
516
- });
517
-
518
- // src/primitives/thread/ThreadSuggestion.tsx
519
- import { composeEventHandlers as composeEventHandlers3 } from "@radix-ui/primitive";
520
- import {
521
- Primitive as Primitive4
522
- } from "@radix-ui/react-primitive";
523
- import { forwardRef as forwardRef4 } from "react";
524
- import { jsx as jsx7 } from "react/jsx-runtime";
525
- var ThreadSuggestion = forwardRef4(({ onClick, prompt, method, autoSend: send, ...rest }, ref) => {
526
- const { useThread, useComposer } = useThreadContext();
527
- const isDisabled = useThread((t) => t.isRunning);
528
- const handleApplySuggestion = () => {
529
- const thread = useThread.getState();
530
- const composer = useComposer.getState();
531
- composer.setValue(prompt);
532
- if (send && !thread.isRunning) {
533
- composer.send();
534
- }
535
- };
536
- return /* @__PURE__ */ jsx7(
537
- Primitive4.button,
538
- {
539
- ...rest,
540
- disabled: isDisabled,
541
- ref,
542
- onClick: composeEventHandlers3(onClick, handleApplySuggestion)
543
- }
544
- );
545
- });
546
-
547
- // src/primitives/composer/index.ts
548
- var composer_exports = {};
549
- __export(composer_exports, {
550
- Cancel: () => ComposerCancel,
551
- If: () => ComposerIf,
552
- Input: () => ComposerInput,
553
- Root: () => ComposerRoot,
554
- Send: () => ComposerSend
555
- });
556
-
557
- // src/primitives/composer/ComposerRoot.tsx
558
- import { composeEventHandlers as composeEventHandlers4 } from "@radix-ui/primitive";
559
- import { useComposedRefs as useComposedRefs2 } from "@radix-ui/react-compose-refs";
560
- import {
561
- Primitive as Primitive5
562
- } from "@radix-ui/react-primitive";
563
- import { forwardRef as forwardRef5, useRef as useRef2 } from "react";
564
- import { jsx as jsx8 } from "react/jsx-runtime";
565
- var ComposerRoot = forwardRef5(
566
- ({ onSubmit, ...rest }, forwardedRef) => {
567
- const { useViewport } = useThreadContext();
568
- const { useComposer } = useComposerContext();
569
- const formRef = useRef2(null);
570
- const ref = useComposedRefs2(forwardedRef, formRef);
571
- const handleSubmit = (e) => {
572
- const composerState = useComposer.getState();
573
- if (!composerState.isEditing) return;
574
- e.preventDefault();
575
- composerState.send();
576
- useViewport.getState().scrollToBottom();
577
- };
578
- return /* @__PURE__ */ jsx8(
579
- Primitive5.form,
580
- {
581
- ...rest,
582
- ref,
583
- onSubmit: composeEventHandlers4(onSubmit, handleSubmit)
584
- }
585
- );
586
- }
587
- );
588
-
589
- // src/primitives/composer/ComposerInput.tsx
590
- import { composeEventHandlers as composeEventHandlers5 } from "@radix-ui/primitive";
591
- import { useComposedRefs as useComposedRefs3 } from "@radix-ui/react-compose-refs";
592
- import { Slot } from "@radix-ui/react-slot";
593
- import {
594
- forwardRef as forwardRef6,
595
- useCallback as useCallback6,
596
- useEffect as useEffect4,
597
- useRef as useRef3
598
- } from "react";
599
- import TextareaAutosize from "react-textarea-autosize";
600
- import { jsx as jsx9 } from "react/jsx-runtime";
601
- var ComposerInput = forwardRef6(
602
- ({ autoFocus = false, asChild, disabled, onChange, onKeyDown, ...rest }, forwardedRef) => {
603
- const { useThread, useViewport } = useThreadContext();
604
- const { useComposer, type } = useComposerContext();
605
- const value = useComposer((c) => {
606
- if (!c.isEditing) return "";
607
- return c.value;
608
- });
609
- const Component = asChild ? Slot : TextareaAutosize;
610
- const handleKeyPress = (e) => {
611
- if (disabled) return;
612
- const composer = useComposer.getState();
613
- if (e.key === "Escape") {
614
- if (useComposer.getState().cancel()) {
615
- e.preventDefault();
616
- }
617
- } else if (e.key === "Enter" && e.shiftKey === false) {
618
- const isRunning = useThread.getState().isRunning;
619
- if (!isRunning) {
620
- e.preventDefault();
621
- composer.send();
622
- useViewport.getState().scrollToBottom();
623
- }
624
- }
625
- };
626
- const textareaRef = useRef3(null);
627
- const ref = useComposedRefs3(forwardedRef, textareaRef);
628
- const autoFocusEnabled = autoFocus && !disabled;
629
- const focus = useCallback6(() => {
630
- const textarea = textareaRef.current;
631
- if (!textarea || !autoFocusEnabled) return;
632
- textarea.focus();
633
- textarea.setSelectionRange(
634
- textareaRef.current.value.length,
635
- textareaRef.current.value.length
636
- );
637
- }, [autoFocusEnabled]);
638
- useEffect4(() => focus(), [focus]);
639
- useOnScrollToBottom(() => {
640
- if (type === "new") {
641
- focus();
642
- }
643
- });
644
- return /* @__PURE__ */ jsx9(
645
- Component,
646
- {
647
- value,
648
- ...rest,
649
- ref,
650
- disabled,
651
- onChange: composeEventHandlers5(onChange, (e) => {
652
- const composerState = useComposer.getState();
653
- if (!composerState.isEditing) return;
654
- return composerState.setValue(e.target.value);
655
- }),
656
- onKeyDown: composeEventHandlers5(onKeyDown, handleKeyPress)
657
- }
658
- );
659
- }
660
- );
661
-
662
- // src/primitives/composer/ComposerSend.tsx
663
- import {
664
- Primitive as Primitive6
665
- } from "@radix-ui/react-primitive";
666
- import { forwardRef as forwardRef7 } from "react";
667
- import { jsx as jsx10 } from "react/jsx-runtime";
668
- var ComposerSend = forwardRef7(
669
- ({ disabled, ...rest }, ref) => {
670
- const { useComposer } = useComposerContext();
671
- const hasValue = useComposer((c) => c.isEditing && c.value.length > 0);
672
- return /* @__PURE__ */ jsx10(
673
- Primitive6.button,
674
- {
675
- type: "submit",
676
- ...rest,
677
- ref,
678
- disabled: disabled || !hasValue
679
- }
680
- );
681
- }
682
- );
683
-
684
- // src/primitives/composer/ComposerCancel.tsx
685
- import { composeEventHandlers as composeEventHandlers6 } from "@radix-ui/primitive";
686
- import {
687
- Primitive as Primitive7
688
- } from "@radix-ui/react-primitive";
689
- import { forwardRef as forwardRef8 } from "react";
690
- import { jsx as jsx11 } from "react/jsx-runtime";
691
- var ComposerCancel = forwardRef8(({ onClick, ...rest }, ref) => {
692
- const { useComposer } = useComposerContext();
693
- const handleCancel = () => {
694
- useComposer.getState().cancel();
695
- };
696
- return /* @__PURE__ */ jsx11(
697
- Primitive7.button,
698
- {
699
- type: "button",
700
- ...rest,
701
- ref,
702
- onClick: composeEventHandlers6(onClick, handleCancel)
703
- }
704
- );
705
- });
706
-
707
- // src/primitives/message/index.ts
708
- var message_exports = {};
709
- __export(message_exports, {
710
- Content: () => MessageContent,
711
- If: () => MessageIf,
712
- InProgress: () => MessageInProgress,
713
- Root: () => MessageRoot
714
- });
715
-
716
- // src/primitives/message/MessageRoot.tsx
717
- import { composeEventHandlers as composeEventHandlers7 } from "@radix-ui/primitive";
718
- import {
719
- Primitive as Primitive8
720
- } from "@radix-ui/react-primitive";
721
- import { forwardRef as forwardRef9 } from "react";
722
- import { jsx as jsx12 } from "react/jsx-runtime";
723
- var MessageRoot = forwardRef9(
724
- ({ onMouseEnter, onMouseLeave, ...rest }, ref) => {
725
- const { useMessage } = useMessageContext();
726
- const setIsHovering = useMessage((s) => s.setIsHovering);
727
- const handleMouseEnter = () => {
728
- setIsHovering(true);
729
- };
730
- const handleMouseLeave = () => {
731
- setIsHovering(false);
732
- };
733
- return /* @__PURE__ */ jsx12(
734
- Primitive8.div,
735
- {
736
- ...rest,
737
- ref,
738
- onMouseEnter: composeEventHandlers7(onMouseEnter, handleMouseEnter),
739
- onMouseLeave: composeEventHandlers7(onMouseLeave, handleMouseLeave)
740
- }
741
- );
742
- }
743
- );
744
-
745
- // src/context/providers/ContentPartProvider.tsx
746
- import { useEffect as useEffect5, useState as useState2 } from "react";
747
- import { create as create3 } from "zustand";
748
- import { jsx as jsx13 } from "react/jsx-runtime";
749
- var syncContentPart = ({ message }, useContentPart, partIndex) => {
750
- const part = message.content[partIndex];
751
- if (!part) return;
752
- const messageStatus = message.role === "assistant" ? message.status : "done";
753
- const status = partIndex === message.content.length - 1 ? messageStatus : "done";
754
- useContentPart.setState({ part, status });
755
- };
756
- var useContentPartContext2 = (partIndex) => {
757
- const { useMessage } = useMessageContext();
758
- const [context] = useState2(() => {
759
- const useContentPart = create3(() => ({
760
- part: { type: "text", text: "" },
761
- status: "done"
762
- }));
763
- syncContentPart(useMessage.getState(), useContentPart, partIndex);
764
- return { useContentPart };
765
- });
766
- useEffect5(() => {
767
- return useMessage.subscribe((message) => {
768
- syncContentPart(message, context.useContentPart, partIndex);
769
- });
770
- }, [context, useMessage, partIndex]);
771
- return context;
772
- };
773
- var ContentPartProvider = ({
774
- partIndex,
775
- children
776
- }) => {
777
- const context = useContentPartContext2(partIndex);
778
- return /* @__PURE__ */ jsx13(ContentPartContext.Provider, { value: context, children });
779
- };
780
-
781
- // src/primitives/contentPart/ContentPartInProgressIndicator.tsx
782
- var ContentPartInProgressIndicator = () => {
783
- const { useMessage } = useMessageContext();
784
- const { useContentPart } = useContentPartContext();
785
- const indicator = useCombinedStore(
786
- [useMessage, useContentPart],
787
- (m, c) => c.status === "in_progress" ? m.inProgressIndicator : null
788
- );
789
- return indicator;
790
- };
791
-
792
- // src/primitives/message/MessageContent.tsx
793
- import { Fragment as Fragment2, jsx as jsx14, jsxs as jsxs3 } from "react/jsx-runtime";
794
- var defaultComponents = {
795
- Text: ({ part }) => /* @__PURE__ */ jsxs3(Fragment2, { children: [
796
- part.text,
797
- /* @__PURE__ */ jsx14(ContentPartInProgressIndicator, {})
798
- ] }),
799
- Image: () => null,
800
- UI: ({ part }) => part.display,
801
- tools: {
802
- Fallback: () => null
803
- }
804
- };
805
- var MessageContent = ({
806
- components: {
807
- Text = defaultComponents.Text,
808
- Image = defaultComponents.Image,
809
- UI = defaultComponents.UI,
810
- tools: { by_name = {}, Fallback = defaultComponents.tools.Fallback } = {}
811
- } = {}
812
- }) => {
813
- const { useMessage } = useMessageContext();
814
- const message = useMessage((s) => s.message);
815
- const content = message.content;
816
- return /* @__PURE__ */ jsx14(Fragment2, { children: content.map((part, i) => {
817
- const partIndex = i;
818
- const type = part.type;
819
- let component = null;
820
- switch (type) {
821
- case "text":
822
- component = /* @__PURE__ */ jsx14(Text, { part });
823
- break;
824
- case "image":
825
- component = /* @__PURE__ */ jsx14(Image, { part });
826
- break;
827
- case "ui":
828
- component = /* @__PURE__ */ jsx14(UI, { part });
829
- break;
830
- case "tool-call": {
831
- const Tool = by_name[part.name] || Fallback;
832
- component = /* @__PURE__ */ jsx14(Tool, { part });
833
- break;
834
- }
835
- default:
836
- throw new Error(`Unknown content part type: ${type}`);
837
- }
838
- return /* @__PURE__ */ jsx14(ContentPartProvider, { partIndex, children: component }, partIndex);
839
- }) });
840
- };
841
-
842
- // src/primitives/message/MessageInProgress.tsx
843
- import {
844
- Primitive as Primitive9
845
- } from "@radix-ui/react-primitive";
846
- import { forwardRef as forwardRef10, useMemo as useMemo2 } from "react";
847
- import { jsx as jsx15 } from "react/jsx-runtime";
848
- var MessageInProgress = forwardRef10((props, ref) => {
849
- const { useMessage } = useMessageContext();
850
- useMemo2(() => {
851
- useMessage.getState().setInProgressIndicator(/* @__PURE__ */ jsx15(Primitive9.span, { ...props, ref }));
852
- }, [useMessage, props, ref]);
853
- return null;
854
- });
855
-
856
- // src/primitives/branchPicker/index.ts
857
- var branchPicker_exports = {};
858
- __export(branchPicker_exports, {
859
- Count: () => BranchPickerCount,
860
- Next: () => BranchPickerNext,
861
- Number: () => BranchPickerNumber,
862
- Previous: () => BranchPickerPrevious,
863
- Root: () => BranchPickerRoot
864
- });
865
-
866
- // src/utils/createActionButton.tsx
867
- import { composeEventHandlers as composeEventHandlers8 } from "@radix-ui/primitive";
868
- import {
869
- Primitive as Primitive10
870
- } from "@radix-ui/react-primitive";
871
- import { forwardRef as forwardRef11 } from "react";
872
- import { jsx as jsx16 } from "react/jsx-runtime";
873
- var createActionButton = (useActionButton) => {
874
- return forwardRef11(
875
- (props, forwardedRef) => {
876
- const onClick = useActionButton(props);
877
- return /* @__PURE__ */ jsx16(
878
- Primitive10.button,
879
- {
880
- type: "button",
881
- disabled: !onClick,
882
- ...props,
883
- ref: forwardedRef,
884
- onClick: composeEventHandlers8(props.onClick, onClick ?? void 0)
885
- }
886
- );
887
- }
888
- );
889
- };
890
-
891
- // src/primitives/branchPicker/BranchPickerNext.tsx
892
- var BranchPickerNext = createActionButton(useGoToNextBranch);
893
-
894
- // src/primitives/branchPicker/BranchPickerPrevious.tsx
895
- var BranchPickerPrevious = createActionButton(useGoToPreviousBranch);
896
-
897
- // src/primitives/branchPicker/BranchPickerCount.tsx
898
- import { Fragment as Fragment3, jsx as jsx17 } from "react/jsx-runtime";
899
- var BranchPickerCount = () => {
900
- const { useMessage } = useMessageContext();
901
- const branchCount = useMessage((s) => s.branches.length);
902
- return /* @__PURE__ */ jsx17(Fragment3, { children: branchCount });
903
- };
904
-
905
- // src/primitives/branchPicker/BranchPickerNumber.tsx
906
- import { Fragment as Fragment4, jsx as jsx18 } from "react/jsx-runtime";
907
- var BranchPickerNumber = () => {
908
- const { useMessage } = useMessageContext();
909
- const branchIdx = useMessage((s) => s.branches.indexOf(s.message.id));
910
- return /* @__PURE__ */ jsx18(Fragment4, { children: branchIdx + 1 });
911
- };
912
-
913
- // src/primitives/branchPicker/BranchPickerRoot.tsx
914
- import {
915
- Primitive as Primitive11
916
- } from "@radix-ui/react-primitive";
917
- import { forwardRef as forwardRef12 } from "react";
918
- import { jsx as jsx19 } from "react/jsx-runtime";
919
- var BranchPickerRoot = forwardRef12(({ hideWhenSingleBranch, ...rest }, ref) => {
920
- return /* @__PURE__ */ jsx19(MessageIf, { hasBranches: hideWhenSingleBranch ? true : void 0, children: /* @__PURE__ */ jsx19(Primitive11.div, { ...rest, ref }) });
921
- });
922
-
923
- // src/primitives/actionBar/index.ts
924
- var actionBar_exports = {};
925
- __export(actionBar_exports, {
926
- Copy: () => ActionBarCopy,
927
- Edit: () => ActionBarEdit,
928
- Reload: () => ActionBarReload,
929
- Root: () => ActionBarRoot
930
- });
931
-
932
- // src/primitives/actionBar/ActionBarRoot.tsx
933
- import {
934
- Primitive as Primitive12
935
- } from "@radix-ui/react-primitive";
936
- import { forwardRef as forwardRef13 } from "react";
937
- import { jsx as jsx20 } from "react/jsx-runtime";
938
- var ActionBarRoot = forwardRef13(({ hideWhenRunning, autohide, autohideFloat, ...rest }, ref) => {
939
- const { useThread } = useThreadContext();
940
- const { useMessage } = useMessageContext();
941
- const hideAndfloatStatus = useCombinedStore(
942
- [useThread, useMessage],
943
- (t, m) => {
944
- if (hideWhenRunning && t.isRunning) return "hidden" /* Hidden */;
945
- const autohideEnabled = autohide === "always" || autohide === "not-last" && !m.isLast;
946
- if (!autohideEnabled) return "normal" /* Normal */;
947
- if (!m.isHovering) return "hidden" /* Hidden */;
948
- if (autohideFloat === "always" || autohideFloat === "single-branch" && m.branches.length <= 1)
949
- return "floating" /* Floating */;
950
- return "normal" /* Normal */;
951
- }
952
- );
953
- if (hideAndfloatStatus === "hidden" /* Hidden */) return null;
954
- return /* @__PURE__ */ jsx20(
955
- Primitive12.div,
956
- {
957
- "data-floating": hideAndfloatStatus === "floating" /* Floating */,
958
- ...rest,
959
- ref
960
- }
961
- );
962
- });
963
-
964
- // src/primitives/actionBar/ActionBarCopy.tsx
965
- var ActionBarCopy = createActionButton(useCopyMessage);
966
-
967
- // src/primitives/actionBar/ActionBarReload.tsx
968
- var ActionBarReload = createActionButton(useReloadMessage);
969
-
970
- // src/primitives/actionBar/ActionBarEdit.tsx
971
- var ActionBarEdit = createActionButton(useBeginMessageEdit);
972
-
973
- // src/primitives/contentPart/index.ts
974
- var contentPart_exports = {};
975
- __export(contentPart_exports, {
976
- InProgressIndicator: () => ContentPartInProgressIndicator
977
- });
978
-
979
- // src/runtime/local/useLocalRuntime.tsx
980
- import { useInsertionEffect, useState as useState3 } from "react";
981
-
982
- // src/runtime/local/LocalRuntime.tsx
983
- var LocalRuntime = class {
984
- constructor(adapter) {
985
- this.adapter = adapter;
986
- }
987
- _subscriptions = /* @__PURE__ */ new Set();
988
- _configProviders = /* @__PURE__ */ new Set();
989
- abortController = null;
990
- repository = new MessageRepository();
991
- get messages() {
992
- return this.repository.getMessages();
993
- }
994
- get isRunning() {
995
- return this.abortController != null;
996
- }
997
- getBranches(messageId) {
998
- return this.repository.getBranches(messageId);
999
- }
1000
- switchToBranch(branchId) {
1001
- this.repository.switchToBranch(branchId);
1002
- this.notifySubscribers();
1003
- }
1004
- async append(message) {
1005
- const userMessageId = generateId();
1006
- const userMessage = {
1007
- id: userMessageId,
1008
- role: "user",
1009
- content: message.content,
1010
- createdAt: /* @__PURE__ */ new Date()
1011
- };
1012
- this.repository.addOrUpdateMessage(message.parentId, userMessage);
1013
- await this.startRun(userMessageId);
1014
- }
1015
- async startRun(parentId) {
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
- }
1053
- }
1054
- cancelRun() {
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();
1062
- }
1063
- subscribe(callback) {
1064
- this._subscriptions.add(callback);
1065
- return () => this._subscriptions.delete(callback);
1066
- }
1067
- registerModelConfigProvider(provider) {
1068
- this._configProviders.add(provider);
1069
- return () => this._configProviders.delete(provider);
1070
- }
1071
- };
1072
-
1073
- // src/runtime/local/useLocalRuntime.tsx
1074
- var useLocalRuntime = (adapter) => {
1075
- const [runtime] = useState3(() => new LocalRuntime(adapter));
1076
- useInsertionEffect(() => {
1077
- runtime.adapter = adapter;
1078
- });
1079
- return runtime;
1080
- };
1081
-
1082
- // src/context/providers/AssistantRuntimeProvider.tsx
1083
- import { memo } from "react";
1084
-
1085
- // src/context/providers/AssistantProvider.tsx
1086
- import { useEffect as useEffect7, useInsertionEffect as useInsertionEffect3, useRef as useRef5, useState as useState5 } from "react";
1087
-
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);
1098
- }
1099
- };
1100
- });
1101
-
1102
- // src/context/providers/ThreadProvider.tsx
1103
- import { useEffect as useEffect6, useInsertionEffect as useInsertionEffect2, useRef as useRef4, useState as useState4 } from "react";
1104
-
1105
- // src/context/stores/Composer.ts
1106
- import { create as create5 } from "zustand";
1107
- var makeComposerStore = (useThread) => create5()((set, get, store) => {
1108
- return {
1109
- ...makeBaseComposer(set, get, store),
1110
- isEditing: true,
1111
- send: () => {
1112
- const { setValue, value } = get();
1113
- setValue("");
1114
- useThread.getState().append({
1115
- parentId: useThread.getState().messages.at(-1)?.id ?? null,
1116
- content: [{ type: "text", text: value }]
1117
- });
1118
- },
1119
- cancel: () => {
1120
- const thread = useThread.getState();
1121
- if (!thread.isRunning) return false;
1122
- useThread.getState().cancelRun();
1123
- return true;
1124
- }
1125
- };
1126
- });
1127
-
1128
- // src/context/stores/Thread.ts
1129
- import { create as create6 } from "zustand";
1130
- var makeThreadStore = (runtimeRef) => {
1131
- const useThread = create6(() => ({
1132
- messages: runtimeRef.current.messages,
1133
- isRunning: runtimeRef.current.isRunning,
1134
- getBranches: (messageId) => runtimeRef.current.getBranches(messageId),
1135
- switchToBranch: (branchId) => runtimeRef.current.switchToBranch(branchId),
1136
- startRun: (parentId) => runtimeRef.current.startRun(parentId),
1137
- append: (message) => runtimeRef.current.append(message),
1138
- cancelRun: () => runtimeRef.current.cancelRun()
1139
- }));
1140
- const onRuntimeUpdate = () => {
1141
- useThread.setState({
1142
- messages: runtimeRef.current.messages,
1143
- isRunning: runtimeRef.current.isRunning
1144
- });
1145
- };
1146
- return {
1147
- useThread,
1148
- onRuntimeUpdate
1149
- };
1150
- };
1151
-
1152
- // src/context/stores/ThreadViewport.tsx
1153
- import { create as create7 } from "zustand";
1154
- var makeThreadViewportStore = () => {
1155
- const scrollToBottomListeners = /* @__PURE__ */ new Set();
1156
- return create7(() => ({
1157
- isAtBottom: true,
1158
- scrollToBottom: () => {
1159
- for (const listener of scrollToBottomListeners) {
1160
- listener();
1161
- }
1162
- },
1163
- onScrollToBottom: (callback) => {
1164
- scrollToBottomListeners.add(callback);
1165
- return () => {
1166
- scrollToBottomListeners.delete(callback);
1167
- };
1168
- }
1169
- }));
1170
- };
1171
-
1172
- // src/context/providers/ThreadProvider.tsx
1173
- import { jsx as jsx21, jsxs as jsxs4 } from "react/jsx-runtime";
1174
- var ThreadProvider = ({
1175
- children,
1176
- runtime
1177
- }) => {
1178
- const runtimeRef = useRef4(runtime);
1179
- useInsertionEffect2(() => {
1180
- runtimeRef.current = runtime;
1181
- });
1182
- const [{ context, onRuntimeUpdate }] = useState4(() => {
1183
- const { useThread, onRuntimeUpdate: onRuntimeUpdate2 } = makeThreadStore(runtimeRef);
1184
- const useViewport = makeThreadViewportStore();
1185
- const useComposer = makeComposerStore(useThread);
1186
- return {
1187
- context: {
1188
- useViewport,
1189
- useThread,
1190
- useComposer
1191
- },
1192
- onRuntimeUpdate: onRuntimeUpdate2
1193
- };
1194
- });
1195
- useEffect6(() => {
1196
- onRuntimeUpdate();
1197
- return runtime.subscribe(onRuntimeUpdate);
1198
- }, [onRuntimeUpdate, runtime]);
1199
- const RuntimeSynchronizer = runtime.unstable_synchronizer;
1200
- return /* @__PURE__ */ jsxs4(ThreadContext.Provider, { value: context, children: [
1201
- RuntimeSynchronizer && /* @__PURE__ */ jsx21(RuntimeSynchronizer, {}),
1202
- children
1203
- ] });
1204
- };
1205
-
1206
- // src/context/providers/AssistantProvider.tsx
1207
- import { jsx as jsx22 } from "react/jsx-runtime";
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 }) });
1222
- };
1223
-
1224
- // src/context/providers/AssistantRuntimeProvider.tsx
1225
- import { jsx as jsx23 } from "react/jsx-runtime";
1226
- var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
1227
- return /* @__PURE__ */ jsx23(AssistantProvider, { runtime, children });
1228
- };
1229
- var AssistantRuntimeProvider = memo(AssistantRuntimeProviderImpl);
1230
- export {
1231
- actionBar_exports as ActionBarPrimitive,
1232
- AssistantRuntimeProvider,
1233
- branchPicker_exports as BranchPickerPrimitive,
1234
- composer_exports as ComposerPrimitive,
1235
- contentPart_exports as ContentPartPrimitive,
1236
- message_exports as MessagePrimitive,
1237
- thread_exports as ThreadPrimitive,
1238
- useBeginMessageEdit,
1239
- useCopyMessage,
1240
- useGoToNextBranch,
1241
- useGoToPreviousBranch,
1242
- useLocalRuntime,
1243
- useReloadMessage
1244
- };
1245
- //# sourceMappingURL=index.mjs.map