@assistant-ui/react 0.2.0 → 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.js CHANGED
@@ -44,6 +44,7 @@ __export(src_exports, {
44
44
  useActionBarCopy: () => useActionBarCopy,
45
45
  useActionBarEdit: () => useActionBarEdit,
46
46
  useActionBarReload: () => useActionBarReload,
47
+ useAppendMessage: () => useAppendMessage,
47
48
  useAssistantContext: () => useAssistantContext,
48
49
  useAssistantInstructions: () => useAssistantInstructions,
49
50
  useAssistantTool: () => useAssistantTool,
@@ -64,6 +65,7 @@ __export(src_exports, {
64
65
  useLocalRuntime: () => useLocalRuntime,
65
66
  useMessageContext: () => useMessageContext,
66
67
  useMessageIf: () => useMessageIf,
68
+ useSwitchToNewThread: () => useSwitchToNewThread,
67
69
  useThreadContext: () => useThreadContext,
68
70
  useThreadEmpty: () => useThreadEmpty,
69
71
  useThreadIf: () => useThreadIf,
@@ -72,192 +74,19 @@ __export(src_exports, {
72
74
  });
73
75
  module.exports = __toCommonJS(src_exports);
74
76
 
75
- // src/primitive-hooks/actionBar/useActionBarCopy.tsx
76
- var import_react4 = require("react");
77
-
78
- // src/context/react/MessageContext.ts
79
- var import_react = require("react");
80
- var MessageContext = (0, import_react.createContext)(null);
81
- var useMessageContext = () => {
82
- const context = (0, import_react.useContext)(MessageContext);
83
- if (!context)
84
- throw new Error(
85
- "This component can only be used inside a component passed to <ThreadPrimitive.Messages components={...} />."
86
- );
87
- return context;
88
- };
89
-
90
- // src/utils/combined/useCombinedStore.ts
91
- var import_react3 = require("react");
92
-
93
- // src/utils/combined/createCombinedStore.ts
94
- var import_react2 = require("react");
95
- var createCombinedStore = (stores) => {
96
- const subscribe = (callback) => {
97
- const unsubscribes = stores.map((store) => store.subscribe(callback));
98
- return () => {
99
- for (const unsub of unsubscribes) {
100
- unsub();
101
- }
102
- };
103
- };
104
- return (selector) => {
105
- const getSnapshot = () => selector(...stores.map((store) => store.getState()));
106
- return (0, import_react2.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
107
- };
108
- };
109
-
110
- // src/utils/combined/useCombinedStore.ts
111
- var useCombinedStore = (stores, selector) => {
112
- const useCombined = (0, import_react3.useMemo)(() => createCombinedStore(stores), stores);
113
- return useCombined(selector);
114
- };
115
-
116
- // src/utils/getMessageText.tsx
117
- var getMessageText = (message) => {
118
- const textParts = message.content.filter(
119
- (part) => part.type === "text"
120
- );
121
- return textParts.map((part) => part.text).join("\n\n");
122
- };
123
-
124
- // src/primitive-hooks/actionBar/useActionBarCopy.tsx
125
- var useActionBarCopy = ({
126
- copiedDuration = 3e3
127
- } = {}) => {
128
- const { useMessage, useMessageUtils, useEditComposer } = useMessageContext();
129
- const hasCopyableContent = useCombinedStore(
130
- [useMessage, useEditComposer],
131
- (m, c) => {
132
- return !c.isEditing && m.message.content.some((c2) => c2.type === "text");
133
- }
134
- );
135
- const callback = (0, import_react4.useCallback)(() => {
136
- const { message } = useMessage.getState();
137
- const { setIsCopied } = useMessageUtils.getState();
138
- const { isEditing, value: composerValue } = useEditComposer.getState();
139
- const valueToCopy = isEditing ? composerValue : getMessageText(message);
140
- navigator.clipboard.writeText(valueToCopy);
141
- setIsCopied(true);
142
- setTimeout(() => setIsCopied(false), copiedDuration);
143
- }, [useMessage, useMessageUtils, useEditComposer, copiedDuration]);
144
- if (!hasCopyableContent) return null;
145
- return callback;
146
- };
147
-
148
- // src/primitive-hooks/actionBar/useActionBarEdit.tsx
149
- var import_react5 = require("react");
150
- var useActionBarEdit = () => {
151
- const { useMessage, useEditComposer } = useMessageContext();
152
- const disabled = useCombinedStore(
153
- [useMessage, useEditComposer],
154
- (m, c) => m.message.role !== "user" || c.isEditing
155
- );
156
- const callback = (0, import_react5.useCallback)(() => {
157
- const { edit } = useEditComposer.getState();
158
- edit();
159
- }, [useEditComposer]);
160
- if (disabled) return null;
161
- return callback;
162
- };
163
-
164
- // src/primitive-hooks/actionBar/useActionBarReload.tsx
165
- var import_react7 = require("react");
166
-
167
- // src/context/react/ThreadContext.ts
168
- var import_react6 = require("react");
169
- var ThreadContext = (0, import_react6.createContext)(null);
170
- var useThreadContext = () => {
171
- const context = (0, import_react6.useContext)(ThreadContext);
172
- if (!context)
173
- throw new Error(
174
- "This component must be used within an AssistantRuntimeProvider."
175
- );
176
- return context;
177
- };
178
-
179
- // src/primitive-hooks/actionBar/useActionBarReload.tsx
180
- var useActionBarReload = () => {
181
- const { useThread, useThreadActions, useComposer, useViewport } = useThreadContext();
182
- const { useMessage } = useMessageContext();
183
- const disabled = useCombinedStore(
184
- [useThread, useMessage],
185
- (t, m) => t.isRunning || m.message.role !== "assistant"
186
- );
187
- const callback = (0, import_react7.useCallback)(() => {
188
- const { parentId } = useMessage.getState();
189
- useThreadActions.getState().startRun(parentId);
190
- useViewport.getState().scrollToBottom();
191
- useComposer.getState().focus();
192
- }, [useThreadActions, useComposer, useViewport, useMessage]);
193
- if (disabled) return null;
194
- return callback;
195
- };
196
-
197
- // src/primitive-hooks/branchPicker/useBranchPickerCount.tsx
198
- var useBranchPickerCount = () => {
199
- const { useMessage } = useMessageContext();
200
- const branchCount = useMessage((s) => s.branches.length);
201
- return branchCount;
202
- };
203
-
204
- // src/primitive-hooks/branchPicker/useBranchPickerNext.tsx
205
- var import_react8 = require("react");
206
- var useBranchPickerNext = () => {
207
- const { useThreadActions } = useThreadContext();
208
- const { useMessage, useEditComposer } = useMessageContext();
209
- const disabled = useCombinedStore(
210
- [useMessage, useEditComposer],
211
- (m, c) => c.isEditing || m.branches.indexOf(m.message.id) + 1 >= m.branches.length
212
- );
213
- const callback = (0, import_react8.useCallback)(() => {
214
- const { message, branches } = useMessage.getState();
215
- useThreadActions.getState().switchToBranch(branches[branches.indexOf(message.id) + 1]);
216
- }, [useThreadActions, useMessage]);
217
- if (disabled) return null;
218
- return callback;
219
- };
220
-
221
- // src/primitive-hooks/branchPicker/useBranchPickerNumber.tsx
222
- var useBranchPickerNumber = () => {
223
- const { useMessage } = useMessageContext();
224
- const branchIdx = useMessage((s) => s.branches.indexOf(s.message.id));
225
- return branchIdx + 1;
226
- };
227
-
228
- // src/primitive-hooks/branchPicker/useBranchPickerPrevious.tsx
229
- var import_react9 = require("react");
230
- var useBranchPickerPrevious = () => {
231
- const { useThreadActions } = useThreadContext();
232
- const { useMessage, useEditComposer } = useMessageContext();
233
- const disabled = useCombinedStore(
234
- [useMessage, useEditComposer],
235
- (m, c) => c.isEditing || m.branches.indexOf(m.message.id) <= 0
236
- );
237
- const callback = (0, import_react9.useCallback)(() => {
238
- const { message, branches } = useMessage.getState();
239
- useThreadActions.getState().switchToBranch(branches[branches.indexOf(message.id) - 1]);
240
- }, [useThreadActions, useMessage]);
241
- if (disabled) return null;
242
- return callback;
243
- };
244
-
245
- // src/primitive-hooks/composer/useComposerCancel.tsx
246
- var import_react16 = require("react");
247
-
248
77
  // src/context/providers/AssistantRuntimeProvider.tsx
249
- var import_react13 = require("react");
78
+ var import_react5 = require("react");
250
79
 
251
80
  // src/context/providers/AssistantProvider.tsx
252
- var import_react12 = require("react");
81
+ var import_react4 = require("react");
253
82
 
254
83
  // src/context/react/AssistantContext.ts
255
- var import_react10 = require("react");
256
- var AssistantContext = (0, import_react10.createContext)(
84
+ var import_react = require("react");
85
+ var AssistantContext = (0, import_react.createContext)(
257
86
  null
258
87
  );
259
88
  var useAssistantContext = () => {
260
- const context = (0, import_react10.useContext)(AssistantContext);
89
+ const context = (0, import_react.useContext)(AssistantContext);
261
90
  if (!context)
262
91
  throw new Error(
263
92
  "This component must be used within an AssistantRuntimeProvider."
@@ -356,7 +185,19 @@ var makeAssistantToolUIsStore = () => (0, import_zustand2.create)((set) => {
356
185
  });
357
186
 
358
187
  // src/context/providers/ThreadProvider.tsx
359
- var import_react11 = require("react");
188
+ var import_react3 = require("react");
189
+
190
+ // src/context/react/ThreadContext.ts
191
+ var import_react2 = require("react");
192
+ var ThreadContext = (0, import_react2.createContext)(null);
193
+ var useThreadContext = () => {
194
+ const context = (0, import_react2.useContext)(ThreadContext);
195
+ if (!context)
196
+ throw new Error(
197
+ "This component must be used within an AssistantRuntimeProvider."
198
+ );
199
+ return context;
200
+ };
360
201
 
361
202
  // src/context/stores/Composer.ts
362
203
  var import_zustand3 = require("zustand");
@@ -456,11 +297,11 @@ var ThreadProvider = ({
456
297
  children,
457
298
  runtime
458
299
  }) => {
459
- const runtimeRef = (0, import_react11.useRef)(runtime);
460
- (0, import_react11.useInsertionEffect)(() => {
300
+ const runtimeRef = (0, import_react3.useRef)(runtime);
301
+ (0, import_react3.useInsertionEffect)(() => {
461
302
  runtimeRef.current = runtime;
462
303
  });
463
- const [context] = (0, import_react11.useState)(() => {
304
+ const [context] = (0, import_react3.useState)(() => {
464
305
  const useThread = makeThreadStore(runtimeRef);
465
306
  const useThreadActions = makeThreadActionStore(runtimeRef);
466
307
  const useViewport = makeThreadViewportStore();
@@ -472,7 +313,7 @@ var ThreadProvider = ({
472
313
  useViewport
473
314
  };
474
315
  });
475
- (0, import_react11.useEffect)(() => {
316
+ (0, import_react3.useEffect)(() => {
476
317
  const onRuntimeUpdate = () => {
477
318
  context.useThread.setState(
478
319
  Object.freeze({
@@ -485,27 +326,44 @@ var ThreadProvider = ({
485
326
  onRuntimeUpdate();
486
327
  return runtime.subscribe(onRuntimeUpdate);
487
328
  }, [context, runtime]);
488
- const RuntimeSynchronizer = runtime.unstable_synchronizer;
329
+ const subscribe = (0, import_react3.useCallback)(
330
+ (c) => runtime.subscribe(c),
331
+ [runtime]
332
+ );
333
+ const RuntimeSynchronizer = (0, import_react3.useSyncExternalStore)(
334
+ subscribe,
335
+ () => runtime.unstable_synchronizer,
336
+ () => void 0
337
+ );
489
338
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(ThreadContext.Provider, { value: context, children: [
490
339
  RuntimeSynchronizer && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RuntimeSynchronizer, {}),
491
340
  children
492
341
  ] });
493
342
  };
494
343
 
344
+ // src/context/stores/AssistantActions.tsx
345
+ var import_zustand7 = require("zustand");
346
+ var makeAssistantActionsStore = (runtimeRef) => (0, import_zustand7.create)(
347
+ () => Object.freeze({
348
+ switchToThread: () => runtimeRef.current.switchToThread(null)
349
+ })
350
+ );
351
+
495
352
  // src/context/providers/AssistantProvider.tsx
496
353
  var import_jsx_runtime2 = require("react/jsx-runtime");
497
354
  var AssistantProvider = ({ children, runtime }) => {
498
- const runtimeRef = (0, import_react12.useRef)(runtime);
499
- (0, import_react12.useInsertionEffect)(() => {
355
+ const runtimeRef = (0, import_react4.useRef)(runtime);
356
+ (0, import_react4.useInsertionEffect)(() => {
500
357
  runtimeRef.current = runtime;
501
358
  });
502
- const [context] = (0, import_react12.useState)(() => {
359
+ const [context] = (0, import_react4.useState)(() => {
503
360
  const useModelConfig = makeAssistantModelConfigStore();
504
361
  const useToolUIs = makeAssistantToolUIsStore();
505
- return { useModelConfig, useToolUIs };
362
+ const useAssistantActions = makeAssistantActionsStore(runtimeRef);
363
+ return { useModelConfig, useToolUIs, useAssistantActions };
506
364
  });
507
365
  const getModelCOnfig = context.useModelConfig((c) => c.getModelConfig);
508
- (0, import_react12.useEffect)(() => {
366
+ (0, import_react4.useEffect)(() => {
509
367
  return runtime.registerModelConfigProvider(getModelCOnfig);
510
368
  }, [runtime, getModelCOnfig]);
511
369
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AssistantContext.Provider, { value: context, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ThreadProvider, { runtime, children }) });
@@ -516,14 +374,28 @@ var import_jsx_runtime3 = require("react/jsx-runtime");
516
374
  var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
517
375
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(AssistantProvider, { runtime, children });
518
376
  };
519
- var AssistantRuntimeProvider = (0, import_react13.memo)(AssistantRuntimeProviderImpl);
377
+ var AssistantRuntimeProvider = (0, import_react5.memo)(AssistantRuntimeProviderImpl);
378
+
379
+ // src/context/react/ComposerContext.ts
380
+ var import_react7 = require("react");
381
+
382
+ // src/context/react/MessageContext.ts
383
+ var import_react6 = require("react");
384
+ var MessageContext = (0, import_react6.createContext)(null);
385
+ var useMessageContext = () => {
386
+ const context = (0, import_react6.useContext)(MessageContext);
387
+ if (!context)
388
+ throw new Error(
389
+ "This component can only be used inside a component passed to <ThreadPrimitive.Messages components={...} />."
390
+ );
391
+ return context;
392
+ };
520
393
 
521
394
  // src/context/react/ComposerContext.ts
522
- var import_react14 = require("react");
523
395
  var useComposerContext = () => {
524
396
  const { useComposer } = useThreadContext();
525
- const { useEditComposer } = (0, import_react14.useContext)(MessageContext) ?? {};
526
- return (0, import_react14.useMemo)(
397
+ const { useEditComposer } = (0, import_react7.useContext)(MessageContext) ?? {};
398
+ return (0, import_react7.useMemo)(
527
399
  () => ({
528
400
  useComposer: useEditComposer ?? useComposer,
529
401
  type: useEditComposer ? "edit" : "new"
@@ -533,12 +405,12 @@ var useComposerContext = () => {
533
405
  };
534
406
 
535
407
  // src/context/react/ContentPartContext.ts
536
- var import_react15 = require("react");
537
- var ContentPartContext = (0, import_react15.createContext)(
408
+ var import_react8 = require("react");
409
+ var ContentPartContext = (0, import_react8.createContext)(
538
410
  null
539
411
  );
540
412
  var useContentPartContext = () => {
541
- const context = (0, import_react15.useContext)(ContentPartContext);
413
+ const context = (0, import_react8.useContext)(ContentPartContext);
542
414
  if (!context)
543
415
  throw new Error(
544
416
  "This component can only be used inside a component passed to <MessagePrimitive.Content components={...} >."
@@ -546,11 +418,267 @@ var useContentPartContext = () => {
546
418
  return context;
547
419
  };
548
420
 
421
+ // src/hooks/useAppendMessage.tsx
422
+ var import_react9 = require("react");
423
+ var toAppendMessage = (useThread, message) => {
424
+ if (typeof message === "string") {
425
+ return {
426
+ parentId: useThread.getState().messages.at(-1)?.id ?? null,
427
+ role: "user",
428
+ content: [{ type: "text", text: message }]
429
+ };
430
+ }
431
+ return {
432
+ parentId: message.parentId ?? useThread.getState().messages.at(-1)?.id ?? null,
433
+ role: message.role ?? "user",
434
+ content: message.content
435
+ };
436
+ };
437
+ var useAppendMessage = () => {
438
+ const { useThread, useThreadActions, useViewport, useComposer } = useThreadContext();
439
+ const append = (0, import_react9.useCallback)(
440
+ (message) => {
441
+ const appendMessage = toAppendMessage(useThread, message);
442
+ useThreadActions.getState().append(appendMessage);
443
+ useViewport.getState().scrollToBottom();
444
+ useComposer.getState().focus();
445
+ },
446
+ [useThread, useThreadActions, useViewport, useComposer]
447
+ );
448
+ return append;
449
+ };
450
+
451
+ // src/hooks/useSwitchToNewThread.tsx
452
+ var import_react10 = require("react");
453
+ var useSwitchToNewThread = () => {
454
+ const { useAssistantActions } = useAssistantContext();
455
+ const { useComposer } = useThreadContext();
456
+ const switchToNewThread = (0, import_react10.useCallback)(() => {
457
+ useAssistantActions.getState().switchToThread(null);
458
+ useComposer.getState().focus();
459
+ }, [useAssistantActions, useComposer]);
460
+ return switchToNewThread;
461
+ };
462
+
463
+ // src/model-config/useAssistantTool.tsx
464
+ var import_react11 = require("react");
465
+ var useAssistantTool = (tool) => {
466
+ const { useModelConfig, useToolUIs } = useAssistantContext();
467
+ const registerModelConfigProvider = useModelConfig(
468
+ (s) => s.registerModelConfigProvider
469
+ );
470
+ const setToolUI = useToolUIs((s) => s.setToolUI);
471
+ (0, import_react11.useEffect)(() => {
472
+ const { toolName, render, ...rest } = tool;
473
+ const config = {
474
+ tools: {
475
+ [tool.toolName]: rest
476
+ }
477
+ };
478
+ const unsub1 = registerModelConfigProvider(() => config);
479
+ const unsub2 = render ? setToolUI(toolName, render) : void 0;
480
+ return () => {
481
+ unsub1();
482
+ unsub2?.();
483
+ };
484
+ }, [registerModelConfigProvider, setToolUI, tool]);
485
+ };
486
+
487
+ // src/model-config/makeAssistantTool.tsx
488
+ var makeAssistantTool = (tool) => {
489
+ const Tool = () => {
490
+ useAssistantTool(tool);
491
+ return null;
492
+ };
493
+ return Tool;
494
+ };
495
+
496
+ // src/model-config/useAssistantToolUI.tsx
497
+ var import_react12 = require("react");
498
+ var useAssistantToolUI = (tool) => {
499
+ const { useToolUIs } = useAssistantContext();
500
+ const setToolUI = useToolUIs((s) => s.setToolUI);
501
+ (0, import_react12.useEffect)(() => {
502
+ if (!tool) return;
503
+ const { toolName, render } = tool;
504
+ return setToolUI(toolName, render);
505
+ }, [setToolUI, tool]);
506
+ };
507
+
508
+ // src/model-config/makeAssistantToolUI.tsx
509
+ var makeAssistantToolUI = (tool) => {
510
+ const ToolUI = () => {
511
+ useAssistantToolUI(tool);
512
+ return null;
513
+ };
514
+ return ToolUI;
515
+ };
516
+
517
+ // src/model-config/useAssistantInstructions.tsx
518
+ var import_react13 = require("react");
519
+ var useAssistantInstructions = (instruction) => {
520
+ const { useModelConfig } = useAssistantContext();
521
+ const registerModelConfigProvider = useModelConfig(
522
+ (s) => s.registerModelConfigProvider
523
+ );
524
+ (0, import_react13.useEffect)(() => {
525
+ const config = {
526
+ system: instruction
527
+ };
528
+ return registerModelConfigProvider(() => config);
529
+ }, [registerModelConfigProvider, instruction]);
530
+ };
531
+
532
+ // src/primitive-hooks/actionBar/useActionBarCopy.tsx
533
+ var import_react16 = require("react");
534
+
535
+ // src/utils/combined/useCombinedStore.ts
536
+ var import_react15 = require("react");
537
+
538
+ // src/utils/combined/createCombinedStore.ts
539
+ var import_react14 = require("react");
540
+ var createCombinedStore = (stores) => {
541
+ const subscribe = (callback) => {
542
+ const unsubscribes = stores.map((store) => store.subscribe(callback));
543
+ return () => {
544
+ for (const unsub of unsubscribes) {
545
+ unsub();
546
+ }
547
+ };
548
+ };
549
+ return (selector) => {
550
+ const getSnapshot = () => selector(...stores.map((store) => store.getState()));
551
+ return (0, import_react14.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
552
+ };
553
+ };
554
+
555
+ // src/utils/combined/useCombinedStore.ts
556
+ var useCombinedStore = (stores, selector) => {
557
+ const useCombined = (0, import_react15.useMemo)(() => createCombinedStore(stores), stores);
558
+ return useCombined(selector);
559
+ };
560
+
561
+ // src/utils/getMessageText.tsx
562
+ var getMessageText = (message) => {
563
+ const textParts = message.content.filter(
564
+ (part) => part.type === "text"
565
+ );
566
+ return textParts.map((part) => part.text).join("\n\n");
567
+ };
568
+
569
+ // src/primitive-hooks/actionBar/useActionBarCopy.tsx
570
+ var useActionBarCopy = ({
571
+ copiedDuration = 3e3
572
+ } = {}) => {
573
+ const { useMessage, useMessageUtils, useEditComposer } = useMessageContext();
574
+ const hasCopyableContent = useCombinedStore(
575
+ [useMessage, useEditComposer],
576
+ (m, c) => {
577
+ return !c.isEditing && m.message.content.some((c2) => c2.type === "text");
578
+ }
579
+ );
580
+ const callback = (0, import_react16.useCallback)(() => {
581
+ const { message } = useMessage.getState();
582
+ const { setIsCopied } = useMessageUtils.getState();
583
+ const { isEditing, value: composerValue } = useEditComposer.getState();
584
+ const valueToCopy = isEditing ? composerValue : getMessageText(message);
585
+ navigator.clipboard.writeText(valueToCopy);
586
+ setIsCopied(true);
587
+ setTimeout(() => setIsCopied(false), copiedDuration);
588
+ }, [useMessage, useMessageUtils, useEditComposer, copiedDuration]);
589
+ if (!hasCopyableContent) return null;
590
+ return callback;
591
+ };
592
+
593
+ // src/primitive-hooks/actionBar/useActionBarEdit.tsx
594
+ var import_react17 = require("react");
595
+ var useActionBarEdit = () => {
596
+ const { useMessage, useEditComposer } = useMessageContext();
597
+ const disabled = useCombinedStore(
598
+ [useMessage, useEditComposer],
599
+ (m, c) => m.message.role !== "user" || c.isEditing
600
+ );
601
+ const callback = (0, import_react17.useCallback)(() => {
602
+ const { edit } = useEditComposer.getState();
603
+ edit();
604
+ }, [useEditComposer]);
605
+ if (disabled) return null;
606
+ return callback;
607
+ };
608
+
609
+ // src/primitive-hooks/actionBar/useActionBarReload.tsx
610
+ var import_react18 = require("react");
611
+ var useActionBarReload = () => {
612
+ const { useThread, useThreadActions, useComposer, useViewport } = useThreadContext();
613
+ const { useMessage } = useMessageContext();
614
+ const disabled = useCombinedStore(
615
+ [useThread, useMessage],
616
+ (t, m) => t.isRunning || m.message.role !== "assistant"
617
+ );
618
+ const callback = (0, import_react18.useCallback)(() => {
619
+ const { parentId } = useMessage.getState();
620
+ useThreadActions.getState().startRun(parentId);
621
+ useViewport.getState().scrollToBottom();
622
+ useComposer.getState().focus();
623
+ }, [useThreadActions, useComposer, useViewport, useMessage]);
624
+ if (disabled) return null;
625
+ return callback;
626
+ };
627
+
628
+ // src/primitive-hooks/branchPicker/useBranchPickerCount.tsx
629
+ var useBranchPickerCount = () => {
630
+ const { useMessage } = useMessageContext();
631
+ const branchCount = useMessage((s) => s.branches.length);
632
+ return branchCount;
633
+ };
634
+
635
+ // src/primitive-hooks/branchPicker/useBranchPickerNext.tsx
636
+ var import_react19 = require("react");
637
+ var useBranchPickerNext = () => {
638
+ const { useThreadActions } = useThreadContext();
639
+ const { useMessage, useEditComposer } = useMessageContext();
640
+ const disabled = useCombinedStore(
641
+ [useMessage, useEditComposer],
642
+ (m, c) => c.isEditing || m.branches.indexOf(m.message.id) + 1 >= m.branches.length
643
+ );
644
+ const callback = (0, import_react19.useCallback)(() => {
645
+ const { message, branches } = useMessage.getState();
646
+ useThreadActions.getState().switchToBranch(branches[branches.indexOf(message.id) + 1]);
647
+ }, [useThreadActions, useMessage]);
648
+ if (disabled) return null;
649
+ return callback;
650
+ };
651
+
652
+ // src/primitive-hooks/branchPicker/useBranchPickerNumber.tsx
653
+ var useBranchPickerNumber = () => {
654
+ const { useMessage } = useMessageContext();
655
+ const branchIdx = useMessage((s) => s.branches.indexOf(s.message.id));
656
+ return branchIdx + 1;
657
+ };
658
+
659
+ // src/primitive-hooks/branchPicker/useBranchPickerPrevious.tsx
660
+ var import_react20 = require("react");
661
+ var useBranchPickerPrevious = () => {
662
+ const { useThreadActions } = useThreadContext();
663
+ const { useMessage, useEditComposer } = useMessageContext();
664
+ const disabled = useCombinedStore(
665
+ [useMessage, useEditComposer],
666
+ (m, c) => c.isEditing || m.branches.indexOf(m.message.id) <= 0
667
+ );
668
+ const callback = (0, import_react20.useCallback)(() => {
669
+ const { message, branches } = useMessage.getState();
670
+ useThreadActions.getState().switchToBranch(branches[branches.indexOf(message.id) - 1]);
671
+ }, [useThreadActions, useMessage]);
672
+ if (disabled) return null;
673
+ return callback;
674
+ };
675
+
549
676
  // src/primitive-hooks/composer/useComposerCancel.tsx
677
+ var import_react21 = require("react");
550
678
  var useComposerCancel = () => {
551
679
  const { useComposer } = useComposerContext();
552
680
  const disabled = useComposer((c) => !c.isEditing);
553
- const callback = (0, import_react16.useCallback)(() => {
681
+ const callback = (0, import_react21.useCallback)(() => {
554
682
  const { cancel } = useComposer.getState();
555
683
  cancel();
556
684
  }, [useComposer]);
@@ -569,12 +697,12 @@ var useComposerIf = (props) => {
569
697
  };
570
698
 
571
699
  // src/primitive-hooks/composer/useComposerSend.tsx
572
- var import_react17 = require("react");
700
+ var import_react22 = require("react");
573
701
  var useComposerSend = () => {
574
702
  const { useViewport, useComposer: useNewComposer } = useThreadContext();
575
703
  const { useComposer } = useComposerContext();
576
704
  const disabled = useComposer((c) => !c.isEditing || c.value.length === 0);
577
- const callback = (0, import_react17.useCallback)(() => {
705
+ const callback = (0, import_react22.useCallback)(() => {
578
706
  const composerState = useComposer.getState();
579
707
  if (!composerState.isEditing) return;
580
708
  composerState.send();
@@ -670,11 +798,11 @@ var useThreadEmpty = () => {
670
798
  };
671
799
 
672
800
  // src/primitive-hooks/thread/useThreadScrollToBottom.tsx
673
- var import_react18 = require("react");
801
+ var import_react23 = require("react");
674
802
  var useThreadScrollToBottom = () => {
675
803
  const { useComposer, useViewport } = useThreadContext();
676
804
  const isAtBottom = useViewport((s) => s.isAtBottom);
677
- const handleScrollToBottom = (0, import_react18.useCallback)(() => {
805
+ const handleScrollToBottom = (0, import_react23.useCallback)(() => {
678
806
  useViewport.getState().scrollToBottom();
679
807
  useComposer.getState().focus();
680
808
  }, [useViewport, useComposer]);
@@ -683,14 +811,14 @@ var useThreadScrollToBottom = () => {
683
811
  };
684
812
 
685
813
  // src/primitive-hooks/thread/useThreadSuggestion.tsx
686
- var import_react19 = require("react");
814
+ var import_react24 = require("react");
687
815
  var useThreadSuggestion = ({
688
816
  prompt,
689
817
  autoSend
690
818
  }) => {
691
819
  const { useThread, useComposer } = useThreadContext();
692
820
  const disabled = useThread((t) => t.isRunning);
693
- const callback = (0, import_react19.useCallback)(() => {
821
+ const callback = (0, import_react24.useCallback)(() => {
694
822
  const thread = useThread.getState();
695
823
  const composer = useComposer.getState();
696
824
  composer.setValue(prompt);
@@ -705,16 +833,17 @@ var useThreadSuggestion = ({
705
833
  // src/primitives/actionBar/index.ts
706
834
  var actionBar_exports = {};
707
835
  __export(actionBar_exports, {
708
- Copy: () => ActionBarCopy,
709
- Edit: () => ActionBarEdit,
710
- Reload: () => ActionBarReload,
711
- Root: () => ActionBarRoot
836
+ Copy: () => ActionBarPrimitiveCopy,
837
+ Edit: () => ActionBarPrimitiveEdit,
838
+ Reload: () => ActionBarPrimitiveReload,
839
+ Root: () => ActionBarPrimitiveRoot
712
840
  });
713
841
 
714
842
  // src/primitives/actionBar/ActionBarRoot.tsx
715
843
  var import_react_primitive = require("@radix-ui/react-primitive");
716
- var import_react20 = require("react");
717
- var import_jsx_runtime4 = require("react/jsx-runtime");
844
+ var import_react25 = require("react");
845
+
846
+ // src/primitives/actionBar/useActionBarFloatStatus.tsx
718
847
  var useActionBarFloatStatus = ({
719
848
  hideWhenRunning,
720
849
  autohide,
@@ -735,7 +864,10 @@ var useActionBarFloatStatus = ({
735
864
  }
736
865
  );
737
866
  };
738
- var ActionBarRoot = (0, import_react20.forwardRef)(({ hideWhenRunning, autohide, autohideFloat, ...rest }, ref) => {
867
+
868
+ // src/primitives/actionBar/ActionBarRoot.tsx
869
+ var import_jsx_runtime4 = require("react/jsx-runtime");
870
+ var ActionBarPrimitiveRoot = (0, import_react25.forwardRef)(({ hideWhenRunning, autohide, autohideFloat, ...rest }, ref) => {
739
871
  const hideAndfloatStatus = useActionBarFloatStatus({
740
872
  hideWhenRunning,
741
873
  autohide,
@@ -751,15 +883,15 @@ var ActionBarRoot = (0, import_react20.forwardRef)(({ hideWhenRunning, autohide,
751
883
  }
752
884
  );
753
885
  });
754
- ActionBarRoot.displayName = "ActionBarRoot";
886
+ ActionBarPrimitiveRoot.displayName = "ActionBarPrimitive.Root";
755
887
 
756
888
  // src/utils/createActionButton.tsx
757
889
  var import_primitive = require("@radix-ui/primitive");
758
890
  var import_react_primitive2 = require("@radix-ui/react-primitive");
759
- var import_react21 = require("react");
891
+ var import_react26 = require("react");
760
892
  var import_jsx_runtime5 = require("react/jsx-runtime");
761
893
  var createActionButton = (displayName, useActionButton) => {
762
- const ActionButton = (0, import_react21.forwardRef)((props, forwardedRef) => {
894
+ const ActionButton = (0, import_react26.forwardRef)((props, forwardedRef) => {
763
895
  const callback = useActionButton(props);
764
896
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
765
897
  import_react_primitive2.Primitive.button,
@@ -779,61 +911,64 @@ var createActionButton = (displayName, useActionButton) => {
779
911
  };
780
912
 
781
913
  // src/primitives/actionBar/ActionBarCopy.tsx
782
- var ActionBarCopy = createActionButton(
783
- "ActionBarCopy",
914
+ var ActionBarPrimitiveCopy = createActionButton(
915
+ "ActionBarPrimitive.Copy",
784
916
  useActionBarCopy
785
917
  );
786
918
 
787
919
  // src/primitives/actionBar/ActionBarReload.tsx
788
- var ActionBarReload = createActionButton(
789
- "ActionBarReload",
920
+ var ActionBarPrimitiveReload = createActionButton(
921
+ "ActionBarPrimitive.Reload",
790
922
  useActionBarReload
791
923
  );
792
924
 
793
925
  // src/primitives/actionBar/ActionBarEdit.tsx
794
- var ActionBarEdit = createActionButton(
795
- "ActionBarEdit",
926
+ var ActionBarPrimitiveEdit = createActionButton(
927
+ "ActionBarPrimitive.Edit",
796
928
  useActionBarEdit
797
929
  );
798
930
 
799
931
  // src/primitives/assistantModal/index.ts
800
932
  var assistantModal_exports = {};
801
933
  __export(assistantModal_exports, {
802
- Content: () => AssistantModalContent,
803
- Root: () => AssistantModalRoot,
804
- Trigger: () => AssistantModalTrigger
934
+ Content: () => AssistantModalPrimitiveContent,
935
+ Root: () => AssistantModalPrimitiveRoot,
936
+ Trigger: () => AssistantModalPrimitiveTrigger
805
937
  });
806
938
 
807
939
  // src/primitives/assistantModal/AssistantModalRoot.tsx
808
- var import_react23 = require("react");
809
- var PopoverPrimitive = __toESM(require("@radix-ui/react-popover"));
940
+ var import_react28 = require("react");
941
+ var PopoverPrimitive2 = __toESM(require("@radix-ui/react-popover"));
810
942
  var import_primitive2 = require("@radix-ui/primitive");
811
943
 
812
944
  // src/utils/hooks/useOnComposerFocus.tsx
813
945
  var import_react_use_callback_ref = require("@radix-ui/react-use-callback-ref");
814
- var import_react22 = require("react");
946
+ var import_react27 = require("react");
815
947
  var useOnComposerFocus = (callback) => {
816
948
  const callbackRef = (0, import_react_use_callback_ref.useCallbackRef)(callback);
817
949
  const { useComposer } = useThreadContext();
818
- (0, import_react22.useEffect)(() => {
950
+ (0, import_react27.useEffect)(() => {
819
951
  return useComposer.getState().onFocus(() => {
820
952
  callbackRef();
821
953
  });
822
954
  }, [useComposer, callbackRef]);
823
955
  };
824
956
 
957
+ // src/primitives/assistantModal/scope.tsx
958
+ var PopoverPrimitive = __toESM(require("@radix-ui/react-popover"));
959
+ var usePopoverScope = PopoverPrimitive.createPopoverScope();
960
+
825
961
  // src/primitives/assistantModal/AssistantModalRoot.tsx
826
962
  var import_jsx_runtime6 = require("react/jsx-runtime");
827
- var usePopoverScope = PopoverPrimitive.createPopoverScope();
828
963
  var useAssistantModalOpenState = (defaultOpen = false) => {
829
- const state = (0, import_react23.useState)(defaultOpen);
964
+ const state = (0, import_react28.useState)(defaultOpen);
830
965
  const [, setOpen] = state;
831
966
  useOnComposerFocus(() => {
832
967
  setOpen(true);
833
968
  });
834
969
  return state;
835
970
  };
836
- var AssistantModalRoot = ({
971
+ var AssistantModalPrimitiveRoot = ({
837
972
  __scopeAssistantModal,
838
973
  defaultOpen,
839
974
  open,
@@ -843,7 +978,7 @@ var AssistantModalRoot = ({
843
978
  const scope = usePopoverScope(__scopeAssistantModal);
844
979
  const [modalOpen, setOpen] = useAssistantModalOpenState(defaultOpen);
845
980
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
846
- PopoverPrimitive.Root,
981
+ PopoverPrimitive2.Root,
847
982
  {
848
983
  ...scope,
849
984
  open: open === void 0 ? modalOpen : open,
@@ -852,26 +987,29 @@ var AssistantModalRoot = ({
852
987
  }
853
988
  );
854
989
  };
855
- AssistantModalRoot.displayName = "AssistantModalRoot";
990
+ AssistantModalPrimitiveRoot.displayName = "AssistantModalPrimitive.Root";
856
991
 
857
992
  // src/primitives/assistantModal/AssistantModalTrigger.tsx
858
- var import_react24 = require("react");
859
- var PopoverPrimitive2 = __toESM(require("@radix-ui/react-popover"));
993
+ var import_react29 = require("react");
994
+ var PopoverPrimitive3 = __toESM(require("@radix-ui/react-popover"));
860
995
  var import_jsx_runtime7 = require("react/jsx-runtime");
861
- var AssistantModalTrigger = (0, import_react24.forwardRef)(
862
- ({ __scopeAssistantModal, ...rest }, ref) => {
996
+ var AssistantModalPrimitiveTrigger = (0, import_react29.forwardRef)(
997
+ ({
998
+ __scopeAssistantModal,
999
+ ...rest
1000
+ }, ref) => {
863
1001
  const scope = usePopoverScope(__scopeAssistantModal);
864
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(PopoverPrimitive2.Trigger, { ...scope, ...rest, ref });
1002
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(PopoverPrimitive3.Trigger, { ...scope, ...rest, ref });
865
1003
  }
866
1004
  );
867
- AssistantModalTrigger.displayName = "AssistantModalTrigger";
1005
+ AssistantModalPrimitiveTrigger.displayName = "AssistantModalPrimitive.Trigger";
868
1006
 
869
1007
  // src/primitives/assistantModal/AssistantModalContent.tsx
870
- var import_react25 = require("react");
871
- var PopoverPrimitive3 = __toESM(require("@radix-ui/react-popover"));
1008
+ var import_react30 = require("react");
1009
+ var PopoverPrimitive4 = __toESM(require("@radix-ui/react-popover"));
872
1010
  var import_primitive3 = require("@radix-ui/primitive");
873
1011
  var import_jsx_runtime8 = require("react/jsx-runtime");
874
- var AssistantModalContent = (0, import_react25.forwardRef)(
1012
+ var AssistantModalPrimitiveContent = (0, import_react30.forwardRef)(
875
1013
  ({
876
1014
  __scopeAssistantModal,
877
1015
  side,
@@ -881,8 +1019,8 @@ var AssistantModalContent = (0, import_react25.forwardRef)(
881
1019
  ...props
882
1020
  }, forwardedRef) => {
883
1021
  const scope = usePopoverScope(__scopeAssistantModal);
884
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(PopoverPrimitive3.Portal, { ...scope, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
885
- PopoverPrimitive3.Content,
1022
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(PopoverPrimitive4.Portal, { ...scope, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1023
+ PopoverPrimitive4.Content,
886
1024
  {
887
1025
  ...scope,
888
1026
  ...props,
@@ -897,97 +1035,101 @@ var AssistantModalContent = (0, import_react25.forwardRef)(
897
1035
  ) });
898
1036
  }
899
1037
  );
900
- AssistantModalContent.displayName = "AssistantModalContent";
1038
+ AssistantModalPrimitiveContent.displayName = "AssistantModalPrimitive.Content";
901
1039
 
902
1040
  // src/primitives/branchPicker/index.ts
903
1041
  var branchPicker_exports = {};
904
1042
  __export(branchPicker_exports, {
905
- Count: () => BranchPickerCount,
906
- Next: () => BranchPickerNext,
907
- Number: () => BranchPickerNumber,
1043
+ Count: () => BranchPickerPrimitiveCount,
1044
+ Next: () => BranchPickerPrimitiveNext,
1045
+ Number: () => BranchPickerPrimitiveNumber,
908
1046
  Previous: () => BranchPickerPrevious,
909
- Root: () => BranchPickerRoot
1047
+ Root: () => BranchPickerPrimitiveRoot
910
1048
  });
911
1049
 
912
1050
  // src/primitives/branchPicker/BranchPickerNext.tsx
913
- var BranchPickerNext = createActionButton(
914
- "BranchPickerNext",
1051
+ var BranchPickerPrimitiveNext = createActionButton(
1052
+ "BranchPickerPrimitive.Next",
915
1053
  useBranchPickerNext
916
1054
  );
917
1055
 
918
1056
  // src/primitives/branchPicker/BranchPickerPrevious.tsx
919
1057
  var BranchPickerPrevious = createActionButton(
920
- "BranchPickerPrevious",
1058
+ "BranchPickerPrimitive.Previous",
921
1059
  useBranchPickerPrevious
922
1060
  );
923
1061
 
924
1062
  // src/primitives/branchPicker/BranchPickerCount.tsx
925
1063
  var import_jsx_runtime9 = require("react/jsx-runtime");
926
- var BranchPickerCount = () => {
1064
+ var BranchPickerPrimitiveCount = () => {
927
1065
  const branchCount = useBranchPickerCount();
928
1066
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_jsx_runtime9.Fragment, { children: branchCount });
929
1067
  };
1068
+ BranchPickerPrimitiveCount.displayName = "BranchPickerPrimitive.Count";
930
1069
 
931
1070
  // src/primitives/branchPicker/BranchPickerNumber.tsx
932
1071
  var import_jsx_runtime10 = require("react/jsx-runtime");
933
- var BranchPickerNumber = () => {
1072
+ var BranchPickerPrimitiveNumber = () => {
934
1073
  const branchNumber = useBranchPickerNumber();
935
1074
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_jsx_runtime10.Fragment, { children: branchNumber });
936
1075
  };
1076
+ BranchPickerPrimitiveNumber.displayName = "BranchPickerPrimitive.Number";
937
1077
 
938
1078
  // src/primitives/branchPicker/BranchPickerRoot.tsx
939
1079
  var import_react_primitive6 = require("@radix-ui/react-primitive");
940
- var import_react31 = require("react");
1080
+ var import_react36 = require("react");
941
1081
 
942
1082
  // src/primitives/message/index.ts
943
1083
  var message_exports = {};
944
1084
  __export(message_exports, {
945
- Content: () => MessageContent,
946
- If: () => MessageIf,
947
- InProgress: () => MessageInProgress,
948
- Root: () => MessageRoot
1085
+ Content: () => MessagePrimitiveContent,
1086
+ If: () => MessagePrimitiveIf,
1087
+ InProgress: () => MessagePrimitiveInProgress,
1088
+ Root: () => MessagePrimitiveRoot
949
1089
  });
950
1090
 
951
1091
  // src/primitives/message/MessageRoot.tsx
952
1092
  var import_primitive4 = require("@radix-ui/primitive");
953
1093
  var import_react_primitive3 = require("@radix-ui/react-primitive");
954
- var import_react26 = require("react");
1094
+ var import_react31 = require("react");
955
1095
  var import_jsx_runtime11 = require("react/jsx-runtime");
956
- var MessageRoot = (0, import_react26.forwardRef)(
957
- ({ onMouseEnter, onMouseLeave, ...rest }, ref) => {
958
- const { useMessageUtils } = useMessageContext();
959
- const setIsHovering = useMessageUtils((s) => s.setIsHovering);
960
- const handleMouseEnter = () => {
961
- setIsHovering(true);
962
- };
963
- const handleMouseLeave = () => {
964
- setIsHovering(false);
965
- };
966
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
967
- import_react_primitive3.Primitive.div,
968
- {
969
- ...rest,
970
- ref,
971
- onMouseEnter: (0, import_primitive4.composeEventHandlers)(onMouseEnter, handleMouseEnter),
972
- onMouseLeave: (0, import_primitive4.composeEventHandlers)(onMouseLeave, handleMouseLeave)
973
- }
974
- );
975
- }
976
- );
977
- MessageRoot.displayName = "MessageRoot";
1096
+ var MessagePrimitiveRoot = (0, import_react31.forwardRef)(({ onMouseEnter, onMouseLeave, ...rest }, ref) => {
1097
+ const { useMessageUtils } = useMessageContext();
1098
+ const setIsHovering = useMessageUtils((s) => s.setIsHovering);
1099
+ const handleMouseEnter = () => {
1100
+ setIsHovering(true);
1101
+ };
1102
+ const handleMouseLeave = () => {
1103
+ setIsHovering(false);
1104
+ };
1105
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1106
+ import_react_primitive3.Primitive.div,
1107
+ {
1108
+ ...rest,
1109
+ ref,
1110
+ onMouseEnter: (0, import_primitive4.composeEventHandlers)(onMouseEnter, handleMouseEnter),
1111
+ onMouseLeave: (0, import_primitive4.composeEventHandlers)(onMouseLeave, handleMouseLeave)
1112
+ }
1113
+ );
1114
+ });
1115
+ MessagePrimitiveRoot.displayName = "MessagePrimitive.Root";
978
1116
 
979
1117
  // src/primitives/message/MessageIf.tsx
980
- var MessageIf = ({ children, ...query }) => {
1118
+ var MessagePrimitiveIf = ({
1119
+ children,
1120
+ ...query
1121
+ }) => {
981
1122
  const result = useMessageIf(query);
982
1123
  return result ? children : null;
983
1124
  };
1125
+ MessagePrimitiveIf.displayName = "MessagePrimitive.If";
984
1126
 
985
1127
  // src/primitives/message/MessageContent.tsx
986
- var import_react29 = require("react");
1128
+ var import_react34 = require("react");
987
1129
 
988
1130
  // src/context/providers/ContentPartProvider.tsx
989
- var import_react27 = require("react");
990
- var import_zustand7 = require("zustand");
1131
+ var import_react32 = require("react");
1132
+ var import_zustand8 = require("zustand");
991
1133
  var import_jsx_runtime12 = require("react/jsx-runtime");
992
1134
  var syncContentPart = ({ message }, useContentPart, partIndex) => {
993
1135
  const part = message.content[partIndex];
@@ -1005,14 +1147,14 @@ var syncContentPart = ({ message }, useContentPart, partIndex) => {
1005
1147
  };
1006
1148
  var useContentPartContext2 = (partIndex) => {
1007
1149
  const { useMessage } = useMessageContext();
1008
- const [context] = (0, import_react27.useState)(() => {
1009
- const useContentPart = (0, import_zustand7.create)(
1150
+ const [context] = (0, import_react32.useState)(() => {
1151
+ const useContentPart = (0, import_zustand8.create)(
1010
1152
  () => ({})
1011
1153
  );
1012
1154
  syncContentPart(useMessage.getState(), useContentPart, partIndex);
1013
1155
  return { useContentPart };
1014
1156
  });
1015
- (0, import_react27.useEffect)(() => {
1157
+ (0, import_react32.useEffect)(() => {
1016
1158
  syncContentPart(useMessage.getState(), context.useContentPart, partIndex);
1017
1159
  return useMessage.subscribe((message) => {
1018
1160
  syncContentPart(message, context.useContentPart, partIndex);
@@ -1029,36 +1171,38 @@ var ContentPartProvider = ({
1029
1171
  };
1030
1172
 
1031
1173
  // src/primitives/contentPart/ContentPartDisplay.tsx
1032
- var ContentPartDisplay = () => {
1174
+ var ContentPartPrimitiveDisplay = () => {
1033
1175
  const display = useContentPartDisplay();
1034
1176
  return display ?? null;
1035
1177
  };
1178
+ ContentPartPrimitiveDisplay.displayName = "ContentPartPrimitive.Display";
1036
1179
 
1037
1180
  // src/primitives/contentPart/ContentPartInProgressIndicator.tsx
1038
- var ContentPartInProgressIndicator = () => {
1181
+ var ContentPartPrimitiveInProgressIndicator = () => {
1039
1182
  const indicator = useContentPartInProgressIndicator();
1040
1183
  return indicator;
1041
1184
  };
1185
+ ContentPartPrimitiveInProgressIndicator.displayName = "ContentPartPrimitive.InProgressIndicator";
1042
1186
 
1043
1187
  // src/primitives/contentPart/ContentPartText.tsx
1044
1188
  var import_react_primitive4 = require("@radix-ui/react-primitive");
1045
- var import_react28 = require("react");
1189
+ var import_react33 = require("react");
1046
1190
  var import_jsx_runtime13 = require("react/jsx-runtime");
1047
- var ContentPartText = (0, import_react28.forwardRef)((props, forwardedRef) => {
1191
+ var ContentPartPrimitiveText = (0, import_react33.forwardRef)((props, forwardedRef) => {
1048
1192
  const text = useContentPartText();
1049
1193
  return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_primitive4.Primitive.p, { ...props, ref: forwardedRef, children: text });
1050
1194
  });
1051
- ContentPartText.displayName = "ContentPartText";
1195
+ ContentPartPrimitiveText.displayName = "ContentPartPrimitive.Text";
1052
1196
 
1053
1197
  // src/primitives/message/MessageContent.tsx
1054
1198
  var import_jsx_runtime14 = require("react/jsx-runtime");
1055
1199
  var defaultComponents = {
1056
1200
  Text: () => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
1057
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ContentPartText, { style: { whiteSpace: "pre-line" } }),
1058
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ContentPartInProgressIndicator, {})
1201
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ContentPartPrimitiveText, { style: { whiteSpace: "pre-line" } }),
1202
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ContentPartPrimitiveInProgressIndicator, {})
1059
1203
  ] }),
1060
1204
  Image: () => null,
1061
- UI: () => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ContentPartDisplay, {}),
1205
+ UI: () => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ContentPartPrimitiveDisplay, {}),
1062
1206
  tools: {
1063
1207
  Fallback: (props) => {
1064
1208
  const { useToolUIs } = useAssistantContext();
@@ -1103,11 +1247,13 @@ var MessageContentPartImpl = ({
1103
1247
  }) => {
1104
1248
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ContentPartProvider, { partIndex, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(MessageContentPartComponent, { components }) });
1105
1249
  };
1106
- var MessageContentPart = (0, import_react29.memo)(
1250
+ var MessageContentPart = (0, import_react34.memo)(
1107
1251
  MessageContentPartImpl,
1108
1252
  (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
1109
1253
  );
1110
- var MessageContent = ({ components }) => {
1254
+ var MessagePrimitiveContent = ({
1255
+ components
1256
+ }) => {
1111
1257
  const { useMessage } = useMessageContext();
1112
1258
  const contentLength = useMessage((s) => s.message.content.length);
1113
1259
  return new Array(contentLength).fill(null).map((_, idx) => {
@@ -1122,71 +1268,73 @@ var MessageContent = ({ components }) => {
1122
1268
  );
1123
1269
  });
1124
1270
  };
1271
+ MessagePrimitiveContent.displayName = "MessagePrimitive.Content";
1125
1272
 
1126
1273
  // src/primitives/message/MessageInProgress.tsx
1127
1274
  var import_react_primitive5 = require("@radix-ui/react-primitive");
1128
- var import_react30 = require("react");
1275
+ var import_react35 = require("react");
1129
1276
  var import_jsx_runtime15 = require("react/jsx-runtime");
1130
- var MessageInProgress = (0, import_react30.forwardRef)((props, ref) => {
1277
+ var MessagePrimitiveInProgress = (0, import_react35.forwardRef)((props, ref) => {
1131
1278
  const { useMessageUtils } = useMessageContext();
1132
- (0, import_react30.useMemo)(() => {
1279
+ (0, import_react35.useEffect)(() => {
1133
1280
  useMessageUtils.getState().setInProgressIndicator(/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_primitive5.Primitive.span, { ...props, ref }));
1281
+ return () => {
1282
+ useMessageUtils.getState().setInProgressIndicator(null);
1283
+ };
1134
1284
  }, [useMessageUtils, props, ref]);
1135
1285
  return null;
1136
1286
  });
1137
- MessageInProgress.displayName = "MessageInProgress";
1287
+ MessagePrimitiveInProgress.displayName = "MessagePrimitive.InProgress";
1138
1288
 
1139
1289
  // src/primitives/branchPicker/BranchPickerRoot.tsx
1140
1290
  var import_jsx_runtime16 = require("react/jsx-runtime");
1141
- var BranchPickerRoot = (0, import_react31.forwardRef)(({ hideWhenSingleBranch, ...rest }, ref) => {
1142
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(MessageIf, { hasBranches: hideWhenSingleBranch ? true : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_primitive6.Primitive.div, { ...rest, ref }) });
1291
+ var BranchPickerPrimitiveRoot = (0, import_react36.forwardRef)(({ hideWhenSingleBranch, ...rest }, ref) => {
1292
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(MessagePrimitiveIf, { hasBranches: hideWhenSingleBranch ? true : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_primitive6.Primitive.div, { ...rest, ref }) });
1143
1293
  });
1144
- BranchPickerRoot.displayName = "BranchPickerRoot";
1294
+ BranchPickerPrimitiveRoot.displayName = "BranchPickerPrimitive.Root";
1145
1295
 
1146
1296
  // src/primitives/composer/index.ts
1147
1297
  var composer_exports = {};
1148
1298
  __export(composer_exports, {
1149
- Cancel: () => ComposerCancel,
1150
- If: () => ComposerIf,
1151
- Input: () => ComposerInput,
1152
- Root: () => ComposerRoot,
1153
- Send: () => ComposerSend
1299
+ Cancel: () => ComposerPrimitiveCancel,
1300
+ If: () => ComposerPrimitiveIf,
1301
+ Input: () => ComposerPrimitiveInput,
1302
+ Root: () => ComposerPrimitiveRoot,
1303
+ Send: () => ComposerPrimitiveSend
1154
1304
  });
1155
1305
 
1156
1306
  // src/primitives/composer/ComposerRoot.tsx
1157
1307
  var import_primitive5 = require("@radix-ui/primitive");
1158
1308
  var import_react_primitive7 = require("@radix-ui/react-primitive");
1159
- var import_react32 = require("react");
1309
+ var import_react37 = require("react");
1160
1310
  var import_jsx_runtime17 = require("react/jsx-runtime");
1161
- var ComposerRoot = (0, import_react32.forwardRef)(
1162
- ({ onSubmit, ...rest }, forwardedRef) => {
1163
- const send = useComposerSend();
1164
- const handleSubmit = (e) => {
1165
- if (!send) return;
1166
- e.preventDefault();
1167
- send();
1168
- };
1169
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1170
- import_react_primitive7.Primitive.form,
1171
- {
1172
- ...rest,
1173
- ref: forwardedRef,
1174
- onSubmit: (0, import_primitive5.composeEventHandlers)(onSubmit, handleSubmit)
1175
- }
1176
- );
1177
- }
1178
- );
1179
- ComposerRoot.displayName = "ComposerRoot";
1311
+ var ComposerPrimitiveRoot = (0, import_react37.forwardRef)(({ onSubmit, ...rest }, forwardedRef) => {
1312
+ const send = useComposerSend();
1313
+ const handleSubmit = (e) => {
1314
+ e.preventDefault();
1315
+ if (!send) return;
1316
+ send();
1317
+ };
1318
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1319
+ import_react_primitive7.Primitive.form,
1320
+ {
1321
+ ...rest,
1322
+ ref: forwardedRef,
1323
+ onSubmit: (0, import_primitive5.composeEventHandlers)(onSubmit, handleSubmit)
1324
+ }
1325
+ );
1326
+ });
1327
+ ComposerPrimitiveRoot.displayName = "ComposerPrimitive.Root";
1180
1328
 
1181
1329
  // src/primitives/composer/ComposerInput.tsx
1182
1330
  var import_primitive6 = require("@radix-ui/primitive");
1183
1331
  var import_react_compose_refs = require("@radix-ui/react-compose-refs");
1184
1332
  var import_react_slot = require("@radix-ui/react-slot");
1185
- var import_react33 = require("react");
1333
+ var import_react38 = require("react");
1186
1334
  var import_react_textarea_autosize = __toESM(require("react-textarea-autosize"));
1187
1335
  var import_react_use_escape_keydown = require("@radix-ui/react-use-escape-keydown");
1188
1336
  var import_jsx_runtime18 = require("react/jsx-runtime");
1189
- var ComposerInput = (0, import_react33.forwardRef)(
1337
+ var ComposerPrimitiveInput = (0, import_react38.forwardRef)(
1190
1338
  ({ autoFocus = false, asChild, disabled, onChange, onKeyDown, ...rest }, forwardedRef) => {
1191
1339
  const { useThread } = useThreadContext();
1192
1340
  const { useComposer, type } = useComposerContext();
@@ -1195,7 +1343,7 @@ var ComposerInput = (0, import_react33.forwardRef)(
1195
1343
  return c.value;
1196
1344
  });
1197
1345
  const Component = asChild ? import_react_slot.Slot : import_react_textarea_autosize.default;
1198
- const textareaRef = (0, import_react33.useRef)(null);
1346
+ const textareaRef = (0, import_react38.useRef)(null);
1199
1347
  const ref = (0, import_react_compose_refs.useComposedRefs)(forwardedRef, textareaRef);
1200
1348
  (0, import_react_use_escape_keydown.useEscapeKeydown)((e) => {
1201
1349
  const composer = useComposer.getState();
@@ -1214,7 +1362,7 @@ var ComposerInput = (0, import_react33.forwardRef)(
1214
1362
  }
1215
1363
  };
1216
1364
  const autoFocusEnabled = autoFocus && !disabled;
1217
- const focus = (0, import_react33.useCallback)(() => {
1365
+ const focus = (0, import_react38.useCallback)(() => {
1218
1366
  const textarea = textareaRef.current;
1219
1367
  if (!textarea || !autoFocusEnabled) return;
1220
1368
  textarea.focus({ preventScroll: true });
@@ -1223,7 +1371,7 @@ var ComposerInput = (0, import_react33.forwardRef)(
1223
1371
  textareaRef.current.value.length
1224
1372
  );
1225
1373
  }, [autoFocusEnabled]);
1226
- (0, import_react33.useEffect)(() => focus(), [focus]);
1374
+ (0, import_react38.useEffect)(() => focus(), [focus]);
1227
1375
  useOnComposerFocus(() => {
1228
1376
  if (type === "new") {
1229
1377
  focus();
@@ -1246,113 +1394,120 @@ var ComposerInput = (0, import_react33.forwardRef)(
1246
1394
  );
1247
1395
  }
1248
1396
  );
1249
- ComposerInput.displayName = "ComposerInput";
1397
+ ComposerPrimitiveInput.displayName = "ComposerPrimitive.Input";
1250
1398
 
1251
1399
  // src/primitives/composer/ComposerSend.tsx
1252
- var import_react34 = require("react");
1400
+ var import_react39 = require("react");
1253
1401
  var import_react_primitive8 = require("@radix-ui/react-primitive");
1254
1402
  var import_jsx_runtime19 = require("react/jsx-runtime");
1255
- var ComposerSend = (0, import_react34.forwardRef)(
1256
- ({ disabled, ...rest }, ref) => {
1257
- const { useComposer } = useComposerContext();
1258
- const hasValue = useComposer((c) => c.isEditing && c.value.length > 0);
1259
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1260
- import_react_primitive8.Primitive.button,
1261
- {
1262
- type: "submit",
1263
- ...rest,
1264
- ref,
1265
- disabled: disabled || !hasValue
1266
- }
1267
- );
1268
- }
1269
- );
1270
- ComposerSend.displayName = "ComposerSend";
1403
+ var ComposerPrimitiveSend = (0, import_react39.forwardRef)(({ disabled, ...rest }, ref) => {
1404
+ const { useComposer } = useComposerContext();
1405
+ const hasValue = useComposer((c) => c.isEditing && c.value.length > 0);
1406
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1407
+ import_react_primitive8.Primitive.button,
1408
+ {
1409
+ type: "submit",
1410
+ ...rest,
1411
+ ref,
1412
+ disabled: disabled || !hasValue
1413
+ }
1414
+ );
1415
+ });
1416
+ ComposerPrimitiveSend.displayName = "ComposerPrimitive.Send";
1271
1417
 
1272
1418
  // src/primitives/composer/ComposerCancel.tsx
1273
- var ComposerCancel = createActionButton(
1274
- "ComposerCancel",
1419
+ var ComposerPrimitiveCancel = createActionButton(
1420
+ "ComposerPrimitive.Cancel",
1275
1421
  useComposerCancel
1276
1422
  );
1277
1423
 
1278
1424
  // src/primitives/composer/ComposerIf.tsx
1279
- var ComposerIf = ({ children, ...query }) => {
1425
+ var ComposerPrimitiveIf = ({
1426
+ children,
1427
+ ...query
1428
+ }) => {
1280
1429
  const result = useComposerIf(query);
1281
1430
  return result ? children : null;
1282
1431
  };
1432
+ ComposerPrimitiveIf.displayName = "ComposerPrimitive.If";
1283
1433
 
1284
1434
  // src/primitives/contentPart/index.ts
1285
1435
  var contentPart_exports = {};
1286
1436
  __export(contentPart_exports, {
1287
- Display: () => ContentPartDisplay,
1288
- Image: () => ContentPartImage,
1289
- InProgressIndicator: () => ContentPartInProgressIndicator,
1290
- Text: () => ContentPartText
1437
+ Display: () => ContentPartPrimitiveDisplay,
1438
+ Image: () => ContentPartPrimitiveImage,
1439
+ InProgressIndicator: () => ContentPartPrimitiveInProgressIndicator,
1440
+ Text: () => ContentPartPrimitiveText
1291
1441
  });
1292
1442
 
1293
1443
  // src/primitives/contentPart/ContentPartImage.tsx
1294
1444
  var import_react_primitive9 = require("@radix-ui/react-primitive");
1295
- var import_react35 = require("react");
1445
+ var import_react40 = require("react");
1296
1446
  var import_jsx_runtime20 = require("react/jsx-runtime");
1297
- var ContentPartImage = (0, import_react35.forwardRef)((props, forwardedRef) => {
1447
+ var ContentPartPrimitiveImage = (0, import_react40.forwardRef)((props, forwardedRef) => {
1298
1448
  const image = useContentPartImage();
1299
1449
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_primitive9.Primitive.img, { src: image, ...props, ref: forwardedRef });
1300
1450
  });
1301
- ContentPartImage.displayName = "ContentPartImage";
1451
+ ContentPartPrimitiveImage.displayName = "ContentPartPrimitive.Image";
1302
1452
 
1303
1453
  // src/primitives/thread/index.ts
1304
1454
  var thread_exports = {};
1305
1455
  __export(thread_exports, {
1306
- Empty: () => ThreadEmpty,
1307
- If: () => ThreadIf,
1308
- Messages: () => ThreadMessages,
1309
- Root: () => ThreadRoot,
1310
- ScrollToBottom: () => ThreadScrollToBottom,
1311
- Suggestion: () => ThreadSuggestion,
1312
- Viewport: () => ThreadViewport
1456
+ Empty: () => ThreadPrimitiveEmpty,
1457
+ If: () => ThreadPrimitiveIf,
1458
+ Messages: () => ThreadPrimitiveMessages,
1459
+ Root: () => ThreadPrimitiveRoot,
1460
+ ScrollToBottom: () => ThreadPrimitiveScrollToBottom,
1461
+ Suggestion: () => ThreadPrimitiveSuggestion,
1462
+ Viewport: () => ThreadPrimitiveViewport
1313
1463
  });
1314
1464
 
1315
1465
  // src/primitives/thread/ThreadRoot.tsx
1316
1466
  var import_react_primitive10 = require("@radix-ui/react-primitive");
1317
- var import_react36 = require("react");
1467
+ var import_react41 = require("react");
1318
1468
  var import_jsx_runtime21 = require("react/jsx-runtime");
1319
- var ThreadRoot = (0, import_react36.forwardRef)(
1320
- (props, ref) => {
1321
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_primitive10.Primitive.div, { ...props, ref });
1322
- }
1323
- );
1324
- ThreadRoot.displayName = "ThreadRoot";
1469
+ var ThreadPrimitiveRoot = (0, import_react41.forwardRef)((props, ref) => {
1470
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_primitive10.Primitive.div, { ...props, ref });
1471
+ });
1472
+ ThreadPrimitiveRoot.displayName = "ThreadPrimitive.Root";
1325
1473
 
1326
1474
  // src/primitives/thread/ThreadEmpty.tsx
1327
- var ThreadEmpty = ({ children }) => {
1475
+ var ThreadPrimitiveEmpty = ({
1476
+ children
1477
+ }) => {
1328
1478
  const empty = useThreadEmpty();
1329
1479
  return empty ? children : null;
1330
1480
  };
1481
+ ThreadPrimitiveEmpty.displayName = "ThreadPrimitive.Empty";
1331
1482
 
1332
1483
  // src/primitives/thread/ThreadIf.tsx
1333
- var ThreadIf = ({ children, ...query }) => {
1484
+ var ThreadPrimitiveIf = ({
1485
+ children,
1486
+ ...query
1487
+ }) => {
1334
1488
  const result = useThreadIf(query);
1335
1489
  return result ? children : null;
1336
1490
  };
1491
+ ThreadPrimitiveIf.displayName = "ThreadPrimitive.If";
1337
1492
 
1338
1493
  // src/primitives/thread/ThreadViewport.tsx
1339
1494
  var import_react_compose_refs3 = require("@radix-ui/react-compose-refs");
1340
1495
  var import_react_primitive11 = require("@radix-ui/react-primitive");
1341
- var import_react41 = require("react");
1496
+ var import_react46 = require("react");
1342
1497
 
1343
1498
  // src/primitive-hooks/thread/useThreadViewportAutoScroll.tsx
1344
1499
  var import_react_compose_refs2 = require("@radix-ui/react-compose-refs");
1345
- var import_react40 = require("react");
1500
+ var import_react45 = require("react");
1346
1501
 
1347
1502
  // src/utils/hooks/useOnResizeContent.tsx
1348
1503
  var import_react_use_callback_ref2 = require("@radix-ui/react-use-callback-ref");
1349
- var import_react38 = require("react");
1504
+ var import_react43 = require("react");
1350
1505
 
1351
1506
  // src/utils/hooks/useManagedRef.ts
1352
- var import_react37 = require("react");
1507
+ var import_react42 = require("react");
1353
1508
  var useManagedRef = (callback) => {
1354
- const cleanupRef = (0, import_react37.useRef)();
1355
- const ref = (0, import_react37.useCallback)(
1509
+ const cleanupRef = (0, import_react42.useRef)();
1510
+ const ref = (0, import_react42.useCallback)(
1356
1511
  (el) => {
1357
1512
  if (cleanupRef.current) {
1358
1513
  cleanupRef.current();
@@ -1369,7 +1524,7 @@ var useManagedRef = (callback) => {
1369
1524
  // src/utils/hooks/useOnResizeContent.tsx
1370
1525
  var useOnResizeContent = (callback) => {
1371
1526
  const callbackRef = (0, import_react_use_callback_ref2.useCallbackRef)(callback);
1372
- const refCallback = (0, import_react38.useCallback)(
1527
+ const refCallback = (0, import_react43.useCallback)(
1373
1528
  (el) => {
1374
1529
  const resizeObserver = new ResizeObserver(() => {
1375
1530
  callbackRef();
@@ -1406,11 +1561,11 @@ var useOnResizeContent = (callback) => {
1406
1561
 
1407
1562
  // src/utils/hooks/useOnScrollToBottom.tsx
1408
1563
  var import_react_use_callback_ref3 = require("@radix-ui/react-use-callback-ref");
1409
- var import_react39 = require("react");
1564
+ var import_react44 = require("react");
1410
1565
  var useOnScrollToBottom = (callback) => {
1411
1566
  const callbackRef = (0, import_react_use_callback_ref3.useCallbackRef)(callback);
1412
1567
  const { useViewport } = useThreadContext();
1413
- (0, import_react39.useEffect)(() => {
1568
+ (0, import_react44.useEffect)(() => {
1414
1569
  return useViewport.getState().onScrollToBottom(() => {
1415
1570
  callbackRef();
1416
1571
  });
@@ -1421,11 +1576,11 @@ var useOnScrollToBottom = (callback) => {
1421
1576
  var useThreadViewportAutoScroll = ({
1422
1577
  autoScroll = true
1423
1578
  }) => {
1424
- const divRef = (0, import_react40.useRef)(null);
1579
+ const divRef = (0, import_react45.useRef)(null);
1425
1580
  const { useViewport } = useThreadContext();
1426
- const firstRenderRef = (0, import_react40.useRef)(true);
1427
- const lastScrollTop = (0, import_react40.useRef)(0);
1428
- const isScrollingToBottomRef = (0, import_react40.useRef)(false);
1581
+ const firstRenderRef = (0, import_react45.useRef)(true);
1582
+ const lastScrollTop = (0, import_react45.useRef)(0);
1583
+ const isScrollingToBottomRef = (0, import_react45.useRef)(false);
1429
1584
  const scrollToBottom = () => {
1430
1585
  const div = divRef.current;
1431
1586
  if (!div || !autoScroll) return;
@@ -1472,28 +1627,28 @@ var useThreadViewportAutoScroll = ({
1472
1627
 
1473
1628
  // src/primitives/thread/ThreadViewport.tsx
1474
1629
  var import_jsx_runtime22 = require("react/jsx-runtime");
1475
- var ThreadViewport = (0, import_react41.forwardRef)(({ autoScroll, onScroll, children, ...rest }, forwardedRef) => {
1630
+ var ThreadPrimitiveViewport = (0, import_react46.forwardRef)(({ autoScroll, onScroll, children, ...rest }, forwardedRef) => {
1476
1631
  const autoScrollRef = useThreadViewportAutoScroll({
1477
1632
  autoScroll
1478
1633
  });
1479
1634
  const ref = (0, import_react_compose_refs3.useComposedRefs)(forwardedRef, autoScrollRef);
1480
1635
  return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_primitive11.Primitive.div, { ...rest, ref, children });
1481
1636
  });
1482
- ThreadViewport.displayName = "ThreadViewport";
1637
+ ThreadPrimitiveViewport.displayName = "ThreadPrimitive.Viewport";
1483
1638
 
1484
1639
  // src/primitives/thread/ThreadMessages.tsx
1485
- var import_react43 = require("react");
1640
+ var import_react48 = require("react");
1486
1641
 
1487
1642
  // src/context/providers/MessageProvider.tsx
1488
- var import_react42 = require("react");
1489
- var import_zustand10 = require("zustand");
1643
+ var import_react47 = require("react");
1644
+ var import_zustand11 = require("zustand");
1490
1645
 
1491
1646
  // src/context/stores/EditComposer.ts
1492
- var import_zustand8 = require("zustand");
1647
+ var import_zustand9 = require("zustand");
1493
1648
  var makeEditComposerStore = ({
1494
1649
  onEdit,
1495
1650
  onSend
1496
- }) => (0, import_zustand8.create)()((set, get, store) => ({
1651
+ }) => (0, import_zustand9.create)()((set, get, store) => ({
1497
1652
  ...makeBaseComposer(set, get, store),
1498
1653
  isEditing: false,
1499
1654
  edit: () => {
@@ -1513,8 +1668,8 @@ var makeEditComposerStore = ({
1513
1668
  }));
1514
1669
 
1515
1670
  // src/context/stores/MessageUtils.ts
1516
- var import_zustand9 = require("zustand");
1517
- var makeMessageUtilsStore = () => (0, import_zustand9.create)((set) => ({
1671
+ var import_zustand10 = require("zustand");
1672
+ var makeMessageUtilsStore = () => (0, import_zustand10.create)((set) => ({
1518
1673
  inProgressIndicator: null,
1519
1674
  setInProgressIndicator: (value) => {
1520
1675
  set({ inProgressIndicator: value });
@@ -1552,8 +1707,8 @@ var syncMessage = (thread, getBranches, useMessage, messageIndex) => {
1552
1707
  };
1553
1708
  var useMessageContext2 = (messageIndex) => {
1554
1709
  const { useThread, useThreadActions } = useThreadContext();
1555
- const [context] = (0, import_react42.useState)(() => {
1556
- const useMessage = (0, import_zustand10.create)(() => ({}));
1710
+ const [context] = (0, import_react47.useState)(() => {
1711
+ const useMessage = (0, import_zustand11.create)(() => ({}));
1557
1712
  const useMessageUtils = makeMessageUtilsStore();
1558
1713
  const useEditComposer = makeEditComposerStore({
1559
1714
  onEdit: () => {
@@ -1589,7 +1744,7 @@ var useMessageContext2 = (messageIndex) => {
1589
1744
  );
1590
1745
  return { useMessage, useMessageUtils, useEditComposer };
1591
1746
  });
1592
- (0, import_react42.useEffect)(() => {
1747
+ (0, import_react47.useEffect)(() => {
1593
1748
  return useThread.subscribe((thread) => {
1594
1749
  syncMessage(
1595
1750
  thread,
@@ -1624,18 +1779,20 @@ var ThreadMessageImpl = ({
1624
1779
  }) => {
1625
1780
  const { UserMessage, EditComposer, AssistantMessage } = getComponents(components);
1626
1781
  return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(MessageProvider, { messageIndex, children: [
1627
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(MessageIf, { user: true, children: [
1628
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ComposerIf, { editing: false, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(UserMessage, {}) }),
1629
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ComposerIf, { editing: true, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(EditComposer, {}) })
1782
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(MessagePrimitiveIf, { user: true, children: [
1783
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ComposerPrimitiveIf, { editing: false, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(UserMessage, {}) }),
1784
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ComposerPrimitiveIf, { editing: true, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(EditComposer, {}) })
1630
1785
  ] }),
1631
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(MessageIf, { assistant: true, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(AssistantMessage, {}) })
1786
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(MessagePrimitiveIf, { assistant: true, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(AssistantMessage, {}) })
1632
1787
  ] });
1633
1788
  };
1634
- var ThreadMessage = (0, import_react43.memo)(
1789
+ var ThreadMessage = (0, import_react48.memo)(
1635
1790
  ThreadMessageImpl,
1636
1791
  (prev, next) => prev.messageIndex === next.messageIndex && prev.components.UserMessage === next.components.UserMessage && prev.components.EditComposer === next.components.EditComposer && prev.components.AssistantMessage === next.components.AssistantMessage
1637
1792
  );
1638
- var ThreadMessages = ({ components }) => {
1793
+ var ThreadPrimitiveMessages = ({
1794
+ components
1795
+ }) => {
1639
1796
  const { useThread } = useThreadContext();
1640
1797
  const messagesLength = useThread((t) => t.messages.length);
1641
1798
  if (messagesLength === 0) return null;
@@ -1651,21 +1808,22 @@ var ThreadMessages = ({ components }) => {
1651
1808
  );
1652
1809
  });
1653
1810
  };
1811
+ ThreadPrimitiveMessages.displayName = "ThreadPrimitive.Messages";
1654
1812
 
1655
1813
  // src/primitives/thread/ThreadScrollToBottom.tsx
1656
- var ThreadScrollToBottom = createActionButton(
1657
- "ThreadScrollToBottom",
1814
+ var ThreadPrimitiveScrollToBottom = createActionButton(
1815
+ "ThreadPrimitive.ScrollToBottom",
1658
1816
  useThreadScrollToBottom
1659
1817
  );
1660
1818
 
1661
1819
  // src/primitives/thread/ThreadSuggestion.tsx
1662
- var ThreadSuggestion = createActionButton(
1663
- "ThreadSuggestion",
1820
+ var ThreadPrimitiveSuggestion = createActionButton(
1821
+ "ThreadPrimitive.Suggestion",
1664
1822
  useThreadSuggestion
1665
1823
  );
1666
1824
 
1667
1825
  // src/runtime/local/useLocalRuntime.tsx
1668
- var import_react44 = require("react");
1826
+ var import_react49 = require("react");
1669
1827
 
1670
1828
  // src/runtime/utils/idUtils.tsx
1671
1829
  var import_non_secure = require("nanoid/non-secure");
@@ -1827,13 +1985,91 @@ var MessageRepository = class {
1827
1985
  }
1828
1986
  };
1829
1987
 
1988
+ // src/runtime/core/BaseAssistantRuntime.tsx
1989
+ var BaseAssistantRuntime = class {
1990
+ constructor(_thread) {
1991
+ this._thread = _thread;
1992
+ this._thread = _thread;
1993
+ this._unsubscribe = this._thread.subscribe(this.subscriptionHandler);
1994
+ }
1995
+ _unsubscribe;
1996
+ get thread() {
1997
+ return this._thread;
1998
+ }
1999
+ set thread(thread) {
2000
+ this._unsubscribe();
2001
+ this._thread = thread;
2002
+ this._unsubscribe = this._thread.subscribe(this.subscriptionHandler);
2003
+ this.subscriptionHandler();
2004
+ }
2005
+ get messages() {
2006
+ return this.thread.messages;
2007
+ }
2008
+ get isRunning() {
2009
+ return this.thread.isRunning;
2010
+ }
2011
+ getBranches(messageId) {
2012
+ return this.thread.getBranches(messageId);
2013
+ }
2014
+ switchToBranch(branchId) {
2015
+ return this.thread.switchToBranch(branchId);
2016
+ }
2017
+ append(message) {
2018
+ return this.thread.append(message);
2019
+ }
2020
+ startRun(parentId) {
2021
+ return this.thread.startRun(parentId);
2022
+ }
2023
+ cancelRun() {
2024
+ return this.thread.cancelRun();
2025
+ }
2026
+ addToolResult(toolCallId, result) {
2027
+ return this.thread.addToolResult(toolCallId, result);
2028
+ }
2029
+ _subscriptions = /* @__PURE__ */ new Set();
2030
+ subscribe(callback) {
2031
+ this._subscriptions.add(callback);
2032
+ return () => this._subscriptions.delete(callback);
2033
+ }
2034
+ subscriptionHandler = () => {
2035
+ for (const callback of this._subscriptions) callback();
2036
+ };
2037
+ get unstable_synchronizer() {
2038
+ return this.thread.unstable_synchronizer;
2039
+ }
2040
+ };
2041
+
1830
2042
  // src/runtime/local/LocalRuntime.tsx
1831
- var LocalRuntime = class {
2043
+ var LocalRuntime = class extends BaseAssistantRuntime {
2044
+ _configProviders;
1832
2045
  constructor(adapter) {
2046
+ const configProviders = /* @__PURE__ */ new Set();
2047
+ super(new LocalThreadRuntime(configProviders, adapter));
2048
+ this._configProviders = configProviders;
2049
+ }
2050
+ set adapter(adapter) {
2051
+ this.thread.adapter = adapter;
2052
+ }
2053
+ registerModelConfigProvider(provider) {
2054
+ this._configProviders.add(provider);
2055
+ return () => this._configProviders.delete(provider);
2056
+ }
2057
+ switchToThread(threadId) {
2058
+ if (threadId) {
2059
+ throw new Error("LocalRuntime does not yet support switching threads");
2060
+ }
2061
+ return this.thread = new LocalThreadRuntime(
2062
+ this._configProviders,
2063
+ this.thread.adapter
2064
+ );
2065
+ }
2066
+ };
2067
+ var LocalThreadRuntime = class {
2068
+ constructor(_configProviders, adapter) {
2069
+ this._configProviders = _configProviders;
1833
2070
  this.adapter = adapter;
1834
2071
  }
1835
2072
  _subscriptions = /* @__PURE__ */ new Set();
1836
- _configProviders = /* @__PURE__ */ new Set();
1837
2073
  abortController = null;
1838
2074
  repository = new MessageRepository();
1839
2075
  get messages() {
@@ -1912,96 +2148,24 @@ var LocalRuntime = class {
1912
2148
  this._subscriptions.add(callback);
1913
2149
  return () => this._subscriptions.delete(callback);
1914
2150
  }
1915
- registerModelConfigProvider(provider) {
1916
- this._configProviders.add(provider);
1917
- return () => this._configProviders.delete(provider);
1918
- }
1919
2151
  addToolResult() {
1920
- throw new Error("LocalRuntime does not yet support tool results");
2152
+ throw new Error("LocalRuntime does not yet support adding tool results");
1921
2153
  }
1922
2154
  };
1923
2155
 
1924
2156
  // src/runtime/local/useLocalRuntime.tsx
1925
2157
  var useLocalRuntime = (adapter) => {
1926
- const [runtime] = (0, import_react44.useState)(() => new LocalRuntime(adapter));
1927
- (0, import_react44.useInsertionEffect)(() => {
2158
+ const [runtime] = (0, import_react49.useState)(() => new LocalRuntime(adapter));
2159
+ (0, import_react49.useInsertionEffect)(() => {
1928
2160
  runtime.adapter = adapter;
1929
2161
  });
1930
2162
  return runtime;
1931
2163
  };
1932
2164
 
1933
- // src/model-config/useAssistantTool.tsx
1934
- var import_react45 = require("react");
1935
- var useAssistantTool = (tool) => {
1936
- const { useModelConfig, useToolUIs } = useAssistantContext();
1937
- const registerModelConfigProvider = useModelConfig(
1938
- (s) => s.registerModelConfigProvider
1939
- );
1940
- const setToolUI = useToolUIs((s) => s.setToolUI);
1941
- (0, import_react45.useEffect)(() => {
1942
- const { toolName, render, ...rest } = tool;
1943
- const config = {
1944
- tools: {
1945
- [tool.toolName]: rest
1946
- }
1947
- };
1948
- const unsub1 = registerModelConfigProvider(() => config);
1949
- const unsub2 = render ? setToolUI(toolName, render) : void 0;
1950
- return () => {
1951
- unsub1();
1952
- unsub2?.();
1953
- };
1954
- }, [registerModelConfigProvider, setToolUI, tool]);
1955
- };
1956
-
1957
- // src/model-config/makeAssistantTool.tsx
1958
- var makeAssistantTool = (tool) => {
1959
- const Tool = () => {
1960
- useAssistantTool(tool);
1961
- return null;
1962
- };
1963
- return Tool;
1964
- };
1965
-
1966
- // src/model-config/useAssistantToolUI.tsx
1967
- var import_react46 = require("react");
1968
- var useAssistantToolUI = (tool) => {
1969
- const { useToolUIs } = useAssistantContext();
1970
- const setToolUI = useToolUIs((s) => s.setToolUI);
1971
- (0, import_react46.useEffect)(() => {
1972
- if (!tool) return;
1973
- const { toolName, render } = tool;
1974
- return setToolUI(toolName, render);
1975
- }, [setToolUI, tool]);
1976
- };
1977
-
1978
- // src/model-config/makeAssistantToolUI.tsx
1979
- var makeAssistantToolUI = (tool) => {
1980
- const ToolUI = () => {
1981
- useAssistantToolUI(tool);
1982
- return null;
1983
- };
1984
- return ToolUI;
1985
- };
1986
-
1987
- // src/model-config/useAssistantInstructions.tsx
1988
- var import_react47 = require("react");
1989
- var useAssistantInstructions = (instruction) => {
1990
- const { useModelConfig } = useAssistantContext();
1991
- const registerModelConfigProvider = useModelConfig(
1992
- (s) => s.registerModelConfigProvider
1993
- );
1994
- (0, import_react47.useEffect)(() => {
1995
- const config = {
1996
- system: instruction
1997
- };
1998
- return registerModelConfigProvider(() => config);
1999
- }, [registerModelConfigProvider, instruction]);
2000
- };
2001
-
2002
2165
  // src/internal.ts
2003
2166
  var internal_exports = {};
2004
2167
  __export(internal_exports, {
2168
+ BaseAssistantRuntime: () => BaseAssistantRuntime,
2005
2169
  MessageRepository: () => MessageRepository,
2006
2170
  ProxyConfigProvider: () => ProxyConfigProvider
2007
2171
  });
@@ -2021,6 +2185,7 @@ __export(internal_exports, {
2021
2185
  useActionBarCopy,
2022
2186
  useActionBarEdit,
2023
2187
  useActionBarReload,
2188
+ useAppendMessage,
2024
2189
  useAssistantContext,
2025
2190
  useAssistantInstructions,
2026
2191
  useAssistantTool,
@@ -2041,6 +2206,7 @@ __export(internal_exports, {
2041
2206
  useLocalRuntime,
2042
2207
  useMessageContext,
2043
2208
  useMessageIf,
2209
+ useSwitchToNewThread,
2044
2210
  useThreadContext,
2045
2211
  useThreadEmpty,
2046
2212
  useThreadIf,