@ai-group/chat-sdk 3.7.1-alpha4 → 3.7.1-alpha5

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 (32) hide show
  1. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +2 -0
  2. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +27 -7
  3. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +2 -2
  4. package/dist/cjs/components/XAdkChatbot/index.js +8 -1
  5. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  6. package/dist/cjs/presets/xgroup/preset.js +2 -1
  7. package/dist/cjs/presets/xgroup/preset.js.map +2 -2
  8. package/dist/cjs/presets/xgroup/strategies.d.ts +5 -1
  9. package/dist/cjs/presets/xgroup/strategies.js +16 -1
  10. package/dist/cjs/presets/xgroup/strategies.js.map +3 -3
  11. package/dist/cjs/types/ChatStrategies.d.ts +5 -0
  12. package/dist/cjs/types/ChatStrategies.js.map +1 -1
  13. package/dist/cjs/utils/markdownResource.d.ts +8 -4
  14. package/dist/cjs/utils/markdownResource.js +20 -14
  15. package/dist/cjs/utils/markdownResource.js.map +2 -2
  16. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +2 -0
  17. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +11 -4
  18. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
  19. package/dist/esm/components/XAdkChatbot/index.js +7 -2
  20. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  21. package/dist/esm/presets/xgroup/preset.js +3 -2
  22. package/dist/esm/presets/xgroup/preset.js.map +1 -1
  23. package/dist/esm/presets/xgroup/strategies.d.ts +5 -1
  24. package/dist/esm/presets/xgroup/strategies.js +12 -1
  25. package/dist/esm/presets/xgroup/strategies.js.map +1 -1
  26. package/dist/esm/types/ChatStrategies.d.ts +5 -0
  27. package/dist/esm/types/ChatStrategies.js.map +1 -1
  28. package/dist/esm/utils/markdownResource.d.ts +8 -4
  29. package/dist/esm/utils/markdownResource.js +10 -7
  30. package/dist/esm/utils/markdownResource.js.map +1 -1
  31. package/dist/umd/chat-sdk.min.js +1 -1
  32. package/package.json +1 -1
@@ -30,19 +30,18 @@ var MARKDOWN_RESOURCE_LINK_SCHEMES = [
30
30
  "plugin",
31
31
  "tool",
32
32
  "knowledge",
33
- "kb",
34
33
  "agent",
35
34
  "model"
36
35
  ];
