@chat-lab/ui 0.1.0-beta.23 → 0.1.0-beta.25

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.
@@ -89,7 +89,7 @@ const AttachmentUI = () => {
89
89
  "aui-attachment-tile-composer border-foreground/20"), role: "button", id: "attachment-tile", "aria-label": `${typeLabel} attachment`, children: jsxRuntime.jsx(AttachmentThumb, {}) }) }) }), isComposer && jsxRuntime.jsx(AttachmentRemove, {})] }), jsxRuntime.jsx(tooltip.TooltipContent, { side: "top", children: jsxRuntime.jsx(AttachmentName.AttachmentPrimitiveName, {}) })] }));
90
90
  };
91
91
  const AttachmentRemove = () => {
92
- return (jsxRuntime.jsx(AttachmentRemove$1.AttachmentPrimitiveRemove, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Remove file", 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", side: "top", children: jsxRuntime.jsx(x.default, { className: "aui-attachment-remove-icon size-3 dark:stroke-[2.5px]" }) }) }));
92
+ return (jsxRuntime.jsx(AttachmentRemove$1.AttachmentPrimitiveRemove, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Remove file", 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", side: "top", children: jsxRuntime.jsx(x.default, { className: "aui-attachment-remove-icon size-3" }) }) }));
93
93
  };
