@ai-group/chat-sdk 3.7.0 → 3.7.1-alpha10

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 (235) hide show
  1. package/README.md +22 -0
  2. package/dist/cjs/components/FileGallery/index.js +59 -40
  3. package/dist/cjs/components/FileGallery/index.js.map +2 -2
  4. package/dist/cjs/components/FileGallery/styles.d.ts +7 -0
  5. package/dist/cjs/components/FileGallery/styles.js +78 -0
  6. package/dist/cjs/components/FileGallery/styles.js.map +2 -2
  7. package/dist/cjs/components/Sources/components/CarouselCard.d.ts +12 -0
  8. package/dist/cjs/components/Sources/components/CarouselCard.js +130 -0
  9. package/dist/cjs/components/Sources/components/CarouselCard.js.map +7 -0
  10. package/dist/cjs/components/Sources/index.d.ts +5 -0
  11. package/dist/cjs/components/Sources/index.js +162 -0
  12. package/dist/cjs/components/Sources/index.js.map +7 -0
  13. package/dist/cjs/components/Sources/styles.d.ts +59 -0
  14. package/dist/cjs/components/Sources/styles.js +179 -0
  15. package/dist/cjs/components/Sources/styles.js.map +7 -0
  16. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +19 -1
  17. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +232 -22
  18. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +2 -2
  19. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
  20. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js +83 -0
  21. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js.map +2 -2
  22. package/dist/cjs/components/XAdkChatbot/index.d.ts +2 -2
  23. package/dist/cjs/components/XAdkChatbot/index.js +75 -8
  24. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  25. package/dist/cjs/components/XAdkChatbot/styles.js +1 -1
  26. package/dist/cjs/components/XAdkChatbot/styles.js.map +1 -1
  27. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.d.ts +7 -2
  28. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +30 -12
  29. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
  30. package/dist/cjs/components/XAdkProvider/compound/Sender.d.ts +3 -1
  31. package/dist/cjs/components/XAdkProvider/compound/Sender.js +81 -4
  32. package/dist/cjs/components/XAdkProvider/compound/Sender.js.map +3 -3
  33. package/dist/cjs/components/XAdkProvider/compound/styles.d.ts +1 -0
  34. package/dist/cjs/components/XAdkProvider/compound/styles.js +16 -0
  35. package/dist/cjs/components/XAdkProvider/compound/styles.js.map +2 -2
  36. package/dist/cjs/components/XAdkProvider/context/ChatSenderStateContext.d.ts +4 -0
  37. package/dist/cjs/components/XAdkProvider/context/ChatSenderStateContext.js.map +2 -2
  38. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.d.ts +9 -0
  39. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.js +34 -0
  40. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.js.map +7 -0
  41. package/dist/cjs/components/XAdkProvider/context/index.d.ts +5 -4
  42. package/dist/cjs/components/XAdkProvider/context/index.js +3 -1
  43. package/dist/cjs/components/XAdkProvider/context/index.js.map +2 -2
  44. package/dist/cjs/components/XAdkProvider/index.js +11 -10
  45. package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
  46. package/dist/cjs/components/XAdkSender/InlineTagInput.d.ts +31 -0
  47. package/dist/cjs/components/XAdkSender/InlineTagInput.js +759 -0
  48. package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +7 -0
  49. package/dist/cjs/components/XAdkSender/InputTags.d.ts +8 -0
  50. package/dist/cjs/components/XAdkSender/InputTags.js +51 -0
  51. package/dist/cjs/components/XAdkSender/InputTags.js.map +7 -0
  52. package/dist/cjs/components/XAdkSender/QuickList.d.ts +16 -0
  53. package/dist/cjs/components/XAdkSender/QuickList.js +105 -0
  54. package/dist/cjs/components/XAdkSender/QuickList.js.map +7 -0
  55. package/dist/cjs/components/XAdkSender/index.d.ts +1 -6
  56. package/dist/cjs/components/XAdkSender/index.js +422 -150
  57. package/dist/cjs/components/XAdkSender/index.js.map +3 -3
  58. package/dist/cjs/components/XAdkSender/styles.d.ts +19 -0
  59. package/dist/cjs/components/XAdkSender/styles.js +225 -5
  60. package/dist/cjs/components/XAdkSender/styles.js.map +2 -2
  61. package/dist/cjs/components/XAiConversations/styles.js +11 -1
  62. package/dist/cjs/components/XAiConversations/styles.js.map +2 -2
  63. package/dist/cjs/hooks/useADKChat.js +5 -1
  64. package/dist/cjs/hooks/useADKChat.js.map +2 -2
  65. package/dist/cjs/index.d.ts +8 -3
  66. package/dist/cjs/index.js +44 -10
  67. package/dist/cjs/index.js.map +3 -3
  68. package/dist/cjs/presets/base.d.ts +6 -0
  69. package/dist/cjs/presets/base.js +50 -0
  70. package/dist/cjs/presets/base.js.map +7 -0
  71. package/dist/cjs/presets/define.d.ts +11 -0
  72. package/dist/cjs/presets/define.js +58 -0
  73. package/dist/cjs/presets/define.js.map +7 -0
  74. package/dist/cjs/presets/index.d.ts +3 -0
  75. package/dist/cjs/presets/index.js +28 -0
  76. package/dist/cjs/presets/index.js.map +7 -0
  77. package/dist/cjs/presets/runtime.d.ts +22 -0
  78. package/dist/cjs/presets/runtime.js +75 -0
  79. package/dist/cjs/presets/runtime.js.map +7 -0
  80. package/dist/cjs/presets/xgroup/index.d.ts +5 -0
  81. package/dist/cjs/presets/xgroup/index.js +10 -0
  82. package/dist/cjs/presets/xgroup/index.js.map +2 -2
  83. package/dist/cjs/presets/xgroup/knowledgeReference.d.ts +17 -0
  84. package/dist/cjs/presets/xgroup/knowledgeReference.js +162 -0
  85. package/dist/cjs/presets/xgroup/knowledgeReference.js.map +7 -0
  86. package/dist/cjs/presets/xgroup/preset.d.ts +1 -13
  87. package/dist/cjs/presets/xgroup/preset.js +16 -37
  88. package/dist/cjs/presets/xgroup/preset.js.map +2 -2
  89. package/dist/cjs/presets/xgroup/strategies.d.ts +5 -4
  90. package/dist/cjs/presets/xgroup/strategies.js +11 -15
  91. package/dist/cjs/presets/xgroup/strategies.js.map +3 -3
  92. package/dist/cjs/presets/xgroup/webReference.d.ts +10 -0
  93. package/dist/cjs/presets/xgroup/webReference.js +85 -0
  94. package/dist/cjs/presets/xgroup/webReference.js.map +7 -0
  95. package/dist/cjs/types/ChatStrategies.d.ts +11 -2
  96. package/dist/cjs/types/ChatStrategies.js.map +1 -1
  97. package/dist/cjs/types/FileGallery.d.ts +3 -0
  98. package/dist/cjs/types/FileGallery.js.map +1 -1
  99. package/dist/cjs/types/Sources.d.ts +30 -0
  100. package/dist/cjs/types/Sources.js +18 -0
  101. package/dist/cjs/types/Sources.js.map +7 -0
  102. package/dist/cjs/types/XAdkChatbot.d.ts +33 -0
  103. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  104. package/dist/cjs/types/XAdkSender.d.ts +154 -8
  105. package/dist/cjs/types/XAdkSender.js.map +1 -1
  106. package/dist/cjs/types/index.d.ts +1 -0
  107. package/dist/cjs/types/index.js +3 -1
  108. package/dist/cjs/types/index.js.map +2 -2
  109. package/dist/cjs/utils/index.d.ts +1 -0
  110. package/dist/cjs/utils/index.js +3 -1
  111. package/dist/cjs/utils/index.js.map +2 -2
  112. package/dist/cjs/utils/markdownResource.d.ts +14 -0
  113. package/dist/cjs/utils/markdownResource.js +131 -0
  114. package/dist/cjs/utils/markdownResource.js.map +7 -0
  115. package/dist/esm/components/FileGallery/index.js +22 -16
  116. package/dist/esm/components/FileGallery/index.js.map +1 -1
  117. package/dist/esm/components/FileGallery/styles.d.ts +7 -0
  118. package/dist/esm/components/FileGallery/styles.js +24 -17
  119. package/dist/esm/components/FileGallery/styles.js.map +1 -1
  120. package/dist/esm/components/Sources/components/CarouselCard.d.ts +12 -0
  121. package/dist/esm/components/Sources/components/CarouselCard.js +107 -0
  122. package/dist/esm/components/Sources/components/CarouselCard.js.map +1 -0
  123. package/dist/esm/components/Sources/index.d.ts +5 -0
  124. package/dist/esm/components/Sources/index.js +127 -0
  125. package/dist/esm/components/Sources/index.js.map +1 -0
  126. package/dist/esm/components/Sources/styles.d.ts +59 -0
  127. package/dist/esm/components/Sources/styles.js +34 -0
  128. package/dist/esm/components/Sources/styles.js.map +1 -0
  129. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +19 -1
  130. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +190 -11
  131. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
  132. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
  133. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js +5 -2
  134. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js.map +1 -1
  135. package/dist/esm/components/XAdkChatbot/index.d.ts +2 -2
  136. package/dist/esm/components/XAdkChatbot/index.js +55 -10
  137. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  138. package/dist/esm/components/XAdkChatbot/styles.js +1 -1
  139. package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
  140. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.d.ts +7 -2
  141. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +40 -17
  142. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
  143. package/dist/esm/components/XAdkProvider/compound/Sender.d.ts +3 -1
  144. package/dist/esm/components/XAdkProvider/compound/Sender.js +70 -6
  145. package/dist/esm/components/XAdkProvider/compound/Sender.js.map +1 -1
  146. package/dist/esm/components/XAdkProvider/compound/styles.d.ts +1 -0
  147. package/dist/esm/components/XAdkProvider/compound/styles.js +3 -2
  148. package/dist/esm/components/XAdkProvider/compound/styles.js.map +1 -1
  149. package/dist/esm/components/XAdkProvider/context/ChatSenderStateContext.d.ts +4 -0
  150. package/dist/esm/components/XAdkProvider/context/ChatSenderStateContext.js.map +1 -1
  151. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.d.ts +9 -0
  152. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.js +9 -0
  153. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.js.map +1 -0
  154. package/dist/esm/components/XAdkProvider/context/index.d.ts +5 -4
  155. package/dist/esm/components/XAdkProvider/context/index.js +1 -0
  156. package/dist/esm/components/XAdkProvider/context/index.js.map +1 -1
  157. package/dist/esm/components/XAdkProvider/index.js +7 -3
  158. package/dist/esm/components/XAdkProvider/index.js.map +1 -1
  159. package/dist/esm/components/XAdkSender/InlineTagInput.d.ts +31 -0
  160. package/dist/esm/components/XAdkSender/InlineTagInput.js +734 -0
  161. package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -0
  162. package/dist/esm/components/XAdkSender/InputTags.d.ts +8 -0
  163. package/dist/esm/components/XAdkSender/InputTags.js +37 -0
  164. package/dist/esm/components/XAdkSender/InputTags.js.map +1 -0
  165. package/dist/esm/components/XAdkSender/QuickList.d.ts +16 -0
  166. package/dist/esm/components/XAdkSender/QuickList.js +96 -0
  167. package/dist/esm/components/XAdkSender/QuickList.js.map +1 -0
  168. package/dist/esm/components/XAdkSender/index.d.ts +1 -6
  169. package/dist/esm/components/XAdkSender/index.js +476 -143
  170. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  171. package/dist/esm/components/XAdkSender/styles.d.ts +19 -0
  172. package/dist/esm/components/XAdkSender/styles.js +34 -12
  173. package/dist/esm/components/XAdkSender/styles.js.map +1 -1
  174. package/dist/esm/components/XAiConversations/styles.js +3 -3
  175. package/dist/esm/components/XAiConversations/styles.js.map +1 -1
  176. package/dist/esm/hooks/useADKChat.js +8 -2
  177. package/dist/esm/hooks/useADKChat.js.map +1 -1
  178. package/dist/esm/index.d.ts +8 -3
  179. package/dist/esm/index.js +7 -4
  180. package/dist/esm/index.js.map +1 -1
  181. package/dist/esm/presets/base.d.ts +6 -0
  182. package/dist/esm/presets/base.js +28 -0
  183. package/dist/esm/presets/base.js.map +1 -0
  184. package/dist/esm/presets/define.d.ts +11 -0
  185. package/dist/esm/presets/define.js +33 -0
  186. package/dist/esm/presets/define.js.map +1 -0
  187. package/dist/esm/presets/index.d.ts +3 -0
  188. package/dist/esm/presets/index.js +4 -0
  189. package/dist/esm/presets/index.js.map +1 -0
  190. package/dist/esm/presets/runtime.d.ts +22 -0
  191. package/dist/esm/presets/runtime.js +45 -0
  192. package/dist/esm/presets/runtime.js.map +1 -0
  193. package/dist/esm/presets/xgroup/index.d.ts +5 -0
  194. package/dist/esm/presets/xgroup/index.js +6 -0
  195. package/dist/esm/presets/xgroup/index.js.map +1 -1
  196. package/dist/esm/presets/xgroup/knowledgeReference.d.ts +17 -0
  197. package/dist/esm/presets/xgroup/knowledgeReference.js +95 -0
  198. package/dist/esm/presets/xgroup/knowledgeReference.js.map +1 -0
  199. package/dist/esm/presets/xgroup/preset.d.ts +1 -13
  200. package/dist/esm/presets/xgroup/preset.js +9 -29
  201. package/dist/esm/presets/xgroup/preset.js.map +1 -1
  202. package/dist/esm/presets/xgroup/strategies.d.ts +5 -4
  203. package/dist/esm/presets/xgroup/strategies.js +8 -20
  204. package/dist/esm/presets/xgroup/strategies.js.map +1 -1
  205. package/dist/esm/presets/xgroup/webReference.d.ts +10 -0
  206. package/dist/esm/presets/xgroup/webReference.js +46 -0
  207. package/dist/esm/presets/xgroup/webReference.js.map +1 -0
  208. package/dist/esm/types/ChatStrategies.d.ts +11 -2
  209. package/dist/esm/types/ChatStrategies.js.map +1 -1
  210. package/dist/esm/types/FileGallery.d.ts +3 -0
  211. package/dist/esm/types/FileGallery.js.map +1 -1
  212. package/dist/esm/types/Sources.d.ts +30 -0
  213. package/dist/esm/types/Sources.js +2 -0
  214. package/dist/esm/types/Sources.js.map +1 -0
  215. package/dist/esm/types/XAdkChatbot.d.ts +33 -0
  216. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  217. package/dist/esm/types/XAdkSender.d.ts +154 -8
  218. package/dist/esm/types/XAdkSender.js.map +1 -1
  219. package/dist/esm/types/index.d.ts +1 -0
  220. package/dist/esm/types/index.js +1 -0
  221. package/dist/esm/types/index.js.map +1 -1
  222. package/dist/esm/utils/index.d.ts +1 -0
  223. package/dist/esm/utils/index.js +1 -0
  224. package/dist/esm/utils/index.js.map +1 -1
  225. package/dist/esm/utils/markdownResource.d.ts +14 -0
  226. package/dist/esm/utils/markdownResource.js +101 -0
  227. package/dist/esm/utils/markdownResource.js.map +1 -0
  228. package/dist/umd/chat-sdk.min.js +1 -1
  229. package/package.json +6 -1
  230. package/dist/cjs/components/XAdkSender/Switch.d.ts +0 -16
  231. package/dist/cjs/components/XAdkSender/Switch.js +0 -95
  232. package/dist/cjs/components/XAdkSender/Switch.js.map +0 -7
  233. package/dist/esm/components/XAdkSender/Switch.d.ts +0 -16
  234. package/dist/esm/components/XAdkSender/Switch.js +0 -53
  235. package/dist/esm/components/XAdkSender/Switch.js.map +0 -1
