@hkyhy/marsun-components-core 0.1.18 → 0.1.21

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 (200) hide show
  1. package/dist/components/AgentHub/Chat/Detail/ChatAgentFab/index.d.ts +24 -0
  2. package/dist/components/AgentHub/Chat/Detail/ChatAgentFab/index.js +95 -0
  3. package/dist/components/AgentHub/Chat/Detail/ChatAgentFab/index.js.map +1 -0
  4. package/dist/components/AgentHub/Chat/Detail/ChatAgentFab/style.module.scss.js +15 -0
  5. package/dist/components/AgentHub/Chat/Detail/ChatAgentFab/style.module.scss.js.map +1 -0
  6. package/dist/components/AgentHub/Chat/Detail/ChatAgentFabLayout/index.d.ts +16 -0
  7. package/dist/components/AgentHub/Chat/Detail/ChatAgentFabLayout/index.js +37 -0
  8. package/dist/components/AgentHub/Chat/Detail/ChatAgentFabLayout/index.js.map +1 -0
  9. package/dist/components/AgentHub/Chat/Detail/ChatAgentFabLayout/style.module.scss.js +9 -0
  10. package/dist/components/AgentHub/Chat/Detail/ChatAgentFabLayout/style.module.scss.js.map +1 -0
  11. package/dist/components/AgentHub/Chat/Detail/ChatFollowUpSuggestions/index.d.ts +14 -0
  12. package/dist/components/AgentHub/Chat/Detail/ChatFollowUpSuggestions/index.js +79 -0
  13. package/dist/components/AgentHub/Chat/Detail/ChatFollowUpSuggestions/index.js.map +1 -0
  14. package/dist/components/AgentHub/Chat/Detail/ChatFollowUpSuggestions/style.module.scss.js +18 -0
  15. package/dist/components/AgentHub/Chat/Detail/ChatFollowUpSuggestions/style.module.scss.js.map +1 -0
  16. package/dist/components/AgentHub/Chat/Detail/ChatInput/index.d.ts +2 -0
  17. package/dist/components/AgentHub/Chat/Detail/ChatInput/index.js +60 -49
  18. package/dist/components/AgentHub/Chat/Detail/ChatInput/index.js.map +1 -1
  19. package/dist/components/AgentHub/Chat/Detail/ChatInput/style.module.scss.js +7 -6
  20. package/dist/components/AgentHub/Chat/Detail/ChatInput/style.module.scss.js.map +1 -1
  21. package/dist/components/AgentHub/Chat/Detail/ChatPanel/index.d.ts +17 -4
  22. package/dist/components/AgentHub/Chat/Detail/ChatPanel/index.js +104 -68
  23. package/dist/components/AgentHub/Chat/Detail/ChatPanel/index.js.map +1 -1
  24. package/dist/components/AgentHub/Chat/Detail/ChatPanel/style.module.scss.js +13 -8
  25. package/dist/components/AgentHub/Chat/Detail/ChatPanel/style.module.scss.js.map +1 -1
  26. package/dist/components/AgentHub/Chat/Detail/ChatSuggestionRow/index.js +5 -4
  27. package/dist/components/AgentHub/Chat/Detail/ChatSuggestionRow/index.js.map +1 -1
  28. package/dist/components/AgentHub/Chat/Detail/ChatSuggestionRow/style.module.scss.js +2 -2
  29. package/dist/components/AgentHub/Chat/Detail/ChatWidgetBlock/ChatWidgetSparkline.d.ts +7 -0
  30. package/dist/components/AgentHub/Chat/Detail/ChatWidgetBlock/ChatWidgetSparkline.js +55 -0
  31. package/dist/components/AgentHub/Chat/Detail/ChatWidgetBlock/ChatWidgetSparkline.js.map +1 -0
  32. package/dist/components/AgentHub/Chat/Detail/ChatWidgetBlock/index.d.ts +10 -0
  33. package/dist/components/AgentHub/Chat/Detail/ChatWidgetBlock/index.js +120 -0
  34. package/dist/components/AgentHub/Chat/Detail/ChatWidgetBlock/index.js.map +1 -0
  35. package/dist/components/AgentHub/Chat/Detail/ChatWidgetBlock/style.module.scss.js +32 -0
  36. package/dist/components/AgentHub/Chat/Detail/ChatWidgetBlock/style.module.scss.js.map +1 -0
  37. package/dist/components/AgentHub/Chat/Detail/CitationContent/style.module.scss.js +2 -2
  38. package/dist/components/AgentHub/Chat/Detail/MessageItem/index.js +130 -114
  39. package/dist/components/AgentHub/Chat/Detail/MessageItem/index.js.map +1 -1
  40. package/dist/components/AgentHub/Chat/Detail/MessageItem/style.module.scss.js +20 -18
  41. package/dist/components/AgentHub/Chat/Detail/MessageItem/style.module.scss.js.map +1 -1
  42. package/dist/components/AgentHub/Chat/Detail/index.d.ts +8 -0
  43. package/dist/components/AgentHub/Chat/hooks/index.d.ts +2 -0
  44. package/dist/components/AgentHub/Chat/hooks/useCitationPanel.d.ts +11 -0
  45. package/dist/components/AgentHub/Chat/hooks/useCitationPanel.js +22 -0
  46. package/dist/components/AgentHub/Chat/hooks/useCitationPanel.js.map +1 -0
  47. package/dist/components/AgentHub/types.d.ts +21 -0
  48. package/dist/components/Auth/ProtectedRoute.js +20 -14
  49. package/dist/components/Auth/ProtectedRoute.js.map +1 -1
  50. package/dist/components/File/index.d.ts +2 -0
  51. package/dist/components/File/utils/download.d.ts +20 -0
  52. package/dist/components/File/utils/download.js +30 -0
  53. package/dist/components/File/utils/download.js.map +1 -0
  54. package/dist/components/Filter/FilterDateRange/index.d.ts +6 -1
  55. package/dist/components/Filter/FilterDateRange/index.js +84 -62
  56. package/dist/components/Filter/FilterDateRange/index.js.map +1 -1
  57. package/dist/components/Filter/types.d.ts +1 -0
  58. package/dist/components/Filter/types.js.map +1 -1
  59. package/dist/components/Icons/index.d.ts +3 -1
  60. package/dist/components/Icons/index.js +157 -151
  61. package/dist/components/Icons/index.js.map +1 -1
  62. package/dist/index.d.ts +14 -0
  63. package/dist/index.js +377 -298
  64. package/dist/index.js.map +1 -1
  65. package/dist/marsun-components-core.css +1 -1
  66. package/dist/node_modules/axios/index.js +41 -0
  67. package/dist/node_modules/axios/index.js.map +1 -0
  68. package/dist/node_modules/axios/lib/adapters/adapters.js +66 -0
  69. package/dist/node_modules/axios/lib/adapters/adapters.js.map +1 -0
  70. package/dist/node_modules/axios/lib/adapters/fetch.js +324 -0
  71. package/dist/node_modules/axios/lib/adapters/fetch.js.map +1 -0
  72. package/dist/node_modules/axios/lib/adapters/xhr.js +86 -0
  73. package/dist/node_modules/axios/lib/adapters/xhr.js.map +1 -0
  74. package/dist/node_modules/axios/lib/axios.js +47 -0
  75. package/dist/node_modules/axios/lib/axios.js.map +1 -0
  76. package/dist/node_modules/axios/lib/cancel/CancelToken.js +78 -0
  77. package/dist/node_modules/axios/lib/cancel/CancelToken.js.map +1 -0
  78. package/dist/node_modules/axios/lib/cancel/CanceledError.js +19 -0
  79. package/dist/node_modules/axios/lib/cancel/CanceledError.js.map +1 -0
  80. package/dist/node_modules/axios/lib/cancel/isCancel.js +7 -0
  81. package/dist/node_modules/axios/lib/cancel/isCancel.js.map +1 -0
  82. package/dist/node_modules/axios/lib/core/Axios.js +168 -0
  83. package/dist/node_modules/axios/lib/core/Axios.js.map +1 -0
  84. package/dist/node_modules/axios/lib/core/AxiosError.js +110 -0
  85. package/dist/node_modules/axios/lib/core/AxiosError.js.map +1 -0
  86. package/dist/node_modules/axios/lib/core/AxiosHeaders.js +193 -0
  87. package/dist/node_modules/axios/lib/core/AxiosHeaders.js.map +1 -0
  88. package/dist/node_modules/axios/lib/core/InterceptorManager.js +60 -0
  89. package/dist/node_modules/axios/lib/core/InterceptorManager.js.map +1 -0
  90. package/dist/node_modules/axios/lib/core/buildFullPath.js +30 -0
  91. package/dist/node_modules/axios/lib/core/buildFullPath.js.map +1 -0
  92. package/dist/node_modules/axios/lib/core/dispatchRequest.js +43 -0
  93. package/dist/node_modules/axios/lib/core/dispatchRequest.js.map +1 -0
  94. package/dist/node_modules/axios/lib/core/mergeConfig.js +94 -0
  95. package/dist/node_modules/axios/lib/core/mergeConfig.js.map +1 -0
  96. package/dist/node_modules/axios/lib/core/settle.js +15 -0
  97. package/dist/node_modules/axios/lib/core/settle.js.map +1 -0
  98. package/dist/node_modules/axios/lib/core/transformData.js +14 -0
  99. package/dist/node_modules/axios/lib/core/transformData.js.map +1 -0
  100. package/dist/node_modules/axios/lib/defaults/index.js +96 -0
  101. package/dist/node_modules/axios/lib/defaults/index.js.map +1 -0
  102. package/dist/node_modules/axios/lib/defaults/transitional.js +12 -0
  103. package/dist/node_modules/axios/lib/defaults/transitional.js.map +1 -0
  104. package/dist/node_modules/axios/lib/env/data.js +5 -0
  105. package/dist/node_modules/axios/lib/env/data.js.map +1 -0
  106. package/dist/node_modules/axios/lib/helpers/AxiosURLSearchParams.js +31 -0
  107. package/dist/node_modules/axios/lib/helpers/AxiosURLSearchParams.js.map +1 -0
  108. package/dist/node_modules/axios/lib/helpers/HttpStatusCode.js +78 -0
  109. package/dist/node_modules/axios/lib/helpers/HttpStatusCode.js.map +1 -0
  110. package/dist/node_modules/axios/lib/helpers/bind.js +9 -0
  111. package/dist/node_modules/axios/lib/helpers/bind.js.map +1 -0
  112. package/dist/node_modules/axios/lib/helpers/buildURL.js +24 -0
  113. package/dist/node_modules/axios/lib/helpers/buildURL.js.map +1 -0
  114. package/dist/node_modules/axios/lib/helpers/combineURLs.js +7 -0
  115. package/dist/node_modules/axios/lib/helpers/combineURLs.js.map +1 -0
  116. package/dist/node_modules/axios/lib/helpers/composeSignals.js +33 -0
  117. package/dist/node_modules/axios/lib/helpers/composeSignals.js.map +1 -0
  118. package/dist/node_modules/axios/lib/helpers/cookies.js +44 -0
  119. package/dist/node_modules/axios/lib/helpers/cookies.js.map +1 -0
  120. package/dist/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +43 -0
  121. package/dist/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js.map +1 -0
  122. package/dist/node_modules/axios/lib/helpers/formDataToJSON.js +47 -0
  123. package/dist/node_modules/axios/lib/helpers/formDataToJSON.js.map +1 -0
  124. package/dist/node_modules/axios/lib/helpers/isAbsoluteURL.js +7 -0
  125. package/dist/node_modules/axios/lib/helpers/isAbsoluteURL.js.map +1 -0
  126. package/dist/node_modules/axios/lib/helpers/isAxiosError.js +8 -0
  127. package/dist/node_modules/axios/lib/helpers/isAxiosError.js.map +1 -0
  128. package/dist/node_modules/axios/lib/helpers/isURLSameOrigin.js +9 -0
  129. package/dist/node_modules/axios/lib/helpers/isURLSameOrigin.js.map +1 -0
  130. package/dist/node_modules/axios/lib/helpers/null.js +5 -0
  131. package/dist/node_modules/axios/lib/helpers/null.js.map +1 -0
  132. package/dist/node_modules/axios/lib/helpers/parseHeaders.js +31 -0
  133. package/dist/node_modules/axios/lib/helpers/parseHeaders.js.map +1 -0
  134. package/dist/node_modules/axios/lib/helpers/parseProtocol.js +8 -0
  135. package/dist/node_modules/axios/lib/helpers/parseProtocol.js.map +1 -0
  136. package/dist/node_modules/axios/lib/helpers/progressEventReducer.js +41 -0
  137. package/dist/node_modules/axios/lib/helpers/progressEventReducer.js.map +1 -0
  138. package/dist/node_modules/axios/lib/helpers/resolveConfig.js +54 -0
  139. package/dist/node_modules/axios/lib/helpers/resolveConfig.js.map +1 -0
  140. package/dist/node_modules/axios/lib/helpers/sanitizeHeaderValue.js +34 -0
  141. package/dist/node_modules/axios/lib/helpers/sanitizeHeaderValue.js.map +1 -0
  142. package/dist/node_modules/axios/lib/helpers/speedometer.js +20 -0
  143. package/dist/node_modules/axios/lib/helpers/speedometer.js.map +1 -0
  144. package/dist/node_modules/axios/lib/helpers/spread.js +9 -0
  145. package/dist/node_modules/axios/lib/helpers/spread.js.map +1 -0
  146. package/dist/node_modules/axios/lib/helpers/throttle.js +16 -0
  147. package/dist/node_modules/axios/lib/helpers/throttle.js.map +1 -0
  148. package/dist/node_modules/axios/lib/helpers/toFormData.js +115 -0
  149. package/dist/node_modules/axios/lib/helpers/toFormData.js.map +1 -0
  150. package/dist/node_modules/axios/lib/helpers/toURLEncodedForm.js +15 -0
  151. package/dist/node_modules/axios/lib/helpers/toURLEncodedForm.js.map +1 -0
  152. package/dist/node_modules/axios/lib/helpers/trackStream.js +67 -0
  153. package/dist/node_modules/axios/lib/helpers/trackStream.js.map +1 -0
  154. package/dist/node_modules/axios/lib/helpers/validator.js +58 -0
  155. package/dist/node_modules/axios/lib/helpers/validator.js.map +1 -0
  156. package/dist/node_modules/axios/lib/platform/browser/classes/Blob.js +5 -0
  157. package/dist/node_modules/axios/lib/platform/browser/classes/Blob.js.map +1 -0
  158. package/dist/node_modules/axios/lib/platform/browser/classes/FormData.js +5 -0
  159. package/dist/node_modules/axios/lib/platform/browser/classes/FormData.js.map +1 -0
  160. package/dist/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js +6 -0
  161. package/dist/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js.map +1 -0
  162. package/dist/node_modules/axios/lib/platform/browser/index.js +16 -0
  163. package/dist/node_modules/axios/lib/platform/browser/index.js.map +1 -0
  164. package/dist/node_modules/axios/lib/platform/common/utils.js +10 -0
  165. package/dist/node_modules/axios/lib/platform/common/utils.js.map +1 -0
  166. package/dist/node_modules/axios/lib/platform/index.js +10 -0
  167. package/dist/node_modules/axios/lib/platform/index.js.map +1 -0
  168. package/dist/node_modules/axios/lib/utils.js +303 -0
  169. package/dist/node_modules/axios/lib/utils.js.map +1 -0
  170. package/dist/styles/global.css +1 -1
  171. package/dist/types/auth.d.ts +18 -0
  172. package/dist/utils/authRedirect.d.ts +6 -0
  173. package/dist/utils/authRedirect.js +33 -0
  174. package/dist/utils/authRedirect.js.map +1 -0
  175. package/dist/utils/createMarsunRequest.d.ts +26 -0
  176. package/dist/utils/createMarsunRequest.js +53 -0
  177. package/dist/utils/createMarsunRequest.js.map +1 -0
  178. package/dist/utils/date.d.ts +16 -0
  179. package/dist/utils/date.js +36 -0
  180. package/dist/utils/date.js.map +1 -0
  181. package/dist/utils/department/departmentPath.d.ts +18 -0
  182. package/dist/utils/department/departmentPath.js +63 -0
  183. package/dist/utils/department/departmentPath.js.map +1 -0
  184. package/dist/utils/department/departmentScope.d.ts +20 -0
  185. package/dist/utils/department/departmentScope.js +63 -0
  186. package/dist/utils/department/departmentScope.js.map +1 -0
  187. package/dist/utils/department/types.d.ts +12 -0
  188. package/dist/utils/permissionStorage.d.ts +13 -0
  189. package/dist/utils/permissionStorage.js +43 -0
  190. package/dist/utils/permissionStorage.js.map +1 -0
  191. package/dist/utils/personOption.d.ts +49 -0
  192. package/dist/utils/personOption.js +90 -0
  193. package/dist/utils/personOption.js.map +1 -0
  194. package/dist/utils/sessionActivity.d.ts +5 -0
  195. package/dist/utils/sessionActivity.js +18 -0
  196. package/dist/utils/sessionActivity.js.map +1 -0
  197. package/dist/utils/user/employeeId.d.ts +8 -0
  198. package/dist/utils/user/employeeId.js +14 -0
  199. package/dist/utils/user/employeeId.js.map +1 -0
  200. package/package.json +26 -1