94
94
  const UserMessageAttachments = () => {
95
95
  return (jsxRuntime.jsx("div", { className: "aui-user-message-attachments-end col-span-full col-start-1 row-start-1 flex w-full flex-row justify-end gap-2", children: jsxRuntime.jsx(MessageAttachments.MessagePrimitiveAttachments, { components: { Attachment: AttachmentUI } }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"attachment.cjs","sources":["../../../src/components/assistant-ui/attachment.tsx"],"sourcesContent":["\"use client\";\n\nimport { PropsWithChildren, useEffect, useState, type FC } from \"react\";\nimport { XIcon, PlusIcon, FileText } from \"lucide-react\";\nimport {\n AttachmentPrimitive,\n ComposerPrimitive,\n MessagePrimitive,\n useAssistantState,\n useAssistantApi,\n} from \"@assistant-ui/react\";\nimport { useShallow } from \"zustand/shallow\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogTrigger,\n DialogDescription,\n} from \"@/components/ui/dialog\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"@/components/ui/avatar\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport { cn } from \"@/lib/utils\";\nimport AttachmentIcon from \"@/assets/Attachment\";\n\nconst useFileSrc = (file: File | undefined) => {\n const [src, setSrc] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (!file) {\n setSrc(undefined);\n return;\n }\n\n const objectUrl = URL.createObjectURL(file);\n setSrc(objectUrl);\n\n return () => {\n URL.revokeObjectURL(objectUrl);\n };\n }, [file]);\n\n return src;\n};\n\nconst useAttachmentSrc = () => {\n const { file, src } = useAssistantState(\n useShallow(({ attachment }): { file?: File; src?: string } => {\n if (attachment.type !== \"image\") return {};\n if (attachment.file) return { file: attachment.file };\n const src = attachment.content?.filter((c) => c.type === \"image\")[0]\n ?.image;\n if (!src) return {};\n return { src };\n })\n );\n\n return useFileSrc(file) ?? src;\n};\n\ntype AttachmentPreviewProps = {\n src: string;\n};\n\nconst AttachmentPreview: FC<AttachmentPreviewProps> = ({ src }) => {\n const [isLoaded, setIsLoaded] = useState(false);\n return (\n <img\n src={src}\n alt=\"Image Preview\"\n width={1}\n height={1}\n className={\n isLoaded\n ? \"aui-attachment-preview-image-loaded block h-auto max-h-[80vh] w-auto max-w-full object-contain\"\n : \"aui-attachment-preview-image-loading hidden\"\n }\n onLoadCapture={() => setIsLoaded(true)}\n // priority={false}\n />\n );\n};\n\nconst AttachmentPreviewDialog: FC<{ children: React.ReactElement }> = ({\n children,\n}) => {\n const src = useAttachmentSrc();\n\n if (!src) return children;\n\n return (\n <Dialog>\n <DialogTrigger\n className=\"aui-attachment-preview-trigger cursor-pointer transition-colors hover:bg-accent/50\"\n asChild\n >\n {children}\n </DialogTrigger>\n <DialogContent className=\"aui-attachment-preview-dialog-content p-2 sm:max-w-3xl [&_svg]:text-background [&>button]:rounded-full [&>button]:bg-foreground/60 [&>button]:p-1 [&>button]:opacity-100 [&>button]:!ring-0 [&>button]:hover:[&_svg]:text-destructive\">\n <DialogTitle className=\"aui-sr-only sr-only\">\n Image Attachment Preview\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n Preview of attached image file\n </DialogDescription>\n <div className=\"aui-attachment-preview relative mx-auto flex max-h-[80dvh] w-full items-center justify-center overflow-hidden bg-background\">\n <AttachmentPreview src={src} />\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst AttachmentThumb: FC = () => {\n const isImage = useAssistantState(\n ({ attachment }) => attachment.type === \"image\"\n );\n const src = useAttachmentSrc();\n\n return (\n <Avatar className=\"aui-attachment-tile-avatar h-full w-full rounded-none\">\n <AvatarImage\n src={src}\n alt=\"Attachment preview\"\n className=\"aui-attachment-tile-image object-cover\"\n />\n <AvatarFallback delayMs={isImage ? 200 : 0}>\n <FileText className=\"aui-attachment-tile-fallback-icon size-8 text-muted-foreground\" />\n </AvatarFallback>\n </Avatar>\n );\n};\n\nconst AttachmentUI: FC = () => {\n const api = useAssistantApi();\n const isComposer = api.attachment.source === \"composer\";\n\n const isImage = useAssistantState(\n ({ attachment }) => attachment.type === \"image\"\n );\n const typeLabel = useAssistantState(({ attachment }) => {\n const type = attachment.type;\n switch (type) {\n case \"image\":\n return \"Image\";\n case \"document\":\n return \"Document\";\n case \"file\":\n return \"File\";\n default:\n const _exhaustiveCheck: never = type;\n throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);\n }\n });\n\n return (\n <Tooltip>\n <AttachmentPrimitive.Root\n className={cn(\n \"aui-attachment-root relative\",\n isImage &&\n \"aui-attachment-root-composer only:[&>#attachment-tile]:size-24\"\n )}\n >\n <AttachmentPreviewDialog>\n <TooltipTrigger asChild>\n <div\n className={cn(\n \"aui-attachment-tile size-14 cursor-pointer overflow-hidden rounded-[14px] border bg-muted transition-opacity hover:opacity-75\",\n isComposer &&\n \"aui-attachment-tile-composer border-foreground/20\"\n )}\n role=\"button\"\n id=\"attachment-tile\"\n aria-label={`${typeLabel} attachment`}\n >\n <AttachmentThumb />\n </div>\n </TooltipTrigger>\n </AttachmentPreviewDialog>\n {isComposer && <AttachmentRemove />}\n </AttachmentPrimitive.Root>\n <TooltipContent side=\"top\">\n <AttachmentPrimitive.Name />\n </TooltipContent>\n </Tooltip>\n );\n};\n\nconst AttachmentRemove: FC = () => {\n return (\n <AttachmentPrimitive.Remove asChild>\n <TooltipIconButton\n tooltip=\"Remove file\"\n 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\"\n side=\"top\"\n >\n <XIcon className=\"aui-attachment-remove-icon size-3 dark:stroke-[2.5px]\" />\n </TooltipIconButton>\n </AttachmentPrimitive.Remove>\n );\n};\n\nexport const UserMessageAttachments: FC = () => {\n return (\n <div className=\"aui-user-message-attachments-end col-span-full col-start-1 row-start-1 flex w-full flex-row justify-end gap-2\">\n <MessagePrimitive.Attachments components={{ Attachment: AttachmentUI }} />\n </div>\n );\n};\n\nexport const ComposerAttachments: FC = () => {\n return (\n <div className=\"aui-composer-attachments mb-2 flex w-full flex-row items-center gap-2 overflow-x-auto px-1.5 pt-0.5 pb-1 empty:hidden\">\n <ComposerPrimitive.Attachments\n components={{ Attachment: AttachmentUI }}\n />\n </div>\n );\n};\n\nexport const ComposerAddAttachment: FC = () => {\n return (\n <ComposerPrimitive.AddAttachment asChild>\n <div\n className=\"aui-composer-add-attachment size-[16px] p-0 rounded-full text-xs font-semibold hover:bg-muted-foreground/15 flex items-center\"\n aria-label=\"Add Attachment\"\n >\n <AttachmentIcon className=\"aui-attachment-add-icon size-[16px] stroke-[2px]\" />\n </div>\n </ComposerPrimitive.AddAttachment>\n );\n};\n"],"names":["useState","useEffect","useAssistantState","useShallow","_jsx","_jsxs","Dialog","DialogTrigger","DialogContent","DialogTitle","DialogDescription","Avatar","AvatarImage","AvatarFallback","FileText","useAssistantApi","Tooltip","AttachmentPrimitive.Root","cn","TooltipTrigger","TooltipContent","AttachmentPrimitive.Name","AttachmentPrimitive.Remove","TooltipIconButton","XIcon","MessagePrimitive.Attachments","ComposerPrimitive.Attachments","ComposerPrimitive.AddAttachment","AttachmentIcon"],"mappings":"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"}
1
+ {"version":3,"file":"attachment.cjs","sources":["../../../src/components/assistant-ui/attachment.tsx"],"sourcesContent":["\"use client\";\n\nimport { PropsWithChildren, useEffect, useState, type FC } from \"react\";\nimport { XIcon, PlusIcon, FileText } from \"lucide-react\";\nimport {\n AttachmentPrimitive,\n ComposerPrimitive,\n MessagePrimitive,\n useAssistantState,\n useAssistantApi,\n} from \"@assistant-ui/react\";\nimport { useShallow } from \"zustand/shallow\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogTrigger,\n DialogDescription,\n} from \"@/components/ui/dialog\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"@/components/ui/avatar\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport { cn } from \"@/lib/utils\";\nimport AttachmentIcon from \"@/assets/Attachment\";\n\nconst useFileSrc = (file: File | undefined) => {\n const [src, setSrc] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (!file) {\n setSrc(undefined);\n return;\n }\n\n const objectUrl = URL.createObjectURL(file);\n setSrc(objectUrl);\n\n return () => {\n URL.revokeObjectURL(objectUrl);\n };\n }, [file]);\n\n return src;\n};\n\nconst useAttachmentSrc = () => {\n const { file, src } = useAssistantState(\n useShallow(({ attachment }): { file?: File; src?: string } => {\n if (attachment.type !== \"image\") return {};\n if (attachment.file) return { file: attachment.file };\n const src = attachment.content?.filter((c) => c.type === \"image\")[0]\n ?.image;\n if (!src) return {};\n return { src };\n })\n );\n\n return useFileSrc(file) ?? src;\n};\n\ntype AttachmentPreviewProps = {\n src: string;\n};\n\nconst AttachmentPreview: FC<AttachmentPreviewProps> = ({ src }) => {\n const [isLoaded, setIsLoaded] = useState(false);\n return (\n <img\n src={src}\n alt=\"Image Preview\"\n width={1}\n height={1}\n className={\n isLoaded\n ? \"aui-attachment-preview-image-loaded block h-auto max-h-[80vh] w-auto max-w-full object-contain\"\n : \"aui-attachment-preview-image-loading hidden\"\n }\n onLoadCapture={() => setIsLoaded(true)}\n // priority={false}\n />\n );\n};\n\nconst AttachmentPreviewDialog: FC<{ children: React.ReactElement }> = ({\n children,\n}) => {\n const src = useAttachmentSrc();\n\n if (!src) return children;\n\n return (\n <Dialog>\n <DialogTrigger\n className=\"aui-attachment-preview-trigger cursor-pointer transition-colors hover:bg-accent/50\"\n asChild\n >\n {children}\n </DialogTrigger>\n <DialogContent className=\"aui-attachment-preview-dialog-content p-2 sm:max-w-3xl [&_svg]:text-background [&>button]:rounded-full [&>button]:bg-foreground/60 [&>button]:p-1 [&>button]:opacity-100 [&>button]:!ring-0 [&>button]:hover:[&_svg]:text-destructive\">\n <DialogTitle className=\"aui-sr-only sr-only\">\n Image Attachment Preview\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n Preview of attached image file\n </DialogDescription>\n <div className=\"aui-attachment-preview relative mx-auto flex max-h-[80dvh] w-full items-center justify-center overflow-hidden bg-background\">\n <AttachmentPreview src={src} />\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst AttachmentThumb: FC = () => {\n const isImage = useAssistantState(\n ({ attachment }) => attachment.type === \"image\"\n );\n const src = useAttachmentSrc();\n\n return (\n <Avatar className=\"aui-attachment-tile-avatar h-full w-full rounded-none\">\n <AvatarImage\n src={src}\n alt=\"Attachment preview\"\n className=\"aui-attachment-tile-image object-cover\"\n />\n <AvatarFallback delayMs={isImage ? 200 : 0}>\n <FileText className=\"aui-attachment-tile-fallback-icon size-8 text-muted-foreground\" />\n </AvatarFallback>\n </Avatar>\n );\n};\n\nconst AttachmentUI: FC = () => {\n const api = useAssistantApi();\n const isComposer = api.attachment.source === \"composer\";\n\n const isImage = useAssistantState(\n ({ attachment }) => attachment.type === \"image\"\n );\n const typeLabel = useAssistantState(({ attachment }) => {\n const type = attachment.type;\n switch (type) {\n case \"image\":\n return \"Image\";\n case \"document\":\n return \"Document\";\n case \"file\":\n return \"File\";\n default:\n const _exhaustiveCheck: never = type;\n throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);\n }\n });\n\n return (\n <Tooltip>\n <AttachmentPrimitive.Root\n className={cn(\n \"aui-attachment-root relative\",\n isImage &&\n \"aui-attachment-root-composer only:[&>#attachment-tile]:size-24\"\n )}\n >\n <AttachmentPreviewDialog>\n <TooltipTrigger asChild>\n <div\n className={cn(\n \"aui-attachment-tile size-14 cursor-pointer overflow-hidden rounded-[14px] border bg-muted transition-opacity hover:opacity-75\",\n isComposer &&\n \"aui-attachment-tile-composer border-foreground/20\"\n )}\n role=\"button\"\n id=\"attachment-tile\"\n aria-label={`${typeLabel} attachment`}\n >\n <AttachmentThumb />\n </div>\n </TooltipTrigger>\n </AttachmentPreviewDialog>\n {isComposer && <AttachmentRemove />}\n </AttachmentPrimitive.Root>\n <TooltipContent side=\"top\">\n <AttachmentPrimitive.Name />\n </TooltipContent>\n </Tooltip>\n );\n};\n\nconst AttachmentRemove: FC = () => {\n return (\n <AttachmentPrimitive.Remove asChild>\n <TooltipIconButton\n tooltip=\"Remove file\"\n 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\"\n side=\"top\"\n >\n <XIcon className=\"aui-attachment-remove-icon size-3\" />\n </TooltipIconButton>\n </AttachmentPrimitive.Remove>\n );\n};\n\nexport const UserMessageAttachments: FC = () => {\n return (\n <div className=\"aui-user-message-attachments-end col-span-full col-start-1 row-start-1 flex w-full flex-row justify-end gap-2\">\n <MessagePrimitive.Attachments components={{ Attachment: AttachmentUI }} />\n </div>\n );\n};\n\nexport const ComposerAttachments: FC = () => {\n return (\n <div className=\"aui-composer-attachments mb-2 flex w-full flex-row items-center gap-2 overflow-x-auto px-1.5 pt-0.5 pb-1 empty:hidden\">\n <ComposerPrimitive.Attachments\n components={{ Attachment: AttachmentUI }}\n />\n </div>\n );\n};\n\nexport const ComposerAddAttachment: FC = () => {\n return (\n <ComposerPrimitive.AddAttachment asChild>\n <div\n className=\"aui-composer-add-attachment size-[16px] p-0 rounded-full text-xs font-semibold hover:bg-muted-foreground/15 flex items-center\"\n aria-label=\"Add Attachment\"\n >\n <AttachmentIcon className=\"aui-attachment-add-icon size-[16px] stroke-[2px]\" />\n </div>\n </ComposerPrimitive.AddAttachment>\n );\n};\n"],"names":["useState","useEffect","useAssistantState","useShallow","_jsx","_jsxs","Dialog","DialogTrigger","DialogContent","DialogTitle","DialogDescription","Avatar","AvatarImage","AvatarFallback","FileText","useAssistantApi","Tooltip","AttachmentPrimitive.Root","cn","TooltipTrigger","TooltipContent","AttachmentPrimitive.Name","AttachmentPrimitive.Remove","TooltipIconButton","XIcon","MessagePrimitive.Attachments","ComposerPrimitive.Attachments","ComposerPrimitive.AddAttachment","AttachmentIcon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAM,UAAU,GAAG,CAAC,IAAsB,KAAI;IAC5C,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAGA,cAAQ,CAAqB,SAAS,CAAC,CAAC;IAE9DC,eAAS,CAAC,MAAK;QACb,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,CAAC,SAAS,CAAC,CAAC;YAClB,OAAO;SACR;QAED,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,SAAS,CAAC,CAAC;AAElB,QAAA,OAAO,MAAK;AACV,YAAA,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;AACjC,SAAC,CAAC;AACJ,KAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAEX,IAAA,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,MAAK;AAC5B,IAAA,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAGC,mCAAiB,CACrCC,kBAAU,CAAC,CAAC,EAAE,UAAU,EAAE,KAAmC;AAC3D,QAAA,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO;AAAE,YAAA,OAAO,EAAE,CAAC;QAC3C,IAAI,UAAU,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAClE,cAAE,KAAK,CAAC;AACV,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,GAAG,EAAE,CAAC;KAChB,CAAC,CACH,CAAC;AAEF,IAAA,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;AACjC,CAAC,CAAC;AAMF,MAAM,iBAAiB,GAA+B,CAAC,EAAE,GAAG,EAAE,KAAI;IAChE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGH,cAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,QACEI,wBACE,GAAG,EAAE,GAAG,EACR,GAAG,EAAC,eAAe,EACnB,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC,EACT,SAAS,EACP,QAAQ;AACN,cAAE,gGAAgG;AAClG,cAAE,6CAA6C,EAEnD,aAAa,EAAE,MAAM,WAAW,CAAC,IAAI,CAAC,EAAA,CAEtC,EACF;AACJ,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAyC,CAAC,EACrE,QAAQ,GACT,KAAI;AACH,IAAA,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;AAE/B,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,QAAQ,CAAC;IAE1B,QACEC,eAAC,CAAAC,aAAM,EACL,EAAA,QAAA,EAAA,CAAAF,cAAA,CAACG,oBAAa,EACZ,EAAA,SAAS,EAAC,oFAAoF,EAC9F,OAAO,kBAEN,QAAQ,EAAA,CACK,EAChBF,eAAA,CAACG,oBAAa,EAAA,EAAC,SAAS,EAAC,uOAAuO,EAAA,QAAA,EAAA,CAC9PJ,cAAC,CAAAK,kBAAW,EAAC,EAAA,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAAA,0BAAA,EAAA,CAE9B,EACdL,cAAA,CAACM,wBAAiB,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,QAAA,EAAA,gCAAA,EAAA,CAElB,EACpBN,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6HAA6H,EAC1I,QAAA,EAAAA,cAAA,CAAC,iBAAiB,EAAA,EAAC,GAAG,EAAE,GAAG,EAAA,CAAI,EAC3B,CAAA,CAAA,EAAA,CACQ,CACT,EAAA,CAAA,EACT;AACJ,CAAC,CAAC;AAEF,MAAM,eAAe,GAAO,MAAK;AAC/B,IAAA,MAAM,OAAO,GAAGF,mCAAiB,CAC/B,CAAC,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC,IAAI,KAAK,OAAO,CAChD,CAAC;AACF,IAAA,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAE/B,QACEG,gBAACM,aAAM,EAAA,EAAC,SAAS,EAAC,uDAAuD,EACvE,QAAA,EAAA,CAAAP,cAAA,CAACQ,kBAAW,EAAA,EACV,GAAG,EAAE,GAAG,EACR,GAAG,EAAC,oBAAoB,EACxB,SAAS,EAAC,wCAAwC,EAClD,CAAA,EACFR,eAACS,qBAAc,EAAA,EAAC,OAAO,EAAE,OAAO,GAAG,GAAG,GAAG,CAAC,EACxC,QAAA,EAAAT,cAAA,CAACU,gBAAQ,EAAA,EAAC,SAAS,EAAC,gEAAgE,EAAG,CAAA,EAAA,CACxE,CACV,EAAA,CAAA,EACT;AACJ,CAAC,CAAC;AAEF,MAAM,YAAY,GAAO,MAAK;AAC5B,IAAA,MAAM,GAAG,GAAGC,mCAAe,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC;AAExD,IAAA,MAAM,OAAO,GAAGb,mCAAiB,CAC/B,CAAC,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC,IAAI,KAAK,OAAO,CAChD,CAAC;IACF,MAAM,SAAS,GAAGA,mCAAiB,CAAC,CAAC,EAAE,UAAU,EAAE,KAAI;AACrD,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QAC7B,QAAQ,IAAI;AACV,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,OAAO,CAAC;AACjB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,UAAU,CAAC;AACpB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,MAAM,CAAC;AAChB,YAAA;gBACE,MAAM,gBAAgB,GAAU,IAAI,CAAC;AACrC,gBAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,gBAAgB,CAAA,CAAE,CAAC,CAAC;SACnE;AACH,KAAC,CAAC,CAAC;AAEH,IAAA,QACEG,eAAA,CAACW,eAAO,EAAA,EAAA,QAAA,EAAA,CACNX,gBAACY,sCAAwB,EAAA,EACvB,SAAS,EAAEC,QAAE,CACX,8BAA8B,EAC9B,OAAO;AACL,oBAAA,gEAAgE,CACnE,EAED,QAAA,EAAA,CAAAd,cAAA,CAAC,uBAAuB,EAAA,EAAA,QAAA,EACtBA,eAACe,sBAAc,EAAA,EAAC,OAAO,EAAA,IAAA,EAAA,QAAA,EACrBf,wBACE,SAAS,EAAEc,QAAE,CACX,+HAA+H,EAC/H,UAAU;AACR,oCAAA,mDAAmD,CACtD,EACD,IAAI,EAAC,QAAQ,EACb,EAAE,EAAC,iBAAiB,gBACR,CAAG,EAAA,SAAS,aAAa,EAErC,QAAA,EAAAd,cAAA,CAAC,eAAe,EAAG,EAAA,CAAA,EAAA,CACf,GACS,EACO,CAAA,EACzB,UAAU,IAAIA,cAAA,CAAC,gBAAgB,EAAG,EAAA,CAAA,CAAA,EAAA,CACV,EAC3BA,cAAC,CAAAgB,sBAAc,IAAC,IAAI,EAAC,KAAK,EACxB,QAAA,EAAAhB,cAAA,CAACiB,sCAAwB,KAAG,EACb,CAAA,CAAA,EAAA,CACT,EACV;AACJ,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAO,MAAK;AAChC,IAAA,QACEjB,cAAA,CAACkB,4CAA0B,EAAC,EAAA,OAAO,EACjC,IAAA,EAAA,QAAA,EAAAlB,cAAA,CAACmB,mCAAiB,EAAA,EAChB,OAAO,EAAC,aAAa,EACrB,SAAS,EAAC,oMAAoM,EAC9M,IAAI,EAAC,KAAK,YAEVnB,cAAC,CAAAoB,SAAK,EAAC,EAAA,SAAS,EAAC,mCAAmC,EAAA,CAAG,EACrC,CAAA,EAAA,CACO,EAC7B;AACJ,CAAC,CAAC;AAEK,MAAM,sBAAsB,GAAO,MAAK;IAC7C,QACEpB,wBAAK,SAAS,EAAC,+GAA+G,EAC5H,QAAA,EAAAA,cAAA,CAACqB,8CAA4B,IAAC,UAAU,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,EAAA,CAAI,EACtE,CAAA,EACN;AACJ,EAAE;AAEK,MAAM,mBAAmB,GAAO,MAAK;IAC1C,QACErB,wBAAK,SAAS,EAAC,uHAAuH,EACpI,QAAA,EAAAA,cAAA,CAACsB,kDAA6B,IAC5B,UAAU,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,EAAA,CACxC,EACE,CAAA,EACN;AACJ,EAAE;AAEK,MAAM,qBAAqB,GAAO,MAAK;IAC5C,QACEtB,cAAC,CAAAuB,sDAA+B,IAAC,OAAO,EAAA,IAAA,EAAA,QAAA,EACtCvB,cACE,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,+HAA+H,gBAC9H,gBAAgB,EAAA,QAAA,EAE3BA,cAAC,CAAAwB,UAAc,EAAC,EAAA,SAAS,EAAC,kDAAkD,EAAG,CAAA,EAAA,CAC3E,EAC0B,CAAA,EAClC;AACJ;;;;;;"}
@@ -87,7 +87,7 @@ const AttachmentUI = () => {
87
87
  "aui-attachment-tile-composer border-foreground/20"), role: "button", id: "attachment-tile", "aria-label": `${typeLabel} attachment`, children: jsx(AttachmentThumb, {}) }) }) }), isComposer && jsx(AttachmentRemove, {})] }), jsx(TooltipContent, { side: "top", children: jsx(AttachmentPrimitiveName, {}) })] }));
