@ai-group/chat-sdk 3.7.1-alpha7 → 3.7.1-alpha9

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 (112) hide show
  1. package/README.md +22 -0
  2. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +3 -1
  3. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +82 -7
  4. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +2 -2
  5. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js +24 -1
  6. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js.map +2 -2
  7. package/dist/cjs/components/XAdkChatbot/index.d.ts +2 -2
  8. package/dist/cjs/components/XAdkChatbot/index.js +17 -6
  9. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  10. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.d.ts +2 -1
  11. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +17 -10
  12. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
  13. package/dist/cjs/components/XAdkProvider/context/ChatSenderStateContext.d.ts +4 -0
  14. package/dist/cjs/components/XAdkProvider/context/ChatSenderStateContext.js.map +2 -2
  15. package/dist/cjs/components/XAdkProvider/index.js +11 -10
  16. package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
  17. package/dist/cjs/components/XAdkSender/InlineTagInput.js +93 -24
  18. package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +2 -2
  19. package/dist/cjs/components/XAdkSender/InputTags.js.map +2 -2
  20. package/dist/cjs/components/XAdkSender/styles.js +13 -0
  21. package/dist/cjs/components/XAdkSender/styles.js.map +2 -2
  22. package/dist/cjs/index.d.ts +4 -2
  23. package/dist/cjs/index.js +25 -6
  24. package/dist/cjs/index.js.map +2 -2
  25. package/dist/cjs/presets/base.d.ts +6 -0
  26. package/dist/cjs/presets/base.js +50 -0
  27. package/dist/cjs/presets/base.js.map +7 -0
  28. package/dist/cjs/presets/define.d.ts +11 -0
  29. package/dist/cjs/presets/define.js +58 -0
  30. package/dist/cjs/presets/define.js.map +7 -0
  31. package/dist/cjs/presets/index.d.ts +3 -0
  32. package/dist/cjs/presets/index.js +28 -0
  33. package/dist/cjs/presets/index.js.map +7 -0
  34. package/dist/cjs/presets/runtime.d.ts +22 -0
  35. package/dist/cjs/presets/runtime.js +75 -0
  36. package/dist/cjs/presets/runtime.js.map +7 -0
  37. package/dist/cjs/presets/xgroup/index.d.ts +4 -0
  38. package/dist/cjs/presets/xgroup/index.js +8 -0
  39. package/dist/cjs/presets/xgroup/index.js.map +2 -2
  40. package/dist/cjs/presets/xgroup/knowledgeReference.d.ts +17 -0
  41. package/dist/cjs/presets/xgroup/knowledgeReference.js +160 -0
  42. package/dist/cjs/presets/xgroup/knowledgeReference.js.map +7 -0
  43. package/dist/cjs/presets/xgroup/preset.d.ts +1 -13
  44. package/dist/cjs/presets/xgroup/preset.js +16 -38
  45. package/dist/cjs/presets/xgroup/preset.js.map +2 -2
  46. package/dist/cjs/presets/xgroup/strategies.d.ts +2 -5
  47. package/dist/cjs/presets/xgroup/strategies.js +1 -20
  48. package/dist/cjs/presets/xgroup/strategies.js.map +2 -2
  49. package/dist/cjs/types/ChatStrategies.d.ts +6 -2
  50. package/dist/cjs/types/ChatStrategies.js.map +1 -1
  51. package/dist/cjs/types/XAdkChatbot.d.ts +18 -0
  52. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  53. package/dist/cjs/utils/markdownResource.d.ts +1 -1
  54. package/dist/cjs/utils/markdownResource.js +13 -7
  55. package/dist/cjs/utils/markdownResource.js.map +2 -2
  56. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +3 -1
  57. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +88 -22
  58. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
  59. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js +2 -2
  60. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js.map +1 -1
  61. package/dist/esm/components/XAdkChatbot/index.d.ts +2 -2
  62. package/dist/esm/components/XAdkChatbot/index.js +16 -8
  63. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  64. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.d.ts +2 -1
  65. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +13 -8
  66. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
  67. package/dist/esm/components/XAdkProvider/context/ChatSenderStateContext.d.ts +4 -0
  68. package/dist/esm/components/XAdkProvider/context/ChatSenderStateContext.js.map +1 -1
  69. package/dist/esm/components/XAdkProvider/index.js +7 -3
  70. package/dist/esm/components/XAdkProvider/index.js.map +1 -1
  71. package/dist/esm/components/XAdkSender/InlineTagInput.js +55 -6
  72. package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -1
  73. package/dist/esm/components/XAdkSender/InputTags.js +1 -0
  74. package/dist/esm/components/XAdkSender/InputTags.js.map +1 -1
  75. package/dist/esm/components/XAdkSender/styles.js +1 -1
  76. package/dist/esm/components/XAdkSender/styles.js.map +1 -1
  77. package/dist/esm/index.d.ts +4 -2
  78. package/dist/esm/index.js +3 -3
  79. package/dist/esm/index.js.map +1 -1
  80. package/dist/esm/presets/base.d.ts +6 -0
  81. package/dist/esm/presets/base.js +28 -0
  82. package/dist/esm/presets/base.js.map +1 -0
  83. package/dist/esm/presets/define.d.ts +11 -0
  84. package/dist/esm/presets/define.js +33 -0
  85. package/dist/esm/presets/define.js.map +1 -0
  86. package/dist/esm/presets/index.d.ts +3 -0
  87. package/dist/esm/presets/index.js +4 -0
  88. package/dist/esm/presets/index.js.map +1 -0
  89. package/dist/esm/presets/runtime.d.ts +22 -0
  90. package/dist/esm/presets/runtime.js +45 -0
  91. package/dist/esm/presets/runtime.js.map +1 -0
  92. package/dist/esm/presets/xgroup/index.d.ts +4 -0
  93. package/dist/esm/presets/xgroup/index.js +5 -0
  94. package/dist/esm/presets/xgroup/index.js.map +1 -1
  95. package/dist/esm/presets/xgroup/knowledgeReference.d.ts +17 -0
  96. package/dist/esm/presets/xgroup/knowledgeReference.js +94 -0
  97. package/dist/esm/presets/xgroup/knowledgeReference.js.map +1 -0
  98. package/dist/esm/presets/xgroup/preset.d.ts +1 -13
  99. package/dist/esm/presets/xgroup/preset.js +7 -28
  100. package/dist/esm/presets/xgroup/preset.js.map +1 -1
  101. package/dist/esm/presets/xgroup/strategies.d.ts +2 -5
  102. package/dist/esm/presets/xgroup/strategies.js +1 -24
  103. package/dist/esm/presets/xgroup/strategies.js.map +1 -1
  104. package/dist/esm/types/ChatStrategies.d.ts +6 -2
  105. package/dist/esm/types/ChatStrategies.js.map +1 -1
  106. package/dist/esm/types/XAdkChatbot.d.ts +18 -0
  107. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  108. package/dist/esm/utils/markdownResource.d.ts +1 -1
  109. package/dist/esm/utils/markdownResource.js +7 -1
  110. package/dist/esm/utils/markdownResource.js.map +1 -1
  111. package/dist/umd/chat-sdk.min.js +1 -1
  112. package/package.json +6 -1