@@ -1,109 +1,113 @@
1
- import { jsx as a, jsxs as r, Fragment as te } from "react/jsx-runtime";
2
- import { User as se, Bot as ne, BookOpen as ie } from "../../../../Icons/index.js";
3
- import { message as U, Avatar as ae, Typography as oe } from "antd";
4
- import n from "classnames";
5
- import { useState as w, useMemo as l, useEffect as I, useCallback as d } from "react";
6
- import me from "../CitationMarkdownContent/index.js";
7
- import re, { createUserMessageActions as ce, createAssistantMessageActions as ge } from "../MessageActions/index.js";
8
- import le from "../ThinkingSection/index.js";
1
+ import { jsx as a, jsxs as m, Fragment as ie } from "react/jsx-runtime";
2
+ import { User as ne, Bot as ae, BookOpen as oe } from "../../../../Icons/index.js";
3
+ import re from "../ChatWidgetBlock/index.js";
4
+ import { message as U, Avatar as me, Typography as ce } from "antd";
5
+ import i from "classnames";
6
+ import { useState as b, useMemo as c, useEffect as D, useCallback as d } from "react";
7
+ import ge from "../CitationMarkdownContent/index.js";
8
+ import le, { createUserMessageActions as de, createAssistantMessageActions as ue } from "../MessageActions/index.js";
9
+ import he from "../ThinkingSection/index.js";
9
10
  import s from "./style.module.scss.js";
