@assistant-ui/mcp-docs-server 0.1.15 → 0.1.17

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.
Files changed (55) hide show
  1. package/.docs/organized/code-examples/store-example.md +249 -147
  2. package/.docs/organized/code-examples/with-ag-ui.md +250 -186
  3. package/.docs/organized/code-examples/with-ai-sdk-v5.md +250 -199
  4. package/.docs/organized/code-examples/with-assistant-transport.md +195 -243
  5. package/.docs/organized/code-examples/with-cloud.md +277 -226
  6. package/.docs/organized/code-examples/with-custom-thread-list.md +1855 -0
  7. package/.docs/organized/code-examples/with-external-store.md +246 -180
  8. package/.docs/organized/code-examples/with-ffmpeg.md +255 -189
  9. package/.docs/organized/code-examples/with-langgraph.md +293 -242
  10. package/.docs/organized/code-examples/with-parent-id-grouping.md +243 -263
  11. package/.docs/organized/code-examples/with-react-hook-form.md +262 -196
  12. package/.docs/organized/code-examples/with-tanstack.md +1578 -0
  13. package/.docs/raw/blog/2024-07-29-hello/index.mdx +2 -2
  14. package/.docs/raw/docs/api-reference/overview.mdx +6 -6
  15. package/.docs/raw/docs/api-reference/primitives/ActionBar.mdx +85 -4
  16. package/.docs/raw/docs/api-reference/primitives/AssistantIf.mdx +200 -0
  17. package/.docs/raw/docs/api-reference/primitives/Composer.mdx +0 -20
  18. package/.docs/raw/docs/api-reference/primitives/Message.mdx +0 -45
  19. package/.docs/raw/docs/api-reference/primitives/Thread.mdx +0 -50
  20. package/.docs/raw/docs/cloud/persistence/ai-sdk.mdx +2 -3
  21. package/.docs/raw/docs/cloud/persistence/langgraph.mdx +2 -3
  22. package/.docs/raw/docs/devtools.mdx +2 -3
  23. package/.docs/raw/docs/getting-started.mdx +36 -1102
  24. package/.docs/raw/docs/guides/Attachments.mdx +3 -25
  25. package/.docs/raw/docs/guides/Branching.mdx +1 -1
  26. package/.docs/raw/docs/guides/Speech.mdx +1 -1
  27. package/.docs/raw/docs/guides/ToolUI.mdx +1 -1
  28. package/.docs/raw/docs/legacy/styled/AssistantModal.mdx +2 -3
  29. package/.docs/raw/docs/legacy/styled/Decomposition.mdx +6 -5
  30. package/.docs/raw/docs/legacy/styled/Markdown.mdx +2 -3
  31. package/.docs/raw/docs/legacy/styled/Thread.mdx +2 -3
  32. package/.docs/raw/docs/react-compatibility.mdx +2 -5
  33. package/.docs/raw/docs/runtimes/ai-sdk/use-chat.mdx +3 -4
  34. package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +3 -6
  35. package/.docs/raw/docs/runtimes/custom/external-store.mdx +2 -3
  36. package/.docs/raw/docs/runtimes/custom/local.mdx +11 -41
  37. package/.docs/raw/docs/runtimes/data-stream.mdx +15 -11
  38. package/.docs/raw/docs/runtimes/langgraph/index.mdx +3 -3
  39. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-2.mdx +1 -1
  40. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-3.mdx +2 -3
  41. package/.docs/raw/docs/runtimes/langserve.mdx +2 -3
  42. package/.docs/raw/docs/runtimes/mastra/full-stack-integration.mdx +2 -3
  43. package/.docs/raw/docs/runtimes/mastra/separate-server-integration.mdx +2 -3
  44. package/.docs/raw/docs/ui/AssistantModal.mdx +3 -25
  45. package/.docs/raw/docs/ui/AssistantSidebar.mdx +2 -24
  46. package/.docs/raw/docs/ui/Attachment.mdx +3 -25
  47. package/.docs/raw/docs/ui/Markdown.mdx +2 -24
  48. package/.docs/raw/docs/ui/Mermaid.mdx +2 -24
  49. package/.docs/raw/docs/ui/Reasoning.mdx +2 -24
  50. package/.docs/raw/docs/ui/Scrollbar.mdx +4 -6
  51. package/.docs/raw/docs/ui/SyntaxHighlighting.mdx +3 -47
  52. package/.docs/raw/docs/ui/Thread.mdx +38 -53
  53. package/.docs/raw/docs/ui/ThreadList.mdx +4 -47
  54. package/.docs/raw/docs/ui/ToolFallback.mdx +2 -24
  55. package/package.json +6 -7