@@ -1,3 +1,5 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
1
3
  import React from "react";
2
4
  import XMarkdown from "@ant-design/x-markdown";
3
5
  import "@ant-design/x-markdown/themes/light.css";
@@ -58,12 +60,6 @@ var extractExt = function extractExt(str) {
58
60
  if (!match) return "";
59
61
  return match[1].toLowerCase();
60
62
  };
61
- var escapeHtml = function escapeHtml(value) {
62
- return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
63
- };
64
- var escapeAttr = function escapeAttr(value) {
65
- return escapeHtml(value).replace(/"/g, "&quot;").replace(/'/g, "&#39;");
66
- };
67
63
  var escapeMarkdownLabel = function escapeMarkdownLabel(value) {
68
64
  return value.replace(/\\/g, "\\\\").replace(/\]/g, "\\]");
69
65
  };
@@ -71,6 +67,10 @@ var escapeMarkdownLabel = function escapeMarkdownLabel(value) {
71
67
  // 使用标准 https 链接作为 Markdown AST 的内部载体,避免自定义 HTML 标签被解析器降级成纯文本。
72
68
  var RESOURCE_LINK_SENTINEL = "https://xadk.local/resource";
73
69
  var PLAIN_MENTION_SENTINEL = "https://xadk.local/mention";
70
+ // 仅开放符合 Custom Element 命名规则的标签,避免覆盖 a/code 等内置 Markdown 节点。
71
+ var CUSTOM_TAG_NAME_REGEX = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)+$/;
72
+ var CUSTOM_ATTRIBUTE_NAME_REGEX = /^[a-z][a-z0-9-]*$/;
73
+ var EMPTY_MARKDOWN_EXTENSIONS = [];
74
74
  var CodeComponent = function CodeComponent(props) {
75
75
  var _className$match;
76
76
  var className = props.className,
@@ -121,18 +121,59 @@ var extractText = function extractText(children) {
121
121
  if ( /*#__PURE__*/React.isValidElement(children)) return extractText(children.props.children);
122
122
  return "";
123
123
  };
124
- var MarkdownRender = function MarkdownRender(_ref) {
125
- var text = _ref.text,
126
- _ref$compact = _ref.compact,
127
- compact = _ref$compact === void 0 ? false : _ref$compact,
128
- resourceLinkSchemes = _ref.resourceLinkSchemes,
129
- onFileClick = _ref.onFileClick,
130
- onResourceLinkClick = _ref.onResourceLinkClick,
131
- renderResourceLink = _ref.renderResourceLink,
132
- _ref$bareUrlAsText = _ref.bareUrlAsText,
133
- bareUrlAsText = _ref$bareUrlAsText === void 0 ? false : _ref$bareUrlAsText,
134
- _ref$highlightPlainMe = _ref.highlightPlainMentions,
135
- highlightPlainMentions = _ref$highlightPlainMe === void 0 ? false : _ref$highlightPlainMe;
124
+
125
+ // 从组件 props 中获取自定义 Markdown 扩展属性值,支持 kebab-case、camelCase 和 compactCase。
126
+ var getExtensionAttribute = function getExtensionAttribute(props, attribute) {
127
+ var _ref, _record$attribute;
128
+ var record = props;
129
+ var camelCase = attribute.replace(/-([a-z])/g, function (_, char) {
130
+ return char.toUpperCase();
131
+ });
132
+ var compact = attribute.replaceAll("-", "");
133
+ var value = (_ref = (_record$attribute = record[attribute]) !== null && _record$attribute !== void 0 ? _record$attribute : record[camelCase]) !== null && _ref !== void 0 ? _ref : record[compact];
134
+ return value === undefined || value === null ? undefined : String(value);
135
+ };
136
+
137
+ // 仅允许自定义 Markdown 扩展的安全属性,避免 XSS 注入。s
138
+ var getAllowedExtensionAttributes = function getAllowedExtensionAttributes(extension) {
139
+ return (extension.allowedAttributes || []).filter(function (attribute) {
140
+ return CUSTOM_ATTRIBUTE_NAME_REGEX.test(attribute) && !attribute.startsWith("on") && attribute !== "style" && attribute !== "srcdoc";
141
+ });
142
+ };
143
+ var createMarkdownExtensionComponent = function createMarkdownExtensionComponent(extension) {
144
+ var MarkdownExtensionComponent = function MarkdownExtensionComponent(props) {
145
+ var attributes = Object.fromEntries(getAllowedExtensionAttributes(extension).flatMap(function (attribute) {
146
+ var value = getExtensionAttribute(props, attribute);
147
+ return value === undefined ? [] : [[attribute, value]];
148
+ }));
149
+ var node = {
150
+ tagName: extension.tagName,
151
+ attributes: attributes,
152
+ text: extractText(props.children).trim(),
153
+ children: props.children
154
+ };
155
+ var customNode = extension.render(node);
156
+ return customNode === null ? /*#__PURE__*/_jsx(_Fragment, {
157
+ children: props.children
158
+ }) : customNode;
159
+ };
160
+ MarkdownExtensionComponent.displayName = "MarkdownExtension(".concat(extension.tagName, ")");
161
+ return MarkdownExtensionComponent;
162
+ };
163
+ var MarkdownRender = function MarkdownRender(_ref2) {
164
+ var text = _ref2.text,
165
+ _ref2$compact = _ref2.compact,
166
+ compact = _ref2$compact === void 0 ? false : _ref2$compact,
167
+ resourceLinkSchemes = _ref2.resourceLinkSchemes,
168
+ onFileClick = _ref2.onFileClick,
169
+ onResourceLinkClick = _ref2.onResourceLinkClick,
170
+ renderResourceLink = _ref2.renderResourceLink,
171
+ _ref2$markdownExtensi = _ref2.markdownExtensions,
172
+ markdownExtensions = _ref2$markdownExtensi === void 0 ? EMPTY_MARKDOWN_EXTENSIONS : _ref2$markdownExtensi,
173
+ _ref2$bareUrlAsText = _ref2.bareUrlAsText,
174
+ bareUrlAsText = _ref2$bareUrlAsText === void 0 ? false : _ref2$bareUrlAsText,
175
+ _ref2$highlightPlainM = _ref2.highlightPlainMentions,
176
+ highlightPlainMentions = _ref2$highlightPlainM === void 0 ? false : _ref2$highlightPlainM;
136
177
  var styles = useStyles();
137
178
  var displayText = highlightPlainMentions ? text.replace(/(^|[^\[a-z0-9_])@([a-z0-9][a-z0-9._-]*)/gi, function (_source, prefix, label) {
138
179
  return "".concat(prefix, "[").concat(escapeMarkdownLabel(label), "](").concat(PLAIN_MENTION_SENTINEL, "?label=").concat(encodeURIComponent(label), ")");
@@ -162,7 +203,7 @@ var MarkdownRender = function MarkdownRender(_ref) {
162
203
  return onResourceLinkClick === null || onResourceLinkClick === void 0 ? void 0 : onResourceLinkClick(resourceLink);
163
204
  },
164
205
  "aria-label": displayLabel,
165
- "data-xadk-resource-link": "true",
206
+ "data-xadk-resource-link": resourceLink.type,
166
207
  "data-resource-markdown": "[".concat(resourceLink.label, "](").concat(resourceLink.href, ")"),
167
208
  children: displayLabel
168
209
  });
@@ -216,7 +257,7 @@ var MarkdownRender = function MarkdownRender(_ref) {
216
257
  return onResourceLinkClick === null || onResourceLinkClick === void 0 ? void 0 : onResourceLinkClick(resourceLink);
217
258
  },
218
259
  "aria-label": displayLabel,
219
- "data-xadk-resource-link": "true",
260
+ "data-xadk-resource-link": resourceLink.type,
220
261
  "data-resource-markdown": "[".concat(resourceLink.label, "](").concat(resourceLink.href, ")"),
221
262
  children: displayLabel
222
263
  });
@@ -253,6 +294,30 @@ var MarkdownRender = function MarkdownRender(_ref) {
253
294
  children: props.children
254
295
  });
255
296
  }, [onFileClick, onResourceLinkClick, renderResourceLink, resourceLinkSchemes, styles.resourceLink, bareUrlAsText]);
