@ai-group/chat-sdk 3.0.15 → 3.1.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.
- package/dist/cjs/components/XAdkChatbot/components/ThinkRender/index.d.ts +2 -2
- package/dist/cjs/components/XAdkChatbot/components/ThinkRender/index.js +25 -10
- package/dist/cjs/components/XAdkChatbot/components/ThinkRender/index.js.map +2 -2
- package/dist/cjs/components/XAdkChatbot/index.js +10 -3
- package/dist/cjs/components/XAdkChatbot/index.js.map +3 -3
- package/dist/cjs/components/XAdkThoughtChain/index.d.ts +4 -0
- package/dist/cjs/components/{XAiThoughtChain → XAdkThoughtChain}/index.js +37 -24
- package/dist/cjs/components/XAdkThoughtChain/index.js.map +7 -0
- package/dist/{esm/components/XAiThoughtChain → cjs/components/XAdkThoughtChain}/styles.d.ts +1 -0
- package/dist/cjs/components/{XAiThoughtChain → XAdkThoughtChain}/styles.js +36 -16
- package/dist/cjs/components/XAdkThoughtChain/styles.js.map +7 -0
- package/dist/cjs/index.d.ts +3 -3
- package/dist/cjs/index.js +3 -3
- package/dist/cjs/index.js.map +3 -3
- package/dist/cjs/types/{XAiThoughtChain.d.ts → XAdkThoughtChain.d.ts} +5 -3
- package/dist/cjs/types/{XAiThoughtChain.js → XAdkThoughtChain.js} +4 -4
- package/dist/cjs/types/XAdkThoughtChain.js.map +7 -0
- package/dist/cjs/types/index.d.ts +1 -1
- package/dist/cjs/types/index.js +2 -2
- package/dist/cjs/types/index.js.map +2 -2
- package/dist/esm/components/XAdkChatbot/components/ThinkRender/index.d.ts +2 -2
- package/dist/esm/components/XAdkChatbot/components/ThinkRender/index.js +28 -18
- package/dist/esm/components/XAdkChatbot/components/ThinkRender/index.js.map +1 -1
- package/dist/esm/components/XAdkChatbot/index.js +2 -2
- package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
- package/dist/esm/components/XAdkThoughtChain/index.d.ts +4 -0
- package/dist/esm/components/{XAiThoughtChain → XAdkThoughtChain}/index.js +26 -21
- package/dist/esm/components/XAdkThoughtChain/index.js.map +1 -0
- package/dist/{cjs/components/XAiThoughtChain → esm/components/XAdkThoughtChain}/styles.d.ts +1 -0
- package/dist/esm/components/XAdkThoughtChain/styles.js +42 -0
- package/dist/esm/components/XAdkThoughtChain/styles.js.map +1 -0
- package/dist/esm/index.d.ts +3 -3
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/{XAiThoughtChain.d.ts → XAdkThoughtChain.d.ts} +5 -3
- package/dist/esm/types/XAdkThoughtChain.js +2 -0
- package/dist/esm/types/XAdkThoughtChain.js.map +1 -0
- package/dist/esm/types/index.d.ts +1 -1
- package/dist/esm/types/index.js +1 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +2 -2
- package/dist/cjs/components/XAiThoughtChain/index.d.ts +0 -4
- package/dist/cjs/components/XAiThoughtChain/index.js.map +0 -7
- package/dist/cjs/components/XAiThoughtChain/styles.js.map +0 -7
- package/dist/cjs/types/XAiThoughtChain.js.map +0 -7
- package/dist/esm/components/XAiThoughtChain/index.d.ts +0 -4
- package/dist/esm/components/XAiThoughtChain/index.js.map +0 -1
- package/dist/esm/components/XAiThoughtChain/styles.js +0 -40
- package/dist/esm/components/XAiThoughtChain/styles.js.map +0 -1
- package/dist/esm/types/XAiThoughtChain.js +0 -2
- package/dist/esm/types/XAiThoughtChain.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import type { ThinkProps } from '@ant-design/x';
|
|
1
2
|
import React from 'react';
|
|
2
3
|
import type { IMessage } from "../../../../types";
|
|
3
|
-
export interface ThinkRenderProps {
|
|
4
|
+
export interface ThinkRenderProps extends Omit<ThinkProps, 'children'> {
|
|
4
5
|
msg: IMessage;
|
|
5
|
-
loading?: boolean;
|
|
6
6
|
}
|
|
7
7
|
declare const ThinkRender: React.FC<ThinkRenderProps>;
|
|
8
8
|
export default ThinkRender;
|
|
@@ -25,22 +25,37 @@ module.exports = __toCommonJS(ThinkRender_exports);
|
|
|
25
25
|
var import_x = require("@ant-design/x");
|
|
26
26
|
var import_react = require("react");
|
|
27
27
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
28
|
-
var ThinkRender = ({
|
|
29
|
-
|
|
28
|
+
var ThinkRender = ({
|
|
29
|
+
msg,
|
|
30
|
+
loading,
|
|
31
|
+
title,
|
|
32
|
+
expanded,
|
|
33
|
+
onExpand,
|
|
34
|
+
defaultExpanded,
|
|
35
|
+
...rest
|
|
36
|
+
}) => {
|
|
37
|
+
const isControlled = expanded !== void 0;
|
|
38
|
+
const [innerExpand, setInnerExpand] = (0, import_react.useState)(defaultExpanded ?? false);
|
|
30
39
|
(0, import_react.useEffect)(() => {
|
|
31
|
-
if (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
40
|
+
if (isControlled)
|
|
41
|
+
return;
|
|
42
|
+
setInnerExpand(!!loading);
|
|
43
|
+
}, [loading, isControlled]);
|
|
44
|
+
const expandValue = isControlled ? expanded : innerExpand;
|
|
45
|
+
const handleExpand = (val) => {
|
|
46
|
+
if (!isControlled) {
|
|
47
|
+
setInnerExpand(val);
|
|
35
48
|
}
|
|
36
|
-
|
|
49
|
+
onExpand == null ? void 0 : onExpand(val);
|
|
50
|
+
};
|
|
37
51
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
38
52
|
import_x.Think,
|
|
39
53
|
{
|
|
40
|
-
title: loading ? "思考中..." : "深度思考",
|
|
54
|
+
title: title ?? (loading ? "思考中..." : "深度思考"),
|
|
41
55
|
loading,
|
|
42
|
-
expanded:
|
|
43
|
-
onExpand:
|
|
56
|
+
expanded: expandValue,
|
|
57
|
+
onExpand: handleExpand,
|
|
58
|
+
...rest,
|
|
44
59
|
children: msg.text
|
|
45
60
|
}
|
|
46
61
|
);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/components/XAdkChatbot/components/ThinkRender/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Think } from '@ant-design/x';\nimport React, { useEffect, useState } from 'react';\nimport type { IMessage } from '@/types';\n\nexport interface ThinkRenderProps {\n msg: IMessage;\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAsB;
|
|
4
|
+
"sourcesContent": ["import { Think } from '@ant-design/x';\nimport type { ThinkProps } from '@ant-design/x';\nimport React, { useEffect, useState } from 'react';\nimport type { IMessage } from '@/types';\n\nexport interface ThinkRenderProps extends Omit<ThinkProps, 'children'> {\n msg: IMessage;\n}\n\nconst ThinkRender: React.FC<ThinkRenderProps> = ({\n msg,\n loading,\n title,\n expanded,\n onExpand,\n defaultExpanded,\n ...rest\n}) => {\n const isControlled = expanded !== undefined;\n const [innerExpand, setInnerExpand] = useState(defaultExpanded ?? false);\n\n useEffect(() => {\n if (isControlled) return;\n setInnerExpand(!!loading);\n }, [loading, isControlled]);\n\n const expandValue = isControlled ? expanded : innerExpand;\n\n const handleExpand = (val: boolean) => {\n if (!isControlled) {\n setInnerExpand(val);\n }\n onExpand?.(val);\n };\n\n return (\n <Think\n title={title ?? (loading ? '思考中...' : '深度思考')}\n loading={loading}\n expanded={expandValue}\n onExpand={handleExpand}\n {...rest}\n >\n {msg.text}\n </Think>\n );\n};\n\nexport default ThinkRender;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAsB;AAEtB,mBAA2C;AAkCvC;AA3BJ,IAAM,cAA0C,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,eAAe,aAAa;AAClC,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAS,mBAAmB,KAAK;AAEvE,8BAAU,MAAM;AACd,QAAI;AAAc;AAClB,mBAAe,CAAC,CAAC,OAAO;AAAA,EAC1B,GAAG,CAAC,SAAS,YAAY,CAAC;AAE1B,QAAM,cAAc,eAAe,WAAW;AAE9C,QAAM,eAAe,CAAC,QAAiB;AACrC,QAAI,CAAC,cAAc;AACjB,qBAAe,GAAG;AAAA,IACpB;AACA,yCAAW;AAAA,EACb;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,UAAU,UAAU,WAAW;AAAA,MACtC;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACT,GAAG;AAAA,MAEH,cAAI;AAAA;AAAA,EACP;AAEJ;AAEA,IAAO,sBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -41,7 +41,7 @@ var import_styles = require("./styles");
|
|
|
41
41
|
var import_MarkdownRender = __toESM(require("./components/MarkdownRender"));
|
|
42
42
|
var import_FunctionCallRender = __toESM(require("./components/FunctionCallRender"));
|
|
43
43
|
var import_FileGallery = __toESM(require("../FileGallery"));
|
|
44
|
-
var
|
|
44
|
+
var import_XAdkThoughtChain = __toESM(require("../XAdkThoughtChain"));
|
|
45
45
|
var import_utils = require("../../utils");
|
|
46
46
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
47
47
|
var scrollThreshold = 10;
|
|
@@ -170,7 +170,14 @@ var XAdkChatbot = ({
|
|
|
170
170
|
if (!enableProcessParsing) {
|
|
171
171
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.botMsg, children: msgs.map((msg, i) => {
|
|
172
172
|
if (msg.text) {
|
|
173
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
173
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
174
|
+
import_MarkdownRender.default,
|
|
175
|
+
{
|
|
176
|
+
text: msg.text,
|
|
177
|
+
onFileClick
|
|
178
|
+
},
|
|
179
|
+
`${msg.id}-${i}`
|
|
180
|
+
);
|
|
174
181
|
}
|
|
175
182
|
if (msg.functionCall) {
|
|
176
183
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -294,7 +301,7 @@ var XAdkChatbot = ({
|
|
|
294
301
|
nodes.map((node, idx) => {
|
|
295
302
|
if (node.type === "process") {
|
|
296
303
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
297
|
-
|
|
304
|
+
import_XAdkThoughtChain.default,
|
|
298
305
|
{
|
|
299
306
|
loading: isGroupLoading,
|
|
300
307
|
title: "思维链已完成",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/XAdkChatbot/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { Button, Flex, Tooltip, message as antdMessage } from \"antd\";\nimport clsx from \"clsx\";\nimport {\n SwapRightOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n CheckCircleFilled,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport { useStyles } from \"./styles\";\nimport MarkdownRender from \"./components/MarkdownRender\";\nimport FunctionCallRender from \"./components/FunctionCallRender\";\nimport FileGallery from \"../FileGallery\";\nimport XAiThoughtChain from \"@/components/XAiThoughtChain\";\nimport { parseAgentMessage } from \"@/utils\";\nimport type { IMessage, XAdkChatbotProps, ChatGroup } from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAiThoughtChain\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot: React.FC<XAdkChatbotProps> = ({\n loading = false,\n prologue,\n suggestions,\n messages,\n showFnCallDetail,\n onConfirm,\n onSuggest,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n initialized = false,\n onFileClick,\n}) => {\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement>(null);\n const lastScrollTopRef = useRef(0);\n const userHasScrolledRef = useRef(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const prevInitializedRef = useRef(false);\n\n // 初始化完成时滚动到底部\n useEffect(() => {\n if (!initialized) return;\n if (!messages.length) return;\n if (prevInitializedRef.current) return; // 只在第一次 initialized+messages 就绪时触发\n prevInitializedRef.current = true;\n // 推迟到浏览器完成 paint 后执行,确保 DOM 高度已撑开\n const timer = setTimeout(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"auto\" });\n }, 0);\n return () => clearTimeout(timer);\n }, [initialized, messages]);\n\n // 流式输出时滚动到底部\n useEffect(() => {\n if (!loading) return;\n if (userHasScrolledRef.current) return;\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [loading, messages]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const currentTop = el.scrollTop;\n\n if (currentTop < lastScrollTopRef.current) {\n userHasScrolledRef.current = true;\n }\n\n const isAtBottom =\n Math.abs(el.scrollHeight - currentTop - el.clientHeight) <=\n scrollThreshold;\n if (isAtBottom) {\n userHasScrolledRef.current = false;\n }\n\n lastScrollTopRef.current = currentTop;\n }, []);\n\n useEffect(() => {\n const listElement = listRef.current;\n if (!listElement) return;\n\n listElement.addEventListener(\"scroll\", handleScroll);\n return () => {\n listElement.removeEventListener(\"scroll\", handleScroll);\n };\n }, [handleScroll]);\n\n // ========== 消息分组逻辑 ==========\n const chatGroups = useMemo(() => {\n if (!enableGrouping) {\n // 不分组,每条消息独立\n return messages.map((msg) => ({\n id: msg.id,\n role: msg.role,\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: msg.fileData || [],\n isLike: msg.isLike ?? 0,\n }));\n }\n\n const groups: ChatGroup[] = [];\n messages.forEach((msg) => {\n // 过滤 followup 消息\n if ((msg as any).role === \"followup\") return;\n\n const isRealUserQuery =\n msg.role === \"user\" && !msg.functionResponse && !msg.functionCall;\n const lastGroup = groups[groups.length - 1];\n const isLastGroupAgent = lastGroup?.role === \"bot\";\n\n if (isLastGroupAgent && !isRealUserQuery) {\n // 合并到上一个 bot 分组\n lastGroup.msgs.push(msg);\n if (msg.invocationId) lastGroup.invocationId = msg.invocationId;\n // 更新 isLike: 取最新的非0值,或保持当前值\n if (msg.isLike && msg.isLike !== 0) {\n lastGroup.isLike = msg.isLike;\n }\n } else {\n // 创建新分组\n groups.push({\n id: msg.id || `group-${groups.length}`,\n role: isRealUserQuery ? \"user\" : \"bot\",\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: [],\n isLike: msg.isLike ?? 0,\n });\n }\n });\n\n // 合并文件\n groups.forEach((g) => {\n g.allFiles = g.msgs.reduce(\n (acc, m) => [...acc, ...(m.fileData || [])],\n [] as any[],\n );\n });\n\n return groups;\n }, [messages, enableGrouping]);\n\n // ========== 渲染 Bot 消息组 ==========\n const renderBotGroup = useCallback(\n (group: ChatGroup, isLastGroup: boolean) => {\n const { msgs, allFiles } = group;\n\n if (!enableProcessParsing) {\n // 不解析 process,简单渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {msgs.map((msg, i) => {\n if (msg.text) {\n return (\n <MarkdownRender key={`${msg.id}-${i}`} text={msg.text} onFileClick={onFileClick} />\n );\n }\n if (msg.functionCall) {\n return (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n />\n );\n }\n return null;\n })}\n </div>\n );\n }\n\n // ========== 解析 Process 内容 ==========\n\n // 1. 合并工具调用\n const mergedToolMap = new Map<string, IMessage>();\n msgs.forEach((msg) => {\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!mergedToolMap.has(callId)) {\n mergedToolMap.set(callId, { ...msg });\n } else {\n mergedToolMap.set(callId, {\n ...(mergedToolMap.get(callId) ?? {}),\n ...msg,\n });\n }\n } else if (msg.functionResponse) {\n const callId = msg.functionResponse.id || \"\";\n if (mergedToolMap.has(callId)) {\n const tool = mergedToolMap.get(callId);\n if (tool) tool.functionResponse = msg.functionResponse;\n } else {\n mergedToolMap.set(callId, {\n ...msg,\n functionCall: {\n id: callId,\n name: msg.functionResponse.name || \"Unknown\",\n args: {},\n },\n });\n }\n }\n });\n\n // 2. 解析文本消息中的 process 内容\n type RenderNode =\n | { type: \"text\"; content: string; key: string }\n | { type: \"process\"; items: ThoughtChainItemType[]; key: string };\n\n const nodes: RenderNode[] = [];\n let currentProcessItems: ThoughtChainItemType[] = [];\n const processedToolIds = new Set<string>();\n\n const flushProcessItems = () => {\n if (currentProcessItems.length > 0) {\n nodes.push({\n type: \"process\",\n items: [...currentProcessItems],\n key: `process-${nodes.length}`,\n });\n currentProcessItems = [];\n }\n };\n\n msgs.forEach((msg) => {\n // 处理工具调用\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!processedToolIds.has(callId)) {\n const mergedMsg = mergedToolMap.get(callId);\n if (mergedMsg) {\n currentProcessItems.push({\n type: \"tool\",\n key: `tool-${callId}`,\n content: \"\",\n msg: mergedMsg,\n });\n processedToolIds.add(callId);\n }\n }\n }\n // 处理文本消息\n else if (msg.text && !msg.functionResponse) {\n const parts = parseAgentMessage(msg.text, parseOptions as any);\n\n parts.forEach((part, partIdx) => {\n // process 内容放入 currentProcessItems\n if (\n [\n \"planning\",\n \"replanning\",\n \"reasoning\",\n \"action_log\",\n \"process_text\",\n ].includes(part.type)\n ) {\n const titleMap: Record<string, string> = {\n planning: \"任务规划\",\n replanning: \"重新规划\",\n reasoning: \"推理分析\",\n action_log: \"行动记录\",\n process_text: \"过程分析\",\n };\n\n currentProcessItems.push({\n type: \"text\",\n key: `${msg.id}-${partIdx}`,\n content: part.content,\n title: titleMap[part.type] || \"分析\",\n });\n }\n // 普通文本内容\n else {\n flushProcessItems();\n if (part.content.trim()) {\n const lastNode = nodes[nodes.length - 1];\n if (lastNode?.type === \"text\") {\n // 合并到上一个文本节点\n lastNode.content += \"\\n\\n\" + part.content;\n } else {\n nodes.push({\n type: \"text\",\n content: part.content,\n key: `text-${msg.id}-${partIdx}`,\n });\n }\n }\n }\n });\n }\n });\n\n // 最后flush一次\n flushProcessItems();\n\n // 3. 准备操作栏数据\n const fullTextToCopy = msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n const lastBotMsg = msgs[msgs.length - 1];\n const hasProcess = nodes.some((n) => n.type === \"process\");\n const isGroupLoading = loading && isLastGroup;\n\n // 4. 渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n return (\n <XAiThoughtChain\n key={node.key}\n loading={isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isGroupLoading}\n />\n );\n }\n\n // 文本节点\n const showBadge =\n hasProcess && nodes.findIndex((n) => n.type === \"text\") === idx;\n return (\n <div key={node.key}>\n {showBadge && (\n <div className={styles.successBadge}>\n <CheckCircleFilled /> 已完成所有规划任务\n </div>\n )}\n <MarkdownRender text={node.content} onFileClick={onFileClick} />\n </div>\n );\n })}\n\n {/* 文件展示 */}\n {allFiles.length > 0 && (\n <div className={styles.fileSection}>\n <div className={styles.fileHeader}>\n <span>生成文件 ({allFiles.length})</span>\n </div>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"8px\" }}>\n {allFiles.map((file, index) => (\n <FileGallery key={index} file={file} onClick={onFileClick} />\n ))}\n </div>\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions\n ? actions({ message: group, isLastBotMsg: isLastGroup })\n : (showRetry || showCopy || showLog) && (\n <div className={styles.metaFooter}>\n <Flex gap={16} className={styles.actionIcons}>\n {showRetry && isLastGroup && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined onClick={onRetry} />\n </Tooltip>\n )}\n {showCopy && (\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n onClick={() => {\n copy(fullTextToCopy);\n antdMessage.success(\"复制成功\");\n onCopy?.(fullTextToCopy);\n }}\n />\n </Tooltip>\n )}\n {showLog && lastBotMsg?.invocationId && (\n <Tooltip title=\"查看日志\">\n <InfoCircleOutlined\n onClick={() =>\n onShowLog?.(\n lastBotMsg.invocationId!,\n lastBotMsg.timestamp,\n )\n }\n />\n </Tooltip>\n )}\n </Flex>\n </div>\n ))}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n onFileClick,\n styles,\n ],\n );\n\n // ========== 渲染用户消息组 ==========\n const renderUserGroup = useCallback(\n (group: ChatGroup) => {\n return (\n <div key={group.id} className={styles.userMsg}>\n {group.msgs.map((m, i) => (\n <div key={m.id || i} className={styles.userContainer}>\n {/* 文件展示 */}\n {m.fileData && m.fileData.length > 0 && (\n <>\n {m.fileData.map((file, index) => (\n <FileGallery\n key={index}\n file={file}\n align=\"left\"\n style={{ marginBottom: \"16px\" }}\n onClick={onFileClick}\n />\n ))}\n </>\n )}\n {/* 文本展示 */}\n {m.text && <div className={styles.card}>{m.text}</div>}\n </div>\n ))}\n </div>\n );\n },\n [styles, onFileClick],\n );\n\n // ========== 欢迎页面 ==========\n // const isEmpty =\n // messages.length === 0 &&\n // !prologue &&\n // (!suggestions || suggestions.length === 0);\n\n // const renderWelcome = () => {\n // if (!isEmpty) return null;\n\n // return (\n // <>\n // {welcome ?? (\n // <div className={styles.welcomeWrapper}>\n // {agentIcon && (\n // <img src={agentIcon} alt=\"icon\" className={styles.welcomeIcon} />\n // )}\n // {agentName && (\n // <div className={styles.welcomeTitle}>{agentName}</div>\n // )}\n // {description && (\n // <div className={styles.welcomeDesc}>{description}</div>\n // )}\n // </div>\n // )}\n // </>\n // );\n // };\n\n // ========== 渲染建议问题 ==========\n const renderSuggestions = () => {\n if (!suggestions || suggestions.length === 0) return null;\n\n return (\n <div className={styles.suggestionWrapper}>\n {suggestions.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPosition=\"end\"\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n style={{\n whiteSpace: \"normal\",\n height: \"auto\",\n wordWrap: \"break-word\",\n textAlign: \"left\",\n padding: \"4px 15px\",\n lineHeight: \"1.5\",\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender text={prologue} onFileClick={onFileClick} />\n </div>\n )}\n\n {/* 欢迎页面 */}\n {/* {renderWelcome()} */}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(group, idx === chatGroups.length - 1),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n};\n\nexport default XAdkChatbot;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA+D;AAC/D,kBAA8D;AAC9D,kBAAiB;AACjB,mBAMO;AACP,+BAAiB;AACjB,oBAA0B;AAC1B,4BAA2B;AAC3B,gCAA+B;AAC/B,yBAAwB;AACxB,
|
|
6
|
-
"names": ["MarkdownRender", "FunctionCallRender", "
|
|
4
|
+
"sourcesContent": ["import React, { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { Button, Flex, Tooltip, message as antdMessage } from \"antd\";\nimport clsx from \"clsx\";\nimport {\n SwapRightOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n CheckCircleFilled,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport { useStyles } from \"./styles\";\nimport MarkdownRender from \"./components/MarkdownRender\";\nimport FunctionCallRender from \"./components/FunctionCallRender\";\nimport FileGallery from \"../FileGallery\";\nimport XAdkThoughtChain from \"@/components/XAdkThoughtChain\";\nimport { parseAgentMessage } from \"@/utils\";\nimport type { IMessage, XAdkChatbotProps, ChatGroup } from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAdkThoughtChain\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot: React.FC<XAdkChatbotProps> = ({\n loading = false,\n prologue,\n suggestions,\n messages,\n showFnCallDetail,\n onConfirm,\n onSuggest,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n initialized = false,\n onFileClick,\n}) => {\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement>(null);\n const lastScrollTopRef = useRef(0);\n const userHasScrolledRef = useRef(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const prevInitializedRef = useRef(false);\n\n // 初始化完成时滚动到底部\n useEffect(() => {\n if (!initialized) return;\n if (!messages.length) return;\n if (prevInitializedRef.current) return; // 只在第一次 initialized+messages 就绪时触发\n prevInitializedRef.current = true;\n // 推迟到浏览器完成 paint 后执行,确保 DOM 高度已撑开\n const timer = setTimeout(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"auto\" });\n }, 0);\n return () => clearTimeout(timer);\n }, [initialized, messages]);\n\n // 流式输出时滚动到底部\n useEffect(() => {\n if (!loading) return;\n if (userHasScrolledRef.current) return;\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [loading, messages]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const currentTop = el.scrollTop;\n\n if (currentTop < lastScrollTopRef.current) {\n userHasScrolledRef.current = true;\n }\n\n const isAtBottom =\n Math.abs(el.scrollHeight - currentTop - el.clientHeight) <=\n scrollThreshold;\n if (isAtBottom) {\n userHasScrolledRef.current = false;\n }\n\n lastScrollTopRef.current = currentTop;\n }, []);\n\n useEffect(() => {\n const listElement = listRef.current;\n if (!listElement) return;\n\n listElement.addEventListener(\"scroll\", handleScroll);\n return () => {\n listElement.removeEventListener(\"scroll\", handleScroll);\n };\n }, [handleScroll]);\n\n // ========== 消息分组逻辑 ==========\n const chatGroups = useMemo(() => {\n if (!enableGrouping) {\n // 不分组,每条消息独立\n return messages.map((msg) => ({\n id: msg.id,\n role: msg.role,\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: msg.fileData || [],\n isLike: msg.isLike ?? 0,\n }));\n }\n\n const groups: ChatGroup[] = [];\n messages.forEach((msg) => {\n // 过滤 followup 消息\n if ((msg as any).role === \"followup\") return;\n\n const isRealUserQuery =\n msg.role === \"user\" && !msg.functionResponse && !msg.functionCall;\n const lastGroup = groups[groups.length - 1];\n const isLastGroupAgent = lastGroup?.role === \"bot\";\n\n if (isLastGroupAgent && !isRealUserQuery) {\n // 合并到上一个 bot 分组\n lastGroup.msgs.push(msg);\n if (msg.invocationId) lastGroup.invocationId = msg.invocationId;\n // 更新 isLike: 取最新的非0值,或保持当前值\n if (msg.isLike && msg.isLike !== 0) {\n lastGroup.isLike = msg.isLike;\n }\n } else {\n // 创建新分组\n groups.push({\n id: msg.id || `group-${groups.length}`,\n role: isRealUserQuery ? \"user\" : \"bot\",\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: [],\n isLike: msg.isLike ?? 0,\n });\n }\n });\n\n // 合并文件\n groups.forEach((g) => {\n g.allFiles = g.msgs.reduce(\n (acc, m) => [...acc, ...(m.fileData || [])],\n [] as any[],\n );\n });\n\n return groups;\n }, [messages, enableGrouping]);\n\n // ========== 渲染 Bot 消息组 ==========\n const renderBotGroup = useCallback(\n (group: ChatGroup, isLastGroup: boolean) => {\n const { msgs, allFiles } = group;\n\n if (!enableProcessParsing) {\n // 不解析 process,简单渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {msgs.map((msg, i) => {\n if (msg.text) {\n return (\n <MarkdownRender\n key={`${msg.id}-${i}`}\n text={msg.text}\n onFileClick={onFileClick}\n />\n );\n }\n if (msg.functionCall) {\n return (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n />\n );\n }\n return null;\n })}\n </div>\n );\n }\n\n // ========== 解析 Process 内容 ==========\n\n // 1. 合并工具调用\n const mergedToolMap = new Map<string, IMessage>();\n msgs.forEach((msg) => {\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!mergedToolMap.has(callId)) {\n mergedToolMap.set(callId, { ...msg });\n } else {\n mergedToolMap.set(callId, {\n ...(mergedToolMap.get(callId) ?? {}),\n ...msg,\n });\n }\n } else if (msg.functionResponse) {\n const callId = msg.functionResponse.id || \"\";\n if (mergedToolMap.has(callId)) {\n const tool = mergedToolMap.get(callId);\n if (tool) tool.functionResponse = msg.functionResponse;\n } else {\n mergedToolMap.set(callId, {\n ...msg,\n functionCall: {\n id: callId,\n name: msg.functionResponse.name || \"Unknown\",\n args: {},\n },\n });\n }\n }\n });\n\n // 2. 解析文本消息中的 process 内容\n type RenderNode =\n | { type: \"text\"; content: string; key: string }\n | { type: \"process\"; items: ThoughtChainItemType[]; key: string };\n\n const nodes: RenderNode[] = [];\n let currentProcessItems: ThoughtChainItemType[] = [];\n const processedToolIds = new Set<string>();\n\n const flushProcessItems = () => {\n if (currentProcessItems.length > 0) {\n nodes.push({\n type: \"process\",\n items: [...currentProcessItems],\n key: `process-${nodes.length}`,\n });\n currentProcessItems = [];\n }\n };\n\n msgs.forEach((msg) => {\n // 处理工具调用\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!processedToolIds.has(callId)) {\n const mergedMsg = mergedToolMap.get(callId);\n if (mergedMsg) {\n currentProcessItems.push({\n type: \"tool\",\n key: `tool-${callId}`,\n content: \"\",\n msg: mergedMsg,\n });\n processedToolIds.add(callId);\n }\n }\n }\n // 处理文本消息\n else if (msg.text && !msg.functionResponse) {\n const parts = parseAgentMessage(msg.text, parseOptions as any);\n\n parts.forEach((part, partIdx) => {\n // process 内容放入 currentProcessItems\n if (\n [\n \"planning\",\n \"replanning\",\n \"reasoning\",\n \"action_log\",\n \"process_text\",\n ].includes(part.type)\n ) {\n const titleMap: Record<string, string> = {\n planning: \"任务规划\",\n replanning: \"重新规划\",\n reasoning: \"推理分析\",\n action_log: \"行动记录\",\n process_text: \"过程分析\",\n };\n\n currentProcessItems.push({\n type: \"text\",\n key: `${msg.id}-${partIdx}`,\n content: part.content,\n title: titleMap[part.type] || \"分析\",\n });\n }\n // 普通文本内容\n else {\n flushProcessItems();\n if (part.content.trim()) {\n const lastNode = nodes[nodes.length - 1];\n if (lastNode?.type === \"text\") {\n // 合并到上一个文本节点\n lastNode.content += \"\\n\\n\" + part.content;\n } else {\n nodes.push({\n type: \"text\",\n content: part.content,\n key: `text-${msg.id}-${partIdx}`,\n });\n }\n }\n }\n });\n }\n });\n\n // 最后flush一次\n flushProcessItems();\n\n // 3. 准备操作栏数据\n const fullTextToCopy = msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n const lastBotMsg = msgs[msgs.length - 1];\n const hasProcess = nodes.some((n) => n.type === \"process\");\n const isGroupLoading = loading && isLastGroup;\n\n // 4. 渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n return (\n <XAdkThoughtChain\n key={node.key}\n loading={isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isGroupLoading}\n />\n );\n }\n\n // 文本节点\n const showBadge =\n hasProcess && nodes.findIndex((n) => n.type === \"text\") === idx;\n return (\n <div key={node.key}>\n {showBadge && (\n <div className={styles.successBadge}>\n <CheckCircleFilled /> 已完成所有规划任务\n </div>\n )}\n <MarkdownRender text={node.content} onFileClick={onFileClick} />\n </div>\n );\n })}\n\n {/* 文件展示 */}\n {allFiles.length > 0 && (\n <div className={styles.fileSection}>\n <div className={styles.fileHeader}>\n <span>生成文件 ({allFiles.length})</span>\n </div>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"8px\" }}>\n {allFiles.map((file, index) => (\n <FileGallery key={index} file={file} onClick={onFileClick} />\n ))}\n </div>\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions\n ? actions({ message: group, isLastBotMsg: isLastGroup })\n : (showRetry || showCopy || showLog) && (\n <div className={styles.metaFooter}>\n <Flex gap={16} className={styles.actionIcons}>\n {showRetry && isLastGroup && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined onClick={onRetry} />\n </Tooltip>\n )}\n {showCopy && (\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n onClick={() => {\n copy(fullTextToCopy);\n antdMessage.success(\"复制成功\");\n onCopy?.(fullTextToCopy);\n }}\n />\n </Tooltip>\n )}\n {showLog && lastBotMsg?.invocationId && (\n <Tooltip title=\"查看日志\">\n <InfoCircleOutlined\n onClick={() =>\n onShowLog?.(\n lastBotMsg.invocationId!,\n lastBotMsg.timestamp,\n )\n }\n />\n </Tooltip>\n )}\n </Flex>\n </div>\n ))}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n onFileClick,\n styles,\n ],\n );\n\n // ========== 渲染用户消息组 ==========\n const renderUserGroup = useCallback(\n (group: ChatGroup) => {\n return (\n <div key={group.id} className={styles.userMsg}>\n {group.msgs.map((m, i) => (\n <div key={m.id || i} className={styles.userContainer}>\n {/* 文件展示 */}\n {m.fileData && m.fileData.length > 0 && (\n <>\n {m.fileData.map((file, index) => (\n <FileGallery\n key={index}\n file={file}\n align=\"left\"\n style={{ marginBottom: \"16px\" }}\n onClick={onFileClick}\n />\n ))}\n </>\n )}\n {/* 文本展示 */}\n {m.text && <div className={styles.card}>{m.text}</div>}\n </div>\n ))}\n </div>\n );\n },\n [styles, onFileClick],\n );\n\n // ========== 欢迎页面 ==========\n // const isEmpty =\n // messages.length === 0 &&\n // !prologue &&\n // (!suggestions || suggestions.length === 0);\n\n // const renderWelcome = () => {\n // if (!isEmpty) return null;\n\n // return (\n // <>\n // {welcome ?? (\n // <div className={styles.welcomeWrapper}>\n // {agentIcon && (\n // <img src={agentIcon} alt=\"icon\" className={styles.welcomeIcon} />\n // )}\n // {agentName && (\n // <div className={styles.welcomeTitle}>{agentName}</div>\n // )}\n // {description && (\n // <div className={styles.welcomeDesc}>{description}</div>\n // )}\n // </div>\n // )}\n // </>\n // );\n // };\n\n // ========== 渲染建议问题 ==========\n const renderSuggestions = () => {\n if (!suggestions || suggestions.length === 0) return null;\n\n return (\n <div className={styles.suggestionWrapper}>\n {suggestions.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPosition=\"end\"\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n style={{\n whiteSpace: \"normal\",\n height: \"auto\",\n wordWrap: \"break-word\",\n textAlign: \"left\",\n padding: \"4px 15px\",\n lineHeight: \"1.5\",\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender text={prologue} onFileClick={onFileClick} />\n </div>\n )}\n\n {/* 欢迎页面 */}\n {/* {renderWelcome()} */}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(group, idx === chatGroups.length - 1),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n};\n\nexport default XAdkChatbot;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["MarkdownRender", "FunctionCallRender", "XAdkThoughtChain", "FileGallery", "copy", "antdMessage", "clsx"]
|
|
7
7
|
}
|
|
@@ -26,12 +26,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
));
|
|
27
27
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
28
|
|
|
29
|
-
// src/components/
|
|
30
|
-
var
|
|
31
|
-
__export(
|
|
32
|
-
default: () =>
|
|
29
|
+
// src/components/XAdkThoughtChain/index.tsx
|
|
30
|
+
var XAdkThoughtChain_exports = {};
|
|
31
|
+
__export(XAdkThoughtChain_exports, {
|
|
32
|
+
default: () => XAdkThoughtChain_default
|
|
33
33
|
});
|
|
34
|
-
module.exports = __toCommonJS(
|
|
34
|
+
module.exports = __toCommonJS(XAdkThoughtChain_exports);
|
|
35
35
|
var import_react = require("react");
|
|
36
36
|
var import_icons = require("@ant-design/icons");
|
|
37
37
|
var import_MarkdownRender = __toESM(require("../XAdkChatbot/components/MarkdownRender"));
|
|
@@ -44,7 +44,8 @@ var TimelineItem = ({
|
|
|
44
44
|
title,
|
|
45
45
|
children,
|
|
46
46
|
collapsible = true,
|
|
47
|
-
defaultOpen = true
|
|
47
|
+
defaultOpen = true,
|
|
48
|
+
blink
|
|
48
49
|
}) => {
|
|
49
50
|
const [isOpen, setIsOpen] = (0, import_react.useState)(defaultOpen);
|
|
50
51
|
const styles = (0, import_styles.useStyles)();
|
|
@@ -60,7 +61,7 @@ var TimelineItem = ({
|
|
|
60
61
|
className: styles.collapsibleHeader,
|
|
61
62
|
onClick: () => collapsible ? setIsOpen(!isOpen) : void 0,
|
|
62
63
|
children: [
|
|
63
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { children: title }),
|
|
64
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: blink ? styles.blink : void 0, children: title }),
|
|
64
65
|
collapsible && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: styles.arrowIcon, children: isOpen ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.DownOutlined, {}) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.RightOutlined, {}) })
|
|
65
66
|
]
|
|
66
67
|
}
|
|
@@ -69,17 +70,18 @@ var TimelineItem = ({
|
|
|
69
70
|
] })
|
|
70
71
|
] });
|
|
71
72
|
};
|
|
72
|
-
var TimelineTextItem = ({ item }) => {
|
|
73
|
+
var TimelineTextItem = ({ item, blink }) => {
|
|
73
74
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
74
75
|
TimelineItem,
|
|
75
76
|
{
|
|
76
77
|
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: (0, import_styles.useStyles)().timelineIcon, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.PartitionOutlined, {}) }),
|
|
77
78
|
title: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: (0, import_styles.useStyles)().titleText, children: item.title }),
|
|
79
|
+
blink,
|
|
78
80
|
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_MarkdownRender.default, { text: (0, import_utils.cleanProcessText)(item.content) })
|
|
79
81
|
}
|
|
80
82
|
);
|
|
81
83
|
};
|
|
82
|
-
var TimelineToolItem = ({ msg, collapsible, onConfirm, showFnCallDetail }) => {
|
|
84
|
+
var TimelineToolItem = ({ msg, collapsible, onConfirm, showFnCallDetail, blink }) => {
|
|
83
85
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
84
86
|
const styles = (0, import_styles.useStyles)();
|
|
85
87
|
const needsConfirm = msg.functionCall && !msg.functionResponse;
|
|
@@ -97,6 +99,7 @@ var TimelineToolItem = ({ msg, collapsible, onConfirm, showFnCallDetail }) => {
|
|
|
97
99
|
title: titleNode,
|
|
98
100
|
collapsible,
|
|
99
101
|
defaultOpen: needsConfirm,
|
|
102
|
+
blink,
|
|
100
103
|
children: [
|
|
101
104
|
statusInfo && typeof statusInfo === "string" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.statusInfo, children: statusInfo }),
|
|
102
105
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -111,12 +114,13 @@ var TimelineToolItem = ({ msg, collapsible, onConfirm, showFnCallDetail }) => {
|
|
|
111
114
|
}
|
|
112
115
|
);
|
|
113
116
|
};
|
|
114
|
-
var
|
|
117
|
+
var XAdkThoughtChain = ({
|
|
115
118
|
defaultOpen = false,
|
|
116
119
|
showFnCallDetail = false,
|
|
117
120
|
title = "思维链已完成",
|
|
118
121
|
items = [],
|
|
119
122
|
loading,
|
|
123
|
+
blink = false,
|
|
120
124
|
onConfirm
|
|
121
125
|
}) => {
|
|
122
126
|
const styles = (0, import_styles.useStyles)();
|
|
@@ -125,31 +129,40 @@ var XAiThoughtChain = ({
|
|
|
125
129
|
if (loading)
|
|
126
130
|
Promise.resolve().then(() => setIsOpen(true));
|
|
127
131
|
}, [loading]);
|
|
132
|
+
const shouldBlink = blink && loading;
|
|
128
133
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.thoughtChainBlock, children: [
|
|
129
|
-
/* @__PURE__ */ (0, import_jsx_runtime.
|
|
130
|
-
/* @__PURE__ */ (0, import_jsx_runtime.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
] }),
|
|
134
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.thoughtHeader, onClick: () => setIsOpen(!isOpen), children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.headerLeft, children: [
|
|
135
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.statusIcon, children: loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.SyncOutlined, { spin: true, style: { color: "#1677ff" } }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.CheckCircleFilled, { style: { color: "#52c41a" } }) }),
|
|
136
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
137
|
+
"span",
|
|
138
|
+
{
|
|
139
|
+
className: `${styles.headerTitle}${shouldBlink ? ` ${styles.blink}` : ""}`,
|
|
140
|
+
children: loading ? "深度思考与执行中..." : title
|
|
141
|
+
}
|
|
142
|
+
),
|
|
143
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: `${styles.caret} ${isOpen ? "open" : ""}`, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.RightOutlined, {}) })
|
|
144
|
+
] }) }),
|
|
140
145
|
isOpen && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.thinkingBody, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.timeline, children: items.map(
|
|
141
|
-
(item, i) => item.type === "text" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
146
|
+
(item, i) => item.type === "text" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
147
|
+
TimelineTextItem,
|
|
148
|
+
{
|
|
149
|
+
item,
|
|
150
|
+
blink: shouldBlink
|
|
151
|
+
},
|
|
152
|
+
item.key || i
|
|
153
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
142
154
|
TimelineToolItem,
|
|
143
155
|
{
|
|
144
156
|
msg: item.msg,
|
|
145
157
|
collapsible: item.collapsible,
|
|
146
158
|
showFnCallDetail,
|
|
147
|
-
onConfirm
|
|
159
|
+
onConfirm,
|
|
160
|
+
blink: shouldBlink
|
|
148
161
|
},
|
|
149
162
|
`tool-${item.key || i}`
|
|
150
163
|
)
|
|
151
164
|
) }) })
|
|
152
165
|
] });
|
|
153
166
|
};
|
|
154
|
-
var
|
|
167
|
+
var XAdkThoughtChain_default = XAdkThoughtChain;
|
|
155
168
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/XAdkThoughtChain/index.tsx"],
|
|
4
|
+
"sourcesContent": ["import React, { useState, useEffect } from \"react\";\nimport {\n CheckCircleFilled,\n SyncOutlined,\n ThunderboltOutlined,\n PartitionOutlined,\n RightOutlined,\n DownOutlined,\n} from \"@ant-design/icons\";\nimport MarkdownRender from \"@/components/XAdkChatbot/components/MarkdownRender\";\nimport FunctionCallRender from \"@/components/XAdkChatbot/components/FunctionCallRender\";\nimport { useStyles } from \"./styles\";\nimport {\n XAdkThoughtChainProps,\n ThoughtChainItemType,\n TimelineItemProps,\n FunctionCall,\n IMessage,\n} from \"@/types\";\nimport { cleanProcessText } from \"@/utils\";\n\nconst TimelineItem = ({\n icon,\n title,\n children,\n collapsible = true,\n defaultOpen = true,\n blink,\n}: TimelineItemProps) => {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const styles = useStyles();\n\n return (\n <div className={styles.timelineItem}>\n <div className={styles.timelineLeft}>\n {icon}\n <div className={styles.timelineConnector} />\n </div>\n <div className={styles.timelineRight}>\n <div\n className={styles.collapsibleHeader}\n onClick={() => (collapsible ? setIsOpen(!isOpen) : undefined)}\n >\n <div className={blink ? styles.blink : undefined}>{title}</div>\n {collapsible && (\n <span className={styles.arrowIcon}>\n {isOpen ? <DownOutlined /> : <RightOutlined />}\n </span>\n )}\n </div>\n\n {isOpen && <div className={styles.stepContent}>{children}</div>}\n </div>\n </div>\n );\n};\n\nconst TimelineTextItem: React.FC<{\n item: ThoughtChainItemType;\n blink?: boolean;\n}> = ({ item, blink }) => {\n return (\n <TimelineItem\n icon={\n <span className={useStyles().timelineIcon}>\n <PartitionOutlined />\n </span>\n }\n title={<span className={useStyles().titleText}>{item.title}</span>}\n blink={blink}\n >\n <MarkdownRender text={cleanProcessText(item.content)} />\n </TimelineItem>\n );\n};\n\nconst TimelineToolItem: React.FC<{\n msg: IMessage;\n collapsible?: boolean;\n showFnCallDetail: boolean;\n onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;\n blink?: boolean;\n}> = ({ msg, collapsible, onConfirm, showFnCallDetail, blink }) => {\n const styles = useStyles();\n const needsConfirm = msg.functionCall && !msg.functionResponse;\n const isDone = !!msg.functionResponse;\n\n const toolName =\n msg.functionCall?.args?.componentName ||\n msg.functionCall?.name ||\n \"组件执行\";\n\n const statusInfo =\n msg.functionResponse?.response?.processData ||\n msg.functionResponse?.response?.output;\n\n const titleNode = (\n <div className={styles.toolTitleGroup}>\n <span className={styles.toolName}>{toolName}</span>\n {isDone && <span className={styles.toolStatusTag}>执行成功</span>}\n </div>\n );\n\n return (\n <TimelineItem\n icon={\n <span className={styles.timelineIconTool}>\n <ThunderboltOutlined />\n </span>\n }\n title={titleNode}\n collapsible={collapsible}\n defaultOpen={needsConfirm}\n blink={blink}\n >\n {statusInfo && typeof statusInfo === \"string\" && (\n <div className={styles.statusInfo}>{statusInfo}</div>\n )}\n <FunctionCallRender\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n />\n </TimelineItem>\n );\n};\n\nconst XAdkThoughtChain: React.FC<XAdkThoughtChainProps> = ({\n defaultOpen = false,\n showFnCallDetail = false,\n title = \"思维链已完成\",\n items = [],\n loading,\n blink = false,\n onConfirm,\n}) => {\n const styles = useStyles();\n const [isOpen, setIsOpen] = useState(defaultOpen);\n useEffect(() => {\n if (loading) Promise.resolve().then(() => setIsOpen(true));\n }, [loading]);\n\n const shouldBlink = blink && loading;\n\n return (\n <div className={styles.thoughtChainBlock}>\n <div className={styles.thoughtHeader} onClick={() => setIsOpen(!isOpen)}>\n <div className={styles.headerLeft}>\n <div className={styles.statusIcon}>\n {loading ? (\n <SyncOutlined spin style={{ color: \"#1677ff\" }} />\n ) : (\n <CheckCircleFilled style={{ color: \"#52c41a\" }} />\n )}\n </div>\n <span\n className={`${styles.headerTitle}${shouldBlink ? ` ${styles.blink}` : \"\"}`}\n >\n {loading ? \"深度思考与执行中...\" : title}\n </span>\n <div className={`${styles.caret} ${isOpen ? \"open\" : \"\"}`}>\n <RightOutlined />\n </div>\n </div>\n </div>\n {isOpen && (\n <div className={styles.thinkingBody}>\n <div className={styles.timeline}>\n {items.map((item, i) =>\n item.type === \"text\" ? (\n <TimelineTextItem\n key={item.key || i}\n item={item}\n blink={shouldBlink}\n />\n ) : (\n <TimelineToolItem\n key={`tool-${item.key || i}`}\n msg={item.msg!}\n collapsible={item.collapsible}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n blink={shouldBlink}\n />\n ),\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default XAdkThoughtChain;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["MarkdownRender", "FunctionCallRender"]
|
|
7
|
+
}
|
|
@@ -16,7 +16,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
};
|
|
17
17
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
18
|
|
|
19
|
-
// src/components/
|
|
19
|
+
// src/components/XAdkThoughtChain/styles.tsx
|
|
20
20
|
var styles_exports = {};
|
|
21
21
|
__export(styles_exports, {
|
|
22
22
|
useStyles: () => useStyles
|
|
@@ -24,23 +24,26 @@ __export(styles_exports, {
|
|
|
24
24
|
module.exports = __toCommonJS(styles_exports);
|
|
25
25
|
var import_css = require("@emotion/css");
|
|
26
26
|
var import_common = require("../../styles/common");
|
|
27
|
+
var blinkAnimation = import_css.keyframes`
|
|
28
|
+
0% { background-position-x: -200%; background-position-y: 100%; }
|
|
29
|
+
25% { background-position-x: -100%; background-position-y: 100%; }
|
|
30
|
+
50% { background-position-x: 0%; background-position-y: 100%; }
|
|
31
|
+
75% { background-position-x: 100%; background-position-y: 100%; }
|
|
32
|
+
100% { background-position-x: 200%; background-position-y: 100%; }
|
|
33
|
+
`;
|
|
27
34
|
var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
28
35
|
/* --- ThoughtChain --- */
|
|
29
36
|
thoughtChainBlock: import_css.css`
|
|
30
37
|
margin-bottom: 16px;
|
|
31
|
-
background: #f9f9f9;
|
|
32
38
|
border-radius: 8px;
|
|
33
|
-
border: 1px solid #eee;
|
|
34
39
|
overflow: hidden;
|
|
35
40
|
`,
|
|
36
41
|
thoughtHeader: import_css.css`
|
|
37
42
|
display: flex;
|
|
38
|
-
justify-content: space-between;
|
|
39
43
|
align-items: center;
|
|
40
44
|
padding: 10px 14px;
|
|
41
45
|
cursor: pointer;
|
|
42
46
|
user-select: none;
|
|
43
|
-
background: #f5f5f5;
|
|
44
47
|
transition: background 0.2s;
|
|
45
48
|
&:hover {
|
|
46
49
|
background: #f0f0f0;
|
|
@@ -54,7 +57,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
|
54
57
|
`,
|
|
55
58
|
caret: import_css.css`
|
|
56
59
|
font-size: 12px;
|
|
57
|
-
color: #
|
|
60
|
+
color: #8194ad;
|
|
58
61
|
transition: transform 0.2s;
|
|
59
62
|
&.open {
|
|
60
63
|
transform: rotate(90deg);
|
|
@@ -67,13 +70,13 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
|
67
70
|
`,
|
|
68
71
|
headerTitle: import_css.css`
|
|
69
72
|
font-size: 13px;
|
|
70
|
-
color: #
|
|
73
|
+
color: #8194ad;
|
|
71
74
|
font-weight: 500;
|
|
72
75
|
`,
|
|
73
76
|
headerRight: import_css.css``,
|
|
74
77
|
stepCount: import_css.css`
|
|
75
78
|
font-size: 12px;
|
|
76
|
-
color: #
|
|
79
|
+
color: #8194ad;
|
|
77
80
|
background: #fff;
|
|
78
81
|
padding: 2px 6px;
|
|
79
82
|
border-radius: 4px;
|
|
@@ -81,8 +84,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
|
81
84
|
`,
|
|
82
85
|
thinkingBody: import_css.css`
|
|
83
86
|
background: #fff;
|
|
84
|
-
|
|
85
|
-
padding: 12px 16px;
|
|
87
|
+
padding: 0 16px;
|
|
86
88
|
animation: fadeIn 0.2s ease-in-out;
|
|
87
89
|
`,
|
|
88
90
|
/* --- Timeline --- */
|
|
@@ -102,7 +104,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
|
102
104
|
flex-shrink: 0;
|
|
103
105
|
`,
|
|
104
106
|
timelineIcon: import_css.css`
|
|
105
|
-
color: #
|
|
107
|
+
color: #8194ad;
|
|
106
108
|
font-size: 16px;
|
|
107
109
|
margin-top: 6px;
|
|
108
110
|
`,
|
|
@@ -124,7 +126,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
|
124
126
|
`,
|
|
125
127
|
timelineRight: import_css.css`
|
|
126
128
|
flex: 1;
|
|
127
|
-
padding-bottom:
|
|
129
|
+
padding-bottom: 8px;
|
|
128
130
|
min-width: 0;
|
|
129
131
|
`,
|
|
130
132
|
collapsibleHeader: import_css.css`
|
|
@@ -145,7 +147,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
|
145
147
|
titleText: import_css.css`
|
|
146
148
|
font-size: 13px;
|
|
147
149
|
font-weight: 600;
|
|
148
|
-
color: #
|
|
150
|
+
color: #8194ad;
|
|
149
151
|
`,
|
|
150
152
|
toolTitleGroup: import_css.css`
|
|
151
153
|
display: flex;
|
|
@@ -156,7 +158,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
|
156
158
|
toolName: import_css.css`
|
|
157
159
|
font-size: 13px;
|
|
158
160
|
font-weight: 600;
|
|
159
|
-
color: #
|
|
161
|
+
color: #8194ad;
|
|
160
162
|
white-space: nowrap;
|
|
161
163
|
overflow: hidden;
|
|
162
164
|
text-overflow: ellipsis;
|
|
@@ -177,15 +179,33 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
|
|
|
177
179
|
`,
|
|
178
180
|
stepContent: import_css.css`
|
|
179
181
|
font-size: 13px;
|
|
180
|
-
color: #
|
|
182
|
+
color: #8194ad;
|
|
181
183
|
line-height: 1.6;
|
|
182
184
|
padding-left: 4px;
|
|
183
185
|
`,
|
|
184
186
|
statusInfo: import_css.css`
|
|
185
187
|
font-size: 12px;
|
|
186
|
-
color: #
|
|
188
|
+
color: #8194ad;
|
|
187
189
|
margin-bottom: 4px;
|
|
188
190
|
font-style: italic;
|
|
191
|
+
`,
|
|
192
|
+
blink: import_css.css`
|
|
193
|
+
color: #8194ad;
|
|
194
|
+
background-image: linear-gradient(
|
|
195
|
+
90deg,
|
|
196
|
+
transparent,
|
|
197
|
+
rgba(0, 0, 0, 0.88),
|
|
198
|
+
transparent
|
|
199
|
+
);
|
|
200
|
+
background-clip: text;
|
|
201
|
+
-webkit-background-clip: text;
|
|
202
|
+
background-size: 50%;
|
|
203
|
+
background-repeat: no-repeat;
|
|
204
|
+
animation-name: ${blinkAnimation};
|
|
205
|
+
animation-duration: 1s;
|
|
206
|
+
animation-iteration-count: infinite;
|
|
207
|
+
animation-timing-function: linear;
|
|
208
|
+
animation-fill-mode: forwards;
|
|
189
209
|
`
|
|
190
210
|
}));
|
|
191
211
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/XAdkThoughtChain/styles.tsx"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable import/prefer-default-export */\nimport { css, keyframes } from \"@emotion/css\";\nimport { withBasicStyles, lightBlue, primaryBlue } from \"@/styles/common\";\n\nconst blinkAnimation = keyframes`\n 0% { background-position-x: -200%; background-position-y: 100%; }\n 25% { background-position-x: -100%; background-position-y: 100%; }\n 50% { background-position-x: 0%; background-position-y: 100%; }\n 75% { background-position-x: 100%; background-position-y: 100%; }\n 100% { background-position-x: 200%; background-position-y: 100%; }\n`;\n\nexport const useStyles = withBasicStyles(() => ({\n /* --- ThoughtChain --- */\n\n thoughtChainBlock: css`\n margin-bottom: 16px;\n border-radius: 8px;\n overflow: hidden;\n `,\n\n thoughtHeader: css`\n display: flex;\n align-items: center;\n padding: 10px 14px;\n cursor: pointer;\n user-select: none;\n transition: background 0.2s;\n &:hover {\n background: #f0f0f0;\n border-color: #ccc;\n }\n `,\n\n headerLeft: css`\n display: flex;\n align-items: center;\n gap: 8px;\n `,\n\n caret: css`\n font-size: 12px;\n color: #8194ad;\n transition: transform 0.2s;\n &.open {\n transform: rotate(90deg);\n }\n `,\n\n statusIcon: css`\n font-size: 14px;\n display: flex;\n align-items: center;\n `,\n\n headerTitle: css`\n font-size: 13px;\n color: #8194ad;\n font-weight: 500;\n `,\n\n headerRight: css``,\n\n stepCount: css`\n font-size: 12px;\n color: #8194ad;\n background: #fff;\n padding: 2px 6px;\n border-radius: 4px;\n border: 1px solid #e0e0e0;\n `,\n\n thinkingBody: css`\n background: #fff;\n padding: 0 16px;\n animation: fadeIn 0.2s ease-in-out;\n `,\n\n /* --- Timeline --- */\n\n timeline: css`\n width: 100%;\n `,\n\n timelineItem: css`\n display: flex;\n gap: 12px;\n position: relative;\n `,\n\n timelineLeft: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 20px;\n flex-shrink: 0;\n `,\n\n timelineIcon: css`\n color: #8194ad;\n font-size: 16px;\n margin-top: 6px;\n `,\n\n timelineIconTool: css`\n color: #faad14;\n font-size: 16px;\n margin-top: 6px;\n `,\n\n timelineConnector: css`\n flex: 1;\n width: 1px;\n background-color: #e5e5e5;\n margin: 4px 0;\n min-height: 12px;\n `,\n\n /* Hide connector on last item */\n timelineItemLastConnector: css`\n display: none;\n `,\n\n timelineRight: css`\n flex: 1;\n padding-bottom: 8px;\n min-width: 0;\n `,\n\n collapsibleHeader: css`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 5px 8px;\n margin: 0 -8px 4px -8px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n user-select: none;\n\n &:hover {\n background: #f5f5f5;\n }\n `,\n\n titleText: css`\n font-size: 13px;\n font-weight: 600;\n color: #8194ad;\n `,\n\n toolTitleGroup: css`\n display: flex;\n align-items: center;\n gap: 8px;\n overflow: hidden;\n `,\n\n toolName: css`\n font-size: 13px;\n font-weight: 600;\n color: #8194ad;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n\n toolStatusTag: css`\n font-size: 11px;\n color: #52c41a;\n background: #f6ffed;\n border: 1px solid #b7eb8f;\n padding: 0 6px;\n border-radius: 4px;\n flex-shrink: 0;\n `,\n\n arrowIcon: css`\n font-size: 10px;\n color: #bbb;\n margin-left: 8px;\n `,\n\n stepContent: css`\n font-size: 13px;\n color: #8194ad;\n line-height: 1.6;\n padding-left: 4px;\n `,\n\n statusInfo: css`\n font-size: 12px;\n color: #8194ad;\n margin-bottom: 4px;\n font-style: italic;\n `,\n\n blink: css`\n color: #8194ad;\n background-image: linear-gradient(\n 90deg,\n transparent,\n rgba(0, 0, 0, 0.88),\n transparent\n );\n background-clip: text;\n -webkit-background-clip: text;\n background-size: 50%;\n background-repeat: no-repeat;\n animation-name: ${blinkAnimation};\n animation-duration: 1s;\n animation-iteration-count: infinite;\n animation-timing-function: linear;\n animation-fill-mode: forwards;\n `,\n}));\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAA+B;AAC/B,oBAAwD;AAExD,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQhB,IAAM,gBAAY,+BAAgB,OAAO;AAAA;AAAA,EAG9C,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnB,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaf,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASP,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAMb,aAAa;AAAA,EAEb,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASX,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQd,UAAU;AAAA;AAAA;AAAA,EAIV,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAMd,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQd,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAMd,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlB,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnB,2BAA2B;AAAA;AAAA;AAAA,EAI3B,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,EAMf,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBnB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASV,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUf,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOZ,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAYa;AAAA;AAAA;AAAA;AAAA;AAAA;AAMtB,EAAE;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import XAiSDK from "./components/XAiSDK";
|
|
|
5
5
|
import XAiSender from "./components/XAiSender";
|
|
6
6
|
import FileGallery from "./components/FileGallery";
|
|
7
7
|
import XAiConversations from "./components/XAiConversations";
|
|
8
|
-
import
|
|
8
|
+
import XAdkThoughtChain from "./components/XAdkThoughtChain";
|
|
9
9
|
import useXAiSDK from "./hooks/useXAiSDK";
|
|
10
10
|
import request from "./utils/request";
|
|
11
11
|
import XAdkProvider from "./components/XAdkProvider";
|
|
@@ -16,10 +16,10 @@ export { useChatState, useChatActions, useSession, } from "./components/XAdkProv
|
|
|
16
16
|
export * from "./types";
|
|
17
17
|
export type { ChatHookResult, ChatHookFactory } from "./types/ChatHook";
|
|
18
18
|
export { useXAi, XAiProvider, XAiChatbot, XAiSDK, XAiSender, XAiConversations, useXAiSDK, request, };
|
|
19
|
-
export { XAdkProvider, XAdkChatbot, XAdkSender, FileGallery,
|
|
19
|
+
export { XAdkProvider, XAdkChatbot, XAdkSender, FileGallery, XAdkThoughtChain, useADKChat, };
|
|
20
20
|
export { default as MarkdownRender } from "./components/XAdkChatbot/components/MarkdownRender";
|
|
21
21
|
export { default as FunctionCallRender } from "./components/XAdkChatbot/components/FunctionCallRender";
|
|
22
22
|
export { default as ThinkRender } from "./components/XAdkChatbot/components/ThinkRender";
|
|
23
23
|
export type { MarkdownRenderProps } from "./components/XAdkChatbot/components/MarkdownRender";
|
|
24
24
|
export type { FunctionCallRenderProps } from "./components/XAdkChatbot/components/FunctionCallRender";
|
|
25
|
-
export type {
|
|
25
|
+
export type { XAdkThoughtChainProps, ThoughtChainItemType, } from "./types/XAdkThoughtChain";
|