@assistant-ui/react 0.5.15 → 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);
@@ -565,6 +566,7 @@ type ExternalStoreMessageConverterAdapter<T> = {
565
566
  };
566
567
  type ExternalStoreAdapterBase<T> = {
567
568
  threadId?: string | undefined;
569
+ isDisabled?: boolean | undefined;
568
570
  isRunning?: boolean | undefined;
569
571
  messages: T[];
570
572
  setMessages?: ((messages: T[]) => void) | undefined;
@@ -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);
@@ -565,6 +566,7 @@ type ExternalStoreMessageConverterAdapter<T> = {
565
566
  };
566
567
  type ExternalStoreAdapterBase<T> = {
567
568
  threadId?: string | undefined;
569
+ isDisabled?: boolean | undefined;
568
570
  isRunning?: boolean | undefined;
569
571
  messages: T[];
570
572
  setMessages?: ((messages: T[]) => void) | undefined;
@@ -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
  }
@@ -3785,6 +3806,7 @@ var useExternalStoreSync = (adapter, updateData) => {
3785
3806
  }, [adapter.convertMessage]);
3786
3807
  (0, import_react55.useEffect)(() => {
3787
3808
  updateData(
3809
+ adapter.isDisabled ?? false,
3788
3810
  adapter.isRunning ?? false,
3789
3811
  converter.convertMessages(adapter.messages, convertCallback)
3790
3812
  );
@@ -3792,8 +3814,9 @@ var useExternalStoreSync = (adapter, updateData) => {
3792
3814
  updateData,
3793
3815
  converter,
3794
3816
  convertCallback,
3795
- adapter.messages,
3796
- adapter.isRunning
3817
+ adapter.isDisabled,
3818
+ adapter.isRunning,
3819
+ adapter.messages
3797
3820
  ]);
3798
3821
  };
3799
3822
 
@@ -3804,6 +3827,9 @@ var hasUpcomingMessage = (isRunning, messages) => {
3804
3827
  var ExternalStoreThreadRuntime = class {
3805
3828
  constructor(store) {
3806
3829
  this.store = store;
3830
+ this.isDisabled = store.isDisabled ?? false;
3831
+ this.isRunning = store.isRunning ?? false;
3832
+ this.messages = store.messages;
3807
3833
  this.useStore = (0, import_zustand14.create)(() => ({
3808
3834
  store
3809
3835
  }));
@@ -3821,8 +3847,9 @@ var ExternalStoreThreadRuntime = class {
3821
3847
  copy: this.store.onCopy !== null
3822
3848
  };
3823
3849
  }
3824
- messages = [];
3825
- isRunning = false;
3850
+ messages;
3851
+ isDisabled;
3852
+ isRunning;
3826
3853
  getBranches(messageId) {
3827
3854
  return this.repository.getBranches(messageId);
3828
3855
  }
@@ -3873,7 +3900,7 @@ var ExternalStoreThreadRuntime = class {
3873
3900
  this.useStore.setState({ store: this.store });
3874
3901
  }
3875
3902
  }
3876
- updateData = (isRunning, vm) => {
3903
+ updateData = (isDisabled, isRunning, vm) => {
3877
3904
  for (let i = 0; i < vm.length; i++) {
3878
3905
  const message = vm[i];
3879
3906
  const parent = vm[i - 1];
@@ -3896,6 +3923,7 @@ var ExternalStoreThreadRuntime = class {
3896
3923
  this.assistantOptimisticId ?? vm.at(-1)?.id ?? null
3897
3924
  );
3898
3925
  this.messages = this.repository.getMessages();
3926
+ this.isDisabled = isDisabled;
3899
3927
  this.isRunning = isRunning;
3900
3928
  for (const callback of this._subscriptions) callback();
3901
3929
  };