297
+ var enabledMarkdownExtensions = React.useMemo(function () {
298
+ var registeredTags = new Set();
299
+ return markdownExtensions.filter(function (extension) {
300
+ var tagName = extension.tagName.toLowerCase();
301
+ if (!CUSTOM_TAG_NAME_REGEX.test(tagName) || registeredTags.has(tagName)) {
302
+ return false;
303
+ }
304
+ registeredTags.add(tagName);
305
+ return true;
306
+ });
307
+ }, [markdownExtensions]);
308
+ var dompurifyConfig = React.useMemo(function () {
309
+ var allowedAttributes = Array.from(new Set(enabledMarkdownExtensions.flatMap(function (extension) {
310
+ return _toConsumableArray(getAllowedExtensionAttributes(extension));
311
+ })));
312
+ return allowedAttributes.length ? {
313
+ ADD_ATTR: allowedAttributes
314
+ } : undefined;
315
+ }, [enabledMarkdownExtensions]);
316
+ var extensionComponents = React.useMemo(function () {
317
+ return Object.fromEntries(enabledMarkdownExtensions.map(function (extension) {
318
+ return [extension.tagName.toLowerCase(), createMarkdownExtensionComponent(extension)];
319
+ }));
320
+ }, [enabledMarkdownExtensions]);
256
321
  return /*#__PURE__*/_jsx("div", {
257
322
  className: "".concat(styles.markdownWrapper).concat(compact ? " ".concat(styles.markdownWrapperCompact) : ""),
258
323
  children: /*#__PURE__*/_jsx("div", {
@@ -261,16 +326,17 @@ var MarkdownRender = function MarkdownRender(_ref) {
261
326
  content: markdown,
262
327
  className: "x-markdown-light",
263
328
  paragraphTag: "div",
329
+ dompurifyConfig: dompurifyConfig,
264
330
  config: {
265
331
  extensions: Latex()
266
332
  },
267
- components: {
333
+ components: _objectSpread({
268
334
  tag: ThinkComponent,
269
335
  "resource-link": ResourceLinkComponent,
270
336
  "plain-mention": PlainMentionComponent,
271
337
  code: CodeComponent,
272
338
  a: LinkComponent
273
- },
339
+ }, extensionComponents),
274
340
  streaming: {
275
341
  enableAnimation: true,
276
342
  animationConfig: {
@@ -1 +1 @@
1
- {"version":3,"names":["React","XMarkdown","CodeHighlighter","Flex","Latex","useStyles","BarsOutlined","BulbOutlined","ThunderboltOutlined","CheckCircleOutlined","FileGallery","parseMarkdownResourceHref","getMarkdownResourceDisplayLabel","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","escapeMarkdownLabel","RESOURCE_LINK_SENTINEL","PLAIN_MENTION_SENTINEL","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","_ref$bareUrlAsText","bareUrlAsText","_ref$highlightPlainMe","highlightPlainMentions","styles","displayText","_source","prefix","label","concat","encodeURIComponent","markdown","link","href","schemes","replaceAll","ResourceLinkComponent","useCallback","linkText","resourceLink","displayLabel","customNode","onClick","PlainMentionComponent","LinkComponent","resolvedHref","resolvedLabel","internalUrl","URL","origin","pathname","searchParams","get","_unused","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 getMarkdownResourceDisplayLabel,\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 escapeMarkdownLabel = (value: string) =>\n value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\]/g, \"\\\\]\");\n\n// 使用标准 https 链接作为 Markdown AST 的内部载体,避免自定义 HTML 标签被解析器降级成纯文本。\nconst RESOURCE_LINK_SENTINEL = \"https://xadk.local/resource\";\nconst PLAIN_MENTION_SENTINEL = \"https://xadk.local/mention\";\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 * 将命中文件扩展名的裸 URL 当作纯文本展示,不升级为 FileGallery。\n * 用户消息应如实展示输入文本,除资源链接等业务扩展外不做额外富化。\n * 默认 false,保留 Agent 消息现有行为。\n */\n bareUrlAsText?: boolean;\n /** 将已经丢失资源 URI 的 @name 兼容渲染成只读高亮标签。 */\n highlightPlainMentions?: boolean;\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 bareUrlAsText = false,\n highlightPlainMentions = false,\n}) => {\n const styles = useStyles();\n const displayText = highlightPlainMentions\n ? text.replace(\n /(^|[^\\[a-z0-9_])@([a-z0-9][a-z0-9._-]*)/gi,\n (_source, prefix: string, label: string) =>\n `${prefix}[${escapeMarkdownLabel(label)}](${PLAIN_MENTION_SENTINEL}?label=${encodeURIComponent(label)})`,\n )\n : text;\n const markdown = replaceMarkdownResourceLinks(\n displayText,\n (link) => {\n // 非 http(s) 协议会被 Markdown 引擎清洗,先编码到内部标准链接中交给 a renderer 恢复。\n return `[${escapeMarkdownLabel(link.label)}](${RESOURCE_LINK_SENTINEL}?href=${encodeURIComponent(link.href)}&label=${encodeURIComponent(link.label)})`;\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 const displayLabel = getMarkdownResourceDisplayLabel(resourceLink.label);\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={displayLabel}\n data-xadk-resource-link=\"true\"\n data-resource-markdown={`[${resourceLink.label}](${resourceLink.href})`}\n >\n {displayLabel}\n </button>\n );\n },\n [\n onResourceLinkClick,\n renderResourceLink,\n resourceLinkSchemes,\n styles.resourceLink,\n ],\n );\n\n const PlainMentionComponent = React.useCallback(\n (props: ComponentProps) => {\n const label = String((props.label as string) || \"\") || extractText(props.children);\n return (\n <span\n className={styles.resourceLink}\n aria-label={label}\n data-xadk-resource-link=\"true\"\n >\n {label}\n </span>\n );\n },\n [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 let resolvedHref = href;\n let resolvedLabel = linkText;\n try {\n const internalUrl = new URL(href);\n if (internalUrl.origin + internalUrl.pathname === PLAIN_MENTION_SENTINEL) {\n const label = internalUrl.searchParams.get(\"label\") || linkText;\n return (\n <span\n className={styles.resourceLink}\n aria-label={label}\n data-xadk-resource-link=\"true\"\n >\n {label}\n </span>\n );\n }\n if (internalUrl.origin + internalUrl.pathname === RESOURCE_LINK_SENTINEL) {\n resolvedHref = internalUrl.searchParams.get(\"href\") || \"\";\n resolvedLabel = internalUrl.searchParams.get(\"label\") || linkText;\n }\n } catch {\n // 相对链接及非标准 URL 继续走原有解析逻辑。\n }\n const resourceLink = parseMarkdownResourceHref(resolvedHref, resolvedLabel, {\n schemes: resourceLinkSchemes,\n });\n\n if (resourceLink) {\n const displayLabel = getMarkdownResourceDisplayLabel(resourceLink.label);\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={displayLabel}\n data-xadk-resource-link=\"true\"\n data-resource-markdown={`[${resourceLink.label}](${resourceLink.href})`}\n >\n {displayLabel}\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 // 用户消息场景:裸 URL 不富化,直接展示为纯文本字符串\n if (bareUrlAsText) {\n return <>{linkText || href}</>;\n }\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 bareUrlAsText,\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 \"plain-mention\": PlainMentionComponent,\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","getMarkdownResourceDisplayLabel","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","escapeMarkdownLabel","value","replace","RESOURCE_LINK_SENTINEL","PLAIN_MENTION_SENTINEL","CUSTOM_TAG_NAME_REGEX","CUSTOM_ATTRIBUTE_NAME_REGEX","EMPTY_MARKDOWN_EXTENSIONS","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","getExtensionAttribute","attribute","_ref","_record$attribute","record","camelCase","_","char","toUpperCase","compact","replaceAll","undefined","getAllowedExtensionAttributes","extension","allowedAttributes","filter","test","startsWith","createMarkdownExtensionComponent","MarkdownExtensionComponent","attributes","Object","fromEntries","flatMap","node","tagName","text","trim","customNode","render","displayName","concat","MarkdownRender","_ref2","_ref2$compact","resourceLinkSchemes","onFileClick","onResourceLinkClick","renderResourceLink","_ref2$markdownExtensi","markdownExtensions","_ref2$bareUrlAsText","bareUrlAsText","_ref2$highlightPlainM","highlightPlainMentions","styles","displayText","_source","prefix","label","encodeURIComponent","markdown","link","href","schemes","ResourceLinkComponent","useCallback","linkText","resourceLink","displayLabel","onClick","PlainMentionComponent","LinkComponent","resolvedHref","resolvedLabel","internalUrl","URL","origin","pathname","searchParams","get","_unused","ext","mimeType","fileItem","fileUri","file","target","rel","enabledMarkdownExtensions","useMemo","registeredTags","Set","has","add","dompurifyConfig","from","_toConsumableArray","length","ADD_ATTR","extensionComponents","markdownWrapper","markdownWrapperCompact","markdownHost","markdownHostCompact","content","paragraphTag","config","extensions","components","_objectSpread","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 MarkdownExtension,\n MarkdownExtensionNode,\n MarkdownResourceLink,\n RenderMarkdownResourceLink,\n} from \"@/types\";\nimport {\n parseMarkdownResourceHref,\n getMarkdownResourceDisplayLabel,\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 escapeMarkdownLabel = (value: string) =>\n value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\]/g, \"\\\\]\");\n\n// 使用标准 https 链接作为 Markdown AST 的内部载体,避免自定义 HTML 标签被解析器降级成纯文本。\nconst RESOURCE_LINK_SENTINEL = \"https://xadk.local/resource\";\nconst PLAIN_MENTION_SENTINEL = \"https://xadk.local/mention\";\n// 仅开放符合 Custom Element 命名规则的标签,避免覆盖 a/code 等内置 Markdown 节点。\nconst CUSTOM_TAG_NAME_REGEX = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)+$/;\nconst CUSTOM_ATTRIBUTE_NAME_REGEX = /^[a-z][a-z0-9-]*$/;\nconst EMPTY_MARKDOWN_EXTENSIONS: readonly MarkdownExtension[] = [];\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 /** Markdown/XML 自定义标签扩展 */\n markdownExtensions?: readonly MarkdownExtension[];\n /**\n * 将命中文件扩展名的裸 URL 当作纯文本展示,不升级为 FileGallery。\n * 用户消息应如实展示输入文本,除资源链接等业务扩展外不做额外富化。\n * 默认 false,保留 Agent 消息现有行为。\n */\n bareUrlAsText?: boolean;\n /** 将已经丢失资源 URI 的 @name 兼容渲染成只读高亮标签。 */\n highlightPlainMentions?: boolean;\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\n// 从组件 props 中获取自定义 Markdown 扩展属性值,支持 kebab-case、camelCase 和 compactCase。\nconst getExtensionAttribute = (\n props: ComponentProps,\n attribute: string,\n): string | undefined => {\n const record = props as Record<string, unknown>;\n const camelCase = attribute.replace(/-([a-z])/g, (_, char: string) =>\n char.toUpperCase(),\n );\n const compact = attribute.replaceAll(\"-\", \"\");\n const value = record[attribute] ?? record[camelCase] ?? record[compact];\n return value === undefined || value === null ? undefined : String(value);\n};\n\n// 仅允许自定义 Markdown 扩展的安全属性,避免 XSS 注入。s\nconst getAllowedExtensionAttributes = (extension: MarkdownExtension) =>\n (extension.allowedAttributes || []).filter(\n (attribute) =>\n CUSTOM_ATTRIBUTE_NAME_REGEX.test(attribute) &&\n !attribute.startsWith(\"on\") &&\n attribute !== \"style\" &&\n attribute !== \"srcdoc\",\n );\n\nconst createMarkdownExtensionComponent = (\n extension: MarkdownExtension,\n): React.FC<ComponentProps> => {\n const MarkdownExtensionComponent: React.FC<ComponentProps> = (props) => {\n const attributes = Object.fromEntries(\n getAllowedExtensionAttributes(extension).flatMap((attribute) => {\n const value = getExtensionAttribute(props, attribute);\n return value === undefined ? [] : [[attribute, value]];\n }),\n );\n const node: MarkdownExtensionNode = {\n tagName: extension.tagName,\n attributes,\n text: extractText(props.children).trim(),\n children: props.children as React.ReactNode,\n };\n const customNode = extension.render(node);\n return customNode === null ? (\n <>{props.children as React.ReactNode}</>\n ) : (\n customNode\n );\n };\n MarkdownExtensionComponent.displayName = `MarkdownExtension(${extension.tagName})`;\n return MarkdownExtensionComponent;\n};\n\nconst MarkdownRender: React.FC<MarkdownRenderProps> = ({\n text,\n compact = false,\n resourceLinkSchemes,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n markdownExtensions = EMPTY_MARKDOWN_EXTENSIONS,\n bareUrlAsText = false,\n highlightPlainMentions = false,\n}) => {\n const styles = useStyles();\n const displayText = highlightPlainMentions\n ? text.replace(\n /(^|[^\\[a-z0-9_])@([a-z0-9][a-z0-9._-]*)/gi,\n (_source, prefix: string, label: string) =>\n `${prefix}[${escapeMarkdownLabel(label)}](${PLAIN_MENTION_SENTINEL}?label=${encodeURIComponent(label)})`,\n )\n : text;\n const markdown = replaceMarkdownResourceLinks(\n displayText,\n (link) => {\n // 非 http(s) 协议会被 Markdown 引擎清洗,先编码到内部标准链接中交给 a renderer 恢复。\n return `[${escapeMarkdownLabel(link.label)}](${RESOURCE_LINK_SENTINEL}?href=${encodeURIComponent(link.href)}&label=${encodeURIComponent(link.label)})`;\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 const displayLabel = getMarkdownResourceDisplayLabel(resourceLink.label);\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={displayLabel}\n data-xadk-resource-link={resourceLink.type}\n data-resource-markdown={`[${resourceLink.label}](${resourceLink.href})`}\n >\n {displayLabel}\n </button>\n );\n },\n [\n onResourceLinkClick,\n renderResourceLink,\n resourceLinkSchemes,\n styles.resourceLink,\n ],\n );\n\n const PlainMentionComponent = React.useCallback(\n (props: ComponentProps) => {\n const label =\n String((props.label as string) || \"\") || extractText(props.children);\n return (\n <span\n className={styles.resourceLink}\n aria-label={label}\n data-xadk-resource-link=\"true\"\n >\n {label}\n </span>\n );\n },\n [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 let resolvedHref = href;\n let resolvedLabel = linkText;\n try {\n const internalUrl = new URL(href);\n if (\n internalUrl.origin + internalUrl.pathname ===\n PLAIN_MENTION_SENTINEL\n ) {\n const label = internalUrl.searchParams.get(\"label\") || linkText;\n return (\n <span\n className={styles.resourceLink}\n aria-label={label}\n data-xadk-resource-link=\"true\"\n >\n {label}\n </span>\n );\n }\n if (\n internalUrl.origin + internalUrl.pathname ===\n RESOURCE_LINK_SENTINEL\n ) {\n resolvedHref = internalUrl.searchParams.get(\"href\") || \"\";\n resolvedLabel = internalUrl.searchParams.get(\"label\") || linkText;\n }\n } catch {\n // 相对链接及非标准 URL 继续走原有解析逻辑。\n }\n const resourceLink = parseMarkdownResourceHref(\n resolvedHref,\n resolvedLabel,\n {\n schemes: resourceLinkSchemes,\n },\n );\n\n if (resourceLink) {\n const displayLabel = getMarkdownResourceDisplayLabel(\n resourceLink.label,\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={displayLabel}\n data-xadk-resource-link={resourceLink.type}\n data-resource-markdown={`[${resourceLink.label}](${resourceLink.href})`}\n >\n {displayLabel}\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 // 用户消息场景:裸 URL 不富化,直接展示为纯文本字符串\n if (bareUrlAsText) {\n return <>{linkText || href}</>;\n }\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 bareUrlAsText,\n ],\n );\n\n const enabledMarkdownExtensions = React.useMemo(() => {\n const registeredTags = new Set<string>();\n return markdownExtensions.filter((extension) => {\n const tagName = extension.tagName.toLowerCase();\n if (!CUSTOM_TAG_NAME_REGEX.test(tagName) || registeredTags.has(tagName)) {\n return false;\n }\n registeredTags.add(tagName);\n return true;\n });\n }, [markdownExtensions]);\n const dompurifyConfig = React.useMemo(() => {\n const allowedAttributes = Array.from(\n new Set(\n enabledMarkdownExtensions.flatMap((extension) => [\n ...getAllowedExtensionAttributes(extension),\n ]),\n ),\n );\n return allowedAttributes.length\n ? { ADD_ATTR: allowedAttributes }\n : undefined;\n }, [enabledMarkdownExtensions]);\n const extensionComponents = React.useMemo(\n () =>\n Object.fromEntries(\n enabledMarkdownExtensions.map((extension) => [\n extension.tagName.toLowerCase(),\n createMarkdownExtensionComponent(extension),\n ]),\n ),\n [enabledMarkdownExtensions],\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 dompurifyConfig={dompurifyConfig}\n config={{\n extensions: Latex(),\n }}\n components={{\n tag: ThinkComponent,\n \"resource-link\": ResourceLinkComponent,\n \"plain-mention\": PlainMentionComponent,\n code: CodeComponent,\n a: LinkComponent,\n ...extensionComponents,\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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"}
@@ -7,8 +7,8 @@ export var useStyles = withBasicStyles(function () {
7
7
  markdownWrapper: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: grid;\n grid-template-columns: minmax(0, 1fr); /* \u5173\u952E\uFF1A\u5141\u8BB8\u5185\u5BB9\u6536\u7F29 */\n max-width: 100%; /* \u81EA\u5B9A\u4E49\u6700\u5927\u5BBD\u5EA6 */\n margin: 0 auto;\n "]))),
8
8
  markdownWrapperCompact: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: inline;\n margin: 0;\n max-width: none;\n "]))),
9
9
  markdownHost: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n container-type: inline-size;\n width: 100%;\n overflow: auto;\n\n /* ===== Markdown \u57FA\u7840\u6392\u7248 ===== */\n\n p {\n margin: 8px 0;\n line-height: 1.6;\n }\n\n ul,\n ol {\n padding-left: 20px;\n margin-top: 0;\n margin-bottom: 8px;\n }\n\n li {\n margin: 0 0 4px 0 !important;\n }\n\n u {\n text-decoration: underline;\n }\n\n em {\n font-style: italic;\n }\n\n /* ===== Table \u6837\u5F0F ===== */\n\n table {\n border-collapse: collapse;\n width: 100%;\n max-width: 100%;\n margin: 12px 0;\n font-size: 14px;\n }\n\n thead {\n background: #fafafa;\n }\n\n th,\n td {\n border: 1px solid #e5e6eb;\n padding: 8px 12px;\n text-align: left;\n }\n\n th {\n font-weight: 600;\n }\n\n tbody tr:hover {\n background: #fafafa;\n }\n\n /* ===== Code ===== */\n\n pre {\n margin: 12px 0;\n }\n\n ant-highlightCode {\n max-width: min(100%, 80ch);\n overflow-x: auto;\n }\n\n /* ===== \u56FE\u7247 ===== */\n\n img {\n max-width: 100%;\n border-radius: 6px;\n }\n "]))),
10
- markdownHostCompact: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n display: inline;\n width: auto;\n overflow: visible;\n\n .x-markdown-light,\n p,\n div {\n display: inline;\n margin: 0;\n line-height: inherit;\n }\n\n /* \u7528\u6237\u6D88\u606F\u91CC\u7684\u8D44\u6E90\u5F15\u7528\u91C7\u7528 Codex \u98CE\u683C\uFF1A\u84DD\u8272\u6587\u5B57\u9AD8\u4EAE\uFF0C\u4E0D\u989D\u5916\u5957\u6807\u7B7E\u5E95\u8272\u6216\u56FE\u6807\u3002 */\n [data-xadk-resource-link] {\n height: auto;\n margin: 0 4px;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n color: #1677ff;\n font-size: inherit;\n font-weight: 500;\n line-height: inherit;\n cursor: default;\n\n &:hover {\n border-color: transparent;\n background: transparent;\n color: #1677ff;\n }\n }\n "]))),
11
- resourceLink: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n height: 22px;\n margin: 0 2px;\n padding: 0 8px;\n border: 1px solid #d9e8ff;\n border-radius: 6px;\n background: #f5f9ff;\n color: #1f1f1f;\n font-size: 13px;\n line-height: 20px;\n vertical-align: baseline;\n cursor: pointer;\n\n &:hover {\n border-color: #91caff;\n background: #eaf3ff;\n }\n "])))
10
+ markdownHostCompact: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n display: inline;\n width: auto;\n overflow: visible;\n\n .x-markdown-light,\n p,\n div {\n display: inline;\n margin: 0;\n line-height: inherit;\n }\n\n /* \u7528\u6237\u6D88\u606F\u91CC\u7684\u666E\u901A\u8D44\u6E90\u5F15\u7528\u4FDD\u6301\u84DD\u8272\uFF1B\u77E5\u8BC6\u5E93\u5F15\u7528\u7528\u65E0\u5E95\u8272\u7070\u5B57\u4E0E\u8F93\u5165\u6846\u6807\u7B7E\u533A\u5206\u3002 */\n [data-xadk-resource-link] {\n height: auto;\n margin: 0 4px;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n color: #1677ff;\n font-size: inherit;\n font-weight: 500;\n line-height: inherit;\n cursor: default;\n\n &:hover {\n border-color: transparent;\n background: transparent;\n color: #1677ff;\n }\n }\n\n && [data-xadk-resource-link=\"kb\"] {\n padding: 0;\n border-radius: 0;\n background: transparent;\n color: #666666;\n\n &:hover {\n background: transparent;\n color: #666666;\n }\n }\n "]))),
11
+ resourceLink: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n height: 22px;\n margin: 0 2px;\n padding: 0 8px;\n border: 1px solid #d9e8ff;\n border-radius: 6px;\n background: #f5f9ff;\n color: #1f1f1f;\n font-size: 13px;\n line-height: 20px;\n vertical-align: baseline;\n cursor: pointer;\n\n &:hover {\n border-color: #91caff;\n background: #eaf3ff;\n }\n\n &[data-xadk-resource-link=\"kb\"] {\n border-color: #f1f1f1;\n background: #f1f1f1;\n color: #1a1a1a;\n\n &:hover {\n border-color: #e5e5e5;\n background: #e8e8e8;\n }\n }\n "])))
12
12
  };
13
13
  });
14
14
  export default useStyles;
@@ -1 +1 @@
1
- {"version":3,"names":["css","withBasicStyles","useStyles","markdownWrapper","_templateObject","_taggedTemplateLiteral","markdownWrapperCompact","_templateObject2","markdownHost","_templateObject3","markdownHostCompact","_templateObject4","resourceLink","_templateObject5"],"sources":["../../../../../../src/components/XAdkChatbot/components/MarkdownRender/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n markdownWrapper: css`\n display: grid;\n grid-template-columns: minmax(0, 1fr); /* 关键:允许内容收缩 */\n max-width: 100%; /* 自定义最大宽度 */\n margin: 0 auto;\n `,\n\n markdownWrapperCompact: css`\n display: inline;\n margin: 0;\n max-width: none;\n `,\n\n markdownHost: css`\n container-type: inline-size;\n width: 100%;\n overflow: auto;\n\n /* ===== Markdown 基础排版 ===== */\n\n p {\n margin: 8px 0;\n line-height: 1.6;\n }\n\n ul,\n ol {\n padding-left: 20px;\n margin-top: 0;\n margin-bottom: 8px;\n }\n\n li {\n margin: 0 0 4px 0 !important;\n }\n\n u {\n text-decoration: underline;\n }\n\n em {\n font-style: italic;\n }\n\n /* ===== Table 样式 ===== */\n\n table {\n border-collapse: collapse;\n width: 100%;\n max-width: 100%;\n margin: 12px 0;\n font-size: 14px;\n }\n\n thead {\n background: #fafafa;\n }\n\n th,\n td {\n border: 1px solid #e5e6eb;\n padding: 8px 12px;\n text-align: left;\n }\n\n th {\n font-weight: 600;\n }\n\n tbody tr:hover {\n background: #fafafa;\n }\n\n /* ===== Code ===== */\n\n pre {\n margin: 12px 0;\n }\n\n ant-highlightCode {\n max-width: min(100%, 80ch);\n overflow-x: auto;\n }\n\n /* ===== 图片 ===== */\n\n img {\n max-width: 100%;\n border-radius: 6px;\n }\n `,\n\n markdownHostCompact: css`\n display: inline;\n width: auto;\n overflow: visible;\n\n .x-markdown-light,\n p,\n div {\n display: inline;\n margin: 0;\n line-height: inherit;\n }\n\n /* 用户消息里的资源引用采用 Codex 风格:蓝色文字高亮,不额外套标签底色或图标。 */\n [data-xadk-resource-link] {\n height: auto;\n margin: 0 4px;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n color: #1677ff;\n font-size: inherit;\n font-weight: 500;\n line-height: inherit;\n cursor: default;\n\n &:hover {\n border-color: transparent;\n background: transparent;\n color: #1677ff;\n }\n }\n `,\n\n resourceLink: css`\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n height: 22px;\n margin: 0 2px;\n padding: 0 8px;\n border: 1px solid #d9e8ff;\n border-radius: 6px;\n background: #f5f9ff;\n color: #1f1f1f;\n font-size: 13px;\n line-height: 20px;\n vertical-align: baseline;\n cursor: pointer;\n\n &:hover {\n border-color: #91caff;\n background: #eaf3ff;\n }\n `,\n}));\n\nexport default useStyles;\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,eAAe,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,qOAKnB;IAEDC,sBAAsB,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,wEAI1B;IAEDG,YAAY,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,irCA6EhB;IAEDK,mBAAmB,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,o1BAiCvB;IAEDO,YAAY,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA;EAqBnB,CAAC;AAAA,CAAC,CAAC;AAEH,eAAeH,SAAS"}
1
+ {"version":3,"names":["css","withBasicStyles","useStyles","markdownWrapper","_templateObject","_taggedTemplateLiteral","markdownWrapperCompact","_templateObject2","markdownHost","_templateObject3","markdownHostCompact","_templateObject4","resourceLink","_templateObject5"],"sources":["../../../../../../src/components/XAdkChatbot/components/MarkdownRender/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n markdownWrapper: css`\n display: grid;\n grid-template-columns: minmax(0, 1fr); /* 关键:允许内容收缩 */\n max-width: 100%; /* 自定义最大宽度 */\n margin: 0 auto;\n `,\n\n markdownWrapperCompact: css`\n display: inline;\n margin: 0;\n max-width: none;\n `,\n\n markdownHost: css`\n container-type: inline-size;\n width: 100%;\n overflow: auto;\n\n /* ===== Markdown 基础排版 ===== */\n\n p {\n margin: 8px 0;\n line-height: 1.6;\n }\n\n ul,\n ol {\n padding-left: 20px;\n margin-top: 0;\n margin-bottom: 8px;\n }\n\n li {\n margin: 0 0 4px 0 !important;\n }\n\n u {\n text-decoration: underline;\n }\n\n em {\n font-style: italic;\n }\n\n /* ===== Table 样式 ===== */\n\n table {\n border-collapse: collapse;\n width: 100%;\n max-width: 100%;\n margin: 12px 0;\n font-size: 14px;\n }\n\n thead {\n background: #fafafa;\n }\n\n th,\n td {\n border: 1px solid #e5e6eb;\n padding: 8px 12px;\n text-align: left;\n }\n\n th {\n font-weight: 600;\n }\n\n tbody tr:hover {\n background: #fafafa;\n }\n\n /* ===== Code ===== */\n\n pre {\n margin: 12px 0;\n }\n\n ant-highlightCode {\n max-width: min(100%, 80ch);\n overflow-x: auto;\n }\n\n /* ===== 图片 ===== */\n\n img {\n max-width: 100%;\n border-radius: 6px;\n }\n `,\n\n markdownHostCompact: css`\n display: inline;\n width: auto;\n overflow: visible;\n\n .x-markdown-light,\n p,\n div {\n display: inline;\n margin: 0;\n line-height: inherit;\n }\n\n /* 用户消息里的普通资源引用保持蓝色;知识库引用用无底色灰字与输入框标签区分。 */\n [data-xadk-resource-link] {\n height: auto;\n margin: 0 4px;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n color: #1677ff;\n font-size: inherit;\n font-weight: 500;\n line-height: inherit;\n cursor: default;\n\n &:hover {\n border-color: transparent;\n background: transparent;\n color: #1677ff;\n }\n }\n\n && [data-xadk-resource-link=\"kb\"] {\n padding: 0;\n border-radius: 0;\n background: transparent;\n color: #666666;\n\n &:hover {\n background: transparent;\n color: #666666;\n }\n }\n `,\n\n resourceLink: css`\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n height: 22px;\n margin: 0 2px;\n padding: 0 8px;\n border: 1px solid #d9e8ff;\n border-radius: 6px;\n background: #f5f9ff;\n color: #1f1f1f;\n font-size: 13px;\n line-height: 20px;\n vertical-align: baseline;\n cursor: pointer;\n\n &:hover {\n border-color: #91caff;\n background: #eaf3ff;\n }\n\n &[data-xadk-resource-link=\"kb\"] {\n border-color: #f1f1f1;\n background: #f1f1f1;\n color: #1a1a1a;\n\n &:hover {\n border-color: #e5e5e5;\n background: #e8e8e8;\n }\n }\n `,\n\n}));\n\nexport default useStyles;\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,eAAe,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,qOAKnB;IAEDC,sBAAsB,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,wEAI1B;IAEDG,YAAY,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,irCA6EhB;IAEDK,mBAAmB,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,6kCA6CvB;IAEDO,YAAY,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA;EAiCnB,CAAC;AAAA,CAAC,CAAC;AAEH,eAAeH,SAAS"}
@@ -1,4 +1,4 @@
1
- import React from "react";
1
+ /// <reference types="react" />
2
2
  import type { XAdkChatbotProps, XAdkChatbotHandle } from "../../types";
3
3
  /**
4
4
  * XAdkChatbot - 增强版聊天组件
@@ -10,5 +10,5 @@ import type { XAdkChatbotProps, XAdkChatbotHandle } from "../../types";
10
10
  * - ✅ 操作栏 (重试/复制/日志)
11
11
  * - ✅ 欢迎页面 (agentName/agentIcon/description)
12
12
  */
13
- declare const XAdkChatbot: React.ForwardRefExoticComponent<XAdkChatbotProps & React.RefAttributes<XAdkChatbotHandle>>;
13
+ declare const XAdkChatbot: import("react").ForwardRefExoticComponent<XAdkChatbotProps & import("react").RefAttributes<XAdkChatbotHandle>>;
14
14
  export default XAdkChatbot;
@@ -1,6 +1,6 @@
1
1
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
- import React, { useMemo, useCallback, useEffect, useRef, useImperativeHandle, forwardRef } from "react";
3
+ import { useMemo, useCallback, useEffect, useRef, useImperativeHandle, forwardRef } from "react";
4
4
  import { Button, Flex, Tooltip, message as antdMessage } from "antd";
5
5
  import clsx from "clsx";
6
6
  import { SwapRightOutlined, ReloadOutlined, CopyOutlined, InfoCircleOutlined } from "@ant-design/icons";
@@ -11,7 +11,7 @@ import FunctionCallRender from "./components/FunctionCallRender";
11
11
  import FileGallery from "../FileGallery";
12
12
  import XAdkThoughtChain from "../XAdkThoughtChain";
13
13
  import { parseAgentMessage } from "../../utils";
14
- import { mergeChatStrategies } from "../../presets/xgroup";
14
+ import { mergeChatStrategies, resolvePresetMarkdownExtensions } from "../../presets/runtime";
15
15
  import { defaultToolKindResolver } from "../../types/FunctionCallRender";
16
16
  import { jsx as _jsx } from "react/jsx-runtime";
17
17
  import { jsxs as _jsxs } from "react/jsx-runtime";
@@ -59,6 +59,7 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
59
59
  onFileClick = _ref.onFileClick,
60
60
  onResourceLinkClick = _ref.onResourceLinkClick,
61
61
  renderResourceLink = _ref.renderResourceLink,
62
+ markdownExtensions = _ref.markdownExtensions,
62
63
  renderFunctionCall = _ref.renderFunctionCall,
63
64
  toolKindResolver = _ref.toolKindResolver,
64
65
  strategies = _ref.strategies,
@@ -89,6 +90,9 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
89
90
  var mergedStrategies = useMemo(function () {
90
91
  return mergeChatStrategies(preset, strategies);
91
92
  }, [preset, strategies]);
93
+ var mergedMarkdownExtensions = useMemo(function () {
94
+ return resolvePresetMarkdownExtensions(preset, markdownExtensions);
95
+ }, [markdownExtensions, preset]);
92
96
  var resolveToolKind = useCallback(function (name, msg) {
93
97
  var _ref2, _toolKindResolver, _mergedStrategies$res;
94
98
  return (_ref2 = (_toolKindResolver = toolKindResolver === null || toolKindResolver === void 0 ? void 0 : toolKindResolver(name)) !== null && _toolKindResolver !== void 0 ? _toolKindResolver : (_mergedStrategies$res = mergedStrategies.resolveToolKind) === null || _mergedStrategies$res === void 0 ? void 0 : _mergedStrategies$res.call(mergedStrategies, {
@@ -283,7 +287,8 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
283
287
  resourceLinkSchemes: resourceLinkSchemes,
284
288
  onFileClick: onFileClick,
285
289
  onResourceLinkClick: onResourceLinkClick,
286
- renderResourceLink: renderResourceLink
290
+ renderResourceLink: renderResourceLink,
291
+ markdownExtensions: mergedMarkdownExtensions
287
292
  }, "".concat(msg.id, "-").concat(i));
288
293
  }
289
294
  if (msg.functionCall) {
@@ -459,7 +464,8 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
459
464
  resourceLinkSchemes: resourceLinkSchemes,
460
465
  onFileClick: onFileClick,
461
466
  onResourceLinkClick: onResourceLinkClick,
462
- renderResourceLink: renderResourceLink
467
+ renderResourceLink: renderResourceLink,
468
+ markdownExtensions: mergedMarkdownExtensions
463
469
  })
464
470
  }, node.key);
465
471
  }), allFiles.length > 0 && /*#__PURE__*/_jsxs("div", {
@@ -512,7 +518,7 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
512
518
  }), actionExtraNode]
513
519
  })]
514
520
  }, group.id);
515
- }, [enableProcessParsing, parseOptions, parseProcessMessage, showFnCallDetail, onConfirm, loading, showRetry, showCopy, showLog, onRetry, onCopy, onShowLog, actions, actionsExtra, onFileClick, onResourceLinkClick, renderResourceLink, resourceLinkSchemes, styles, resolveToolKind, mergedStrategies]);
521
+ }, [enableProcessParsing, parseOptions, parseProcessMessage, showFnCallDetail, onConfirm, loading, showRetry, showCopy, showLog, onRetry, onCopy, onShowLog, actions, actionsExtra, onFileClick, onResourceLinkClick, renderResourceLink, mergedMarkdownExtensions, resourceLinkSchemes, styles, resolveToolKind, mergedStrategies]);
516
522
 
