@ai-group/chat-sdk 3.7.4 → 3.8.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +36 -0
  2. package/dist/cjs/components/DislikeFeedback.js.map +2 -2
  3. package/dist/cjs/components/FileGallery/index.js +2 -1
  4. package/dist/cjs/components/FileGallery/index.js.map +3 -3
  5. package/dist/cjs/components/FolderTree/DirectoryTree.js.map +2 -2
  6. package/dist/cjs/components/Sources/components/CarouselCard.js.map +2 -2
  7. package/dist/cjs/components/XAdkChatbot/index.js +94 -18
  8. package/dist/cjs/components/XAdkChatbot/index.js.map +3 -3
  9. package/dist/cjs/components/XAdkChatbot/styles.d.ts +3 -0
  10. package/dist/cjs/components/XAdkChatbot/styles.js +34 -1
  11. package/dist/cjs/components/XAdkChatbot/styles.js.map +2 -2
  12. package/dist/cjs/components/XAdkChatbot/utils.d.ts +14 -0
  13. package/dist/cjs/components/XAdkChatbot/utils.js +79 -0
  14. package/dist/cjs/components/XAdkChatbot/utils.js.map +7 -0
  15. package/dist/cjs/components/XAdkProvider/compound/Chatbot.d.ts +3 -3
  16. package/dist/cjs/components/XAdkProvider/compound/Chatbot.js +3 -1
  17. package/dist/cjs/components/XAdkProvider/compound/Chatbot.js.map +2 -2
  18. package/dist/cjs/components/XAdkProvider/compound/DislikeFeedBack.js.map +2 -2
  19. package/dist/cjs/components/XAdkProvider/compound/Messages.js +2 -0
  20. package/dist/cjs/components/XAdkProvider/compound/Messages.js.map +2 -2
  21. package/dist/cjs/components/XAdkProvider/compound/Sidebar.js.map +2 -2
  22. package/dist/cjs/components/XAdkProvider/context/ChatStateContext.d.ts +2 -0
  23. package/dist/cjs/components/XAdkProvider/context/ChatStateContext.js.map +2 -2
  24. package/dist/cjs/components/XAdkProvider/index.js +3 -0
  25. package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
  26. package/dist/cjs/components/XAdkSender/InputTags.js.map +2 -2
  27. package/dist/cjs/components/XAdkThoughtChain/index.js +23 -28
  28. package/dist/cjs/components/XAdkThoughtChain/index.js.map +2 -2
  29. package/dist/cjs/components/XAdkThoughtChain/styles.d.ts +3 -1
  30. package/dist/cjs/components/XAdkThoughtChain/styles.js +63 -29
  31. package/dist/cjs/components/XAdkThoughtChain/styles.js.map +2 -2
  32. package/dist/cjs/components/XAiChatbot/index.js.map +2 -2
  33. package/dist/cjs/components/XAiConversations/index.js +2 -1
  34. package/dist/cjs/components/XAiConversations/index.js.map +3 -3
  35. package/dist/cjs/components/XAiProvider/index.js.map +2 -2
  36. package/dist/cjs/components/XAiSender/index.js.map +2 -2
  37. package/dist/cjs/hooks/useADKChat.d.ts +6 -1
  38. package/dist/cjs/hooks/useADKChat.js +22 -3
  39. package/dist/cjs/hooks/useADKChat.js.map +2 -2
  40. package/dist/cjs/hooks/useADKMessageQueue.d.ts +22 -0
  41. package/dist/cjs/hooks/useADKMessageQueue.js +105 -0
  42. package/dist/cjs/hooks/useADKMessageQueue.js.map +7 -0
  43. package/dist/cjs/index.d.ts +3 -1
  44. package/dist/cjs/index.js +3 -0
  45. package/dist/cjs/index.js.map +2 -2
  46. package/dist/cjs/react/index.d.ts +2 -0
  47. package/dist/cjs/react/index.js +3 -0
  48. package/dist/cjs/react/index.js.map +2 -2
  49. package/dist/cjs/types/XAdkChatbot.d.ts +13 -0
  50. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  51. package/dist/cjs/types/XAdkProvider.d.ts +7 -0
  52. package/dist/cjs/types/XAdkProvider.js.map +2 -2
  53. package/dist/cjs/types/XAdkThoughtChain.d.ts +2 -0
  54. package/dist/cjs/types/XAdkThoughtChain.js.map +1 -1
  55. package/dist/cjs/types/antdx.d.ts +2 -2
  56. package/dist/cjs/types/antdx.js.map +1 -1
  57. package/dist/esm/components/DislikeFeedback.js.map +1 -1
  58. package/dist/esm/components/FileGallery/index.js +2 -1
  59. package/dist/esm/components/FileGallery/index.js.map +1 -1
  60. package/dist/esm/components/FolderTree/DirectoryTree.js.map +1 -1
  61. package/dist/esm/components/Sources/components/CarouselCard.js.map +1 -1
  62. package/dist/esm/components/XAdkChatbot/index.js +89 -14
  63. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  64. package/dist/esm/components/XAdkChatbot/styles.d.ts +3 -0
  65. package/dist/esm/components/XAdkChatbot/styles.js +27 -24
  66. package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
  67. package/dist/esm/components/XAdkChatbot/utils.d.ts +14 -0
  68. package/dist/esm/components/XAdkChatbot/utils.js +66 -0
  69. package/dist/esm/components/XAdkChatbot/utils.js.map +1 -0
  70. package/dist/esm/components/XAdkProvider/compound/Chatbot.d.ts +3 -3
  71. package/dist/esm/components/XAdkProvider/compound/Chatbot.js +10 -7
  72. package/dist/esm/components/XAdkProvider/compound/Chatbot.js.map +1 -1
  73. package/dist/esm/components/XAdkProvider/compound/DislikeFeedBack.js.map +1 -1
  74. package/dist/esm/components/XAdkProvider/compound/Messages.js +5 -1
  75. package/dist/esm/components/XAdkProvider/compound/Messages.js.map +1 -1
  76. package/dist/esm/components/XAdkProvider/compound/Sidebar.js.map +1 -1
  77. package/dist/esm/components/XAdkProvider/context/ChatStateContext.d.ts +2 -0
  78. package/dist/esm/components/XAdkProvider/context/ChatStateContext.js.map +1 -1
  79. package/dist/esm/components/XAdkProvider/index.js +4 -2
  80. package/dist/esm/components/XAdkProvider/index.js.map +1 -1
  81. package/dist/esm/components/XAdkSender/InputTags.js.map +1 -1
  82. package/dist/esm/components/XAdkThoughtChain/index.js +52 -78
  83. package/dist/esm/components/XAdkThoughtChain/index.js.map +1 -1
  84. package/dist/esm/components/XAdkThoughtChain/styles.d.ts +3 -1
  85. package/dist/esm/components/XAdkThoughtChain/styles.js +28 -26
  86. package/dist/esm/components/XAdkThoughtChain/styles.js.map +1 -1
  87. package/dist/esm/components/XAiChatbot/index.js.map +1 -1
  88. package/dist/esm/components/XAiConversations/index.js +2 -1
  89. package/dist/esm/components/XAiConversations/index.js.map +1 -1
  90. package/dist/esm/components/XAiProvider/index.js.map +1 -1
  91. package/dist/esm/components/XAiSender/index.js.map +1 -1
  92. package/dist/esm/hooks/useADKChat.d.ts +6 -1
  93. package/dist/esm/hooks/useADKChat.js +44 -17
  94. package/dist/esm/hooks/useADKChat.js.map +1 -1
  95. package/dist/esm/hooks/useADKMessageQueue.d.ts +22 -0
  96. package/dist/esm/hooks/useADKMessageQueue.js +157 -0
  97. package/dist/esm/hooks/useADKMessageQueue.js.map +1 -0
  98. package/dist/esm/index.d.ts +3 -1
  99. package/dist/esm/index.js +2 -1
  100. package/dist/esm/index.js.map +1 -1
  101. package/dist/esm/react/index.d.ts +2 -0
  102. package/dist/esm/react/index.js +1 -0
  103. package/dist/esm/react/index.js.map +1 -1
  104. package/dist/esm/types/XAdkChatbot.d.ts +13 -0
  105. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  106. package/dist/esm/types/XAdkProvider.d.ts +7 -0
  107. package/dist/esm/types/XAdkProvider.js.map +1 -1
  108. package/dist/esm/types/XAdkThoughtChain.d.ts +2 -0
  109. package/dist/esm/types/XAdkThoughtChain.js.map +1 -1
  110. package/dist/esm/types/antdx.d.ts +2 -2
  111. package/dist/esm/types/antdx.js.map +1 -1
  112. package/dist/umd/chat-sdk.min.js +1 -1
  113. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiChatbot/index.tsx"],