37
- var RESOURCE_LINK_SCHEME_SET = new Set(MARKDOWN_RESOURCE_LINK_SCHEMES);
38
- var RESOURCE_LINK_REGEX = /\[([^\]\n]+)\]\(((?:skill|plugin|tool|knowledge|kb|agent|model):\/{2,3}[^)\s]+)\)/gi;
36
+ var getResourceLinkSchemeSet = (options) => new Set((options == null ? void 0 : options.schemes) || MARKDOWN_RESOURCE_LINK_SCHEMES);
37
+ var RESOURCE_LINK_REGEX = /\[([^\]\n]+)\]\(([a-z][a-z0-9+.-]*:\/{2,3}[^)\s]+)\)/gi;
39
38
  var stripTriggerPrefix = (label) => label.replace(/^[@/#$]+/, "");
40
- var parseMarkdownResourceHref = (href, label = "") => {
39
+ var parseMarkdownResourceHref = (href, label = "", options) => {
41
40
  const match = href.match(/^([a-z][a-z0-9+.-]*):\/{2,3}(.+)$/i);
42
41
  if (!match)
43
42
  return null;
44
43
  const type = match[1].toLowerCase();
45
- if (!RESOURCE_LINK_SCHEME_SET.has(type))
44
+ if (!getResourceLinkSchemeSet(options).has(type))
46
45
  return null;
47
46
  return {
48
47
  href,
@@ -51,18 +50,25 @@ var parseMarkdownResourceHref = (href, label = "") => {
51
50
  value: decodeURIComponent(match[2])
52
51
  };
53
52
  };
54
- var replaceMarkdownResourceLinks = (text, replacer) => {
53
+ var replaceMarkdownResourceLinks = (text, replacer, options) => {
55
54
  if (!text)
56
55
  return "";
57
- return text.replace(RESOURCE_LINK_REGEX, (source, label, href) => {
58
- const link = parseMarkdownResourceHref(href, label);
59
- return link ? replacer(link) : source;
60
- });
56
+ return text.replace(
57
+ RESOURCE_LINK_REGEX,
58
+ (source, label, href) => {
59
+ const link = parseMarkdownResourceHref(href, label, options);
60
+ return link ? replacer(link) : source;
61
+ }
62
+ );
61
63
  };
62
- var formatMarkdownResourceLinksAsText = (text, options) => replaceMarkdownResourceLinks(text, (link) => {
63
- const label = link.label || link.value;
64
- return (options == null ? void 0 : options.stripTrigger) === false ? label : stripTriggerPrefix(label);
65
- });
64
+ var formatMarkdownResourceLinksAsText = (text, options) => replaceMarkdownResourceLinks(
65
+ text,
66
+ (link) => {
67
+ const label = link.label || link.value;
68
+ return (options == null ? void 0 : options.stripTrigger) === false ? label : stripTriggerPrefix(label);
69
+ },
70
+ options
71
+ );
66
72
  // Annotate the CommonJS export names for ESM import in node:
67
73
  0 && (module.exports = {
68
74
  MARKDOWN_RESOURCE_LINK_SCHEMES,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/utils/markdownResource.ts"],
4
- "sourcesContent": ["import type { MarkdownResourceLink } from \"@/types\";\n\nexport const MARKDOWN_RESOURCE_LINK_SCHEMES = [\n \"skill\",\n \"plugin\",\n \"tool\",\n \"knowledge\",\n \"kb\",\n \"agent\",\n \"model\",\n] as const;\n\nconst RESOURCE_LINK_SCHEME_SET = new Set<string>(MARKDOWN_RESOURCE_LINK_SCHEMES);\nconst RESOURCE_LINK_REGEX =\n /\\[([^\\]\\n]+)\\]\\(((?:skill|plugin|tool|knowledge|kb|agent|model):\\/{2,3}[^)\\s]+)\\)/gi;\n\nconst stripTriggerPrefix = (label: string) => label.replace(/^[@/#$]+/, \"\");\n\nexport const parseMarkdownResourceHref = (\n href: string,\n label = \"\",\n): MarkdownResourceLink | null => {\n const match = href.match(/^([a-z][a-z0-9+.-]*):\\/{2,3}(.+)$/i);\n if (!match) return null;\n\n const type = match[1].toLowerCase();\n if (!RESOURCE_LINK_SCHEME_SET.has(type)) return null;\n\n return {\n href,\n label: label || href,\n type,\n value: decodeURIComponent(match[2]),\n };\n};\n\nexport const replaceMarkdownResourceLinks = (\n text: string,\n replacer: (link: MarkdownResourceLink) => string,\n) => {\n if (!text) return \"\";\n return text.replace(RESOURCE_LINK_REGEX, (source, label: string, href: string) => {\n const link = parseMarkdownResourceHref(href, label);\n return link ? replacer(link) : source;\n });\n};\n\nexport const formatMarkdownResourceLinksAsText = (\n text: string,\n options?: { stripTrigger?: boolean },\n) =>\n replaceMarkdownResourceLinks(text, (link) => {\n const label = link.label || link.value;\n return options?.stripTrigger === false ? label : stripTriggerPrefix(label);\n });\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,iCAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,2BAA2B,IAAI,IAAY,8BAA8B;AAC/E,IAAM,sBACJ;AAEF,IAAM,qBAAqB,CAAC,UAAkB,MAAM,QAAQ,YAAY,EAAE;AAEnE,IAAM,4BAA4B,CACvC,MACA,QAAQ,OACwB;AAChC,QAAM,QAAQ,KAAK,MAAM,oCAAoC;AAC7D,MAAI,CAAC;AAAO,WAAO;AAEnB,QAAM,OAAO,MAAM,CAAC,EAAE,YAAY;AAClC,MAAI,CAAC,yBAAyB,IAAI,IAAI;AAAG,WAAO;AAEhD,SAAO;AAAA,IACL;AAAA,IACA,OAAO,SAAS;AAAA,IAChB;AAAA,IACA,OAAO,mBAAmB,MAAM,CAAC,CAAC;AAAA,EACpC;AACF;AAEO,IAAM,+BAA+B,CAC1C,MACA,aACG;AACH,MAAI,CAAC;AAAM,WAAO;AAClB,SAAO,KAAK,QAAQ,qBAAqB,CAAC,QAAQ,OAAe,SAAiB;AAChF,UAAM,OAAO,0BAA0B,MAAM,KAAK;AAClD,WAAO,OAAO,SAAS,IAAI,IAAI;AAAA,EACjC,CAAC;AACH;AAEO,IAAM,oCAAoC,CAC/C,MACA,YAEA,6BAA6B,MAAM,CAAC,SAAS;AAC3C,QAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,UAAO,mCAAS,kBAAiB,QAAQ,QAAQ,mBAAmB,KAAK;AAC3E,CAAC;",
4
+ "sourcesContent": ["import type { MarkdownResourceLink } from \"@/types\";\n\nexport const MARKDOWN_RESOURCE_LINK_SCHEMES = [\n \"skill\",\n \"plugin\",\n \"tool\",\n \"knowledge\",\n \"agent\",\n \"model\",\n] as const;\n\nexport type MarkdownResourceLinkScheme =\n | (typeof MARKDOWN_RESOURCE_LINK_SCHEMES)[number]\n | (string & {});\n\nexport interface MarkdownResourceLinkOptions {\n schemes?: readonly MarkdownResourceLinkScheme[];\n}\n\nconst getResourceLinkSchemeSet = (options?: MarkdownResourceLinkOptions) =>\n new Set<string>(options?.schemes || MARKDOWN_RESOURCE_LINK_SCHEMES);\n\nconst RESOURCE_LINK_REGEX =\n /\\[([^\\]\\n]+)\\]\\(([a-z][a-z0-9+.-]*:\\/{2,3}[^)\\s]+)\\)/gi;\n\nconst stripTriggerPrefix = (label: string) => label.replace(/^[@/#$]+/, \"\");\n\nexport const parseMarkdownResourceHref = (\n href: string,\n label = \"\",\n options?: MarkdownResourceLinkOptions,\n): MarkdownResourceLink | null => {\n const match = href.match(/^([a-z][a-z0-9+.-]*):\\/{2,3}(.+)$/i);\n if (!match) return null;\n\n const type = match[1].toLowerCase();\n if (!getResourceLinkSchemeSet(options).has(type)) return null;\n\n return {\n href,\n label: label || href,\n type,\n value: decodeURIComponent(match[2]),\n };\n};\n\nexport const replaceMarkdownResourceLinks = (\n text: string,\n replacer: (link: MarkdownResourceLink) => string,\n options?: MarkdownResourceLinkOptions,\n) => {\n if (!text) return \"\";\n return text.replace(\n RESOURCE_LINK_REGEX,\n (source, label: string, href: string) => {\n const link = parseMarkdownResourceHref(href, label, options);\n return link ? replacer(link) : source;\n },\n );\n};\n\nexport const formatMarkdownResourceLinksAsText = (\n text: string,\n options?: MarkdownResourceLinkOptions & { stripTrigger?: boolean },\n) =>\n replaceMarkdownResourceLinks(\n text,\n (link) => {\n const label = link.label || link.value;\n return options?.stripTrigger === false\n ? label\n : stripTriggerPrefix(label);\n },\n options,\n );\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,iCAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUA,IAAM,2BAA2B,CAAC,YAChC,IAAI,KAAY,mCAAS,YAAW,8BAA8B;AAEpE,IAAM,sBACJ;AAEF,IAAM,qBAAqB,CAAC,UAAkB,MAAM,QAAQ,YAAY,EAAE;AAEnE,IAAM,4BAA4B,CACvC,MACA,QAAQ,IACR,YACgC;AAChC,QAAM,QAAQ,KAAK,MAAM,oCAAoC;AAC7D,MAAI,CAAC;AAAO,WAAO;AAEnB,QAAM,OAAO,MAAM,CAAC,EAAE,YAAY;AAClC,MAAI,CAAC,yBAAyB,OAAO,EAAE,IAAI,IAAI;AAAG,WAAO;AAEzD,SAAO;AAAA,IACL;AAAA,IACA,OAAO,SAAS;AAAA,IAChB;AAAA,IACA,OAAO,mBAAmB,MAAM,CAAC,CAAC;AAAA,EACpC;AACF;AAEO,IAAM,+BAA+B,CAC1C,MACA,UACA,YACG;AACH,MAAI,CAAC;AAAM,WAAO;AAClB,SAAO,KAAK;AAAA,IACV;AAAA,IACA,CAAC,QAAQ,OAAe,SAAiB;AACvC,YAAM,OAAO,0BAA0B,MAAM,OAAO,OAAO;AAC3D,aAAO,OAAO,SAAS,IAAI,IAAI;AAAA,IACjC;AAAA,EACF;AACF;AAEO,IAAM,oCAAoC,CAC/C,MACA,YAEA;AAAA,EACE;AAAA,EACA,CAAC,SAAS;AACR,UAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,YAAO,mCAAS,kBAAiB,QAC7B,QACA,mBAAmB,KAAK;AAAA,EAC9B;AAAA,EACA;AACF;",
6
6
  "names": []
7
7
  }
@@ -5,6 +5,8 @@ export interface MarkdownRenderProps {
5
5
  text: string;
6
6
  /** 紧凑布局,适合用户消息气泡等内联场景 */
7
7
  compact?: boolean;
8
+ /** Markdown 资源链接协议白名单,未命中的协议保持普通 Markdown 行为 */
9
+ resourceLinkSchemes?: readonly string[];
8
10
  /** 点击 Markdown 中识别到的文件链接的回调 */
9
11
  onFileClick?: (file: FileItem) => void;
10
12
  /** 点击 Markdown 中识别到的资源链接标签,如 [@skill](skill://xxx) */
@@ -118,6 +118,7 @@ var MarkdownRender = function MarkdownRender(_ref) {
118
118
  var text = _ref.text,
119
119
  _ref$compact = _ref.compact,
120
120
  compact = _ref$compact === void 0 ? false : _ref$compact,
121
+ resourceLinkSchemes = _ref.resourceLinkSchemes,
121
122
  onFileClick = _ref.onFileClick,
122
123
  onResourceLinkClick = _ref.onResourceLinkClick,
123
124
  renderResourceLink = _ref.renderResourceLink;
@@ -125,11 +126,15 @@ var MarkdownRender = function MarkdownRender(_ref) {
125
126
  var markdown = replaceMarkdownResourceLinks(text, function (link) {
126
127
  // 非 http(s) 协议容易被 Markdown 引擎清洗成普通文本,先转为内部自定义标签再交给 XMarkdown。
127
128
  return "<resource-link href=\"".concat(escapeAttr(link.href), "\" label=\"").concat(escapeAttr(link.label), "\" type=\"").concat(escapeAttr(link.type), "\" value=\"").concat(escapeAttr(link.value), "\">").concat(escapeHtml(link.label), "</resource-link>");
129
+ }, {
130
+ schemes: resourceLinkSchemes
128
131
  }).replaceAll(/\/\*\s*PLANNING\s*\*\//g, '<tag type="planning"></tag>').replaceAll(/\/\*\s*REPLANNING\s*\*\//g, '<tag type="replanning"></tag>').replaceAll(/\/\*\s*REASONING\s*\*\//g, '<tag type="reasoning"></tag>').replaceAll(/\/\*\s*ACTION\s*\*\//g, '<tag type="action"></tag>').replaceAll(/\/\*\s*FINAL_ANSWER\s*\*\//g, '<tag type="final_answer"></tag>');
129
132
  var ResourceLinkComponent = React.useCallback(function (props) {
130
133
  var href = String(props.href || "");
131
134
  var linkText = String(props.label || "") || extractText(props.children);
132
- var resourceLink = parseMarkdownResourceHref(href, linkText);
135
+ var resourceLink = parseMarkdownResourceHref(href, linkText, {
136
+ schemes: resourceLinkSchemes
137
+ });
133
138
  if (!resourceLink) return /*#__PURE__*/_jsx(_Fragment, {
134
139
  children: props.children
135
140
  });
@@ -144,14 +149,16 @@ var MarkdownRender = function MarkdownRender(_ref) {
144
149
  "aria-label": resourceLink.label,
145
150
  children: resourceLink.label
146
151
  });
147
- }, [onResourceLinkClick, renderResourceLink, styles.resourceLink]);
152
+ }, [onResourceLinkClick, renderResourceLink, resourceLinkSchemes, styles.resourceLink]);
148
153
 
149
154
  // 自定义 a 标签渲染:资源协议渲染为标签,文件链接渲染为 FileGallery,其余保持普通链接。
150
155
  var LinkComponent = React.useCallback(function (props) {
151
156
  var href = String(props.href || "");
152
157
  // 用递归提取纯文本,避免 children 是 React node 时 String() 得到 "[object Object]"
153
158
  var linkText = extractText(props.children);
154
- var resourceLink = parseMarkdownResourceHref(href, linkText);
159
+ var resourceLink = parseMarkdownResourceHref(href, linkText, {
160
+ schemes: resourceLinkSchemes
161
+ });
155
162
  if (resourceLink) {
156
163
  var customNode = renderResourceLink === null || renderResourceLink === void 0 ? void 0 : renderResourceLink(resourceLink);
157
164
  if (customNode) return customNode;
@@ -190,7 +197,7 @@ var MarkdownRender = function MarkdownRender(_ref) {
190
197
  rel: "noopener noreferrer",
191
198
  children: props.children
192
199
  });
193
- }, [onFileClick, onResourceLinkClick, renderResourceLink, styles.resourceLink]);
200
+ }, [onFileClick, onResourceLinkClick, renderResourceLink, resourceLinkSchemes, styles.resourceLink]);
194
201
  return /*#__PURE__*/_jsx("div", {
195
202
  className: "".concat(styles.markdownWrapper).concat(compact ? " ".concat(styles.markdownWrapperCompact) : ""),
196
203
  children: /*#__PURE__*/_jsx("div", {
@@ -1 +1 @@
1
- {"version":3,"names":["React","XMarkdown","CodeHighlighter","Flex","Latex","useStyles","BarsOutlined","BulbOutlined","ThunderboltOutlined","CheckCircleOutlined","FileGallery","parseMarkdownResourceHref","replaceMarkdownResourceLinks","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","FILE_EXT_REGEX","MIME_MAP","pdf","doc","docx","xls","xlsx","csv","ppt","pptx","zip","rar","txt","md","json","xml","mp3","wav","m4a","aac","ogg","flac","mp4","mov","webm","mkv","avi","png","jpg","jpeg","gif","webp","bmp","svg","extractExt","str","match","toLowerCase","escapeHtml","value","replace","escapeAttr","CodeComponent","props","_className$match","className","children","lang","ThinkComponent","memo","type","titleMap","planning","replanning","reasoning","action","final_answer","iconMap","align","gap","style","color","margin","extractText","String","Array","isArray","map","join","isValidElement","MarkdownRender","_ref","text","_ref$compact","compact","onFileClick","onResourceLinkClick","renderResourceLink","styles","markdown","link","concat","href","label","replaceAll","ResourceLinkComponent","useCallback","linkText","resourceLink","customNode","onClick","LinkComponent","ext","mimeType","fileItem","displayName","fileUri","file","undefined","target","rel","markdownWrapper","markdownWrapperCompact","markdownHost","markdownHostCompact","content","paragraphTag","config","extensions","components","tag","code","a","streaming","enableAnimation","animationConfig","fadeDuration"],"sources":["../../../../../../src/components/XAdkChatbot/components/MarkdownRender/index.tsx"],"sourcesContent":["import React from \"react\";\nimport XMarkdown, { type ComponentProps } from \"@ant-design/x-markdown\";\nimport \"@ant-design/x-markdown/themes/light.css\";\nimport { CodeHighlighter } from \"@ant-design/x\";\nimport { Flex } from \"antd\";\nimport Latex from \"@ant-design/x-markdown/plugins/Latex\";\nimport { useStyles } from \"./styles\";\nimport {\n BarsOutlined,\n BulbOutlined,\n ThunderboltOutlined,\n CheckCircleOutlined,\n} from \"@ant-design/icons\";\nimport FileGallery from \"@/components/FileGallery\";\nimport type {\n FileItem,\n MarkdownResourceLink,\n RenderMarkdownResourceLink,\n} from \"@/types\";\nimport {\n parseMarkdownResourceHref,\n replaceMarkdownResourceLinks,\n} from \"@/utils/markdownResource\";\n\n// 支持识别的文件扩展名\nconst FILE_EXT_REGEX =\n /\\.(pdf|doc|docx|xls|xlsx|csv|ppt|pptx|zip|rar|7z|txt|md|json|xml|mp3|wav|m4a|aac|ogg|flac|mp4|mov|webm|mkv|avi|png|jpg|jpeg|gif|webp|bmp|svg)(\\?.*)?$/i;\n\nconst MIME_MAP: Record<string, string> = {\n pdf: \"application/pdf\",\n doc: \"application/msword\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n xls: \"application/vnd.ms-excel\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n csv: \"text/csv\",\n ppt: \"application/vnd.ms-powerpoint\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n zip: \"application/zip\",\n rar: \"application/x-rar-compressed\",\n \"7z\": \"application/x-7z-compressed\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n json: \"application/json\",\n xml: \"application/xml\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n m4a: \"audio/mp4\",\n aac: \"audio/aac\",\n ogg: \"audio/ogg\",\n flac: \"audio/flac\",\n mp4: \"video/mp4\",\n mov: \"video/quicktime\",\n webm: \"video/webm\",\n mkv: \"video/x-matroska\",\n avi: \"video/x-msvideo\",\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n bmp: \"image/bmp\",\n svg: \"image/svg+xml\",\n};\n\n/**\n * 从字符串中提取文件扩展名(小写,不含点和查询参数)\n */\nconst extractExt = (str: string): string => {\n const match = str.match(FILE_EXT_REGEX);\n if (!match) return \"\";\n return match[1].toLowerCase();\n};\n\nconst escapeHtml = (value: string) =>\n value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n\nconst escapeAttr = (value: string) =>\n escapeHtml(value).replace(/\"/g, \"&quot;\").replace(/'/g, \"&#39;\");\n\nconst CodeComponent: React.FC<ComponentProps> = (props) => {\n const { className, children } = props;\n const lang = className?.match(/language-(\\S+)/)?.[1] || \"\";\n\n if (typeof children !== \"string\") return null;\n return <CodeHighlighter lang={lang}>{children}</CodeHighlighter>;\n};\n\nexport interface MarkdownRenderProps {\n text: string;\n /** 紧凑布局,适合用户消息气泡等内联场景 */\n compact?: boolean;\n /** 点击 Markdown 中识别到的文件链接的回调 */\n onFileClick?: (file: FileItem) => void;\n /** 点击 Markdown 中识别到的资源链接标签,如 [@skill](skill://xxx) */\n onResourceLinkClick?: (link: MarkdownResourceLink) => void;\n /** 自定义资源链接渲染,返回 null 时使用默认标签样式 */\n renderResourceLink?: RenderMarkdownResourceLink;\n}\n\nconst ThinkComponent = React.memo((props: ComponentProps) => {\n const type = (props.type || \"\") as string;\n const titleMap: Record<string, string> = {\n planning: \"规划\",\n replanning: \"重新规划\",\n reasoning: \"推理\",\n action: \"行动\",\n final_answer: \"最终答案\",\n };\n const iconMap = {\n planning: <BarsOutlined />,\n replanning: <BarsOutlined />,\n reasoning: <BulbOutlined />,\n action: <ThunderboltOutlined />,\n final_answer: <CheckCircleOutlined />,\n };\n\n return (\n <Flex align=\"center\" gap={8} style={{ color: \"#888\", margin: \"4px 0\" }}>\n {type in titleMap && iconMap[type as keyof typeof iconMap]}\n {titleMap[type] && <span>{titleMap[type]}</span>}\n </Flex>\n );\n});\n\n/**\n * 递归从 React children 中提取纯文本\n */\nconst extractText = (children: React.ReactNode): string => {\n if (typeof children === \"string\") return children;\n if (typeof children === \"number\") return String(children);\n if (Array.isArray(children)) return children.map(extractText).join(\"\");\n if (React.isValidElement(children))\n return extractText((children.props as any).children);\n return \"\";\n};\n\nconst MarkdownRender: React.FC<MarkdownRenderProps> = ({\n text,\n compact = false,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n}) => {\n const styles = useStyles();\n const markdown = replaceMarkdownResourceLinks(text, (link) => {\n // 非 http(s) 协议容易被 Markdown 引擎清洗成普通文本,先转为内部自定义标签再交给 XMarkdown。\n return `<resource-link href=\"${escapeAttr(link.href)}\" label=\"${escapeAttr(link.label)}\" type=\"${escapeAttr(link.type)}\" value=\"${escapeAttr(link.value)}\">${escapeHtml(link.label)}</resource-link>`;\n })\n .replaceAll(/\\/\\*\\s*PLANNING\\s*\\*\\//g, '<tag type=\"planning\"></tag>')\n .replaceAll(/\\/\\*\\s*REPLANNING\\s*\\*\\//g, '<tag type=\"replanning\"></tag>')\n .replaceAll(/\\/\\*\\s*REASONING\\s*\\*\\//g, '<tag type=\"reasoning\"></tag>')\n .replaceAll(/\\/\\*\\s*ACTION\\s*\\*\\//g, '<tag type=\"action\"></tag>')\n .replaceAll(\n /\\/\\*\\s*FINAL_ANSWER\\s*\\*\\//g,\n '<tag type=\"final_answer\"></tag>',\n );\n\n const ResourceLinkComponent = React.useCallback(\n (props: ComponentProps) => {\n const href = String((props.href as string) || \"\");\n const linkText =\n String((props.label as string) || \"\") || extractText(props.children);\n const resourceLink = parseMarkdownResourceHref(href, linkText);\n if (!resourceLink) return <>{props.children as React.ReactNode}</>;\n\n const customNode = renderResourceLink?.(resourceLink);\n if (customNode) return customNode;\n\n return (\n <button\n type=\"button\"\n className={styles.resourceLink}\n onClick={() => onResourceLinkClick?.(resourceLink)}\n aria-label={resourceLink.label}\n >\n {resourceLink.label}\n </button>\n );\n },\n [onResourceLinkClick, renderResourceLink, styles.resourceLink],\n );\n\n // 自定义 a 标签渲染:资源协议渲染为标签,文件链接渲染为 FileGallery,其余保持普通链接。\n const LinkComponent = React.useCallback(\n (props: ComponentProps) => {\n const href = String((props.href as string) || \"\");\n // 用递归提取纯文本,避免 children 是 React node 时 String() 得到 \"[object Object]\"\n const linkText = extractText(props.children);\n const resourceLink = parseMarkdownResourceHref(href, linkText);\n\n if (resourceLink) {\n const customNode = renderResourceLink?.(resourceLink);\n if (customNode) return customNode;\n\n return (\n <button\n type=\"button\"\n className={styles.resourceLink}\n onClick={() => onResourceLinkClick?.(resourceLink)}\n aria-label={resourceLink.label}\n >\n {resourceLink.label}\n </button>\n );\n }\n\n // 先识别 name(链接文字),再识别 url(href)\n const ext = extractExt(linkText) || extractExt(href);\n\n if (ext) {\n // href 为空说明链接还在流式截断中,不渲染,避免显示出错误文字\n if (!href) return null;\n const mimeType = MIME_MAP[ext] || \"\";\n const fileItem: FileItem = {\n displayName: linkText || href,\n mimeType,\n fileUri: href,\n };\n return (\n <FileGallery\n file={fileItem}\n onClick={onFileClick ? () => onFileClick(fileItem) : undefined}\n />\n );\n }\n\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {props.children as React.ReactNode}\n </a>\n );\n },\n [onFileClick, onResourceLinkClick, renderResourceLink, styles.resourceLink],\n );\n\n return (\n <div\n className={`${styles.markdownWrapper}${compact ? ` ${styles.markdownWrapperCompact}` : \"\"}`}\n >\n <div\n className={`${styles.markdownHost}${compact ? ` ${styles.markdownHostCompact}` : \"\"}`}\n >\n <XMarkdown\n content={markdown}\n className=\"x-markdown-light\"\n paragraphTag=\"div\"\n config={{\n extensions: Latex(),\n }}\n components={{\n tag: ThinkComponent,\n \"resource-link\": ResourceLinkComponent,\n code: CodeComponent,\n a: LinkComponent,\n }}\n streaming={{\n enableAnimation: true,\n animationConfig: {\n fadeDuration: 400,\n },\n }}\n />\n </div>\n </div>\n );\n};\n\nexport default MarkdownRender;\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","XMarkdown","CodeHighlighter","Flex","Latex","useStyles","BarsOutlined","BulbOutlined","ThunderboltOutlined","CheckCircleOutlined","FileGallery","parseMarkdownResourceHref","replaceMarkdownResourceLinks","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","FILE_EXT_REGEX","MIME_MAP","pdf","doc","docx","xls","xlsx","csv","ppt","pptx","zip","rar","txt","md","json","xml","mp3","wav","m4a","aac","ogg","flac","mp4","mov","webm","mkv","avi","png","jpg","jpeg","gif","webp","bmp","svg","extractExt","str","match","toLowerCase","escapeHtml","value","replace","escapeAttr","CodeComponent","props","_className$match","className","children","lang","ThinkComponent","memo","type","titleMap","planning","replanning","reasoning","action","final_answer","iconMap","align","gap","style","color","margin","extractText","String","Array","isArray","map","join","isValidElement","MarkdownRender","_ref","text","_ref$compact","compact","resourceLinkSchemes","onFileClick","onResourceLinkClick","renderResourceLink","styles","markdown","link","concat","href","label","schemes","replaceAll","ResourceLinkComponent","useCallback","linkText","resourceLink","customNode","onClick","LinkComponent","ext","mimeType","fileItem","displayName","fileUri","file","undefined","target","rel","markdownWrapper","markdownWrapperCompact","markdownHost","markdownHostCompact","content","paragraphTag","config","extensions","components","tag","code","a","streaming","enableAnimation","animationConfig","fadeDuration"],"sources":["../../../../../../src/components/XAdkChatbot/components/MarkdownRender/index.tsx"],"sourcesContent":["import React from \"react\";\nimport XMarkdown, { type ComponentProps } from \"@ant-design/x-markdown\";\nimport \"@ant-design/x-markdown/themes/light.css\";\nimport { CodeHighlighter } from \"@ant-design/x\";\nimport { Flex } from \"antd\";\nimport Latex from \"@ant-design/x-markdown/plugins/Latex\";\nimport { useStyles } from \"./styles\";\nimport {\n BarsOutlined,\n BulbOutlined,\n ThunderboltOutlined,\n CheckCircleOutlined,\n} from \"@ant-design/icons\";\nimport FileGallery from \"@/components/FileGallery\";\nimport type {\n FileItem,\n MarkdownResourceLink,\n RenderMarkdownResourceLink,\n} from \"@/types\";\nimport {\n parseMarkdownResourceHref,\n replaceMarkdownResourceLinks,\n} from \"@/utils/markdownResource\";\n\n// 支持识别的文件扩展名\nconst FILE_EXT_REGEX =\n /\\.(pdf|doc|docx|xls|xlsx|csv|ppt|pptx|zip|rar|7z|txt|md|json|xml|mp3|wav|m4a|aac|ogg|flac|mp4|mov|webm|mkv|avi|png|jpg|jpeg|gif|webp|bmp|svg)(\\?.*)?$/i;\n\nconst MIME_MAP: Record<string, string> = {\n pdf: \"application/pdf\",\n doc: \"application/msword\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n xls: \"application/vnd.ms-excel\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n csv: \"text/csv\",\n ppt: \"application/vnd.ms-powerpoint\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n zip: \"application/zip\",\n rar: \"application/x-rar-compressed\",\n \"7z\": \"application/x-7z-compressed\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n json: \"application/json\",\n xml: \"application/xml\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n m4a: \"audio/mp4\",\n aac: \"audio/aac\",\n ogg: \"audio/ogg\",\n flac: \"audio/flac\",\n mp4: \"video/mp4\",\n mov: \"video/quicktime\",\n webm: \"video/webm\",\n mkv: \"video/x-matroska\",\n avi: \"video/x-msvideo\",\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n bmp: \"image/bmp\",\n svg: \"image/svg+xml\",\n};\n\n/**\n * 从字符串中提取文件扩展名(小写,不含点和查询参数)\n */\nconst extractExt = (str: string): string => {\n const match = str.match(FILE_EXT_REGEX);\n if (!match) return \"\";\n return match[1].toLowerCase();\n};\n\nconst escapeHtml = (value: string) =>\n value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n\nconst escapeAttr = (value: string) =>\n escapeHtml(value).replace(/\"/g, \"&quot;\").replace(/'/g, \"&#39;\");\n\nconst CodeComponent: React.FC<ComponentProps> = (props) => {\n const { className, children } = props;\n const lang = className?.match(/language-(\\S+)/)?.[1] || \"\";\n\n if (typeof children !== \"string\") return null;\n return <CodeHighlighter lang={lang}>{children}</CodeHighlighter>;\n};\n\nexport interface MarkdownRenderProps {\n text: string;\n /** 紧凑布局,适合用户消息气泡等内联场景 */\n compact?: boolean;\n /** Markdown 资源链接协议白名单,未命中的协议保持普通 Markdown 行为 */\n resourceLinkSchemes?: readonly string[];\n /** 点击 Markdown 中识别到的文件链接的回调 */\n onFileClick?: (file: FileItem) => void;\n /** 点击 Markdown 中识别到的资源链接标签,如 [@skill](skill://xxx) */\n onResourceLinkClick?: (link: MarkdownResourceLink) => void;\n /** 自定义资源链接渲染,返回 null 时使用默认标签样式 */\n renderResourceLink?: RenderMarkdownResourceLink;\n}\n\nconst ThinkComponent = React.memo((props: ComponentProps) => {\n const type = (props.type || \"\") as string;\n const titleMap: Record<string, string> = {\n planning: \"规划\",\n replanning: \"重新规划\",\n reasoning: \"推理\",\n action: \"行动\",\n final_answer: \"最终答案\",\n };\n const iconMap = {\n planning: <BarsOutlined />,\n replanning: <BarsOutlined />,\n reasoning: <BulbOutlined />,\n action: <ThunderboltOutlined />,\n final_answer: <CheckCircleOutlined />,\n };\n\n return (\n <Flex align=\"center\" gap={8} style={{ color: \"#888\", margin: \"4px 0\" }}>\n {type in titleMap && iconMap[type as keyof typeof iconMap]}\n {titleMap[type] && <span>{titleMap[type]}</span>}\n </Flex>\n );\n});\n\n/**\n * 递归从 React children 中提取纯文本\n */\nconst extractText = (children: React.ReactNode): string => {\n if (typeof children === \"string\") return children;\n if (typeof children === \"number\") return String(children);\n if (Array.isArray(children)) return children.map(extractText).join(\"\");\n if (React.isValidElement(children))\n return extractText((children.props as any).children);\n return \"\";\n};\n\nconst MarkdownRender: React.FC<MarkdownRenderProps> = ({\n text,\n compact = false,\n resourceLinkSchemes,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n}) => {\n const styles = useStyles();\n const markdown = replaceMarkdownResourceLinks(\n text,\n (link) => {\n // 非 http(s) 协议容易被 Markdown 引擎清洗成普通文本,先转为内部自定义标签再交给 XMarkdown。\n return `<resource-link href=\"${escapeAttr(link.href)}\" label=\"${escapeAttr(link.label)}\" type=\"${escapeAttr(link.type)}\" value=\"${escapeAttr(link.value)}\">${escapeHtml(link.label)}</resource-link>`;\n },\n { schemes: resourceLinkSchemes },\n )\n .replaceAll(/\\/\\*\\s*PLANNING\\s*\\*\\//g, '<tag type=\"planning\"></tag>')\n .replaceAll(/\\/\\*\\s*REPLANNING\\s*\\*\\//g, '<tag type=\"replanning\"></tag>')\n .replaceAll(/\\/\\*\\s*REASONING\\s*\\*\\//g, '<tag type=\"reasoning\"></tag>')\n .replaceAll(/\\/\\*\\s*ACTION\\s*\\*\\//g, '<tag type=\"action\"></tag>')\n .replaceAll(\n /\\/\\*\\s*FINAL_ANSWER\\s*\\*\\//g,\n '<tag type=\"final_answer\"></tag>',\n );\n\n const ResourceLinkComponent = React.useCallback(\n (props: ComponentProps) => {\n const href = String((props.href as string) || \"\");\n const linkText =\n String((props.label as string) || \"\") || extractText(props.children);\n const resourceLink = parseMarkdownResourceHref(href, linkText, {\n schemes: resourceLinkSchemes,\n });\n if (!resourceLink) return <>{props.children as React.ReactNode}</>;\n\n const customNode = renderResourceLink?.(resourceLink);\n if (customNode) return customNode;\n\n return (\n <button\n type=\"button\"\n className={styles.resourceLink}\n onClick={() => onResourceLinkClick?.(resourceLink)}\n aria-label={resourceLink.label}\n >\n {resourceLink.label}\n </button>\n );\n },\n [\n onResourceLinkClick,\n renderResourceLink,\n resourceLinkSchemes,\n styles.resourceLink,\n ],\n );\n\n // 自定义 a 标签渲染:资源协议渲染为标签,文件链接渲染为 FileGallery,其余保持普通链接。\n const LinkComponent = React.useCallback(\n (props: ComponentProps) => {\n const href = String((props.href as string) || \"\");\n // 用递归提取纯文本,避免 children 是 React node 时 String() 得到 \"[object Object]\"\n const linkText = extractText(props.children);\n const resourceLink = parseMarkdownResourceHref(href, linkText, {\n schemes: resourceLinkSchemes,\n });\n\n if (resourceLink) {\n const customNode = renderResourceLink?.(resourceLink);\n if (customNode) return customNode;\n\n return (\n <button\n type=\"button\"\n className={styles.resourceLink}\n onClick={() => onResourceLinkClick?.(resourceLink)}\n aria-label={resourceLink.label}\n >\n {resourceLink.label}\n </button>\n );\n }\n\n // 先识别 name(链接文字),再识别 url(href)\n const ext = extractExt(linkText) || extractExt(href);\n\n if (ext) {\n // href 为空说明链接还在流式截断中,不渲染,避免显示出错误文字\n if (!href) return null;\n const mimeType = MIME_MAP[ext] || \"\";\n const fileItem: FileItem = {\n displayName: linkText || href,\n mimeType,\n fileUri: href,\n };\n return (\n <FileGallery\n file={fileItem}\n onClick={onFileClick ? () => onFileClick(fileItem) : undefined}\n />\n );\n }\n\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {props.children as React.ReactNode}\n </a>\n );\n },\n [\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n resourceLinkSchemes,\n styles.resourceLink,\n ],\n );\n\n return (\n <div\n className={`${styles.markdownWrapper}${compact ? ` ${styles.markdownWrapperCompact}` : \"\"}`}\n >\n <div\n className={`${styles.markdownHost}${compact ? ` ${styles.markdownHostCompact}` : \"\"}`}\n >\n <XMarkdown\n content={markdown}\n className=\"x-markdown-light\"\n paragraphTag=\"div\"\n config={{\n extensions: Latex(),\n }}\n components={{\n tag: ThinkComponent,\n \"resource-link\": ResourceLinkComponent,\n code: CodeComponent,\n a: LinkComponent,\n }}\n streaming={{\n enableAnimation: true,\n animationConfig: {\n fadeDuration: 400,\n },\n }}\n />\n </div>\n </div>\n );\n};\n\nexport default MarkdownRender;\n"],"mappings":"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"}
@@ -96,6 +96,7 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
96
96
  })) !== null && _ref2 !== void 0 ? _ref2 : defaultToolKindResolver(name);
97
97
  }, [toolKindResolver, mergedStrategies]);
98
98
  var parseProcessMessage = (_mergedStrategies$par = mergedStrategies.parseProcessMessage) !== null && _mergedStrategies$par !== void 0 ? _mergedStrategies$par : parseAgentMessage;
99
+ var resourceLinkSchemes = mergedStrategies.markdownResourceLinkSchemes;
99
100
 
100
101
  // 初始化完成时滚动到底部
101
102
  useEffect(function () {
@@ -269,6 +270,7 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
269
270
  if (msg.text) {
270
271
  return /*#__PURE__*/_jsx(MarkdownRender, {
271
272
  text: msg.text,
273
+ resourceLinkSchemes: resourceLinkSchemes,
272
274
  onFileClick: onFileClick,
273
275
  onResourceLinkClick: onResourceLinkClick,
274
276
  renderResourceLink: renderResourceLink
@@ -444,6 +446,7 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
444
446
  return /*#__PURE__*/_jsx("div", {
445
447
  children: /*#__PURE__*/_jsx(MarkdownRender, {
446
448
  text: node.content,
449
+ resourceLinkSchemes: resourceLinkSchemes,
447
450
  onFileClick: onFileClick,
448
451
  onResourceLinkClick: onResourceLinkClick,
449
452
  renderResourceLink: renderResourceLink
@@ -499,7 +502,7 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
499
502
  }), actionExtraNode]
500
503
  })]
501
504
  }, group.id);
502
- }, [enableProcessParsing, parseOptions, parseProcessMessage, showFnCallDetail, onConfirm, loading, showRetry, showCopy, showLog, onRetry, onCopy, onShowLog, actions, actionsExtra, onFileClick, onResourceLinkClick, renderResourceLink, styles, resolveToolKind, mergedStrategies]);
505
+ }, [enableProcessParsing, parseOptions, parseProcessMessage, showFnCallDetail, onConfirm, loading, showRetry, showCopy, showLog, onRetry, onCopy, onShowLog, actions, actionsExtra, onFileClick, onResourceLinkClick, renderResourceLink, resourceLinkSchemes, styles, resolveToolKind, mergedStrategies]);
503
506
 
504
507
  // ========== 渲染用户消息组 ==========
505
508
  var renderUserGroup = useCallback(function (group) {
@@ -524,6 +527,7 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
524
527
  children: /*#__PURE__*/_jsx(MarkdownRender, {
525
528
  text: m.text,
526
529
  compact: true,
530
+ resourceLinkSchemes: resourceLinkSchemes,
527
531
  onFileClick: onFileClick,
528
532
  onResourceLinkClick: onResourceLinkClick,
529
533
  renderResourceLink: renderResourceLink
@@ -532,7 +536,7 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
532
536
  }, m.id || i);
533
537
  })
534
538
  }, group.id);
535
- }, [styles, onFileClick, onResourceLinkClick, renderResourceLink]);
539
+ }, [styles, onFileClick, onResourceLinkClick, renderResourceLink, resourceLinkSchemes]);
536
540
 
