@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
@@ -43,7 +43,7 @@ var import_FunctionCallRender = __toESM(require("./components/FunctionCallRender
43
43
  var import_FileGallery = __toESM(require("../FileGallery"));
44
44
  var import_XAdkThoughtChain = __toESM(require("../XAdkThoughtChain"));
45
45
  var import_utils = require("../../utils");
46
- var import_xgroup = require("../../presets/xgroup");
46
+ var import_runtime = require("../../presets/runtime");
47
47
  var import_FunctionCallRender2 = require("../../types/FunctionCallRender");
48
48
  var import_jsx_runtime = require("react/jsx-runtime");
49
49
  var scrollThreshold = 10;
@@ -73,6 +73,9 @@ var XAdkChatbot = (0, import_react.forwardRef)(
73
73
  initialized = true,
74
74
  sessionId,
75
75
  onFileClick,
76
+ onResourceLinkClick,
77
+ renderResourceLink,
78
+ markdownExtensions,
76
79
  renderFunctionCall,
77
80
  toolKindResolver,
78
81
  strategies,
@@ -86,15 +89,20 @@ var XAdkChatbot = (0, import_react.forwardRef)(
86
89
  const messagesEndRef = (0, import_react.useRef)(null);
87
90
  const prevInitializedRef = (0, import_react.useRef)(false);
88
91
  const prevSessionIdRef = (0, import_react.useRef)(sessionId);
92
+ const previousMessageCountRef = (0, import_react.useRef)(messages.length);
89
93
  const scrollToBottom = (0, import_react.useCallback)((behavior = "auto") => {
90
94
  var _a;
91
95
  (_a = messagesEndRef.current) == null ? void 0 : _a.scrollIntoView({ behavior });
92
96
  }, []);
93
97
  (0, import_react.useImperativeHandle)(ref, () => ({ scrollToBottom }), [scrollToBottom]);
94
98
  const mergedStrategies = (0, import_react.useMemo)(
95
- () => (0, import_xgroup.mergeChatStrategies)(preset, strategies),
99
+ () => (0, import_runtime.mergeChatStrategies)(preset, strategies),
96
100
  [preset, strategies]
97
101
  );
102
+ const mergedMarkdownExtensions = (0, import_react.useMemo)(
103
+ () => (0, import_runtime.resolvePresetMarkdownExtensions)(preset, markdownExtensions),
104
+ [markdownExtensions, preset]
105
+ );
98
106
  const resolveToolKind = (0, import_react.useCallback)(
99
107
  (name, msg) => {
100
108
  var _a;
@@ -103,6 +111,7 @@ var XAdkChatbot = (0, import_react.forwardRef)(
103
111
  [toolKindResolver, mergedStrategies]
104
112
  );
105
113
  const parseProcessMessage = mergedStrategies.parseProcessMessage ?? import_utils.parseAgentMessage;
114
+ const resourceLinkSchemes = mergedStrategies.markdownResourceLinkSchemes;
106
115
  (0, import_react.useEffect)(() => {
107
116
  if (!initialized)
108
117
  return;
@@ -149,6 +158,12 @@ var XAdkChatbot = (0, import_react.forwardRef)(
149
158
  userHasScrolledRef.current = false;
150
159
  }, [sessionId]);
151
160
  (0, import_react.useEffect)(() => {
161
+ const previousCount = previousMessageCountRef.current;
162
+ previousMessageCountRef.current = messages.length;
163
+ const hasNewUserMessage = messages.slice(previousCount).some((message) => message.role === "user");
164
+ if (hasNewUserMessage) {
165
+ userHasScrolledRef.current = false;
166
+ }
152
167
  if (userHasScrolledRef.current)
153
168
  return;
154
169
  if (!messages.length)
@@ -254,7 +269,11 @@ var XAdkChatbot = (0, import_react.forwardRef)(
254
269
  import_MarkdownRender.default,
255
270
  {
256
271
  text: msg.text,
257
- onFileClick
272
+ resourceLinkSchemes,
273
+ onFileClick,
274
+ onResourceLinkClick,
275
+ renderResourceLink,
276
+ markdownExtensions: mergedMarkdownExtensions
258
277
  },
259
278
  `${msg.id}-${i}`
260
279
  );
@@ -407,7 +426,11 @@ var XAdkChatbot = (0, import_react.forwardRef)(
407
426
  import_MarkdownRender.default,
408
427
  {
409
428
  text: node.content,
410
- onFileClick
429
+ resourceLinkSchemes,
430
+ onFileClick,
431
+ onResourceLinkClick,
432
+ renderResourceLink,
433
+ markdownExtensions: mergedMarkdownExtensions
411
434
  }
412
435
  ) }, node.key);
413
436
  }),
@@ -469,6 +492,10 @@ var XAdkChatbot = (0, import_react.forwardRef)(
469
492
  actions,
470
493
  actionsExtra,
471
494
  onFileClick,
495
+ onResourceLinkClick,
496
+ renderResourceLink,
497
+ mergedMarkdownExtensions,
498
+ resourceLinkSchemes,
472
499
  styles,
473
500
  resolveToolKind,
474
501
  mergedStrategies
@@ -487,10 +514,40 @@ var XAdkChatbot = (0, import_react.forwardRef)(
487
514
  },
488
515
  index
489
516
  )) }),
490
- m.text && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.card, children: m.text })
517
+ m.text && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
518
+ "div",
519
+ {
520
+ className: styles.card,
521
+ onCopy: (event) => {
522
+ event.preventDefault();
523
+ event.clipboardData.setData("text/plain", m.text || "");
524
+ },
525
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
526
+ import_MarkdownRender.default,
527
+ {
528
+ text: m.text,
529
+ compact: true,
530
+ bareUrlAsText: true,
531
+ highlightPlainMentions: true,
532
+ resourceLinkSchemes,
533
+ onFileClick,
534
+ onResourceLinkClick,
535
+ renderResourceLink,
536
+ markdownExtensions: mergedMarkdownExtensions
537
+ }
538
+ )
539
+ }
540
+ )
491
541
  ] }, m.id || i)) }, group.id);
492
542
  },
493
- [styles, onFileClick]
543
+ [
544
+ styles,
545
+ onFileClick,
546
+ onResourceLinkClick,
547
+ renderResourceLink,
548
+ mergedMarkdownExtensions,
549
+ resourceLinkSchemes
550
+ ]
494
551
  );
