@ai-group/chat-sdk 3.0.9 → 3.0.10

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 (78) hide show
  1. package/dist/cjs/components/FileGallery/index.js +7 -5
  2. package/dist/cjs/components/FileGallery/index.js.map +2 -2
  3. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +3 -0
  4. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +74 -2
  5. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +3 -3
  6. package/dist/cjs/components/XAdkChatbot/index.js +10 -7
  7. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  8. package/dist/cjs/types/FileGallery.d.ts +2 -0
  9. package/dist/cjs/types/FileGallery.js.map +1 -1
  10. package/dist/cjs/types/XAdkChatbot.d.ts +3 -0
  11. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  12. package/dist/esm/components/FileGallery/index.js +12 -5
  13. package/dist/esm/components/FileGallery/index.js.map +1 -1
  14. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +3 -0
  15. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +81 -2
  16. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
  17. package/dist/esm/components/XAdkChatbot/index.js +14 -8
  18. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  19. package/dist/esm/types/FileGallery.d.ts +2 -0
  20. package/dist/esm/types/FileGallery.js.map +1 -1
  21. package/dist/esm/types/XAdkChatbot.d.ts +3 -0
  22. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  23. package/dist/umd/chat-sdk.min.js +1 -1
  24. package/package.json +2 -3
  25. package/dist/cjs/components/FileGallery/FileGallery.stories.d.ts +0 -6
  26. package/dist/cjs/components/FileGallery/FileGallery.stories.js +0 -143
  27. package/dist/cjs/components/FileGallery/FileGallery.stories.js.map +0 -7
  28. package/dist/cjs/components/XAdkChatbot/XAdkChatbot.stories.d.ts +0 -13
  29. package/dist/cjs/components/XAdkChatbot/XAdkChatbot.stories.js +0 -633
  30. package/dist/cjs/components/XAdkChatbot/XAdkChatbot.stories.js.map +0 -7
  31. package/dist/cjs/components/XAdkProvider/XAdkProvider.stories.d.ts +0 -10
  32. package/dist/cjs/components/XAdkProvider/XAdkProvider.stories.js +0 -394
  33. package/dist/cjs/components/XAdkProvider/XAdkProvider.stories.js.map +0 -7
  34. package/dist/cjs/components/XAdkSender/XAdkSender.stories.d.ts +0 -6
  35. package/dist/cjs/components/XAdkSender/XAdkSender.stories.js +0 -121
  36. package/dist/cjs/components/XAdkSender/XAdkSender.stories.js.map +0 -7
  37. package/dist/cjs/components/XAiChatbot/XAiChatbot.stories.d.ts +0 -10
  38. package/dist/cjs/components/XAiChatbot/XAiChatbot.stories.js +0 -773
  39. package/dist/cjs/components/XAiChatbot/XAiChatbot.stories.js.map +0 -7
  40. package/dist/cjs/components/XAiConversations/XAiConversations.stories.d.ts +0 -6
  41. package/dist/cjs/components/XAiConversations/XAiConversations.stories.js +0 -83
  42. package/dist/cjs/components/XAiConversations/XAiConversations.stories.js.map +0 -7
  43. package/dist/cjs/components/XAiProvider/XAiProvider.stories.d.ts +0 -8
  44. package/dist/cjs/components/XAiProvider/XAiProvider.stories.js +0 -206
  45. package/dist/cjs/components/XAiProvider/XAiProvider.stories.js.map +0 -7
  46. package/dist/cjs/components/XAiSender/XAiSender.stories.d.ts +0 -6
  47. package/dist/cjs/components/XAiSender/XAiSender.stories.js +0 -102
  48. package/dist/cjs/components/XAiSender/XAiSender.stories.js.map +0 -7
  49. package/dist/cjs/components/XAiThoughtChain/XAiThoughtChain.stories.d.ts +0 -6
  50. package/dist/cjs/components/XAiThoughtChain/XAiThoughtChain.stories.js +0 -180
  51. package/dist/cjs/components/XAiThoughtChain/XAiThoughtChain.stories.js.map +0 -7
  52. package/dist/esm/components/FileGallery/FileGallery.stories.d.ts +0 -6
  53. package/dist/esm/components/FileGallery/FileGallery.stories.js +0 -48
  54. package/dist/esm/components/FileGallery/FileGallery.stories.js.map +0 -1
  55. package/dist/esm/components/XAdkChatbot/XAdkChatbot.stories.d.ts +0 -13
  56. package/dist/esm/components/XAdkChatbot/XAdkChatbot.stories.js +0 -510
  57. package/dist/esm/components/XAdkChatbot/XAdkChatbot.stories.js.map +0 -1
  58. package/dist/esm/components/XAdkProvider/XAdkProvider.stories.d.ts +0 -10
  59. package/dist/esm/components/XAdkProvider/XAdkProvider.stories.js +0 -338
  60. package/dist/esm/components/XAdkProvider/XAdkProvider.stories.js.map +0 -1
  61. package/dist/esm/components/XAdkSender/XAdkSender.stories.d.ts +0 -6
  62. package/dist/esm/components/XAdkSender/XAdkSender.stories.js +0 -128
  63. package/dist/esm/components/XAdkSender/XAdkSender.stories.js.map +0 -1
  64. package/dist/esm/components/XAiChatbot/XAiChatbot.stories.d.ts +0 -10
  65. package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js +0 -636
  66. package/dist/esm/components/XAiChatbot/XAiChatbot.stories.js.map +0 -1
  67. package/dist/esm/components/XAiConversations/XAiConversations.stories.d.ts +0 -6
  68. package/dist/esm/components/XAiConversations/XAiConversations.stories.js +0 -42
  69. package/dist/esm/components/XAiConversations/XAiConversations.stories.js.map +0 -1
  70. package/dist/esm/components/XAiProvider/XAiProvider.stories.d.ts +0 -8
  71. package/dist/esm/components/XAiProvider/XAiProvider.stories.js +0 -208
  72. package/dist/esm/components/XAiProvider/XAiProvider.stories.js.map +0 -1
  73. package/dist/esm/components/XAiSender/XAiSender.stories.d.ts +0 -6
  74. package/dist/esm/components/XAiSender/XAiSender.stories.js +0 -87
  75. package/dist/esm/components/XAiSender/XAiSender.stories.js.map +0 -1
  76. package/dist/esm/components/XAiThoughtChain/XAiThoughtChain.stories.d.ts +0 -6
  77. package/dist/esm/components/XAiThoughtChain/XAiThoughtChain.stories.js +0 -159
  78. package/dist/esm/components/XAiThoughtChain/XAiThoughtChain.stories.js.map +0 -1
@@ -1,3 +1,4 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
1
2
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
3
  import React, { useState, useEffect } from "react";
3
4
  import { Image, Tooltip, Progress } from "antd";
@@ -203,19 +204,20 @@ var FileGallery = function FileGallery(_ref) {
203
204
  _ref$onRemove = _ref.onRemove,
204
205
  onRemove = _ref$onRemove === void 0 ? function () {} : _ref$onRemove,
205
206
  className = _ref.className,
206
- style = _ref.style;
207
+ style = _ref.style,
208
+ _onClick = _ref.onClick;
207
209
  var _useState = useState(""),
208
210
  _useState2 = _slicedToArray(_useState, 2),
209
211
  objectUrl = _useState2[0],
210
212
  setObjectUrl = _useState2[1];
211
213
  useEffect(function () {
212
- if (!file.file) return;
214
+ if (!(file !== null && file !== void 0 && file.file)) return;
213
215
  var url = URL.createObjectURL(file.file);
214
216
  setObjectUrl(url);
215
217
  return function () {
216
218
  return URL.revokeObjectURL(url);
217
219
  };
218
- }, [file.file]);
220
+ }, [file === null || file === void 0 ? void 0 : file.file]);
219
221
  if (!file) return null;
220
222
  var isImage = isImageFile(file);
221
223
  var isAudio = isAudioFile(file);