537
541
  // ========== 空状态 ==========
538
542
 
@@ -585,6 +589,7 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
585
589
  className: styles.prologue,
586
590
  children: /*#__PURE__*/_jsx(MarkdownRender, {
587
591
  text: prologue,
592
+ resourceLinkSchemes: resourceLinkSchemes,
588
593
  onFileClick: onFileClick,
589
594
  onResourceLinkClick: onResourceLinkClick,
590
595
  renderResourceLink: renderResourceLink
@@ -1 +1 @@
1
- {"version":3,"names":["React","useMemo","useCallback","useEffect","useRef","useImperativeHandle","forwardRef","Button","Flex","Tooltip","message","antdMessage","clsx","SwapRightOutlined","ReloadOutlined","CopyOutlined","InfoCircleOutlined","copy","useStyles","MarkdownRender","FunctionCallRender","FileGallery","XAdkThoughtChain","parseAgentMessage","mergeChatStrategies","defaultToolKindResolver","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","scrollThreshold","XAdkChatbot","_ref","ref","_mergedStrategies$par","_ref$loading","loading","prologue","suggestions","messages","showFnCallDetail","onConfirm","onSuggest","showRetry","showCopy","showLog","onRetry","onCopy","onShowLog","actions","actionsExtra","className","style","_ref$enableGrouping","enableGrouping","_ref$enableProcessPar","enableProcessParsing","parseOptions","_ref$initialized","initialized","sessionId","onFileClick","onResourceLinkClick","renderResourceLink","renderFunctionCall","toolKindResolver","strategies","preset","empty","styles","listRef","lastScrollTopRef","userHasScrolledRef","messagesEndRef","prevInitializedRef","prevSessionIdRef","scrollToBottom","_messagesEndRef$curre","behavior","arguments","length","undefined","current","scrollIntoView","mergedStrategies","resolveToolKind","name","msg","_ref2","_toolKindResolver","_mergedStrategies$res","call","parseProcessMessage","el","stableTimer","doScroll","_messagesEndRef$curre2","observer","MutationObserver","clearTimeout","setTimeout","observe","childList","subtree","characterData","maxTimer","disconnect","scrollTop","scrollHeight","prevLoadingRef","wasLoading","timer","handleScroll","currentTop","isAtBottom","Math","abs","clientHeight","listElement","addEventListener","removeEventListener","chatGroups","map","_msg$isLike","id","role","msgs","invocationId","allFiles","fileData","isLike","groups","forEach","isRealUserQuery","functionResponse","functionCall","lastGroup","isLastGroupAgent","push","_msg$isLike2","concat","g","reduce","acc","m","_toConsumableArray","renderBotGroup","group","isLastGroup","botMsg","children","i","text","_renderFunctionCall","_msg$functionCall","showDetail","kind","renderApproval","renderHandoff","mergedToolMap","Map","callId","has","set","_objectSpread","_mergedToolMap$get","get","tool","args","nodes","currentProcessItems","processedToolIds","Set","flushProcessItems","type","items","key","mergedMsg","content","add","parts","part","partIdx","includes","titleMap","planning","replanning","reasoning","action_log","process_text","title","trim","lastNode","fullTextToCopy","filter","join","lastBotMsg","hasProcess","some","n","isGroupLoading","actionProps","isLastBotMsg","actionExtraNode","lastProcessIdx","findLastIndex","node","idx","isLastProcess","defaultOpen","fileSection","fileHeader","display","flexWrap","gap","file","index","onClick","metaFooter","actionIcons","success","timestamp","renderUserGroup","userMsg","userContainer","align","marginBottom","card","compact","renderSuggestions","suggestionWrapper","item","suggestion","suggestContent","icon","iconPosition","whiteSpace","height","wordWrap","textAlign","padding","lineHeight","isEmpty","wrapper","list","emptyWrapper","displayName"],"sources":["../../../../src/components/XAdkChatbot/index.tsx"],"sourcesContent":["import React, {\n useMemo,\n useCallback,\n useEffect,\n useRef,\n useImperativeHandle,\n forwardRef,\n} 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 { mergeChatStrategies } from \"@/presets/xgroup\";\nimport type {\n IMessage,\n XAdkChatbotProps,\n XAdkChatbotHandle,\n ChatGroup,\n} from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAdkThoughtChain\";\nimport { defaultToolKindResolver } from \"@/types/FunctionCallRender\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot = forwardRef<XAdkChatbotHandle, XAdkChatbotProps>(\n (\n {\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 actionsExtra,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n initialized = true,\n sessionId,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n renderFunctionCall,\n toolKindResolver,\n strategies,\n preset,\n empty,\n },\n ref,\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 const prevSessionIdRef = useRef(sessionId);\n\n // 暴露命令式 API\n const scrollToBottom = useCallback((behavior: ScrollBehavior = \"auto\") => {\n messagesEndRef.current?.scrollIntoView({ behavior });\n }, []);\n useImperativeHandle(ref, () => ({ scrollToBottom }), [scrollToBottom]);\n const mergedStrategies = useMemo(\n () => mergeChatStrategies(preset, strategies),\n [preset, strategies],\n );\n const resolveToolKind = useCallback(\n (name?: string, msg?: IMessage) =>\n toolKindResolver?.(name) ??\n mergedStrategies.resolveToolKind?.({ name, msg }) ??\n defaultToolKindResolver(name),\n [toolKindResolver, mergedStrategies],\n );\n const parseProcessMessage =\n mergedStrategies.parseProcessMessage ?? parseAgentMessage;\n\n // 初始化完成时滚动到底部\n useEffect(() => {\n if (!initialized) return;\n if (!messages.length) return;\n if (prevInitializedRef.current) return;\n prevInitializedRef.current = true;\n\n const el = listRef.current;\n if (!el) return;\n\n // 用 MutationObserver 监听 DOM 子树变化,等内容渲染稳定后置底\n // 每次 DOM 变化都重新计时,确保所有异步渲染(Markdown、代码高亮、思维链等)完成后再滚动\n let stableTimer: ReturnType<typeof setTimeout>;\n const doScroll = () => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"auto\" });\n };\n\n const observer = new MutationObserver(() => {\n clearTimeout(stableTimer);\n stableTimer = setTimeout(doScroll, 80);\n });\n\n observer.observe(el, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n // 立即执行一次,处理内容已经就绪的情况\n doScroll();\n // 兜底:最多等 500ms 后强制滚动并断开观察\n const maxTimer = setTimeout(() => {\n observer.disconnect();\n doScroll();\n }, 500);\n\n return () => {\n clearTimeout(stableTimer);\n clearTimeout(maxTimer);\n observer.disconnect();\n };\n }, [initialized, messages]);\n\n // 会话切换时重置滚动状态,允许重新触发初始化置底\n useEffect(() => {\n if (sessionId === undefined) return; // 未传 sessionId 不处理\n if (prevSessionIdRef.current === sessionId) return; // 同一会话不处理\n prevSessionIdRef.current = sessionId;\n prevInitializedRef.current = false;\n userHasScrolledRef.current = false;\n }, [sessionId]);\n\n // 消息变化时自动滚动到底部(用户未手动上滚时)\n useEffect(() => {\n if (userHasScrolledRef.current) return;\n if (!messages.length) return;\n const el = listRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }, [loading, messages]);\n\n // loading 结束时(流式输出完成),操作栏(metaFooter)会渲染出来增加高度,\n // 需要延迟滚动到底部,确保操作栏可见\n const prevLoadingRef = useRef(loading);\n useEffect(() => {\n const wasLoading = prevLoadingRef.current;\n prevLoadingRef.current = loading;\n\n if (!wasLoading || loading) return; // 只在 loading true → false 时触发\n if (userHasScrolledRef.current) return;\n if (!messages.length) return;\n\n // 延迟等待操作栏 DOM 渲染完成后再滚动\n const timer = setTimeout(() => {\n const el = listRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }, 50);\n return () => clearTimeout(timer);\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 (\n group: ChatGroup,\n isLastGroup: boolean,\n renderFunctionCall?: XAdkChatbotProps[\"renderFunctionCall\"],\n ) => {\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 onResourceLinkClick={onResourceLinkClick}\n renderResourceLink={renderResourceLink}\n />\n );\n }\n if (msg.functionCall) {\n return (\n renderFunctionCall?.(msg) ?? (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n kind={resolveToolKind(msg.functionCall?.name, msg)}\n renderApproval={mergedStrategies.renderApproval}\n renderHandoff={mergedStrategies.renderHandoff}\n />\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 = parseProcessMessage(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 const actionProps = { message: group, isLastBotMsg: isLastGroup };\n const actionExtraNode = actionsExtra?.(actionProps);\n\n // 4. 渲染\n const lastProcessIdx = nodes.findLastIndex((n) => n.type === \"process\");\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n // 只有最后一个 process node 跟随 loading 状态,已完成的思维链不应显示 loading\n const isLastProcess = idx === lastProcessIdx;\n return (\n <XAdkThoughtChain\n key={node.key}\n loading={isLastProcess && isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isLastProcess && isGroupLoading}\n renderFunctionCall={renderFunctionCall}\n toolKindResolver={(name) => resolveToolKind(name)}\n strategies={mergedStrategies}\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\n text={node.content}\n onFileClick={onFileClick}\n onResourceLinkClick={onResourceLinkClick}\n renderResourceLink={renderResourceLink}\n />\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\n key={index}\n file={file}\n onClick={onFileClick}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions ||\n showRetry ||\n showCopy ||\n showLog ||\n actionExtraNode) && (\n <div className={styles.metaFooter}>\n {actions ? (\n actions(actionProps)\n ) : (\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 )}\n {actionExtraNode}\n </div>\n )}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n parseProcessMessage,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n actionsExtra,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n styles,\n resolveToolKind,\n mergedStrategies,\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 && (\n <div className={styles.card}>\n <MarkdownRender\n text={m.text}\n compact\n onFileClick={onFileClick}\n onResourceLinkClick={onResourceLinkClick}\n renderResourceLink={renderResourceLink}\n />\n </div>\n )}\n </div>\n ))}\n </div>\n );\n },\n [\n styles,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\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 // 空状态判断\n const isEmpty =\n messages.length === 0 &&\n !prologue &&\n (!suggestions || suggestions.length === 0);\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 空状态 */}\n {isEmpty && empty && (\n <div className={styles.emptyWrapper}>\n {typeof empty === \"function\" ? empty() : empty}\n </div>\n )}\n\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender\n text={prologue}\n onFileClick={onFileClick}\n onResourceLinkClick={onResourceLinkClick}\n renderResourceLink={renderResourceLink}\n />\n </div>\n )}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(\n group,\n idx === chatGroups.length - 1,\n renderFunctionCall,\n ),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n },\n);\n\nXAdkChatbot.displayName = \"XAdkChatbot\";\n\nexport default XAdkChatbot;\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useMemo","useCallback","useEffect","useRef","useImperativeHandle","forwardRef","Button","Flex","Tooltip","message","antdMessage","clsx","SwapRightOutlined","ReloadOutlined","CopyOutlined","InfoCircleOutlined","copy","useStyles","MarkdownRender","FunctionCallRender","FileGallery","XAdkThoughtChain","parseAgentMessage","mergeChatStrategies","defaultToolKindResolver","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","scrollThreshold","XAdkChatbot","_ref","ref","_mergedStrategies$par","_ref$loading","loading","prologue","suggestions","messages","showFnCallDetail","onConfirm","onSuggest","showRetry","showCopy","showLog","onRetry","onCopy","onShowLog","actions","actionsExtra","className","style","_ref$enableGrouping","enableGrouping","_ref$enableProcessPar","enableProcessParsing","parseOptions","_ref$initialized","initialized","sessionId","onFileClick","onResourceLinkClick","renderResourceLink","renderFunctionCall","toolKindResolver","strategies","preset","empty","styles","listRef","lastScrollTopRef","userHasScrolledRef","messagesEndRef","prevInitializedRef","prevSessionIdRef","scrollToBottom","_messagesEndRef$curre","behavior","arguments","length","undefined","current","scrollIntoView","mergedStrategies","resolveToolKind","name","msg","_ref2","_toolKindResolver","_mergedStrategies$res","call","parseProcessMessage","resourceLinkSchemes","markdownResourceLinkSchemes","el","stableTimer","doScroll","_messagesEndRef$curre2","observer","MutationObserver","clearTimeout","setTimeout","observe","childList","subtree","characterData","maxTimer","disconnect","scrollTop","scrollHeight","prevLoadingRef","wasLoading","timer","handleScroll","currentTop","isAtBottom","Math","abs","clientHeight","listElement","addEventListener","removeEventListener","chatGroups","map","_msg$isLike","id","role","msgs","invocationId","allFiles","fileData","isLike","groups","forEach","isRealUserQuery","functionResponse","functionCall","lastGroup","isLastGroupAgent","push","_msg$isLike2","concat","g","reduce","acc","m","_toConsumableArray","renderBotGroup","group","isLastGroup","botMsg","children","i","text","_renderFunctionCall","_msg$functionCall","showDetail","kind","renderApproval","renderHandoff","mergedToolMap","Map","callId","has","set","_objectSpread","_mergedToolMap$get","get","tool","args","nodes","currentProcessItems","processedToolIds","Set","flushProcessItems","type","items","key","mergedMsg","content","add","parts","part","partIdx","includes","titleMap","planning","replanning","reasoning","action_log","process_text","title","trim","lastNode","fullTextToCopy","filter","join","lastBotMsg","hasProcess","some","n","isGroupLoading","actionProps","isLastBotMsg","actionExtraNode","lastProcessIdx","findLastIndex","node","idx","isLastProcess","defaultOpen","fileSection","fileHeader","display","flexWrap","gap","file","index","onClick","metaFooter","actionIcons","success","timestamp","renderUserGroup","userMsg","userContainer","align","marginBottom","card","compact","renderSuggestions","suggestionWrapper","item","suggestion","suggestContent","icon","iconPosition","whiteSpace","height","wordWrap","textAlign","padding","lineHeight","isEmpty","wrapper","list","emptyWrapper","displayName"],"sources":["../../../../src/components/XAdkChatbot/index.tsx"],"sourcesContent":["import React, {\n useMemo,\n useCallback,\n useEffect,\n useRef,\n useImperativeHandle,\n forwardRef,\n} 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 { mergeChatStrategies } from \"@/presets/xgroup\";\nimport type {\n IMessage,\n XAdkChatbotProps,\n XAdkChatbotHandle,\n ChatGroup,\n} from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAdkThoughtChain\";\nimport { defaultToolKindResolver } from \"@/types/FunctionCallRender\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot = forwardRef<XAdkChatbotHandle, XAdkChatbotProps>(\n (\n {\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 actionsExtra,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n initialized = true,\n sessionId,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n renderFunctionCall,\n toolKindResolver,\n strategies,\n preset,\n empty,\n },\n ref,\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 const prevSessionIdRef = useRef(sessionId);\n\n // 暴露命令式 API\n const scrollToBottom = useCallback((behavior: ScrollBehavior = \"auto\") => {\n messagesEndRef.current?.scrollIntoView({ behavior });\n }, []);\n useImperativeHandle(ref, () => ({ scrollToBottom }), [scrollToBottom]);\n const mergedStrategies = useMemo(\n () => mergeChatStrategies(preset, strategies),\n [preset, strategies],\n );\n const resolveToolKind = useCallback(\n (name?: string, msg?: IMessage) =>\n toolKindResolver?.(name) ??\n mergedStrategies.resolveToolKind?.({ name, msg }) ??\n defaultToolKindResolver(name),\n [toolKindResolver, mergedStrategies],\n );\n const parseProcessMessage =\n mergedStrategies.parseProcessMessage ?? parseAgentMessage;\n const resourceLinkSchemes = mergedStrategies.markdownResourceLinkSchemes;\n\n // 初始化完成时滚动到底部\n useEffect(() => {\n if (!initialized) return;\n if (!messages.length) return;\n if (prevInitializedRef.current) return;\n prevInitializedRef.current = true;\n\n const el = listRef.current;\n if (!el) return;\n\n // 用 MutationObserver 监听 DOM 子树变化,等内容渲染稳定后置底\n // 每次 DOM 变化都重新计时,确保所有异步渲染(Markdown、代码高亮、思维链等)完成后再滚动\n let stableTimer: ReturnType<typeof setTimeout>;\n const doScroll = () => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"auto\" });\n };\n\n const observer = new MutationObserver(() => {\n clearTimeout(stableTimer);\n stableTimer = setTimeout(doScroll, 80);\n });\n\n observer.observe(el, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n // 立即执行一次,处理内容已经就绪的情况\n doScroll();\n // 兜底:最多等 500ms 后强制滚动并断开观察\n const maxTimer = setTimeout(() => {\n observer.disconnect();\n doScroll();\n }, 500);\n\n return () => {\n clearTimeout(stableTimer);\n clearTimeout(maxTimer);\n observer.disconnect();\n };\n }, [initialized, messages]);\n\n // 会话切换时重置滚动状态,允许重新触发初始化置底\n useEffect(() => {\n if (sessionId === undefined) return; // 未传 sessionId 不处理\n if (prevSessionIdRef.current === sessionId) return; // 同一会话不处理\n prevSessionIdRef.current = sessionId;\n prevInitializedRef.current = false;\n userHasScrolledRef.current = false;\n }, [sessionId]);\n\n // 消息变化时自动滚动到底部(用户未手动上滚时)\n useEffect(() => {\n if (userHasScrolledRef.current) return;\n if (!messages.length) return;\n const el = listRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }, [loading, messages]);\n\n // loading 结束时(流式输出完成),操作栏(metaFooter)会渲染出来增加高度,\n // 需要延迟滚动到底部,确保操作栏可见\n const prevLoadingRef = useRef(loading);\n useEffect(() => {\n const wasLoading = prevLoadingRef.current;\n prevLoadingRef.current = loading;\n\n if (!wasLoading || loading) return; // 只在 loading true → false 时触发\n if (userHasScrolledRef.current) return;\n if (!messages.length) return;\n\n // 延迟等待操作栏 DOM 渲染完成后再滚动\n const timer = setTimeout(() => {\n const el = listRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }, 50);\n return () => clearTimeout(timer);\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 (\n group: ChatGroup,\n isLastGroup: boolean,\n renderFunctionCall?: XAdkChatbotProps[\"renderFunctionCall\"],\n ) => {\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 resourceLinkSchemes={resourceLinkSchemes}\n onFileClick={onFileClick}\n onResourceLinkClick={onResourceLinkClick}\n renderResourceLink={renderResourceLink}\n />\n );\n }\n if (msg.functionCall) {\n return (\n renderFunctionCall?.(msg) ?? (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n kind={resolveToolKind(msg.functionCall?.name, msg)}\n renderApproval={mergedStrategies.renderApproval}\n renderHandoff={mergedStrategies.renderHandoff}\n />\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 = parseProcessMessage(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 const actionProps = { message: group, isLastBotMsg: isLastGroup };\n const actionExtraNode = actionsExtra?.(actionProps);\n\n // 4. 渲染\n const lastProcessIdx = nodes.findLastIndex((n) => n.type === \"process\");\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n // 只有最后一个 process node 跟随 loading 状态,已完成的思维链不应显示 loading\n const isLastProcess = idx === lastProcessIdx;\n return (\n <XAdkThoughtChain\n key={node.key}\n loading={isLastProcess && isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isLastProcess && isGroupLoading}\n renderFunctionCall={renderFunctionCall}\n toolKindResolver={(name) => resolveToolKind(name)}\n strategies={mergedStrategies}\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\n text={node.content}\n resourceLinkSchemes={resourceLinkSchemes}\n onFileClick={onFileClick}\n onResourceLinkClick={onResourceLinkClick}\n renderResourceLink={renderResourceLink}\n />\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\n key={index}\n file={file}\n onClick={onFileClick}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions ||\n showRetry ||\n showCopy ||\n showLog ||\n actionExtraNode) && (\n <div className={styles.metaFooter}>\n {actions ? (\n actions(actionProps)\n ) : (\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 )}\n {actionExtraNode}\n </div>\n )}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n parseProcessMessage,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n actionsExtra,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n resourceLinkSchemes,\n styles,\n resolveToolKind,\n mergedStrategies,\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 && (\n <div className={styles.card}>\n <MarkdownRender\n text={m.text}\n compact\n resourceLinkSchemes={resourceLinkSchemes}\n onFileClick={onFileClick}\n onResourceLinkClick={onResourceLinkClick}\n renderResourceLink={renderResourceLink}\n />\n </div>\n )}\n </div>\n ))}\n </div>\n );\n },\n [\n styles,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n resourceLinkSchemes,\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 // 空状态判断\n const isEmpty =\n messages.length === 0 &&\n !prologue &&\n (!suggestions || suggestions.length === 0);\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 空状态 */}\n {isEmpty && empty && (\n <div className={styles.emptyWrapper}>\n {typeof empty === \"function\" ? empty() : empty}\n </div>\n )}\n\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender\n text={prologue}\n resourceLinkSchemes={resourceLinkSchemes}\n onFileClick={onFileClick}\n onResourceLinkClick={onResourceLinkClick}\n renderResourceLink={renderResourceLink}\n />\n </div>\n )}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(\n group,\n idx === chatGroups.length - 1,\n renderFunctionCall,\n ),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n },\n);\n\nXAdkChatbot.displayName = \"XAdkChatbot\";\n\nexport default XAdkChatbot;\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import { parseAgentMessage } from "../../utils";
3
- import { baseChatStrategies, xGroupToolKindResolver } from "./strategies";
3
+ import { baseChatStrategies, xGroupMarkdownResourceLinkSchemes, xGroupToolKindResolver } from "./strategies";
4
4
  import { createXGroupUploadRequest } from "./upload";
5
5
 
6
6
  /** 众安信科 ADK 官方预设:聚合工具展示、消息解析、确认响应和默认上传等业务策略。 */
@@ -13,7 +13,8 @@ export var xGroupAdkPreset = {
13
13
  return parseAgentMessage(text, _objectSpread({
14
14
  mode: "comment"
15
15
  }, options));
16
- }
16
+ },
17
+ markdownResourceLinkSchemes: xGroupMarkdownResourceLinkSchemes
17
18
  },
18
19
  createUploadRequest: createXGroupUploadRequest
19
20
  };
@@ -1 +1 @@
1
- {"version":3,"names":["parseAgentMessage","baseChatStrategies","xGroupToolKindResolver","createXGroupUploadRequest","xGroupAdkPreset","name","strategies","resolveToolKind","createFunctionResponse","parseProcessMessage","text","options","_objectSpread","mode","createUploadRequest","basePreset","resolveChatPreset","preset","mergeChatStrategies","overrides","resolvePresetUploadRequest","context","_resolveChatPreset$cr","_resolveChatPreset","call"],"sources":["../../../../src/presets/xgroup/preset.ts"],"sourcesContent":["import { parseAgentMessage } from \"@/utils\";\nimport type {\n ChatPreset,\n ChatPresetInput,\n ChatStrategies,\n UploadRequestFn,\n} from \"@/types\";\nimport {\n baseChatStrategies,\n xGroupToolKindResolver,\n} from \"./strategies\";\nimport { createXGroupUploadRequest } from \"./upload\";\n\n/** 众安信科 ADK 官方预设:聚合工具展示、消息解析、确认响应和默认上传等业务策略。 */\nexport const xGroupAdkPreset: ChatPreset = {\n name: \"xgroup-adk\",\n strategies: {\n resolveToolKind: xGroupToolKindResolver,\n createFunctionResponse: baseChatStrategies.createFunctionResponse,\n parseProcessMessage: (text, options) =>\n parseAgentMessage(text, { mode: \"comment\", ...options }),\n },\n createUploadRequest: createXGroupUploadRequest,\n};\n\n/** 基础预设用于完全通用的 SDK 行为,不绑定众安信科后端协议。 */\nexport const basePreset: ChatPreset = {\n name: \"base\",\n strategies: baseChatStrategies,\n};\n\n/** 统一解析字符串预设和对象预设,默认保持历史行为使用 xgroup-adk。 */\nexport const resolveChatPreset = (\n preset: ChatPresetInput | undefined,\n): ChatPreset => {\n if (!preset || preset === \"xgroup-adk\") return xGroupAdkPreset;\n if (preset === \"base\") return basePreset;\n return preset;\n};\n\n/** 将预设策略与局部覆盖合并,供组件和业务侧按需覆盖单个函数。 */\nexport const mergeChatStrategies = (\n preset: ChatPresetInput | undefined,\n overrides?: ChatStrategies,\n): ChatStrategies => ({\n ...baseChatStrategies,\n ...resolveChatPreset(preset).strategies,\n ...overrides,\n});\n\n/** 从当前预设中解析上传实现,业务显式传入 uploadRequest 时仍然优先使用业务实现。 */\nexport const resolvePresetUploadRequest = (\n preset: ChatPresetInput | undefined,\n context: {\n url: string;\n token?: string;\n appNo?: string;\n },\n): UploadRequestFn | undefined => {\n return resolveChatPreset(preset).createUploadRequest?.(context);\n};\n"],"mappings":";AAAA,SAASA,iBAAiB;AAO1B,SACEC,kBAAkB,EAClBC,sBAAsB;AAExB,SAASC,yBAAyB;;AAElC;AACA,OAAO,IAAMC,eAA2B,GAAG;EACzCC,IAAI,EAAE,YAAY;EAClBC,UAAU,EAAE;IACVC,eAAe,EAAEL,sBAAsB;IACvCM,sBAAsB,EAAEP,kBAAkB,CAACO,sBAAsB;IACjEC,mBAAmB,EAAE,SAAAA,oBAACC,IAAI,EAAEC,OAAO;MAAA,OACjCX,iBAAiB,CAACU,IAAI,EAAAE,aAAA;QAAIC,IAAI,EAAE;MAAS,GAAKF,OAAO,CAAE,CAAC;IAAA;EAC5D,CAAC;EACDG,mBAAmB,EAAEX;AACvB,CAAC;;AAED;AACA,OAAO,IAAMY,UAAsB,GAAG;EACpCV,IAAI,EAAE,MAAM;EACZC,UAAU,EAAEL;AACd,CAAC;;AAED;AACA,OAAO,IAAMe,iBAAiB,GAAG,SAApBA,iBAAiBA,CAC5BC,MAAmC,EACpB;EACf,IAAI,CAACA,MAAM,IAAIA,MAAM,KAAK,YAAY,EAAE,OAAOb,eAAe;EAC9D,IAAIa,MAAM,KAAK,MAAM,EAAE,OAAOF,UAAU;EACxC,OAAOE,MAAM;AACf,CAAC;;AAED;AACA,OAAO,IAAMC,mBAAmB,GAAG,SAAtBA,mBAAmBA,CAC9BD,MAAmC,EACnCE,SAA0B;EAAA,OAAAP,aAAA,CAAAA,aAAA,CAAAA,aAAA,KAEvBX,kBAAkB,GAClBe,iBAAiB,CAACC,MAAM,CAAC,CAACX,UAAU,GACpCa,SAAS;AAAA,CACZ;;AAEF;AACA,OAAO,IAAMC,0BAA0B,GAAG,SAA7BA,0BAA0BA,CACrCH,MAAmC,EACnCI,OAIC,EAC+B;EAAA,IAAAC,qBAAA,EAAAC,kBAAA;EAChC,QAAAD,qBAAA,GAAO,CAAAC,kBAAA,GAAAP,iBAAiB,CAACC,MAAM,CAAC,EAACH,mBAAmB,cAAAQ,qBAAA,uBAA7CA,qBAAA,CAAAE,IAAA,CAAAD,kBAAA,EAAgDF,OAAO,CAAC;AACjE,CAAC"}
1
+ {"version":3,"names":["parseAgentMessage","baseChatStrategies","xGroupMarkdownResourceLinkSchemes","xGroupToolKindResolver","createXGroupUploadRequest","xGroupAdkPreset","name","strategies","resolveToolKind","createFunctionResponse","parseProcessMessage","text","options","_objectSpread","mode","markdownResourceLinkSchemes","createUploadRequest","basePreset","resolveChatPreset","preset","mergeChatStrategies","overrides","resolvePresetUploadRequest","context","_resolveChatPreset$cr","_resolveChatPreset","call"],"sources":["../../../../src/presets/xgroup/preset.ts"],"sourcesContent":["import { parseAgentMessage } from \"@/utils\";\nimport type {\n ChatPreset,\n ChatPresetInput,\n ChatStrategies,\n UploadRequestFn,\n} from \"@/types\";\nimport {\n baseChatStrategies,\n xGroupMarkdownResourceLinkSchemes,\n xGroupToolKindResolver,\n} from \"./strategies\";\nimport { createXGroupUploadRequest } from \"./upload\";\n\n/** 众安信科 ADK 官方预设:聚合工具展示、消息解析、确认响应和默认上传等业务策略。 */\nexport const xGroupAdkPreset: ChatPreset = {\n name: \"xgroup-adk\",\n strategies: {\n resolveToolKind: xGroupToolKindResolver,\n createFunctionResponse: baseChatStrategies.createFunctionResponse,\n parseProcessMessage: (text, options) =>\n parseAgentMessage(text, { mode: \"comment\", ...options }),\n markdownResourceLinkSchemes: xGroupMarkdownResourceLinkSchemes,\n },\n createUploadRequest: createXGroupUploadRequest,\n};\n\n/** 基础预设用于完全通用的 SDK 行为,不绑定众安信科后端协议。 */\nexport const basePreset: ChatPreset = {\n name: \"base\",\n strategies: baseChatStrategies,\n};\n\n/** 统一解析字符串预设和对象预设,默认保持历史行为使用 xgroup-adk。 */\nexport const resolveChatPreset = (\n preset: ChatPresetInput | undefined,\n): ChatPreset => {\n if (!preset || preset === \"xgroup-adk\") return xGroupAdkPreset;\n if (preset === \"base\") return basePreset;\n return preset;\n};\n\n/** 将预设策略与局部覆盖合并,供组件和业务侧按需覆盖单个函数。 */\nexport const mergeChatStrategies = (\n preset: ChatPresetInput | undefined,\n overrides?: ChatStrategies,\n): ChatStrategies => ({\n ...baseChatStrategies,\n ...resolveChatPreset(preset).strategies,\n ...overrides,\n});\n\n/** 从当前预设中解析上传实现,业务显式传入 uploadRequest 时仍然优先使用业务实现。 */\nexport const resolvePresetUploadRequest = (\n preset: ChatPresetInput | undefined,\n context: {\n url: string;\n token?: string;\n appNo?: string;\n },\n): UploadRequestFn | undefined => {\n return resolveChatPreset(preset).createUploadRequest?.(context);\n};\n"],"mappings":";AAAA,SAASA,iBAAiB;AAO1B,SACEC,kBAAkB,EAClBC,iCAAiC,EACjCC,sBAAsB;AAExB,SAASC,yBAAyB;;AAElC;AACA,OAAO,IAAMC,eAA2B,GAAG;EACzCC,IAAI,EAAE,YAAY;EAClBC,UAAU,EAAE;IACVC,eAAe,EAAEL,sBAAsB;IACvCM,sBAAsB,EAAER,kBAAkB,CAACQ,sBAAsB;IACjEC,mBAAmB,EAAE,SAAAA,oBAACC,IAAI,EAAEC,OAAO;MAAA,OACjCZ,iBAAiB,CAACW,IAAI,EAAAE,aAAA;QAAIC,IAAI,EAAE;MAAS,GAAKF,OAAO,CAAE,CAAC;IAAA;IAC1DG,2BAA2B,EAAEb;EAC/B,CAAC;EACDc,mBAAmB,EAAEZ;AACvB,CAAC;;AAED;AACA,OAAO,IAAMa,UAAsB,GAAG;EACpCX,IAAI,EAAE,MAAM;EACZC,UAAU,EAAEN;AACd,CAAC;;AAED;AACA,OAAO,IAAMiB,iBAAiB,GAAG,SAApBA,iBAAiBA,CAC5BC,MAAmC,EACpB;EACf,IAAI,CAACA,MAAM,IAAIA,MAAM,KAAK,YAAY,EAAE,OAAOd,eAAe;EAC9D,IAAIc,MAAM,KAAK,MAAM,EAAE,OAAOF,UAAU;EACxC,OAAOE,MAAM;AACf,CAAC;;AAED;AACA,OAAO,IAAMC,mBAAmB,GAAG,SAAtBA,mBAAmBA,CAC9BD,MAAmC,EACnCE,SAA0B;EAAA,OAAAR,aAAA,CAAAA,aAAA,CAAAA,aAAA,KAEvBZ,kBAAkB,GAClBiB,iBAAiB,CAACC,MAAM,CAAC,CAACZ,UAAU,GACpCc,SAAS;AAAA,CACZ;;AAEF;AACA,OAAO,IAAMC,0BAA0B,GAAG,SAA7BA,0BAA0BA,CACrCH,MAAmC,EACnCI,OAIC,EAC+B;EAAA,IAAAC,qBAAA,EAAAC,kBAAA;EAChC,QAAAD,qBAAA,GAAO,CAAAC,kBAAA,GAAAP,iBAAiB,CAACC,MAAM,CAAC,EAACH,mBAAmB,cAAAQ,qBAAA,uBAA7CA,qBAAA,CAAAE,IAAA,CAAAD,kBAAA,EAAgDF,OAAO,CAAC;AACjE,CAAC"}
@@ -1,8 +1,12 @@
1
1
  import type { ChatStrategies, ToolRenderKind } from "../../types";
2
+ export declare const xGroupMarkdownResourceLinkSchemes: readonly ["skill", "plugin", "tool", "knowledge", "agent", "model", "kb"];
3
+ export declare const formatXGroupMarkdownResourceLinksAsText: (text: string, options?: {
4
+ stripTrigger?: boolean;
5
+ }) => string;
2
6
  export declare const baseToolKindResolver: () => ToolRenderKind;
3
7
  /** 众安信科预设的工具类型映射,集中处理当前后端约定的 tool name。 */
4
8
  export declare const xGroupToolKindResolver: ({ name, }: {
5
9
  name?: string | undefined;
6
10
  }) => ToolRenderKind;
7
11
  /** SDK 基础策略:不带业务协议偏好的最小行为集合。 */
8
- export declare const baseChatStrategies: Required<Pick<ChatStrategies, "resolveToolKind" | "createFunctionResponse" | "parseProcessMessage">>;
12
+ export declare const baseChatStrategies: Required<Pick<ChatStrategies, "resolveToolKind" | "createFunctionResponse" | "parseProcessMessage" | "markdownResourceLinkSchemes">>;