@hkyhy/marsun-components-core 0.1.115 → 0.1.117

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 (63) hide show
  1. package/dist/agent-hub.js +131 -126
  2. package/dist/agent-hub.js.map +1 -1
  3. package/dist/components/AgentHub/Chat/Detail/ChatAgentFab/index.d.ts +1 -1
  4. package/dist/components/AgentHub/Chat/Detail/ChatAgentFab/index.js.map +1 -1
  5. package/dist/components/AgentHub/Chat/Detail/ChatAgentFab/style.module.scss.js +9 -9
  6. package/dist/components/AgentHub/Chat/Detail/ChatAgentFabLayout/index.d.ts +2 -2
  7. package/dist/components/AgentHub/Chat/Detail/ChatAgentFabLayout/index.js.map +1 -1
  8. package/dist/components/AgentHub/Chat/Detail/ChatAgentFabLayout/style.module.scss.js +3 -3
  9. package/dist/components/AgentHub/Chat/Detail/ChatCapabilityStrip/index.d.ts +20 -0
  10. package/dist/components/AgentHub/Chat/Detail/ChatCapabilityStrip/index.js +155 -0
  11. package/dist/components/AgentHub/Chat/Detail/ChatCapabilityStrip/index.js.map +1 -0
  12. package/dist/components/AgentHub/Chat/Detail/ChatCapabilityStrip/style.module.scss.js +19 -0
  13. package/dist/components/AgentHub/Chat/Detail/ChatCapabilityStrip/style.module.scss.js.map +1 -0
  14. package/dist/components/AgentHub/Chat/Detail/ChatPanel/index.d.ts +2 -0
  15. package/dist/components/AgentHub/Chat/Detail/ChatPanel/index.js +59 -55
  16. package/dist/components/AgentHub/Chat/Detail/ChatPanel/index.js.map +1 -1
  17. package/dist/components/AgentHub/Chat/Detail/ChatPanelHeaderTools/index.d.ts +19 -0
  18. package/dist/components/AgentHub/Chat/Detail/ChatPanelHeaderTools/index.js +122 -0
  19. package/dist/components/AgentHub/Chat/Detail/ChatPanelHeaderTools/index.js.map +1 -0
  20. package/dist/components/AgentHub/Chat/Detail/ChatPanelHeaderTools/style.module.scss.js +8 -0
  21. package/dist/components/AgentHub/Chat/Detail/ChatPanelHeaderTools/style.module.scss.js.map +1 -0
  22. package/dist/components/AgentHub/Chat/Detail/index.d.ts +4 -0
  23. package/dist/components/Audit/AuditLogList.d.ts +2 -0
  24. package/dist/components/Audit/AuditLogList.js +179 -170
  25. package/dist/components/Audit/AuditLogList.js.map +1 -1
  26. package/dist/components/Audit/labels.d.ts +6 -2
  27. package/dist/components/Audit/labels.js +19 -16
  28. package/dist/components/Audit/labels.js.map +1 -1
  29. package/dist/components/Audit/labels.json.d.ts +47 -1
  30. package/dist/components/Audit/labels.json.js +124 -32
  31. package/dist/components/Audit/labels.json.js.map +1 -1
  32. package/dist/components/Audit/style.module.scss.js +26 -22
  33. package/dist/components/Audit/style.module.scss.js.map +1 -1
  34. package/dist/components/Icons/ZoomIn.d.ts +1 -0
  35. package/dist/components/Icons/ZoomIn.js +7 -0
  36. package/dist/components/Icons/ZoomIn.js.map +1 -0
  37. package/dist/components/Icons/ZoomOut.d.ts +1 -0
  38. package/dist/components/Icons/ZoomOut.js +7 -0
  39. package/dist/components/Icons/ZoomOut.js.map +1 -0
  40. package/dist/components/Icons/index.d.ts +2 -0
  41. package/dist/components/Icons/registry.d.ts +1 -1
  42. package/dist/components/Icons/registry.js +58 -52
  43. package/dist/components/Icons/registry.js.map +1 -1
  44. package/dist/components/Stat/StatCardList.js +16 -16
  45. package/dist/components/Stat/StatCardList.js.map +1 -1
  46. package/dist/components/Tools/ActionTracking/ActionTrackingShell.d.ts +27 -0
  47. package/dist/components/Tools/ActionTracking/ActionTrackingShell.js +43 -0
  48. package/dist/components/Tools/ActionTracking/ActionTrackingShell.js.map +1 -0
  49. package/dist/components/Tools/ActionTracking/index.d.ts +2 -0
  50. package/dist/components/Tools/ActionTracking/style.module.scss.js +7 -0
  51. package/dist/components/Tools/ActionTracking/style.module.scss.js.map +1 -0
  52. package/dist/components/Tools/index.d.ts +2 -0
  53. package/dist/components/Tour/AppTour/index.js +1 -1
  54. package/dist/components/Tour/AppTour/index.js.map +1 -1
  55. package/dist/components/Tour/index.d.ts +1 -0
  56. package/dist/components/Tour/resolveTourTarget.d.ts +7 -0
  57. package/dist/components/Tour/resolveTourTarget.js +16 -0
  58. package/dist/components/Tour/resolveTourTarget.js.map +1 -0
  59. package/dist/index.js +785 -771
  60. package/dist/index.js.map +1 -1
  61. package/dist/marsun-components-core.css +1 -1
  62. package/dist/styles/global.css +1 -1
  63. package/package.json +1 -1