@@ -359,7 +361,12 @@ var FileGallery = function FileGallery(_ref) {
359
361
  var isExternalUrl = url && url.startsWith("http");
360
362
  return /*#__PURE__*/_jsxs("div", {
361
363
  className: "".concat(styles.fileCard, " ").concat(align === "right" ? "align-right" : "", " ").concat(className || ""),
362
- style: style,
364
+ style: _objectSpread(_objectSpread({}, style), {}, {
365
+ cursor: _onClick ? "pointer" : undefined
366
+ }),
367
+ onClick: function onClick() {
368
+ return _onClick === null || _onClick === void 0 ? void 0 : _onClick(file);
369
+ },
363
370
  children: [/*#__PURE__*/_jsx("div", {
364
371
  className: styles.fileIcon,
365
372
  style: {
@@ -368,7 +375,7 @@ var FileGallery = function FileGallery(_ref) {
368
375
  children: icon
369
376
  }), /*#__PURE__*/_jsxs("div", {
370
377
  className: styles.fileInfo,
371
- children: [isExternalUrl ? /*#__PURE__*/_jsx("a", {
378
+ children: [isExternalUrl && !_onClick ? /*#__PURE__*/_jsx("a", {
372
379
  href: url,
373
380
  target: "_blank",
374
381
  rel: "noopener noreferrer",
@@ -1 +1 @@
1
- {"version":3,"names":["React","useState","useEffect","Image","Tooltip","Progress","FileOutlined","FilePdfOutlined","FileWordOutlined","FileExcelOutlined","FilePptOutlined","FileImageOutlined","CloseOutlined","AudioOutlined","VideoCameraOutlined","useStyles","jsx","_jsx","jsxs","_jsxs","getFileName","file","displayName","name","getFileSize","size","getMimeType","mimeType","type","getFileUrl","_file$response","_file$response2","fileUri","response","fileUrl","tempUrl","getFileId","id","uid","isImageFile","startsWith","fileName","match","url","isAudioFile","isVideoFile","getFileExtension","filename","ext","split","pop","toLowerCase","getFileIcon","icon","color","includes","formatFileSize","bytes","toFixed","styles","FileGallery","_ref","_ref$align","align","_ref$removable","removable","_ref$onRemove","onRemove","className","style","_useState","_useState2","_slicedToArray","objectUrl","setObjectUrl","URL","createObjectURL","revokeObjectURL","isImage","isAudio","isVideo","fileSize","fileId","concat","fileCard","children","imageThumbnail","src","alt","fallback","preview","status","imageOverlay","percent","progress","strokeColor","fileInfo","title","length","substring","Number","fileRemoveBtn","onClick","disabled","fileIcon","controls","mediaWrapper","width","height","_getFileIcon","isExternalUrl","href","target","rel","fileLink","showInfo","errorMessage","fontSize","marginTop"],"sources":["../../../../src/components/FileGallery/index.tsx"],"sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport { Image, Tooltip, Progress } from \"antd\";\nimport {\n FileOutlined,\n FilePdfOutlined,\n FileWordOutlined,\n FileExcelOutlined,\n FilePptOutlined,\n FileImageOutlined,\n CloseOutlined,\n AudioOutlined,\n VideoCameraOutlined,\n} from \"@ant-design/icons\";\nimport { FileItem, FileGalleryProps, FileItemComponentProps } from \"@/types\";\nimport { useStyles } from \"./styles\";\n\n// ==================== 工具函数 ====================\n\n/**\n * 获取文件名\n */\nconst getFileName = (file: FileItem): string => {\n return file.displayName || file.name || \"\";\n};\n\n/**\n * 获取文件大小\n */\nconst getFileSize = (file: FileItem): number => {\n return file.size || 0;\n};\n\n/**\n * 获取文件 MIME 类型\n */\nconst getMimeType = (file: FileItem): string => {\n return file.mimeType || file.type || \"\";\n};\n\n/**\n * 获取文件 URL\n */\nconst getFileUrl = (file: FileItem): string => {\n return (\n file.fileUri ||\n file.response?.fileUrl ||\n file.response?.tempUrl ||\n file.tempUrl ||\n \"\"\n );\n};\n\n/**\n * 获取文件唯一标识\n */\nconst getFileId = (file: FileItem): string => {\n return file.id || file.uid || \"\";\n};\n\n/**\n * 判断是否是图片文件\n */\nconst isImageFile = (file: FileItem): boolean => {\n const mimeType = getMimeType(file);\n if (mimeType && mimeType.startsWith(\"image/\")) return true;\n\n const fileName = getFileName(file);\n if (fileName && fileName.match(/\\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i))\n return true;\n\n const url = getFileUrl(file);\n if (url && url.match(/\\.(jpg|jpeg|png|gif|webp|bmp|svg)(\\?.*)?$/i))\n return true;\n\n return false;\n};\n\n/**\n * 判断是否是音频文件\n */\nconst isAudioFile = (file: FileItem): boolean => {\n const mimeType = getMimeType(file);\n if (mimeType && mimeType.startsWith(\"audio/\")) return true;\n\n const fileName = getFileName(file);\n return !!fileName?.match(/\\.(mp3|wav|m4a|aac|ogg|flac)$/i);\n};\n\n/**\n * 判断是否是视频文件\n */\nconst isVideoFile = (file: FileItem): boolean => {\n const mimeType = getMimeType(file);\n if (mimeType && mimeType.startsWith(\"video/\")) return true;\n\n const fileName = getFileName(file);\n return !!fileName?.match(/\\.(mp4|mov|webm|mkv|avi)$/i);\n};\n\n/**\n * 获取文件扩展名\n */\nconst getFileExtension = (filename: string): string => {\n const ext = filename.split(\".\").pop();\n return ext ? ext.toLowerCase() : \"\";\n};\n\n/**\n * 获取文件图标和颜色\n */\nconst getFileIcon = (\n file: FileItem,\n): { icon: React.ReactNode; color: string } => {\n const ext = getFileExtension(getFileName(file));\n\n // PDF\n if (ext === \"pdf\") {\n return { icon: <FilePdfOutlined />, color: \"#ff4d4f\" };\n }\n\n // Word\n if ([\"doc\", \"docx\"].includes(ext)) {\n return { icon: <FileWordOutlined />, color: \"#1677ff\" };\n }\n\n // Excel\n if ([\"xls\", \"xlsx\", \"csv\"].includes(ext)) {\n return { icon: <FileExcelOutlined />, color: \"#22b35e\" };\n }\n\n // PPT\n if ([\"ppt\", \"pptx\"].includes(ext)) {\n return { icon: <FilePptOutlined />, color: \"#ff6e31\" };\n }\n\n // Audio\n if ([\"mp3\", \"wav\", \"m4a\", \"aac\", \"ogg\", \"flac\"].includes(ext)) {\n return { icon: <AudioOutlined />, color: \"#722ed1\" };\n }\n\n // Video\n if ([\"mp4\", \"mov\", \"webm\", \"mkv\", \"avi\"].includes(ext)) {\n return { icon: <VideoCameraOutlined />, color: \"#fa8c16\" };\n }\n\n // 图片\n if (isImageFile(file)) {\n return { icon: <FileImageOutlined />, color: \"#8c8c8c\" };\n }\n\n // 默认\n return { icon: <FileOutlined />, color: \"#8c8c8c\" };\n};\n\n/**\n * 格式化文件大小\n */\nconst formatFileSize = (bytes: number): string => {\n if (bytes < 1024) return bytes + \" B\";\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + \" KB\";\n return (bytes / (1024 * 1024)).toFixed(1) + \" MB\";\n};\n\nconst styles = useStyles();\n\n/**\n * FileGallery - 单文件展示组件\n *\n * 功能特性:\n * - 📁 支持多种文件类型展示 (图片、音频、视频、文档等)\n * - 🖼️ 图片支持预览和缩略图\n * - 🎵 音频文件支持内联播放\n * - 🎬 视频文件支持内联播放\n * - 📊 显示文件大小、类型图标\n * - 🗑️ 支持删除操作\n * - 📤 支持上传进度显示\n * - 🎨 支持卡片内部布局控制(align:图标和信息的排列方式)\n *\n * @example\n * // XAdkSender 场景 - 可删除的本地文件\n * {files.map(file => (\n * <FileGallery\n * key={file.id}\n * file={file}\n * removable\n * onRemove={handleRemove}\n * />\n * ))}\n *\n * @example\n * // XadkChatbot 场景 - 只读的远程文件\n * {files.map(file => (\n * <FileGallery key={file.id} file={file} />\n * ))}\n */\nconst FileGallery: React.FC<FileGalleryProps> = ({\n file,\n align = \"left\",\n removable = false,\n onRemove = () => {},\n className,\n style,\n}) => {\n const [objectUrl, setObjectUrl] = useState(\"\");\n\n useEffect(() => {\n if (!file.file) return;\n\n const url = URL.createObjectURL(file.file);\n setObjectUrl(url);\n\n return () => URL.revokeObjectURL(url);\n }, [file.file]);\n\n if (!file) return null;\n\n const isImage = isImageFile(file);\n const isAudio = isAudioFile(file);\n const isVideo = isVideoFile(file);\n const fileName = getFileName(file);\n const fileSize = getFileSize(file);\n const fileId = getFileId(file);\n const url = getFileUrl(file) || objectUrl;\n\n // 图片文件\n if (isImage) {\n return (\n <div\n className={`${styles.fileCard} ${align === \"right\" ? \"align-right\" : \"\"} ${className || \"\"}`}\n style={style}\n >\n {/* 图片缩略图 */}\n <div className={styles.imageThumbnail}>\n <Image\n src={url}\n alt={fileName}\n fallback=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mN8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==\"\n preview={{\n src: url,\n }}\n />\n\n {/* 上传进度遮罩 */}\n {file.status === \"uploading\" && (\n <div className={styles.imageOverlay}>\n <Progress\n type=\"circle\"\n percent={file.progress}\n size={30}\n strokeColor=\"#1677ff\"\n />\n </div>\n )}\n </div>\n\n {/* 文件信息 */}\n <div className={styles.fileInfo}>\n <Tooltip title={fileName}>\n <div className={styles.fileName}>\n {fileName.length > 15\n ? `${fileName.substring(0, 15)}...`\n : fileName}\n </div>\n </Tooltip>\n {Number(file?.size) > 0 && (\n <div className={styles.fileSize}>{formatFileSize(fileSize)}</div>\n )}\n </div>\n\n {/* 删除按钮 */}\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n }\n\n // 音频文件\n if (isAudio) {\n return (\n <div\n className={`${styles.fileCard} ${align === \"right\" ? \"align-right\" : \"\"} ${className || \"\"}`}\n style={style}\n >\n <div className={styles.fileIcon} style={{ color: \"#722ed1\" }}>\n <AudioOutlined />\n </div>\n\n <div className={styles.fileInfo}>\n <Tooltip title={fileName}>\n <div className={styles.fileName}>{fileName}</div>\n </Tooltip>\n\n <audio\n src={url}\n controls\n className={styles.mediaWrapper}\n style={{ width: \"100%\", height: 28 }}\n />\n </div>\n\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n }\n\n // 视频文件\n if (isVideo) {\n return (\n <div\n className={`${styles.fileCard} ${align === \"right\" ? \"align-right\" : \"\"} ${className || \"\"}`}\n style={style}\n >\n <div className={styles.fileIcon} style={{ color: \"#fa8c16\" }}>\n <VideoCameraOutlined />\n </div>\n\n <div className={styles.fileInfo}>\n <Tooltip title={fileName}>\n <div className={styles.fileName}>{fileName}</div>\n </Tooltip>\n\n <video\n src={url}\n controls\n className={styles.mediaWrapper}\n style={{ width: \"100%\", height: 40 }}\n />\n </div>\n\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n }\n\n // 其他文件\n const { icon, color } = getFileIcon(file);\n const isExternalUrl = url && url.startsWith(\"http\");\n\n return (\n <div\n className={`${styles.fileCard} ${align === \"right\" ? \"align-right\" : \"\"} ${className || \"\"}`}\n style={style}\n >\n <div className={styles.fileIcon} style={{ color }}>\n {icon}\n </div>\n\n <div className={styles.fileInfo}>\n {isExternalUrl ? (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.fileLink}\n >\n <Tooltip title={fileName}>\n <div className={styles.fileName}>\n {fileName.length > 15\n ? `${fileName.substring(0, 15)}...`\n : fileName}\n </div>\n </Tooltip>\n </a>\n ) : (\n <Tooltip title={fileName}>\n <div className={styles.fileName}>\n {fileName.length > 15\n ? `${fileName.substring(0, 15)}...`\n : fileName}\n </div>\n </Tooltip>\n )}\n\n {file.status === \"uploading\" ? (\n <Progress\n percent={file.progress}\n size=\"small\"\n showInfo={false}\n strokeColor=\"#1677ff\"\n className={styles.progress}\n />\n ) : (\n fileSize > 0 && (\n <div className={styles.fileSize}>{formatFileSize(fileSize)}</div>\n )\n )}\n\n {file.status === \"error\" && file.errorMessage && (\n <div\n style={{\n fontSize: \"11px\",\n color: \"#ff4d4f\",\n marginTop: \"2px\",\n }}\n >\n {file.errorMessage}\n </div>\n )}\n </div>\n\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n};\n\nexport default FileGallery;\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useState","useEffect","Image","Tooltip","Progress","FileOutlined","FilePdfOutlined","FileWordOutlined","FileExcelOutlined","FilePptOutlined","FileImageOutlined","CloseOutlined","AudioOutlined","VideoCameraOutlined","useStyles","jsx","_jsx","jsxs","_jsxs","getFileName","file","displayName","name","getFileSize","size","getMimeType","mimeType","type","getFileUrl","_file$response","_file$response2","fileUri","response","fileUrl","tempUrl","getFileId","id","uid","isImageFile","startsWith","fileName","match","url","isAudioFile","isVideoFile","getFileExtension","filename","ext","split","pop","toLowerCase","getFileIcon","icon","color","includes","formatFileSize","bytes","toFixed","styles","FileGallery","_ref","_ref$align","align","_ref$removable","removable","_ref$onRemove","onRemove","className","style","onClick","_useState","_useState2","_slicedToArray","objectUrl","setObjectUrl","URL","createObjectURL","revokeObjectURL","isImage","isAudio","isVideo","fileSize","fileId","concat","fileCard","children","imageThumbnail","src","alt","fallback","preview","status","imageOverlay","percent","progress","strokeColor","fileInfo","title","length","substring","Number","fileRemoveBtn","disabled","fileIcon","controls","mediaWrapper","width","height","_getFileIcon","isExternalUrl","_objectSpread","cursor","undefined","href","target","rel","fileLink","showInfo","errorMessage","fontSize","marginTop"],"sources":["../../../../src/components/FileGallery/index.tsx"],"sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport { Image, Tooltip, Progress } from \"antd\";\nimport {\n FileOutlined,\n FilePdfOutlined,\n FileWordOutlined,\n FileExcelOutlined,\n FilePptOutlined,\n FileImageOutlined,\n CloseOutlined,\n AudioOutlined,\n VideoCameraOutlined,\n} from \"@ant-design/icons\";\nimport { FileItem, FileGalleryProps, FileItemComponentProps } from \"@/types\";\nimport { useStyles } from \"./styles\";\n\n// ==================== 工具函数 ====================\n\n/**\n * 获取文件名\n */\nconst getFileName = (file: FileItem): string => {\n return file.displayName || file.name || \"\";\n};\n\n/**\n * 获取文件大小\n */\nconst getFileSize = (file: FileItem): number => {\n return file.size || 0;\n};\n\n/**\n * 获取文件 MIME 类型\n */\nconst getMimeType = (file: FileItem): string => {\n return file.mimeType || file.type || \"\";\n};\n\n/**\n * 获取文件 URL\n */\nconst getFileUrl = (file: FileItem): string => {\n return (\n file.fileUri ||\n file.response?.fileUrl ||\n file.response?.tempUrl ||\n file.tempUrl ||\n \"\"\n );\n};\n\n/**\n * 获取文件唯一标识\n */\nconst getFileId = (file: FileItem): string => {\n return file.id || file.uid || \"\";\n};\n\n/**\n * 判断是否是图片文件\n */\nconst isImageFile = (file: FileItem): boolean => {\n const mimeType = getMimeType(file);\n if (mimeType && mimeType.startsWith(\"image/\")) return true;\n\n const fileName = getFileName(file);\n if (fileName && fileName.match(/\\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i))\n return true;\n\n const url = getFileUrl(file);\n if (url && url.match(/\\.(jpg|jpeg|png|gif|webp|bmp|svg)(\\?.*)?$/i))\n return true;\n\n return false;\n};\n\n/**\n * 判断是否是音频文件\n */\nconst isAudioFile = (file: FileItem): boolean => {\n const mimeType = getMimeType(file);\n if (mimeType && mimeType.startsWith(\"audio/\")) return true;\n\n const fileName = getFileName(file);\n return !!fileName?.match(/\\.(mp3|wav|m4a|aac|ogg|flac)$/i);\n};\n\n/**\n * 判断是否是视频文件\n */\nconst isVideoFile = (file: FileItem): boolean => {\n const mimeType = getMimeType(file);\n if (mimeType && mimeType.startsWith(\"video/\")) return true;\n\n const fileName = getFileName(file);\n return !!fileName?.match(/\\.(mp4|mov|webm|mkv|avi)$/i);\n};\n\n/**\n * 获取文件扩展名\n */\nconst getFileExtension = (filename: string): string => {\n const ext = filename.split(\".\").pop();\n return ext ? ext.toLowerCase() : \"\";\n};\n\n/**\n * 获取文件图标和颜色\n */\nconst getFileIcon = (\n file: FileItem,\n): { icon: React.ReactNode; color: string } => {\n const ext = getFileExtension(getFileName(file));\n\n // PDF\n if (ext === \"pdf\") {\n return { icon: <FilePdfOutlined />, color: \"#ff4d4f\" };\n }\n\n // Word\n if ([\"doc\", \"docx\"].includes(ext)) {\n return { icon: <FileWordOutlined />, color: \"#1677ff\" };\n }\n\n // Excel\n if ([\"xls\", \"xlsx\", \"csv\"].includes(ext)) {\n return { icon: <FileExcelOutlined />, color: \"#22b35e\" };\n }\n\n // PPT\n if ([\"ppt\", \"pptx\"].includes(ext)) {\n return { icon: <FilePptOutlined />, color: \"#ff6e31\" };\n }\n\n // Audio\n if ([\"mp3\", \"wav\", \"m4a\", \"aac\", \"ogg\", \"flac\"].includes(ext)) {\n return { icon: <AudioOutlined />, color: \"#722ed1\" };\n }\n\n // Video\n if ([\"mp4\", \"mov\", \"webm\", \"mkv\", \"avi\"].includes(ext)) {\n return { icon: <VideoCameraOutlined />, color: \"#fa8c16\" };\n }\n\n // 图片\n if (isImageFile(file)) {\n return { icon: <FileImageOutlined />, color: \"#8c8c8c\" };\n }\n\n // 默认\n return { icon: <FileOutlined />, color: \"#8c8c8c\" };\n};\n\n/**\n * 格式化文件大小\n */\nconst formatFileSize = (bytes: number): string => {\n if (bytes < 1024) return bytes + \" B\";\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + \" KB\";\n return (bytes / (1024 * 1024)).toFixed(1) + \" MB\";\n};\n\nconst styles = useStyles();\n\n/**\n * FileGallery - 单文件展示组件\n *\n * 功能特性:\n * - 📁 支持多种文件类型展示 (图片、音频、视频、文档等)\n * - 🖼️ 图片支持预览和缩略图\n * - 🎵 音频文件支持内联播放\n * - 🎬 视频文件支持内联播放\n * - 📊 显示文件大小、类型图标\n * - 🗑️ 支持删除操作\n * - 📤 支持上传进度显示\n * - 🎨 支持卡片内部布局控制(align:图标和信息的排列方式)\n *\n * @example\n * // XAdkSender 场景 - 可删除的本地文件\n * {files.map(file => (\n * <FileGallery\n * key={file.id}\n * file={file}\n * removable\n * onRemove={handleRemove}\n * />\n * ))}\n *\n * @example\n * // XadkChatbot 场景 - 只读的远程文件\n * {files.map(file => (\n * <FileGallery key={file.id} file={file} />\n * ))}\n */\nconst FileGallery: React.FC<FileGalleryProps> = ({\n file,\n align = \"left\",\n removable = false,\n onRemove = () => {},\n className,\n style,\n onClick,\n}) => {\n const [objectUrl, setObjectUrl] = useState(\"\");\n\n useEffect(() => {\n if (!file?.file) return;\n\n const url = URL.createObjectURL(file.file);\n setObjectUrl(url);\n\n return () => URL.revokeObjectURL(url);\n }, [file?.file]);\n\n if (!file) return null;\n\n const isImage = isImageFile(file);\n const isAudio = isAudioFile(file);\n const isVideo = isVideoFile(file);\n const fileName = getFileName(file);\n const fileSize = getFileSize(file);\n const fileId = getFileId(file);\n const url = getFileUrl(file) || objectUrl;\n\n // 图片文件\n if (isImage) {\n return (\n <div\n className={`${styles.fileCard} ${align === \"right\" ? \"align-right\" : \"\"} ${className || \"\"}`}\n style={style}\n >\n {/* 图片缩略图 */}\n <div className={styles.imageThumbnail}>\n <Image\n src={url}\n alt={fileName}\n fallback=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mN8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==\"\n preview={{\n src: url,\n }}\n />\n\n {/* 上传进度遮罩 */}\n {file.status === \"uploading\" && (\n <div className={styles.imageOverlay}>\n <Progress\n type=\"circle\"\n percent={file.progress}\n size={30}\n strokeColor=\"#1677ff\"\n />\n </div>\n )}\n </div>\n\n {/* 文件信息 */}\n <div className={styles.fileInfo}>\n <Tooltip title={fileName}>\n <div className={styles.fileName}>\n {fileName.length > 15\n ? `${fileName.substring(0, 15)}...`\n : fileName}\n </div>\n </Tooltip>\n {Number(file?.size) > 0 && (\n <div className={styles.fileSize}>{formatFileSize(fileSize)}</div>\n )}\n </div>\n\n {/* 删除按钮 */}\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n }\n\n // 音频文件\n if (isAudio) {\n return (\n <div\n className={`${styles.fileCard} ${align === \"right\" ? \"align-right\" : \"\"} ${className || \"\"}`}\n style={style}\n >\n <div className={styles.fileIcon} style={{ color: \"#722ed1\" }}>\n <AudioOutlined />\n </div>\n\n <div className={styles.fileInfo}>\n <Tooltip title={fileName}>\n <div className={styles.fileName}>{fileName}</div>\n </Tooltip>\n\n <audio\n src={url}\n controls\n className={styles.mediaWrapper}\n style={{ width: \"100%\", height: 28 }}\n />\n </div>\n\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n }\n\n // 视频文件\n if (isVideo) {\n return (\n <div\n className={`${styles.fileCard} ${align === \"right\" ? \"align-right\" : \"\"} ${className || \"\"}`}\n style={style}\n >\n <div className={styles.fileIcon} style={{ color: \"#fa8c16\" }}>\n <VideoCameraOutlined />\n </div>\n\n <div className={styles.fileInfo}>\n <Tooltip title={fileName}>\n <div className={styles.fileName}>{fileName}</div>\n </Tooltip>\n\n <video\n src={url}\n controls\n className={styles.mediaWrapper}\n style={{ width: \"100%\", height: 40 }}\n />\n </div>\n\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n }\n\n // 其他文件\n const { icon, color } = getFileIcon(file);\n const isExternalUrl = url && url.startsWith(\"http\");\n\n return (\n <div\n className={`${styles.fileCard} ${align === \"right\" ? \"align-right\" : \"\"} ${className || \"\"}`}\n style={{ ...style, cursor: onClick ? \"pointer\" : undefined }}\n onClick={() => onClick?.(file)}\n >\n <div className={styles.fileIcon} style={{ color }}>\n {icon}\n </div>\n\n <div className={styles.fileInfo}>\n {isExternalUrl && !onClick ? (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.fileLink}\n >\n <Tooltip title={fileName}>\n <div className={styles.fileName}>\n {fileName.length > 15\n ? `${fileName.substring(0, 15)}...`\n : fileName}\n </div>\n </Tooltip>\n </a>\n ) : (\n <Tooltip title={fileName}>\n <div className={styles.fileName}>\n {fileName.length > 15\n ? `${fileName.substring(0, 15)}...`\n : fileName}\n </div>\n </Tooltip>\n )}\n\n {file.status === \"uploading\" ? (\n <Progress\n percent={file.progress}\n size=\"small\"\n showInfo={false}\n strokeColor=\"#1677ff\"\n className={styles.progress}\n />\n ) : (\n fileSize > 0 && (\n <div className={styles.fileSize}>{formatFileSize(fileSize)}</div>\n )\n )}\n\n {file.status === \"error\" && file.errorMessage && (\n <div\n style={{\n fontSize: \"11px\",\n color: \"#ff4d4f\",\n marginTop: \"2px\",\n }}\n >\n {file.errorMessage}\n </div>\n )}\n </div>\n\n {removable && (\n <button\n className={styles.fileRemoveBtn}\n onClick={() => onRemove(fileId)}\n disabled={file.status === \"uploading\"}\n aria-label=\"删除文件\"\n >\n <CloseOutlined />\n </button>\n )}\n </div>\n );\n};\n\nexport default FileGallery;\n"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,QAAQ,EAAEC,SAAS,QAAQ,OAAO;AAClD,SAASC,KAAK,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,MAAM;AAC/C,SACEC,YAAY,EACZC,eAAe,EACfC,gBAAgB,EAChBC,iBAAiB,EACjBC,eAAe,EACfC,iBAAiB,EACjBC,aAAa,EACbC,aAAa,EACbC,mBAAmB,QACd,mBAAmB;AAE1B,SAASC,SAAS;;AAElB;;AAEA;AACA;AACA;AAFA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAGA,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CAAIC,IAAc,EAAa;EAC9C,OAAOA,IAAI,CAACC,WAAW,IAAID,IAAI,CAACE,IAAI,IAAI,EAAE;AAC5C,CAAC;;AAED;AACA;AACA;AACA,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CAAIH,IAAc,EAAa;EAC9C,OAAOA,IAAI,CAACI,IAAI,IAAI,CAAC;AACvB,CAAC;;AAED;AACA;AACA;AACA,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CAAIL,IAAc,EAAa;EAC9C,OAAOA,IAAI,CAACM,QAAQ,IAAIN,IAAI,CAACO,IAAI,IAAI,EAAE;AACzC,CAAC;;AAED;AACA;AACA;AACA,IAAMC,UAAU,GAAG,SAAbA,UAAUA,CAAIR,IAAc,EAAa;EAAA,IAAAS,cAAA,EAAAC,eAAA;EAC7C,OACEV,IAAI,CAACW,OAAO,MAAAF,cAAA,GACZT,IAAI,CAACY,QAAQ,cAAAH,cAAA,uBAAbA,cAAA,CAAeI,OAAO,OAAAH,eAAA,GACtBV,IAAI,CAACY,QAAQ,cAAAF,eAAA,uBAAbA,eAAA,CAAeI,OAAO,KACtBd,IAAI,CAACc,OAAO,IACZ,EAAE;AAEN,CAAC;;AAED;AACA;AACA;AACA,IAAMC,SAAS,GAAG,SAAZA,SAASA,CAAIf,IAAc,EAAa;EAC5C,OAAOA,IAAI,CAACgB,EAAE,IAAIhB,IAAI,CAACiB,GAAG,IAAI,EAAE;AAClC,CAAC;;AAED;AACA;AACA;AACA,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CAAIlB,IAAc,EAAc;EAC/C,IAAMM,QAAQ,GAAGD,WAAW,CAACL,IAAI,CAAC;EAClC,IAAIM,QAAQ,IAAIA,QAAQ,CAACa,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,IAAI;EAE1D,IAAMC,QAAQ,GAAGrB,WAAW,CAACC,IAAI,CAAC;EAClC,IAAIoB,QAAQ,IAAIA,QAAQ,CAACC,KAAK,CAAC,qCAAqC,CAAC,EACnE,OAAO,IAAI;EAEb,IAAMC,GAAG,GAAGd,UAAU,CAACR,IAAI,CAAC;EAC5B,IAAIsB,GAAG,IAAIA,GAAG,CAACD,KAAK,CAAC,4CAA4C,CAAC,EAChE,OAAO,IAAI;EAEb,OAAO,KAAK;AACd,CAAC;;AAED;AACA;AACA;AACA,IAAME,WAAW,GAAG,SAAdA,WAAWA,CAAIvB,IAAc,EAAc;EAC/C,IAAMM,QAAQ,GAAGD,WAAW,CAACL,IAAI,CAAC;EAClC,IAAIM,QAAQ,IAAIA,QAAQ,CAACa,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,IAAI;EAE1D,IAAMC,QAAQ,GAAGrB,WAAW,CAACC,IAAI,CAAC;EAClC,OAAO,CAAC,EAACoB,QAAQ,aAARA,QAAQ,eAARA,QAAQ,CAAEC,KAAK,CAAC,gCAAgC,CAAC;AAC5D,CAAC;;AAED;AACA;AACA;AACA,IAAMG,WAAW,GAAG,SAAdA,WAAWA,CAAIxB,IAAc,EAAc;EAC/C,IAAMM,QAAQ,GAAGD,WAAW,CAACL,IAAI,CAAC;EAClC,IAAIM,QAAQ,IAAIA,QAAQ,CAACa,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,IAAI;EAE1D,IAAMC,QAAQ,GAAGrB,WAAW,CAACC,IAAI,CAAC;EAClC,OAAO,CAAC,EAACoB,QAAQ,aAARA,QAAQ,eAARA,QAAQ,CAAEC,KAAK,CAAC,4BAA4B,CAAC;AACxD,CAAC;;AAED;AACA;AACA;AACA,IAAMI,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAIC,QAAgB,EAAa;EACrD,IAAMC,GAAG,GAAGD,QAAQ,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;EACrC,OAAOF,GAAG,GAAGA,GAAG,CAACG,WAAW,CAAC,CAAC,GAAG,EAAE;AACrC,CAAC;;AAED;AACA;AACA;AACA,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CACf/B,IAAc,EAC+B;EAC7C,IAAM2B,GAAG,GAAGF,gBAAgB,CAAC1B,WAAW,CAACC,IAAI,CAAC,CAAC;;EAE/C;EACA,IAAI2B,GAAG,KAAK,KAAK,EAAE;IACjB,OAAO;MAAEK,IAAI,eAAEpC,IAAA,CAACV,eAAe,IAAE,CAAC;MAAE+C,KAAK,EAAE;IAAU,CAAC;EACxD;;EAEA;EACA,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAACC,QAAQ,CAACP,GAAG,CAAC,EAAE;IACjC,OAAO;MAAEK,IAAI,eAAEpC,IAAA,CAACT,gBAAgB,IAAE,CAAC;MAAE8C,KAAK,EAAE;IAAU,CAAC;EACzD;;EAEA;EACA,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACP,GAAG,CAAC,EAAE;IACxC,OAAO;MAAEK,IAAI,eAAEpC,IAAA,CAACR,iBAAiB,IAAE,CAAC;MAAE6C,KAAK,EAAE;IAAU,CAAC;EAC1D;;EAEA;EACA,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAACC,QAAQ,CAACP,GAAG,CAAC,EAAE;IACjC,OAAO;MAAEK,IAAI,eAAEpC,IAAA,CAACP,eAAe,IAAE,CAAC;MAAE4C,KAAK,EAAE;IAAU,CAAC;EACxD;;EAEA;EACA,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAACC,QAAQ,CAACP,GAAG,CAAC,EAAE;IAC7D,OAAO;MAAEK,IAAI,eAAEpC,IAAA,CAACJ,aAAa,IAAE,CAAC;MAAEyC,KAAK,EAAE;IAAU,CAAC;EACtD;;EAEA;EACA,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAACC,QAAQ,CAACP,GAAG,CAAC,EAAE;IACtD,OAAO;MAAEK,IAAI,eAAEpC,IAAA,CAACH,mBAAmB,IAAE,CAAC;MAAEwC,KAAK,EAAE;IAAU,CAAC;EAC5D;;EAEA;EACA,IAAIf,WAAW,CAAClB,IAAI,CAAC,EAAE;IACrB,OAAO;MAAEgC,IAAI,eAAEpC,IAAA,CAACN,iBAAiB,IAAE,CAAC;MAAE2C,KAAK,EAAE;IAAU,CAAC;EAC1D;;EAEA;EACA,OAAO;IAAED,IAAI,eAAEpC,IAAA,CAACX,YAAY,IAAE,CAAC;IAAEgD,KAAK,EAAE;EAAU,CAAC;AACrD,CAAC;;AAED;AACA;AACA;AACA,IAAME,cAAc,GAAG,SAAjBA,cAAcA,CAAIC,KAAa,EAAa;EAChD,IAAIA,KAAK,GAAG,IAAI,EAAE,OAAOA,KAAK,GAAG,IAAI;EACrC,IAAIA,KAAK,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,CAACA,KAAK,GAAG,IAAI,EAAEC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK;EACjE,OAAO,CAACD,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,EAAEC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK;AACnD,CAAC;AAED,IAAMC,MAAM,GAAG5C,SAAS,CAAC,CAAC;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAM6C,WAAuC,GAAG,SAA1CA,WAAuCA,CAAAC,IAAA,EAQvC;EAAA,IAPJxC,IAAI,GAAAwC,IAAA,CAAJxC,IAAI;IAAAyC,UAAA,GAAAD,IAAA,CACJE,KAAK;IAALA,KAAK,GAAAD,UAAA,cAAG,MAAM,GAAAA,UAAA;IAAAE,cAAA,GAAAH,IAAA,CACdI,SAAS;IAATA,SAAS,GAAAD,cAAA,cAAG,KAAK,GAAAA,cAAA;IAAAE,aAAA,GAAAL,IAAA,CACjBM,QAAQ;IAARA,QAAQ,GAAAD,aAAA,cAAG,YAAM,CAAC,CAAC,GAAAA,aAAA;IACnBE,SAAS,GAAAP,IAAA,CAATO,SAAS;IACTC,KAAK,GAAAR,IAAA,CAALQ,KAAK;IACLC,QAAO,GAAAT,IAAA,CAAPS,OAAO;EAEP,IAAAC,SAAA,GAAkCtE,QAAQ,CAAC,EAAE,CAAC;IAAAuE,UAAA,GAAAC,cAAA,CAAAF,SAAA;IAAvCG,SAAS,GAAAF,UAAA;IAAEG,YAAY,GAAAH,UAAA;EAE9BtE,SAAS,CAAC,YAAM;IACd,IAAI,EAACmB,IAAI,aAAJA,IAAI,eAAJA,IAAI,CAAEA,IAAI,GAAE;IAEjB,IAAMsB,GAAG,GAAGiC,GAAG,CAACC,eAAe,CAACxD,IAAI,CAACA,IAAI,CAAC;IAC1CsD,YAAY,CAAChC,GAAG,CAAC;IAEjB,OAAO;MAAA,OAAMiC,GAAG,CAACE,eAAe,CAACnC,GAAG,CAAC;IAAA;EACvC,CAAC,EAAE,CAACtB,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEA,IAAI,CAAC,CAAC;EAEhB,IAAI,CAACA,IAAI,EAAE,OAAO,IAAI;EAEtB,IAAM0D,OAAO,GAAGxC,WAAW,CAAClB,IAAI,CAAC;EACjC,IAAM2D,OAAO,GAAGpC,WAAW,CAACvB,IAAI,CAAC;EACjC,IAAM4D,OAAO,GAAGpC,WAAW,CAACxB,IAAI,CAAC;EACjC,IAAMoB,QAAQ,GAAGrB,WAAW,CAACC,IAAI,CAAC;EAClC,IAAM6D,QAAQ,GAAG1D,WAAW,CAACH,IAAI,CAAC;EAClC,IAAM8D,MAAM,GAAG/C,SAAS,CAACf,IAAI,CAAC;EAC9B,IAAMsB,GAAG,GAAGd,UAAU,CAACR,IAAI,CAAC,IAAIqD,SAAS;;EAEzC;EACA,IAAIK,OAAO,EAAE;IACX,oBACE5D,KAAA;MACEiD,SAAS,KAAAgB,MAAA,CAAKzB,MAAM,CAAC0B,QAAQ,OAAAD,MAAA,CAAIrB,KAAK,KAAK,OAAO,GAAG,aAAa,GAAG,EAAE,OAAAqB,MAAA,CAAIhB,SAAS,IAAI,EAAE,CAAG;MAC7FC,KAAK,EAAEA,KAAM;MAAAiB,QAAA,gBAGbnE,KAAA;QAAKiD,SAAS,EAAET,MAAM,CAAC4B,cAAe;QAAAD,QAAA,gBACpCrE,IAAA,CAACd,KAAK;UACJqF,GAAG,EAAE7C,GAAI;UACT8C,GAAG,EAAEhD,QAAS;UACdiD,QAAQ,EAAC,wHAAwH;UACjIC,OAAO,EAAE;YACPH,GAAG,EAAE7C;UACP;QAAE,CACH,CAAC,EAGDtB,IAAI,CAACuE,MAAM,KAAK,WAAW,iBAC1B3E,IAAA;UAAKmD,SAAS,EAAET,MAAM,CAACkC,YAAa;UAAAP,QAAA,eAClCrE,IAAA,CAACZ,QAAQ;YACPuB,IAAI,EAAC,QAAQ;YACbkE,OAAO,EAAEzE,IAAI,CAAC0E,QAAS;YACvBtE,IAAI,EAAE,EAAG;YACTuE,WAAW,EAAC;UAAS,CACtB;QAAC,CACC,CACN;MAAA,CACE,CAAC,eAGN7E,KAAA;QAAKiD,SAAS,EAAET,MAAM,CAACsC,QAAS;QAAAX,QAAA,gBAC9BrE,IAAA,CAACb,OAAO;UAAC8F,KAAK,EAAEzD,QAAS;UAAA6C,QAAA,eACvBrE,IAAA;YAAKmD,SAAS,EAAET,MAAM,CAAClB,QAAS;YAAA6C,QAAA,EAC7B7C,QAAQ,CAAC0D,MAAM,GAAG,EAAE,MAAAf,MAAA,CACd3C,QAAQ,CAAC2D,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,WAC5B3D;UAAQ,CACT;QAAC,CACC,CAAC,EACT4D,MAAM,CAAChF,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEI,IAAI,CAAC,GAAG,CAAC,iBACrBR,IAAA;UAAKmD,SAAS,EAAET,MAAM,CAACuB,QAAS;UAAAI,QAAA,EAAE9B,cAAc,CAAC0B,QAAQ;QAAC,CAAM,CACjE;MAAA,CACE,CAAC,EAGLjB,SAAS,iBACRhD,IAAA;QACEmD,SAAS,EAAET,MAAM,CAAC2C,aAAc;QAChChC,OAAO,EAAE,SAAAA,QAAA;UAAA,OAAMH,QAAQ,CAACgB,MAAM,CAAC;QAAA,CAAC;QAChCoB,QAAQ,EAAElF,IAAI,CAACuE,MAAM,KAAK,WAAY;QACtC,cAAW,0BAAM;QAAAN,QAAA,eAEjBrE,IAAA,CAACL,aAAa,IAAE;MAAC,CACX,CACT;IAAA,CACE,CAAC;EAEV;;EAEA;EACA,IAAIoE,OAAO,EAAE;IACX,oBACE7D,KAAA;MACEiD,SAAS,KAAAgB,MAAA,CAAKzB,MAAM,CAAC0B,QAAQ,OAAAD,MAAA,CAAIrB,KAAK,KAAK,OAAO,GAAG,aAAa,GAAG,EAAE,OAAAqB,MAAA,CAAIhB,SAAS,IAAI,EAAE,CAAG;MAC7FC,KAAK,EAAEA,KAAM;MAAAiB,QAAA,gBAEbrE,IAAA;QAAKmD,SAAS,EAAET,MAAM,CAAC6C,QAAS;QAACnC,KAAK,EAAE;UAAEf,KAAK,EAAE;QAAU,CAAE;QAAAgC,QAAA,eAC3DrE,IAAA,CAACJ,aAAa,IAAE;MAAC,CACd,CAAC,eAENM,KAAA;QAAKiD,SAAS,EAAET,MAAM,CAACsC,QAAS;QAAAX,QAAA,gBAC9BrE,IAAA,CAACb,OAAO;UAAC8F,KAAK,EAAEzD,QAAS;UAAA6C,QAAA,eACvBrE,IAAA;YAAKmD,SAAS,EAAET,MAAM,CAAClB,QAAS;YAAA6C,QAAA,EAAE7C;UAAQ,CAAM;QAAC,CAC1C,CAAC,eAEVxB,IAAA;UACEuE,GAAG,EAAE7C,GAAI;UACT8D,QAAQ;UACRrC,SAAS,EAAET,MAAM,CAAC+C,YAAa;UAC/BrC,KAAK,EAAE;YAAEsC,KAAK,EAAE,MAAM;YAAEC,MAAM,EAAE;UAAG;QAAE,CACtC,CAAC;MAAA,CACC,CAAC,EAEL3C,SAAS,iBACRhD,IAAA;QACEmD,SAAS,EAAET,MAAM,CAAC2C,aAAc;QAChChC,OAAO,EAAE,SAAAA,QAAA;UAAA,OAAMH,QAAQ,CAACgB,MAAM,CAAC;QAAA,CAAC;QAChCoB,QAAQ,EAAElF,IAAI,CAACuE,MAAM,KAAK,WAAY;QACtC,cAAW,0BAAM;QAAAN,QAAA,eAEjBrE,IAAA,CAACL,aAAa,IAAE;MAAC,CACX,CACT;IAAA,CACE,CAAC;EAEV;;EAEA;EACA,IAAIqE,OAAO,EAAE;IACX,oBACE9D,KAAA;MACEiD,SAAS,KAAAgB,MAAA,CAAKzB,MAAM,CAAC0B,QAAQ,OAAAD,MAAA,CAAIrB,KAAK,KAAK,OAAO,GAAG,aAAa,GAAG,EAAE,OAAAqB,MAAA,CAAIhB,SAAS,IAAI,EAAE,CAAG;MAC7FC,KAAK,EAAEA,KAAM;MAAAiB,QAAA,gBAEbrE,IAAA;QAAKmD,SAAS,EAAET,MAAM,CAAC6C,QAAS;QAACnC,KAAK,EAAE;UAAEf,KAAK,EAAE;QAAU,CAAE;QAAAgC,QAAA,eAC3DrE,IAAA,CAACH,mBAAmB,IAAE;MAAC,CACpB,CAAC,eAENK,KAAA;QAAKiD,SAAS,EAAET,MAAM,CAACsC,QAAS;QAAAX,QAAA,gBAC9BrE,IAAA,CAACb,OAAO;UAAC8F,KAAK,EAAEzD,QAAS;UAAA6C,QAAA,eACvBrE,IAAA;YAAKmD,SAAS,EAAET,MAAM,CAAClB,QAAS;YAAA6C,QAAA,EAAE7C;UAAQ,CAAM;QAAC,CAC1C,CAAC,eAEVxB,IAAA;UACEuE,GAAG,EAAE7C,GAAI;UACT8D,QAAQ;UACRrC,SAAS,EAAET,MAAM,CAAC+C,YAAa;UAC/BrC,KAAK,EAAE;YAAEsC,KAAK,EAAE,MAAM;YAAEC,MAAM,EAAE;UAAG;QAAE,CACtC,CAAC;MAAA,CACC,CAAC,EAEL3C,SAAS,iBACRhD,IAAA;QACEmD,SAAS,EAAET,MAAM,CAAC2C,aAAc;QAChChC,OAAO,EAAE,SAAAA,QAAA;UAAA,OAAMH,QAAQ,CAACgB,MAAM,CAAC;QAAA,CAAC;QAChCoB,QAAQ,EAAElF,IAAI,CAACuE,MAAM,KAAK,WAAY;QACtC,cAAW,0BAAM;QAAAN,QAAA,eAEjBrE,IAAA,CAACL,aAAa,IAAE;MAAC,CACX,CACT;IAAA,CACE,CAAC;EAEV;;EAEA;EACA,IAAAiG,YAAA,GAAwBzD,WAAW,CAAC/B,IAAI,CAAC;IAAjCgC,IAAI,GAAAwD,YAAA,CAAJxD,IAAI;IAAEC,KAAK,GAAAuD,YAAA,CAALvD,KAAK;EACnB,IAAMwD,aAAa,GAAGnE,GAAG,IAAIA,GAAG,CAACH,UAAU,CAAC,MAAM,CAAC;EAEnD,oBACErB,KAAA;IACEiD,SAAS,KAAAgB,MAAA,CAAKzB,MAAM,CAAC0B,QAAQ,OAAAD,MAAA,CAAIrB,KAAK,KAAK,OAAO,GAAG,aAAa,GAAG,EAAE,OAAAqB,MAAA,CAAIhB,SAAS,IAAI,EAAE,CAAG;IAC7FC,KAAK,EAAA0C,aAAA,CAAAA,aAAA,KAAO1C,KAAK;MAAE2C,MAAM,EAAE1C,QAAO,GAAG,SAAS,GAAG2C;IAAS,EAAG;IAC7D3C,OAAO,EAAE,SAAAA,QAAA;MAAA,OAAMA,QAAO,aAAPA,QAAO,uBAAPA,QAAO,CAAGjD,IAAI,CAAC;IAAA,CAAC;IAAAiE,QAAA,gBAE/BrE,IAAA;MAAKmD,SAAS,EAAET,MAAM,CAAC6C,QAAS;MAACnC,KAAK,EAAE;QAAEf,KAAK,EAALA;MAAM,CAAE;MAAAgC,QAAA,EAC/CjC;IAAI,CACF,CAAC,eAENlC,KAAA;MAAKiD,SAAS,EAAET,MAAM,CAACsC,QAAS;MAAAX,QAAA,GAC7BwB,aAAa,IAAI,CAACxC,QAAO,gBACxBrD,IAAA;QACEiG,IAAI,EAAEvE,GAAI;QACVwE,MAAM,EAAC,QAAQ;QACfC,GAAG,EAAC,qBAAqB;QACzBhD,SAAS,EAAET,MAAM,CAAC0D,QAAS;QAAA/B,QAAA,eAE3BrE,IAAA,CAACb,OAAO;UAAC8F,KAAK,EAAEzD,QAAS;UAAA6C,QAAA,eACvBrE,IAAA;YAAKmD,SAAS,EAAET,MAAM,CAAClB,QAAS;YAAA6C,QAAA,EAC7B7C,QAAQ,CAAC0D,MAAM,GAAG,EAAE,MAAAf,MAAA,CACd3C,QAAQ,CAAC2D,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,WAC5B3D;UAAQ,CACT;QAAC,CACC;MAAC,CACT,CAAC,gBAEJxB,IAAA,CAACb,OAAO;QAAC8F,KAAK,EAAEzD,QAAS;QAAA6C,QAAA,eACvBrE,IAAA;UAAKmD,SAAS,EAAET,MAAM,CAAClB,QAAS;UAAA6C,QAAA,EAC7B7C,QAAQ,CAAC0D,MAAM,GAAG,EAAE,MAAAf,MAAA,CACd3C,QAAQ,CAAC2D,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,WAC5B3D;QAAQ,CACT;MAAC,CACC,CACV,EAEApB,IAAI,CAACuE,MAAM,KAAK,WAAW,gBAC1B3E,IAAA,CAACZ,QAAQ;QACPyF,OAAO,EAAEzE,IAAI,CAAC0E,QAAS;QACvBtE,IAAI,EAAC,OAAO;QACZ6F,QAAQ,EAAE,KAAM;QAChBtB,WAAW,EAAC,SAAS;QACrB5B,SAAS,EAAET,MAAM,CAACoC;MAAS,CAC5B,CAAC,GAEFb,QAAQ,GAAG,CAAC,iBACVjE,IAAA;QAAKmD,SAAS,EAAET,MAAM,CAACuB,QAAS;QAAAI,QAAA,EAAE9B,cAAc,CAAC0B,QAAQ;MAAC,CAAM,CAEnE,EAEA7D,IAAI,CAACuE,MAAM,KAAK,OAAO,IAAIvE,IAAI,CAACkG,YAAY,iBAC3CtG,IAAA;QACEoD,KAAK,EAAE;UACLmD,QAAQ,EAAE,MAAM;UAChBlE,KAAK,EAAE,SAAS;UAChBmE,SAAS,EAAE;QACb,CAAE;QAAAnC,QAAA,EAEDjE,IAAI,CAACkG;MAAY,CACf,CACN;IAAA,CACE,CAAC,EAELtD,SAAS,iBACRhD,IAAA;MACEmD,SAAS,EAAET,MAAM,CAAC2C,aAAc;MAChChC,OAAO,EAAE,SAAAA,QAAA;QAAA,OAAMH,QAAQ,CAACgB,MAAM,CAAC;MAAA,CAAC;MAChCoB,QAAQ,EAAElF,IAAI,CAACuE,MAAM,KAAK,WAAY;MACtC,cAAW,0BAAM;MAAAN,QAAA,eAEjBrE,IAAA,CAACL,aAAa,IAAE;IAAC,CACX,CACT;EAAA,CACE,CAAC;AAEV,CAAC;AAED,eAAegD,WAAW"}
@@ -1,7 +1,10 @@
1
1
  import React from "react";
2
2
  import "@ant-design/x-markdown/themes/light.css";
3
+ import type { FileItem } from "../../../../types";
3
4
  export interface MarkdownRenderProps {
4
5
  text: string;
6
+ /** 点击 Markdown 中识别到的文件链接的回调 */
7
+ onFileClick?: (file: FileItem) => void;
5
8
  }
6
9
  declare const MarkdownRender: React.FC<MarkdownRenderProps>;
7
10
  export default MarkdownRender;
@@ -6,8 +6,55 @@ import { Flex } from "antd";
6
6
  import Latex from "@ant-design/x-markdown/plugins/Latex";
7
7
  import { useStyles } from "./styles";
8
8
  import { BarsOutlined, BulbOutlined, ThunderboltOutlined, CheckCircleOutlined } from "@ant-design/icons";
9
+ import FileGallery from "../../../FileGallery";
9
10
  import { jsx as _jsx } from "react/jsx-runtime";
10
11
  import { jsxs as _jsxs } from "react/jsx-runtime";
12
+ // 支持识别的文件扩展名
13
+ var FILE_EXT_REGEX = /\.(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;
14
+ var MIME_MAP = {
15
+ pdf: "application/pdf",
16
+ doc: "application/msword",
17
+ docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
18
+ xls: "application/vnd.ms-excel",
19
+ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
20
+ csv: "text/csv",
21
+ ppt: "application/vnd.ms-powerpoint",
22
+ pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
23
+ zip: "application/zip",
24
+ rar: "application/x-rar-compressed",
25
+ "7z": "application/x-7z-compressed",
26
+ txt: "text/plain",
27
+ md: "text/markdown",
28
+ json: "application/json",
29
+ xml: "application/xml",
30
+ mp3: "audio/mpeg",
31
+ wav: "audio/wav",
32
+ m4a: "audio/mp4",
33
+ aac: "audio/aac",
34
+ ogg: "audio/ogg",
35
+ flac: "audio/flac",
36
+ mp4: "video/mp4",
37
+ mov: "video/quicktime",
38
+ webm: "video/webm",
39
+ mkv: "video/x-matroska",
40
+ avi: "video/x-msvideo",
41
+ png: "image/png",
42
+ jpg: "image/jpeg",
43
+ jpeg: "image/jpeg",
44
+ gif: "image/gif",
45
+ webp: "image/webp",
46
+ bmp: "image/bmp",
47
+ svg: "image/svg+xml"
48
+ };
49
+
50
+ /**
51
+ * 从字符串中提取文件扩展名(小写,不含点和查询参数)
52
+ */
53
+ var extractExt = function extractExt(str) {
54
+ var match = str.match(FILE_EXT_REGEX);
55
+ if (!match) return "";
56
+ return match[1].toLowerCase();
57
+ };
11
58
  var CodeComponent = function CodeComponent(props) {
12
59
  var _className$match;
13
60
  var className = props.className,
@@ -48,9 +95,40 @@ var ThinkComponent = /*#__PURE__*/React.memo(function (props) {
48
95
  });
49
96
  });
50
97
  var MarkdownRender = function MarkdownRender(_ref) {
51
- var text = _ref.text;
98
+ var text = _ref.text,
99
+ onFileClick = _ref.onFileClick;
52
100
  var styles = useStyles();
53
101
  var markdown = text.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>');
102
+
103
+ // 自定义 a 标签渲染:识别文件链接并渲染为 FileGallery 卡片
104
+ var LinkComponent = React.useCallback(function (props) {
105
+ var href = String(props.href || "");
106
+ var children = props.children;
107
+ var linkText = String(children || "");
108
+
109
+ // 先识别 name(链接文字),再识别 url(href)
110
+ var ext = extractExt(linkText) || extractExt(href);
111
+ if (ext) {
112
+ var mimeType = MIME_MAP[ext] || "";
113
+ var fileItem = {
114
+ displayName: linkText || href,
115
+ mimeType: mimeType,
116
+ fileUri: href
117
+ };
118
+ return /*#__PURE__*/_jsx(FileGallery, {
119
+ file: fileItem,
120
+ onClick: onFileClick ? function () {
121
+ return onFileClick(fileItem);
122
+ } : undefined
123
+ });
124
+ }
125
+ return /*#__PURE__*/_jsx("a", {
126
+ href: href,
127
+ target: "_blank",
128
+ rel: "noopener noreferrer",
129
+ children: children
130
+ });
131
+ }, [onFileClick]);
54
132
  return /*#__PURE__*/_jsx("div", {
55
133
  className: styles.markdownWrapper,
56
134
  children: /*#__PURE__*/_jsx("div", {
@@ -64,7 +142,8 @@ var MarkdownRender = function MarkdownRender(_ref) {
64
142
  },
65
143
  components: {
66
144
  tag: ThinkComponent,
67
- code: CodeComponent
145
+ code: CodeComponent,
146
+ a: LinkComponent
68
147
  },
69
148
  streaming: {
70
149
  enableAnimation: true,
@@ -1 +1 @@
1
- {"version":3,"names":["React","XMarkdown","CodeHighlighter","Flex","Latex","useStyles","BarsOutlined","BulbOutlined","ThunderboltOutlined","CheckCircleOutlined","jsx","_jsx","jsxs","_jsxs","CodeComponent","props","_className$match","className","children","lang","match","ThinkComponent","memo","type","titleMap","planning","replanning","reasoning","action","final_answer","iconMap","align","gap","style","color","margin","MarkdownRender","_ref","text","styles","markdown","replaceAll","markdownWrapper","markdownHost","content","paragraphTag","config","extensions","components","tag","code","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\";\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\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\nconst MarkdownRender: React.FC<MarkdownRenderProps> = ({ text }) => {\n const styles = useStyles();\n const markdown = text\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 return (\n <div className={styles.markdownWrapper}>\n <div className={styles.markdownHost}>\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 code: CodeComponent,\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","jsx","_jsx","jsxs","_jsxs","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","CodeComponent","props","_className$match","className","children","lang","ThinkComponent","memo","type","titleMap","planning","replanning","reasoning","action","final_answer","iconMap","align","gap","style","color","margin","MarkdownRender","_ref","text","onFileClick","styles","markdown","replaceAll","LinkComponent","useCallback","href","String","linkText","ext","mimeType","fileItem","displayName","fileUri","file","onClick","undefined","target","rel","markdownWrapper","markdownHost","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 { FileItem } from \"@/types\";\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 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 /** 点击 Markdown 中识别到的文件链接的回调 */\n onFileClick?: (file: FileItem) => void;\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\nconst MarkdownRender: React.FC<MarkdownRenderProps> = ({\n text,\n onFileClick,\n}) => {\n const styles = useStyles();\n const markdown = text\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 // 自定义 a 标签渲染:识别文件链接并渲染为 FileGallery 卡片\n const LinkComponent = React.useCallback(\n (props: ComponentProps) => {\n const href = String((props.href as string) || \"\");\n const children = props.children;\n const linkText = String(children || \"\");\n\n // 先识别 name(链接文字),再识别 url(href)\n const ext = extractExt(linkText) || extractExt(href);\n\n if (ext) {\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 {children as React.ReactNode}\n </a>\n );\n },\n [onFileClick],\n );\n\n return (\n <div className={styles.markdownWrapper}>\n <div className={styles.markdownHost}>\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 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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"}
@@ -50,7 +50,8 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
50
50
  enableProcessParsing = _ref$enableProcessPar === void 0 ? true : _ref$enableProcessPar,
51
51
  parseOptions = _ref.parseOptions,
52
52
  _ref$initialized = _ref.initialized,
53
- initialized = _ref$initialized === void 0 ? false : _ref$initialized;
53
+ initialized = _ref$initialized === void 0 ? false : _ref$initialized,
54
+ onFileClick = _ref.onFileClick;
54
55
  var styles = useStyles();
55
56
  var listRef = useRef(null);
56
57
  var lastScrollTopRef = useRef(0);
@@ -174,7 +175,8 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
174
175
  children: msgs.map(function (msg, i) {
175
176
  if (msg.text) {
176
177
  return /*#__PURE__*/_jsx(MarkdownRender, {
177
- text: msg.text
178
+ text: msg.text,
179
+ onFileClick: onFileClick
178
180
  }, "".concat(msg.id, "-").concat(i));
179
181
  }
180
182
  if (msg.functionCall) {
@@ -331,7 +333,8 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
331
333
  className: styles.successBadge,
332
334
  children: [/*#__PURE__*/_jsx(CheckCircleFilled, {}), " \u5DF2\u5B8C\u6210\u6240\u6709\u89C4\u5212\u4EFB\u52A1"]
333
335
  }), /*#__PURE__*/_jsx(MarkdownRender, {
334
- text: node.content
336
+ text: node.content,
337
+ onFileClick: onFileClick
335
338
  })]
336
339
  }, node.key);
337
340
  }), allFiles.length > 0 && /*#__PURE__*/_jsxs("div", {
@@ -349,7 +352,8 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
349
352
  },
350
353
  children: allFiles.map(function (file, index) {
351
354
  return /*#__PURE__*/_jsx(FileGallery, {
352
- file: file
355
+ file: file,
356
+ onClick: onFileClick
353
357
  }, index);
354
358
  })
355
359
  })]
@@ -386,7 +390,7 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
386
390
  })
387
391
  }))]
388
392
  }, group.id);
389
- }, [enableProcessParsing, parseOptions, showFnCallDetail, onConfirm, loading, showRetry, showCopy, showLog, onRetry, onCopy, onShowLog, actions, styles]);
393
+ }, [enableProcessParsing, parseOptions, showFnCallDetail, onConfirm, loading, showRetry, showCopy, showLog, onRetry, onCopy, onShowLog, actions, onFileClick, styles]);
390
394
 
391
395
  // ========== 渲染用户消息组 ==========
392
396
  var renderUserGroup = useCallback(function (group) {
@@ -402,7 +406,8 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
402
406
  align: "left",
403
407
  style: {
404
408
  marginBottom: "16px"
405
- }
409
+ },
410
+ onClick: onFileClick
406
411
  }, index);
407
412
  })