@@ -341,16 +341,16 @@ const AttachmentPreviewDialog: FC<PropsWithChildren> = ({ children }) => {
341
341
  return (
342
342
  <Dialog>
343
343
  <DialogTrigger
344
- className="aui-attachment-preview-trigger hover:bg-accent/50 cursor-pointer transition-colors"
344
+ className="aui-attachment-preview-trigger cursor-pointer transition-colors hover:bg-accent/50"
345
345
  asChild
346
346
  >
347
347
  {children}
348
348
  </DialogTrigger>
349
- <DialogContent className="aui-attachment-preview-dialog-content [&_svg]:text-background [&>button]:bg-foreground/60 [&>button]:hover:[&_svg]:text-destructive p-2 sm:max-w-3xl [&>button]:rounded-full [&>button]:p-1 [&>button]:opacity-100 [&>button]:!ring-0">
349
+ <DialogContent className="aui-attachment-preview-dialog-content p-2 sm:max-w-3xl [&>button]:rounded-full [&>button]:bg-foreground/60 [&>button]:p-1 [&>button]:opacity-100 [&>button]:ring-0! [&_svg]:text-background [&>button]:hover:[&_svg]:text-destructive">
350
350
  <DialogTitle className="aui-sr-only sr-only">
351
351
  Image Attachment Preview
352
352
  </DialogTitle>
353
- <div className="aui-attachment-preview bg-background relative mx-auto flex max-h-[80dvh] w-full items-center justify-center overflow-hidden">
353
+ <div className="aui-attachment-preview relative mx-auto flex max-h-[80dvh] w-full items-center justify-center overflow-hidden bg-background">
354
354
  <AttachmentPreview src={src} />
355
355
  </div>
356
356
  </DialogContent>
@@ -372,7 +372,7 @@ const AttachmentThumb: FC = () => {
372
372
  className="aui-attachment-tile-image object-cover"
373
373
  />
374
374
  <AvatarFallback delayMs={isImage ? 200 : 0}>
375
- <FileText className="aui-attachment-tile-fallback-icon text-muted-foreground size-8" />
375
+ <FileText className="aui-attachment-tile-fallback-icon size-8 text-muted-foreground" />
376
376
  </AvatarFallback>
377
377
  </Avatar>
378
378
  );
@@ -413,7 +413,7 @@ const AttachmentUI: FC = () => {
413
413
  <TooltipTrigger asChild>
414
414
  <div
415
415
  className={cn(
416
- "aui-attachment-tile bg-muted size-14 cursor-pointer overflow-hidden rounded-[14px] border transition-opacity hover:opacity-75",
416
+ "aui-attachment-tile size-14 cursor-pointer overflow-hidden rounded-[14px] border bg-muted transition-opacity hover:opacity-75",
417
417
  isComposer &&
418
418
  "aui-attachment-tile-composer border-foreground/20",
419
419
  )}
@@ -439,7 +439,7 @@ const AttachmentRemove: FC = () => {
439
439
  <AttachmentPrimitive.Remove asChild>
440
440
  <TooltipIconButton
441
441
  tooltip="Remove file"
442
- className="aui-attachment-tile-remove text-muted-foreground hover:[&_svg]:text-destructive absolute top-1.5 right-1.5 size-3.5 rounded-full bg-white opacity-100 shadow-sm hover:!bg-white [&_svg]:text-black"
442
+ className="aui-attachment-tile-remove absolute top-1.5 right-1.5 size-3.5 rounded-full bg-white text-muted-foreground opacity-100 shadow-sm hover:bg-white! [&_svg]:text-black hover:[&_svg]:text-destructive"
443
443
  side="top"
444
444
  >
445
445
  <XIcon className="aui-attachment-remove-icon size-3 dark:stroke-[2.5px]" />
@@ -474,7 +474,7 @@ export const ComposerAddAttachment: FC = () => {
474
474
  side="bottom"
475
475
  variant="ghost"
476
476
  size="icon"
477
- className="aui-composer-add-attachment hover:bg-muted-foreground/15 dark:border-muted-foreground/15 dark:hover:bg-muted-foreground/30 size-[34px] rounded-full p-1 text-xs font-semibold"
477
+ className="aui-composer-add-attachment size-[34px] rounded-full p-1 font-semibold text-xs hover:bg-muted-foreground/15 dark:border-muted-foreground/15 dark:hover:bg-muted-foreground/30"
478
478
  aria-label="Add Attachment"
479
479
  >
480
480
  <PlusIcon className="aui-attachment-add-icon size-5 stroke-[1.5px]" />
@@ -525,7 +525,7 @@ const CodeHeader: FC<CodeHeaderProps> = ({ language, code }) => {
525
525
  };
526
526
 
527
527
  return (
528
- <div className="aui-code-header-root bg-muted-foreground/15 text-foreground dark:bg-muted-foreground/20 mt-4 flex items-center justify-between gap-4 rounded-t-lg px-4 py-2 text-sm font-semibold">
528
+ <div className="aui-code-header-root mt-4 flex items-center justify-between gap-4 rounded-t-lg bg-muted-foreground/15 px-4 py-2 font-semibold text-foreground text-sm dark:bg-muted-foreground/20">
529
529
  <span className="aui-code-header-language lowercase [&>span]:text-xs">
530
530
  {language}
531
531
  </span>
@@ -560,7 +560,7 @@ const defaultComponents = memoizeMarkdownComponents({
560
560
  h1: ({ className, ...props }) => (
561
561
  <h1
562
562
  className={cn(
563
- "aui-md-h1 mb-8 scroll-m-20 text-4xl font-extrabold tracking-tight last:mb-0",
563
+ "aui-md-h1 mb-8 scroll-m-20 font-extrabold text-4xl tracking-tight last:mb-0",
564
564
  className,
565
565
  )}
566
566
  {...props}
@@ -569,7 +569,7 @@ const defaultComponents = memoizeMarkdownComponents({
569
569
  h2: ({ className, ...props }) => (
570
570
  <h2
571
571
  className={cn(
572
- "aui-md-h2 mt-8 mb-4 scroll-m-20 text-3xl font-semibold tracking-tight first:mt-0 last:mb-0",
572
+ "aui-md-h2 mt-8 mb-4 scroll-m-20 font-semibold text-3xl tracking-tight first:mt-0 last:mb-0",
573
573
  className,
574
574
  )}
575
575
  {...props}
@@ -578,7 +578,7 @@ const defaultComponents = memoizeMarkdownComponents({
578
578
  h3: ({ className, ...props }) => (
579
579
  <h3
580
580
  className={cn(
581
- "aui-md-h3 mt-6 mb-4 scroll-m-20 text-2xl font-semibold tracking-tight first:mt-0 last:mb-0",
581
+ "aui-md-h3 mt-6 mb-4 scroll-m-20 font-semibold text-2xl tracking-tight first:mt-0 last:mb-0",
582
582
  className,
583
583
  )}
584
584
  {...props}
@@ -587,7 +587,7 @@ const defaultComponents = memoizeMarkdownComponents({
587
587
  h4: ({ className, ...props }) => (
588
588
  <h4
589
589
  className={cn(
590
- "aui-md-h4 mt-6 mb-4 scroll-m-20 text-xl font-semibold tracking-tight first:mt-0 last:mb-0",
590
+ "aui-md-h4 mt-6 mb-4 scroll-m-20 font-semibold text-xl tracking-tight first:mt-0 last:mb-0",
591
591
  className,
592
592
  )}
593
593
  {...props}
@@ -596,7 +596,7 @@ const defaultComponents = memoizeMarkdownComponents({
596
596
  h5: ({ className, ...props }) => (
597
597
  <h5
598
598
  className={cn(
599
- "aui-md-h5 my-4 text-lg font-semibold first:mt-0 last:mb-0",
599
+ "aui-md-h5 my-4 font-semibold text-lg first:mt-0 last:mb-0",
600
600
  className,
601
601
  )}
602
602
  {...props}
@@ -623,7 +623,7 @@ const defaultComponents = memoizeMarkdownComponents({
623
623
  a: ({ className, ...props }) => (
624
624
  <a
625
625
  className={cn(
626
- "aui-md-a text-primary font-medium underline underline-offset-4",
626
+ "aui-md-a font-medium text-primary underline underline-offset-4",
627
627
  className,
628
628
  )}
629
629
  {...props}
@@ -662,7 +662,7 @@ const defaultComponents = memoizeMarkdownComponents({
662
662
  th: ({ className, ...props }) => (
663
663
  <th
664
664
  className={cn(
665
- "aui-md-th bg-muted px-4 py-2 text-left font-bold first:rounded-tl-lg last:rounded-tr-lg [&[align=center]]:text-center [&[align=right]]:text-right",
665
+ "aui-md-th bg-muted px-4 py-2 text-left font-bold first:rounded-tl-lg last:rounded-tr-lg [[align=center]]:text-center [[align=right]]:text-right",
666
666
  className,
667
667
  )}
668
668
  {...props}
@@ -671,7 +671,7 @@ const defaultComponents = memoizeMarkdownComponents({
671
671
  td: ({ className, ...props }) => (
672
672
  <td
673
673
  className={cn(
674
- "aui-md-td border-b border-l px-4 py-2 text-left last:border-r [&[align=center]]:text-center [&[align=right]]:text-right",
674
+ "aui-md-td border-b border-l px-4 py-2 text-left last:border-r [[align=center]]:text-center [[align=right]]:text-right",
675
675
  className,
676
676
  )}
677
677
  {...props}
@@ -695,7 +695,7 @@ const defaultComponents = memoizeMarkdownComponents({
695
695
  pre: ({ className, ...props }) => (
696
696
  <pre
697
697
  className={cn(
698
- "aui-md-pre overflow-x-auto !rounded-t-none rounded-b-lg bg-black p-4 text-white",
698
+ "aui-md-pre overflow-x-auto rounded-t-none! rounded-b-lg bg-black p-4 text-white",
699
699
  className,
700
700
  )}
701
701
  {...props}
@@ -707,7 +707,7 @@ const defaultComponents = memoizeMarkdownComponents({
707
707
  <code
708
708
  className={cn(
709
709
  !isCodeBlock &&
710
- "aui-md-inline-code bg-muted rounded border font-semibold",
710
+ "aui-md-inline-code rounded border bg-muted font-semibold",
711
711
  className,
712
712
  )}
713
713
  {...props}
@@ -722,59 +722,67 @@ const defaultComponents = memoizeMarkdownComponents({
722
722
  ## components/assistant-ui/thread.tsx
723
723
 
724
724
  ```tsx
725
+ import {
726
+ ComposerAddAttachment,
727
+ ComposerAttachments,
728
+ UserMessageAttachments,
729
+ } from "@/components/assistant-ui/attachment";
730
+ import { MarkdownText } from "@/components/assistant-ui/markdown-text";
731
+ import { ToolFallback } from "@/components/assistant-ui/tool-fallback";
732
+ import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button";
733
+ import { Button } from "@/components/ui/button";
734
+ import { cn } from "@/lib/utils";
725
735
  import {
726
736
  ActionBarPrimitive,
737
+ AssistantIf,
727
738
  BranchPickerPrimitive,
728
739
  ComposerPrimitive,
729
740
  ErrorPrimitive,
730
741
  MessagePrimitive,
731
742
  ThreadPrimitive,
732
743
  } from "@assistant-ui/react";
733
- import type { FC } from "react";
734
744
  import {
735
745
  ArrowDownIcon,
746
+ ArrowUpIcon,
736
747
  CheckIcon,
737
748
  ChevronLeftIcon,
738
749
  ChevronRightIcon,
739
750
  CopyIcon,
751
+ DownloadIcon,
740
752
  PencilIcon,
741
753
  RefreshCwIcon,
742
- SendHorizontalIcon,
754
+ SquareIcon,
743
755
  } from "lucide-react";
744
- import { cn } from "@/lib/utils";
745
-
746
- import { Button } from "@/components/ui/button";
747
- import { MarkdownText } from "@/components/assistant-ui/markdown-text";
748
- import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button";
749
- import { ToolFallback } from "./tool-fallback";
756
+ import type { FC } from "react";
750
757
 
751
758
  export const Thread: FC = () => {
752
759
  return (
753
760
  <ThreadPrimitive.Root
754
- className="text-foreground bg-background box-border flex h-full flex-col overflow-hidden"
761
+ className="aui-root aui-thread-root @container flex h-full flex-col bg-background"
755
762
  style={{
756
- ["--thread-max-width" as string]: "42rem",
763
+ ["--thread-max-width" as string]: "44rem",
757
764
  }}
758
765
  >
759
- <ThreadPrimitive.Viewport className="flex h-full flex-col items-center overflow-y-scroll scroll-smooth bg-inherit px-4 pt-8">
760
- <ThreadWelcome />
766
+ <ThreadPrimitive.Viewport
767
+ turnAnchor="top"
768
+ className="aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll scroll-smooth px-4 pt-4"
769
+ >
770
+ <AssistantIf condition={({ thread }) => thread.isEmpty}>
771
+ <ThreadWelcome />
772
+ </AssistantIf>
761
773
 
762
774
  <ThreadPrimitive.Messages
763
775
  components={{
764
- UserMessage: UserMessage,
765
- EditComposer: EditComposer,
766
- AssistantMessage: AssistantMessage,
776
+ UserMessage,
777
+ EditComposer,
778
+ AssistantMessage,
767
779
  }}
768
780
  />
769
781
 
770
- <ThreadPrimitive.If empty={false}>
771
- <div className="min-h-8 flex-grow" />
772
- </ThreadPrimitive.If>
773
-
774
- <div className="sticky bottom-0 mt-3 flex w-full max-w-[var(--thread-max-width)] flex-col items-center justify-end rounded-t-lg bg-inherit pb-4">
782
+ <ThreadPrimitive.ViewportFooter className="aui-thread-viewport-footer sticky bottom-0 mx-auto mt-auto flex w-full max-w-(--thread-max-width) flex-col gap-4 overflow-visible rounded-t-3xl bg-background pb-4 md:pb-6">
775
783
  <ThreadScrollToBottom />
776
784
  <Composer />
777
- </div>
785
+ </ThreadPrimitive.ViewportFooter>
778
786
  </ThreadPrimitive.Viewport>
779
787
  </ThreadPrimitive.Root>
780
788
  );
@@ -786,7 +794,7 @@ const ThreadScrollToBottom: FC = () => {
786
794
  <TooltipIconButton
787
795
  tooltip="Scroll to bottom"
788
796
  variant="outline"
789
- className="absolute -top-8 rounded-full disabled:invisible"
797
+ className="aui-thread-scroll-to-bottom -top-12 absolute z-10 self-center rounded-full p-4 disabled:invisible dark:bg-background dark:hover:bg-accent"
790
798
  >
791
799
  <ArrowDownIcon />
792
800
  </TooltipIconButton>
@@ -796,179 +804,177 @@ const ThreadScrollToBottom: FC = () => {
796
804
 
797
805
  const ThreadWelcome: FC = () => {
798
806
  return (
799
- <ThreadPrimitive.Empty>
800
- <div className="flex w-full max-w-[var(--thread-max-width)] flex-grow flex-col">
801
- <div className="flex w-full flex-grow flex-col items-center justify-center">
802
- <p className="mt-4 font-medium">How can I help you today?</p>
807
+ <div className="aui-thread-welcome-root mx-auto my-auto flex w-full max-w-(--thread-max-width) grow flex-col">
808
+ <div className="aui-thread-welcome-center flex w-full grow flex-col items-center justify-center">
809
+ <div className="aui-thread-welcome-message flex size-full flex-col justify-center px-4">
810
+ <h1 className="aui-thread-welcome-message-inner fade-in slide-in-from-bottom-1 animate-in font-semibold text-2xl duration-200">
811
+ Hello there!
812
+ </h1>
813
+ <p className="aui-thread-welcome-message-inner fade-in slide-in-from-bottom-1 animate-in text-muted-foreground text-xl delay-75 duration-200">
814
+ How can I help you today?
815
+ </p>
803
816
  </div>
804
- <ThreadWelcomeSuggestions />
805
817
  </div>
806
- </ThreadPrimitive.Empty>
818
+ <ThreadSuggestions />
819
+ </div>
807
820
  );
808
821
  };
809
822
 
810
- const ThreadWelcomeSuggestions: FC = () => {
823
+ const SUGGESTIONS = [
824
+ {
825
+ title: "What's the weather",
826
+ label: "in San Francisco?",
827
+ prompt: "What's the weather in San Francisco?",
828
+ },
829
+ {
830
+ title: "Explain React hooks",
831
+ label: "like useState and useEffect",
832
+ prompt: "Explain React hooks like useState and useEffect",
833
+ },
834
+ ] as const;
835
+
836
+ const ThreadSuggestions: FC = () => {
811
837
  return (
812
- <div className="mt-3 flex w-full items-stretch justify-center gap-4">
813
- <ThreadPrimitive.Suggestion
814
- className="hover:bg-muted/80 flex max-w-sm grow basis-0 flex-col items-center justify-center rounded-lg border p-3 transition-colors ease-in"
815
- prompt="What is the weather in Tokyo?"
816
- method="replace"
817
- autoSend
818
- >
819
- <span className="line-clamp-2 text-sm font-semibold text-ellipsis">
820
- What is the weather in Tokyo?
821
- </span>
822
- </ThreadPrimitive.Suggestion>
823
- <ThreadPrimitive.Suggestion
824
- className="hover:bg-muted/80 flex max-w-sm grow basis-0 flex-col items-center justify-center rounded-lg border p-3 transition-colors ease-in"
825
- prompt="What is assistant-ui?"
826
- method="replace"
827
- autoSend
828
- >
829
- <span className="line-clamp-2 text-sm font-semibold text-ellipsis">
830
- What is assistant-ui?
831
- </span>
832
- </ThreadPrimitive.Suggestion>
838
+ <div className="aui-thread-welcome-suggestions grid w-full @md:grid-cols-2 gap-2 pb-4">
839
+ {SUGGESTIONS.map((suggestion, index) => (
840
+ <div
841
+ key={suggestion.prompt}
842
+ className="aui-thread-welcome-suggestion-display fade-in slide-in-from-bottom-2 @md:nth-[n+3]:block nth-[n+3]:hidden animate-in fill-mode-both duration-200"
843
+ style={{ animationDelay: `${100 + index * 50}ms` }}
844
+ >
845
+ <ThreadPrimitive.Suggestion prompt={suggestion.prompt} send asChild>
846
+ <Button
847
+ variant="ghost"
848
+ className="aui-thread-welcome-suggestion h-auto w-full @md:flex-col flex-wrap items-start justify-start gap-1 rounded-2xl border px-4 py-3 text-left text-sm transition-colors hover:bg-muted"
849
+ aria-label={suggestion.prompt}
850
+ >
851
+ <span className="aui-thread-welcome-suggestion-text-1 font-medium">
852
+ {suggestion.title}
853
+ </span>
854
+ <span className="aui-thread-welcome-suggestion-text-2 text-muted-foreground">
855
+ {suggestion.label}
856
+ </span>
857
+ </Button>
858
+ </ThreadPrimitive.Suggestion>
859
+ </div>
860
+ ))}
833
861
  </div>
834
862
  );
835
863
  };
836
864
 
837
865
  const Composer: FC = () => {
838
866
  return (
839
- <ComposerPrimitive.Root className="focus-within:border-ring/20 flex w-full flex-wrap items-end rounded-lg border bg-inherit px-2.5 shadow-sm transition-colors ease-in">
840
- <ComposerPrimitive.Input
841
- rows={1}
842
- autoFocus
843
- placeholder="Write a message..."
844
- className="placeholder:text-muted-foreground max-h-40 flex-grow resize-none border-none bg-transparent px-2 py-4 text-sm outline-none focus:ring-0 disabled:cursor-not-allowed"
845
- />
846
- <ComposerAction />
867
+ <ComposerPrimitive.Root className="aui-composer-root relative flex w-full flex-col">
868
+ <ComposerPrimitive.AttachmentDropzone className="aui-composer-attachment-dropzone flex w-full flex-col rounded-2xl border border-input bg-background px-1 pt-2 outline-none transition-shadow has-[textarea:focus-visible]:border-ring has-[textarea:focus-visible]:ring-2 has-[textarea:focus-visible]:ring-ring/20 data-[dragging=true]:border-ring data-[dragging=true]:border-dashed data-[dragging=true]:bg-accent/50">
869
+ <ComposerAttachments />
870
+ <ComposerPrimitive.Input
871
+ placeholder="Send a message..."
872
+ className="aui-composer-input mb-1 max-h-32 min-h-14 w-full resize-none bg-transparent px-4 pt-2 pb-3 text-sm outline-none placeholder:text-muted-foreground focus-visible:ring-0"
873
+ rows={1}
874
+ autoFocus
875
+ aria-label="Message input"
876
+ />
877
+ <ComposerAction />
878
+ </ComposerPrimitive.AttachmentDropzone>
847
879
  </ComposerPrimitive.Root>
848
880
  );
849
881
  };
850
882
 
851
883
  const ComposerAction: FC = () => {
852
884
  return (
853
- <>
854
- <ThreadPrimitive.If running={false}>
885
+ <div className="aui-composer-action-wrapper relative mx-2 mb-2 flex items-center justify-between">
886
+ <ComposerAddAttachment />
887
+
888
+ <AssistantIf condition={({ thread }) => !thread.isRunning}>
855
889
  <ComposerPrimitive.Send asChild>
856
890
  <TooltipIconButton
857
- tooltip="Send"
891
+ tooltip="Send message"
892
+ side="bottom"
893
+ type="submit"
858
894
  variant="default"
859
- className="my-2.5 size-8 p-2 transition-opacity ease-in"
895
+ size="icon"
896
+ className="aui-composer-send size-8 rounded-full"
897
+ aria-label="Send message"
860
898
  >
861
- <SendHorizontalIcon />
899
+ <ArrowUpIcon className="aui-composer-send-icon size-4" />
862
900
  </TooltipIconButton>
863
901
  </ComposerPrimitive.Send>
864
- </ThreadPrimitive.If>
865
- <ThreadPrimitive.If running>
902
+ </AssistantIf>
903
+
904
+ <AssistantIf condition={({ thread }) => thread.isRunning}>
866
905
  <ComposerPrimitive.Cancel asChild>
867
- <TooltipIconButton
868
- tooltip="Cancel"
906
+ <Button
907
+ type="button"
869
908
  variant="default"
870
- className="my-2.5 size-8 p-2 transition-opacity ease-in"
909
+ size="icon"
910
+ className="aui-composer-cancel size-8 rounded-full"
911
+ aria-label="Stop generating"
871
912
  >
872
- <CircleStopIcon />
873
- </TooltipIconButton>
913
+ <SquareIcon className="aui-composer-cancel-icon size-3 fill-current" />
914
+ </Button>
874
915
  </ComposerPrimitive.Cancel>
875
- </ThreadPrimitive.If>
876
- </>
877
- );
878
- };
879
-
880
- const UserMessage: FC = () => {
881
- return (
882
- <MessagePrimitive.Root className="grid w-full max-w-[var(--thread-max-width)] auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 py-4 [&:where(>*)]:col-start-2">
883
- <UserActionBar />
884
-
885
- <div className="bg-muted text-foreground col-start-2 row-start-2 max-w-[calc(var(--thread-max-width)*0.8)] rounded-3xl px-5 py-2.5 break-words">
886
- <MessagePrimitive.Parts />
887
- </div>
888
-
889
- <BranchPicker className="col-span-full col-start-1 row-start-3 -mr-1 justify-end" />
890
- </MessagePrimitive.Root>
891
- );
892
- };
893
-
894
- const UserActionBar: FC = () => {
895
- return (
896
- <ActionBarPrimitive.Root
897
- hideWhenRunning
898
- autohide="not-last"
899
- className="col-start-1 row-start-2 mt-2.5 mr-3 flex flex-col items-end"
900
- >
901
- <ActionBarPrimitive.Edit asChild>
902
- <TooltipIconButton tooltip="Edit">
903
- <PencilIcon />
904
- </TooltipIconButton>
905
- </ActionBarPrimitive.Edit>
906
- </ActionBarPrimitive.Root>
916
+ </AssistantIf>
917
+ </div>
907
918
  );
908
919
  };
909
920
 
910
- const EditComposer: FC = () => {
921
+ const MessageError: FC = () => {
911
922
  return (
912
- <ComposerPrimitive.Root className="bg-muted my-4 flex w-full max-w-[var(--thread-max-width)] flex-col gap-2 rounded-xl">
913
- <ComposerPrimitive.Input className="text-foreground flex h-8 w-full resize-none bg-transparent p-4 pb-0 outline-none" />
914
-
915
- <div className="mx-3 mb-3 flex items-center justify-center gap-2 self-end">
916
- <ComposerPrimitive.Cancel asChild>
917
- <Button variant="ghost">Cancel</Button>
918
- </ComposerPrimitive.Cancel>
919
- <ComposerPrimitive.Send asChild>
920
- <Button>Send</Button>
921
- </ComposerPrimitive.Send>
922
- </div>
923
- </ComposerPrimitive.Root>
923
+ <MessagePrimitive.Error>
924
+ <ErrorPrimitive.Root className="aui-message-error-root mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-destructive text-sm dark:bg-destructive/5 dark:text-red-200">
925
+ <ErrorPrimitive.Message className="aui-message-error-message line-clamp-2" />
926
+ </ErrorPrimitive.Root>
927
+ </MessagePrimitive.Error>
924
928
  );
925
929
  };
926
930
 
927
931
  const AssistantMessage: FC = () => {
928
932
  return (
929
- <MessagePrimitive.Root className="relative grid w-full max-w-[var(--thread-max-width)] grid-cols-[auto_auto_1fr] grid-rows-[auto_1fr] py-4">
930
- <div className="text-foreground col-span-2 col-start-2 row-start-1 my-1.5 max-w-[calc(var(--thread-max-width)*0.8)] leading-7 break-words">
933
+ <MessagePrimitive.Root
934
+ className="aui-assistant-message-root fade-in slide-in-from-bottom-1 relative mx-auto w-full max-w-(--thread-max-width) animate-in py-3 duration-150"
935
+ data-role="assistant"
936
+ >
937
+ <div className="aui-assistant-message-content wrap-break-word px-2 text-foreground leading-relaxed">
931
938
  <MessagePrimitive.Parts
932
- components={{ Text: MarkdownText, tools: { Fallback: ToolFallback } }}
939
+ components={{
940
+ Text: MarkdownText,
941
+ tools: { Fallback: ToolFallback },
942
+ }}
933
943
  />
934
944
  <MessageError />
935
945
  </div>
936
946
 
937
- <AssistantActionBar />
938
-
939
- <BranchPicker className="col-start-2 row-start-2 mr-2 -ml-2" />
947
+ <div className="aui-assistant-message-footer mt-1 ml-2 flex">
948
+ <BranchPicker />
949
+ <AssistantActionBar />
950
+ </div>
940
951
  </MessagePrimitive.Root>
941
952
  );
942
953
  };
943
954
 
944
- const MessageError: FC = () => {
945
- return (
946
- <MessagePrimitive.Error>
947
- <ErrorPrimitive.Root className="border-destructive bg-destructive/10 dark:bg-destructive/5 text-destructive mt-2 rounded-md border p-3 text-sm dark:text-red-200">
948
- <ErrorPrimitive.Message className="line-clamp-2" />
949
- </ErrorPrimitive.Root>
950
- </MessagePrimitive.Error>
951
- );
952
- };
953
-
954
955
  const AssistantActionBar: FC = () => {
955
956
  return (
956
957
  <ActionBarPrimitive.Root
957
958
  hideWhenRunning
958
959
  autohide="not-last"
959
960
  autohideFloat="single-branch"
960
- className="text-muted-foreground data-[floating]:bg-background col-start-3 row-start-2 -ml-1 flex gap-1 data-[floating]:absolute data-[floating]:rounded-md data-[floating]:border data-[floating]:p-1 data-[floating]:shadow-sm"
961
+ className="aui-assistant-action-bar-root -ml-1 col-start-3 row-start-2 flex gap-1 text-muted-foreground data-floating:absolute data-floating:rounded-md data-floating:border data-floating:bg-background data-floating:p-1 data-floating:shadow-sm"
961
962
  >
962
963
  <ActionBarPrimitive.Copy asChild>
963
964
  <TooltipIconButton tooltip="Copy">
964
- <MessagePrimitive.If copied>
965
+ <AssistantIf condition={({ message }) => message.isCopied}>
965
966
  <CheckIcon />
966
- </MessagePrimitive.If>
967
- <MessagePrimitive.If copied={false}>
967
+ </AssistantIf>
968
+ <AssistantIf condition={({ message }) => !message.isCopied}>
968
969
  <CopyIcon />
969
- </MessagePrimitive.If>
970
+ </AssistantIf>
970
971
  </TooltipIconButton>
971
972
  </ActionBarPrimitive.Copy>
973
+ <ActionBarPrimitive.ExportMarkdown asChild>
974
+ <TooltipIconButton tooltip="Export as Markdown">
975
+ <DownloadIcon />
976
+ </TooltipIconButton>
977
+ </ActionBarPrimitive.ExportMarkdown>
972
978
  <ActionBarPrimitive.Reload asChild>
973
979
  <TooltipIconButton tooltip="Refresh">
974
980
  <RefreshCwIcon />
@@ -978,6 +984,67 @@ const AssistantActionBar: FC = () => {
978
984
  );
979
985
  };
980
986
 
987
+ const UserMessage: FC = () => {
988
+ return (
989
+ <MessagePrimitive.Root
990
+ className="aui-user-message-root fade-in slide-in-from-bottom-1 mx-auto grid w-full max-w-(--thread-max-width) animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] content-start gap-y-2 px-2 py-3 duration-150 [&:where(>*)]:col-start-2"
991
+ data-role="user"
992
+ >
993
+ <UserMessageAttachments />
994
+
995
+ <div className="aui-user-message-content-wrapper relative col-start-2 min-w-0">
996
+ <div className="aui-user-message-content wrap-break-word rounded-2xl bg-muted px-4 py-2.5 text-foreground">
997
+ <MessagePrimitive.Parts />
998
+ </div>
999
+ <div className="aui-user-action-bar-wrapper -translate-x-full -translate-y-1/2 absolute top-1/2 left-0 pr-2">
1000
+ <UserActionBar />
1001
+ </div>
1002
+ </div>
1003
+
1004
+ <BranchPicker className="aui-user-branch-picker -mr-1 col-span-full col-start-1 row-start-3 justify-end" />
1005
+ </MessagePrimitive.Root>
1006
+ );
1007
+ };
1008
+
1009
+ const UserActionBar: FC = () => {
1010
+ return (
1011
+ <ActionBarPrimitive.Root
1012
+ hideWhenRunning
1013
+ autohide="not-last"
1014
+ className="aui-user-action-bar-root flex flex-col items-end"
1015
+ >
1016
+ <ActionBarPrimitive.Edit asChild>
1017
+ <TooltipIconButton tooltip="Edit" className="aui-user-action-edit p-4">
1018
+ <PencilIcon />
1019
+ </TooltipIconButton>
1020
+ </ActionBarPrimitive.Edit>
1021
+ </ActionBarPrimitive.Root>
1022
+ );
1023
+ };
1024
+
1025
+ const EditComposer: FC = () => {
1026
+ return (
1027
+ <MessagePrimitive.Root className="aui-edit-composer-wrapper mx-auto flex w-full max-w-(--thread-max-width) flex-col px-2 py-3">
1028
+ <ComposerPrimitive.Root className="aui-edit-composer-root ml-auto flex w-full max-w-[85%] flex-col rounded-2xl bg-muted">
1029
+ <ComposerPrimitive.Input
1030
+ className="aui-edit-composer-input min-h-14 w-full resize-none bg-transparent p-4 text-foreground text-sm outline-none"
1031
+ autoFocus
1032
+ />
1033
+ <div className="aui-edit-composer-footer mx-3 mb-3 flex items-center gap-2 self-end">
1034
+ <ComposerPrimitive.Cancel asChild>
1035
+ <Button variant="ghost" size="sm">
1036
+ Cancel
1037
+ </Button>
1038
+ </ComposerPrimitive.Cancel>
1039
+ <ComposerPrimitive.Send asChild>
1040
+ <Button size="sm">Update</Button>
1041
+ </ComposerPrimitive.Send>
1042
+ </div>
1043
+ </ComposerPrimitive.Root>
1044
+ </MessagePrimitive.Root>
1045
+ );
1046
+ };
1047
+
981
1048
  const BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({
982
1049
  className,
983
1050
  ...rest
@@ -986,7 +1053,7 @@ const BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({
986
1053
  <BranchPickerPrimitive.Root
987
1054
  hideWhenSingleBranch
988
1055
  className={cn(
989
- "text-muted-foreground inline-flex items-center text-xs",
1056
+ "aui-branch-picker-root -ml-2 mr-2 inline-flex items-center text-muted-foreground text-xs",
990
1057
  className,
991
1058
  )}
992
1059
  {...rest}
@@ -996,7 +1063,7 @@ const BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({
996
1063
  <ChevronLeftIcon />
997
1064
  </TooltipIconButton>
998
1065
  </BranchPickerPrimitive.Previous>
999
- <span className="font-medium">
1066
+ <span className="aui-branch-picker-state font-medium">
1000
1067
  <BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />
1001
1068
  </span>
1002
1069
  <BranchPickerPrimitive.Next asChild>
@@ -1008,20 +1075,6 @@ const BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({
1008
1075
  );
1009
1076
  };
1010
1077
 
1011
- const CircleStopIcon = () => {
1012
- return (
1013
- <svg
1014
- xmlns="http://www.w3.org/2000/svg"
1015
- viewBox="0 0 16 16"
1016
- fill="currentColor"
1017
- width="16"
1018
- height="16"
1019
- >
1020
- <rect width="10" height="10" x="3" y="3" rx="2" />
1021
- </svg>
1022
- );
1023
- };
1024
-
1025
1078
  ```
1026
1079
 
1027
1080
  ## components/assistant-ui/tool-fallback.tsx
@@ -1064,7 +1117,7 @@ export const ToolFallback: ToolCallMessagePartComponent = ({
1064
1117
  >
1065
1118
  <div className="aui-tool-fallback-header flex items-center gap-2 px-4">
1066
1119
  {isCancelled ? (
1067
- <XCircleIcon className="aui-tool-fallback-icon text-muted-foreground size-4" />
1120
+ <XCircleIcon className="aui-tool-fallback-icon size-4 text-muted-foreground" />
1068
1121
  ) : (
1069
1122
  <CheckIcon className="aui-tool-fallback-icon size-4" />
1070
1123
  )}
@@ -1085,7 +1138,7 @@ export const ToolFallback: ToolCallMessagePartComponent = ({
1085
1138
  <div className="aui-tool-fallback-content flex flex-col gap-2 border-t pt-2">
1086
1139
  {cancelledReason && (
1087
1140
  <div className="aui-tool-fallback-cancelled-root px-4">
1088
- <p className="aui-tool-fallback-cancelled-header text-muted-foreground font-semibold">
1141
+ <p className="aui-tool-fallback-cancelled-header font-semibold text-muted-foreground">
1089
1142
  Cancelled reason:
1090
1143
  </p>
1091
1144
  <p className="aui-tool-fallback-cancelled-reason text-muted-foreground">
@@ -1215,7 +1268,7 @@ const AvatarFallback = React.forwardRef<
1215
1268
  <AvatarPrimitive.Fallback
1216
1269
  ref={ref}
1217
1270
  className={cn(
1218
- "bg-muted flex h-full w-full items-center justify-center rounded-full",
1271
+ "flex h-full w-full items-center justify-center rounded-full bg-muted",
1219
1272
  className,
1220
1273
  )}
1221
1274
  {...props}
@@ -1237,16 +1290,16 @@ import { cva, type VariantProps } from "class-variance-authority";
1237
1290
  import { cn } from "@/lib/utils";
1238
1291
 
1239
1292
  const buttonVariants = cva(
1240
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
1293
+ "inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium text-sm outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
1241
1294
  {
1242
1295
  variants: {
1243
1296
  variant: {
1244
1297
  default:
1245
1298
  "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
1246
1299
  destructive:
1247
- "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
1300
+ "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",
1248
1301
  outline:
1249
- "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
1302
+ "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
1250
1303
  secondary:
1251
1304
  "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
1252
1305
  ghost:
@@ -1255,7 +1308,7 @@ const buttonVariants = cva(
1255
1308
  },
1256
1309
  size: {
1257
1310
  default: "h-9 px-4 py-2 has-[>svg]:px-3",
1258
- sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
1311
+ sm: "h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",
1259
1312
  lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
1260
1313
  icon: "size-9",
1261
1314
  },
@@ -1335,7 +1388,7 @@ function DialogOverlay({
1335
1388
  <DialogPrimitive.Overlay
1336
1389
  data-slot="dialog-overlay"
1337
1390
  className={cn(
1338
- "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80",
1391
+ "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80 data-[state=closed]:animate-out data-[state=open]:animate-in",
1339
1392
  className,
1340
1393
  )}
1341
1394
  {...props}
@@ -1354,13 +1407,13 @@ function DialogContent({
1354
1407
  <DialogPrimitive.Content
1355
1408
  data-slot="dialog-content"
1356
1409
  className={cn(
1357
- "bg-background data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",
1410
+ "data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 data-[state=closed]:animate-out data-[state=open]:animate-in sm:max-w-lg",
1358
1411
  className,
1359
1412
  )}
1360
1413
  {...props}
1361
1414
  >
1362
1415
  {children}
1363
- <DialogPrimitive.Close className="ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4">
1416
+ <DialogPrimitive.Close className="absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0">
1364
1417
  <XIcon />
1365
1418
  <span className="sr-only">Close</span>
1366
1419
  </DialogPrimitive.Close>
@@ -1399,7 +1452,7 @@ function DialogTitle({
1399
1452
  return (
1400
1453
  <DialogPrimitive.Title
1401
1454
  data-slot="dialog-title"
1402
- className={cn("text-lg leading-none font-semibold", className)}
1455
+ className={cn("font-semibold text-lg leading-none", className)}
1403
1456
  {...props}
1404
1457
  />
1405
1458
  );
@@ -1484,13 +1537,13 @@ function TooltipContent({
1484
1537
  data-slot="tooltip-content"
1485
1538
  sideOffset={sideOffset}
1486
1539
  className={cn(
1487
- "bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
1540
+ "fade-in-0 zoom-in-95 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in text-balance rounded-md bg-primary px-3 py-1.5 text-primary-foreground text-xs data-[state=closed]:animate-out",
1488
1541
  className,
1489
1542
  )}
1490
1543
  {...props}
1491
1544
  >
1492
1545
  {children}
1493
- <TooltipPrimitive.Arrow className="bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" />
1546
+ <TooltipPrimitive.Arrow className="z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-primary fill-primary" />
1494
1547
  </TooltipPrimitive.Content>
1495
1548
  </TooltipPrimitive.Portal>
1496
1549
  );
@@ -1533,34 +1586,33 @@ export default nextConfig;
1533
1586
  "version": "0.0.0",
1534
1587
  "type": "module",
1535
1588
  "dependencies": {
1536
- "@ai-sdk/openai": "^2.0.73",
1537
- "@ai-sdk/react": "^2.0.102",
1589
+ "@ai-sdk/openai": "^2.0.84",
1590
+ "@ai-sdk/react": "^2.0.114",
1538
1591
  "@assistant-ui/react": "workspace:^",
1539
1592
  "@assistant-ui/react-ai-sdk": "workspace:*",
1540
1593
  "@assistant-ui/react-markdown": "workspace:^",
1541
- "@radix-ui/react-avatar": "^1.1.4",
1542
- "@radix-ui/react-dialog": "^1.1.7",
1594
+ "@radix-ui/react-avatar": "^1.1.11",
1595
+ "@radix-ui/react-dialog": "^1.1.15",
1543
1596
  "@radix-ui/react-slot": "^1.2.4",
1544
1597
  "@radix-ui/react-tooltip": "^1.2.8",
1545
- "@tailwindcss/postcss": "^4.1.17",
1546
- "ai": "^5.0.102",
1598
+ "@tailwindcss/postcss": "^4.1.18",
1599
+ "ai": "^5.0.112",
1547
1600
  "class-variance-authority": "^0.7.1",
1548
1601
  "clsx": "^2.1.1",
1549
- "lucide-react": "^0.555.0",
1550
- "motion": "^11.18.2",
1551
- "next": "16.0.4",
1602
+ "lucide-react": "^0.560.0",
1603
+ "next": "16.0.10",
1552
1604
  "postcss": "^8.5.6",
1553
- "react": "19.2.0",
1554
- "react-dom": "19.2.0",
1605
+ "react": "19.2.3",
1606
+ "react-dom": "19.2.3",
1555
1607
  "remark-gfm": "^4.0.1",
1556
1608
  "tailwind-merge": "^3.4.0",
1557
- "tailwindcss": "^4.1.17",
1609
+ "tailwindcss": "^4.1.18",
1558
1610
  "zod": "^4.1.13",
1559
- "zustand": "^5.0.8"
1611
+ "zustand": "^5.0.9"
1560
1612
  },
1561
1613
  "devDependencies": {
1562
1614
  "@assistant-ui/x-buildutils": "workspace:*",
1563
- "@types/node": "^24.10.1",
1615
+ "@types/node": "^25.0.0",
1564
1616
  "@types/react": "^19.2.7",
1565
1617
  "@types/react-dom": "^19.2.3",
1566
1618
  "tw-animate-css": "^1.4.0",
@@ -1569,8 +1621,7 @@ export default nextConfig;
1569
1621
  "scripts": {
1570
1622
  "dev": "next dev",
1571
1623
  "build": "next build",
1572
- "start": "next start",
1573
- "lint": "eslint ."
1624
+ "start": "next start"
1574
1625
  }
1575
1626
  }
1576
1627