@@ -11,6 +11,8 @@ export interface ChatPanelProps {
11
11
  headerActions?: ReactNode;
12
12
  headerExtra?: ReactNode;
13
13
  beforeInput?: ReactNode;
14
+ /** 消息列表内、messages 之后渲染,参与同一滚动(如追问建议) */
15
+ afterMessages?: ReactNode;
14
16
  /** API 返回的推荐问/追问列表 */
15
17
  followUpItems?: string[];
16
18
  /** 无用户消息且无 followUpItems 时的兜底推荐 */
@@ -1,14 +1,14 @@
1
- import { jsxs as n, jsx as a, Fragment as $ } from "react/jsx-runtime";
2
- import { Button as w } from "antd";
3
- import { useRef as j, useMemo as S, useCallback as L } from "react";
1
+ import { jsxs as n, jsx as a, Fragment as w } from "react/jsx-runtime";
2
+ import { Button as S } from "antd";
3
+ import { useRef as j, useMemo as L, useCallback as M } from "react";
4
4
  import u from "classnames";
5
- import M from "../ChatFollowUpSuggestions/index.js";
6
- import U from "../ChatInput/index.js";
7
- import I from "../MessageItem/index.js";
5
+ import U from "../ChatFollowUpSuggestions/index.js";
6
+ import I from "../ChatInput/index.js";
7
+ import ll from "../MessageItem/index.js";
8
8
  import l from "./style.module.scss.js";
9
- import { useAutoScrollToBottom as ll } from "../../hooks/useAutoScrollToBottom.js";
10
- import al from "../../../../VirtualScrollbar/VirtualScrollbar/index.js";
11
- const ul = ({
9
+ import { useAutoScrollToBottom as al } from "../../hooks/useAutoScrollToBottom.js";
10
+ import el from "../../../../VirtualScrollbar/VirtualScrollbar/index.js";
11
+ const dl = ({
12
12
  title: d,
13
13
  subtitle: m,
14
14
  showHeader: D = !0,
@@ -17,34 +17,35 @@ const ul = ({
17
17
  headerActions: N,
18
18
  headerExtra: v,
19
19
  beforeInput: y,
20
+ afterMessages: F,
20
21
  followUpItems: c,
21
22
  starterItems: t,
22
23
  onFollowUpSelect: h,
23
24
  onSendMessage: r,
24
25
  followUpLoading: C = !1,
25
- followUpDefaultExpanded: F = !0,
26
- starterTitle: T = "推荐问",
27
- followUpTitle: z = "推荐追问",
26
+ followUpDefaultExpanded: T = !0,
27
+ starterTitle: z = "推荐问",
28
+ followUpTitle: B = "推荐追问",
28
29
  messages: i,
29
- showEmptyHint: B,
30
- emptyPlaceholder: E = "点击上方建议,或直接输入问题",
31
- onCitationClick: H,
32
- onEditMessage: P,
33
- onResendMessage: V,
34
- editDisabled: q,
35
- inputValue: A,
30
+ showEmptyHint: E,
31
+ emptyPlaceholder: H = "点击上方建议,或直接输入问题",
32
+ onCitationClick: P,
33
+ onEditMessage: V,
34
+ onResendMessage: q,
35
+ editDisabled: A,
36
+ inputValue: G,
36
37
  inputLoading: b = !1,
37
- onInputChange: G,
38
- onSend: J,
39
- onStop: K,
40
- inputPlaceholder: O,
41
- showInput: Q = !0,
42
- className: W
38
+ onInputChange: J,
39
+ onSend: K,
40
+ onStop: O,
41
+ inputPlaceholder: Q,
42
+ showInput: W = !0,
43
+ className: X
43
44
  }) => {
44
- const g = j(null), k = j(null), { handleScroll: X } = ll(g, k, {
45
+ const g = j(null), k = j(null), { handleScroll: Y } = al(g, k, {
45
46
  enabled: i.length > 0,
46
47
  trigger: i
47
- }), s = i.some((e) => e.role === "user"), x = S(() => c != null && c.length ? c : !s && (t != null && t.length) ? t : [], [c, s, t]), o = x.length > 0 && !C && (typeof h == "function" || typeof r == "function"), Y = s ? z : T, Z = B ?? (!o && !C), _ = L(
48
+ }), s = i.some((e) => e.role === "user"), x = L(() => c != null && c.length ? c : !s && (t != null && t.length) ? t : [], [c, s, t]), o = x.length > 0 && !C && (typeof h == "function" || typeof r == "function"), Z = s ? B : z, _ = E ?? (!o && !C), $ = M(
48
49
  (e) => {
49
50
  if (h) {
50
51
  h(e);
@@ -53,20 +54,20 @@ const ul = ({
53
54
  r == null || r(e);
54
55
  },
55
56
  [h, r]
56
- ), R = y || o ? /* @__PURE__ */ n($, { children: [
57
+ ), R = y || o ? /* @__PURE__ */ n(w, { children: [
57
58
  y,
58
59
  o ? /* @__PURE__ */ a(
59
- M,
60
+ U,
60
61
  {
61
62
  className: l["chat-panel-follow-up"],
62
63
  items: x,
63
- title: Y,
64
- defaultExpanded: F,
65
- onSelect: _
64
+ title: Z,
65
+ defaultExpanded: T,
66
+ onSelect: $
66
67
  }
67
68
  ) : null
68
69
  ] }) : null;
69
- return /* @__PURE__ */ n("div", { className: u("chat-panel", l["chat-panel"], W), children: [
70
+ return /* @__PURE__ */ n("div", { className: u("chat-panel", l["chat-panel"], X), children: [
70
71
  D ? /* @__PURE__ */ n("div", { className: u("chat-panel-head", l["chat-panel-head"]), children: [
71
72
  /* @__PURE__ */ n("div", { className: l["chat-panel-head-main"], children: [
72
73
  /* @__PURE__ */ n("div", { children: [
@@ -75,47 +76,50 @@ const ul = ({
75
76
  ] }),
76
77
  N || f && p ? /* @__PURE__ */ n("div", { className: l["chat-panel-head-actions"], children: [
77
78
  N,
78
- f && p ? /* @__PURE__ */ a(w, { type: "link", size: "small", onClick: p, children: "收起" }) : null
79
+ f && p ? /* @__PURE__ */ a(S, { type: "link", size: "small", onClick: p, children: "收起" }) : null
79
80
  ] }) : null
80
81
  ] }),
81
82
  v ? /* @__PURE__ */ a("div", { className: l["chat-panel-head-extra"], children: v }) : null
82
83
  ] }) : null,
83
84
  /* @__PURE__ */ a(
84
- al,
85
+ el,
85
86
  {
86
87
  className: u("chat-panel-messages", l["chat-panel-messages"]),
87
88
  wrapperClassName: l["chat-panel-messages-wrapper"],
88
- onScroll: X,
89
+ onScroll: Y,
89
90
  ref: g,
90
- children: /* @__PURE__ */ a("div", { ref: k, children: i.length === 0 && Z ? /* @__PURE__ */ a("p", { className: l["chat-panel-empty"], children: E }) : i.map((e) => /* @__PURE__ */ a(
91
- I,
92
- {
93
- message: e,
94
- onCitationClick: H,
95
- onEditMessage: P,
96
- onResendMessage: V,
97
- editDisabled: q || b
98
- },
99
- e.id
100
- )) })
91
+ children: /* @__PURE__ */ n("div", { ref: k, children: [
92
+ i.length === 0 && _ ? /* @__PURE__ */ a("p", { className: l["chat-panel-empty"], children: H }) : i.map((e) => /* @__PURE__ */ a(
93
+ ll,
94
+ {
95
+ message: e,
96
+ onCitationClick: P,
97
+ onEditMessage: V,
98
+ onResendMessage: q,
99
+ editDisabled: A || b
100
+ },
101
+ e.id
102
+ )),
103
+ F
104
+ ] })
101
105
  }
102
106
  ),
103
107
  R ? /* @__PURE__ */ a("div", { className: l["chat-panel-before-input"], children: R }) : null,
104
- Q ? /* @__PURE__ */ a("div", { className: l["chat-panel-input"], children: /* @__PURE__ */ a(
105
- U,
108
+ W ? /* @__PURE__ */ a("div", { className: l["chat-panel-input"], children: /* @__PURE__ */ a(
109
+ I,
106
110
  {
107
111
  embedded: !0,
108
- value: A,
112
+ value: G,
109
113
  loading: b,
110
- onChange: G,
111
- onSend: J,
112
- onStop: K,
113
- placeholder: O
114
+ onChange: J,
115
+ onSend: K,
116
+ onStop: O,
117
+ placeholder: Q
114
118
  }
115
119
  ) }) : null
116
120
  ] });
117
121
  };
118
122
  export {
119
- ul as default
123
+ dl as default
120
124
  };
121
125
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../src/components/AgentHub/Chat/Detail/ChatPanel/index.tsx"],"sourcesContent":["import type { ChatMessage } from '@/components/AgentHub/types';\nimport { VirtualScrollbar } from '@/components/VirtualScrollbar';\nimport { Button } from 'antd';\nimport React, { useCallback, useMemo, useRef, type ReactNode } from 'react';\nimport classNames from 'classnames';\nimport { useAutoScrollToBottom } from '../../hooks';\nimport ChatFollowUpSuggestions from '../ChatFollowUpSuggestions';\nimport ChatInput from '../ChatInput';\nimport type { ChatInputProps } from '../ChatInput';\nimport MessageItem from '../MessageItem';\nimport type { MessageItemProps } from '../MessageItem';\nimport styles from './style.module.scss';\n\nexport interface ChatPanelProps {\n title?: string;\n subtitle?: string;\n showHeader?: boolean;\n showCloseButton?: boolean;\n onClose?: () => void;\n headerActions?: ReactNode;\n headerExtra?: ReactNode;\n beforeInput?: ReactNode;\n\n /** API 返回的推荐问/追问列表 */\n followUpItems?: string[];\n /** 无用户消息且无 followUpItems 时的兜底推荐 */\n starterItems?: string[];\n /** 点击推荐项(完全自定义,优先于 onSendMessage) */\n onFollowUpSelect?: (text: string) => void;\n /** 点击推荐项直接发送(推荐问/追问默认行为) */\n onSendMessage?: (text: string) => void;\n /** true 时隐藏推荐区(如会话加载、发送中) */\n followUpLoading?: boolean;\n followUpDefaultExpanded?: boolean;\n starterTitle?: string;\n followUpTitle?: string;\n\n messages: ChatMessage[];\n showEmptyHint?: boolean;\n emptyPlaceholder?: string;\n onCitationClick?: MessageItemProps['onCitationClick'];\n onEditMessage?: MessageItemProps['onEditMessage'];\n onResendMessage?: MessageItemProps['onResendMessage'];\n editDisabled?: boolean;\n\n inputValue: string;\n inputLoading?: boolean;\n onInputChange: (v: string) => void;\n onSend: () => void;\n onStop?: ChatInputProps['onStop'];\n inputPlaceholder?: string;\n showInput?: boolean;\n\n className?: string;\n}\n\nconst ChatPanel: React.FC<ChatPanelProps> = ({\n title,\n subtitle,\n showHeader = true,\n showCloseButton = false,\n onClose,\n headerActions,\n headerExtra,\n beforeInput,\n followUpItems,\n starterItems,\n onFollowUpSelect,\n onSendMessage,\n followUpLoading = false,\n followUpDefaultExpanded = true,\n starterTitle = '推荐问',\n followUpTitle = '推荐追问',\n messages,\n showEmptyHint,\n emptyPlaceholder = '点击上方建议,或直接输入问题',\n onCitationClick,\n onEditMessage,\n onResendMessage,\n editDisabled,\n inputValue,\n inputLoading = false,\n onInputChange,\n onSend,\n onStop,\n inputPlaceholder,\n showInput = true,\n className,\n}) => {\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const messagesContentRef = useRef<HTMLDivElement>(null);\n\n const { handleScroll } = useAutoScrollToBottom(scrollContainerRef, messagesContentRef, {\n enabled: messages.length > 0,\n trigger: messages,\n });\n\n const hasUserMessages = messages.some((message) => message.role === 'user');\n\n const effectiveFollowUpItems = useMemo(() => {\n if (followUpItems?.length) return followUpItems;\n if (!hasUserMessages && starterItems?.length) return starterItems;\n return [];\n }, [followUpItems, hasUserMessages, starterItems]);\n\n const showFollowUp =\n effectiveFollowUpItems.length > 0 &&\n !followUpLoading &&\n (typeof onFollowUpSelect === 'function' || typeof onSendMessage === 'function');\n\n const followUpDisplayTitle = hasUserMessages ? followUpTitle : starterTitle;\n\n const effectiveShowEmptyHint = showEmptyHint ?? (!showFollowUp && !followUpLoading);\n\n const handleFollowUpSelect = useCallback(\n (text: string) => {\n if (onFollowUpSelect) {\n onFollowUpSelect(text);\n return;\n }\n onSendMessage?.(text);\n },\n [onFollowUpSelect, onSendMessage],\n );\n\n const beforeInputContent =\n beforeInput || showFollowUp ? (\n <>\n {beforeInput}\n {showFollowUp ? (\n <ChatFollowUpSuggestions\n className={styles['chat-panel-follow-up']}\n items={effectiveFollowUpItems}\n title={followUpDisplayTitle}\n defaultExpanded={followUpDefaultExpanded}\n onSelect={handleFollowUpSelect}\n />\n ) : null}\n </>\n ) : null;\n\n return (\n <div className={classNames('chat-panel', styles['chat-panel'], className)}>\n {showHeader ? (\n <div className={classNames('chat-panel-head', styles['chat-panel-head'])}>\n <div className={styles['chat-panel-head-main']}>\n <div>\n {title ? <strong className={styles['chat-panel-title']}>{title}</strong> : null}\n {subtitle ? <span className={styles['chat-panel-subtitle']}>{subtitle}</span> : null}\n </div>\n {headerActions || (showCloseButton && onClose) ? (\n <div className={styles['chat-panel-head-actions']}>\n {headerActions}\n {showCloseButton && onClose ? (\n <Button type=\"link\" size=\"small\" onClick={onClose}>\n 收起\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n {headerExtra ? (\n <div className={styles['chat-panel-head-extra']}>{headerExtra}</div>\n ) : null}\n </div>\n ) : null}\n\n <VirtualScrollbar\n className={classNames('chat-panel-messages', styles['chat-panel-messages'])}\n wrapperClassName={styles['chat-panel-messages-wrapper']}\n onScroll={handleScroll}\n ref={scrollContainerRef}\n >\n <div ref={messagesContentRef}>\n {messages.length === 0 && effectiveShowEmptyHint ? (\n <p className={styles['chat-panel-empty']}>{emptyPlaceholder}</p>\n ) : (\n messages.map((message) => (\n <MessageItem\n key={message.id}\n message={message}\n onCitationClick={onCitationClick}\n onEditMessage={onEditMessage}\n onResendMessage={onResendMessage}\n editDisabled={editDisabled || inputLoading}\n />\n ))\n )}\n </div>\n </VirtualScrollbar>\n\n {beforeInputContent ? (\n <div className={styles['chat-panel-before-input']}>{beforeInputContent}</div>\n ) : null}\n\n {showInput ? (\n <div className={styles['chat-panel-input']}>\n <ChatInput\n embedded\n value={inputValue}\n loading={inputLoading}\n onChange={onInputChange}\n onSend={onSend}\n onStop={onStop}\n placeholder={inputPlaceholder}\n />\n </div>\n ) : null}\n </div>\n );\n};\n\nexport default ChatPanel;\n"],"names":["ChatPanel","title","subtitle","showHeader","showCloseButton","onClose","headerActions","headerExtra","beforeInput","followUpItems","starterItems","onFollowUpSelect","onSendMessage","followUpLoading","followUpDefaultExpanded","starterTitle","followUpTitle","messages","showEmptyHint","emptyPlaceholder","onCitationClick","onEditMessage","onResendMessage","editDisabled","inputValue","inputLoading","onInputChange","onSend","onStop","inputPlaceholder","showInput","className","scrollContainerRef","useRef","messagesContentRef","handleScroll","useAutoScrollToBottom","hasUserMessages","message","effectiveFollowUpItems","useMemo","showFollowUp","followUpDisplayTitle","effectiveShowEmptyHint","handleFollowUpSelect","useCallback","text","beforeInputContent","jsxs","Fragment","jsx","ChatFollowUpSuggestions","styles","classNames","Button","VirtualScrollbar","MessageItem","ChatInput"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../src/components/AgentHub/Chat/Detail/ChatPanel/index.tsx"],"sourcesContent":["import type { ChatMessage } from '@/components/AgentHub/types';\nimport { VirtualScrollbar } from '@/components/VirtualScrollbar';\nimport { Button } from 'antd';\nimport React, { useCallback, useMemo, useRef, type ReactNode } from 'react';\nimport classNames from 'classnames';\nimport { useAutoScrollToBottom } from '../../hooks';\nimport ChatFollowUpSuggestions from '../ChatFollowUpSuggestions';\nimport ChatInput from '../ChatInput';\nimport type { ChatInputProps } from '../ChatInput';\nimport MessageItem from '../MessageItem';\nimport type { MessageItemProps } from '../MessageItem';\nimport styles from './style.module.scss';\n\nexport interface ChatPanelProps {\n title?: string;\n subtitle?: string;\n showHeader?: boolean;\n showCloseButton?: boolean;\n onClose?: () => void;\n headerActions?: ReactNode;\n headerExtra?: ReactNode;\n beforeInput?: ReactNode;\n /** 消息列表内、messages 之后渲染,参与同一滚动(如追问建议) */\n afterMessages?: ReactNode;\n\n /** API 返回的推荐问/追问列表 */\n followUpItems?: string[];\n /** 无用户消息且无 followUpItems 时的兜底推荐 */\n starterItems?: string[];\n /** 点击推荐项(完全自定义,优先于 onSendMessage) */\n onFollowUpSelect?: (text: string) => void;\n /** 点击推荐项直接发送(推荐问/追问默认行为) */\n onSendMessage?: (text: string) => void;\n /** true 时隐藏推荐区(如会话加载、发送中) */\n followUpLoading?: boolean;\n followUpDefaultExpanded?: boolean;\n starterTitle?: string;\n followUpTitle?: string;\n\n messages: ChatMessage[];\n showEmptyHint?: boolean;\n emptyPlaceholder?: string;\n onCitationClick?: MessageItemProps['onCitationClick'];\n onEditMessage?: MessageItemProps['onEditMessage'];\n onResendMessage?: MessageItemProps['onResendMessage'];\n editDisabled?: boolean;\n\n inputValue: string;\n inputLoading?: boolean;\n onInputChange: (v: string) => void;\n onSend: () => void;\n onStop?: ChatInputProps['onStop'];\n inputPlaceholder?: string;\n showInput?: boolean;\n\n className?: string;\n}\n\nconst ChatPanel: React.FC<ChatPanelProps> = ({\n title,\n subtitle,\n showHeader = true,\n showCloseButton = false,\n onClose,\n headerActions,\n headerExtra,\n beforeInput,\n afterMessages,\n followUpItems,\n starterItems,\n onFollowUpSelect,\n onSendMessage,\n followUpLoading = false,\n followUpDefaultExpanded = true,\n starterTitle = '推荐问',\n followUpTitle = '推荐追问',\n messages,\n showEmptyHint,\n emptyPlaceholder = '点击上方建议,或直接输入问题',\n onCitationClick,\n onEditMessage,\n onResendMessage,\n editDisabled,\n inputValue,\n inputLoading = false,\n onInputChange,\n onSend,\n onStop,\n inputPlaceholder,\n showInput = true,\n className,\n}) => {\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const messagesContentRef = useRef<HTMLDivElement>(null);\n\n const { handleScroll } = useAutoScrollToBottom(scrollContainerRef, messagesContentRef, {\n enabled: messages.length > 0,\n trigger: messages,\n });\n\n const hasUserMessages = messages.some((message) => message.role === 'user');\n\n const effectiveFollowUpItems = useMemo(() => {\n if (followUpItems?.length) return followUpItems;\n if (!hasUserMessages && starterItems?.length) return starterItems;\n return [];\n }, [followUpItems, hasUserMessages, starterItems]);\n\n const showFollowUp =\n effectiveFollowUpItems.length > 0 &&\n !followUpLoading &&\n (typeof onFollowUpSelect === 'function' || typeof onSendMessage === 'function');\n\n const followUpDisplayTitle = hasUserMessages ? followUpTitle : starterTitle;\n\n const effectiveShowEmptyHint = showEmptyHint ?? (!showFollowUp && !followUpLoading);\n\n const handleFollowUpSelect = useCallback(\n (text: string) => {\n if (onFollowUpSelect) {\n onFollowUpSelect(text);\n return;\n }\n onSendMessage?.(text);\n },\n [onFollowUpSelect, onSendMessage],\n );\n\n const beforeInputContent =\n beforeInput || showFollowUp ? (\n <>\n {beforeInput}\n {showFollowUp ? (\n <ChatFollowUpSuggestions\n className={styles['chat-panel-follow-up']}\n items={effectiveFollowUpItems}\n title={followUpDisplayTitle}\n defaultExpanded={followUpDefaultExpanded}\n onSelect={handleFollowUpSelect}\n />\n ) : null}\n </>\n ) : null;\n\n return (\n <div className={classNames('chat-panel', styles['chat-panel'], className)}>\n {showHeader ? (\n <div className={classNames('chat-panel-head', styles['chat-panel-head'])}>\n <div className={styles['chat-panel-head-main']}>\n <div>\n {title ? <strong className={styles['chat-panel-title']}>{title}</strong> : null}\n {subtitle ? <span className={styles['chat-panel-subtitle']}>{subtitle}</span> : null}\n </div>\n {headerActions || (showCloseButton && onClose) ? (\n <div className={styles['chat-panel-head-actions']}>\n {headerActions}\n {showCloseButton && onClose ? (\n <Button type=\"link\" size=\"small\" onClick={onClose}>\n 收起\n </Button>\n ) : null}\n </div>\n ) : null}\n </div>\n {headerExtra ? (\n <div className={styles['chat-panel-head-extra']}>{headerExtra}</div>\n ) : null}\n </div>\n ) : null}\n\n <VirtualScrollbar\n className={classNames('chat-panel-messages', styles['chat-panel-messages'])}\n wrapperClassName={styles['chat-panel-messages-wrapper']}\n onScroll={handleScroll}\n ref={scrollContainerRef}\n >\n <div ref={messagesContentRef}>\n {messages.length === 0 && effectiveShowEmptyHint ? (\n <p className={styles['chat-panel-empty']}>{emptyPlaceholder}</p>\n ) : (\n messages.map((message) => (\n <MessageItem\n key={message.id}\n message={message}\n onCitationClick={onCitationClick}\n onEditMessage={onEditMessage}\n onResendMessage={onResendMessage}\n editDisabled={editDisabled || inputLoading}\n />\n ))\n )}\n {afterMessages}\n </div>\n </VirtualScrollbar>\n\n {beforeInputContent ? (\n <div className={styles['chat-panel-before-input']}>{beforeInputContent}</div>\n ) : null}\n\n {showInput ? (\n <div className={styles['chat-panel-input']}>\n <ChatInput\n embedded\n value={inputValue}\n loading={inputLoading}\n onChange={onInputChange}\n onSend={onSend}\n onStop={onStop}\n placeholder={inputPlaceholder}\n />\n </div>\n ) : null}\n </div>\n );\n};\n\nexport default ChatPanel;\n"],"names":["ChatPanel","title","subtitle","showHeader","showCloseButton","onClose","headerActions","headerExtra","beforeInput","afterMessages","followUpItems","starterItems","onFollowUpSelect","onSendMessage","followUpLoading","followUpDefaultExpanded","starterTitle","followUpTitle","messages","showEmptyHint","emptyPlaceholder","onCitationClick","onEditMessage","onResendMessage","editDisabled","inputValue","inputLoading","onInputChange","onSend","onStop","inputPlaceholder","showInput","className","scrollContainerRef","useRef","messagesContentRef","handleScroll","useAutoScrollToBottom","hasUserMessages","message","effectiveFollowUpItems","useMemo","showFollowUp","followUpDisplayTitle","effectiveShowEmptyHint","handleFollowUpSelect","useCallback","text","beforeInputContent","jsxs","Fragment","jsx","ChatFollowUpSuggestions","styles","classNames","Button","VirtualScrollbar","MessageItem","ChatInput"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { ReactNode } from 'react';
2
+ export declare const DEFAULT_CHAT_ZOOM_STEPS: readonly [0.2, 0.35, 0.5, 0.7, 0.85, 1, 1.1];
3
+ export type ChatPanelHeaderToolsProps = {
4
+ contentZoom: number;
5
+ zoomSteps?: readonly number[];
6
+ onContentZoomChange: (z: number) => void;
7
+ fullscreen?: boolean;
8
+ onFullscreenChange?: (v: boolean) => void;
9
+ onNewSession?: () => void;
10
+ disableActions?: boolean;
11
+ showZoom?: boolean;
12
+ showNewSession?: boolean;
13
+ showFullscreen?: boolean;
14
+ /** 收起等额外槽位(渲染在工具按钮之后) */
15
+ extra?: ReactNode;
16
+ className?: string;
17
+ };
18
+ declare const ChatPanelHeaderTools: React.FC<ChatPanelHeaderToolsProps>;
19
+ export default ChatPanelHeaderTools;
@@ -0,0 +1,122 @@
1
+ import { jsxs as n, Fragment as P, jsx as l } from "react/jsx-runtime";
2
+ import { Tooltip as s, Button as m } from "antd";
3
+ import b from "classnames";
4
+ import { useCallback as _ } from "react";
5
+ import p from "./style.module.scss.js";
6
+ import { ZoomOut as j } from "../../../../Icons/ZoomOut.js";
7
+ import { ZoomIn as z } from "../../../../Icons/ZoomIn.js";
8
+ import { Plus as D } from "../../../../Icons/Plus.js";
9
+ import { Minimize2 as E } from "../../../../Icons/Minimize2.js";
10
+ import { Maximize2 as H } from "../../../../Icons/Maximize2.js";
11
+ const I = [0.2, 0.35, 0.5, 0.7, 0.85, 1, 1.1];
12
+ function N(t, a) {
13
+ let r = 0, i = Math.abs(t[0] - a);
14
+ for (let e = 1; e < t.length; e += 1) {
15
+ const o = Math.abs(t[e] - a);
16
+ o < i && (r = e, i = o);
17
+ }
18
+ return r;
19
+ }
20
+ const J = ({
21
+ contentZoom: t,
22
+ zoomSteps: a = I,
23
+ onContentZoomChange: r,
24
+ fullscreen: i = !1,
25
+ onFullscreenChange: e,
26
+ onNewSession: o,
27
+ disableActions: d = !1,
28
+ showZoom: f = !0,
29
+ showNewSession: u = !0,
30
+ showFullscreen: x = !0,
31
+ extra: M,
32
+ className: y
33
+ }) => {
34
+ const c = _(
35
+ (C) => {
36
+ const O = N(a, t), h = a[Math.min(a.length - 1, Math.max(0, O + C))];
37
+ typeof h == "number" && r(h);
38
+ },
39
+ [t, r, a]
40
+ ), k = a[0] ?? 0.2, T = a[a.length - 1] ?? 1.1;
41
+ return /* @__PURE__ */ n(
42
+ "div",
43
+ {
44
+ className: b(
45
+ "chat-panel-header-tools",
46
+ "chat-panel-header-icon-actions",
47
+ p["chat-panel-header-tools"],
48
+ y
49
+ ),
50
+ children: [
51
+ f ? /* @__PURE__ */ n(P, { children: [
52
+ /* @__PURE__ */ l(s, { title: "缩小对话内容(便于截全图)", children: /* @__PURE__ */ l(
53
+ m,
54
+ {
55
+ type: "text",
56
+ size: "small",
57
+ icon: /* @__PURE__ */ l(j, {}),
58
+ "aria-label": "缩小对话内容",
59
+ disabled: t <= k,
60
+ onClick: () => c(-1)
61
+ }
62
+ ) }),
63
+ /* @__PURE__ */ l(s, { title: "重置为 100%", children: /* @__PURE__ */ n(
64
+ "button",
65
+ {
66
+ type: "button",
67
+ className: b(
68
+ "chat-panel-header-tools-zoom-label",
69
+ p["chat-panel-header-tools-zoom-label"]
70
+ ),
71
+ "aria-label": `当前缩放 ${Math.round(t * 100)}%`,
72
+ onClick: () => r(1),
73
+ children: [
74
+ Math.round(t * 100),
75
+ "%"
76
+ ]
77
+ }
78
+ ) }),
79
+ /* @__PURE__ */ l(s, { title: "放大对话内容", children: /* @__PURE__ */ l(
80
+ m,
81
+ {
82
+ type: "text",
83
+ size: "small",
84
+ icon: /* @__PURE__ */ l(z, {}),
85
+ "aria-label": "放大对话内容",
86
+ disabled: t >= T,
87
+ onClick: () => c(1)
88
+ }
89
+ ) })
90
+ ] }) : null,
91
+ u && o ? /* @__PURE__ */ l(s, { title: "新建会话", children: /* @__PURE__ */ l(
92
+ m,
93
+ {
94
+ type: "text",
95
+ size: "small",
96
+ icon: /* @__PURE__ */ l(D, {}),
97
+ "aria-label": "新建会话",
98
+ disabled: d,
99
+ onClick: o
100
+ }
101
+ ) }) : null,
102
+ x && e ? /* @__PURE__ */ l(s, { title: i ? "退出全屏" : "全屏", children: /* @__PURE__ */ l(
103
+ m,
104
+ {
105
+ type: "text",
106
+ size: "small",
107
+ icon: i ? /* @__PURE__ */ l(E, {}) : /* @__PURE__ */ l(H, {}),
108
+ "aria-label": i ? "退出全屏" : "全屏",
109
+ disabled: d,
110
+ onClick: () => e(!i)
111
+ }
112
+ ) }) : null,
113
+ M
114
+ ]
115
+ }
116
+ );
117
+ };
118
+ export {
119
+ I as DEFAULT_CHAT_ZOOM_STEPS,
120
+ J as default
121
+ };
122
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../../src/components/AgentHub/Chat/Detail/ChatPanelHeaderTools/index.tsx"],"sourcesContent":["import { Maximize2, Minimize2, Plus, ZoomIn, ZoomOut } from '@/components/Icons';\nimport { Button, Tooltip } from 'antd';\nimport classNames from 'classnames';\nimport { useCallback, type ReactNode } from 'react';\nimport styles from './style.module.scss';\n\nexport const DEFAULT_CHAT_ZOOM_STEPS = [0.2, 0.35, 0.5, 0.7, 0.85, 1, 1.1] as const;\n\nexport type ChatPanelHeaderToolsProps = {\n contentZoom: number;\n zoomSteps?: readonly number[];\n onContentZoomChange: (z: number) => void;\n fullscreen?: boolean;\n onFullscreenChange?: (v: boolean) => void;\n onNewSession?: () => void;\n disableActions?: boolean;\n showZoom?: boolean;\n showNewSession?: boolean;\n showFullscreen?: boolean;\n /** 收起等额外槽位(渲染在工具按钮之后) */\n extra?: ReactNode;\n className?: string;\n};\n\nfunction nearestStepIndex(steps: readonly number[], value: number): number {\n let best = 0;\n let bestDist = Math.abs(steps[0]! - value);\n for (let i = 1; i < steps.length; i += 1) {\n const dist = Math.abs(steps[i]! - value);\n if (dist < bestDist) {\n best = i;\n bestDist = dist;\n }\n }\n return best;\n}\n\nconst ChatPanelHeaderTools: React.FC<ChatPanelHeaderToolsProps> = ({\n contentZoom,\n zoomSteps = DEFAULT_CHAT_ZOOM_STEPS,\n onContentZoomChange,\n fullscreen = false,\n onFullscreenChange,\n onNewSession,\n disableActions = false,\n showZoom = true,\n showNewSession = true,\n showFullscreen = true,\n extra,\n className,\n}) => {\n const bumpZoom = useCallback(\n (dir: -1 | 1) => {\n const idx = nearestStepIndex(zoomSteps, contentZoom);\n const next = zoomSteps[Math.min(zoomSteps.length - 1, Math.max(0, idx + dir))];\n if (typeof next === 'number') onContentZoomChange(next);\n },\n [contentZoom, onContentZoomChange, zoomSteps],\n );\n\n const minZoom = zoomSteps[0] ?? 0.2;\n const maxZoom = zoomSteps[zoomSteps.length - 1] ?? 1.1;\n\n return (\n <div\n className={classNames(\n 'chat-panel-header-tools',\n 'chat-panel-header-icon-actions',\n styles['chat-panel-header-tools'],\n className,\n )}\n >\n {showZoom ? (\n <>\n <Tooltip title=\"缩小对话内容(便于截全图)\">\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ZoomOut />}\n aria-label=\"缩小对话内容\"\n disabled={contentZoom <= minZoom}\n onClick={() => bumpZoom(-1)}\n />\n </Tooltip>\n <Tooltip title=\"重置为 100%\">\n <button\n type=\"button\"\n className={classNames(\n 'chat-panel-header-tools-zoom-label',\n styles['chat-panel-header-tools-zoom-label'],\n )}\n aria-label={`当前缩放 ${Math.round(contentZoom * 100)}%`}\n onClick={() => onContentZoomChange(1)}\n >\n {Math.round(contentZoom * 100)}%\n </button>\n </Tooltip>\n <Tooltip title=\"放大对话内容\">\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ZoomIn />}\n aria-label=\"放大对话内容\"\n disabled={contentZoom >= maxZoom}\n onClick={() => bumpZoom(1)}\n />\n </Tooltip>\n </>\n ) : null}\n {showNewSession && onNewSession ? (\n <Tooltip title=\"新建会话\">\n <Button\n type=\"text\"\n size=\"small\"\n icon={<Plus />}\n aria-label=\"新建会话\"\n disabled={disableActions}\n onClick={onNewSession}\n />\n </Tooltip>\n ) : null}\n {showFullscreen && onFullscreenChange ? (\n <Tooltip title={fullscreen ? '退出全屏' : '全屏'}>\n <Button\n type=\"text\"\n size=\"small\"\n icon={fullscreen ? <Minimize2 /> : <Maximize2 />}\n aria-label={fullscreen ? '退出全屏' : '全屏'}\n disabled={disableActions}\n onClick={() => onFullscreenChange(!fullscreen)}\n />\n </Tooltip>\n ) : null}\n {extra}\n </div>\n );\n};\n\nexport default ChatPanelHeaderTools;\n"],"names":["DEFAULT_CHAT_ZOOM_STEPS","nearestStepIndex","steps","value","best","bestDist","i","dist","ChatPanelHeaderTools","contentZoom","zoomSteps","onContentZoomChange","fullscreen","onFullscreenChange","onNewSession","disableActions","showZoom","showNewSession","showFullscreen","extra","className","bumpZoom","useCallback","dir","idx","next","minZoom","maxZoom","jsxs","classNames","styles","Fragment","jsx","Tooltip","Button","ZoomOut","ZoomIn","Plus","Minimize2","Maximize2"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ const e = {
2
+ "chat-panel-header-tools": "_chat-panel-header-tools_14d3r_1",
3
+ "chat-panel-header-tools-zoom-label": "_chat-panel-header-tools-zoom-label_14d3r_32"
4
+ };
5
+ export {
6
+ e as default
7
+ };
8
+ //# sourceMappingURL=style.module.scss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -8,6 +8,10 @@ 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 ChatCapabilityStrip } from './ChatCapabilityStrip';
12
+ export type { ChatCapabilityItem, ChatCapabilityStripProps } from './ChatCapabilityStrip';
13
+ export { default as ChatPanelHeaderTools, DEFAULT_CHAT_ZOOM_STEPS } from './ChatPanelHeaderTools';
14
+ export type { ChatPanelHeaderToolsProps } from './ChatPanelHeaderTools';
11
15
  export { default as ChatAgentFab } from './ChatAgentFab';
12
16
  export type { ChatAgentFabProps } from './ChatAgentFab';
13
17
  export { default as ChatAgentFabLayout } from './ChatAgentFabLayout';
@@ -16,6 +16,8 @@ export type AuditLogListProps = {
16
16
  exportLoading?: boolean;
17
17
  pagination?: false | object;
18
18
  className?: string;
19
+ /** platform 系统列:SSO SystemApp.code → name;缺则回落 systemAppId */
20
+ systemAppNames?: Record<string, string>;
19
21
  };
20
22
  export declare const AuditStepContent: React.FC<{
21
23
  step: AuditStep;