@@ -0,0 +1,127 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
3
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
4
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
5
+ var _excluded = ["style", "className", "rootClassName", "title", "expandIconPosition", "inline", "expanded", "defaultExpanded", "onExpand", "activeKey", "items", "onClick", "popoverOverlayWidth"];
6
+ import { RightOutlined } from '@ant-design/icons';
7
+ import { Popover } from 'antd';
8
+ import { clsx } from 'clsx';
9
+ import React, { useState, useCallback } from 'react';
10
+ import CarouselCard from "./components/CarouselCard";
11
+ import useStyle from "./styles";
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ import { jsxs as _jsxs } from "react/jsx-runtime";
14
+ import { Fragment as _Fragment } from "react/jsx-runtime";
15
+ var Sources = function Sources(props, ref) {
16
+ var style = props.style,
17
+ className = props.className,
18
+ rootClassName = props.rootClassName,
19
+ title = props.title,
20
+ _props$expandIconPosi = props.expandIconPosition,
21
+ expandIconPosition = _props$expandIconPosi === void 0 ? 'start' : _props$expandIconPosi,
22
+ _props$inline = props.inline,
23
+ inline = _props$inline === void 0 ? false : _props$inline,
24
+ expanded = props.expanded,
25
+ defaultExpanded = props.defaultExpanded,
26
+ onExpand = props.onExpand,
27
+ activeKey = props.activeKey,
28
+ items = props.items,
29
+ _onClick = props.onClick,
30
+ _props$popoverOverlay = props.popoverOverlayWidth,
31
+ popoverOverlayWidth = _props$popoverOverlay === void 0 ? 300 : _props$popoverOverlay,
32
+ restProps = _objectWithoutProperties(props, _excluded);
33
+ var styles = useStyle();
34
+ var sourcesRef = React.useRef(null);
35
+ React.useImperativeHandle(ref, function () {
36
+ return {
37
+ nativeElement: sourcesRef.current
38
+ };
39
+ });
40
+
41
+ // ============================ Collapsible ============================
42
+ var _useState = useState(defaultExpanded !== null && defaultExpanded !== void 0 ? defaultExpanded : true),
43
+ _useState2 = _slicedToArray(_useState, 2),
44
+ isExpand = _useState2[0],
45
+ setIsExpand = _useState2[1];
46
+ var isControlled = expanded !== undefined;
47
+ var actualExpanded = isControlled ? expanded : isExpand;
48
+ var handleToggle = useCallback(function () {
49
+ var newExpand = !actualExpanded;
50
+ if (!isControlled) {
51
+ setIsExpand(newExpand);
52
+ }
53
+ onExpand === null || onExpand === void 0 || onExpand(newExpand);
54
+ }, [actualExpanded, isControlled, onExpand]);
55
+ var mergedCls = clsx(styles.sources, className, rootClassName, _defineProperty({}, styles.sourcesInline, inline));
56
+ var ContentNode = items ? /*#__PURE__*/_jsx("ul", {
57
+ className: styles.sourcesList,
58
+ children: items.map(function (item, index) {
59
+ return /*#__PURE__*/_jsx("li", {
60
+ className: styles.sourcesListItem,
61
+ onClick: function onClick() {
62
+ return _onClick === null || _onClick === void 0 ? void 0 : _onClick(item);
63
+ },
64
+ children: /*#__PURE__*/_jsxs("a", {
65
+ className: styles.sourcesLink,
66
+ href: item.url,
67
+ target: "_blank",
68
+ rel: "noopener noreferrer",
69
+ children: [item.icon && /*#__PURE__*/_jsx("span", {
70
+ className: styles.sourcesLinkIcon,
71
+ children: item.icon
72
+ }), /*#__PURE__*/_jsx("span", {
73
+ className: styles.sourcesLinkTitle,
74
+ children: item.title
75
+ })]
76
+ })
77
+ }, item.key || index);
78
+ })
79
+ }) : null;
80
+ return /*#__PURE__*/_jsx("div", _objectSpread(_objectSpread({
81
+ ref: sourcesRef,
82
+ className: mergedCls,
83
+ style: style
84
+ }, restProps), {}, {
85
+ children: inline ? /*#__PURE__*/_jsx(Popover, {
86
+ content: /*#__PURE__*/_jsx(CarouselCard, {
87
+ className: clsx(styles.sources, className),
88
+ style: style,
89
+ activeKey: activeKey,
90
+ prefixCls: "sources",
91
+ items: items,
92
+ onClick: _onClick
93
+ }),
94
+ open: inline ? undefined : false,
95
+ overlayStyle: {
96
+ width: popoverOverlayWidth
97
+ },
98
+ placement: "top",
99
+ forceRender: true,
100
+ children: /*#__PURE__*/_jsx("div", {
101
+ className: styles.sourcesTitleWrapper,
102
+ children: /*#__PURE__*/_jsx("span", {
103
+ children: title
104
+ })
105
+ })
106
+ }) : /*#__PURE__*/_jsxs(_Fragment, {
107
+ children: [/*#__PURE__*/_jsxs("div", {
108
+ className: clsx(styles.sourcesTitleWrapper, expandIconPosition === 'end' && styles.sourcesIconPositionEnd),
109
+ onClick: handleToggle,
110
+ children: [/*#__PURE__*/_jsx(RightOutlined, {
111
+ className: clsx(styles.sourcesTitleDownIcon, _defineProperty({}, styles.sourcesTitleDownIconExpanded, actualExpanded))
112
+ }), /*#__PURE__*/_jsx("span", {
113
+ children: title
114
+ })]
115
+ }), actualExpanded && /*#__PURE__*/_jsx("div", {
116
+ className: styles.sourcesContent,
117
+ children: ContentNode
118
+ })]
119
+ })
120
+ }));
121
+ };
122
+ var ForwardSources = /*#__PURE__*/React.forwardRef(Sources);
123
+ if (process.env.NODE_ENV !== 'production') {
124
+ ForwardSources.displayName = 'Sources';
125
+ }
126
+ export default ForwardSources;
127
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["RightOutlined","Popover","clsx","React","useState","useCallback","CarouselCard","useStyle","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","Sources","props","ref","style","className","rootClassName","title","_props$expandIconPosi","expandIconPosition","_props$inline","inline","expanded","defaultExpanded","onExpand","activeKey","items","onClick","_props$popoverOverlay","popoverOverlayWidth","restProps","_objectWithoutProperties","_excluded","styles","sourcesRef","useRef","useImperativeHandle","nativeElement","current","_useState","_useState2","_slicedToArray","isExpand","setIsExpand","isControlled","undefined","actualExpanded","handleToggle","newExpand","mergedCls","sources","_defineProperty","sourcesInline","ContentNode","sourcesList","children","map","item","index","sourcesListItem","sourcesLink","href","url","target","rel","icon","sourcesLinkIcon","sourcesLinkTitle","key","_objectSpread","content","prefixCls","open","overlayStyle","width","placement","forceRender","sourcesTitleWrapper","sourcesIconPositionEnd","sourcesTitleDownIcon","sourcesTitleDownIconExpanded","sourcesContent","ForwardSources","forwardRef","process","env","NODE_ENV","displayName"],"sources":["../../../../src/components/Sources/index.tsx"],"sourcesContent":["import { RightOutlined } from '@ant-design/icons';\nimport { Popover } from 'antd';\nimport { clsx } from 'clsx';\nimport React, { useState, useCallback } from 'react';\nimport type { SourcesProps, SourcesRef } from '@/types/Sources';\nimport CarouselCard from './components/CarouselCard';\nimport useStyle from './styles';\n\nconst Sources: React.ForwardRefRenderFunction<SourcesRef, SourcesProps> = (props, ref) => {\n const {\n style,\n className,\n rootClassName,\n title,\n expandIconPosition = 'start',\n inline = false,\n expanded,\n defaultExpanded,\n onExpand,\n activeKey,\n items,\n onClick,\n popoverOverlayWidth = 300,\n ...restProps\n } = props;\n\n const styles = useStyle();\n\n const sourcesRef = React.useRef<HTMLDivElement>(null);\n React.useImperativeHandle(ref, () => ({\n nativeElement: sourcesRef.current!,\n }));\n\n // ============================ Collapsible ============================\n const [isExpand, setIsExpand] = useState<boolean>(defaultExpanded ?? true);\n const isControlled = expanded !== undefined;\n const actualExpanded = isControlled ? expanded : isExpand;\n\n const handleToggle = useCallback(() => {\n const newExpand = !actualExpanded;\n if (!isControlled) {\n setIsExpand(newExpand);\n }\n onExpand?.(newExpand);\n }, [actualExpanded, isControlled, onExpand]);\n\n const mergedCls = clsx(\n styles.sources,\n className,\n rootClassName,\n {\n [styles.sourcesInline]: inline,\n },\n );\n\n const ContentNode = items ? (\n <ul className={styles.sourcesList}>\n {items.map((item, index) => (\n <li\n key={item.key || index}\n className={styles.sourcesListItem}\n onClick={() => onClick?.(item)}\n >\n <a\n className={styles.sourcesLink}\n href={item.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {item.icon && <span className={styles.sourcesLinkIcon}>{item.icon}</span>}\n <span className={styles.sourcesLinkTitle}>{item.title}</span>\n </a>\n </li>\n ))}\n </ul>\n ) : null;\n\n return (\n <div\n ref={sourcesRef}\n className={mergedCls}\n style={style}\n {...restProps}\n >\n {inline ? (\n <Popover\n content={\n <CarouselCard\n className={clsx(styles.sources, className)}\n style={style}\n activeKey={activeKey}\n prefixCls=\"sources\"\n items={items}\n onClick={onClick}\n />\n }\n open={inline ? undefined : false}\n overlayStyle={{ width: popoverOverlayWidth }}\n placement=\"top\"\n forceRender\n >\n <div className={styles.sourcesTitleWrapper}>\n <span>{title}</span>\n </div>\n </Popover>\n ) : (\n <>\n <div\n className={clsx(\n styles.sourcesTitleWrapper,\n expandIconPosition === 'end' && styles.sourcesIconPositionEnd,\n )}\n onClick={handleToggle}\n >\n <RightOutlined\n className={clsx(styles.sourcesTitleDownIcon, {\n [styles.sourcesTitleDownIconExpanded]: actualExpanded,\n })}\n />\n <span>{title}</span>\n </div>\n {actualExpanded && (\n <div className={styles.sourcesContent}>\n {ContentNode}\n </div>\n )}\n </>\n )}\n </div>\n );\n};\n\nconst ForwardSources = React.forwardRef(Sources);\n\nif (process.env.NODE_ENV !== 'production') {\n ForwardSources.displayName = 'Sources';\n}\n\nexport default ForwardSources;\nexport type { SourcesProps, SourcesItem, SourcesRef } from '@/types/Sources';"],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ export declare const useStyles: () => {
2
+ sources: string;
3
+ sourcesTitleWrapper: string;
4
+ sourcesTitleDownIcon: string;
5
+ sourcesTitleDownIconExpanded: string;
6
+ sourcesIconPositionEnd: string;
7
+ sourcesList: string;
8
+ sourcesListItem: string;
9
+ sourcesLink: string;
10
+ sourcesLinkIcon: string;
11
+ sourcesLinkTitle: string;
12
+ sourcesContent: string;
13
+ sourcesContentHidden: string;
14
+ sourcesInline: string;
15
+ carouselWrapper: string;
16
+ carouselTitle: string;
17
+ carouselBtnWrapper: string;
18
+ carouselBtn: string;
19
+ carouselBtnDisabled: string;
20
+ carouselPage: string;
21
+ carouselItem: string;
22
+ carouselItemTitleWrapper: string;
23
+ carouselItemTitle: string;
24
+ carouselItemDescription: string;
25
+ } & {
26
+ w: (width: string | number) => string;
27
+ h: (height: string | number) => string;
28
+ p: (padding: string) => string;
29
+ pb: (padding: string | number) => string;
30
+ pt: (padding: string | number) => string;
31
+ pl: (padding: string | number) => string;
32
+ pr: (padding: string | number) => string;
33
+ m: (margin: string) => string;
34
+ mb: (margin: string | number) => string;
35
+ mt: (margin: string | number) => string;
36
+ ml: (margin: string | number) => string;
37
+ mr: (margin: string | number) => string;
38
+ text: (size: string | number) => string;
39
+ weight: (size: number) => string;
40
+ textColor: (c: string) => string;
41
+ bg: (c: string) => string;
42
+ rs: (radius: string | number) => string;
43
+ gap: (g: string | number) => string;
44
+ flex: string;
45
+ flexCenter: string;
46
+ flexBetween: string;
47
+ flexColumn: string;
48
+ flex1: string;
49
+ cursor: (type: string) => string;
50
+ border: (color: string, width?: string) => string;
51
+ boxShadow: (shadow: string) => string;
52
+ transition: (property?: string, duration?: string) => string;
53
+ overflow: (type: string) => string;
54
+ position: (type: string) => string;
55
+ zIndex: (index: number) => string;
56
+ flexCenterGap2: string;
57
+ flexCenterGap4: string;
58
+ };
59
+ export default useStyles;
@@ -0,0 +1,34 @@
1
+ import _taggedTemplateLiteral from "@babel/runtime/helpers/esm/taggedTemplateLiteral";
2
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17, _templateObject18, _templateObject19, _templateObject20, _templateObject21, _templateObject22, _templateObject23;
3
+ import { css } from "@emotion/css";
4
+ import { withBasicStyles } from "../../styles/common";
5
+ export var useStyles = withBasicStyles(function () {
6
+ return {
7
+ sources: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n position: relative;\n "]))),
8
+ sourcesTitleWrapper: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: row;\n gap: 8px;\n align-items: center;\n font-size: 14px;\n color: #888;\n line-height: 1.5;\n cursor: pointer;\n margin-bottom: 12px;\n width: fit-content;\n "]))),
9
+ sourcesTitleDownIcon: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n font-size: 12px;\n transition: transform 0.3s ease;\n "]))),
10
+ sourcesTitleDownIconExpanded: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n transform: rotate(90deg);\n "]))),
11
+ sourcesIconPositionEnd: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n .sources-title-down-icon {\n order: 1;\n }\n "]))),
12
+ sourcesList: css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n list-style: none;\n margin: 0;\n padding: 0;\n ul, ol {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n "]))),
13
+ sourcesListItem: css(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n margin-bottom: 8px;\n "]))),
14
+ sourcesLink: css(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n color: #333;\n display: flex;\n gap: 4px;\n text-decoration: none;\n &:hover {\n color: #1677ff;\n }\n "]))),
15
+ sourcesLinkIcon: css(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n flex-shrink: 0;\n "]))),
16
+ sourcesLinkTitle: css(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n "]))),
17
+ sourcesContent: css(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n overflow: hidden;\n transition: all 0.3s ease;\n "]))),
18
+ sourcesContentHidden: css(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n display: none;\n "]))),
19
+ sourcesInline: css(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n display: inline-flex;\n .sources-title-wrapper {\n background: #f5f5f5;\n border-radius: 10px;\n height: 24px;\n line-height: 24px;\n font-size: 12px;\n color: #888;\n font-weight: 400;\n padding-inline: 6px;\n padding-block: 0;\n margin-inline: 4px;\n margin-block: 0;\n }\n "]))),
20
+ // ========== Carousel 相关 ==========
21
+ carouselWrapper: css(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n min-width: 260px;\n "]))),
22
+ carouselTitle: css(_templateObject15 || (_templateObject15 = _taggedTemplateLiteral(["\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n "]))),
23
+ carouselBtnWrapper: css(_templateObject16 || (_templateObject16 = _taggedTemplateLiteral(["\n display: flex;\n gap: 4px;\n "]))),
24
+ carouselBtn: css(_templateObject17 || (_templateObject17 = _taggedTemplateLiteral(["\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n height: 32px;\n width: 32px;\n border-radius: 6px;\n transition: background 0.2s ease;\n &:not(.carousel-btn-disabled):hover {\n background: #f5f5f5;\n }\n "]))),
25
+ carouselBtnDisabled: css(_templateObject18 || (_templateObject18 = _taggedTemplateLiteral(["\n opacity: 0.4;\n cursor: not-allowed;\n pointer-events: none;\n "]))),
26
+ carouselPage: css(_templateObject19 || (_templateObject19 = _taggedTemplateLiteral(["\n font-size: 12px;\n color: #888;\n "]))),
27
+ carouselItem: css(_templateObject20 || (_templateObject20 = _taggedTemplateLiteral(["\n padding: 8px;\n box-sizing: border-box;\n font-size: 14px;\n line-height: 1.5;\n cursor: pointer;\n "]))),
28
+ carouselItemTitleWrapper: css(_templateObject21 || (_templateObject21 = _taggedTemplateLiteral(["\n display: flex;\n gap: 4px;\n align-items: center;\n "]))),
29
+ carouselItemTitle: css(_templateObject22 || (_templateObject22 = _taggedTemplateLiteral(["\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n "]))),
30
+ carouselItemDescription: css(_templateObject23 || (_templateObject23 = _taggedTemplateLiteral(["\n opacity: 0.8;\n display: -webkit-box;\n overflow: hidden;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 3;\n text-overflow: ellipsis;\n margin-top: 4px;\n font-size: 12px;\n color: #888;\n "])))
31
+ };
32
+ });
33
+ export default useStyles;
34
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["css","withBasicStyles","useStyles","sources","_templateObject","_taggedTemplateLiteral","sourcesTitleWrapper","_templateObject2","sourcesTitleDownIcon","_templateObject3","sourcesTitleDownIconExpanded","_templateObject4","sourcesIconPositionEnd","_templateObject5","sourcesList","_templateObject6","sourcesListItem","_templateObject7","sourcesLink","_templateObject8","sourcesLinkIcon","_templateObject9","sourcesLinkTitle","_templateObject10","sourcesContent","_templateObject11","sourcesContentHidden","_templateObject12","sourcesInline","_templateObject13","carouselWrapper","_templateObject14","carouselTitle","_templateObject15","carouselBtnWrapper","_templateObject16","carouselBtn","_templateObject17","carouselBtnDisabled","_templateObject18","carouselPage","_templateObject19","carouselItem","_templateObject20","carouselItemTitleWrapper","_templateObject21","carouselItemTitle","_templateObject22","carouselItemDescription","_templateObject23"],"sources":["../../../../src/components/Sources/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n sources: css`\n position: relative;\n `,\n\n sourcesTitleWrapper: css`\n display: flex;\n flex-direction: row;\n gap: 8px;\n align-items: center;\n font-size: 14px;\n color: #888;\n line-height: 1.5;\n cursor: pointer;\n margin-bottom: 12px;\n width: fit-content;\n `,\n\n sourcesTitleDownIcon: css`\n font-size: 12px;\n transition: transform 0.3s ease;\n `,\n\n sourcesTitleDownIconExpanded: css`\n transform: rotate(90deg);\n `,\n\n sourcesIconPositionEnd: css`\n .sources-title-down-icon {\n order: 1;\n }\n `,\n\n sourcesList: css`\n list-style: none;\n margin: 0;\n padding: 0;\n ul, ol {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n `,\n\n sourcesListItem: css`\n margin-bottom: 8px;\n `,\n\n sourcesLink: css`\n color: #333;\n display: flex;\n gap: 4px;\n text-decoration: none;\n &:hover {\n color: #1677ff;\n }\n `,\n\n sourcesLinkIcon: css`\n flex-shrink: 0;\n `,\n\n sourcesLinkTitle: css`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n\n sourcesContent: css`\n overflow: hidden;\n transition: all 0.3s ease;\n `,\n\n sourcesContentHidden: css`\n display: none;\n `,\n\n sourcesInline: css`\n display: inline-flex;\n .sources-title-wrapper {\n background: #f5f5f5;\n border-radius: 10px;\n height: 24px;\n line-height: 24px;\n font-size: 12px;\n color: #888;\n font-weight: 400;\n padding-inline: 6px;\n padding-block: 0;\n margin-inline: 4px;\n margin-block: 0;\n }\n `,\n\n // ========== Carousel 相关 ==========\n carouselWrapper: css`\n min-width: 260px;\n `,\n\n carouselTitle: css`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n `,\n\n carouselBtnWrapper: css`\n display: flex;\n gap: 4px;\n `,\n\n carouselBtn: css`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n height: 32px;\n width: 32px;\n border-radius: 6px;\n transition: background 0.2s ease;\n &:not(.carousel-btn-disabled):hover {\n background: #f5f5f5;\n }\n `,\n\n carouselBtnDisabled: css`\n opacity: 0.4;\n cursor: not-allowed;\n pointer-events: none;\n `,\n\n carouselPage: css`\n font-size: 12px;\n color: #888;\n `,\n\n carouselItem: css`\n padding: 8px;\n box-sizing: border-box;\n font-size: 14px;\n line-height: 1.5;\n cursor: pointer;\n `,\n\n carouselItemTitleWrapper: css`\n display: flex;\n gap: 4px;\n align-items: center;\n `,\n\n carouselItemTitle: css`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n\n carouselItemDescription: css`\n opacity: 0.8;\n display: -webkit-box;\n overflow: hidden;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 3;\n text-overflow: ellipsis;\n margin-top: 4px;\n font-size: 12px;\n color: #888;\n `,\n}));\n\nexport default useStyles;"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,OAAO,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,qCAEX;IAEDC,mBAAmB,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,2OAWvB;IAEDG,oBAAoB,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,wEAGxB;IAEDK,4BAA4B,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,2CAEhC;IAEDO,sBAAsB,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,oEAI1B;IAEDS,WAAW,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,uJASf;IAEDW,eAAe,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,qCAEnB;IAEDa,WAAW,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,0IAQf;IAEDe,eAAe,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,iCAEnB;IAEDiB,gBAAgB,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,2FAIpB;IAEDmB,cAAc,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,mEAGlB;IAEDqB,oBAAoB,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,gCAExB;IAEDuB,aAAa,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA,gWAejB;IAED;IACAyB,eAAe,EAAE9B,GAAG,CAAA+B,iBAAA,KAAAA,iBAAA,GAAA1B,sBAAA,mCAEnB;IAED2B,aAAa,EAAEhC,GAAG,CAAAiC,iBAAA,KAAAA,iBAAA,GAAA5B,sBAAA,wHAKjB;IAED6B,kBAAkB,EAAElC,GAAG,CAAAmC,iBAAA,KAAAA,iBAAA,GAAA9B,sBAAA,+CAGtB;IAED+B,WAAW,EAAEpC,GAAG,CAAAqC,iBAAA,KAAAA,iBAAA,GAAAhC,sBAAA,wSAYf;IAEDiC,mBAAmB,EAAEtC,GAAG,CAAAuC,iBAAA,KAAAA,iBAAA,GAAAlC,sBAAA,oFAIvB;IAEDmC,YAAY,EAAExC,GAAG,CAAAyC,iBAAA,KAAAA,iBAAA,GAAApC,sBAAA,oDAGhB;IAEDqC,YAAY,EAAE1C,GAAG,CAAA2C,iBAAA,KAAAA,iBAAA,GAAAtC,sBAAA,+HAMhB;IAEDuC,wBAAwB,EAAE5C,GAAG,CAAA6C,iBAAA,KAAAA,iBAAA,GAAAxC,sBAAA,yEAI5B;IAEDyC,iBAAiB,EAAE9C,GAAG,CAAA+C,iBAAA,KAAAA,iBAAA,GAAA1C,sBAAA,2FAIrB;IAED2C,uBAAuB,EAAEhD,GAAG,CAAAiD,iBAAA,KAAAA,iBAAA,GAAA5C,sBAAA;EAW9B,CAAC;AAAA,CAAC,CAAC;AAEH,eAAeH,SAAS"}
@@ -1,10 +1,28 @@
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, MarkdownExtension, 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;
16
+ /** Markdown/XML 自定义标签扩展 */
17
+ markdownExtensions?: readonly MarkdownExtension[];
18
+ /**
19
+ * 将命中文件扩展名的裸 URL 当作纯文本展示,不升级为 FileGallery。
20
+ * 用户消息应如实展示输入文本,除资源链接等业务扩展外不做额外富化。
21
+ * 默认 false,保留 Agent 消息现有行为。
22
+ */
23
+ bareUrlAsText?: boolean;
24
+ /** 将已经丢失资源 URI 的 @name 兼容渲染成只读高亮标签。 */
25
+ highlightPlainMentions?: boolean;
8
26
  }
9
27
  declare const MarkdownRender: React.FC<MarkdownRenderProps>;
10
28
  export default MarkdownRender;
@@ -1,3 +1,5 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
1
3
  import React from "react";
2
4
  import XMarkdown from "@ant-design/x-markdown";
3
5
  import "@ant-design/x-markdown/themes/light.css";
@@ -7,9 +9,12 @@ import Latex from "@ant-design/x-markdown/plugins/Latex";
7
9
  import { useStyles } from "./styles";
8
10
  import { BarsOutlined, BulbOutlined, ThunderboltOutlined, CheckCircleOutlined } from "@ant-design/icons";
9
11
  import FileGallery from "../../../FileGallery";
12
+ import { parseMarkdownResourceHref, getMarkdownResourceDisplayLabel, replaceMarkdownResourceLinks } from "../../../../utils/markdownResource";
13
+
14
+ // 支持识别的文件扩展名
10
15
  import { jsx as _jsx } from "react/jsx-runtime";
11
16
  import { jsxs as _jsxs } from "react/jsx-runtime";
12
- // 支持识别的文件扩展名
17
+ import { Fragment as _Fragment } from "react/jsx-runtime";
13
18
  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
19
  var MIME_MAP = {
15
20
  pdf: "application/pdf",
@@ -55,6 +60,17 @@ var extractExt = function extractExt(str) {
55
60
  if (!match) return "";
56
61
  return match[1].toLowerCase();
57
62
  };
63
+ var escapeMarkdownLabel = function escapeMarkdownLabel(value) {
64
+ return value.replace(/\\/g, "\\\\").replace(/\]/g, "\\]");
65
+ };
66
+
67
+ // 使用标准 https 链接作为 Markdown AST 的内部载体,避免自定义 HTML 标签被解析器降级成纯文本。
68
+ var RESOURCE_LINK_SENTINEL = "https://xadk.local/resource";
69
+ var PLAIN_MENTION_SENTINEL = "https://xadk.local/mention";
70
+ // 仅开放符合 Custom Element 命名规则的标签,避免覆盖 a/code 等内置 Markdown 节点。
71
+ var CUSTOM_TAG_NAME_REGEX = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)+$/;
72
+ var CUSTOM_ATTRIBUTE_NAME_REGEX = /^[a-z][a-z0-9-]*$/;
73
+ var EMPTY_MARKDOWN_EXTENSIONS = [];
58
74
  var CodeComponent = function CodeComponent(props) {
59
75
  var _className$match;
60
76
  var className = props.className,
@@ -105,23 +121,159 @@ var extractText = function extractText(children) {
105
121
  if ( /*#__PURE__*/React.isValidElement(children)) return extractText(children.props.children);
106
122
  return "";
107
123
  };
108
- var MarkdownRender = function MarkdownRender(_ref) {
109
- var text = _ref.text,
110
- onFileClick = _ref.onFileClick;
124
+
125
+ // 从组件 props 中获取自定义 Markdown 扩展属性值,支持 kebab-case、camelCase 和 compactCase。
126
+ var getExtensionAttribute = function getExtensionAttribute(props, attribute) {
127
+ var _ref, _record$attribute;
128
+ var record = props;
129
+ var camelCase = attribute.replace(/-([a-z])/g, function (_, char) {
130
+ return char.toUpperCase();
131
+ });
132
+ var compact = attribute.replaceAll("-", "");
133
+ var value = (_ref = (_record$attribute = record[attribute]) !== null && _record$attribute !== void 0 ? _record$attribute : record[camelCase]) !== null && _ref !== void 0 ? _ref : record[compact];
134
+ return value === undefined || value === null ? undefined : String(value);
135
+ };
136
+
137
+ // 仅允许自定义 Markdown 扩展的安全属性,避免 XSS 注入。s
138
+ var getAllowedExtensionAttributes = function getAllowedExtensionAttributes(extension) {
139
+ return (extension.allowedAttributes || []).filter(function (attribute) {
140
+ return CUSTOM_ATTRIBUTE_NAME_REGEX.test(attribute) && !attribute.startsWith("on") && attribute !== "style" && attribute !== "srcdoc";
141
+ });
142
+ };
143
+ var createMarkdownExtensionComponent = function createMarkdownExtensionComponent(extension) {
144
+ var MarkdownExtensionComponent = function MarkdownExtensionComponent(props) {
145
+ var attributes = Object.fromEntries(getAllowedExtensionAttributes(extension).flatMap(function (attribute) {
146
+ var value = getExtensionAttribute(props, attribute);
147
+ return value === undefined ? [] : [[attribute, value]];
148
+ }));
149
+ var node = {
150
+ tagName: extension.tagName,
151
+ attributes: attributes,
152
+ text: extractText(props.children).trim(),
153
+ children: props.children
154
+ };
155
+ var customNode = extension.render(node);
156
+ return customNode === null ? /*#__PURE__*/_jsx(_Fragment, {
157
+ children: props.children
158
+ }) : customNode;
159
+ };
160
+ MarkdownExtensionComponent.displayName = "MarkdownExtension(".concat(extension.tagName, ")");
161
+ return MarkdownExtensionComponent;
162
+ };
163
+ var MarkdownRender = function MarkdownRender(_ref2) {
164
+ var text = _ref2.text,
165
+ _ref2$compact = _ref2.compact,
166
+ compact = _ref2$compact === void 0 ? false : _ref2$compact,
167
+ resourceLinkSchemes = _ref2.resourceLinkSchemes,
168
+ onFileClick = _ref2.onFileClick,
169
+ onResourceLinkClick = _ref2.onResourceLinkClick,
170
+ renderResourceLink = _ref2.renderResourceLink,
171
+ _ref2$markdownExtensi = _ref2.markdownExtensions,
172
+ markdownExtensions = _ref2$markdownExtensi === void 0 ? EMPTY_MARKDOWN_EXTENSIONS : _ref2$markdownExtensi,
173
+ _ref2$bareUrlAsText = _ref2.bareUrlAsText,
174
+ bareUrlAsText = _ref2$bareUrlAsText === void 0 ? false : _ref2$bareUrlAsText,
175
+ _ref2$highlightPlainM = _ref2.highlightPlainMentions,
176
+ highlightPlainMentions = _ref2$highlightPlainM === void 0 ? false : _ref2$highlightPlainM;
111
177
  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>');
178
+ var displayText = highlightPlainMentions ? text.replace(/(^|[^\[a-z0-9_])@([a-z0-9][a-z0-9._-]*)/gi, function (_source, prefix, label) {
179
+ return "".concat(prefix, "[").concat(escapeMarkdownLabel(label), "](").concat(PLAIN_MENTION_SENTINEL, "?label=").concat(encodeURIComponent(label), ")");
180
+ }) : text;
181
+ var markdown = replaceMarkdownResourceLinks(displayText, function (link) {
182
+ // 非 http(s) 协议会被 Markdown 引擎清洗,先编码到内部标准链接中交给 a renderer 恢复。
183
+ return "[".concat(escapeMarkdownLabel(link.label), "](").concat(RESOURCE_LINK_SENTINEL, "?href=").concat(encodeURIComponent(link.href), "&label=").concat(encodeURIComponent(link.label), ")");
184
+ }, {
185
+ schemes: resourceLinkSchemes
186
+ }).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>');
187
+ var ResourceLinkComponent = React.useCallback(function (props) {
188
+ var href = String(props.href || "");
189
+ var linkText = String(props.label || "") || extractText(props.children);
190
+ var resourceLink = parseMarkdownResourceHref(href, linkText, {
191
+ schemes: resourceLinkSchemes
192
+ });
193
+ if (!resourceLink) return /*#__PURE__*/_jsx(_Fragment, {
194
+ children: props.children
195
+ });
196
+ var displayLabel = getMarkdownResourceDisplayLabel(resourceLink.label);
197
+ var customNode = renderResourceLink === null || renderResourceLink === void 0 ? void 0 : renderResourceLink(resourceLink);
198
+ if (customNode) return customNode;
199
+ return /*#__PURE__*/_jsx("button", {
200
+ type: "button",
201
+ className: styles.resourceLink,
202
+ onClick: function onClick() {
203
+ return onResourceLinkClick === null || onResourceLinkClick === void 0 ? void 0 : onResourceLinkClick(resourceLink);
204
+ },
205
+ "aria-label": displayLabel,
206
+ "data-xadk-resource-link": resourceLink.type,
207
+ "data-resource-markdown": "[".concat(resourceLink.label, "](").concat(resourceLink.href, ")"),
208
+ children: displayLabel
209
+ });
210
+ }, [onResourceLinkClick, renderResourceLink, resourceLinkSchemes, styles.resourceLink]);
211
+ var PlainMentionComponent = React.useCallback(function (props) {
212
+ var label = String(props.label || "") || extractText(props.children);
213
+ return /*#__PURE__*/_jsx("span", {
214
+ className: styles.resourceLink,
215
+ "aria-label": label,
216
+ "data-xadk-resource-link": "true",
217
+ children: label
218
+ });
219
+ }, [styles.resourceLink]);
113
220
 
114
- // 自定义 a 标签渲染:识别文件链接并渲染为 FileGallery 卡片
221
+ // 自定义 a 标签渲染:资源协议渲染为标签,文件链接渲染为 FileGallery,其余保持普通链接。
115
222
  var LinkComponent = React.useCallback(function (props) {
116
223
  var href = String(props.href || "");
117
224
  // 用递归提取纯文本,避免 children 是 React node 时 String() 得到 "[object Object]"
118
225
  var linkText = extractText(props.children);
226
+ var resolvedHref = href;
227
+ var resolvedLabel = linkText;
228
+ try {
229
+ var internalUrl = new URL(href);
230
+ if (internalUrl.origin + internalUrl.pathname === PLAIN_MENTION_SENTINEL) {
231
+ var label = internalUrl.searchParams.get("label") || linkText;
232
+ return /*#__PURE__*/_jsx("span", {
233
+ className: styles.resourceLink,
234
+ "aria-label": label,
235
+ "data-xadk-resource-link": "true",
236
+ children: label
237
+ });
238
+ }
239
+ if (internalUrl.origin + internalUrl.pathname === RESOURCE_LINK_SENTINEL) {
240
+ resolvedHref = internalUrl.searchParams.get("href") || "";
241
+ resolvedLabel = internalUrl.searchParams.get("label") || linkText;
242
+ }
243
+ } catch (_unused) {
244
+ // 相对链接及非标准 URL 继续走原有解析逻辑。
245
+ }
246
+ var resourceLink = parseMarkdownResourceHref(resolvedHref, resolvedLabel, {
247
+ schemes: resourceLinkSchemes
248
+ });
249
+ if (resourceLink) {
250
+ var displayLabel = getMarkdownResourceDisplayLabel(resourceLink.label);
251
+ var customNode = renderResourceLink === null || renderResourceLink === void 0 ? void 0 : renderResourceLink(resourceLink);
252
+ if (customNode) return customNode;
253
+ return /*#__PURE__*/_jsx("button", {
254
+ type: "button",
255
+ className: styles.resourceLink,
256
+ onClick: function onClick() {
257
+ return onResourceLinkClick === null || onResourceLinkClick === void 0 ? void 0 : onResourceLinkClick(resourceLink);
258
+ },
259
+ "aria-label": displayLabel,
260
+ "data-xadk-resource-link": resourceLink.type,
261
+ "data-resource-markdown": "[".concat(resourceLink.label, "](").concat(resourceLink.href, ")"),
262
+ children: displayLabel
263
+ });
264
+ }
119
265
 
120
266
  // 先识别 name(链接文字),再识别 url(href)
121
267
  var ext = extractExt(linkText) || extractExt(href);
122
268
  if (ext) {
123
269
  // href 为空说明链接还在流式截断中,不渲染,避免显示出错误文字
124
270
  if (!href) return null;
271
+ // 用户消息场景:裸 URL 不富化,直接展示为纯文本字符串
272
+ if (bareUrlAsText) {
273
+ return /*#__PURE__*/_jsx(_Fragment, {
274
+ children: linkText || href
275
+ });
276
+ }
125
277
  var mimeType = MIME_MAP[ext] || "";
126
278
  var fileItem = {
127
279
  displayName: linkText || href,
@@ -141,23 +293,50 @@ var MarkdownRender = function MarkdownRender(_ref) {
141
293
  rel: "noopener noreferrer",
142
294
  children: props.children
143
295
  });
144
- }, [onFileClick]);
296
+ }, [onFileClick, onResourceLinkClick, renderResourceLink, resourceLinkSchemes, styles.resourceLink, bareUrlAsText]);
297
+ var enabledMarkdownExtensions = React.useMemo(function () {
298
+ var registeredTags = new Set();
299
+ return markdownExtensions.filter(function (extension) {
300
+ var tagName = extension.tagName.toLowerCase();
301
+ if (!CUSTOM_TAG_NAME_REGEX.test(tagName) || registeredTags.has(tagName)) {
302
+ return false;
303
+ }
304
+ registeredTags.add(tagName);
305
+ return true;
306
+ });
307
+ }, [markdownExtensions]);
308
+ var dompurifyConfig = React.useMemo(function () {
309
+ var allowedAttributes = Array.from(new Set(enabledMarkdownExtensions.flatMap(function (extension) {
310
+ return _toConsumableArray(getAllowedExtensionAttributes(extension));
311
+ })));
312
+ return allowedAttributes.length ? {
313
+ ADD_ATTR: allowedAttributes
314
+ } : undefined;
315
+ }, [enabledMarkdownExtensions]);
316
+ var extensionComponents = React.useMemo(function () {
317
+ return Object.fromEntries(enabledMarkdownExtensions.map(function (extension) {
318
+ return [extension.tagName.toLowerCase(), createMarkdownExtensionComponent(extension)];
319
+ }));
320
+ }, [enabledMarkdownExtensions]);
145
321
  return /*#__PURE__*/_jsx("div", {
146
- className: styles.markdownWrapper,
322
+ className: "".concat(styles.markdownWrapper).concat(compact ? " ".concat(styles.markdownWrapperCompact) : ""),
147
323
  children: /*#__PURE__*/_jsx("div", {
148
- className: styles.markdownHost,
324
+ className: "".concat(styles.markdownHost).concat(compact ? " ".concat(styles.markdownHostCompact) : ""),
149
325
  children: /*#__PURE__*/_jsx(XMarkdown, {
150
326
  content: markdown,
151
327
  className: "x-markdown-light",
152
328
  paragraphTag: "div",
329
+ dompurifyConfig: dompurifyConfig,
153
330
  config: {
154
331
  extensions: Latex()
155
332
  },
156
- components: {
333
+ components: _objectSpread({
157
334
  tag: ThinkComponent,
335
+ "resource-link": ResourceLinkComponent,
336
+ "plain-mention": PlainMentionComponent,
158
337
  code: CodeComponent,
159
338
  a: LinkComponent
160
- },
339
+ }, extensionComponents),
161
340
  streaming: {
162
341
  enableAnimation: true,
163
342
  animationConfig: {