88
88
  };
89
89
  const AttachmentRemove = () => {
90
- return (jsx(AttachmentPrimitiveRemove, { asChild: true, children: jsx(TooltipIconButton, { tooltip: "Remove file", 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", side: "top", children: jsx(X, { className: "aui-attachment-remove-icon size-3 dark:stroke-[2.5px]" }) }) }));
90
+ return (jsx(AttachmentPrimitiveRemove, { asChild: true, children: jsx(TooltipIconButton, { tooltip: "Remove file", 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", side: "top", children: jsx(X, { className: "aui-attachment-remove-icon size-3" }) }) }));
91
91
  };
92
92
  const UserMessageAttachments = () => {
93
93
  return (jsx("div", { className: "aui-user-message-attachments-end col-span-full col-start-1 row-start-1 flex w-full flex-row justify-end gap-2", children: jsx(MessagePrimitiveAttachments, { components: { Attachment: AttachmentUI } }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"attachment.js","sources":["../../../src/components/assistant-ui/attachment.tsx"],"sourcesContent":["\"use client\";\n\nimport { PropsWithChildren, useEffect, useState, type FC } from \"react\";\nimport { XIcon, PlusIcon, FileText } from \"lucide-react\";\nimport {\n AttachmentPrimitive,\n ComposerPrimitive,\n MessagePrimitive,\n useAssistantState,\n useAssistantApi,\n} from \"@assistant-ui/react\";\nimport { useShallow } from \"zustand/shallow\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogTrigger,\n DialogDescription,\n} from \"@/components/ui/dialog\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"@/components/ui/avatar\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport { cn } from \"@/lib/utils\";\nimport AttachmentIcon from \"@/assets/Attachment\";\n\nconst useFileSrc = (file: File | undefined) => {\n const [src, setSrc] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (!file) {\n setSrc(undefined);\n return;\n }\n\n const objectUrl = URL.createObjectURL(file);\n setSrc(objectUrl);\n\n return () => {\n URL.revokeObjectURL(objectUrl);\n };\n }, [file]);\n\n return src;\n};\n\nconst useAttachmentSrc = () => {\n const { file, src } = useAssistantState(\n useShallow(({ attachment }): { file?: File; src?: string } => {\n if (attachment.type !== \"image\") return {};\n if (attachment.file) return { file: attachment.file };\n const src = attachment.content?.filter((c) => c.type === \"image\")[0]\n ?.image;\n if (!src) return {};\n return { src };\n })\n );\n\n return useFileSrc(file) ?? src;\n};\n\ntype AttachmentPreviewProps = {\n src: string;\n};\n\nconst AttachmentPreview: FC<AttachmentPreviewProps> = ({ src }) => {\n const [isLoaded, setIsLoaded] = useState(false);\n return (\n <img\n src={src}\n alt=\"Image Preview\"\n width={1}\n height={1}\n className={\n isLoaded\n ? \"aui-attachment-preview-image-loaded block h-auto max-h-[80vh] w-auto max-w-full object-contain\"\n : \"aui-attachment-preview-image-loading hidden\"\n }\n onLoadCapture={() => setIsLoaded(true)}\n // priority={false}\n />\n );\n};\n\nconst AttachmentPreviewDialog: FC<{ children: React.ReactElement }> = ({\n children,\n}) => {\n const src = useAttachmentSrc();\n\n if (!src) return children;\n\n return (\n <Dialog>\n <DialogTrigger\n className=\"aui-attachment-preview-trigger cursor-pointer transition-colors hover:bg-accent/50\"\n asChild\n >\n {children}\n </DialogTrigger>\n <DialogContent className=\"aui-attachment-preview-dialog-content p-2 sm:max-w-3xl [&_svg]:text-background [&>button]:rounded-full [&>button]:bg-foreground/60 [&>button]:p-1 [&>button]:opacity-100 [&>button]:!ring-0 [&>button]:hover:[&_svg]:text-destructive\">\n <DialogTitle className=\"aui-sr-only sr-only\">\n Image Attachment Preview\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n Preview of attached image file\n </DialogDescription>\n <div className=\"aui-attachment-preview relative mx-auto flex max-h-[80dvh] w-full items-center justify-center overflow-hidden bg-background\">\n <AttachmentPreview src={src} />\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst AttachmentThumb: FC = () => {\n const isImage = useAssistantState(\n ({ attachment }) => attachment.type === \"image\"\n );\n const src = useAttachmentSrc();\n\n return (\n <Avatar className=\"aui-attachment-tile-avatar h-full w-full rounded-none\">\n <AvatarImage\n src={src}\n alt=\"Attachment preview\"\n className=\"aui-attachment-tile-image object-cover\"\n />\n <AvatarFallback delayMs={isImage ? 200 : 0}>\n <FileText className=\"aui-attachment-tile-fallback-icon size-8 text-muted-foreground\" />\n </AvatarFallback>\n </Avatar>\n );\n};\n\nconst AttachmentUI: FC = () => {\n const api = useAssistantApi();\n const isComposer = api.attachment.source === \"composer\";\n\n const isImage = useAssistantState(\n ({ attachment }) => attachment.type === \"image\"\n );\n const typeLabel = useAssistantState(({ attachment }) => {\n const type = attachment.type;\n switch (type) {\n case \"image\":\n return \"Image\";\n case \"document\":\n return \"Document\";\n case \"file\":\n return \"File\";\n default:\n const _exhaustiveCheck: never = type;\n throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);\n }\n });\n\n return (\n <Tooltip>\n <AttachmentPrimitive.Root\n className={cn(\n \"aui-attachment-root relative\",\n isImage &&\n \"aui-attachment-root-composer only:[&>#attachment-tile]:size-24\"\n )}\n >\n <AttachmentPreviewDialog>\n <TooltipTrigger asChild>\n <div\n className={cn(\n \"aui-attachment-tile size-14 cursor-pointer overflow-hidden rounded-[14px] border bg-muted transition-opacity hover:opacity-75\",\n isComposer &&\n \"aui-attachment-tile-composer border-foreground/20\"\n )}\n role=\"button\"\n id=\"attachment-tile\"\n aria-label={`${typeLabel} attachment`}\n >\n <AttachmentThumb />\n </div>\n </TooltipTrigger>\n </AttachmentPreviewDialog>\n {isComposer && <AttachmentRemove />}\n </AttachmentPrimitive.Root>\n <TooltipContent side=\"top\">\n <AttachmentPrimitive.Name />\n </TooltipContent>\n </Tooltip>\n );\n};\n\nconst AttachmentRemove: FC = () => {\n return (\n <AttachmentPrimitive.Remove asChild>\n <TooltipIconButton\n tooltip=\"Remove file\"\n 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\"\n side=\"top\"\n >\n <XIcon className=\"aui-attachment-remove-icon size-3 dark:stroke-[2.5px]\" />\n </TooltipIconButton>\n </AttachmentPrimitive.Remove>\n );\n};\n\nexport const UserMessageAttachments: FC = () => {\n return (\n <div className=\"aui-user-message-attachments-end col-span-full col-start-1 row-start-1 flex w-full flex-row justify-end gap-2\">\n <MessagePrimitive.Attachments components={{ Attachment: AttachmentUI }} />\n </div>\n );\n};\n\nexport const ComposerAttachments: FC = () => {\n return (\n <div className=\"aui-composer-attachments mb-2 flex w-full flex-row items-center gap-2 overflow-x-auto px-1.5 pt-0.5 pb-1 empty:hidden\">\n <ComposerPrimitive.Attachments\n components={{ Attachment: AttachmentUI }}\n />\n </div>\n );\n};\n\nexport const ComposerAddAttachment: FC = () => {\n return (\n <ComposerPrimitive.AddAttachment asChild>\n <div\n className=\"aui-composer-add-attachment size-[16px] p-0 rounded-full text-xs font-semibold hover:bg-muted-foreground/15 flex items-center\"\n aria-label=\"Add Attachment\"\n >\n <AttachmentIcon className=\"aui-attachment-add-icon size-[16px] stroke-[2px]\" />\n </div>\n </ComposerPrimitive.AddAttachment>\n );\n};\n"],"names":["_jsx","_jsxs","AttachmentPrimitive.Root","AttachmentPrimitive.Name","AttachmentPrimitive.Remove","XIcon","MessagePrimitive.Attachments","ComposerPrimitive.Attachments","ComposerPrimitive.AddAttachment"],"mappings":"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"}
1
+ {"version":3,"file":"attachment.js","sources":["../../../src/components/assistant-ui/attachment.tsx"],"sourcesContent":["\"use client\";\n\nimport { PropsWithChildren, useEffect, useState, type FC } from \"react\";\nimport { XIcon, PlusIcon, FileText } from \"lucide-react\";\nimport {\n AttachmentPrimitive,\n ComposerPrimitive,\n MessagePrimitive,\n useAssistantState,\n useAssistantApi,\n} from \"@assistant-ui/react\";\nimport { useShallow } from \"zustand/shallow\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogTrigger,\n DialogDescription,\n} from \"@/components/ui/dialog\";\nimport { Avatar, AvatarImage, AvatarFallback } from \"@/components/ui/avatar\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport { cn } from \"@/lib/utils\";\nimport AttachmentIcon from \"@/assets/Attachment\";\n\nconst useFileSrc = (file: File | undefined) => {\n const [src, setSrc] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n if (!file) {\n setSrc(undefined);\n return;\n }\n\n const objectUrl = URL.createObjectURL(file);\n setSrc(objectUrl);\n\n return () => {\n URL.revokeObjectURL(objectUrl);\n };\n }, [file]);\n\n return src;\n};\n\nconst useAttachmentSrc = () => {\n const { file, src } = useAssistantState(\n useShallow(({ attachment }): { file?: File; src?: string } => {\n if (attachment.type !== \"image\") return {};\n if (attachment.file) return { file: attachment.file };\n const src = attachment.content?.filter((c) => c.type === \"image\")[0]\n ?.image;\n if (!src) return {};\n return { src };\n })\n );\n\n return useFileSrc(file) ?? src;\n};\n\ntype AttachmentPreviewProps = {\n src: string;\n};\n\nconst AttachmentPreview: FC<AttachmentPreviewProps> = ({ src }) => {\n const [isLoaded, setIsLoaded] = useState(false);\n return (\n <img\n src={src}\n alt=\"Image Preview\"\n width={1}\n height={1}\n className={\n isLoaded\n ? \"aui-attachment-preview-image-loaded block h-auto max-h-[80vh] w-auto max-w-full object-contain\"\n : \"aui-attachment-preview-image-loading hidden\"\n }\n onLoadCapture={() => setIsLoaded(true)}\n // priority={false}\n />\n );\n};\n\nconst AttachmentPreviewDialog: FC<{ children: React.ReactElement }> = ({\n children,\n}) => {\n const src = useAttachmentSrc();\n\n if (!src) return children;\n\n return (\n <Dialog>\n <DialogTrigger\n className=\"aui-attachment-preview-trigger cursor-pointer transition-colors hover:bg-accent/50\"\n asChild\n >\n {children}\n </DialogTrigger>\n <DialogContent className=\"aui-attachment-preview-dialog-content p-2 sm:max-w-3xl [&_svg]:text-background [&>button]:rounded-full [&>button]:bg-foreground/60 [&>button]:p-1 [&>button]:opacity-100 [&>button]:!ring-0 [&>button]:hover:[&_svg]:text-destructive\">\n <DialogTitle className=\"aui-sr-only sr-only\">\n Image Attachment Preview\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n Preview of attached image file\n </DialogDescription>\n <div className=\"aui-attachment-preview relative mx-auto flex max-h-[80dvh] w-full items-center justify-center overflow-hidden bg-background\">\n <AttachmentPreview src={src} />\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst AttachmentThumb: FC = () => {\n const isImage = useAssistantState(\n ({ attachment }) => attachment.type === \"image\"\n );\n const src = useAttachmentSrc();\n\n return (\n <Avatar className=\"aui-attachment-tile-avatar h-full w-full rounded-none\">\n <AvatarImage\n src={src}\n alt=\"Attachment preview\"\n className=\"aui-attachment-tile-image object-cover\"\n />\n <AvatarFallback delayMs={isImage ? 200 : 0}>\n <FileText className=\"aui-attachment-tile-fallback-icon size-8 text-muted-foreground\" />\n </AvatarFallback>\n </Avatar>\n );\n};\n\nconst AttachmentUI: FC = () => {\n const api = useAssistantApi();\n const isComposer = api.attachment.source === \"composer\";\n\n const isImage = useAssistantState(\n ({ attachment }) => attachment.type === \"image\"\n );\n const typeLabel = useAssistantState(({ attachment }) => {\n const type = attachment.type;\n switch (type) {\n case \"image\":\n return \"Image\";\n case \"document\":\n return \"Document\";\n case \"file\":\n return \"File\";\n default:\n const _exhaustiveCheck: never = type;\n throw new Error(`Unknown attachment type: ${_exhaustiveCheck}`);\n }\n });\n\n return (\n <Tooltip>\n <AttachmentPrimitive.Root\n className={cn(\n \"aui-attachment-root relative\",\n isImage &&\n \"aui-attachment-root-composer only:[&>#attachment-tile]:size-24\"\n )}\n >\n <AttachmentPreviewDialog>\n <TooltipTrigger asChild>\n <div\n className={cn(\n \"aui-attachment-tile size-14 cursor-pointer overflow-hidden rounded-[14px] border bg-muted transition-opacity hover:opacity-75\",\n isComposer &&\n \"aui-attachment-tile-composer border-foreground/20\"\n )}\n role=\"button\"\n id=\"attachment-tile\"\n aria-label={`${typeLabel} attachment`}\n >\n <AttachmentThumb />\n </div>\n </TooltipTrigger>\n </AttachmentPreviewDialog>\n {isComposer && <AttachmentRemove />}\n </AttachmentPrimitive.Root>\n <TooltipContent side=\"top\">\n <AttachmentPrimitive.Name />\n </TooltipContent>\n </Tooltip>\n );\n};\n\nconst AttachmentRemove: FC = () => {\n return (\n <AttachmentPrimitive.Remove asChild>\n <TooltipIconButton\n tooltip=\"Remove file\"\n 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\"\n side=\"top\"\n >\n <XIcon className=\"aui-attachment-remove-icon size-3\" />\n </TooltipIconButton>\n </AttachmentPrimitive.Remove>\n );\n};\n\nexport const UserMessageAttachments: FC = () => {\n return (\n <div className=\"aui-user-message-attachments-end col-span-full col-start-1 row-start-1 flex w-full flex-row justify-end gap-2\">\n <MessagePrimitive.Attachments components={{ Attachment: AttachmentUI }} />\n </div>\n );\n};\n\nexport const ComposerAttachments: FC = () => {\n return (\n <div className=\"aui-composer-attachments mb-2 flex w-full flex-row items-center gap-2 overflow-x-auto px-1.5 pt-0.5 pb-1 empty:hidden\">\n <ComposerPrimitive.Attachments\n components={{ Attachment: AttachmentUI }}\n />\n </div>\n );\n};\n\nexport const ComposerAddAttachment: FC = () => {\n return (\n <ComposerPrimitive.AddAttachment asChild>\n <div\n className=\"aui-composer-add-attachment size-[16px] p-0 rounded-full text-xs font-semibold hover:bg-muted-foreground/15 flex items-center\"\n aria-label=\"Add Attachment\"\n >\n <AttachmentIcon className=\"aui-attachment-add-icon size-[16px] stroke-[2px]\" />\n </div>\n </ComposerPrimitive.AddAttachment>\n );\n};\n"],"names":["_jsx","_jsxs","AttachmentPrimitive.Root","AttachmentPrimitive.Name","AttachmentPrimitive.Remove","XIcon","MessagePrimitive.Attachments","ComposerPrimitive.Attachments","ComposerPrimitive.AddAttachment"],"mappings":"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"}
@@ -113,7 +113,7 @@ const NewThread = () => {
113
113
  });
114
114
  ref.current?.setCurrentThread(id);
115
115
  };
116
- return (jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "\u65B0\u4F1A\u8BDD", onClick: handleCreateNewThread, className: "flex h-[30px] w-[30px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:opacity-50 disabled:pointer-events-none", children: jsxRuntime.jsx(NewSession, {}) }));
116
+ return (jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "\u65B0\u4F1A\u8BDD", onClick: handleCreateNewThread, className: "flex h-[32px] w-[32px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50 disabled:opacity-50 disabled:pointer-events-none", children: jsxRuntime.jsx(NewSession, {}) }));
117
117
  };
118
118
  const ClearThread = () => {
119
119
  const ref = ChatkitContext.useChatkitRef();
@@ -121,19 +121,20 @@ const ClearThread = () => {
121
121
  ref.current?.clearCurrentThread();
122
122
  };
123
123
  const { currentThread } = useThread();
124
- return (jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "\u6E05\u7A7A\u4F1A\u8BDD", disabled: currentThread?.messages.length === 0, onClick: handleCreateNewThread, className: utils.cn("flex h-[38px] w-[38px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:pointer-events-none", currentThread?.messages.length === 0 && "opacity-50 pointer-events-none"), children: jsxRuntime.jsx(ClearIcon, { className: "h-[18px] w-[18px]" }) }));
124
+ const disabled = currentThread?.messages.length === 0 || currentThread?.loading;
125
+ return (jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "\u6E05\u7A7A\u4F1A\u8BDD", disabled: disabled, onClick: handleCreateNewThread, className: utils.cn("flex size-[38px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50", currentThread?.messages.length === 0 || currentThread?.loading && "opacity-50 pointer-events-none", disabled && "opacity-50 pointer-events-none"), children: jsxRuntime.jsx(ClearIcon, { className: "size-[16px]" }) }));
125
126
  };
126
127
  const ThreadWelcome = () => {
127
128
  return (jsxRuntime.jsx("div", { className: "aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col", children: jsxRuntime.jsx("div", { className: "aui-thread-welcome-center flex w-full flex-col items-center justify-center", children: jsxRuntime.jsx("div", { className: "aui-thread-welcome-message flex size-full flex-col justify-center px-8 text-[24px] text-center font-medium leading-[100%] text-[#0C0D0E]", children: "\u4F60\u597D" }) }) }));
128
129
  };
129
130
  const Composer = () => {
130
131
  const { showThreadList, placeholder } = ChatkitContext.useChatkitContext();
131
- return (jsxRuntime.jsxs("div", { className: "aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6", children: [jsxRuntime.jsx(ThreadScrollToBottom, {}), jsxRuntime.jsxs("div", { className: "flex items-center gap-[10px]", children: [jsxRuntime.jsx("div", { className: "flex items-center justify-center rounded-[1px]", children: showThreadList ? jsxRuntime.jsx(NewThread, {}) : jsxRuntime.jsx(ClearThread, {}) }), jsxRuntime.jsxs(ComposerRoot.ComposerPrimitiveRoot, { className: "aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[68px] border border-[#EAEDF1] bg-background px-4 py-[10px] shadow-sm transition-all outline-none focus-within:border-primary/50 focus-within:ring-1 focus-within:ring-primary/50 dark:bg-background dark:border-muted", children: [jsxRuntime.jsx(attachment.ComposerAttachments, {}), jsxRuntime.jsxs("div", { className: "flex items-center w-full gap-2", children: [jsxRuntime.jsx(ComposerInput.ComposerPrimitiveInput, { placeholder: placeholder, className: "aui-composer-input max-h-32 min-h-[24px] flex-1 resize-none bg-transparent py-0 text-base outline-none placeholder:text-muted-foreground", rows: 1, autoFocus: true, "aria-label": "Message input" }), jsxRuntime.jsx(ComposerAction, {})] })] })] })] }));
132
+ return (jsxRuntime.jsxs("div", { className: "aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6", children: [jsxRuntime.jsx(ThreadScrollToBottom, {}), jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntime.jsx("div", { className: "", children: showThreadList ? jsxRuntime.jsx(NewThread, {}) : jsxRuntime.jsx(ClearThread, {}) }), jsxRuntime.jsxs(ComposerRoot.ComposerPrimitiveRoot, { className: "aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[24px] border border-[#EAEDF1] bg-background px-4 py-3 shadow-sm transition-all outline-none focus-within:border-primary/50 focus-within:ring-1 focus-within:ring-primary/50 dark:bg-background dark:border-muted", children: [jsxRuntime.jsx(attachment.ComposerAttachments, {}), jsxRuntime.jsxs("div", { className: "flex items-center w-full gap-2", children: [jsxRuntime.jsx(ComposerInput.ComposerPrimitiveInput, { placeholder: placeholder, className: "aui-composer-input max-h-32 min-h-[24px] flex-1 resize-none bg-transparent py-0 text-[14px] leading-[22px] outline-none placeholder:text-muted-foreground", rows: 1, autoFocus: true, "aria-label": "Message input" }), jsxRuntime.jsx(ComposerAction, {})] })] })] })] }));
132
133
  };
