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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/cjs/components/FileGallery/styles.js +21 -1
  2. package/dist/cjs/components/FileGallery/styles.js.map +2 -2
  3. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +9 -1
  4. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +102 -22
  5. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +2 -2
  6. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
  7. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js +39 -0
  8. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js.map +2 -2
  9. package/dist/cjs/components/XAdkChatbot/index.js +42 -5
  10. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  11. package/dist/cjs/components/XAdkChatbot/styles.js +1 -1
  12. package/dist/cjs/components/XAdkChatbot/styles.js.map +1 -1
  13. package/dist/cjs/components/XAdkSender/InlineTagInput.d.ts +11 -5
  14. package/dist/cjs/components/XAdkSender/InlineTagInput.js +119 -77
  15. package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +2 -2
  16. package/dist/cjs/components/XAdkSender/InputTags.d.ts +2 -2
  17. package/dist/cjs/components/XAdkSender/InputTags.js +8 -8
  18. package/dist/cjs/components/XAdkSender/InputTags.js.map +2 -2
  19. package/dist/cjs/components/XAdkSender/index.js +73 -45
  20. package/dist/cjs/components/XAdkSender/index.js.map +2 -2
  21. package/dist/cjs/index.d.ts +2 -1
  22. package/dist/cjs/index.js +7 -0
  23. package/dist/cjs/index.js.map +2 -2
  24. package/dist/cjs/presets/xgroup/preset.js +2 -1
  25. package/dist/cjs/presets/xgroup/preset.js.map +2 -2
  26. package/dist/cjs/presets/xgroup/strategies.d.ts +5 -1
  27. package/dist/cjs/presets/xgroup/strategies.js +16 -1
  28. package/dist/cjs/presets/xgroup/strategies.js.map +3 -3
  29. package/dist/cjs/types/ChatStrategies.d.ts +5 -0
  30. package/dist/cjs/types/ChatStrategies.js.map +1 -1
  31. package/dist/cjs/types/XAdkChatbot.d.ts +15 -0
  32. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  33. package/dist/cjs/types/XAdkSender.d.ts +62 -24
  34. package/dist/cjs/types/XAdkSender.js.map +1 -1
  35. package/dist/cjs/utils/index.d.ts +1 -0
  36. package/dist/cjs/utils/index.js +3 -1
  37. package/dist/cjs/utils/index.js.map +2 -2
  38. package/dist/cjs/utils/markdownResource.d.ts +11 -0
  39. package/dist/cjs/utils/markdownResource.js +79 -0
  40. package/dist/cjs/utils/markdownResource.js.map +7 -0
  41. package/dist/esm/components/FileGallery/styles.js +2 -2
  42. package/dist/esm/components/FileGallery/styles.js.map +1 -1
  43. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +9 -1
  44. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +64 -7
  45. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
  46. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
  47. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js +5 -2
  48. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js.map +1 -1
  49. package/dist/esm/components/XAdkChatbot/index.js +25 -6
  50. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  51. package/dist/esm/components/XAdkChatbot/styles.js +1 -1
  52. package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
  53. package/dist/esm/components/XAdkSender/InlineTagInput.d.ts +11 -5
  54. package/dist/esm/components/XAdkSender/InlineTagInput.js +125 -97
  55. package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -1
  56. package/dist/esm/components/XAdkSender/InputTags.d.ts +2 -2
  57. package/dist/esm/components/XAdkSender/InputTags.js +9 -9
  58. package/dist/esm/components/XAdkSender/InputTags.js.map +1 -1
  59. package/dist/esm/components/XAdkSender/index.js +97 -71
  60. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  61. package/dist/esm/index.d.ts +2 -1
  62. package/dist/esm/index.js +2 -1
  63. package/dist/esm/index.js.map +1 -1
  64. package/dist/esm/presets/xgroup/preset.js +3 -2
  65. package/dist/esm/presets/xgroup/preset.js.map +1 -1
  66. package/dist/esm/presets/xgroup/strategies.d.ts +5 -1
  67. package/dist/esm/presets/xgroup/strategies.js +12 -1
  68. package/dist/esm/presets/xgroup/strategies.js.map +1 -1
  69. package/dist/esm/types/ChatStrategies.d.ts +5 -0
  70. package/dist/esm/types/ChatStrategies.js.map +1 -1
  71. package/dist/esm/types/XAdkChatbot.d.ts +15 -0
  72. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  73. package/dist/esm/types/XAdkSender.d.ts +62 -24
  74. package/dist/esm/types/XAdkSender.js.map +1 -1
  75. package/dist/esm/utils/index.d.ts +1 -0
  76. package/dist/esm/utils/index.js +1 -0
  77. package/dist/esm/utils/index.js.map +1 -1
  78. package/dist/esm/utils/markdownResource.d.ts +11 -0
  79. package/dist/esm/utils/markdownResource.js +36 -0
  80. package/dist/esm/utils/markdownResource.js.map +1 -0
  81. package/dist/umd/chat-sdk.min.js +1 -1
  82. package/package.json +1 -1