517
523
  // ========== 渲染用户消息组 ==========
518
524
  var renderUserGroup = useCallback(function (group) {
@@ -548,13 +554,14 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
548
554
  resourceLinkSchemes: resourceLinkSchemes,
549
555
  onFileClick: onFileClick,
550
556
  onResourceLinkClick: onResourceLinkClick,
551
- renderResourceLink: renderResourceLink
557
+ renderResourceLink: renderResourceLink,
558
+ markdownExtensions: mergedMarkdownExtensions
552
559
  })
553
560
  })]
554
561
  }, m.id || i);
555
562
  })
556
563
  }, group.id);
557
- }, [styles, onFileClick, onResourceLinkClick, renderResourceLink, resourceLinkSchemes]);
564
+ }, [styles, onFileClick, onResourceLinkClick, renderResourceLink, mergedMarkdownExtensions, resourceLinkSchemes]);
558
565
 
559
566
  // ========== 空状态 ==========
560
567
 
@@ -610,7 +617,8 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
610
617
  resourceLinkSchemes: resourceLinkSchemes,
611
618
  onFileClick: onFileClick,
612
619
  onResourceLinkClick: onResourceLinkClick,
613
- renderResourceLink: renderResourceLink
620
+ renderResourceLink: renderResourceLink,
621
+ markdownExtensions: mergedMarkdownExtensions
614
622
  })
615
623
  }), chatGroups.map(function (group, idx) {
616
624
  return group.role === "user" ? renderUserGroup(group) : renderBotGroup(group, idx === chatGroups.length - 1, renderFunctionCall);