@assistant-ui/react 0.1.9 → 0.1.11

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
@@ -38,19 +38,33 @@ __export(src_exports, {
38
38
  INTERNAL: () => internal_exports,
39
39
  MessagePrimitive: () => message_exports,
40
40
  ThreadPrimitive: () => thread_exports,
41
- useBeginMessageEdit: () => useBeginMessageEdit,
42
- useCopyMessage: () => useCopyMessage,
43
- useGoToNextBranch: () => useGoToNextBranch,
44
- useGoToPreviousBranch: () => useGoToPreviousBranch,
41
+ useActionBarCopy: () => useActionBarCopy,
42
+ useActionBarEdit: () => useActionBarEdit,
43
+ useActionBarReload: () => useActionBarReload,
44
+ useBranchPickerCount: () => useBranchPickerCount,
45
+ useBranchPickerNext: () => useBranchPickerNext,
46
+ useBranchPickerNumber: () => useBranchPickerNumber,
47
+ useBranchPickerPrevious: () => useBranchPickerPrevious,
48
+ useComposerCancel: () => useComposerCancel,
49
+ useComposerIf: () => useComposerIf,
50
+ useComposerSend: () => useComposerSend,
51
+ useContentPartDisplay: () => useContentPartDisplay,
52
+ useContentPartImage: () => useContentPartImage,
53
+ useContentPartInProgressIndicator: () => useContentPartInProgressIndicator,
54
+ useContentPartText: () => useContentPartText,
45
55
  useLocalRuntime: () => useLocalRuntime,
46
- useReloadMessage: () => useReloadMessage
56
+ useMessageIf: () => useMessageIf,
57
+ useThreadEmpty: () => useThreadEmpty,
58
+ useThreadIf: () => useThreadIf,
59
+ useThreadScrollToBottom: () => useThreadScrollToBottom,
60
+ useThreadSuggestion: () => useThreadSuggestion
47
61
  });
48
62
  module.exports = __toCommonJS(src_exports);
49
63
 
50
- // src/actions/useCopyMessage.tsx
64
+ // src/primitive-hooks/actionBar/useActionBarCopy.tsx
51
65
  var import_react4 = require("react");
52
66
 
53
- // src/context/MessageContext.ts
67
+ // src/context/react/MessageContext.ts
54
68
  var import_react = require("react");
55
69
  var MessageContext = (0, import_react.createContext)(null);
56
70
  var useMessageContext = () => {
@@ -96,36 +110,54 @@ var getMessageText = (message) => {
96
110
  return textParts.map((part) => part.text).join("\n\n");
97
111
  };
98
112
 
99
- // src/actions/useCopyMessage.tsx
100
- var useCopyMessage = ({ copiedDuration = 3e3 }) => {
101
- const { useMessage, useMessageUtils, useComposer } = useMessageContext();
113
+ // src/primitive-hooks/actionBar/useActionBarCopy.tsx
114
+ var useActionBarCopy = ({
115
+ copiedDuration = 3e3
116
+ } = {}) => {
117
+ const { useMessage, useMessageUtils, useEditComposer } = useMessageContext();
102
118
  const hasCopyableContent = useCombinedStore(
103
- [useMessage, useComposer],
119
+ [useMessage, useEditComposer],
104
120
  (m, c) => {
105
- return c.isEditing || m.message.content.some((c2) => c2.type === "text");
121
+ return !c.isEditing && m.message.content.some((c2) => c2.type === "text");
106
122
  }
107
123
  );
108
124
  const callback = (0, import_react4.useCallback)(() => {
109
125
  const { message } = useMessage.getState();
110
126
  const { setIsCopied } = useMessageUtils.getState();
111
- const { isEditing, value: composerValue } = useComposer.getState();
127
+ const { isEditing, value: composerValue } = useEditComposer.getState();
112
128
  const valueToCopy = isEditing ? composerValue : getMessageText(message);
113
129
  navigator.clipboard.writeText(valueToCopy);
114
130
  setIsCopied(true);
115
131
  setTimeout(() => setIsCopied(false), copiedDuration);
116
- }, [useMessage, useMessageUtils, useComposer, copiedDuration]);
132
+ }, [useMessage, useMessageUtils, useEditComposer, copiedDuration]);
117
133
  if (!hasCopyableContent) return null;
118
134
  return callback;
119
135
  };
120
136
 
121
- // src/actions/useReloadMessage.tsx
122
- var import_react6 = require("react");
123
-
124
- // src/context/ThreadContext.ts
137
+ // src/primitive-hooks/actionBar/useActionBarEdit.tsx
125
138
  var import_react5 = require("react");
