@assistant-ui/react 0.5.76 → 0.5.78

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.mjs CHANGED
@@ -412,15 +412,11 @@ function useComposerRuntime(options) {
412
412
  import { useCallback } from "react";
413
413
  var useAppendMessage = () => {
414
414
  const threadRuntime = useThreadRuntime();
415
- const threadViewportStore = useThreadViewportStore();
416
- const threadComposerStore = useThreadComposerStore();
417
415
  const append = useCallback(
418
416
  (message) => {
419
417
  threadRuntime.append(message);
420
- threadViewportStore.getState().scrollToBottom();
421
- threadComposerStore.getState().focus();
422
418
  },
423
- [threadRuntime, threadViewportStore, threadComposerStore]
419
+ [threadRuntime]
424
420
  );
425
421
  return append;
426
422
  };
@@ -429,11 +425,9 @@ var useAppendMessage = () => {
429
425
  import { useCallback as useCallback2 } from "react";
430
426
  var useSwitchToNewThread = () => {
431
427
  const assistantRuntime = useAssistantRuntime();
432
- const threadComposerStore = useThreadComposerStore();
433
428
  const switchToNewThread = useCallback2(() => {
434
429
  assistantRuntime.switchToNewThread();
435
- threadComposerStore.getState().focus();
436
- }, [assistantRuntime, threadComposerStore]);
430
+ }, [assistantRuntime]);
437
431
  return switchToNewThread;
438
432
  };
439
433
 
@@ -546,25 +540,25 @@ var getThreadMessageText = (message) => {
546
540
  var useActionBarCopy = ({
547
541
  copiedDuration = 3e3
548
542
  } = {}) => {
549
- const messageStore = useMessageStore();
543
+ const messageRuntime = useMessageRuntime();
544
+ const composerRuntime = useComposerRuntime();
550
545
  const messageUtilsStore = useMessageUtilsStore();
551
- const editComposerStore = useEditComposerStore();
552
546
  const hasCopyableContent = useCombinedStore(
553
- [messageStore, editComposerStore],
547
+ [messageRuntime, composerRuntime],
554
548
  (message, c) => {
555
549
  return !c.isEditing && (message.role !== "assistant" || message.status.type !== "running") && message.content.some((c2) => c2.type === "text" && c2.text.length > 0);
556
550
  }
557
551
  );
558
552
  const callback = useCallback3(() => {
559
- const message = messageStore.getState();
553
+ const message = messageRuntime.getState();
560
554
  const { setIsCopied } = messageUtilsStore.getState();
561
- const { isEditing, text: composerValue } = editComposerStore.getState();
555
+ const { isEditing, text: composerValue } = composerRuntime.getState();
562
556
  const valueToCopy = isEditing ? composerValue : getThreadMessageText(message);
563
557
  navigator.clipboard.writeText(valueToCopy).then(() => {
564
558
  setIsCopied(true);
565
559
  setTimeout(() => setIsCopied(false), copiedDuration);
566
560
  });
567
- }, [messageStore, messageUtilsStore, editComposerStore, copiedDuration]);
561
+ }, [messageRuntime, messageUtilsStore, composerRuntime, copiedDuration]);
568
562
  if (!hasCopyableContent) return null;
569
563
  return callback;
570
564
  };
@@ -584,20 +578,15 @@ var useActionBarEdit = () => {
584
578
  // src/primitive-hooks/actionBar/useActionBarReload.tsx
585
579
  import { useCallback as useCallback5 } from "react";
586
580
  var useActionBarReload = () => {
587
- const messageStore = useMessageStore();
588
- const threadStore = useThreadStore();
589
581
  const messageRuntime = useMessageRuntime();
590
- const threadComposerStore = useThreadComposerStore();
591
- const threadViewportStore = useThreadViewportStore();
582
+ const threadRuntime = useThreadRuntime();
592
583
  const disabled = useCombinedStore(
593
- [threadStore, messageStore],
584
+ [threadRuntime, messageRuntime],
594
585
  (t, m) => t.isRunning || t.isDisabled || m.role !== "assistant"
595
586
  );
596
587
  const callback = useCallback5(() => {
597
588
  messageRuntime.reload();
598
- threadViewportStore.getState().scrollToBottom();
599
- threadComposerStore.getState().focus();
600
- }, [messageRuntime, threadComposerStore, threadViewportStore]);
589
+ }, [messageRuntime]);
601
590
  if (disabled) return null;
602
591
  return callback;
603
592
  };
@@ -687,12 +676,11 @@ var useBranchPickerPrevious = () => {
687
676
  // src/primitive-hooks/composer/useComposerCancel.tsx
688
677
  import { useCallback as useCallback12 } from "react";
689
678
  var useComposerCancel = () => {
690
- const composerStore = useComposerStore();
679
+ const composerRuntime = useComposerRuntime();
691
680
  const disabled = useComposer((c) => !c.canCancel);
692
681
  const callback = useCallback12(() => {
693
- const { cancel } = composerStore.getState();
694
- cancel();
695
- }, [composerStore]);
682
+ composerRuntime.cancel();
683
+ }, [composerRuntime]);
696
684
  if (disabled) return null;
697
685
  return callback;
698
686
  };
@@ -709,21 +697,16 @@ var useComposerIf = (props) => {
709
697
  // src/primitive-hooks/composer/useComposerSend.tsx
710
698
  import { useCallback as useCallback13 } from "react";
711
699
  var useComposerSend = () => {
712
- const threadStore = useThreadStore();
713
- const threadViewportStore = useThreadViewportStore();
714
- const composerStore = useComposerStore();
715
- const threadComposerStore = useThreadComposerStore();
700
+ const composerRuntime = useComposerRuntime();
701
+ const threadRuntime = useThreadRuntime();
716
702
  const disabled = useCombinedStore(
717
- [threadStore, composerStore],
703
+ [threadRuntime, composerRuntime],
718
704
  (t, c) => t.isRunning || !c.isEditing || c.isEmpty
719
705
  );
720
706
  const callback = useCallback13(() => {
721
- const composerState = composerStore.getState();
722
- if (!composerState.isEditing) return;
723
- composerState.send();
724
- threadViewportStore.getState().scrollToBottom();
725
- threadComposerStore.getState().focus();
726
- }, [threadComposerStore, composerStore, threadViewportStore]);
707
+ if (!composerRuntime.getState().isEditing) return;
708
+ composerRuntime.send();
709
+ }, [threadRuntime]);
727
710
  if (disabled) return null;
728
711
  return callback;
729
712
  };
