@assistant-ui/react 0.1.12 → 0.2.2

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/index.mjs CHANGED
@@ -1,24 +1,479 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ // src/context/providers/AssistantRuntimeProvider.tsx
8
+ import { memo } from "react";
9
+
10
+ // src/context/providers/AssistantProvider.tsx
11
+ import { useEffect as useEffect2, useInsertionEffect as useInsertionEffect2, useRef as useRef2, useState as useState2 } from "react";
12
+
13
+ // src/context/react/AssistantContext.ts
14
+ import { createContext, useContext } from "react";
15
+ var AssistantContext = createContext(
16
+ null
17
+ );
18
+ var useAssistantContext = () => {
19
+ const context = useContext(AssistantContext);
20
+ if (!context)
21
+ throw new Error(
22
+ "This component must be used within an AssistantRuntimeProvider."
23
+ );
24
+ return context;
25
+ };
26
+
27
+ // src/context/stores/AssistantModelConfig.ts
28
+ import { create } from "zustand";
29
+
30
+ // src/types/ModelConfigTypes.ts
31
+ var mergeModelConfigs = (configSet) => {
32
+ const configs = Array.from(configSet).map((c) => c()).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
33
+ return configs.reduce((acc, config) => {
34
+ if (config.system) {
35
+ if (acc.system) {
36
+ acc.system += `
37
+
38
+ ${config.system}`;
39
+ } else {
40
+ acc.system = config.system;
41
+ }
42
+ }
43
+ if (config.tools) {
44
+ for (const [name, tool] of Object.entries(config.tools)) {
45
+ if (acc.tools?.[name]) {
46
+ throw new Error(
47
+ `You tried to define a tool with the name ${name}, but it already exists.`
48
+ );
49
+ }
50
+ if (!acc.tools) acc.tools = {};
51
+ acc.tools[name] = tool;
52
+ }
53
+ }
54
+ return acc;
55
+ }, {});
56
+ };
57
+
58
+ // src/utils/ProxyConfigProvider.ts
59
+ var ProxyConfigProvider = class {
60
+ _providers = /* @__PURE__ */ new Set();
61
+ getModelConfig() {
62
+ return mergeModelConfigs(this._providers);
63
+ }
64
+ registerModelConfigProvider(provider) {
65
+ this._providers.add(provider);
66
+ return () => {
67
+ this._providers.delete(provider);
68
+ };
69
+ }
70
+ };
71
+
72
+ // src/context/stores/AssistantModelConfig.ts
73
+ var makeAssistantModelConfigStore = () => create(() => {
74
+ const proxy = new ProxyConfigProvider();
75
+ return Object.freeze({
76
+ getModelConfig: () => {
77
+ return proxy.getModelConfig();
78
+ },
79
+ registerModelConfigProvider: (provider) => {
80
+ return proxy.registerModelConfigProvider(provider);
81
+ }
82
+ });
83
+ });
84
+
85
+ // src/context/stores/AssistantToolUIs.ts
86
+ import { create as create2 } from "zustand";
87
+ var makeAssistantToolUIsStore = () => create2((set) => {
88
+ const renderers = /* @__PURE__ */ new Map();
89
+ return Object.freeze({
90
+ getToolUI: (name) => {
91
+ const arr = renderers.get(name);
92
+ const last = arr?.at(-1);
93
+ if (last) return last;
94
+ return null;
95
+ },
96
+ setToolUI: (name, render) => {
97
+ let arr = renderers.get(name);
98
+ if (!arr) {
99
+ arr = [];
100
+ renderers.set(name, arr);
101
+ }
102
+ arr.push(render);
103
+ set({});
104
+ return () => {
105
+ const index = arr.indexOf(render);
106
+ if (index !== -1) {
107
+ arr.splice(index, 1);
108
+ }
109
+ if (index === arr.length) {
110
+ set({});
111
+ }
112
+ };
113
+ }
114
+ });
115
+ });
116
+
117
+ // src/context/providers/ThreadProvider.tsx
1
118
  import {
2
- AssistantContext,
3
- ContentPartContext,
4
- MessageContext,
5
- ThreadContext,
6
- __export,
7
- useAssistantContext,
8
- useComposerContext,
9
- useContentPartContext,
10
- useMessageContext,
11
- useThreadContext
12
- } from "./chunk-KUACYNLE.mjs";
119
+ useCallback,
120
+ useEffect,
121
+ useInsertionEffect,
122
+ useRef,
123
+ useState,
124
+ useSyncExternalStore
125
+ } from "react";
126
+
127
+ // src/context/react/ThreadContext.ts
128
+ import { createContext as createContext2, useContext as useContext2 } from "react";
129
+ var ThreadContext = createContext2(null);
130
+ var useThreadContext = () => {
131
+ const context = useContext2(ThreadContext);
132
+ if (!context)
133
+ throw new Error(
134
+ "This component must be used within an AssistantRuntimeProvider."
135
+ );
136
+ return context;
137
+ };
138
+
139
+ // src/context/stores/Composer.ts
140
+ import { create as create3 } from "zustand";
141
+
142
+ // src/context/stores/BaseComposer.ts
143
+ var makeBaseComposer = (set) => ({
144
+ value: "",
145
+ setValue: (value) => {
146
+ set({ value });
147
+ }
148
+ });
149
+
150
+ // src/context/stores/Composer.ts
151
+ var makeComposerStore = (useThread, useThreadActions) => {
152
+ const focusListeners = /* @__PURE__ */ new Set();
153
+ return create3()((set, get, store) => {
154
+ return {
155
+ ...makeBaseComposer(set, get, store),
156
+ isEditing: true,
157
+ send: () => {
158
+ const { setValue, value } = get();
159
+ setValue("");
160
+ useThreadActions.getState().append({
161
+ parentId: useThread.getState().messages.at(-1)?.id ?? null,
162
+ role: "user",
163
+ content: [{ type: "text", text: value }]
164
+ });
165
+ },
166
+ cancel: () => {
167
+ const thread = useThread.getState();
168
+ if (!thread.isRunning) return false;
169
+ useThreadActions.getState().cancelRun();
170
+ return true;
171
+ },
172
+ focus: () => {
173
+ for (const listener of focusListeners) {
174
+ listener();
175
+ }
176
+ },
177
+ onFocus: (listener) => {
178
+ focusListeners.add(listener);
179
+ return () => {
180
+ focusListeners.delete(listener);
181
+ };
182
+ }
183
+ };
184
+ });
185
+ };
186
+
187
+ // src/context/stores/Thread.ts
188
+ import { create as create4 } from "zustand";
189
+ var makeThreadStore = (runtimeRef) => {
190
+ return create4(() => ({
191
+ messages: runtimeRef.current.messages,
192
+ isRunning: runtimeRef.current.isRunning
193
+ }));
194
+ };
195
+
196
+ // src/context/stores/ThreadViewport.tsx
197
+ import { create as create5 } from "zustand";
198
+ var makeThreadViewportStore = () => {
199
+ const scrollToBottomListeners = /* @__PURE__ */ new Set();
200
+ return create5(() => ({
201
+ isAtBottom: true,
202
+ scrollToBottom: () => {
203
+ for (const listener of scrollToBottomListeners) {
204
+ listener();
205
+ }
206
+ },
207
+ onScrollToBottom: (callback) => {
208
+ scrollToBottomListeners.add(callback);
209
+ return () => {
210
+ scrollToBottomListeners.delete(callback);
211
+ };
212
+ }
213
+ }));
214
+ };
215
+
216
+ // src/context/stores/ThreadActions.ts
217
+ import { create as create6 } from "zustand";
218
+ var makeThreadActionStore = (runtimeRef) => {
219
+ return create6(
220
+ () => Object.freeze({
221
+ getBranches: (messageId) => runtimeRef.current.getBranches(messageId),
222
+ switchToBranch: (branchId) => runtimeRef.current.switchToBranch(branchId),
223
+ startRun: (parentId) => runtimeRef.current.startRun(parentId),
224
+ append: (message) => runtimeRef.current.append(message),
225
+ cancelRun: () => runtimeRef.current.cancelRun(),
226
+ addToolResult: (toolCallId, result) => runtimeRef.current.addToolResult(toolCallId, result)
227
+ })
228
+ );
229
+ };
230
+
231
+ // src/context/providers/ThreadProvider.tsx
232
+ import { jsx, jsxs } from "react/jsx-runtime";
233
+ var ThreadProvider = ({
234
+ children,
235
+ runtime
236
+ }) => {
237
+ const runtimeRef = useRef(runtime);
238
+ useInsertionEffect(() => {
239
+ runtimeRef.current = runtime;
240
+ });
241
+ const [context] = useState(() => {
242
+ const useThread = makeThreadStore(runtimeRef);
243
+ const useThreadActions = makeThreadActionStore(runtimeRef);
244
+ const useViewport = makeThreadViewportStore();
245
+ const useComposer = makeComposerStore(useThread, useThreadActions);
246
+ return {
247
+ useThread,
248
+ useThreadActions,
249
+ useComposer,
250
+ useViewport
251
+ };
252
+ });
253
+ useEffect(() => {
254
+ const onRuntimeUpdate = () => {
255
+ context.useThread.setState(
256
+ Object.freeze({
257
+ messages: runtimeRef.current.messages,
258
+ isRunning: runtimeRef.current.isRunning
259
+ }),
260
+ true
261
+ );
262
+ };
263
+ onRuntimeUpdate();
264
+ return runtime.subscribe(onRuntimeUpdate);
265
+ }, [context, runtime]);
266
+ const subscribe = useCallback(
267
+ (c) => runtime.subscribe(c),
268
+ [runtime]
269
+ );
270
+ const RuntimeSynchronizer = useSyncExternalStore(
271
+ subscribe,
272
+ () => runtime.unstable_synchronizer,
273
+ () => void 0
274
+ );
275
+ return /* @__PURE__ */ jsxs(ThreadContext.Provider, { value: context, children: [
276
+ RuntimeSynchronizer && /* @__PURE__ */ jsx(RuntimeSynchronizer, {}),
277
+ children
278
+ ] });
279
+ };
280
+
281
+ // src/context/stores/AssistantActions.tsx
282
+ import { create as create7 } from "zustand";
283
+ var makeAssistantActionsStore = (runtimeRef) => create7(
284
+ () => Object.freeze({
285
+ switchToThread: () => runtimeRef.current.switchToThread(null)
286
+ })
287
+ );
288
+
289
+ // src/context/providers/AssistantProvider.tsx
290
+ import { jsx as jsx2 } from "react/jsx-runtime";
291
+ var AssistantProvider = ({ children, runtime }) => {
292
+ const runtimeRef = useRef2(runtime);
293
+ useInsertionEffect2(() => {
294
+ runtimeRef.current = runtime;
295
+ });
296
+ const [context] = useState2(() => {
297
+ const useModelConfig = makeAssistantModelConfigStore();
298
+ const useToolUIs = makeAssistantToolUIsStore();
299
+ const useAssistantActions = makeAssistantActionsStore(runtimeRef);
300
+ return { useModelConfig, useToolUIs, useAssistantActions };
301
+ });
302
+ const getModelCOnfig = context.useModelConfig((c) => c.getModelConfig);
303
+ useEffect2(() => {
304
+ return runtime.registerModelConfigProvider(getModelCOnfig);
305
+ }, [runtime, getModelCOnfig]);
306
+ return /* @__PURE__ */ jsx2(AssistantContext.Provider, { value: context, children: /* @__PURE__ */ jsx2(ThreadProvider, { runtime, children }) });
307
+ };
308
+
309
+ // src/context/providers/AssistantRuntimeProvider.tsx
310
+ import { jsx as jsx3 } from "react/jsx-runtime";
311
+ var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
312
+ return /* @__PURE__ */ jsx3(AssistantProvider, { runtime, children });
313
+ };
314
+ var AssistantRuntimeProvider = memo(AssistantRuntimeProviderImpl);
315
+
316
+ // src/context/react/ComposerContext.ts
317
+ import { useContext as useContext4, useMemo } from "react";
318
+
319
+ // src/context/react/MessageContext.ts
320
+ import { createContext as createContext3, useContext as useContext3 } from "react";
321
+ var MessageContext = createContext3(null);
322
+ var useMessageContext = () => {
323
+ const context = useContext3(MessageContext);
324
+ if (!context)
325
+ throw new Error(
326
+ "This component can only be used inside a component passed to <ThreadPrimitive.Messages components={...} />."
327
+ );
328
+ return context;
329
+ };
330
+
331
+ // src/context/react/ComposerContext.ts
332
+ var useComposerContext = () => {
333
+ const { useComposer } = useThreadContext();
334
+ const { useEditComposer } = useContext4(MessageContext) ?? {};
335
+ return useMemo(
336
+ () => ({
337
+ useComposer: useEditComposer ?? useComposer,
338
+ type: useEditComposer ? "edit" : "new"
339
+ }),
340
+ [useEditComposer, useComposer]
341
+ );
342
+ };
343
+
344
+ // src/context/react/ContentPartContext.ts
345
+ import { createContext as createContext4, useContext as useContext5 } from "react";
346
+ var ContentPartContext = createContext4(
347
+ null
348
+ );
349
+ var useContentPartContext = () => {
350
+ const context = useContext5(ContentPartContext);
351
+ if (!context)
352
+ throw new Error(
353
+ "This component can only be used inside a component passed to <MessagePrimitive.Content components={...} >."
354
+ );
355
+ return context;
356
+ };
357
+
358
+ // src/hooks/useAppendMessage.tsx
359
+ import { useCallback as useCallback2 } from "react";
360
+ var toAppendMessage = (useThread, message) => {
361
+ if (typeof message === "string") {
362
+ return {
363
+ parentId: useThread.getState().messages.at(-1)?.id ?? null,
364
+ role: "user",
365
+ content: [{ type: "text", text: message }]
366
+ };
367
+ }
368
+ return {
369
+ parentId: message.parentId ?? useThread.getState().messages.at(-1)?.id ?? null,
370
+ role: message.role ?? "user",
371
+ content: message.content
372
+ };
373
+ };
374
+ var useAppendMessage = () => {
375
+ const { useThread, useThreadActions, useViewport, useComposer } = useThreadContext();
376
+ const append = useCallback2(
377
+ (message) => {
378
+ const appendMessage = toAppendMessage(useThread, message);
379
+ useThreadActions.getState().append(appendMessage);
380
+ useViewport.getState().scrollToBottom();
381
+ useComposer.getState().focus();
382
+ },
383
+ [useThread, useThreadActions, useViewport, useComposer]
384
+ );
385
+ return append;
386
+ };
387
+
388
+ // src/hooks/useSwitchToNewThread.tsx
389
+ import { useCallback as useCallback3 } from "react";
390
+ var useSwitchToNewThread = () => {
391
+ const { useAssistantActions } = useAssistantContext();
392
+ const { useComposer } = useThreadContext();
393
+ const switchToNewThread = useCallback3(() => {
394
+ useAssistantActions.getState().switchToThread(null);
395
+ useComposer.getState().focus();
396
+ }, [useAssistantActions, useComposer]);
397
+ return switchToNewThread;
398
+ };
399
+
400
+ // src/model-config/useAssistantTool.tsx
401
+ import { useEffect as useEffect3 } from "react";
402
+ var useAssistantTool = (tool) => {
403
+ const { useModelConfig, useToolUIs } = useAssistantContext();
404
+ const registerModelConfigProvider = useModelConfig(
405
+ (s) => s.registerModelConfigProvider
406
+ );
407
+ const setToolUI = useToolUIs((s) => s.setToolUI);
408
+ useEffect3(() => {
409
+ const { toolName, render, ...rest } = tool;
410
+ const config = {
411
+ tools: {
412
+ [tool.toolName]: rest
413
+ }
414
+ };
415
+ const unsub1 = registerModelConfigProvider(() => config);
416
+ const unsub2 = render ? setToolUI(toolName, render) : void 0;
417
+ return () => {
418
+ unsub1();
419
+ unsub2?.();
420
+ };
421
+ }, [registerModelConfigProvider, setToolUI, tool]);
422
+ };
423
+
424
+ // src/model-config/makeAssistantTool.tsx
425
+ var makeAssistantTool = (tool) => {
426
+ const Tool = () => {
427
+ useAssistantTool(tool);
428
+ return null;
429
+ };
430
+ return Tool;
431
+ };
432
+
433
+ // src/model-config/useAssistantToolUI.tsx
434
+ import { useEffect as useEffect4 } from "react";
435
+ var useAssistantToolUI = (tool) => {
436
+ const { useToolUIs } = useAssistantContext();
437
+ const setToolUI = useToolUIs((s) => s.setToolUI);
438
+ useEffect4(() => {
439
+ if (!tool) return;
440
+ const { toolName, render } = tool;
441
+ return setToolUI(toolName, render);
442
+ }, [setToolUI, tool]);
443
+ };
444
+
445
+ // src/model-config/makeAssistantToolUI.tsx
446
+ var makeAssistantToolUI = (tool) => {
447
+ const ToolUI = () => {
448
+ useAssistantToolUI(tool);
449
+ return null;
450
+ };
451
+ return ToolUI;
452
+ };
453
+
454
+ // src/model-config/useAssistantInstructions.tsx
455
+ import { useEffect as useEffect5 } from "react";
456
+ var useAssistantInstructions = (instruction) => {
457
+ const { useModelConfig } = useAssistantContext();
458
+ const registerModelConfigProvider = useModelConfig(
459
+ (s) => s.registerModelConfigProvider
460
+ );
461
+ useEffect5(() => {
462
+ const config = {
463
+ system: instruction
464
+ };
465
+ return registerModelConfigProvider(() => config);
466
+ }, [registerModelConfigProvider, instruction]);
467
+ };
13
468
 
