@chat-lab/ui 0.1.0-beta.73 → 0.1.0-beta.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Chatkit/index.cjs +2 -1
- package/dist/components/Chatkit/index.cjs.map +1 -1
- package/dist/components/Chatkit/index.js +2 -1
- package/dist/components/Chatkit/index.js.map +1 -1
- package/dist/components/assistant-ui/markdown-text.cjs +5 -3
- package/dist/components/assistant-ui/markdown-text.cjs.map +1 -1
- package/dist/components/assistant-ui/markdown-text.d.ts.map +1 -1
- package/dist/components/assistant-ui/markdown-text.js +5 -3
- package/dist/components/assistant-ui/markdown-text.js.map +1 -1
- package/dist/components/assistant-ui/thread.cjs +8 -9
- package/dist/components/assistant-ui/thread.cjs.map +1 -1
- package/dist/components/assistant-ui/thread.d.ts.map +1 -1
- package/dist/components/assistant-ui/thread.js +8 -9
- package/dist/components/assistant-ui/thread.js.map +1 -1
- package/dist/contexts/ChatkitContext.cjs.map +1 -1
- package/dist/contexts/ChatkitContext.d.ts +1 -0
- package/dist/contexts/ChatkitContext.d.ts.map +1 -1
- package/dist/contexts/ChatkitContext.js.map +1 -1
- package/dist/core/dist/index.cjs +5 -3
- package/dist/core/dist/index.cjs.map +1 -1
- package/dist/core/dist/index.js +5 -3
- package/dist/core/dist/index.js.map +1 -1
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.cjs +1 -1
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.cjs.map +1 -1
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.js +1 -1
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.js.map +1 -1
- package/dist/hooks/useClawChat/clawCompletion.cjs +13 -7
- package/dist/hooks/useClawChat/clawCompletion.cjs.map +1 -1
- package/dist/hooks/useClawChat/clawCompletion.d.ts.map +1 -1
- package/dist/hooks/useClawChat/clawCompletion.js +13 -7
- package/dist/hooks/useClawChat/clawCompletion.js.map +1 -1
- package/dist/hooks/useClawChat/clawPlugin.cjs +24 -0
- package/dist/hooks/useClawChat/clawPlugin.cjs.map +1 -0
- package/dist/hooks/useClawChat/clawPlugin.d.ts +10 -0
- package/dist/hooks/useClawChat/clawPlugin.d.ts.map +1 -0
- package/dist/hooks/useClawChat/clawPlugin.js +22 -0
- package/dist/hooks/useClawChat/clawPlugin.js.map +1 -0
- package/dist/hooks/useClawChat/index.cjs +24 -8
- package/dist/hooks/useClawChat/index.cjs.map +1 -1
- package/dist/hooks/useClawChat/index.d.ts.map +1 -1
- package/dist/hooks/useClawChat/index.js +24 -8
- package/dist/hooks/useClawChat/index.js.map +1 -1
- package/dist/hooks/useClawChat/types.cjs +1 -1
- package/dist/hooks/useClawChat/types.cjs.map +1 -1
- package/dist/hooks/useClawChat/types.d.ts +12 -5
- package/dist/hooks/useClawChat/types.d.ts.map +1 -1
- package/dist/hooks/useClawChat/types.js +1 -1
- package/dist/hooks/useClawChat/types.js.map +1 -1
- package/dist/index.css +1 -1
- package/package.json +1 -1
- package/dist/assets/Attachment.cjs +0 -8
- package/dist/assets/Attachment.cjs.map +0 -1
- package/dist/assets/Attachment.js +0 -6
- package/dist/assets/Attachment.js.map +0 -1
- package/dist/assets/ClearIcon.cjs +0 -8
- package/dist/assets/ClearIcon.cjs.map +0 -1
- package/dist/assets/ClearIcon.js +0 -6
- package/dist/assets/ClearIcon.js.map +0 -1
- package/dist/assets/Download.cjs +0 -10
- package/dist/assets/Download.cjs.map +0 -1
- package/dist/assets/Download.js +0 -8
- package/dist/assets/Download.js.map +0 -1
- package/dist/assets/NewSession.cjs +0 -8
- package/dist/assets/NewSession.cjs.map +0 -1
- package/dist/assets/NewSession.js +0 -6
- package/dist/assets/NewSession.js.map +0 -1
- package/dist/assets/RefreshIcon.cjs +0 -8
- package/dist/assets/RefreshIcon.cjs.map +0 -1
- package/dist/assets/RefreshIcon.js +0 -6
- package/dist/assets/RefreshIcon.js.map +0 -1
- package/dist/assets/ThumbDownIcon.cjs +0 -8
- package/dist/assets/ThumbDownIcon.cjs.map +0 -1
- package/dist/assets/ThumbDownIcon.js +0 -6
- package/dist/assets/ThumbDownIcon.js.map +0 -1
- package/dist/assets/ThumbUpIcon.cjs +0 -8
- package/dist/assets/ThumbUpIcon.cjs.map +0 -1
- package/dist/assets/ThumbUpIcon.js +0 -6
- package/dist/assets/ThumbUpIcon.js.map +0 -1
|
@@ -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 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 useAssistantApi,\n useAssistantState,\n} from '@assistant-ui/react';\n\nimport {\n useMemo, useState, type FC, type PropsWithChildren,\n} from 'react';\nimport { LazyMotion, MotionConfig, domAnimation } from 'motion/react';\nimport * as m from 'motion/react-m';\n\nimport { Checkbox } from '@radix-ui/react-checkbox';\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 {\n useChatkitContext,\n useChatkitPlugins,\n useChatkitRef,\n} from '@/contexts/ChatkitContext';\nimport { useI18n } from '@/contexts/I18nContext';\nimport ThumbUpIcon from '@/assets/ThumbUpIcon';\nimport ThumbDownIcon from '@/assets/ThumbDownIcon';\nimport CopyIcon from '@/assets/Copy';\nimport RefreshIcon from '@/assets/RefreshIcon';\nimport NewSession from '@/assets/NewSession';\nimport dayjs from 'dayjs';\nimport useThread from '@/hooks/useThread';\nimport { saveStringToMarkdown } from '@/utils/download';\nimport Download from '@/assets/Download';\nimport AbortMessage from '@/assets/AbortMessage';\nimport ClearIcon from '@/assets/ClearIcon';\nimport { Thread as ThreadType, useSnapshot } from '@chat-lab/core';\nimport { TooltipTrigger } from '@radix-ui/react-tooltip';\nimport Recommend from '../welcome';\nimport ThreadHeader from './thread-header';\nimport { Reasoning, ReasoningGroup } from './reasoning';\nimport { assistantMessageComponentsWithAvatar } from './message-components-with-avatar';\nimport { Tooltip, TooltipContent } from '../ui/tooltip';\n\nconst assistantMessageComponents = {\n Text: MarkdownText,\n tools: { Fallback: ToolFallback },\n File,\n Reasoning,\n ReasoningGroup,\n};\n\nconst userMessageComponents = { Text: MarkdownText };\nexport const Thread: FC<{\n welcome?: React.ReactNode;\n recommends?: string[];\n}> = ({ welcome, recommends }) => {\n const { currentThread } = useThread();\n\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?.sendMessage({\n content: [\n {\n type: 'text',\n text: question,\n },\n ],\n });\n }}\n />\n );\n }\n return undefined;\n }, [recommends, welcome]);\n\n const threadMessageComponents = useMemo(\n () => ({\n UserMessage,\n EditComposer,\n AssistantMessage,\n }),\n [],\n );\n\n const { showHeader, renderHeader, threadMaxWidth } = useChatkitContext();\n return (\n <div className=\"min-w-full h-full flex flex-col\">\n {showHeader\n && (renderHeader ? (\n renderHeader({ thread: currentThread as ThreadType })\n ) : (\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 background: '#white',\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-auto px-4\">\n <ThreadPrimitive.Messages\n components={threadMessageComponents}\n />\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9\" />\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 items-center\">\n <div\n className=\" aui-thread-viewport-spacer min-h-12 grow z-9\"\n style={{\n maxWidth: threadMaxWidth,\n backgroundColor: '#white',\n }}\n />\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 <div\n style={{ maxWidth: threadMaxWidth }}\n className=\"max-w-[var(--thread-max-width)]\"\n >\n {welcomeElement ?? <ThreadWelcome />}\n </div>\n )}\n <div\n className=\"aui-thread-viewport-spacer min-h-12 grow z-9\"\n style={{ background: '#white' }}\n />\n\n <Composer />\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n </ThreadPrimitive.Root>\n </MotionConfig>\n </LazyMotion>\n </div>\n );\n};\n\nconst ThreadScrollToBottom: FC = () => (\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\nfunction NewThread() {\n const ref = useChatkitRef();\n const { t } = useI18n();\n const handleCreateNewThread = async () => {\n // 新建会话的逻辑\n const id = uuid();\n ref\n ?.addThread({\n id,\n name: id,\n sending: false,\n metadata: {},\n messages: [],\n createdAt: dayjs().unix(),\n })\n .then(() => ref?.setCurrentThread(id));\n };\n\n return (\n <TooltipIconButton\n tooltip={t('thread.newChat')}\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\nfunction ClearThread() {\n const ref = useChatkitRef();\n const { t } = useI18n();\n const handleCreateNewThread = () => {\n ref?.clearCurrentThread();\n };\n const { currentThread } = useThread();\n\n const disabled = currentThread?.messages.length === 0 || currentThread?.loading;\n return (\n <TooltipIconButton\n tooltip={t('thread.clearChat')}\n disabled={disabled}\n onClick={handleCreateNewThread}\n className={cn(\n 'flex flex-shrink-0 size-[38px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50',\n disabled && 'opacity-50 pointer-events-none',\n )}\n >\n <ClearIcon className=\"size-[16px]\" />\n </TooltipIconButton>\n );\n}\n\nconst ThreadWelcome: FC = () => {\n const { t } = useI18n();\n const { threadMaxWidth } = useChatkitContext();\n return (\n <div\n className=\"aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col\"\n style={{ maxWidth: threadMaxWidth }}\n >\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 {t('thread.greeting')}\n </div>\n </div>\n </div>\n );\n};\n\nconst ThreadSuggestions: FC = () => {\n const { t } = useI18n();\n return (\n <div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n {t('thread.greeting')}\n </div>\n );\n};\n\nconst Composer: FC = () => {\n const {\n placeholder, composerTop, controller, threadMaxWidth,\n } = useChatkitContext();\n\n const metaData = useSnapshot(controller?.metaData);\n const clawStatus = metaData?.clawStatus;\n const isDisabled = clawStatus?.status === false;\n const disabledReason = clawStatus?.reason || '';\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (isDisabled && e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n // 1. 定义禁用状态和 tooltip 显示状态\n const [open, setOpen] = useState(false);\n\n return (\n <div\n style={{ maxWidth: threadMaxWidth, background: '#white' }}\n 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 >\n <ThreadScrollToBottom />\n {composerTop}\n <div className=\"flex items-center gap-2\">\n <ComposerPrimitive.Root\n className={cn(\n 'aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[24px] border border-[#EAEDF1] bg-background px-[16px] py-[12px] shadow-sm transition-all',\n isDisabled && 'opacity-50 cursor-not-allowed bg-gray-100',\n )}\n >\n <ComposerAttachments />\n {/* <Tooltip\n open={open}\n onOpenChange={(newOpen) => {\n if (!isDisabled) return;\n setOpen(newOpen);\n }}\n >\n <TooltipTrigger> */}\n <div className=\"flex items-center w-full gap-2\">\n <ComposerPrimitive.Input\n placeholder={isDisabled ? disabledReason : placeholder}\n className=\"aui-composer-input max-h-[48px] min-h-[24px] flex-1 overflow-y-auto resize-none bg-transparent py-0 text-[14px] leading-[22px] outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed\"\n rows={1}\n aria-label=\"Message input\"\n disabled={isDisabled}\n onKeyDown={handleKeyDown}\n />\n <ComposerAction\n disabled={isDisabled}\n disabledReason={disabledReason}\n />\n </div>\n {/* </TooltipTrigger>\n <TooltipContent side=\"top\">\n <div\n style={{\n backgroundColor: '#ffffff',\n color: '#1f2937',\n padding: '6px 8px',\n borderRadius: '6px',\n fontSize: '14px',\n border: '1px solid #e5e7eb',\n maxWidth: '240px',\n }}\n >\n <div style={{ fontWeight: 500 }}>{disabledReason}</div>\n </div>\n </TooltipContent>\n </Tooltip> */}\n </ComposerPrimitive.Root>\n </div>\n </div>\n );\n};\n\nconst ComposerAction: FC<{ disabled?: boolean; disabledReason?: string }> = ({\n disabled,\n disabledReason,\n}) => {\n const { currentThread } = useThread();\n const plugins = useChatkitPlugins();\n const { t } = useI18n();\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]\" />\n\n <ThreadPrimitive.If running={false}>\n <ComposerPrimitive.Send asChild>\n <TooltipIconButton\n tooltip={disabled ? disabledReason : t('thread.send')}\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={disabled}\n className={cn(\n 'aui-composer-send size-[32px] rounded-full text-white p-0',\n disabled\n ? 'bg-gray-400 cursor-not-allowed'\n : 'bg-[#1664FF] hover:bg-primary/10 hover:text-primary',\n )}\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 <TooltipIconButton\n tooltip=\"stop\"\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"aui-composer-send size-[32px] bg-[#1664FF] rounded-full text-white text-primary hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n <AbortMessage className=\"aui-composer-send-icon size-[32px] fill-white\" />\n </TooltipIconButton>\n </ComposerPrimitive.Cancel>\n </ThreadPrimitive.If>\n </div>\n );\n};\n\nconst MessageError: FC = () => {\n const { t } = useI18n();\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 {t('thread.requestError')}\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}\n {' '}\n tool\n {toolCount === 1 ? 'call' : 'calls'}\n </summary>\n <div className=\"space-y-2 pl-4\">{children}</div>\n </details>\n );\n};\nconst AssistantMessage: FC = () => {\n const { threadMaxWidth } = useChatkitContext();\n return (\n <MessagePrimitive.Root asChild>\n <div\n style={{ maxWidth: threadMaxWidth }}\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={assistantMessageComponentsWithAvatar}\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 { t } = useI18n();\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 { authors } = useChatkitContext();\n\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n autohide=\"never\"\n autohideFloat=\"single-branch\"\n className={cn(\n '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 authors.length >= 2 ? 'ml-[50px]' : '',\n )}\n >\n {/* <div\n className=\"flex items-center justify-center\"\n onClick={() => setSubmittedFeedback(\n submittedFeedback === 'positive' ? undefined : 'positive',\n )}\n >\n <TooltipIconButton tooltip={t('thread.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={() => setSubmittedFeedback(\n submittedFeedback === 'negative' ? undefined : 'negative',\n )}\n >\n <TooltipIconButton tooltip={t('thread.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={t('thread.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={t('thread.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={t('thread.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 const { t } = useI18n();\n const { threadMaxWidth } = useChatkitContext();\n return (\n <div\n 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 style={{ maxWidth: threadMaxWidth }}\n >\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\n variant=\"ghost\"\n size=\"sm\"\n aria-label={t('thread.cancelEdit')}\n >\n {t('warningModal.cancel')}\n </Button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <Button size=\"sm\" aria-label=\"Update message\">\n {t('thread.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 <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 />\n {' '}\n /\n <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <TooltipIconButton tooltip=\"Next\">\n <ChevronRightIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n);\n\nconst UserMessage: FC = () => {\n const { threadMaxWidth } = useChatkitContext();\n return (\n <MessagePrimitive.Root asChild>\n <div\n style={{ maxWidth: threadMaxWidth }}\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 {/* <Checkbox /> */}\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-[#EDEFFC] rounded-[8px]\">\n <MessagePrimitive.Parts components={userMessageComponents} />\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// 2. 修改UserActionBar组件,添加编辑、分享和更多选项功能\nconst UserActionBar: FC = () => {\n const { t } = useI18n();\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\n tooltip={t('thread.edit')}\n className=\"aui-user-action-edit\"\n >\n <PencilIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Edit>\n\n <TooltipIconButton\n tooltip={t('thread.share')}\n className=\"aui-user-action-edit\"\n >\n <Share2Icon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n <TooltipIconButton\n tooltip={t('thread.more')}\n className=\"aui-user-action-edit\"\n >\n <MoreHorizontalIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Root>\n );\n};\n"],"names":["MarkdownText","welcome","useChatkitRef","useMemo","_jsx","Recommend","useChatkitContext","_jsxs","ThreadHeader","LazyMotion","domAnimation","MotionConfig","ThreadPrimitive","TooltipIconButton","ArrowDownIcon","useI18n","useSnapshot","useState","ComposerPrimitive","cn","ComposerAttachments","useChatkitPlugins","LoaderCircle","ArrowUpIcon","MessagePrimitive","ErrorPrimitive","assistantMessageComponentsWithAvatar","useAssistantState","ActionBarPrimitive","CheckIcon","CopyIcon","Button","BranchPickerPrimitive","ChevronLeftIcon","ChevronRightIcon","UserMessageAttachments"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA8EA,MAAM,qBAAqB,GAAG,EAAE,IAAI,EAAEA,yBAAY,EAAE,CAAC;AACxC,MAAA,MAAM,GAGd,CAAC,WAAEC,SAAO,EAAE,UAAU,EAAE,KAAI;AAC/B,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;AAEtC,IAAA,MAAM,GAAG,GAAGC,4BAAa,EAAE,CAAC;AAC5B,IAAA,MAAM,cAAc,GAAGC,aAAO,CAAC,MAAK;AAClC,QAAA,IAAIF,SAAO;AAAE,YAAA,OAAOA,SAAO,CAAC;QAC5B,IAAI,UAAU,EAAE;AACd,YAAA,QACEG,cAAA,CAACC,OAAS,EAAA,EACR,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,CAAC,QAAQ,KAAI;oBACrB,GAAG,EAAE,WAAW,CAAC;AACf,wBAAA,OAAO,EAAE;AACP,4BAAA;AACE,gCAAA,IAAI,EAAE,MAAM;AACZ,gCAAA,IAAI,EAAE,QAAQ;AACf,6BAAA;AACF,yBAAA;AACF,qBAAA,CAAC,CAAC;iBACJ,EAAA,CACD,EACF;SACH;AACD,QAAA,OAAO,SAAS,CAAC;AACnB,KAAC,EAAE,CAAC,UAAU,EAAEJ,SAAO,CAAC,CAAC,CAAC;AAE1B,IAAA,MAAM,uBAAuB,GAAGE,aAAO,CACrC,OAAO;QACL,WAAW;QACX,YAAY;QACZ,gBAAgB;KACjB,CAAC,EACF,EAAE,CACH,CAAC;IAEF,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,GAAGG,gCAAiB,EAAE,CAAC;AACzE,IAAA,QACEC,eAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,iCAAiC,aAC7C,UAAU;oBACL,YAAY,IACd,YAAY,CAAC,EAAE,MAAM,EAAE,aAA2B,EAAE,CAAC,KAErDH,cAAC,CAAAI,YAAY,EAAC,EAAA,KAAK,EAAE,aAAa,EAAE,IAAI,IAAI,cAAc,GAAI,CAC/D,CAAC,EACJJ,cAAA,CAACK,gBAAU,EAAA,EAAC,QAAQ,EAAEC,kBAAY,EAAA,QAAA,EAChCN,cAAC,CAAAO,kBAAY,EAAC,EAAA,aAAa,EAAC,MAAM,EAAA,QAAA,EAChCJ,eAAC,CAAAK,uBAAe,CAAC,IAAI,EACnB,EAAA,SAAS,EAAC,6FAA6F,EACvG,KAAK,EAAE;4BACL,CAAC,oBAA8B,GAAG,OAAO;AACzC,4BAAA,UAAU,EAAE,QAAQ;AACrB,yBAAA,EAAA,QAAA,EAAA,CAEDR,cAAC,CAAAQ,uBAAe,CAAC,EAAE,EAAC,EAAA,KAAK,EAAE,KAAK,EAC9B,QAAA,EAAAL,eAAA,CAACK,uBAAe,CAAC,QAAQ,EAAA,EAAC,SAAS,EAAC,wFAAwF,EAAA,QAAA,EAAA,CAC1HR,cAAC,CAAAQ,uBAAe,CAAC,QAAQ,EACvB,EAAA,UAAU,EAAE,uBAAuB,EACnC,CAAA,EACFR,wBAAK,SAAS,EAAC,8CAA8C,EAAA,CAAG,EAChEA,cAAA,CAAC,QAAQ,EAAA,EAAA,CAAG,CACa,EAAA,CAAA,EAAA,CACR,EACrBA,cAAA,CAACQ,uBAAe,CAAC,EAAE,EAAA,EAAC,KAAK,EAAA,IAAA,EAAA,QAAA,EACvBL,eAAC,CAAAK,uBAAe,CAAC,QAAQ,EAAC,EAAA,SAAS,EAAC,oHAAoH,EACtJ,QAAA,EAAA,CAAAR,cAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,+CAA+C,EACzD,KAAK,EAAE;AACL,gDAAA,QAAQ,EAAE,cAAc;AACxB,gDAAA,eAAe,EAAE,QAAQ;AAC1B,6CAAA,EAAA,CACD,EACD,aAAa,EAAE,OAAO,IACrBG,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oDAAoD,aACjEH,cACE,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,sCAAsC,EAChD,KAAK,EAAE;AACL,wDAAA,SAAS,EAAE,gCAAgC;AAC3C,wDAAA,cAAc,EAAE,KAAK;AACtB,qDAAA,EAAA,CACD,EACFA,cACE,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,sCAAsC,EAChD,KAAK,EAAE;AACL,wDAAA,SAAS,EAAE,gCAAgC;AAC3C,wDAAA,cAAc,EAAE,OAAO;AACxB,qDAAA,EAAA,CACD,EACFA,cACE,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,sCAAsC,EAChD,KAAK,EAAE;AACL,wDAAA,SAAS,EAAE,gCAAgC;AAC3C,wDAAA,cAAc,EAAE,OAAO;qDACxB,EACD,CAAA,CAAA,EAAA,CACE,KAENA,cAAA,CAAA,KAAA,EAAA,EACE,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EACnC,SAAS,EAAC,iCAAiC,YAE1C,cAAc,IAAIA,cAAC,CAAA,aAAa,EAAG,EAAA,CAAA,EAAA,CAChC,CACP,EACDA,cAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,+CAA+C,EACzD,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,GAC/B,EAEFA,cAAA,CAAC,QAAQ,EAAA,EAAA,CAAG,CACa,EAAA,CAAA,EAAA,CACR,IACA,EACV,CAAA,EAAA,CACJ,CACT,EAAA,CAAA,EACN;AACJ,EAAE;AAEF,MAAM,oBAAoB,GAAO,OAC/BA,cAAA,CAACQ,uBAAe,CAAC,cAAc,EAAC,EAAA,OAAO,EACrC,IAAA,EAAA,QAAA,EAAAR,cAAA,CAACS,mCAAiB,EAChB,EAAA,OAAO,EAAC,kBAAkB,EAC1B,OAAO,EAAC,SAAS,EACjB,SAAS,EAAC,2IAA2I,EAAA,QAAA,EAErJT,eAACU,yBAAa,EAAA,EAAA,CAAG,EACC,CAAA,EAAA,CACW,CAClC,CAAC;AAuDF,MAAM,aAAa,GAAO,MAAK;AAC7B,IAAA,MAAM,EAAE,CAAC,EAAE,GAAGC,mBAAO,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,cAAc,EAAE,GAAGT,gCAAiB,EAAE,CAAC;AAC/C,IAAA,QACEF,cAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,sFAAsF,EAChG,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,YAEnCA,cAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,4EAA4E,EACzF,QAAA,EAAAA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0IAA0I,EACtJ,QAAA,EAAA,CAAC,CAAC,iBAAiB,CAAC,EAAA,CACjB,EACF,CAAA,EAAA,CACF,EACN;AACJ,CAAC,CAAC;AAWF,MAAM,QAAQ,GAAO,MAAK;AACxB,IAAA,MAAM,EACJ,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,GACrD,GAAGE,gCAAiB,EAAE,CAAC;IAExB,MAAM,QAAQ,GAAGU,kBAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACnD,IAAA,MAAM,UAAU,GAAG,QAAQ,EAAE,UAAU,CAAC;AACxC,IAAA,MAAM,UAAU,GAAG,UAAU,EAAE,MAAM,KAAK,KAAK,CAAC;AAChD,IAAA,MAAM,cAAc,GAAG,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC;AAEhD,IAAA,MAAM,aAAa,GAAG,CAAC,CAAsB,KAAI;QAC/C,IAAI,UAAU,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE;YACnC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAC;SACrB;AACH,KAAC,CAAC;;IAGsBC,cAAQ,CAAC,KAAK,EAAE;IAExC,QACEV,yBACE,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,EACzD,SAAS,EAAC,qJAAqJ,EAAA,QAAA,EAAA,CAE/JH,eAAC,oBAAoB,EAAA,EAAA,CAAG,EACvB,WAAW,EACZA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,EACtC,QAAA,EAAAG,eAAA,CAACW,yBAAiB,CAAC,IAAI,EACrB,EAAA,SAAS,EAAEC,QAAE,CACX,qKAAqK,EACrK,UAAU,IAAI,2CAA2C,CAC1D,EAED,QAAA,EAAA,CAAAf,cAAA,CAACgB,8BAAmB,EAAG,EAAA,CAAA,EASvBb,eAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,gCAAgC,aAC7CH,cAAC,CAAAc,yBAAiB,CAAC,KAAK,EAAA,EACtB,WAAW,EAAE,UAAU,GAAG,cAAc,GAAG,WAAW,EACtD,SAAS,EAAC,2MAA2M,EACrN,IAAI,EAAE,CAAC,EACI,YAAA,EAAA,eAAe,EAC1B,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,aAAa,EACxB,CAAA,EACFd,cAAC,CAAA,cAAc,EACb,EAAA,QAAQ,EAAE,UAAU,EACpB,cAAc,EAAE,cAAc,EAAA,CAC9B,IACE,CAkBiB,EAAA,CAAA,EAAA,CACrB,CACF,EAAA,CAAA,EACN;AACJ,CAAC,CAAC;AAEF,MAAM,cAAc,GAAwD,CAAC,EAC3E,QAAQ,EACR,cAAc,GACf,KAAI;AACH,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;AACtC,IAAA,MAAM,OAAO,GAAGiB,gCAAiB,EAAE,CAAC;AACpC,IAAA,MAAM,EAAE,CAAC,EAAE,GAAGN,mBAAO,EAAE,CAAC;IACxB,QACER,yBAAK,SAAS,EAAC,qDAAqD,EAClE,QAAA,EAAA,CAAAH,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,YACrC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,MACvBA,wBAAe,SAAS,EAAC,kCAAkC,EACxD,QAAA,EAAA,MAAM,IADC,GAAG,CAEP,CACP,CAAC,EACE,CAAA,EAENA,wBAAK,SAAS,EAAC,0BAA0B,EAAG,CAAA,EAE5CA,eAACQ,uBAAe,CAAC,EAAE,EAAA,EAAC,OAAO,EAAE,KAAK,EAChC,QAAA,EAAAR,cAAA,CAACc,yBAAiB,CAAC,IAAI,IAAC,OAAO,EAAA,IAAA,EAAA,QAAA,EAC7Bd,eAACS,mCAAiB,EAAA,EAChB,OAAO,EAAE,QAAQ,GAAG,cAAc,GAAG,CAAC,CAAC,aAAa,CAAC,EACrD,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAEM,QAAE,CACX,2DAA2D,EAC3D,QAAQ;AACN,8BAAE,gCAAgC;AAClC,8BAAE,qDAAqD,CAC1D,gBACU,cAAc,EAAA,QAAA,EAExB,aAAa,EAAE,OAAO,IACrBf,cAAC,CAAAkB,wBAAY,IAAC,SAAS,EAAC,iDAAiD,EAAG,CAAA,KAE5ElB,cAAA,CAACmB,uBAAW,EAAC,EAAA,SAAS,EAAC,+CAA+C,EAAA,CAAG,CAC1E,EACiB,CAAA,EAAA,CACG,GACN,EAErBnB,cAAA,CAACQ,uBAAe,CAAC,EAAE,IAAC,OAAO,EAAA,IAAA,EAAA,QAAA,EACzBR,cAAC,CAAAc,yBAAiB,CAAC,MAAM,EAAA,EAAC,OAAO,EAC/B,IAAA,EAAA,QAAA,EAAAd,cAAA,CAACS,mCAAiB,EAChB,EAAA,OAAO,EAAC,MAAM,EACd,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,6HAA6H,EAC5H,YAAA,EAAA,cAAc,YAEzBT,cAAC,CAAA,YAAY,IAAC,SAAS,EAAC,+CAA+C,EAAG,CAAA,EAAA,CACxD,GACK,EACR,CAAA,CAAA,EAAA,CACjB,EACN;AACJ,CAAC,CAAC;AAEF,MAAM,YAAY,GAAO,MAAK;AAC5B,IAAA,MAAM,EAAE,CAAC,EAAE,GAAGW,mBAAO,EAAE,CAAC;AACxB,IAAA,QACEX,cAAC,CAAAoB,wBAAgB,CAAC,KAAK,cACrBjB,eAAC,CAAAkB,sBAAc,CAAC,IAAI,IAAC,SAAS,EAAC,yJAAyJ,EACtL,QAAA,EAAA,CAAArB,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2CAA2C,EACvD,QAAA,EAAA,CAAC,CAAC,qBAAqB,CAAC,EACrB,CAAA,EACNA,eAACqB,sBAAc,CAAC,OAAO,EAAA,EAAC,SAAS,EAAC,wCAAwC,GAAG,CACzD,EAAA,CAAA,EAAA,CACC,EACzB;AACJ,CAAC,CAAC;AAkBF,MAAM,gBAAgB,GAAO,MAAK;AAChC,IAAA,MAAM,EAAE,cAAc,EAAE,GAAGnB,gCAAiB,EAAE,CAAC;AAC/C,IAAA,QACEF,cAAA,CAACoB,wBAAgB,CAAC,IAAI,EAAA,EAAC,OAAO,EAAA,IAAA,EAAA,QAAA,EAC5BpB,cACE,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EACnC,SAAS,EAAC,wIAAwI,EAAA,WAAA,EACxI,WAAW,EAAA,QAAA,EAErBG,eAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,OAAO,EACpB,QAAA,EAAA,CAAAA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mGAAmG,EAChH,QAAA,EAAA,CAAAH,cAAA,CAACoB,wBAAgB,CAAC,KAAK,EAAA,EACrB,UAAU,EAAEE,gEAAoC,EAAA,CAChD,EACFtB,cAAA,CAAC,YAAY,EAAA,EAAA,CAAG,IACZ,EAENG,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6HAA6H,EAAA,QAAA,EAAA,CAC1IH,cAAC,CAAA,YAAY,KAAG,EAChBA,cAAA,CAAC,kBAAkB,EAAA,EAAA,CAAG,CAClB,EAAA,CAAA,CAAA,EAAA,CACF,EACF,CAAA,EAAA,CACgB,EACxB;AACJ,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAO,MAAK;IACgBa,cAAQ,CAExD,SAAS,EAAE;AACb,IAAA,MAAM,EAAE,CAAC,EAAE,GAAGF,mBAAO,EAAE,CAAC;IAEAY,yBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAI;AACxD,QAAA,IACE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,KAAK,SAAS;eAChE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EACpE;YACA,OAAO,OAAO,CAAC,KAAK;iBACjB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,IAAI,CAAC,CAAC;SACf;AACD,QAAA,OAAO,EAAE,CAAC;AACZ,KAAC,EAAE;AAEH,IAAA,MAAM,EAAE,OAAO,EAAE,GAAGrB,gCAAiB,EAAE,CAAC;AAExC,IAAA,QACEF,cAAC,CAAAwB,0BAAkB,CAAC,IAAI,EAAA,EACtB,eAAe,EACf,IAAA,EAAA,QAAQ,EAAC,OAAO,EAChB,aAAa,EAAC,eAAe,EAC7B,SAAS,EAAET,QAAE,CACX,0PAA0P,EAC1P,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,WAAW,GAAG,EAAE,CACvC,YA8BDf,cAAC,CAAAwB,0BAAkB,CAAC,IAAI,EAAA,EAAC,OAAO,EAC9B,IAAA,EAAA,QAAA,EAAArB,eAAA,CAACM,mCAAiB,EAAC,EAAA,OAAO,EAAE,CAAC,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,CAC1CT,eAACoB,wBAAgB,CAAC,EAAE,EAAC,EAAA,MAAM,kBACzBpB,cAAC,CAAAyB,qBAAS,IAAC,SAAS,EAAC,sDAAsD,EAAG,CAAA,EAAA,CAC1D,EACtBzB,cAAC,CAAAoB,wBAAgB,CAAC,EAAE,EAAA,EAAC,MAAM,EAAE,KAAK,YAChCpB,cAAC,CAAA0B,IAAQ,IAAC,SAAS,EAAC,gDAAgD,EAAG,CAAA,EAAA,CACnD,IACJ,EACI,CAAA,EAAA,CAeF,EAC1B;AACJ,CAAC,CAAC;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,MAAM,YAAY,GAAO,MAAK;AAC5B,IAAA,MAAM,EAAE,CAAC,EAAE,GAAGf,mBAAO,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,cAAc,EAAE,GAAGT,gCAAiB,EAAE,CAAC;IAC/C,QACEF,wBACE,SAAS,EAAC,8GAA8G,EACxH,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,YAEnCG,eAAC,CAAAW,yBAAiB,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,mFAAmF,EAAA,QAAA,EAAA,CACnHd,eAACc,yBAAiB,CAAC,KAAK,EACtB,EAAA,SAAS,EAAC,8GAA8G,EACxH,SAAS,EACT,IAAA,EAAA,CAAA,EAEFX,yBAAK,SAAS,EAAC,oFAAoF,EACjG,QAAA,EAAA,CAAAH,cAAA,CAACc,yBAAiB,CAAC,MAAM,EAAC,EAAA,OAAO,EAC/B,IAAA,EAAA,QAAA,EAAAd,cAAA,CAAC2B,aAAM,EACL,EAAA,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,gBACG,CAAC,CAAC,mBAAmB,CAAC,EAAA,QAAA,EAEjC,CAAC,CAAC,qBAAqB,CAAC,EAClB,CAAA,EAAA,CACgB,EAC3B3B,cAAA,CAACc,yBAAiB,CAAC,IAAI,EAAC,EAAA,OAAO,kBAC7Bd,cAAC,CAAA2B,aAAM,IAAC,IAAI,EAAC,IAAI,EAAY,YAAA,EAAA,gBAAgB,YAC1C,CAAC,CAAC,eAAe,CAAC,EAAA,CACZ,GACc,CACrB,EAAA,CAAA,CAAA,EAAA,CACiB,EACrB,CAAA,EACN;AACJ,CAAC,CAAC;AAEF,MAAM,YAAY,GAAyC,CAAC,EAC1D,SAAS,EACT,GAAG,IAAI,EACR,MACCxB,gBAACyB,6BAAqB,CAAC,IAAI,EACzB,EAAA,oBAAoB,QACpB,SAAS,EAAEb,QAAE,CACX,0FAA0F,EAC1F,SAAS,CACV,KACG,IAAI,EAAA,QAAA,EAAA,CAERf,eAAC4B,6BAAqB,CAAC,QAAQ,EAAC,EAAA,OAAO,kBACrC5B,cAAC,CAAAS,mCAAiB,IAAC,OAAO,EAAC,UAAU,EACnC,QAAA,EAAAT,cAAA,CAAC6B,2BAAe,EAAG,EAAA,CAAA,EAAA,CACD,GACW,EACjC1B,eAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,qCAAqC,aACnDH,cAAC,CAAA4B,6BAAqB,CAAC,MAAM,EAAA,EAAA,CAAG,EAC/B,GAAG,EAAA,GAAA,EAEJ5B,eAAC4B,6BAAqB,CAAC,KAAK,EAAG,EAAA,CAAA,CAAA,EAAA,CAC1B,EACP5B,cAAC,CAAA4B,6BAAqB,CAAC,IAAI,EAAA,EAAC,OAAO,EACjC,IAAA,EAAA,QAAA,EAAA5B,cAAA,CAACS,mCAAiB,EAAC,EAAA,OAAO,EAAC,MAAM,EAAA,QAAA,EAC/BT,eAAC8B,4BAAgB,EAAA,EAAA,CAAG,GACF,EACO,CAAA,CAAA,EAAA,CACF,CAC9B,CAAC;AAEF,MAAM,WAAW,GAAO,MAAK;AAC3B,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG5B,gCAAiB,EAAE,CAAC;IAC/C,QACEF,eAACoB,wBAAgB,CAAC,IAAI,EAAC,EAAA,OAAO,EAC5B,IAAA,EAAA,QAAA,EAAAjB,eAAA,CAAA,KAAA,EAAA,EACE,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EACnC,SAAS,EAAC,mQAAmQ,EAAA,WAAA,EACnQ,MAAM,EAAA,QAAA,EAAA,CAEhBH,cAAC,CAAA+B,iCAAsB,KAAG,EAG1B/B,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,+DAA+D,EAAA,QAAA,EAC5EA,wBAAK,SAAS,EAAC,sGAAsG,EAAA,QAAA,EACnHA,cAAC,CAAAoB,wBAAgB,CAAC,KAAK,EAAA,EAAC,UAAU,EAAE,qBAAqB,EAAA,CAAI,GACzD,EAIF,CAAA,CAAA,EAAA,CAKF,EACgB,CAAA,EACxB;AACJ,CAAC;;;;"}
|
|
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 useAssistantApi,\n useAssistantState,\n} from '@assistant-ui/react';\n\nimport {\n useMemo, useState, type FC, type PropsWithChildren,\n} from 'react';\nimport { LazyMotion, MotionConfig, domAnimation } from 'motion/react';\nimport * as m from 'motion/react-m';\n\nimport { Checkbox } from '@radix-ui/react-checkbox';\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 {\n useChatkitContext,\n useChatkitPlugins,\n useChatkitRef,\n} from '@/contexts/ChatkitContext';\nimport { useI18n } from '@/contexts/I18nContext';\nimport ThumbUpIcon from '@/assets/ThumbUpIcon';\nimport ThumbDownIcon from '@/assets/ThumbDownIcon';\nimport CopyIcon from '@/assets/Copy';\nimport RefreshIcon from '@/assets/RefreshIcon';\nimport NewSession from '@/assets/NewSession';\nimport dayjs from 'dayjs';\nimport useThread from '@/hooks/useThread';\nimport { saveStringToMarkdown } from '@/utils/download';\nimport Download from '@/assets/Download';\nimport AbortMessage from '@/assets/AbortMessage';\nimport ClearIcon from '@/assets/ClearIcon';\nimport { Thread as ThreadType, useSnapshot } from '@chat-lab/core';\nimport { TooltipTrigger } from '@radix-ui/react-tooltip';\nimport Recommend from '../welcome';\nimport ThreadHeader from './thread-header';\nimport { Reasoning, ReasoningGroup } from './reasoning';\nimport { assistantMessageComponentsWithAvatar } from './message-components-with-avatar';\nimport { Tooltip, TooltipContent } from '../ui/tooltip';\n\nconst assistantMessageComponents = {\n Text: MarkdownText,\n tools: { Fallback: ToolFallback },\n File,\n Reasoning,\n ReasoningGroup,\n};\n\nconst userMessageComponents = { Text: MarkdownText };\nexport const Thread: FC<{\n welcome?: React.ReactNode;\n recommends?: string[];\n}> = ({ welcome, recommends }) => {\n const { currentThread } = useThread();\n\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?.sendMessage({\n content: [\n {\n type: 'text',\n text: question,\n },\n ],\n });\n }}\n />\n );\n }\n return undefined;\n }, [recommends, welcome]);\n\n const threadMessageComponents = useMemo(\n () => ({\n UserMessage,\n EditComposer,\n AssistantMessage,\n }),\n [],\n );\n\n const {\n showHeader, renderHeader, threadMaxWidth, threadBottom,\n } = useChatkitContext();\n return (\n <div className=\"min-w-full h-full flex flex-col\">\n {showHeader\n && (renderHeader ? (\n renderHeader({ thread: currentThread as ThreadType })\n ) : (\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 background: 'white',\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-auto px-4\">\n <ThreadPrimitive.Messages\n components={threadMessageComponents}\n />\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9\" />\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 items-center\">\n <div\n className=\" aui-thread-viewport-spacer min-h-12 grow z-9\"\n style={{\n maxWidth: threadMaxWidth,\n backgroundColor: 'white',\n }}\n />\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 <div\n style={{ maxWidth: threadMaxWidth }}\n className=\"max-w-[var(--thread-max-width)]\"\n >\n {welcomeElement ?? <ThreadWelcome />}\n </div>\n )}\n <div\n className=\"aui-thread-viewport-spacer min-h-12 grow z-9\"\n style={{ background: 'white' }}\n />\n\n <Composer />\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n </ThreadPrimitive.Root>\n </MotionConfig>\n </LazyMotion>\n </div>\n );\n};\n\nconst ThreadScrollToBottom: FC = () => (\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\nfunction NewThread() {\n const ref = useChatkitRef();\n const { t } = useI18n();\n const handleCreateNewThread = async () => {\n // 新建会话的逻辑\n const id = uuid();\n ref\n ?.addThread({\n id,\n name: id,\n sending: false,\n metadata: {},\n messages: [],\n createdAt: dayjs().unix(),\n })\n .then(() => ref?.setCurrentThread(id));\n };\n\n return (\n <TooltipIconButton\n tooltip={t('thread.newChat')}\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\nfunction ClearThread() {\n const ref = useChatkitRef();\n const { t } = useI18n();\n const handleCreateNewThread = () => {\n ref?.clearCurrentThread();\n };\n const { currentThread } = useThread();\n\n const disabled = currentThread?.messages.length === 0 || currentThread?.loading;\n return (\n <TooltipIconButton\n tooltip={t('thread.clearChat')}\n disabled={disabled}\n onClick={handleCreateNewThread}\n className={cn(\n 'flex flex-shrink-0 size-[38px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50',\n disabled && 'opacity-50 pointer-events-none',\n )}\n >\n <ClearIcon className=\"size-[16px]\" />\n </TooltipIconButton>\n );\n}\n\nconst ThreadWelcome: FC = () => {\n const { t } = useI18n();\n const { threadMaxWidth } = useChatkitContext();\n return (\n <div\n className=\"aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col\"\n style={{ maxWidth: threadMaxWidth }}\n >\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 {t('thread.greeting')}\n </div>\n </div>\n </div>\n );\n};\n\nconst ThreadSuggestions: FC = () => {\n const { t } = useI18n();\n return (\n <div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n {t('thread.greeting')}\n </div>\n );\n};\n\nconst Composer: FC = () => {\n const {\n placeholder, composerTop, controller, threadMaxWidth, threadBottom,\n } = useChatkitContext();\n\n const metaData = useSnapshot(controller?.metaData);\n const clawStatus = metaData?.clawStatus;\n const isDisabled = clawStatus?.status === false;\n const disabledReason = clawStatus?.reason || '';\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (isDisabled && e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n // 1. 定义禁用状态和 tooltip 显示状态\n const [open, setOpen] = useState(false);\n\n return (\n <div\n style={{ maxWidth: threadMaxWidth, background: 'white' }}\n 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 >\n <ThreadScrollToBottom />\n <div className=\"pt-[8px]\">{composerTop}</div>\n <div className=\"flex items-center gap-2\">\n <ComposerPrimitive.Root\n className={cn(\n 'aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[24px] border border-[#EAEDF1] bg-background px-[16px] py-[12px] shadow-sm transition-all',\n isDisabled && 'opacity-50 cursor-not-allowed bg-gray-100',\n )}\n >\n <ComposerAttachments />\n {/* <Tooltip\n open={open}\n onOpenChange={(newOpen) => {\n if (!isDisabled) return;\n setOpen(newOpen);\n }}\n >\n <TooltipTrigger> */}\n <div className=\"flex items-center w-full gap-2\">\n <ComposerPrimitive.Input\n placeholder={isDisabled ? disabledReason : placeholder}\n className=\"aui-composer-input max-h-[48px] min-h-[24px] flex-1 overflow-y-auto resize-none bg-transparent py-0 text-[14px] leading-[22px] outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed\"\n rows={1}\n aria-label=\"Message input\"\n disabled={isDisabled}\n onKeyDown={handleKeyDown}\n />\n <ComposerAction\n disabled={isDisabled}\n disabledReason={disabledReason}\n />\n </div>\n {/* </TooltipTrigger>\n <TooltipContent side=\"top\">\n <div\n style={{\n backgroundColor: '#ffffff',\n color: '#1f2937',\n padding: '6px 8px',\n borderRadius: '6px',\n fontSize: '14px',\n border: '1px solid #e5e7eb',\n maxWidth: '240px',\n }}\n >\n <div style={{ fontWeight: 500 }}>{disabledReason}</div>\n </div>\n </TooltipContent>\n </Tooltip> */}\n </ComposerPrimitive.Root>\n </div>\n {threadBottom}\n </div>\n );\n};\n\nconst ComposerAction: FC<{ disabled?: boolean; disabledReason?: string }> = ({\n disabled,\n disabledReason,\n}) => {\n const { currentThread } = useThread();\n const plugins = useChatkitPlugins();\n const { t } = useI18n();\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]\" />\n\n <ThreadPrimitive.If running={false}>\n <ComposerPrimitive.Send asChild>\n <TooltipIconButton\n tooltip={disabled ? disabledReason : t('thread.send')}\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={disabled}\n className={cn(\n 'aui-composer-send size-[32px] rounded-full text-white p-0',\n disabled\n ? 'bg-gray-400 cursor-not-allowed'\n : 'bg-[#1664FF] hover:bg-primary/10 hover:text-primary',\n )}\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 <TooltipIconButton\n tooltip=\"stop\"\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"aui-composer-send size-[32px] bg-[#1664FF] rounded-full text-white text-primary hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n <AbortMessage className=\"aui-composer-send-icon size-[32px] fill-white\" />\n </TooltipIconButton>\n </ComposerPrimitive.Cancel>\n </ThreadPrimitive.If>\n </div>\n );\n};\n\nconst MessageError: FC = () => {\n const { t } = useI18n();\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 {t('thread.requestError')}\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}\n {' '}\n tool\n {toolCount === 1 ? 'call' : 'calls'}\n </summary>\n <div className=\"space-y-2 pl-4\">{children}</div>\n </details>\n );\n};\nconst AssistantMessage: FC = () => {\n const { threadMaxWidth } = useChatkitContext();\n return (\n <MessagePrimitive.Root asChild>\n <div\n style={{ maxWidth: threadMaxWidth }}\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={assistantMessageComponentsWithAvatar}\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 { t } = useI18n();\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 { authors } = useChatkitContext();\n\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n autohide=\"never\"\n autohideFloat=\"single-branch\"\n className={cn(\n '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 authors.length >= 2 ? 'ml-[50px]' : '',\n )}\n >\n {/* <div\n className=\"flex items-center justify-center\"\n onClick={() => setSubmittedFeedback(\n submittedFeedback === 'positive' ? undefined : 'positive',\n )}\n >\n <TooltipIconButton tooltip={t('thread.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={() => setSubmittedFeedback(\n submittedFeedback === 'negative' ? undefined : 'negative',\n )}\n >\n <TooltipIconButton tooltip={t('thread.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={t('thread.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={t('thread.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={t('thread.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 const { t } = useI18n();\n const { threadMaxWidth } = useChatkitContext();\n return (\n <div\n 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 style={{ maxWidth: threadMaxWidth }}\n >\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\n variant=\"ghost\"\n size=\"sm\"\n aria-label={t('thread.cancelEdit')}\n >\n {t('warningModal.cancel')}\n </Button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <Button size=\"sm\" aria-label=\"Update message\">\n {t('thread.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 <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 />\n {' '}\n /\n <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <TooltipIconButton tooltip=\"Next\">\n <ChevronRightIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n);\n\nconst UserMessage: FC = () => {\n const { threadMaxWidth } = useChatkitContext();\n return (\n <MessagePrimitive.Root asChild>\n <div\n style={{ maxWidth: threadMaxWidth }}\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 {/* <Checkbox /> */}\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-[#EDEFFC] 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// 2. 修改UserActionBar组件,添加编辑、分享和更多选项功能\nconst UserActionBar: FC = () => {\n const { t } = useI18n();\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\n tooltip={t('thread.edit')}\n className=\"aui-user-action-edit\"\n >\n <PencilIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Edit>\n\n <TooltipIconButton\n tooltip={t('thread.share')}\n className=\"aui-user-action-edit\"\n >\n <Share2Icon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n <TooltipIconButton\n tooltip={t('thread.more')}\n className=\"aui-user-action-edit\"\n >\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","TooltipIconButton","ArrowDownIcon","useI18n","useSnapshot","useState","ComposerPrimitive","cn","ComposerAttachments","useChatkitPlugins","LoaderCircle","ArrowUpIcon","MessagePrimitive","ErrorPrimitive","assistantMessageComponentsWithAvatar","useAssistantState","ActionBarPrimitive","CheckIcon","CopyIcon","Button","BranchPickerPrimitive","ChevronLeftIcon","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":"AAyBA,OAAO,EACc,KAAK,EAAE,EAC3B,MAAM,OAAO,CAAC;AAoDf,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,
|
|
1
|
+
{"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/thread.tsx"],"names":[],"mappings":"AAyBA,OAAO,EACc,KAAK,EAAE,EAC3B,MAAM,OAAO,CAAC;AAoDf,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAsHA,CAAC"}
|
|
@@ -5,7 +5,7 @@ import { ThreadPrimitive, ComposerPrimitive, MessagePrimitive, useAssistantState
|
|
|
5
5
|
import { useMemo, useState } from 'react';
|
|
6
6
|
import { LazyMotion, domAnimation, MotionConfig } from 'motion/react';
|
|
7
7
|
import { Button } from '../ui/button.js';
|
|
8
|
-
import
|
|
8
|
+
import './markdown-text.js';
|
|
9
9
|
import { cn } from '../../lib/utils.js';
|
|
10
10
|
import { TooltipIconButton } from './tooltip-icon-button.js';
|
|
11
11
|
import { ComposerAttachments, UserMessageAttachments } from './attachment.js';
|
|
@@ -23,7 +23,6 @@ import './reasoning.js';
|
|
|
23
23
|
import { assistantMessageComponentsWithAvatar } from './message-components-with-avatar.js';
|
|
24
24
|
import { useSnapshot } from 'valtio';
|
|
25
25
|
|
|
26
|
-
const userMessageComponents = { Text: MarkdownText };
|
|
27
26
|
const Thread = ({ welcome, recommends }) => {
|
|
28
27
|
const { currentThread } = useThread();
|
|
29
28
|
const ref = useChatkitRef();
|
|
@@ -49,14 +48,14 @@ const Thread = ({ welcome, recommends }) => {
|
|
|
49
48
|
EditComposer,
|
|
50
49
|
AssistantMessage,
|
|
51
50
|
}), []);
|
|
52
|
-
const { showHeader, renderHeader, threadMaxWidth } = useChatkitContext();
|
|
51
|
+
const { showHeader, renderHeader, threadMaxWidth, threadBottom, } = useChatkitContext();
|
|
53
52
|
return (jsxs("div", { className: "min-w-full h-full flex flex-col", children: [showHeader
|
|
54
53
|
&& (renderHeader ? (renderHeader({ thread: currentThread })) : (jsx(ThreadHeader, { title: currentThread?.name || 'Thread Title' }))), jsx(LazyMotion, { features: domAnimation, children: jsx(MotionConfig, { reducedMotion: "user", children: jsxs(ThreadPrimitive.Root, { className: "aui-root aui-thread-root @container flex-1 flex h-[calc(100%-65px)] flex-col bg-background", style: {
|
|
55
54
|
['--thread-max-width']: '66rem',
|
|
56
|
-
background: '
|
|
55
|
+
background: 'white',
|
|
57
56
|
}, children: [jsx(ThreadPrimitive.If, { empty: false, children: jsxs(ThreadPrimitive.Viewport, { className: "aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-auto px-4", children: [jsx(ThreadPrimitive.Messages, { components: threadMessageComponents }), jsx("div", { className: "aui-thread-viewport-spacer min-h-12 grow z-9" }), jsx(Composer, {})] }) }), jsx(ThreadPrimitive.If, { empty: true, children: jsxs(ThreadPrimitive.Viewport, { className: "aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-auto px-4 justify-center items-center", children: [jsx("div", { className: " aui-thread-viewport-spacer min-h-12 grow z-9", style: {
|
|
58
57
|
maxWidth: threadMaxWidth,
|
|
59
|
-
backgroundColor: '
|
|
58
|
+
backgroundColor: 'white',
|
|
60
59
|
} }), currentThread?.loading ? (jsxs("div", { className: "flex items-center justify-center gap-1.5 h-[180px]", children: [jsx("span", { className: "w-2.5 h-2.5 bg-gray-500 rounded-full", style: {
|
|
61
60
|
animation: 'bounce 1s ease-in-out infinite',
|
|
62
61
|
animationDelay: '0ms',
|
|
@@ -66,7 +65,7 @@ const Thread = ({ welcome, recommends }) => {
|
|
|
66
65
|
} }), jsx("span", { className: "w-2.5 h-2.5 bg-gray-500 rounded-full", style: {
|
|
67
66
|
animation: 'bounce 1s ease-in-out infinite',
|
|
68
67
|
animationDelay: '300ms',
|
|
69
|
-
} })] })) : (jsx("div", { style: { maxWidth: threadMaxWidth }, className: "max-w-[var(--thread-max-width)]", children: welcomeElement ?? jsx(ThreadWelcome, {}) })), jsx("div", { className: "aui-thread-viewport-spacer min-h-12 grow z-9", style: { background: '
|
|
68
|
+
} })] })) : (jsx("div", { style: { maxWidth: threadMaxWidth }, className: "max-w-[var(--thread-max-width)]", children: welcomeElement ?? jsx(ThreadWelcome, {}) })), jsx("div", { className: "aui-thread-viewport-spacer min-h-12 grow z-9", style: { background: 'white' } }), jsx(Composer, {})] }) })] }) }) })] }));
|
|
70
69
|
};
|
|
71
70
|
const ThreadScrollToBottom = () => (jsx(ThreadPrimitive.ScrollToBottom, { asChild: true, children: jsx(TooltipIconButton, { tooltip: "Scroll to bottom", variant: "outline", 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", children: jsx(ArrowDownIcon, {}) }) }));
|
|
72
71
|
const ThreadWelcome = () => {
|
|
@@ -75,7 +74,7 @@ const ThreadWelcome = () => {
|
|
|
75
74
|
return (jsx("div", { className: "aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col", style: { maxWidth: threadMaxWidth }, 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: t('thread.greeting') }) }) }));
|
|
76
75
|
};
|
|
77
76
|
const Composer = () => {
|
|
78
|
-
const { placeholder, composerTop, controller, threadMaxWidth, } = useChatkitContext();
|
|
77
|
+
const { placeholder, composerTop, controller, threadMaxWidth, threadBottom, } = useChatkitContext();
|
|
79
78
|
const metaData = useSnapshot(controller?.metaData);
|
|
80
79
|
const clawStatus = metaData?.clawStatus;
|
|
81
80
|
const isDisabled = clawStatus?.status === false;
|
|
@@ -88,7 +87,7 @@ const Composer = () => {
|
|
|
88
87
|
};
|
|
89
88
|
// 1. 定义禁用状态和 tooltip 显示状态
|
|
90
89
|
useState(false);
|
|
91
|
-
return (jsxs("div", { style: { maxWidth: threadMaxWidth, background: '
|
|
90
|
+
return (jsxs("div", { style: { maxWidth: threadMaxWidth, background: 'white' }, 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, {}), jsx("div", { className: "pt-[8px]", children: composerTop }), jsx("div", { className: "flex items-center gap-2", children: jsxs(ComposerPrimitive.Root, { className: cn('aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[24px] border border-[#EAEDF1] bg-background px-[16px] py-[12px] shadow-sm transition-all', isDisabled && 'opacity-50 cursor-not-allowed bg-gray-100'), children: [jsx(ComposerAttachments, {}), jsxs("div", { className: "flex items-center w-full gap-2", children: [jsx(ComposerPrimitive.Input, { placeholder: isDisabled ? disabledReason : placeholder, className: "aui-composer-input max-h-[48px] min-h-[24px] flex-1 overflow-y-auto resize-none bg-transparent py-0 text-[14px] leading-[22px] outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed", rows: 1, "aria-label": "Message input", disabled: isDisabled, onKeyDown: handleKeyDown }), jsx(ComposerAction, { disabled: isDisabled, disabledReason: disabledReason })] })] }) }), threadBottom] }));
|
|
92
91
|
};
|
|
93
92
|
const ComposerAction = ({ disabled, disabledReason, }) => {
|
|
94
93
|
const { currentThread } = useThread();
|
|
@@ -145,7 +144,7 @@ const EditComposer = () => {
|
|
|
145
144
|
const BranchPicker = ({ className, ...rest }) => (jsxs(BranchPickerPrimitive.Root, { hideWhenSingleBranch: true, className: cn('aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground', className), ...rest, children: [jsx(BranchPickerPrimitive.Previous, { asChild: true, children: jsx(TooltipIconButton, { tooltip: "Previous", children: jsx(ChevronLeftIcon, {}) }) }), jsxs("span", { className: "aui-branch-picker-state font-medium", children: [jsx(BranchPickerPrimitive.Number, {}), ' ', "/", jsx(BranchPickerPrimitive.Count, {})] }), jsx(BranchPickerPrimitive.Next, { asChild: true, children: jsx(TooltipIconButton, { tooltip: "Next", children: jsx(ChevronRightIcon, {}) }) })] }));
|
|
146
145
|
const UserMessage = () => {
|
|
147
146
|
const { threadMaxWidth } = useChatkitContext();
|
|
148
|
-
return (jsx(MessagePrimitive.Root, { asChild: true, children: jsxs("div", { style: { maxWidth: threadMaxWidth }, 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", "data-role": "user", children: [jsx(UserMessageAttachments, {}), jsx("div", { className: "aui-user-message-content-wrapper relative col-start-2 min-w-0", children: jsx("div", { className: "aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#EDEFFC] rounded-[8px]", children: jsx(MessagePrimitive.Parts, {
|
|
147
|
+
return (jsx(MessagePrimitive.Root, { asChild: true, children: jsxs("div", { style: { maxWidth: threadMaxWidth }, 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", "data-role": "user", children: [jsx(UserMessageAttachments, {}), jsx("div", { className: "aui-user-message-content-wrapper relative col-start-2 min-w-0", children: jsx("div", { className: "aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#EDEFFC] rounded-[8px]", children: jsx(MessagePrimitive.Parts, {}) }) })] }) }));
|
|
149
148
|
};
|
|
150
149
|
|
|
151
150
|
export { Thread };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread.js","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 useAssistantApi,\n useAssistantState,\n} from '@assistant-ui/react';\n\nimport {\n useMemo, useState, type FC, type PropsWithChildren,\n} from 'react';\nimport { LazyMotion, MotionConfig, domAnimation } from 'motion/react';\nimport * as m from 'motion/react-m';\n\nimport { Checkbox } from '@radix-ui/react-checkbox';\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 {\n useChatkitContext,\n useChatkitPlugins,\n useChatkitRef,\n} from '@/contexts/ChatkitContext';\nimport { useI18n } from '@/contexts/I18nContext';\nimport ThumbUpIcon from '@/assets/ThumbUpIcon';\nimport ThumbDownIcon from '@/assets/ThumbDownIcon';\nimport CopyIcon from '@/assets/Copy';\nimport RefreshIcon from '@/assets/RefreshIcon';\nimport NewSession from '@/assets/NewSession';\nimport dayjs from 'dayjs';\nimport useThread from '@/hooks/useThread';\nimport { saveStringToMarkdown } from '@/utils/download';\nimport Download from '@/assets/Download';\nimport AbortMessage from '@/assets/AbortMessage';\nimport ClearIcon from '@/assets/ClearIcon';\nimport { Thread as ThreadType, useSnapshot } from '@chat-lab/core';\nimport { TooltipTrigger } from '@radix-ui/react-tooltip';\nimport Recommend from '../welcome';\nimport ThreadHeader from './thread-header';\nimport { Reasoning, ReasoningGroup } from './reasoning';\nimport { assistantMessageComponentsWithAvatar } from './message-components-with-avatar';\nimport { Tooltip, TooltipContent } from '../ui/tooltip';\n\nconst assistantMessageComponents = {\n Text: MarkdownText,\n tools: { Fallback: ToolFallback },\n File,\n Reasoning,\n ReasoningGroup,\n};\n\nconst userMessageComponents = { Text: MarkdownText };\nexport const Thread: FC<{\n welcome?: React.ReactNode;\n recommends?: string[];\n}> = ({ welcome, recommends }) => {\n const { currentThread } = useThread();\n\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?.sendMessage({\n content: [\n {\n type: 'text',\n text: question,\n },\n ],\n });\n }}\n />\n );\n }\n return undefined;\n }, [recommends, welcome]);\n\n const threadMessageComponents = useMemo(\n () => ({\n UserMessage,\n EditComposer,\n AssistantMessage,\n }),\n [],\n );\n\n const { showHeader, renderHeader, threadMaxWidth } = useChatkitContext();\n return (\n <div className=\"min-w-full h-full flex flex-col\">\n {showHeader\n && (renderHeader ? (\n renderHeader({ thread: currentThread as ThreadType })\n ) : (\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 background: '#white',\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-auto px-4\">\n <ThreadPrimitive.Messages\n components={threadMessageComponents}\n />\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9\" />\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 items-center\">\n <div\n className=\" aui-thread-viewport-spacer min-h-12 grow z-9\"\n style={{\n maxWidth: threadMaxWidth,\n backgroundColor: '#white',\n }}\n />\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 <div\n style={{ maxWidth: threadMaxWidth }}\n className=\"max-w-[var(--thread-max-width)]\"\n >\n {welcomeElement ?? <ThreadWelcome />}\n </div>\n )}\n <div\n className=\"aui-thread-viewport-spacer min-h-12 grow z-9\"\n style={{ background: '#white' }}\n />\n\n <Composer />\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n </ThreadPrimitive.Root>\n </MotionConfig>\n </LazyMotion>\n </div>\n );\n};\n\nconst ThreadScrollToBottom: FC = () => (\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\nfunction NewThread() {\n const ref = useChatkitRef();\n const { t } = useI18n();\n const handleCreateNewThread = async () => {\n // 新建会话的逻辑\n const id = uuid();\n ref\n ?.addThread({\n id,\n name: id,\n sending: false,\n metadata: {},\n messages: [],\n createdAt: dayjs().unix(),\n })\n .then(() => ref?.setCurrentThread(id));\n };\n\n return (\n <TooltipIconButton\n tooltip={t('thread.newChat')}\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\nfunction ClearThread() {\n const ref = useChatkitRef();\n const { t } = useI18n();\n const handleCreateNewThread = () => {\n ref?.clearCurrentThread();\n };\n const { currentThread } = useThread();\n\n const disabled = currentThread?.messages.length === 0 || currentThread?.loading;\n return (\n <TooltipIconButton\n tooltip={t('thread.clearChat')}\n disabled={disabled}\n onClick={handleCreateNewThread}\n className={cn(\n 'flex flex-shrink-0 size-[38px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50',\n disabled && 'opacity-50 pointer-events-none',\n )}\n >\n <ClearIcon className=\"size-[16px]\" />\n </TooltipIconButton>\n );\n}\n\nconst ThreadWelcome: FC = () => {\n const { t } = useI18n();\n const { threadMaxWidth } = useChatkitContext();\n return (\n <div\n className=\"aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col\"\n style={{ maxWidth: threadMaxWidth }}\n >\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 {t('thread.greeting')}\n </div>\n </div>\n </div>\n );\n};\n\nconst ThreadSuggestions: FC = () => {\n const { t } = useI18n();\n return (\n <div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n {t('thread.greeting')}\n </div>\n );\n};\n\nconst Composer: FC = () => {\n const {\n placeholder, composerTop, controller, threadMaxWidth,\n } = useChatkitContext();\n\n const metaData = useSnapshot(controller?.metaData);\n const clawStatus = metaData?.clawStatus;\n const isDisabled = clawStatus?.status === false;\n const disabledReason = clawStatus?.reason || '';\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (isDisabled && e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n // 1. 定义禁用状态和 tooltip 显示状态\n const [open, setOpen] = useState(false);\n\n return (\n <div\n style={{ maxWidth: threadMaxWidth, background: '#white' }}\n 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 >\n <ThreadScrollToBottom />\n {composerTop}\n <div className=\"flex items-center gap-2\">\n <ComposerPrimitive.Root\n className={cn(\n 'aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[24px] border border-[#EAEDF1] bg-background px-[16px] py-[12px] shadow-sm transition-all',\n isDisabled && 'opacity-50 cursor-not-allowed bg-gray-100',\n )}\n >\n <ComposerAttachments />\n {/* <Tooltip\n open={open}\n onOpenChange={(newOpen) => {\n if (!isDisabled) return;\n setOpen(newOpen);\n }}\n >\n <TooltipTrigger> */}\n <div className=\"flex items-center w-full gap-2\">\n <ComposerPrimitive.Input\n placeholder={isDisabled ? disabledReason : placeholder}\n className=\"aui-composer-input max-h-[48px] min-h-[24px] flex-1 overflow-y-auto resize-none bg-transparent py-0 text-[14px] leading-[22px] outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed\"\n rows={1}\n aria-label=\"Message input\"\n disabled={isDisabled}\n onKeyDown={handleKeyDown}\n />\n <ComposerAction\n disabled={isDisabled}\n disabledReason={disabledReason}\n />\n </div>\n {/* </TooltipTrigger>\n <TooltipContent side=\"top\">\n <div\n style={{\n backgroundColor: '#ffffff',\n color: '#1f2937',\n padding: '6px 8px',\n borderRadius: '6px',\n fontSize: '14px',\n border: '1px solid #e5e7eb',\n maxWidth: '240px',\n }}\n >\n <div style={{ fontWeight: 500 }}>{disabledReason}</div>\n </div>\n </TooltipContent>\n </Tooltip> */}\n </ComposerPrimitive.Root>\n </div>\n </div>\n );\n};\n\nconst ComposerAction: FC<{ disabled?: boolean; disabledReason?: string }> = ({\n disabled,\n disabledReason,\n}) => {\n const { currentThread } = useThread();\n const plugins = useChatkitPlugins();\n const { t } = useI18n();\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]\" />\n\n <ThreadPrimitive.If running={false}>\n <ComposerPrimitive.Send asChild>\n <TooltipIconButton\n tooltip={disabled ? disabledReason : t('thread.send')}\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={disabled}\n className={cn(\n 'aui-composer-send size-[32px] rounded-full text-white p-0',\n disabled\n ? 'bg-gray-400 cursor-not-allowed'\n : 'bg-[#1664FF] hover:bg-primary/10 hover:text-primary',\n )}\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 <TooltipIconButton\n tooltip=\"stop\"\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"aui-composer-send size-[32px] bg-[#1664FF] rounded-full text-white text-primary hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n <AbortMessage className=\"aui-composer-send-icon size-[32px] fill-white\" />\n </TooltipIconButton>\n </ComposerPrimitive.Cancel>\n </ThreadPrimitive.If>\n </div>\n );\n};\n\nconst MessageError: FC = () => {\n const { t } = useI18n();\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 {t('thread.requestError')}\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}\n {' '}\n tool\n {toolCount === 1 ? 'call' : 'calls'}\n </summary>\n <div className=\"space-y-2 pl-4\">{children}</div>\n </details>\n );\n};\nconst AssistantMessage: FC = () => {\n const { threadMaxWidth } = useChatkitContext();\n return (\n <MessagePrimitive.Root asChild>\n <div\n style={{ maxWidth: threadMaxWidth }}\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={assistantMessageComponentsWithAvatar}\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 { t } = useI18n();\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 { authors } = useChatkitContext();\n\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n autohide=\"never\"\n autohideFloat=\"single-branch\"\n className={cn(\n '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 authors.length >= 2 ? 'ml-[50px]' : '',\n )}\n >\n {/* <div\n className=\"flex items-center justify-center\"\n onClick={() => setSubmittedFeedback(\n submittedFeedback === 'positive' ? undefined : 'positive',\n )}\n >\n <TooltipIconButton tooltip={t('thread.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={() => setSubmittedFeedback(\n submittedFeedback === 'negative' ? undefined : 'negative',\n )}\n >\n <TooltipIconButton tooltip={t('thread.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={t('thread.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={t('thread.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={t('thread.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 const { t } = useI18n();\n const { threadMaxWidth } = useChatkitContext();\n return (\n <div\n 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 style={{ maxWidth: threadMaxWidth }}\n >\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\n variant=\"ghost\"\n size=\"sm\"\n aria-label={t('thread.cancelEdit')}\n >\n {t('warningModal.cancel')}\n </Button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <Button size=\"sm\" aria-label=\"Update message\">\n {t('thread.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 <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 />\n {' '}\n /\n <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <TooltipIconButton tooltip=\"Next\">\n <ChevronRightIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n);\n\nconst UserMessage: FC = () => {\n const { threadMaxWidth } = useChatkitContext();\n return (\n <MessagePrimitive.Root asChild>\n <div\n style={{ maxWidth: threadMaxWidth }}\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 {/* <Checkbox /> */}\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-[#EDEFFC] rounded-[8px]\">\n <MessagePrimitive.Parts components={userMessageComponents} />\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// 2. 修改UserActionBar组件,添加编辑、分享和更多选项功能\nconst UserActionBar: FC = () => {\n const { t } = useI18n();\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\n tooltip={t('thread.edit')}\n className=\"aui-user-action-edit\"\n >\n <PencilIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Edit>\n\n <TooltipIconButton\n tooltip={t('thread.share')}\n className=\"aui-user-action-edit\"\n >\n <Share2Icon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n <TooltipIconButton\n tooltip={t('thread.more')}\n className=\"aui-user-action-edit\"\n >\n <MoreHorizontalIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Root>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"thread.js","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 useAssistantApi,\n useAssistantState,\n} from '@assistant-ui/react';\n\nimport {\n useMemo, useState, type FC, type PropsWithChildren,\n} from 'react';\nimport { LazyMotion, MotionConfig, domAnimation } from 'motion/react';\nimport * as m from 'motion/react-m';\n\nimport { Checkbox } from '@radix-ui/react-checkbox';\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 {\n useChatkitContext,\n useChatkitPlugins,\n useChatkitRef,\n} from '@/contexts/ChatkitContext';\nimport { useI18n } from '@/contexts/I18nContext';\nimport ThumbUpIcon from '@/assets/ThumbUpIcon';\nimport ThumbDownIcon from '@/assets/ThumbDownIcon';\nimport CopyIcon from '@/assets/Copy';\nimport RefreshIcon from '@/assets/RefreshIcon';\nimport NewSession from '@/assets/NewSession';\nimport dayjs from 'dayjs';\nimport useThread from '@/hooks/useThread';\nimport { saveStringToMarkdown } from '@/utils/download';\nimport Download from '@/assets/Download';\nimport AbortMessage from '@/assets/AbortMessage';\nimport ClearIcon from '@/assets/ClearIcon';\nimport { Thread as ThreadType, useSnapshot } from '@chat-lab/core';\nimport { TooltipTrigger } from '@radix-ui/react-tooltip';\nimport Recommend from '../welcome';\nimport ThreadHeader from './thread-header';\nimport { Reasoning, ReasoningGroup } from './reasoning';\nimport { assistantMessageComponentsWithAvatar } from './message-components-with-avatar';\nimport { Tooltip, TooltipContent } from '../ui/tooltip';\n\nconst assistantMessageComponents = {\n Text: MarkdownText,\n tools: { Fallback: ToolFallback },\n File,\n Reasoning,\n ReasoningGroup,\n};\n\nconst userMessageComponents = { Text: MarkdownText };\nexport const Thread: FC<{\n welcome?: React.ReactNode;\n recommends?: string[];\n}> = ({ welcome, recommends }) => {\n const { currentThread } = useThread();\n\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?.sendMessage({\n content: [\n {\n type: 'text',\n text: question,\n },\n ],\n });\n }}\n />\n );\n }\n return undefined;\n }, [recommends, welcome]);\n\n const threadMessageComponents = useMemo(\n () => ({\n UserMessage,\n EditComposer,\n AssistantMessage,\n }),\n [],\n );\n\n const {\n showHeader, renderHeader, threadMaxWidth, threadBottom,\n } = useChatkitContext();\n return (\n <div className=\"min-w-full h-full flex flex-col\">\n {showHeader\n && (renderHeader ? (\n renderHeader({ thread: currentThread as ThreadType })\n ) : (\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 background: 'white',\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-auto px-4\">\n <ThreadPrimitive.Messages\n components={threadMessageComponents}\n />\n <div className=\"aui-thread-viewport-spacer min-h-12 grow z-9\" />\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 items-center\">\n <div\n className=\" aui-thread-viewport-spacer min-h-12 grow z-9\"\n style={{\n maxWidth: threadMaxWidth,\n backgroundColor: 'white',\n }}\n />\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 <div\n style={{ maxWidth: threadMaxWidth }}\n className=\"max-w-[var(--thread-max-width)]\"\n >\n {welcomeElement ?? <ThreadWelcome />}\n </div>\n )}\n <div\n className=\"aui-thread-viewport-spacer min-h-12 grow z-9\"\n style={{ background: 'white' }}\n />\n\n <Composer />\n </ThreadPrimitive.Viewport>\n </ThreadPrimitive.If>\n </ThreadPrimitive.Root>\n </MotionConfig>\n </LazyMotion>\n </div>\n );\n};\n\nconst ThreadScrollToBottom: FC = () => (\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\nfunction NewThread() {\n const ref = useChatkitRef();\n const { t } = useI18n();\n const handleCreateNewThread = async () => {\n // 新建会话的逻辑\n const id = uuid();\n ref\n ?.addThread({\n id,\n name: id,\n sending: false,\n metadata: {},\n messages: [],\n createdAt: dayjs().unix(),\n })\n .then(() => ref?.setCurrentThread(id));\n };\n\n return (\n <TooltipIconButton\n tooltip={t('thread.newChat')}\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\nfunction ClearThread() {\n const ref = useChatkitRef();\n const { t } = useI18n();\n const handleCreateNewThread = () => {\n ref?.clearCurrentThread();\n };\n const { currentThread } = useThread();\n\n const disabled = currentThread?.messages.length === 0 || currentThread?.loading;\n return (\n <TooltipIconButton\n tooltip={t('thread.clearChat')}\n disabled={disabled}\n onClick={handleCreateNewThread}\n className={cn(\n 'flex flex-shrink-0 size-[38px] items-center justify-center rounded-full bg-white border border-[#EAEDF1] text-[#0C0D0E] transition-colors hover:bg-gray-50',\n disabled && 'opacity-50 pointer-events-none',\n )}\n >\n <ClearIcon className=\"size-[16px]\" />\n </TooltipIconButton>\n );\n}\n\nconst ThreadWelcome: FC = () => {\n const { t } = useI18n();\n const { threadMaxWidth } = useChatkitContext();\n return (\n <div\n className=\"aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col\"\n style={{ maxWidth: threadMaxWidth }}\n >\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 {t('thread.greeting')}\n </div>\n </div>\n </div>\n );\n};\n\nconst ThreadSuggestions: FC = () => {\n const { t } = useI18n();\n return (\n <div className=\"aui-thread-welcome-suggestions grid w-full gap-2 pb-4 @md:grid-cols-2\">\n {t('thread.greeting')}\n </div>\n );\n};\n\nconst Composer: FC = () => {\n const {\n placeholder, composerTop, controller, threadMaxWidth, threadBottom,\n } = useChatkitContext();\n\n const metaData = useSnapshot(controller?.metaData);\n const clawStatus = metaData?.clawStatus;\n const isDisabled = clawStatus?.status === false;\n const disabledReason = clawStatus?.reason || '';\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (isDisabled && e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n\n // 1. 定义禁用状态和 tooltip 显示状态\n const [open, setOpen] = useState(false);\n\n return (\n <div\n style={{ maxWidth: threadMaxWidth, background: 'white' }}\n 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 >\n <ThreadScrollToBottom />\n <div className=\"pt-[8px]\">{composerTop}</div>\n <div className=\"flex items-center gap-2\">\n <ComposerPrimitive.Root\n className={cn(\n 'aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[24px] border border-[#EAEDF1] bg-background px-[16px] py-[12px] shadow-sm transition-all',\n isDisabled && 'opacity-50 cursor-not-allowed bg-gray-100',\n )}\n >\n <ComposerAttachments />\n {/* <Tooltip\n open={open}\n onOpenChange={(newOpen) => {\n if (!isDisabled) return;\n setOpen(newOpen);\n }}\n >\n <TooltipTrigger> */}\n <div className=\"flex items-center w-full gap-2\">\n <ComposerPrimitive.Input\n placeholder={isDisabled ? disabledReason : placeholder}\n className=\"aui-composer-input max-h-[48px] min-h-[24px] flex-1 overflow-y-auto resize-none bg-transparent py-0 text-[14px] leading-[22px] outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed\"\n rows={1}\n aria-label=\"Message input\"\n disabled={isDisabled}\n onKeyDown={handleKeyDown}\n />\n <ComposerAction\n disabled={isDisabled}\n disabledReason={disabledReason}\n />\n </div>\n {/* </TooltipTrigger>\n <TooltipContent side=\"top\">\n <div\n style={{\n backgroundColor: '#ffffff',\n color: '#1f2937',\n padding: '6px 8px',\n borderRadius: '6px',\n fontSize: '14px',\n border: '1px solid #e5e7eb',\n maxWidth: '240px',\n }}\n >\n <div style={{ fontWeight: 500 }}>{disabledReason}</div>\n </div>\n </TooltipContent>\n </Tooltip> */}\n </ComposerPrimitive.Root>\n </div>\n {threadBottom}\n </div>\n );\n};\n\nconst ComposerAction: FC<{ disabled?: boolean; disabledReason?: string }> = ({\n disabled,\n disabledReason,\n}) => {\n const { currentThread } = useThread();\n const plugins = useChatkitPlugins();\n const { t } = useI18n();\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]\" />\n\n <ThreadPrimitive.If running={false}>\n <ComposerPrimitive.Send asChild>\n <TooltipIconButton\n tooltip={disabled ? disabledReason : t('thread.send')}\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={disabled}\n className={cn(\n 'aui-composer-send size-[32px] rounded-full text-white p-0',\n disabled\n ? 'bg-gray-400 cursor-not-allowed'\n : 'bg-[#1664FF] hover:bg-primary/10 hover:text-primary',\n )}\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 <TooltipIconButton\n tooltip=\"stop\"\n type=\"submit\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"aui-composer-send size-[32px] bg-[#1664FF] rounded-full text-white text-primary hover:bg-primary/10 hover:text-primary p-0\"\n aria-label=\"Send message\"\n >\n <AbortMessage className=\"aui-composer-send-icon size-[32px] fill-white\" />\n </TooltipIconButton>\n </ComposerPrimitive.Cancel>\n </ThreadPrimitive.If>\n </div>\n );\n};\n\nconst MessageError: FC = () => {\n const { t } = useI18n();\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 {t('thread.requestError')}\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}\n {' '}\n tool\n {toolCount === 1 ? 'call' : 'calls'}\n </summary>\n <div className=\"space-y-2 pl-4\">{children}</div>\n </details>\n );\n};\nconst AssistantMessage: FC = () => {\n const { threadMaxWidth } = useChatkitContext();\n return (\n <MessagePrimitive.Root asChild>\n <div\n style={{ maxWidth: threadMaxWidth }}\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={assistantMessageComponentsWithAvatar}\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 { t } = useI18n();\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 { authors } = useChatkitContext();\n\n return (\n <ActionBarPrimitive.Root\n hideWhenRunning\n autohide=\"never\"\n autohideFloat=\"single-branch\"\n className={cn(\n '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 authors.length >= 2 ? 'ml-[50px]' : '',\n )}\n >\n {/* <div\n className=\"flex items-center justify-center\"\n onClick={() => setSubmittedFeedback(\n submittedFeedback === 'positive' ? undefined : 'positive',\n )}\n >\n <TooltipIconButton tooltip={t('thread.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={() => setSubmittedFeedback(\n submittedFeedback === 'negative' ? undefined : 'negative',\n )}\n >\n <TooltipIconButton tooltip={t('thread.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={t('thread.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={t('thread.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={t('thread.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 const { t } = useI18n();\n const { threadMaxWidth } = useChatkitContext();\n return (\n <div\n 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 style={{ maxWidth: threadMaxWidth }}\n >\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\n variant=\"ghost\"\n size=\"sm\"\n aria-label={t('thread.cancelEdit')}\n >\n {t('warningModal.cancel')}\n </Button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <Button size=\"sm\" aria-label=\"Update message\">\n {t('thread.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 <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 />\n {' '}\n /\n <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <TooltipIconButton tooltip=\"Next\">\n <ChevronRightIcon />\n </TooltipIconButton>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n);\n\nconst UserMessage: FC = () => {\n const { threadMaxWidth } = useChatkitContext();\n return (\n <MessagePrimitive.Root asChild>\n <div\n style={{ maxWidth: threadMaxWidth }}\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 {/* <Checkbox /> */}\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-[#EDEFFC] 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// 2. 修改UserActionBar组件,添加编辑、分享和更多选项功能\nconst UserActionBar: FC = () => {\n const { t } = useI18n();\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\n tooltip={t('thread.edit')}\n className=\"aui-user-action-edit\"\n >\n <PencilIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Edit>\n\n <TooltipIconButton\n tooltip={t('thread.share')}\n className=\"aui-user-action-edit\"\n >\n <Share2Icon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n <TooltipIconButton\n tooltip={t('thread.more')}\n className=\"aui-user-action-edit\"\n >\n <MoreHorizontalIcon className=\"h-3.5 w-3.5\" />\n </TooltipIconButton>\n </ActionBarPrimitive.Root>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA+Ea,MAAA,MAAM,GAGd,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,KAAI;AAC/B,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;AAEtC,IAAA,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;AAC5B,IAAA,MAAM,cAAc,GAAG,OAAO,CAAC,MAAK;AAClC,QAAA,IAAI,OAAO;AAAE,YAAA,OAAO,OAAO,CAAC;QAC5B,IAAI,UAAU,EAAE;AACd,YAAA,QACEA,GAAA,CAAC,SAAS,EAAA,EACR,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,CAAC,QAAQ,KAAI;oBACrB,GAAG,EAAE,WAAW,CAAC;AACf,wBAAA,OAAO,EAAE;AACP,4BAAA;AACE,gCAAA,IAAI,EAAE,MAAM;AACZ,gCAAA,IAAI,EAAE,QAAQ;AACf,6BAAA;AACF,yBAAA;AACF,qBAAA,CAAC,CAAC;iBACJ,EAAA,CACD,EACF;SACH;AACD,QAAA,OAAO,SAAS,CAAC;AACnB,KAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1B,IAAA,MAAM,uBAAuB,GAAG,OAAO,CACrC,OAAO;QACL,WAAW;QACX,YAAY;QACZ,gBAAgB;KACjB,CAAC,EACF,EAAE,CACH,CAAC;AAEF,IAAA,MAAM,EACJ,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,GACvD,GAAG,iBAAiB,EAAE,CAAC;AACxB,IAAA,QACEC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,iCAAiC,aAC7C,UAAU;oBACL,YAAY,IACd,YAAY,CAAC,EAAE,MAAM,EAAE,aAA2B,EAAE,CAAC,KAErDD,GAAC,CAAA,YAAY,EAAC,EAAA,KAAK,EAAE,aAAa,EAAE,IAAI,IAAI,cAAc,GAAI,CAC/D,CAAC,EACJA,GAAA,CAAC,UAAU,EAAA,EAAC,QAAQ,EAAE,YAAY,EAAA,QAAA,EAChCA,GAAC,CAAA,YAAY,EAAC,EAAA,aAAa,EAAC,MAAM,EAAA,QAAA,EAChCC,IAAC,CAAA,eAAe,CAAC,IAAI,EACnB,EAAA,SAAS,EAAC,6FAA6F,EACvG,KAAK,EAAE;4BACL,CAAC,oBAA8B,GAAG,OAAO;AACzC,4BAAA,UAAU,EAAE,OAAO;AACpB,yBAAA,EAAA,QAAA,EAAA,CAEDD,GAAC,CAAA,eAAe,CAAC,EAAE,EAAC,EAAA,KAAK,EAAE,KAAK,EAC9B,QAAA,EAAAC,IAAA,CAAC,eAAe,CAAC,QAAQ,EAAA,EAAC,SAAS,EAAC,wFAAwF,EAAA,QAAA,EAAA,CAC1HD,GAAC,CAAA,eAAe,CAAC,QAAQ,EACvB,EAAA,UAAU,EAAE,uBAAuB,EACnC,CAAA,EACFA,aAAK,SAAS,EAAC,8CAA8C,EAAA,CAAG,EAChEA,GAAA,CAAC,QAAQ,EAAA,EAAA,CAAG,CACa,EAAA,CAAA,EAAA,CACR,EACrBA,GAAA,CAAC,eAAe,CAAC,EAAE,EAAA,EAAC,KAAK,EAAA,IAAA,EAAA,QAAA,EACvBC,IAAC,CAAA,eAAe,CAAC,QAAQ,EAAC,EAAA,SAAS,EAAC,oHAAoH,EACtJ,QAAA,EAAA,CAAAD,GAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,+CAA+C,EACzD,KAAK,EAAE;AACL,gDAAA,QAAQ,EAAE,cAAc;AACxB,gDAAA,eAAe,EAAE,OAAO;AACzB,6CAAA,EAAA,CACD,EACD,aAAa,EAAE,OAAO,IACrBC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oDAAoD,aACjED,GACE,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,sCAAsC,EAChD,KAAK,EAAE;AACL,wDAAA,SAAS,EAAE,gCAAgC;AAC3C,wDAAA,cAAc,EAAE,KAAK;AACtB,qDAAA,EAAA,CACD,EACFA,GACE,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,sCAAsC,EAChD,KAAK,EAAE;AACL,wDAAA,SAAS,EAAE,gCAAgC;AAC3C,wDAAA,cAAc,EAAE,OAAO;AACxB,qDAAA,EAAA,CACD,EACFA,GACE,CAAA,MAAA,EAAA,EAAA,SAAS,EAAC,sCAAsC,EAChD,KAAK,EAAE;AACL,wDAAA,SAAS,EAAE,gCAAgC;AAC3C,wDAAA,cAAc,EAAE,OAAO;qDACxB,EACD,CAAA,CAAA,EAAA,CACE,KAENA,GAAA,CAAA,KAAA,EAAA,EACE,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EACnC,SAAS,EAAC,iCAAiC,YAE1C,cAAc,IAAIA,GAAC,CAAA,aAAa,EAAG,EAAA,CAAA,EAAA,CAChC,CACP,EACDA,GAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,+CAA+C,EACzD,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,GAC9B,EAEFA,GAAA,CAAC,QAAQ,EAAA,EAAA,CAAG,CACa,EAAA,CAAA,EAAA,CACR,IACA,EACV,CAAA,EAAA,CACJ,CACT,EAAA,CAAA,EACN;AACJ,EAAE;AAEF,MAAM,oBAAoB,GAAO,OAC/BA,GAAA,CAAC,eAAe,CAAC,cAAc,EAAC,EAAA,OAAO,EACrC,IAAA,EAAA,QAAA,EAAAA,GAAA,CAAC,iBAAiB,EAChB,EAAA,OAAO,EAAC,kBAAkB,EAC1B,OAAO,EAAC,SAAS,EACjB,SAAS,EAAC,2IAA2I,EAAA,QAAA,EAErJA,IAAC,aAAa,EAAA,EAAA,CAAG,EACC,CAAA,EAAA,CACW,CAClC,CAAC;AAuDF,MAAM,aAAa,GAAO,MAAK;AAC7B,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAC/C,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,sFAAsF,EAChG,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,YAEnCA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,4EAA4E,EACzF,QAAA,EAAAA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0IAA0I,EACtJ,QAAA,EAAA,CAAC,CAAC,iBAAiB,CAAC,EAAA,CACjB,EACF,CAAA,EAAA,CACF,EACN;AACJ,CAAC,CAAC;AAWF,MAAM,QAAQ,GAAO,MAAK;AACxB,IAAA,MAAM,EACJ,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,GACnE,GAAG,iBAAiB,EAAE,CAAC;IAExB,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACnD,IAAA,MAAM,UAAU,GAAG,QAAQ,EAAE,UAAU,CAAC;AACxC,IAAA,MAAM,UAAU,GAAG,UAAU,EAAE,MAAM,KAAK,KAAK,CAAC;AAChD,IAAA,MAAM,cAAc,GAAG,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC;AAEhD,IAAA,MAAM,aAAa,GAAG,CAAC,CAAsB,KAAI;QAC/C,IAAI,UAAU,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE;YACnC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,eAAe,EAAE,CAAC;SACrB;AACH,KAAC,CAAC;;IAGsB,QAAQ,CAAC,KAAK,EAAE;IAExC,QACEC,IACE,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,EACxD,SAAS,EAAC,qJAAqJ,EAE/J,QAAA,EAAA,CAAAD,GAAA,CAAC,oBAAoB,EAAA,EAAA,CAAG,EACxBA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,UAAU,EAAA,QAAA,EAAE,WAAW,EAAO,CAAA,EAC7CA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,yBAAyB,EACtC,QAAA,EAAAC,IAAA,CAAC,iBAAiB,CAAC,IAAI,EAAA,EACrB,SAAS,EAAE,EAAE,CACX,qKAAqK,EACrK,UAAU,IAAI,2CAA2C,CAC1D,EAAA,QAAA,EAAA,CAEDD,GAAC,CAAA,mBAAmB,EAAG,EAAA,CAAA,EASvBC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAAA,CAC7CD,GAAC,CAAA,iBAAiB,CAAC,KAAK,IACtB,WAAW,EAAE,UAAU,GAAG,cAAc,GAAG,WAAW,EACtD,SAAS,EAAC,2MAA2M,EACrN,IAAI,EAAE,CAAC,EACI,YAAA,EAAA,eAAe,EAC1B,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,aAAa,EAAA,CACxB,EACFA,GAAA,CAAC,cAAc,EAAA,EACb,QAAQ,EAAE,UAAU,EACpB,cAAc,EAAE,cAAc,EAC9B,CAAA,CAAA,EAAA,CACE,CAkBiB,EAAA,CAAA,EAAA,CACrB,EACL,YAAY,CACT,EAAA,CAAA,EACN;AACJ,CAAC,CAAC;AAEF,MAAM,cAAc,GAAwD,CAAC,EAC3E,QAAQ,EACR,cAAc,GACf,KAAI;AACH,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;AACtC,IAAA,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;AACpC,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,QACEC,cAAK,SAAS,EAAC,qDAAqD,EAClE,QAAA,EAAA,CAAAD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,YACrC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,MACvBA,aAAe,SAAS,EAAC,kCAAkC,EACxD,QAAA,EAAA,MAAM,IADC,GAAG,CAEP,CACP,CAAC,EACE,CAAA,EAENA,aAAK,SAAS,EAAC,0BAA0B,EAAG,CAAA,EAE5CA,IAAC,eAAe,CAAC,EAAE,EAAA,EAAC,OAAO,EAAE,KAAK,EAChC,QAAA,EAAAA,GAAA,CAAC,iBAAiB,CAAC,IAAI,IAAC,OAAO,EAAA,IAAA,EAAA,QAAA,EAC7BA,IAAC,iBAAiB,EAAA,EAChB,OAAO,EAAE,QAAQ,GAAG,cAAc,GAAG,CAAC,CAAC,aAAa,CAAC,EACrD,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,EAAE,CACX,2DAA2D,EAC3D,QAAQ;AACN,8BAAE,gCAAgC;AAClC,8BAAE,qDAAqD,CAC1D,gBACU,cAAc,EAAA,QAAA,EAExB,aAAa,EAAE,OAAO,IACrBA,GAAC,CAAA,YAAY,IAAC,SAAS,EAAC,iDAAiD,EAAG,CAAA,KAE5EA,GAAA,CAAC,WAAW,EAAC,EAAA,SAAS,EAAC,+CAA+C,EAAA,CAAG,CAC1E,EACiB,CAAA,EAAA,CACG,GACN,EAErBA,GAAA,CAAC,eAAe,CAAC,EAAE,IAAC,OAAO,EAAA,IAAA,EAAA,QAAA,EACzBA,GAAC,CAAA,iBAAiB,CAAC,MAAM,EAAA,EAAC,OAAO,EAC/B,IAAA,EAAA,QAAA,EAAAA,GAAA,CAAC,iBAAiB,EAChB,EAAA,OAAO,EAAC,MAAM,EACd,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,6HAA6H,EAC5H,YAAA,EAAA,cAAc,YAEzBA,GAAC,CAAA,YAAY,IAAC,SAAS,EAAC,+CAA+C,EAAG,CAAA,EAAA,CACxD,GACK,EACR,CAAA,CAAA,EAAA,CACjB,EACN;AACJ,CAAC,CAAC;AAEF,MAAM,YAAY,GAAO,MAAK;AAC5B,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,QACEA,GAAC,CAAA,gBAAgB,CAAC,KAAK,cACrBC,IAAC,CAAA,cAAc,CAAC,IAAI,IAAC,SAAS,EAAC,yJAAyJ,EACtL,QAAA,EAAA,CAAAD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2CAA2C,EACvD,QAAA,EAAA,CAAC,CAAC,qBAAqB,CAAC,EACrB,CAAA,EACNA,IAAC,cAAc,CAAC,OAAO,EAAA,EAAC,SAAS,EAAC,wCAAwC,GAAG,CACzD,EAAA,CAAA,EAAA,CACC,EACzB;AACJ,CAAC,CAAC;AAkBF,MAAM,gBAAgB,GAAO,MAAK;AAChC,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAC/C,IAAA,QACEA,GAAA,CAAC,gBAAgB,CAAC,IAAI,EAAA,EAAC,OAAO,EAAA,IAAA,EAAA,QAAA,EAC5BA,GACE,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EACnC,SAAS,EAAC,wIAAwI,EAAA,WAAA,EACxI,WAAW,EAAA,QAAA,EAErBC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,OAAO,EACpB,QAAA,EAAA,CAAAA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mGAAmG,EAChH,QAAA,EAAA,CAAAD,GAAA,CAAC,gBAAgB,CAAC,KAAK,EAAA,EACrB,UAAU,EAAE,oCAAoC,EAAA,CAChD,EACFA,GAAA,CAAC,YAAY,EAAA,EAAA,CAAG,IACZ,EAENC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6HAA6H,EAAA,QAAA,EAAA,CAC1ID,GAAC,CAAA,YAAY,KAAG,EAChBA,GAAA,CAAC,kBAAkB,EAAA,EAAA,CAAG,CAClB,EAAA,CAAA,CAAA,EAAA,CACF,EACF,CAAA,EAAA,CACgB,EACxB;AACJ,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAO,MAAK;IACgB,QAAQ,CAExD,SAAS,EAAE;AACb,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;IAEA,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAI;AACxD,QAAA,IACE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,KAAK,SAAS;eAChE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EACpE;YACA,OAAO,OAAO,CAAC,KAAK;iBACjB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,IAAI,CAAC,CAAC;SACf;AACD,QAAA,OAAO,EAAE,CAAC;AACZ,KAAC,EAAE;AAEH,IAAA,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAC;AAExC,IAAA,QACEA,GAAC,CAAA,kBAAkB,CAAC,IAAI,EAAA,EACtB,eAAe,EACf,IAAA,EAAA,QAAQ,EAAC,OAAO,EAChB,aAAa,EAAC,eAAe,EAC7B,SAAS,EAAE,EAAE,CACX,0PAA0P,EAC1P,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,WAAW,GAAG,EAAE,CACvC,YA8BDA,GAAC,CAAA,kBAAkB,CAAC,IAAI,EAAA,EAAC,OAAO,EAC9B,IAAA,EAAA,QAAA,EAAAC,IAAA,CAAC,iBAAiB,EAAC,EAAA,OAAO,EAAE,CAAC,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,CAC1CD,IAAC,gBAAgB,CAAC,EAAE,EAAC,EAAA,MAAM,kBACzBA,GAAC,CAAA,SAAS,IAAC,SAAS,EAAC,sDAAsD,EAAG,CAAA,EAAA,CAC1D,EACtBA,GAAC,CAAA,gBAAgB,CAAC,EAAE,EAAA,EAAC,MAAM,EAAE,KAAK,YAChCA,GAAC,CAAA,QAAQ,IAAC,SAAS,EAAC,gDAAgD,EAAG,CAAA,EAAA,CACnD,IACJ,EACI,CAAA,EAAA,CAeF,EAC1B;AACJ,CAAC,CAAC;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,MAAM,YAAY,GAAO,MAAK;AAC5B,IAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;AACxB,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC/C,QACEA,aACE,SAAS,EAAC,8GAA8G,EACxH,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,YAEnCC,IAAC,CAAA,iBAAiB,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,mFAAmF,EAAA,QAAA,EAAA,CACnHD,IAAC,iBAAiB,CAAC,KAAK,EACtB,EAAA,SAAS,EAAC,8GAA8G,EACxH,SAAS,EACT,IAAA,EAAA,CAAA,EAEFC,cAAK,SAAS,EAAC,oFAAoF,EACjG,QAAA,EAAA,CAAAD,GAAA,CAAC,iBAAiB,CAAC,MAAM,EAAC,EAAA,OAAO,EAC/B,IAAA,EAAA,QAAA,EAAAA,GAAA,CAAC,MAAM,EACL,EAAA,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,gBACG,CAAC,CAAC,mBAAmB,CAAC,EAAA,QAAA,EAEjC,CAAC,CAAC,qBAAqB,CAAC,EAClB,CAAA,EAAA,CACgB,EAC3BA,GAAA,CAAC,iBAAiB,CAAC,IAAI,EAAC,EAAA,OAAO,kBAC7BA,GAAC,CAAA,MAAM,IAAC,IAAI,EAAC,IAAI,EAAY,YAAA,EAAA,gBAAgB,YAC1C,CAAC,CAAC,eAAe,CAAC,EAAA,CACZ,GACc,CACrB,EAAA,CAAA,CAAA,EAAA,CACiB,EACrB,CAAA,EACN;AACJ,CAAC,CAAC;AAEF,MAAM,YAAY,GAAyC,CAAC,EAC1D,SAAS,EACT,GAAG,IAAI,EACR,MACCC,KAAC,qBAAqB,CAAC,IAAI,EACzB,EAAA,oBAAoB,QACpB,SAAS,EAAE,EAAE,CACX,0FAA0F,EAC1F,SAAS,CACV,KACG,IAAI,EAAA,QAAA,EAAA,CAERD,IAAC,qBAAqB,CAAC,QAAQ,EAAC,EAAA,OAAO,kBACrCA,GAAC,CAAA,iBAAiB,IAAC,OAAO,EAAC,UAAU,EACnC,QAAA,EAAAA,GAAA,CAAC,eAAe,EAAG,EAAA,CAAA,EAAA,CACD,GACW,EACjCC,IAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,qCAAqC,aACnDD,GAAC,CAAA,qBAAqB,CAAC,MAAM,EAAA,EAAA,CAAG,EAC/B,GAAG,EAAA,GAAA,EAEJA,IAAC,qBAAqB,CAAC,KAAK,EAAG,EAAA,CAAA,CAAA,EAAA,CAC1B,EACPA,GAAC,CAAA,qBAAqB,CAAC,IAAI,EAAA,EAAC,OAAO,EACjC,IAAA,EAAA,QAAA,EAAAA,GAAA,CAAC,iBAAiB,EAAC,EAAA,OAAO,EAAC,MAAM,EAAA,QAAA,EAC/BA,IAAC,gBAAgB,EAAA,EAAA,CAAG,GACF,EACO,CAAA,CAAA,EAAA,CACF,CAC9B,CAAC;AAEF,MAAM,WAAW,GAAO,MAAK;AAC3B,IAAA,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC/C,QACEA,IAAC,gBAAgB,CAAC,IAAI,EAAC,EAAA,OAAO,kBAC5BC,IACE,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EACnC,SAAS,EAAC,mQAAmQ,EAAA,WAAA,EACnQ,MAAM,EAAA,QAAA,EAAA,CAEhBD,IAAC,sBAAsB,EAAA,EAAA,CAAG,EAG1BA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,+DAA+D,EAAA,QAAA,EAC5EA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAC,sGAAsG,YACnHA,GAAC,CAAA,gBAAgB,CAAC,KAAK,EAAA,EAAA,CAAG,GACtB,EAIF,CAAA,CAAA,EAAA,CAKF,EACgB,CAAA,EACxB;AACJ,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatkitContext.cjs","sources":["../../src/contexts/ChatkitContext.ts"],"sourcesContent":["import { ChatController, Thread } from '@chat-lab/core';\nimport { createContext, MutableRefObject, useContext } from 'react';\nimport { ChatkitRef } from '@/components/Chatkit/types';\n\ninterface ChatkitContextValue {\n ref: MutableRefObject<ChatkitRef | null>;\n showThreadList: boolean;\n showHeader: boolean;\n renderHeader?: (props: { thread: Thread | null }) => React.ReactNode;\n plugins: React.ReactNode[];\n placeholder: string;\n expandToolGroup: boolean;\n expandToolDetail: boolean;\n expandReasoning: boolean;\n controller: ChatController | null;\n authors: string[];\n composerDisabled: boolean;\n composerTop?: React.ReactNode;\n threadMaxWidth?: number;\n}\nconst Context = createContext<ChatkitContextValue>(\n null as unknown as ChatkitContextValue,\n);\n\nexport const ChatkitProvider = Context.Provider;\nexport const useChatkitRef = () => {\n const context = useContext(Context);\n\n if (!context) {\n throw new Error('useChatkitRef must be used within a ChatkitProvider');\n }\n return context.controller;\n};\n\nexport const useChatkitPlugins = () => {\n const context = useContext(Context);\n\n if (!context) {\n throw new Error('useChatkitPlugins must be used within a ChatkitProvider');\n }\n return context.plugins;\n};\n\nexport const useChatkitContext = () => {\n const context = useContext(Context);\n\n if (!context) {\n throw new Error(\n 'useChatkitShowThreadList must be used within a ChatkitProvider',\n );\n }\n return context;\n};\n"],"names":["createContext","useContext"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"ChatkitContext.cjs","sources":["../../src/contexts/ChatkitContext.ts"],"sourcesContent":["import { ChatController, Thread } from '@chat-lab/core';\nimport { createContext, MutableRefObject, useContext } from 'react';\nimport { ChatkitRef } from '@/components/Chatkit/types';\n\ninterface ChatkitContextValue {\n ref: MutableRefObject<ChatkitRef | null>;\n showThreadList: boolean;\n showHeader: boolean;\n renderHeader?: (props: { thread: Thread | null }) => React.ReactNode;\n plugins: React.ReactNode[];\n placeholder: string;\n expandToolGroup: boolean;\n expandToolDetail: boolean;\n expandReasoning: boolean;\n controller: ChatController | null;\n authors: string[];\n composerDisabled: boolean;\n composerTop?: React.ReactNode;\n threadMaxWidth?: number;\n threadBottom?: React.ReactNode;\n}\nconst Context = createContext<ChatkitContextValue>(\n null as unknown as ChatkitContextValue,\n);\n\nexport const ChatkitProvider = Context.Provider;\nexport const useChatkitRef = () => {\n const context = useContext(Context);\n\n if (!context) {\n throw new Error('useChatkitRef must be used within a ChatkitProvider');\n }\n return context.controller;\n};\n\nexport const useChatkitPlugins = () => {\n const context = useContext(Context);\n\n if (!context) {\n throw new Error('useChatkitPlugins must be used within a ChatkitProvider');\n }\n return context.plugins;\n};\n\nexport const useChatkitContext = () => {\n const context = useContext(Context);\n\n if (!context) {\n throw new Error(\n 'useChatkitShowThreadList must be used within a ChatkitProvider',\n );\n }\n return context;\n};\n"],"names":["createContext","useContext"],"mappings":";;;;AAqBA,MAAM,OAAO,GAAGA,mBAAa,CAC3B,IAAsC,CACvC,CAAC;AAEW,MAAA,eAAe,GAAG,OAAO,CAAC,SAAS;AACzC,MAAM,aAAa,GAAG,MAAK;AAChC,IAAA,MAAM,OAAO,GAAGC,gBAAU,CAAC,OAAO,CAAC,CAAC;IAEpC,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;KACxE;IACD,OAAO,OAAO,CAAC,UAAU,CAAC;AAC5B,EAAE;AAEK,MAAM,iBAAiB,GAAG,MAAK;AACpC,IAAA,MAAM,OAAO,GAAGA,gBAAU,CAAC,OAAO,CAAC,CAAC;IAEpC,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;KAC5E;IACD,OAAO,OAAO,CAAC,OAAO,CAAC;AACzB,EAAE;AAEK,MAAM,iBAAiB,GAAG,MAAK;AACpC,IAAA,MAAM,OAAO,GAAGA,gBAAU,CAAC,OAAO,CAAC,CAAC;IAEpC,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;KACH;AACD,IAAA,OAAO,OAAO,CAAC;AACjB;;;;;;;"}
|
|
@@ -18,6 +18,7 @@ interface ChatkitContextValue {
|
|
|
18
18
|
composerDisabled: boolean;
|
|
19
19
|
composerTop?: React.ReactNode;
|
|
20
20
|
threadMaxWidth?: number;
|
|
21
|
+
threadBottom?: React.ReactNode;
|
|
21
22
|
}
|
|
22
23
|
export declare const ChatkitProvider: import("react").Provider<ChatkitContextValue>;
|
|
23
24
|
export declare const useChatkitRef: () => ChatController<import("@chat-lab/core").ChatMessage<import("@chat-lab/core").BaseMessage>> | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatkitContext.d.ts","sourceRoot":"","sources":["../../src/contexts/ChatkitContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAiB,gBAAgB,EAAc,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,UAAU,mBAAmB;IAC3B,GAAG,EAAE,gBAAgB,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACzC,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;IACrE,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatkitContext.d.ts","sourceRoot":"","sources":["../../src/contexts/ChatkitContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAiB,gBAAgB,EAAc,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,UAAU,mBAAmB;IAC3B,GAAG,EAAE,gBAAgB,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACzC,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;IACrE,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAChC;AAKD,eAAO,MAAM,eAAe,+CAAmB,CAAC;AAChD,eAAO,MAAM,aAAa,yGAOzB,CAAC;AAEF,eAAO,MAAM,iBAAiB,mCAO7B,CAAC;AAEF,eAAO,MAAM,iBAAiB,2BAS7B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatkitContext.js","sources":["../../src/contexts/ChatkitContext.ts"],"sourcesContent":["import { ChatController, Thread } from '@chat-lab/core';\nimport { createContext, MutableRefObject, useContext } from 'react';\nimport { ChatkitRef } from '@/components/Chatkit/types';\n\ninterface ChatkitContextValue {\n ref: MutableRefObject<ChatkitRef | null>;\n showThreadList: boolean;\n showHeader: boolean;\n renderHeader?: (props: { thread: Thread | null }) => React.ReactNode;\n plugins: React.ReactNode[];\n placeholder: string;\n expandToolGroup: boolean;\n expandToolDetail: boolean;\n expandReasoning: boolean;\n controller: ChatController | null;\n authors: string[];\n composerDisabled: boolean;\n composerTop?: React.ReactNode;\n threadMaxWidth?: number;\n}\nconst Context = createContext<ChatkitContextValue>(\n null as unknown as ChatkitContextValue,\n);\n\nexport const ChatkitProvider = Context.Provider;\nexport const useChatkitRef = () => {\n const context = useContext(Context);\n\n if (!context) {\n throw new Error('useChatkitRef must be used within a ChatkitProvider');\n }\n return context.controller;\n};\n\nexport const useChatkitPlugins = () => {\n const context = useContext(Context);\n\n if (!context) {\n throw new Error('useChatkitPlugins must be used within a ChatkitProvider');\n }\n return context.plugins;\n};\n\nexport const useChatkitContext = () => {\n const context = useContext(Context);\n\n if (!context) {\n throw new Error(\n 'useChatkitShowThreadList must be used within a ChatkitProvider',\n );\n }\n return context;\n};\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"ChatkitContext.js","sources":["../../src/contexts/ChatkitContext.ts"],"sourcesContent":["import { ChatController, Thread } from '@chat-lab/core';\nimport { createContext, MutableRefObject, useContext } from 'react';\nimport { ChatkitRef } from '@/components/Chatkit/types';\n\ninterface ChatkitContextValue {\n ref: MutableRefObject<ChatkitRef | null>;\n showThreadList: boolean;\n showHeader: boolean;\n renderHeader?: (props: { thread: Thread | null }) => React.ReactNode;\n plugins: React.ReactNode[];\n placeholder: string;\n expandToolGroup: boolean;\n expandToolDetail: boolean;\n expandReasoning: boolean;\n controller: ChatController | null;\n authors: string[];\n composerDisabled: boolean;\n composerTop?: React.ReactNode;\n threadMaxWidth?: number;\n threadBottom?: React.ReactNode;\n}\nconst Context = createContext<ChatkitContextValue>(\n null as unknown as ChatkitContextValue,\n);\n\nexport const ChatkitProvider = Context.Provider;\nexport const useChatkitRef = () => {\n const context = useContext(Context);\n\n if (!context) {\n throw new Error('useChatkitRef must be used within a ChatkitProvider');\n }\n return context.controller;\n};\n\nexport const useChatkitPlugins = () => {\n const context = useContext(Context);\n\n if (!context) {\n throw new Error('useChatkitPlugins must be used within a ChatkitProvider');\n }\n return context.plugins;\n};\n\nexport const useChatkitContext = () => {\n const context = useContext(Context);\n\n if (!context) {\n throw new Error(\n 'useChatkitShowThreadList must be used within a ChatkitProvider',\n );\n }\n return context;\n};\n"],"names":[],"mappings":";;AAqBA,MAAM,OAAO,GAAG,aAAa,CAC3B,IAAsC,CACvC,CAAC;AAEW,MAAA,eAAe,GAAG,OAAO,CAAC,SAAS;AACzC,MAAM,aAAa,GAAG,MAAK;AAChC,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAEpC,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;KACxE;IACD,OAAO,OAAO,CAAC,UAAU,CAAC;AAC5B,EAAE;AAEK,MAAM,iBAAiB,GAAG,MAAK;AACpC,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAEpC,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;KAC5E;IACD,OAAO,OAAO,CAAC,OAAO,CAAC;AACzB,EAAE;AAEK,MAAM,iBAAiB,GAAG,MAAK;AACpC,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAEpC,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;KACH;AACD,IAAA,OAAO,OAAO,CAAC;AACjB;;;;"}
|
package/dist/core/dist/index.cjs
CHANGED
|
@@ -1763,7 +1763,6 @@ async function fetchChatCompletion({
|
|
|
1763
1763
|
try {
|
|
1764
1764
|
if (abortController?.signal) {
|
|
1765
1765
|
abortController.signal.addEventListener("abort", () => {
|
|
1766
|
-
throttledOnResponse.cancel();
|
|
1767
1766
|
currentMessage = {
|
|
1768
1767
|
...currentMessage,
|
|
1769
1768
|
sending: false,
|
|
@@ -2059,8 +2058,12 @@ var ChatController = class {
|
|
|
2059
2058
|
);
|
|
2060
2059
|
} catch (e) {
|
|
2061
2060
|
}
|
|
2061
|
+
const storeManager = this.store;
|
|
2062
2062
|
if (hookContext.shouldSend === false) {
|
|
2063
|
-
|
|
2063
|
+
if (hookContext.shouldAddUserMessage) {
|
|
2064
|
+
storeManager.addMessage(threadId, hookContext.userMessage);
|
|
2065
|
+
}
|
|
2066
|
+
storeManager.setLoading(threadId, false, false);
|
|
2064
2067
|
return;
|
|
2065
2068
|
}
|
|
2066
2069
|
const shouldSend = {
|
|
@@ -2068,7 +2071,6 @@ var ChatController = class {
|
|
|
2068
2071
|
requestOptions: hookContext.extraRequestOptions,
|
|
2069
2072
|
userMessage: hookContext.userMessage
|
|
2070
2073
|
};
|
|
2071
|
-
const storeManager = this.store;
|
|
2072
2074
|
try {
|
|
2073
2075
|
const protocolAdaptor = getProtocolAdaptor(this.protocolOptions);
|
|
2074
2076
|
const requestBody = protocolAdaptor.generateRequestBody({
|