@@ -789,10 +772,10 @@ var useContentPartText = () => {
789
772
 
790
773
  // src/primitive-hooks/message/useMessageIf.tsx
791
774
  var useMessageIf = (props) => {
792
- const messageStore = useMessageStore();
775
+ const messageRuntime = useMessageRuntime();
793
776
  const messageUtilsStore = useMessageUtilsStore();
794
777
  return useCombinedStore(
795
- [messageStore, messageUtilsStore],
778
+ [messageRuntime, messageUtilsStore],
796
779
  ({
797
780
  role,
798
781
  attachments,
@@ -847,11 +830,9 @@ import { useCallback as useCallback15 } from "react";
847
830
  var useThreadScrollToBottom = () => {
848
831
  const isAtBottom = useThreadViewport((s) => s.isAtBottom);
849
832
  const threadViewportStore = useThreadViewportStore();
850
- const threadComposerStore = useThreadComposerStore();
851
833
  const handleScrollToBottom = useCallback15(() => {
852
834
  threadViewportStore.getState().scrollToBottom();
853
- threadComposerStore.getState().focus();
854
- }, [threadViewportStore, threadComposerStore]);
835
+ }, [threadViewportStore]);
855
836
  if (isAtBottom) return null;
856
837
  return handleScrollToBottom;
857
838
  };
@@ -862,20 +843,16 @@ var useThreadSuggestion = ({
862
843
  prompt,
863
844
  autoSend
864
845
  }) => {
865
- const threadStore = useThreadStore();
866
- const composerStore = useThreadComposerStore();
867
- const append = useAppendMessage();
846
+ const threadRuntime = useThreadRuntime();
868
847
  const disabled = useThread((t) => t.isDisabled);
869
848
  const callback = useCallback16(() => {
870
- const thread = threadStore.getState();
871
- const composer = composerStore.getState();
872
- if (autoSend && !thread.isRunning) {
873
- append(prompt);
874
- composer.setText("");
849
+ if (autoSend && !threadRuntime.getState().isRunning) {
850
+ threadRuntime.append(prompt);
851
+ threadRuntime.composer.setText("");
875
852
  } else {
876
- composer.setText(prompt);
853
+ threadRuntime.composer.setText(prompt);
877
854
  }
878
- }, [threadStore, composerStore, autoSend, append, prompt]);
855
+ }, [threadRuntime, autoSend, prompt]);
879
856
  if (disabled) return null;
880
857
  return callback;
881
858
  };
@@ -903,11 +880,11 @@ var useActionBarFloatStatus = ({
903
880
  autohide,
904
881
  autohideFloat
905
882
  }) => {
906
- const threadStore = useThreadStore();
907
- const messageStore = useMessageStore();
883
+ const threadRuntime = useThreadRuntime();
884
+ const messageRuntime = useMessageRuntime();
908
885
  const messageUtilsStore = useMessageUtilsStore();
909
886
  return useCombinedStore(
910
- [threadStore, messageStore, messageUtilsStore],
887
+ [threadRuntime, messageRuntime, messageUtilsStore],
911
888
  (t, m, mu) => {
912
889
  if (hideWhenRunning && t.isRunning) return "hidden" /* Hidden */;
913
890
  const autohideEnabled = autohide === "always" || autohide === "not-last" && !m.isLast;
@@ -1107,46 +1084,44 @@ __export(assistantModal_exports, {
1107
1084
  });
1108
1085
 
1109
1086
  // src/primitives/assistantModal/AssistantModalRoot.tsx
1110
- import { useState as useState4 } from "react";
1087
+ import { useEffect as useEffect7, useState as useState4 } from "react";
1111
1088
  import * as PopoverPrimitive2 from "@radix-ui/react-popover";
1112
1089
  import { composeEventHandlers as composeEventHandlers6 } from "@radix-ui/primitive";
1113
1090
 
1114
- // src/utils/hooks/useOnComposerFocus.tsx
1115
- import { useCallbackRef } from "@radix-ui/react-use-callback-ref";
1116
- import { useEffect as useEffect7 } from "react";
1117
- var useOnComposerFocus = (callback) => {
1118
- const callbackRef = useCallbackRef(callback);
1119
- const threadComposerStore = useThreadComposerStore();
1120
- useEffect7(() => {
1121
- return threadComposerStore.getState().onFocus(() => {
1122
- callbackRef();
1123
- });
1124
- }, [threadComposerStore, callbackRef]);
1125
- };
1126
-
1127
1091
  // src/primitives/assistantModal/scope.tsx
1128
1092
  import * as PopoverPrimitive from "@radix-ui/react-popover";
1129
1093
  var usePopoverScope = PopoverPrimitive.createPopoverScope();
1130
1094
 
1131
1095
  // src/primitives/assistantModal/AssistantModalRoot.tsx
1132
1096
  import { jsx as jsx10 } from "react/jsx-runtime";
1133
- var useAssistantModalOpenState = (defaultOpen = false) => {
1097
+ var useAssistantModalOpenState = ({
1098
+ defaultOpen = false,
1099
+ unstable_openOnRunStart = true
1100
+ }) => {
1134
1101
  const state = useState4(defaultOpen);
1135
1102
  const [, setOpen] = state;
1136
- useOnComposerFocus(() => {
1137
- setOpen(true);
1138
- });
1103
+ const threadRuntime = useThreadRuntime();
1104
+ useEffect7(() => {
1105
+ if (!unstable_openOnRunStart) return void 0;
1106
+ return threadRuntime.unstable_on("run-start", () => {
1107
+ setOpen(true);
1108
+ });
1109
+ }, [unstable_openOnRunStart]);
1139
1110
  return state;
1140
1111
  };
1141
1112
  var AssistantModalPrimitiveRoot = ({
1142
1113
  __scopeAssistantModal,
1143
1114
  defaultOpen,
1115
+ unstable_openOnRunStart,
1144
1116
  open,
1145
1117
  onOpenChange,
1146
1118
  ...rest
1147
1119
  }) => {
1148
1120
  const scope = usePopoverScope(__scopeAssistantModal);
1149
- const [modalOpen, setOpen] = useAssistantModalOpenState(defaultOpen);
1121
+ const [modalOpen, setOpen] = useAssistantModalOpenState({
1122
+ defaultOpen,
1123
+ unstable_openOnRunStart
1124
+ });
1150
1125
  return /* @__PURE__ */ jsx10(
1151
1126
  PopoverPrimitive2.Root,
1152
1127
  {
@@ -1438,9 +1413,9 @@ var useIsHoveringRef = () => {
1438
1413
  );
1439
1414
  return useManagedRef(callbackRef);
1440
1415
  };
1441
- var MessagePrimitiveRoot = forwardRef12((props, forwardRef35) => {
1416
+ var MessagePrimitiveRoot = forwardRef12((props, forwardRef36) => {
1442
1417
  const isHoveringRef = useIsHoveringRef();
1443
- const ref = useComposedRefs(forwardRef35, isHoveringRef);
1418
+ const ref = useComposedRefs(forwardRef36, isHoveringRef);
1444
1419
  return /* @__PURE__ */ jsx18(Primitive9.div, { ...props, ref });
1445
1420
  });
1446
1421
  MessagePrimitiveRoot.displayName = "MessagePrimitive.Root";
@@ -1497,7 +1472,7 @@ import {
1497
1472
 
1498
1473
  // src/utils/smooth/useSmooth.tsx
1499
1474
  import { useEffect as useEffect9, useMemo as useMemo5, useRef as useRef2, useState as useState7 } from "react";
1500
- import { useCallbackRef as useCallbackRef2 } from "@radix-ui/react-use-callback-ref";
1475
+ import { useCallbackRef } from "@radix-ui/react-use-callback-ref";
1501
1476
 
1502
1477
  // src/utils/smooth/SmoothContext.tsx
1503
1478
  import {
@@ -1599,7 +1574,7 @@ var useSmooth = (state, smooth = false) => {
1599
1574
  const idRef = useRef2(id);
1600
1575
  const [displayedText, setDisplayedText] = useState7(text);
1601
1576
  const smoothStatusStore = useSmoothStatusStore({ optional: true });
1602
- const setText = useCallbackRef2((text2) => {
1577
+ const setText = useCallbackRef((text2) => {
1603
1578
  setDisplayedText(text2);
1604
1579
  if (smoothStatusStore) {
1605
1580
  writableStore(smoothStatusStore).setState(
@@ -1837,7 +1812,7 @@ var METHOD_NOT_SUPPORTED = () => {
1837
1812
  throw new Error("Composer is not available");
1838
1813
  };
1839
1814
  var EMPTY_ARRAY = Object.freeze([]);
1840
- var getThreadComposerState = (runtime, focus, onFocus) => {
1815
+ var getThreadComposerState = (runtime) => {
1841
1816
  return Object.freeze({
1842
1817
  type: "thread",
1843
1818
  isEditing: runtime?.isEditing ?? false,
@@ -1851,8 +1826,6 @@ var getThreadComposerState = (runtime, focus, onFocus) => {
1851
1826
  // edit: beginEdit,
1852
1827
  send: runtime?.send.bind(runtime) ?? METHOD_NOT_SUPPORTED,
1853
1828
  cancel: runtime?.cancel.bind(runtime) ?? METHOD_NOT_SUPPORTED,
1854
- focus,
1855
- onFocus,
1856
1829
  reset: runtime?.reset.bind(runtime) ?? METHOD_NOT_SUPPORTED,
1857
1830
  addAttachment: runtime?.addAttachment.bind(runtime) ?? METHOD_NOT_SUPPORTED,
1858
1831
  removeAttachment: runtime?.removeAttachment.bind(runtime) ?? METHOD_NOT_SUPPORTED
@@ -1969,11 +1942,7 @@ var ThreadComposerRuntimeImpl = class extends ComposerRuntimeImpl {
1969
1942
  _getState;
1970
1943
  constructor(core) {
1971
1944
  const stateBinding = new LazyMemoizeSubject({
1972
- getState: () => getThreadComposerState(
1973
- core.getState(),
1974
- this.focus.bind(this),
1975
- this.onFocus.bind(this)
1976
- ),
1945
+ getState: () => getThreadComposerState(core.getState()),
1977
1946
  subscribe: (callback) => core.subscribe(callback)
1978
1947
  });
1979
1948
  super({
@@ -1988,21 +1957,6 @@ var ThreadComposerRuntimeImpl = class extends ComposerRuntimeImpl {
1988
1957
  getState() {
1989
1958
  return this._getState();
1990
1959
  }
1991
- // TODO replace with events
1992
- _focusListeners = /* @__PURE__ */ new Set();
1993
- /**
1994
- * @deprecated This feature is being removed in 0.6.0. Submit feedback if you need it.
1995
- */
1996
- focus() {
1997
- this._focusListeners.forEach((callback) => callback());
1998
- }
1999
- /**
2000
- * @deprecated This feature is being removed in 0.6.0. Submit feedback if you need it.
2001
- */
2002
- onFocus(callback) {
2003
- this._focusListeners.add(callback);
2004
- return () => this._focusListeners.delete(callback);
2005
- }
2006
1960
  getAttachmentByIndex(idx) {
2007
1961
  return new ThreadComposerAttachmentRuntimeImpl(
2008
1962
  new ShallowMemoizeSubject({
@@ -2080,6 +2034,9 @@ var NestedSubscriptionSubject = class extends BaseSubject {
2080
2034
  getState() {
2081
2035
  return this.binding.getState();
2082
2036
  }
2037
+ outerSubscribe(callback) {
2038
+ return this.binding.subscribe(callback);
2039
+ }
2083
2040
  _connect() {
2084
2041
  const callback = () => {
2085
2042
  this.notifySubscribers();
@@ -2094,7 +2051,7 @@ var NestedSubscriptionSubject = class extends BaseSubject {
2094
2051
  innerUnsubscribe = this.binding.getState()?.subscribe(callback);
2095
2052
  callback();
2096
2053
  };
2097
- const outerUnsubscribe = this.binding.subscribe(onRuntimeUpdate);
2054
+ const outerUnsubscribe = this.outerSubscribe(onRuntimeUpdate);
2098
2055
  return () => {
2099
2056
  outerUnsubscribe?.();
2100
2057
  innerUnsubscribe?.();
@@ -2265,8 +2222,7 @@ var MessageContentPartComponent = ({
2265
2222
  tools: { by_name = {}, Fallback: Fallback2 = void 0 } = {}
2266
2223
  } = {}
2267
2224
  }) => {
2268
- const messageStore = useMessageStore();
2269
- const threadRuntime = useThreadRuntime();
2225
+ const contentPartRuntime = useContentPartRuntime();
2270
2226
  const part = useContentPart();
2271
2227
  const type = part.type;
2272
2228
  switch (type) {
@@ -2287,12 +2243,7 @@ var MessageContentPartComponent = ({
2287
2243
  return /* @__PURE__ */ jsx23(UI, { ...part, part });
2288
2244
  case "tool-call": {
2289
2245
  const Tool = by_name[part.toolName] || Fallback2;
2290
- const addResult = (result) => threadRuntime.addToolResult({
2291
- messageId: messageStore.getState().id,
2292
- toolName: part.toolName,
2293
- toolCallId: part.toolCallId,
2294
- result
2295
- });
2246
+ const addResult = (result) => contentPartRuntime.addToolResult(result);
2296
2247
  return /* @__PURE__ */ jsx23(ToolUIDisplay, { ...part, part, UI: Tool, addResult });
2297
2248
  }
2298
2249
  default:
@@ -2475,11 +2426,24 @@ import { Slot } from "@radix-ui/react-slot";
2475
2426
  import {
2476
2427
  forwardRef as forwardRef18,
2477
2428
  useCallback as useCallback20,
2478
- useEffect as useEffect11,
2429
+ useEffect as useEffect12,
2479
2430
  useRef as useRef3
2480
2431
  } from "react";
2481
2432
  import TextareaAutosize from "react-textarea-autosize";
2482
2433
  import { useEscapeKeydown as useEscapeKeydown2 } from "@radix-ui/react-use-escape-keydown";
2434
+
2435
+ // src/utils/hooks/useOnScrollToBottom.tsx
2436
+ import { useCallbackRef as useCallbackRef2 } from "@radix-ui/react-use-callback-ref";
2437
+ import { useEffect as useEffect11 } from "react";
2438
+ var useOnScrollToBottom = (callback) => {
2439
+ const callbackRef = useCallbackRef2(callback);
2440
+ const onScrollToBottom = useThreadViewport((vp) => vp.onScrollToBottom);
2441
+ useEffect11(() => {
2442
+ return onScrollToBottom(callbackRef);
2443
+ }, [onScrollToBottom, callbackRef]);
2444
+ };
2445
+
2446
+ // src/primitives/composer/ComposerInput.tsx
2483
2447
  import { jsx as jsx28 } from "react/jsx-runtime";
2484
2448
  var ComposerPrimitiveInput = forwardRef18(
2485
2449
  ({
@@ -2490,10 +2454,13 @@ var ComposerPrimitiveInput = forwardRef18(
2490
2454
  onKeyDown,
2491
2455
  submitOnEnter = true,
2492
2456
  cancelOnEscape = true,
2457
+ unstable_focusOnRunStart = true,
2458
+ unstable_focusOnScrollToBottom = true,
2459
+ unstable_focusOnThreadSwitched = true,
2493
2460
  ...rest
2494
2461
  }, forwardedRef) => {
2495
- const threadStore = useThreadStore();
2496
- const composerStore = useComposerStore();
2462
+ const threadRuntime = useThreadRuntime();
2463
+ const composerRuntime = useComposerRuntime();
2497
2464
  const value = useComposer((c) => {
2498
2465
  if (!c.isEditing) return "";
2499
2466
  return c.text;
@@ -2504,9 +2471,8 @@ var ComposerPrimitiveInput = forwardRef18(
2504
2471
  const ref = useComposedRefs2(forwardedRef, textareaRef);
2505
2472
  useEscapeKeydown2((e) => {
2506
2473
  if (!cancelOnEscape) return;
2507
- const composer = composerStore.getState();
2508
- if (composer.canCancel) {
2509
- composer.cancel();
2474
+ if (composerRuntime.getState().canCancel) {
2475
+ composerRuntime.cancel();
2510
2476
  e.preventDefault();
2511
2477
  }
2512
2478
  });
@@ -2514,7 +2480,7 @@ var ComposerPrimitiveInput = forwardRef18(
2514
2480
  if (isDisabled || !submitOnEnter) return;
2515
2481
  if (e.nativeEvent.isComposing) return;
2516
2482
  if (e.key === "Enter" && e.shiftKey === false) {
2517
- const { isRunning } = threadStore.getState();
2483
+ const { isRunning } = threadRuntime.getState();
2518
2484
  if (!isRunning) {
2519
2485
  e.preventDefault();
2520
2486
  textareaRef.current?.closest("form")?.requestSubmit();
@@ -2522,7 +2488,7 @@ var ComposerPrimitiveInput = forwardRef18(
2522
2488
  }
2523
2489
  };
2524
2490
  const autoFocusEnabled = autoFocus && !isDisabled;
2525
- const focus = useCallback20(() => {
2491
+ const focus2 = useCallback20(() => {
2526
2492
  const textarea = textareaRef.current;
2527
2493
  if (!textarea || !autoFocusEnabled) return;
2528
2494
  textarea.focus({ preventScroll: true });
@@ -2531,12 +2497,22 @@ var ComposerPrimitiveInput = forwardRef18(
2531
2497
  textareaRef.current.value.length
2532
2498
  );
2533
2499
  }, [autoFocusEnabled]);
2534
- useEffect11(() => focus(), [focus]);
2535
- useOnComposerFocus(() => {
2536
- if (composerStore.getState().type === "thread") {
2537
- focus();
2500
+ useEffect12(() => focus2(), [focus2]);
2501
+ useOnScrollToBottom(() => {
2502
+ if (composerRuntime.type === "thread" && unstable_focusOnScrollToBottom) {
2503
+ focus2();
2538
2504
  }
2539
2505
  });
2506
+ useEffect12(() => {
2507
+ if (composerRuntime.type !== "thread" || !unstable_focusOnRunStart)
2508
+ return void 0;
2509
+ return threadRuntime.unstable_on("run-start", focus2);
2510
+ }, [unstable_focusOnRunStart]);
2511
+ useEffect12(() => {
2512
+ if (composerRuntime.type !== "thread" || !unstable_focusOnThreadSwitched)
2513
+ return void 0;
2514
+ return threadRuntime.unstable_on("switched-to", focus2);
2515
+ }, [unstable_focusOnThreadSwitched]);
2540
2516
  return /* @__PURE__ */ jsx28(
2541
2517
  Component,
2542
2518
  {
@@ -2546,9 +2522,8 @@ var ComposerPrimitiveInput = forwardRef18(
2546
2522
  ref,
2547
2523
  disabled: isDisabled,
2548
2524
  onChange: composeEventHandlers9(onChange, (e) => {
2549
- const composerState = composerStore.getState();
2550
- if (!composerState.isEditing) return;
2551
- return composerState.setText(e.target.value);
2525
+ if (!composerRuntime.getState().isEditing) return;
2526
+ return composerRuntime.setText(e.target.value);
2552
2527
  }),
2553
2528
  onKeyDown: composeEventHandlers9(onKeyDown, handleKeyPress)
2554
2529
  }
@@ -2690,7 +2665,7 @@ import { forwardRef as forwardRef20 } from "react";
2690
2665
 
2691
2666
  // src/primitive-hooks/thread/useThreadViewportAutoScroll.tsx
2692
2667
  import { useComposedRefs as useComposedRefs3 } from "@radix-ui/react-compose-refs";
2693
- import { useRef as useRef4 } from "react";
2668
+ import { useEffect as useEffect13, useRef as useRef4 } from "react";
2694
2669
 
2695
2670
  // src/utils/hooks/useOnResizeContent.tsx
2696
2671
  import { useCallbackRef as useCallbackRef3 } from "@radix-ui/react-use-callback-ref";
@@ -2732,22 +2707,10 @@ var useOnResizeContent = (callback) => {
2732
2707
  return useManagedRef(refCallback);
2733
2708
  };
2734
2709
 
2735
- // src/utils/hooks/useOnScrollToBottom.tsx
2736
- import { useCallbackRef as useCallbackRef4 } from "@radix-ui/react-use-callback-ref";
2737
- import { useEffect as useEffect12 } from "react";
2738
- var useOnScrollToBottom = (callback) => {
2739
- const callbackRef = useCallbackRef4(callback);
2740
- const threadViewportStore = useThreadViewportStore();
2741
- useEffect12(() => {
2742
- return threadViewportStore.getState().onScrollToBottom(() => {
2743
- callbackRef();
2744
- });
2745
- }, [threadViewportStore, callbackRef]);
2746
- };
2747
-
2748
2710
  // src/primitive-hooks/thread/useThreadViewportAutoScroll.tsx
2749
2711
  var useThreadViewportAutoScroll = ({
2750
- autoScroll = true
2712
+ autoScroll = true,
2713
+ unstable_scrollToBottomOnRunStart = true
2751
2714
  }) => {
2752
2715
  const divRef = useRef4(null);
2753
2716
  const threadViewportStore = useThreadViewportStore();
@@ -2793,6 +2756,11 @@ var useThreadViewportAutoScroll = ({
2793
2756
  useOnScrollToBottom(() => {
2794
2757
  scrollToBottom("auto");
2795
2758
  });
2759
+ const threadRuntime = useThreadRuntime();
2760
+ useEffect13(() => {
2761
+ if (!unstable_scrollToBottomOnRunStart) return void 0;
2762
+ return threadRuntime.unstable_on("run-start", focus);
2763
+ }, [unstable_scrollToBottomOnRunStart]);
2796
2764
  return autoScrollRef;
2797
2765
  };
2798
2766
 
@@ -2811,7 +2779,7 @@ ThreadPrimitiveViewport.displayName = "ThreadPrimitive.Viewport";
2811
2779
  import { memo as memo5, useMemo as useMemo10 } from "react";
2812
2780
 
2813
2781
  // src/context/providers/MessageRuntimeProvider.tsx
2814
- import { useEffect as useEffect13, useState as useState9 } from "react";
2782
+ import { useEffect as useEffect14, useState as useState9 } from "react";
2815
2783
  import { create as create10 } from "zustand";
2816
2784
 
2817
2785
  // src/context/stores/MessageUtils.ts
@@ -2833,14 +2801,14 @@ var makeMessageUtilsStore = () => create9((set) => {
2833
2801
  import { jsx as jsx32 } from "react/jsx-runtime";
2834
2802
  var useMessageRuntimeStore = (runtime) => {
2835
2803
  const [store] = useState9(() => create10(() => runtime));
2836
- useEffect13(() => {
2804
+ useEffect14(() => {
2837
2805
  writableStore(store).setState(runtime, true);
2838
2806
  }, [runtime, store]);
2839
2807
  return store;
2840
2808
  };
2841
2809
  var useMessageStore2 = (runtime) => {
2842
2810
  const [store] = useState9(() => create10(() => runtime.getState()));
2843
- useEffect13(() => {
2811
+ useEffect14(() => {
2844
2812
  const updateState = () => writableStore(store).setState(runtime.getState(), true);
2845
2813
  updateState();
2846
2814
  return runtime.subscribe(updateState);
@@ -2854,7 +2822,7 @@ var useMessageUtilsStore2 = () => {
2854
2822
  var useEditComposerStore2 = (useMessageRuntime2) => {
2855
2823
  const runtime = useMessageRuntime2.getState().composer;
2856
2824
  const [store] = useState9(() => create10(() => runtime.getState()));
2857
- useEffect13(() => {
2825
+ useEffect14(() => {
2858
2826
  const updateState = () => writableStore(store).setState(runtime.getState());
2859
2827
  updateState();
2860
2828
  return runtime.subscribe(updateState);
@@ -3588,6 +3556,7 @@ var ThreadRuntimeImpl = class {
3588
3556
  this._threadBinding = {
3589
3557
  getState: () => threadBinding.getState(),
3590
3558
  getStateState: () => stateBinding.getState(),
3559
+ outerSubscribe: (callback) => threadBinding.outerSubscribe(callback),
3591
3560
  subscribe: (callback) => threadBinding.subscribe(callback)
3592
3561
  };
3593
3562
  }
@@ -3700,6 +3669,20 @@ var ThreadRuntimeImpl = class {
3700
3669
  this._threadBinding
3701
3670
  );
3702
3671
  }
3672
+ _eventListenerNestedSubscriptions = /* @__PURE__ */ new Map();
3673
+ unstable_on(event, callback) {
3674
+ let subject = this._eventListenerNestedSubscriptions.get(event);
3675
+ if (!subject) {
3676
+ subject = new NestedSubscriptionSubject({
3677
+ getState: () => ({
3678
+ subscribe: (callback2) => this._threadBinding.getState().unstable_on(event, callback2)
3679
+ }),
3680
+ subscribe: (callback2) => this._threadBinding.outerSubscribe(callback2)
3681
+ });
3682
+ this._eventListenerNestedSubscriptions.set(event, subject);
3683
+ }
3684
+ return subject.subscribe(callback);
3685
+ }
3703
3686
  };
3704
3687
 
3705
3688
  // src/api/AssistantRuntime.ts
@@ -4163,18 +4146,23 @@ var BaseThreadRuntimeCore = class {
4163
4146
  this.repository.getMessage(messageId)
4164
4147
  )
4165
4148
  );
4166
- this.notifySubscribers();
4149
+ this._notifySubscribers();
4167
4150
  }
4168
4151
  getBranches(messageId) {
4169
4152
  return this.repository.getBranches(messageId);
4170
4153
  }
4171
4154
  switchToBranch(branchId) {
4172
4155
  this.repository.switchToBranch(branchId);
4173
- this.notifySubscribers();
4156
+ this._notifySubscribers();
4174
4157
  }
4175
- notifySubscribers() {
4158
+ _notifySubscribers() {
4176
4159
  for (const callback of this._subscriptions) callback();
4177
4160
  }
4161
+ _notifyEventSubscribers(event) {
4162
+ const subscribers = this._eventSubscribers.get(event);
4163
+ if (!subscribers) return;
4164
+ for (const callback of subscribers) callback();
4165
+ }
4178
4166
  subscribe(callback) {
4179
4167
  this._subscriptions.add(callback);
4180
4168
  return () => this._subscriptions.delete(callback);
@@ -4189,7 +4177,7 @@ var BaseThreadRuntimeCore = class {
4189
4177
  const { message } = this.repository.getMessage(messageId);
4190
4178
  adapter.submit({ message, type });
4191
4179
  this._submittedFeedback[messageId] = { type };
4192
- this.notifySubscribers();
4180
+ this._notifySubscribers();
4193
4181
  }
4194
4182
  _stopSpeaking;
4195
4183
  speech;
@@ -4206,10 +4194,10 @@ var BaseThreadRuntimeCore = class {
4206
4194
  } else {
4207
4195
  this.speech = { messageId, status: utterance.status };
4208
4196
  }
4209
- this.notifySubscribers();
4197
+ this._notifySubscribers();
4210
4198
  });
4211
4199
  this.speech = { messageId, status: utterance.status };
4212
- this.notifySubscribers();
4200
+ this._notifySubscribers();
4213
4201
  this._stopSpeaking = () => {
4214
4202
  utterance.cancel();
4215
4203
  unsub();
@@ -4220,14 +4208,27 @@ var BaseThreadRuntimeCore = class {
4220
4208
  stopSpeaking() {
4221
4209
  if (!this._stopSpeaking) throw new Error("No message is being spoken");
4222
4210
  this._stopSpeaking();
4223
- this.notifySubscribers();
4211
+ this._notifySubscribers();
4224
4212
  }
4225
4213
  export() {
4226
4214
  return this.repository.export();
4227
4215
  }
4228
4216
  import(data) {
4229
4217
  this.repository.import(data);
4230
- this.notifySubscribers();
4218
+ this._notifySubscribers();
4219
+ }
4220
+ _eventSubscribers = /* @__PURE__ */ new Map();
4221
+ unstable_on(event, callback) {
4222
+ const subscribers = this._eventSubscribers.get(event);
4223
+ if (!subscribers) {
4224
+ this._eventSubscribers.set(event, /* @__PURE__ */ new Set([callback]));
4225
+ } else {
4226
+ subscribers.add(callback);
4227
+ }
4228
+ return () => {
4229
+ const subscribers2 = this._eventSubscribers.get(event);
4230
+ subscribers2.delete(callback);
4231
+ };
4231
4232
  }
4232
4233
  };
4233
4234
 
@@ -4289,7 +4290,7 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
4289
4290
  this.capabilities.feedback = canFeedback;
4290
4291
  hasUpdates = true;
4291
4292
  }
4292
- if (hasUpdates) this.notifySubscribers();
4293
+ if (hasUpdates) this._notifySubscribers();
4293
4294
  }
4294
4295
  async append(message) {
4295
4296
  const newMessage = fromCoreMessage(message, {
@@ -4300,7 +4301,7 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
4300
4301
  await this.startRun(newMessage.id);
4301
4302
  } else {
4302
4303
  this.repository.resetHead(newMessage.id);
4303
- this.notifySubscribers();
4304
+ this._notifySubscribers();
4304
4305
  }
4305
4306
  }
4306
4307
  async startRun(parentId) {
@@ -4313,6 +4314,7 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
4313
4314
  content: [],
4314
4315
  createdAt: /* @__PURE__ */ new Date()
4315
4316
  };
4317
+ this._notifyEventSubscribers("run-start");
4316
4318
  do {
4317
4319
  message = await this.performRoundtrip(parentId, message);
4318
4320
  } while (shouldContinue(message));
@@ -4344,7 +4346,7 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
4344
4346
  } : void 0
4345
4347
  };
4346
4348
  this.repository.addOrUpdateMessage(parentId, message);
4347
- this.notifySubscribers();
4349
+ this._notifySubscribers();
4348
4350
  };
4349
4351
  const maxSteps = this.options.maxSteps ? this.options.maxSteps : (this.options.maxToolRoundtrips ?? 1) + 1;
4350
4352
  const steps = message.metadata?.steps?.length ?? 0;
@@ -4455,6 +4457,7 @@ var LocalRuntimeCore = class extends BaseAssistantRuntimeCore {
4455
4457
  this.thread.adapter,
4456
4458
  options
4457
4459
  );
4460
+ this.thread._notifyEventSubscribers("switched-to");
4458
4461
  }
4459
4462
  switchToThread(threadId) {
4460
4463
  if (threadId !== null) {
@@ -4503,7 +4506,7 @@ var useLocalRuntime = (adapter, options = {}) => {
4503
4506
  };
4504
4507
 
4505
4508
  // src/runtimes/external-store/useExternalStoreRuntime.tsx
4506
- import { useEffect as useEffect14, useMemo as useMemo12, useState as useState12 } from "react";
4509
+ import { useEffect as useEffect15, useMemo as useMemo12, useState as useState12 } from "react";
4507
4510
 
4508
4511
  // src/runtimes/external-store/getExternalStoreMessage.tsx
4509
4512
  var symbolInnerMessage = Symbol("innerMessage");
@@ -4676,7 +4679,7 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
4676
4679
  if (oldStore.convertMessage !== store.convertMessage) {
4677
4680
  this._converter = new ThreadMessageConverter();
4678
4681
  } else if (oldStore.isRunning === store.isRunning && oldStore.messages === store.messages) {
4679
- this.notifySubscribers();
4682
+ this._notifySubscribers();
4680
4683
  return;
4681
4684
  }
4682
4685
  }
@@ -4716,7 +4719,7 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
4716
4719
  this.assistantOptimisticId ?? messages2.at(-1)?.id ?? null
4717
4720
  );
4718
4721
  this._messages = this.repository.getMessages();
4719
- this.notifySubscribers();
4722
+ this._notifySubscribers();
4720
4723
  }
4721
4724
  switchToBranch(branchId) {
4722
4725
  if (!this._store.setMessages)
@@ -4755,7 +4758,7 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
4755
4758
  }
4756
4759
  messages2 = this.repository.getMessages();
4757
4760
  } else {
4758
- this.notifySubscribers();
4761
+ this._notifySubscribers();
4759
4762
  }
4760
4763
  setTimeout(() => {
4761
4764
  this.updateMessages(messages2);
@@ -4798,6 +4801,7 @@ var ExternalStoreRuntimeCore = class extends BaseAssistantRuntimeCore {
4798
4801
  }
4799
4802
  );
4800
4803
  await this.thread.store.onSwitchToNewThread();
4804
+ this.thread._notifyEventSubscribers("switched-to");
4801
4805
  }
4802
4806
  async switchToThread(threadId) {
4803
4807
  if (threadId !== null) {
@@ -4811,7 +4815,8 @@ var ExternalStoreRuntimeCore = class extends BaseAssistantRuntimeCore {
4811
4815
  // ignore messages until rerender
4812
4816
  }
4813
4817
  );
4814
- this.thread.store.onSwitchToThread(threadId);
4818
+ await this.thread.store.onSwitchToThread(threadId);
4819
+ this.thread._notifyEventSubscribers("switched-to");
4815
4820
  } else {
4816
4821
  this.switchToNewThread();
4817
4822
  }
@@ -4821,7 +4826,7 @@ var ExternalStoreRuntimeCore = class extends BaseAssistantRuntimeCore {
4821
4826
  // src/runtimes/external-store/useExternalStoreRuntime.tsx
4822
4827
  var useExternalStoreRuntime = (store) => {
4823
4828
  const [runtime] = useState12(() => new ExternalStoreRuntimeCore(store));
4824
- useEffect14(() => {
4829
+ useEffect15(() => {
4825
4830
  runtime.thread.store = store;
4826
4831
  });
4827
4832
  return useMemo12(
@@ -5562,15 +5567,15 @@ var assistant_message_default = Object.assign(
5562
5567
  );
5563
5568
 
5564
5569
  // src/ui/assistant-modal.tsx
5565
- import { forwardRef as forwardRef34 } from "react";
5570
+ import { forwardRef as forwardRef35 } from "react";
5566
5571
  import { BotIcon, ChevronDownIcon } from "lucide-react";
5567
5572
 
5568
5573
  // src/ui/thread.tsx
5569
- import { forwardRef as forwardRef33 } from "react";
5574
+ import { forwardRef as forwardRef34 } from "react";
5570
5575
  import { ArrowDownIcon } from "lucide-react";
5571
5576
 
5572
5577
  // src/ui/composer.tsx
5573
- import { forwardRef as forwardRef28 } from "react";
5578
+ import { forwardRef as forwardRef29 } from "react";
5574
5579
  import { PaperclipIcon, SendHorizontalIcon } from "lucide-react";
5575
5580
 
5576
5581
  // src/ui/base/CircleStopIcon.tsx
@@ -5590,15 +5595,117 @@ var CircleStopIcon = () => {
5590
5595
  };
5591
5596
  CircleStopIcon.displayName = "CircleStopIcon";
5592
5597
 
5593
- // src/ui/composer-attachment.tsx
5594
- import { forwardRef as forwardRef27 } from "react";
5595
- import { CircleXIcon } from "lucide-react";
5598
+ // src/ui/attachment.tsx
5599
+ import {
5600
+ forwardRef as forwardRef28,
5601
+ useEffect as useEffect16,
5602
+ useState as useState14
5603
+ } from "react";
5604
+ import { CircleXIcon, FileIcon } from "lucide-react";
5605
+
5606
+ // src/ui/base/dialog.tsx
5607
+ import * as React from "react";
5608
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
5609
+ import classNames3 from "classnames";
5596
5610
  import { jsx as jsx45, jsxs as jsxs8 } from "react/jsx-runtime";
5597
- var ComposerAttachmentRoot = withDefaults(attachment_exports.Root, {
5611
+ var Dialog = DialogPrimitive.Root;
5612
+ var DialogTrigger = DialogPrimitive.Trigger;
5613
+ var DialogPortal = DialogPrimitive.Portal;
5614
+ var DialogOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx45(
5615
+ DialogPrimitive.Overlay,
5616
+ {
5617
+ ref,
5618
+ className: classNames3("aui-dialog-overlay", className),
5619
+ ...props
5620
+ }
5621
+ ));
5622
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
5623
+ var DialogContent = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs8(DialogPortal, { children: [
5624
+ /* @__PURE__ */ jsx45(DialogOverlay, {}),
5625
+ /* @__PURE__ */ jsx45(
5626
+ DialogPrimitive.Content,
5627
+ {
5628
+ ref,
5629
+ className: classNames3("aui-dialog-content", className),
5630
+ ...props,
5631
+ children
5632
+ }
5633
+ )
5634
+ ] }));
5635
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
5636
+
5637
+ // src/ui/attachment.tsx
5638
+ import { AvatarFallback as AvatarFallback2 } from "@radix-ui/react-avatar";
5639
+ import { jsx as jsx46, jsxs as jsxs9 } from "react/jsx-runtime";
5640
+ var AttachmentRoot = withDefaults(attachment_exports.Root, {
5598
5641
  className: "aui-attachment-root"
5599
5642
  });
5600
- ComposerAttachmentRoot.displayName = "ComposerAttachmentRoot";
5601
- var ComposerAttachment2 = () => {
5643
+ AttachmentRoot.displayName = "AttachmentRoot";
5644
+ var useFileSrc = (file) => {
5645
+ const [src, setSrc] = useState14(void 0);
5646
+ useEffect16(() => {
5647
+ if (!file) {
5648
+ setSrc(void 0);
5649
+ return;
5650
+ }
5651
+ const objectUrl = URL.createObjectURL(file);
5652
+ setSrc(objectUrl);
5653
+ return () => {
5654
+ URL.revokeObjectURL(objectUrl);
5655
+ };
5656
+ }, [file]);
5657
+ return src;
5658
+ };
5659
+ var useAttachmentSrc = () => {
5660
+ const { file, src } = useAttachment((a) => {
5661
+ if (a.type !== "image") return {};
5662
+ if (a.file) return { file: a.file };
5663
+ const src2 = a.content?.filter((c) => c.type === "image")[0]?.image;
5664
+ if (!src2) return {};
5665
+ return { src: src2 };
5666
+ });
5667
+ return useFileSrc(file) ?? src;
5668
+ };
5669
+ var AttachmentPreview = ({ src }) => {
5670
+ const [isLoaded, setIsLoaded] = useState14(false);
5671
+ return (
5672
+ // eslint-disable-next-line @next/next/no-img-element
5673
+ /* @__PURE__ */ jsx46(
5674
+ "img",
5675
+ {
5676
+ src,
5677
+ style: {
5678
+ width: "auto",
5679
+ height: "auto",
5680
+ maxWidth: "75dvh",
5681
+ maxHeight: "75dvh",
5682
+ display: isLoaded ? "block" : "none",
5683
+ overflow: "clip"
5684
+ },
5685
+ onLoad: () => setIsLoaded(true),
5686
+ alt: "Image Preview"
5687
+ }
5688
+ )
5689
+ );
5690
+ };
5691
+ var AttachmentPreviewDialog = ({ children }) => {
5692
+ const src = useAttachmentSrc();
5693
+ if (!src) return children;
5694
+ return /* @__PURE__ */ jsxs9(Dialog, { children: [
5695
+ /* @__PURE__ */ jsx46(DialogTrigger, { className: "aui-attachment-preview-trigger", asChild: true, children }),
5696
+ /* @__PURE__ */ jsx46(DialogContent, { children: /* @__PURE__ */ jsx46(AttachmentPreview, { src }) })
5697
+ ] });
5698
+ };
5699
+ var AttachmentThumb = () => {
5700
+ const isImage = useAttachment((a) => a.type === "image");
5701
+ const src = useAttachmentSrc();
5702
+ return /* @__PURE__ */ jsxs9(AvatarRoot, { className: "aui-attachment-thumb", children: [
5703
+ /* @__PURE__ */ jsx46(AvatarFallback2, { delayMs: isImage ? 200 : 0, children: /* @__PURE__ */ jsx46(FileIcon, {}) }),
5704
+ /* @__PURE__ */ jsx46(AvatarImage, { src })
5705
+ ] });
5706
+ };
5707
+ var Attachment = () => {
5708
+ const canRemove = useAttachment((a) => a.source !== "message");
5602
5709
  const typeLabel = useAttachment((a) => {
5603
5710
  const type = a.type;
5604
5711
  switch (type) {
@@ -5613,46 +5720,46 @@ var ComposerAttachment2 = () => {
5613
5720
  throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
5614
5721
  }
5615
5722
  });
5616
- return /* @__PURE__ */ jsxs8(ComposerAttachmentRoot, { children: [
5617
- /* @__PURE__ */ jsx45(attachment_exports.unstable_Thumb, { className: "aui-attachment-thumb" }),
5618
- /* @__PURE__ */ jsxs8("div", { className: "aui-attachment-text", children: [
5619
- /* @__PURE__ */ jsx45("p", { className: "aui-attachment-name", children: /* @__PURE__ */ jsx45(attachment_exports.Name, {}) }),
5620
- /* @__PURE__ */ jsx45("p", { className: "aui-attachment-type", children: typeLabel })
5621
- ] }),
5622
- /* @__PURE__ */ jsx45(ComposerAttachmentRemove, {})
5723
+ return /* @__PURE__ */ jsxs9(Tooltip, { children: [
5724
+ /* @__PURE__ */ jsx46(AttachmentPreviewDialog, { children: /* @__PURE__ */ jsx46(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxs9(AttachmentRoot, { children: [
5725
+ /* @__PURE__ */ jsx46(AttachmentThumb, {}),
5726
+ /* @__PURE__ */ jsxs9("div", { className: "aui-attachment-text", children: [
5727
+ /* @__PURE__ */ jsx46("p", { className: "aui-attachment-name", children: /* @__PURE__ */ jsx46(attachment_exports.Name, {}) }),
5728
+ /* @__PURE__ */ jsx46("p", { className: "aui-attachment-type", children: typeLabel })
5729
+ ] }),
5730
+ canRemove && /* @__PURE__ */ jsx46(AttachmentRemove, {})
5731
+ ] }) }) }),
5732
+ /* @__PURE__ */ jsx46(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx46(attachment_exports.Name, {}) })
5623
5733
  ] });
5624
5734
  };
5625
- ComposerAttachment2.displayName = "ComposerAttachment";
5626
- var ComposerAttachmentRemove = forwardRef27((props, ref) => {
5735
+ Attachment.displayName = "Attachment";
5736
+ var AttachmentRemove = forwardRef28((props, ref) => {
5627
5737
  const {
5628
5738
  strings: {
5629
5739
  composer: { removeAttachment: { tooltip = "Remove file" } = {} } = {}
5630
5740
  } = {}
5631
5741
  } = useThreadConfig();
5632
- return /* @__PURE__ */ jsx45(attachment_exports.Remove, { asChild: true, children: /* @__PURE__ */ jsx45(
5742
+ return /* @__PURE__ */ jsx46(attachment_exports.Remove, { asChild: true, children: /* @__PURE__ */ jsx46(
5633
5743
  TooltipIconButton,
5634
5744
  {
5635
5745
  tooltip,
5636
- className: "aui-composer-attachment-remove",
5746
+ className: "aui-attachment-remove",
5637
5747
  side: "top",
5638
5748
  ...props,
5639
5749
  ref,
5640
- children: props.children ?? /* @__PURE__ */ jsx45(CircleXIcon, {})
5750
+ children: props.children ?? /* @__PURE__ */ jsx46(CircleXIcon, {})
5641
5751
  }
5642
5752
  ) });
5643
5753
  });
5644
- ComposerAttachmentRemove.displayName = "ComposerAttachmentRemove";
5754
+ AttachmentRemove.displayName = "AttachmentRemove";
5645
5755
  var exports5 = {
5646
- Root: ComposerAttachmentRoot,
5647
- Remove: ComposerAttachmentRemove
5756
+ Root: AttachmentRoot,
5757
+ Remove: AttachmentRemove
5648
5758
  };
5649
- var composer_attachment_default = Object.assign(
5650
- ComposerAttachment2,
5651
- exports5
5652
- );
5759
+ var attachment_default = Object.assign(Attachment, exports5);
5653
5760
 
5654
5761
  // src/ui/composer.tsx
5655
- import { Fragment as Fragment6, jsx as jsx46, jsxs as jsxs9 } from "react/jsx-runtime";
5762
+ import { Fragment as Fragment6, jsx as jsx47, jsxs as jsxs10 } from "react/jsx-runtime";
5656
5763
  var useAllowAttachments = (ensureCapability = false) => {
5657
5764
  const { composer: { allowAttachments = true } = {} } = useThreadConfig();
5658
5765
  const attachmentsSupported = useThread((t) => t.capabilities.attachments);
@@ -5660,11 +5767,11 @@ var useAllowAttachments = (ensureCapability = false) => {
5660
5767
  };
5661
5768
  var Composer = () => {
5662
5769
  const allowAttachments = useAllowAttachments(true);
5663
- return /* @__PURE__ */ jsxs9(ComposerRoot, { children: [
5664
- allowAttachments && /* @__PURE__ */ jsx46(ComposerAttachments, {}),
5665
- allowAttachments && /* @__PURE__ */ jsx46(ComposerAddAttachment, {}),
5666
- /* @__PURE__ */ jsx46(ComposerInput, { autoFocus: true }),
5667
- /* @__PURE__ */ jsx46(ComposerAction, {})
5770
+ return /* @__PURE__ */ jsxs10(ComposerRoot, { children: [
5771
+ allowAttachments && /* @__PURE__ */ jsx47(ComposerAttachments, {}),
5772
+ allowAttachments && /* @__PURE__ */ jsx47(ComposerAddAttachment, {}),
5773
+ /* @__PURE__ */ jsx47(ComposerInput, { autoFocus: true }),
5774
+ /* @__PURE__ */ jsx47(ComposerAction, {})
5668
5775
  ] });
5669
5776
  };
5670
5777
  Composer.displayName = "Composer";
@@ -5677,14 +5784,14 @@ var ComposerInputStyled = withDefaults(composer_exports.Input, {
5677
5784
  autoFocus: true,
5678
5785
  className: "aui-composer-input"
5679
5786
  });
5680
- var ComposerInput = forwardRef28(
5787
+ var ComposerInput = forwardRef29(
5681
5788
  (props, ref) => {
5682
5789
  const {
5683
5790
  strings: {
5684
5791
  composer: { input: { placeholder = "Write a message..." } = {} } = {}
5685
5792
  } = {}
5686
5793
  } = useThreadConfig();
5687
- return /* @__PURE__ */ jsx46(ComposerInputStyled, { placeholder, ...props, ref });
5794
+ return /* @__PURE__ */ jsx47(ComposerInputStyled, { placeholder, ...props, ref });
5688
5795
  }
5689
5796
  );
5690
5797
  ComposerInput.displayName = "ComposerInput";
@@ -5692,12 +5799,12 @@ var ComposerAttachmentsContainer = withDefaults("div", {
5692
5799
  className: "aui-composer-attachments"
5693
5800
  });
5694
5801
  var ComposerAttachments = ({ components }) => {
5695
- return /* @__PURE__ */ jsx46(ComposerAttachmentsContainer, { children: /* @__PURE__ */ jsx46(
5802
+ return /* @__PURE__ */ jsx47(ComposerAttachmentsContainer, { children: /* @__PURE__ */ jsx47(
5696
5803
  composer_exports.Attachments,
5697
5804
  {
5698
5805
  components: {
5699
5806
  ...components,
5700
- Attachment: components?.Attachment ?? composer_attachment_default
5807
+ Attachment: components?.Attachment ?? attachment_default
5701
5808
  }
5702
5809
  }
5703
5810
  ) });
@@ -5706,21 +5813,21 @@ var ComposerAttachButton = withDefaults(TooltipIconButton, {
5706
5813
  variant: "default",
5707
5814
  className: "aui-composer-attach"
5708
5815
  });
5709
- var ComposerAddAttachment = forwardRef28((props, ref) => {
5816
+ var ComposerAddAttachment = forwardRef29((props, ref) => {
5710
5817
  const {
5711
5818
  strings: {
5712
5819
  composer: { addAttachment: { tooltip = "Attach file" } = {} } = {}
5713
5820
  } = {}
5714
5821
  } = useThreadConfig();
5715
5822
  const allowAttachments = useAllowAttachments();
5716
- return /* @__PURE__ */ jsx46(composer_exports.AddAttachment, { disabled: !allowAttachments, asChild: true, children: /* @__PURE__ */ jsx46(
5823
+ return /* @__PURE__ */ jsx47(composer_exports.AddAttachment, { disabled: !allowAttachments, asChild: true, children: /* @__PURE__ */ jsx47(
5717
5824
  ComposerAttachButton,
5718
5825
  {
5719
5826
  tooltip,
5720
5827
  variant: "ghost",
5721
5828
  ...props,
5722
5829
  ref,
5723
- children: props.children ?? /* @__PURE__ */ jsx46(PaperclipIcon, {})
5830
+ children: props.children ?? /* @__PURE__ */ jsx47(PaperclipIcon, {})
5724
5831
  }
5725
5832
  ) });
5726
5833
  });
@@ -5731,10 +5838,10 @@ var useAllowCancel = () => {
5731
5838
  };
5732
5839
  var ComposerAction = () => {
5733
5840
  const allowCancel = useAllowCancel();
5734
- if (!allowCancel) return /* @__PURE__ */ jsx46(ComposerSend, {});
5735
- return /* @__PURE__ */ jsxs9(Fragment6, { children: [
5736
- /* @__PURE__ */ jsx46(thread_exports.If, { running: false, children: /* @__PURE__ */ jsx46(ComposerSend, {}) }),
5737
- /* @__PURE__ */ jsx46(thread_exports.If, { running: true, children: /* @__PURE__ */ jsx46(ComposerCancel, {}) })
5841
+ if (!allowCancel) return /* @__PURE__ */ jsx47(ComposerSend, {});
5842
+ return /* @__PURE__ */ jsxs10(Fragment6, { children: [
5843
+ /* @__PURE__ */ jsx47(thread_exports.If, { running: false, children: /* @__PURE__ */ jsx47(ComposerSend, {}) }),
5844
+ /* @__PURE__ */ jsx47(thread_exports.If, { running: true, children: /* @__PURE__ */ jsx47(ComposerCancel, {}) })
5738
5845
  ] });
5739
5846
  };
5740
5847
  ComposerAction.displayName = "ComposerAction";
@@ -5742,12 +5849,12 @@ var ComposerSendButton = withDefaults(TooltipIconButton, {
5742
5849
  variant: "default",
5743
5850
  className: "aui-composer-send"
5744
5851
  });
5745
- var ComposerSend = forwardRef28(
5852
+ var ComposerSend = forwardRef29(
5746
5853
  (props, ref) => {
5747
5854
  const {
5748
5855
  strings: { composer: { send: { tooltip = "Send" } = {} } = {} } = {}
5749
5856
  } = useThreadConfig();
5750
- return /* @__PURE__ */ jsx46(composer_exports.Send, { asChild: true, children: /* @__PURE__ */ jsx46(ComposerSendButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx46(SendHorizontalIcon, {}) }) });
5857
+ return /* @__PURE__ */ jsx47(composer_exports.Send, { asChild: true, children: /* @__PURE__ */ jsx47(ComposerSendButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx47(SendHorizontalIcon, {}) }) });
5751
5858
  }
5752
5859
  );
5753
5860
  ComposerSend.displayName = "ComposerSend";
@@ -5755,12 +5862,12 @@ var ComposerCancelButton = withDefaults(TooltipIconButton, {
5755
5862
  variant: "default",
5756
5863
  className: "aui-composer-cancel"
5757
5864
  });
5758
- var ComposerCancel = forwardRef28(
5865
+ var ComposerCancel = forwardRef29(
5759
5866
  (props, ref) => {
5760
5867
  const {
5761
5868
  strings: { composer: { cancel: { tooltip = "Cancel" } = {} } = {} } = {}
5762
5869
  } = useThreadConfig();
5763
- return /* @__PURE__ */ jsx46(composer_exports.Cancel, { asChild: true, children: /* @__PURE__ */ jsx46(ComposerCancelButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx46(CircleStopIcon, {}) }) });
5870
+ return /* @__PURE__ */ jsx47(composer_exports.Cancel, { asChild: true, children: /* @__PURE__ */ jsx47(ComposerCancelButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx47(CircleStopIcon, {}) }) });
5764
5871
  }
5765
5872
  );
5766
5873
  ComposerCancel.displayName = "ComposerCancel";
@@ -5776,15 +5883,15 @@ var exports6 = {
5776
5883
  var composer_default = Object.assign(Composer, exports6);
5777
5884
 
5778
5885
  // src/ui/thread-welcome.tsx
5779
- import { forwardRef as forwardRef29 } from "react";
5780
- import { jsx as jsx47, jsxs as jsxs10 } from "react/jsx-runtime";
5886
+ import { forwardRef as forwardRef30 } from "react";
5887
+ import { jsx as jsx48, jsxs as jsxs11 } from "react/jsx-runtime";
5781
5888
  var ThreadWelcome = () => {
5782
- return /* @__PURE__ */ jsxs10(ThreadWelcomeRoot, { children: [
5783
- /* @__PURE__ */ jsxs10(ThreadWelcomeCenter, { children: [
5784
- /* @__PURE__ */ jsx47(ThreadWelcomeAvatar, {}),
5785
- /* @__PURE__ */ jsx47(ThreadWelcomeMessage, {})
5889
+ return /* @__PURE__ */ jsxs11(ThreadWelcomeRoot, { children: [
5890
+ /* @__PURE__ */ jsxs11(ThreadWelcomeCenter, { children: [
5891
+ /* @__PURE__ */ jsx48(ThreadWelcomeAvatar, {}),
5892
+ /* @__PURE__ */ jsx48(ThreadWelcomeMessage, {})
5786
5893
  ] }),
5787
- /* @__PURE__ */ jsx47(ThreadWelcomeSuggestions, {})
5894
+ /* @__PURE__ */ jsx48(ThreadWelcomeSuggestions, {})
5788
5895
  ] });
5789
5896
  };
5790
5897
  ThreadWelcome.displayName = "ThreadWelcome";
@@ -5794,20 +5901,20 @@ var ThreadWelcomeRootStyled = withDefaults("div", {
5794
5901
  var ThreadWelcomeCenter = withDefaults("div", {
5795
5902
  className: "aui-thread-welcome-center"
5796
5903
  });
5797
- var ThreadWelcomeRoot = forwardRef29((props, ref) => {
5798
- return /* @__PURE__ */ jsx47(thread_exports.Empty, { children: /* @__PURE__ */ jsx47(ThreadWelcomeRootStyled, { ...props, ref }) });
5904
+ var ThreadWelcomeRoot = forwardRef30((props, ref) => {
5905
+ return /* @__PURE__ */ jsx48(thread_exports.Empty, { children: /* @__PURE__ */ jsx48(ThreadWelcomeRootStyled, { ...props, ref }) });
5799
5906
  });
5800
5907
  ThreadWelcomeRoot.displayName = "ThreadWelcomeRoot";
5801
5908
  var ThreadWelcomeAvatar = () => {
5802
5909
  const { assistantAvatar: avatar = { fallback: "A" } } = useThreadConfig();
5803
- return /* @__PURE__ */ jsx47(Avatar, { ...avatar });
5910
+ return /* @__PURE__ */ jsx48(Avatar, { ...avatar });
5804
5911
  };
5805
5912
  var ThreadWelcomeMessageStyled = withDefaults("p", {
5806
5913
  className: "aui-thread-welcome-message"
5807
5914
  });
5808
- var ThreadWelcomeMessage = forwardRef29(({ message: messageProp, ...rest }, ref) => {
5915
+ var ThreadWelcomeMessage = forwardRef30(({ message: messageProp, ...rest }, ref) => {
5809
5916
  const { welcome: { message = "How can I help you today?" } = {} } = useThreadConfig();
5810
- return /* @__PURE__ */ jsx47(ThreadWelcomeMessageStyled, { ...rest, ref, children: messageProp ?? message });
5917
+ return /* @__PURE__ */ jsx48(ThreadWelcomeMessageStyled, { ...rest, ref, children: messageProp ?? message });
5811
5918
  });
5812
5919
  ThreadWelcomeMessage.displayName = "ThreadWelcomeMessage";
5813
5920
  var ThreadWelcomeSuggestionContainer = withDefaults("div", {
@@ -5819,15 +5926,15 @@ var ThreadWelcomeSuggestionStyled = withDefaults(thread_exports.Suggestion, {
5819
5926
  var ThreadWelcomeSuggestion = ({
5820
5927
  suggestion: { text, prompt }
5821
5928
  }) => {
5822
- return /* @__PURE__ */ jsx47(ThreadWelcomeSuggestionStyled, { prompt, method: "replace", autoSend: true, children: /* @__PURE__ */ jsx47("span", { className: "aui-thread-welcome-suggestion-text", children: text ?? prompt }) });
5929
+ return /* @__PURE__ */ jsx48(ThreadWelcomeSuggestionStyled, { prompt, method: "replace", autoSend: true, children: /* @__PURE__ */ jsx48("span", { className: "aui-thread-welcome-suggestion-text", children: text ?? prompt }) });
5823
5930
  };
5824
5931
  var ThreadWelcomeSuggestions = () => {
5825
5932
  const suggestions2 = useThread((t) => t.suggestions);
5826
5933
  const { welcome: { suggestions } = {} } = useThreadConfig();
5827
5934
  const finalSuggestions = suggestions2.length ? suggestions2 : suggestions;
5828
- return /* @__PURE__ */ jsx47(ThreadWelcomeSuggestionContainer, { children: finalSuggestions?.map((suggestion, idx) => {
5935
+ return /* @__PURE__ */ jsx48(ThreadWelcomeSuggestionContainer, { children: finalSuggestions?.map((suggestion, idx) => {
5829
5936
  const key = `${suggestion.prompt}-${idx}`;
5830
- return /* @__PURE__ */ jsx47(ThreadWelcomeSuggestion, { suggestion }, key);
5937
+ return /* @__PURE__ */ jsx48(ThreadWelcomeSuggestion, { suggestion }, key);
5831
5938
  }) });
5832
5939
  };
5833
5940
  ThreadWelcomeSuggestions.displayName = "ThreadWelcomeSuggestions";
@@ -5842,12 +5949,12 @@ var exports7 = {
5842
5949
  var thread_welcome_default = Object.assign(ThreadWelcome, exports7);
5843
5950
 
5844
5951
  // src/ui/user-message.tsx
5845
- import { forwardRef as forwardRef31 } from "react";
5952
+ import { forwardRef as forwardRef32 } from "react";
5846
5953
 
5847
5954
  // src/ui/user-action-bar.tsx
5848
- import { forwardRef as forwardRef30 } from "react";
5955
+ import { forwardRef as forwardRef31 } from "react";
5849
5956
  import { PencilIcon } from "lucide-react";
5850
- import { jsx as jsx48 } from "react/jsx-runtime";
5957
+ import { jsx as jsx49 } from "react/jsx-runtime";
5851
5958
  var useAllowEdit = (ensureCapability = false) => {
5852
5959
  const { userMessage: { allowEdit = true } = {} } = useThreadConfig();
5853
5960
  const editSupported = useThread((t) => t.capabilities.edit);
@@ -5856,19 +5963,19 @@ var useAllowEdit = (ensureCapability = false) => {
5856
5963
  var UserActionBar = () => {
5857
5964
  const allowEdit = useAllowEdit(true);
5858
5965
  if (!allowEdit) return null;
5859
- return /* @__PURE__ */ jsx48(UserActionBarRoot, { hideWhenRunning: true, autohide: "not-last", children: /* @__PURE__ */ jsx48(UserActionBarEdit, {}) });
5966
+ return /* @__PURE__ */ jsx49(UserActionBarRoot, { hideWhenRunning: true, autohide: "not-last", children: /* @__PURE__ */ jsx49(UserActionBarEdit, {}) });
5860
5967
  };
5861
5968
  UserActionBar.displayName = "UserActionBar";
5862
5969
  var UserActionBarRoot = withDefaults(actionBar_exports.Root, {
5863
5970
  className: "aui-user-action-bar-root"
5864
5971
  });
5865
5972
  UserActionBarRoot.displayName = "UserActionBarRoot";
5866
- var UserActionBarEdit = forwardRef30((props, ref) => {
5973
+ var UserActionBarEdit = forwardRef31((props, ref) => {
5867
5974
  const {
5868
5975
  strings: { userMessage: { edit: { tooltip = "Edit" } = {} } = {} } = {}
5869
5976
  } = useThreadConfig();
5870
5977
  const allowEdit = useAllowEdit();
5871
- return /* @__PURE__ */ jsx48(actionBar_exports.Edit, { disabled: !allowEdit, asChild: true, children: /* @__PURE__ */ jsx48(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx48(PencilIcon, {}) }) });
5978
+ return /* @__PURE__ */ jsx49(actionBar_exports.Edit, { disabled: !allowEdit, asChild: true, children: /* @__PURE__ */ jsx49(TooltipIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx49(PencilIcon, {}) }) });
5872
5979
  });
5873
5980
  UserActionBarEdit.displayName = "UserActionBarEdit";
5874
5981
  var exports8 = {
@@ -5877,44 +5984,6 @@ var exports8 = {
5877
5984
  };
5878
5985
  var user_action_bar_default = Object.assign(UserActionBar, exports8);
5879
5986
 
5880
- // src/ui/user-message-attachment.tsx
5881
- import { jsx as jsx49, jsxs as jsxs11 } from "react/jsx-runtime";
5882
- var UserMessageAttachmentRoot = withDefaults(attachment_exports.Root, {
5883
- className: "aui-attachment-root"
5884
- });
5885
- UserMessageAttachmentRoot.displayName = "UserMessageAttachmentRoot";
5886
- var UserMessageAttachment = () => {
5887
- const typeLabel = useAttachment((a) => {
5888
- const type = a.type;
5889
- switch (type) {
5890
- case "image":
5891
- return "Image";
5892
- case "document":
5893
- return "Document";
5894
- case "file":
5895
- return "File";
5896
- default:
5897
- const _exhaustiveCheck = type;
5898
- throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);
5899
- }
5900
- });
5901
- return /* @__PURE__ */ jsxs11(UserMessageAttachmentRoot, { children: [
5902
- /* @__PURE__ */ jsx49(attachment_exports.unstable_Thumb, { className: "aui-attachment-thumb" }),
5903
- /* @__PURE__ */ jsxs11("div", { className: "aui-attachment-text", children: [
5904
- /* @__PURE__ */ jsx49("p", { className: "aui-attachment-name", children: /* @__PURE__ */ jsx49(attachment_exports.Name, {}) }),
5905
- /* @__PURE__ */ jsx49("p", { className: "aui-attachment-type", children: typeLabel })
5906
- ] })
5907
- ] });
5908
- };
5909
- UserMessageAttachment.displayName = "UserMessageAttachment";
5910
- var exports9 = {
5911
- Root: UserMessageAttachmentRoot
5912
- };
5913
- var user_message_attachment_default = Object.assign(
5914
- UserMessageAttachment,
5915
- exports9
5916
- );
5917
-
5918
5987
  // src/ui/user-message.tsx
5919
5988
  import { jsx as jsx50, jsxs as jsxs12 } from "react/jsx-runtime";
5920
5989
  var UserMessage = () => {
@@ -5935,7 +6004,7 @@ UserMessageRoot.displayName = "UserMessageRoot";
5935
6004
  var UserMessageContentWrapper = withDefaults("div", {
5936
6005
  className: "aui-user-message-content"
5937
6006
  });
5938
- var UserMessageContent = forwardRef31(({ components, ...props }, ref) => {
6007
+ var UserMessageContent = forwardRef32(({ components, ...props }, ref) => {
5939
6008
  return /* @__PURE__ */ jsx50(UserMessageContentWrapper, { ...props, ref, children: /* @__PURE__ */ jsx50(
5940
6009
  message_exports.Content,
5941
6010
  {
@@ -5958,20 +6027,20 @@ var UserMessageAttachments = ({
5958
6027
  {
5959
6028
  components: {
5960
6029
  ...components,
5961
- Attachment: components?.Attachment ?? user_message_attachment_default
6030
+ Attachment: components?.Attachment ?? attachment_default
5962
6031
  }
5963
6032
  }
5964
6033
  ) }) });
5965
6034
  };
5966
- var exports10 = {
6035
+ var exports9 = {
5967
6036
  Root: UserMessageRoot,
5968
6037
  Content: UserMessageContent,
5969
6038
  Attachments: UserMessageAttachments
5970
6039
  };
5971
- var user_message_default = Object.assign(UserMessage, exports10);
6040
+ var user_message_default = Object.assign(UserMessage, exports9);
5972
6041
 
5973
6042
  // src/ui/edit-composer.tsx
5974
- import { forwardRef as forwardRef32 } from "react";
6043
+ import { forwardRef as forwardRef33 } from "react";
5975
6044
  import { jsx as jsx51, jsxs as jsxs13 } from "react/jsx-runtime";
5976
6045
  var EditComposer = () => {
5977
6046
  return /* @__PURE__ */ jsxs13(EditComposerRoot, { children: [
@@ -5995,28 +6064,28 @@ var EditComposerFooter = withDefaults("div", {
5995
6064
  className: "aui-edit-composer-footer"
5996
6065
  });
5997
6066
  EditComposerFooter.displayName = "EditComposerFooter";
5998
- var EditComposerCancel = forwardRef32((props, ref) => {
6067
+ var EditComposerCancel = forwardRef33((props, ref) => {
5999
6068
  const {
6000
6069
  strings: { editComposer: { cancel: { label = "Cancel" } = {} } = {} } = {}
6001
6070
  } = useThreadConfig();
6002
6071
  return /* @__PURE__ */ jsx51(composer_exports.Cancel, { asChild: true, children: /* @__PURE__ */ jsx51(Button, { variant: "ghost", ...props, ref, children: props.children ?? label }) });
6003
6072
  });
6004
6073
  EditComposerCancel.displayName = "EditComposerCancel";
6005
- var EditComposerSend = forwardRef32((props, ref) => {
6074
+ var EditComposerSend = forwardRef33((props, ref) => {
6006
6075
  const {
6007
6076
  strings: { editComposer: { send: { label = "Send" } = {} } = {} } = {}
6008
6077
  } = useThreadConfig();
6009
6078
  return /* @__PURE__ */ jsx51(composer_exports.Send, { asChild: true, children: /* @__PURE__ */ jsx51(Button, { ...props, ref, children: props.children ?? label }) });
6010
6079
  });
6011
6080
  EditComposerSend.displayName = "EditComposerSend";
6012
- var exports11 = {
6081
+ var exports10 = {
6013
6082
  Root: EditComposerRoot,
6014
6083
  Input: EditComposerInput,
6015
6084
  Footer: EditComposerFooter,
6016
6085
  Cancel: EditComposerCancel,
6017
6086
  Send: EditComposerSend
6018
6087
  };
6019
- var edit_composer_default = Object.assign(EditComposer, exports11);
6088
+ var edit_composer_default = Object.assign(EditComposer, exports10);
6020
6089
 
6021
6090
  // src/ui/thread.tsx
6022
6091
  import { Fragment as Fragment7, jsx as jsx52, jsxs as jsxs14 } from "react/jsx-runtime";
@@ -6040,7 +6109,7 @@ var Thread = (config) => {
6040
6109
  var ThreadRootStyled = withDefaults(thread_exports.Root, {
6041
6110
  className: "aui-root aui-thread-root"
6042
6111
  });
6043
- var ThreadRoot = forwardRef33(
6112
+ var ThreadRoot = forwardRef34(
6044
6113
  ({ config, ...props }, ref) => {
6045
6114
  return /* @__PURE__ */ jsx52(ThreadConfigProvider, { config, children: /* @__PURE__ */ jsx52(ThreadRootStyled, { ...props, ref }) });
6046
6115
  }
@@ -6091,7 +6160,7 @@ var ThreadScrollToBottomIconButton = withDefaults(TooltipIconButton, {
6091
6160
  variant: "outline",
6092
6161
  className: "aui-thread-scroll-to-bottom"
6093
6162
  });
6094
- var ThreadScrollToBottom = forwardRef33((props, ref) => {
6163
+ var ThreadScrollToBottom = forwardRef34((props, ref) => {
6095
6164
  const {
6096
6165
  strings: {
6097
6166
  thread: { scrollToBottom: { tooltip = "Scroll to bottom" } = {} } = {}
@@ -6100,7 +6169,7 @@ var ThreadScrollToBottom = forwardRef33((props, ref) => {
6100
6169
  return /* @__PURE__ */ jsx52(thread_exports.ScrollToBottom, { asChild: true, children: /* @__PURE__ */ jsx52(ThreadScrollToBottomIconButton, { tooltip, ...props, ref, children: props.children ?? /* @__PURE__ */ jsx52(ArrowDownIcon, {}) }) });
6101
6170
  });
6102
6171
  ThreadScrollToBottom.displayName = "ThreadScrollToBottom";
6103
- var exports12 = {
6172
+ var exports11 = {
6104
6173
  Root: ThreadRoot,
6105
6174
  Viewport: ThreadViewport,
6106
6175
  Messages: ThreadMessages,
@@ -6108,7 +6177,7 @@ var exports12 = {
6108
6177
  ScrollToBottom: ThreadScrollToBottom,
6109
6178
  ViewportFooter: ThreadViewportFooter
6110
6179
  };
6111
- var thread_default = Object.assign(Thread, exports12);
6180
+ var thread_default = Object.assign(Thread, exports11);
6112
6181
 
6113
6182
  // src/ui/assistant-modal.tsx
6114
6183
  import { Fragment as Fragment8, jsx as jsx53, jsxs as jsxs15 } from "react/jsx-runtime";
@@ -6126,7 +6195,7 @@ var AssistantModalRoot = ({
6126
6195
  return /* @__PURE__ */ jsx53(ThreadConfigProvider, { config, children: /* @__PURE__ */ jsx53(assistantModal_exports.Root, { ...props }) });
6127
6196
  };
6128
6197
  AssistantModalRoot.displayName = "AssistantModalRoot";
6129
- var AssistantModalTrigger = forwardRef34((props, ref) => {
6198
+ var AssistantModalTrigger = forwardRef35((props, ref) => {
6130
6199
  return /* @__PURE__ */ jsx53(AssistantModalAnchor, { children: /* @__PURE__ */ jsx53(assistantModal_exports.Trigger, { asChild: true, children: /* @__PURE__ */ jsx53(AssistantModalButton, { ...props, ref }) }) });
6131
6200
  });
6132
6201
  AssistantModalTrigger.displayName = "AssistantModalTrigger";
@@ -6138,7 +6207,7 @@ var ModalButtonStyled = withDefaults(TooltipIconButton, {
6138
6207
  variant: "default",
6139
6208
  className: "aui-modal-button"
6140
6209
  });
6141
- var AssistantModalButton = forwardRef34(({ "data-state": state, ...rest }, ref) => {
6210
+ var AssistantModalButton = forwardRef35(({ "data-state": state, ...rest }, ref) => {
6142
6211
  const {
6143
6212
  strings: {
6144
6213
  assistantModal: {
@@ -6185,14 +6254,14 @@ var AssistantModalContent = withDefaults(assistantModal_exports.Content, {
6185
6254
  sideOffset: 16
6186
6255
  });
6187
6256
  AssistantModalContent.displayName = "AssistantModalContent";
6188
- var exports13 = {
6257
+ var exports12 = {
6189
6258
  Root: AssistantModalRoot,
6190
6259
  Trigger: AssistantModalTrigger,
6191
6260
  Content: AssistantModalContent,
6192
6261
  Button: AssistantModalButton,
6193
6262
  Anchor: AssistantModalAnchor
6194
6263
  };
6195
- var assistant_modal_default = Object.assign(AssistantModal, exports13);
6264
+ var assistant_modal_default = Object.assign(AssistantModal, exports12);
6196
6265
  export {
6197
6266
  actionBar_exports as ActionBarPrimitive,
6198
6267
  assistant_action_bar_default as AssistantActionBar,
@@ -6201,10 +6270,11 @@ export {
6201
6270
  assistantModal_exports as AssistantModalPrimitive,
6202
6271
  AssistantRuntimeProvider,
6203
6272
  attachment_exports as AttachmentPrimitive,
6273
+ attachment_default as AttachmentUI,
6204
6274
  branch_picker_default as BranchPicker,
6205
6275
  branchPicker_exports as BranchPickerPrimitive,
6206
6276
  composer_default as Composer,
6207
- composer_attachment_default as ComposerAttachment,
6277
+ attachment_default as ComposerAttachment,
6208
6278
  composer_exports as ComposerPrimitive,
6209
6279
  CompositeAttachmentAdapter,
6210
6280
  content_part_default as ContentPart,
@@ -6222,7 +6292,7 @@ export {
6222
6292
  thread_welcome_default as ThreadWelcome,
6223
6293
  user_action_bar_default as UserActionBar,
6224
6294
  user_message_default as UserMessage,
6225
- user_message_attachment_default as UserMessageAttachment,
6295
+ attachment_default as UserMessageAttachment,
6226
6296
  WebSpeechSynthesisAdapter,
6227
6297
  fromCoreMessage,
6228
6298
  fromCoreMessages,