14
469
  // src/primitive-hooks/actionBar/useActionBarCopy.tsx
15
- import { useCallback } from "react";
470
+ import { useCallback as useCallback4 } from "react";
16
471
 
17
472
  // src/utils/combined/useCombinedStore.ts
18
- import { useMemo } from "react";
473
+ import { useMemo as useMemo2 } from "react";
19
474
 
20
475
  // src/utils/combined/createCombinedStore.ts
21
- import { useSyncExternalStore } from "react";
476
+ import { useSyncExternalStore as useSyncExternalStore2 } from "react";
22
477
  var createCombinedStore = (stores) => {
23
478
  const subscribe = (callback) => {
24
479
  const unsubscribes = stores.map((store) => store.subscribe(callback));
@@ -30,13 +485,13 @@ var createCombinedStore = (stores) => {
30
485
  };
31
486
  return (selector) => {
32
487
  const getSnapshot = () => selector(...stores.map((store) => store.getState()));
33
- return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
488
+ return useSyncExternalStore2(subscribe, getSnapshot, getSnapshot);
34
489
  };
35
490
  };
36
491
 
37
492
  // src/utils/combined/useCombinedStore.ts
38
493
  var useCombinedStore = (stores, selector) => {
39
- const useCombined = useMemo(() => createCombinedStore(stores), stores);
494
+ const useCombined = useMemo2(() => createCombinedStore(stores), stores);
40
495
  return useCombined(selector);
41
496
  };
42
497
 
@@ -59,7 +514,7 @@ var useActionBarCopy = ({
59
514
  return !c.isEditing && m.message.content.some((c2) => c2.type === "text");
60
515
  }
61
516
  );
62
- const callback = useCallback(() => {
517
+ const callback = useCallback4(() => {
63
518
  const { message } = useMessage.getState();
64
519
  const { setIsCopied } = useMessageUtils.getState();
65
520
  const { isEditing, value: composerValue } = useEditComposer.getState();
@@ -73,14 +528,14 @@ var useActionBarCopy = ({
73
528
  };
74
529
 
75
530
  // src/primitive-hooks/actionBar/useActionBarEdit.tsx
76
- import { useCallback as useCallback2 } from "react";
531
+ import { useCallback as useCallback5 } from "react";
77
532
  var useActionBarEdit = () => {
78
533
  const { useMessage, useEditComposer } = useMessageContext();
79
534
  const disabled = useCombinedStore(
80
535
  [useMessage, useEditComposer],
81
536
  (m, c) => m.message.role !== "user" || c.isEditing
82
537
  );
83
- const callback = useCallback2(() => {
538
+ const callback = useCallback5(() => {
84
539
  const { edit } = useEditComposer.getState();
85
540
  edit();
86
541
  }, [useEditComposer]);
@@ -89,7 +544,7 @@ var useActionBarEdit = () => {
89
544
  };
90
545
 
91
546
  // src/primitive-hooks/actionBar/useActionBarReload.tsx
92
- import { useCallback as useCallback3 } from "react";
547
+ import { useCallback as useCallback6 } from "react";
93
548
  var useActionBarReload = () => {
94
549
  const { useThread, useThreadActions, useComposer, useViewport } = useThreadContext();
95
550
  const { useMessage } = useMessageContext();
@@ -97,7 +552,7 @@ var useActionBarReload = () => {
97
552
  [useThread, useMessage],
98
553
  (t, m) => t.isRunning || m.message.role !== "assistant"
99
554
  );
100
- const callback = useCallback3(() => {
555
+ const callback = useCallback6(() => {
101
556
  const { parentId } = useMessage.getState();
102
557
  useThreadActions.getState().startRun(parentId);
103
558
  useViewport.getState().scrollToBottom();
@@ -115,7 +570,7 @@ var useBranchPickerCount = () => {
115
570
  };
116
571
 
117
572
  // src/primitive-hooks/branchPicker/useBranchPickerNext.tsx
118
- import { useCallback as useCallback4 } from "react";
573
+ import { useCallback as useCallback7 } from "react";
119
574
  var useBranchPickerNext = () => {
120
575
  const { useThreadActions } = useThreadContext();
121
576
  const { useMessage, useEditComposer } = useMessageContext();
@@ -123,7 +578,7 @@ var useBranchPickerNext = () => {
123
578
  [useMessage, useEditComposer],
124
579
  (m, c) => c.isEditing || m.branches.indexOf(m.message.id) + 1 >= m.branches.length
125
580
  );
126
- const callback = useCallback4(() => {
581
+ const callback = useCallback7(() => {
127
582
  const { message, branches } = useMessage.getState();
128
583
  useThreadActions.getState().switchToBranch(branches[branches.indexOf(message.id) + 1]);
129
584
  }, [useThreadActions, useMessage]);
@@ -139,7 +594,7 @@ var useBranchPickerNumber = () => {
139
594
  };
140
595
 
141
596
  // src/primitive-hooks/branchPicker/useBranchPickerPrevious.tsx
142
- import { useCallback as useCallback5 } from "react";
597
+ import { useCallback as useCallback8 } from "react";
143
598
  var useBranchPickerPrevious = () => {
144
599
  const { useThreadActions } = useThreadContext();
145
600
  const { useMessage, useEditComposer } = useMessageContext();
@@ -147,7 +602,7 @@ var useBranchPickerPrevious = () => {
147
602
  [useMessage, useEditComposer],
148
603
  (m, c) => c.isEditing || m.branches.indexOf(m.message.id) <= 0
149
604
  );
150
- const callback = useCallback5(() => {
605
+ const callback = useCallback8(() => {
151
606
  const { message, branches } = useMessage.getState();
152
607
  useThreadActions.getState().switchToBranch(branches[branches.indexOf(message.id) - 1]);
153
608
  }, [useThreadActions, useMessage]);
@@ -156,11 +611,11 @@ var useBranchPickerPrevious = () => {
156
611
  };
157
612
 
158
613
  // src/primitive-hooks/composer/useComposerCancel.tsx
159
- import { useCallback as useCallback6 } from "react";
614
+ import { useCallback as useCallback9 } from "react";
160
615
  var useComposerCancel = () => {
161
616
  const { useComposer } = useComposerContext();
162
617
  const disabled = useComposer((c) => !c.isEditing);
163
- const callback = useCallback6(() => {
618
+ const callback = useCallback9(() => {
164
619
  const { cancel } = useComposer.getState();
165
620
  cancel();
166
621
  }, [useComposer]);
@@ -179,12 +634,12 @@ var useComposerIf = (props) => {
179
634
  };
180
635
 
181
636
  // src/primitive-hooks/composer/useComposerSend.tsx
182
- import { useCallback as useCallback7 } from "react";
637
+ import { useCallback as useCallback10 } from "react";
183
638
  var useComposerSend = () => {
184
639
  const { useViewport, useComposer: useNewComposer } = useThreadContext();
185
640
  const { useComposer } = useComposerContext();
186
641
  const disabled = useComposer((c) => !c.isEditing || c.value.length === 0);
187
- const callback = useCallback7(() => {
642
+ const callback = useCallback10(() => {
188
643
  const composerState = useComposer.getState();
189
644
  if (!composerState.isEditing) return;
190
645
  composerState.send();
@@ -280,11 +735,11 @@ var useThreadEmpty = () => {
280
735
  };
281
736
 
282
737
  // src/primitive-hooks/thread/useThreadScrollToBottom.tsx
283
- import { useCallback as useCallback8 } from "react";
738
+ import { useCallback as useCallback11 } from "react";
284
739
  var useThreadScrollToBottom = () => {
285
740
  const { useComposer, useViewport } = useThreadContext();
286
741
  const isAtBottom = useViewport((s) => s.isAtBottom);
287
- const handleScrollToBottom = useCallback8(() => {
742
+ const handleScrollToBottom = useCallback11(() => {
288
743
  useViewport.getState().scrollToBottom();
289
744
  useComposer.getState().focus();
290
745
  }, [useViewport, useComposer]);
@@ -293,14 +748,14 @@ var useThreadScrollToBottom = () => {
293
748
  };
294
749
 
295
750
  // src/primitive-hooks/thread/useThreadSuggestion.tsx
296
- import { useCallback as useCallback9 } from "react";
751
+ import { useCallback as useCallback12 } from "react";
297
752
  var useThreadSuggestion = ({
298
753
  prompt,
299
754
  autoSend
300
755
  }) => {
301
756
  const { useThread, useComposer } = useThreadContext();
302
757
  const disabled = useThread((t) => t.isRunning);
303
- const callback = useCallback9(() => {
758
+ const callback = useCallback12(() => {
304
759
  const thread = useThread.getState();
305
760
  const composer = useComposer.getState();
306
761
  composer.setValue(prompt);
@@ -315,16 +770,17 @@ var useThreadSuggestion = ({
315
770
  // src/primitives/actionBar/index.ts
316
771
  var actionBar_exports = {};
317
772
  __export(actionBar_exports, {
318
- Copy: () => ActionBarCopy,
319
- Edit: () => ActionBarEdit,
320
- Reload: () => ActionBarReload,
321
- Root: () => ActionBarRoot
773
+ Copy: () => ActionBarPrimitiveCopy,
774
+ Edit: () => ActionBarPrimitiveEdit,
775
+ Reload: () => ActionBarPrimitiveReload,
776
+ Root: () => ActionBarPrimitiveRoot
322
777
  });
323
778
 
324
779
  // src/primitives/actionBar/ActionBarRoot.tsx
325
780
  import { Primitive } from "@radix-ui/react-primitive";
326
781
  import { forwardRef } from "react";
327
- import { jsx } from "react/jsx-runtime";
782
+
783
+ // src/primitives/actionBar/useActionBarFloatStatus.tsx
328
784
  var useActionBarFloatStatus = ({
329
785
  hideWhenRunning,
330
786
  autohide,
@@ -345,14 +801,17 @@ var useActionBarFloatStatus = ({
345
801
  }
346
802
  );
347
803
  };
348
- var ActionBarRoot = forwardRef(({ hideWhenRunning, autohide, autohideFloat, ...rest }, ref) => {
804
+
805
+ // src/primitives/actionBar/ActionBarRoot.tsx
806
+ import { jsx as jsx4 } from "react/jsx-runtime";
807
+ var ActionBarPrimitiveRoot = forwardRef(({ hideWhenRunning, autohide, autohideFloat, ...rest }, ref) => {
349
808
  const hideAndfloatStatus = useActionBarFloatStatus({
350
809
  hideWhenRunning,
351
810
  autohide,
352
811
  autohideFloat
353
812
  });
354
813
  if (hideAndfloatStatus === "hidden" /* Hidden */) return null;
355
- return /* @__PURE__ */ jsx(
814
+ return /* @__PURE__ */ jsx4(
356
815
  Primitive.div,
357
816
  {
358
817
  ...hideAndfloatStatus === "floating" /* Floating */ ? { "data-floating": "true" } : null,
@@ -361,17 +820,17 @@ var ActionBarRoot = forwardRef(({ hideWhenRunning, autohide, autohideFloat, ...r
361
820
  }
362
821
  );
363
822
  });
364
- ActionBarRoot.displayName = "ActionBarRoot";
823
+ ActionBarPrimitiveRoot.displayName = "ActionBarPrimitive.Root";
365
824
 
366
825
  // src/utils/createActionButton.tsx
367
826
  import { composeEventHandlers } from "@radix-ui/primitive";
368
827
  import { Primitive as Primitive2 } from "@radix-ui/react-primitive";
369
828
  import { forwardRef as forwardRef2 } from "react";
370
- import { jsx as jsx2 } from "react/jsx-runtime";
829
+ import { jsx as jsx5 } from "react/jsx-runtime";
371
830
  var createActionButton = (displayName, useActionButton) => {
372
831
  const ActionButton = forwardRef2((props, forwardedRef) => {
373
832
  const callback = useActionButton(props);
374
- return /* @__PURE__ */ jsx2(
833
+ return /* @__PURE__ */ jsx5(
375
834
  Primitive2.button,
376
835
  {
377
836
  type: "button",
@@ -389,61 +848,64 @@ var createActionButton = (displayName, useActionButton) => {
389
848
  };
390
849
 
391
850
  // src/primitives/actionBar/ActionBarCopy.tsx
392
- var ActionBarCopy = createActionButton(
393
- "ActionBarCopy",
851
+ var ActionBarPrimitiveCopy = createActionButton(
852
+ "ActionBarPrimitive.Copy",
394
853
  useActionBarCopy
395
854
  );
396
855
 
397
856
  // src/primitives/actionBar/ActionBarReload.tsx
398
- var ActionBarReload = createActionButton(
399
- "ActionBarReload",
857
+ var ActionBarPrimitiveReload = createActionButton(
858
+ "ActionBarPrimitive.Reload",
400
859
  useActionBarReload
401
860
  );
402
861
 
403
862
  // src/primitives/actionBar/ActionBarEdit.tsx
404
- var ActionBarEdit = createActionButton(
405
- "ActionBarEdit",
863
+ var ActionBarPrimitiveEdit = createActionButton(
864
+ "ActionBarPrimitive.Edit",
406
865
  useActionBarEdit
407
866
  );
408
867
 
409
868
  // src/primitives/assistantModal/index.ts
410
869
  var assistantModal_exports = {};
411
870
  __export(assistantModal_exports, {
412
- Content: () => AssistantModalContent,
413
- Root: () => AssistantModalRoot,
414
- Trigger: () => AssistantModalTrigger
871
+ Content: () => AssistantModalPrimitiveContent,
872
+ Root: () => AssistantModalPrimitiveRoot,
873
+ Trigger: () => AssistantModalPrimitiveTrigger
415
874
  });
416
875
 
417
876
  // src/primitives/assistantModal/AssistantModalRoot.tsx
418
- import { useState } from "react";
419
- import * as PopoverPrimitive from "@radix-ui/react-popover";
877
+ import { useState as useState3 } from "react";
878
+ import * as PopoverPrimitive2 from "@radix-ui/react-popover";
420
879
  import { composeEventHandlers as composeEventHandlers2 } from "@radix-ui/primitive";
421
880
 
422
881
  // src/utils/hooks/useOnComposerFocus.tsx
423
882
  import { useCallbackRef } from "@radix-ui/react-use-callback-ref";
424
- import { useEffect } from "react";
883
+ import { useEffect as useEffect6 } from "react";
425
884
  var useOnComposerFocus = (callback) => {
426
885
  const callbackRef = useCallbackRef(callback);
427
886
  const { useComposer } = useThreadContext();
428
- useEffect(() => {
887
+ useEffect6(() => {
429
888
  return useComposer.getState().onFocus(() => {
430
889
  callbackRef();
431
890
  });
432
891
  }, [useComposer, callbackRef]);
433
892
  };
434
893
 
435
- // src/primitives/assistantModal/AssistantModalRoot.tsx
436
- import { jsx as jsx3 } from "react/jsx-runtime";
894
+ // src/primitives/assistantModal/scope.tsx
895
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
437
896
  var usePopoverScope = PopoverPrimitive.createPopoverScope();
897
+
898
+ // src/primitives/assistantModal/AssistantModalRoot.tsx
899
+ import { jsx as jsx6 } from "react/jsx-runtime";
438
900
  var useAssistantModalOpenState = (defaultOpen = false) => {
439
- const state = useState(defaultOpen);
901
+ const state = useState3(defaultOpen);
440
902
  const [, setOpen] = state;
441
903
  useOnComposerFocus(() => {
442
904
  setOpen(true);
443
905
  });
444
906
  return state;
445
907
  };
446
- var AssistantModalRoot = ({
908
+ var AssistantModalPrimitiveRoot = ({
447
909
  __scopeAssistantModal,
448
910
  defaultOpen,
449
911
  open,
@@ -452,8 +914,8 @@ var AssistantModalRoot = ({
452
914
  }) => {
453
915
  const scope = usePopoverScope(__scopeAssistantModal);
454
916
  const [modalOpen, setOpen] = useAssistantModalOpenState(defaultOpen);
455
- return /* @__PURE__ */ jsx3(
456
- PopoverPrimitive.Root,
917
+ return /* @__PURE__ */ jsx6(
918
+ PopoverPrimitive2.Root,
457
919
  {
458
920
  ...scope,
459
921
  open: open === void 0 ? modalOpen : open,
@@ -462,26 +924,29 @@ var AssistantModalRoot = ({
462
924
  }
463
925
  );
464
926
  };
465
- AssistantModalRoot.displayName = "AssistantModalRoot";
927
+ AssistantModalPrimitiveRoot.displayName = "AssistantModalPrimitive.Root";
466
928
 
467
929
  // src/primitives/assistantModal/AssistantModalTrigger.tsx
468
930
  import { forwardRef as forwardRef3 } from "react";
469
- import * as PopoverPrimitive2 from "@radix-ui/react-popover";
470
- import { jsx as jsx4 } from "react/jsx-runtime";
471
- var AssistantModalTrigger = forwardRef3(
472
- ({ __scopeAssistantModal, ...rest }, ref) => {
931
+ import * as PopoverPrimitive3 from "@radix-ui/react-popover";
932
+ import { jsx as jsx7 } from "react/jsx-runtime";
933
+ var AssistantModalPrimitiveTrigger = forwardRef3(
934
+ ({
935
+ __scopeAssistantModal,
936
+ ...rest
937
+ }, ref) => {
473
938
  const scope = usePopoverScope(__scopeAssistantModal);
474
- return /* @__PURE__ */ jsx4(PopoverPrimitive2.Trigger, { ...scope, ...rest, ref });
939
+ return /* @__PURE__ */ jsx7(PopoverPrimitive3.Trigger, { ...scope, ...rest, ref });
475
940
  }
476
941
  );
477
- AssistantModalTrigger.displayName = "AssistantModalTrigger";
942
+ AssistantModalPrimitiveTrigger.displayName = "AssistantModalPrimitive.Trigger";
478
943
 
479
944
  // src/primitives/assistantModal/AssistantModalContent.tsx
480
945
  import { forwardRef as forwardRef4 } from "react";
481
- import * as PopoverPrimitive3 from "@radix-ui/react-popover";
946
+ import * as PopoverPrimitive4 from "@radix-ui/react-popover";
482
947
  import { composeEventHandlers as composeEventHandlers3 } from "@radix-ui/primitive";
483
- import { jsx as jsx5 } from "react/jsx-runtime";
484
- var AssistantModalContent = forwardRef4(
948
+ import { jsx as jsx8 } from "react/jsx-runtime";
949
+ var AssistantModalPrimitiveContent = forwardRef4(
485
950
  ({
486
951
  __scopeAssistantModal,
487
952
  side,
@@ -491,8 +956,8 @@ var AssistantModalContent = forwardRef4(
491
956
  ...props
492
957
  }, forwardedRef) => {
493
958
  const scope = usePopoverScope(__scopeAssistantModal);
494
- return /* @__PURE__ */ jsx5(PopoverPrimitive3.Portal, { ...scope, children: /* @__PURE__ */ jsx5(
495
- PopoverPrimitive3.Content,
959
+ return /* @__PURE__ */ jsx8(PopoverPrimitive4.Portal, { ...scope, children: /* @__PURE__ */ jsx8(
960
+ PopoverPrimitive4.Content,
496
961
  {
497
962
  ...scope,
498
963
  ...props,
@@ -507,43 +972,45 @@ var AssistantModalContent = forwardRef4(
507
972
  ) });
508
973
  }
509
974
  );
510
- AssistantModalContent.displayName = "AssistantModalContent";
975
+ AssistantModalPrimitiveContent.displayName = "AssistantModalPrimitive.Content";
511
976
 
512
977
  // src/primitives/branchPicker/index.ts
513
978
  var branchPicker_exports = {};
514
979
  __export(branchPicker_exports, {
515
- Count: () => BranchPickerCount,
516
- Next: () => BranchPickerNext,
517
- Number: () => BranchPickerNumber,
980
+ Count: () => BranchPickerPrimitiveCount,
981
+ Next: () => BranchPickerPrimitiveNext,
982
+ Number: () => BranchPickerPrimitiveNumber,
518
983
  Previous: () => BranchPickerPrevious,
519
- Root: () => BranchPickerRoot
984
+ Root: () => BranchPickerPrimitiveRoot
520
985
  });
521
986
 
522
987
  // src/primitives/branchPicker/BranchPickerNext.tsx
523
- var BranchPickerNext = createActionButton(
524
- "BranchPickerNext",
988
+ var BranchPickerPrimitiveNext = createActionButton(
989
+ "BranchPickerPrimitive.Next",
525
990
  useBranchPickerNext
526
991
  );
527
992
 
528
993
  // src/primitives/branchPicker/BranchPickerPrevious.tsx
529
994
  var BranchPickerPrevious = createActionButton(
530
- "BranchPickerPrevious",
995
+ "BranchPickerPrimitive.Previous",
531
996
  useBranchPickerPrevious
532
997
  );
533
998
 
534
999
  // src/primitives/branchPicker/BranchPickerCount.tsx
535
- import { Fragment, jsx as jsx6 } from "react/jsx-runtime";
536
- var BranchPickerCount = () => {
1000
+ import { Fragment, jsx as jsx9 } from "react/jsx-runtime";
1001
+ var BranchPickerPrimitiveCount = () => {
537
1002
  const branchCount = useBranchPickerCount();
538
- return /* @__PURE__ */ jsx6(Fragment, { children: branchCount });
1003
+ return /* @__PURE__ */ jsx9(Fragment, { children: branchCount });
539
1004
  };
1005
+ BranchPickerPrimitiveCount.displayName = "BranchPickerPrimitive.Count";
540
1006
 
541
1007
  // src/primitives/branchPicker/BranchPickerNumber.tsx
542
- import { Fragment as Fragment2, jsx as jsx7 } from "react/jsx-runtime";
543
- var BranchPickerNumber = () => {
1008
+ import { Fragment as Fragment2, jsx as jsx10 } from "react/jsx-runtime";
1009
+ var BranchPickerPrimitiveNumber = () => {
544
1010
  const branchNumber = useBranchPickerNumber();
545
- return /* @__PURE__ */ jsx7(Fragment2, { children: branchNumber });
1011
+ return /* @__PURE__ */ jsx10(Fragment2, { children: branchNumber });
546
1012
  };
1013
+ BranchPickerPrimitiveNumber.displayName = "BranchPickerPrimitive.Number";
547
1014
 
548
1015
  // src/primitives/branchPicker/BranchPickerRoot.tsx
549
1016
  import { Primitive as Primitive6 } from "@radix-ui/react-primitive";
@@ -552,53 +1019,55 @@ import { forwardRef as forwardRef8 } from "react";
552
1019
  // src/primitives/message/index.ts
553
1020
  var message_exports = {};
554
1021
  __export(message_exports, {
555
- Content: () => MessageContent,
556
- If: () => MessageIf,
557
- InProgress: () => MessageInProgress,
558
- Root: () => MessageRoot
1022
+ Content: () => MessagePrimitiveContent,
1023
+ If: () => MessagePrimitiveIf,
1024
+ InProgress: () => MessagePrimitiveInProgress,
1025
+ Root: () => MessagePrimitiveRoot
559
1026
  });
560
1027
 
561
1028
  // src/primitives/message/MessageRoot.tsx
562
1029
  import { composeEventHandlers as composeEventHandlers4 } from "@radix-ui/primitive";
563
1030
  import { Primitive as Primitive3 } from "@radix-ui/react-primitive";
564
1031
  import { forwardRef as forwardRef5 } from "react";
565
- import { jsx as jsx8 } from "react/jsx-runtime";
566
- var MessageRoot = forwardRef5(
567
- ({ onMouseEnter, onMouseLeave, ...rest }, ref) => {
568
- const { useMessageUtils } = useMessageContext();
569
- const setIsHovering = useMessageUtils((s) => s.setIsHovering);
570
- const handleMouseEnter = () => {
571
- setIsHovering(true);
572
- };
573
- const handleMouseLeave = () => {
574
- setIsHovering(false);
575
- };
576
- return /* @__PURE__ */ jsx8(
577
- Primitive3.div,
578
- {
579
- ...rest,
580
- ref,
581
- onMouseEnter: composeEventHandlers4(onMouseEnter, handleMouseEnter),
582
- onMouseLeave: composeEventHandlers4(onMouseLeave, handleMouseLeave)
583
- }
584
- );
585
- }
586
- );
587
- MessageRoot.displayName = "MessageRoot";
1032
+ import { jsx as jsx11 } from "react/jsx-runtime";
1033
+ var MessagePrimitiveRoot = forwardRef5(({ onMouseEnter, onMouseLeave, ...rest }, ref) => {
1034
+ const { useMessageUtils } = useMessageContext();
1035
+ const setIsHovering = useMessageUtils((s) => s.setIsHovering);
1036
+ const handleMouseEnter = () => {
1037
+ setIsHovering(true);
1038
+ };
1039
+ const handleMouseLeave = () => {
1040
+ setIsHovering(false);
1041
+ };
1042
+ return /* @__PURE__ */ jsx11(
1043
+ Primitive3.div,
1044
+ {
1045
+ ...rest,
1046
+ ref,
1047
+ onMouseEnter: composeEventHandlers4(onMouseEnter, handleMouseEnter),
1048
+ onMouseLeave: composeEventHandlers4(onMouseLeave, handleMouseLeave)
1049
+ }
1050
+ );
1051
+ });
1052
+ MessagePrimitiveRoot.displayName = "MessagePrimitive.Root";
588
1053
 
589
1054
  // src/primitives/message/MessageIf.tsx
590
- var MessageIf = ({ children, ...query }) => {
1055
+ var MessagePrimitiveIf = ({
1056
+ children,
1057
+ ...query
1058
+ }) => {
591
1059
  const result = useMessageIf(query);
592
1060
  return result ? children : null;
593
1061
  };
1062
+ MessagePrimitiveIf.displayName = "MessagePrimitive.If";
594
1063
 
595
1064
  // src/primitives/message/MessageContent.tsx
596
- import { memo } from "react";
1065
+ import { memo as memo2 } from "react";
597
1066
 
598
1067
  // src/context/providers/ContentPartProvider.tsx
599
- import { useEffect as useEffect2, useState as useState2 } from "react";
600
- import { create } from "zustand";
601
- import { jsx as jsx9 } from "react/jsx-runtime";
1068
+ import { useEffect as useEffect7, useState as useState4 } from "react";
1069
+ import { create as create8 } from "zustand";
1070
+ import { jsx as jsx12 } from "react/jsx-runtime";
602
1071
  var syncContentPart = ({ message }, useContentPart, partIndex) => {
603
1072
  const part = message.content[partIndex];
604
1073
  if (!part) return;
@@ -615,14 +1084,14 @@ var syncContentPart = ({ message }, useContentPart, partIndex) => {
615
1084
  };
616
1085
  var useContentPartContext2 = (partIndex) => {
617
1086
  const { useMessage } = useMessageContext();
618
- const [context] = useState2(() => {
619
- const useContentPart = create(
1087
+ const [context] = useState4(() => {
1088
+ const useContentPart = create8(
620
1089
  () => ({})
621
1090
  );
622
1091
  syncContentPart(useMessage.getState(), useContentPart, partIndex);
623
1092
  return { useContentPart };
624
1093
  });
625
- useEffect2(() => {
1094
+ useEffect7(() => {
626
1095
  syncContentPart(useMessage.getState(), context.useContentPart, partIndex);
627
1096
  return useMessage.subscribe((message) => {
628
1097
  syncContentPart(message, context.useContentPart, partIndex);
@@ -635,46 +1104,48 @@ var ContentPartProvider = ({
635
1104
  children
636
1105
  }) => {
637
1106
  const context = useContentPartContext2(partIndex);
638
- return /* @__PURE__ */ jsx9(ContentPartContext.Provider, { value: context, children });
1107
+ return /* @__PURE__ */ jsx12(ContentPartContext.Provider, { value: context, children });
639
1108
  };
640
1109
 
641
1110
  // src/primitives/contentPart/ContentPartDisplay.tsx
642
- var ContentPartDisplay = () => {
1111
+ var ContentPartPrimitiveDisplay = () => {
643
1112
  const display = useContentPartDisplay();
644
1113
  return display ?? null;
645
1114
  };
1115
+ ContentPartPrimitiveDisplay.displayName = "ContentPartPrimitive.Display";
646
1116
 
647
1117
  // src/primitives/contentPart/ContentPartInProgressIndicator.tsx
648
- var ContentPartInProgressIndicator = () => {
1118
+ var ContentPartPrimitiveInProgressIndicator = () => {
649
1119
  const indicator = useContentPartInProgressIndicator();
650
1120
  return indicator;
651
1121
  };
1122
+ ContentPartPrimitiveInProgressIndicator.displayName = "ContentPartPrimitive.InProgressIndicator";
652
1123
 
653
1124
  // src/primitives/contentPart/ContentPartText.tsx
654
1125
  import { Primitive as Primitive4 } from "@radix-ui/react-primitive";
655
1126
  import { forwardRef as forwardRef6 } from "react";
656
- import { jsx as jsx10 } from "react/jsx-runtime";
657
- var ContentPartText = forwardRef6((props, forwardedRef) => {
1127
+ import { jsx as jsx13 } from "react/jsx-runtime";
1128
+ var ContentPartPrimitiveText = forwardRef6((props, forwardedRef) => {
658
1129
  const text = useContentPartText();
659
- return /* @__PURE__ */ jsx10(Primitive4.span, { ...props, ref: forwardedRef, children: text });
1130
+ return /* @__PURE__ */ jsx13(Primitive4.p, { ...props, ref: forwardedRef, children: text });
660
1131
  });
661
- ContentPartText.displayName = "ContentPartText";
1132
+ ContentPartPrimitiveText.displayName = "ContentPartPrimitive.Text";
662
1133
 
663
1134
  // src/primitives/message/MessageContent.tsx
664
- import { Fragment as Fragment3, jsx as jsx11, jsxs } from "react/jsx-runtime";
1135
+ import { Fragment as Fragment3, jsx as jsx14, jsxs as jsxs2 } from "react/jsx-runtime";
665
1136
  var defaultComponents = {
666
- Text: () => /* @__PURE__ */ jsxs(Fragment3, { children: [
667
- /* @__PURE__ */ jsx11(ContentPartText, {}),
668
- /* @__PURE__ */ jsx11(ContentPartInProgressIndicator, {})
1137
+ Text: () => /* @__PURE__ */ jsxs2(Fragment3, { children: [
1138
+ /* @__PURE__ */ jsx14(ContentPartPrimitiveText, { style: { whiteSpace: "pre-line" } }),
1139
+ /* @__PURE__ */ jsx14(ContentPartPrimitiveInProgressIndicator, {})
669
1140
  ] }),
670
1141
  Image: () => null,
671
- UI: () => /* @__PURE__ */ jsx11(ContentPartDisplay, {}),
1142
+ UI: () => /* @__PURE__ */ jsx14(ContentPartPrimitiveDisplay, {}),
672
1143
  tools: {
673
1144
  Fallback: (props) => {
674
1145
  const { useToolUIs } = useAssistantContext();
675
1146
  const Render = useToolUIs((s) => s.getToolUI(props.part.toolName));
676
1147
  if (!Render) return null;
677
- return /* @__PURE__ */ jsx11(Render, { ...props });
1148
+ return /* @__PURE__ */ jsx14(Render, { ...props });
678
1149
  }
679
1150
  }
680
1151
  };
@@ -693,15 +1164,15 @@ var MessageContentPartComponent = ({
693
1164
  const type = part.type;
694
1165
  switch (type) {
695
1166
  case "text":
696
- return /* @__PURE__ */ jsx11(Text, { part, status });
1167
+ return /* @__PURE__ */ jsx14(Text, { part, status });
697
1168
  case "image":
698
- return /* @__PURE__ */ jsx11(Image, { part, status });
1169
+ return /* @__PURE__ */ jsx14(Image, { part, status });
699
1170
  case "ui":
700
- return /* @__PURE__ */ jsx11(UI, { part, status });
1171
+ return /* @__PURE__ */ jsx14(UI, { part, status });
701
1172
  case "tool-call": {
702
1173
  const Tool = by_name[part.toolName] || Fallback;
703
1174
  const addResult = (result) => addToolResult(part.toolCallId, result);
704
- return /* @__PURE__ */ jsx11(Tool, { part, status, addResult });
1175
+ return /* @__PURE__ */ jsx14(Tool, { part, status, addResult });
705
1176
  }
706
1177
  default:
707
1178
  throw new Error(`Unknown content part type: ${type}`);
@@ -711,18 +1182,20 @@ var MessageContentPartImpl = ({
711
1182
  partIndex,
712
1183
  components
713
1184
  }) => {
714
- return /* @__PURE__ */ jsx11(ContentPartProvider, { partIndex, children: /* @__PURE__ */ jsx11(MessageContentPartComponent, { components }) });
1185
+ return /* @__PURE__ */ jsx14(ContentPartProvider, { partIndex, children: /* @__PURE__ */ jsx14(MessageContentPartComponent, { components }) });
715
1186
  };
716
- var MessageContentPart = memo(
1187
+ var MessageContentPart = memo2(
717
1188
  MessageContentPartImpl,
718
1189
  (prev, next) => prev.partIndex === next.partIndex && prev.components?.Text === next.components?.Text && prev.components?.Image === next.components?.Image && prev.components?.UI === next.components?.UI && prev.components?.tools === next.components?.tools
719
1190
  );
720
- var MessageContent = ({ components }) => {
1191
+ var MessagePrimitiveContent = ({
1192
+ components
1193
+ }) => {
721
1194
  const { useMessage } = useMessageContext();
722
1195
  const contentLength = useMessage((s) => s.message.content.length);
723
1196
  return new Array(contentLength).fill(null).map((_, idx) => {
724
1197
  const partIndex = idx;
725
- return /* @__PURE__ */ jsx11(
1198
+ return /* @__PURE__ */ jsx14(
726
1199
  MessageContentPart,
727
1200
  {
728
1201
  partIndex,
@@ -732,38 +1205,42 @@ var MessageContent = ({ components }) => {
732
1205
  );
733
1206
  });
734
1207
  };
1208
+ MessagePrimitiveContent.displayName = "MessagePrimitive.Content";
735
1209
 
736
1210
  // src/primitives/message/MessageInProgress.tsx
737
1211
  import { Primitive as Primitive5 } from "@radix-ui/react-primitive";
738
1212
  import {
739
1213
  forwardRef as forwardRef7,
740
- useMemo as useMemo2
1214
+ useEffect as useEffect8
741
1215
  } from "react";
742
- import { jsx as jsx12 } from "react/jsx-runtime";
743
- var MessageInProgress = forwardRef7((props, ref) => {
1216
+ import { jsx as jsx15 } from "react/jsx-runtime";
1217
+ var MessagePrimitiveInProgress = forwardRef7((props, ref) => {
744
1218
  const { useMessageUtils } = useMessageContext();
745
- useMemo2(() => {
746
- useMessageUtils.getState().setInProgressIndicator(/* @__PURE__ */ jsx12(Primitive5.span, { ...props, ref }));
1219
+ useEffect8(() => {
1220
+ useMessageUtils.getState().setInProgressIndicator(/* @__PURE__ */ jsx15(Primitive5.span, { ...props, ref }));
1221
+ return () => {
1222
+ useMessageUtils.getState().setInProgressIndicator(null);
1223
+ };
747
1224
  }, [useMessageUtils, props, ref]);
748
1225
  return null;
749
1226
  });
750
- MessageInProgress.displayName = "MessageInProgress";
1227
+ MessagePrimitiveInProgress.displayName = "MessagePrimitive.InProgress";
751
1228
 
752
1229
  // src/primitives/branchPicker/BranchPickerRoot.tsx
753
- import { jsx as jsx13 } from "react/jsx-runtime";
754
- var BranchPickerRoot = forwardRef8(({ hideWhenSingleBranch, ...rest }, ref) => {
755
- return /* @__PURE__ */ jsx13(MessageIf, { hasBranches: hideWhenSingleBranch ? true : void 0, children: /* @__PURE__ */ jsx13(Primitive6.div, { ...rest, ref }) });
1230
+ import { jsx as jsx16 } from "react/jsx-runtime";
1231
+ var BranchPickerPrimitiveRoot = forwardRef8(({ hideWhenSingleBranch, ...rest }, ref) => {
1232
+ return /* @__PURE__ */ jsx16(MessagePrimitiveIf, { hasBranches: hideWhenSingleBranch ? true : void 0, children: /* @__PURE__ */ jsx16(Primitive6.div, { ...rest, ref }) });
756
1233
  });
757
- BranchPickerRoot.displayName = "BranchPickerRoot";
1234
+ BranchPickerPrimitiveRoot.displayName = "BranchPickerPrimitive.Root";
758
1235
 
759
1236
  // src/primitives/composer/index.ts
760
1237
  var composer_exports = {};
761
1238
  __export(composer_exports, {
762
- Cancel: () => ComposerCancel,
763
- If: () => ComposerIf,
764
- Input: () => ComposerInput,
765
- Root: () => ComposerRoot,
766
- Send: () => ComposerSend
1239
+ Cancel: () => ComposerPrimitiveCancel,
1240
+ If: () => ComposerPrimitiveIf,
1241
+ Input: () => ComposerPrimitiveInput,
1242
+ Root: () => ComposerPrimitiveRoot,
1243
+ Send: () => ComposerPrimitiveSend
767
1244
  });
768
1245
 
769
1246
  // src/primitives/composer/ComposerRoot.tsx
@@ -772,26 +1249,24 @@ import { Primitive as Primitive7 } from "@radix-ui/react-primitive";
772
1249
  import {
773
1250
  forwardRef as forwardRef9
774
1251
  } from "react";
775
- import { jsx as jsx14 } from "react/jsx-runtime";
776
- var ComposerRoot = forwardRef9(
777
- ({ onSubmit, ...rest }, forwardedRef) => {
778
- const send = useComposerSend();
779
- const handleSubmit = (e) => {
780
- if (!send) return;
781
- e.preventDefault();
782
- send();
783
- };
784
- return /* @__PURE__ */ jsx14(
785
- Primitive7.form,
786
- {
787
- ...rest,
788
- ref: forwardedRef,
789
- onSubmit: composeEventHandlers5(onSubmit, handleSubmit)
790
- }
791
- );
792
- }
793
- );
794
- ComposerRoot.displayName = "ComposerRoot";
1252
+ import { jsx as jsx17 } from "react/jsx-runtime";
1253
+ var ComposerPrimitiveRoot = forwardRef9(({ onSubmit, ...rest }, forwardedRef) => {
1254
+ const send = useComposerSend();
1255
+ const handleSubmit = (e) => {
1256
+ e.preventDefault();
1257
+ if (!send) return;
1258
+ send();
1259
+ };
1260
+ return /* @__PURE__ */ jsx17(
1261
+ Primitive7.form,
1262
+ {
1263
+ ...rest,
1264
+ ref: forwardedRef,
1265
+ onSubmit: composeEventHandlers5(onSubmit, handleSubmit)
1266
+ }
1267
+ );
1268
+ });
1269
+ ComposerPrimitiveRoot.displayName = "ComposerPrimitive.Root";
795
1270
 
796
1271
  // src/primitives/composer/ComposerInput.tsx
797
1272
  import { composeEventHandlers as composeEventHandlers6 } from "@radix-ui/primitive";
@@ -799,14 +1274,14 @@ import { useComposedRefs } from "@radix-ui/react-compose-refs";
799
1274
  import { Slot } from "@radix-ui/react-slot";
800
1275
  import {
801
1276
  forwardRef as forwardRef10,
802
- useCallback as useCallback10,
803
- useEffect as useEffect3,
804
- useRef
1277
+ useCallback as useCallback13,
1278
+ useEffect as useEffect9,
1279
+ useRef as useRef3
805
1280
  } from "react";
806
1281
  import TextareaAutosize from "react-textarea-autosize";
807
1282
  import { useEscapeKeydown } from "@radix-ui/react-use-escape-keydown";
808
- import { jsx as jsx15 } from "react/jsx-runtime";
809
- var ComposerInput = forwardRef10(
1283
+ import { jsx as jsx18 } from "react/jsx-runtime";
1284
+ var ComposerPrimitiveInput = forwardRef10(
810
1285
  ({ autoFocus = false, asChild, disabled, onChange, onKeyDown, ...rest }, forwardedRef) => {
811
1286
  const { useThread } = useThreadContext();
812
1287
  const { useComposer, type } = useComposerContext();
@@ -815,7 +1290,7 @@ var ComposerInput = forwardRef10(
815
1290
  return c.value;
816
1291
  });
817
1292
  const Component = asChild ? Slot : TextareaAutosize;
818
- const textareaRef = useRef(null);
1293
+ const textareaRef = useRef3(null);
819
1294
  const ref = useComposedRefs(forwardedRef, textareaRef);
820
1295
  useEscapeKeydown((e) => {
821
1296
  const composer = useComposer.getState();
@@ -834,7 +1309,7 @@ var ComposerInput = forwardRef10(
834
1309
  }
835
1310
  };
836
1311
  const autoFocusEnabled = autoFocus && !disabled;
837
- const focus = useCallback10(() => {
1312
+ const focus = useCallback13(() => {
838
1313
  const textarea = textareaRef.current;
839
1314
  if (!textarea || !autoFocusEnabled) return;
840
1315
  textarea.focus({ preventScroll: true });
@@ -843,13 +1318,13 @@ var ComposerInput = forwardRef10(
843
1318
  textareaRef.current.value.length
844
1319
  );
845
1320
  }, [autoFocusEnabled]);
846
- useEffect3(() => focus(), [focus]);
1321
+ useEffect9(() => focus(), [focus]);
847
1322
  useOnComposerFocus(() => {
848
1323
  if (type === "new") {
849
1324
  focus();
850
1325
  }
851
1326
  });
852
- return /* @__PURE__ */ jsx15(
1327
+ return /* @__PURE__ */ jsx18(
853
1328
  Component,
854
1329
  {
855
1330
  value,
@@ -866,94 +1341,101 @@ var ComposerInput = forwardRef10(
866
1341
  );
867
1342
  }
868
1343
  );
869
- ComposerInput.displayName = "ComposerInput";
1344
+ ComposerPrimitiveInput.displayName = "ComposerPrimitive.Input";
870
1345
 
871
1346
  // src/primitives/composer/ComposerSend.tsx
872
1347
  import { forwardRef as forwardRef11 } from "react";
873
1348
  import { Primitive as Primitive8 } from "@radix-ui/react-primitive";
874
- import { jsx as jsx16 } from "react/jsx-runtime";
875
- var ComposerSend = forwardRef11(
876
- ({ disabled, ...rest }, ref) => {
877
- const { useComposer } = useComposerContext();
878
- const hasValue = useComposer((c) => c.isEditing && c.value.length > 0);
879
- return /* @__PURE__ */ jsx16(
880
- Primitive8.button,
881
- {
882
- type: "submit",
883
- ...rest,
884
- ref,
885
- disabled: disabled || !hasValue
886
- }
887
- );
888
- }
889
- );
890
- ComposerSend.displayName = "ComposerSend";
1349
+ import { jsx as jsx19 } from "react/jsx-runtime";
1350
+ var ComposerPrimitiveSend = forwardRef11(({ disabled, ...rest }, ref) => {
1351
+ const { useComposer } = useComposerContext();
1352
+ const hasValue = useComposer((c) => c.isEditing && c.value.length > 0);
1353
+ return /* @__PURE__ */ jsx19(
1354
+ Primitive8.button,
1355
+ {
1356
+ type: "submit",
1357
+ ...rest,
1358
+ ref,
1359
+ disabled: disabled || !hasValue
1360
+ }
1361
+ );
1362
+ });
1363
+ ComposerPrimitiveSend.displayName = "ComposerPrimitive.Send";
891
1364
 
892
1365
  // src/primitives/composer/ComposerCancel.tsx
893
- var ComposerCancel = createActionButton(
894
- "ComposerCancel",
1366
+ var ComposerPrimitiveCancel = createActionButton(
1367
+ "ComposerPrimitive.Cancel",
895
1368
  useComposerCancel
896
1369
  );
897
1370
 
898
1371
  // src/primitives/composer/ComposerIf.tsx
899
- var ComposerIf = ({ children, ...query }) => {
1372
+ var ComposerPrimitiveIf = ({
1373
+ children,
1374
+ ...query
1375
+ }) => {
900
1376
  const result = useComposerIf(query);
901
1377
  return result ? children : null;
902
1378
  };
1379
+ ComposerPrimitiveIf.displayName = "ComposerPrimitive.If";
903
1380
 
904
1381
  // src/primitives/contentPart/index.ts
905
1382
  var contentPart_exports = {};
906
1383
  __export(contentPart_exports, {
907
- Display: () => ContentPartDisplay,
908
- Image: () => ContentPartImage,
909
- InProgressIndicator: () => ContentPartInProgressIndicator,
910
- Text: () => ContentPartText
1384
+ Display: () => ContentPartPrimitiveDisplay,
1385
+ Image: () => ContentPartPrimitiveImage,
1386
+ InProgressIndicator: () => ContentPartPrimitiveInProgressIndicator,
1387
+ Text: () => ContentPartPrimitiveText
911
1388
  });
912
1389
 
913
1390
  // src/primitives/contentPart/ContentPartImage.tsx
914
1391
  import { Primitive as Primitive9 } from "@radix-ui/react-primitive";
915
1392
  import { forwardRef as forwardRef12 } from "react";
916
- import { jsx as jsx17 } from "react/jsx-runtime";
917
- var ContentPartImage = forwardRef12((props, forwardedRef) => {
1393
+ import { jsx as jsx20 } from "react/jsx-runtime";
1394
+ var ContentPartPrimitiveImage = forwardRef12((props, forwardedRef) => {
918
1395
  const image = useContentPartImage();
919
- return /* @__PURE__ */ jsx17(Primitive9.img, { src: image, ...props, ref: forwardedRef });
1396
+ return /* @__PURE__ */ jsx20(Primitive9.img, { src: image, ...props, ref: forwardedRef });
920
1397
  });
921
- ContentPartImage.displayName = "ContentPartImage";
1398
+ ContentPartPrimitiveImage.displayName = "ContentPartPrimitive.Image";
922
1399
 
923
1400
  // src/primitives/thread/index.ts
924
1401
  var thread_exports = {};
925
1402
  __export(thread_exports, {
926
- Empty: () => ThreadEmpty,
927
- If: () => ThreadIf,
928
- Messages: () => ThreadMessages,
929
- Root: () => ThreadRoot,
930
- ScrollToBottom: () => ThreadScrollToBottom,
931
- Suggestion: () => ThreadSuggestion,
932
- Viewport: () => ThreadViewport
1403
+ Empty: () => ThreadPrimitiveEmpty,
1404
+ If: () => ThreadPrimitiveIf,
1405
+ Messages: () => ThreadPrimitiveMessages,
1406
+ Root: () => ThreadPrimitiveRoot,
1407
+ ScrollToBottom: () => ThreadPrimitiveScrollToBottom,
1408
+ Suggestion: () => ThreadPrimitiveSuggestion,
1409
+ Viewport: () => ThreadPrimitiveViewport
933
1410
  });
934
1411
 
935
1412
  // src/primitives/thread/ThreadRoot.tsx
936
1413
  import { Primitive as Primitive10 } from "@radix-ui/react-primitive";
937
1414
  import { forwardRef as forwardRef13 } from "react";
938
- import { jsx as jsx18 } from "react/jsx-runtime";
939
- var ThreadRoot = forwardRef13(
940
- (props, ref) => {
941
- return /* @__PURE__ */ jsx18(Primitive10.div, { ...props, ref });
942
- }
943
- );
944
- ThreadRoot.displayName = "ThreadRoot";
1415
+ import { jsx as jsx21 } from "react/jsx-runtime";
1416
+ var ThreadPrimitiveRoot = forwardRef13((props, ref) => {
1417
+ return /* @__PURE__ */ jsx21(Primitive10.div, { ...props, ref });
1418
+ });
1419
+ ThreadPrimitiveRoot.displayName = "ThreadPrimitive.Root";
945
1420
 
946
1421
  // src/primitives/thread/ThreadEmpty.tsx
947
- var ThreadEmpty = ({ children }) => {
1422
+ var ThreadPrimitiveEmpty = ({
1423
+ children
1424
+ }) => {
948
1425
  const empty = useThreadEmpty();
949
1426
  return empty ? children : null;
950
1427
  };
1428
+ ThreadPrimitiveEmpty.displayName = "ThreadPrimitive.Empty";
951
1429
 
952
1430
  // src/primitives/thread/ThreadIf.tsx
953
- var ThreadIf = ({ children, ...query }) => {
1431
+ var ThreadPrimitiveIf = ({
1432
+ children,
1433
+ ...query
1434
+ }) => {
954
1435
  const result = useThreadIf(query);
955
1436
  return result ? children : null;
956
1437
  };
1438
+ ThreadPrimitiveIf.displayName = "ThreadPrimitive.If";
957
1439
 
958
1440
  // src/primitives/thread/ThreadViewport.tsx
959
1441
  import { useComposedRefs as useComposedRefs3 } from "@radix-ui/react-compose-refs";
@@ -962,17 +1444,17 @@ import { forwardRef as forwardRef14 } from "react";
962
1444
 
963
1445
  // src/primitive-hooks/thread/useThreadViewportAutoScroll.tsx
964
1446
  import { useComposedRefs as useComposedRefs2 } from "@radix-ui/react-compose-refs";
965
- import { useRef as useRef3 } from "react";
1447
+ import { useRef as useRef5 } from "react";
966
1448
 
967
1449
  // src/utils/hooks/useOnResizeContent.tsx
968
1450
  import { useCallbackRef as useCallbackRef2 } from "@radix-ui/react-use-callback-ref";
969
- import { useCallback as useCallback12 } from "react";
1451
+ import { useCallback as useCallback15 } from "react";
970
1452
 
971
1453
  // src/utils/hooks/useManagedRef.ts
972
- import { useCallback as useCallback11, useRef as useRef2 } from "react";
1454
+ import { useCallback as useCallback14, useRef as useRef4 } from "react";
973
1455
  var useManagedRef = (callback) => {
974
- const cleanupRef = useRef2();
975
- const ref = useCallback11(
1456
+ const cleanupRef = useRef4();
1457
+ const ref = useCallback14(
976
1458
  (el) => {
977
1459
  if (cleanupRef.current) {
978
1460
  cleanupRef.current();
@@ -989,7 +1471,7 @@ var useManagedRef = (callback) => {
989
1471
  // src/utils/hooks/useOnResizeContent.tsx
990
1472
  var useOnResizeContent = (callback) => {
991
1473
  const callbackRef = useCallbackRef2(callback);
992
- const refCallback = useCallback12(
1474
+ const refCallback = useCallback15(
993
1475
  (el) => {
994
1476
  const resizeObserver = new ResizeObserver(() => {
995
1477
  callbackRef();
@@ -1026,11 +1508,11 @@ var useOnResizeContent = (callback) => {
1026
1508
 
1027
1509
  // src/utils/hooks/useOnScrollToBottom.tsx
1028
1510
  import { useCallbackRef as useCallbackRef3 } from "@radix-ui/react-use-callback-ref";
1029
- import { useEffect as useEffect4 } from "react";
1511
+ import { useEffect as useEffect10 } from "react";
1030
1512
  var useOnScrollToBottom = (callback) => {
1031
1513
  const callbackRef = useCallbackRef3(callback);
1032
1514
  const { useViewport } = useThreadContext();
1033
- useEffect4(() => {
1515
+ useEffect10(() => {
1034
1516
  return useViewport.getState().onScrollToBottom(() => {
1035
1517
  callbackRef();
1036
1518
  });
@@ -1041,11 +1523,11 @@ var useOnScrollToBottom = (callback) => {
1041
1523
  var useThreadViewportAutoScroll = ({
1042
1524
  autoScroll = true
1043
1525
  }) => {
1044
- const divRef = useRef3(null);
1526
+ const divRef = useRef5(null);
1045
1527
  const { useViewport } = useThreadContext();
1046
- const firstRenderRef = useRef3(true);
1047
- const lastScrollTop = useRef3(0);
1048
- const isScrollingToBottomRef = useRef3(false);
1528
+ const firstRenderRef = useRef5(true);
1529
+ const lastScrollTop = useRef5(0);
1530
+ const isScrollingToBottomRef = useRef5(false);
1049
1531
  const scrollToBottom = () => {
1050
1532
  const div = divRef.current;
1051
1533
  if (!div || !autoScroll) return;
@@ -1091,39 +1573,29 @@ var useThreadViewportAutoScroll = ({
1091
1573
  };
1092
1574
 
1093
1575
  // src/primitives/thread/ThreadViewport.tsx
1094
- import { jsx as jsx19 } from "react/jsx-runtime";
1095
- var ThreadViewport = forwardRef14(({ autoScroll, onScroll, children, ...rest }, forwardedRef) => {
1576
+ import { jsx as jsx22 } from "react/jsx-runtime";
1577
+ var ThreadPrimitiveViewport = forwardRef14(({ autoScroll, onScroll, children, ...rest }, forwardedRef) => {
1096
1578
  const autoScrollRef = useThreadViewportAutoScroll({
1097
1579
  autoScroll
1098
1580
  });
1099
1581
  const ref = useComposedRefs3(forwardedRef, autoScrollRef);
1100
- return /* @__PURE__ */ jsx19(Primitive11.div, { ...rest, ref, children });
1582
+ return /* @__PURE__ */ jsx22(Primitive11.div, { ...rest, ref, children });
1101
1583
  });
1102
- ThreadViewport.displayName = "ThreadViewport";
1584
+ ThreadPrimitiveViewport.displayName = "ThreadPrimitive.Viewport";
1103
1585
 
1104
1586
  // src/primitives/thread/ThreadMessages.tsx
1105
- import { memo as memo2 } from "react";
1587
+ import { memo as memo3 } from "react";
1106
1588
 
1107
1589
  // src/context/providers/MessageProvider.tsx
1108
- import { useEffect as useEffect5, useState as useState3 } from "react";
1109
- import { create as create4 } from "zustand";
1110
-
1111
- // src/context/stores/EditComposer.ts
1112
- import { create as create2 } from "zustand";
1113
-
1114
- // src/context/stores/BaseComposer.ts
1115
- var makeBaseComposer = (set) => ({
1116
- value: "",
1117
- setValue: (value) => {
1118
- set({ value });
1119
- }
1120
- });
1590
+ import { useEffect as useEffect11, useState as useState5 } from "react";
1591
+ import { create as create11 } from "zustand";
1121
1592
 
1122
1593
  // src/context/stores/EditComposer.ts
1594
+ import { create as create9 } from "zustand";
1123
1595
  var makeEditComposerStore = ({
1124
1596
  onEdit,
1125
1597
  onSend
1126
- }) => create2()((set, get, store) => ({
1598
+ }) => create9()((set, get, store) => ({
1127
1599
  ...makeBaseComposer(set, get, store),
1128
1600
  isEditing: false,
1129
1601
  edit: () => {
@@ -1143,8 +1615,8 @@ var makeEditComposerStore = ({
1143
1615
  }));
1144
1616
 
1145
1617
  // src/context/stores/MessageUtils.ts
1146
- import { create as create3 } from "zustand";
1147
- var makeMessageUtilsStore = () => create3((set) => ({
1618
+ import { create as create10 } from "zustand";
1619
+ var makeMessageUtilsStore = () => create10((set) => ({
1148
1620
  inProgressIndicator: null,
1149
1621
  setInProgressIndicator: (value) => {
1150
1622
  set({ inProgressIndicator: value });
@@ -1160,7 +1632,7 @@ var makeMessageUtilsStore = () => create3((set) => ({
1160
1632
  }));
1161
1633
 
1162
1634
  // src/context/providers/MessageProvider.tsx
1163
- import { jsx as jsx20 } from "react/jsx-runtime";
1635
+ import { jsx as jsx23 } from "react/jsx-runtime";
1164
1636
  var getIsLast = (thread, message) => {
1165
1637
  return thread.messages[thread.messages.length - 1]?.id === message.id;
1166
1638
  };
@@ -1182,8 +1654,8 @@ var syncMessage = (thread, getBranches, useMessage, messageIndex) => {
1182
1654
  };
1183
1655
  var useMessageContext2 = (messageIndex) => {
1184
1656
  const { useThread, useThreadActions } = useThreadContext();
1185
- const [context] = useState3(() => {
1186
- const useMessage = create4(() => ({}));
1657
+ const [context] = useState5(() => {
1658
+ const useMessage = create11(() => ({}));
1187
1659
  const useMessageUtils = makeMessageUtilsStore();
1188
1660
  const useEditComposer = makeEditComposerStore({
1189
1661
  onEdit: () => {
@@ -1219,7 +1691,7 @@ var useMessageContext2 = (messageIndex) => {
1219
1691
  );
1220
1692
  return { useMessage, useMessageUtils, useEditComposer };
1221
1693
  });
1222
- useEffect5(() => {
1694
+ useEffect11(() => {
1223
1695
  return useThread.subscribe((thread) => {
1224
1696
  syncMessage(
1225
1697
  thread,
@@ -1236,11 +1708,11 @@ var MessageProvider = ({
1236
1708
  children
1237
1709
  }) => {
1238
1710
  const context = useMessageContext2(messageIndex);
1239
- return /* @__PURE__ */ jsx20(MessageContext.Provider, { value: context, children });
1711
+ return /* @__PURE__ */ jsx23(MessageContext.Provider, { value: context, children });
1240
1712
  };
1241
1713
 
1242
1714
  // src/primitives/thread/ThreadMessages.tsx
1243
- import { jsx as jsx21, jsxs as jsxs2 } from "react/jsx-runtime";
1715
+ import { jsx as jsx24, jsxs as jsxs3 } from "react/jsx-runtime";
1244
1716
  var getComponents = (components) => {
1245
1717
  return {
1246
1718
  EditComposer: components.EditComposer ?? components.UserMessage ?? components.Message,
@@ -1253,25 +1725,27 @@ var ThreadMessageImpl = ({
1253
1725
  components
1254
1726
  }) => {
1255
1727
  const { UserMessage, EditComposer, AssistantMessage } = getComponents(components);
1256
- return /* @__PURE__ */ jsxs2(MessageProvider, { messageIndex, children: [
1257
- /* @__PURE__ */ jsxs2(MessageIf, { user: true, children: [
1258
- /* @__PURE__ */ jsx21(ComposerIf, { editing: false, children: /* @__PURE__ */ jsx21(UserMessage, {}) }),
1259
- /* @__PURE__ */ jsx21(ComposerIf, { editing: true, children: /* @__PURE__ */ jsx21(EditComposer, {}) })
1728
+ return /* @__PURE__ */ jsxs3(MessageProvider, { messageIndex, children: [
1729
+ /* @__PURE__ */ jsxs3(MessagePrimitiveIf, { user: true, children: [
1730
+ /* @__PURE__ */ jsx24(ComposerPrimitiveIf, { editing: false, children: /* @__PURE__ */ jsx24(UserMessage, {}) }),
1731
+ /* @__PURE__ */ jsx24(ComposerPrimitiveIf, { editing: true, children: /* @__PURE__ */ jsx24(EditComposer, {}) })
1260
1732
  ] }),
1261
- /* @__PURE__ */ jsx21(MessageIf, { assistant: true, children: /* @__PURE__ */ jsx21(AssistantMessage, {}) })
1733
+ /* @__PURE__ */ jsx24(MessagePrimitiveIf, { assistant: true, children: /* @__PURE__ */ jsx24(AssistantMessage, {}) })
1262
1734
  ] });
1263
1735
  };
1264
- var ThreadMessage = memo2(
1736
+ var ThreadMessage = memo3(
1265
1737
  ThreadMessageImpl,
1266
1738
  (prev, next) => prev.messageIndex === next.messageIndex && prev.components.UserMessage === next.components.UserMessage && prev.components.EditComposer === next.components.EditComposer && prev.components.AssistantMessage === next.components.AssistantMessage
1267
1739
  );
1268
- var ThreadMessages = ({ components }) => {
1740
+ var ThreadPrimitiveMessages = ({
1741
+ components
1742
+ }) => {
1269
1743
  const { useThread } = useThreadContext();
1270
1744
  const messagesLength = useThread((t) => t.messages.length);
1271
1745
  if (messagesLength === 0) return null;
1272
1746
  return new Array(messagesLength).fill(null).map((_, idx) => {
1273
1747
  const messageIndex = idx;
1274
- return /* @__PURE__ */ jsx21(
1748
+ return /* @__PURE__ */ jsx24(
1275
1749
  ThreadMessage,
1276
1750
  {
1277
1751
  messageIndex,
@@ -1281,49 +1755,22 @@ var ThreadMessages = ({ components }) => {
1281
1755
  );
1282
1756
  });
1283
1757
  };
1758
+ ThreadPrimitiveMessages.displayName = "ThreadPrimitive.Messages";
1284
1759
 
1285
- // src/primitives/thread/ThreadScrollToBottom.tsx
1286
- var ThreadScrollToBottom = createActionButton(
1287
- "ThreadScrollToBottom",
1288
- useThreadScrollToBottom
1289
- );
1290
-
1291
- // src/primitives/thread/ThreadSuggestion.tsx
1292
- var ThreadSuggestion = createActionButton(
1293
- "ThreadSuggestion",
1294
- useThreadSuggestion
1295
- );
1296
-
1297
- // src/runtime/local/useLocalRuntime.tsx
1298
- import { useInsertionEffect, useState as useState4 } from "react";
1299
-
1300
- // src/utils/ModelConfigTypes.ts
1301
- var mergeModelConfigs = (configSet) => {
1302
- const configs = Array.from(configSet).map((c) => c()).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
1303
- return configs.reduce((acc, config) => {
1304
- if (config.system) {
1305
- if (acc.system) {
1306
- acc.system += `
1307
-
1308
- ${config.system}`;
1309
- } else {
1310
- acc.system = config.system;
1311
- }
1312
- }
1313
- if (config.tools) {
1314
- for (const [name, tool] of Object.entries(config.tools)) {
1315
- if (acc.tools?.[name]) {
1316
- throw new Error(
1317
- `You tried to define a tool with the name ${name}, but it already exists.`
1318
- );
1319
- }
1320
- if (!acc.tools) acc.tools = {};
1321
- acc.tools[name] = tool;
1322
- }
1323
- }
1324
- return acc;
1325
- }, {});
1326
- };
1760
+ // src/primitives/thread/ThreadScrollToBottom.tsx
1761
+ var ThreadPrimitiveScrollToBottom = createActionButton(
1762
+ "ThreadPrimitive.ScrollToBottom",
1763
+ useThreadScrollToBottom
1764
+ );
1765
+
1766
+ // src/primitives/thread/ThreadSuggestion.tsx
1767
+ var ThreadPrimitiveSuggestion = createActionButton(
1768
+ "ThreadPrimitive.Suggestion",
1769
+ useThreadSuggestion
1770
+ );
1771
+
1772
+ // src/runtime/local/useLocalRuntime.tsx
1773
+ import { useInsertionEffect as useInsertionEffect3, useState as useState6 } from "react";
1327
1774
 
1328
1775
  // src/runtime/utils/idUtils.tsx
1329
1776
  import { customAlphabet } from "nanoid/non-secure";
@@ -1485,13 +1932,91 @@ var MessageRepository = class {
1485
1932
  }
1486
1933
  };
1487
1934
 
1935
+ // src/runtime/core/BaseAssistantRuntime.tsx
1936
+ var BaseAssistantRuntime = class {
1937
+ constructor(_thread) {
1938
+ this._thread = _thread;
1939
+ this._thread = _thread;
1940
+ this._unsubscribe = this._thread.subscribe(this.subscriptionHandler);
1941
+ }
1942
+ _unsubscribe;
1943
+ get thread() {
1944
+ return this._thread;
1945
+ }
1946
+ set thread(thread) {
1947
+ this._unsubscribe();
1948
+ this._thread = thread;
1949
+ this._unsubscribe = this._thread.subscribe(this.subscriptionHandler);
1950
+ this.subscriptionHandler();
1951
+ }
1952
+ get messages() {
1953
+ return this.thread.messages;
1954
+ }
1955
+ get isRunning() {
1956
+ return this.thread.isRunning;
1957
+ }
1958
+ getBranches(messageId) {
1959
+ return this.thread.getBranches(messageId);
1960
+ }
1961
+ switchToBranch(branchId) {
1962
+ return this.thread.switchToBranch(branchId);
1963
+ }
1964
+ append(message) {
1965
+ return this.thread.append(message);
1966
+ }
1967
+ startRun(parentId) {
1968
+ return this.thread.startRun(parentId);
1969
+ }
1970
+ cancelRun() {
1971
+ return this.thread.cancelRun();
1972
+ }
1973
+ addToolResult(toolCallId, result) {
1974
+ return this.thread.addToolResult(toolCallId, result);
1975
+ }
1976
+ _subscriptions = /* @__PURE__ */ new Set();
1977
+ subscribe(callback) {
1978
+ this._subscriptions.add(callback);
1979
+ return () => this._subscriptions.delete(callback);
1980
+ }
1981
+ subscriptionHandler = () => {
1982
+ for (const callback of this._subscriptions) callback();
1983
+ };
1984
+ get unstable_synchronizer() {
1985
+ return this.thread.unstable_synchronizer;
1986
+ }
1987
+ };
1988
+
1488
1989
  // src/runtime/local/LocalRuntime.tsx
1489
- var LocalRuntime = class {
1990
+ var LocalRuntime = class extends BaseAssistantRuntime {
1991
+ _configProviders;
1490
1992
  constructor(adapter) {
1993
+ const configProviders = /* @__PURE__ */ new Set();
1994
+ super(new LocalThreadRuntime(configProviders, adapter));
1995
+ this._configProviders = configProviders;
1996
+ }
1997
+ set adapter(adapter) {
1998
+ this.thread.adapter = adapter;
1999
+ }
2000
+ registerModelConfigProvider(provider) {
2001
+ this._configProviders.add(provider);
2002
+ return () => this._configProviders.delete(provider);
2003
+ }
2004
+ switchToThread(threadId) {
2005
+ if (threadId) {
2006
+ throw new Error("LocalRuntime does not yet support switching threads");
2007
+ }
2008
+ return this.thread = new LocalThreadRuntime(
2009
+ this._configProviders,
2010
+ this.thread.adapter
2011
+ );
2012
+ }
2013
+ };
2014
+ var LocalThreadRuntime = class {
2015
+ constructor(_configProviders, adapter) {
2016
+ this._configProviders = _configProviders;
1491
2017
  this.adapter = adapter;
1492
2018
  }
1493
2019
  _subscriptions = /* @__PURE__ */ new Set();
1494
- _configProviders = /* @__PURE__ */ new Set();
1495
2020
  abortController = null;
1496
2021
  repository = new MessageRepository();
1497
2022
  get messages() {
@@ -1570,248 +2095,24 @@ var LocalRuntime = class {
1570
2095
  this._subscriptions.add(callback);
1571
2096
  return () => this._subscriptions.delete(callback);
1572
2097
  }
1573
- registerModelConfigProvider(provider) {
1574
- this._configProviders.add(provider);
1575
- return () => this._configProviders.delete(provider);
1576
- }
1577
2098
  addToolResult() {
1578
- throw new Error("LocalRuntime does not yet support tool results");
2099
+ throw new Error("LocalRuntime does not yet support adding tool results");
1579
2100
  }
1580
2101
  };
1581
2102
 
1582
2103
  // src/runtime/local/useLocalRuntime.tsx
1583
2104
  var useLocalRuntime = (adapter) => {
1584
- const [runtime] = useState4(() => new LocalRuntime(adapter));
1585
- useInsertionEffect(() => {
2105
+ const [runtime] = useState6(() => new LocalRuntime(adapter));
2106
+ useInsertionEffect3(() => {
1586
2107
  runtime.adapter = adapter;
1587
2108
  });
1588
2109
  return runtime;
1589
2110
  };
1590
2111
 
1591
- // src/context/providers/AssistantRuntimeProvider.tsx
1592
- import { memo as memo3 } from "react";
1593
-
1594
- // src/context/providers/AssistantProvider.tsx
1595
- import { useEffect as useEffect7, useInsertionEffect as useInsertionEffect3, useRef as useRef5, useState as useState6 } from "react";
1596
-
1597
- // src/context/stores/AssistantModelConfig.ts
1598
- import { create as create5 } from "zustand";
1599
-
1600
- // src/utils/ProxyConfigProvider.ts
1601
- var ProxyConfigProvider = class {
1602
- _providers = /* @__PURE__ */ new Set();
1603
- getModelConfig() {
1604
- return mergeModelConfigs(this._providers);
1605
- }
1606
- registerModelConfigProvider(provider) {
1607
- this._providers.add(provider);
1608
- return () => {
1609
- this._providers.delete(provider);
1610
- };
1611
- }
1612
- };
1613
-
1614
- // src/context/stores/AssistantModelConfig.ts
1615
- var makeAssistantModelConfigStore = () => create5(() => {
1616
- const proxy = new ProxyConfigProvider();
1617
- return Object.freeze({
1618
- getModelConfig: () => {
1619
- return proxy.getModelConfig();
1620
- },
1621
- registerModelConfigProvider: (provider) => {
1622
- return proxy.registerModelConfigProvider(provider);
1623
- }
1624
- });
1625
- });
1626
-
1627
- // src/context/stores/AssistantToolUIs.ts
1628
- import { create as create6 } from "zustand";
1629
- var makeAssistantToolUIsStore = () => create6((set) => {
1630
- const renderers = /* @__PURE__ */ new Map();
1631
- return Object.freeze({
1632
- getToolUI: (name) => {
1633
- const arr = renderers.get(name);
1634
- const last = arr?.at(-1);
1635
- if (last) return last;
1636
- return null;
1637
- },
1638
- setToolUI: (name, render) => {
1639
- let arr = renderers.get(name);
1640
- if (!arr) {
1641
- arr = [];
1642
- renderers.set(name, arr);
1643
- }
1644
- arr.push(render);
1645
- set({});
1646
- return () => {
1647
- const index = arr.indexOf(render);
1648
- if (index !== -1) {
1649
- arr.splice(index, 1);
1650
- }
1651
- if (index === arr.length) {
1652
- set({});
1653
- }
1654
- };
1655
- }
1656
- });
1657
- });
1658
-
1659
- // src/context/providers/ThreadProvider.tsx
1660
- import { useEffect as useEffect6, useInsertionEffect as useInsertionEffect2, useRef as useRef4, useState as useState5 } from "react";
1661
-
1662
- // src/context/stores/Composer.ts
1663
- import { create as create7 } from "zustand";
1664
- var makeComposerStore = (useThread, useThreadActions) => {
1665
- const focusListeners = /* @__PURE__ */ new Set();
1666
- return create7()((set, get, store) => {
1667
- return {
1668
- ...makeBaseComposer(set, get, store),
1669
- isEditing: true,
1670
- send: () => {
1671
- const { setValue, value } = get();
1672
- setValue("");
1673
- useThreadActions.getState().append({
1674
- parentId: useThread.getState().messages.at(-1)?.id ?? null,
1675
- role: "user",
1676
- content: [{ type: "text", text: value }]
1677
- });
1678
- },
1679
- cancel: () => {
1680
- const thread = useThread.getState();
1681
- if (!thread.isRunning) return false;
1682
- useThreadActions.getState().cancelRun();
1683
- return true;
1684
- },
1685
- focus: () => {
1686
- for (const listener of focusListeners) {
1687
- listener();
1688
- }
1689
- },
1690
- onFocus: (listener) => {
1691
- focusListeners.add(listener);
1692
- return () => {
1693
- focusListeners.delete(listener);
1694
- };
1695
- }
1696
- };
1697
- });
1698
- };
1699
-
1700
- // src/context/stores/Thread.ts
1701
- import { create as create8 } from "zustand";
1702
- var makeThreadStore = (runtimeRef) => {
1703
- return create8(() => ({
1704
- messages: runtimeRef.current.messages,
1705
- isRunning: runtimeRef.current.isRunning
1706
- }));
1707
- };
1708
-
1709
- // src/context/stores/ThreadViewport.tsx
1710
- import { create as create9 } from "zustand";
1711
- var makeThreadViewportStore = () => {
1712
- const scrollToBottomListeners = /* @__PURE__ */ new Set();
1713
- return create9(() => ({
1714
- isAtBottom: true,
1715
- scrollToBottom: () => {
1716
- for (const listener of scrollToBottomListeners) {
1717
- listener();
1718
- }
1719
- },
1720
- onScrollToBottom: (callback) => {
1721
- scrollToBottomListeners.add(callback);
1722
- return () => {
1723
- scrollToBottomListeners.delete(callback);
1724
- };
1725
- }
1726
- }));
1727
- };
1728
-
1729
- // src/context/stores/ThreadActions.ts
1730
- import { create as create10 } from "zustand";
1731
- var makeThreadActionStore = (runtimeRef) => {
1732
- return create10(
1733
- () => Object.freeze({
1734
- getBranches: (messageId) => runtimeRef.current.getBranches(messageId),
1735
- switchToBranch: (branchId) => runtimeRef.current.switchToBranch(branchId),
1736
- startRun: (parentId) => runtimeRef.current.startRun(parentId),
1737
- append: (message) => runtimeRef.current.append(message),
1738
- cancelRun: () => runtimeRef.current.cancelRun(),
1739
- addToolResult: (toolCallId, result) => runtimeRef.current.addToolResult(toolCallId, result)
1740
- })
1741
- );
1742
- };
1743
-
1744
- // src/context/providers/ThreadProvider.tsx
1745
- import { jsx as jsx22, jsxs as jsxs3 } from "react/jsx-runtime";
1746
- var ThreadProvider = ({
1747
- children,
1748
- runtime
1749
- }) => {
1750
- const runtimeRef = useRef4(runtime);
1751
- useInsertionEffect2(() => {
1752
- runtimeRef.current = runtime;
1753
- });
1754
- const [context] = useState5(() => {
1755
- const useThread = makeThreadStore(runtimeRef);
1756
- const useThreadActions = makeThreadActionStore(runtimeRef);
1757
- const useViewport = makeThreadViewportStore();
1758
- const useComposer = makeComposerStore(useThread, useThreadActions);
1759
- return {
1760
- useThread,
1761
- useThreadActions,
1762
- useComposer,
1763
- useViewport
1764
- };
1765
- });
1766
- useEffect6(() => {
1767
- const onRuntimeUpdate = () => {
1768
- context.useThread.setState(
1769
- Object.freeze({
1770
- messages: runtimeRef.current.messages,
1771
- isRunning: runtimeRef.current.isRunning
1772
- }),
1773
- true
1774
- );
1775
- };
1776
- onRuntimeUpdate();
1777
- return runtime.subscribe(onRuntimeUpdate);
1778
- }, [context, runtime]);
1779
- const RuntimeSynchronizer = runtime.unstable_synchronizer;
1780
- return /* @__PURE__ */ jsxs3(ThreadContext.Provider, { value: context, children: [
1781
- RuntimeSynchronizer && /* @__PURE__ */ jsx22(RuntimeSynchronizer, {}),
1782
- children
1783
- ] });
1784
- };
1785
-
1786
- // src/context/providers/AssistantProvider.tsx
1787
- import { jsx as jsx23 } from "react/jsx-runtime";
1788
- var AssistantProvider = ({ children, runtime }) => {
1789
- const runtimeRef = useRef5(runtime);
1790
- useInsertionEffect3(() => {
1791
- runtimeRef.current = runtime;
1792
- });
1793
- const [context] = useState6(() => {
1794
- const useModelConfig = makeAssistantModelConfigStore();
1795
- const useToolUIs = makeAssistantToolUIsStore();
1796
- return { useModelConfig, useToolUIs };
1797
- });
1798
- const getModelCOnfig = context.useModelConfig((c) => c.getModelConfig);
1799
- useEffect7(() => {
1800
- return runtime.registerModelConfigProvider(getModelCOnfig);
1801
- }, [runtime, getModelCOnfig]);
1802
- return /* @__PURE__ */ jsx23(AssistantContext.Provider, { value: context, children: /* @__PURE__ */ jsx23(ThreadProvider, { runtime, children }) });
1803
- };
1804
-
1805
- // src/context/providers/AssistantRuntimeProvider.tsx
1806
- import { jsx as jsx24 } from "react/jsx-runtime";
1807
- var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
1808
- return /* @__PURE__ */ jsx24(AssistantProvider, { runtime, children });
1809
- };
1810
- var AssistantRuntimeProvider = memo3(AssistantRuntimeProviderImpl);
1811
-
1812
2112
  // src/internal.ts
1813
2113
  var internal_exports = {};
1814
2114
  __export(internal_exports, {
2115
+ BaseAssistantRuntime: () => BaseAssistantRuntime,
1815
2116
  MessageRepository: () => MessageRepository,
1816
2117
  ProxyConfigProvider: () => ProxyConfigProvider
1817
2118
  });
@@ -1825,22 +2126,34 @@ export {
1825
2126
  internal_exports as INTERNAL,
1826
2127
  message_exports as MessagePrimitive,
1827
2128
  thread_exports as ThreadPrimitive,
2129
+ makeAssistantTool,
2130
+ makeAssistantToolUI,
1828
2131
  useActionBarCopy,
1829
2132
  useActionBarEdit,
1830
2133
  useActionBarReload,
2134
+ useAppendMessage,
2135
+ useAssistantContext,
2136
+ useAssistantInstructions,
2137
+ useAssistantTool,
2138
+ useAssistantToolUI,
1831
2139
  useBranchPickerCount,
1832
2140
  useBranchPickerNext,
1833
2141
  useBranchPickerNumber,
1834
2142
  useBranchPickerPrevious,
1835
2143
  useComposerCancel,
2144
+ useComposerContext,
1836
2145
  useComposerIf,
1837
2146
  useComposerSend,
2147
+ useContentPartContext,
1838
2148
  useContentPartDisplay,
1839
2149
  useContentPartImage,
1840
2150
  useContentPartInProgressIndicator,
1841
2151
  useContentPartText,
1842
2152
  useLocalRuntime,
2153
+ useMessageContext,
1843
2154
  useMessageIf,
2155
+ useSwitchToNewThread,
2156
+ useThreadContext,
1844
2157
  useThreadEmpty,
1845
2158
  useThreadIf,
1846
2159
  useThreadScrollToBottom,