408
413
  }), m.text && /*#__PURE__*/_jsx("div", {
@@ -412,7 +417,7 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
412
417
  }, m.id || i);
413
418
  })
414
419
  }, group.id);
415
- }, [styles]);
420
+ }, [styles, onFileClick]);
416
421
 
417
422
  // ========== 欢迎页面 ==========
418
423
  // const isEmpty =
@@ -484,7 +489,8 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
484
489
  children: [prologue && /*#__PURE__*/_jsx("div", {
485
490
  className: styles.prologue,
486
491
  children: /*#__PURE__*/_jsx(MarkdownRender, {
487
- text: prologue
492
+ text: prologue,
493
+ onFileClick: onFileClick
488
494
  })
489
495
  }), chatGroups.map(function (group, idx) {
490
496
  return group.role === "user" ? renderUserGroup(group) : renderBotGroup(group, idx === chatGroups.length - 1);
@@ -1 +1 @@
1
- {"version":3,"names":["React","useMemo","useCallback","useEffect","useRef","Button","Flex","Tooltip","message","antdMessage","clsx","SwapRightOutlined","ReloadOutlined","CopyOutlined","InfoCircleOutlined","CheckCircleFilled","copy","useStyles","MarkdownRender","FunctionCallRender","FileGallery","XAiThoughtChain","parseAgentMessage","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","scrollThreshold","XAdkChatbot","_ref","_ref$loading","loading","prologue","suggestions","messages","showFnCallDetail","onConfirm","onSuggest","showRetry","showCopy","showLog","onRetry","onCopy","onShowLog","actions","className","style","_ref$enableGrouping","enableGrouping","_ref$enableProcessPar","enableProcessParsing","parseOptions","_ref$initialized","initialized","styles","listRef","lastScrollTopRef","userHasScrolledRef","messagesEndRef","prevInitializedRef","length","current","timer","setTimeout","_messagesEndRef$curre","scrollIntoView","behavior","clearTimeout","_messagesEndRef$curre2","handleScroll","el","currentTop","scrollTop","isAtBottom","Math","abs","scrollHeight","clientHeight","listElement","addEventListener","removeEventListener","chatGroups","map","msg","_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","showDetail","mergedToolMap","Map","callId","has","set","_objectSpread","_mergedToolMap$get","get","tool","name","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","node","idx","defaultOpen","showBadge","findIndex","successBadge","fileSection","fileHeader","display","flexWrap","gap","file","index","isLastBotMsg","metaFooter","actionIcons","onClick","success","timestamp","renderUserGroup","userMsg","userContainer","align","marginBottom","card","renderSuggestions","suggestionWrapper","item","suggestion","suggestContent","icon","iconPosition","whiteSpace","height","wordWrap","textAlign","padding","lineHeight","wrapper","list","ref"],"sources":["../../../../src/components/XAdkChatbot/index.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { Button, Flex, Tooltip, message as antdMessage } from \"antd\";\nimport clsx from \"clsx\";\nimport {\n SwapRightOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n CheckCircleFilled,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport { useStyles } from \"./styles\";\nimport MarkdownRender from \"./components/MarkdownRender\";\nimport FunctionCallRender from \"./components/FunctionCallRender\";\nimport FileGallery from \"../FileGallery\";\nimport XAiThoughtChain from \"@/components/XAiThoughtChain\";\nimport { parseAgentMessage } from \"@/utils\";\nimport type { IMessage, XAdkChatbotProps, ChatGroup } from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAiThoughtChain\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot: React.FC<XAdkChatbotProps> = ({\n loading = false,\n prologue,\n suggestions,\n messages,\n showFnCallDetail,\n onConfirm,\n onSuggest,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n initialized = false,\n}) => {\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement>(null);\n const lastScrollTopRef = useRef(0);\n const userHasScrolledRef = useRef(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const prevInitializedRef = useRef(false);\n\n // 初始化完成时滚动到底部\n useEffect(() => {\n if (!initialized) return;\n if (!messages.length) return;\n if (prevInitializedRef.current) return; // 只在第一次 initialized+messages 就绪时触发\n prevInitializedRef.current = true;\n // 推迟到浏览器完成 paint 后执行,确保 DOM 高度已撑开\n const timer = setTimeout(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"auto\" });\n }, 0);\n return () => clearTimeout(timer);\n }, [initialized, messages]);\n\n // 流式输出时滚动到底部\n useEffect(() => {\n if (!loading) return;\n if (userHasScrolledRef.current) return;\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [loading, messages]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const currentTop = el.scrollTop;\n\n if (currentTop < lastScrollTopRef.current) {\n userHasScrolledRef.current = true;\n }\n\n const isAtBottom =\n Math.abs(el.scrollHeight - currentTop - el.clientHeight) <=\n scrollThreshold;\n if (isAtBottom) {\n userHasScrolledRef.current = false;\n }\n\n lastScrollTopRef.current = currentTop;\n }, []);\n\n useEffect(() => {\n const listElement = listRef.current;\n if (!listElement) return;\n\n listElement.addEventListener(\"scroll\", handleScroll);\n return () => {\n listElement.removeEventListener(\"scroll\", handleScroll);\n };\n }, [handleScroll]);\n\n // ========== 消息分组逻辑 ==========\n const chatGroups = useMemo(() => {\n if (!enableGrouping) {\n // 不分组,每条消息独立\n return messages.map((msg) => ({\n id: msg.id,\n role: msg.role,\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: msg.fileData || [],\n isLike: msg.isLike ?? 0,\n }));\n }\n\n const groups: ChatGroup[] = [];\n messages.forEach((msg) => {\n // 过滤 followup 消息\n if ((msg as any).role === \"followup\") return;\n\n const isRealUserQuery =\n msg.role === \"user\" && !msg.functionResponse && !msg.functionCall;\n const lastGroup = groups[groups.length - 1];\n const isLastGroupAgent = lastGroup?.role === \"bot\";\n\n if (isLastGroupAgent && !isRealUserQuery) {\n // 合并到上一个 bot 分组\n lastGroup.msgs.push(msg);\n if (msg.invocationId) lastGroup.invocationId = msg.invocationId;\n // 更新 isLike: 取最新的非0值,或保持当前值\n if (msg.isLike && msg.isLike !== 0) {\n lastGroup.isLike = msg.isLike;\n }\n } else {\n // 创建新分组\n groups.push({\n id: msg.id || `group-${groups.length}`,\n role: isRealUserQuery ? \"user\" : \"bot\",\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: [],\n isLike: msg.isLike ?? 0,\n });\n }\n });\n\n // 合并文件\n groups.forEach((g) => {\n g.allFiles = g.msgs.reduce(\n (acc, m) => [...acc, ...(m.fileData || [])],\n [] as any[],\n );\n });\n\n return groups;\n }, [messages, enableGrouping]);\n\n // ========== 渲染 Bot 消息组 ==========\n const renderBotGroup = useCallback(\n (group: ChatGroup, isLastGroup: boolean) => {\n const { msgs, allFiles } = group;\n\n if (!enableProcessParsing) {\n // 不解析 process,简单渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {msgs.map((msg, i) => {\n if (msg.text) {\n return (\n <MarkdownRender key={`${msg.id}-${i}`} text={msg.text} />\n );\n }\n if (msg.functionCall) {\n return (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n />\n );\n }\n return null;\n })}\n </div>\n );\n }\n\n // ========== 解析 Process 内容 ==========\n\n // 1. 合并工具调用\n const mergedToolMap = new Map<string, IMessage>();\n msgs.forEach((msg) => {\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!mergedToolMap.has(callId)) {\n mergedToolMap.set(callId, { ...msg });\n } else {\n mergedToolMap.set(callId, {\n ...(mergedToolMap.get(callId) ?? {}),\n ...msg,\n });\n }\n } else if (msg.functionResponse) {\n const callId = msg.functionResponse.id || \"\";\n if (mergedToolMap.has(callId)) {\n const tool = mergedToolMap.get(callId);\n if (tool) tool.functionResponse = msg.functionResponse;\n } else {\n mergedToolMap.set(callId, {\n ...msg,\n functionCall: {\n id: callId,\n name: msg.functionResponse.name || \"Unknown\",\n args: {},\n },\n });\n }\n }\n });\n\n // 2. 解析文本消息中的 process 内容\n type RenderNode =\n | { type: \"text\"; content: string; key: string }\n | { type: \"process\"; items: ThoughtChainItemType[]; key: string };\n\n const nodes: RenderNode[] = [];\n let currentProcessItems: ThoughtChainItemType[] = [];\n const processedToolIds = new Set<string>();\n\n const flushProcessItems = () => {\n if (currentProcessItems.length > 0) {\n nodes.push({\n type: \"process\",\n items: [...currentProcessItems],\n key: `process-${nodes.length}`,\n });\n currentProcessItems = [];\n }\n };\n\n msgs.forEach((msg) => {\n // 处理工具调用\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!processedToolIds.has(callId)) {\n const mergedMsg = mergedToolMap.get(callId);\n if (mergedMsg) {\n currentProcessItems.push({\n type: \"tool\",\n key: `tool-${callId}`,\n content: \"\",\n msg: mergedMsg,\n });\n processedToolIds.add(callId);\n }\n }\n }\n // 处理文本消息\n else if (msg.text && !msg.functionResponse) {\n const parts = parseAgentMessage(msg.text, parseOptions as any);\n\n parts.forEach((part, partIdx) => {\n // process 内容放入 currentProcessItems\n if (\n [\n \"planning\",\n \"replanning\",\n \"reasoning\",\n \"action_log\",\n \"process_text\",\n ].includes(part.type)\n ) {\n const titleMap: Record<string, string> = {\n planning: \"任务规划\",\n replanning: \"重新规划\",\n reasoning: \"推理分析\",\n action_log: \"行动记录\",\n process_text: \"过程分析\",\n };\n\n currentProcessItems.push({\n type: \"text\",\n key: `${msg.id}-${partIdx}`,\n content: part.content,\n title: titleMap[part.type] || \"分析\",\n });\n }\n // 普通文本内容\n else {\n flushProcessItems();\n if (part.content.trim()) {\n const lastNode = nodes[nodes.length - 1];\n if (lastNode?.type === \"text\") {\n // 合并到上一个文本节点\n lastNode.content += \"\\n\\n\" + part.content;\n } else {\n nodes.push({\n type: \"text\",\n content: part.content,\n key: `text-${msg.id}-${partIdx}`,\n });\n }\n }\n }\n });\n }\n });\n\n // 最后flush一次\n flushProcessItems();\n\n // 3. 准备操作栏数据\n const fullTextToCopy = msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n const lastBotMsg = msgs[msgs.length - 1];\n const hasProcess = nodes.some((n) => n.type === \"process\");\n const isGroupLoading = loading && isLastGroup;\n\n // 4. 渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n return (\n <XAiThoughtChain\n key={node.key}\n loading={isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isGroupLoading}\n />\n );\n }\n\n // 文本节点\n const showBadge =\n hasProcess && nodes.findIndex((n) => n.type === \"text\") === idx;\n return (\n <div key={node.key}>\n {showBadge && (\n <div className={styles.successBadge}>\n <CheckCircleFilled /> 已完成所有规划任务\n </div>\n )}\n <MarkdownRender text={node.content} />\n </div>\n );\n })}\n\n {/* 文件展示 */}\n {allFiles.length > 0 && (\n <div className={styles.fileSection}>\n <div className={styles.fileHeader}>\n <span>生成文件 ({allFiles.length})</span>\n </div>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"8px\" }}>\n {allFiles.map((file, index) => (\n <FileGallery key={index} file={file} />\n ))}\n </div>\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions\n ? actions({ message: group, isLastBotMsg: isLastGroup })\n : (showRetry || showCopy || showLog) && (\n <div className={styles.metaFooter}>\n <Flex gap={16} className={styles.actionIcons}>\n {showRetry && isLastGroup && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined onClick={onRetry} />\n </Tooltip>\n )}\n {showCopy && (\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n onClick={() => {\n copy(fullTextToCopy);\n antdMessage.success(\"复制成功\");\n onCopy?.(fullTextToCopy);\n }}\n />\n </Tooltip>\n )}\n {showLog && lastBotMsg?.invocationId && (\n <Tooltip title=\"查看日志\">\n <InfoCircleOutlined\n onClick={() =>\n onShowLog?.(\n lastBotMsg.invocationId!,\n lastBotMsg.timestamp,\n )\n }\n />\n </Tooltip>\n )}\n </Flex>\n </div>\n ))}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n styles,\n ],\n );\n\n // ========== 渲染用户消息组 ==========\n const renderUserGroup = useCallback(\n (group: ChatGroup) => {\n return (\n <div key={group.id} className={styles.userMsg}>\n {group.msgs.map((m, i) => (\n <div key={m.id || i} className={styles.userContainer}>\n {/* 文件展示 */}\n {m.fileData && m.fileData.length > 0 && (\n <>\n {m.fileData.map((file, index) => (\n <FileGallery\n key={index}\n file={file}\n align=\"left\"\n style={{ marginBottom: \"16px\" }}\n />\n ))}\n </>\n )}\n {/* 文本展示 */}\n {m.text && <div className={styles.card}>{m.text}</div>}\n </div>\n ))}\n </div>\n );\n },\n [styles],\n );\n\n // ========== 欢迎页面 ==========\n // const isEmpty =\n // messages.length === 0 &&\n // !prologue &&\n // (!suggestions || suggestions.length === 0);\n\n // const renderWelcome = () => {\n // if (!isEmpty) return null;\n\n // return (\n // <>\n // {welcome ?? (\n // <div className={styles.welcomeWrapper}>\n // {agentIcon && (\n // <img src={agentIcon} alt=\"icon\" className={styles.welcomeIcon} />\n // )}\n // {agentName && (\n // <div className={styles.welcomeTitle}>{agentName}</div>\n // )}\n // {description && (\n // <div className={styles.welcomeDesc}>{description}</div>\n // )}\n // </div>\n // )}\n // </>\n // );\n // };\n\n // ========== 渲染建议问题 ==========\n const renderSuggestions = () => {\n if (!suggestions || suggestions.length === 0) return null;\n\n return (\n <div className={styles.suggestionWrapper}>\n {suggestions.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPosition=\"end\"\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n style={{\n whiteSpace: \"normal\",\n height: \"auto\",\n wordWrap: \"break-word\",\n textAlign: \"left\",\n padding: \"4px 15px\",\n lineHeight: \"1.5\",\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender text={prologue} />\n </div>\n )}\n\n {/* 欢迎页面 */}\n {/* {renderWelcome()} */}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(group, idx === chatGroups.length - 1),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n};\n\nexport default XAdkChatbot;\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useMemo","useCallback","useEffect","useRef","Button","Flex","Tooltip","message","antdMessage","clsx","SwapRightOutlined","ReloadOutlined","CopyOutlined","InfoCircleOutlined","CheckCircleFilled","copy","useStyles","MarkdownRender","FunctionCallRender","FileGallery","XAiThoughtChain","parseAgentMessage","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","scrollThreshold","XAdkChatbot","_ref","_ref$loading","loading","prologue","suggestions","messages","showFnCallDetail","onConfirm","onSuggest","showRetry","showCopy","showLog","onRetry","onCopy","onShowLog","actions","className","style","_ref$enableGrouping","enableGrouping","_ref$enableProcessPar","enableProcessParsing","parseOptions","_ref$initialized","initialized","onFileClick","styles","listRef","lastScrollTopRef","userHasScrolledRef","messagesEndRef","prevInitializedRef","length","current","timer","setTimeout","_messagesEndRef$curre","scrollIntoView","behavior","clearTimeout","_messagesEndRef$curre2","handleScroll","el","currentTop","scrollTop","isAtBottom","Math","abs","scrollHeight","clientHeight","listElement","addEventListener","removeEventListener","chatGroups","map","msg","_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","showDetail","mergedToolMap","Map","callId","has","set","_objectSpread","_mergedToolMap$get","get","tool","name","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","node","idx","defaultOpen","showBadge","findIndex","successBadge","fileSection","fileHeader","display","flexWrap","gap","file","index","onClick","isLastBotMsg","metaFooter","actionIcons","success","timestamp","renderUserGroup","userMsg","userContainer","align","marginBottom","card","renderSuggestions","suggestionWrapper","item","suggestion","suggestContent","icon","iconPosition","whiteSpace","height","wordWrap","textAlign","padding","lineHeight","wrapper","list","ref"],"sources":["../../../../src/components/XAdkChatbot/index.tsx"],"sourcesContent":["import React, { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { Button, Flex, Tooltip, message as antdMessage } from \"antd\";\nimport clsx from \"clsx\";\nimport {\n SwapRightOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n CheckCircleFilled,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport { useStyles } from \"./styles\";\nimport MarkdownRender from \"./components/MarkdownRender\";\nimport FunctionCallRender from \"./components/FunctionCallRender\";\nimport FileGallery from \"../FileGallery\";\nimport XAiThoughtChain from \"@/components/XAiThoughtChain\";\nimport { parseAgentMessage } from \"@/utils\";\nimport type { IMessage, XAdkChatbotProps, ChatGroup } from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAiThoughtChain\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot: React.FC<XAdkChatbotProps> = ({\n loading = false,\n prologue,\n suggestions,\n messages,\n showFnCallDetail,\n onConfirm,\n onSuggest,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n initialized = false,\n onFileClick,\n}) => {\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement>(null);\n const lastScrollTopRef = useRef(0);\n const userHasScrolledRef = useRef(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const prevInitializedRef = useRef(false);\n\n // 初始化完成时滚动到底部\n useEffect(() => {\n if (!initialized) return;\n if (!messages.length) return;\n if (prevInitializedRef.current) return; // 只在第一次 initialized+messages 就绪时触发\n prevInitializedRef.current = true;\n // 推迟到浏览器完成 paint 后执行,确保 DOM 高度已撑开\n const timer = setTimeout(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"auto\" });\n }, 0);\n return () => clearTimeout(timer);\n }, [initialized, messages]);\n\n // 流式输出时滚动到底部\n useEffect(() => {\n if (!loading) return;\n if (userHasScrolledRef.current) return;\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [loading, messages]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const currentTop = el.scrollTop;\n\n if (currentTop < lastScrollTopRef.current) {\n userHasScrolledRef.current = true;\n }\n\n const isAtBottom =\n Math.abs(el.scrollHeight - currentTop - el.clientHeight) <=\n scrollThreshold;\n if (isAtBottom) {\n userHasScrolledRef.current = false;\n }\n\n lastScrollTopRef.current = currentTop;\n }, []);\n\n useEffect(() => {\n const listElement = listRef.current;\n if (!listElement) return;\n\n listElement.addEventListener(\"scroll\", handleScroll);\n return () => {\n listElement.removeEventListener(\"scroll\", handleScroll);\n };\n }, [handleScroll]);\n\n // ========== 消息分组逻辑 ==========\n const chatGroups = useMemo(() => {\n if (!enableGrouping) {\n // 不分组,每条消息独立\n return messages.map((msg) => ({\n id: msg.id,\n role: msg.role,\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: msg.fileData || [],\n isLike: msg.isLike ?? 0,\n }));\n }\n\n const groups: ChatGroup[] = [];\n messages.forEach((msg) => {\n // 过滤 followup 消息\n if ((msg as any).role === \"followup\") return;\n\n const isRealUserQuery =\n msg.role === \"user\" && !msg.functionResponse && !msg.functionCall;\n const lastGroup = groups[groups.length - 1];\n const isLastGroupAgent = lastGroup?.role === \"bot\";\n\n if (isLastGroupAgent && !isRealUserQuery) {\n // 合并到上一个 bot 分组\n lastGroup.msgs.push(msg);\n if (msg.invocationId) lastGroup.invocationId = msg.invocationId;\n // 更新 isLike: 取最新的非0值,或保持当前值\n if (msg.isLike && msg.isLike !== 0) {\n lastGroup.isLike = msg.isLike;\n }\n } else {\n // 创建新分组\n groups.push({\n id: msg.id || `group-${groups.length}`,\n role: isRealUserQuery ? \"user\" : \"bot\",\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: [],\n isLike: msg.isLike ?? 0,\n });\n }\n });\n\n // 合并文件\n groups.forEach((g) => {\n g.allFiles = g.msgs.reduce(\n (acc, m) => [...acc, ...(m.fileData || [])],\n [] as any[],\n );\n });\n\n return groups;\n }, [messages, enableGrouping]);\n\n // ========== 渲染 Bot 消息组 ==========\n const renderBotGroup = useCallback(\n (group: ChatGroup, isLastGroup: boolean) => {\n const { msgs, allFiles } = group;\n\n if (!enableProcessParsing) {\n // 不解析 process,简单渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {msgs.map((msg, i) => {\n if (msg.text) {\n return (\n <MarkdownRender key={`${msg.id}-${i}`} text={msg.text} onFileClick={onFileClick} />\n );\n }\n if (msg.functionCall) {\n return (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n />\n );\n }\n return null;\n })}\n </div>\n );\n }\n\n // ========== 解析 Process 内容 ==========\n\n // 1. 合并工具调用\n const mergedToolMap = new Map<string, IMessage>();\n msgs.forEach((msg) => {\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!mergedToolMap.has(callId)) {\n mergedToolMap.set(callId, { ...msg });\n } else {\n mergedToolMap.set(callId, {\n ...(mergedToolMap.get(callId) ?? {}),\n ...msg,\n });\n }\n } else if (msg.functionResponse) {\n const callId = msg.functionResponse.id || \"\";\n if (mergedToolMap.has(callId)) {\n const tool = mergedToolMap.get(callId);\n if (tool) tool.functionResponse = msg.functionResponse;\n } else {\n mergedToolMap.set(callId, {\n ...msg,\n functionCall: {\n id: callId,\n name: msg.functionResponse.name || \"Unknown\",\n args: {},\n },\n });\n }\n }\n });\n\n // 2. 解析文本消息中的 process 内容\n type RenderNode =\n | { type: \"text\"; content: string; key: string }\n | { type: \"process\"; items: ThoughtChainItemType[]; key: string };\n\n const nodes: RenderNode[] = [];\n let currentProcessItems: ThoughtChainItemType[] = [];\n const processedToolIds = new Set<string>();\n\n const flushProcessItems = () => {\n if (currentProcessItems.length > 0) {\n nodes.push({\n type: \"process\",\n items: [...currentProcessItems],\n key: `process-${nodes.length}`,\n });\n currentProcessItems = [];\n }\n };\n\n msgs.forEach((msg) => {\n // 处理工具调用\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!processedToolIds.has(callId)) {\n const mergedMsg = mergedToolMap.get(callId);\n if (mergedMsg) {\n currentProcessItems.push({\n type: \"tool\",\n key: `tool-${callId}`,\n content: \"\",\n msg: mergedMsg,\n });\n processedToolIds.add(callId);\n }\n }\n }\n // 处理文本消息\n else if (msg.text && !msg.functionResponse) {\n const parts = parseAgentMessage(msg.text, parseOptions as any);\n\n parts.forEach((part, partIdx) => {\n // process 内容放入 currentProcessItems\n if (\n [\n \"planning\",\n \"replanning\",\n \"reasoning\",\n \"action_log\",\n \"process_text\",\n ].includes(part.type)\n ) {\n const titleMap: Record<string, string> = {\n planning: \"任务规划\",\n replanning: \"重新规划\",\n reasoning: \"推理分析\",\n action_log: \"行动记录\",\n process_text: \"过程分析\",\n };\n\n currentProcessItems.push({\n type: \"text\",\n key: `${msg.id}-${partIdx}`,\n content: part.content,\n title: titleMap[part.type] || \"分析\",\n });\n }\n // 普通文本内容\n else {\n flushProcessItems();\n if (part.content.trim()) {\n const lastNode = nodes[nodes.length - 1];\n if (lastNode?.type === \"text\") {\n // 合并到上一个文本节点\n lastNode.content += \"\\n\\n\" + part.content;\n } else {\n nodes.push({\n type: \"text\",\n content: part.content,\n key: `text-${msg.id}-${partIdx}`,\n });\n }\n }\n }\n });\n }\n });\n\n // 最后flush一次\n flushProcessItems();\n\n // 3. 准备操作栏数据\n const fullTextToCopy = msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n const lastBotMsg = msgs[msgs.length - 1];\n const hasProcess = nodes.some((n) => n.type === \"process\");\n const isGroupLoading = loading && isLastGroup;\n\n // 4. 渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n return (\n <XAiThoughtChain\n key={node.key}\n loading={isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isGroupLoading}\n />\n );\n }\n\n // 文本节点\n const showBadge =\n hasProcess && nodes.findIndex((n) => n.type === \"text\") === idx;\n return (\n <div key={node.key}>\n {showBadge && (\n <div className={styles.successBadge}>\n <CheckCircleFilled /> 已完成所有规划任务\n </div>\n )}\n <MarkdownRender text={node.content} onFileClick={onFileClick} />\n </div>\n );\n })}\n\n {/* 文件展示 */}\n {allFiles.length > 0 && (\n <div className={styles.fileSection}>\n <div className={styles.fileHeader}>\n <span>生成文件 ({allFiles.length})</span>\n </div>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"8px\" }}>\n {allFiles.map((file, index) => (\n <FileGallery key={index} file={file} onClick={onFileClick} />\n ))}\n </div>\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions\n ? actions({ message: group, isLastBotMsg: isLastGroup })\n : (showRetry || showCopy || showLog) && (\n <div className={styles.metaFooter}>\n <Flex gap={16} className={styles.actionIcons}>\n {showRetry && isLastGroup && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined onClick={onRetry} />\n </Tooltip>\n )}\n {showCopy && (\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n onClick={() => {\n copy(fullTextToCopy);\n antdMessage.success(\"复制成功\");\n onCopy?.(fullTextToCopy);\n }}\n />\n </Tooltip>\n )}\n {showLog && lastBotMsg?.invocationId && (\n <Tooltip title=\"查看日志\">\n <InfoCircleOutlined\n onClick={() =>\n onShowLog?.(\n lastBotMsg.invocationId!,\n lastBotMsg.timestamp,\n )\n }\n />\n </Tooltip>\n )}\n </Flex>\n </div>\n ))}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n onFileClick,\n styles,\n ],\n );\n\n // ========== 渲染用户消息组 ==========\n const renderUserGroup = useCallback(\n (group: ChatGroup) => {\n return (\n <div key={group.id} className={styles.userMsg}>\n {group.msgs.map((m, i) => (\n <div key={m.id || i} className={styles.userContainer}>\n {/* 文件展示 */}\n {m.fileData && m.fileData.length > 0 && (\n <>\n {m.fileData.map((file, index) => (\n <FileGallery\n key={index}\n file={file}\n align=\"left\"\n style={{ marginBottom: \"16px\" }}\n onClick={onFileClick}\n />\n ))}\n </>\n )}\n {/* 文本展示 */}\n {m.text && <div className={styles.card}>{m.text}</div>}\n </div>\n ))}\n </div>\n );\n },\n [styles, onFileClick],\n );\n\n // ========== 欢迎页面 ==========\n // const isEmpty =\n // messages.length === 0 &&\n // !prologue &&\n // (!suggestions || suggestions.length === 0);\n\n // const renderWelcome = () => {\n // if (!isEmpty) return null;\n\n // return (\n // <>\n // {welcome ?? (\n // <div className={styles.welcomeWrapper}>\n // {agentIcon && (\n // <img src={agentIcon} alt=\"icon\" className={styles.welcomeIcon} />\n // )}\n // {agentName && (\n // <div className={styles.welcomeTitle}>{agentName}</div>\n // )}\n // {description && (\n // <div className={styles.welcomeDesc}>{description}</div>\n // )}\n // </div>\n // )}\n // </>\n // );\n // };\n\n // ========== 渲染建议问题 ==========\n const renderSuggestions = () => {\n if (!suggestions || suggestions.length === 0) return null;\n\n return (\n <div className={styles.suggestionWrapper}>\n {suggestions.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPosition=\"end\"\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n style={{\n whiteSpace: \"normal\",\n height: \"auto\",\n wordWrap: \"break-word\",\n textAlign: \"left\",\n padding: \"4px 15px\",\n lineHeight: \"1.5\",\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender text={prologue} onFileClick={onFileClick} />\n </div>\n )}\n\n {/* 欢迎页面 */}\n {/* {renderWelcome()} */}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(group, idx === chatGroups.length - 1),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n};\n\nexport default XAdkChatbot;\n"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,OAAO,EAAEC,WAAW,EAAEC,SAAS,EAAEC,MAAM,QAAQ,OAAO;AACtE,SAASC,MAAM,EAAEC,IAAI,EAAEC,OAAO,EAAEC,OAAO,IAAIC,WAAW,QAAQ,MAAM;AACpE,OAAOC,IAAI,MAAM,MAAM;AACvB,SACEC,iBAAiB,EACjBC,cAAc,EACdC,YAAY,EACZC,kBAAkB,EAClBC,iBAAiB,QACZ,mBAAmB;AAC1B,OAAOC,IAAI,MAAM,mBAAmB;AACpC,SAASC,SAAS;AAClB,OAAOC,cAAc;AACrB,OAAOC,kBAAkB;AACzB,OAAOC,WAAW;AAClB,OAAOC,eAAe;AACtB,SAASC,iBAAiB;AAAkB,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAAA,SAAAC,QAAA,IAAAC,SAAA;AAI5C,IAAMC,eAAe,GAAG,EAAE;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,WAAuC,GAAG,SAA1CA,WAAuCA,CAAAC,IAAA,EAuBvC;EAAA,IAAAC,YAAA,GAAAD,IAAA,CAtBJE,OAAO;IAAPA,OAAO,GAAAD,YAAA,cAAG,KAAK,GAAAA,YAAA;IACfE,QAAQ,GAAAH,IAAA,CAARG,QAAQ;IACRC,WAAW,GAAAJ,IAAA,CAAXI,WAAW;IACXC,QAAQ,GAAAL,IAAA,CAARK,QAAQ;IACRC,gBAAgB,GAAAN,IAAA,CAAhBM,gBAAgB;IAChBC,SAAS,GAAAP,IAAA,CAATO,SAAS;IACTC,SAAS,GAAAR,IAAA,CAATQ,SAAS;IACTC,SAAS,GAAAT,IAAA,CAATS,SAAS;IACTC,QAAQ,GAAAV,IAAA,CAARU,QAAQ;IACRC,OAAO,GAAAX,IAAA,CAAPW,OAAO;IACPC,OAAO,GAAAZ,IAAA,CAAPY,OAAO;IACPC,MAAM,GAAAb,IAAA,CAANa,MAAM;IACNC,SAAS,GAAAd,IAAA,CAATc,SAAS;IACTC,OAAO,GAAAf,IAAA,CAAPe,OAAO;IACPC,SAAS,GAAAhB,IAAA,CAATgB,SAAS;IACTC,KAAK,GAAAjB,IAAA,CAALiB,KAAK;IAAAC,mBAAA,GAAAlB,IAAA,CAELmB,cAAc;IAAdA,cAAc,GAAAD,mBAAA,cAAG,IAAI,GAAAA,mBAAA;IAAAE,qBAAA,GAAApB,IAAA,CACrBqB,oBAAoB;IAApBA,oBAAoB,GAAAD,qBAAA,cAAG,IAAI,GAAAA,qBAAA;IAC3BE,YAAY,GAAAtB,IAAA,CAAZsB,YAAY;IAAAC,gBAAA,GAAAvB,IAAA,CACZwB,WAAW;IAAXA,WAAW,GAAAD,gBAAA,cAAG,KAAK,GAAAA,gBAAA;IACnBE,WAAW,GAAAzB,IAAA,CAAXyB,WAAW;EAEX,IAAMC,MAAM,GAAGxC,SAAS,CAAC,CAAC;EAC1B,IAAMyC,OAAO,GAAGtD,MAAM,CAAiB,IAAI,CAAC;EAC5C,IAAMuD,gBAAgB,GAAGvD,MAAM,CAAC,CAAC,CAAC;EAClC,IAAMwD,kBAAkB,GAAGxD,MAAM,CAAC,KAAK,CAAC;EACxC,IAAMyD,cAAc,GAAGzD,MAAM,CAAiB,IAAI,CAAC;EACnD,IAAM0D,kBAAkB,GAAG1D,MAAM,CAAC,KAAK,CAAC;;EAExC;EACAD,SAAS,CAAC,YAAM;IACd,IAAI,CAACoD,WAAW,EAAE;IAClB,IAAI,CAACnB,QAAQ,CAAC2B,MAAM,EAAE;IACtB,IAAID,kBAAkB,CAACE,OAAO,EAAE,OAAO,CAAC;IACxCF,kBAAkB,CAACE,OAAO,GAAG,IAAI;IACjC;IACA,IAAMC,KAAK,GAAGC,UAAU,CAAC,YAAM;MAAA,IAAAC,qBAAA;MAC7B,CAAAA,qBAAA,GAAAN,cAAc,CAACG,OAAO,cAAAG,qBAAA,eAAtBA,qBAAA,CAAwBC,cAAc,CAAC;QAAEC,QAAQ,EAAE;MAAO,CAAC,CAAC;IAC9D,CAAC,EAAE,CAAC,CAAC;IACL,OAAO;MAAA,OAAMC,YAAY,CAACL,KAAK,CAAC;IAAA;EAClC,CAAC,EAAE,CAACV,WAAW,EAAEnB,QAAQ,CAAC,CAAC;;EAE3B;EACAjC,SAAS,CAAC,YAAM;IAAA,IAAAoE,sBAAA;IACd,IAAI,CAACtC,OAAO,EAAE;IACd,IAAI2B,kBAAkB,CAACI,OAAO,EAAE;IAChC,CAAAO,sBAAA,GAAAV,cAAc,CAACG,OAAO,cAAAO,sBAAA,eAAtBA,sBAAA,CAAwBH,cAAc,CAAC;MAAEC,QAAQ,EAAE;IAAS,CAAC,CAAC;EAChE,CAAC,EAAE,CAACpC,OAAO,EAAEG,QAAQ,CAAC,CAAC;;EAEvB;EACA,IAAMoC,YAAY,GAAGtE,WAAW,CAAC,YAAM;IACrC,IAAMuE,EAAE,GAAGf,OAAO,CAACM,OAAO;IAC1B,IAAI,CAACS,EAAE,EAAE;IACT,IAAMC,UAAU,GAAGD,EAAE,CAACE,SAAS;IAE/B,IAAID,UAAU,GAAGf,gBAAgB,CAACK,OAAO,EAAE;MACzCJ,kBAAkB,CAACI,OAAO,GAAG,IAAI;IACnC;IAEA,IAAMY,UAAU,GACdC,IAAI,CAACC,GAAG,CAACL,EAAE,CAACM,YAAY,GAAGL,UAAU,GAAGD,EAAE,CAACO,YAAY,CAAC,IACxDnD,eAAe;IACjB,IAAI+C,UAAU,EAAE;MACdhB,kBAAkB,CAACI,OAAO,GAAG,KAAK;IACpC;IAEAL,gBAAgB,CAACK,OAAO,GAAGU,UAAU;EACvC,CAAC,EAAE,EAAE,CAAC;EAENvE,SAAS,CAAC,YAAM;IACd,IAAM8E,WAAW,GAAGvB,OAAO,CAACM,OAAO;IACnC,IAAI,CAACiB,WAAW,EAAE;IAElBA,WAAW,CAACC,gBAAgB,CAAC,QAAQ,EAAEV,YAAY,CAAC;IACpD,OAAO,YAAM;MACXS,WAAW,CAACE,mBAAmB,CAAC,QAAQ,EAAEX,YAAY,CAAC;IACzD,CAAC;EACH,CAAC,EAAE,CAACA,YAAY,CAAC,CAAC;;EAElB;EACA,IAAMY,UAAU,GAAGnF,OAAO,CAAC,YAAM;IAC/B,IAAI,CAACiD,cAAc,EAAE;MACnB;MACA,OAAOd,QAAQ,CAACiD,GAAG,CAAC,UAACC,GAAG;QAAA,IAAAC,WAAA;QAAA,OAAM;UAC5BC,EAAE,EAAEF,GAAG,CAACE,EAAE;UACVC,IAAI,EAAEH,GAAG,CAACG,IAAI;UACdC,IAAI,EAAE,CAACJ,GAAG,CAAC;UACXK,YAAY,EAAEL,GAAG,CAACK,YAAY;UAC9BC,QAAQ,EAAEN,GAAG,CAACO,QAAQ,IAAI,EAAE;UAC5BC,MAAM,GAAAP,WAAA,GAAED,GAAG,CAACQ,MAAM,cAAAP,WAAA,cAAAA,WAAA,GAAI;QACxB,CAAC;MAAA,CAAC,CAAC;IACL;IAEA,IAAMQ,MAAmB,GAAG,EAAE;IAC9B3D,QAAQ,CAAC4D,OAAO,CAAC,UAACV,GAAG,EAAK;MACxB;MACA,IAAKA,GAAG,CAASG,IAAI,KAAK,UAAU,EAAE;MAEtC,IAAMQ,eAAe,GACnBX,GAAG,CAACG,IAAI,KAAK,MAAM,IAAI,CAACH,GAAG,CAACY,gBAAgB,IAAI,CAACZ,GAAG,CAACa,YAAY;MACnE,IAAMC,SAAS,GAAGL,MAAM,CAACA,MAAM,CAAChC,MAAM,GAAG,CAAC,CAAC;MAC3C,IAAMsC,gBAAgB,GAAG,CAAAD,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEX,IAAI,MAAK,KAAK;MAElD,IAAIY,gBAAgB,IAAI,CAACJ,eAAe,EAAE;QACxC;QACAG,SAAS,CAACV,IAAI,CAACY,IAAI,CAAChB,GAAG,CAAC;QACxB,IAAIA,GAAG,CAACK,YAAY,EAAES,SAAS,CAACT,YAAY,GAAGL,GAAG,CAACK,YAAY;QAC/D;QACA,IAAIL,GAAG,CAACQ,MAAM,IAAIR,GAAG,CAACQ,MAAM,KAAK,CAAC,EAAE;UAClCM,SAAS,CAACN,MAAM,GAAGR,GAAG,CAACQ,MAAM;QAC/B;MACF,CAAC,MAAM;QAAA,IAAAS,YAAA;QACL;QACAR,MAAM,CAACO,IAAI,CAAC;UACVd,EAAE,EAAEF,GAAG,CAACE,EAAE,aAAAgB,MAAA,CAAaT,MAAM,CAAChC,MAAM,CAAE;UACtC0B,IAAI,EAAEQ,eAAe,GAAG,MAAM,GAAG,KAAK;UACtCP,IAAI,EAAE,CAACJ,GAAG,CAAC;UACXK,YAAY,EAAEL,GAAG,CAACK,YAAY;UAC9BC,QAAQ,EAAE,EAAE;UACZE,MAAM,GAAAS,YAAA,GAAEjB,GAAG,CAACQ,MAAM,cAAAS,YAAA,cAAAA,YAAA,GAAI;QACxB,CAAC,CAAC;MACJ;IACF,CAAC,CAAC;;IAEF;IACAR,MAAM,CAACC,OAAO,CAAC,UAACS,CAAC,EAAK;MACpBA,CAAC,CAACb,QAAQ,GAAGa,CAAC,CAACf,IAAI,CAACgB,MAAM,CACxB,UAACC,GAAG,EAAEC,CAAC;QAAA,UAAAJ,MAAA,CAAAK,kBAAA,CAASF,GAAG,GAAAE,kBAAA,CAAMD,CAAC,CAACf,QAAQ,IAAI,EAAE;MAAA,CAAE,EAC3C,EACF,CAAC;IACH,CAAC,CAAC;IAEF,OAAOE,MAAM;EACf,CAAC,EAAE,CAAC3D,QAAQ,EAAEc,cAAc,CAAC,CAAC;;EAE9B;EACA,IAAM4D,cAAc,GAAG5G,WAAW,CAChC,UAAC6G,KAAgB,EAAEC,WAAoB,EAAK;IAC1C,IAAQtB,IAAI,GAAeqB,KAAK,CAAxBrB,IAAI;MAAEE,QAAQ,GAAKmB,KAAK,CAAlBnB,QAAQ;IAEtB,IAAI,CAACxC,oBAAoB,EAAE;MACzB;MACA,oBACE5B,IAAA;QAAoBuB,SAAS,EAAEU,MAAM,CAACwD,MAAO;QAAAC,QAAA,EAC1CxB,IAAI,CAACL,GAAG,CAAC,UAACC,GAAG,EAAE6B,CAAC,EAAK;UACpB,IAAI7B,GAAG,CAAC8B,IAAI,EAAE;YACZ,oBACE5F,IAAA,CAACN,cAAc;cAAwBkG,IAAI,EAAE9B,GAAG,CAAC8B,IAAK;cAAC5D,WAAW,EAAEA;YAAY,MAAAgD,MAAA,CAAxDlB,GAAG,CAACE,EAAE,OAAAgB,MAAA,CAAIW,CAAC,CAA+C,CAAC;UAEvF;UACA,IAAI7B,GAAG,CAACa,YAAY,EAAE;YACpB,oBACE3E,IAAA,CAACL,kBAAkB;cAEjBmE,GAAG,EAAEA,GAAI;cACT+B,UAAU,EAAEhF,gBAAiB;cAC7BC,SAAS,EAAEA;YAAU,MAAAkE,MAAA,CAHblB,GAAG,CAACE,EAAE,OAAAgB,MAAA,CAAIW,CAAC,CAIpB,CAAC;UAEN;UACA,OAAO,IAAI;QACb,CAAC;MAAC,GAlBMJ,KAAK,CAACvB,EAmBX,CAAC;IAEV;;IAEA;;IAEA;IACA,IAAM8B,aAAa,GAAG,IAAIC,GAAG,CAAmB,CAAC;IACjD7B,IAAI,CAACM,OAAO,CAAC,UAACV,GAAG,EAAK;MACpB,IAAIA,GAAG,CAACa,YAAY,EAAE;QACpB,IAAMqB,MAAM,GAAGlC,GAAG,CAACa,YAAY,CAACX,EAAE,IAAI,EAAE;QACxC,IAAI,CAAC8B,aAAa,CAACG,GAAG,CAACD,MAAM,CAAC,EAAE;UAC9BF,aAAa,CAACI,GAAG,CAACF,MAAM,EAAAG,aAAA,KAAOrC,GAAG,CAAE,CAAC;QACvC,CAAC,MAAM;UAAA,IAAAsC,kBAAA;UACLN,aAAa,CAACI,GAAG,CAACF,MAAM,EAAAG,aAAA,CAAAA,aAAA,MAAAC,kBAAA,GAClBN,aAAa,CAACO,GAAG,CAACL,MAAM,CAAC,cAAAI,kBAAA,cAAAA,kBAAA,GAAI,CAAC,CAAC,GAChCtC,GAAG,CACP,CAAC;QACJ;MACF,CAAC,MAAM,IAAIA,GAAG,CAACY,gBAAgB,EAAE;QAC/B,IAAMsB,OAAM,GAAGlC,GAAG,CAACY,gBAAgB,CAACV,EAAE,IAAI,EAAE;QAC5C,IAAI8B,aAAa,CAACG,GAAG,CAACD,OAAM,CAAC,EAAE;UAC7B,IAAMM,IAAI,GAAGR,aAAa,CAACO,GAAG,CAACL,OAAM,CAAC;UACtC,IAAIM,IAAI,EAAEA,IAAI,CAAC5B,gBAAgB,GAAGZ,GAAG,CAACY,gBAAgB;QACxD,CAAC,MAAM;UACLoB,aAAa,CAACI,GAAG,CAACF,OAAM,EAAAG,aAAA,CAAAA,aAAA,KACnBrC,GAAG;YACNa,YAAY,EAAE;cACZX,EAAE,EAAEgC,OAAM;cACVO,IAAI,EAAEzC,GAAG,CAACY,gBAAgB,CAAC6B,IAAI,IAAI,SAAS;cAC5CC,IAAI,EAAE,CAAC;YACT;UAAC,EACF,CAAC;QACJ;MACF;IACF,CAAC,CAAC;;IAEF;;IAKA,IAAMC,KAAmB,GAAG,EAAE;IAC9B,IAAIC,mBAA2C,GAAG,EAAE;IACpD,IAAMC,gBAAgB,GAAG,IAAIC,GAAG,CAAS,CAAC;IAE1C,IAAMC,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAA,EAAS;MAC9B,IAAIH,mBAAmB,CAACnE,MAAM,GAAG,CAAC,EAAE;QAClCkE,KAAK,CAAC3B,IAAI,CAAC;UACTgC,IAAI,EAAE,SAAS;UACfC,KAAK,EAAA1B,kBAAA,CAAMqB,mBAAmB,CAAC;UAC/BM,GAAG,aAAAhC,MAAA,CAAayB,KAAK,CAAClE,MAAM;QAC9B,CAAC,CAAC;QACFmE,mBAAmB,GAAG,EAAE;MAC1B;IACF,CAAC;IAEDxC,IAAI,CAACM,OAAO,CAAC,UAACV,GAAG,EAAK;MACpB;MACA,IAAIA,GAAG,CAACa,YAAY,EAAE;QACpB,IAAMqB,MAAM,GAAGlC,GAAG,CAACa,YAAY,CAACX,EAAE,IAAI,EAAE;QACxC,IAAI,CAAC2C,gBAAgB,CAACV,GAAG,CAACD,MAAM,CAAC,EAAE;UACjC,IAAMiB,SAAS,GAAGnB,aAAa,CAACO,GAAG,CAACL,MAAM,CAAC;UAC3C,IAAIiB,SAAS,EAAE;YACbP,mBAAmB,CAAC5B,IAAI,CAAC;cACvBgC,IAAI,EAAE,MAAM;cACZE,GAAG,UAAAhC,MAAA,CAAUgB,MAAM,CAAE;cACrBkB,OAAO,EAAE,EAAE;cACXpD,GAAG,EAAEmD;YACP,CAAC,CAAC;YACFN,gBAAgB,CAACQ,GAAG,CAACnB,MAAM,CAAC;UAC9B;QACF;MACF;MACA;MAAA,KACK,IAAIlC,GAAG,CAAC8B,IAAI,IAAI,CAAC9B,GAAG,CAACY,gBAAgB,EAAE;QAC1C,IAAM0C,KAAK,GAAGtH,iBAAiB,CAACgE,GAAG,CAAC8B,IAAI,EAAE/D,YAAmB,CAAC;QAE9DuF,KAAK,CAAC5C,OAAO,CAAC,UAAC6C,IAAI,EAAEC,OAAO,EAAK;UAC/B;UACA,IACE,CACE,UAAU,EACV,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,cAAc,CACf,CAACC,QAAQ,CAACF,IAAI,CAACP,IAAI,CAAC,EACrB;YACA,IAAMU,QAAgC,GAAG;cACvCC,QAAQ,EAAE,MAAM;cAChBC,UAAU,EAAE,MAAM;cAClBC,SAAS,EAAE,MAAM;cACjBC,UAAU,EAAE,MAAM;cAClBC,YAAY,EAAE;YAChB,CAAC;YAEDnB,mBAAmB,CAAC5B,IAAI,CAAC;cACvBgC,IAAI,EAAE,MAAM;cACZE,GAAG,KAAAhC,MAAA,CAAKlB,GAAG,CAACE,EAAE,OAAAgB,MAAA,CAAIsC,OAAO,CAAE;cAC3BJ,OAAO,EAAEG,IAAI,CAACH,OAAO;cACrBY,KAAK,EAAEN,QAAQ,CAACH,IAAI,CAACP,IAAI,CAAC,IAAI;YAChC,CAAC,CAAC;UACJ;UACA;UAAA,KACK;YACHD,iBAAiB,CAAC,CAAC;YACnB,IAAIQ,IAAI,CAACH,OAAO,CAACa,IAAI,CAAC,CAAC,EAAE;cACvB,IAAMC,QAAQ,GAAGvB,KAAK,CAACA,KAAK,CAAClE,MAAM,GAAG,CAAC,CAAC;cACxC,IAAI,CAAAyF,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAElB,IAAI,MAAK,MAAM,EAAE;gBAC7B;gBACAkB,QAAQ,CAACd,OAAO,IAAI,MAAM,GAAGG,IAAI,CAACH,OAAO;cAC3C,CAAC,MAAM;gBACLT,KAAK,CAAC3B,IAAI,CAAC;kBACTgC,IAAI,EAAE,MAAM;kBACZI,OAAO,EAAEG,IAAI,CAACH,OAAO;kBACrBF,GAAG,UAAAhC,MAAA,CAAUlB,GAAG,CAACE,EAAE,OAAAgB,MAAA,CAAIsC,OAAO;gBAChC,CAAC,CAAC;cACJ;YACF;UACF;QACF,CAAC,CAAC;MACJ;IACF,CAAC,CAAC;;IAEF;IACAT,iBAAiB,CAAC,CAAC;;IAEnB;IACA,IAAMoB,cAAc,GAAG/D,IAAI,CACxBgE,MAAM,CAAC,UAAC9C,CAAC;MAAA,OAAK,CAACA,CAAC,CAACT,YAAY,IAAI,CAACS,CAAC,CAACV,gBAAgB;IAAA,EAAC,CACrDb,GAAG,CAAC,UAACuB,CAAC;MAAA,OAAKA,CAAC,CAACQ,IAAI,IAAI,EAAE;IAAA,EAAC,CACxBuC,IAAI,CAAC,EAAE,CAAC;IAEX,IAAMC,UAAU,GAAGlE,IAAI,CAACA,IAAI,CAAC3B,MAAM,GAAG,CAAC,CAAC;IACxC,IAAM8F,UAAU,GAAG5B,KAAK,CAAC6B,IAAI,CAAC,UAACC,CAAC;MAAA,OAAKA,CAAC,CAACzB,IAAI,KAAK,SAAS;IAAA,EAAC;IAC1D,IAAM0B,cAAc,GAAG/H,OAAO,IAAI+E,WAAW;;IAE7C;IACA,oBACEtF,KAAA;MAAoBqB,SAAS,EAAEU,MAAM,CAACwD,MAAO;MAAAC,QAAA,GAC1Ce,KAAK,CAAC5C,GAAG,CAAC,UAAC4E,IAAI,EAAEC,GAAG,EAAK;QACxB,IAAID,IAAI,CAAC3B,IAAI,KAAK,SAAS,EAAE;UAC3B,oBACE9G,IAAA,CAACH,eAAe;YAEdY,OAAO,EAAE+H,cAAe;YACxBV,KAAK,EAAC,sCAAQ;YACdf,KAAK,EAAE0B,IAAI,CAAC1B,KAAM;YAClBlG,gBAAgB,EAAEA,gBAAiB;YACnCC,SAAS,EAAEA,SAAU;YACrB6H,WAAW,EAAEH;UAAe,GANvBC,IAAI,CAACzB,GAOX,CAAC;QAEN;;QAEA;QACA,IAAM4B,SAAS,GACbP,UAAU,IAAI5B,KAAK,CAACoC,SAAS,CAAC,UAACN,CAAC;UAAA,OAAKA,CAAC,CAACzB,IAAI,KAAK,MAAM;QAAA,EAAC,KAAK4B,GAAG;QACjE,oBACExI,KAAA;UAAAwF,QAAA,GACGkD,SAAS,iBACR1I,KAAA;YAAKqB,SAAS,EAAEU,MAAM,CAAC6G,YAAa;YAAApD,QAAA,gBAClC1F,IAAA,CAACT,iBAAiB,IAAE,CAAC,2DACvB;UAAA,CAAK,CACN,eACDS,IAAA,CAACN,cAAc;YAACkG,IAAI,EAAE6C,IAAI,CAACvB,OAAQ;YAAClF,WAAW,EAAEA;UAAY,CAAE,CAAC;QAAA,GANxDyG,IAAI,CAACzB,GAOV,CAAC;MAEV,CAAC,CAAC,EAGD5C,QAAQ,CAAC7B,MAAM,GAAG,CAAC,iBAClBrC,KAAA;QAAKqB,SAAS,EAAEU,MAAM,CAAC8G,WAAY;QAAArD,QAAA,gBACjC1F,IAAA;UAAKuB,SAAS,EAAEU,MAAM,CAAC+G,UAAW;UAAAtD,QAAA,eAChCxF,KAAA;YAAAwF,QAAA,GAAM,4BAAM,EAACtB,QAAQ,CAAC7B,MAAM,EAAC,GAAC;UAAA,CAAM;QAAC,CAClC,CAAC,eACNvC,IAAA;UAAKwB,KAAK,EAAE;YAAEyH,OAAO,EAAE,MAAM;YAAEC,QAAQ,EAAE,MAAM;YAAEC,GAAG,EAAE;UAAM,CAAE;UAAAzD,QAAA,EAC3DtB,QAAQ,CAACP,GAAG,CAAC,UAACuF,IAAI,EAAEC,KAAK;YAAA,oBACxBrJ,IAAA,CAACJ,WAAW;cAAawJ,IAAI,EAAEA,IAAK;cAACE,OAAO,EAAEtH;YAAY,GAAxCqH,KAA0C,CAAC;UAAA,CAC9D;QAAC,CACC,CAAC;MAAA,CACH,CACN,EAGA,CAACb,cAAc,KACblH,OAAO,GACJA,OAAO,CAAC;QAAEtC,OAAO,EAAEuG,KAAK;QAAEgE,YAAY,EAAE/D;MAAY,CAAC,CAAC,GACtD,CAACxE,SAAS,IAAIC,QAAQ,IAAIC,OAAO,kBAC/BlB,IAAA;QAAKuB,SAAS,EAAEU,MAAM,CAACuH,UAAW;QAAA9D,QAAA,eAChCxF,KAAA,CAACpB,IAAI;UAACqK,GAAG,EAAE,EAAG;UAAC5H,SAAS,EAAEU,MAAM,CAACwH,WAAY;UAAA/D,QAAA,GAC1C1E,SAAS,IAAIwE,WAAW,iBACvBxF,IAAA,CAACjB,OAAO;YAAC+I,KAAK,EAAC,0BAAM;YAAApC,QAAA,eACnB1F,IAAA,CAACZ,cAAc;cAACkK,OAAO,EAAEnI;YAAQ,CAAE;UAAC,CAC7B,CACV,EACAF,QAAQ,iBACPjB,IAAA,CAACjB,OAAO;YAAC+I,KAAK,EAAC,0BAAM;YAAApC,QAAA,eACnB1F,IAAA,CAACX,YAAY;cACXiK,OAAO,EAAE,SAAAA,QAAA,EAAM;gBACb9J,IAAI,CAACyI,cAAc,CAAC;gBACpBhJ,WAAW,CAACyK,OAAO,CAAC,MAAM,CAAC;gBAC3BtI,MAAM,aAANA,MAAM,eAANA,MAAM,CAAG6G,cAAc,CAAC;cAC1B;YAAE,CACH;UAAC,CACK,CACV,EACA/G,OAAO,KAAIkH,UAAU,aAAVA,UAAU,uBAAVA,UAAU,CAAEjE,YAAY,kBAClCnE,IAAA,CAACjB,OAAO;YAAC+I,KAAK,EAAC,0BAAM;YAAApC,QAAA,eACnB1F,IAAA,CAACV,kBAAkB;cACjBgK,OAAO,EAAE,SAAAA,QAAA;gBAAA,OACPjI,SAAS,aAATA,SAAS,uBAATA,SAAS,CACP+G,UAAU,CAACjE,YAAY,EACvBiE,UAAU,CAACuB,SACb,CAAC;cAAA;YACF,CACF;UAAC,CACK,CACV;QAAA,CACG;MAAC,CACJ,CACN,CAAC;IAAA,GAlFApE,KAAK,CAACvB,EAmFX,CAAC;EAEV,CAAC,EACD,CACEpC,oBAAoB,EACpBC,YAAY,EACZhB,gBAAgB,EAChBC,SAAS,EACTL,OAAO,EACPO,SAAS,EACTC,QAAQ,EACRC,OAAO,EACPC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,OAAO,EACPU,WAAW,EACXC,MAAM,CAEV,CAAC;;EAED;EACA,IAAM2H,eAAe,GAAGlL,WAAW,CACjC,UAAC6G,KAAgB,EAAK;IACpB,oBACEvF,IAAA;MAAoBuB,SAAS,EAAEU,MAAM,CAAC4H,OAAQ;MAAAnE,QAAA,EAC3CH,KAAK,CAACrB,IAAI,CAACL,GAAG,CAAC,UAACuB,CAAC,EAAEO,CAAC;QAAA,oBACnBzF,KAAA;UAAqBqB,SAAS,EAAEU,MAAM,CAAC6H,aAAc;UAAApE,QAAA,GAElDN,CAAC,CAACf,QAAQ,IAAIe,CAAC,CAACf,QAAQ,CAAC9B,MAAM,GAAG,CAAC,iBAClCvC,IAAA,CAAAI,SAAA;YAAAsF,QAAA,EACGN,CAAC,CAACf,QAAQ,CAACR,GAAG,CAAC,UAACuF,IAAI,EAAEC,KAAK;cAAA,oBAC1BrJ,IAAA,CAACJ,WAAW;gBAEVwJ,IAAI,EAAEA,IAAK;gBACXW,KAAK,EAAC,MAAM;gBACZvI,KAAK,EAAE;kBAAEwI,YAAY,EAAE;gBAAO,CAAE;gBAChCV,OAAO,EAAEtH;cAAY,GAJhBqH,KAKN,CAAC;YAAA,CACH;UAAC,CACF,CACH,EAEAjE,CAAC,CAACQ,IAAI,iBAAI5F,IAAA;YAAKuB,SAAS,EAAEU,MAAM,CAACgI,IAAK;YAAAvE,QAAA,EAAEN,CAAC,CAACQ;UAAI,CAAM,CAAC;QAAA,GAhB9CR,CAAC,CAACpB,EAAE,IAAI2B,CAiBb,CAAC;MAAA,CACP;IAAC,GApBMJ,KAAK,CAACvB,EAqBX,CAAC;EAEV,CAAC,EACD,CAAC/B,MAAM,EAAED,WAAW,CACtB,CAAC;;EAED;EACA;EACA;EACA;EACA;;EAEA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA,IAAMkI,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAA,EAAS;IAC9B,IAAI,CAACvJ,WAAW,IAAIA,WAAW,CAAC4B,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;IAEzD,oBACEvC,IAAA;MAAKuB,SAAS,EAAEU,MAAM,CAACkI,iBAAkB;MAAAzE,QAAA,EACtC/E,WAAW,CAACkD,GAAG,CAAC,UAACuG,IAAI;QAAA,oBACpBpK,IAAA;UAAgBuB,SAAS,EAAEU,MAAM,CAACoI,UAAW;UAAA3E,QAAA,eAC3C1F,IAAA;YAAKuB,SAAS,EAAEU,MAAM,CAACqI,cAAe;YAAA5E,QAAA,eACpC1F,IAAA,CAACnB,MAAM;cACLiI,IAAI,EAAC,MAAM;cACXyD,IAAI,eAAEvK,IAAA,CAACb,iBAAiB,IAAE,CAAE;cAC5BqL,YAAY,EAAC,KAAK;cAClBlB,OAAO,EAAE,SAAAA,QAAA,EAAM;gBACb,IAAI,CAACc,IAAI,EAAE;gBACXrJ,SAAS,aAATA,SAAS,eAATA,SAAS,CAAGqJ,IAAI,CAAC;cACnB,CAAE;cACF5I,KAAK,EAAE;gBACLiJ,UAAU,EAAE,QAAQ;gBACpBC,MAAM,EAAE,MAAM;gBACdC,QAAQ,EAAE,YAAY;gBACtBC,SAAS,EAAE,MAAM;gBACjBC,OAAO,EAAE,UAAU;gBACnBC,UAAU,EAAE;cACd,CAAE;cAAApF,QAAA,EAED0E;YAAI,CACC;UAAC,CACN;QAAC,GArBEA,IAsBL,CAAC;MAAA,CACP;IAAC,CACC,CAAC;EAEV,CAAC;EAED,oBACEpK,IAAA;IAAKuB,SAAS,EAAErC,IAAI,CAAC+C,MAAM,CAAC8I,OAAO,EAAExJ,SAAS,CAAE;IAACC,KAAK,EAAEA,KAAM;IAAAkE,QAAA,eAC5DxF,KAAA;MAAKqB,SAAS,EAAEU,MAAM,CAAC+I,IAAK;MAACC,GAAG,EAAE/I,OAAQ;MAAAwD,QAAA,GAEvChF,QAAQ,iBACPV,IAAA;QAAKuB,SAAS,EAAEU,MAAM,CAACvB,QAAS;QAAAgF,QAAA,eAC9B1F,IAAA,CAACN,cAAc;UAACkG,IAAI,EAAElF,QAAS;UAACsB,WAAW,EAAEA;QAAY,CAAE;MAAC,CACzD,CACN,EAMA4B,UAAU,CAACC,GAAG,CAAC,UAAC0B,KAAK,EAAEmD,GAAG;QAAA,OACzBnD,KAAK,CAACtB,IAAI,KAAK,MAAM,GACjB2F,eAAe,CAACrE,KAAK,CAAC,GACtBD,cAAc,CAACC,KAAK,EAAEmD,GAAG,KAAK9E,UAAU,CAACrB,MAAM,GAAG,CAAC,CAAC;MAAA,CAC1D,CAAC,EAGA2H,iBAAiB,CAAC,CAAC,eAEpBlK,IAAA;QAAKiL,GAAG,EAAE5I;MAAe,CAAE,CAAC;IAAA,CACzB;EAAC,CACH,CAAC;AAEV,CAAC;AAED,eAAe/B,WAAW"}