495
552
  const renderSuggestions = () => {
496
553
  if (!suggestions || suggestions.length === 0)
@@ -500,7 +557,7 @@ var XAdkChatbot = (0, import_react.forwardRef)(
500
557
  {
501
558
  type: "text",
502
559
  icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_icons.SwapRightOutlined, {}),
503
- iconPosition: "end",
560
+ iconPlacement: "end",
504
561
  onClick: () => {
505
562
  if (!item)
506
563
  return;
@@ -521,7 +578,17 @@ var XAdkChatbot = (0, import_react.forwardRef)(
521
578
  const isEmpty = messages.length === 0 && !prologue && (!suggestions || suggestions.length === 0);
522
579
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_clsx.default)(styles.wrapper, className), style, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.list, ref: listRef, children: [
523
580
  isEmpty && empty && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.emptyWrapper, children: typeof empty === "function" ? empty() : empty }),
524
- prologue && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.prologue, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_MarkdownRender.default, { text: prologue, onFileClick }) }),
581
+ prologue && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.prologue, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
582
+ import_MarkdownRender.default,
583
+ {
584
+ text: prologue,
585
+ resourceLinkSchemes,
586
+ onFileClick,
587
+ onResourceLinkClick,
588
+ renderResourceLink,
589
+ markdownExtensions: mergedMarkdownExtensions
590
+ }
591
+ ) }),
525
592
  chatGroups.map(
526
593
  (group, idx) => group.role === "user" ? renderUserGroup(group) : renderBotGroup(
527
594
  group,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAdkChatbot/index.tsx"],
4
- "sourcesContent": ["import React, {\n useMemo,\n useCallback,\n useEffect,\n useRef,\n useImperativeHandle,\n forwardRef,\n} from \"react\";\nimport { Button, Flex, Tooltip, message as antdMessage } from \"antd\";\nimport clsx from \"clsx\";\nimport {\n SwapRightOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n CheckCircleFilled,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport { useStyles } from \"./styles\";\nimport MarkdownRender from \"./components/MarkdownRender\";\nimport FunctionCallRender from \"./components/FunctionCallRender\";\nimport FileGallery from \"../FileGallery\";\nimport XAdkThoughtChain from \"@/components/XAdkThoughtChain\";\nimport { parseAgentMessage } from \"@/utils\";\nimport { mergeChatStrategies } from \"@/presets/xgroup\";\nimport type {\n IMessage,\n XAdkChatbotProps,\n XAdkChatbotHandle,\n ChatGroup,\n} from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAdkThoughtChain\";\nimport { defaultToolKindResolver } from \"@/types/FunctionCallRender\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot = forwardRef<XAdkChatbotHandle, XAdkChatbotProps>(\n (\n {\n loading = false,\n prologue,\n suggestions,\n messages,\n showFnCallDetail,\n onConfirm,\n onSuggest,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n actionsExtra,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n initialized = true,\n sessionId,\n onFileClick,\n renderFunctionCall,\n toolKindResolver,\n strategies,\n preset,\n empty,\n },\n ref,\n ) => {\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement>(null);\n const lastScrollTopRef = useRef(0);\n const userHasScrolledRef = useRef(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const prevInitializedRef = useRef(false);\n const prevSessionIdRef = useRef(sessionId);\n\n // 暴露命令式 API\n const scrollToBottom = useCallback((behavior: ScrollBehavior = \"auto\") => {\n messagesEndRef.current?.scrollIntoView({ behavior });\n }, []);\n useImperativeHandle(ref, () => ({ scrollToBottom }), [scrollToBottom]);\n const mergedStrategies = useMemo(\n () => mergeChatStrategies(preset, strategies),\n [preset, strategies],\n );\n const resolveToolKind = useCallback(\n (name?: string, msg?: IMessage) =>\n toolKindResolver?.(name) ??\n mergedStrategies.resolveToolKind?.({ name, msg }) ??\n defaultToolKindResolver(name),\n [toolKindResolver, mergedStrategies],\n );\n const parseProcessMessage =\n mergedStrategies.parseProcessMessage ?? parseAgentMessage;\n\n // 初始化完成时滚动到底部\n useEffect(() => {\n if (!initialized) return;\n if (!messages.length) return;\n if (prevInitializedRef.current) return;\n prevInitializedRef.current = true;\n\n const el = listRef.current;\n if (!el) return;\n\n // 用 MutationObserver 监听 DOM 子树变化,等内容渲染稳定后置底\n // 每次 DOM 变化都重新计时,确保所有异步渲染(Markdown、代码高亮、思维链等)完成后再滚动\n let stableTimer: ReturnType<typeof setTimeout>;\n const doScroll = () => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"auto\" });\n };\n\n const observer = new MutationObserver(() => {\n clearTimeout(stableTimer);\n stableTimer = setTimeout(doScroll, 80);\n });\n\n observer.observe(el, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n // 立即执行一次,处理内容已经就绪的情况\n doScroll();\n // 兜底:最多等 500ms 后强制滚动并断开观察\n const maxTimer = setTimeout(() => {\n observer.disconnect();\n doScroll();\n }, 500);\n\n return () => {\n clearTimeout(stableTimer);\n clearTimeout(maxTimer);\n observer.disconnect();\n };\n }, [initialized, messages]);\n\n // 会话切换时重置滚动状态,允许重新触发初始化置底\n useEffect(() => {\n if (sessionId === undefined) return; // 未传 sessionId 不处理\n if (prevSessionIdRef.current === sessionId) return; // 同一会话不处理\n prevSessionIdRef.current = sessionId;\n prevInitializedRef.current = false;\n userHasScrolledRef.current = false;\n }, [sessionId]);\n\n // 消息变化时自动滚动到底部(用户未手动上滚时)\n useEffect(() => {\n if (userHasScrolledRef.current) return;\n if (!messages.length) return;\n const el = listRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }, [loading, messages]);\n\n // loading 结束时(流式输出完成),操作栏(metaFooter)会渲染出来增加高度,\n // 需要延迟滚动到底部,确保操作栏可见\n const prevLoadingRef = useRef(loading);\n useEffect(() => {\n const wasLoading = prevLoadingRef.current;\n prevLoadingRef.current = loading;\n\n if (!wasLoading || loading) return; // 只在 loading true → false 时触发\n if (userHasScrolledRef.current) return;\n if (!messages.length) return;\n\n // 延迟等待操作栏 DOM 渲染完成后再滚动\n const timer = setTimeout(() => {\n const el = listRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }, 50);\n return () => clearTimeout(timer);\n }, [loading, messages]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const currentTop = el.scrollTop;\n\n if (currentTop < lastScrollTopRef.current) {\n userHasScrolledRef.current = true;\n }\n\n const isAtBottom =\n Math.abs(el.scrollHeight - currentTop - el.clientHeight) <=\n scrollThreshold;\n if (isAtBottom) {\n userHasScrolledRef.current = false;\n }\n\n lastScrollTopRef.current = currentTop;\n }, []);\n\n useEffect(() => {\n const listElement = listRef.current;\n if (!listElement) return;\n\n listElement.addEventListener(\"scroll\", handleScroll);\n return () => {\n listElement.removeEventListener(\"scroll\", handleScroll);\n };\n }, [handleScroll]);\n\n // ========== 消息分组逻辑 ==========\n const chatGroups = useMemo(() => {\n if (!enableGrouping) {\n // 不分组,每条消息独立\n return messages.map((msg) => ({\n id: msg.id,\n role: msg.role,\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: msg.fileData || [],\n isLike: msg.isLike ?? 0,\n }));\n }\n\n const groups: ChatGroup[] = [];\n messages.forEach((msg) => {\n // 过滤 followup 消息\n if ((msg as any).role === \"followup\") return;\n\n const isRealUserQuery =\n msg.role === \"user\" && !msg.functionResponse && !msg.functionCall;\n const lastGroup = groups[groups.length - 1];\n const isLastGroupAgent = lastGroup?.role === \"bot\";\n\n if (isLastGroupAgent && !isRealUserQuery) {\n // 合并到上一个 bot 分组\n lastGroup.msgs.push(msg);\n if (msg.invocationId) lastGroup.invocationId = msg.invocationId;\n // 更新 isLike: 取最新的非0值,或保持当前值\n if (msg.isLike && msg.isLike !== 0) {\n lastGroup.isLike = msg.isLike;\n }\n } else {\n // 创建新分组\n groups.push({\n id: msg.id || `group-${groups.length}`,\n role: isRealUserQuery ? \"user\" : \"bot\",\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: [],\n isLike: msg.isLike ?? 0,\n });\n }\n });\n\n // 合并文件\n groups.forEach((g) => {\n g.allFiles = g.msgs.reduce(\n (acc, m) => [...acc, ...(m.fileData || [])],\n [] as any[],\n );\n });\n\n return groups;\n }, [messages, enableGrouping]);\n\n // ========== 渲染 Bot 消息组 ==========\n const renderBotGroup = useCallback(\n (\n group: ChatGroup,\n isLastGroup: boolean,\n renderFunctionCall?: XAdkChatbotProps[\"renderFunctionCall\"],\n ) => {\n const { msgs, allFiles } = group;\n\n if (!enableProcessParsing) {\n // 不解析 process,简单渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {msgs.map((msg, i) => {\n if (msg.text) {\n return (\n <MarkdownRender\n key={`${msg.id}-${i}`}\n text={msg.text}\n onFileClick={onFileClick}\n />\n );\n }\n if (msg.functionCall) {\n return (\n renderFunctionCall?.(msg) ?? (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n kind={resolveToolKind(msg.functionCall?.name, msg)}\n renderApproval={mergedStrategies.renderApproval}\n renderHandoff={mergedStrategies.renderHandoff}\n />\n )\n );\n }\n return null;\n })}\n </div>\n );\n }\n\n // ========== 解析 Process 内容 ==========\n\n // 1. 合并工具调用\n const mergedToolMap = new Map<string, IMessage>();\n msgs.forEach((msg) => {\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!mergedToolMap.has(callId)) {\n mergedToolMap.set(callId, { ...msg });\n } else {\n mergedToolMap.set(callId, {\n ...(mergedToolMap.get(callId) ?? {}),\n ...msg,\n });\n }\n } else if (msg.functionResponse) {\n const callId = msg.functionResponse.id || \"\";\n if (mergedToolMap.has(callId)) {\n const tool = mergedToolMap.get(callId);\n if (tool) tool.functionResponse = msg.functionResponse;\n } else {\n mergedToolMap.set(callId, {\n ...msg,\n functionCall: {\n id: callId,\n name: msg.functionResponse.name || \"Unknown\",\n args: {},\n },\n });\n }\n }\n });\n\n // 2. 解析文本消息中的 process 内容\n type RenderNode =\n | { type: \"text\"; content: string; key: string }\n | { type: \"process\"; items: ThoughtChainItemType[]; key: string };\n\n const nodes: RenderNode[] = [];\n let currentProcessItems: ThoughtChainItemType[] = [];\n const processedToolIds = new Set<string>();\n\n const flushProcessItems = () => {\n if (currentProcessItems.length > 0) {\n nodes.push({\n type: \"process\",\n items: [...currentProcessItems],\n key: `process-${nodes.length}`,\n });\n currentProcessItems = [];\n }\n };\n\n msgs.forEach((msg) => {\n // 处理工具调用\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!processedToolIds.has(callId)) {\n const mergedMsg = mergedToolMap.get(callId);\n if (mergedMsg) {\n currentProcessItems.push({\n type: \"tool\",\n key: `tool-${callId}`,\n content: \"\",\n msg: mergedMsg,\n });\n processedToolIds.add(callId);\n }\n }\n }\n // 处理文本消息\n else if (msg.text && !msg.functionResponse) {\n const parts = parseProcessMessage(msg.text, parseOptions as any);\n\n parts.forEach((part, partIdx) => {\n // process 内容放入 currentProcessItems\n if (\n [\n \"planning\",\n \"replanning\",\n \"reasoning\",\n \"action_log\",\n \"process_text\",\n ].includes(part.type)\n ) {\n const titleMap: Record<string, string> = {\n planning: \"任务规划\",\n replanning: \"重新规划\",\n reasoning: \"推理分析\",\n action_log: \"行动记录\",\n process_text: \"过程分析\",\n };\n\n currentProcessItems.push({\n type: \"text\",\n key: `${msg.id}-${partIdx}`,\n content: part.content,\n title: titleMap[part.type] || \"分析\",\n });\n }\n // 普通文本内容\n else {\n flushProcessItems();\n if (part.content.trim()) {\n const lastNode = nodes[nodes.length - 1];\n if (lastNode?.type === \"text\") {\n // 合并到上一个文本节点\n lastNode.content += \"\\n\\n\" + part.content;\n } else {\n nodes.push({\n type: \"text\",\n content: part.content,\n key: `text-${msg.id}-${partIdx}`,\n });\n }\n }\n }\n });\n }\n });\n\n // 最后flush一次\n flushProcessItems();\n\n // 3. 准备操作栏数据\n const fullTextToCopy = msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n const lastBotMsg = msgs[msgs.length - 1];\n const hasProcess = nodes.some((n) => n.type === \"process\");\n const isGroupLoading = loading && isLastGroup;\n const actionProps = { message: group, isLastBotMsg: isLastGroup };\n const actionExtraNode = actionsExtra?.(actionProps);\n\n // 4. 渲染\n const lastProcessIdx = nodes.findLastIndex((n) => n.type === \"process\");\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n // 只有最后一个 process node 跟随 loading 状态,已完成的思维链不应显示 loading\n const isLastProcess = idx === lastProcessIdx;\n return (\n <XAdkThoughtChain\n key={node.key}\n loading={isLastProcess && isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isLastProcess && isGroupLoading}\n renderFunctionCall={renderFunctionCall}\n toolKindResolver={(name) => resolveToolKind(name)}\n strategies={mergedStrategies}\n />\n );\n }\n\n // 文本节点\n // const showBadge =\n // hasProcess && nodes.findIndex((n) => n.type === \"text\") === idx;\n return (\n <div key={node.key}>\n {/* {showBadge && (\n <div className={styles.successBadge}>\n <CheckCircleFilled /> 已完成所有规划任务\n </div>\n )} */}\n <MarkdownRender\n text={node.content}\n onFileClick={onFileClick}\n />\n </div>\n );\n })}\n\n {/* 文件展示 */}\n {allFiles.length > 0 && (\n <div className={styles.fileSection}>\n <div className={styles.fileHeader}>\n <span>生成文件 ({allFiles.length})</span>\n </div>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"8px\" }}>\n {allFiles.map((file, index) => (\n <FileGallery\n key={index}\n file={file}\n onClick={onFileClick}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions ||\n showRetry ||\n showCopy ||\n showLog ||\n actionExtraNode) && (\n <div className={styles.metaFooter}>\n {actions ? (\n actions(actionProps)\n ) : (\n <Flex gap={16} className={styles.actionIcons}>\n {showRetry && isLastGroup && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined onClick={onRetry} />\n </Tooltip>\n )}\n {showCopy && (\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n onClick={() => {\n copy(fullTextToCopy);\n antdMessage.success(\"复制成功\");\n onCopy?.(fullTextToCopy);\n }}\n />\n </Tooltip>\n )}\n {showLog && lastBotMsg?.invocationId && (\n <Tooltip title=\"查看日志\">\n <InfoCircleOutlined\n onClick={() =>\n onShowLog?.(\n lastBotMsg.invocationId!,\n lastBotMsg.timestamp,\n )\n }\n />\n </Tooltip>\n )}\n </Flex>\n )}\n {actionExtraNode}\n </div>\n )}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n parseProcessMessage,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n actionsExtra,\n onFileClick,\n styles,\n resolveToolKind,\n mergedStrategies,\n ],\n );\n\n // ========== 渲染用户消息组 ==========\n const renderUserGroup = useCallback(\n (group: ChatGroup) => {\n return (\n <div key={group.id} className={styles.userMsg}>\n {group.msgs.map((m, i) => (\n <div key={m.id || i} className={styles.userContainer}>\n {/* 文件展示 */}\n {m.fileData && m.fileData.length > 0 && (\n <>\n {m.fileData.map((file, index) => (\n <FileGallery\n key={index}\n file={file}\n align=\"left\"\n style={{ marginBottom: \"16px\" }}\n onClick={onFileClick}\n />\n ))}\n </>\n )}\n {/* 文本展示 */}\n {m.text && <div className={styles.card}>{m.text}</div>}\n </div>\n ))}\n </div>\n );\n },\n [styles, onFileClick],\n );\n\n // ========== 空状态 ==========\n\n // ========== 渲染建议问题 ==========\n const renderSuggestions = () => {\n if (!suggestions || suggestions.length === 0) return null;\n\n return (\n <div className={styles.suggestionWrapper}>\n {suggestions.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPosition=\"end\"\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n style={{\n whiteSpace: \"normal\",\n height: \"auto\",\n wordWrap: \"break-word\",\n textAlign: \"left\",\n padding: \"4px 15px\",\n lineHeight: \"1.5\",\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n // 空状态判断\n const isEmpty =\n messages.length === 0 &&\n !prologue &&\n (!suggestions || suggestions.length === 0);\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 空状态 */}\n {isEmpty && empty && (\n <div className={styles.emptyWrapper}>\n {typeof empty === \"function\" ? empty() : empty}\n </div>\n )}\n\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender text={prologue} onFileClick={onFileClick} />\n </div>\n )}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(\n group,\n idx === chatGroups.length - 1,\n renderFunctionCall,\n ),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n },\n);\n\nXAdkChatbot.displayName = \"XAdkChatbot\";\n\nexport default XAdkChatbot;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n useMemo,\n useCallback,\n useEffect,\n useRef,\n useImperativeHandle,\n forwardRef,\n} from \"react\";\nimport { Button, Flex, Tooltip, message as antdMessage } from \"antd\";\nimport clsx from \"clsx\";\nimport {\n SwapRightOutlined,\n ReloadOutlined,\n CopyOutlined,\n InfoCircleOutlined,\n} from \"@ant-design/icons\";\nimport copy from \"copy-to-clipboard\";\nimport { useStyles } from \"./styles\";\nimport MarkdownRender from \"./components/MarkdownRender\";\nimport FunctionCallRender from \"./components/FunctionCallRender\";\nimport FileGallery from \"../FileGallery\";\nimport XAdkThoughtChain from \"@/components/XAdkThoughtChain\";\nimport { parseAgentMessage } from \"@/utils\";\nimport {\n mergeChatStrategies,\n resolvePresetMarkdownExtensions,\n} from \"@/presets/runtime\";\nimport type {\n IMessage,\n XAdkChatbotProps,\n XAdkChatbotHandle,\n ChatGroup,\n} from \"@/types\";\nimport type { ThoughtChainItemType } from \"@/types/XAdkThoughtChain\";\nimport { defaultToolKindResolver } from \"@/types/FunctionCallRender\";\n\nconst scrollThreshold = 10;\n\n/**\n * XAdkChatbot - 增强版聊天组件\n *\n * 新增功能:\n * - ✅ 自动消息分组 (enableGrouping)\n * - ✅ 自动解析思维链 (enableProcessParsing)\n * - ✅ 文件展示 (FileGallery)\n * - ✅ 操作栏 (重试/复制/日志)\n * - ✅ 欢迎页面 (agentName/agentIcon/description)\n */\nconst XAdkChatbot = forwardRef<XAdkChatbotHandle, XAdkChatbotProps>(\n (\n {\n loading = false,\n prologue,\n suggestions,\n messages,\n showFnCallDetail,\n onConfirm,\n onSuggest,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n actionsExtra,\n className,\n style,\n // welcome = null,\n enableGrouping = true,\n enableProcessParsing = true,\n parseOptions,\n initialized = true,\n sessionId,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n markdownExtensions,\n renderFunctionCall,\n toolKindResolver,\n strategies,\n preset,\n empty,\n },\n ref,\n ) => {\n const styles = useStyles();\n const listRef = useRef<HTMLDivElement>(null);\n const lastScrollTopRef = useRef(0);\n const userHasScrolledRef = useRef(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const prevInitializedRef = useRef(false);\n const prevSessionIdRef = useRef(sessionId);\n const previousMessageCountRef = useRef(messages.length);\n\n // 暴露命令式 API\n const scrollToBottom = useCallback((behavior: ScrollBehavior = \"auto\") => {\n messagesEndRef.current?.scrollIntoView({ behavior });\n }, []);\n useImperativeHandle(ref, () => ({ scrollToBottom }), [scrollToBottom]);\n const mergedStrategies = useMemo(\n () => mergeChatStrategies(preset, strategies),\n [preset, strategies],\n );\n const mergedMarkdownExtensions = useMemo(\n () => resolvePresetMarkdownExtensions(preset, markdownExtensions),\n [markdownExtensions, preset],\n );\n const resolveToolKind = useCallback(\n (name?: string, msg?: IMessage) =>\n toolKindResolver?.(name) ??\n mergedStrategies.resolveToolKind?.({ name, msg }) ??\n defaultToolKindResolver(name),\n [toolKindResolver, mergedStrategies],\n );\n const parseProcessMessage =\n mergedStrategies.parseProcessMessage ?? parseAgentMessage;\n const resourceLinkSchemes = mergedStrategies.markdownResourceLinkSchemes;\n\n // 初始化完成时滚动到底部\n useEffect(() => {\n if (!initialized) return;\n if (!messages.length) return;\n if (prevInitializedRef.current) return;\n prevInitializedRef.current = true;\n\n const el = listRef.current;\n if (!el) return;\n\n // 用 MutationObserver 监听 DOM 子树变化,等内容渲染稳定后置底\n // 每次 DOM 变化都重新计时,确保所有异步渲染(Markdown、代码高亮、思维链等)完成后再滚动\n let stableTimer: ReturnType<typeof setTimeout>;\n const doScroll = () => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"auto\" });\n };\n\n const observer = new MutationObserver(() => {\n clearTimeout(stableTimer);\n stableTimer = setTimeout(doScroll, 80);\n });\n\n observer.observe(el, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n // 立即执行一次,处理内容已经就绪的情况\n doScroll();\n // 兜底:最多等 500ms 后强制滚动并断开观察\n const maxTimer = setTimeout(() => {\n observer.disconnect();\n doScroll();\n }, 500);\n\n return () => {\n clearTimeout(stableTimer);\n clearTimeout(maxTimer);\n observer.disconnect();\n };\n }, [initialized, messages]);\n\n // 会话切换时重置滚动状态,允许重新触发初始化置底\n useEffect(() => {\n if (sessionId === undefined) return; // 未传 sessionId 不处理\n if (prevSessionIdRef.current === sessionId) return; // 同一会话不处理\n prevSessionIdRef.current = sessionId;\n prevInitializedRef.current = false;\n userHasScrolledRef.current = false;\n }, [sessionId]);\n\n // 新增用户消息代表一次主动发送,应无条件恢复跟随并置底。\n // 之后的流式回复继续沿用“用户未主动上滚时跟随”的规则。\n useEffect(() => {\n const previousCount = previousMessageCountRef.current;\n previousMessageCountRef.current = messages.length;\n const hasNewUserMessage = messages\n .slice(previousCount)\n .some((message) => message.role === \"user\");\n if (hasNewUserMessage) {\n userHasScrolledRef.current = false;\n }\n if (userHasScrolledRef.current) return;\n if (!messages.length) return;\n const el = listRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }, [loading, messages]);\n\n // loading 结束时(流式输出完成),操作栏(metaFooter)会渲染出来增加高度,\n // 需要延迟滚动到底部,确保操作栏可见\n const prevLoadingRef = useRef(loading);\n useEffect(() => {\n const wasLoading = prevLoadingRef.current;\n prevLoadingRef.current = loading;\n\n if (!wasLoading || loading) return; // 只在 loading true → false 时触发\n if (userHasScrolledRef.current) return;\n if (!messages.length) return;\n\n // 延迟等待操作栏 DOM 渲染完成后再滚动\n const timer = setTimeout(() => {\n const el = listRef.current;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }, 50);\n return () => clearTimeout(timer);\n }, [loading, messages]);\n\n // 处理滚动事件\n const handleScroll = useCallback(() => {\n const el = listRef.current;\n if (!el) return;\n const currentTop = el.scrollTop;\n\n if (currentTop < lastScrollTopRef.current) {\n userHasScrolledRef.current = true;\n }\n\n const isAtBottom =\n Math.abs(el.scrollHeight - currentTop - el.clientHeight) <=\n scrollThreshold;\n if (isAtBottom) {\n userHasScrolledRef.current = false;\n }\n\n lastScrollTopRef.current = currentTop;\n }, []);\n\n useEffect(() => {\n const listElement = listRef.current;\n if (!listElement) return;\n\n listElement.addEventListener(\"scroll\", handleScroll);\n return () => {\n listElement.removeEventListener(\"scroll\", handleScroll);\n };\n }, [handleScroll]);\n\n // ========== 消息分组逻辑 ==========\n const chatGroups = useMemo(() => {\n if (!enableGrouping) {\n // 不分组,每条消息独立\n return messages.map((msg) => ({\n id: msg.id,\n role: msg.role,\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: msg.fileData || [],\n isLike: msg.isLike ?? 0,\n }));\n }\n\n const groups: ChatGroup[] = [];\n messages.forEach((msg) => {\n // 过滤 followup 消息\n if ((msg as any).role === \"followup\") return;\n\n const isRealUserQuery =\n msg.role === \"user\" && !msg.functionResponse && !msg.functionCall;\n const lastGroup = groups[groups.length - 1];\n const isLastGroupAgent = lastGroup?.role === \"bot\";\n\n if (isLastGroupAgent && !isRealUserQuery) {\n // 合并到上一个 bot 分组\n lastGroup.msgs.push(msg);\n if (msg.invocationId) lastGroup.invocationId = msg.invocationId;\n // 更新 isLike: 取最新的非0值,或保持当前值\n if (msg.isLike && msg.isLike !== 0) {\n lastGroup.isLike = msg.isLike;\n }\n } else {\n // 创建新分组\n groups.push({\n id: msg.id || `group-${groups.length}`,\n role: isRealUserQuery ? \"user\" : \"bot\",\n msgs: [msg],\n invocationId: msg.invocationId,\n allFiles: [],\n isLike: msg.isLike ?? 0,\n });\n }\n });\n\n // 合并文件\n groups.forEach((g) => {\n g.allFiles = g.msgs.reduce(\n (acc, m) => [...acc, ...(m.fileData || [])],\n [] as any[],\n );\n });\n\n return groups;\n }, [messages, enableGrouping]);\n\n // ========== 渲染 Bot 消息组 ==========\n const renderBotGroup = useCallback(\n (\n group: ChatGroup,\n isLastGroup: boolean,\n renderFunctionCall?: XAdkChatbotProps[\"renderFunctionCall\"],\n ) => {\n const { msgs, allFiles } = group;\n\n if (!enableProcessParsing) {\n // 不解析 process,简单渲染\n return (\n <div key={group.id} className={styles.botMsg}>\n {msgs.map((msg, i) => {\n if (msg.text) {\n return (\n <MarkdownRender\n key={`${msg.id}-${i}`}\n text={msg.text}\n resourceLinkSchemes={resourceLinkSchemes}\n onFileClick={onFileClick}\n onResourceLinkClick={onResourceLinkClick}\n renderResourceLink={renderResourceLink}\n markdownExtensions={mergedMarkdownExtensions}\n />\n );\n }\n if (msg.functionCall) {\n return (\n renderFunctionCall?.(msg) ?? (\n <FunctionCallRender\n key={`${msg.id}-${i}`}\n msg={msg}\n showDetail={showFnCallDetail}\n onConfirm={onConfirm}\n kind={resolveToolKind(msg.functionCall?.name, msg)}\n renderApproval={mergedStrategies.renderApproval}\n renderHandoff={mergedStrategies.renderHandoff}\n />\n )\n );\n }\n return null;\n })}\n </div>\n );\n }\n\n // ========== 解析 Process 内容 ==========\n\n // 1. 合并工具调用\n const mergedToolMap = new Map<string, IMessage>();\n msgs.forEach((msg) => {\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!mergedToolMap.has(callId)) {\n mergedToolMap.set(callId, { ...msg });\n } else {\n mergedToolMap.set(callId, {\n ...(mergedToolMap.get(callId) ?? {}),\n ...msg,\n });\n }\n } else if (msg.functionResponse) {\n const callId = msg.functionResponse.id || \"\";\n if (mergedToolMap.has(callId)) {\n const tool = mergedToolMap.get(callId);\n if (tool) tool.functionResponse = msg.functionResponse;\n } else {\n mergedToolMap.set(callId, {\n ...msg,\n functionCall: {\n id: callId,\n name: msg.functionResponse.name || \"Unknown\",\n args: {},\n },\n });\n }\n }\n });\n\n // 2. 解析文本消息中的 process 内容\n type RenderNode =\n | { type: \"text\"; content: string; key: string }\n | { type: \"process\"; items: ThoughtChainItemType[]; key: string };\n\n const nodes: RenderNode[] = [];\n let currentProcessItems: ThoughtChainItemType[] = [];\n const processedToolIds = new Set<string>();\n\n const flushProcessItems = () => {\n if (currentProcessItems.length > 0) {\n nodes.push({\n type: \"process\",\n items: [...currentProcessItems],\n key: `process-${nodes.length}`,\n });\n currentProcessItems = [];\n }\n };\n\n msgs.forEach((msg) => {\n // 处理工具调用\n if (msg.functionCall) {\n const callId = msg.functionCall.id || \"\";\n if (!processedToolIds.has(callId)) {\n const mergedMsg = mergedToolMap.get(callId);\n if (mergedMsg) {\n currentProcessItems.push({\n type: \"tool\",\n key: `tool-${callId}`,\n content: \"\",\n msg: mergedMsg,\n });\n processedToolIds.add(callId);\n }\n }\n }\n // 处理文本消息\n else if (msg.text && !msg.functionResponse) {\n const parts = parseProcessMessage(msg.text, parseOptions as any);\n\n parts.forEach((part, partIdx) => {\n // process 内容放入 currentProcessItems\n if (\n [\n \"planning\",\n \"replanning\",\n \"reasoning\",\n \"action_log\",\n \"process_text\",\n ].includes(part.type)\n ) {\n const titleMap: Record<string, string> = {\n planning: \"任务规划\",\n replanning: \"重新规划\",\n reasoning: \"推理分析\",\n action_log: \"行动记录\",\n process_text: \"过程分析\",\n };\n\n currentProcessItems.push({\n type: \"text\",\n key: `${msg.id}-${partIdx}`,\n content: part.content,\n title: titleMap[part.type] || \"分析\",\n });\n }\n // 普通文本内容\n else {\n flushProcessItems();\n if (part.content.trim()) {\n const lastNode = nodes[nodes.length - 1];\n if (lastNode?.type === \"text\") {\n // 合并到上一个文本节点\n lastNode.content += \"\\n\\n\" + part.content;\n } else {\n nodes.push({\n type: \"text\",\n content: part.content,\n key: `text-${msg.id}-${partIdx}`,\n });\n }\n }\n }\n });\n }\n });\n\n // 最后flush一次\n flushProcessItems();\n\n // 3. 准备操作栏数据\n const fullTextToCopy = msgs\n .filter((m) => !m.functionCall && !m.functionResponse)\n .map((m) => m.text || \"\")\n .join(\"\");\n\n const lastBotMsg = msgs[msgs.length - 1];\n const hasProcess = nodes.some((n) => n.type === \"process\");\n const isGroupLoading = loading && isLastGroup;\n const actionProps = { message: group, isLastBotMsg: isLastGroup };\n const actionExtraNode = actionsExtra?.(actionProps);\n\n // 4. 渲染\n const lastProcessIdx = nodes.findLastIndex((n) => n.type === \"process\");\n return (\n <div key={group.id} className={styles.botMsg}>\n {nodes.map((node, idx) => {\n if (node.type === \"process\") {\n // 只有最后一个 process node 跟随 loading 状态,已完成的思维链不应显示 loading\n const isLastProcess = idx === lastProcessIdx;\n return (\n <XAdkThoughtChain\n key={node.key}\n loading={isLastProcess && isGroupLoading}\n title=\"思维链已完成\"\n items={node.items}\n showFnCallDetail={showFnCallDetail}\n onConfirm={onConfirm}\n defaultOpen={isLastProcess && isGroupLoading}\n renderFunctionCall={renderFunctionCall}\n toolKindResolver={(name) => resolveToolKind(name)}\n strategies={mergedStrategies}\n />\n );\n }\n\n // 文本节点\n // const showBadge =\n // hasProcess && nodes.findIndex((n) => n.type === \"text\") === idx;\n return (\n <div key={node.key}>\n {/* {showBadge && (\n <div className={styles.successBadge}>\n <CheckCircleFilled /> 已完成所有规划任务\n </div>\n )} */}\n <MarkdownRender\n text={node.content}\n resourceLinkSchemes={resourceLinkSchemes}\n onFileClick={onFileClick}\n onResourceLinkClick={onResourceLinkClick}\n renderResourceLink={renderResourceLink}\n markdownExtensions={mergedMarkdownExtensions}\n />\n </div>\n );\n })}\n\n {/* 文件展示 */}\n {allFiles.length > 0 && (\n <div className={styles.fileSection}>\n <div className={styles.fileHeader}>\n <span>生成文件 ({allFiles.length})</span>\n </div>\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: \"8px\" }}>\n {allFiles.map((file, index) => (\n <FileGallery\n key={index}\n file={file}\n onClick={onFileClick}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* 操作栏 */}\n {!isGroupLoading &&\n (actions ||\n showRetry ||\n showCopy ||\n showLog ||\n actionExtraNode) && (\n <div className={styles.metaFooter}>\n {actions ? (\n actions(actionProps)\n ) : (\n <Flex gap={16} className={styles.actionIcons}>\n {showRetry && isLastGroup && (\n <Tooltip title=\"重新生成\">\n <ReloadOutlined onClick={onRetry} />\n </Tooltip>\n )}\n {showCopy && (\n <Tooltip title=\"复制内容\">\n <CopyOutlined\n onClick={() => {\n copy(fullTextToCopy);\n antdMessage.success(\"复制成功\");\n onCopy?.(fullTextToCopy);\n }}\n />\n </Tooltip>\n )}\n {showLog && lastBotMsg?.invocationId && (\n <Tooltip title=\"查看日志\">\n <InfoCircleOutlined\n onClick={() =>\n onShowLog?.(\n lastBotMsg.invocationId!,\n lastBotMsg.timestamp,\n )\n }\n />\n </Tooltip>\n )}\n </Flex>\n )}\n {actionExtraNode}\n </div>\n )}\n </div>\n );\n },\n [\n enableProcessParsing,\n parseOptions,\n parseProcessMessage,\n showFnCallDetail,\n onConfirm,\n loading,\n showRetry,\n showCopy,\n showLog,\n onRetry,\n onCopy,\n onShowLog,\n actions,\n actionsExtra,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n mergedMarkdownExtensions,\n resourceLinkSchemes,\n styles,\n resolveToolKind,\n mergedStrategies,\n ],\n );\n\n // ========== 渲染用户消息组 ==========\n const renderUserGroup = useCallback(\n (group: ChatGroup) => {\n return (\n <div key={group.id} className={styles.userMsg}>\n {group.msgs.map((m, i) => (\n <div key={m.id || i} className={styles.userContainer}>\n {/* 文件展示 */}\n {m.fileData && m.fileData.length > 0 && (\n <>\n {m.fileData.map((file, index) => (\n <FileGallery\n key={index}\n file={file}\n align=\"left\"\n style={{ marginBottom: \"16px\" }}\n onClick={onFileClick}\n />\n ))}\n </>\n )}\n {/* 文本展示 */}\n {m.text && (\n <div\n className={styles.card}\n onCopy={(event) => {\n // 富文本标签的可见文案不含协议;复制用户消息时保留原始 Markdown,\n // 使内容粘贴回 XAdkSender 后能重新还原成 Mention。\n event.preventDefault();\n event.clipboardData.setData(\"text/plain\", m.text || \"\");\n }}\n >\n <MarkdownRender\n text={m.text}\n compact\n bareUrlAsText\n highlightPlainMentions\n resourceLinkSchemes={resourceLinkSchemes}\n onFileClick={onFileClick}\n onResourceLinkClick={onResourceLinkClick}\n renderResourceLink={renderResourceLink}\n markdownExtensions={mergedMarkdownExtensions}\n />\n </div>\n )}\n </div>\n ))}\n </div>\n );\n },\n [\n styles,\n onFileClick,\n onResourceLinkClick,\n renderResourceLink,\n mergedMarkdownExtensions,\n resourceLinkSchemes,\n ],\n );\n\n // ========== 空状态 ==========\n\n // ========== 渲染建议问题 ==========\n const renderSuggestions = () => {\n if (!suggestions || suggestions.length === 0) return null;\n\n return (\n <div className={styles.suggestionWrapper}>\n {suggestions.map((item) => (\n <div key={item} className={styles.suggestion}>\n <div className={styles.suggestContent}>\n <Button\n type=\"text\"\n icon={<SwapRightOutlined />}\n iconPlacement=\"end\"\n onClick={() => {\n if (!item) return;\n onSuggest?.(item);\n }}\n style={{\n whiteSpace: \"normal\",\n height: \"auto\",\n wordWrap: \"break-word\",\n textAlign: \"left\",\n padding: \"4px 15px\",\n lineHeight: \"1.5\",\n }}\n >\n {item}\n </Button>\n </div>\n </div>\n ))}\n </div>\n );\n };\n\n // 空状态判断\n const isEmpty =\n messages.length === 0 &&\n !prologue &&\n (!suggestions || suggestions.length === 0);\n\n return (\n <div className={clsx(styles.wrapper, className)} style={style}>\n <div className={styles.list} ref={listRef}>\n {/* 空状态 */}\n {isEmpty && empty && (\n <div className={styles.emptyWrapper}>\n {typeof empty === \"function\" ? empty() : empty}\n </div>\n )}\n\n {/* 开场白 */}\n {prologue && (\n <div className={styles.prologue}>\n <MarkdownRender\n text={prologue}\n resourceLinkSchemes={resourceLinkSchemes}\n onFileClick={onFileClick}\n onResourceLinkClick={onResourceLinkClick}\n renderResourceLink={renderResourceLink}\n markdownExtensions={mergedMarkdownExtensions}\n />\n </div>\n )}\n\n {/* 消息列表 */}\n {chatGroups.map((group, idx) =>\n group.role === \"user\"\n ? renderUserGroup(group)\n : renderBotGroup(\n group,\n idx === chatGroups.length - 1,\n renderFunctionCall,\n ),\n )}\n\n {/* 建议问题 */}\n {renderSuggestions()}\n\n <div ref={messagesEndRef} />\n </div>\n </div>\n );\n },\n);\n\nXAdkChatbot.displayName = \"XAdkChatbot\";\n\nexport default XAdkChatbot;\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_FunctionCallRender", "renderFunctionCall", "MarkdownRender", "FunctionCallRender", "XAdkThoughtChain", "FileGallery", "copy", "antdMessage", "clsx"]
7
7
  }
@@ -90,7 +90,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
90
90
  align-items: flex-end;
91
91
  `,
92
92
  card: import_css.css`
93
- display: inline-flex;
93
+ display: inline-block;
94
94
  padding: 12px 16px;
95
95
  background: #d5e3ff;
96
96
  border-radius: 12px;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAdkChatbot/styles.tsx"],
4
- "sourcesContent": ["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n wrapper: css`\n padding: 0 16px;\n min-height: 300px;\n height: 100%;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n\n .x-markdown {\n --margin-ul-ol: 0 0 1em 1em;\n\n code {\n background: rgba(150, 150, 150, 0.2);\n border-radius: 3px;\n }\n\n .ant-highlightCode-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: var(--ant-highlight-code-color-text-title);\n background: var(--ant-highlight-code-color-bg-title);\n padding: var(--ant-padding-sm);\n border-top-left-radius: var(--ant-border-radius);\n border-top-right-radius: var(--ant-border-radius);\n }\n }\n `,\n\n list: css`\n flex: 1;\n margin-top: 16px;\n overflow-y: auto;\n /* Chrome, Safari, Edge, Opera */\n &::-webkit-scrollbar {\n display: none;\n }\n /* Firefox */\n scrollbar-width: none;\n /* IE 10+ */\n -ms-overflow-style: none;\n `,\n\n prologue: css`\n margin-bottom: 12px;\n `,\n\n suggestion: css`\n margin-bottom: 12px;\n `,\n\n suggestContent: css`\n display: inline-flex;\n border: 2px solid #e7e7e7;\n border-radius: 8px;\n `,\n\n userMsg: css`\n display: flex;\n justify-content: flex-end;\n margin-bottom: 24px;\n `,\n\n userContainer: css`\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: flex-end;\n `,\n\n card: css`\n display: inline-flex;\n padding: 12px 16px;\n background: #d5e3ff;\n border-radius: 12px;\n max-width: 100%;\n white-space: pre-line;\n word-break: break-all;\n `,\n\n botMsg: css`\n margin-bottom: 12px;\n `,\n\n emptyWrapper: css`\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 200px;\n `,\n\n // 新增样式\n welcomeWrapper: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 40px 20px;\n text-align: center;\n `,\n\n welcomeIcon: css`\n width: 64px;\n height: 64px;\n border-radius: 12px;\n margin-bottom: 16px;\n `,\n\n welcomeTitle: css`\n font-size: 24px;\n font-weight: 600;\n color: rgba(0, 0, 0, 0.88);\n margin-bottom: 8px;\n `,\n\n welcomeDesc: css`\n font-size: 14px;\n color: rgba(0, 0, 0, 0.65);\n margin-bottom: 24px;\n `,\n\n suggestionWrapper: css`\n margin-top: 16px;\n `,\n\n successBadge: css`\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n background: #f6ffed;\n border: 1px solid #b7eb8f;\n border-radius: 4px;\n color: #52c41a;\n font-size: 13px;\n margin-bottom: 12px;\n `,\n\n fileSection: css`\n margin: 12px 0;\n `,\n\n fileHeader: css`\n font-size: 13px;\n color: rgba(0, 0, 0, 0.65);\n margin-bottom: 8px;\n `,\n\n metaFooter: css`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid #f0f0f0;\n `,\n\n actionIcons: css`\n color: rgba(0, 0, 0, 0.45);\n\n & > span {\n cursor: pointer;\n transition: color 0.2s;\n\n &:hover {\n color: #1890ff;\n }\n }\n `,\n\n fnCall: css`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 11px;\n border-radius: 24px;\n line-height: 16px;\n border: 1px solid #e7e7e7;\n cursor: pointer;\n `,\n\n confirm: css`\n padding: 12px;\n border-radius: 12px;\n border: 1px solid #e7e7e7;\n `,\n\n footer: css`\n /* senderWrap and tip moved to top-level keys so they are\n accessible as styles.senderWrap and styles.tip in the component */\n `,\n\n sender: css`\n width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 8px 8px 12px;\n border: 1px solid #e7e7e7;\n border-radius: 24px;\n\n /* .input moved to top-level key so component can use styles.input */\n `,\n\n senderWrap: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n `,\n\n tip: css`\n padding: 4px;\n font-size: 12px;\n text-align: center;\n color: rgba(0, 0, 0, 0.4);\n `,\n\n input: css`\n padding: 0;\n margin: 5px 0;\n line-height: 22px;\n font-size: 15px;\n border-radius: 0;\n border: none;\n\n &:focus {\n box-shadow: none;\n }\n `,\n}));\n\nexport default useStyles;\n"],
4
+ "sourcesContent": ["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n wrapper: css`\n padding: 0 16px;\n min-height: 300px;\n height: 100%;\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n\n .x-markdown {\n --margin-ul-ol: 0 0 1em 1em;\n\n code {\n background: rgba(150, 150, 150, 0.2);\n border-radius: 3px;\n }\n\n .ant-highlightCode-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: var(--ant-highlight-code-color-text-title);\n background: var(--ant-highlight-code-color-bg-title);\n padding: var(--ant-padding-sm);\n border-top-left-radius: var(--ant-border-radius);\n border-top-right-radius: var(--ant-border-radius);\n }\n }\n `,\n\n list: css`\n flex: 1;\n margin-top: 16px;\n overflow-y: auto;\n /* Chrome, Safari, Edge, Opera */\n &::-webkit-scrollbar {\n display: none;\n }\n /* Firefox */\n scrollbar-width: none;\n /* IE 10+ */\n -ms-overflow-style: none;\n `,\n\n prologue: css`\n margin-bottom: 12px;\n `,\n\n suggestion: css`\n margin-bottom: 12px;\n `,\n\n suggestContent: css`\n display: inline-flex;\n border: 2px solid #e7e7e7;\n border-radius: 8px;\n `,\n\n userMsg: css`\n display: flex;\n justify-content: flex-end;\n margin-bottom: 24px;\n `,\n\n userContainer: css`\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: flex-end;\n `,\n\n card: css`\n display: inline-block;\n padding: 12px 16px;\n background: #d5e3ff;\n border-radius: 12px;\n max-width: 100%;\n white-space: pre-line;\n word-break: break-all;\n `,\n\n botMsg: css`\n margin-bottom: 12px;\n `,\n\n emptyWrapper: css`\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n min-height: 200px;\n `,\n\n // 新增样式\n welcomeWrapper: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 40px 20px;\n text-align: center;\n `,\n\n welcomeIcon: css`\n width: 64px;\n height: 64px;\n border-radius: 12px;\n margin-bottom: 16px;\n `,\n\n welcomeTitle: css`\n font-size: 24px;\n font-weight: 600;\n color: rgba(0, 0, 0, 0.88);\n margin-bottom: 8px;\n `,\n\n welcomeDesc: css`\n font-size: 14px;\n color: rgba(0, 0, 0, 0.65);\n margin-bottom: 24px;\n `,\n\n suggestionWrapper: css`\n margin-top: 16px;\n `,\n\n successBadge: css`\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 12px;\n background: #f6ffed;\n border: 1px solid #b7eb8f;\n border-radius: 4px;\n color: #52c41a;\n font-size: 13px;\n margin-bottom: 12px;\n `,\n\n fileSection: css`\n margin: 12px 0;\n `,\n\n fileHeader: css`\n font-size: 13px;\n color: rgba(0, 0, 0, 0.65);\n margin-bottom: 8px;\n `,\n\n metaFooter: css`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 16px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid #f0f0f0;\n `,\n\n actionIcons: css`\n color: rgba(0, 0, 0, 0.45);\n\n & > span {\n cursor: pointer;\n transition: color 0.2s;\n\n &:hover {\n color: #1890ff;\n }\n }\n `,\n\n fnCall: css`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 11px;\n border-radius: 24px;\n line-height: 16px;\n border: 1px solid #e7e7e7;\n cursor: pointer;\n `,\n\n confirm: css`\n padding: 12px;\n border-radius: 12px;\n border: 1px solid #e7e7e7;\n `,\n\n footer: css`\n /* senderWrap and tip moved to top-level keys so they are\n accessible as styles.senderWrap and styles.tip in the component */\n `,\n\n sender: css`\n width: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 8px 8px 12px;\n border: 1px solid #e7e7e7;\n border-radius: 24px;\n\n /* .input moved to top-level key so component can use styles.input */\n `,\n\n senderWrap: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n `,\n\n tip: css`\n padding: 4px;\n font-size: 12px;\n text-align: center;\n color: rgba(0, 0, 0, 0.4);\n `,\n\n input: css`\n padding: 0;\n margin: 5px 0;\n line-height: 22px;\n font-size: 15px;\n border-radius: 0;\n border: none;\n\n &:focus {\n box-shadow: none;\n }\n `,\n}));\n\nexport default useStyles;\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAoB;AACpB,oBAAgC;AAEzB,IAAM,gBAAY,+BAAgB,OAAO;AAAA,EAC9C,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BT,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcN,UAAU;AAAA;AAAA;AAAA,EAIV,YAAY;AAAA;AAAA;AAAA,EAIZ,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUN,QAAQ;AAAA;AAAA;AAAA,EAIR,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASd,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOb,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAMb,mBAAmB;AAAA;AAAA;AAAA,EAInB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAad,aAAa;AAAA;AAAA;AAAA,EAIb,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUZ,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAab,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,QAAQ;AAAA;AAAA;AAAA;AAAA,EAKR,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYR,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOZ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYT,EAAE;AAEF,IAAO,iBAAQ;",
6
6
  "names": []
7
7
  }
@@ -14,9 +14,14 @@ export interface DefaultLayoutProps {
14
14
  header?: React.ReactNode;
15
15
  /** 自定义底部 (替代默认 Sender) */
16
16
  footer?: React.ReactNode;
17
- /** 是否允许上传文件 */
17
+ /**
18
+ * 是否启用内置上传入口(上传按钮 + 隐藏 file input + 拖拽)。
19
+ * 未传时继承 XAdkProvider config.allowUpload。
20
+ * 内核 XAdkSender 不再内置上传逻辑,上传能力统一由 DefaultLayout 管理。
21
+ * 业务方自定义 footer 时可自行控制上传。
22
+ */
18
23
  allowUpload?: boolean;
19
- /** 是否启用拖拽上传,拖拽区域为整个聊天区域(不含侧边栏),需 allowUpload 为 true */
24
+ /** 是否启用拖拽上传;未传时继承 config.draggable */
20
25
  draggable?: boolean;
21
26
  /** 是否显示清空按钮 */
22
27
  clearBtnShow?: boolean;
@@ -35,6 +35,8 @@ module.exports = __toCommonJS(DefaultLayout_exports);
35
35
  var import_react = require("react");
36
36
  var import_x = require("@ant-design/x");
37
37
  var import_ChatStateContext = require("../context/ChatStateContext");
38
+ var import_ChatSenderStateContext = require("../context/ChatSenderStateContext");
39
+ var import_DefaultLayoutContext = require("../context/DefaultLayoutContext");
38
40
  var import_Sidebar = __toESM(require("./Sidebar"));
39
41
  var import_Messages = __toESM(require("./Messages"));
40
42
  var import_Welcome = __toESM(require("./Welcome"));
@@ -45,27 +47,43 @@ var DefaultLayout = ({
45
47
  showSessionList = false,
46
48
  header,
47
49
  footer,
48
- allowUpload = false,
49
- draggable = true,
50
+ allowUpload,
51
+ draggable,
50
52
  clearBtnShow = true,
51
53
  showFnCallDetail,
52
54
  renderFunctionCall,
53
55
  strategies
54
56
  }) => {
55
57
  const { appInfo, messages, prologue, suggestions } = (0, import_ChatStateContext.useChatState)();
58
+ const { allowUpload: providerAllowUpload, draggable: providerDraggable } = (0, import_ChatSenderStateContext.useChatSenderState)();
59
+ const mergedAllowUpload = allowUpload ?? providerAllowUpload;
60
+ const mergedDraggable = draggable ?? providerDraggable;
56
61
  const styles = (0, import_styles.useStyles)();
57
62
  const chatAreaRef = (0, import_react.useRef)(null);
58
63
  const senderRef = (0, import_react.useRef)(null);
59
64
  const [dropFileList, setDropFileList] = (0, import_react.useState)([]);
60
- const enableDragUpload = allowUpload && draggable;
61
- const handleDropFiles = (0, import_react.useCallback)((info) => {
65
+ const registerSender = (0, import_react.useCallback)((sender) => {
66
+ senderRef.current = sender;
67
+ }, []);
68
+ const layoutContextValue = (0, import_react.useMemo)(
69
+ () => ({ allowUpload: mergedAllowUpload, registerSender }),
70
+ [mergedAllowUpload, registerSender]
71
+ );
72
+ const enableDragUpload = mergedAllowUpload && mergedDraggable;
73
+ const handleFiles = (0, import_react.useCallback)((files) => {
62
74
  var _a;
63
- const rawFiles = info.fileList.map((f) => f.originFileObj).filter(Boolean);
64
- if (rawFiles.length > 0) {
65
- (_a = senderRef.current) == null ? void 0 : _a.addFiles(rawFiles);
75
+ if (files.length > 0) {
76
+ (_a = senderRef.current) == null ? void 0 : _a.addFiles(files);
66
77
  }
67
- setDropFileList([]);
68
78
  }, []);
79
+ const handleDropFiles = (0, import_react.useCallback)(
80
+ (info) => {
81
+ const rawFiles = info.fileList.map((f) => f.originFileObj).filter(Boolean);
82
+ handleFiles(rawFiles);
83
+ setDropFileList([]);
84
+ },
85
+ [handleFiles]
86
+ );
69
87
  const isEmpty = messages.length === 0 && !prologue && (!suggestions || suggestions.length === 0);
70
88
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
71
89
  "div",
@@ -196,15 +214,15 @@ var DefaultLayout = ({
196
214
  padding: isEmpty ? "0 24px" : "0",
197
215
  transition: "all 0.4s cubic-bezier(0.4, 0, 0.2, 1)"
198
216
  },
199
- children: footer || /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
217
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_DefaultLayoutContext.DefaultLayoutContext.Provider, { value: layoutContextValue, children: footer || /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
200
218
  import_Sender.default,
201
219
  {
202
220
  ref: senderRef,
203
- allowUpload,
204
- draggable: !enableDragUpload,
221
+ draggable: false,
222
+ onFileSelect: handleFiles,
205
223
  clearBtnShow
206
224
  }
207
- )
225
+ ) })
208
226
  }
209
227
  ),
210
228
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/components/XAdkProvider/compound/DefaultLayout.tsx"],
4
- "sourcesContent": ["import React, { useRef, useCallback, useState } from \"react\";\nimport { Attachments } from \"@ant-design/x\";\nimport type { UploadFile } from \"antd\";\nimport { useChatState } from \"../context/ChatStateContext\";\nimport Sidebar from \"./Sidebar\";\nimport Messages from \"./Messages\";\nimport Welcome from \"./Welcome\";\nimport Sender from \"./Sender\";\nimport { useStyles } from \"./styles\";\nimport type { ChatStrategies } from \"@/types\";\nimport type { XAdkSenderHandle } from \"@/types/XAdkSender\";\n\n/**\n * XAdkProvider 默认布局\n *\n * 提供类似 ChatGPT/DeepSeek 的默认布局:\n * - 左侧: 会话列表侧边栏 (可选,支持展开/收起)\n * - 右侧: 聊天区域 (标题 + 消息 + 输入框,居中显示,最大宽度800px)\n */\nexport interface DefaultLayoutProps {\n /** 是否显示会话列表 */\n showSessionList?: boolean;\n /** 自定义头部 */\n header?: React.ReactNode;\n /** 自定义底部 (替代默认 Sender) */\n footer?: React.ReactNode;\n /** 是否允许上传文件 */\n allowUpload?: boolean;\n /** 是否启用拖拽上传,拖拽区域为整个聊天区域(不含侧边栏),需 allowUpload 为 true */\n draggable?: boolean;\n /** 是否显示清空按钮 */\n clearBtnShow?: boolean;\n /** 是否显示函数调用详情 */\n showFnCallDetail?: boolean;\n /** 自定义消息 Footer */\n messagesFooter?: (msg: any) => React.ReactNode;\n /** 自定义工具调用渲染函数,返回 null 则降级使用默认渲染 */\n renderFunctionCall?: (\n msg: import(\"@/types\").IMessage,\n ) => React.ReactNode | null;\n /** 局部策略覆盖,优先级高于 Provider preset/strategies */\n strategies?: ChatStrategies;\n}\n\nconst DefaultLayout: React.FC<DefaultLayoutProps> = ({\n showSessionList = false,\n header,\n footer,\n allowUpload = false,\n draggable = true,\n clearBtnShow = true,\n showFnCallDetail,\n renderFunctionCall,\n strategies,\n}) => {\n const { appInfo, messages, prologue, suggestions } = useChatState();\n const styles = useStyles();\n const chatAreaRef = useRef<HTMLDivElement>(null);\n const senderRef = useRef<XAdkSenderHandle>(null);\n const [dropFileList, setDropFileList] = useState<UploadFile[]>([]);\n\n // 拖拽上传是否启用\n const enableDragUpload = allowUpload && draggable;\n\n // Attachments 拖拽文件后的回调\n const handleDropFiles = useCallback((info: { fileList: UploadFile[] }) => {\n const rawFiles = info.fileList\n .map((f) => f.originFileObj)\n .filter(Boolean) as File[];\n if (rawFiles.length > 0) {\n senderRef.current?.addFiles(rawFiles);\n }\n // 清空 Attachments 文件列表,避免累积\n setDropFileList([]);\n }, []);\n\n // 判断是否为空状态(展示Welcome)\n const isEmpty =\n messages.length === 0 &&\n !prologue &&\n (!suggestions || suggestions.length === 0);\n\n return (\n <div\n style={{\n display: \"flex\",\n height: \"100%\",\n width: \"100%\",\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n {/* 左侧会话列表 - XAiConversations 组件会处理展开/收起 */}\n {showSessionList && <Sidebar isNarrow={false} />}\n\n {/* 右侧聊天区域 - 使用 flex: 1 自动占据剩余空间 */}\n <div\n ref={chatAreaRef}\n style={{\n flex: 1,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n {/* 居中容器 - 最大宽度 800px */}\n <div\n style={{\n width: \"100%\",\n maxWidth: \"800px\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* 头部 */}\n {header ||\n (appInfo && (\n <div\n style={{\n padding: \"16px 24px\",\n display: \"flex\",\n justifyContent: \"center\",\n background: \"white\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {appInfo.appName && (\n <div>\n <div\n style={{\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#000\",\n }}\n >\n {appInfo.appName}\n </div>\n </div>\n )}\n </div>\n </div>\n ))}\n\n {/* 消息区域或Welcome区域 */}\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* 上方弹性占位 - Welcome状态时占据空间 */}\n <div\n style={{\n flex: isEmpty ? 1 : 0,\n transition: \"flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n\n {/* Welcome 组件 - 只在空状态显示 */}\n {isEmpty && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n padding: \"0 24px\",\n marginBottom: \"24px\",\n }}\n >\n <Welcome />\n </div>\n )}\n\n {/* Messages 组件 - 只在非空状态显示 */}\n {!isEmpty && (\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n <Messages\n showFnCallDetail={showFnCallDetail}\n renderFunctionCall={renderFunctionCall}\n strategies={strategies}\n />\n </div>\n )}\n {/* 输入区域 - 始终存在,通过样式控制位置 */}\n <div\n className={styles.sendWrapper}\n style={{\n maxWidth: isEmpty ? \"600px\" : \"100%\",\n alignSelf: \"center\",\n padding: isEmpty ? \"0 24px\" : \"0\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n >\n {footer || (\n <Sender\n ref={senderRef}\n allowUpload={allowUpload}\n draggable={!enableDragUpload}\n clearBtnShow={clearBtnShow}\n />\n )}\n </div>\n\n {/* 下方弹性占位 - Welcome状态时占据更多空间,让内容偏上 */}\n <div\n style={{\n flex: isEmpty ? 1.5 : 0,\n transition: \"flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n </div>\n </div>\n\n {/* Attachments 拖拽遮罩 - 仅用于拖拽上传功能 */}\n {enableDragUpload && (\n <Attachments\n style={{ display: \"none\" }}\n items={dropFileList}\n getDropContainer={() => chatAreaRef.current}\n multiple\n beforeUpload={() => false}\n onChange={handleDropFiles}\n />\n )}\n </div>\n </div>\n );\n};\n\nDefaultLayout.displayName = \"XAdkProvider.DefaultLayout\";\n\nexport default DefaultLayout;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React, { useRef, useCallback, useState, useMemo } from \"react\";\nimport { Attachments } from \"@ant-design/x\";\nimport type { UploadFile } from \"antd\";\nimport { useChatState } from \"../context/ChatStateContext\";\nimport { useChatSenderState } from \"../context/ChatSenderStateContext\";\nimport { DefaultLayoutContext } from \"../context/DefaultLayoutContext\";\nimport Sidebar from \"./Sidebar\";\nimport Messages from \"./Messages\";\nimport Welcome from \"./Welcome\";\nimport Sender from \"./Sender\";\nimport { useStyles } from \"./styles\";\nimport type { ChatStrategies } from \"@/types\";\nimport type { XAdkSenderHandle } from \"@/types/XAdkSender\";\n\n/**\n * XAdkProvider 默认布局\n *\n * 提供类似 ChatGPT/DeepSeek 的默认布局:\n * - 左侧: 会话列表侧边栏 (可选,支持展开/收起)\n * - 右侧: 聊天区域 (标题 + 消息 + 输入框,居中显示,最大宽度800px)\n */\nexport interface DefaultLayoutProps {\n /** 是否显示会话列表 */\n showSessionList?: boolean;\n /** 自定义头部 */\n header?: React.ReactNode;\n /** 自定义底部 (替代默认 Sender) */\n footer?: React.ReactNode;\n /**\n * 是否启用内置上传入口(上传按钮 + 隐藏 file input + 拖拽)。\n * 未传时继承 XAdkProvider config.allowUpload。\n * 内核 XAdkSender 不再内置上传逻辑,上传能力统一由 DefaultLayout 管理。\n * 业务方自定义 footer 时可自行控制上传。\n */\n allowUpload?: boolean;\n /** 是否启用拖拽上传;未传时继承 config.draggable */\n draggable?: boolean;\n /** 是否显示清空按钮 */\n clearBtnShow?: boolean;\n /** 是否显示函数调用详情 */\n showFnCallDetail?: boolean;\n /** 自定义消息 Footer */\n messagesFooter?: (msg: any) => React.ReactNode;\n /** 自定义工具调用渲染函数,返回 null 则降级使用默认渲染 */\n renderFunctionCall?: (\n msg: import(\"@/types\").IMessage,\n ) => React.ReactNode | null;\n /** 局部策略覆盖,优先级高于 Provider preset/strategies */\n strategies?: ChatStrategies;\n}\n\nconst DefaultLayout: React.FC<DefaultLayoutProps> = ({\n showSessionList = false,\n header,\n footer,\n allowUpload,\n draggable,\n clearBtnShow = true,\n showFnCallDetail,\n renderFunctionCall,\n strategies,\n}) => {\n const { appInfo, messages, prologue, suggestions } = useChatState();\n const { allowUpload: providerAllowUpload, draggable: providerDraggable } =\n useChatSenderState();\n // Layout props 用于局部覆盖;未传时继承 Provider config,保证 NPM 与 UMD 接入一致。\n const mergedAllowUpload = allowUpload ?? providerAllowUpload;\n const mergedDraggable = draggable ?? providerDraggable;\n const styles = useStyles();\n const chatAreaRef = useRef<HTMLDivElement>(null);\n const senderRef = useRef<XAdkSenderHandle>(null);\n const [dropFileList, setDropFileList] = useState<UploadFile[]>([]);\n const registerSender = useCallback((sender: XAdkSenderHandle | null) => {\n senderRef.current = sender;\n }, []);\n const layoutContextValue = useMemo(\n () => ({ allowUpload: mergedAllowUpload, registerSender }),\n [mergedAllowUpload, registerSender],\n );\n\n // 拖拽上传只有在上传能力开启时生效,避免关闭上传后仍响应文件拖入。\n const enableDragUpload = mergedAllowUpload && mergedDraggable;\n\n // 文件注入到 Sender(按钮点击 + 拖拽统一走这里)\n const handleFiles = useCallback((files: File[]) => {\n if (files.length > 0) {\n senderRef.current?.addFiles(files);\n }\n }, []);\n\n // Attachments 拖拽文件后的回调\n const handleDropFiles = useCallback(\n (info: { fileList: UploadFile[] }) => {\n const rawFiles = info.fileList\n .map((f) => f.originFileObj)\n .filter(Boolean) as File[];\n handleFiles(rawFiles);\n // 清空 Attachments 文件列表,避免累积\n setDropFileList([]);\n },\n [handleFiles],\n );\n\n // 判断是否为空状态(展示Welcome)\n const isEmpty =\n messages.length === 0 &&\n !prologue &&\n (!suggestions || suggestions.length === 0);\n\n return (\n <div\n style={{\n display: \"flex\",\n height: \"100%\",\n width: \"100%\",\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n {/* 左侧会话列表 - XAiConversations 组件会处理展开/收起 */}\n {showSessionList && <Sidebar isNarrow={false} />}\n\n {/* 右侧聊天区域 - 使用 flex: 1 自动占据剩余空间 */}\n <div\n ref={chatAreaRef}\n style={{\n flex: 1,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n {/* 居中容器 - 最大宽度 800px */}\n <div\n style={{\n width: \"100%\",\n maxWidth: \"800px\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* 头部 */}\n {header ||\n (appInfo && (\n <div\n style={{\n padding: \"16px 24px\",\n display: \"flex\",\n justifyContent: \"center\",\n background: \"white\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n }}\n >\n {appInfo.appName && (\n <div>\n <div\n style={{\n fontSize: \"16px\",\n fontWeight: 500,\n color: \"#000\",\n }}\n >\n {appInfo.appName}\n </div>\n </div>\n )}\n </div>\n </div>\n ))}\n\n {/* 消息区域或Welcome区域 */}\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {/* 上方弹性占位 - Welcome状态时占据空间 */}\n <div\n style={{\n flex: isEmpty ? 1 : 0,\n transition: \"flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n\n {/* Welcome 组件 - 只在空状态显示 */}\n {isEmpty && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n padding: \"0 24px\",\n marginBottom: \"24px\",\n }}\n >\n <Welcome />\n </div>\n )}\n\n {/* Messages 组件 - 只在非空状态显示 */}\n {!isEmpty && (\n <div\n style={{\n flex: 1,\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n <Messages\n showFnCallDetail={showFnCallDetail}\n renderFunctionCall={renderFunctionCall}\n strategies={strategies}\n />\n </div>\n )}\n {/* 输入区域 - 始终存在,通过样式控制位置 */}\n <div\n className={styles.sendWrapper}\n style={{\n maxWidth: isEmpty ? \"600px\" : \"100%\",\n alignSelf: \"center\",\n padding: isEmpty ? \"0 24px\" : \"0\",\n transition: \"all 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n >\n <DefaultLayoutContext.Provider value={layoutContextValue}>\n {footer || (\n <Sender\n ref={senderRef}\n draggable={false}\n onFileSelect={handleFiles}\n clearBtnShow={clearBtnShow}\n />\n )}\n </DefaultLayoutContext.Provider>\n </div>\n\n {/* 下方弹性占位 - Welcome状态时占据更多空间,让内容偏上 */}\n <div\n style={{\n flex: isEmpty ? 1.5 : 0,\n transition: \"flex 0.4s cubic-bezier(0.4, 0, 0.2, 1)\",\n }}\n />\n </div>\n </div>\n\n {/* Attachments 拖拽遮罩 - 仅用于拖拽上传功能 */}\n {enableDragUpload && (\n <Attachments\n style={{ display: \"none\" }}\n items={dropFileList}\n getDropContainer={() => chatAreaRef.current}\n multiple\n beforeUpload={() => false}\n onChange={handleDropFiles}\n />\n )}\n </div>\n </div>\n );\n};\n\nDefaultLayout.displayName = \"XAdkProvider.DefaultLayout\";\n\nexport default DefaultLayout;\n"],
5
+ "mappings": "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",
6
6
  "names": ["Sidebar", "Welcome", "Messages", "Sender"]
7
7
  }
@@ -10,14 +10,16 @@ import type { XAdkSenderProps, XAdkSenderHandle } from "../../../types";
10
10
  * ```tsx
11
11
  * <XAdkProvider url="..." token="...">
12
12
  * <XAdkProvider.Sender
13
- * allowUpload={true}
14
13
  * clearBtnShow={true}
14
+ * allowUpload
15
15
  * uploadRequest={myUploadHandler}
16
16
  * />
17
17
  * </XAdkProvider>
18
18
  * ```
19
19
  */
20
20
  export interface XAdkSenderCompoundProps extends Partial<Omit<XAdkSenderProps, "loading" | "onSubmit" | "onStop" | "onClear">> {
21
+ /** 是否显示内置上传按钮;未传时依次继承 DefaultLayout 与 Provider 配置。 */
22
+ allowUpload?: boolean;
21
23
  /** 额外的样式 */
22
24
  style?: React.CSSProperties;
23
25
  /** 额外的类名 */