@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.
Files changed (52) hide show
  1. package/dist/cjs/components/XAdkChatbot/components/ThinkRender/index.d.ts +2 -2
  2. package/dist/cjs/components/XAdkChatbot/components/ThinkRender/index.js +25 -10
  3. package/dist/cjs/components/XAdkChatbot/components/ThinkRender/index.js.map +2 -2
  4. package/dist/cjs/components/XAdkChatbot/index.js +10 -3
  5. package/dist/cjs/components/XAdkChatbot/index.js.map +3 -3
  6. package/dist/cjs/components/XAdkThoughtChain/index.d.ts +4 -0
  7. package/dist/cjs/components/{XAiThoughtChain → XAdkThoughtChain}/index.js +37 -24
  8. package/dist/cjs/components/XAdkThoughtChain/index.js.map +7 -0
  9. package/dist/{esm/components/XAiThoughtChain → cjs/components/XAdkThoughtChain}/styles.d.ts +1 -0
  10. package/dist/cjs/components/{XAiThoughtChain → XAdkThoughtChain}/styles.js +36 -16
  11. package/dist/cjs/components/XAdkThoughtChain/styles.js.map +7 -0
  12. package/dist/cjs/index.d.ts +3 -3
  13. package/dist/cjs/index.js +3 -3
  14. package/dist/cjs/index.js.map +3 -3
  15. package/dist/cjs/types/{XAiThoughtChain.d.ts → XAdkThoughtChain.d.ts} +5 -3
  16. package/dist/cjs/types/{XAiThoughtChain.js → XAdkThoughtChain.js} +4 -4
  17. package/dist/cjs/types/XAdkThoughtChain.js.map +7 -0
  18. package/dist/cjs/types/index.d.ts +1 -1
  19. package/dist/cjs/types/index.js +2 -2
  20. package/dist/cjs/types/index.js.map +2 -2
  21. package/dist/esm/components/XAdkChatbot/components/ThinkRender/index.d.ts +2 -2
  22. package/dist/esm/components/XAdkChatbot/components/ThinkRender/index.js +28 -18
  23. package/dist/esm/components/XAdkChatbot/components/ThinkRender/index.js.map +1 -1
  24. package/dist/esm/components/XAdkChatbot/index.js +2 -2
  25. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  26. package/dist/esm/components/XAdkThoughtChain/index.d.ts +4 -0
  27. package/dist/esm/components/{XAiThoughtChain → XAdkThoughtChain}/index.js +26 -21
  28. package/dist/esm/components/XAdkThoughtChain/index.js.map +1 -0
  29. package/dist/{cjs/components/XAiThoughtChain → esm/components/XAdkThoughtChain}/styles.d.ts +1 -0
  30. package/dist/esm/components/XAdkThoughtChain/styles.js +42 -0
  31. package/dist/esm/components/XAdkThoughtChain/styles.js.map +1 -0
  32. package/dist/esm/index.d.ts +3 -3
  33. package/dist/esm/index.js +2 -2
  34. package/dist/esm/index.js.map +1 -1
  35. package/dist/esm/types/{XAiThoughtChain.d.ts → XAdkThoughtChain.d.ts} +5 -3
  36. package/dist/esm/types/XAdkThoughtChain.js +2 -0
  37. package/dist/esm/types/XAdkThoughtChain.js.map +1 -0
  38. package/dist/esm/types/index.d.ts +1 -1
  39. package/dist/esm/types/index.js +1 -1
  40. package/dist/esm/types/index.js.map +1 -1
  41. package/dist/umd/chat-sdk.min.js +1 -1
  42. package/package.json +2 -2
  43. package/dist/cjs/components/XAiThoughtChain/index.d.ts +0 -4
  44. package/dist/cjs/components/XAiThoughtChain/index.js.map +0 -7
  45. package/dist/cjs/components/XAiThoughtChain/styles.js.map +0 -7
  46. package/dist/cjs/types/XAiThoughtChain.js.map +0 -7
  47. package/dist/esm/components/XAiThoughtChain/index.d.ts +0 -4
  48. package/dist/esm/components/XAiThoughtChain/index.js.map +0 -1
  49. package/dist/esm/components/XAiThoughtChain/styles.js +0 -40
  50. package/dist/esm/components/XAiThoughtChain/styles.js.map +0 -1
  51. package/dist/esm/types/XAiThoughtChain.js +0 -2
  52. 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 = ({ msg, loading }) => {
29
- const [expand, setExpand] = (0, import_react.useState)(false);
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 (loading) {
32
- setExpand(true);
33
- } else {
34
- setExpand(false);
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
- }, [loading]);
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: expand,
43
- onExpand: () => setExpand((v) => !v),
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 loading?: boolean;\n}\n\nconst ThinkRender: React.FC<ThinkRenderProps> = ({ msg, loading }) => {\n const [expand, setExpand] = useState(false);\n useEffect(() => {\n if (loading) {\n setExpand(true);\n } else {\n setExpand(false);\n }\n }, [loading]);\n\n return (\n <Think\n title={loading ? '思考中...' : '深度思考'}\n loading={loading}\n expanded={expand}\n onExpand={() => setExpand((v) => !v)}\n >\n {msg.text}\n </Think>\n );\n};\n\nexport default ThinkRender;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAsB;AACtB,mBAA2C;AAmBvC;AAXJ,IAAM,cAA0C,CAAC,EAAE,KAAK,QAAQ,MAAM;AACpE,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAC1C,8BAAU,MAAM;AACd,QAAI,SAAS;AACX,gBAAU,IAAI;AAAA,IAChB,OAAO;AACL,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,UAAU,WAAW;AAAA,MAC5B;AAAA,MACA,UAAU;AAAA,MACV,UAAU,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;AAAA,MAElC,cAAI;AAAA;AAAA,EACP;AAEJ;AAEA,IAAO,sBAAQ;",
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 import_XAiThoughtChain = __toESM(require("../XAiThoughtChain"));
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)(import_MarkdownRender.default, { text: msg.text, onFileClick }, `${msg.id}-${i}`);
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
- import_XAiThoughtChain.default,
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": "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",
6
- "names": ["MarkdownRender", "FunctionCallRender", "XAiThoughtChain", "FileGallery", "copy", "antdMessage", "clsx"]
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
  }
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ import { XAdkThoughtChainProps } from "../../types";
3
+ declare const XAdkThoughtChain: React.FC<XAdkThoughtChainProps>;
4
+ export default XAdkThoughtChain;
@@ -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/XAiThoughtChain/index.tsx
30
- var XAiThoughtChain_exports = {};
31
- __export(XAiThoughtChain_exports, {
32
- default: () => XAiThoughtChain_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(XAiThoughtChain_exports);
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 XAiThoughtChain = ({
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.jsxs)("div", { className: styles.thoughtHeader, onClick: () => setIsOpen(!isOpen), children: [
130
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.headerLeft, children: [
131
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: `${styles.caret} ${isOpen ? "open" : ""}`, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.CaretRightOutlined, {}) }),
132
- /* @__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" } }) }),
133
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: styles.headerTitle, children: loading ? "深度思考与执行中..." : title })
134
- ] }),
135
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.headerRight, children: items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: styles.stepCount, children: [
136
- items.length,
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)(TimelineTextItem, { item }, item.key || i) : /* @__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 XAiThoughtChain_default = XAiThoughtChain;
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
+ }
@@ -24,6 +24,7 @@ export declare const useStyles: () => {
24
24
  arrowIcon: string;
25
25
  stepContent: string;
26
26
  statusInfo: string;
27
+ blink: string;
27
28
  } & {
28
29
  w: (width: string | number) => string;
29
30
  h: (height: string | number) => string;
@@ -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/XAiThoughtChain/styles.tsx
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: #999;
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: #666;
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: #bbb;
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
- border-top: 1px solid #eee;
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: #8c8c8c;
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: 16px;
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: #595959;
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: #333;
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: #595959;
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: #bfbfbf;
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
+ }
@@ -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 XAiThoughtChain from "./components/XAiThoughtChain";
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, XAiThoughtChain, useADKChat, };
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 { XAiThoughtChainProps, ThoughtChainItemType, } from "./types/XAiThoughtChain";
25
+ export type { XAdkThoughtChainProps, ThoughtChainItemType, } from "./types/XAdkThoughtChain";