133
134
  const ComposerAction = () => {
134
135
  const { currentThread } = useThread();
135
136
  const plugins = ChatkitContext.useChatkitPlugins();
136
- return (jsxRuntime.jsxs("div", { className: "aui-composer-action-wrapper flex items-center gap-3", children: [jsxRuntime.jsx("div", { className: "flex items-center gap-2", children: plugins.map((plugin, idx) => (jsxRuntime.jsx("div", { className: "flex items-center justify-center", children: plugin }, idx))) }), jsxRuntime.jsx("div", { className: "h-5 w-[1px] bg-[#E5E7EB] dark:bg-border" }), jsxRuntime.jsx(ThreadIf.ThreadPrimitiveIf, { running: false, children: jsxRuntime.jsx(ComposerSend.ComposerPrimitiveSend, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "\u53D1\u9001", type: "submit", variant: "default", size: "icon", className: "aui-composer-send rounded-full size-[30px] bg-[#1664FF] text-white hover:bg-primary/10 hover:text-primary p-0", "aria-label": "Send message", children: currentThread?.loading ? (jsxRuntime.jsx(loaderCircle.default, { className: "aui-composer-send-icon size-[18px] animate-spin" })) : (jsxRuntime.jsx(arrowUp.default, { className: "aui-composer-send-icon size-[18px]" })) }) }) }), jsxRuntime.jsx(ThreadIf.ThreadPrimitiveIf, { running: true, children: jsxRuntime.jsx(ComposerCancel.ComposerPrimitiveCancel, { asChild: true, children: jsxRuntime.jsx(button.Button, { type: "button", variant: "default", size: "icon", className: "aui-composer-cancel size-[30px] rounded-full border border-muted-foreground/60 hover:bg-primary/75 dark:border-muted-foreground/90", "aria-label": "Stop generating", children: jsxRuntime.jsx(AbortMessage, { className: "aui-composer-cancel-icon size-[30px] fill-white" }) }) }) })] }));
137
+ return (jsxRuntime.jsxs("div", { className: "aui-composer-action-wrapper flex items-center gap-3", children: [jsxRuntime.jsx("div", { className: "flex items-center gap-2", children: plugins.map((plugin, idx) => (jsxRuntime.jsx("div", { className: "flex items-center justify-center", children: plugin }, idx))) }), jsxRuntime.jsx("div", { className: "h-5 w-[1px] bg-[#E5E7EB]" }), jsxRuntime.jsx(ThreadIf.ThreadPrimitiveIf, { running: false, children: jsxRuntime.jsx(ComposerSend.ComposerPrimitiveSend, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "\u53D1\u9001", type: "submit", variant: "ghost", size: "icon", className: "aui-composer-send size-8 bg-[#1664FF] rounded-full text-white text-primary hover:bg-primary/10 hover:text-primary p-0", "aria-label": "Send message", children: currentThread?.loading ? (jsxRuntime.jsx(loaderCircle.default, { className: "aui-composer-send-icon size-[16px] animate-spin" })) : (jsxRuntime.jsx(arrowUp.default, { className: "aui-composer-send-icon size-[16px] text-white " })) }) }) }), jsxRuntime.jsx(ThreadIf.ThreadPrimitiveIf, { running: true, children: jsxRuntime.jsx(ComposerCancel.ComposerPrimitiveCancel, { asChild: true, children: jsxRuntime.jsx(button.Button, { type: "button", variant: "default", size: "icon", className: "aui-composer-cancel size-[32px] rounded-full border border-muted-foreground/60 hover:bg-primary/75 dark:border-muted-foreground/90", "aria-label": "Stop generating", children: jsxRuntime.jsx(AbortMessage, { className: "aui-composer-cancel-icon size-[32px] fill-white " }) }) }) })] }));
137
138
  };
138
139
  const MessageError = () => {
139
140
  return (jsxRuntime.jsx(MessageError$1.MessagePrimitiveError, { children: jsxRuntime.jsxs(ErrorRoot.ErrorPrimitiveRoot, { className: "aui-message-error-root mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/5 dark:text-red-200", children: [jsxRuntime.jsx("div", { className: "font-medium text-destructive text-red-500", children: "\u8BF7\u6C42\u51FA\u73B0\u9519\u8BEF\uFF01" }), jsxRuntime.jsx(ErrorMessage.ErrorPrimitiveMessage, { className: "aui-message-error-message line-clamp-2" })] }) }));
@@ -161,13 +162,7 @@ const AssistantActionBar = () => {
161
162
  }
162
163
  return "";
163
164
  });