126
- var ThreadContext = (0, import_react5.createContext)(null);
139
+ var useActionBarEdit = () => {
140
+ const { useMessage, useEditComposer } = useMessageContext();
141
+ const disabled = useCombinedStore(
142
+ [useMessage, useEditComposer],
143
+ (m, c) => m.message.role !== "user" || c.isEditing
144
+ );
145
+ const callback = (0, import_react5.useCallback)(() => {
146
+ const { edit } = useEditComposer.getState();
147
+ edit();
148
+ }, [useEditComposer]);
149
+ if (disabled) return null;
150
+ return callback;
151
+ };
152
+
153
+ // src/primitive-hooks/actionBar/useActionBarReload.tsx
154
+ var import_react7 = require("react");
155
+
156
+ // src/context/react/ThreadContext.ts
157
+ var import_react6 = require("react");
158
+ var ThreadContext = (0, import_react6.createContext)(null);
127
159
  var useThreadContext = () => {
128
- const context = (0, import_react5.useContext)(ThreadContext);
160
+ const context = (0, import_react6.useContext)(ThreadContext);
129
161
  if (!context)
130
162
  throw new Error(
131
163
  "This component must be used within an AssistantRuntimeProvider."
@@ -133,15 +165,15 @@ var useThreadContext = () => {
133
165
  return context;
134
166
  };
135
167
 
136
- // src/actions/useReloadMessage.tsx
137
- var useReloadMessage = () => {
168
+ // src/primitive-hooks/actionBar/useActionBarReload.tsx
169
+ var useActionBarReload = () => {
138
170
  const { useThread, useThreadActions, useViewport } = useThreadContext();
139
171
  const { useMessage } = useMessageContext();
140
172
  const disabled = useCombinedStore(
141
173
  [useThread, useMessage],
142
174
  (t, m) => t.isRunning || m.message.role !== "assistant"
143
175
  );
144
- const callback = (0, import_react6.useCallback)(() => {
176
+ const callback = (0, import_react7.useCallback)(() => {
145
177
  const { parentId } = useMessage.getState();
146
178
  useThreadActions.getState().startRun(parentId);
147
179
  useViewport.getState().scrollToBottom();
@@ -150,29 +182,20 @@ var useReloadMessage = () => {
150
182
  return callback;
151
183
  };
152
184
 
153
- // src/actions/useBeginMessageEdit.tsx
154
- var import_react7 = require("react");
155
- var useBeginMessageEdit = () => {
156
- const { useMessage, useComposer } = useMessageContext();
157
- const disabled = useCombinedStore(
158
- [useMessage, useComposer],
159
- (m, c) => m.message.role !== "user" || c.isEditing
160
- );
161
- const callback = (0, import_react7.useCallback)(() => {
162
- const { edit } = useComposer.getState();
163
- edit();
164
- }, [useComposer]);
165
- if (disabled) return null;
166
- return callback;
185
+ // src/primitive-hooks/branchPicker/useBranchPickerCount.tsx
186
+ var useBranchPickerCount = () => {
187
+ const { useMessage } = useMessageContext();
188
+ const branchCount = useMessage((s) => s.branches.length);
189
+ return branchCount;
167
190
  };
168
191
 
169
- // src/actions/useGoToNextBranch.tsx
192
+ // src/primitive-hooks/branchPicker/useBranchPickerNext.tsx
170
193
  var import_react8 = require("react");
171
- var useGoToNextBranch = () => {
194
+ var useBranchPickerNext = () => {
172
195
  const { useThreadActions } = useThreadContext();
173
- const { useMessage, useComposer } = useMessageContext();
196
+ const { useMessage, useEditComposer } = useMessageContext();
174
197
  const disabled = useCombinedStore(
175
- [useMessage, useComposer],
198
+ [useMessage, useEditComposer],
176
199
  (m, c) => c.isEditing || m.branches.indexOf(m.message.id) + 1 >= m.branches.length
177
200
  );
178
201
  const callback = (0, import_react8.useCallback)(() => {
@@ -183,13 +206,20 @@ var useGoToNextBranch = () => {
183
206
  return callback;
184
207
  };
185
208
 
186
- // src/actions/useGoToPreviousBranch.tsx
209
+ // src/primitive-hooks/branchPicker/useBranchPickerNumber.tsx
210
+ var useBranchPickerNumber = () => {
211
+ const { useMessage } = useMessageContext();
212
+ const branchIdx = useMessage((s) => s.branches.indexOf(s.message.id));
213
+ return branchIdx + 1;
214
+ };
215
+
216
+ // src/primitive-hooks/branchPicker/useBranchPickerPrevious.tsx
187
217
  var import_react9 = require("react");
188
- var useGoToPreviousBranch = () => {
218
+ var useBranchPickerPrevious = () => {
189
219
  const { useThreadActions } = useThreadContext();
190
- const { useMessage, useComposer } = useMessageContext();
220
+ const { useMessage, useEditComposer } = useMessageContext();
191
221
  const disabled = useCombinedStore(
192
- [useMessage, useComposer],
222
+ [useMessage, useEditComposer],
193
223
  (m, c) => c.isEditing || m.branches.indexOf(m.message.id) <= 0
194
224
  );
195
225
  const callback = (0, import_react9.useCallback)(() => {
@@ -200,6 +230,206 @@ var useGoToPreviousBranch = () => {
200
230
  return callback;
201
231
  };
202
232
 
233
+ // src/primitive-hooks/composer/useComposerCancel.tsx
234
+ var import_react13 = require("react");
235
+
236
+ // src/context/react/AssistantContext.ts
237
+ var import_react10 = require("react");
238
+ var AssistantContext = (0, import_react10.createContext)(
239
+ null
240
+ );
241
+ var useAssistantContext = () => {
242
+ const context = (0, import_react10.useContext)(AssistantContext);
243
+ if (!context)
244
+ throw new Error(
245
+ "This component must be used within an AssistantRuntimeProvider."
246
+ );
247
+ return context;
248
+ };
249
+
250
+ // src/context/react/ComposerContext.ts
251
+ var import_react11 = require("react");
252
+ var useComposerContext = () => {
253
+ const { useComposer } = useThreadContext();
254
+ const { useEditComposer } = (0, import_react11.useContext)(MessageContext) ?? {};
255
+ return (0, import_react11.useMemo)(
256
+ () => ({
257
+ useComposer: useEditComposer ?? useComposer,
258
+ type: useEditComposer ? "edit" : "new"
259
+ }),
260
+ [useEditComposer, useComposer]
261
+ );
262
+ };
263
+
264
+ // src/context/react/ContentPartContext.ts
265
+ var import_react12 = require("react");
266
+ var ContentPartContext = (0, import_react12.createContext)(
267
+ null
268
+ );
269
+ var useContentPartContext = () => {
270
+ const context = (0, import_react12.useContext)(ContentPartContext);
271
+ if (!context)
272
+ throw new Error(
273
+ "This component can only be used inside a component passed to <MessagePrimitive.Content components={...} >."
274
+ );
275
+ return context;
276
+ };
277
+
278
+ // src/primitive-hooks/composer/useComposerCancel.tsx
279
+ var useComposerCancel = () => {
280
+ const { useComposer } = useComposerContext();
281
+ const disabled = useComposer((c) => !c.isEditing);
282
+ const callback = (0, import_react13.useCallback)(() => {
283
+ const { cancel } = useComposer.getState();
284
+ cancel();
285
+ }, [useComposer]);
286
+ if (disabled) return null;
287
+ return callback;
288
+ };
289
+
290
+ // src/primitive-hooks/composer/useComposerIf.tsx
291
+ var useComposerIf = (props) => {
292
+ const { useComposer } = useComposerContext();
293
+ return useComposer((composer) => {
294
+ if (props.editing === true && !composer.isEditing) return false;
295
+ if (props.editing === false && composer.isEditing) return false;
296
+ return true;
297
+ });
298
+ };
299
+
300
+ // src/primitive-hooks/composer/useComposerSend.tsx
301
+ var import_react14 = require("react");
302
+ var useComposerSend = () => {
303
+ const { useViewport } = useThreadContext();
304
+ const { useComposer } = useComposerContext();
305
+ const disabled = useComposer((c) => !c.isEditing || c.value.length === 0);
306
+ const callback = (0, import_react14.useCallback)(() => {
307
+ const composerState = useComposer.getState();
308
+ if (!composerState.isEditing) return;
309
+ composerState.send();
310
+ useViewport.getState().scrollToBottom();
311
+ }, [useComposer, useViewport]);
312
+ if (disabled) return null;
313
+ return callback;
314
+ };
315
+
316
+ // src/primitive-hooks/contentPart/useContentPartDisplay.tsx
317
+ var useContentPartDisplay = () => {
318
+ const { useContentPart } = useContentPartContext();
319
+ const display = useContentPart((c) => {
320
+ if (c.part.type !== "ui")
321
+ throw new Error(
322
+ "This component can only be used inside ui content parts."
323
+ );
324
+ return c.part.display;
325
+ });
326
+ return display;
327
+ };
328
+
329
+ // src/primitive-hooks/contentPart/useContentPartImage.tsx
330
+ var useContentPartImage = () => {
331
+ const { useContentPart } = useContentPartContext();
332
+ const image = useContentPart((c) => {
333
+ if (c.part.type !== "image")
334
+ throw new Error(
335
+ "ContentPartImage can only be used inside image content parts."
336
+ );
337
+ return c.part.image;
338
+ });
339
+ return image;
340
+ };
341
+
342
+ // src/primitive-hooks/contentPart/useContentPartInProgressIndicator.tsx
343
+ var useContentPartInProgressIndicator = () => {
344
+ const { useMessageUtils } = useMessageContext();
345
+ const { useContentPart } = useContentPartContext();
346
+ const indicator = useCombinedStore(
347
+ [useMessageUtils, useContentPart],
348
+ (m, c) => c.status === "in_progress" ? m.inProgressIndicator : null
349
+ );
350
+ return indicator;
351
+ };
352
+
353
+ // src/primitive-hooks/contentPart/useContentPartText.tsx
354
+ var useContentPartText = () => {
355
+ const { useContentPart } = useContentPartContext();
356
+ const text = useContentPart((c) => {
357
+ if (c.part.type !== "text")
358
+ throw new Error(
359
+ "ContentPartText can only be used inside text content parts."
360
+ );
361
+ return c.part.text;
362
+ });
363
+ return text;
364
+ };
365
+
366
+ // src/primitive-hooks/message/useMessageIf.tsx
367
+ var useMessageIf = (props) => {
368
+ const { useMessage, useMessageUtils } = useMessageContext();
369
+ return useCombinedStore(
370
+ [useMessage, useMessageUtils],
371
+ ({ message, branches, isLast }, { isCopied, isHovering }) => {
372
+ if (props.hasBranches === true && branches.length < 2) return false;
373
+ if (props.user && message.role !== "user") return false;
374
+ if (props.assistant && message.role !== "assistant") return false;
375
+ if (props.lastOrHover === true && !isHovering && !isLast) return false;
376
+ if (props.copied === true && !isCopied) return false;
377
+ if (props.copied === false && isCopied) return false;
378
+ return true;
379
+ }
380
+ );
381
+ };
382
+
383
+ // src/primitive-hooks/thread/useThreadIf.tsx
384
+ var useThreadIf = (props) => {
385
+ const { useThread } = useThreadContext();
386
+ return useThread((thread) => {
387
+ if (props.empty === true && thread.messages.length !== 0) return false;
388
+ if (props.empty === false && thread.messages.length === 0) return false;
389
+ if (props.running === true && !thread.isRunning) return false;
390
+ if (props.running === false && thread.isRunning) return false;
391
+ return true;
392
+ });
393
+ };
394
+
395
+ // src/primitive-hooks/thread/useThreadEmpty.tsx
396
+ var useThreadEmpty = () => {
397
+ return useThreadIf({ empty: true });
398
+ };
399
+
400
+ // src/primitive-hooks/thread/useThreadScrollToBottom.tsx
401
+ var import_react15 = require("react");
402
+ var useThreadScrollToBottom = () => {
403
+ const { useViewport } = useThreadContext();
404
+ const isAtBottom = useViewport((s) => s.isAtBottom);
405
+ const handleScrollToBottom = (0, import_react15.useCallback)(() => {
406
+ const { scrollToBottom } = useViewport.getState();
407
+ scrollToBottom();
408
+ }, [useViewport]);
409
+ if (isAtBottom) return null;
410
+ return handleScrollToBottom;
411
+ };
412
+
413
+ // src/primitive-hooks/thread/useThreadSuggestion.tsx
414
+ var import_react16 = require("react");
415
+ var useThreadSuggestion = ({
416
+ prompt,
417
+ autoSend
418
+ }) => {
419
+ const { useThread, useComposer } = useThreadContext();
420
+ const disabled = useThread((t) => t.isRunning);
421
+ const callback = (0, import_react16.useCallback)(() => {
422
+ const thread = useThread.getState();
423
+ const composer = useComposer.getState();
424
+ composer.setValue(prompt);
425
+ if (autoSend && !thread.isRunning) {
426
+ composer.send();
427
+ }
428
+ }, [useThread, useComposer, prompt, autoSend]);
429
+ if (disabled) return null;
430
+ return callback;
431
+ };
432
+
203
433
  // src/primitives/thread/index.ts
204
434
  var thread_exports = {};
205
435
  __export(thread_exports, {
@@ -214,159 +444,181 @@ __export(thread_exports, {
214
444
 
215
445
  // src/primitives/thread/ThreadRoot.tsx
216
446
  var import_react_primitive = require("@radix-ui/react-primitive");
217
- var import_react10 = require("react");
447
+ var import_react17 = require("react");
218
448
  var import_jsx_runtime = require("react/jsx-runtime");
219
- var ThreadRoot = (0, import_react10.forwardRef)(
449
+ var ThreadRoot = (0, import_react17.forwardRef)(
220
450
  (props, ref) => {
221
451
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_primitive.Primitive.div, { ...props, ref });
222
452
  }
223
453
  );
224
454
  ThreadRoot.displayName = "ThreadRoot";
225
455
 
226
- // src/primitives/thread/ThreadIf.tsx
227
- var useThreadIf = (props) => {
228
- const { useThread } = useThreadContext();
229
- return useThread((thread) => {
230
- if (props.empty === true && thread.messages.length !== 0) return false;
231
- if (props.empty === false && thread.messages.length === 0) return false;
232
- if (props.running === true && !thread.isRunning) return false;
233
- if (props.running === false && thread.isRunning) return false;
234
- return true;
235
- });
456
+ // src/primitives/thread/ThreadEmpty.tsx
457
+ var ThreadEmpty = ({ children }) => {
458
+ const empty = useThreadEmpty();
459
+ return empty ? children : null;
236
460
  };
461
+
462
+ // src/primitives/thread/ThreadIf.tsx
237
463
  var ThreadIf = ({ children, ...query }) => {
238
464
  const result = useThreadIf(query);
239
465
  return result ? children : null;
240
466
  };
241
467
 
242
- // src/primitives/thread/ThreadEmpty.tsx
243
- var import_jsx_runtime2 = require("react/jsx-runtime");
244
- var ThreadEmpty = ({ children }) => {
245
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ThreadIf, { empty: true, children });
246
- };
247
-
248
468
  // src/primitives/thread/ThreadViewport.tsx
249
- var import_primitive = require("@radix-ui/primitive");
250
- var import_react_compose_refs = require("@radix-ui/react-compose-refs");
469
+ var import_react_compose_refs2 = require("@radix-ui/react-compose-refs");
251
470
  var import_react_primitive2 = require("@radix-ui/react-primitive");
252
- var import_react13 = require("react");
471
+ var import_react22 = require("react");
472
+
473
+ // src/primitive-hooks/thread/useThreadViewportAutoScroll.tsx
474
+ var import_react_compose_refs = require("@radix-ui/react-compose-refs");
475
+ var import_react21 = require("react");
253
476
 
254
477
  // src/utils/hooks/useOnResizeContent.tsx
255
478
  var import_react_use_callback_ref = require("@radix-ui/react-use-callback-ref");
256
- var import_react11 = require("react");
257
- var useOnResizeContent = (ref, callback) => {
479
+ var import_react19 = require("react");
480
+
481
+ // src/utils/hooks/useManagedRef.ts
482
+ var import_react18 = require("react");
483
+ var useManagedRef = (callback) => {
484
+ const cleanupRef = (0, import_react18.useRef)();
485
+ const ref = (0, import_react18.useCallback)(
486
+ (el) => {
487
+ if (cleanupRef.current) {
488
+ cleanupRef.current();
489
+ }
490
+ if (el) {
491
+ cleanupRef.current = callback(el);
492
+ }
493
+ },
494
+ [callback]
495
+ );
496
+ return ref;
497
+ };
498
+
499
+ // src/utils/hooks/useOnResizeContent.tsx
500
+ var useOnResizeContent = (callback) => {
258
501
  const callbackRef = (0, import_react_use_callback_ref.useCallbackRef)(callback);
259
- const el = ref.current;
260
- (0, import_react11.useEffect)(() => {
261
- if (!el) return;
262
- const resizeObserver = new ResizeObserver(() => {
263
- callbackRef();
264
- });
265
- const mutationObserver = new MutationObserver((mutations) => {
266
- for (const mutation of mutations) {
267
- for (const node of mutation.addedNodes) {
268
- if (node instanceof Element) {
269
- resizeObserver.observe(node);
502
+ const refCallback = (0, import_react19.useCallback)(
503
+ (el) => {
504
+ const resizeObserver = new ResizeObserver(() => {
505
+ callbackRef();
506
+ });
507
+ const mutationObserver = new MutationObserver((mutations) => {
508
+ for (const mutation of mutations) {
509
+ for (const node of mutation.addedNodes) {
510
+ if (node instanceof Element) {
511
+ resizeObserver.observe(node);
512
+ }
270
513
  }
271
- }
272
- for (const node of mutation.removedNodes) {
273
- if (node instanceof Element) {
274
- resizeObserver.unobserve(node);
514
+ for (const node of mutation.removedNodes) {
515
+ if (node instanceof Element) {
516
+ resizeObserver.unobserve(node);
517
+ }
275
518
  }
276
519
  }
520
+ callbackRef();
521
+ });
522
+ resizeObserver.observe(el);
523
+ mutationObserver.observe(el, { childList: true });
524
+ for (const child of el.children) {
525
+ resizeObserver.observe(child);
277
526
  }
278
- callbackRef();
279
- });
280
- resizeObserver.observe(el);
281
- mutationObserver.observe(el, { childList: true });
282
- for (const child of el.children) {
283
- resizeObserver.observe(child);
284
- }
285
- return () => {
286
- resizeObserver.disconnect();
287
- mutationObserver.disconnect();
288
- };
289
- }, [el, callbackRef]);
527
+ return () => {
528
+ resizeObserver.disconnect();
529
+ mutationObserver.disconnect();
530
+ };
531
+ },
532
+ [callbackRef]
533
+ );
534
+ return useManagedRef(refCallback);
290
535
  };
291
536
 
292
537
  // src/utils/hooks/useOnScrollToBottom.tsx
293
538
  var import_react_use_callback_ref2 = require("@radix-ui/react-use-callback-ref");
294
- var import_react12 = require("react");
539
+ var import_react20 = require("react");
295
540
  var useOnScrollToBottom = (callback) => {
296
541
  const callbackRef = (0, import_react_use_callback_ref2.useCallbackRef)(callback);
297
542
  const { useViewport } = useThreadContext();
298
- (0, import_react12.useEffect)(() => {
543
+ (0, import_react20.useEffect)(() => {
299
544
  return useViewport.getState().onScrollToBottom(() => {
300
545
  callbackRef();
301
546
  });
302
547
  }, [useViewport, callbackRef]);
303
548
  };
304
549
 
305
- // src/primitives/thread/ThreadViewport.tsx
306
- var import_jsx_runtime3 = require("react/jsx-runtime");
307
- var ThreadViewport = (0, import_react13.forwardRef)(({ autoScroll = true, onScroll, children, ...rest }, forwardedRef) => {
308
- const messagesEndRef = (0, import_react13.useRef)(null);
309
- const divRef = (0, import_react13.useRef)(null);
310
- const ref = (0, import_react_compose_refs.useComposedRefs)(forwardedRef, divRef);
550
+ // src/primitive-hooks/thread/useThreadViewportAutoScroll.tsx
551
+ var useThreadViewportAutoScroll = ({
552
+ autoScroll = true
553
+ }) => {
554
+ const divRef = (0, import_react21.useRef)(null);
311
555
  const { useViewport } = useThreadContext();
312
- const firstRenderRef = (0, import_react13.useRef)(true);
313
- const isScrollingToBottomRef = (0, import_react13.useRef)(false);
314
- const lastScrollTop = (0, import_react13.useRef)(0);
556
+ const firstRenderRef = (0, import_react21.useRef)(true);
557
+ const lastScrollTop = (0, import_react21.useRef)(0);
558
+ const isScrollingToBottomRef = (0, import_react21.useRef)(false);
315
559
  const scrollToBottom = () => {
316
- const div = messagesEndRef.current;
560
+ const div = divRef.current;
317
561
  if (!div || !autoScroll) return;
318
562
  const behavior = firstRenderRef.current ? "instant" : "auto";
319
563
  firstRenderRef.current = false;
320
564
  isScrollingToBottomRef.current = true;
321
- div.scrollIntoView({ behavior });
565
+ div.scrollTo({ top: div.scrollHeight, behavior });
322
566
  };
323
- useOnResizeContent(divRef, () => {
324
- if (!isScrollingToBottomRef.current && !useViewport.getState().isAtBottom) {
325
- handleScroll();
326
- } else {
327
- scrollToBottom();
328
- }
329
- });
330
- useOnScrollToBottom(() => {
331
- scrollToBottom();
332
- });
333
567
  const handleScroll = () => {
334
568
  const div = divRef.current;
335
569
  if (!div) return;
336
570
  const isAtBottom = useViewport.getState().isAtBottom;
337
571
  const newIsAtBottom = div.scrollHeight - div.scrollTop <= div.clientHeight;
338
572
  if (!newIsAtBottom && lastScrollTop.current < div.scrollTop) {
339
- } else if (newIsAtBottom !== isAtBottom) {
340
- isScrollingToBottomRef.current = false;
341
- useViewport.setState({
342
- isAtBottom: newIsAtBottom
343
- });
573
+ } else {
574
+ isScrollingToBottomRef.current = newIsAtBottom;
575
+ if (newIsAtBottom !== isAtBottom) {
576
+ useViewport.setState({
577
+ isAtBottom: newIsAtBottom
578
+ });
579
+ }
344
580
  }
345
581
  lastScrollTop.current = div.scrollTop;
346
582
  };
347
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
348
- import_react_primitive2.Primitive.div,
349
- {
350
- ...rest,
351
- onScroll: (0, import_primitive.composeEventHandlers)(onScroll, handleScroll),
352
- ref,
353
- children: [
354
- children,
355
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { ref: messagesEndRef })
356
- ]
583
+ const resizeRef = useOnResizeContent(() => {
584
+ if (!isScrollingToBottomRef.current && !useViewport.getState().isAtBottom && !firstRenderRef.current) {
585
+ handleScroll();
586
+ } else {
587
+ scrollToBottom();
357
588
  }
358
- );
589
+ });
590
+ const scrollRef = useManagedRef((el) => {
591
+ el.addEventListener("scroll", handleScroll);
592
+ return () => {
593
+ el.removeEventListener("scroll", handleScroll);
594
+ };
595
+ });
596
+ const autoScrollRef = (0, import_react_compose_refs.useComposedRefs)(resizeRef, scrollRef, divRef);
597
+ useOnScrollToBottom(() => {
598
+ scrollToBottom();
599
+ });
600
+ return autoScrollRef;
601
+ };
602
+
603
+ // src/primitives/thread/ThreadViewport.tsx
604
+ var import_jsx_runtime2 = require("react/jsx-runtime");
605
+ var ThreadViewport = (0, import_react22.forwardRef)(({ autoScroll, onScroll, children, ...rest }, forwardedRef) => {
606
+ const autoScrollRef = useThreadViewportAutoScroll({
607
+ autoScroll
608
+ });
609
+ const ref = (0, import_react_compose_refs2.useComposedRefs)(forwardedRef, autoScrollRef);
610
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_primitive2.Primitive.div, { ...rest, ref, children });
359
611
  });
360
612
  ThreadViewport.displayName = "ThreadViewport";
361
613
 
362
614
  // src/primitives/thread/ThreadMessages.tsx
363
- var import_react16 = require("react");
615
+ var import_react24 = require("react");
364
616
 
365
617
  // src/context/providers/MessageProvider.tsx
366
- var import_react14 = require("react");
618
+ var import_react23 = require("react");
367
619
  var import_zustand3 = require("zustand");
368
620
 
369
- // src/context/stores/MessageComposer.ts
621
+ // src/context/stores/EditComposer.ts
370
622
  var import_zustand = require("zustand");
371
623
 
372
624
  // src/context/stores/BaseComposer.ts
@@ -377,7 +629,7 @@ var makeBaseComposer = (set) => ({
377
629
  }
378
630
  });
379
631
 
380
- // src/context/stores/MessageComposer.ts
632
+ // src/context/stores/EditComposer.ts
381
633
  var makeEditComposerStore = ({
382
634
  onEdit,
383
635
  onSend
@@ -418,7 +670,7 @@ var makeMessageUtilsStore = () => (0, import_zustand2.create)((set) => ({
418
670
  }));
419
671
 
420
672
  // src/context/providers/MessageProvider.tsx
421
- var import_jsx_runtime4 = require("react/jsx-runtime");
673
+ var import_jsx_runtime3 = require("react/jsx-runtime");
422
674
  var getIsLast = (thread, message) => {
423
675
  return thread.messages[thread.messages.length - 1]?.id === message.id;
424
676
  };
@@ -440,10 +692,10 @@ var syncMessage = (thread, getBranches, useMessage, messageIndex) => {
440
692
  };
441
693
  var useMessageContext2 = (messageIndex) => {
442
694
  const { useThread, useThreadActions } = useThreadContext();
443
- const [context] = (0, import_react14.useState)(() => {
695
+ const [context] = (0, import_react23.useState)(() => {
444
696
  const useMessage = (0, import_zustand3.create)(() => ({}));
445
697
  const useMessageUtils = makeMessageUtilsStore();
446
- const useComposer = makeEditComposerStore({
698
+ const useEditComposer = makeEditComposerStore({
447
699
  onEdit: () => {
448
700
  const message = useMessage.getState().message;
449
701
  if (message.role !== "user")
@@ -464,6 +716,7 @@ var useMessageContext2 = (messageIndex) => {
464
716
  );
465
717
  useThreadActions.getState().append({
466
718
  parentId,
719
+ role: "user",
467
720
  content: [{ type: "text", text }, ...nonTextParts]
468
721
  });
469
722
  }
@@ -474,9 +727,9 @@ var useMessageContext2 = (messageIndex) => {
474
727
  useMessage,
475
728
  messageIndex
476
729
  );
477
- return { useMessage, useMessageUtils, useComposer };
730
+ return { useMessage, useMessageUtils, useEditComposer };
478
731
  });
479
- (0, import_react14.useEffect)(() => {
732
+ (0, import_react23.useEffect)(() => {
480
733
  return useThread.subscribe((thread) => {
481
734
  syncMessage(
482
735
  thread,
@@ -485,68 +738,31 @@ var useMessageContext2 = (messageIndex) => {
485
738
  messageIndex
486
739
  );
487
740
  });
488
- }, [useThread, useThreadActions, context, messageIndex]);
489
- return context;
490
- };
491
- var MessageProvider = ({
492
- messageIndex,
493
- children
494
- }) => {
495
- const context = useMessageContext2(messageIndex);
496
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(MessageContext.Provider, { value: context, children });
497
- };
498
-
499
- // src/context/ComposerContext.ts
500
- var import_react15 = require("react");
501
- var useComposerContext = () => {
502
- const { useComposer } = useThreadContext();
503
- const { useComposer: useEditComposer } = (0, import_react15.useContext)(MessageContext) ?? {};
504
- return (0, import_react15.useMemo)(
505
- () => ({
506
- useComposer: useEditComposer ?? useComposer,
507
- type: useEditComposer ? "edit" : "new"
508
- }),
509
- [useEditComposer, useComposer]
510
- );
741
+ }, [useThread, useThreadActions, context, messageIndex]);
742
+ return context;
743
+ };
744
+ var MessageProvider = ({
745
+ messageIndex,
746
+ children
747
+ }) => {
748
+ const context = useMessageContext2(messageIndex);
749
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(MessageContext.Provider, { value: context, children });
511
750
  };
512
751
 
513
752
  // src/primitives/composer/ComposerIf.tsx
514
- var useComposerIf = (props) => {
515
- const { useComposer } = useComposerContext();
516
- return useComposer((composer) => {
517
- if (props.editing === true && !composer.isEditing) return false;
518
- if (props.editing === false && composer.isEditing) return false;
519
- return true;
520
- });
521
- };
522
753
  var ComposerIf = ({ children, ...query }) => {
523
754
  const result = useComposerIf(query);
524
755
  return result ? children : null;
525
756
  };
526
757
 
527
758
  // src/primitives/message/MessageIf.tsx
528
- var useMessageIf = (props) => {
529
- const { useMessage, useMessageUtils } = useMessageContext();
530
- return useCombinedStore(
531
- [useMessage, useMessageUtils],
532
- ({ message, branches, isLast }, { isCopied, isHovering }) => {
533
- if (props.hasBranches === true && branches.length < 2) return false;
534
- if (props.user && message.role !== "user") return false;
535
- if (props.assistant && message.role !== "assistant") return false;
536
- if (props.lastOrHover === true && !isHovering && !isLast) return false;
537
- if (props.copied === true && !isCopied) return false;
538
- if (props.copied === false && isCopied) return false;
539
- return true;
540
- }
541
- );
542
- };
543
759
  var MessageIf = ({ children, ...query }) => {
544
760
  const result = useMessageIf(query);
545
761
  return result ? children : null;
546
762
  };
547
763
 
548
764
  // src/primitives/thread/ThreadMessages.tsx
549
- var import_jsx_runtime5 = require("react/jsx-runtime");
765
+ var import_jsx_runtime4 = require("react/jsx-runtime");
550
766
  var getComponents = (components) => {
551
767
  return {
552
768
  EditComposer: components.EditComposer ?? components.UserMessage ?? components.Message,
@@ -559,15 +775,15 @@ var ThreadMessageImpl = ({
559
775
  components
560
776
  }) => {
561
777
  const { UserMessage, EditComposer, AssistantMessage } = getComponents(components);
562
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(MessageProvider, { messageIndex, children: [
563
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(MessageIf, { user: true, children: [
564
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ComposerIf, { editing: false, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(UserMessage, {}) }),
565
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ComposerIf, { editing: true, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(EditComposer, {}) })
778
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(MessageProvider, { messageIndex, children: [
779
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(MessageIf, { user: true, children: [
780
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ComposerIf, { editing: false, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(UserMessage, {}) }),
781
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ComposerIf, { editing: true, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(EditComposer, {}) })
566
782
  ] }),
567
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MessageIf, { assistant: true, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(AssistantMessage, {}) })
783
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(MessageIf, { assistant: true, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(AssistantMessage, {}) })
568
784
  ] });
569
785
  };
570
- var ThreadMessage = (0, import_react16.memo)(
786
+ var ThreadMessage = (0, import_react24.memo)(
571
787
  ThreadMessageImpl,
572
788
  (prev, next) => prev.messageIndex === next.messageIndex && prev.components.UserMessage === next.components.UserMessage && prev.components.EditComposer === next.components.EditComposer && prev.components.AssistantMessage === next.components.AssistantMessage
573
789
  );
@@ -577,7 +793,7 @@ var ThreadMessages = ({ components }) => {
577
793
  if (messagesLength === 0) return null;
578
794
  return new Array(messagesLength).fill(null).map((_, idx) => {
579
795
  const messageIndex = idx;
580
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
796
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
581
797
  ThreadMessage,
582
798
  {
583
799
  messageIndex,
@@ -588,56 +804,42 @@ var ThreadMessages = ({ components }) => {
588
804
  });
589
805
  };
590
806
 
591
- // src/primitives/thread/ThreadScrollToBottom.tsx
592
- var import_primitive2 = require("@radix-ui/primitive");
807
+ // src/utils/createActionButton.tsx
808
+ var import_primitive = require("@radix-ui/primitive");
593
809
  var import_react_primitive3 = require("@radix-ui/react-primitive");
594
- var import_react17 = require("react");
595
- var import_jsx_runtime6 = require("react/jsx-runtime");
596
- var ThreadScrollToBottom = (0, import_react17.forwardRef)(({ onClick, ...rest }, ref) => {
597
- const { useViewport } = useThreadContext();
598
- const isAtBottom = useViewport((s) => s.isAtBottom);
599
- const handleScrollToBottom = () => {
600
- useViewport.getState().scrollToBottom();
601
- };
602
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
603
- import_react_primitive3.Primitive.button,
604
- {
605
- ...rest,
606
- disabled: isAtBottom,
607
- ref,
608
- onClick: (0, import_primitive2.composeEventHandlers)(onClick, handleScrollToBottom)
609
- }
610
- );
611
- });
612
- ThreadScrollToBottom.displayName = "ThreadScrollToBottom";
810
+ var import_react25 = require("react");
811
+ var import_jsx_runtime5 = require("react/jsx-runtime");
812
+ var createActionButton = (displayName, useActionButton) => {
813
+ const ActionButton = (0, import_react25.forwardRef)((props, forwardedRef) => {
814
+ const callback = useActionButton(props);
815
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
816
+ import_react_primitive3.Primitive.button,
817
+ {
818
+ type: "button",
819
+ disabled: !callback,
820
+ ...props,
821
+ ref: forwardedRef,
822
+ onClick: (0, import_primitive.composeEventHandlers)(props.onClick, () => {
823
+ callback?.();
824
+ })
825
+ }
826
+ );
827
+ });
828
+ ActionButton.displayName = displayName;
829
+ return ActionButton;
830
+ };
831
+
832
+ // src/primitives/thread/ThreadScrollToBottom.tsx
833
+ var ThreadScrollToBottom = createActionButton(
834
+ "ThreadScrollToBottom",
835
+ useThreadScrollToBottom
836
+ );
613
837
 
614
838
  // src/primitives/thread/ThreadSuggestion.tsx
615
- var import_primitive3 = require("@radix-ui/primitive");
616
- var import_react_primitive4 = require("@radix-ui/react-primitive");
617
- var import_react18 = require("react");
618
- var import_jsx_runtime7 = require("react/jsx-runtime");
619
- var ThreadSuggestion = (0, import_react18.forwardRef)(({ onClick, prompt, method, autoSend: send, ...rest }, ref) => {
620
- const { useThread, useComposer } = useThreadContext();
621
- const isDisabled = useThread((t) => t.isRunning);
622
- const handleApplySuggestion = () => {
623
- const thread = useThread.getState();
624
- const composer = useComposer.getState();
625
- composer.setValue(prompt);
626
- if (send && !thread.isRunning) {
627
- composer.send();
628
- }
629
- };
630
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
631
- import_react_primitive4.Primitive.button,
632
- {
633
- ...rest,
634
- disabled: isDisabled,
635
- ref,
636
- onClick: (0, import_primitive3.composeEventHandlers)(onClick, handleApplySuggestion)
637
- }
638
- );
639
- });
640
- ThreadSuggestion.displayName = "ThreadSuggestion";
839
+ var ThreadSuggestion = createActionButton(
840
+ "ThreadSuggestion",
841
+ useThreadSuggestion
842
+ );
641
843
 
642
844
  // src/primitives/composer/index.ts
643
845
  var composer_exports = {};
@@ -650,30 +852,24 @@ __export(composer_exports, {
650
852
  });
651
853
 
652
854
  // src/primitives/composer/ComposerRoot.tsx
653
- var import_primitive4 = require("@radix-ui/primitive");
654
- var import_react_compose_refs2 = require("@radix-ui/react-compose-refs");
655
- var import_react_primitive5 = require("@radix-ui/react-primitive");
656
- var import_react19 = require("react");
657
- var import_jsx_runtime8 = require("react/jsx-runtime");
658
- var ComposerRoot = (0, import_react19.forwardRef)(
855
+ var import_primitive2 = require("@radix-ui/primitive");
856
+ var import_react_primitive4 = require("@radix-ui/react-primitive");
857
+ var import_react26 = require("react");
858
+ var import_jsx_runtime6 = require("react/jsx-runtime");
859
+ var ComposerRoot = (0, import_react26.forwardRef)(
659
860
  ({ onSubmit, ...rest }, forwardedRef) => {
660
- const { useViewport } = useThreadContext();
661
- const { useComposer } = useComposerContext();
662
- const formRef = (0, import_react19.useRef)(null);
663
- const ref = (0, import_react_compose_refs2.useComposedRefs)(forwardedRef, formRef);
861
+ const send = useComposerSend();
664
862
  const handleSubmit = (e) => {
665
- const composerState = useComposer.getState();
666
- if (!composerState.isEditing) return;
863
+ if (!send) return;
667
864
  e.preventDefault();
668
- composerState.send();
669
- useViewport.getState().scrollToBottom();
865
+ send();
670
866
  };
671
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
672
- import_react_primitive5.Primitive.form,
867
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
868
+ import_react_primitive4.Primitive.form,
673
869
  {
674
870
  ...rest,
675
- ref,
676
- onSubmit: (0, import_primitive4.composeEventHandlers)(onSubmit, handleSubmit)
871
+ ref: forwardedRef,
872
+ onSubmit: (0, import_primitive2.composeEventHandlers)(onSubmit, handleSubmit)
677
873
  }
678
874
  );
679
875
  }
@@ -681,13 +877,14 @@ var ComposerRoot = (0, import_react19.forwardRef)(
681
877
  ComposerRoot.displayName = "ComposerRoot";
682
878
 
683
879
  // src/primitives/composer/ComposerInput.tsx
684
- var import_primitive5 = require("@radix-ui/primitive");
880
+ var import_primitive3 = require("@radix-ui/primitive");
685
881
  var import_react_compose_refs3 = require("@radix-ui/react-compose-refs");
686
882
  var import_react_slot = require("@radix-ui/react-slot");
687
- var import_react20 = require("react");
883
+ var import_react27 = require("react");
688
884
  var import_react_textarea_autosize = __toESM(require("react-textarea-autosize"));
689
- var import_jsx_runtime9 = require("react/jsx-runtime");
690
- var ComposerInput = (0, import_react20.forwardRef)(
885
+ var import_react_use_escape_keydown = require("@radix-ui/react-use-escape-keydown");
886
+ var import_jsx_runtime7 = require("react/jsx-runtime");
887
+ var ComposerInput = (0, import_react27.forwardRef)(
691
888
  ({ autoFocus = false, asChild, disabled, onChange, onKeyDown, ...rest }, forwardedRef) => {
692
889
  const { useThread } = useThreadContext();
693
890
  const { useComposer, type } = useComposerContext();
@@ -696,16 +893,17 @@ var ComposerInput = (0, import_react20.forwardRef)(
696
893
  return c.value;
697
894
  });
698
895
  const Component = asChild ? import_react_slot.Slot : import_react_textarea_autosize.default;
699
- const textareaRef = (0, import_react20.useRef)(null);
896
+ const textareaRef = (0, import_react27.useRef)(null);
700
897
  const ref = (0, import_react_compose_refs3.useComposedRefs)(forwardedRef, textareaRef);
898
+ (0, import_react_use_escape_keydown.useEscapeKeydown)((e) => {
899
+ const composer = useComposer.getState();
900
+ if (composer.cancel()) {
901
+ e.preventDefault();
902
+ }
903
+ });
701
904
  const handleKeyPress = (e) => {
702
905
  if (disabled) return;
703
- if (e.key === "Escape") {
704
- const composer = useComposer.getState();
705
- if (composer.cancel()) {
706
- e.preventDefault();
707
- }
708
- } else if (e.key === "Enter" && e.shiftKey === false) {
906
+ if (e.key === "Enter" && e.shiftKey === false) {
709
907
  const isRunning = useThread.getState().isRunning;
710
908
  if (!isRunning) {
711
909
  e.preventDefault();
@@ -714,23 +912,22 @@ var ComposerInput = (0, import_react20.forwardRef)(
714
912
  }
715
913
  };
716
914
  const autoFocusEnabled = autoFocus && !disabled;
717
- const focus = (0, import_react20.useCallback)(() => {
915
+ const focus = (0, import_react27.useCallback)(() => {
718
916
  const textarea = textareaRef.current;
719
917
  if (!textarea || !autoFocusEnabled) return;
720
- console.log("focus");
721
918
  textarea.focus();
722
919
  textarea.setSelectionRange(
723
920
  textareaRef.current.value.length,
724
921
  textareaRef.current.value.length
725
922
  );
726
923
  }, [autoFocusEnabled]);
727
- (0, import_react20.useEffect)(() => focus(), [focus]);
924
+ (0, import_react27.useEffect)(() => focus(), [focus]);
728
925
  useOnScrollToBottom(() => {
729
926
  if (type === "new") {
730
927
  focus();
731
928
  }
732
929
  });
733
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
930
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
734
931
  Component,
735
932
  {
736
933
  value,
@@ -738,12 +935,12 @@ var ComposerInput = (0, import_react20.forwardRef)(
738
935
  ref,
739
936
  autoFocus,
740
937
  disabled,
741
- onChange: (0, import_primitive5.composeEventHandlers)(onChange, (e) => {
938
+ onChange: (0, import_primitive3.composeEventHandlers)(onChange, (e) => {
742
939
  const composerState = useComposer.getState();
743
940
  if (!composerState.isEditing) return;
744
941
  return composerState.setValue(e.target.value);
745
942
  }),
746
- onKeyDown: (0, import_primitive5.composeEventHandlers)(onKeyDown, handleKeyPress)
943
+ onKeyDown: (0, import_primitive3.composeEventHandlers)(onKeyDown, handleKeyPress)
747
944
  }
748
945
  );
749
946
  }
@@ -751,15 +948,15 @@ var ComposerInput = (0, import_react20.forwardRef)(
751
948
  ComposerInput.displayName = "ComposerInput";
752
949
 
753
950
  // src/primitives/composer/ComposerSend.tsx
754
- var import_react_primitive6 = require("@radix-ui/react-primitive");
755
- var import_react21 = require("react");
756
- var import_jsx_runtime10 = require("react/jsx-runtime");
757
- var ComposerSend = (0, import_react21.forwardRef)(
951
+ var import_react28 = require("react");
952
+ var import_react_primitive5 = require("@radix-ui/react-primitive");
953
+ var import_jsx_runtime8 = require("react/jsx-runtime");
954
+ var ComposerSend = (0, import_react28.forwardRef)(
758
955
  ({ disabled, ...rest }, ref) => {
759
956
  const { useComposer } = useComposerContext();
760
957
  const hasValue = useComposer((c) => c.isEditing && c.value.length > 0);
761
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
762
- import_react_primitive6.Primitive.button,
958
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
959
+ import_react_primitive5.Primitive.button,
763
960
  {
764
961
  type: "submit",
765
962
  ...rest,
@@ -772,26 +969,10 @@ var ComposerSend = (0, import_react21.forwardRef)(
772
969
  ComposerSend.displayName = "ComposerSend";
773
970
 
774
971
  // src/primitives/composer/ComposerCancel.tsx
775
- var import_primitive6 = require("@radix-ui/primitive");
776
- var import_react_primitive7 = require("@radix-ui/react-primitive");
777
- var import_react22 = require("react");
778
- var import_jsx_runtime11 = require("react/jsx-runtime");
779
- var ComposerCancel = (0, import_react22.forwardRef)(({ onClick, ...rest }, ref) => {
780
- const { useComposer } = useComposerContext();
781
- const handleCancel = () => {
782
- useComposer.getState().cancel();
783
- };
784
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
785
- import_react_primitive7.Primitive.button,
786
- {
787
- type: "button",
788
- ...rest,
789
- ref,
790
- onClick: (0, import_primitive6.composeEventHandlers)(onClick, handleCancel)
791
- }
792
- );
793
- });
794
- ComposerCancel.displayName = "ComposerCancel";
972
+ var ComposerCancel = createActionButton(
973
+ "ComposerCancel",
974
+ useComposerCancel
975
+ );
795
976
 
796
977
  // src/primitives/message/index.ts
797
978
  var message_exports = {};
@@ -803,11 +984,11 @@ __export(message_exports, {
803
984
  });
804
985
 
805
986
  // src/primitives/message/MessageRoot.tsx
806
- var import_primitive7 = require("@radix-ui/primitive");
807
- var import_react_primitive8 = require("@radix-ui/react-primitive");
808
- var import_react23 = require("react");
809
- var import_jsx_runtime12 = require("react/jsx-runtime");
810
- var MessageRoot = (0, import_react23.forwardRef)(
987
+ var import_primitive4 = require("@radix-ui/primitive");
988
+ var import_react_primitive6 = require("@radix-ui/react-primitive");
989
+ var import_react29 = require("react");
990
+ var import_jsx_runtime9 = require("react/jsx-runtime");
991
+ var MessageRoot = (0, import_react29.forwardRef)(
811
992
  ({ onMouseEnter, onMouseLeave, ...rest }, ref) => {
812
993
  const { useMessageUtils } = useMessageContext();
813
994
  const setIsHovering = useMessageUtils((s) => s.setIsHovering);
@@ -817,13 +998,13 @@ var MessageRoot = (0, import_react23.forwardRef)(
817
998
  const handleMouseLeave = () => {
818
999
  setIsHovering(false);
819
1000
  };
820
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
821
- import_react_primitive8.Primitive.div,
1001
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1002
+ import_react_primitive6.Primitive.div,
822
1003
  {
823
1004
  ...rest,
824
1005
  ref,
825
- onMouseEnter: (0, import_primitive7.composeEventHandlers)(onMouseEnter, handleMouseEnter),
826
- onMouseLeave: (0, import_primitive7.composeEventHandlers)(onMouseLeave, handleMouseLeave)
1006
+ onMouseEnter: (0, import_primitive4.composeEventHandlers)(onMouseEnter, handleMouseEnter),
1007
+ onMouseLeave: (0, import_primitive4.composeEventHandlers)(onMouseLeave, handleMouseLeave)
827
1008
  }
828
1009
  );
829
1010
  }
@@ -831,40 +1012,12 @@ var MessageRoot = (0, import_react23.forwardRef)(
831
1012
  MessageRoot.displayName = "MessageRoot";
832
1013
 
833
1014
  // src/primitives/message/MessageContent.tsx
834
- var import_react28 = require("react");
835
-
836
- // src/context/AssistantContext.ts
837
- var import_react24 = require("react");
838
- var AssistantContext = (0, import_react24.createContext)(
839
- null
840
- );
841
- var useAssistantContext = () => {
842
- const context = (0, import_react24.useContext)(AssistantContext);
843
- if (!context)
844
- throw new Error(
845
- "This component must be used within an AssistantRuntimeProvider."
846
- );
847
- return context;
848
- };
849
-
850
- // src/context/ContentPartContext.ts
851
- var import_react25 = require("react");
852
- var ContentPartContext = (0, import_react25.createContext)(
853
- null
854
- );
855
- var useContentPartContext = () => {
856
- const context = (0, import_react25.useContext)(ContentPartContext);
857
- if (!context)
858
- throw new Error(
859
- "This component can only be used inside a component passed to <MessagePrimitive.Content components={...} >."
860
- );
861
- return context;
862
- };
1015
+ var import_react32 = require("react");
863
1016
 
864
1017
  // src/context/providers/ContentPartProvider.tsx
865
- var import_react26 = require("react");
1018
+ var import_react30 = require("react");
866
1019
  var import_zustand4 = require("zustand");
867
- var import_jsx_runtime13 = require("react/jsx-runtime");
1020
+ var import_jsx_runtime10 = require("react/jsx-runtime");
868
1021
  var syncContentPart = ({ message }, useContentPart, partIndex) => {
869
1022
  const part = message.content[partIndex];
870
1023
  if (!part) return;
@@ -881,14 +1034,14 @@ var syncContentPart = ({ message }, useContentPart, partIndex) => {
881
1034
  };
882
1035
  var useContentPartContext2 = (partIndex) => {
883
1036
  const { useMessage } = useMessageContext();
884
- const [context] = (0, import_react26.useState)(() => {
1037
+ const [context] = (0, import_react30.useState)(() => {
885
1038
  const useContentPart = (0, import_zustand4.create)(
886
1039
  () => ({})
887
1040
  );
888
1041
  syncContentPart(useMessage.getState(), useContentPart, partIndex);
889
1042
  return { useContentPart };
890
1043
  });
891
- (0, import_react26.useEffect)(() => {
1044
+ (0, import_react30.useEffect)(() => {
892
1045
  syncContentPart(useMessage.getState(), context.useContentPart, partIndex);
893
1046
  return useMessage.subscribe((message) => {
894
1047
  syncContentPart(message, context.useContentPart, partIndex);
@@ -901,65 +1054,46 @@ var ContentPartProvider = ({
901
1054
  children
902
1055
  }) => {
903
1056
  const context = useContentPartContext2(partIndex);
904
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ContentPartContext.Provider, { value: context, children });
1057
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ContentPartContext.Provider, { value: context, children });
905
1058
  };
906
1059
 
907
1060
  // src/primitives/contentPart/ContentPartDisplay.tsx
908
1061
  var ContentPartDisplay = () => {
909
- const { useContentPart } = useContentPartContext();
910
- const display = useContentPart((c) => {
911
- if (c.part.type !== "ui")
912
- throw new Error(
913
- "ContentPartDisplay can only be used inside ui content parts."
914
- );
915
- return c.part.display;
916
- });
1062
+ const display = useContentPartDisplay();
917
1063
  return display ?? null;
918
1064
  };
919
1065
 
920
1066
  // src/primitives/contentPart/ContentPartInProgressIndicator.tsx
921
1067
  var ContentPartInProgressIndicator = () => {
922
- const { useMessageUtils } = useMessageContext();
923
- const { useContentPart } = useContentPartContext();
924
- const indicator = useCombinedStore(
925
- [useMessageUtils, useContentPart],
926
- (m, c) => c.status === "in_progress" ? m.inProgressIndicator : null
927
- );
1068
+ const indicator = useContentPartInProgressIndicator();
928
1069
  return indicator;
929
1070
  };
930
1071
 
931
1072
  // src/primitives/contentPart/ContentPartText.tsx
932
- var import_react_primitive9 = require("@radix-ui/react-primitive");
933
- var import_react27 = require("react");
934
- var import_jsx_runtime14 = require("react/jsx-runtime");
935
- var ContentPartText = (0, import_react27.forwardRef)((props, forwardedRef) => {
936
- const { useContentPart } = useContentPartContext();
937
- const text = useContentPart((c) => {
938
- if (c.part.type !== "text")
939
- throw new Error(
940
- "ContentPartText can only be used inside text content parts."
941
- );
942
- return c.part.text;
943
- });
944
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_primitive9.Primitive.span, { ...props, ref: forwardedRef, children: text });
1073
+ var import_react_primitive7 = require("@radix-ui/react-primitive");
1074
+ var import_react31 = require("react");
1075
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1076
+ var ContentPartText = (0, import_react31.forwardRef)((props, forwardedRef) => {
1077
+ const text = useContentPartText();
1078
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_primitive7.Primitive.span, { ...props, ref: forwardedRef, children: text });
945
1079
  });
946
1080
  ContentPartText.displayName = "ContentPartText";
947
1081
 
948
1082
  // src/primitives/message/MessageContent.tsx
949
- var import_jsx_runtime15 = require("react/jsx-runtime");
1083
+ var import_jsx_runtime12 = require("react/jsx-runtime");
950
1084
  var defaultComponents = {
951
- Text: () => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
952
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ContentPartText, {}),
953
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ContentPartInProgressIndicator, {})
1085
+ Text: () => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
1086
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ContentPartText, {}),
1087
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ContentPartInProgressIndicator, {})
954
1088
  ] }),
955
1089
  Image: () => null,
956
- UI: () => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ContentPartDisplay, {}),
1090
+ UI: () => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ContentPartDisplay, {}),
957
1091
  tools: {
958
1092
  Fallback: (props) => {
959
1093
  const { useToolUIs } = useAssistantContext();
960
1094
  const Render = useToolUIs((s) => s.getToolUI(props.part.toolName));
961
1095
  if (!Render) return null;
962
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Render, { ...props });
1096
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Render, { ...props });
963
1097
  }
964
1098
  }
965
1099
  };
@@ -978,15 +1112,15 @@ var MessageContentPartComponent = ({
978
1112
  const type = part.type;
979
1113
  switch (type) {
980
1114
  case "text":
981
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Text, { part, status });
1115
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Text, { part, status });
982
1116
  case "image":
983
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Image, { part, status });
1117
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Image, { part, status });
984
1118
  case "ui":
985
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(UI, { part, status });
1119
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(UI, { part, status });
986
1120
  case "tool-call": {
987
1121
  const Tool = by_name[part.toolName] || Fallback;
988
1122
  const addResult = (result) => addToolResult(part.toolCallId, result);
989
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Tool, { part, status, addResult });
1123
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Tool, { part, status, addResult });
990
1124
  }
991
1125
  default:
992
1126
  throw new Error(`Unknown content part type: ${type}`);
@@ -996,9 +1130,9 @@ var MessageContentPartImpl = ({
996
1130
  partIndex,
997
1131
  components
998
1132
  }) => {
999
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ContentPartProvider, { partIndex, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(MessageContentPartComponent, { components }) });
1133
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ContentPartProvider, { partIndex, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(MessageContentPartComponent, { components }) });
1000
1134
  };
1001
- var MessageContentPart = (0, import_react28.memo)(
1135
+ var MessageContentPart = (0, import_react32.memo)(
1002
1136
  MessageContentPartImpl,
1003
1137
  (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
1004
1138
  );
@@ -1007,7 +1141,7 @@ var MessageContent = ({ components }) => {
1007
1141
  const contentLength = useMessage((s) => s.message.content.length);
1008
1142
  return new Array(contentLength).fill(null).map((_, idx) => {
1009
1143
  const partIndex = idx;
1010
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1144
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1011
1145
  MessageContentPart,
1012
1146
  {
1013
1147
  partIndex,
@@ -1019,13 +1153,13 @@ var MessageContent = ({ components }) => {
1019
1153
  };
1020
1154
 
1021
1155
  // src/primitives/message/MessageInProgress.tsx
1022
- var import_react_primitive10 = require("@radix-ui/react-primitive");
1023
- var import_react29 = require("react");
1024
- var import_jsx_runtime16 = require("react/jsx-runtime");
1025
- var MessageInProgress = (0, import_react29.forwardRef)((props, ref) => {
1156
+ var import_react_primitive8 = require("@radix-ui/react-primitive");
1157
+ var import_react33 = require("react");
1158
+ var import_jsx_runtime13 = require("react/jsx-runtime");
1159
+ var MessageInProgress = (0, import_react33.forwardRef)((props, ref) => {
1026
1160
  const { useMessageUtils } = useMessageContext();
1027
- (0, import_react29.useMemo)(() => {
1028
- useMessageUtils.getState().setInProgressIndicator(/* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_primitive10.Primitive.span, { ...props, ref }));
1161
+ (0, import_react33.useMemo)(() => {
1162
+ useMessageUtils.getState().setInProgressIndicator(/* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_primitive8.Primitive.span, { ...props, ref }));
1029
1163
  }, [useMessageUtils, props, ref]);
1030
1164
  return null;
1031
1165
  });
@@ -1041,57 +1175,38 @@ __export(branchPicker_exports, {
1041
1175
  Root: () => BranchPickerRoot
1042
1176
  });
1043
1177
 
1044
- // src/utils/createActionButton.tsx
1045
- var import_primitive8 = require("@radix-ui/primitive");
1046
- var import_react_primitive11 = require("@radix-ui/react-primitive");
1047
- var import_react30 = require("react");
1048
- var import_jsx_runtime17 = require("react/jsx-runtime");
1049
- var createActionButton = (useActionButton) => {
1050
- const ActionButton = (0, import_react30.forwardRef)((props, forwardedRef) => {
1051
- const onClick = useActionButton(props);
1052
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1053
- import_react_primitive11.Primitive.button,
1054
- {
1055
- type: "button",
1056
- disabled: !onClick,
1057
- ...props,
1058
- ref: forwardedRef,
1059
- onClick: (0, import_primitive8.composeEventHandlers)(props.onClick, onClick ?? void 0)
1060
- }
1061
- );
1062
- });
1063
- ActionButton.displayName = "ActionButton";
1064
- return ActionButton;
1065
- };
1066
-
1067
1178
  // src/primitives/branchPicker/BranchPickerNext.tsx
1068
- var BranchPickerNext = createActionButton(useGoToNextBranch);
1179
+ var BranchPickerNext = createActionButton(
1180
+ "BranchPickerNext",
1181
+ useBranchPickerNext
1182
+ );
1069
1183
 
1070
1184
  // src/primitives/branchPicker/BranchPickerPrevious.tsx
1071
- var BranchPickerPrevious = createActionButton(useGoToPreviousBranch);
1185
+ var BranchPickerPrevious = createActionButton(
1186
+ "BranchPickerPrevious",
1187
+ useBranchPickerPrevious
1188
+ );
1072
1189
 
1073
1190
  // src/primitives/branchPicker/BranchPickerCount.tsx
1074
- var import_jsx_runtime18 = require("react/jsx-runtime");
1191
+ var import_jsx_runtime14 = require("react/jsx-runtime");
1075
1192
  var BranchPickerCount = () => {
1076
- const { useMessage } = useMessageContext();
1077
- const branchCount = useMessage((s) => s.branches.length);
1078
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_jsx_runtime18.Fragment, { children: branchCount });
1193
+ const branchCount = useBranchPickerCount();
1194
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_jsx_runtime14.Fragment, { children: branchCount });
1079
1195
  };
1080
1196
 
1081
1197
  // src/primitives/branchPicker/BranchPickerNumber.tsx
1082
- var import_jsx_runtime19 = require("react/jsx-runtime");
1198
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1083
1199
  var BranchPickerNumber = () => {
1084
- const { useMessage } = useMessageContext();
1085
- const branchIdx = useMessage((s) => s.branches.indexOf(s.message.id));
1086
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_jsx_runtime19.Fragment, { children: branchIdx + 1 });
1200
+ const branchNumber = useBranchPickerNumber();
1201
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_jsx_runtime15.Fragment, { children: branchNumber });
1087
1202
  };
1088
1203
 
1089
1204
  // src/primitives/branchPicker/BranchPickerRoot.tsx
1090
- var import_react_primitive12 = require("@radix-ui/react-primitive");
1091
- var import_react31 = require("react");
1092
- var import_jsx_runtime20 = require("react/jsx-runtime");
1093
- var BranchPickerRoot = (0, import_react31.forwardRef)(({ hideWhenSingleBranch, ...rest }, ref) => {
1094
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(MessageIf, { hasBranches: hideWhenSingleBranch ? true : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_primitive12.Primitive.div, { ...rest, ref }) });
1205
+ var import_react_primitive9 = require("@radix-ui/react-primitive");
1206
+ var import_react34 = require("react");
1207
+ var import_jsx_runtime16 = require("react/jsx-runtime");
1208
+ var BranchPickerRoot = (0, import_react34.forwardRef)(({ hideWhenSingleBranch, ...rest }, ref) => {
1209
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(MessageIf, { hasBranches: hideWhenSingleBranch ? true : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_primitive9.Primitive.div, { ...rest, ref }) });
1095
1210
  });
1096
1211
  BranchPickerRoot.displayName = "BranchPickerRoot";
1097
1212
 
@@ -1105,13 +1220,17 @@ __export(actionBar_exports, {
1105
1220
  });
1106
1221
 
1107
1222
  // src/primitives/actionBar/ActionBarRoot.tsx
1108
- var import_react_primitive13 = require("@radix-ui/react-primitive");
1109
- var import_react32 = require("react");
1110
- var import_jsx_runtime21 = require("react/jsx-runtime");
1111
- var ActionBarRoot = (0, import_react32.forwardRef)(({ hideWhenRunning, autohide, autohideFloat, ...rest }, ref) => {
1223
+ var import_react_primitive10 = require("@radix-ui/react-primitive");
1224
+ var import_react35 = require("react");
1225
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1226
+ var useActionBarFloatStatus = ({
1227
+ hideWhenRunning,
1228
+ autohide,
1229
+ autohideFloat
1230
+ }) => {
1112
1231
  const { useThread } = useThreadContext();
1113
1232
  const { useMessage, useMessageUtils } = useMessageContext();
1114
- const hideAndfloatStatus = useCombinedStore(
1233
+ return useCombinedStore(
1115
1234
  [useThread, useMessage, useMessageUtils],
1116
1235
  (t, m, mu) => {
1117
1236
  if (hideWhenRunning && t.isRunning) return "hidden" /* Hidden */;
@@ -1123,9 +1242,16 @@ var ActionBarRoot = (0, import_react32.forwardRef)(({ hideWhenRunning, autohide,
1123
1242
  return "normal" /* Normal */;
1124
1243
  }
1125
1244
  );
1245
+ };
1246
+ var ActionBarRoot = (0, import_react35.forwardRef)(({ hideWhenRunning, autohide, autohideFloat, ...rest }, ref) => {
1247
+ const hideAndfloatStatus = useActionBarFloatStatus({
1248
+ hideWhenRunning,
1249
+ autohide,
1250
+ autohideFloat
1251
+ });
1126
1252
  if (hideAndfloatStatus === "hidden" /* Hidden */) return null;
1127
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1128
- import_react_primitive13.Primitive.div,
1253
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1254
+ import_react_primitive10.Primitive.div,
1129
1255
  {
1130
1256
  ...hideAndfloatStatus === "floating" /* Floating */ ? { "data-floating": "true" } : null,
1131
1257
  ...rest,
@@ -1136,13 +1262,22 @@ var ActionBarRoot = (0, import_react32.forwardRef)(({ hideWhenRunning, autohide,
1136
1262
  ActionBarRoot.displayName = "ActionBarRoot";
1137
1263
 
1138
1264
  // src/primitives/actionBar/ActionBarCopy.tsx
1139
- var ActionBarCopy = createActionButton(useCopyMessage);
1265
+ var ActionBarCopy = createActionButton(
1266
+ "ActionBarCopy",
1267
+ useActionBarCopy
1268
+ );
1140
1269
 
1141
1270
  // src/primitives/actionBar/ActionBarReload.tsx
1142
- var ActionBarReload = createActionButton(useReloadMessage);
1271
+ var ActionBarReload = createActionButton(
1272
+ "ActionBarReload",
1273
+ useActionBarReload
1274
+ );
1143
1275
 
1144
1276
  // src/primitives/actionBar/ActionBarEdit.tsx
1145
- var ActionBarEdit = createActionButton(useBeginMessageEdit);
1277
+ var ActionBarEdit = createActionButton(
1278
+ "ActionBarEdit",
1279
+ useActionBarEdit
1280
+ );
1146
1281
 
1147
1282
  // src/primitives/contentPart/index.ts
1148
1283
  var contentPart_exports = {};
@@ -1154,24 +1289,17 @@ __export(contentPart_exports, {
1154
1289
  });
1155
1290
 
1156
1291
  // src/primitives/contentPart/ContentPartImage.tsx
1157
- var import_react_primitive14 = require("@radix-ui/react-primitive");
1158
- var import_react33 = require("react");
1159
- var import_jsx_runtime22 = require("react/jsx-runtime");
1160
- var ContentPartImage = (0, import_react33.forwardRef)((props, forwardedRef) => {
1161
- const { useContentPart } = useContentPartContext();
1162
- const image = useContentPart((c) => {
1163
- if (c.part.type !== "image")
1164
- throw new Error(
1165
- "ContentPartImage can only be used inside image content parts."
1166
- );
1167
- return c.part.image;
1168
- });
1169
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_primitive14.Primitive.img, { src: image, ...props, ref: forwardedRef });
1292
+ var import_react_primitive11 = require("@radix-ui/react-primitive");
1293
+ var import_react36 = require("react");
1294
+ var import_jsx_runtime18 = require("react/jsx-runtime");
1295
+ var ContentPartImage = (0, import_react36.forwardRef)((props, forwardedRef) => {
1296
+ const image = useContentPartImage();
1297
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_primitive11.Primitive.img, { src: image, ...props, ref: forwardedRef });
1170
1298
  });
1171
1299
  ContentPartImage.displayName = "ContentPartImage";
1172
1300
 
1173
1301
  // src/runtime/local/useLocalRuntime.tsx
1174
- var import_react34 = require("react");
1302
+ var import_react37 = require("react");
1175
1303
 
1176
1304
  // src/utils/ModelConfigTypes.ts
1177
1305
  var mergeModelConfigs = (configSet) => {
@@ -1457,18 +1585,18 @@ var LocalRuntime = class {
1457
1585
 
1458
1586
  // src/runtime/local/useLocalRuntime.tsx
1459
1587
  var useLocalRuntime = (adapter) => {
1460
- const [runtime] = (0, import_react34.useState)(() => new LocalRuntime(adapter));
1461
- (0, import_react34.useInsertionEffect)(() => {
1588
+ const [runtime] = (0, import_react37.useState)(() => new LocalRuntime(adapter));
1589
+ (0, import_react37.useInsertionEffect)(() => {
1462
1590
  runtime.adapter = adapter;
1463
1591
  });
1464
1592
  return runtime;
1465
1593
  };
1466
1594
 
1467
1595
  // src/context/providers/AssistantRuntimeProvider.tsx
1468
- var import_react37 = require("react");
1596
+ var import_react40 = require("react");
1469
1597
 
1470
1598
  // src/context/providers/AssistantProvider.tsx
1471
- var import_react36 = require("react");
1599
+ var import_react39 = require("react");
1472
1600
 
1473
1601
  // src/context/stores/AssistantModelConfig.ts
1474
1602
  var import_zustand5 = require("zustand");
@@ -1533,7 +1661,7 @@ var makeAssistantToolUIsStore = () => (0, import_zustand6.create)((set) => {
1533
1661
  });
1534
1662
 
1535
1663
  // src/context/providers/ThreadProvider.tsx
1536
- var import_react35 = require("react");
1664
+ var import_react38 = require("react");
1537
1665
 
1538
1666
  // src/context/stores/Composer.ts
1539
1667
  var import_zustand7 = require("zustand");
@@ -1546,6 +1674,7 @@ var makeComposerStore = (useThread, useThreadActions) => (0, import_zustand7.cre
1546
1674
  setValue("");
1547
1675
  useThreadActions.getState().append({
1548
1676
  parentId: useThread.getState().messages.at(-1)?.id ?? null,
1677
+ role: "user",
1549
1678
  content: [{ type: "text", text: value }]
1550
1679
  });
1551
1680
  },
@@ -1603,16 +1732,16 @@ var makeThreadActionStore = (runtimeRef) => {
1603
1732
  };
1604
1733
 
1605
1734
  // src/context/providers/ThreadProvider.tsx
1606
- var import_jsx_runtime23 = require("react/jsx-runtime");
1735
+ var import_jsx_runtime19 = require("react/jsx-runtime");
1607
1736
  var ThreadProvider = ({
1608
1737
  children,
1609
1738
  runtime
1610
1739
  }) => {
1611
- const runtimeRef = (0, import_react35.useRef)(runtime);
1612
- (0, import_react35.useInsertionEffect)(() => {
1740
+ const runtimeRef = (0, import_react38.useRef)(runtime);
1741
+ (0, import_react38.useInsertionEffect)(() => {
1613
1742
  runtimeRef.current = runtime;
1614
1743
  });
1615
- const [context] = (0, import_react35.useState)(() => {
1744
+ const [context] = (0, import_react38.useState)(() => {
1616
1745
  const useThread = makeThreadStore(runtimeRef);
1617
1746
  const useThreadActions = makeThreadActionStore(runtimeRef);
1618
1747
  const useViewport = makeThreadViewportStore();
@@ -1624,7 +1753,7 @@ var ThreadProvider = ({
1624
1753
  useViewport
1625
1754
  };
1626
1755
  });
1627
- (0, import_react35.useEffect)(() => {
1756
+ (0, import_react38.useEffect)(() => {
1628
1757
  const onRuntimeUpdate = () => {
1629
1758
  context.useThread.setState(
1630
1759
  Object.freeze({
@@ -1638,37 +1767,37 @@ var ThreadProvider = ({
1638
1767
  return runtime.subscribe(onRuntimeUpdate);
1639
1768
  }, [context, runtime]);
1640
1769
  const RuntimeSynchronizer = runtime.unstable_synchronizer;
1641
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(ThreadContext.Provider, { value: context, children: [
1642
- RuntimeSynchronizer && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(RuntimeSynchronizer, {}),
1770
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(ThreadContext.Provider, { value: context, children: [
1771
+ RuntimeSynchronizer && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(RuntimeSynchronizer, {}),
1643
1772
  children
1644
1773
  ] });
1645
1774
  };
1646
1775
 
1647
1776
  // src/context/providers/AssistantProvider.tsx
1648
- var import_jsx_runtime24 = require("react/jsx-runtime");
1777
+ var import_jsx_runtime20 = require("react/jsx-runtime");
1649
1778
  var AssistantProvider = ({ children, runtime }) => {
1650
- const runtimeRef = (0, import_react36.useRef)(runtime);
1651
- (0, import_react36.useInsertionEffect)(() => {
1779
+ const runtimeRef = (0, import_react39.useRef)(runtime);
1780
+ (0, import_react39.useInsertionEffect)(() => {
1652
1781
  runtimeRef.current = runtime;
1653
1782
  });
1654
- const [context] = (0, import_react36.useState)(() => {
1783
+ const [context] = (0, import_react39.useState)(() => {
1655
1784
  const useModelConfig = makeAssistantModelConfigStore();
1656
1785
  const useToolUIs = makeAssistantToolUIsStore();
1657
1786
  return { useModelConfig, useToolUIs };
1658
1787
  });
1659
1788
  const getModelCOnfig = context.useModelConfig((c) => c.getModelConfig);
1660
- (0, import_react36.useEffect)(() => {
1789
+ (0, import_react39.useEffect)(() => {
1661
1790
  return runtime.registerModelConfigProvider(getModelCOnfig);
1662
1791
  }, [runtime, getModelCOnfig]);
1663
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(AssistantContext.Provider, { value: context, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ThreadProvider, { runtime, children }) });
1792
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(AssistantContext.Provider, { value: context, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(ThreadProvider, { runtime, children }) });
1664
1793
  };
1665
1794
 
1666
1795
  // src/context/providers/AssistantRuntimeProvider.tsx
1667
- var import_jsx_runtime25 = require("react/jsx-runtime");
1796
+ var import_jsx_runtime21 = require("react/jsx-runtime");
1668
1797
  var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
1669
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(AssistantProvider, { runtime, children });
1798
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(AssistantProvider, { runtime, children });
1670
1799
  };
1671
- var AssistantRuntimeProvider = (0, import_react37.memo)(AssistantRuntimeProviderImpl);
1800
+ var AssistantRuntimeProvider = (0, import_react40.memo)(AssistantRuntimeProviderImpl);
1672
1801
 
1673
1802
  // src/internal.ts
1674
1803
  var internal_exports = {};
@@ -1686,11 +1815,25 @@ __export(internal_exports, {
1686
1815
  INTERNAL,
1687
1816
  MessagePrimitive,
1688
1817
  ThreadPrimitive,
1689
- useBeginMessageEdit,
1690
- useCopyMessage,
1691
- useGoToNextBranch,
1692
- useGoToPreviousBranch,
1818
+ useActionBarCopy,
1819
+ useActionBarEdit,
1820
+ useActionBarReload,
1821
+ useBranchPickerCount,
1822
+ useBranchPickerNext,
1823
+ useBranchPickerNumber,
1824
+ useBranchPickerPrevious,
1825
+ useComposerCancel,
1826
+ useComposerIf,
1827
+ useComposerSend,
1828
+ useContentPartDisplay,
1829
+ useContentPartImage,
1830
+ useContentPartInProgressIndicator,
1831
+ useContentPartText,
1693
1832
  useLocalRuntime,
1694
- useReloadMessage
1833
+ useMessageIf,
1834
+ useThreadEmpty,
1835
+ useThreadIf,
1836
+ useThreadScrollToBottom,
1837
+ useThreadSuggestion
1695
1838
  });
1696
1839
  //# sourceMappingURL=index.js.map