4
- "sourcesContent": ["// 文件: components/XAiChatbot/index.tsx\n\nimport React, { useRef, useState, useMemo } from \"react\";\nimport { Tooltip, GetProp, Flex } from \"antd\";\nimport { Bubble, Prompts, FileCard } from \"@ant-design/x\";\nimport {\n UserOutlined,\n RedoOutlined,\n CopyOutlined,\n DeleteOutlined,\n} from \"@ant-design/icons\";\nimport clsx from \"clsx\";\nimport MarkdownIt from \"markdown-it\";\nimport reactHtmlParser from \"react-html-parser\";\nimport type { Attachment } from \"@/types/antdx\";\nimport MarkdownGlobalStyle from \"@/styles/markdown\";\nimport { MessageStatus, MessageRole, Messages } from \"@/types/XAiMessage\";\nimport { XAiChatbotProps, ActionItem } from \"@/types/XAiChatbot\";\nimport emptyIcon from \"@/assets/empty.png\";\nimport arrowUp from \"@/assets/arrow-up.png\";\nimport arrowDown from \"@/assets/arrow-down.png\";\nimport thinkIcon from \"@/assets/think.png\";\nimport groupIcon from \"@/assets/group.png\";\nimport arrowDownBlue from \"@/assets/arrow-down-blue.png\";\nimport { useChatbotContext } from \"@/hooks/useProviderContext\";\nimport { useStyles, GlobalStyle } from \"./styles\";\nimport XAiSender from \"../XAiSender\";\nimport type { SendContent } from \"@/types\";\n\nconst md = new MarkdownIt({\n html: true,\n linkify: true,\n typographer: true,\n});\n\n// 自定义 link_open 渲染规则\nconst defaultRender =\n md.renderer.rules.link_open ||\n ((tokens, idx, options, env, self) => {\n return self.renderToken(tokens, idx, options);\n });\n\n// a 标签打开规则\nmd.renderer.rules.link_open = (tokens, idx, options, env, self) => {\n // 添加 target=\"_blank\"\n const aIndex = tokens[idx].attrIndex(\"target\");\n if (aIndex < 0) {\n tokens[idx].attrPush([\"target\", \"_blank\"]);\n } else {\n tokens[idx].attrs![aIndex][1] = \"_blank\";\n }\n // 添加 rel=\"noopener noreferrer\"\n const relIndex = tokens[idx].attrIndex(\"rel\");\n if (relIndex < 0) {\n tokens[idx].attrPush([\"rel\", \"noopener noreferrer\"]);\n } else {\n tokens[idx].attrs![relIndex][1] = \"noopener noreferrer\";\n }\n return defaultRender(tokens, idx, options, env, self);\n};\n\nexport interface ActionHeaderProps {\n execute: any[];\n thinks: string;\n}\n\n// ActionHeader 组件\nexport const ActionHeader: React.FC<ActionHeaderProps> = ({\n execute = [],\n thinks = \"\",\n}) => {\n const styles = useStyles();\n const [expanded, setExpanded] = useState(true);\n const [executeExpanded, setExecuteExpanded] = useState(false);\n\n // 关键修复:只要有思考内容或执行过程就显示,不要同时要求两者都有\n if (!thinks && (!execute || execute.length === 0)) return null;\n\n const last = execute[execute.length - 1] || {};\n const { name } = last;\n const icon = last?.icon || last?.extra?.icon;\n\n return (\n <div className={styles.actionHeaderWrapper}>\n {!expanded && (\n <div\n className={styles.actionTitle}\n onClick={() => setExpanded((v) => !v)}\n >\n <img src={thinkIcon} alt=\"icon\" className={styles.actionHeaderIcon} />\n <span className={styles.flex1}>运行过程</span>\n <img alt=\"展开icon\" src={arrowDown} className={styles.w(\"16px\")} />\n </div>\n )}\n {expanded && (\n <div className={styles.actionHeaderDetail}>\n <div\n className={styles.actionDetailTitle}\n onClick={() => setExpanded((v) => !v)}\n >\n <img src={thinkIcon} alt=\"\" className={clsx(styles.w(14))} />\n <div className={clsx(styles.flex1, styles.pl(10))}>\n 隐藏运行过程\n </div>\n <img alt=\"收起icon\" src={arrowUp} className={styles.w(\"16px\")} />\n </div>\n\n {thinks && (\n <div\n className={styles.actionDetailContent}\n style={{ whiteSpace: \"pre-line\" }}\n >\n {thinks}\n </div>\n )}\n\n {execute && execute.length > 0 && (\n <>\n {!executeExpanded && (\n <div\n className={styles.executeHiddenWrapper}\n onClick={() => setExecuteExpanded((v) => !v)}\n >\n {icon && (\n <img src={icon} alt=\"icon\" className={styles.h(15)} />\n )}\n <span className={styles.flex1}>{name}</span>\n <img\n alt=\"工具icon\"\n src={arrowDownBlue}\n className={styles.w(\"16px\")}\n />\n </div>\n )}\n {executeExpanded && (\n <div className={styles.executeWrapper}>\n <div\n className={styles.executeTitle}\n onClick={() => setExecuteExpanded((v) => !v)}\n >\n <img\n src={groupIcon}\n alt=\"icon\"\n className={styles.executeHeaderIcon}\n />\n <span className={styles.flex1}>隐藏运行详情</span>\n <img\n alt=\"展开详情icon\"\n src={arrowUp}\n className={styles.w(\"16px\")}\n />\n </div>\n <div className={styles.executeContent}>\n {execute.map((action: any, idx: number) => {\n const thinkIcon2 =\n action?.expandIcon ||\n action?.extra?.expandIcon ||\n action?.extra?.icon ||\n action?.icon;\n const thinkCost = action?.cost || action?.extra?.cost;\n return (\n <div\n key={action.uniqueId || idx}\n className={styles.actionHeaderDetailItem}\n >\n {thinkIcon2 && (\n <img\n src={thinkIcon2}\n alt=\"icon\"\n className={styles.actionHeaderIcon}\n />\n )}\n <span>{action?.name}</span>\n <span className={styles.actionHeaderCost}>\n {thinkCost ? `${thinkCost}s` : \"\"}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n )}\n </div>\n );\n};\n\n// 默认消息功能区\nexport const defaultActions: ActionItem[] = [\n {\n key: \"redo\",\n icon: <RedoOutlined />,\n tooltip: \"重新生成\",\n },\n {\n key: \"copy\",\n icon: <CopyOutlined />,\n tooltip: \"复制\",\n },\n {\n key: \"delete\",\n icon: <DeleteOutlined />,\n tooltip: \"删除\",\n },\n];\n\nconst XAiChatbot: React.FC<XAiChatbotProps> = (props) => {\n const styles = useStyles();\n // 使用新的 Hook 来处理 Provider 上下文\n const { mergedProps } = useChatbotContext(props);\n\n const {\n navbarShow = false,\n navbar,\n renderNavbar = null,\n clearBtnShow = true,\n inputShow = true,\n // renderMessageContent,\n // quickReplies = [],\n // quickRepliesVisible = true,\n // onQuickReplyClick,\n loading: propLoading = false,\n messageTooltip,\n avatar,\n userAvatar,\n messages: propMessages,\n text = \"\",\n footerTips = \"\",\n empty = null,\n emptyStateImage = emptyIcon,\n emptyStateText = \"我的智能体\",\n messageActions = defaultActions,\n onMessagesActionsCallback,\n // 点击帮助消息\n onSuggestMessageClick,\n onSend,\n onClear,\n onStop,\n providerId,\n // 消息顶部\n messageTop,\n enableUpload,\n uploadRequest,\n } = mergedProps as XAiChatbotProps;\n\n // 如果在 Provider 中,使用 Provider 的状态\n const messages = mergedProps.messages || propMessages || [];\n const loading = mergedProps.loading || propLoading;\n\n const [content, setContent] = useState<string>(text); // 输入框文本\n const [files, setFiles] = useState<Attachment[]>([]);\n const lastMessageId = useRef<string>(\"\");\n const isScriptScrolling = useRef<boolean>(false);\n const chatId = providerId\n ? `za-chatbot-container-${providerId}`\n : \"za-chatbot-container\";\n\n // 滚动到最底部\n const scrollToBottom = () => {\n isScriptScrolling.current = true;\n setTimeout(() => {\n const mainChatWrapper = document.getElementById(chatId);\n if (mainChatWrapper) {\n mainChatWrapper.scrollTop = mainChatWrapper?.scrollHeight;\n }\n isScriptScrolling.current = false;\n }, 0);\n };\n\n // 消息功能区组件\n const FooterActions: React.FC<{ data: Messages; lastMessage: boolean }> = ({\n data,\n lastMessage = false,\n }) => (\n <div className={clsx(styles.flex, styles.gap(13))}>\n {messageActions.map((action: ActionItem, index: number) => {\n if (!lastMessage && action.key === \"redo\") return null;\n return (\n <Tooltip key={action.key} title={action.tooltip}>\n <span\n className={styles.cursor(\"pointer\")}\n onClick={() => onMessagesActionsCallback?.(index, data)}\n >\n {action.icon}\n {action.render?.(index, data)}\n </span>\n </Tooltip>\n );\n })}\n </div>\n );\n\n // 消息底部区域\n const MessageFooter: React.FC<{ data: Messages; lastMessage: boolean }> = ({\n data,\n lastMessage = false,\n }) => (\n <>\n {messageTooltip?.(data)}\n <FooterActions data={data} lastMessage={lastMessage} />\n </>\n );\n\n // 聊天角色\n const rolesObject: GetProp<typeof Bubble.List, \"role\"> = {\n assistant: {\n placement: \"start\",\n avatar: () => {\n return (\n avatar || (\n <UserOutlined\n className={clsx(styles.bg(\"#fde3cf\"), styles.userAvatar)}\n />\n )\n );\n },\n typing: { step: 5, interval: 20, effect: \"typing\" },\n style: {\n maxWidth: 600,\n },\n classNames: {\n content: \"assistant-content\",\n },\n },\n user: {\n placement: \"end\",\n avatar: () => {\n return (\n userAvatar || (\n <UserOutlined\n className={clsx(styles.bg(\"#87d068\"), styles.userAvatar)}\n />\n )\n );\n },\n classNames: {\n content: \"user-content\",\n },\n },\n suggestion: {\n placement: \"start\",\n avatar: () => {\n return (\n avatar || (\n <UserOutlined\n className={clsx(styles.bg(\"#fde3cf\"), styles.userAvatar)}\n />\n )\n );\n },\n variant: \"borderless\",\n },\n };\n\n // 触发发送\n const handleSend = (obj: SendContent) => {\n // 直接使用合并后的 onSend,自动处理 Provider 和独立模式\n onSend?.(obj);\n setContent(\"\"); // 发送后清空输入框内容\n setFiles([]); // 发送后清空文件\n scrollToBottom();\n };\n\n // 输出内容\n const handleChange = (str: string) => {\n setContent(str);\n };\n\n // 停止生成\n const handleStop = () => {\n onStop?.();\n };\n\n // 导航栏\n const NavBar: React.FC = () => {\n if (renderNavbar) {\n return renderNavbar();\n }\n if (navbar?.title) {\n return (\n <header className={styles.navbar}>\n {navbar.avatar && (\n <img src={navbar.avatar} className={styles.avatar} alt=\"\" />\n )}\n <div>\n <div className={styles.title}>{navbar.title}</div>\n <div className={styles.subtitle}>{navbar.subtitle}</div>\n </div>\n </header>\n );\n }\n return <></>;\n };\n\n // 确认清除\n const confirmClear = () => {\n onClear?.();\n };\n\n // 空状态\n const EmptyState = useMemo(\n () => () =>\n empty || (\n <div className={styles.emptyWrapper}>\n <img\n src={emptyStateImage}\n alt=\"空状态图标\"\n className={styles.emptyImg}\n />\n <div\n className={clsx(\n styles.text(16),\n styles.weight(600),\n styles.textColor(\"#343434\"),\n )}\n >\n {emptyStateText}\n </div>\n </div>\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [emptyStateImage, emptyStateText],\n );\n\n return (\n <>\n <GlobalStyle />\n <MarkdownGlobalStyle />\n <div id=\"x-ai-chatbot\" className={styles.wrapper}>\n {navbarShow && <NavBar />}\n {/** 消息容器 */}\n <div className={styles.messageContainer}>\n {/* 消息列表主体 */}\n {messages?.length ? (\n <Bubble.List\n id={chatId}\n role={rolesObject}\n className={styles.messageList}\n items={messages.map((msg: any) => {\n const {\n id,\n role,\n status,\n type,\n execute = [],\n thinks = \"\",\n extra = { noFooter: false },\n stepContent,\n } = msg as Messages;\n // 最后一条 AI消息标识\n if (role === MessageRole.assistant) {\n lastMessageId.current = id;\n }\n // 会话内容\n const bubbleContent: any = {\n key: id,\n role,\n loading: status === MessageStatus.init,\n header: () =>\n messageTop || (\n <ActionHeader execute={execute} thinks={thinks} />\n ),\n content: (() => {\n // 文本消息\n if (type === \"TextMessage\") {\n // 用户消息\n if (role === \"user\") {\n return (\n <div\n className=\"ai-markdown-body\"\n style={{\n minWidth: 0,\n maxWidth: 600,\n }}\n >\n {msg.content?.text}\n </div>\n );\n }\n\n // 输出html字符串\n const html = md.render(msg.content?.text || \"\");\n // 生成React节点\n const htmlString = reactHtmlParser(html);\n return (\n <>\n {/* 输出阶段性回答内容 */}\n {stepContent?.length &&\n stepContent.map((item) => {\n // 输出html字符串\n const html2 = md.render(item.content || \"\");\n // 生成React节点\n const stepHtmlString = reactHtmlParser(html2);\n return (\n <div\n key={item.id}\n className=\"ai-markdown-body step-content\"\n style={{\n minWidth: 0,\n maxWidth: 600,\n }}\n >\n <div>{stepHtmlString}</div>\n <div className={styles.stepLine} />\n </div>\n );\n })}\n {/** 输出最终回答内容 */}\n <div\n className=\"ai-markdown-body\"\n style={{\n minWidth: 0,\n maxWidth: 600,\n }}\n >\n {htmlString}\n </div>\n </>\n );\n }\n // 提示类型\n if (type === \"SuggestionMessage\") {\n return (\n <Prompts\n vertical\n items={msg.content as any}\n onItemClick={(info) => {\n onSuggestMessageClick?.(info?.data, id);\n if (info.data.description) {\n onSend?.({\n text: info.data.description as string,\n });\n }\n }}\n />\n );\n }\n // 其他类型...\n return null;\n })(),\n };\n\n if (!extra.noFooter) {\n bubbleContent.footer = () => {\n const msgFiles = msg.content?.files || [];\n if (role === MessageRole.user && msgFiles.length) {\n return (\n <Flex gap={8} wrap justify=\"flex-end\">\n {msgFiles.map((f: any) => (\n <FileCard\n styles={{\n file:\n f?.fileType === \"image\"\n ? {\n width: 100,\n height: 100,\n }\n : {},\n }}\n key={f.fileId}\n {...f}\n name={f.fileName}\n size={f.fileSize}\n type={f.fileType}\n src={f.fileUrl}\n />\n ))}\n </Flex>\n );\n }\n if (\n role === MessageRole.assistant &&\n status !== MessageStatus.failed\n ) {\n return (\n <MessageFooter\n data={msg as Messages}\n lastMessage={lastMessageId.current === id}\n />\n );\n }\n };\n }\n\n return bubbleContent;\n })}\n />\n ) : (\n <EmptyState />\n )}\n </div>\n {/* 输入框 */}\n {inputShow && (\n <XAiSender\n value={content}\n loading={loading}\n footerTips={footerTips}\n clearBtnShow={clearBtnShow}\n enableUpload={enableUpload}\n files={files}\n onChangeFiles={setFiles}\n uploadRequest={uploadRequest}\n onChange={handleChange}\n onSubmit={handleSend}\n onStop={handleStop}\n onClear={confirmClear}\n />\n )}\n </div>\n </>\n );\n};\n\nexport default XAiChatbot;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// 文件: components/XAiChatbot/index.tsx\n\nimport React, { useRef, useState, useMemo } from \"react\";\nimport { Tooltip, GetProp, Flex } from \"antd\";\nimport { Bubble, Prompts, FileCard } from \"@ant-design/x\";\nimport type { BubbleListProps } from \"@ant-design/x/es/bubble/interface\";\nimport {\n UserOutlined,\n RedoOutlined,\n CopyOutlined,\n DeleteOutlined,\n} from \"@ant-design/icons\";\nimport clsx from \"clsx\";\nimport MarkdownIt from \"markdown-it\";\nimport reactHtmlParser from \"react-html-parser\";\nimport type { Attachment } from \"@/types/antdx\";\nimport MarkdownGlobalStyle from \"@/styles/markdown\";\nimport { MessageStatus, MessageRole, Messages } from \"@/types/XAiMessage\";\nimport { XAiChatbotProps, ActionItem } from \"@/types/XAiChatbot\";\nimport emptyIcon from \"@/assets/empty.png\";\nimport arrowUp from \"@/assets/arrow-up.png\";\nimport arrowDown from \"@/assets/arrow-down.png\";\nimport thinkIcon from \"@/assets/think.png\";\nimport groupIcon from \"@/assets/group.png\";\nimport arrowDownBlue from \"@/assets/arrow-down-blue.png\";\nimport { useChatbotContext } from \"@/hooks/useProviderContext\";\nimport { useStyles, GlobalStyle } from \"./styles\";\nimport XAiSender from \"../XAiSender\";\nimport type { SendContent } from \"@/types\";\n\nconst md = new MarkdownIt({\n html: true,\n linkify: true,\n typographer: true,\n});\n\n// 自定义 link_open 渲染规则\nconst defaultRender =\n md.renderer.rules.link_open ||\n ((tokens, idx, options, env, self) => {\n return self.renderToken(tokens, idx, options);\n });\n\n// a 标签打开规则\nmd.renderer.rules.link_open = (tokens, idx, options, env, self) => {\n // 添加 target=\"_blank\"\n const aIndex = tokens[idx].attrIndex(\"target\");\n if (aIndex < 0) {\n tokens[idx].attrPush([\"target\", \"_blank\"]);\n } else {\n tokens[idx].attrs![aIndex][1] = \"_blank\";\n }\n // 添加 rel=\"noopener noreferrer\"\n const relIndex = tokens[idx].attrIndex(\"rel\");\n if (relIndex < 0) {\n tokens[idx].attrPush([\"rel\", \"noopener noreferrer\"]);\n } else {\n tokens[idx].attrs![relIndex][1] = \"noopener noreferrer\";\n }\n return defaultRender(tokens, idx, options, env, self);\n};\n\nexport interface ActionHeaderProps {\n execute: any[];\n thinks: string;\n}\n\n// ActionHeader 组件\nexport const ActionHeader: React.FC<ActionHeaderProps> = ({\n execute = [],\n thinks = \"\",\n}) => {\n const styles = useStyles();\n const [expanded, setExpanded] = useState(true);\n const [executeExpanded, setExecuteExpanded] = useState(false);\n\n // 关键修复:只要有思考内容或执行过程就显示,不要同时要求两者都有\n if (!thinks && (!execute || execute.length === 0)) return null;\n\n const last = execute[execute.length - 1] || {};\n const { name } = last;\n const icon = last?.icon || last?.extra?.icon;\n\n return (\n <div className={styles.actionHeaderWrapper}>\n {!expanded && (\n <div\n className={styles.actionTitle}\n onClick={() => setExpanded((v) => !v)}\n >\n <img src={thinkIcon} alt=\"icon\" className={styles.actionHeaderIcon} />\n <span className={styles.flex1}>运行过程</span>\n <img alt=\"展开icon\" src={arrowDown} className={styles.w(\"16px\")} />\n </div>\n )}\n {expanded && (\n <div className={styles.actionHeaderDetail}>\n <div\n className={styles.actionDetailTitle}\n onClick={() => setExpanded((v) => !v)}\n >\n <img src={thinkIcon} alt=\"\" className={clsx(styles.w(14))} />\n <div className={clsx(styles.flex1, styles.pl(10))}>\n 隐藏运行过程\n </div>\n <img alt=\"收起icon\" src={arrowUp} className={styles.w(\"16px\")} />\n </div>\n\n {thinks && (\n <div\n className={styles.actionDetailContent}\n style={{ whiteSpace: \"pre-line\" }}\n >\n {thinks}\n </div>\n )}\n\n {execute && execute.length > 0 && (\n <>\n {!executeExpanded && (\n <div\n className={styles.executeHiddenWrapper}\n onClick={() => setExecuteExpanded((v) => !v)}\n >\n {icon && (\n <img src={icon} alt=\"icon\" className={styles.h(15)} />\n )}\n <span className={styles.flex1}>{name}</span>\n <img\n alt=\"工具icon\"\n src={arrowDownBlue}\n className={styles.w(\"16px\")}\n />\n </div>\n )}\n {executeExpanded && (\n <div className={styles.executeWrapper}>\n <div\n className={styles.executeTitle}\n onClick={() => setExecuteExpanded((v) => !v)}\n >\n <img\n src={groupIcon}\n alt=\"icon\"\n className={styles.executeHeaderIcon}\n />\n <span className={styles.flex1}>隐藏运行详情</span>\n <img\n alt=\"展开详情icon\"\n src={arrowUp}\n className={styles.w(\"16px\")}\n />\n </div>\n <div className={styles.executeContent}>\n {execute.map((action: any, idx: number) => {\n const thinkIcon2 =\n action?.expandIcon ||\n action?.extra?.expandIcon ||\n action?.extra?.icon ||\n action?.icon;\n const thinkCost = action?.cost || action?.extra?.cost;\n return (\n <div\n key={action.uniqueId || idx}\n className={styles.actionHeaderDetailItem}\n >\n {thinkIcon2 && (\n <img\n src={thinkIcon2}\n alt=\"icon\"\n className={styles.actionHeaderIcon}\n />\n )}\n <span>{action?.name}</span>\n <span className={styles.actionHeaderCost}>\n {thinkCost ? `${thinkCost}s` : \"\"}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n )}\n </div>\n );\n};\n\n// 默认消息功能区\nexport const defaultActions: ActionItem[] = [\n {\n key: \"redo\",\n icon: <RedoOutlined />,\n tooltip: \"重新生成\",\n },\n {\n key: \"copy\",\n icon: <CopyOutlined />,\n tooltip: \"复制\",\n },\n {\n key: \"delete\",\n icon: <DeleteOutlined />,\n tooltip: \"删除\",\n },\n];\n\nconst XAiChatbot: React.FC<XAiChatbotProps> = (props) => {\n const styles = useStyles();\n // 使用新的 Hook 来处理 Provider 上下文\n const { mergedProps } = useChatbotContext(props);\n\n const {\n navbarShow = false,\n navbar,\n renderNavbar = null,\n clearBtnShow = true,\n inputShow = true,\n // renderMessageContent,\n // quickReplies = [],\n // quickRepliesVisible = true,\n // onQuickReplyClick,\n loading: propLoading = false,\n messageTooltip,\n avatar,\n userAvatar,\n messages: propMessages,\n text = \"\",\n footerTips = \"\",\n empty = null,\n emptyStateImage = emptyIcon,\n emptyStateText = \"我的智能体\",\n messageActions = defaultActions,\n onMessagesActionsCallback,\n // 点击帮助消息\n onSuggestMessageClick,\n onSend,\n onClear,\n onStop,\n providerId,\n // 消息顶部\n messageTop,\n enableUpload,\n uploadRequest,\n } = mergedProps as XAiChatbotProps;\n\n // 如果在 Provider 中,使用 Provider 的状态\n const messages = mergedProps.messages || propMessages || [];\n const loading = mergedProps.loading || propLoading;\n\n const [content, setContent] = useState<string>(text); // 输入框文本\n const [files, setFiles] = useState<Attachment[]>([]);\n const lastMessageId = useRef<string>(\"\");\n const isScriptScrolling = useRef<boolean>(false);\n const chatId = providerId\n ? `za-chatbot-container-${providerId}`\n : \"za-chatbot-container\";\n\n // 滚动到最底部\n const scrollToBottom = () => {\n isScriptScrolling.current = true;\n setTimeout(() => {\n const mainChatWrapper = document.getElementById(chatId);\n if (mainChatWrapper) {\n mainChatWrapper.scrollTop = mainChatWrapper?.scrollHeight;\n }\n isScriptScrolling.current = false;\n }, 0);\n };\n\n // 消息功能区组件\n const FooterActions: React.FC<{ data: Messages; lastMessage: boolean }> = ({\n data,\n lastMessage = false,\n }) => (\n <div className={clsx(styles.flex, styles.gap(13))}>\n {messageActions.map((action: ActionItem, index: number) => {\n if (!lastMessage && action.key === \"redo\") return null;\n return (\n <Tooltip key={action.key} title={action.tooltip}>\n <span\n className={styles.cursor(\"pointer\")}\n onClick={() => onMessagesActionsCallback?.(index, data)}\n >\n {action.icon}\n {action.render?.(index, data)}\n </span>\n </Tooltip>\n );\n })}\n </div>\n );\n\n // 消息底部区域\n const MessageFooter: React.FC<{ data: Messages; lastMessage: boolean }> = ({\n data,\n lastMessage = false,\n }) => (\n <>\n {messageTooltip?.(data)}\n <FooterActions data={data} lastMessage={lastMessage} />\n </>\n );\n\n // 聊天角色\n const rolesObject: NonNullable<BubbleListProps[\"role\"]> = {\n assistant: {\n placement: \"start\",\n avatar: () => {\n return (\n avatar || (\n <UserOutlined\n className={clsx(styles.bg(\"#fde3cf\"), styles.userAvatar)}\n />\n )\n );\n },\n typing: { step: 5, interval: 20, effect: \"typing\" },\n style: {\n maxWidth: 600,\n },\n classNames: {\n content: \"assistant-content\",\n },\n },\n user: {\n placement: \"end\",\n avatar: () => {\n return (\n userAvatar || (\n <UserOutlined\n className={clsx(styles.bg(\"#87d068\"), styles.userAvatar)}\n />\n )\n );\n },\n classNames: {\n content: \"user-content\",\n },\n },\n suggestion: {\n placement: \"start\",\n avatar: () => {\n return (\n avatar || (\n <UserOutlined\n className={clsx(styles.bg(\"#fde3cf\"), styles.userAvatar)}\n />\n )\n );\n },\n variant: \"borderless\",\n },\n };\n\n // 触发发送\n const handleSend = (obj: SendContent) => {\n // 直接使用合并后的 onSend,自动处理 Provider 和独立模式\n onSend?.(obj);\n setContent(\"\"); // 发送后清空输入框内容\n setFiles([]); // 发送后清空文件\n scrollToBottom();\n };\n\n // 输出内容\n const handleChange = (str: string) => {\n setContent(str);\n };\n\n // 停止生成\n const handleStop = () => {\n onStop?.();\n };\n\n // 导航栏\n const NavBar: React.FC = () => {\n if (renderNavbar) {\n return renderNavbar();\n }\n if (navbar?.title) {\n return (\n <header className={styles.navbar}>\n {navbar.avatar && (\n <img src={navbar.avatar} className={styles.avatar} alt=\"\" />\n )}\n <div>\n <div className={styles.title}>{navbar.title}</div>\n <div className={styles.subtitle}>{navbar.subtitle}</div>\n </div>\n </header>\n );\n }\n return <></>;\n };\n\n // 确认清除\n const confirmClear = () => {\n onClear?.();\n };\n\n // 空状态\n const EmptyState = useMemo(\n () => () =>\n empty || (\n <div className={styles.emptyWrapper}>\n <img\n src={emptyStateImage}\n alt=\"空状态图标\"\n className={styles.emptyImg}\n />\n <div\n className={clsx(\n styles.text(16),\n styles.weight(600),\n styles.textColor(\"#343434\"),\n )}\n >\n {emptyStateText}\n </div>\n </div>\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [emptyStateImage, emptyStateText],\n );\n\n return (\n <>\n <GlobalStyle />\n <MarkdownGlobalStyle />\n <div id=\"x-ai-chatbot\" className={styles.wrapper}>\n {navbarShow && <NavBar />}\n {/** 消息容器 */}\n <div className={styles.messageContainer}>\n {/* 消息列表主体 */}\n {messages?.length ? (\n <Bubble.List\n id={chatId}\n role={rolesObject}\n className={styles.messageList}\n items={messages.map((msg: any) => {\n const {\n id,\n role,\n status,\n type,\n execute = [],\n thinks = \"\",\n extra = { noFooter: false },\n stepContent,\n } = msg as Messages;\n // 最后一条 AI消息标识\n if (role === MessageRole.assistant) {\n lastMessageId.current = id;\n }\n // 会话内容\n const bubbleContent: any = {\n key: id,\n role,\n loading: status === MessageStatus.init,\n header: () =>\n messageTop || (\n <ActionHeader execute={execute} thinks={thinks} />\n ),\n content: (() => {\n // 文本消息\n if (type === \"TextMessage\") {\n // 用户消息\n if (role === \"user\") {\n return (\n <div\n className=\"ai-markdown-body\"\n style={{\n minWidth: 0,\n maxWidth: 600,\n }}\n >\n {msg.content?.text}\n </div>\n );\n }\n\n // 输出html字符串\n const html = md.render(msg.content?.text || \"\");\n // 生成React节点\n const htmlString = reactHtmlParser(html);\n return (\n <>\n {/* 输出阶段性回答内容 */}\n {stepContent?.length &&\n stepContent.map((item) => {\n // 输出html字符串\n const html2 = md.render(item.content || \"\");\n // 生成React节点\n const stepHtmlString = reactHtmlParser(html2);\n return (\n <div\n key={item.id}\n className=\"ai-markdown-body step-content\"\n style={{\n minWidth: 0,\n maxWidth: 600,\n }}\n >\n <div>{stepHtmlString}</div>\n <div className={styles.stepLine} />\n </div>\n );\n })}\n {/** 输出最终回答内容 */}\n <div\n className=\"ai-markdown-body\"\n style={{\n minWidth: 0,\n maxWidth: 600,\n }}\n >\n {htmlString}\n </div>\n </>\n );\n }\n // 提示类型\n if (type === \"SuggestionMessage\") {\n return (\n <Prompts\n vertical\n items={msg.content as any}\n onItemClick={(info: { data: { description?: string; key: string; [key: string]: any } }) => {\n onSuggestMessageClick?.(info?.data, id);\n if (info.data.description) {\n onSend?.({\n text: info.data.description as string,\n });\n }\n }}\n />\n );\n }\n // 其他类型...\n return null;\n })(),\n };\n\n if (!extra.noFooter) {\n bubbleContent.footer = () => {\n const msgFiles = msg.content?.files || [];\n if (role === MessageRole.user && msgFiles.length) {\n return (\n <Flex gap={8} wrap justify=\"flex-end\">\n {msgFiles.map((f: any) => (\n <FileCard\n styles={{\n file:\n f?.fileType === \"image\"\n ? {\n width: 100,\n height: 100,\n }\n : {},\n }}\n key={f.fileId}\n {...f}\n name={f.fileName}\n size={f.fileSize}\n type={f.fileType}\n src={f.fileUrl}\n />\n ))}\n </Flex>\n );\n }\n if (\n role === MessageRole.assistant &&\n status !== MessageStatus.failed\n ) {\n return (\n <MessageFooter\n data={msg as Messages}\n lastMessage={lastMessageId.current === id}\n />\n );\n }\n };\n }\n\n return bubbleContent;\n })}\n />\n ) : (\n <EmptyState />\n )}\n </div>\n {/* 输入框 */}\n {inputShow && (\n <XAiSender\n value={content}\n loading={loading}\n footerTips={footerTips}\n clearBtnShow={clearBtnShow}\n enableUpload={enableUpload}\n files={files}\n onChangeFiles={setFiles}\n uploadRequest={uploadRequest}\n onChange={handleChange}\n onSubmit={handleSend}\n onStop={handleStop}\n onClear={confirmClear}\n />\n )}\n </div>\n </>\n );\n};\n\nexport default XAiChatbot;\n"],
5
+ "mappings": "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",
6
6
  "names": ["MarkdownIt", "thinkIcon", "arrowDown", "clsx", "arrowUp", "arrowDownBlue", "groupIcon", "_a", "emptyIcon", "MarkdownGlobalStyle", "reactHtmlParser", "XAiSender"]
