@assistant-ui/react 0.1.12 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
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,