@@ -7,7 +7,7 @@ export var useStyles = withBasicStyles(function () {
7
7
  container: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n padding: 12px 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n &.align-right {\n align-items: flex-end;\n }\n "]))),
8
8
  fileList: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n "]))),
9
9
  fileCard: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n position: relative;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n margin: 8px 0;\n background: #fafafa;\n border: 1px solid #f0f0f0;\n border-radius: 8px;\n min-width: 260px;\n max-width: 280px;\n min-height: 64px;\n transition: all 0.2s ease;\n\n &:hover {\n background: #f5f5f5;\n border-color: #e0e0e0;\n }\n\n /* align=right \u65F6\u56FE\u6807\u5728\u53F3\u4FA7 */\n &.align-right {\n flex-direction: row-reverse;\n }\n\n "]))),
10
- fileCardSmall: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n gap: 6px;\n min-width: 0;\n max-width: 260px;\n width: auto;\n height: 32px;\n min-height: 32px;\n margin: 0;\n padding: 4px 10px 4px 8px;\n border-radius: 7px;\n background: #f5f5f5;\n border-color: transparent;\n box-sizing: border-box;\n\n &:hover {\n background: #eeeeee;\n border-color: transparent;\n }\n\n .ant-progress-line {\n width: 56px;\n }\n "]))),
10
+ fileCardSmall: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n gap: 6px;\n min-width: 0;\n max-width: 260px;\n width: auto;\n height: 32px;\n min-height: 32px;\n margin: 0;\n padding: 4px 10px 4px 8px;\n border-radius: 7px;\n background: #f5f5f5;\n border-color: transparent;\n box-sizing: border-box;\n\n &:hover {\n background: #eeeeee;\n border-color: transparent;\n }\n\n .ant-progress-line {\n width: auto;\n }\n "]))),
11
11
  imageThumbnail: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n position: relative;\n width: 44px;\n height: 44px;\n flex-shrink: 0;\n border-radius: 4px;\n overflow: hidden;\n background-color: #f5f5f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n\n .ant-image {\n width: 100% !important;\n height: 100% !important;\n display: flex !important;\n justify-content: center;\n align-items: center;\n }\n\n img {\n width: 100% !important;\n height: 100% !important;\n object-fit: cover !important;\n display: block !important;\n }\n\n "]))),
12
12
  imageThumbnailSmall: css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n width: 22px;\n height: 22px;\n border-radius: 5px;\n "]))),
13
13
  imageOverlay: css(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.05);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n "]))),
@@ -19,7 +19,7 @@ export var useStyles = withBasicStyles(function () {
19
19
  fileSize: css(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n font-size: 11px;\n color: #8c8c8c;\n\n "]))),
20
20
  fileSizeSmall: css(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n display: none;\n "]))),
21
21
  progress: css(_templateObject15 || (_templateObject15 = _taggedTemplateLiteral(["\n margin-top: 4px;\n\n .ant-progress-inner {\n height: 4px !important;\n }\n\n .ant-progress-bg {\n height: 4px !important;\n }\n\n "]))),
22
- progressSmall: css(_templateObject16 || (_templateObject16 = _taggedTemplateLiteral(["\n margin-top: 0;\n "]))),
22
+ progressSmall: css(_templateObject16 || (_templateObject16 = _taggedTemplateLiteral(["\n position: absolute;\n left: 34px;\n right: 10px;\n bottom: 3px;\n margin-top: 0;\n line-height: 0;\n\n .ant-progress-outer {\n display: block;\n width: 100%;\n padding-inline-end: 0 !important;\n }\n\n .ant-progress-inner {\n height: 3px !important;\n background: rgba(22, 119, 255, 0.12);\n }\n\n .ant-progress-bg {\n height: 3px !important;\n }\n "]))),
23
23
  fileRemoveBtn: css(_templateObject17 || (_templateObject17 = _taggedTemplateLiteral(["\n position: absolute;\n top: -6px;\n right: -6px;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: rgba(0, 0, 0, 0.75);\n color: #fff;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 1;\n padding: 0;\n font-size: 10px;\n transition: all 0.2s ease;\n\n &:hover {\n background: rgba(0, 0, 0, 0.9);\n transform: scale(1.1);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n "]))),
24
24
  fileRemoveBtnSmall: css(_templateObject18 || (_templateObject18 = _taggedTemplateLiteral(["\n top: -5px;\n right: -5px;\n width: 14px;\n height: 14px;\n font-size: 8px;\n "]))),
25
25
  fileLink: css(_templateObject19 || (_templateObject19 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n gap: 8px;\n color: rgba(0, 0, 0, 0.85);\n text-decoration: none;\n font-size: 13px;\n\n &:hover {\n color: #1677ff;\n }\n "]))),
@@ -1 +1 @@
1
- {"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","fileList","_templateObject2","fileCard","_templateObject3","fileCardSmall","_templateObject4","imageThumbnail","_templateObject5","imageThumbnailSmall","_templateObject6","imageOverlay","_templateObject7","fileIcon","_templateObject8","fileIconSmall","_templateObject9","fileInfo","_templateObject10","fileName","_templateObject11","fileNameSmall","_templateObject12","fileSize","_templateObject13","fileSizeSmall","_templateObject14","progress","_templateObject15","progressSmall","_templateObject16","fileRemoveBtn","_templateObject17","fileRemoveBtnSmall","_templateObject18","fileLink","_templateObject19","mediaWrapper","_templateObject20","imagePreviewMode","_templateObject21","imageFullMode","_templateObject22","imageLoadingSkeleton","_templateObject23","imageErrorFallback","_templateObject24","mediaCardPlayIcon","_templateObject25"],"sources":["../../../../src/components/FileGallery/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n padding: 12px 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n &.align-right {\n align-items: flex-end;\n }\n `,\n\n fileList: css`\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n `,\n\n fileCard: css`\n position: relative;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n margin: 8px 0;\n background: #fafafa;\n border: 1px solid #f0f0f0;\n border-radius: 8px;\n min-width: 260px;\n max-width: 280px;\n min-height: 64px;\n transition: all 0.2s ease;\n\n &:hover {\n background: #f5f5f5;\n border-color: #e0e0e0;\n }\n\n /* align=right 时图标在右侧 */\n &.align-right {\n flex-direction: row-reverse;\n }\n\n `,\n\n fileCardSmall: css`\n gap: 6px;\n min-width: 0;\n max-width: 260px;\n width: auto;\n height: 32px;\n min-height: 32px;\n margin: 0;\n padding: 4px 10px 4px 8px;\n border-radius: 7px;\n background: #f5f5f5;\n border-color: transparent;\n box-sizing: border-box;\n\n &:hover {\n background: #eeeeee;\n border-color: transparent;\n }\n\n .ant-progress-line {\n width: 56px;\n }\n `,\n\n imageThumbnail: css`\n position: relative;\n width: 44px;\n height: 44px;\n flex-shrink: 0;\n border-radius: 4px;\n overflow: hidden;\n background-color: #f5f5f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n\n .ant-image {\n width: 100% !important;\n height: 100% !important;\n display: flex !important;\n justify-content: center;\n align-items: center;\n }\n\n img {\n width: 100% !important;\n height: 100% !important;\n object-fit: cover !important;\n display: block !important;\n }\n\n `,\n\n imageThumbnailSmall: css`\n width: 22px;\n height: 22px;\n border-radius: 5px;\n `,\n\n imageOverlay: css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.05);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n `,\n\n fileIcon: css`\n font-size: 24px;\n flex-shrink: 0;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n\n `,\n\n fileIconSmall: css`\n width: 20px;\n height: 20px;\n font-size: 16px;\n `,\n\n fileInfo: css`\n flex: 1;\n min-width: 0;\n overflow: hidden;\n `,\n\n fileName: css`\n font-size: 13px;\n font-weight: 500;\n color: #262626;\n margin-bottom: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n `,\n\n fileNameSmall: css`\n max-width: 190px;\n margin-bottom: 0;\n font-size: 12px;\n line-height: 20px;\n `,\n\n fileSize: css`\n font-size: 11px;\n color: #8c8c8c;\n\n `,\n\n fileSizeSmall: css`\n display: none;\n `,\n\n progress: css`\n margin-top: 4px;\n\n .ant-progress-inner {\n height: 4px !important;\n }\n\n .ant-progress-bg {\n height: 4px !important;\n }\n\n `,\n\n progressSmall: css`\n margin-top: 0;\n `,\n\n fileRemoveBtn: css`\n position: absolute;\n top: -6px;\n right: -6px;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: rgba(0, 0, 0, 0.75);\n color: #fff;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 1;\n padding: 0;\n font-size: 10px;\n transition: all 0.2s ease;\n\n &:hover {\n background: rgba(0, 0, 0, 0.9);\n transform: scale(1.1);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n\n fileRemoveBtnSmall: css`\n top: -5px;\n right: -5px;\n width: 14px;\n height: 14px;\n font-size: 8px;\n `,\n\n fileLink: css`\n display: flex;\n align-items: center;\n gap: 8px;\n color: rgba(0, 0, 0, 0.85);\n text-decoration: none;\n font-size: 13px;\n\n &:hover {\n color: #1677ff;\n }\n `,\n\n mediaWrapper: css`\n margin-top: 6px;\n\n audio {\n width: 100%;\n height: 32px;\n outline: none;\n }\n\n video {\n width: 100%;\n max-height: 240px;\n border-radius: 4px;\n outline: none;\n background: #000;\n }\n `,\n\n // ========== 图片展示模式 ==========\n imagePreviewMode: css`\n position: relative;\n border-radius: 8px;\n overflow: hidden;\n background-color: #f5f5f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n\n .ant-image {\n display: flex !important;\n justify-content: center;\n align-items: center;\n }\n\n img {\n display: block !important;\n object-fit: contain !important;\n }\n `,\n\n imageFullMode: css`\n position: relative;\n border-radius: 8px;\n overflow: hidden;\n background-color: #f5f5f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n width: 100%;\n\n .ant-image {\n width: 100% !important;\n display: flex !important;\n }\n\n img {\n width: 100% !important;\n display: block !important;\n object-fit: contain !important;\n }\n `,\n\n // ========== 图片加载状态 ==========\n imageLoadingSkeleton: css`\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(90deg, #f5f5f5 25%, #e8e8e8 50%, #f5f5f5 75%);\n background-size: 200% 100%;\n animation: shimmer 1.5s infinite;\n\n @keyframes shimmer {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n }\n `,\n\n imageErrorFallback: css`\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: #fafafa;\n color: #bfbfbf;\n font-size: 20px;\n gap: 4px;\n\n span {\n font-size: 11px;\n color: #bfbfbf;\n }\n `,\n\n // ========== Media Card 模式 ==========\n mediaCardPlayIcon: css`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: rgba(0, 0, 0, 0.5);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n z-index: 2;\n `,\n}));\n\nexport default useStyles;\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,SAAS,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,+JASb;IAEDC,QAAQ,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,qEAIZ;IAEDG,QAAQ,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,yhBAyBZ;IAEDK,aAAa,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,8aAsBjB;IAEDO,cAAc,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,8iBAyBlB;IAEDS,mBAAmB,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,0EAIvB;IAEDW,YAAY,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,mOAWhB;IAEDa,QAAQ,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,0KASZ;IAEDe,aAAa,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,uEAIjB;IAEDiB,QAAQ,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,oEAIZ;IAEDmB,QAAQ,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,wLASZ;IAEDqB,aAAa,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,wGAKjB;IAEDuB,QAAQ,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA,yDAIZ;IAEDyB,aAAa,EAAE9B,GAAG,CAAA+B,iBAAA,KAAAA,iBAAA,GAAA1B,sBAAA,gCAEjB;IAED2B,QAAQ,EAAEhC,GAAG,CAAAiC,iBAAA,KAAAA,iBAAA,GAAA5B,sBAAA,uKAWZ;IAED6B,aAAa,EAAElC,GAAG,CAAAmC,iBAAA,KAAAA,iBAAA,GAAA9B,sBAAA,gCAEjB;IAED+B,aAAa,EAAEpC,GAAG,CAAAqC,iBAAA,KAAAA,iBAAA,GAAAhC,sBAAA,mjBA4BjB;IAEDiC,kBAAkB,EAAEtC,GAAG,CAAAuC,iBAAA,KAAAA,iBAAA,GAAAlC,sBAAA,wGAMtB;IAEDmC,QAAQ,EAAExC,GAAG,CAAAyC,iBAAA,KAAAA,iBAAA,GAAApC,sBAAA,2MAWZ;IAEDqC,YAAY,EAAE1C,GAAG,CAAA2C,iBAAA,KAAAA,iBAAA,GAAAtC,sBAAA,qQAgBhB;IAED;IACAuC,gBAAgB,EAAE5C,GAAG,CAAA6C,iBAAA,KAAAA,iBAAA,GAAAxC,sBAAA,sXAiBpB;IAEDyC,aAAa,EAAE9C,GAAG,CAAA+C,iBAAA,KAAAA,iBAAA,GAAA1C,sBAAA,0YAkBjB;IAED;IACA2C,oBAAoB,EAAEhD,GAAG,CAAAiD,iBAAA,KAAAA,iBAAA,GAAA5C,sBAAA,ibAkBxB;IAED6C,kBAAkB,EAAElD,GAAG,CAAAmD,iBAAA,KAAAA,iBAAA,GAAA9C,sBAAA,kTAgBtB;IAED;IACA+C,iBAAiB,EAAEpD,GAAG,CAAAqD,iBAAA,KAAAA,iBAAA,GAAAhD,sBAAA;EAgBxB,CAAC;AAAA,CAAC,CAAC;AAEH,eAAeH,SAAS"}
1
+ {"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","fileList","_templateObject2","fileCard","_templateObject3","fileCardSmall","_templateObject4","imageThumbnail","_templateObject5","imageThumbnailSmall","_templateObject6","imageOverlay","_templateObject7","fileIcon","_templateObject8","fileIconSmall","_templateObject9","fileInfo","_templateObject10","fileName","_templateObject11","fileNameSmall","_templateObject12","fileSize","_templateObject13","fileSizeSmall","_templateObject14","progress","_templateObject15","progressSmall","_templateObject16","fileRemoveBtn","_templateObject17","fileRemoveBtnSmall","_templateObject18","fileLink","_templateObject19","mediaWrapper","_templateObject20","imagePreviewMode","_templateObject21","imageFullMode","_templateObject22","imageLoadingSkeleton","_templateObject23","imageErrorFallback","_templateObject24","mediaCardPlayIcon","_templateObject25"],"sources":["../../../../src/components/FileGallery/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n padding: 12px 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n\n &.align-right {\n align-items: flex-end;\n }\n `,\n\n fileList: css`\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n `,\n\n fileCard: css`\n position: relative;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 12px;\n margin: 8px 0;\n background: #fafafa;\n border: 1px solid #f0f0f0;\n border-radius: 8px;\n min-width: 260px;\n max-width: 280px;\n min-height: 64px;\n transition: all 0.2s ease;\n\n &:hover {\n background: #f5f5f5;\n border-color: #e0e0e0;\n }\n\n /* align=right 时图标在右侧 */\n &.align-right {\n flex-direction: row-reverse;\n }\n\n `,\n\n fileCardSmall: css`\n gap: 6px;\n min-width: 0;\n max-width: 260px;\n width: auto;\n height: 32px;\n min-height: 32px;\n margin: 0;\n padding: 4px 10px 4px 8px;\n border-radius: 7px;\n background: #f5f5f5;\n border-color: transparent;\n box-sizing: border-box;\n\n &:hover {\n background: #eeeeee;\n border-color: transparent;\n }\n\n .ant-progress-line {\n width: auto;\n }\n `,\n\n imageThumbnail: css`\n position: relative;\n width: 44px;\n height: 44px;\n flex-shrink: 0;\n border-radius: 4px;\n overflow: hidden;\n background-color: #f5f5f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n\n .ant-image {\n width: 100% !important;\n height: 100% !important;\n display: flex !important;\n justify-content: center;\n align-items: center;\n }\n\n img {\n width: 100% !important;\n height: 100% !important;\n object-fit: cover !important;\n display: block !important;\n }\n\n `,\n\n imageThumbnailSmall: css`\n width: 22px;\n height: 22px;\n border-radius: 5px;\n `,\n\n imageOverlay: css`\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.05);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n `,\n\n fileIcon: css`\n font-size: 24px;\n flex-shrink: 0;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n\n `,\n\n fileIconSmall: css`\n width: 20px;\n height: 20px;\n font-size: 16px;\n `,\n\n fileInfo: css`\n flex: 1;\n min-width: 0;\n overflow: hidden;\n `,\n\n fileName: css`\n font-size: 13px;\n font-weight: 500;\n color: #262626;\n margin-bottom: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n `,\n\n fileNameSmall: css`\n max-width: 190px;\n margin-bottom: 0;\n font-size: 12px;\n line-height: 20px;\n `,\n\n fileSize: css`\n font-size: 11px;\n color: #8c8c8c;\n\n `,\n\n fileSizeSmall: css`\n display: none;\n `,\n\n progress: css`\n margin-top: 4px;\n\n .ant-progress-inner {\n height: 4px !important;\n }\n\n .ant-progress-bg {\n height: 4px !important;\n }\n\n `,\n\n progressSmall: css`\n position: absolute;\n left: 34px;\n right: 10px;\n bottom: 3px;\n margin-top: 0;\n line-height: 0;\n\n .ant-progress-outer {\n display: block;\n width: 100%;\n padding-inline-end: 0 !important;\n }\n\n .ant-progress-inner {\n height: 3px !important;\n background: rgba(22, 119, 255, 0.12);\n }\n\n .ant-progress-bg {\n height: 3px !important;\n }\n `,\n\n fileRemoveBtn: css`\n position: absolute;\n top: -6px;\n right: -6px;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: rgba(0, 0, 0, 0.75);\n color: #fff;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 1;\n padding: 0;\n font-size: 10px;\n transition: all 0.2s ease;\n\n &:hover {\n background: rgba(0, 0, 0, 0.9);\n transform: scale(1.1);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n\n fileRemoveBtnSmall: css`\n top: -5px;\n right: -5px;\n width: 14px;\n height: 14px;\n font-size: 8px;\n `,\n\n fileLink: css`\n display: flex;\n align-items: center;\n gap: 8px;\n color: rgba(0, 0, 0, 0.85);\n text-decoration: none;\n font-size: 13px;\n\n &:hover {\n color: #1677ff;\n }\n `,\n\n mediaWrapper: css`\n margin-top: 6px;\n\n audio {\n width: 100%;\n height: 32px;\n outline: none;\n }\n\n video {\n width: 100%;\n max-height: 240px;\n border-radius: 4px;\n outline: none;\n background: #000;\n }\n `,\n\n // ========== 图片展示模式 ==========\n imagePreviewMode: css`\n position: relative;\n border-radius: 8px;\n overflow: hidden;\n background-color: #f5f5f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n\n .ant-image {\n display: flex !important;\n justify-content: center;\n align-items: center;\n }\n\n img {\n display: block !important;\n object-fit: contain !important;\n }\n `,\n\n imageFullMode: css`\n position: relative;\n border-radius: 8px;\n overflow: hidden;\n background-color: #f5f5f5;\n border: 1px solid rgba(0, 0, 0, 0.06);\n width: 100%;\n\n .ant-image {\n width: 100% !important;\n display: flex !important;\n }\n\n img {\n width: 100% !important;\n display: block !important;\n object-fit: contain !important;\n }\n `,\n\n // ========== 图片加载状态 ==========\n imageLoadingSkeleton: css`\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(90deg, #f5f5f5 25%, #e8e8e8 50%, #f5f5f5 75%);\n background-size: 200% 100%;\n animation: shimmer 1.5s infinite;\n\n @keyframes shimmer {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n }\n `,\n\n imageErrorFallback: css`\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background: #fafafa;\n color: #bfbfbf;\n font-size: 20px;\n gap: 4px;\n\n span {\n font-size: 11px;\n color: #bfbfbf;\n }\n `,\n\n // ========== Media Card 模式 ==========\n mediaCardPlayIcon: css`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: rgba(0, 0, 0, 0.5);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n z-index: 2;\n `,\n}));\n\nexport default useStyles;\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,SAAS,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,+JASb;IAEDC,QAAQ,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,qEAIZ;IAEDG,QAAQ,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,yhBAyBZ;IAEDK,aAAa,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,8aAsBjB;IAEDO,cAAc,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,8iBAyBlB;IAEDS,mBAAmB,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,0EAIvB;IAEDW,YAAY,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,mOAWhB;IAEDa,QAAQ,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,0KASZ;IAEDe,aAAa,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,uEAIjB;IAEDiB,QAAQ,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,oEAIZ;IAEDmB,QAAQ,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,wLASZ;IAEDqB,aAAa,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,wGAKjB;IAEDuB,QAAQ,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA,yDAIZ;IAEDyB,aAAa,EAAE9B,GAAG,CAAA+B,iBAAA,KAAAA,iBAAA,GAAA1B,sBAAA,gCAEjB;IAED2B,QAAQ,EAAEhC,GAAG,CAAAiC,iBAAA,KAAAA,iBAAA,GAAA5B,sBAAA,uKAWZ;IAED6B,aAAa,EAAElC,GAAG,CAAAmC,iBAAA,KAAAA,iBAAA,GAAA9B,sBAAA,2aAsBjB;IAED+B,aAAa,EAAEpC,GAAG,CAAAqC,iBAAA,KAAAA,iBAAA,GAAAhC,sBAAA,mjBA4BjB;IAEDiC,kBAAkB,EAAEtC,GAAG,CAAAuC,iBAAA,KAAAA,iBAAA,GAAAlC,sBAAA,wGAMtB;IAEDmC,QAAQ,EAAExC,GAAG,CAAAyC,iBAAA,KAAAA,iBAAA,GAAApC,sBAAA,2MAWZ;IAEDqC,YAAY,EAAE1C,GAAG,CAAA2C,iBAAA,KAAAA,iBAAA,GAAAtC,sBAAA,qQAgBhB;IAED;IACAuC,gBAAgB,EAAE5C,GAAG,CAAA6C,iBAAA,KAAAA,iBAAA,GAAAxC,sBAAA,sXAiBpB;IAEDyC,aAAa,EAAE9C,GAAG,CAAA+C,iBAAA,KAAAA,iBAAA,GAAA1C,sBAAA,0YAkBjB;IAED;IACA2C,oBAAoB,EAAEhD,GAAG,CAAAiD,iBAAA,KAAAA,iBAAA,GAAA5C,sBAAA,ibAkBxB;IAED6C,kBAAkB,EAAElD,GAAG,CAAAmD,iBAAA,KAAAA,iBAAA,GAAA9C,sBAAA,kTAgBtB;IAED;IACA+C,iBAAiB,EAAEpD,GAAG,CAAAqD,iBAAA,KAAAA,iBAAA,GAAAhD,sBAAA;EAgBxB,CAAC;AAAA,CAAC,CAAC;AAEH,eAAeH,SAAS"}
@@ -1,10 +1,18 @@
1
1
  import React from "react";
2
2
  import "@ant-design/x-markdown/themes/light.css";
3
- import type { FileItem } from "../../../../types";
3
+ import type { FileItem, MarkdownResourceLink, RenderMarkdownResourceLink } from "../../../../types";
4
4
  export interface MarkdownRenderProps {
5
5
  text: string;
6
+ /** 紧凑布局,适合用户消息气泡等内联场景 */
7
+ compact?: boolean;
8
+ /** Markdown 资源链接协议白名单,未命中的协议保持普通 Markdown 行为 */
9
+ resourceLinkSchemes?: readonly string[];
6
10
  /** 点击 Markdown 中识别到的文件链接的回调 */
7
11
  onFileClick?: (file: FileItem) => void;
12
+ /** 点击 Markdown 中识别到的资源链接标签,如 [@skill](skill://xxx) */
13
+ onResourceLinkClick?: (link: MarkdownResourceLink) => void;
14
+ /** 自定义资源链接渲染,返回 null 时使用默认标签样式 */
15
+ renderResourceLink?: RenderMarkdownResourceLink;
8
16
  }
9
17
  declare const MarkdownRender: React.FC<MarkdownRenderProps>;
10
18
  export default MarkdownRender;
@@ -7,9 +7,12 @@ 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
9
  import FileGallery from "../../../FileGallery";
10
+ import { parseMarkdownResourceHref, replaceMarkdownResourceLinks } from "../../../../utils/markdownResource";
11
+
12
+ // 支持识别的文件扩展名
10
13
  import { jsx as _jsx } from "react/jsx-runtime";
11
14
  import { jsxs as _jsxs } from "react/jsx-runtime";
12
- // 支持识别的文件扩展名
15
+ import { Fragment as _Fragment } from "react/jsx-runtime";
13
16
  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
17
  var MIME_MAP = {
15
18
  pdf: "application/pdf",
@@ -55,6 +58,12 @@ var extractExt = function extractExt(str) {
55
58
  if (!match) return "";
56
59
  return match[1].toLowerCase();
57
60
  };
61
+ var escapeHtml = function escapeHtml(value) {
62
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
63
+ };
64
+ var escapeAttr = function escapeAttr(value) {
65
+ return escapeHtml(value).replace(/"/g, "&quot;").replace(/'/g, "&#39;");
66
+ };
58
67
  var CodeComponent = function CodeComponent(props) {
59
68
  var _className$match;
60
69
  var className = props.className,
@@ -107,15 +116,62 @@ var extractText = function extractText(children) {
107
116
  };
108
117
  var MarkdownRender = function MarkdownRender(_ref) {
109
118
  var text = _ref.text,
110
- onFileClick = _ref.onFileClick;
119
+ _ref$compact = _ref.compact,
120
+ compact = _ref$compact === void 0 ? false : _ref$compact,
121
+ resourceLinkSchemes = _ref.resourceLinkSchemes,
122
+ onFileClick = _ref.onFileClick,
123
+ onResourceLinkClick = _ref.onResourceLinkClick,
124
+ renderResourceLink = _ref.renderResourceLink;
111
125
  var styles = useStyles();
112
- 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>');
126
+ var markdown = replaceMarkdownResourceLinks(text, function (link) {
127
+ // 非 http(s) 协议容易被 Markdown 引擎清洗成普通文本,先转为内部自定义标签再交给 XMarkdown。
128
+ return "<resource-link href=\"".concat(escapeAttr(link.href), "\" label=\"").concat(escapeAttr(link.label), "\" type=\"").concat(escapeAttr(link.type), "\" value=\"").concat(escapeAttr(link.value), "\">").concat(escapeHtml(link.label), "</resource-link>");
129
+ }, {
130
+ schemes: resourceLinkSchemes
131
+ }).replaceAll(/\/\*\s*PLANNING\s*\*\//g, '<tag type="planning"></tag>').replaceAll(/\/\*\s*REPLANNING\s*\*\//g, '<tag type="replanning"></tag>').replaceAll(/\/\*\s*REASONING\s*\*\//g, '<tag type="reasoning"></tag>').replaceAll(/\/\*\s*ACTION\s*\*\//g, '<tag type="action"></tag>').replaceAll(/\/\*\s*FINAL_ANSWER\s*\*\//g, '<tag type="final_answer"></tag>');
132
+ var ResourceLinkComponent = React.useCallback(function (props) {
133
+ var href = String(props.href || "");
134
+ var linkText = String(props.label || "") || extractText(props.children);
135
+ var resourceLink = parseMarkdownResourceHref(href, linkText, {
136
+ schemes: resourceLinkSchemes
137
+ });
138
+ if (!resourceLink) return /*#__PURE__*/_jsx(_Fragment, {
139
+ children: props.children
140
+ });
141
+ var customNode = renderResourceLink === null || renderResourceLink === void 0 ? void 0 : renderResourceLink(resourceLink);
142
+ if (customNode) return customNode;
143
+ return /*#__PURE__*/_jsx("button", {
144
+ type: "button",
145
+ className: styles.resourceLink,
146
+ onClick: function onClick() {
147
+ return onResourceLinkClick === null || onResourceLinkClick === void 0 ? void 0 : onResourceLinkClick(resourceLink);
148
+ },
149
+ "aria-label": resourceLink.label,
150
+ children: resourceLink.label
151
+ });
152
+ }, [onResourceLinkClick, renderResourceLink, resourceLinkSchemes, styles.resourceLink]);
113
153
 
114
- // 自定义 a 标签渲染:识别文件链接并渲染为 FileGallery 卡片
154
+ // 自定义 a 标签渲染:资源协议渲染为标签,文件链接渲染为 FileGallery,其余保持普通链接。
115
155
  var LinkComponent = React.useCallback(function (props) {
116
156
  var href = String(props.href || "");
117
157
  // 用递归提取纯文本,避免 children 是 React node 时 String() 得到 "[object Object]"
118
158
  var linkText = extractText(props.children);
159
+ var resourceLink = parseMarkdownResourceHref(href, linkText, {
160
+ schemes: resourceLinkSchemes
161
+ });
162
+ if (resourceLink) {
163
+ var customNode = renderResourceLink === null || renderResourceLink === void 0 ? void 0 : renderResourceLink(resourceLink);
164
+ if (customNode) return customNode;
165
+ return /*#__PURE__*/_jsx("button", {
166
+ type: "button",
167
+ className: styles.resourceLink,
168
+ onClick: function onClick() {
169
+ return onResourceLinkClick === null || onResourceLinkClick === void 0 ? void 0 : onResourceLinkClick(resourceLink);
170
+ },
171
+ "aria-label": resourceLink.label,
172
+ children: resourceLink.label
173
+ });
174
+ }
119
175
 
120
176
  // 先识别 name(链接文字),再识别 url(href)
121
177
  var ext = extractExt(linkText) || extractExt(href);
@@ -141,11 +197,11 @@ var MarkdownRender = function MarkdownRender(_ref) {
141
197
  rel: "noopener noreferrer",
142
198
  children: props.children
143
199
  });
144
- }, [onFileClick]);
200
+ }, [onFileClick, onResourceLinkClick, renderResourceLink, resourceLinkSchemes, styles.resourceLink]);
145
201
  return /*#__PURE__*/_jsx("div", {
146
- className: styles.markdownWrapper,
202
+ className: "".concat(styles.markdownWrapper).concat(compact ? " ".concat(styles.markdownWrapperCompact) : ""),
147
203
  children: /*#__PURE__*/_jsx("div", {
148
- className: styles.markdownHost,
204
+ className: "".concat(styles.markdownHost).concat(compact ? " ".concat(styles.markdownHostCompact) : ""),
149
205
  children: /*#__PURE__*/_jsx(XMarkdown, {
150
206
  content: markdown,
151
207
  className: "x-markdown-light",
@@ -155,6 +211,7 @@ var MarkdownRender = function MarkdownRender(_ref) {
155
211
  },
156
212
  components: {
157
213
  tag: ThinkComponent,
214
+ "resource-link": ResourceLinkComponent,
158
215
  code: CodeComponent,
159
216
  a: LinkComponent
160
217
  },
@@ -1 +1 @@
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","extractText","String","Array","isArray","map","join","isValidElement","MarkdownRender","_ref","text","onFileClick","styles","markdown","replaceAll","LinkComponent","useCallback","href","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\n/**\n * 递归从 React children 中提取纯文本\n */\nconst extractText = (children: React.ReactNode): string => {\n if (typeof children === \"string\") return children;\n if (typeof children === \"number\") return String(children);\n if (Array.isArray(children)) return children.map(extractText).join(\"\");\n if (React.isValidElement(children))\n return extractText((children.props as any).children);\n return \"\";\n};\n\nconst MarkdownRender: React.FC<MarkdownRenderProps> = ({\n text,\n 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 // 用递归提取纯文本,避免 children 是 React node 时 String() 得到 \"[object Object]\"\n const linkText = extractText(props.children);\n\n // 先识别 name(链接文字),再识别 url(href)\n const ext = extractExt(linkText) || extractExt(href);\n\n if (ext) {\n // href 为空说明链接还在流式截断中,不渲染,避免显示出错误文字\n if (!href) return null;\n const mimeType = MIME_MAP[ext] || \"\";\n const fileItem: FileItem = {\n displayName: linkText || href,\n mimeType,\n fileUri: href,\n };\n return (\n <FileGallery\n file={fileItem}\n onClick={onFileClick ? () => onFileClick(fileItem) : undefined}\n />\n );\n }\n\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {props.children as React.ReactNode}\n </a>\n );\n },\n [onFileClick],\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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"}
1
+ {"version":3,"names":["React","XMarkdown","CodeHighlighter","Flex","Latex","useStyles","BarsOutlined","BulbOutlined","ThunderboltOutlined","CheckCircleOutlined","FileGallery","parseMarkdownResourceHref","replaceMarkdownResourceLinks","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","FILE_EXT_REGEX","MIME_MAP","pdf","doc","docx","xls","xlsx","csv","ppt","pptx","zip","rar","txt","md","json","xml","mp3","wav","m4a","aac","ogg","flac","mp4","mov","webm","mkv","avi","png","jpg","jpeg","gif","webp","bmp","svg","extractExt","str","match","toLowerCase","escapeHtml","value","replace","escapeAttr","CodeComponent","props","_className$match","className","children","lang","ThinkComponent","memo","type","titleMap","planning","replanning","reasoning","action","final_answer","iconMap","align","gap","style","color","margin","extractText","String","Array","isArray","map","join","isValidElement","MarkdownRender","_ref","text","_ref$compact","compact","resourceLinkSchemes","onFileClick","onResourceLinkClick","renderResourceLink","styles","markdown","link","concat","href","label","schemes","replaceAll","ResourceLinkComponent","useCallback","linkText","resourceLink","customNode","onClick","LinkComponent","ext","mimeType","fileItem","displayName","fileUri","file","undefined","target","rel","markdownWrapper","markdownWrapperCompact","markdownHost","markdownHostCompact","content","paragraphTag","config","extensions","components","tag","code","a","streaming","enableAnimation","animationConfig","fadeDuration"],"sources":["../../../../../../src/components/XAdkChatbot/components/MarkdownRender/index.tsx"],"sourcesContent":["import React from \"react\";\nimport XMarkdown, { type ComponentProps } from \"@ant-design/x-markdown\";\nimport \"@ant-design/x-markdown/themes/light.css\";\nimport { CodeHighlighter } from \"@ant-design/x\";\nimport { Flex } from \"antd\";\nimport Latex from \"@ant-design/x-markdown/plugins/Latex\";\nimport { useStyles } from \"./styles\";\nimport {\n BarsOutlined,\n BulbOutlined,\n ThunderboltOutlined,\n CheckCircleOutlined,\n} from \"@ant-design/icons\";\nimport FileGallery from \"@/components/FileGallery\";\nimport type {\n FileItem,\n MarkdownResourceLink,\n RenderMarkdownResourceLink,\n} from \"@/types\";\nimport {\n parseMarkdownResourceHref,\n replaceMarkdownResourceLinks,\n} from \"@/utils/markdownResource\";\n\n// 支持识别的文件扩展名\nconst FILE_EXT_REGEX =\n /\\.(pdf|doc|docx|xls|xlsx|csv|ppt|pptx|zip|rar|7z|txt|md|json|xml|mp3|wav|m4a|aac|ogg|flac|mp4|mov|webm|mkv|avi|png|jpg|jpeg|gif|webp|bmp|svg)(\\?.*)?$/i;\n\nconst MIME_MAP: Record<string, string> = {\n pdf: \"application/pdf\",\n doc: \"application/msword\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n xls: \"application/vnd.ms-excel\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n csv: \"text/csv\",\n ppt: \"application/vnd.ms-powerpoint\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n zip: \"application/zip\",\n rar: \"application/x-rar-compressed\",\n \"7z\": \"application/x-7z-compressed\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n json: \"application/json\",\n xml: \"application/xml\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n m4a: \"audio/mp4\",\n aac: \"audio/aac\",\n ogg: \"audio/ogg\",\n flac: \"audio/flac\",\n mp4: \"video/mp4\",\n mov: \"video/quicktime\",\n webm: \"video/webm\",\n mkv: \"video/x-matroska\",\n avi: \"video/x-msvideo\",\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n bmp: \"image/bmp\",\n svg: \"image/svg+xml\",\n};\n\n/**\n * 从字符串中提取文件扩展名(小写,不含点和查询参数)\n */\nconst extractExt = (str: string): string => {\n const match = str.match(FILE_EXT_REGEX);\n if (!match) return \"\";\n return match[1].toLowerCase();\n};\n\nconst escapeHtml = (value: string) =>\n value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n\nconst escapeAttr = (value: string) =>\n escapeHtml(value).replace(/\"/g, \"&quot;\").replace(/'/g, \"&#39;\");\n\nconst CodeComponent: React.FC<ComponentProps> = (props) => {\n const { className, children } = props;\n const lang = className?.match(/language-(\\S+)/)?.[1] || \"\";\n\n if (typeof children !== \"string\") return null;\n return <CodeHighlighter lang={lang}>{children}</CodeHighlighter>;\n};\n\nexport interface MarkdownRenderProps {\n text: string;\n /** 紧凑布局,适合用户消息气泡等内联场景 */\n compact?: boolean;\n /** Markdown 资源链接协议白名单,未命中的协议保持普通 Markdown 行为 */\n resourceLinkSchemes?: readonly string[];\n /** 点击 Markdown 中识别到的文件链接的回调 */\n onFileClick?: (file: FileItem) => void;\n /** 点击 Markdown 中识别到的资源链接标签,如 [@skill](skill://xxx) */\n onResourceLinkClick?: (link: MarkdownResourceLink) => void;\n /** 自定义资源链接渲染,返回 null 时使用默认标签样式 */\n renderResourceLink?: RenderMarkdownResourceLink;\n}\n\nconst ThinkComponent = React.memo((props: ComponentProps) => {\n const type = (props.type || \"\") as string;\n const titleMap: Record<string, string> = {\n planning: \"规划\",\n replanning: \"重新规划\",\n reasoning: \"推理\",\n action: \"行动\",\n final_answer: \"最终答案\",\n };\n const iconMap = {\n planning: <BarsOutlined />,\n replanning: <BarsOutlined />,\n reasoning: <BulbOutlined />,\n action: <ThunderboltOutlined />,\n final_answer: <CheckCircleOutlined />,\n };\n\n return (\n <Flex align=\"center\" gap={8} style={{ color: \"#888\", margin: \"4px 0\" }}>\n {type in titleMap && iconMap[type as keyof typeof iconMap]}\n {titleMap[type] && <span>{titleMap[type]}</span>}\n </Flex>\n );\n});\n\n/**\n * 递归从 React children 中提取纯文本\n */\nconst extractText = (children: React.ReactNode): string => {\n if (typeof children === \"string\") return children;\n if (typeof children === \"number\") return String(children);\n if (Array.isArray(children)) return children.map(extractText).join(\"\");\n if (React.isValidElement(children))\n return extractText((children.props as any).children);\n return \"\";\n};\n\nconst MarkdownRender: React.FC<MarkdownRenderProps> = ({\n text,\n compact = false,\n resourceLinkSchemes,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n}) => {\n const styles = useStyles();\n const markdown = replaceMarkdownResourceLinks(\n text,\n (link) => {\n // 非 http(s) 协议容易被 Markdown 引擎清洗成普通文本,先转为内部自定义标签再交给 XMarkdown。\n return `<resource-link href=\"${escapeAttr(link.href)}\" label=\"${escapeAttr(link.label)}\" type=\"${escapeAttr(link.type)}\" value=\"${escapeAttr(link.value)}\">${escapeHtml(link.label)}</resource-link>`;\n },\n { schemes: resourceLinkSchemes },\n )\n .replaceAll(/\\/\\*\\s*PLANNING\\s*\\*\\//g, '<tag type=\"planning\"></tag>')\n .replaceAll(/\\/\\*\\s*REPLANNING\\s*\\*\\//g, '<tag type=\"replanning\"></tag>')\n .replaceAll(/\\/\\*\\s*REASONING\\s*\\*\\//g, '<tag type=\"reasoning\"></tag>')\n .replaceAll(/\\/\\*\\s*ACTION\\s*\\*\\//g, '<tag type=\"action\"></tag>')\n .replaceAll(\n /\\/\\*\\s*FINAL_ANSWER\\s*\\*\\//g,\n '<tag type=\"final_answer\"></tag>',\n );\n\n const ResourceLinkComponent = React.useCallback(\n (props: ComponentProps) => {\n const href = String((props.href as string) || \"\");\n const linkText =\n String((props.label as string) || \"\") || extractText(props.children);\n const resourceLink = parseMarkdownResourceHref(href, linkText, {\n schemes: resourceLinkSchemes,\n });\n if (!resourceLink) return <>{props.children as React.ReactNode}</>;\n\n const customNode = renderResourceLink?.(resourceLink);\n if (customNode) return customNode;\n\n return (\n <button\n type=\"button\"\n className={styles.resourceLink}\n onClick={() => onResourceLinkClick?.(resourceLink)}\n aria-label={resourceLink.label}\n >\n {resourceLink.label}\n </button>\n );\n },\n [\n onResourceLinkClick,\n renderResourceLink,\n resourceLinkSchemes,\n styles.resourceLink,\n ],\n );\n\n // 自定义 a 标签渲染:资源协议渲染为标签,文件链接渲染为 FileGallery,其余保持普通链接。\n const LinkComponent = React.useCallback(\n (props: ComponentProps) => {\n const href = String((props.href as string) || \"\");\n // 用递归提取纯文本,避免 children 是 React node 时 String() 得到 \"[object Object]\"\n const linkText = extractText(props.children);\n const resourceLink = parseMarkdownResourceHref(href, linkText, {\n schemes: resourceLinkSchemes,\n });\n\n if (resourceLink) {\n const customNode = renderResourceLink?.(resourceLink);\n if (customNode) return customNode;\n\n return (\n <button\n type=\"button\"\n className={styles.resourceLink}\n onClick={() => onResourceLinkClick?.(resourceLink)}\n aria-label={resourceLink.label}\n >\n {resourceLink.label}\n </button>\n );\n }\n\n // 先识别 name(链接文字),再识别 url(href)\n const ext = extractExt(linkText) || extractExt(href);\n\n if (ext) {\n // href 为空说明链接还在流式截断中,不渲染,避免显示出错误文字\n if (!href) return null;\n const mimeType = MIME_MAP[ext] || \"\";\n const fileItem: FileItem = {\n displayName: linkText || href,\n mimeType,\n fileUri: href,\n };\n return (\n <FileGallery\n file={fileItem}\n onClick={onFileClick ? () => onFileClick(fileItem) : undefined}\n />\n );\n }\n\n return (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n {props.children as React.ReactNode}\n </a>\n );\n },\n [\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n resourceLinkSchemes,\n styles.resourceLink,\n ],\n );\n\n return (\n <div\n className={`${styles.markdownWrapper}${compact ? ` ${styles.markdownWrapperCompact}` : \"\"}`}\n >\n <div\n className={`${styles.markdownHost}${compact ? ` ${styles.markdownHostCompact}` : \"\"}`}\n >\n <XMarkdown\n content={markdown}\n className=\"x-markdown-light\"\n paragraphTag=\"div\"\n config={{\n extensions: Latex(),\n }}\n components={{\n tag: ThinkComponent,\n \"resource-link\": ResourceLinkComponent,\n code: CodeComponent,\n a: LinkComponent,\n }}\n streaming={{\n enableAnimation: true,\n animationConfig: {\n fadeDuration: 400,\n },\n }}\n />\n </div>\n </div>\n );\n};\n\nexport default MarkdownRender;\n"],"mappings":"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"}
@@ -1,6 +1,9 @@
1
1
  export declare const useStyles: () => {
2
2
  markdownWrapper: string;
3
+ markdownWrapperCompact: string;
3
4
  markdownHost: string;
5
+ markdownHostCompact: string;
6
+ resourceLink: string;
4
7
  } & {
5
8
  w: (width: string | number) => string;
6
9
  h: (height: string | number) => string;
@@ -1,11 +1,14 @@
1
1
  import _taggedTemplateLiteral from "@babel/runtime/helpers/esm/taggedTemplateLiteral";
2
- var _templateObject, _templateObject2;
2
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
3
3
  import { css } from "@emotion/css";
4
4
  import { withBasicStyles } from "../../../../styles/common";
5
5
  export var useStyles = withBasicStyles(function () {
6
6
  return {
7
7
  markdownWrapper: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: grid;\n grid-template-columns: minmax(0, 1fr); /* \u5173\u952E\uFF1A\u5141\u8BB8\u5185\u5BB9\u6536\u7F29 */\n max-width: 100%; /* \u81EA\u5B9A\u4E49\u6700\u5927\u5BBD\u5EA6 */\n margin: 0 auto;\n "]))),
8
- markdownHost: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n container-type: inline-size;\n width: 100%;\n overflow: auto;\n\n /* ===== Markdown \u57FA\u7840\u6392\u7248 ===== */\n\n p {\n margin: 8px 0;\n line-height: 1.6;\n }\n\n ul,\n ol {\n padding-left: 20px;\n margin-top: 0;\n margin-bottom: 8px;\n }\n\n li {\n margin: 0 0 4px 0 !important;\n }\n\n u {\n text-decoration: underline;\n }\n\n em {\n font-style: italic;\n }\n\n /* ===== Table \u6837\u5F0F ===== */\n\n table {\n border-collapse: collapse;\n width: 100%;\n max-width: 100%;\n margin: 12px 0;\n font-size: 14px;\n }\n\n thead {\n background: #fafafa;\n }\n\n th,\n td {\n border: 1px solid #e5e6eb;\n padding: 8px 12px;\n text-align: left;\n }\n\n th {\n font-weight: 600;\n }\n\n tbody tr:hover {\n background: #fafafa;\n }\n\n /* ===== Code ===== */\n\n pre {\n margin: 12px 0;\n }\n\n ant-highlightCode {\n max-width: min(100%, 80ch);\n overflow-x: auto;\n }\n\n /* ===== \u56FE\u7247 ===== */\n\n img {\n max-width: 100%;\n border-radius: 6px;\n }\n "])))
8
+ markdownWrapperCompact: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: inline;\n margin: 0;\n max-width: none;\n "]))),
9
+ markdownHost: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n container-type: inline-size;\n width: 100%;\n overflow: auto;\n\n /* ===== Markdown \u57FA\u7840\u6392\u7248 ===== */\n\n p {\n margin: 8px 0;\n line-height: 1.6;\n }\n\n ul,\n ol {\n padding-left: 20px;\n margin-top: 0;\n margin-bottom: 8px;\n }\n\n li {\n margin: 0 0 4px 0 !important;\n }\n\n u {\n text-decoration: underline;\n }\n\n em {\n font-style: italic;\n }\n\n /* ===== Table \u6837\u5F0F ===== */\n\n table {\n border-collapse: collapse;\n width: 100%;\n max-width: 100%;\n margin: 12px 0;\n font-size: 14px;\n }\n\n thead {\n background: #fafafa;\n }\n\n th,\n td {\n border: 1px solid #e5e6eb;\n padding: 8px 12px;\n text-align: left;\n }\n\n th {\n font-weight: 600;\n }\n\n tbody tr:hover {\n background: #fafafa;\n }\n\n /* ===== Code ===== */\n\n pre {\n margin: 12px 0;\n }\n\n ant-highlightCode {\n max-width: min(100%, 80ch);\n overflow-x: auto;\n }\n\n /* ===== \u56FE\u7247 ===== */\n\n img {\n max-width: 100%;\n border-radius: 6px;\n }\n "]))),
10
+ markdownHostCompact: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n display: inline;\n width: auto;\n overflow: visible;\n\n .x-markdown-light,\n p,\n div {\n display: inline;\n margin: 0;\n line-height: inherit;\n }\n "]))),
11
+ resourceLink: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n height: 22px;\n margin: 0 2px;\n padding: 0 8px;\n border: 1px solid #d9e8ff;\n border-radius: 6px;\n background: #f5f9ff;\n color: #1f1f1f;\n font-size: 13px;\n line-height: 20px;\n vertical-align: baseline;\n cursor: pointer;\n\n &:hover {\n border-color: #91caff;\n background: #eaf3ff;\n }\n "])))
9
12
  };
10
13
  });
11
14
  export default useStyles;
@@ -1 +1 @@
1
- {"version":3,"names":["css","withBasicStyles","useStyles","markdownWrapper","_templateObject","_taggedTemplateLiteral","markdownHost","_templateObject2"],"sources":["../../../../../../src/components/XAdkChatbot/components/MarkdownRender/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n markdownWrapper: css`\n display: grid;\n grid-template-columns: minmax(0, 1fr); /* 关键:允许内容收缩 */\n max-width: 100%; /* 自定义最大宽度 */\n margin: 0 auto;\n `,\n\n markdownHost: css`\n container-type: inline-size;\n width: 100%;\n overflow: auto;\n\n /* ===== Markdown 基础排版 ===== */\n\n p {\n margin: 8px 0;\n line-height: 1.6;\n }\n\n ul,\n ol {\n padding-left: 20px;\n margin-top: 0;\n margin-bottom: 8px;\n }\n\n li {\n margin: 0 0 4px 0 !important;\n }\n\n u {\n text-decoration: underline;\n }\n\n em {\n font-style: italic;\n }\n\n /* ===== Table 样式 ===== */\n\n table {\n border-collapse: collapse;\n width: 100%;\n max-width: 100%;\n margin: 12px 0;\n font-size: 14px;\n }\n\n thead {\n background: #fafafa;\n }\n\n th,\n td {\n border: 1px solid #e5e6eb;\n padding: 8px 12px;\n text-align: left;\n }\n\n th {\n font-weight: 600;\n }\n\n tbody tr:hover {\n background: #fafafa;\n }\n\n /* ===== Code ===== */\n\n pre {\n margin: 12px 0;\n }\n\n ant-highlightCode {\n max-width: min(100%, 80ch);\n overflow-x: auto;\n }\n\n /* ===== 图片 ===== */\n\n img {\n max-width: 100%;\n border-radius: 6px;\n }\n `,\n}));\n\nexport default useStyles;\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,eAAe,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,qOAKnB;IAEDC,YAAY,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA;EA8EnB,CAAC;AAAA,CAAC,CAAC;AAEH,eAAeH,SAAS"}
1
+ {"version":3,"names":["css","withBasicStyles","useStyles","markdownWrapper","_templateObject","_taggedTemplateLiteral","markdownWrapperCompact","_templateObject2","markdownHost","_templateObject3","markdownHostCompact","_templateObject4","resourceLink","_templateObject5"],"sources":["../../../../../../src/components/XAdkChatbot/components/MarkdownRender/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n markdownWrapper: css`\n display: grid;\n grid-template-columns: minmax(0, 1fr); /* 关键:允许内容收缩 */\n max-width: 100%; /* 自定义最大宽度 */\n margin: 0 auto;\n `,\n\n markdownWrapperCompact: css`\n display: inline;\n margin: 0;\n max-width: none;\n `,\n\n markdownHost: css`\n container-type: inline-size;\n width: 100%;\n overflow: auto;\n\n /* ===== Markdown 基础排版 ===== */\n\n p {\n margin: 8px 0;\n line-height: 1.6;\n }\n\n ul,\n ol {\n padding-left: 20px;\n margin-top: 0;\n margin-bottom: 8px;\n }\n\n li {\n margin: 0 0 4px 0 !important;\n }\n\n u {\n text-decoration: underline;\n }\n\n em {\n font-style: italic;\n }\n\n /* ===== Table 样式 ===== */\n\n table {\n border-collapse: collapse;\n width: 100%;\n max-width: 100%;\n margin: 12px 0;\n font-size: 14px;\n }\n\n thead {\n background: #fafafa;\n }\n\n th,\n td {\n border: 1px solid #e5e6eb;\n padding: 8px 12px;\n text-align: left;\n }\n\n th {\n font-weight: 600;\n }\n\n tbody tr:hover {\n background: #fafafa;\n }\n\n /* ===== Code ===== */\n\n pre {\n margin: 12px 0;\n }\n\n ant-highlightCode {\n max-width: min(100%, 80ch);\n overflow-x: auto;\n }\n\n /* ===== 图片 ===== */\n\n img {\n max-width: 100%;\n border-radius: 6px;\n }\n `,\n\n markdownHostCompact: css`\n display: inline;\n width: auto;\n overflow: visible;\n\n .x-markdown-light,\n p,\n div {\n display: inline;\n margin: 0;\n line-height: inherit;\n }\n `,\n\n resourceLink: css`\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n height: 22px;\n margin: 0 2px;\n padding: 0 8px;\n border: 1px solid #d9e8ff;\n border-radius: 6px;\n background: #f5f9ff;\n color: #1f1f1f;\n font-size: 13px;\n line-height: 20px;\n vertical-align: baseline;\n cursor: pointer;\n\n &:hover {\n border-color: #91caff;\n background: #eaf3ff;\n }\n `,\n}));\n\nexport default useStyles;\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,eAAe,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,qOAKnB;IAEDC,sBAAsB,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,wEAI1B;IAEDG,YAAY,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,irCA6EhB;IAEDK,mBAAmB,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,uMAYvB;IAEDO,YAAY,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA;EAqBnB,CAAC;AAAA,CAAC,CAAC;AAEH,eAAeH,SAAS"}
@@ -57,6 +57,8 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
57
57
  initialized = _ref$initialized === void 0 ? true : _ref$initialized,
58
58
  sessionId = _ref.sessionId,
59
59
  onFileClick = _ref.onFileClick,
60
+ onResourceLinkClick = _ref.onResourceLinkClick,
61
+ renderResourceLink = _ref.renderResourceLink,
60
62
  renderFunctionCall = _ref.renderFunctionCall,
61
63
  toolKindResolver = _ref.toolKindResolver,
62
64
  strategies = _ref.strategies,
@@ -94,6 +96,7 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
94
96
  })) !== null && _ref2 !== void 0 ? _ref2 : defaultToolKindResolver(name);
95
97
  }, [toolKindResolver, mergedStrategies]);
96
98
  var parseProcessMessage = (_mergedStrategies$par = mergedStrategies.parseProcessMessage) !== null && _mergedStrategies$par !== void 0 ? _mergedStrategies$par : parseAgentMessage;
99
+ var resourceLinkSchemes = mergedStrategies.markdownResourceLinkSchemes;
97
100
 
98
101
  // 初始化完成时滚动到底部
99
102
  useEffect(function () {
@@ -267,7 +270,10 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
267
270
  if (msg.text) {
268
271
  return /*#__PURE__*/_jsx(MarkdownRender, {
269
272
  text: msg.text,
270
- onFileClick: onFileClick
273
+ resourceLinkSchemes: resourceLinkSchemes,
274
+ onFileClick: onFileClick,
275
+ onResourceLinkClick: onResourceLinkClick,
276
+ renderResourceLink: renderResourceLink
271
277
  }, "".concat(msg.id, "-").concat(i));
272
278
  }
273
279
  if (msg.functionCall) {
@@ -440,7 +446,10 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
440
446
  return /*#__PURE__*/_jsx("div", {
441
447
  children: /*#__PURE__*/_jsx(MarkdownRender, {
442
448
  text: node.content,
443
- onFileClick: onFileClick
449
+ resourceLinkSchemes: resourceLinkSchemes,
450
+ onFileClick: onFileClick,
451
+ onResourceLinkClick: onResourceLinkClick,
452
+ renderResourceLink: renderResourceLink
444
453
  })
445
454
  }, node.key);
446
455
  }), allFiles.length > 0 && /*#__PURE__*/_jsxs("div", {
@@ -493,7 +502,7 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
493
502
  }), actionExtraNode]
494
503
  })]
495
504
  }, group.id);
496
- }, [enableProcessParsing, parseOptions, parseProcessMessage, showFnCallDetail, onConfirm, loading, showRetry, showCopy, showLog, onRetry, onCopy, onShowLog, actions, actionsExtra, onFileClick, styles, resolveToolKind, mergedStrategies]);
505
+ }, [enableProcessParsing, parseOptions, parseProcessMessage, showFnCallDetail, onConfirm, loading, showRetry, showCopy, showLog, onRetry, onCopy, onShowLog, actions, actionsExtra, onFileClick, onResourceLinkClick, renderResourceLink, resourceLinkSchemes, styles, resolveToolKind, mergedStrategies]);
497
506
 
498
507
  // ========== 渲染用户消息组 ==========
499
508
  var renderUserGroup = useCallback(function (group) {
@@ -515,12 +524,19 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
515
524
  })
516
525
  }), m.text && /*#__PURE__*/_jsx("div", {
517
526
  className: styles.card,
518
- children: m.text
527
+ children: /*#__PURE__*/_jsx(MarkdownRender, {
528
+ text: m.text,
529
+ compact: true,
530
+ resourceLinkSchemes: resourceLinkSchemes,
531
+ onFileClick: onFileClick,
532
+ onResourceLinkClick: onResourceLinkClick,
533
+ renderResourceLink: renderResourceLink
534
+ })
519
535
  })]
520
536
  }, m.id || i);
521
537
  })
522
538
  }, group.id);
523
- }, [styles, onFileClick]);
539
+ }, [styles, onFileClick, onResourceLinkClick, renderResourceLink, resourceLinkSchemes]);
524
540
 
525
541
  // ========== 空状态 ==========
526
542
 
@@ -573,7 +589,10 @@ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
573
589
  className: styles.prologue,
574
590
  children: /*#__PURE__*/_jsx(MarkdownRender, {
575
591
  text: prologue,
576
- onFileClick: onFileClick
592
+ resourceLinkSchemes: resourceLinkSchemes,
593
+ onFileClick: onFileClick,
594
+ onResourceLinkClick: onResourceLinkClick,
595
+ renderResourceLink: renderResourceLink
577
596
  })
578
597
  }), chatGroups.map(function (group, idx) {
579
598
  return group.role === "user" ? renderUserGroup(group) : renderBotGroup(group, idx === chatGroups.length - 1, renderFunctionCall);