7
7
  }
@@ -45,6 +45,7 @@ var import_flash_open = __toESM(require("../../assets/flash-open.svg?url"));
45
45
  var import_constants = require("../../constants");
46
46
  var import_styles = require("./styles");
47
47
  var import_jsx_runtime = require("react/jsx-runtime");
48
+ var InfiniteScroll = import_react_infinite_scroll_component.default;
48
49
  var XAiConversations = (props) => {
49
50
  const styles = (0, import_styles.useStyles)();
50
51
  const { mergedProps } = (0, import_useProviderContext.useChatbotContext)(props);
@@ -106,7 +107,7 @@ var XAiConversations = (props) => {
106
107
  ] }),
107
108
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.tipTitle, children: "历史对话" }),
108
109
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.scrollList, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
109
- import_react_infinite_scroll_component.default,
110
+ InfiniteScroll,
110
111
  {
111
112
  dataLength: sessionList.length,
112
113
  next: loadMoreSessions,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiConversations/index.tsx"],
4
- "sourcesContent": ["import React, { useState } from 'react';\nimport { Conversations } from '@ant-design/x';\nimport { RedoOutlined } from '@ant-design/icons';\nimport { Spin, Divider } from 'antd';\nimport InfiniteScroll from 'react-infinite-scroll-component';\nimport clsx from 'clsx';\nimport { useChatbotContext } from '@/hooks/useProviderContext';\nimport { type XAiConversationsProps } from '@/types/XAiConversations';\nimport logo from '@/assets/logo.png';\nimport AddChatIcon from '@/assets/svg/AddChatIcon';\nimport flashOpen from '@/assets/flash-open.svg?url';\nimport { SESSION_PAGE_SIZE } from '@/constants';\nimport { useStyles, GlobalStyle } from './styles';\n\nconst XAiConversations: React.FC<XAiConversationsProps> = (props) => {\n const styles = useStyles();\n const { mergedProps } = useChatbotContext(props);\n const {\n isNarrow = false,\n sessionList,\n style,\n onActiveChange,\n onNewChat,\n loadMoreSessions,\n activeKey,\n menu,\n } = mergedProps;\n\n const [listVisible, setListVisible] = useState(false);\n const [animateDirection, setAnimateDirection] = useState<'in' | 'out' | null>(null);\n\n const handleSwitchTab = (key: string) => {\n onActiveChange?.(key);\n };\n\n const handleNewChat = () => {\n onNewChat?.();\n };\n\n const handleShowList = () => {\n setListVisible(true);\n setAnimateDirection('in');\n };\n\n const handleCloseList = () => {\n setAnimateDirection('out');\n setTimeout(() => {\n setListVisible(false);\n setAnimateDirection(null);\n }, 300);\n };\n\n return (\n <div className={styles.conversationsWrapper}>\n <GlobalStyle />\n {/** 顶部操作栏 */}\n {\n !listVisible && (\n <div className={styles.capWrapper}>\n <img alt=\"logo\" src={logo} className={clsx(styles.w(32), styles.h(29))} />\n <div className={styles.capShape}>\n <div className={styles.capIcon}>\n <img src={flashOpen} alt=\"\" onClick={handleShowList} />\n </div>\n <div className={styles.capIcon}>\n <AddChatIcon className={clsx(styles.w(17), styles.text('#343434'))} onClick={handleNewChat} />\n </div>\n </div>\n </div>\n )\n }\n\n {/* 会话列表 */}\n <div\n // 展开时必须保持 flex 布局,scrollList 才能获得剩余高度并独立滚动。\n style={{ display: listVisible ? 'flex' : 'none' }}\n className={clsx(\n isNarrow ? styles.nWrapper : styles.fWrapper,\n animateDirection === 'in' && styles.slideIn,\n animateDirection === 'out' && styles.slideOut,\n )}\n >\n {/* 固定头部 */}\n <div className={styles.fheaderWrapper}>\n <img alt=\"logo\" src={logo} className={clsx(styles.w(32), styles.h(29))} />\n <div className={styles.capIcon}>\n <img src={flashOpen} alt=\"\" onClick={handleCloseList} />\n </div>\n </div>\n <div className={styles.addChatBtn} onClick={handleNewChat}>\n <AddChatIcon className={clsx(styles.w(17), styles.mr(10))} />\n 开启新对话\n </div>\n <div className={styles.tipTitle}>历史对话</div>\n\n {/* 滚动区域 */}\n <div className={styles.scrollList}>\n <InfiniteScroll\n dataLength={sessionList.length}\n next={loadMoreSessions}\n hasMore={false}\n loader={(\n <div style={{ textAlign: 'center' }}>\n <Spin indicator={<RedoOutlined spin />} size=\"small\" />\n </div>\n )}\n endMessage={sessionList.length === SESSION_PAGE_SIZE && <Divider plain><span className={styles.textColor('#949494')}>只展示前 50 条数据</span></Divider>}\n style={{ overflow: 'hidden', paddingBottom: '5px' }}\n >\n <Conversations\n activeKey={activeKey}\n onActiveChange={(v) => handleSwitchTab(v)}\n items={sessionList}\n menu={menu}\n style={{\n width: 256,\n borderRadius: '6px',\n ...style,\n }}\n />\n </InfiniteScroll>\n </div>\n </div>\n\n {/* 遮罩层 - 仅在窄屏且列表可见时显示 */}\n {isNarrow && listVisible && (\n <div className={styles.mask} onClick={handleCloseList} />\n )}\n </div>\n );\n};\n\nexport default XAiConversations;\n"],
5
- "mappings": "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",
6
- "names": ["logo", "clsx", "flashOpen", "AddChatIcon", "InfiniteScroll"]
4
+ "sourcesContent": ["import React, { useState } from 'react';\nimport { Conversations } from '@ant-design/x';\nimport { RedoOutlined } from '@ant-design/icons';\nimport { Spin, Divider } from 'antd';\nimport InfiniteScrollBase from 'react-infinite-scroll-component';\nconst InfiniteScroll = InfiniteScrollBase as unknown as React.FC<any>;\nimport clsx from 'clsx';\nimport { useChatbotContext } from '@/hooks/useProviderContext';\nimport { type XAiConversationsProps } from '@/types/XAiConversations';\nimport logo from '@/assets/logo.png';\nimport AddChatIcon from '@/assets/svg/AddChatIcon';\nimport flashOpen from '@/assets/flash-open.svg?url';\nimport { SESSION_PAGE_SIZE } from '@/constants';\nimport { useStyles, GlobalStyle } from './styles';\n\nconst XAiConversations: React.FC<XAiConversationsProps> = (props) => {\n const styles = useStyles();\n const { mergedProps } = useChatbotContext(props);\n const {\n isNarrow = false,\n sessionList,\n style,\n onActiveChange,\n onNewChat,\n loadMoreSessions,\n activeKey,\n menu,\n } = mergedProps;\n\n const [listVisible, setListVisible] = useState(false);\n const [animateDirection, setAnimateDirection] = useState<'in' | 'out' | null>(null);\n\n const handleSwitchTab = (key: string) => {\n onActiveChange?.(key);\n };\n\n const handleNewChat = () => {\n onNewChat?.();\n };\n\n const handleShowList = () => {\n setListVisible(true);\n setAnimateDirection('in');\n };\n\n const handleCloseList = () => {\n setAnimateDirection('out');\n setTimeout(() => {\n setListVisible(false);\n setAnimateDirection(null);\n }, 300);\n };\n\n return (\n <div className={styles.conversationsWrapper}>\n <GlobalStyle />\n {/** 顶部操作栏 */}\n {\n !listVisible && (\n <div className={styles.capWrapper}>\n <img alt=\"logo\" src={logo} className={clsx(styles.w(32), styles.h(29))} />\n <div className={styles.capShape}>\n <div className={styles.capIcon}>\n <img src={flashOpen} alt=\"\" onClick={handleShowList} />\n </div>\n <div className={styles.capIcon}>\n <AddChatIcon className={clsx(styles.w(17), styles.text('#343434'))} onClick={handleNewChat} />\n </div>\n </div>\n </div>\n )\n }\n\n {/* 会话列表 */}\n <div\n // 展开时必须保持 flex 布局,scrollList 才能获得剩余高度并独立滚动。\n style={{ display: listVisible ? 'flex' : 'none' }}\n className={clsx(\n isNarrow ? styles.nWrapper : styles.fWrapper,\n animateDirection === 'in' && styles.slideIn,\n animateDirection === 'out' && styles.slideOut,\n )}\n >\n {/* 固定头部 */}\n <div className={styles.fheaderWrapper}>\n <img alt=\"logo\" src={logo} className={clsx(styles.w(32), styles.h(29))} />\n <div className={styles.capIcon}>\n <img src={flashOpen} alt=\"\" onClick={handleCloseList} />\n </div>\n </div>\n <div className={styles.addChatBtn} onClick={handleNewChat}>\n <AddChatIcon className={clsx(styles.w(17), styles.mr(10))} />\n 开启新对话\n </div>\n <div className={styles.tipTitle}>历史对话</div>\n\n {/* 滚动区域 */}\n <div className={styles.scrollList}>\n <InfiniteScroll\n dataLength={sessionList.length}\n next={loadMoreSessions}\n hasMore={false}\n loader={(\n <div style={{ textAlign: 'center' }}>\n <Spin indicator={<RedoOutlined spin />} size=\"small\" />\n </div>\n )}\n endMessage={sessionList.length === SESSION_PAGE_SIZE && <Divider plain><span className={styles.textColor('#949494')}>只展示前 50 条数据</span></Divider>}\n style={{ overflow: 'hidden', paddingBottom: '5px' }}\n >\n <Conversations\n activeKey={activeKey}\n onActiveChange={(v: string) => handleSwitchTab(v)}\n items={sessionList}\n menu={menu}\n style={{\n width: 256,\n borderRadius: '6px',\n ...style,\n }}\n />\n </InfiniteScroll>\n </div>\n </div>\n\n {/* 遮罩层 - 仅在窄屏且列表可见时显示 */}\n {isNarrow && listVisible && (\n <div className={styles.mask} onClick={handleCloseList} />\n )}\n </div>\n );\n};\n\nexport default XAiConversations;\n"],
5
+ "mappings": "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",
6
+ "names": ["InfiniteScrollBase", "logo", "clsx", "flashOpen", "AddChatIcon"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiProvider/index.tsx"],
4
- "sourcesContent": ["import React, { forwardRef, useImperativeHandle, useState, useRef, useEffect } from 'react';\nimport { message, Divider, Modal, Input, ConfigProvider } from 'antd';\nimport copy from 'copy-to-clipboard';\nimport { XProvider } from '@ant-design/x';\nimport type { ConversationsProps } from '@/types/antdx';\nimport { ExclamationCircleFilled, LikeFilled, LikeOutlined } from '@ant-design/icons';\nimport { XAiContext } from '@/context/AiProviderContext';\nimport { XAiProviderProps, XAiProviderHandle } from '@/types/XAiProvider';\nimport useAgentGenerator from '@/hooks/useAgentGenerator';\nimport { MOBILE_MAX_WIDTH, API_SUCCESS_CODE } from '@/constants';\nimport userIcon from '@/assets/user.png';\nimport { primaryBlue } from '@/styles/common';\nimport DislikeFeedback from '../DislikeFeedback';\nimport { addFeedback } from '@/services/api';\nimport { defaultActions } from '../XAiChatbot';\nimport type { SendContent } from '@/types';\n\nconst { confirm } = Modal;\n\nconst XAiProvider = forwardRef<XAiProviderHandle, XAiProviderProps>(({\n url = window.location.origin,\n token,\n config,\n providerId = 'defaultId',\n onSuccess,\n onError,\n onMessage,\n children,\n}, ref) => {\n // 使用 useAgentGenerator Hook 管理消息状态\n\n const { textSpeed = 55 } = config?.chatProps || {};\n\n const {\n appInfo,\n chat,\n stopChat,\n reChat,\n createNewChat,\n deleteSession,\n updateSession,\n currentSessionId,\n sessionPagination,\n sessionList,\n messages,\n loading,\n setCurrentSession,\n setMessages,\n } = useAgentGenerator({ url, token, config, onError, onSuccess, onMessage, textSpeed });\n\n const { appName, icon } = appInfo || {};\n\n useImperativeHandle(ref, () => ({\n chat,\n stopChat,\n reChat,\n getAppInfo: () => appInfo,\n getMessages: () => messages,\n getSessions: () => sessionList,\n setMessages,\n setCurrentSession,\n }), [appInfo, messages, chat, stopChat, reChat, setMessages, setCurrentSession]);\n\n const [isNarrow, setIsNarrow] = useState<boolean>(false);\n const divRef = useRef<HTMLDivElement>(null);\n\n // 监听容器宽度变化\n useEffect(() => {\n const div = divRef.current;\n if (!div) return;\n\n // 创建监听器\n const resizeObserver = new ResizeObserver((entries) => {\n // eslint-disable-next-line no-restricted-syntax\n for (const entry of entries) {\n const { width } = entry.contentRect;\n setIsNarrow(width <= MOBILE_MAX_WIDTH);\n }\n });\n\n // 开始监听\n resizeObserver.observe(div);\n\n // 初始化检查\n const initialWidth = div.offsetWidth;\n setIsNarrow(initialWidth <= MOBILE_MAX_WIDTH);\n\n // 清理函数\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n // 发送消息\n const handleSendMessage = (content: SendContent) => {\n chat(content);\n };\n\n // 清空消息\n const handleCreateNewMessage = () => {\n createNewChat();\n };\n\n // 工具栏按钮点击\n const handleActions = async (index: number, actionData: any) => {\n const { content, id } = actionData || {};\n const { text = '' } = content;\n switch (index) {\n case 0:\n reChat();\n break;\n case 1:\n copy(text);\n message.success('复制成功');\n break;\n case 2: {\n const idx = messages.findIndex((item) => item.id === id);\n if (idx >= 0) {\n // 删除该条消息及建议类消息\n if (messages.length - idx <= 2) {\n setMessages((prev) => prev.filter((item) => item.id !== id && item.type !== 'SuggestionMessage'));\n } else {\n // 非最新消息 只删除该条消息\n setMessages((prev) => prev.filter((item) => item.id !== id));\n }\n message.success('删除成功');\n }\n break;\n }\n case 3: {\n const { appNo } = config || {};\n const isLike = actionData.isLike ?? 0;\n if (isLike !== 0) {\n message.warning('已收到您的反馈,无需重复提交');\n return;\n }\n if (appNo) {\n const { result } = await addFeedback({\n url,\n token,\n appNo,\n requestId: actionData.raw?.requestId,\n isLike: 1,\n });\n if (result?.code === API_SUCCESS_CODE) {\n message.success('感谢您的反馈');\n setMessages((prev) => {\n return prev.map((item) => {\n if (item.id === id) {\n return {\n ...item,\n isLike: 1,\n };\n }\n return item;\n });\n });\n } else {\n message.error('反馈失败,请稍后再试');\n }\n }\n break;\n }\n }\n };\n\n // 建议消息点击\n const handleSuggestMessageClick = (_item: any, id: string) => {\n setMessages((prev: any[]) => prev.filter((m: any) => m.id !== id));\n };\n\n // 切换会话\n const handleActiveChange = (key: string) => {\n setCurrentSession(key);\n };\n\n // 删除会话\n const handleDeleteSession = (sessionId: string) => {\n deleteSession(sessionId);\n };\n\n // 修改会话内容\n const handleUpdateSession = (sessionId: string, title: string) => {\n updateSession(sessionId, title);\n };\n\n // 会话操作菜单\n const menuConfig: ConversationsProps['menu'] = (conversation) => ({\n items: [\n {\n label: '重命名',\n key: 'edit',\n },\n {\n label: '删除',\n key: 'delete',\n danger: true,\n },\n ],\n onClick: (menuInfo) => {\n menuInfo.domEvent.stopPropagation();\n const { key } = menuInfo;\n switch (key) {\n case 'edit': {\n let inputValue = conversation.label as string || '';\n confirm({\n title: '编辑对话名称',\n icon: null,\n content: (\n <Input\n defaultValue={inputValue}\n autoFocus\n style={{ width: '100%' }}\n onChange={(e) => {\n inputValue = e.target.value;\n }}\n />\n ),\n okText: '确认',\n cancelText: '取消',\n okButtonProps: {\n style: { background: '#000', borderColor: '#000', color: '#fff' },\n },\n onOk: () => {\n if (!inputValue.trim()) {\n message.error('对话名称不能为空');\n return Promise.reject();\n }\n handleUpdateSession(conversation.key, inputValue);\n },\n onCancel: () => {\n // 静默处理\n },\n });\n break;\n }\n case 'delete':\n confirm({\n title: '确认删除?',\n icon: <ExclamationCircleFilled />,\n content: '该对话内容将被删除无法恢复。',\n okText: '确认删除',\n okType: 'danger',\n cancelText: '取消',\n okButtonProps: {\n style: { background: '#ff4d4f', borderColor: '#ff4d4f', color: '#fff' },\n },\n onOk() {\n handleDeleteSession(conversation.key);\n },\n onCancel() {\n //\n },\n });\n break;\n }\n },\n });\n\n const ToolTip = (messageData: any) => {\n const finalResult = (messageData?.think || []).find((item: any) => item.actionName === 'FINISHED');\n if (!finalResult) return null;\n const { cost, token: tokenCount } = finalResult.extra || {};\n if (!cost && !token) return null;\n return (\n <div style={{ display: 'flex', alignItems: 'center', fontSize: '12px', color: '#949494', flex: 1, paddingRight: '40px' }}>\n { (cost !== undefined && cost !== null) && <div>{cost}s</div> }\n { tokenCount && <Divider type=\"vertical\" /> }\n { tokenCount && <div>{ tokenCount } tokens</div> }\n </div>\n );\n };\n // 是否展示清空按钮\n const clearBtnShow = typeof config?.chatProps?.clearBtnShow !== 'undefined'\n ? config.chatProps.clearBtnShow\n : !config?.session?.showSessionList;\n\n return (\n <ConfigProvider theme={{\n token: {\n colorPrimary: appInfo?.appTheme || primaryBlue,\n },\n }}\n >\n <XProvider>\n <XAiContext.Provider value={{\n avatar: <img src={icon} alt=\"智能体头像\" />,\n userAvatar: <img src={userIcon} alt=\"用户头像\" />,\n emptyStateImage: icon,\n emptyStateText: appName,\n footerTips: '内容由AI生成,无法确保真实准确,仅供参考',\n providerId,\n sessionList,\n sessionTotal: sessionPagination.total,\n token,\n messages,\n loading,\n error: null,\n activeKey: currentSessionId,\n clearBtnShow,\n inputShow: config?.chatProps?.inputShow || true,\n isNarrow,\n messageTooltip: ToolTip,\n messageActions: [...defaultActions, {\n key: 'like',\n tooltip: '赞',\n render: (i, msg) => {\n const isLike = msg.isLike === 1;\n if (isLike) {\n return (\n <LikeFilled style={{ color: appInfo?.appTheme || primaryBlue }} />\n );\n }\n return <LikeOutlined />;\n },\n }, {\n key: 'dislike',\n tooltip: '踩',\n render: (_i, msg) => {\n const requestId = msg.raw?.requestId;\n return (\n <DislikeFeedback\n msg={msg}\n activeColor={appInfo?.appTheme || primaryBlue}\n onSubmit={async (formData) => {\n const { result } = await addFeedback({\n ...formData,\n requestId,\n isLike: -1,\n url,\n appNo: config?.appNo,\n token,\n });\n if (result?.code === API_SUCCESS_CODE) {\n message.success('已收到您的反馈,我们会努力做的更好');\n setMessages((prev) => {\n return prev.map((item) => {\n if (item.id === msg.id) {\n return {\n ...item,\n isLike: -1,\n };\n }\n return item;\n });\n });\n return true;\n }\n message.error('反馈失败,请稍后再试');\n return false;\n }}\n />\n );\n },\n }],\n onSend: handleSendMessage,\n onClear: handleCreateNewMessage,\n onNewChat: handleCreateNewMessage,\n onStop: stopChat,\n menu: menuConfig,\n onActiveChange: handleActiveChange,\n onSuggestMessageClick: handleSuggestMessageClick,\n onMessagesActionsCallback: handleActions,\n isInProvider: true,\n }}\n >\n <div\n ref={divRef}\n style={{\n display: 'flex',\n height: '100%',\n position: 'relative',\n }}\n >\n {children}\n </div>\n </XAiContext.Provider>\n </XProvider>\n </ConfigProvider>\n );\n});\n\nexport default XAiProvider;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React, { forwardRef, useImperativeHandle, useState, useRef, useEffect } from 'react';\nimport { message, Divider, Modal, Input, ConfigProvider } from 'antd';\nimport copy from 'copy-to-clipboard';\nimport { XProvider } from '@ant-design/x';\nimport type { ConversationsProps } from '@/types/antdx';\nimport { ExclamationCircleFilled, LikeFilled, LikeOutlined } from '@ant-design/icons';\nimport { XAiContext } from '@/context/AiProviderContext';\nimport { XAiProviderProps, XAiProviderHandle } from '@/types/XAiProvider';\nimport useAgentGenerator from '@/hooks/useAgentGenerator';\nimport { MOBILE_MAX_WIDTH, API_SUCCESS_CODE } from '@/constants';\nimport userIcon from '@/assets/user.png';\nimport { primaryBlue } from '@/styles/common';\nimport DislikeFeedback from '../DislikeFeedback';\nimport { addFeedback } from '@/services/api';\nimport { defaultActions } from '../XAiChatbot';\nimport type { SendContent } from '@/types';\n\nconst { confirm } = Modal;\n\nconst XAiProvider = forwardRef<XAiProviderHandle, XAiProviderProps>(({\n url = window.location.origin,\n token,\n config,\n providerId = 'defaultId',\n onSuccess,\n onError,\n onMessage,\n children,\n}, ref) => {\n // 使用 useAgentGenerator Hook 管理消息状态\n\n const { textSpeed = 55 } = config?.chatProps || {};\n\n const {\n appInfo,\n chat,\n stopChat,\n reChat,\n createNewChat,\n deleteSession,\n updateSession,\n currentSessionId,\n sessionPagination,\n sessionList,\n messages,\n loading,\n setCurrentSession,\n setMessages,\n } = useAgentGenerator({ url, token, config, onError, onSuccess, onMessage, textSpeed });\n\n const { appName, icon } = appInfo || {};\n\n useImperativeHandle(ref, () => ({\n chat,\n stopChat,\n reChat,\n getAppInfo: () => appInfo,\n getMessages: () => messages,\n getSessions: () => sessionList,\n setMessages,\n setCurrentSession,\n }), [appInfo, messages, chat, stopChat, reChat, setMessages, setCurrentSession]);\n\n const [isNarrow, setIsNarrow] = useState<boolean>(false);\n const divRef = useRef<HTMLDivElement>(null);\n\n // 监听容器宽度变化\n useEffect(() => {\n const div = divRef.current;\n if (!div) return;\n\n // 创建监听器\n const resizeObserver = new ResizeObserver((entries) => {\n // eslint-disable-next-line no-restricted-syntax\n for (const entry of entries) {\n const { width } = entry.contentRect;\n setIsNarrow(width <= MOBILE_MAX_WIDTH);\n }\n });\n\n // 开始监听\n resizeObserver.observe(div);\n\n // 初始化检查\n const initialWidth = div.offsetWidth;\n setIsNarrow(initialWidth <= MOBILE_MAX_WIDTH);\n\n // 清理函数\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n // 发送消息\n const handleSendMessage = (content: SendContent) => {\n chat(content);\n };\n\n // 清空消息\n const handleCreateNewMessage = () => {\n createNewChat();\n };\n\n // 工具栏按钮点击\n const handleActions = async (index: number, actionData: any) => {\n const { content, id } = actionData || {};\n const { text = '' } = content;\n switch (index) {\n case 0:\n reChat();\n break;\n case 1:\n copy(text);\n message.success('复制成功');\n break;\n case 2: {\n const idx = messages.findIndex((item) => item.id === id);\n if (idx >= 0) {\n // 删除该条消息及建议类消息\n if (messages.length - idx <= 2) {\n setMessages((prev) => prev.filter((item) => item.id !== id && item.type !== 'SuggestionMessage'));\n } else {\n // 非最新消息 只删除该条消息\n setMessages((prev) => prev.filter((item) => item.id !== id));\n }\n message.success('删除成功');\n }\n break;\n }\n case 3: {\n const { appNo } = config || {};\n const isLike = actionData.isLike ?? 0;\n if (isLike !== 0) {\n message.warning('已收到您的反馈,无需重复提交');\n return;\n }\n if (appNo) {\n const { result } = await addFeedback({\n url,\n token,\n appNo,\n requestId: actionData.raw?.requestId,\n isLike: 1,\n });\n if (result?.code === API_SUCCESS_CODE) {\n message.success('感谢您的反馈');\n setMessages((prev) => {\n return prev.map((item) => {\n if (item.id === id) {\n return {\n ...item,\n isLike: 1,\n };\n }\n return item;\n });\n });\n } else {\n message.error('反馈失败,请稍后再试');\n }\n }\n break;\n }\n }\n };\n\n // 建议消息点击\n const handleSuggestMessageClick = (_item: any, id: string) => {\n setMessages((prev: any[]) => prev.filter((m: any) => m.id !== id));\n };\n\n // 切换会话\n const handleActiveChange = (key: string) => {\n setCurrentSession(key);\n };\n\n // 删除会话\n const handleDeleteSession = (sessionId: string) => {\n deleteSession(sessionId);\n };\n\n // 修改会话内容\n const handleUpdateSession = (sessionId: string, title: string) => {\n updateSession(sessionId, title);\n };\n\n // 会话操作菜单\n const menuConfig: ConversationsProps['menu'] = (conversation) => ({\n items: [\n {\n label: '重命名',\n key: 'edit',\n },\n {\n label: '删除',\n key: 'delete',\n danger: true,\n },\n ],\n onClick: (menuInfo: { key: string; domEvent: React.MouseEvent<HTMLElement> }) => {\n menuInfo.domEvent.stopPropagation();\n const { key } = menuInfo;\n switch (key) {\n case 'edit': {\n let inputValue = conversation.label as string || '';\n confirm({\n title: '编辑对话名称',\n icon: null,\n content: (\n <Input\n defaultValue={inputValue}\n autoFocus\n style={{ width: '100%' }}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n inputValue = e.target.value;\n }}\n />\n ),\n okText: '确认',\n cancelText: '取消',\n okButtonProps: {\n style: { background: '#000', borderColor: '#000', color: '#fff' },\n },\n onOk: () => {\n if (!inputValue.trim()) {\n message.error('对话名称不能为空');\n return Promise.reject();\n }\n handleUpdateSession(conversation.key, inputValue);\n },\n onCancel: () => {\n // 静默处理\n },\n });\n break;\n }\n case 'delete':\n confirm({\n title: '确认删除?',\n icon: <ExclamationCircleFilled />,\n content: '该对话内容将被删除无法恢复。',\n okText: '确认删除',\n okType: 'danger',\n cancelText: '取消',\n okButtonProps: {\n style: { background: '#ff4d4f', borderColor: '#ff4d4f', color: '#fff' },\n },\n onOk() {\n handleDeleteSession(conversation.key);\n },\n onCancel() {\n //\n },\n });\n break;\n }\n },\n });\n\n const ToolTip = (messageData: any) => {\n const finalResult = (messageData?.think || []).find((item: any) => item.actionName === 'FINISHED');\n if (!finalResult) return null;\n const { cost, token: tokenCount } = finalResult.extra || {};\n if (!cost && !token) return null;\n return (\n <div style={{ display: 'flex', alignItems: 'center', fontSize: '12px', color: '#949494', flex: 1, paddingRight: '40px' }}>\n { (cost !== undefined && cost !== null) && <div>{cost}s</div> }\n { tokenCount && <Divider type=\"vertical\" /> }\n { tokenCount && <div>{ tokenCount } tokens</div> }\n </div>\n );\n };\n // 是否展示清空按钮\n const clearBtnShow = typeof config?.chatProps?.clearBtnShow !== 'undefined'\n ? config.chatProps.clearBtnShow\n : !config?.session?.showSessionList;\n\n return (\n <ConfigProvider theme={{\n token: {\n colorPrimary: appInfo?.appTheme || primaryBlue,\n },\n }}\n >\n <XProvider>\n <XAiContext.Provider value={{\n avatar: <img src={icon} alt=\"智能体头像\" />,\n userAvatar: <img src={userIcon} alt=\"用户头像\" />,\n emptyStateImage: icon,\n emptyStateText: appName,\n footerTips: '内容由AI生成,无法确保真实准确,仅供参考',\n providerId,\n sessionList,\n sessionTotal: sessionPagination.total,\n token,\n messages,\n loading,\n error: null,\n activeKey: currentSessionId,\n clearBtnShow,\n inputShow: config?.chatProps?.inputShow || true,\n isNarrow,\n messageTooltip: ToolTip,\n messageActions: [...defaultActions, {\n key: 'like',\n tooltip: '赞',\n render: (i, msg) => {\n const isLike = msg.isLike === 1;\n if (isLike) {\n return (\n <LikeFilled style={{ color: appInfo?.appTheme || primaryBlue }} />\n );\n }\n return <LikeOutlined />;\n },\n }, {\n key: 'dislike',\n tooltip: '踩',\n render: (_i, msg) => {\n const requestId = msg.raw?.requestId;\n return (\n <DislikeFeedback\n msg={msg}\n activeColor={appInfo?.appTheme || primaryBlue}\n onSubmit={async (formData) => {\n const { result } = await addFeedback({\n ...formData,\n requestId,\n isLike: -1,\n url,\n appNo: config?.appNo,\n token,\n });\n if (result?.code === API_SUCCESS_CODE) {\n message.success('已收到您的反馈,我们会努力做的更好');\n setMessages((prev) => {\n return prev.map((item) => {\n if (item.id === msg.id) {\n return {\n ...item,\n isLike: -1,\n };\n }\n return item;\n });\n });\n return true;\n }\n message.error('反馈失败,请稍后再试');\n return false;\n }}\n />\n );\n },\n }],\n onSend: handleSendMessage,\n onClear: handleCreateNewMessage,\n onNewChat: handleCreateNewMessage,\n onStop: stopChat,\n menu: menuConfig,\n onActiveChange: handleActiveChange,\n onSuggestMessageClick: handleSuggestMessageClick,\n onMessagesActionsCallback: handleActions,\n isInProvider: true,\n }}\n >\n <div\n ref={divRef}\n style={{\n display: 'flex',\n height: '100%',\n position: 'relative',\n }}\n >\n {children}\n </div>\n </XAiContext.Provider>\n </XProvider>\n </ConfigProvider>\n );\n});\n\nexport default XAiProvider;\n"],
5
+ "mappings": "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",
6
6
  "names": ["useAgentGenerator", "_a", "copy", "userIcon", "DislikeFeedback"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAiSender/index.tsx"],
4
- "sourcesContent": ["import React, {\n useRef,\n useState,\n} from 'react';\nimport {\n Attachments,\n Sender,\n} from '@ant-design/x';\nimport {\n Button,\n GetRef,\n Popover,\n Space,\n Flex,\n Tooltip,\n} from 'antd';\nimport {\n ArrowUpOutlined,\n ClearOutlined,\n PlusCircleOutlined,\n} from '@ant-design/icons';\nimport clsx from 'clsx';\nimport type { AttachmentsRef } from '@/types/antdx';\nimport {\n XAiSenderProps,\n} from '@/types';\nimport { useChatbotContext } from '@/hooks/useProviderContext';\nimport { useStyles } from './styles';\n\nconst XAiSender: React.FC<XAiSenderProps> = (props) => {\n // 使用新的 Hook 来处理 Provider 上下文\n const { mergedProps } = useChatbotContext(props);\n const {\n footerTips,\n clearBtnShow,\n value,\n onChange,\n onClear,\n onStop,\n onSubmit,\n files,\n enableUpload,\n onChangeFiles,\n uploadRequest,\n loading: propLoading = false,\n disabled,\n ...resetProps\n } = mergedProps as XAiSenderProps;\n const senderRef = useRef<GetRef<typeof Sender>>(null);\n const attachmentsRef = useRef<AttachmentsRef>(null);\n\n // 如果在 Provider 中,使用 Provider 的状态\n const loading = mergedProps.loading || propLoading;\n const [clearPopoverVisible, setClearPopoverVisible] = useState(false); // 气泡卡片显隐藏\n const styles = useStyles();\n\n // 触发发送\n const handleSend = () => {\n if (value && value.trim()) {\n // 直接使用合并后的 onSend,自动处理 Provider 和独立模式\n onSubmit?.({\n text: value,\n files: files || [],\n });\n }\n };\n\n // 文件上传按钮引用\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // 点击清除按钮\n const handleClear = () => {\n setClearPopoverVisible(true);\n };\n\n // 取消清除\n const cancelClear = () => {\n setClearPopoverVisible(false);\n };\n\n // 确认清除\n const confirmClear = () => {\n onClear?.();\n setClearPopoverVisible(false);\n };\n\n // 清空按钮提示文案\n const clearConfirmContent = (\n <div className={styles.p('2px')}>\n <p className={clsx(styles.mb(14), styles.mt(0))}>确认清除所有聊天记录并重置会话!</p>\n <div className={styles.popoverFooter}>\n <Button size=\"small\" onClick={cancelClear}>\n 取消\n </Button>\n <Button size=\"small\" type=\"primary\" danger onClick={confirmClear}>\n 确认\n </Button>\n </div>\n </div>\n );\n\n // 自定义上传按钮\n const uploadButton = (\n <div className={styles.flexCenterGap2}>\n <Tooltip\n placement=\"top\"\n title=\"支持图片、文档等上传\"\n >\n <Button\n color=\"default\"\n variant=\"text\"\n shape=\"circle\"\n size=\"small\"\n icon={<PlusCircleOutlined style={{ fontSize: 20, color: '#949494' }} />}\n onClick={() => {\n if (fileInputRef.current) {\n fileInputRef.current?.click();\n }\n }}\n />\n <input\n type=\"file\"\n ref={fileInputRef}\n multiple\n onChange={(e) => {\n const fileList = e.target.files || [];\n if (!fileList.length) return;\n for (let i = 0; i < fileList.length; i++) {\n const file = fileList[i];\n attachmentsRef.current?.upload(file);\n }\n e.target.value = '';\n }}\n style={{ display: 'none' }}\n accept=\"*/*\"\n />\n </Tooltip>\n </div>\n );\n\n return (\n <>\n <div className={styles.chatFooter}>\n <div className={clsx(styles.flex, styles.gap(8))}>\n {/* 普通文本输入 */}\n <Sender\n {...resetProps}\n value={value}\n className={styles.sendWrapper}\n placeholder=\"继续对话...\"\n disabled={disabled}\n loading={loading}\n ref={senderRef}\n header={enableUpload && (\n <Sender.Header\n closable={false}\n forceRender\n open={!!files?.length}\n styles={{\n content: { padding: 0 },\n }}\n >\n <Attachments\n ref={attachmentsRef}\n customRequest={uploadRequest}\n multiple\n items={files}\n // imageProps={{\n // preview: {\n // mask: true,\n // },\n // }}\n onChange={({ fileList }) => {\n onChangeFiles?.(fileList);\n }}\n getDropContainer={() => senderRef.current?.nativeElement}\n />\n </Sender.Header>\n )}\n suffix={false}\n footer={(_, info) => {\n const { SendButton, LoadingButton } = info.components;\n return (\n <Flex justify=\"space-between\">\n <div>\n {/* 清空按钮 */}\n {clearBtnShow && (\n <Popover\n content={clearConfirmContent}\n title=\"确认清空对话\"\n trigger=\"click\"\n open={clearPopoverVisible}\n onOpenChange={setClearPopoverVisible}\n >\n <div\n className={styles.clearBtn}\n onClick={handleClear}\n >\n <ClearOutlined className={styles.text(12)} />\n </div>\n </Popover>\n )}\n </div>\n <Space size=\"small\" style={{ display: 'flex', alignItems: 'center'}}>\n {enableUpload && (\n <>\n {uploadButton}\n <div className={styles.divider} />\n </>\n )}\n {loading\n ? (\n <LoadingButton onClick={() => onStop?.()} className={styles.stopButton} />\n )\n : (\n <SendButton\n className={styles.sendButton}\n type=\"primary\"\n icon={<ArrowUpOutlined className={styles.text(20)} />}\n disabled={disabled}\n />\n )}\n </Space>\n </Flex>\n );\n }}\n onChange={(v) => {\n onChange?.(v);\n }}\n onSubmit={handleSend}\n onCancel={() => {\n onStop?.();\n }}\n />\n </div>\n </div>\n { footerTips && <div className={styles.footerTips}>{footerTips}</div>}\n </>\n );\n};\n\nexport default XAiSender;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React, {\n useRef,\n useState,\n} from 'react';\nimport {\n Attachments,\n Sender,\n} from '@ant-design/x';\nimport {\n Button,\n GetRef,\n Popover,\n Space,\n Flex,\n Tooltip,\n} from 'antd';\nimport {\n ArrowUpOutlined,\n ClearOutlined,\n PlusCircleOutlined,\n} from '@ant-design/icons';\nimport clsx from 'clsx';\nimport type { AttachmentsRef } from '@/types/antdx';\nimport {\n XAiSenderProps,\n} from '@/types';\nimport { useChatbotContext } from '@/hooks/useProviderContext';\nimport { useStyles } from './styles';\n\nconst XAiSender: React.FC<XAiSenderProps> = (props) => {\n // 使用新的 Hook 来处理 Provider 上下文\n const { mergedProps } = useChatbotContext(props);\n const {\n footerTips,\n clearBtnShow,\n value,\n onChange,\n onClear,\n onStop,\n onSubmit,\n files,\n enableUpload,\n onChangeFiles,\n uploadRequest,\n loading: propLoading = false,\n disabled,\n ...resetProps\n } = mergedProps as XAiSenderProps;\n const senderRef = useRef<GetRef<typeof Sender>>(null);\n const attachmentsRef = useRef<AttachmentsRef>(null);\n\n // 如果在 Provider 中,使用 Provider 的状态\n const loading = mergedProps.loading || propLoading;\n const [clearPopoverVisible, setClearPopoverVisible] = useState(false); // 气泡卡片显隐藏\n const styles = useStyles();\n\n // 触发发送\n const handleSend = () => {\n if (value && value.trim()) {\n // 直接使用合并后的 onSend,自动处理 Provider 和独立模式\n onSubmit?.({\n text: value,\n files: files || [],\n });\n }\n };\n\n // 文件上传按钮引用\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // 点击清除按钮\n const handleClear = () => {\n setClearPopoverVisible(true);\n };\n\n // 取消清除\n const cancelClear = () => {\n setClearPopoverVisible(false);\n };\n\n // 确认清除\n const confirmClear = () => {\n onClear?.();\n setClearPopoverVisible(false);\n };\n\n // 清空按钮提示文案\n const clearConfirmContent = (\n <div className={styles.p('2px')}>\n <p className={clsx(styles.mb(14), styles.mt(0))}>确认清除所有聊天记录并重置会话!</p>\n <div className={styles.popoverFooter}>\n <Button size=\"small\" onClick={cancelClear}>\n 取消\n </Button>\n <Button size=\"small\" type=\"primary\" danger onClick={confirmClear}>\n 确认\n </Button>\n </div>\n </div>\n );\n\n // 自定义上传按钮\n const uploadButton = (\n <div className={styles.flexCenterGap2}>\n <Tooltip\n placement=\"top\"\n title=\"支持图片、文档等上传\"\n >\n <Button\n color=\"default\"\n variant=\"text\"\n shape=\"circle\"\n size=\"small\"\n icon={<PlusCircleOutlined style={{ fontSize: 20, color: '#949494' }} />}\n onClick={() => {\n if (fileInputRef.current) {\n fileInputRef.current?.click();\n }\n }}\n />\n <input\n type=\"file\"\n ref={fileInputRef}\n multiple\n onChange={(e) => {\n const fileList = e.target.files || [];\n if (!fileList.length) return;\n for (let i = 0; i < fileList.length; i++) {\n const file = fileList[i];\n attachmentsRef.current?.upload(file);\n }\n e.target.value = '';\n }}\n style={{ display: 'none' }}\n accept=\"*/*\"\n />\n </Tooltip>\n </div>\n );\n\n return (\n <>\n <div className={styles.chatFooter}>\n <div className={clsx(styles.flex, styles.gap(8))}>\n {/* 普通文本输入 */}\n <Sender\n {...resetProps}\n value={value}\n className={styles.sendWrapper}\n placeholder=\"继续对话...\"\n disabled={disabled}\n loading={loading}\n ref={senderRef}\n header={enableUpload && (\n <Sender.Header\n closable={false}\n forceRender\n open={!!files?.length}\n styles={{\n content: { padding: 0 },\n }}\n >\n <Attachments\n ref={attachmentsRef}\n customRequest={uploadRequest}\n multiple\n items={files}\n // imageProps={{\n // preview: {\n // mask: true,\n // },\n // }}\n onChange={({ fileList }: { fileList: any[] }) => {\n onChangeFiles?.(fileList);\n }}\n getDropContainer={() => senderRef.current?.nativeElement}\n />\n </Sender.Header>\n )}\n suffix={false}\n footer={(_: React.ReactNode, info: { components: { SendButton: React.ComponentType<any>; LoadingButton: React.ComponentType<any> } }) => {\n const { SendButton, LoadingButton } = info.components;\n return (\n <Flex justify=\"space-between\">\n <div>\n {/* 清空按钮 */}\n {clearBtnShow && (\n <Popover\n content={clearConfirmContent}\n title=\"确认清空对话\"\n trigger=\"click\"\n open={clearPopoverVisible}\n onOpenChange={setClearPopoverVisible}\n >\n <div\n className={styles.clearBtn}\n onClick={handleClear}\n >\n <ClearOutlined className={styles.text(12)} />\n </div>\n </Popover>\n )}\n </div>\n <Space size=\"small\" style={{ display: 'flex', alignItems: 'center'}}>\n {enableUpload && (\n <>\n {uploadButton}\n <div className={styles.divider} />\n </>\n )}\n {loading\n ? (\n <LoadingButton onClick={() => onStop?.()} className={styles.stopButton} />\n )\n : (\n <SendButton\n className={styles.sendButton}\n type=\"primary\"\n icon={<ArrowUpOutlined className={styles.text(20)} />}\n disabled={disabled}\n />\n )}\n </Space>\n </Flex>\n );\n }}\n onChange={(v: string) => {\n onChange?.(v);\n }}\n onSubmit={handleSend}\n onCancel={() => {\n onStop?.();\n }}\n />\n </div>\n </div>\n { footerTips && <div className={styles.footerTips}>{footerTips}</div>}\n </>\n );\n};\n\nexport default XAiSender;\n"],
5
+ "mappings": "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",
6
6
  "names": ["clsx"]
7
7
  }
@@ -2,9 +2,14 @@
2
2
  import { DebugOptions, FunctionCall, SendContent, SessionData, Event, IMessage, Part } from "../types";
3
3
  import { type ChatConfig } from "../services/api";
4
4
  declare function useADKChat({ url, token, config, type: _type, enabled, // ← 新增: 是否启用 Hook
5
- strategies, onError, onMessage, onSuccess, onStream, }: DebugOptions): {
5
+ strategies, onError, onMessage, onSuccess, onStream, onInterrupt, }: DebugOptions): {
6
6
  appInfo: ChatConfig | null;
7
7
  startChat: ({ text, files, functionResponse, }: SendContent) => Promise<void>;
8
+ queueChat: (content: SendContent, preview?: string) => void;
9
+ queuedMessages: import("./useADKMessageQueue").ADKQueuedMessage<SendContent>[];
10
+ removeQueuedMessage: (id: string) => void;
11
+ sendQueuedMessageNow: (id: string) => Promise<void>;
12
+ queueInterrupting: boolean;
8
13
  reChat: () => Promise<void>;
9
14
  stopChat: () => void;
10
15
  clearChat: () => void;
@@ -30,6 +30,7 @@ var import_constants = require("../constants");
30
30
  var import_types = require("../types");
31
31
  var import_api = require("../services/api");
32
32
  var import_utils = require("../utils");
33
+ var import_useADKMessageQueue = require("./useADKMessageQueue");
33
34
  var combineTextParts = (parts) => {
34
35
  const result = [];
35
36
  let combinedTextPart;
@@ -330,7 +331,8 @@ function useADKChat({
330
331
  onError,
331
332
  onMessage,
332
333
  onSuccess,
333
- onStream
334
+ onStream,
335
+ onInterrupt
334
336
  }) {
335
337
  var _a, _b;
336
338
  const [loading, setLoadingState] = (0, import_react.useState)(false);
@@ -958,6 +960,13 @@ function useADKChat({
958
960
  setLoading(false);
959
961
  textMsgRef.current = null;
960
962
  }, [setLoading]);
963
+ const messageQueue = (0, import_useADKMessageQueue.useADKMessageQueue)({
964
+ sessionId: currentSessionId,
965
+ loading,
966
+ send: startChat,
967
+ stop: stopChat,
968
+ interrupt: onInterrupt
969
+ });
961
970
  const clearChat = () => {
962
971
  var _a2, _b2;
963
972
  const newSessionId = (0, import_uuid.v4)();
@@ -1006,6 +1015,8 @@ function useADKChat({
1006
1015
  }
1007
1016
  const bg = backgroundRef.current.get(sessionId);
1008
1017
  if (bg) {
1018
+ setPrologue("");
1019
+ setSuggestedQuestions([]);
1009
1020
  setMessages(bg.messages);
1010
1021
  messagesRef.current = bg.messages;
1011
1022
  textMsgRef.current = bg.textMsgRef;
@@ -1019,6 +1030,8 @@ function useADKChat({
1019
1030
  }
1020
1031
  setInitialized(false);
1021
1032
  setCurrentSessionId(sessionId);
1033
+ setPrologue("");
1034
+ setSuggestedQuestions([]);
1022
1035
  sessionDetailLoadingRef.current = true;
1023
1036
  try {
1024
1037
  const { data, result } = await (0, import_api.fetchSessionDetail)({
@@ -1087,8 +1100,9 @@ function useADKChat({
1087
1100
  if (showFirstSession) {
1088
1101
  setCurrentSession(sessionId);
1089
1102
  } else {
1090
- fetchDetail && setPrologue(((_a2 = appInfo == null ? void 0 : appInfo.onboardingInfo) == null ? void 0 : _a2.prologue) || "");
1091
- fetchDetail && setSuggestedQuestions(
1103
+ const canRestoreOnboarding = fetchDetail && !sessionDetailLoadingRef.current && messagesRef.current.length === 0;
1104
+ canRestoreOnboarding && setPrologue(((_a2 = appInfo == null ? void 0 : appInfo.onboardingInfo) == null ? void 0 : _a2.prologue) || "");
1105
+ canRestoreOnboarding && setSuggestedQuestions(
1092
1106
  ((_b2 = appInfo == null ? void 0 : appInfo.onboardingInfo) == null ? void 0 : _b2.suggested_questions) || []
1093
1107
  );
1094
1108
  }
@@ -1270,6 +1284,11 @@ function useADKChat({
1270
1284
  return {
1271
1285
  appInfo,
1272
1286
  startChat,
1287
+ queueChat: (content, preview = content.text || "") => messageQueue.sendOrQueue(content, preview),
1288
+ queuedMessages: messageQueue.queuedMessages,
1289
+ removeQueuedMessage: messageQueue.removeQueuedMessage,
1290
+ sendQueuedMessageNow: messageQueue.sendQueuedMessageNow,
1291
+ queueInterrupting: messageQueue.interrupting,
1273
1292
  reChat,
1274
1293
  stopChat,
1275
1294
  clearChat,