@assistant-ui/react 0.5.14 → 0.5.16

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.d.mts CHANGED
@@ -245,6 +245,7 @@ declare class LocalThreadRuntime implements ThreadRuntime {
245
245
  cancel: true;
246
246
  copy: true;
247
247
  }>;
248
+ readonly isDisabled = false;
248
249
  get messages(): ThreadMessage[];
249
250
  get isRunning(): boolean;
250
251
  constructor(configProvider: ModelConfigProvider, adapter: ChatModelAdapter, options?: LocalRuntimeOptions | undefined);
@@ -564,8 +565,9 @@ type ExternalStoreMessageConverterAdapter<T> = {
564
565
  convertMessage: ExternalStoreMessageConverter<T>;
565
566
  };
566
567
  type ExternalStoreAdapterBase<T> = {
567
- threadId?: string;
568
- isRunning?: boolean;
568
+ threadId?: string | undefined;
569
+ isDisabled?: boolean | undefined;
570
+ isRunning?: boolean | undefined;
569
571
  messages: T[];
570
572
  setMessages?: ((messages: T[]) => void) | undefined;
571
573
  onNew: (message: AppendMessage) => Promise<void>;
@@ -656,7 +658,8 @@ declare class ExternalStoreThreadRuntime implements ReactThreadRuntime {
656
658
  cancel: boolean;
657
659
  copy: boolean;
658
660
  };
659
- messages: ThreadMessage[];
661
+ messages: any[];
662
+ isDisabled: boolean;
660
663
  isRunning: boolean;
661
664
  constructor(store: ExternalStoreAdapter<any>);
662
665
  getBranches(messageId: string): string[];
@@ -760,6 +763,7 @@ declare function useAssistantContext(options: {
760
763
 
761
764
  type ThreadState = Readonly<{
762
765
  isRunning: boolean;
766
+ isDisabled: boolean;
763
767
  }>;
764
768
 
765
769
  type ThreadViewportState = Readonly<{
@@ -932,6 +936,7 @@ declare const useThreadEmpty: () => boolean;
932
936
  type ThreadIfFilters = {
933
937
  empty: boolean | undefined;
934
938
  running: boolean | undefined;
939
+ disabled: boolean | undefined;
935
940
  };
936
941
  type UseThreadIfProps = RequireAtLeastOne<ThreadIfFilters>;
937
942
  declare const useThreadIf: (props: UseThreadIfProps) => boolean;
package/dist/index.d.ts CHANGED
@@ -245,6 +245,7 @@ declare class LocalThreadRuntime implements ThreadRuntime {
245
245
  cancel: true;
246
246
  copy: true;
247
247
  }>;
248
+ readonly isDisabled = false;
248
249
  get messages(): ThreadMessage[];
249
250
  get isRunning(): boolean;
250
251
  constructor(configProvider: ModelConfigProvider, adapter: ChatModelAdapter, options?: LocalRuntimeOptions | undefined);
@@ -564,8 +565,9 @@ type ExternalStoreMessageConverterAdapter<T> = {
564
565
  convertMessage: ExternalStoreMessageConverter<T>;
565
566
  };
566
567
  type ExternalStoreAdapterBase<T> = {
567
- threadId?: string;
568
- isRunning?: boolean;
568
+ threadId?: string | undefined;
569
+ isDisabled?: boolean | undefined;
570
+ isRunning?: boolean | undefined;
569
571
  messages: T[];
570
572
  setMessages?: ((messages: T[]) => void) | undefined;
571
573
  onNew: (message: AppendMessage) => Promise<void>;
@@ -656,7 +658,8 @@ declare class ExternalStoreThreadRuntime implements ReactThreadRuntime {
656
658
  cancel: boolean;
657
659
  copy: boolean;
658
660
  };
659
- messages: ThreadMessage[];
661
+ messages: any[];
662
+ isDisabled: boolean;
660
663
  isRunning: boolean;
661
664
  constructor(store: ExternalStoreAdapter<any>);
662
665
  getBranches(messageId: string): string[];
@@ -760,6 +763,7 @@ declare function useAssistantContext(options: {
760
763
 
761
764
  type ThreadState = Readonly<{
762
765
  isRunning: boolean;
766
+ isDisabled: boolean;
763
767
  }>;
764
768
 
765
769
  type ThreadViewportState = Readonly<{
@@ -932,6 +936,7 @@ declare const useThreadEmpty: () => boolean;
932
936
  type ThreadIfFilters = {
933
937
  empty: boolean | undefined;
934
938
  running: boolean | undefined;
939
+ disabled: boolean | undefined;
935
940
  };
936
941
  type UseThreadIfProps = RequireAtLeastOne<ThreadIfFilters>;
937
942
  declare const useThreadIf: (props: UseThreadIfProps) => boolean;
package/dist/index.js CHANGED
@@ -304,6 +304,7 @@ var makeComposerStore = (useThreadMessages, useThreadActions) => {
304
304
  var import_zustand4 = require("zustand");
305
305
  var makeThreadStore = (runtimeRef) => {
306
306
  return (0, import_zustand4.create)(() => ({
307
+ isDisabled: runtimeRef.getState().isDisabled,
307
308
  isRunning: runtimeRef.getState().isRunning
308
309
  }));
309
310
  };
@@ -402,10 +403,12 @@ var ThreadProvider = ({
402
403
  (0, import_react4.useCallback)(
403
404
  (thread) => {
404
405
  const onThreadUpdate = () => {
405
- if (thread.isRunning !== context.useThread.getState().isRunning) {
406
+ const threadState = context.useThread.getState();
407
+ if (thread.isRunning !== threadState.isRunning || thread.isDisabled !== threadState.isDisabled) {
406
408
  context.useThread.setState(
407
409
  Object.freeze({
408
- isRunning: thread.isRunning
410
+ isRunning: thread.isRunning,
411
+ isDisabled: thread.isDisabled
409
412
  }),
410
413
  true
411
414
  );
@@ -716,7 +719,7 @@ var useActionBarReload = () => {
716
719
  const { useMessage } = useMessageContext();
717
720
  const disabled = useCombinedStore(
718
721
  [useThread, useMessage],
719
- (t, m) => t.isRunning || m.message.role !== "assistant"
722
+ (t, m) => t.isRunning || t.isDisabled || m.message.role !== "assistant"
720
723
  );
721
724
  const callback = (0, import_react19.useCallback)(() => {
722
725
  const { parentId } = useMessage.getState();
@@ -802,9 +805,16 @@ var useComposerIf = (props) => {
802
805
  // src/primitive-hooks/composer/useComposerSend.tsx
803
806
  var import_react23 = require("react");
804
807
  var useComposerSend = () => {
805
- const { useViewport, useComposer: useNewComposer } = useThreadContext();
808
+ const {
809
+ useThread,
810
+ useViewport,
811
+ useComposer: useNewComposer
812
+ } = useThreadContext();
806
813
  const { useComposer } = useComposerContext();
807
- const disabled = useComposer((c) => !c.isEditing || c.value.length === 0);
814
+ const disabled = useCombinedStore(
815
+ [useThread, useComposer],
816
+ (t, c) => t.isDisabled || t.isRunning || !c.isEditing || c.value.length === 0
817
+ );
808
818
  const callback = (0, import_react23.useCallback)(() => {
809
819
  const composerState = useComposer.getState();
810
820
  if (!composerState.isEditing) return;
@@ -883,6 +893,8 @@ var useThreadIf = (props) => {
883
893
  if (props.empty === false && messages.length === 0) return false;
884
894
  if (props.running === true && !thread.isRunning) return false;
885
895
  if (props.running === false && thread.isRunning) return false;
896
+ if (props.disabled === true && thread.isDisabled) return false;
897
+ if (props.disabled === false && thread.isDisabled) return false;
886
898
  return true;
887
899
  }
888
900
  );
@@ -914,7 +926,7 @@ var useThreadSuggestion = ({
914
926
  }) => {
915
927
  const { useThread, useComposer } = useThreadContext();
916
928
  const append = useAppendMessage();
917
- const disabled = useThread((t) => t.isRunning);
929
+ const disabled = useThread((t) => t.isDisabled);
918
930
  const callback = (0, import_react25.useCallback)(() => {
919
931
  const thread = useThread.getState();
920
932
  const composer = useComposer.getState();
@@ -1597,7 +1609,14 @@ var import_react_textarea_autosize = __toESM(require("react-textarea-autosize"))
1597
1609
  var import_react_use_escape_keydown = require("@radix-ui/react-use-escape-keydown");
1598
1610
  var import_jsx_runtime19 = require("react/jsx-runtime");
1599
1611
  var ComposerPrimitiveInput = (0, import_react41.forwardRef)(
1600
- ({ autoFocus = false, asChild, disabled, onChange, onKeyDown, ...rest }, forwardedRef) => {
1612
+ ({
1613
+ autoFocus = false,
1614
+ asChild,
1615
+ disabled: disabledProp,
1616
+ onChange,
1617
+ onKeyDown,
1618
+ ...rest
1619
+ }, forwardedRef) => {
1601
1620
  const { useThread } = useThreadContext();
1602
1621
  const { useComposer, type } = useComposerContext();
1603
1622
  const value = useComposer((c) => {
@@ -1605,6 +1624,7 @@ var ComposerPrimitiveInput = (0, import_react41.forwardRef)(
1605
1624
  return c.value;
1606
1625
  });
1607
1626
  const Component = asChild ? import_react_slot.Slot : import_react_textarea_autosize.default;
1627
+ const isDisabled = useThread((t) => t.isDisabled) ?? disabledProp ?? false;
1608
1628
  const textareaRef = (0, import_react41.useRef)(null);
1609
1629
  const ref = (0, import_react_compose_refs2.useComposedRefs)(forwardedRef, textareaRef);
1610
1630
  (0, import_react_use_escape_keydown.useEscapeKeydown)((e) => {
@@ -1615,7 +1635,7 @@ var ComposerPrimitiveInput = (0, import_react41.forwardRef)(
1615
1635
  }
1616
1636
  });
1617
1637
  const handleKeyPress = (e) => {
1618
- if (disabled) return;
1638
+ if (isDisabled) return;
1619
1639
  if (e.key === "Enter" && e.shiftKey === false) {
1620
1640
  const isRunning = useThread.getState().isRunning;
1621
1641
  if (!isRunning) {
@@ -1624,7 +1644,7 @@ var ComposerPrimitiveInput = (0, import_react41.forwardRef)(
1624
1644
  }
1625
1645
  }
1626
1646
  };
1627
- const autoFocusEnabled = autoFocus && !disabled;
1647
+ const autoFocusEnabled = autoFocus && !isDisabled;
1628
1648
  const focus = (0, import_react41.useCallback)(() => {
1629
1649
  const textarea = textareaRef.current;
1630
1650
  if (!textarea || !autoFocusEnabled) return;
@@ -1647,7 +1667,7 @@ var ComposerPrimitiveInput = (0, import_react41.forwardRef)(
1647
1667
  value,
1648
1668
  ...rest,
1649
1669
  ref,
1650
- disabled,
1670
+ disabled: isDisabled,
1651
1671
  onChange: (0, import_primitive5.composeEventHandlers)(onChange, (e) => {
1652
1672
  const composerState = useComposer.getState();
1653
1673
  if (!composerState.isEditing) return;
@@ -3475,6 +3495,7 @@ var LocalThreadRuntime = class {
3475
3495
  abortController = null;
3476
3496
  repository = new MessageRepository();
3477
3497
  capabilities = CAPABILITIES;
3498
+ isDisabled = false;
3478
3499
  get messages() {
3479
3500
  return this.repository.getMessages();
3480
3501
  }
@@ -3688,7 +3709,6 @@ var AUTO_STATUS_COMPLETE = Object.freeze({
3688
3709
  type: "complete",
3689
3710
  reason: "unknown"
3690
3711
  });
3691
- var isAutoStatus = (status) => status === AUTO_STATUS_RUNNING || status === AUTO_STATUS_COMPLETE;
3692
3712
  var getAutoStatus = (isLast, isRunning) => isLast && isRunning ? AUTO_STATUS_RUNNING : AUTO_STATUS_COMPLETE;
3693
3713
 
3694
3714
  // src/runtimes/external-store/ThreadMessageLike.tsx
@@ -3772,9 +3792,8 @@ var useExternalStoreSync = (adapter, updateData) => {
3772
3792
  adapterRef.current.messages.at(-1) === m,
3773
3793
  adapterRef.current.isRunning ?? false
3774
3794
  );
3775
- if (cache && (cache.role !== "assistant" || !isAutoStatus(cache.status) || cache.status.type === autoStatus.type))
3795
+ if (cache && (cache.role !== "assistant" || cache.status === autoStatus))
3776
3796
  return cache;
3777
- if (cache) return cache;
3778
3797
  const newMessage = fromThreadMessageLike(
3779
3798
  converter2(m, idx),
3780
3799
  idx.toString(),
@@ -3787,6 +3806,7 @@ var useExternalStoreSync = (adapter, updateData) => {
3787
3806
  }, [adapter.convertMessage]);
3788
3807
  (0, import_react55.useEffect)(() => {
3789
3808
  updateData(
3809
+ adapter.isDisabled ?? false,
3790
3810
  adapter.isRunning ?? false,
3791
3811
  converter.convertMessages(adapter.messages, convertCallback)
3792
3812
  );
@@ -3794,8 +3814,9 @@ var useExternalStoreSync = (adapter, updateData) => {
3794
3814
  updateData,
3795
3815
  converter,
3796
3816
  convertCallback,
3797
- adapter.messages,
3798
- adapter.isRunning
3817
+ adapter.isDisabled,
3818
+ adapter.isRunning,
3819
+ adapter.messages
3799
3820
  ]);
3800
3821
  };
3801
3822
 
@@ -3806,6 +3827,9 @@ var hasUpcomingMessage = (isRunning, messages) => {
3806
3827
  var ExternalStoreThreadRuntime = class {
3807
3828
  constructor(store) {
3808
3829
  this.store = store;
3830
+ this.isDisabled = store.isDisabled ?? false;
3831
+ this.isRunning = store.isRunning ?? false;
3832
+ this.messages = store.messages;
3809
3833
  this.useStore = (0, import_zustand14.create)(() => ({
3810
3834
  store
3811
3835
  }));
@@ -3823,8 +3847,9 @@ var ExternalStoreThreadRuntime = class {
3823
3847
  copy: this.store.onCopy !== null
3824
3848
  };
3825
3849
  }
3826
- messages = [];
3827
- isRunning = false;
3850
+ messages;
3851
+ isDisabled;
3852
+ isRunning;
3828
3853
  getBranches(messageId) {
3829
3854
  return this.repository.getBranches(messageId);
3830
3855
  }
@@ -3875,7 +3900,7 @@ var ExternalStoreThreadRuntime = class {
3875
3900
  this.useStore.setState({ store: this.store });
3876
3901
  }
3877
3902
  }
3878
- updateData = (isRunning, vm) => {
3903
+ updateData = (isDisabled, isRunning, vm) => {
3879
3904
  for (let i = 0; i < vm.length; i++) {
3880
3905
  const message = vm[i];
3881
3906
  const parent = vm[i - 1];
@@ -3898,6 +3923,7 @@ var ExternalStoreThreadRuntime = class {
3898
3923
  this.assistantOptimisticId ?? vm.at(-1)?.id ?? null
3899
3924
  );
3900
3925
  this.messages = this.repository.getMessages();
3926
+ this.isDisabled = isDisabled;
3901
3927
  this.isRunning = isRunning;
3902
3928
  for (const callback of this._subscriptions) callback();
3903
3929
  };