@ai-group/chat-sdk 3.7.5 → 3.8.0-alpha.2
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/README.md +36 -0
- package/dist/cjs/components/DislikeFeedback.js.map +2 -2
- package/dist/cjs/components/FileGallery/index.js +2 -1
- package/dist/cjs/components/FileGallery/index.js.map +3 -3
- package/dist/cjs/components/FolderTree/DirectoryTree.js.map +2 -2
- package/dist/cjs/components/Sources/components/CarouselCard.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/index.js +307 -59
- package/dist/cjs/components/XAdkChatbot/index.js.map +3 -3
- package/dist/cjs/components/XAdkChatbot/styles.d.ts +4 -0
- package/dist/cjs/components/XAdkChatbot/styles.js +59 -2
- package/dist/cjs/components/XAdkChatbot/styles.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/utils.d.ts +14 -0
- package/dist/cjs/components/XAdkChatbot/utils.js +79 -0
- package/dist/cjs/components/XAdkChatbot/utils.js.map +7 -0
- package/dist/cjs/components/XAdkProvider/compound/DislikeFeedBack.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/compound/Messages.d.ts +7 -1
- package/dist/cjs/components/XAdkProvider/compound/Messages.js +12 -0
- package/dist/cjs/components/XAdkProvider/compound/Messages.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/compound/Sidebar.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/context/ChatStateContext.d.ts +2 -0
- package/dist/cjs/components/XAdkProvider/context/ChatStateContext.js.map +2 -2
- package/dist/cjs/components/XAdkProvider/index.js +3 -0
- package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
- package/dist/cjs/components/XAdkSender/InputTags.js.map +2 -2
- package/dist/cjs/components/XAdkSender/index.js +53 -5
- package/dist/cjs/components/XAdkSender/index.js.map +3 -3
- package/dist/cjs/components/XAdkThoughtChain/index.js +27 -28
- package/dist/cjs/components/XAdkThoughtChain/index.js.map +2 -2
- package/dist/cjs/components/XAdkThoughtChain/styles.d.ts +3 -1
- package/dist/cjs/components/XAdkThoughtChain/styles.js +66 -39
- package/dist/cjs/components/XAdkThoughtChain/styles.js.map +2 -2
- package/dist/cjs/components/XAiChatbot/index.js.map +2 -2
- package/dist/cjs/components/XAiConversations/index.js +2 -1
- package/dist/cjs/components/XAiConversations/index.js.map +3 -3
- package/dist/cjs/components/XAiProvider/index.js.map +2 -2
- package/dist/cjs/components/XAiSender/index.js.map +2 -2
- package/dist/cjs/hooks/useADKChat.d.ts +6 -1
- package/dist/cjs/hooks/useADKChat.js +15 -1
- package/dist/cjs/hooks/useADKChat.js.map +2 -2
- package/dist/cjs/hooks/useADKMessageQueue.d.ts +24 -0
- package/dist/cjs/hooks/useADKMessageQueue.js +107 -0
- package/dist/cjs/hooks/useADKMessageQueue.js.map +7 -0
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +3 -0
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/react/index.d.ts +2 -0
- package/dist/cjs/react/index.js +3 -0
- package/dist/cjs/react/index.js.map +2 -2
- package/dist/cjs/types/XAdkChatbot.d.ts +49 -0
- package/dist/cjs/types/XAdkChatbot.js.map +1 -1
- package/dist/cjs/types/XAdkProvider.d.ts +7 -0
- package/dist/cjs/types/XAdkProvider.js.map +2 -2
- package/dist/cjs/types/XAdkSender.d.ts +8 -1
- package/dist/cjs/types/XAdkSender.js.map +1 -1
- package/dist/cjs/types/XAdkThoughtChain.d.ts +2 -0
- package/dist/cjs/types/XAdkThoughtChain.js.map +1 -1
- package/dist/cjs/types/antdx.d.ts +6 -3
- package/dist/cjs/types/antdx.js.map +1 -1
- package/dist/esm/components/DislikeFeedback.js.map +1 -1
- package/dist/esm/components/FileGallery/index.js +2 -1
- package/dist/esm/components/FileGallery/index.js.map +1 -1
- package/dist/esm/components/FolderTree/DirectoryTree.js.map +1 -1
- package/dist/esm/components/Sources/components/CarouselCard.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/index.js +277 -25
- package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/styles.d.ts +4 -0
- package/dist/esm/components/XAdkChatbot/styles.js +30 -26
- package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/utils.d.ts +14 -0
- package/dist/esm/components/XAdkChatbot/utils.js +66 -0
- package/dist/esm/components/XAdkChatbot/utils.js.map +1 -0
- package/dist/esm/components/XAdkProvider/compound/DislikeFeedBack.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/Messages.d.ts +7 -1
- package/dist/esm/components/XAdkProvider/compound/Messages.js +16 -2
- package/dist/esm/components/XAdkProvider/compound/Messages.js.map +1 -1
- package/dist/esm/components/XAdkProvider/compound/Sidebar.js.map +1 -1
- package/dist/esm/components/XAdkProvider/context/ChatStateContext.d.ts +2 -0
- package/dist/esm/components/XAdkProvider/context/ChatStateContext.js.map +1 -1
- package/dist/esm/components/XAdkProvider/index.js +4 -2
- package/dist/esm/components/XAdkProvider/index.js.map +1 -1
- package/dist/esm/components/XAdkSender/InputTags.js.map +1 -1
- package/dist/esm/components/XAdkSender/index.js +80 -16
- package/dist/esm/components/XAdkSender/index.js.map +1 -1
- package/dist/esm/components/XAdkThoughtChain/index.js +52 -78
- package/dist/esm/components/XAdkThoughtChain/index.js.map +1 -1
- package/dist/esm/components/XAdkThoughtChain/styles.d.ts +3 -1
- package/dist/esm/components/XAdkThoughtChain/styles.js +29 -27
- package/dist/esm/components/XAdkThoughtChain/styles.js.map +1 -1
- package/dist/esm/components/XAiChatbot/index.js.map +1 -1
- package/dist/esm/components/XAiConversations/index.js +2 -1
- package/dist/esm/components/XAiConversations/index.js.map +1 -1
- package/dist/esm/components/XAiProvider/index.js.map +1 -1
- package/dist/esm/components/XAiSender/index.js.map +1 -1
- package/dist/esm/hooks/useADKChat.d.ts +6 -1
- package/dist/esm/hooks/useADKChat.js +18 -1
- package/dist/esm/hooks/useADKChat.js.map +1 -1
- package/dist/esm/hooks/useADKMessageQueue.d.ts +24 -0
- package/dist/esm/hooks/useADKMessageQueue.js +159 -0
- package/dist/esm/hooks/useADKMessageQueue.js.map +1 -0
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react/index.d.ts +2 -0
- package/dist/esm/react/index.js +1 -0
- package/dist/esm/react/index.js.map +1 -1
- package/dist/esm/types/XAdkChatbot.d.ts +49 -0
- package/dist/esm/types/XAdkChatbot.js.map +1 -1
- package/dist/esm/types/XAdkProvider.d.ts +7 -0
- package/dist/esm/types/XAdkProvider.js.map +1 -1
- package/dist/esm/types/XAdkSender.d.ts +8 -1
- package/dist/esm/types/XAdkSender.js.map +1 -1
- package/dist/esm/types/XAdkThoughtChain.d.ts +2 -0
- package/dist/esm/types/XAdkThoughtChain.js.map +1 -1
- package/dist/esm/types/antdx.d.ts +6 -3
- package/dist/esm/types/antdx.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/components/XAdkProvider/compound/Messages.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { useCallback } from \"react\";\nimport { message, Tooltip, Flex } from \"antd\";\nimport {\n LikeFilled,\n LikeOutlined,\n ReloadOutlined,\n CopyOutlined,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport XAdkChatbot from \"../../XAdkChatbot\";\nimport DislikeFeedback from \"./DislikeFeedBack\";\nimport { useChatState } from \"../context/ChatStateContext\";\nimport { useChatActions } from \"../context/ChatActionContext\";\nimport type { ActionExtraProps, ActionProps } from \"@/types\";\nimport type { ChatStrategies } from \"@/types\";\n\nexport interface XAdkMessagesProps {\n /** 自定义操作栏渲染 */\n actions?: ActionProps;\n /** 追加在操作栏之后的内容 */\n actionsExtra?: ActionExtraProps;\n /** 类名 */\n className?: string;\n /** 样式 */\n style?: React.CSSProperties;\n /** 是否显示函数调用详情 */\n showFnCallDetail?: boolean;\n /** 自定义工具调用渲染函数,返回 null 则降级使用默认渲染 */\n renderFunctionCall?: (msg: import(\"@/types\").IMessage) => React.ReactNode | null;\n /** 局部策略覆盖,优先级高于 Provider preset/strategies */\n strategies?: ChatStrategies;\n}\n\n/**\n * Messages - XAdkProvider 的消息展示组件\n *\n * 使用 XAdkChatbot 渲染消息列表\n */\nconst Messages: React.FC<XAdkMessagesProps> = ({\n actions,\n actionsExtra,\n className,\n style,\n showFnCallDetail,\n renderFunctionCall,\n strategies: strategiesProp,\n}) => {\n const {\n messages,\n loading,\n prologue,\n suggestions,\n initialized,\n showFeedback,\n appInfo,\n onFileClick,\n strategies,\n } = useChatState();\n const { suggestChat, reChat, likeMessage, confirmFnCall } = useChatActions();\n\n const primaryColor = appInfo?.appTheme || \"#1677ff\";\n\n const defaultActions = useCallback<ActionProps>(\n ({ message: group, isLastBotMsg }) => {\n // 取该组最后一条 bot 消息的 invocationId 和 isLike 状态\n const lastMsg = group.msgs[group.msgs.length - 1];\n const invocationId = lastMsg?.invocationId;\n const isLikeVal = group.isLike ?? 0;\n\n const fullText = group.msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n return (\n <Flex\n gap={16}\n align=\"center\"\n style={{ padding: \"4px 0\", color: \"#81858c\" }}\n >\n {isLastBotMsg && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined style={{ cursor: \"pointer\" }} onClick={reChat} />\n </Tooltip>\n )}\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n style={{ cursor: \"pointer\" }}\n onClick={() => {\n copy(fullText);\n message.success(\"复制成功\");\n }}\n />\n </Tooltip>\n {showFeedback && invocationId && (\n <>\n <Tooltip title=\"赞\">\n {isLikeVal === 1 ? (\n <LikeFilled\n style={{ color: primaryColor, cursor: \"pointer\" }}\n />\n ) : (\n <LikeOutlined\n style={{ cursor: \"pointer\" }}\n onClick={async () => {\n if (isLikeVal !== 0) {\n message.warning(\"已收到您的反馈,无需重复提交\");\n return;\n }\n const ok = await likeMessage(invocationId, 1);\n if (ok) message.success(\"感谢您的反馈\");\n else message.error(\"反馈失败,请稍后再试\");\n }}\n />\n )}\n </Tooltip>\n <DislikeFeedback\n msg={group}\n activeColor={primaryColor}\n onSubmit={async (formData) => {\n const ok = await likeMessage(invocationId, -1, formData);\n if (ok) message.success(\"已收到您的反馈,我们会努力做得更好\");\n else message.error(\"反馈失败,请稍后再试\");\n return ok;\n }}\n />\n </>\n )}\n </Flex>\n );\n },\n [reChat, likeMessage, showFeedback, primaryColor],\n );\n\n return (\n <XAdkChatbot\n messages={messages}\n loading={loading}\n prologue={prologue}\n suggestions={suggestions}\n onSuggest={suggestChat}\n onConfirm={confirmFnCall}\n // 操作栏:使用外部传入的 actions,否则用内置默认 actions\n actions={actions ?? defaultActions}\n actionsExtra={actionsExtra}\n // 启用分组和解析\n enableGrouping={true}\n enableProcessParsing={true}\n initialized={initialized}\n showFnCallDetail={showFnCallDetail}\n // 文件点击回调\n onFileClick={onFileClick}\n // 样式\n className={className}\n style={style}\n // 自定义工具调用渲染\n renderFunctionCall={renderFunctionCall}\n strategies={{ ...strategies, ...strategiesProp }}\n />\n );\n};\n\nexport default Messages;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAmC;AACnC,kBAAuC;AACvC,mBAKO;AACP,+BAAiB;AACjB,yBAAwB;AACxB,6BAA4B;AAC5B,8BAA6B;AAC7B,+BAA+B;
|
|
4
|
+
"sourcesContent": ["import React, { useCallback } from \"react\";\nimport { message, Tooltip, Flex } from \"antd\";\nimport {\n LikeFilled,\n LikeOutlined,\n ReloadOutlined,\n CopyOutlined,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport XAdkChatbot from \"../../XAdkChatbot\";\nimport DislikeFeedback from \"./DislikeFeedBack\";\nimport { useChatState } from \"../context/ChatStateContext\";\nimport { useChatActions } from \"../context/ChatActionContext\";\nimport type { ActionExtraProps, ActionProps, XAdkChatbotProps } from \"@/types\";\nimport type { ChatStrategies } from \"@/types\";\n\nexport interface XAdkMessagesProps {\n /** 自定义操作栏渲染 */\n actions?: ActionProps;\n /** 追加在操作栏之后的内容 */\n actionsExtra?: ActionExtraProps;\n /** 消息流中的业务模块与整组自定义展示。 */\n renderBeforeGroup?: XAdkChatbotProps[\"renderBeforeGroup\"];\n renderAfterGroup?: XAdkChatbotProps[\"renderAfterGroup\"];\n renderGroup?: XAdkChatbotProps[\"renderGroup\"];\n /** 受控历史消息分页;可通过 useChatActions().setMessages 合并新页。 */\n history?: XAdkChatbotProps[\"history\"];\n /** 类名 */\n className?: string;\n /** 样式 */\n style?: React.CSSProperties;\n /** 是否显示函数调用详情 */\n showFnCallDetail?: boolean;\n /** 自定义工具调用渲染函数,返回 null 则降级使用默认渲染 */\n renderFunctionCall?: (msg: import(\"@/types\").IMessage) => React.ReactNode | null;\n /** 局部策略覆盖,优先级高于 Provider preset/strategies */\n strategies?: ChatStrategies;\n}\n\n/**\n * Messages - XAdkProvider 的消息展示组件\n *\n * 使用 XAdkChatbot 渲染消息列表\n */\nconst Messages: React.FC<XAdkMessagesProps> = ({\n actions,\n actionsExtra,\n renderBeforeGroup,\n renderAfterGroup,\n renderGroup,\n history,\n className,\n style,\n showFnCallDetail,\n renderFunctionCall,\n strategies: strategiesProp,\n}) => {\n const {\n messages,\n loading,\n prologue,\n suggestions,\n initialized,\n currentSessionId,\n showFeedback,\n showUserActions,\n appInfo,\n onFileClick,\n strategies,\n } = useChatState();\n const { suggestChat, reChat, likeMessage, confirmFnCall } = useChatActions();\n\n const primaryColor = appInfo?.appTheme || \"#1677ff\";\n\n const defaultActions = useCallback<ActionProps>(\n ({ message: group, isLastBotMsg }) => {\n // 取该组最后一条 bot 消息的 invocationId 和 isLike 状态\n const lastMsg = group.msgs[group.msgs.length - 1];\n const invocationId = lastMsg?.invocationId;\n const isLikeVal = group.isLike ?? 0;\n\n const fullText = group.msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n return (\n <Flex\n gap={16}\n align=\"center\"\n style={{ padding: \"4px 0\", color: \"#81858c\" }}\n >\n {isLastBotMsg && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined style={{ cursor: \"pointer\" }} onClick={reChat} />\n </Tooltip>\n )}\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n style={{ cursor: \"pointer\" }}\n onClick={() => {\n copy(fullText);\n message.success(\"复制成功\");\n }}\n />\n </Tooltip>\n {showFeedback && invocationId && (\n <>\n <Tooltip title=\"赞\">\n {isLikeVal === 1 ? (\n <LikeFilled\n style={{ color: primaryColor, cursor: \"pointer\" }}\n />\n ) : (\n <LikeOutlined\n style={{ cursor: \"pointer\" }}\n onClick={async () => {\n if (isLikeVal !== 0) {\n message.warning(\"已收到您的反馈,无需重复提交\");\n return;\n }\n const ok = await likeMessage(invocationId, 1);\n if (ok) message.success(\"感谢您的反馈\");\n else message.error(\"反馈失败,请稍后再试\");\n }}\n />\n )}\n </Tooltip>\n <DislikeFeedback\n msg={group}\n activeColor={primaryColor}\n onSubmit={async (formData) => {\n const ok = await likeMessage(invocationId, -1, formData);\n if (ok) message.success(\"已收到您的反馈,我们会努力做得更好\");\n else message.error(\"反馈失败,请稍后再试\");\n return ok;\n }}\n />\n </>\n )}\n </Flex>\n );\n },\n [reChat, likeMessage, showFeedback, primaryColor],\n );\n\n return (\n <XAdkChatbot\n messages={messages}\n loading={loading}\n prologue={prologue}\n suggestions={suggestions}\n onSuggest={suggestChat}\n onConfirm={confirmFnCall}\n // 操作栏:使用外部传入的 actions,否则用内置默认 actions\n actions={actions ?? defaultActions}\n actionsExtra={actionsExtra}\n renderBeforeGroup={renderBeforeGroup}\n renderAfterGroup={renderAfterGroup}\n renderGroup={renderGroup}\n history={history}\n sessionId={currentSessionId}\n // 启用分组和解析\n enableGrouping={true}\n enableProcessParsing={true}\n initialized={initialized}\n showFnCallDetail={showFnCallDetail}\n // 文件点击回调\n onFileClick={onFileClick}\n // 样式\n className={className}\n style={style}\n // 自定义工具调用渲染\n renderFunctionCall={renderFunctionCall}\n // 用户消息 hover 操作栏\n showUserActions={showUserActions}\n strategies={{ ...strategies, ...strategiesProp }}\n />\n );\n};\n\nexport default Messages;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["copy", "DislikeFeedback", "XAdkChatbot"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/components/XAdkProvider/compound/Sidebar.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { useCallback } from 'react';\nimport { message, Modal, Input } from 'antd';\nimport { ExclamationCircleFilled } from '@ant-design/icons';\nimport type { ConversationsProps } from '@/types/antdx';\nimport XAiConversations from '@/components/XAiConversations';\nimport { useChatState } from '../context/ChatStateContext';\nimport { useChatActions } from '../context/ChatActionContext';\nimport { useSession } from '../context/SessionContext';\nimport { useChatSenderState } from '../context/ChatSenderStateContext';\n\nconst { confirm } = Modal;\n\n/**\n * XAdkProvider.Sidebar - 会话列表侧边栏组件\n *\n * 从 Context 获取会话数据并提供会话管理界面\n * 基于 XAiConversations 组件实现(带展开/收起功能)\n *\n * @example\n * ```tsx\n * <XAdkProvider url=\"...\" token=\"...\">\n * <XAdkProvider.Sidebar isNarrow={false} />\n * </XAdkProvider>\n * ```\n */\nexport interface XAdkSidebarProps {\n /** 额外的样式 */\n style?: React.CSSProperties;\n /** 额外的类名 */\n className?: string;\n /** 是否为窄屏模式 */\n isNarrow?: boolean;\n}\n\nconst Sidebar: React.FC<XAdkSidebarProps> = ({\n isNarrow = false,\n style,\n className,\n}) => {\n const { currentSessionId } = useChatState();\n const { clearChat } = useChatActions();\n const { sessionList, deleteSession, updateSession, setCurrentSession } = useSession();\n const { setSenderValue } = useChatSenderState();\n\n // 切换会话\n const handleActiveChange = useCallback((key: string) => {\n setCurrentSession(key);\n setSenderValue('');\n }, [setCurrentSession, setSenderValue]);\n\n // 新建对话\n const handleNewChat = useCallback(() => {\n clearChat();\n setSenderValue('');\n }, [clearChat, setSenderValue]);\n\n // 默认会话菜单配置\n const defaultMenuConfig: ConversationsProps['menu'] = useCallback((conversation: any) => ({\n items: [\n {\n label: '重命名',\n key: 'edit',\n },\n {\n label: '删除',\n key: 'delete',\n danger: true,\n },\n ],\n onClick: (menuInfo: any) => {\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: {\n background: '#000',\n borderColor: '#000',\n color: '#fff',\n },\n },\n onOk: () => {\n if (!inputValue.trim()) {\n message.error('对话名称不能为空');\n return Promise.reject();\n }\n updateSession(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: {\n background: '#ff4d4f',\n borderColor: '#ff4d4f',\n color: '#fff',\n },\n },\n onOk() {\n deleteSession(conversation.key);\n },\n onCancel() {\n //\n },\n });\n break;\n }\n },\n }), [deleteSession, updateSession]);\n\n return (\n <XAiConversations\n isNarrow={isNarrow}\n sessionList={sessionList}\n activeKey={currentSessionId}\n onActiveChange={handleActiveChange}\n onNewChat={handleNewChat}\n menu={defaultMenuConfig}\n style={style}\n />\n );\n};\n\nSidebar.displayName = 'XAdkProvider.Sidebar';\n\nexport default Sidebar;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAmC;AACnC,kBAAsC;AACtC,mBAAwC;AAExC,8BAA6B;AAC7B,8BAA6B;AAC7B,+BAA+B;AAC/B,4BAA2B;AAC3B,oCAAmC;AAuErB;AArEd,IAAM,EAAE,QAAQ,IAAI;AAwBpB,IAAM,UAAsC,CAAC;AAAA,EAC3C,WAAW;AAAA,EACX;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,iBAAiB,QAAI,sCAAa;AAC1C,QAAM,EAAE,UAAU,QAAI,yCAAe;AACrC,QAAM,EAAE,aAAa,eAAe,eAAe,kBAAkB,QAAI,kCAAW;AACpF,QAAM,EAAE,eAAe,QAAI,kDAAmB;AAG9C,QAAM,yBAAqB,0BAAY,CAAC,QAAgB;AACtD,sBAAkB,GAAG;AACrB,mBAAe,EAAE;AAAA,EACnB,GAAG,CAAC,mBAAmB,cAAc,CAAC;AAGtC,QAAM,oBAAgB,0BAAY,MAAM;AACtC,cAAU;AACV,mBAAe,EAAE;AAAA,EACnB,GAAG,CAAC,WAAW,cAAc,CAAC;AAG9B,QAAM,wBAAgD,0BAAY,CAAC,kBAAuB;AAAA,IACxF,OAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,MACP;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,SAAS,CAAC,aAAkB;AAC1B,eAAS,SAAS,gBAAgB;AAClC,YAAM,EAAE,IAAI,IAAI;AAChB,cAAQ,KAAK;AAAA,QACX,KAAK,QAAQ;AACX,cAAI,aAAc,aAAa,SAAoB;AACnD,kBAAQ;AAAA,YACN,OAAO;AAAA,YACP,MAAM;AAAA,YACN,SACE;AAAA,cAAC;AAAA;AAAA,gBACC,cAAc;AAAA,gBACd,WAAS;AAAA,gBACT,OAAO,EAAE,OAAO,OAAO;AAAA,gBACvB,UAAU,CAAC,
|
|
4
|
+
"sourcesContent": ["import React, { useCallback } from 'react';\nimport { message, Modal, Input } from 'antd';\nimport { ExclamationCircleFilled } from '@ant-design/icons';\nimport type { ConversationsProps } from '@/types/antdx';\nimport XAiConversations from '@/components/XAiConversations';\nimport { useChatState } from '../context/ChatStateContext';\nimport { useChatActions } from '../context/ChatActionContext';\nimport { useSession } from '../context/SessionContext';\nimport { useChatSenderState } from '../context/ChatSenderStateContext';\n\nconst { confirm } = Modal;\n\n/**\n * XAdkProvider.Sidebar - 会话列表侧边栏组件\n *\n * 从 Context 获取会话数据并提供会话管理界面\n * 基于 XAiConversations 组件实现(带展开/收起功能)\n *\n * @example\n * ```tsx\n * <XAdkProvider url=\"...\" token=\"...\">\n * <XAdkProvider.Sidebar isNarrow={false} />\n * </XAdkProvider>\n * ```\n */\nexport interface XAdkSidebarProps {\n /** 额外的样式 */\n style?: React.CSSProperties;\n /** 额外的类名 */\n className?: string;\n /** 是否为窄屏模式 */\n isNarrow?: boolean;\n}\n\nconst Sidebar: React.FC<XAdkSidebarProps> = ({\n isNarrow = false,\n style,\n className,\n}) => {\n const { currentSessionId } = useChatState();\n const { clearChat } = useChatActions();\n const { sessionList, deleteSession, updateSession, setCurrentSession } = useSession();\n const { setSenderValue } = useChatSenderState();\n\n // 切换会话\n const handleActiveChange = useCallback((key: string) => {\n setCurrentSession(key);\n setSenderValue('');\n }, [setCurrentSession, setSenderValue]);\n\n // 新建对话\n const handleNewChat = useCallback(() => {\n clearChat();\n setSenderValue('');\n }, [clearChat, setSenderValue]);\n\n // 默认会话菜单配置\n const defaultMenuConfig: ConversationsProps['menu'] = useCallback((conversation: any) => ({\n items: [\n {\n label: '重命名',\n key: 'edit',\n },\n {\n label: '删除',\n key: 'delete',\n danger: true,\n },\n ],\n onClick: (menuInfo: any) => {\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: {\n background: '#000',\n borderColor: '#000',\n color: '#fff',\n },\n },\n onOk: () => {\n if (!inputValue.trim()) {\n message.error('对话名称不能为空');\n return Promise.reject();\n }\n updateSession(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: {\n background: '#ff4d4f',\n borderColor: '#ff4d4f',\n color: '#fff',\n },\n },\n onOk() {\n deleteSession(conversation.key);\n },\n onCancel() {\n //\n },\n });\n break;\n }\n },\n }), [deleteSession, updateSession]);\n\n return (\n <XAiConversations\n isNarrow={isNarrow}\n sessionList={sessionList}\n activeKey={currentSessionId}\n onActiveChange={handleActiveChange}\n onNewChat={handleNewChat}\n menu={defaultMenuConfig}\n style={style}\n />\n );\n};\n\nSidebar.displayName = 'XAdkProvider.Sidebar';\n\nexport default Sidebar;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["XAiConversations"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/components/XAdkProvider/context/ChatStateContext.tsx"],
|
|
4
|
-
"sourcesContent": ["import { createContext, useContext } from \"react\";\nimport type { IMessage, FileItem, UploadRequestFn, ChatStrategies } from \"@/types\";\nimport type { ChatConfig } from \"@/services/api\";\n\n/**\n * 聊天状态 Context\n * 只包含状态数据,不包含操作方法\n * 这样可以避免不必要的 rerender\n */\nexport interface ChatStateContextType {\n /** 请求地址 */\n url: string;\n /** 会话令牌 */\n token: string;\n /** 消息列表 */\n messages: IMessage[];\n /** 加载状态 */\n loading: boolean;\n /** 当前会话 ID */\n currentSessionId: string;\n /** 开场白 */\n prologue: string;\n /** 建议问题列表 */\n suggestions: string[];\n /** 应用配置信息 */\n appInfo: ChatConfig | null;\n /** 是否已初始化 */\n initialized: boolean;\n /** 是否展示点赞/点踩 */\n showFeedback: boolean;\n /** 点击附件回调 */\n onFileClick?: (file: FileItem) => void;\n // 确认工具执行回调 */\n onConfirm?: () => void;\n /** 自定义上传函数 */\n uploadRequest?: UploadRequestFn;\n /** 当前 Provider 生效的聊天策略 */\n strategies: ChatStrategies;\n}\n\nexport const ChatStateContext = createContext<ChatStateContextType | null>(\n null,\n);\n\n/**\n * 使用聊天状态 Hook\n * @returns ChatStateContextType\n * @throws Error 如果在 XAdkProvider 外部使用\n */\nexport const useChatState = () => {\n const context = useContext(ChatStateContext);\n if (!context) {\n throw new Error(\"useChatState must be used within XAdkProvider\");\n }\n return context;\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA0C;
|
|
4
|
+
"sourcesContent": ["import { createContext, useContext } from \"react\";\nimport type { IMessage, FileItem, UploadRequestFn, ChatStrategies } from \"@/types\";\nimport type { ChatConfig } from \"@/services/api\";\n\n/**\n * 聊天状态 Context\n * 只包含状态数据,不包含操作方法\n * 这样可以避免不必要的 rerender\n */\nexport interface ChatStateContextType {\n /** 请求地址 */\n url: string;\n /** 会话令牌 */\n token: string;\n /** 消息列表 */\n messages: IMessage[];\n /** 加载状态 */\n loading: boolean;\n /** 当前会话 ID */\n currentSessionId: string;\n /** 开场白 */\n prologue: string;\n /** 建议问题列表 */\n suggestions: string[];\n /** 应用配置信息 */\n appInfo: ChatConfig | null;\n /** 是否已初始化 */\n initialized: boolean;\n /** 是否展示点赞/点踩 */\n showFeedback: boolean;\n /** 是否启用用户消息 hover 操作栏 */\n showUserActions: boolean;\n /** 点击附件回调 */\n onFileClick?: (file: FileItem) => void;\n // 确认工具执行回调 */\n onConfirm?: () => void;\n /** 自定义上传函数 */\n uploadRequest?: UploadRequestFn;\n /** 当前 Provider 生效的聊天策略 */\n strategies: ChatStrategies;\n}\n\nexport const ChatStateContext = createContext<ChatStateContextType | null>(\n null,\n);\n\n/**\n * 使用聊天状态 Hook\n * @returns ChatStateContextType\n * @throws Error 如果在 XAdkProvider 外部使用\n */\nexport const useChatState = () => {\n const context = useContext(ChatStateContext);\n if (!context) {\n throw new Error(\"useChatState must be used within XAdkProvider\");\n }\n return context;\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA0C;AA0CnC,IAAM,uBAAmB;AAAA,EAC9B;AACF;AAOO,IAAM,eAAe,MAAM;AAChC,QAAM,cAAU,yBAAW,gBAAgB;AAC3C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -112,6 +112,7 @@ var XAdkProviderComponent = (0, import_react.forwardRef)(
|
|
|
112
112
|
}
|
|
113
113
|
} = data;
|
|
114
114
|
const showFeedback = (config == null ? void 0 : config.showFeedback) ?? true;
|
|
115
|
+
const showUserActions = (config == null ? void 0 : config.showUserActions) ?? true;
|
|
115
116
|
const onFileClick = config == null ? void 0 : config.onFileClick;
|
|
116
117
|
const allowUpload = (config == null ? void 0 : config.allowUpload) ?? false;
|
|
117
118
|
const draggable = (config == null ? void 0 : config.draggable) ?? true;
|
|
@@ -169,6 +170,7 @@ var XAdkProviderComponent = (0, import_react.forwardRef)(
|
|
|
169
170
|
url,
|
|
170
171
|
token,
|
|
171
172
|
showFeedback,
|
|
173
|
+
showUserActions,
|
|
172
174
|
onFileClick,
|
|
173
175
|
uploadRequest,
|
|
174
176
|
strategies: mergedStrategies
|
|
@@ -184,6 +186,7 @@ var XAdkProviderComponent = (0, import_react.forwardRef)(
|
|
|
184
186
|
url,
|
|
185
187
|
token,
|
|
186
188
|
showFeedback,
|
|
189
|
+
showUserActions,
|
|
187
190
|
onFileClick,
|
|
188
191
|
uploadRequest,
|
|
189
192
|
mergedStrategies
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/XAdkProvider/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useState,\n} from \"react\";\nimport { ConfigProvider } from \"antd\";\nimport { XProvider } from \"@ant-design/x\";\nimport { ChatStateContext } from \"./context/ChatStateContext\";\nimport { ChatActionContext } from \"./context/ChatActionContext\";\nimport { SessionContext } from \"./context/SessionContext\";\nimport { ChatSenderStateContext } from \"./context/ChatSenderStateContext\";\nimport useADKChat from \"@/hooks/useADKChat\";\nimport { primaryBlue } from \"@/styles/common\";\nimport { cssVarStyle } from \"@/styles/tokens\";\nimport type {\n XAdkProviderProps,\n XAdkProviderHandle,\n XAdkProviderConfig,\n} from \"@/types/XAdkProvider\";\nimport type { ChatHookResult } from \"@/types/ChatHook\";\nimport {\n mergeChatStrategies,\n resolvePresetUploadRequest,\n} from \"@/presets/runtime\";\n\n/**\n * XAdkProvider Props (扩展版)\n *\n * 支持两种使用方式:\n * 1. 标准协议: 提供 url/token/config,使用内置 useADKChat\n * 2. 自定义协议: 提供 chatData,使用自己的 Hook\n */\nexport interface XAdkProviderPropsExtended extends Omit<\n XAdkProviderProps,\n \"url\" | \"token\" | \"config\"\n> {\n /**\n * 选项 A: 使用标准协议 (内置 useADKChat)\n */\n url?: string;\n token: string;\n config?: XAdkProviderConfig;\n\n /**\n * 选项 B: 使用自定义 Hook 数据\n * 如果提供此参数,将忽略 url/token/config\n *\n * @example\n * // GraphQL 协议\n * const chatData = useMyGraphQLChat({ endpoint: '...' });\n * <XAdkProvider chatData={chatData}>\n * <XAdkProvider.DefaultLayout />\n * </XAdkProvider>\n *\n * @example\n * // WebSocket 协议\n * const chatData = useWebSocketChat({ url: 'ws://...' });\n * <XAdkProvider chatData={chatData}>\n * <XAdkProvider.DefaultLayout />\n * </XAdkProvider>\n */\n chatData?: ChatHookResult;\n\n children: React.ReactNode;\n}\n\n/**\n * XAdkProvider - AI 聊天 SDK 核心 Provider\n *\n * 采用 Compound Components 架构:\n * - 只负责数据和状态管理\n * - 不包含 UI 布局\n * - 通过 Context 向子组件提供数据\n * - 支持完全自定义的组件组合\n * - 支持协议解耦,可使用自定义 Hook\n *\n * @example\n * // 基础用法 - 标准协议\n * <XAdkProvider url=\"...\" token=\"...\" config={...}>\n * <XAdkProvider.Chatbot />\n * </XAdkProvider>\n *\n * @example\n * // 自定义协议 - GraphQL\n * function App() {\n * const chatData = useMyGraphQLChat({ endpoint: '...' });\n * return (\n * <XAdkProvider chatData={chatData}>\n * <XAdkProvider.DefaultLayout />\n * </XAdkProvider>\n * );\n * }\n *\n * @example\n * // 自定义布局\n * <XAdkProvider url=\"...\" token=\"...\">\n * <div style={{ display: 'flex' }}>\n * <XAdkProvider.Sidebar />\n * <div>\n * <XAdkProvider.Messages />\n * <XAdkProvider.Sender />\n * </div>\n * </div>\n * </XAdkProvider>\n */\nconst XAdkProviderComponent = forwardRef<\n XAdkProviderHandle,\n XAdkProviderPropsExtended\n>(\n (\n {\n url = window.location.origin,\n token,\n config,\n preset,\n strategies,\n chatData, // 自定义 Hook 数据\n providerId = \"defaultId\",\n onSuccess,\n onError,\n onMessage,\n onStream,\n children,\n },\n ref,\n ) => {\n const mergedStrategies = useMemo(\n () =>\n mergeChatStrategies(preset ?? config?.preset, {\n ...config?.strategies,\n ...strategies,\n }),\n [preset, strategies, config?.preset, config?.strategies],\n );\n\n // 内置 Hook 数据 (仅在没有提供 chatData 时调用)\n const internalData = useADKChat({\n url,\n token: token || \"\",\n config: config || {},\n strategies: mergedStrategies,\n onError,\n onSuccess,\n onMessage,\n onStream,\n // 仅在提供了 url 和 token 时才初始化\n enabled: !chatData && !!url && !!token,\n });\n\n // 使用外部数据或内部数据\n const data = chatData || internalData;\n\n // 解构数据\n const {\n appInfo,\n startChat,\n stopChat,\n reChat,\n clearChat,\n suggestChat,\n confirmFnCall,\n deleteSession,\n updateSession,\n currentSessionId,\n sessionPagination,\n sessionList,\n messages,\n loading,\n prologue,\n suggestions,\n initialized,\n setCurrentSession,\n setMessages,\n likeMessage = async () => false,\n setStateDelta = () => {},\n } = data;\n\n const showFeedback = config?.showFeedback ?? true;\n const onFileClick = config?.onFileClick;\n const allowUpload = config?.allowUpload ?? false;\n const draggable = config?.draggable ?? true;\n const presetUploadRequest = useMemo(\n () =>\n resolvePresetUploadRequest(preset ?? config?.preset, {\n url,\n token,\n appNo: config?.appNo,\n }),\n [preset, config?.preset, url, token, config?.appNo],\n );\n const uploadRequest = config?.uploadRequest ?? presetUploadRequest;\n\n // 暴露 API 给 ref\n useImperativeHandle(\n ref,\n () => ({\n startChat,\n stopChat,\n reChat,\n clearChat,\n suggestChat,\n deleteSession,\n updateSession,\n getAppInfo: () => appInfo,\n getMessages: () => messages,\n getSessions: () => sessionList,\n setMessages,\n setCurrentSession,\n setStateDelta,\n }),\n [\n appInfo,\n messages,\n sessionList,\n startChat,\n stopChat,\n reChat,\n clearChat,\n suggestChat,\n deleteSession,\n updateSession,\n setMessages,\n setCurrentSession,\n setStateDelta,\n ],\n );\n\n // 状态 Context Value - 使用 useMemo 避免不必要的 rerender\n const chatStateValue = useMemo(\n () => ({\n messages,\n loading,\n currentSessionId,\n prologue,\n suggestions,\n appInfo,\n initialized,\n url,\n token,\n showFeedback,\n onFileClick,\n uploadRequest,\n strategies: mergedStrategies,\n }),\n [\n messages,\n loading,\n currentSessionId,\n prologue,\n suggestions,\n appInfo,\n initialized,\n url,\n token,\n showFeedback,\n onFileClick,\n uploadRequest,\n mergedStrategies,\n ],\n );\n\n // 动作 Context Value - 函数引用稳定,不需要每次都创建新对象\n const chatActionValue = useMemo(\n () => ({\n chat: startChat,\n stopChat,\n clearChat,\n reChat,\n suggestChat,\n confirmFnCall,\n setMessages,\n likeMessage,\n setStateDelta,\n }),\n [\n startChat,\n stopChat,\n clearChat,\n reChat,\n suggestChat,\n confirmFnCall,\n setMessages,\n likeMessage,\n setStateDelta,\n ],\n );\n\n // 会话 Context Value\n const sessionValue = useMemo(\n () => ({\n sessionList,\n sessionPagination,\n deleteSession,\n updateSession,\n setCurrentSession,\n }),\n [\n sessionList,\n sessionPagination,\n deleteSession,\n updateSession,\n setCurrentSession,\n ],\n );\n\n // Sender 输入框受控状态\n const [senderValue, setSenderValue] = useState(\"\");\n\n // Sender 专用状态 — 不包含 messages,避免轮询更新消息时导致 Sender 重渲染和焦点丢失\n const senderStateValue = useMemo(\n () => ({\n loading,\n uploadRequest,\n allowUpload,\n draggable,\n senderValue,\n setSenderValue,\n }),\n [loading, uploadRequest, allowUpload, draggable, senderValue],\n );\n\n return (\n <ConfigProvider\n theme={{\n token: {\n colorPrimary: appInfo?.appTheme || primaryBlue,\n },\n }}\n >\n <XProvider>\n <ChatStateContext.Provider value={chatStateValue}>\n <ChatActionContext.Provider value={chatActionValue}>\n <SessionContext.Provider value={sessionValue}>\n <ChatSenderStateContext.Provider value={senderStateValue}>\n <div\n style={\n {\n ...cssVarStyle,\n display: \"flex\",\n height: \"100%\",\n width: \"100%\",\n position: \"relative\",\n } as React.CSSProperties\n }\n >\n {children}\n </div>\n </ChatSenderStateContext.Provider>\n </SessionContext.Provider>\n </ChatActionContext.Provider>\n </ChatStateContext.Provider>\n </XProvider>\n </ConfigProvider>\n );\n },\n);\n\nXAdkProviderComponent.displayName = \"XAdkProvider\";\n\n// 导入 Compound Components\nimport Header from \"./compound/Header\";\nimport Sidebar from \"./compound/Sidebar\";\nimport Messages from \"./compound/Messages\";\nimport Sender from \"./compound/Sender\";\nimport Chatbot from \"./compound/Chatbot\";\nimport Welcome from \"./compound/Welcome\";\nimport DefaultLayout from \"./compound/DefaultLayout\";\n\n// 导出时会挂载 Compound Components\nconst XAdkProvider = XAdkProviderComponent as typeof XAdkProviderComponent & {\n Header: typeof Header;\n Sidebar: typeof Sidebar;\n Messages: typeof Messages;\n Sender: typeof Sender;\n Chatbot: typeof Chatbot;\n Welcome: typeof Welcome;\n DefaultLayout: typeof DefaultLayout;\n};\n\n// 挂载 Compound Components\nXAdkProvider.Header = Header;\nXAdkProvider.Sidebar = Sidebar;\nXAdkProvider.Messages = Messages;\nXAdkProvider.Sender = Sender;\nXAdkProvider.Chatbot = Chatbot;\nXAdkProvider.DefaultLayout = DefaultLayout;\nXAdkProvider.Welcome = Welcome;\n\nexport default XAdkProvider;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKO;AACP,kBAA+B;AAC/B,eAA0B;AAC1B,8BAAiC;AACjC,+BAAkC;AAClC,4BAA+B;AAC/B,oCAAuC;AACvC,wBAAuB;AACvB,oBAA4B;AAC5B,oBAA4B;AAO5B,qBAGO;
|
|
4
|
+
"sourcesContent": ["import React, {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useState,\n} from \"react\";\nimport { ConfigProvider } from \"antd\";\nimport { XProvider } from \"@ant-design/x\";\nimport { ChatStateContext } from \"./context/ChatStateContext\";\nimport { ChatActionContext } from \"./context/ChatActionContext\";\nimport { SessionContext } from \"./context/SessionContext\";\nimport { ChatSenderStateContext } from \"./context/ChatSenderStateContext\";\nimport useADKChat from \"@/hooks/useADKChat\";\nimport { primaryBlue } from \"@/styles/common\";\nimport { cssVarStyle } from \"@/styles/tokens\";\nimport type {\n XAdkProviderProps,\n XAdkProviderHandle,\n XAdkProviderConfig,\n} from \"@/types/XAdkProvider\";\nimport type { ChatHookResult } from \"@/types/ChatHook\";\nimport {\n mergeChatStrategies,\n resolvePresetUploadRequest,\n} from \"@/presets/runtime\";\n\n/**\n * XAdkProvider Props (扩展版)\n *\n * 支持两种使用方式:\n * 1. 标准协议: 提供 url/token/config,使用内置 useADKChat\n * 2. 自定义协议: 提供 chatData,使用自己的 Hook\n */\nexport interface XAdkProviderPropsExtended extends Omit<\n XAdkProviderProps,\n \"url\" | \"token\" | \"config\"\n> {\n /**\n * 选项 A: 使用标准协议 (内置 useADKChat)\n */\n url?: string;\n token: string;\n config?: XAdkProviderConfig;\n\n /**\n * 选项 B: 使用自定义 Hook 数据\n * 如果提供此参数,将忽略 url/token/config\n *\n * @example\n * // GraphQL 协议\n * const chatData = useMyGraphQLChat({ endpoint: '...' });\n * <XAdkProvider chatData={chatData}>\n * <XAdkProvider.DefaultLayout />\n * </XAdkProvider>\n *\n * @example\n * // WebSocket 协议\n * const chatData = useWebSocketChat({ url: 'ws://...' });\n * <XAdkProvider chatData={chatData}>\n * <XAdkProvider.DefaultLayout />\n * </XAdkProvider>\n */\n chatData?: ChatHookResult;\n\n children: React.ReactNode;\n}\n\n/**\n * XAdkProvider - AI 聊天 SDK 核心 Provider\n *\n * 采用 Compound Components 架构:\n * - 只负责数据和状态管理\n * - 不包含 UI 布局\n * - 通过 Context 向子组件提供数据\n * - 支持完全自定义的组件组合\n * - 支持协议解耦,可使用自定义 Hook\n *\n * @example\n * // 基础用法 - 标准协议\n * <XAdkProvider url=\"...\" token=\"...\" config={...}>\n * <XAdkProvider.Chatbot />\n * </XAdkProvider>\n *\n * @example\n * // 自定义协议 - GraphQL\n * function App() {\n * const chatData = useMyGraphQLChat({ endpoint: '...' });\n * return (\n * <XAdkProvider chatData={chatData}>\n * <XAdkProvider.DefaultLayout />\n * </XAdkProvider>\n * );\n * }\n *\n * @example\n * // 自定义布局\n * <XAdkProvider url=\"...\" token=\"...\">\n * <div style={{ display: 'flex' }}>\n * <XAdkProvider.Sidebar />\n * <div>\n * <XAdkProvider.Messages />\n * <XAdkProvider.Sender />\n * </div>\n * </div>\n * </XAdkProvider>\n */\nconst XAdkProviderComponent = forwardRef<\n XAdkProviderHandle,\n XAdkProviderPropsExtended\n>(\n (\n {\n url = window.location.origin,\n token,\n config,\n preset,\n strategies,\n chatData, // 自定义 Hook 数据\n providerId = \"defaultId\",\n onSuccess,\n onError,\n onMessage,\n onStream,\n children,\n },\n ref,\n ) => {\n const mergedStrategies = useMemo(\n () =>\n mergeChatStrategies(preset ?? config?.preset, {\n ...config?.strategies,\n ...strategies,\n }),\n [preset, strategies, config?.preset, config?.strategies],\n );\n\n // 内置 Hook 数据 (仅在没有提供 chatData 时调用)\n const internalData = useADKChat({\n url,\n token: token || \"\",\n config: config || {},\n strategies: mergedStrategies,\n onError,\n onSuccess,\n onMessage,\n onStream,\n // 仅在提供了 url 和 token 时才初始化\n enabled: !chatData && !!url && !!token,\n });\n\n // 使用外部数据或内部数据\n const data = chatData || internalData;\n\n // 解构数据\n const {\n appInfo,\n startChat,\n stopChat,\n reChat,\n clearChat,\n suggestChat,\n confirmFnCall,\n deleteSession,\n updateSession,\n currentSessionId,\n sessionPagination,\n sessionList,\n messages,\n loading,\n prologue,\n suggestions,\n initialized,\n setCurrentSession,\n setMessages,\n likeMessage = async () => false,\n setStateDelta = () => {},\n } = data;\n\n const showFeedback = config?.showFeedback ?? true;\n const showUserActions = config?.showUserActions ?? true;\n const onFileClick = config?.onFileClick;\n const allowUpload = config?.allowUpload ?? false;\n const draggable = config?.draggable ?? true;\n const presetUploadRequest = useMemo(\n () =>\n resolvePresetUploadRequest(preset ?? config?.preset, {\n url,\n token,\n appNo: config?.appNo,\n }),\n [preset, config?.preset, url, token, config?.appNo],\n );\n const uploadRequest = config?.uploadRequest ?? presetUploadRequest;\n\n // 暴露 API 给 ref\n useImperativeHandle(\n ref,\n () => ({\n startChat,\n stopChat,\n reChat,\n clearChat,\n suggestChat,\n deleteSession,\n updateSession,\n getAppInfo: () => appInfo,\n getMessages: () => messages,\n getSessions: () => sessionList,\n setMessages,\n setCurrentSession,\n setStateDelta,\n }),\n [\n appInfo,\n messages,\n sessionList,\n startChat,\n stopChat,\n reChat,\n clearChat,\n suggestChat,\n deleteSession,\n updateSession,\n setMessages,\n setCurrentSession,\n setStateDelta,\n ],\n );\n\n // 状态 Context Value - 使用 useMemo 避免不必要的 rerender\n const chatStateValue = useMemo(\n () => ({\n messages,\n loading,\n currentSessionId,\n prologue,\n suggestions,\n appInfo,\n initialized,\n url,\n token,\n showFeedback,\n showUserActions,\n onFileClick,\n uploadRequest,\n strategies: mergedStrategies,\n }),\n [\n messages,\n loading,\n currentSessionId,\n prologue,\n suggestions,\n appInfo,\n initialized,\n url,\n token,\n showFeedback,\n showUserActions,\n onFileClick,\n uploadRequest,\n mergedStrategies,\n ],\n );\n\n // 动作 Context Value - 函数引用稳定,不需要每次都创建新对象\n const chatActionValue = useMemo(\n () => ({\n chat: startChat,\n stopChat,\n clearChat,\n reChat,\n suggestChat,\n confirmFnCall,\n setMessages,\n likeMessage,\n setStateDelta,\n }),\n [\n startChat,\n stopChat,\n clearChat,\n reChat,\n suggestChat,\n confirmFnCall,\n setMessages,\n likeMessage,\n setStateDelta,\n ],\n );\n\n // 会话 Context Value\n const sessionValue = useMemo(\n () => ({\n sessionList,\n sessionPagination,\n deleteSession,\n updateSession,\n setCurrentSession,\n }),\n [\n sessionList,\n sessionPagination,\n deleteSession,\n updateSession,\n setCurrentSession,\n ],\n );\n\n // Sender 输入框受控状态\n const [senderValue, setSenderValue] = useState(\"\");\n\n // Sender 专用状态 — 不包含 messages,避免轮询更新消息时导致 Sender 重渲染和焦点丢失\n const senderStateValue = useMemo(\n () => ({\n loading,\n uploadRequest,\n allowUpload,\n draggable,\n senderValue,\n setSenderValue,\n }),\n [loading, uploadRequest, allowUpload, draggable, senderValue],\n );\n\n return (\n <ConfigProvider\n theme={{\n token: {\n colorPrimary: appInfo?.appTheme || primaryBlue,\n },\n }}\n >\n <XProvider>\n <ChatStateContext.Provider value={chatStateValue}>\n <ChatActionContext.Provider value={chatActionValue}>\n <SessionContext.Provider value={sessionValue}>\n <ChatSenderStateContext.Provider value={senderStateValue}>\n <div\n style={\n {\n ...cssVarStyle,\n display: \"flex\",\n height: \"100%\",\n width: \"100%\",\n position: \"relative\",\n } as React.CSSProperties\n }\n >\n {children}\n </div>\n </ChatSenderStateContext.Provider>\n </SessionContext.Provider>\n </ChatActionContext.Provider>\n </ChatStateContext.Provider>\n </XProvider>\n </ConfigProvider>\n );\n },\n);\n\nXAdkProviderComponent.displayName = \"XAdkProvider\";\n\n// 导入 Compound Components\nimport Header from \"./compound/Header\";\nimport Sidebar from \"./compound/Sidebar\";\nimport Messages from \"./compound/Messages\";\nimport Sender from \"./compound/Sender\";\nimport Chatbot from \"./compound/Chatbot\";\nimport Welcome from \"./compound/Welcome\";\nimport DefaultLayout from \"./compound/DefaultLayout\";\n\n// 导出时会挂载 Compound Components\nconst XAdkProvider = XAdkProviderComponent as typeof XAdkProviderComponent & {\n Header: typeof Header;\n Sidebar: typeof Sidebar;\n Messages: typeof Messages;\n Sender: typeof Sender;\n Chatbot: typeof Chatbot;\n Welcome: typeof Welcome;\n DefaultLayout: typeof DefaultLayout;\n};\n\n// 挂载 Compound Components\nXAdkProvider.Header = Header;\nXAdkProvider.Sidebar = Sidebar;\nXAdkProvider.Messages = Messages;\nXAdkProvider.Sender = Sender;\nXAdkProvider.Chatbot = Chatbot;\nXAdkProvider.DefaultLayout = DefaultLayout;\nXAdkProvider.Welcome = Welcome;\n\nexport default XAdkProvider;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["useADKChat", "Header", "Sidebar", "Messages", "Sender", "Chatbot", "DefaultLayout", "Welcome"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/XAdkSender/InputTags.tsx"],
|
|
4
|
-
"sourcesContent": ["import React from \"react\";\nimport { Tag } from \"antd\";\nimport { CloseOutlined } from \"@ant-design/icons\";\nimport type { MentionTag } from \"@/types\";\nimport { useStyles } from \"./styles\";\n\nexport interface InputTagsProps {\n mentions: MentionTag[];\n onRemove: (id: string) => void;\n}\n\n// 输入框上方展示\nconst InputTags: React.FC<InputTagsProps> = ({ mentions, onRemove }) => {\n const styles = useStyles();\n\n if (!mentions.length) return null;\n\n // 非 inlineTags 模式下,Mention 以独立区域展示;inlineTags 模式由 InlineTagInput 接管混排和删除。\n return (\n <div className={styles.inputTags}>\n {mentions.map((mention) => (\n <Tag\n key={mention.id}\n className={styles.inputTag}\n closable\n onClose={(e) => {\n e.preventDefault();\n onRemove(mention.id);\n }}\n closeIcon={<CloseOutlined style={{ fontSize: 10 }} />}\n color={mention.color}\n icon={mention.icon}\n >\n {mention.displayName || mention.label}\n </Tag>\n ))}\n </div>\n );\n};\n\nexport default InputTags;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAAoB;AACpB,mBAA8B;AAE9B,oBAA0B;AAyBL;AAjBrB,IAAM,YAAsC,CAAC,EAAE,UAAU,SAAS,MAAM;AACtE,QAAM,aAAS,yBAAU;AAEzB,MAAI,CAAC,SAAS;AAAQ,WAAO;AAG7B,SACE,4CAAC,SAAI,WAAW,OAAO,WACpB,mBAAS,IAAI,CAAC,YACb;AAAA,IAAC;AAAA;AAAA,MAEC,WAAW,OAAO;AAAA,MAClB,UAAQ;AAAA,MACR,SAAS,CAAC,
|
|
4
|
+
"sourcesContent": ["import React from \"react\";\nimport { Tag } from \"antd\";\nimport { CloseOutlined } from \"@ant-design/icons\";\nimport type { MentionTag } from \"@/types\";\nimport { useStyles } from \"./styles\";\n\nexport interface InputTagsProps {\n mentions: MentionTag[];\n onRemove: (id: string) => void;\n}\n\n// 输入框上方展示\nconst InputTags: React.FC<InputTagsProps> = ({ mentions, onRemove }) => {\n const styles = useStyles();\n\n if (!mentions.length) return null;\n\n // 非 inlineTags 模式下,Mention 以独立区域展示;inlineTags 模式由 InlineTagInput 接管混排和删除。\n return (\n <div className={styles.inputTags}>\n {mentions.map((mention) => (\n <Tag\n key={mention.id}\n className={styles.inputTag}\n closable\n onClose={(e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault();\n onRemove(mention.id);\n }}\n closeIcon={<CloseOutlined style={{ fontSize: 10 }} />}\n color={mention.color}\n icon={mention.icon}\n >\n {mention.displayName || mention.label}\n </Tag>\n ))}\n </div>\n );\n};\n\nexport default InputTags;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAAoB;AACpB,mBAA8B;AAE9B,oBAA0B;AAyBL;AAjBrB,IAAM,YAAsC,CAAC,EAAE,UAAU,SAAS,MAAM;AACtE,QAAM,aAAS,yBAAU;AAEzB,MAAI,CAAC,SAAS;AAAQ,WAAO;AAG7B,SACE,4CAAC,SAAI,WAAW,OAAO,WACpB,mBAAS,IAAI,CAAC,YACb;AAAA,IAAC;AAAA;AAAA,MAEC,WAAW,OAAO;AAAA,MAClB,UAAQ;AAAA,MACR,SAAS,CAAC,MAAqC;AAC7C,UAAE,eAAe;AACjB,iBAAS,QAAQ,EAAE;AAAA,MACrB;AAAA,MACA,WAAW,4CAAC,8BAAc,OAAO,EAAE,UAAU,GAAG,GAAG;AAAA,MACnD,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ;AAAA,MAEb,kBAAQ,eAAe,QAAQ;AAAA;AAAA,IAX3B,QAAQ;AAAA,EAYf,CACD,GACH;AAEJ;AAEA,IAAO,oBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -54,6 +54,7 @@ var XAdkSender = (0, import_react.forwardRef)(
|
|
|
54
54
|
uploadRequest = () => {
|
|
55
55
|
},
|
|
56
56
|
onClear,
|
|
57
|
+
clearConfirm,
|
|
57
58
|
onChange,
|
|
58
59
|
onSubmit,
|
|
59
60
|
onStop,
|
|
@@ -297,11 +298,58 @@ var XAdkSender = (0, import_react.forwardRef)(
|
|
|
297
298
|
},
|
|
298
299
|
[files, maxFiles, maxFileSize, allowedFileTypes]
|
|
299
300
|
);
|
|
301
|
+
const handleExistingFiles = (0, import_react.useCallback)(
|
|
302
|
+
(selectedFiles) => {
|
|
303
|
+
if (!selectedFiles.length)
|
|
304
|
+
return;
|
|
305
|
+
setFiles((prev) => {
|
|
306
|
+
const next = [...prev];
|
|
307
|
+
for (const selected of selectedFiles) {
|
|
308
|
+
if (!selected.fileId || !selected.fileName)
|
|
309
|
+
continue;
|
|
310
|
+
if (next.some((file2) => String(file2.fileId) === String(selected.fileId)))
|
|
311
|
+
continue;
|
|
312
|
+
if (next.length >= maxFiles) {
|
|
313
|
+
import_antd.message.error(`最多只能上传 ${maxFiles} 个文件`);
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
const id = generateId();
|
|
317
|
+
const file = new File([], selected.fileName, { type: selected.mimeType });
|
|
318
|
+
next.push({
|
|
319
|
+
id,
|
|
320
|
+
uid: id,
|
|
321
|
+
name: selected.fileName,
|
|
322
|
+
file,
|
|
323
|
+
size: selected.size || 0,
|
|
324
|
+
type: selected.mimeType,
|
|
325
|
+
progress: 100,
|
|
326
|
+
status: "success",
|
|
327
|
+
fileId: selected.fileId,
|
|
328
|
+
tempUrl: selected.tempUrl,
|
|
329
|
+
response: {
|
|
330
|
+
...selected.raw,
|
|
331
|
+
fileName: selected.fileName,
|
|
332
|
+
fileId: selected.fileId,
|
|
333
|
+
tempUrl: selected.tempUrl,
|
|
334
|
+
fileType: selected.type,
|
|
335
|
+
fileSize: selected.size,
|
|
336
|
+
mimeType: selected.mimeType
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
if (next.length !== prev.length)
|
|
341
|
+
onFilesChange == null ? void 0 : onFilesChange(next);
|
|
342
|
+
return next;
|
|
343
|
+
});
|
|
344
|
+
},
|
|
345
|
+
[maxFiles, onFilesChange]
|
|
346
|
+
);
|
|
300
347
|
(0, import_react.useImperativeHandle)(
|
|
301
348
|
ref,
|
|
302
349
|
() => ({
|
|
303
350
|
addFiles: (rawFiles) => {
|
|
304
|
-
handleFileSelect(rawFiles);
|
|
351
|
+
handleFileSelect(rawFiles.filter((file) => file instanceof File));
|
|
352
|
+
handleExistingFiles(rawFiles.filter((file) => !(file instanceof File)));
|
|
305
353
|
},
|
|
306
354
|
insertMention: (mention) => {
|
|
307
355
|
var _a;
|
|
@@ -324,7 +372,7 @@ var XAdkSender = (0, import_react.forwardRef)(
|
|
|
324
372
|
inlineTags ? (_a = inlineInputRef.current) == null ? void 0 : _a.focus() : (_b = textareaRef.current) == null ? void 0 : _b.focus();
|
|
325
373
|
}
|
|
326
374
|
}),
|
|
327
|
-
[handleFileSelect, inlineTags, setMentions, mentions]
|
|
375
|
+
[handleFileSelect, handleExistingFiles, inlineTags, setMentions, mentions]
|
|
328
376
|
);
|
|
329
377
|
const uploadFiles = async (fileList) => {
|
|
330
378
|
for (const localFile of fileList) {
|
|
@@ -743,11 +791,11 @@ var XAdkSender = (0, import_react.forwardRef)(
|
|
|
743
791
|
const ClearButton = (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
744
792
|
import_antd.Popconfirm,
|
|
745
793
|
{
|
|
746
|
-
title: "确定要清空聊天记录吗?",
|
|
794
|
+
title: (clearConfirm == null ? void 0 : clearConfirm.title) ?? "确定要清空聊天记录吗?",
|
|
747
795
|
onConfirm: onClear,
|
|
748
796
|
placement: "top",
|
|
749
|
-
okText: "确定",
|
|
750
|
-
cancelText: "取消",
|
|
797
|
+
okText: (clearConfirm == null ? void 0 : clearConfirm.okText) ?? "确定",
|
|
798
|
+
cancelText: (clearConfirm == null ? void 0 : clearConfirm.cancelText) ?? "取消",
|
|
751
799
|
disabled: controlsDisabled,
|
|
752
800
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
753
801
|
"button",
|