10
- import { parseAssistantContent as de, normalizeDisplayText as D } from "../../utils/messageContent.js";
11
- import { useTypewriter as F } from "../../hooks/useTypewriter.js";
12
- import { countUniqueCitedSources as ue } from "../../utils/citationContent.js";
13
- const { Text: he } = oe, Se = ({
11
+ import { parseAssistantContent as pe, normalizeDisplayText as F } from "../../utils/messageContent.js";
12
+ import { useTypewriter as M } from "../../hooks/useTypewriter.js";
13
+ import { countUniqueCitedSources as fe } from "../../utils/citationContent.js";
14
+ const { Text: ke } = ce, Le = ({
14
15
  message: e,
15
- onCitationClick: c,
16
+ onCitationClick: g,
16
17
  onTypingChange: u,
17
- onEditMessage: g,
18
- onResendMessage: B,
18
+ onEditMessage: l,
19
+ onResendMessage: L,
19
20
  onMessageFeedback: v,
20
- editDisabled: M,
21
+ editDisabled: G,
21
22
  feedbackDisabled: T
22
23
  }) => {
23
- const i = e.role === "user", [L, h] = w(!1), [N, p] = w(e.content), [x, P] = w(!1), [C, A] = w(e.thumbup), t = l(
24
- () => de(e.content, !!e.streaming),
24
+ const n = e.role === "user", [P, h] = b(!1), [N, p] = b(e.content), [x, V] = b(!1), [A, C] = b(e.thumbup), t = c(
25
+ () => pe(e.content, !!e.streaming),
25
26
  [e.content, e.streaming]
26
- ), G = !!e.streaming && t.isThinking, { displayed: H, isTyping: J } = F(
27
+ ), H = !!e.streaming && t.isThinking, { displayed: J, isTyping: K } = M(
27
28
  t.thinking,
28
- G
29
- ), K = t.isThinking ? H : t.thinking, { displayed: V, isTyping: f } = F(
29
+ H
30
+ ), Q = t.isThinking ? J : t.thinking, { displayed: W, isTyping: f } = M(
30
31
  t.answer,
31
32
  !!e.streaming
32
- ), m = l(() => e.citations ?? [], [e.citations]), y = l(
33
+ ), r = c(() => e.citations ?? [], [e.citations]), j = c(
34
+ () => Array.isArray(e.widgets) ? e.widgets : [],
35
+ [e.widgets]
36
+ ), k = c(
33
37
  () => `${t.thinking}
34
38
  ${t.answer}`,
35
39
  [t.thinking, t.answer]
36
- ), b = l(
37
- () => ue(y, m.length),
38
- [y, m.length]
39
- ), Q = l(() => m.length === 0 ? "" : b > 0 && b < m.length ? `检索 ${m.length} 个来源 · 正文引用 ${b} 处` : `引用了 ${m.length} 个来源`, [m.length, b]), k = t.isThinking && J;
40
- I(() => {
41
- i || u == null || u(f || k);
42
- }, [i, f, k, u]), I(() => {
43
- A(e.thumbup);
40
+ ), w = c(
41
+ () => fe(k, r.length),
42
+ [k, r.length]
43
+ ), R = c(() => r.length === 0 ? "" : w > 0 && w < r.length ? `检索 ${r.length} 个来源 · 正文引用 ${w} 处` : `引用了 ${r.length} 个来源`, [r.length, w]), y = t.isThinking && K;
44
+ D(() => {
45
+ n || u == null || u(f || y);
46
+ }, [n, f, y, u]), D(() => {
47
+ C(e.thumbup);
44
48
  }, [e.id, e.thumbup]);
45
- const S = D(V).trim().length > 0, R = (e.streaming || f) && S, O = f || k, j = !!e.streaming || O, W = d(() => {
46
- !m.length || !c || c(m);
47
- }, [m, c]), q = d(async (o) => {
49
+ const S = F(W).trim().length > 0, B = !n && j.length > 0, X = (e.streaming || f) && S, O = f || y, q = !!e.streaming || O, Y = d(() => {
50
+ !r.length || !g || g(r);
51
+ }, [r, g]), z = d(async (o) => {
48
52
  if (o.trim())
49
53
  try {
50
54
  await navigator.clipboard.writeText(o), U.success("已复制");
51
55
  } catch {
52
56
  U.error("复制失败");
53
57
  }
54
- }, []), z = D(t.answer), X = !i && !e.streaming && !O && z.trim().length > 0, Y = d(() => {
58
+ }, []), E = F(t.answer), Z = !n && !e.streaming && !O && E.trim().length > 0, _ = d(() => {
55
59
  h(!1), p(e.content);
56
- }, [e.content]), Z = d(() => {
60
+ }, [e.content]), $ = d(() => {
57
61
  const o = N.trim();
58
- !o || o === e.content.trim() || !g || (g(e.id, o), h(!1));
59
- }, [N, e.content, e.id, g]), E = d(
62
+ !o || o === e.content.trim() || !l || (l(e.id, o), h(!1));
63
+ }, [N, e.content, e.id, l]), I = d(
60
64
  async (o) => {
61
- if (!(x || T) && C !== o) {
65
+ if (!(x || T) && A !== o) {
62
66
  if (v) {
63
- P(!0);
67
+ V(!0);
64
68
  try {
65
- await v(e.id, o), A(o);
69
+ await v(e.id, o), C(o);
66
70
  } catch {
67
71
  } finally {
68
- P(!1);
72
+ V(!1);
69
73
  }
70
74
  return;
71
75
  }
72
- A(o), U.success("感谢反馈");
76
+ C(o), U.success("感谢反馈");
73
77
  }
74
78
  },
75
- [T, x, C, e.id, v]
76
- ), _ = i ? ce({
77
- onEdit: g ? () => {
79
+ [T, x, A, e.id, v]
80
+ ), ee = n ? de({
81
+ onEdit: l ? () => {
78
82
  p(e.content), h(!0);
79
83
  } : void 0,
80
- onCopy: () => q(e.content),
81
- onResend: B ? () => B(e.content) : void 0,
82
- editDisabled: M
83
- }) : ge({
84
+ onCopy: () => z(e.content),
85
+ onResend: L ? () => L(e.content) : void 0,
86
+ editDisabled: G
87
+ }) : ue({
84
88
  onLike: () => {
85
- E(!0);
89
+ I(!0);
86
90
  },
87
91
  onDislike: () => {
88
- E(!1);
92
+ I(!1);
89
93
  },
90
- onCopy: () => q(z),
91
- thumbup: C,
94
+ onCopy: () => z(E),
95
+ thumbup: A,
92
96
  feedbackDisabled: T || x
93
- }), $ = g ? {
94
- open: L,
97
+ }), te = l ? {
98
+ open: P,
95
99
  value: N,
96
100
  originalContent: e.content,
97
101
  onOpenChange: (o) => {
98
102
  h(o), o || p(e.content);
99
103
  },
100
104
  onChange: p,
101
- onConfirm: Z,
102
- onCancel: Y
103
- } : void 0, ee = /* @__PURE__ */ a(
105
+ onConfirm: $,
106
+ onCancel: _
107
+ } : void 0, se = /* @__PURE__ */ a(
104
108
  "div",
105
109
  {
106
- className: n(
110
+ className: i(
107
111
  "message-item-message-user-bubble",
108
112
  s["message-item-message-user-bubble"],
109
113
  "bg-primary"
@@ -111,7 +115,7 @@ ${t.answer}`,
111
115
  children: /* @__PURE__ */ a(
112
116
  "span",
113
117
  {
114
- className: n(
118
+ className: i(
115
119
  "message-item-message-user-bubble-text",
116
120
  s["message-item-message-user-bubble-text"]
117
121
  ),
@@ -120,41 +124,41 @@ ${t.answer}`,
120
124
  )
121
125
  }
122
126
  );
123
- return /* @__PURE__ */ r(
127
+ return /* @__PURE__ */ m(
124
128
  "div",
125
129
  {
126
- className: n(
130
+ className: i(
127
131
  "group",
128
132
  "message-row",
129
133
  s["message-item-message-row"],
130
- i && "message-item-message-row-reverse",
131
- i && s["message-item-message-row-reverse"]
134
+ n && "message-item-message-row-reverse",
135
+ n && s["message-item-message-row-reverse"]
132
136
  ),
133
137
  children: [
134
138
  /* @__PURE__ */ a(
135
- ae,
139
+ me,
136
140
  {
137
141
  size: 34,
138
- icon: i ? /* @__PURE__ */ a(se, {}) : /* @__PURE__ */ a(ne, {}),
139
- className: n(
142
+ icon: n ? /* @__PURE__ */ a(ne, {}) : /* @__PURE__ */ a(ae, {}),
143
+ className: i(
140
144
  "message-item-message-avatar",
141
145
  s["message-item-message-avatar"],
142
- !i && "message-item-message-avatar-assistant",
143
- !i && s["message-item-message-avatar-assistant"]
146
+ !n && "message-item-message-avatar-assistant",
147
+ !n && s["message-item-message-avatar-assistant"]
144
148
  ),
145
- style: i ? {} : { color: "var(--primary-color)" }
149
+ style: n ? {} : { color: "var(--primary-color)" }
146
150
  }
147
151
  ),
148
- /* @__PURE__ */ r(
152
+ /* @__PURE__ */ m(
149
153
  "div",
150
154
  {
151
- className: n(
155
+ className: i(
152
156
  "message-item-message-content",
153
157
  s["message-item-message-content"],
154
- i ? n(
158
+ n ? i(
155
159
  "message-item-message-content-user",
156
160
  s["message-item-message-content-user"]
157
- ) : n(
161
+ ) : i(
158
162
  "message-item-message-content-assistant",
159
163
  s["message-item-message-content-assistant"]
160
164
  )
@@ -163,14 +167,14 @@ ${t.answer}`,
163
167
  /* @__PURE__ */ a(
164
168
  "div",
165
169
  {
166
- className: i ? void 0 : n(
170
+ className: n ? void 0 : i(
167
171
  "message-item-message-assistant-bubble",
168
172
  s["message-item-message-assistant-bubble"]
169
173
  ),
170
- children: i ? ee : e.streaming && !t.thinking && !t.isThinking && !S ? /* @__PURE__ */ r(
174
+ children: n ? se : e.streaming && !t.thinking && !t.isThinking && !S && !B ? /* @__PURE__ */ m(
171
175
  "div",
172
176
  {
173
- className: n(
177
+ className: i(
174
178
  "message-item-message-loading-dots",
175
179
  s["message-item-message-loading-dots"]
176
180
  ),
@@ -178,7 +182,7 @@ ${t.answer}`,
178
182
  /* @__PURE__ */ a(
179
183
  "span",
180
184
  {
181
- className: n(
185
+ className: i(
182
186
  "message-item-message-loading-dot",
183
187
  s["message-item-message-loading-dot"]
184
188
  )
@@ -187,7 +191,7 @@ ${t.answer}`,
187
191
  /* @__PURE__ */ a(
188
192
  "span",
189
193
  {
190
- className: n(
194
+ className: i(
191
195
  "message-item-message-loading-dot",
192
196
  s["message-item-message-loading-dot"]
193
197
  )
@@ -196,7 +200,7 @@ ${t.answer}`,
196
200
  /* @__PURE__ */ a(
197
201
  "span",
198
202
  {
199
- className: n(
203
+ className: i(
200
204
  "message-item-message-loading-dot",
201
205
  s["message-item-message-loading-dot"]
202
206
  )
@@ -204,44 +208,56 @@ ${t.answer}`,
204
208
  )
205
209
  ]
206
210
  }
207
- ) : /* @__PURE__ */ r(te, { children: [
211
+ ) : /* @__PURE__ */ m(ie, { children: [
208
212
  (t.thinking || t.isThinking) && /* @__PURE__ */ a(
209
- le,
213
+ he,
210
214
  {
211
- thinking: K,
215
+ thinking: Q,
212
216
  isThinking: t.isThinking,
213
- isTyping: k,
214
- citations: m,
215
- citationSourceContent: y,
216
- onCitationClick: c,
217
- deferMermaid: j
217
+ isTyping: y,
218
+ citations: r,
219
+ citationSourceContent: k,
220
+ onCitationClick: g,
221
+ deferMermaid: q
218
222
  }
219
223
  ),
220
- S && /* @__PURE__ */ r(
224
+ B ? /* @__PURE__ */ a(
225
+ re,
226
+ {
227
+ widgets: j,
228
+ compact: !0,
229
+ leading: !0,
230
+ className: i(
231
+ (t.thinking || t.isThinking) && s["message-item-message-widgets-after-thinking"]
232
+ )
233
+ }
234
+ ) : null,
235
+ S && /* @__PURE__ */ m(
221
236
  "div",
222
237
  {
223
- className: n(
238
+ className: i(
224
239
  "markdown-preview",
225
240
  "message-answer-markdown",
226
241
  s["message-item-message-answer-markdown"],
227
242
  (t.thinking || t.isThinking) && "message-answer-markdown-spaced",
228
- (t.thinking || t.isThinking) && s["message-item-message-answer-markdown-spaced"]
243
+ (t.thinking || t.isThinking) && s["message-item-message-answer-markdown-spaced"],
244
+ B && s["message-item-message-answer-markdown-after-widgets"]
229
245
  ),
230
246
  children: [
231
247
  /* @__PURE__ */ a(
232
- me,
248
+ ge,
233
249
  {
234
- content: V,
235
- citations: m,
236
- citationSourceContent: y,
237
- onCitationClick: c,
238
- deferMermaid: j
250
+ content: W,
251
+ citations: r,
252
+ citationSourceContent: k,
253
+ onCitationClick: g,
254
+ deferMermaid: q
239
255
  }
240
256
  ),
241
- R && /* @__PURE__ */ a(
257
+ X && /* @__PURE__ */ a(
242
258
  "span",
243
259
  {
244
- className: n(
260
+ className: i(
245
261
  "message-item-message-typing-cursor",
246
262
  s["message-item-message-typing-cursor"]
247
263
  )
@@ -253,29 +269,29 @@ ${t.answer}`,
253
269
  ] })
254
270
  }
255
271
  ),
256
- (i || X) && /* @__PURE__ */ a(
257
- re,
272
+ (n || Z) && /* @__PURE__ */ a(
273
+ le,
258
274
  {
259
- items: _,
260
- align: i ? "right" : "left",
261
- editPopover: $,
262
- actionsVisible: L
275
+ items: ee,
276
+ align: n ? "right" : "left",
277
+ editPopover: te,
278
+ actionsVisible: P
263
279
  }
264
280
  ),
265
- !i && m.length > 0 && !O && /* @__PURE__ */ r(
281
+ !n && r.length > 0 && !O && /* @__PURE__ */ m(
266
282
  "button",
267
283
  {
268
284
  type: "button",
269
- onClick: W,
270
- className: n(
285
+ onClick: Y,
286
+ className: i(
271
287
  "message-item-citation-summary-button",
272
288
  s["message-item-citation-summary-button"]
273
289
  ),
274
290
  children: [
275
291
  /* @__PURE__ */ a(
276
- ie,
292
+ oe,
277
293
  {
278
- className: n(
294
+ className: i(
279
295
  "text-primary",
280
296
  "citation-summary-icon",
281
297
  s["message-item-citation-summary-icon"]
@@ -283,14 +299,14 @@ ${t.answer}`,
283
299
  }
284
300
  ),
285
301
  /* @__PURE__ */ a(
286
- he,
302
+ ke,
287
303
  {
288
- className: n(
304
+ className: i(
289
305
  "text-primary",
290
306
  "citation-summary-text",
291
307
  s["message-item-citation-summary-text"]
292
308
  ),
293
- children: Q
309
+ children: R
294
310
  }
295
311
  )
296
312
  ]
@@ -304,6 +320,6 @@ ${t.answer}`,
304
320
  );
305
321
  };
306
322
  export {
307
- Se as default
323
+ Le as default
308
324
  };
309
325
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../src/components/AgentHub/Chat/Detail/MessageItem/index.tsx"],"sourcesContent":["import { BookOpen, Bot, User } from '@/components/Icons';\nimport type { ChatMessage, Citation } from '@/components/AgentHub/types';\nimport { message as antdMessage, Avatar, Typography } from 'antd';\nimport classNames from 'classnames';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTypewriter } from '../../hooks';\nimport { countUniqueCitedSources, normalizeDisplayText, parseAssistantContent } from '../../utils';\nimport CitationMarkdownContent from '../CitationMarkdownContent';\nimport MessageActions, {\n createAssistantMessageActions,\n createUserMessageActions,\n} from '../MessageActions';\nimport ThinkingSection from '../ThinkingSection';\nimport styles from './style.module.scss';\n\nconst { Text } = Typography;\n\nexport interface MessageItemProps {\n message: ChatMessage;\n onCitationClick?: (citations: Citation[], index?: number) => void;\n onTypingChange?: (typing: boolean) => void;\n onEditMessage?: (messageId: string, content: string) => void;\n onResendMessage?: (content: string) => void;\n onMessageFeedback?: (messageId: string, thumbup: boolean) => void | Promise<void>;\n editDisabled?: boolean;\n feedbackDisabled?: boolean;\n}\n\nconst MessageItem: React.FC<MessageItemProps> = ({\n message,\n onCitationClick,\n onTypingChange,\n onEditMessage,\n onResendMessage,\n onMessageFeedback,\n editDisabled,\n feedbackDisabled,\n}) => {\n const isUser = message.role === 'user';\n const [editOpen, setEditOpen] = useState(false);\n const [editValue, setEditValue] = useState(message.content);\n const [feedbackSubmitting, setFeedbackSubmitting] = useState(false);\n const [localThumbup, setLocalThumbup] = useState<boolean | null | undefined>(message.thumbup);\n const parsedContent = useMemo(\n () => parseAssistantContent(message.content, !!message.streaming),\n [message.content, message.streaming],\n );\n\n const shouldAnimateThinking = !!message.streaming && parsedContent.isThinking;\n const { displayed: displayedThinking, isTyping: isThinkingTyping } = useTypewriter(\n parsedContent.thinking,\n shouldAnimateThinking,\n );\n const thinkingToShow = parsedContent.isThinking ? displayedThinking : parsedContent.thinking;\n\n const { displayed: displayedContent, isTyping } = useTypewriter(\n parsedContent.answer,\n !!message.streaming,\n );\n\n const citations = useMemo(() => message.citations ?? [], [message.citations]);\n const citationSourceContent = useMemo(\n () => `${parsedContent.thinking}\\n${parsedContent.answer}`,\n [parsedContent.thinking, parsedContent.answer],\n );\n const uniqueCitedCount = useMemo(\n () => countUniqueCitedSources(citationSourceContent, citations.length),\n [citationSourceContent, citations.length],\n );\n\n const citationSummaryLabel = useMemo(() => {\n if (citations.length === 0) return '';\n if (uniqueCitedCount > 0 && uniqueCitedCount < citations.length) {\n return `检索 ${citations.length} 个来源 · 正文引用 ${uniqueCitedCount} 处`;\n }\n return `引用了 ${citations.length} 个来源`;\n }, [citations.length, uniqueCitedCount]);\n\n const effectiveThinkingTyping = parsedContent.isThinking && isThinkingTyping;\n\n useEffect(() => {\n if (isUser) return;\n onTypingChange?.(isTyping || effectiveThinkingTyping);\n }, [isUser, isTyping, effectiveThinkingTyping, onTypingChange]);\n\n useEffect(() => {\n setLocalThumbup(message.thumbup);\n }, [message.id, message.thumbup]);\n\n const hasAnswerContent = normalizeDisplayText(displayedContent).trim().length > 0;\n const showAnswerCursor = (message.streaming || isTyping) && hasAnswerContent;\n const isContentTyping = isTyping || effectiveThinkingTyping;\n const deferMermaid = !!message.streaming || isContentTyping;\n\n const handleSummaryClick = useCallback(() => {\n if (!citations.length || !onCitationClick) return;\n onCitationClick(citations);\n }, [citations, onCitationClick]);\n\n const copyText = useCallback(async (text: string) => {\n if (!text.trim()) return;\n try {\n await navigator.clipboard.writeText(text);\n antdMessage.success('已复制');\n } catch {\n antdMessage.error('复制失败');\n }\n }, []);\n\n const assistantCopyText = normalizeDisplayText(parsedContent.answer);\n const showAssistantActions =\n !isUser && !message.streaming && !isContentTyping && assistantCopyText.trim().length > 0;\n\n const handleEditCancel = useCallback(() => {\n setEditOpen(false);\n setEditValue(message.content);\n }, [message.content]);\n\n const handleEditConfirm = useCallback(() => {\n const trimmed = editValue.trim();\n if (!trimmed || trimmed === message.content.trim() || !onEditMessage) return;\n onEditMessage(message.id, trimmed);\n setEditOpen(false);\n }, [editValue, message.content, message.id, onEditMessage]);\n\n const handleFeedback = useCallback(\n async (thumbup: boolean) => {\n if (feedbackSubmitting || feedbackDisabled) return;\n if (localThumbup === thumbup) return;\n\n if (onMessageFeedback) {\n setFeedbackSubmitting(true);\n try {\n await onMessageFeedback(message.id, thumbup);\n setLocalThumbup(thumbup);\n } catch {\n // 错误提示由上层处理\n } finally {\n setFeedbackSubmitting(false);\n }\n return;\n }\n\n setLocalThumbup(thumbup);\n antdMessage.success('感谢反馈');\n },\n [feedbackDisabled, feedbackSubmitting, localThumbup, message.id, onMessageFeedback],\n );\n\n const actionItems = isUser\n ? createUserMessageActions({\n onEdit: onEditMessage\n ? () => {\n setEditValue(message.content);\n setEditOpen(true);\n }\n : undefined,\n onCopy: () => copyText(message.content),\n onResend: onResendMessage ? () => onResendMessage(message.content) : undefined,\n editDisabled,\n })\n : createAssistantMessageActions({\n onLike: () => {\n void handleFeedback(true);\n },\n onDislike: () => {\n void handleFeedback(false);\n },\n onCopy: () => copyText(assistantCopyText),\n thumbup: localThumbup,\n feedbackDisabled: feedbackDisabled || feedbackSubmitting,\n });\n\n const editPopoverProps = onEditMessage\n ? {\n open: editOpen,\n value: editValue,\n originalContent: message.content,\n onOpenChange: (open: boolean) => {\n setEditOpen(open);\n if (!open) setEditValue(message.content);\n },\n onChange: setEditValue,\n onConfirm: handleEditConfirm,\n onCancel: handleEditCancel,\n }\n : undefined;\n\n const userMessageBubble = (\n <div\n className={classNames(\n 'message-item-message-user-bubble',\n styles['message-item-message-user-bubble'],\n 'bg-primary',\n )}\n >\n <span\n className={classNames(\n 'message-item-message-user-bubble-text',\n styles['message-item-message-user-bubble-text'],\n )}\n >\n {message.content}\n </span>\n </div>\n );\n\n return (\n <div\n className={classNames(\n 'group',\n 'message-row',\n styles['message-item-message-row'],\n isUser && 'message-item-message-row-reverse',\n isUser && styles['message-item-message-row-reverse'],\n )}\n >\n <Avatar\n size={34}\n icon={isUser ? <User /> : <Bot />}\n className={classNames(\n 'message-item-message-avatar',\n styles['message-item-message-avatar'],\n !isUser && 'message-item-message-avatar-assistant',\n !isUser && styles['message-item-message-avatar-assistant'],\n )}\n style={isUser ? {} : { color: 'var(--primary-color)' }}\n />\n\n <div\n className={classNames(\n 'message-item-message-content',\n styles['message-item-message-content'],\n isUser\n ? classNames(\n 'message-item-message-content-user',\n styles['message-item-message-content-user'],\n )\n : classNames(\n 'message-item-message-content-assistant',\n styles['message-item-message-content-assistant'],\n ),\n )}\n >\n <div\n className={\n isUser\n ? undefined\n : classNames(\n 'message-item-message-assistant-bubble',\n styles['message-item-message-assistant-bubble'],\n )\n }\n >\n {isUser ? (\n userMessageBubble\n ) : message.streaming &&\n !parsedContent.thinking &&\n !parsedContent.isThinking &&\n !hasAnswerContent ? (\n <div\n className={classNames(\n 'message-item-message-loading-dots',\n styles['message-item-message-loading-dots'],\n )}\n >\n <span\n className={classNames(\n 'message-item-message-loading-dot',\n styles['message-item-message-loading-dot'],\n )}\n />\n <span\n className={classNames(\n 'message-item-message-loading-dot',\n styles['message-item-message-loading-dot'],\n )}\n />\n <span\n className={classNames(\n 'message-item-message-loading-dot',\n styles['message-item-message-loading-dot'],\n )}\n />\n </div>\n ) : (\n <>\n {(parsedContent.thinking || parsedContent.isThinking) && (\n <ThinkingSection\n thinking={thinkingToShow}\n isThinking={parsedContent.isThinking}\n isTyping={effectiveThinkingTyping}\n citations={citations}\n citationSourceContent={citationSourceContent}\n onCitationClick={onCitationClick}\n deferMermaid={deferMermaid}\n />\n )}\n {hasAnswerContent && (\n <div\n className={classNames(\n 'markdown-preview',\n 'message-answer-markdown',\n styles['message-item-message-answer-markdown'],\n (parsedContent.thinking || parsedContent.isThinking) &&\n 'message-answer-markdown-spaced',\n (parsedContent.thinking || parsedContent.isThinking) &&\n styles['message-item-message-answer-markdown-spaced'],\n )}\n >\n <CitationMarkdownContent\n content={displayedContent}\n citations={citations}\n citationSourceContent={citationSourceContent}\n onCitationClick={onCitationClick}\n deferMermaid={deferMermaid}\n />\n {showAnswerCursor && (\n <span\n className={classNames(\n 'message-item-message-typing-cursor',\n styles['message-item-message-typing-cursor'],\n )}\n />\n )}\n </div>\n )}\n </>\n )}\n </div>\n\n {(isUser || showAssistantActions) && (\n <MessageActions\n items={actionItems}\n align={isUser ? 'right' : 'left'}\n editPopover={editPopoverProps}\n actionsVisible={editOpen}\n />\n )}\n\n {!isUser && citations.length > 0 && !isContentTyping && (\n <button\n type=\"button\"\n onClick={handleSummaryClick}\n className={classNames(\n 'message-item-citation-summary-button',\n styles['message-item-citation-summary-button'],\n )}\n >\n <BookOpen\n className={classNames(\n 'text-primary',\n 'citation-summary-icon',\n styles['message-item-citation-summary-icon'],\n )}\n />\n <Text\n className={classNames(\n 'text-primary',\n 'citation-summary-text',\n styles['message-item-citation-summary-text'],\n )}\n >\n {citationSummaryLabel}\n </Text>\n </button>\n )}\n </div>\n </div>\n );\n};\n\nexport default MessageItem;\n"],"names":["Text","Typography","MessageItem","message","onCitationClick","onTypingChange","onEditMessage","onResendMessage","onMessageFeedback","editDisabled","feedbackDisabled","isUser","editOpen","setEditOpen","useState","editValue","setEditValue","feedbackSubmitting","setFeedbackSubmitting","localThumbup","setLocalThumbup","parsedContent","useMemo","parseAssistantContent","shouldAnimateThinking","displayedThinking","isThinkingTyping","useTypewriter","thinkingToShow","displayedContent","isTyping","citations","citationSourceContent","uniqueCitedCount","countUniqueCitedSources","citationSummaryLabel","effectiveThinkingTyping","useEffect","hasAnswerContent","normalizeDisplayText","showAnswerCursor","isContentTyping","deferMermaid","handleSummaryClick","useCallback","copyText","text","antdMessage","assistantCopyText","showAssistantActions","handleEditCancel","handleEditConfirm","trimmed","handleFeedback","thumbup","actionItems","createUserMessageActions","createAssistantMessageActions","editPopoverProps","open","userMessageBubble","jsx","classNames","styles","jsxs","Avatar","User","Bot","Fragment","ThinkingSection","CitationMarkdownContent","MessageActions","BookOpen"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../src/components/AgentHub/Chat/Detail/MessageItem/index.tsx"],"sourcesContent":["import { BookOpen, Bot, User } from '@/components/Icons';\nimport type { ChatMessage, ChatWidget, Citation } from '@/components/AgentHub/types';\nimport ChatWidgetBlock from '@/components/AgentHub/Chat/Detail/ChatWidgetBlock';\nimport { message as antdMessage, Avatar, Typography } from 'antd';\nimport classNames from 'classnames';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useTypewriter } from '../../hooks';\nimport { countUniqueCitedSources, normalizeDisplayText, parseAssistantContent } from '../../utils';\nimport CitationMarkdownContent from '../CitationMarkdownContent';\nimport MessageActions, {\n createAssistantMessageActions,\n createUserMessageActions,\n} from '../MessageActions';\nimport ThinkingSection from '../ThinkingSection';\nimport styles from './style.module.scss';\n\nconst { Text } = Typography;\n\nexport interface MessageItemProps {\n message: ChatMessage;\n onCitationClick?: (citations: Citation[], index?: number) => void;\n onTypingChange?: (typing: boolean) => void;\n onEditMessage?: (messageId: string, content: string) => void;\n onResendMessage?: (content: string) => void;\n onMessageFeedback?: (messageId: string, thumbup: boolean) => void | Promise<void>;\n editDisabled?: boolean;\n feedbackDisabled?: boolean;\n}\n\nconst MessageItem: React.FC<MessageItemProps> = ({\n message,\n onCitationClick,\n onTypingChange,\n onEditMessage,\n onResendMessage,\n onMessageFeedback,\n editDisabled,\n feedbackDisabled,\n}) => {\n const isUser = message.role === 'user';\n const [editOpen, setEditOpen] = useState(false);\n const [editValue, setEditValue] = useState(message.content);\n const [feedbackSubmitting, setFeedbackSubmitting] = useState(false);\n const [localThumbup, setLocalThumbup] = useState<boolean | null | undefined>(message.thumbup);\n const parsedContent = useMemo(\n () => parseAssistantContent(message.content, !!message.streaming),\n [message.content, message.streaming],\n );\n\n const shouldAnimateThinking = !!message.streaming && parsedContent.isThinking;\n const { displayed: displayedThinking, isTyping: isThinkingTyping } = useTypewriter(\n parsedContent.thinking,\n shouldAnimateThinking,\n );\n const thinkingToShow = parsedContent.isThinking ? displayedThinking : parsedContent.thinking;\n\n const { displayed: displayedContent, isTyping } = useTypewriter(\n parsedContent.answer,\n !!message.streaming,\n );\n\n const citations = useMemo(() => message.citations ?? [], [message.citations]);\n const messageWidgets = useMemo(\n () => (Array.isArray(message.widgets) ? (message.widgets as ChatWidget[]) : []),\n [message.widgets],\n );\n const citationSourceContent = useMemo(\n () => `${parsedContent.thinking}\\n${parsedContent.answer}`,\n [parsedContent.thinking, parsedContent.answer],\n );\n const uniqueCitedCount = useMemo(\n () => countUniqueCitedSources(citationSourceContent, citations.length),\n [citationSourceContent, citations.length],\n );\n\n const citationSummaryLabel = useMemo(() => {\n if (citations.length === 0) return '';\n if (uniqueCitedCount > 0 && uniqueCitedCount < citations.length) {\n return `检索 ${citations.length} 个来源 · 正文引用 ${uniqueCitedCount} 处`;\n }\n return `引用了 ${citations.length} 个来源`;\n }, [citations.length, uniqueCitedCount]);\n\n const effectiveThinkingTyping = parsedContent.isThinking && isThinkingTyping;\n\n useEffect(() => {\n if (isUser) return;\n onTypingChange?.(isTyping || effectiveThinkingTyping);\n }, [isUser, isTyping, effectiveThinkingTyping, onTypingChange]);\n\n useEffect(() => {\n setLocalThumbup(message.thumbup);\n }, [message.id, message.thumbup]);\n\n const hasAnswerContent = normalizeDisplayText(displayedContent).trim().length > 0;\n const showWidgets = !isUser && messageWidgets.length > 0;\n const showAnswerCursor = (message.streaming || isTyping) && hasAnswerContent;\n const isContentTyping = isTyping || effectiveThinkingTyping;\n const deferMermaid = !!message.streaming || isContentTyping;\n\n const handleSummaryClick = useCallback(() => {\n if (!citations.length || !onCitationClick) return;\n onCitationClick(citations);\n }, [citations, onCitationClick]);\n\n const copyText = useCallback(async (text: string) => {\n if (!text.trim()) return;\n try {\n await navigator.clipboard.writeText(text);\n antdMessage.success('已复制');\n } catch {\n antdMessage.error('复制失败');\n }\n }, []);\n\n const assistantCopyText = normalizeDisplayText(parsedContent.answer);\n const showAssistantActions =\n !isUser && !message.streaming && !isContentTyping && assistantCopyText.trim().length > 0;\n\n const handleEditCancel = useCallback(() => {\n setEditOpen(false);\n setEditValue(message.content);\n }, [message.content]);\n\n const handleEditConfirm = useCallback(() => {\n const trimmed = editValue.trim();\n if (!trimmed || trimmed === message.content.trim() || !onEditMessage) return;\n onEditMessage(message.id, trimmed);\n setEditOpen(false);\n }, [editValue, message.content, message.id, onEditMessage]);\n\n const handleFeedback = useCallback(\n async (thumbup: boolean) => {\n if (feedbackSubmitting || feedbackDisabled) return;\n if (localThumbup === thumbup) return;\n\n if (onMessageFeedback) {\n setFeedbackSubmitting(true);\n try {\n await onMessageFeedback(message.id, thumbup);\n setLocalThumbup(thumbup);\n } catch {\n // 错误提示由上层处理\n } finally {\n setFeedbackSubmitting(false);\n }\n return;\n }\n\n setLocalThumbup(thumbup);\n antdMessage.success('感谢反馈');\n },\n [feedbackDisabled, feedbackSubmitting, localThumbup, message.id, onMessageFeedback],\n );\n\n const actionItems = isUser\n ? createUserMessageActions({\n onEdit: onEditMessage\n ? () => {\n setEditValue(message.content);\n setEditOpen(true);\n }\n : undefined,\n onCopy: () => copyText(message.content),\n onResend: onResendMessage ? () => onResendMessage(message.content) : undefined,\n editDisabled,\n })\n : createAssistantMessageActions({\n onLike: () => {\n void handleFeedback(true);\n },\n onDislike: () => {\n void handleFeedback(false);\n },\n onCopy: () => copyText(assistantCopyText),\n thumbup: localThumbup,\n feedbackDisabled: feedbackDisabled || feedbackSubmitting,\n });\n\n const editPopoverProps = onEditMessage\n ? {\n open: editOpen,\n value: editValue,\n originalContent: message.content,\n onOpenChange: (open: boolean) => {\n setEditOpen(open);\n if (!open) setEditValue(message.content);\n },\n onChange: setEditValue,\n onConfirm: handleEditConfirm,\n onCancel: handleEditCancel,\n }\n : undefined;\n\n const userMessageBubble = (\n <div\n className={classNames(\n 'message-item-message-user-bubble',\n styles['message-item-message-user-bubble'],\n 'bg-primary',\n )}\n >\n <span\n className={classNames(\n 'message-item-message-user-bubble-text',\n styles['message-item-message-user-bubble-text'],\n )}\n >\n {message.content}\n </span>\n </div>\n );\n\n return (\n <div\n className={classNames(\n 'group',\n 'message-row',\n styles['message-item-message-row'],\n isUser && 'message-item-message-row-reverse',\n isUser && styles['message-item-message-row-reverse'],\n )}\n >\n <Avatar\n size={34}\n icon={isUser ? <User /> : <Bot />}\n className={classNames(\n 'message-item-message-avatar',\n styles['message-item-message-avatar'],\n !isUser && 'message-item-message-avatar-assistant',\n !isUser && styles['message-item-message-avatar-assistant'],\n )}\n style={isUser ? {} : { color: 'var(--primary-color)' }}\n />\n\n <div\n className={classNames(\n 'message-item-message-content',\n styles['message-item-message-content'],\n isUser\n ? classNames(\n 'message-item-message-content-user',\n styles['message-item-message-content-user'],\n )\n : classNames(\n 'message-item-message-content-assistant',\n styles['message-item-message-content-assistant'],\n ),\n )}\n >\n <div\n className={\n isUser\n ? undefined\n : classNames(\n 'message-item-message-assistant-bubble',\n styles['message-item-message-assistant-bubble'],\n )\n }\n >\n {isUser ? (\n userMessageBubble\n ) : message.streaming &&\n !parsedContent.thinking &&\n !parsedContent.isThinking &&\n !hasAnswerContent &&\n !showWidgets ? (\n <div\n className={classNames(\n 'message-item-message-loading-dots',\n styles['message-item-message-loading-dots'],\n )}\n >\n <span\n className={classNames(\n 'message-item-message-loading-dot',\n styles['message-item-message-loading-dot'],\n )}\n />\n <span\n className={classNames(\n 'message-item-message-loading-dot',\n styles['message-item-message-loading-dot'],\n )}\n />\n <span\n className={classNames(\n 'message-item-message-loading-dot',\n styles['message-item-message-loading-dot'],\n )}\n />\n </div>\n ) : (\n <>\n {(parsedContent.thinking || parsedContent.isThinking) && (\n <ThinkingSection\n thinking={thinkingToShow}\n isThinking={parsedContent.isThinking}\n isTyping={effectiveThinkingTyping}\n citations={citations}\n citationSourceContent={citationSourceContent}\n onCitationClick={onCitationClick}\n deferMermaid={deferMermaid}\n />\n )}\n {showWidgets ? (\n <ChatWidgetBlock\n widgets={messageWidgets}\n compact\n leading\n className={classNames(\n (parsedContent.thinking || parsedContent.isThinking) &&\n styles['message-item-message-widgets-after-thinking'],\n )}\n />\n ) : null}\n {hasAnswerContent && (\n <div\n className={classNames(\n 'markdown-preview',\n 'message-answer-markdown',\n styles['message-item-message-answer-markdown'],\n (parsedContent.thinking || parsedContent.isThinking) &&\n 'message-answer-markdown-spaced',\n (parsedContent.thinking || parsedContent.isThinking) &&\n styles['message-item-message-answer-markdown-spaced'],\n showWidgets && styles['message-item-message-answer-markdown-after-widgets'],\n )}\n >\n <CitationMarkdownContent\n content={displayedContent}\n citations={citations}\n citationSourceContent={citationSourceContent}\n onCitationClick={onCitationClick}\n deferMermaid={deferMermaid}\n />\n {showAnswerCursor && (\n <span\n className={classNames(\n 'message-item-message-typing-cursor',\n styles['message-item-message-typing-cursor'],\n )}\n />\n )}\n </div>\n )}\n </>\n )}\n </div>\n\n {(isUser || showAssistantActions) && (\n <MessageActions\n items={actionItems}\n align={isUser ? 'right' : 'left'}\n editPopover={editPopoverProps}\n actionsVisible={editOpen}\n />\n )}\n\n {!isUser && citations.length > 0 && !isContentTyping && (\n <button\n type=\"button\"\n onClick={handleSummaryClick}\n className={classNames(\n 'message-item-citation-summary-button',\n styles['message-item-citation-summary-button'],\n )}\n >\n <BookOpen\n className={classNames(\n 'text-primary',\n 'citation-summary-icon',\n styles['message-item-citation-summary-icon'],\n )}\n />\n <Text\n className={classNames(\n 'text-primary',\n 'citation-summary-text',\n styles['message-item-citation-summary-text'],\n )}\n >\n {citationSummaryLabel}\n </Text>\n </button>\n )}\n </div>\n </div>\n );\n};\n\nexport default MessageItem;\n"],"names":["Text","Typography","MessageItem","message","onCitationClick","onTypingChange","onEditMessage","onResendMessage","onMessageFeedback","editDisabled","feedbackDisabled","isUser","editOpen","setEditOpen","useState","editValue","setEditValue","feedbackSubmitting","setFeedbackSubmitting","localThumbup","setLocalThumbup","parsedContent","useMemo","parseAssistantContent","shouldAnimateThinking","displayedThinking","isThinkingTyping","useTypewriter","thinkingToShow","displayedContent","isTyping","citations","messageWidgets","citationSourceContent","uniqueCitedCount","countUniqueCitedSources","citationSummaryLabel","effectiveThinkingTyping","useEffect","hasAnswerContent","normalizeDisplayText","showWidgets","showAnswerCursor","isContentTyping","deferMermaid","handleSummaryClick","useCallback","copyText","text","antdMessage","assistantCopyText","showAssistantActions","handleEditCancel","handleEditConfirm","trimmed","handleFeedback","thumbup","actionItems","createUserMessageActions","createAssistantMessageActions","editPopoverProps","open","userMessageBubble","jsx","classNames","styles","jsxs","Avatar","User","Bot","Fragment","ThinkingSection","ChatWidgetBlock","CitationMarkdownContent","MessageActions","BookOpen"],"mappings":"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"}
@@ -1,22 +1,24 @@
1
1
  const e = {
2
- "message-item-message-row": "_message-item-message-row_bwatj_1",
3
- "message-item-message-row-reverse": "_message-item-message-row-reverse_bwatj_7",
4
- "message-item-message-avatar": "_message-item-message-avatar_bwatj_11",
5
- "message-item-message-avatar-assistant": "_message-item-message-avatar-assistant_bwatj_15",
6
- "message-item-message-content": "_message-item-message-content_bwatj_19",
7
- "message-item-message-content-user": "_message-item-message-content-user_bwatj_26",
8
- "message-item-message-content-assistant": "_message-item-message-content-assistant_bwatj_30",
9
- "message-item-message-user-bubble": "_message-item-message-user-bubble_bwatj_34",
10
- "message-item-message-user-bubble-text": "_message-item-message-user-bubble-text_bwatj_46",
11
- "message-item-message-assistant-bubble": "_message-item-message-assistant-bubble_bwatj_50",
12
- "message-item-message-loading-dots": "_message-item-message-loading-dots_bwatj_68",
13
- "message-item-message-loading-dot": "_message-item-message-loading-dot_bwatj_68",
14
- "message-item-message-answer-markdown": "_message-item-message-answer-markdown_bwatj_91",
15
- "message-item-message-answer-markdown-spaced": "_message-item-message-answer-markdown-spaced_bwatj_130",
16
- "message-item-message-typing-cursor": "_message-item-message-typing-cursor_bwatj_134",
17
- "message-item-citation-summary-button": "_message-item-citation-summary-button_bwatj_144",
18
- "message-item-citation-summary-icon": "_message-item-citation-summary-icon_bwatj_163",
19
- "message-item-citation-summary-text": "_message-item-citation-summary-text_bwatj_168"
2
+ "message-item-message-row": "_message-item-message-row_1ig20_1",
3
+ "message-item-message-row-reverse": "_message-item-message-row-reverse_1ig20_7",
4
+ "message-item-message-avatar": "_message-item-message-avatar_1ig20_11",
5
+ "message-item-message-avatar-assistant": "_message-item-message-avatar-assistant_1ig20_15",
6
+ "message-item-message-content": "_message-item-message-content_1ig20_19",
7
+ "message-item-message-content-user": "_message-item-message-content-user_1ig20_26",
8
+ "message-item-message-content-assistant": "_message-item-message-content-assistant_1ig20_30",
9
+ "message-item-message-user-bubble": "_message-item-message-user-bubble_1ig20_35",
10
+ "message-item-message-user-bubble-text": "_message-item-message-user-bubble-text_1ig20_47",
11
+ "message-item-message-assistant-bubble": "_message-item-message-assistant-bubble_1ig20_51",
12
+ "message-item-message-loading-dots": "_message-item-message-loading-dots_1ig20_69",
13
+ "message-item-message-loading-dot": "_message-item-message-loading-dot_1ig20_69",
14
+ "message-item-message-answer-markdown": "_message-item-message-answer-markdown_1ig20_92",
15
+ "message-item-message-answer-markdown-spaced": "_message-item-message-answer-markdown-spaced_1ig20_131",
16
+ "message-item-message-answer-markdown-after-widgets": "_message-item-message-answer-markdown-after-widgets_1ig20_135",
17
+ "message-item-message-widgets-after-thinking": "_message-item-message-widgets-after-thinking_1ig20_141",
18
+ "message-item-message-typing-cursor": "_message-item-message-typing-cursor_1ig20_145",
19
+ "message-item-citation-summary-button": "_message-item-citation-summary-button_1ig20_155",
20
+ "message-item-citation-summary-icon": "_message-item-citation-summary-icon_1ig20_174",
21
+ "message-item-citation-summary-text": "_message-item-citation-summary-text_1ig20_179"
20
22
  };
21
23
  export {
22
24
  e as default
@@ -1 +1 @@
1
- {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;"}
@@ -8,10 +8,18 @@ export { default as ChatInput } from './ChatInput';
8
8
  export type { ChatInputProps } from './ChatInput';
9
9
  export { default as ChatPanel } from './ChatPanel';
10
10
  export type { ChatPanelProps } from './ChatPanel';
11
+ export { default as ChatAgentFab } from './ChatAgentFab';
12
+ export type { ChatAgentFabProps } from './ChatAgentFab';
13
+ export { default as ChatAgentFabLayout } from './ChatAgentFabLayout';
14
+ export type { ChatAgentFabLayoutProps } from './ChatAgentFabLayout';
15
+ export { default as ChatFollowUpSuggestions } from './ChatFollowUpSuggestions';
16
+ export type { ChatFollowUpSuggestionsProps } from './ChatFollowUpSuggestions';
11
17
  export { default as ChatSuggestionRow } from './ChatSuggestionRow';
12
18
  export type { ChatSuggestionRowProps } from './ChatSuggestionRow';
13
19
  export { default as CitationPanel } from './CitationPanel';
14
20
  export type { CitationPanelProps } from './CitationPanel';
21
+ export { default as ChatWidgetBlock } from './ChatWidgetBlock';
22
+ export type { ChatWidgetBlockProps } from './ChatWidgetBlock';
15
23
  export { default as MessageEditPopover } from './MessageEditPopover';
16
24
  export type { MessageEditPopoverProps } from './MessageEditPopover';
17
25
  export { default as MessageItem } from './MessageItem';
@@ -1,4 +1,6 @@
1
1
  export { useAutoScrollToBottom } from './useAutoScrollToBottom';
2
+ export { useCitationPanel } from './useCitationPanel';
3
+ export type { UseCitationPanelResult } from './useCitationPanel';
2
4
  export { useChat } from './useChat';
3
5
  export { useChatSessions } from './useChatSessions';
4
6
  export { useSSECompletion } from './useSSECompletion';
@@ -0,0 +1,11 @@
1
+ import { Citation } from '../../types';
2
+ export interface UseCitationPanelResult {
3
+ citationOpen: boolean;
4
+ panelCitations: Citation[];
5
+ highlightedCitationIndex: number | undefined;
6
+ handleCitationClick: (items: Citation[], index?: number) => void;
7
+ closeCitationPanel: () => void;
8
+ resetCitationState: () => void;
9
+ }
10
+ /** FAB / 会话布局:点击消息角标打开 CitationPanel 的受控状态 */
11
+ export declare function useCitationPanel(): UseCitationPanelResult;