164
- const canDownload = useAssistantState.useAssistantState(({ message }) => {
165
- if ((message.role !== "assistant" || message.status?.type !== "running") &&
166
- message.parts.some((c) => c.type === "text" && c.text.length > 0)) {
167
- return message.status?.type === "incomplete" && !!message.status.error;
168
- }
169
- });
170
- return (jsxRuntime.jsxs(ActionBarRoot.ActionBarPrimitiveRoot, { hideWhenRunning: true, autohide: "never", autohideFloat: "single-branch", className: "aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] 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", children: [jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "positive" ? undefined : "positive"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Like", children: jsxRuntime.jsx(ThumbUpIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "positive" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "negative" ? undefined : "negative"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Dislike", children: jsxRuntime.jsx(ThumbDownIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "negative" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { className: "w-[1px] h-[12px] bg-[#DDE2E9]" }), jsxRuntime.jsx(ActionBarCopy.ActionBarPrimitiveCopy, { asChild: true, children: jsxRuntime.jsxs(tooltipIconButton.TooltipIconButton, { tooltip: "Copy", children: [jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: true, children: jsxRuntime.jsx(check.default, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]" }) }), jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: false, children: jsxRuntime.jsx(Copy, { className: "aui-assistant-action-bar-copy-icon size-[16px]" }) })] }) }), jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "download", disabled: canDownload, onClick: () => {
165
+ return (jsxRuntime.jsxs(ActionBarRoot.ActionBarPrimitiveRoot, { hideWhenRunning: true, autohide: "never", autohideFloat: "single-branch", className: "aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] 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", children: [jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "positive" ? undefined : "positive"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Like", children: jsxRuntime.jsx(ThumbUpIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "positive" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "negative" ? undefined : "negative"), children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Dislike", children: jsxRuntime.jsx(ThumbDownIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "negative" ? "#000" : undefined }) }) }), jsxRuntime.jsx("div", { className: "w-[1px] h-[12px] bg-[#DDE2E9]" }), jsxRuntime.jsx(ActionBarCopy.ActionBarPrimitiveCopy, { asChild: true, children: jsxRuntime.jsxs(tooltipIconButton.TooltipIconButton, { tooltip: "Copy", children: [jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: true, children: jsxRuntime.jsx(check.default, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]" }) }), jsxRuntime.jsx(MessageIf.MessagePrimitiveIf, { copied: false, children: jsxRuntime.jsx(Copy, { className: "aui-assistant-action-bar-copy-icon size-[16px]" }) })] }) }), jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "download", onClick: () => {
171
166
  download.saveStringToMarkdown(downloadContent, "message.md");
172
167
  }, children: jsxRuntime.jsx(Download, { className: "aui-assistant-action-bar-refresh-icon size-[16px]" }) }), jsxRuntime.jsx(ActionBarReload.ActionBarPrimitiveReload, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Refresh", children: jsxRuntime.jsx(RefreshIcon, { className: "aui-assistant-action-bar-refresh-icon size-[16px]" }) }) })] }));
173
168
  };
@@ -1 +1 @@
1
- {"version":3,"file":"thread.cjs","sources":["../../../src/components/assistant-ui/thread.tsx"],"sourcesContent":["import {\n ArrowDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n PencilIcon,\n Square,\n Share2Icon, // 添加分享图标\n MoreHorizontalIcon,\n LoaderCircle,\n} from \"lucide-react\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n ErrorPrimitive,\n MessagePrimitive,\n ThreadPrimitive,\n useAssistantState,\n useMessagePartText,\n} from \"@assistant-ui/react\";\n\nimport { useMemo, useState, type FC, type PropsWithChildren } from \"react\";\nimport { LazyMotion, MotionConfig, domAnimation } from \"motion/react\";\nimport * as m from \"motion/react-m\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { MarkdownText } from \"@/components/assistant-ui/markdown-text\";\nimport { ToolFallback } from \"@/components/assistant-ui/tool-fallback\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport {\n ComposerAddAttachment,\n ComposerAttachments,\n UserMessageAttachments,\n} from \"@/components/assistant-ui/attachment\";\nimport { File } from \"@/components/assistant-ui/file\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Reasoning, ReasoningGroup } from \"./reasoning\";\nimport {\n useChatkitContext,\n useChatkitPlugins,\n useChatkitRef,\n} from \"@/contexts/ChatkitContext\";\nimport ThumbUpIcon from \"@/assets/ThumbUpIcon\";\nimport ThumbDownIcon from \"@/assets/ThumbDownIcon\";\nimport CopyIcon from \"@/assets/Copy\";\nimport RefreshIcon from \"@/assets/RefreshIcon\";\nimport ThreadHeader from \"./thread-header\";\nimport NewSession from \"@/assets/NewSession\";\nimport dayjs from \"dayjs\";\nimport useThread from \"@/hooks/useThread\";\nimport Recommend from \"../welcome\";\nimport { saveStringToMarkdown } from \"@/utils/download\";\nimport Download from \"@/assets/Download\";\nimport AbortMessage from \"@/assets/AbortMessage\";\nimport ClearIcon from \"@/assets/ClearIcon\";\n\nexport const Thread: FC<{\n welcome?: React.ReactNode;\n recommends?: string[];\n}> = ({ welcome, recommends }) => {\n const { currentThread } = useThread();\n const ref = useChatkitRef();\n const welcomeElement = useMemo(() => {\n if (welcome) return welcome;\n if (recommends)\n return (\n <Recommend\n recommends={recommends}\n onSelect={(question) => {\n ref.current?.sendMessage({\n content: [\n {\n type: \"text\",\n text: question,\n },\n ],\n });\n }}\n />\n );\n return undefined;\n }, [recommends]);\n const { showHeader } = useChatkitContext();\n return (\n <div className=\"min-w-full h-full flex flex-col\">\n {showHeader && (\n <ThreadHeader title={currentThread?.name || \"Thread Title\"} />\n )}\n <LazyMotion features={domAnimation}>\n <MotionConfig reducedMotion=\"user\">\n <ThreadPrimitive.Root\n className=\"aui-root aui-thread-root @container flex-1 flex h-[calc(100%-65px)] flex-col bg-background\"\n style={{\n [\"--thread-max-width\" as string]: \"66rem\",\n }}\n >\n <ThreadPrimitive.If empty={false}>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll px-4\">\n <ThreadPrimitive.Messages\n components={{\n UserMessage,\n EditComposer,\n AssistantMessage,\n }}\n />\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9 bg-white\" />\n <Composer />\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n <ThreadPrimitive.If empty>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-auto px-4 justify-center gap-[80px] \">\n <div className=\"min-h-12 grow z-9 bg-white\" />\n {currentThread?.loading ? (\n <div className=\"flex items-center justify-center gap-1.5 h-[180px]\">\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"0ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"150ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"300ms\",\n }}\n />\n </div>\n ) : (\n welcomeElement ?? <ThreadWelcome />\n )}\n <div className=\"min-h-12 grow z-9 bg-white\" />\n <div className=\"flex items-center\">\n <Composer />\n </div>\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n </ThreadPrimitive.Root>\n </MotionConfig>\n </LazyMotion>\n </div>\n );\n};\n\nconst ThreadScrollToBottom: FC = () => {\n return (\n <ThreadPrimitive.ScrollToBottom asChild>\n <TooltipIconButton\n tooltip=\"Scroll to bottom\"\n variant=\"outline\"\n className=\"aui-thread-scroll-to-bottom absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible dark:bg-background dark:hover:bg-accent\"\n >\n <ArrowDownIcon />\n </TooltipIconButton>\n </ThreadPrimitive.ScrollToBottom>\n );\n};\n\nconst NewThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n // 新建会话的逻辑\n const id = `thread-${Date.now()}`;\n ref.current?.addThread({\n id,\n name: \"新对话\",\n sending: false,\n metadata: {},\n messages: [],\n createdAt: dayjs().unix(),\n });\n ref.current?.setCurrentThread(id);\n };\n\n return (\n <TooltipIconButton\n tooltip=\"新会话\"\n onClick={handleCreateNewThread}\n className=\"flex h-[30px] w-[30px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:opacity-50 disabled:pointer-events-none\"\n >\n <NewSession />\n </TooltipIconButton>\n );\n};\n\nconst ClearThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n ref.current?.clearCurrentThread();\n };\n const { currentThread } = useThread();\n\n return (\n <TooltipIconButton\n tooltip=\"清空会话\"\n disabled={currentThread?.messages.length === 0}\n onClick={handleCreateNewThread}\n className={cn(\n \"flex h-[38px] w-[38px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:pointer-events-none\",\n currentThread?.messages.length === 0 && \"opacity-50 pointer-events-none\"\n )}\n >\n <ClearIcon className=\"h-[18px] w-[18px]\" />\n </TooltipIconButton>\n );\n};\n\nconst ThreadWelcome: FC = () => {\n return (\n <div className=\"aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col\">\n <div className=\"aui-thread-welcome-center flex w-full flex-col items-center justify-center\">\n <div className=\"aui-thread-welcome-message flex size-full flex-col justify-center px-8 text-[24px] text-center font-medium leading-[100%] text-[#0C0D0E]\">\n 你好\n </div>\n </div>\n </div>\n );\n};\n\nconst ThreadSuggestions: FC = () => {\n return (\n <div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n 你好\n </div>\n );\n};\n\nconst Composer: FC = () => {\n const { showThreadList, placeholder } = useChatkitContext();\n return (\n <div className=\"aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6\">\n <ThreadScrollToBottom />\n <div className=\"flex items-center gap-[10px]\">\n <div className=\"flex items-center justify-center rounded-[1px]\">\n {showThreadList ? <NewThread /> : <ClearThread />}\n </div>\n <ComposerPrimitive.Root className=\"aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[68px] border border-[#EAEDF1] bg-background px-4 py-[10px] shadow-sm transition-all outline-none focus-within:border-primary/50 focus-within:ring-1 focus-within:ring-primary/50 dark:bg-background dark:border-muted\">\n <ComposerAttachments />\n <div className=\"flex items-center w-full gap-2\">\n <ComposerPrimitive.Input\n placeholder={placeholder}\n className=\"aui-composer-input max-h-32 min-h-[24px] flex-1 resize-none bg-transparent py-0 text-base outline-none placeholder:text-muted-foreground\"\n rows={1}\n autoFocus\n aria-label=\"Message input\"\n />\n <ComposerAction />\n </div>\n </ComposerPrimitive.Root>\n </div>\n </div>\n );\n};\n\nconst ComposerAction: FC = () => {\n const { currentThread } = useThread();\n const plugins = useChatkitPlugins();\n return (\n <div className=\"aui-composer-action-wrapper flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n {plugins.map((plugin, idx) => (\n <div key={idx} className=\"flex items-center justify-center\">\n {plugin}\n </div>\n ))}\n </div>\n\n <div className=\"h-5 w-[1px] bg-[#E5E7EB] dark:bg-border\" />\n\n <ThreadPrimitive.If running={false}>\n <ComposerPrimitive.Send asChild>\n <TooltipIconButton\n tooltip=\"发送\"\n type=\"submit\"\n variant=\"default\"\n size=\"icon\"\n className=\"aui-composer-send rounded-full size-[30px] bg-[#1664FF] text-white hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n {currentThread?.loading ? (\n <LoaderCircle className=\"aui-composer-send-icon size-[18px] animate-spin\" />\n ) : (\n <ArrowUpIcon className=\"aui-composer-send-icon size-[18px]\" />\n )}\n </TooltipIconButton>\n </ComposerPrimitive.Send>\n </ThreadPrimitive.If>\n\n <ThreadPrimitive.If running>\n <ComposerPrimitive.Cancel asChild>\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"icon\"\n className=\"aui-composer-cancel size-[30px] rounded-full border border-muted-foreground/60 hover:bg-primary/75 dark:border-muted-foreground/90\"\n aria-label=\"Stop generating\"\n >\n <AbortMessage className=\"aui-composer-cancel-icon size-[30px] fill-white\" />\n </Button>\n </ComposerPrimitive.Cancel>\n </ThreadPrimitive.If>\n </div>\n );\n};\n\nconst MessageError: FC = () => {\n return (\n <MessagePrimitive.Error>\n <ErrorPrimitive.Root className=\"aui-message-error-root mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/5 dark:text-red-200\">\n <div className=\"font-medium text-destructive text-red-500\">\n 请求出现错误!\n </div>\n <ErrorPrimitive.Message className=\"aui-message-error-message line-clamp-2\" />\n </ErrorPrimitive.Root>\n </MessagePrimitive.Error>\n );\n};\n\nconst ToolGroup: FC<\n PropsWithChildren<{ startIndex: number; endIndex: number }>\n> = ({ startIndex, endIndex, children }) => {\n const toolCount = endIndex - startIndex + 1;\n return (\n <details className=\"my-2\">\n <summary className=\"cursor-pointer font-medium\">\n {toolCount} tool {toolCount === 1 ? \"call\" : \"calls\"}\n </summary>\n <div className=\"space-y-2 pl-4\">{children}</div>\n </details>\n );\n};\nconst AssistantMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-assistant-message-root relative mx-auto w-full max-w-[var(--thread-max-width)] py-4 duration-150 slide-in-from-bottom-1 last:mb-24\"\n data-role=\"assistant\"\n >\n <div className=\"group\">\n <div className=\"aui-assistant-message-content mx-2 leading-7 break-words text-foreground flex flex-col gap-[12px]\">\n <MessagePrimitive.Parts\n components={{\n Text: MarkdownText,\n tools: { Fallback: ToolFallback },\n File,\n Reasoning,\n // ToolGroup,\n ReasoningGroup,\n }}\n />\n <MessageError />\n </div>\n\n <div className=\"aui-assistant-message-footer mt-2 ml-2 flex hover:visible opacity-0 group-hover:opacity-100 transition-opacity duration-200\">\n <BranchPicker />\n <AssistantActionBar />\n </div>\n </div>\n </div>\n </MessagePrimitive.Root>\n );\n};\n\nconst AssistantActionBar: FC = () => {\n const [submittedFeedback, setSubmittedFeedback] = useState<\n \"positive\" | \"negative\" | undefined\n >(undefined);\n const { currentThread } = useThread();\n\n const downloadContent = useAssistantState(({ message }) => {\n if (\n (message.role !== \"assistant\" || message.status?.type !== \"running\") &&\n message.parts.some((c) => c.type === \"text\" && c.text.length > 0)\n ) {\n return message.parts\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n }\n return \"\";\n });\n\n const canDownload = useAssistantState(({ message }) => {\n if (\n (message.role !== \"assistant\" || message.status?.type !== \"running\") &&\n message.parts.some((c) => c.type === \"text\" && c.text.length > 0)\n ) {\n return message.status?.type === \"incomplete\" && !!message.status.error;\n }\n });\n\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n autohide=\"never\"\n autohideFloat=\"single-branch\"\n className=\"aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] 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\"\n >\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"positive\" ? undefined : \"positive\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Like\">\n <ThumbUpIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"positive\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"negative\" ? undefined : \"negative\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Dislike\">\n <ThumbDownIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"negative\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n\n <div className=\"w-[1px] h-[12px] bg-[#DDE2E9]\" />\n <ActionBarPrimitive.Copy asChild>\n <TooltipIconButton tooltip=\"Copy\">\n <MessagePrimitive.If copied>\n <CheckIcon className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\" />\n </MessagePrimitive.If>\n <MessagePrimitive.If copied={false}>\n <CopyIcon className=\"aui-assistant-action-bar-copy-icon size-[16px]\" />\n </MessagePrimitive.If>\n </TooltipIconButton>\n </ActionBarPrimitive.Copy>\n\n <TooltipIconButton\n tooltip=\"download\"\n disabled={canDownload}\n onClick={() => {\n saveStringToMarkdown(downloadContent, \"message.md\");\n }}\n >\n <Download className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n <ActionBarPrimitive.Reload asChild>\n <TooltipIconButton tooltip=\"Refresh\">\n <RefreshIcon className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Reload>\n </ActionBarPrimitive.Root>\n );\n};\n\n// const UserActionBar: FC = () => {\n// return (\n// <ActionBarPrimitive.Root\n// hideWhenRunning\n// autohide=\"not-last\"\n// className=\"aui-user-action-bar-root flex flex-col items-end\"\n// >\n// <ActionBarPrimitive.Edit asChild>\n// <TooltipIconButton tooltip=\"Edit\" className=\"aui-user-action-edit p-4\">\n// <PencilIcon />\n// </TooltipIconButton>\n// </ActionBarPrimitive.Edit>\n// </ActionBarPrimitive.Root>\n// );\n// };\n\nconst EditComposer: FC = () => {\n return (\n <div className=\"aui-edit-composer-wrapper mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 px-2 first:mt-4\">\n <ComposerPrimitive.Root className=\"aui-edit-composer-root ml-auto flex w-full max-w-7/8 flex-col rounded-xl bg-muted\">\n <ComposerPrimitive.Input\n className=\"aui-edit-composer-input flex min-h-[60px] w-full resize-none bg-transparent p-4 text-foreground outline-none\"\n autoFocus\n />\n\n <div className=\"aui-edit-composer-footer mx-3 mb-3 flex items-center justify-center gap-2 self-end\">\n <ComposerPrimitive.Cancel asChild>\n <Button variant=\"ghost\" size=\"sm\" aria-label=\"Cancel edit\">\n Cancel\n </Button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <Button size=\"sm\" aria-label=\"Update message\">\n Update\n </Button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n </div>\n );\n};\n\nconst BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({\n className,\n ...rest\n}) => {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className={cn(\n \"aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground\",\n className\n )}\n {...rest}\n >\n <BranchPickerPrimitive.Previous asChild>\n <TooltipIconButton tooltip=\"Previous\">\n <ChevronLeftIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Previous>\n <span className=\"aui-branch-picker-state font-medium\">\n <BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <TooltipIconButton tooltip=\"Next\">\n <ChevronRightIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n};\n\nconst UserMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-150 ease-out fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2 group\"\n data-role=\"user\"\n >\n <UserMessageAttachments />\n\n <div className=\"aui-user-message-content-wrapper relative col-start-2 min-w-0\">\n <div className=\"aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#F3F7FF] rounded-[8px]\">\n <MessagePrimitive.Parts />\n </div>\n {/* <div className=\"aui-user-action-bar-wrapper invisible group-hover:visible transition-all duration-200\">\n <UserActionBar />\n </div> */}\n </div>\n\n {/* 移除了下方工具栏代码 */}\n\n <BranchPicker className=\"aui-user-branch-picker col-span-full col-start-1 row-start-3 -mr-1 justify-end\" />\n </div>\n </MessagePrimitive.Root>\n );\n};\n\n// 2. 修改UserActionBar组件,添加编辑、分享和更多选项功能\nconst UserActionBar: FC = () => {\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n className=\"aui-user-action-bar-root flex items-end gap-2 justify-end bg-background p-1 rounded-md\"\n >\n <ActionBarPrimitive.Edit asChild>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <PencilIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Edit>\n\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <Share2Icon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <MoreHorizontalIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Root>\n );\n};\n"],"names":["welcome","useChatkitRef","useMemo","_jsx","Recommend","useChatkitContext","_jsxs","ThreadHeader","LazyMotion","domAnimation","MotionConfig","ThreadPrimitive.Root","ThreadPrimitive.If","ThreadPrimitive.Viewport","ThreadPrimitive.Messages","ThreadPrimitive.ScrollToBottom","TooltipIconButton","ArrowDownIcon","dayjs","cn","ComposerPrimitive.Root","ComposerAttachments","ComposerPrimitive.Input","useChatkitPlugins","ComposerPrimitive.Send","LoaderCircle","ArrowUpIcon","ComposerPrimitive.Cancel","Button","MessagePrimitive.Error","ErrorPrimitive.Root","ErrorPrimitive.Message","MessagePrimitive.Root","MessagePrimitive.Parts","MarkdownText","ToolFallback","File","Reasoning","ReasoningGroup","useState","useAssistantState","ActionBarPrimitive.Root","ActionBarPrimitive.Copy","MessagePrimitive.If","CheckIcon","CopyIcon","saveStringToMarkdown","ActionBarPrimitive.Reload","BranchPickerPrimitive.Root","BranchPickerPrimitive.Previous","ChevronLeftIcon","BranchPickerPrimitive.Number","BranchPickerPrimitive.Count","BranchPickerPrimitive.Next","ChevronRightIcon","UserMessageAttachments"],"mappings":"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"}
1
+ {"version":3,"file":"thread.cjs","sources":["../../../src/components/assistant-ui/thread.tsx"],"sourcesContent":["import {\n ArrowDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n PencilIcon,\n Square,\n Share2Icon, // 添加分享图标\n MoreHorizontalIcon,\n LoaderCircle,\n Mic,\n} from \"lucide-react\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n ErrorPrimitive,\n MessagePrimitive,\n ThreadPrimitive,\n useAssistantState,\n useMessagePartText,\n} from \"@assistant-ui/react\";\n\nimport { useMemo, useState, type FC, type PropsWithChildren } from \"react\";\nimport { LazyMotion, MotionConfig, domAnimation } from \"motion/react\";\nimport * as m from \"motion/react-m\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { MarkdownText } from \"@/components/assistant-ui/markdown-text\";\nimport { ToolFallback } from \"@/components/assistant-ui/tool-fallback\";\nimport { TooltipIconButton } from \"@/components/assistant-ui/tooltip-icon-button\";\nimport {\n ComposerAddAttachment,\n ComposerAttachments,\n UserMessageAttachments,\n} from \"@/components/assistant-ui/attachment\";\nimport { File } from \"@/components/assistant-ui/file\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Reasoning, ReasoningGroup } from \"./reasoning\";\nimport {\n useChatkitContext,\n useChatkitPlugins,\n useChatkitRef,\n} from \"@/contexts/ChatkitContext\";\nimport ThumbUpIcon from \"@/assets/ThumbUpIcon\";\nimport ThumbDownIcon from \"@/assets/ThumbDownIcon\";\nimport CopyIcon from \"@/assets/Copy\";\nimport RefreshIcon from \"@/assets/RefreshIcon\";\nimport ThreadHeader from \"./thread-header\";\nimport NewSession from \"@/assets/NewSession\";\nimport dayjs from \"dayjs\";\nimport useThread from \"@/hooks/useThread\";\nimport Recommend from \"../welcome\";\nimport { saveStringToMarkdown } from \"@/utils/download\";\nimport Download from \"@/assets/Download\";\nimport AbortMessage from \"@/assets/AbortMessage\";\nimport ClearIcon from \"@/assets/ClearIcon\";\n\nexport const Thread: FC<{\n welcome?: React.ReactNode;\n recommends?: string[];\n}> = ({ welcome, recommends }) => {\n const { currentThread } = useThread();\n const ref = useChatkitRef();\n const welcomeElement = useMemo(() => {\n if (welcome) return welcome;\n if (recommends)\n return (\n <Recommend\n recommends={recommends}\n onSelect={(question) => {\n ref.current?.sendMessage({\n content: [\n {\n type: \"text\",\n text: question,\n },\n ],\n });\n }}\n />\n );\n return undefined;\n }, [recommends]);\n const { showHeader } = useChatkitContext();\n return (\n <div className=\"min-w-full h-full flex flex-col\">\n {showHeader && (\n <ThreadHeader title={currentThread?.name || \"Thread Title\"} />\n )}\n <LazyMotion features={domAnimation}>\n <MotionConfig reducedMotion=\"user\">\n <ThreadPrimitive.Root\n className=\"aui-root aui-thread-root @container flex-1 flex h-[calc(100%-65px)] flex-col bg-background\"\n style={{\n [\"--thread-max-width\" as string]: \"66rem\",\n }}\n >\n <ThreadPrimitive.If empty={false}>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll px-4\">\n <ThreadPrimitive.Messages\n components={{\n UserMessage,\n EditComposer,\n AssistantMessage,\n }}\n />\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9 bg-white\" />\n <Composer />\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n <ThreadPrimitive.If empty>\n <ThreadPrimitive.Viewport className=\"aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-auto px-4 justify-center gap-[80px] \">\n <div className=\"min-h-12 grow z-9 bg-white\" />\n {currentThread?.loading ? (\n <div className=\"flex items-center justify-center gap-1.5 h-[180px]\">\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"0ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"150ms\",\n }}\n />\n <span\n className=\"w-2.5 h-2.5 bg-gray-500 rounded-full\"\n style={{\n animation: \"bounce 1s ease-in-out infinite\",\n animationDelay: \"300ms\",\n }}\n />\n </div>\n ) : (\n welcomeElement ?? <ThreadWelcome />\n )}\n <div className=\"min-h-12 grow z-9 bg-white\" />\n <div className=\"flex items-center\">\n <Composer />\n </div>\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n </ThreadPrimitive.Root>\n </MotionConfig>\n </LazyMotion>\n </div>\n );\n};\n\nconst ThreadScrollToBottom: FC = () => {\n return (\n <ThreadPrimitive.ScrollToBottom asChild>\n <TooltipIconButton\n tooltip=\"Scroll to bottom\"\n variant=\"outline\"\n className=\"aui-thread-scroll-to-bottom absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible dark:bg-background dark:hover:bg-accent\"\n >\n <ArrowDownIcon />\n </TooltipIconButton>\n </ThreadPrimitive.ScrollToBottom>\n );\n};\n\nconst NewThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n // 新建会话的逻辑\n const id = `thread-${Date.now()}`;\n ref.current?.addThread({\n id,\n name: \"新对话\",\n sending: false,\n metadata: {},\n messages: [],\n createdAt: dayjs().unix(),\n });\n ref.current?.setCurrentThread(id);\n };\n\n return (\n <TooltipIconButton\n tooltip=\"新会话\"\n onClick={handleCreateNewThread}\n className=\"flex h-[32px] w-[32px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50 disabled:opacity-50 disabled:pointer-events-none\"\n >\n <NewSession />\n </TooltipIconButton>\n );\n};\n\nconst ClearThread = () => {\n const ref = useChatkitRef();\n const handleCreateNewThread = () => {\n ref.current?.clearCurrentThread();\n };\n const { currentThread } = useThread();\n\n const disabled = currentThread?.messages.length === 0||currentThread?.loading;\n return (\n <TooltipIconButton\n tooltip=\"清空会话\"\n disabled={disabled}\n onClick={handleCreateNewThread}\n className={cn(\"flex size-[38px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50\", currentThread?.messages.length === 0||currentThread?.loading && \"opacity-50 pointer-events-none\",disabled && \"opacity-50 pointer-events-none\")}\n\n >\n <ClearIcon className=\"size-[16px]\" />\n </TooltipIconButton>\n );\n};\n\nconst ThreadWelcome: FC = () => {\n return (\n <div className=\"aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col\">\n <div className=\"aui-thread-welcome-center flex w-full flex-col items-center justify-center\">\n <div className=\"aui-thread-welcome-message flex size-full flex-col justify-center px-8 text-[24px] text-center font-medium leading-[100%] text-[#0C0D0E]\">\n 你好\n </div>\n </div>\n </div>\n );\n};\n\nconst ThreadSuggestions: FC = () => {\n return (\n <div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n 你好\n </div>\n );\n};\n\nconst Composer: FC = () => {\n const { showThreadList, placeholder } = useChatkitContext();\n return (\n <div className=\"aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6\">\n <ThreadScrollToBottom />\n <div className=\"flex items-center gap-2\">\n <div className=\"\">\n {showThreadList ? <NewThread /> : <ClearThread />}\n </div>\n <ComposerPrimitive.Root className=\"aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[24px] border border-[#EAEDF1] bg-background px-4 py-3 shadow-sm transition-all outline-none focus-within:border-primary/50 focus-within:ring-1 focus-within:ring-primary/50 dark:bg-background dark:border-muted\">\n <ComposerAttachments />\n <div className=\"flex items-center w-full gap-2\">\n <ComposerPrimitive.Input\n placeholder={placeholder}\n className=\"aui-composer-input max-h-32 min-h-[24px] flex-1 resize-none bg-transparent py-0 text-[14px] leading-[22px] outline-none placeholder:text-muted-foreground\"\n rows={1}\n autoFocus\n aria-label=\"Message input\"\n />\n <ComposerAction />\n </div>\n </ComposerPrimitive.Root>\n </div>\n </div>\n );\n};\n\nconst ComposerAction: FC = () => {\n const { currentThread } = useThread();\n const plugins = useChatkitPlugins();\n return (\n <div className=\"aui-composer-action-wrapper flex items-center gap-3\">\n \n <div className=\"flex items-center gap-2\">\n {plugins.map((plugin, idx) => (\n <div\n key={idx}\n className=\"flex items-center justify-center\"\n >\n {plugin}\n </div>\n ))}\n </div>\n\n <div className=\"h-5 w-[1px] bg-[#E5E7EB]\" />\n\n <ThreadPrimitive.If running={false}>\n <ComposerPrimitive.Send asChild>\n <TooltipIconButton\n tooltip=\"发送\"\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"aui-composer-send size-8 bg-[#1664FF] rounded-full text-white text-primary hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n {currentThread?.loading ? (\n <LoaderCircle className=\"aui-composer-send-icon size-[16px] animate-spin\" />\n ) : (\n <ArrowUpIcon className=\"aui-composer-send-icon size-[16px] text-white \" />\n )}\n </TooltipIconButton>\n </ComposerPrimitive.Send>\n </ThreadPrimitive.If>\n\n <ThreadPrimitive.If running>\n <ComposerPrimitive.Cancel asChild>\n <Button\n type=\"button\"\n variant=\"default\"\n size=\"icon\"\n className=\"aui-composer-cancel size-[32px] rounded-full border border-muted-foreground/60 hover:bg-primary/75 dark:border-muted-foreground/90\"\n aria-label=\"Stop generating\"\n >\n <AbortMessage className=\"aui-composer-cancel-icon size-[32px] fill-white \" />\n </Button>\n </ComposerPrimitive.Cancel>\n </ThreadPrimitive.If>\n </div>\n );\n};\n\nconst MessageError: FC = () => {\n return (\n <MessagePrimitive.Error>\n <ErrorPrimitive.Root className=\"aui-message-error-root mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/5 dark:text-red-200\">\n <div className=\"font-medium text-destructive text-red-500\">\n 请求出现错误!\n </div>\n <ErrorPrimitive.Message className=\"aui-message-error-message line-clamp-2\" />\n </ErrorPrimitive.Root>\n </MessagePrimitive.Error>\n );\n};\n\nconst ToolGroup: FC<\n PropsWithChildren<{ startIndex: number; endIndex: number }>\n> = ({ startIndex, endIndex, children }) => {\n const toolCount = endIndex - startIndex + 1;\n return (\n <details className=\"my-2\">\n <summary className=\"cursor-pointer font-medium\">\n {toolCount} tool {toolCount === 1 ? \"call\" : \"calls\"}\n </summary>\n <div className=\"space-y-2 pl-4\">{children}</div>\n </details>\n );\n};\nconst AssistantMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-assistant-message-root relative mx-auto w-full max-w-[var(--thread-max-width)] py-4 duration-150 slide-in-from-bottom-1 last:mb-24\"\n data-role=\"assistant\"\n >\n <div className=\"group\">\n <div className=\"aui-assistant-message-content mx-2 leading-7 break-words text-foreground flex flex-col gap-[12px]\">\n <MessagePrimitive.Parts\n components={{\n Text: MarkdownText,\n tools: { Fallback: ToolFallback },\n File,\n Reasoning,\n // ToolGroup,\n ReasoningGroup,\n }}\n />\n <MessageError />\n </div>\n\n <div className=\"aui-assistant-message-footer mt-2 ml-2 flex hover:visible opacity-0 group-hover:opacity-100 transition-opacity duration-200\">\n <BranchPicker />\n <AssistantActionBar />\n </div>\n </div>\n </div>\n </MessagePrimitive.Root>\n );\n};\n\nconst AssistantActionBar: FC = () => {\n const [submittedFeedback, setSubmittedFeedback] = useState<\n \"positive\" | \"negative\" | undefined\n >(undefined);\n const { currentThread } = useThread();\n\n const downloadContent = useAssistantState(({ message }) => {\n if (\n (message.role !== \"assistant\" || message.status?.type !== \"running\") &&\n message.parts.some((c) => c.type === \"text\" && c.text.length > 0)\n ) {\n return message.parts\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\\n\");\n }\n return \"\";\n });\n\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n autohide=\"never\"\n autohideFloat=\"single-branch\"\n className=\"aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] 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\"\n >\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"positive\" ? undefined : \"positive\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Like\">\n <ThumbUpIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"positive\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n <div\n className=\"flex items-center justify-center\"\n onClick={() =>\n setSubmittedFeedback(\n submittedFeedback === \"negative\" ? undefined : \"negative\"\n )\n }\n >\n <TooltipIconButton tooltip=\"Dislike\">\n <ThumbDownIcon\n className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\"\n fill={submittedFeedback === \"negative\" ? \"#000\" : undefined}\n />\n </TooltipIconButton>\n </div>\n\n <div className=\"w-[1px] h-[12px] bg-[#DDE2E9]\" />\n <ActionBarPrimitive.Copy asChild>\n <TooltipIconButton tooltip=\"Copy\">\n <MessagePrimitive.If copied>\n <CheckIcon className=\"aui-assistant-action-bar-copy-check-icon size-[16px]\" />\n </MessagePrimitive.If>\n <MessagePrimitive.If copied={false}>\n <CopyIcon className=\"aui-assistant-action-bar-copy-icon size-[16px]\" />\n </MessagePrimitive.If>\n </TooltipIconButton>\n </ActionBarPrimitive.Copy>\n\n <TooltipIconButton\n tooltip=\"download\"\n onClick={() => {\n saveStringToMarkdown(downloadContent, \"message.md\");\n }}\n >\n <Download className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n <ActionBarPrimitive.Reload asChild>\n <TooltipIconButton tooltip=\"Refresh\">\n <RefreshIcon className=\"aui-assistant-action-bar-refresh-icon size-[16px]\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Reload>\n </ActionBarPrimitive.Root>\n );\n};\n\n// const UserActionBar: FC = () => {\n// return (\n// <ActionBarPrimitive.Root\n// hideWhenRunning\n// autohide=\"not-last\"\n// className=\"aui-user-action-bar-root flex flex-col items-end\"\n// >\n// <ActionBarPrimitive.Edit asChild>\n// <TooltipIconButton tooltip=\"Edit\" className=\"aui-user-action-edit p-4\">\n// <PencilIcon />\n// </TooltipIconButton>\n// </ActionBarPrimitive.Edit>\n// </ActionBarPrimitive.Root>\n// );\n// };\n\nconst EditComposer: FC = () => {\n return (\n <div className=\"aui-edit-composer-wrapper mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 px-2 first:mt-4\">\n <ComposerPrimitive.Root className=\"aui-edit-composer-root ml-auto flex w-full max-w-7/8 flex-col rounded-xl bg-muted\">\n <ComposerPrimitive.Input\n className=\"aui-edit-composer-input flex min-h-[60px] w-full resize-none bg-transparent p-4 text-foreground outline-none\"\n autoFocus\n />\n\n <div className=\"aui-edit-composer-footer mx-3 mb-3 flex items-center justify-center gap-2 self-end\">\n <ComposerPrimitive.Cancel asChild>\n <Button variant=\"ghost\" size=\"sm\" aria-label=\"Cancel edit\">\n Cancel\n </Button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <Button size=\"sm\" aria-label=\"Update message\">\n Update\n </Button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n </div>\n );\n};\n\nconst BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({\n className,\n ...rest\n}) => {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className={cn(\n \"aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground\",\n className\n )}\n {...rest}\n >\n <BranchPickerPrimitive.Previous asChild>\n <TooltipIconButton tooltip=\"Previous\">\n <ChevronLeftIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Previous>\n <span className=\"aui-branch-picker-state font-medium\">\n <BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <TooltipIconButton tooltip=\"Next\">\n <ChevronRightIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n};\n\nconst UserMessage: FC = () => {\n return (\n <MessagePrimitive.Root asChild>\n <div\n className=\"aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-150 ease-out fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2 group\"\n data-role=\"user\"\n >\n <UserMessageAttachments />\n\n <div className=\"aui-user-message-content-wrapper relative col-start-2 min-w-0\">\n <div className=\"aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#F3F7FF] rounded-[8px]\">\n <MessagePrimitive.Parts />\n </div>\n {/* <div className=\"aui-user-action-bar-wrapper invisible group-hover:visible transition-all duration-200\">\n <UserActionBar />\n </div> */}\n </div>\n\n {/* 移除了下方工具栏代码 */}\n\n <BranchPicker className=\"aui-user-branch-picker col-span-full col-start-1 row-start-3 -mr-1 justify-end\" />\n </div>\n </MessagePrimitive.Root>\n );\n};\n\n// 2. 修改UserActionBar组件,添加编辑、分享和更多选项功能\nconst UserActionBar: FC = () => {\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n className=\"aui-user-action-bar-root flex items-end gap-2 justify-end bg-background p-1 rounded-md\"\n >\n <ActionBarPrimitive.Edit asChild>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <PencilIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Edit>\n\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <Share2Icon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n <TooltipIconButton tooltip=\"编辑\" className=\"aui-user-action-edit\">\n <MoreHorizontalIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Root>\n );\n};\n"],"names":["welcome","useChatkitRef","useMemo","_jsx","Recommend","useChatkitContext","_jsxs","ThreadHeader","LazyMotion","domAnimation","MotionConfig","ThreadPrimitive.Root","ThreadPrimitive.If","ThreadPrimitive.Viewport","ThreadPrimitive.Messages","ThreadPrimitive.ScrollToBottom","TooltipIconButton","ArrowDownIcon","dayjs","cn","ComposerPrimitive.Root","ComposerAttachments","ComposerPrimitive.Input","useChatkitPlugins","ComposerPrimitive.Send","LoaderCircle","ArrowUpIcon","ComposerPrimitive.Cancel","Button","MessagePrimitive.Error","ErrorPrimitive.Root","ErrorPrimitive.Message","MessagePrimitive.Root","MessagePrimitive.Parts","MarkdownText","ToolFallback","File","Reasoning","ReasoningGroup","useState","useAssistantState","ActionBarPrimitive.Root","ActionBarPrimitive.Copy","MessagePrimitive.If","CheckIcon","CopyIcon","saveStringToMarkdown","ActionBarPrimitive.Reload","BranchPickerPrimitive.Root","BranchPickerPrimitive.Previous","ChevronLeftIcon","BranchPickerPrimitive.Number","BranchPickerPrimitive.Count","BranchPickerPrimitive.Next","ChevronRightIcon","UserMessageAttachments"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/thread.tsx"],"names":[],"mappings":"AAwBA,OAAO,EAAqB,KAAK,EAAE,EAA0B,MAAM,OAAO,CAAC;AAoC3E,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CA2FA,CAAC"}
1
+ {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/thread.tsx"],"names":[],"mappings":"AAyBA,OAAO,EAAqB,KAAK,EAAE,EAA0B,MAAM,OAAO,CAAC;AAoC3E,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CA2FA,CAAC"}
@@ -111,7 +111,7 @@ const NewThread = () => {
111
111
  });
112
112
  ref.current?.setCurrentThread(id);
113
113
  };
114
- return (jsx(TooltipIconButton, { tooltip: "\u65B0\u4F1A\u8BDD", onClick: handleCreateNewThread, className: "flex h-[30px] w-[30px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:opacity-50 disabled:pointer-events-none", children: jsx(NewSession, {}) }));
114
+ return (jsx(TooltipIconButton, { tooltip: "\u65B0\u4F1A\u8BDD", onClick: handleCreateNewThread, className: "flex h-[32px] w-[32px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50 disabled:opacity-50 disabled:pointer-events-none", children: jsx(NewSession, {}) }));
115
115
  };
116
116
  const ClearThread = () => {
117
117
  const ref = useChatkitRef();
@@ -119,19 +119,20 @@ const ClearThread = () => {
119
119
  ref.current?.clearCurrentThread();
120
120
  };
121
121
  const { currentThread } = useThread();
122
- return (jsx(TooltipIconButton, { tooltip: "\u6E05\u7A7A\u4F1A\u8BDD", disabled: currentThread?.messages.length === 0, onClick: handleCreateNewThread, className: cn("flex h-[38px] w-[38px] items-center justify-center rounded-full bg-background border border-[#EAEDF1] dark:border-muted text-foreground transition-colors hover:bg-accent disabled:pointer-events-none", currentThread?.messages.length === 0 && "opacity-50 pointer-events-none"), children: jsx(ClearIcon, { className: "h-[18px] w-[18px]" }) }));
122
+ const disabled = currentThread?.messages.length === 0 || currentThread?.loading;
123
+ return (jsx(TooltipIconButton, { tooltip: "\u6E05\u7A7A\u4F1A\u8BDD", disabled: disabled, onClick: handleCreateNewThread, className: cn("flex size-[38px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50", currentThread?.messages.length === 0 || currentThread?.loading && "opacity-50 pointer-events-none", disabled && "opacity-50 pointer-events-none"), children: jsx(ClearIcon, { className: "size-[16px]" }) }));
123
124
  };
124
125
  const ThreadWelcome = () => {
125
126
  return (jsx("div", { className: "aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col", children: jsx("div", { className: "aui-thread-welcome-center flex w-full flex-col items-center justify-center", children: jsx("div", { className: "aui-thread-welcome-message flex size-full flex-col justify-center px-8 text-[24px] text-center font-medium leading-[100%] text-[#0C0D0E]", children: "\u4F60\u597D" }) }) }));
126
127
  };
127
128
  const Composer = () => {
128
129
  const { showThreadList, placeholder } = useChatkitContext();
129
- return (jsxs("div", { className: "aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6", children: [jsx(ThreadScrollToBottom, {}), jsxs("div", { className: "flex items-center gap-[10px]", children: [jsx("div", { className: "flex items-center justify-center rounded-[1px]", children: showThreadList ? jsx(NewThread, {}) : jsx(ClearThread, {}) }), jsxs(ComposerPrimitiveRoot, { className: "aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[68px] border border-[#EAEDF1] bg-background px-4 py-[10px] shadow-sm transition-all outline-none focus-within:border-primary/50 focus-within:ring-1 focus-within:ring-primary/50 dark:bg-background dark:border-muted", children: [jsx(ComposerAttachments, {}), jsxs("div", { className: "flex items-center w-full gap-2", children: [jsx(ComposerPrimitiveInput, { placeholder: placeholder, className: "aui-composer-input max-h-32 min-h-[24px] flex-1 resize-none bg-transparent py-0 text-base outline-none placeholder:text-muted-foreground", rows: 1, autoFocus: true, "aria-label": "Message input" }), jsx(ComposerAction, {})] })] })] })] }));
130
+ return (jsxs("div", { className: "aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6", children: [jsx(ThreadScrollToBottom, {}), jsxs("div", { className: "flex items-center gap-2", children: [jsx("div", { className: "", children: showThreadList ? jsx(NewThread, {}) : jsx(ClearThread, {}) }), jsxs(ComposerPrimitiveRoot, { className: "aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[24px] border border-[#EAEDF1] bg-background px-4 py-3 shadow-sm transition-all outline-none focus-within:border-primary/50 focus-within:ring-1 focus-within:ring-primary/50 dark:bg-background dark:border-muted", children: [jsx(ComposerAttachments, {}), jsxs("div", { className: "flex items-center w-full gap-2", children: [jsx(ComposerPrimitiveInput, { placeholder: placeholder, className: "aui-composer-input max-h-32 min-h-[24px] flex-1 resize-none bg-transparent py-0 text-[14px] leading-[22px] outline-none placeholder:text-muted-foreground", rows: 1, autoFocus: true, "aria-label": "Message input" }), jsx(ComposerAction, {})] })] })] })] }));
130
131
  };
131
132
  const ComposerAction = () => {
132
133
  const { currentThread } = useThread();
133
134
  const plugins = useChatkitPlugins();
134
- return (jsxs("div", { className: "aui-composer-action-wrapper flex items-center gap-3", children: [jsx("div", { className: "flex items-center gap-2", children: plugins.map((plugin, idx) => (jsx("div", { className: "flex items-center justify-center", children: plugin }, idx))) }), jsx("div", { className: "h-5 w-[1px] bg-[#E5E7EB] dark:bg-border" }), jsx(ThreadPrimitiveIf, { running: false, children: jsx(ComposerPrimitiveSend, { asChild: true, children: jsx(TooltipIconButton, { tooltip: "\u53D1\u9001", type: "submit", variant: "default", size: "icon", className: "aui-composer-send rounded-full size-[30px] bg-[#1664FF] text-white hover:bg-primary/10 hover:text-primary p-0", "aria-label": "Send message", children: currentThread?.loading ? (jsx(LoaderCircle, { className: "aui-composer-send-icon size-[18px] animate-spin" })) : (jsx(ArrowUp, { className: "aui-composer-send-icon size-[18px]" })) }) }) }), jsx(ThreadPrimitiveIf, { running: true, children: jsx(ComposerPrimitiveCancel, { asChild: true, children: jsx(Button, { type: "button", variant: "default", size: "icon", className: "aui-composer-cancel size-[30px] rounded-full border border-muted-foreground/60 hover:bg-primary/75 dark:border-muted-foreground/90", "aria-label": "Stop generating", children: jsx(AbortMessage, { className: "aui-composer-cancel-icon size-[30px] fill-white" }) }) }) })] }));
135
+ return (jsxs("div", { className: "aui-composer-action-wrapper flex items-center gap-3", children: [jsx("div", { className: "flex items-center gap-2", children: plugins.map((plugin, idx) => (jsx("div", { className: "flex items-center justify-center", children: plugin }, idx))) }), jsx("div", { className: "h-5 w-[1px] bg-[#E5E7EB]" }), jsx(ThreadPrimitiveIf, { running: false, children: jsx(ComposerPrimitiveSend, { asChild: true, children: jsx(TooltipIconButton, { tooltip: "\u53D1\u9001", type: "submit", variant: "ghost", size: "icon", className: "aui-composer-send size-8 bg-[#1664FF] rounded-full text-white text-primary hover:bg-primary/10 hover:text-primary p-0", "aria-label": "Send message", children: currentThread?.loading ? (jsx(LoaderCircle, { className: "aui-composer-send-icon size-[16px] animate-spin" })) : (jsx(ArrowUp, { className: "aui-composer-send-icon size-[16px] text-white " })) }) }) }), jsx(ThreadPrimitiveIf, { running: true, children: jsx(ComposerPrimitiveCancel, { asChild: true, children: jsx(Button, { type: "button", variant: "default", size: "icon", className: "aui-composer-cancel size-[32px] rounded-full border border-muted-foreground/60 hover:bg-primary/75 dark:border-muted-foreground/90", "aria-label": "Stop generating", children: jsx(AbortMessage, { className: "aui-composer-cancel-icon size-[32px] fill-white " }) }) }) })] }));
135
136
  };
136
137
  const MessageError = () => {
137
138
  return (jsx(MessagePrimitiveError, { children: jsxs(ErrorPrimitiveRoot, { className: "aui-message-error-root mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-sm text-destructive dark:bg-destructive/5 dark:text-red-200", children: [jsx("div", { className: "font-medium text-destructive text-red-500", children: "\u8BF7\u6C42\u51FA\u73B0\u9519\u8BEF\uFF01" }), jsx(ErrorPrimitiveMessage, { className: "aui-message-error-message line-clamp-2" })] }) }));
@@ -159,13 +160,7 @@ const AssistantActionBar = () => {
159
160
  }
160
161
  return "";
161
162
  });
162
- const canDownload = useAssistantState(({ message }) => {
163
- if ((message.role !== "assistant" || message.status?.type !== "running") &&
164
- message.parts.some((c) => c.type === "text" && c.text.length > 0)) {
165
- return message.status?.type === "incomplete" && !!message.status.error;
166
- }
167
- });
168
- return (jsxs(ActionBarPrimitiveRoot, { hideWhenRunning: true, autohide: "never", autohideFloat: "single-branch", className: "aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] 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", children: [jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "positive" ? undefined : "positive"), children: jsx(TooltipIconButton, { tooltip: "Like", children: jsx(ThumbUpIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "positive" ? "#000" : undefined }) }) }), jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "negative" ? undefined : "negative"), children: jsx(TooltipIconButton, { tooltip: "Dislike", children: jsx(ThumbDownIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "negative" ? "#000" : undefined }) }) }), jsx("div", { className: "w-[1px] h-[12px] bg-[#DDE2E9]" }), jsx(ActionBarPrimitiveCopy, { asChild: true, children: jsxs(TooltipIconButton, { tooltip: "Copy", children: [jsx(MessagePrimitiveIf, { copied: true, children: jsx(Check, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]" }) }), jsx(MessagePrimitiveIf, { copied: false, children: jsx(CopyIcon, { className: "aui-assistant-action-bar-copy-icon size-[16px]" }) })] }) }), jsx(TooltipIconButton, { tooltip: "download", disabled: canDownload, onClick: () => {
163
+ return (jsxs(ActionBarPrimitiveRoot, { hideWhenRunning: true, autohide: "never", autohideFloat: "single-branch", className: "aui-assistant-action-bar-root col-start-3 row-start-2 -ml-1 flex items-center gap-[8px] 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", children: [jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "positive" ? undefined : "positive"), children: jsx(TooltipIconButton, { tooltip: "Like", children: jsx(ThumbUpIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "positive" ? "#000" : undefined }) }) }), jsx("div", { className: "flex items-center justify-center", onClick: () => setSubmittedFeedback(submittedFeedback === "negative" ? undefined : "negative"), children: jsx(TooltipIconButton, { tooltip: "Dislike", children: jsx(ThumbDownIcon, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]", fill: submittedFeedback === "negative" ? "#000" : undefined }) }) }), jsx("div", { className: "w-[1px] h-[12px] bg-[#DDE2E9]" }), jsx(ActionBarPrimitiveCopy, { asChild: true, children: jsxs(TooltipIconButton, { tooltip: "Copy", children: [jsx(MessagePrimitiveIf, { copied: true, children: jsx(Check, { className: "aui-assistant-action-bar-copy-check-icon size-[16px]" }) }), jsx(MessagePrimitiveIf, { copied: false, children: jsx(CopyIcon, { className: "aui-assistant-action-bar-copy-icon size-[16px]" }) })] }) }), jsx(TooltipIconButton, { tooltip: "download", onClick: () => {
169
164
  saveStringToMarkdown(downloadContent, "message.md");
170
165
  }, children: jsx(Download, { className: "aui-assistant-action-bar-refresh-icon size-[16px]" }) }), jsx(ActionBarPrimitiveReload, { asChild: true, children: jsx(TooltipIconButton, { tooltip: "Refresh", children: jsx(RefreshIcon, { className: "aui-assistant-action-bar-refresh-icon size-[16px]" }) }) })] }));
171
166
  };