@ai-group/chat-sdk 3.4.5 → 3.5.0-alpha1

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 (44) hide show
  1. package/dist/cjs/components/FolderTree/styles.js +2 -1
  2. package/dist/cjs/components/FolderTree/styles.js.map +2 -2
  3. package/dist/cjs/components/XAdkChatbot/index.d.ts +2 -2
  4. package/dist/cjs/components/XAdkChatbot/index.js +433 -389
  5. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  6. package/dist/cjs/components/XAdkSender/index.js +22 -3
  7. package/dist/cjs/components/XAdkSender/index.js.map +2 -2
  8. package/dist/cjs/components/XAdkThoughtChain/styles.d.ts +0 -1
  9. package/dist/cjs/components/XAdkThoughtChain/styles.js +0 -9
  10. package/dist/cjs/components/XAdkThoughtChain/styles.js.map +2 -2
  11. package/dist/cjs/hooks/useADKChat.js +2 -0
  12. package/dist/cjs/hooks/useADKChat.js.map +2 -2
  13. package/dist/cjs/presets/xGroupAdk.js +0 -1
  14. package/dist/cjs/presets/xGroupAdk.js.map +2 -2
  15. package/dist/cjs/types/XAdkChatbot.d.ts +12 -0
  16. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  17. package/dist/cjs/types/XAdkSender.d.ts +6 -0
  18. package/dist/cjs/types/XAdkSender.js.map +1 -1
  19. package/dist/cjs/utils/umdEntry.d.ts +25 -1
  20. package/dist/cjs/utils/umdEntry.js +126 -41
  21. package/dist/cjs/utils/umdEntry.js.map +3 -3
  22. package/dist/esm/components/FolderTree/styles.js +1 -1
  23. package/dist/esm/components/FolderTree/styles.js.map +1 -1
  24. package/dist/esm/components/XAdkChatbot/index.d.ts +2 -2
  25. package/dist/esm/components/XAdkChatbot/index.js +69 -14
  26. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  27. package/dist/esm/components/XAdkSender/index.js +28 -5
  28. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  29. package/dist/esm/components/XAdkThoughtChain/styles.d.ts +0 -1
  30. package/dist/esm/components/XAdkThoughtChain/styles.js +19 -20
  31. package/dist/esm/components/XAdkThoughtChain/styles.js.map +1 -1
  32. package/dist/esm/hooks/useADKChat.js +10 -6
  33. package/dist/esm/hooks/useADKChat.js.map +1 -1
  34. package/dist/esm/presets/xGroupAdk.js +0 -1
  35. package/dist/esm/presets/xGroupAdk.js.map +1 -1
  36. package/dist/esm/types/XAdkChatbot.d.ts +12 -0
  37. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  38. package/dist/esm/types/XAdkSender.d.ts +6 -0
  39. package/dist/esm/types/XAdkSender.js.map +1 -1
  40. package/dist/esm/utils/umdEntry.d.ts +25 -1
  41. package/dist/esm/utils/umdEntry.js +162 -70
  42. package/dist/esm/utils/umdEntry.js.map +1 -1
  43. package/dist/umd/chat-sdk.min.js +1 -1
  44. package/package.json +1 -1
@@ -36,9 +36,88 @@ var import_react = require("react");
36
36
  var import_client = __toESM(require("react-dom/client"));
37
37
  var import_XAdkProvider = __toESM(require("../components/XAdkProvider"));
38
38
  var import_jsx_runtime = require("react/jsx-runtime");
39
+ var SDKWrapper = (0, import_react.forwardRef)(
40
+ ({
41
+ token: initialToken,
42
+ showSessionList,
43
+ allowUpload,
44
+ draggable,
45
+ clearBtnShow,
46
+ ...rest
47
+ }, ref) => {
48
+ const [token, setToken] = (0, import_react.useState)(initialToken);
49
+ const providerRef = (0, import_react.createRef)();
50
+ (0, import_react.useImperativeHandle)(
51
+ ref,
52
+ () => ({
53
+ setToken,
54
+ startChat: (content) => {
55
+ var _a;
56
+ return (_a = providerRef.current) == null ? void 0 : _a.startChat(content);
57
+ },
58
+ stopChat: () => {
59
+ var _a;
60
+ return (_a = providerRef.current) == null ? void 0 : _a.stopChat();
61
+ },
62
+ reChat: () => {
63
+ var _a;
64
+ return (_a = providerRef.current) == null ? void 0 : _a.reChat();
65
+ },
66
+ clearChat: () => {
67
+ var _a;
68
+ return (_a = providerRef.current) == null ? void 0 : _a.clearChat();
69
+ },
70
+ deleteSession: (id) => {
71
+ var _a;
72
+ return (_a = providerRef.current) == null ? void 0 : _a.deleteSession(id);
73
+ },
74
+ updateSession: (id, title) => {
75
+ var _a;
76
+ return (_a = providerRef.current) == null ? void 0 : _a.updateSession(id, title);
77
+ },
78
+ getAppInfo: () => {
79
+ var _a;
80
+ return (_a = providerRef.current) == null ? void 0 : _a.getAppInfo();
81
+ },
82
+ getMessages: () => {
83
+ var _a;
84
+ return ((_a = providerRef.current) == null ? void 0 : _a.getMessages()) ?? [];
85
+ },
86
+ getSessions: () => {
87
+ var _a;
88
+ return ((_a = providerRef.current) == null ? void 0 : _a.getSessions()) ?? [];
89
+ },
90
+ setMessages: (msgs) => {
91
+ var _a;
92
+ return (_a = providerRef.current) == null ? void 0 : _a.setMessages(msgs);
93
+ },
94
+ setCurrentSession: (id) => {
95
+ var _a;
96
+ return (_a = providerRef.current) == null ? void 0 : _a.setCurrentSession(id);
97
+ },
98
+ setStateDelta: (delta) => {
99
+ var _a;
100
+ return (_a = providerRef.current) == null ? void 0 : _a.setStateDelta(delta);
101
+ }
102
+ }),
103
+ [providerRef]
104
+ );
105
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_XAdkProvider.default, { ref: providerRef, ...rest, token, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
106
+ import_XAdkProvider.default.DefaultLayout,
107
+ {
108
+ showSessionList,
109
+ allowUpload,
110
+ draggable,
111
+ clearBtnShow,
112
+ showFnCallDetail: true
113
+ }
114
+ ) });
115
+ }
116
+ );
117
+ SDKWrapper.displayName = "SDKWrapper";
39
118
  var XAiWebSDK = class {
40
119
  constructor(container, props) {
41
- this.providerRef = (0, import_react.createRef)();
120
+ this.wrapperRef = (0, import_react.createRef)();
42
121
  this.container = container;
43
122
  this.props = props;
44
123
  this.onError = props.onError;
@@ -53,34 +132,22 @@ var XAiWebSDK = class {
53
132
  const allowUpload = config.allowUpload ?? false;
54
133
  const draggable = config.draggable ?? true;
55
134
  const clearBtnShow = ((_b = config.chatProps) == null ? void 0 : _b.clearBtnShow) ?? true;
135
+ const element = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
136
+ SDKWrapper,
137
+ {
138
+ ref: this.wrapperRef,
139
+ ...this.props,
140
+ showSessionList,
141
+ allowUpload,
142
+ draggable,
143
+ clearBtnShow
144
+ }
145
+ ) });
56
146
  if (import_client.default.createRoot) {
57
147
  this.root = import_client.default.createRoot(this.container);
58
- this.root.render(
59
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_XAdkProvider.default, { ref: this.providerRef, ...this.props, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
60
- import_XAdkProvider.default.DefaultLayout,
61
- {
62
- showSessionList,
63
- allowUpload,
64
- draggable,
65
- clearBtnShow,
66
- showFnCallDetail: true
67
- }
68
- ) }) })
69
- );
148
+ this.root.render(element);
70
149
  } else {
71
- import_client.default.render(
72
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { width: "100%", height: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_XAdkProvider.default, { ref: this.providerRef, ...this.props, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
73
- import_XAdkProvider.default.DefaultLayout,
74
- {
75
- showSessionList,
76
- allowUpload,
77
- draggable,
78
- clearBtnShow,
79
- showFnCallDetail: true
80
- }
81
- ) }) }),
82
- this.container
83
- );
150
+ import_client.default.render(element, this.container);
84
151
  }
85
152
  }
86
153
  unmount() {
@@ -151,6 +218,24 @@ var XAiWebSDK = class {
151
218
  return this.initChatbot(props);
152
219
  }
153
220
  // ————对外暴露的方法————
221
+ /**
222
+ * 动态更新认证 token
223
+ *
224
+ * 用于 token 过期后刷新,更新后后续的 API 请求将使用新 token,无需重新初始化 SDK。
225
+ *
226
+ * @param token - 新的认证 token
227
+ *
228
+ * @example
229
+ * ```javascript
230
+ * // 监听到 token 过期后
231
+ * const newToken = await refreshToken();
232
+ * sdk.setToken(newToken);
233
+ * ```
234
+ */
235
+ setToken(token) {
236
+ var _a;
237
+ (_a = this.wrapperRef.current) == null ? void 0 : _a.setToken(token);
238
+ }
154
239
  /**
155
240
  * 获取当前数据(聚合方法)
156
241
  * @returns 应用信息、消息列表、会话列表
@@ -158,9 +243,9 @@ var XAiWebSDK = class {
158
243
  getData() {
159
244
  var _a, _b, _c;
160
245
  return {
161
- appInfo: (_a = this.providerRef.current) == null ? void 0 : _a.getAppInfo(),
162
- messages: (_b = this.providerRef.current) == null ? void 0 : _b.getMessages(),
163
- sessions: (_c = this.providerRef.current) == null ? void 0 : _c.getSessions()
246
+ appInfo: (_a = this.wrapperRef.current) == null ? void 0 : _a.getAppInfo(),
247
+ messages: (_b = this.wrapperRef.current) == null ? void 0 : _b.getMessages(),
248
+ sessions: (_c = this.wrapperRef.current) == null ? void 0 : _c.getSessions()
164
249
  };
165
250
  }
166
251
  /**
@@ -169,7 +254,7 @@ var XAiWebSDK = class {
169
254
  */
170
255
  getAppInfo() {
171
256
  var _a;
172
- return (_a = this.providerRef.current) == null ? void 0 : _a.getAppInfo();
257
+ return (_a = this.wrapperRef.current) == null ? void 0 : _a.getAppInfo();
173
258
  }
174
259
  /**
175
260
  * 获取当前会话的消息列表
@@ -177,7 +262,7 @@ var XAiWebSDK = class {
177
262
  */
178
263
  getMessages() {
179
264
  var _a;
180
- return (_a = this.providerRef.current) == null ? void 0 : _a.getMessages();
265
+ return (_a = this.wrapperRef.current) == null ? void 0 : _a.getMessages();
181
266
  }
182
267
  /**
183
268
  * 获取会话列表
@@ -185,7 +270,7 @@ var XAiWebSDK = class {
185
270
  */
186
271
  getSessions() {
187
272
  var _a;
188
- return (_a = this.providerRef.current) == null ? void 0 : _a.getSessions();
273
+ return (_a = this.wrapperRef.current) == null ? void 0 : _a.getSessions();
189
274
  }
190
275
  /**
191
276
  * 设置消息列表
@@ -193,7 +278,7 @@ var XAiWebSDK = class {
193
278
  */
194
279
  setMessages(msgs) {
195
280
  var _a;
196
- (_a = this.providerRef.current) == null ? void 0 : _a.setMessages(msgs);
281
+ (_a = this.wrapperRef.current) == null ? void 0 : _a.setMessages(msgs);
197
282
  }
198
283
  /**
199
284
  * 发送消息
@@ -206,28 +291,28 @@ var XAiWebSDK = class {
206
291
  */
207
292
  startChat(content) {
208
293
  var _a;
209
- (_a = this.providerRef.current) == null ? void 0 : _a.startChat(content);
294
+ (_a = this.wrapperRef.current) == null ? void 0 : _a.startChat(content);
210
295
  }
211
296
  /**
212
297
  * 停止当前消息生成
213
298
  */
214
299
  stopChat() {
215
300
  var _a;
216
- (_a = this.providerRef.current) == null ? void 0 : _a.stopChat();
301
+ (_a = this.wrapperRef.current) == null ? void 0 : _a.stopChat();
217
302
  }
218
303
  /**
219
304
  * 重新生成最后一条回复
220
305
  */
221
306
  reChat() {
222
307
  var _a;
223
- (_a = this.providerRef.current) == null ? void 0 : _a.reChat();
308
+ (_a = this.wrapperRef.current) == null ? void 0 : _a.reChat();
224
309
  }
225
310
  /**
226
311
  * 清空当前会话
227
312
  */
228
313
  clearChat() {
229
314
  var _a;
230
- (_a = this.providerRef.current) == null ? void 0 : _a.clearChat();
315
+ (_a = this.wrapperRef.current) == null ? void 0 : _a.clearChat();
231
316
  }
232
317
  /**
233
318
  * 切换到指定会话
@@ -235,7 +320,7 @@ var XAiWebSDK = class {
235
320
  */
236
321
  setCurrentSession(sessionId) {
237
322
  var _a;
238
- (_a = this.providerRef.current) == null ? void 0 : _a.setCurrentSession(sessionId);
323
+ (_a = this.wrapperRef.current) == null ? void 0 : _a.setCurrentSession(sessionId);
239
324
  }
240
325
  /**
241
326
  * 删除指定会话
@@ -243,7 +328,7 @@ var XAiWebSDK = class {
243
328
  */
244
329
  deleteSession(sessionId) {
245
330
  var _a;
246
- (_a = this.providerRef.current) == null ? void 0 : _a.deleteSession(sessionId);
331
+ (_a = this.wrapperRef.current) == null ? void 0 : _a.deleteSession(sessionId);
247
332
  }
248
333
  /**
249
334
  * 更新会话标题
@@ -252,7 +337,7 @@ var XAiWebSDK = class {
252
337
  */
253
338
  updateSession(sessionId, title) {
254
339
  var _a;
255
- (_a = this.providerRef.current) == null ? void 0 : _a.updateSession(sessionId, title);
340
+ (_a = this.wrapperRef.current) == null ? void 0 : _a.updateSession(sessionId, title);
256
341
  }
257
342
  /**
258
343
  * 设置自定义业务参数 (stateDelta)
@@ -261,7 +346,7 @@ var XAiWebSDK = class {
261
346
  */
262
347
  setStateDelta(delta) {
263
348
  var _a;
264
- (_a = this.providerRef.current) == null ? void 0 : _a.setStateDelta(delta);
349
+ (_a = this.wrapperRef.current) == null ? void 0 : _a.setStateDelta(delta);
265
350
  }
266
351
  };
267
352
  window.XAiWebSDK = XAiWebSDK;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/utils/umdEntry.tsx"],
4
- "sourcesContent": ["import { createRef } from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { XAdkSDKProps, XAdkProviderHandle, IMessage } from \"@/types\";\nimport XAdkProvider from \"@/components/XAdkProvider\";\nimport { SendContent } from \"@/types\";\n\n/**\n * XAiWebSDK - UMD 入口类\n *\n * 用于通过 <script> 标签引入 SDK 的场景\n *\n * @example\n * ```html\n * <script src=\"chat-sdk.min.js\"></script>\n * <script>\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true\n * }\n * }\n * });\n * </script>\n * ```\n */\nclass XAiWebSDK {\n container: HTMLElement;\n\n props: XAdkSDKProps;\n\n root: any;\n\n providerRef = createRef<XAdkProviderHandle>();\n\n // ———— hook ————\n onError?: (error: any) => void;\n\n onSuccess?: (appInfo: any) => void;\n\n onMessage?: (content: string, data: IMessage) => void;\n\n constructor(container: HTMLElement, props: XAdkSDKProps) {\n this.container = container;\n this.props = props;\n this.onError = props.onError;\n this.onSuccess = props.onSuccess;\n this.onMessage = props.onMessage;\n this.mount();\n }\n\n mount() {\n // 提取配置\n const { config = {} } = this.props;\n const showSessionList = config.session?.showSessionList ?? false;\n const allowUpload = config.allowUpload ?? false;\n const draggable = config.draggable ?? true;\n const clearBtnShow = config.chatProps?.clearBtnShow ?? true;\n\n if (ReactDOM.createRoot) {\n this.root = ReactDOM.createRoot(this.container);\n this.root.render(\n <div style={{ width: \"100%\", height: \"100%\" }}>\n <XAdkProvider ref={this.providerRef} {...this.props}>\n {/* 使用 DefaultLayout 作为默认布局 */}\n <XAdkProvider.DefaultLayout\n showSessionList={showSessionList}\n allowUpload={allowUpload}\n draggable={draggable}\n clearBtnShow={clearBtnShow}\n showFnCallDetail={true}\n />\n </XAdkProvider>\n </div>,\n );\n } else {\n // 兼容 React 17\n // @ts-ignore\n ReactDOM.render(\n <div style={{ width: \"100%\", height: \"100%\" }}>\n <XAdkProvider ref={this.providerRef} {...this.props}>\n <XAdkProvider.DefaultLayout\n showSessionList={showSessionList}\n allowUpload={allowUpload}\n draggable={draggable}\n clearBtnShow={clearBtnShow}\n showFnCallDetail={true}\n />\n </XAdkProvider>\n </div>,\n this.container,\n );\n }\n }\n\n unmount() {\n if (this.root && this.root.unmount) {\n this.root.unmount();\n }\n }\n\n /**\n * 初始化聊天机器人(推荐方式)\n *\n * @param props - SDK 配置参数\n * @returns XAiWebSDK 实例\n *\n * @example\n * ```javascript\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true // 显示会话列表\n * },\n * allowUpload: true, // 允许文件上传\n * chatProps: {\n * clearBtnShow: false // 隐藏清空按钮\n * }\n * },\n * componentProps: {\n * id: 'my-chatbot', // 容器 ID\n * width: '100%',\n * height: '600px'\n * }\n * });\n * ```\n */\n static initChatbot(props: XAdkSDKProps): XAiWebSDK {\n let container: HTMLElement;\n\n // 检查是否有指定的 componentProps.id\n if (props.componentProps?.id) {\n const existingContainer = document.getElementById(\n props.componentProps.id,\n );\n if (existingContainer) {\n container = existingContainer;\n } else {\n // 如果指定的 ID 不存在,创建新元素\n container = document.createElement(\"div\");\n container.id = props.componentProps.id;\n }\n } else {\n // 没有指定 ID,创建默认容器\n container = document.createElement(\"div\");\n container.id = \"xai-chatbot-container\";\n }\n\n // 设置容器样式 - 将除了 id 以外的所有属性都应用到容器\n if (props.componentProps) {\n const { id, ...styleProps } = props.componentProps;\n Object.assign(container.style, styleProps);\n }\n\n // 如果容器不在 DOM 中,添加到 body\n if (!container.parentNode) {\n document.body.appendChild(container);\n }\n\n return new XAiWebSDK(container, props);\n }\n\n /**\n * 兼容旧版本的静态方法\n * @deprecated 使用 initChatbot 替代\n */\n static create(props: XAdkSDKProps): XAiWebSDK {\n return this.initChatbot(props);\n }\n\n // ————对外暴露的方法————\n\n /**\n * 获取当前数据(聚合方法)\n * @returns 应用信息、消息列表、会话列表\n */\n getData() {\n return {\n appInfo: this.providerRef.current?.getAppInfo(),\n messages: this.providerRef.current?.getMessages(),\n sessions: this.providerRef.current?.getSessions(),\n };\n }\n\n /**\n * 获取应用信息\n * @returns 应用信息\n */\n getAppInfo() {\n return this.providerRef.current?.getAppInfo();\n }\n\n /**\n * 获取当前会话的消息列表\n * @returns 消息列表\n */\n getMessages() {\n return this.providerRef.current?.getMessages();\n }\n\n /**\n * 获取会话列表\n * @returns 会话列表\n */\n getSessions() {\n return this.providerRef.current?.getSessions();\n }\n\n /**\n * 设置消息列表\n * @param msgs - 要设置的消息数组\n */\n setMessages(msgs: IMessage[]) {\n this.providerRef.current?.setMessages(msgs);\n }\n\n /**\n * 发送消息\n * @param content - 消息内容\n *\n * @example\n * ```javascript\n * sdk.startChat({ text: 'Hello!' });\n * ```\n */\n startChat(content: SendContent) {\n this.providerRef.current?.startChat(content);\n }\n\n /**\n * 停止当前消息生成\n */\n stopChat() {\n this.providerRef.current?.stopChat();\n }\n\n /**\n * 重新生成最后一条回复\n */\n reChat() {\n this.providerRef.current?.reChat();\n }\n\n /**\n * 清空当前会话\n */\n clearChat() {\n this.providerRef.current?.clearChat();\n }\n\n /**\n * 切换到指定会话\n * @param sessionId - 会话 ID\n */\n setCurrentSession(sessionId: string) {\n this.providerRef.current?.setCurrentSession(sessionId);\n }\n\n /**\n * 删除指定会话\n * @param sessionId - 会话 ID\n */\n deleteSession(sessionId: string) {\n this.providerRef.current?.deleteSession(sessionId);\n }\n\n /**\n * 更新会话标题\n * @param sessionId - 会话 ID\n * @param title - 新标题\n */\n updateSession(sessionId: string, title: string) {\n this.providerRef.current?.updateSession(sessionId, title);\n }\n\n /**\n * 设置自定义业务参数 (stateDelta)\n * 设置后每次发送消息时会自动携带至后端\n * @param delta - 自定义参数,传入 undefined 可清除\n */\n setStateDelta(delta: Record<string, any> | undefined) {\n this.providerRef.current?.setStateDelta(delta);\n }\n}\n\n// 兼容 window 方式,也支持 new\n// @ts-ignore\nwindow.XAiWebSDK = XAiWebSDK;\n\n// 支持 ESModule/UMD 直接 import\nexport default XAiWebSDK;\n"],
5
- "mappings": "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",
6
- "names": ["ReactDOM", "XAdkProvider"]
4
+ "sourcesContent": ["import { createRef, useState, useImperativeHandle, forwardRef } from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { XAdkSDKProps, XAdkProviderHandle, IMessage } from \"@/types\";\nimport XAdkProvider from \"@/components/XAdkProvider\";\nimport { SendContent } from \"@/types\";\n\n/**\n * 内部包装组件:管理 token 状态,支持运行时动态更新\n */\ninterface WrapperHandle extends XAdkProviderHandle {\n setToken: (token: string) => void;\n}\n\ninterface WrapperProps extends Omit<XAdkSDKProps, \"children\"> {\n showSessionList: boolean;\n allowUpload: boolean;\n draggable: boolean;\n clearBtnShow: boolean;\n}\n\nconst SDKWrapper = forwardRef<WrapperHandle, WrapperProps>(\n (\n {\n token: initialToken,\n showSessionList,\n allowUpload,\n draggable,\n clearBtnShow,\n ...rest\n },\n ref,\n ) => {\n const [token, setToken] = useState(initialToken);\n const providerRef = createRef<XAdkProviderHandle>();\n\n useImperativeHandle(\n ref,\n () => ({\n setToken,\n startChat: (content: SendContent) =>\n providerRef.current?.startChat(content),\n stopChat: () => providerRef.current?.stopChat(),\n reChat: () => providerRef.current?.reChat(),\n clearChat: () => providerRef.current?.clearChat(),\n deleteSession: (id: string) =>\n providerRef.current?.deleteSession(id),\n updateSession: (id: string, title: string) =>\n providerRef.current?.updateSession(id, title),\n getAppInfo: () => providerRef.current?.getAppInfo(),\n getMessages: () => providerRef.current?.getMessages() ?? [],\n getSessions: () => providerRef.current?.getSessions() ?? [],\n setMessages: (msgs: IMessage[]) =>\n providerRef.current?.setMessages(msgs),\n setCurrentSession: (id: string) =>\n providerRef.current?.setCurrentSession(id),\n setStateDelta: (delta: Record<string, any> | undefined) =>\n providerRef.current?.setStateDelta(delta),\n }),\n [providerRef],\n );\n\n return (\n <XAdkProvider ref={providerRef} {...rest} token={token}>\n <XAdkProvider.DefaultLayout\n showSessionList={showSessionList}\n allowUpload={allowUpload}\n draggable={draggable}\n clearBtnShow={clearBtnShow}\n showFnCallDetail={true}\n />\n </XAdkProvider>\n );\n },\n);\n\nSDKWrapper.displayName = \"SDKWrapper\";\n\n/**\n * XAiWebSDK - UMD 入口类\n *\n * 用于通过 <script> 标签引入 SDK 的场景\n *\n * @example\n * ```html\n * <script src=\"chat-sdk.min.js\"></script>\n * <script>\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true\n * }\n * }\n * });\n *\n * // token 过期后动态更新\n * sdk.setToken('new-token');\n * </script>\n * ```\n */\nclass XAiWebSDK {\n container: HTMLElement;\n\n props: XAdkSDKProps;\n\n root: any;\n\n wrapperRef = createRef<WrapperHandle>();\n\n // ———— hook ————\n onError?: (error: any) => void;\n\n onSuccess?: (appInfo: any) => void;\n\n onMessage?: (content: string, data: IMessage) => void;\n\n constructor(container: HTMLElement, props: XAdkSDKProps) {\n this.container = container;\n this.props = props;\n this.onError = props.onError;\n this.onSuccess = props.onSuccess;\n this.onMessage = props.onMessage;\n this.mount();\n }\n\n mount() {\n // 提取配置\n const { config = {} } = this.props;\n const showSessionList = config.session?.showSessionList ?? false;\n const allowUpload = config.allowUpload ?? false;\n const draggable = config.draggable ?? true;\n const clearBtnShow = config.chatProps?.clearBtnShow ?? true;\n\n const element = (\n <div style={{ width: \"100%\", height: \"100%\" }}>\n <SDKWrapper\n ref={this.wrapperRef}\n {...this.props}\n showSessionList={showSessionList}\n allowUpload={allowUpload}\n draggable={draggable}\n clearBtnShow={clearBtnShow}\n />\n </div>\n );\n\n if (ReactDOM.createRoot) {\n this.root = ReactDOM.createRoot(this.container);\n this.root.render(element);\n } else {\n // 兼容 React 17\n // @ts-ignore\n ReactDOM.render(element, this.container);\n }\n }\n\n unmount() {\n if (this.root && this.root.unmount) {\n this.root.unmount();\n }\n }\n\n /**\n * 初始化聊天机器人(推荐方式)\n *\n * @param props - SDK 配置参数\n * @returns XAiWebSDK 实例\n *\n * @example\n * ```javascript\n * const sdk = XAiWebSDK.initChatbot({\n * url: 'https://api.example.com',\n * token: 'your-token',\n * config: {\n * appNo: 'your-app-no',\n * session: {\n * showSessionList: true // 显示会话列表\n * },\n * allowUpload: true, // 允许文件上传\n * chatProps: {\n * clearBtnShow: false // 隐藏清空按钮\n * }\n * },\n * componentProps: {\n * id: 'my-chatbot', // 容器 ID\n * width: '100%',\n * height: '600px'\n * }\n * });\n * ```\n */\n static initChatbot(props: XAdkSDKProps): XAiWebSDK {\n let container: HTMLElement;\n\n // 检查是否有指定的 componentProps.id\n if (props.componentProps?.id) {\n const existingContainer = document.getElementById(\n props.componentProps.id,\n );\n if (existingContainer) {\n container = existingContainer;\n } else {\n // 如果指定的 ID 不存在,创建新元素\n container = document.createElement(\"div\");\n container.id = props.componentProps.id;\n }\n } else {\n // 没有指定 ID,创建默认容器\n container = document.createElement(\"div\");\n container.id = \"xai-chatbot-container\";\n }\n\n // 设置容器样式 - 将除了 id 以外的所有属性都应用到容器\n if (props.componentProps) {\n const { id, ...styleProps } = props.componentProps;\n Object.assign(container.style, styleProps);\n }\n\n // 如果容器不在 DOM 中,添加到 body\n if (!container.parentNode) {\n document.body.appendChild(container);\n }\n\n return new XAiWebSDK(container, props);\n }\n\n /**\n * 兼容旧版本的静态方法\n * @deprecated 使用 initChatbot 替代\n */\n static create(props: XAdkSDKProps): XAiWebSDK {\n return this.initChatbot(props);\n }\n\n // ————对外暴露的方法————\n\n /**\n * 动态更新认证 token\n *\n * 用于 token 过期后刷新,更新后后续的 API 请求将使用新 token,无需重新初始化 SDK。\n *\n * @param token - 新的认证 token\n *\n * @example\n * ```javascript\n * // 监听到 token 过期后\n * const newToken = await refreshToken();\n * sdk.setToken(newToken);\n * ```\n */\n setToken(token: string) {\n this.wrapperRef.current?.setToken(token);\n }\n\n /**\n * 获取当前数据(聚合方法)\n * @returns 应用信息、消息列表、会话列表\n */\n getData() {\n return {\n appInfo: this.wrapperRef.current?.getAppInfo(),\n messages: this.wrapperRef.current?.getMessages(),\n sessions: this.wrapperRef.current?.getSessions(),\n };\n }\n\n /**\n * 获取应用信息\n * @returns 应用信息\n */\n getAppInfo() {\n return this.wrapperRef.current?.getAppInfo();\n }\n\n /**\n * 获取当前会话的消息列表\n * @returns 消息列表\n */\n getMessages() {\n return this.wrapperRef.current?.getMessages();\n }\n\n /**\n * 获取会话列表\n * @returns 会话列表\n */\n getSessions() {\n return this.wrapperRef.current?.getSessions();\n }\n\n /**\n * 设置消息列表\n * @param msgs - 要设置的消息数组\n */\n setMessages(msgs: IMessage[]) {\n this.wrapperRef.current?.setMessages(msgs);\n }\n\n /**\n * 发送消息\n * @param content - 消息内容\n *\n * @example\n * ```javascript\n * sdk.startChat({ text: 'Hello!' });\n * ```\n */\n startChat(content: SendContent) {\n this.wrapperRef.current?.startChat(content);\n }\n\n /**\n * 停止当前消息生成\n */\n stopChat() {\n this.wrapperRef.current?.stopChat();\n }\n\n /**\n * 重新生成最后一条回复\n */\n reChat() {\n this.wrapperRef.current?.reChat();\n }\n\n /**\n * 清空当前会话\n */\n clearChat() {\n this.wrapperRef.current?.clearChat();\n }\n\n /**\n * 切换到指定会话\n * @param sessionId - 会话 ID\n */\n setCurrentSession(sessionId: string) {\n this.wrapperRef.current?.setCurrentSession(sessionId);\n }\n\n /**\n * 删除指定会话\n * @param sessionId - 会话 ID\n */\n deleteSession(sessionId: string) {\n this.wrapperRef.current?.deleteSession(sessionId);\n }\n\n /**\n * 更新会话标题\n * @param sessionId - 会话 ID\n * @param title - 新标题\n */\n updateSession(sessionId: string, title: string) {\n this.wrapperRef.current?.updateSession(sessionId, title);\n }\n\n /**\n * 设置自定义业务参数 (stateDelta)\n * 设置后每次发送消息时会自动携带至后端\n * @param delta - 自定义参数,传入 undefined 可清除\n */\n setStateDelta(delta: Record<string, any> | undefined) {\n this.wrapperRef.current?.setStateDelta(delta);\n }\n}\n\n// 兼容 window 方式,也支持 new\n// @ts-ignore\nwindow.XAiWebSDK = XAiWebSDK;\n\n// 支持 ESModule/UMD 直接 import\nexport default XAiWebSDK;\n"],
5
+ "mappings": "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",
6
+ "names": ["XAdkProvider", "ReactDOM"]
7
7
  }
@@ -15,7 +15,7 @@ export var useStyles = withBasicStyles(function () {
15
15
  emptyContainer: css(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n "]))),
16
16
  loadingContainer: css(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n "]))),
17
17
  treeNodeTitle: css(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-right: 4px;\n "]))),
18
- moreIcon: css(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n opacity: 0;\n cursor: pointer;\n padding: 2px 4px;\n border-radius: 4px;\n color: #999;\n font-size: 14px;\n transition: all 0.2s;\n &:hover {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n "]))),
18
+ moreIcon: css(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n opacity: 0;\n cursor: pointer;\n padding: 0 4px;\n margin: 2px;\n border-radius: 4px;\n color: #999;\n font-size: 14px;\n transition: all 0.2s;\n &:hover {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n "]))),
19
19
  treeNodeTitleHover: css(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n &:hover .folder-tree-more-icon {\n opacity: 1;\n }\n "]))),
20
20
  copyBtn: css(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n cursor: pointer;\n color: #999;\n font-size: 14px;\n &:hover {\n color: #1677ff;\n }\n "])))
21
21
  };
@@ -1 +1 @@
1
- {"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","containerNoPreview","_templateObject2","directoryPanel","_templateObject3","directoryTitle","_templateObject4","directoryTreeContent","_templateObject5","previewPanel","_templateObject6","previewTitle","_templateObject7","previewContent","_templateObject8","emptyContainer","_templateObject9","loadingContainer","_templateObject10","treeNodeTitle","_templateObject11","moreIcon","_templateObject12","treeNodeTitleHover","_templateObject13","copyBtn","_templateObject14"],"sources":["../../../../src/components/FolderTree/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n display: flex;\n width: 100%;\n height: 500px;\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n overflow: hidden;\n background: #fff;\n `,\n containerNoPreview: css`\n height: auto;\n border: none;\n border-radius: 0;\n & > *:first-child {\n border-right: none;\n }\n `,\n directoryPanel: css`\n height: 100%;\n overflow: auto;\n border-right: 1px solid #e8e8e8;\n background: var(--folder-tree-directory-bg, #fafafa);\n `,\n directoryTitle: css`\n padding: 12px 16px;\n font-weight: 600;\n font-size: 14px;\n border-bottom: 1px solid #e8e8e8;\n color: #333;\n `,\n directoryTreeContent: css`\n padding: 4px 0;\n .ant-tree {\n background: transparent;\n }\n .ant-tree-switcher {\n margin-right: 0;\n }\n .ant-tree .ant-tree-node-content-wrapper {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding-left: 0;\n }\n .ant-tree .ant-tree-title {\n flex: 1;\n min-width: 0;\n }\n .ant-tree-directory .ant-tree-treenode {\n &::before {\n border-radius: 4px;\n }\n }\n /* 拖拽指示线:蓝色虚线 */\n .ant-tree .ant-tree-drop-indicator {\n background: transparent !important;\n border: 1px dashed #1677ff;\n height: 2px;\n }\n /* 拖拽悬停目标:蓝色虚线边框 */\n .ant-tree .ant-tree-treenode.drag-over > .ant-tree-node-content-wrapper {\n outline: 1px dashed #1677ff;\n outline-offset: -1px;\n border-radius: 4px;\n }\n /* 拖拽中的节点半透明 */\n .ant-tree .ant-tree-treenode-dragging {\n opacity: 0.4;\n }\n `,\n previewPanel: css`\n flex: 1;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n `,\n previewTitle: css`\n padding: 10px 16px;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 1px solid #e8e8e8;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #333;\n background: #fff;\n `,\n previewContent: css`\n flex: 1;\n overflow: auto;\n padding: 16px;\n font-size: 13px;\n line-height: 1.6;\n `,\n emptyContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n loadingContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n treeNodeTitle: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-right: 4px;\n `,\n moreIcon: css`\n opacity: 0;\n cursor: pointer;\n padding: 2px 4px;\n border-radius: 4px;\n color: #999;\n font-size: 14px;\n transition: all 0.2s;\n &:hover {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n `,\n treeNodeTitleHover: css`\n &:hover .folder-tree-more-icon {\n opacity: 1;\n }\n `,\n copyBtn: css`\n cursor: pointer;\n color: #999;\n font-size: 14px;\n &:hover {\n color: #1677ff;\n }\n `,\n}));\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,SAAS,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,6KAQb;IACDC,kBAAkB,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,oIAOtB;IACDG,cAAc,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,qJAKlB;IACDK,cAAc,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,2IAMlB;IACDO,oBAAoB,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,4mCAwCxB;IACDS,YAAY,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,mHAMhB;IACDW,YAAY,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,qPAUhB;IACDa,cAAc,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,gHAMlB;IACDe,cAAc,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,2GAKlB;IACDiB,gBAAgB,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,2GAKpB;IACDmB,aAAa,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,wHAKjB;IACDqB,QAAQ,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,wPAYZ;IACDuB,kBAAkB,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA,4EAItB;IACDyB,OAAO,EAAE9B,GAAG,CAAA+B,iBAAA,KAAAA,iBAAA,GAAA1B,sBAAA;EAQd,CAAC;AAAA,CAAC,CAAC"}
1
+ {"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","containerNoPreview","_templateObject2","directoryPanel","_templateObject3","directoryTitle","_templateObject4","directoryTreeContent","_templateObject5","previewPanel","_templateObject6","previewTitle","_templateObject7","previewContent","_templateObject8","emptyContainer","_templateObject9","loadingContainer","_templateObject10","treeNodeTitle","_templateObject11","moreIcon","_templateObject12","treeNodeTitleHover","_templateObject13","copyBtn","_templateObject14"],"sources":["../../../../src/components/FolderTree/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n display: flex;\n width: 100%;\n height: 500px;\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n overflow: hidden;\n background: #fff;\n `,\n containerNoPreview: css`\n height: auto;\n border: none;\n border-radius: 0;\n & > *:first-child {\n border-right: none;\n }\n `,\n directoryPanel: css`\n height: 100%;\n overflow: auto;\n border-right: 1px solid #e8e8e8;\n background: var(--folder-tree-directory-bg, #fafafa);\n `,\n directoryTitle: css`\n padding: 12px 16px;\n font-weight: 600;\n font-size: 14px;\n border-bottom: 1px solid #e8e8e8;\n color: #333;\n `,\n directoryTreeContent: css`\n padding: 4px 0;\n .ant-tree {\n background: transparent;\n }\n .ant-tree-switcher {\n margin-right: 0;\n }\n .ant-tree .ant-tree-node-content-wrapper {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding-left: 0;\n }\n .ant-tree .ant-tree-title {\n flex: 1;\n min-width: 0;\n }\n .ant-tree-directory .ant-tree-treenode {\n &::before {\n border-radius: 4px;\n }\n }\n /* 拖拽指示线:蓝色虚线 */\n .ant-tree .ant-tree-drop-indicator {\n background: transparent !important;\n border: 1px dashed #1677ff;\n height: 2px;\n }\n /* 拖拽悬停目标:蓝色虚线边框 */\n .ant-tree .ant-tree-treenode.drag-over > .ant-tree-node-content-wrapper {\n outline: 1px dashed #1677ff;\n outline-offset: -1px;\n border-radius: 4px;\n }\n /* 拖拽中的节点半透明 */\n .ant-tree .ant-tree-treenode-dragging {\n opacity: 0.4;\n }\n `,\n previewPanel: css`\n flex: 1;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n `,\n previewTitle: css`\n padding: 10px 16px;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 1px solid #e8e8e8;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #333;\n background: #fff;\n `,\n previewContent: css`\n flex: 1;\n overflow: auto;\n padding: 16px;\n font-size: 13px;\n line-height: 1.6;\n `,\n emptyContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n loadingContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n treeNodeTitle: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-right: 4px;\n `,\n moreIcon: css`\n opacity: 0;\n cursor: pointer;\n padding: 0 4px;\n margin: 2px;\n border-radius: 4px;\n color: #999;\n font-size: 14px;\n transition: all 0.2s;\n &:hover {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n `,\n treeNodeTitleHover: css`\n &:hover .folder-tree-more-icon {\n opacity: 1;\n }\n `,\n copyBtn: css`\n cursor: pointer;\n color: #999;\n font-size: 14px;\n &:hover {\n color: #1677ff;\n }\n `,\n}));\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,SAAS,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,6KAQb;IACDC,kBAAkB,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,oIAOtB;IACDG,cAAc,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,qJAKlB;IACDK,cAAc,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,2IAMlB;IACDO,oBAAoB,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,4mCAwCxB;IACDS,YAAY,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,mHAMhB;IACDW,YAAY,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,qPAUhB;IACDa,cAAc,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,gHAMlB;IACDe,cAAc,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,2GAKlB;IACDiB,gBAAgB,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,2GAKpB;IACDmB,aAAa,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,wHAKjB;IACDqB,QAAQ,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,wQAaZ;IACDuB,kBAAkB,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA,4EAItB;IACDyB,OAAO,EAAE9B,GAAG,CAAA+B,iBAAA,KAAAA,iBAAA,GAAA1B,sBAAA;EAQd,CAAC;AAAA,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import type { XAdkChatbotProps } from "../../types";
2
+ import type { XAdkChatbotProps, XAdkChatbotHandle } from "../../types";
3
3
  /**
4
4
  * XAdkChatbot - 增强版聊天组件
5
5
  *
@@ -10,5 +10,5 @@ import type { XAdkChatbotProps } from "../../types";
10
10
  * - ✅ 操作栏 (重试/复制/日志)
11
11
  * - ✅ 欢迎页面 (agentName/agentIcon/description)
12
12
  */
13
- declare const XAdkChatbot: React.FC<XAdkChatbotProps>;
13
+ declare const XAdkChatbot: React.ForwardRefExoticComponent<XAdkChatbotProps & React.RefAttributes<XAdkChatbotHandle>>;
14
14
  export default XAdkChatbot;
@@ -1,6 +1,6 @@
1
1
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
- import React, { useMemo, useCallback, useEffect, useRef } from "react";
3
+ import React, { useMemo, useCallback, useEffect, useRef, useImperativeHandle, forwardRef } from "react";
4
4
  import { Button, Flex, Tooltip, message as antdMessage } from "antd";
5
5
  import clsx from "clsx";
6
6
  import { SwapRightOutlined, ReloadOutlined, CopyOutlined, InfoCircleOutlined } from "@ant-design/icons";
@@ -28,7 +28,7 @@ var scrollThreshold = 10;
28
28
  * - ✅ 操作栏 (重试/复制/日志)
29
29
  * - ✅ 欢迎页面 (agentName/agentIcon/description)
30
30
  */
31
- var XAdkChatbot = function XAdkChatbot(_ref) {
31
+ var XAdkChatbot = /*#__PURE__*/forwardRef(function (_ref, ref) {
32
32
  var _mergedStrategies$par;
33
33
  var _ref$loading = _ref.loading,
34
34
  loading = _ref$loading === void 0 ? false : _ref$loading,
@@ -55,6 +55,7 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
55
55
  parseOptions = _ref.parseOptions,
56
56
  _ref$initialized = _ref.initialized,
57
57
  initialized = _ref$initialized === void 0 ? false : _ref$initialized,
58
+ sessionId = _ref.sessionId,
58
59
  onFileClick = _ref.onFileClick,
59
60
  renderFunctionCall = _ref.renderFunctionCall,
60
61
  toolKindResolver = _ref.toolKindResolver,
@@ -66,6 +67,21 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
66
67
  var userHasScrolledRef = useRef(false);
67
68
  var messagesEndRef = useRef(null);
68
69
  var prevInitializedRef = useRef(false);
70
+ var prevSessionIdRef = useRef(sessionId);
71
+
72
+ // 暴露命令式 API
73
+ var scrollToBottom = useCallback(function () {
74
+ var _messagesEndRef$curre;
75
+ var behavior = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "auto";
76
+ (_messagesEndRef$curre = messagesEndRef.current) === null || _messagesEndRef$curre === void 0 || _messagesEndRef$curre.scrollIntoView({
77
+ behavior: behavior
78
+ });
79
+ }, []);
80
+ useImperativeHandle(ref, function () {
81
+ return {
82
+ scrollToBottom: scrollToBottom
83
+ };
84
+ }, [scrollToBottom]);
69
85
  var mergedStrategies = useMemo(function () {
70
86
  return mergeChatStrategies(preset, strategies);
71
87
  }, [preset, strategies]);
@@ -82,26 +98,59 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
82
98
  useEffect(function () {
83
99
  if (!initialized) return;
84
100
  if (!messages.length) return;
85
- if (prevInitializedRef.current) return; // 只在第一次 initialized+messages 就绪时触发
101
+ if (prevInitializedRef.current) return;
86
102
  prevInitializedRef.current = true;
87
- // 推迟到浏览器完成 paint 后执行,确保 DOM 高度已撑开
88
- var timer = setTimeout(function () {
89
- var _messagesEndRef$curre;
90
- (_messagesEndRef$curre = messagesEndRef.current) === null || _messagesEndRef$curre === void 0 || _messagesEndRef$curre.scrollIntoView({
103
+ var el = listRef.current;
104
+ if (!el) return;
105
+
106
+ // MutationObserver 监听 DOM 子树变化,等内容渲染稳定后置底
107
+ // 每次 DOM 变化都重新计时,确保所有异步渲染(Markdown、代码高亮、思维链等)完成后再滚动
108
+ var stableTimer;
109
+ var doScroll = function doScroll() {
110
+ var _messagesEndRef$curre2;
111
+ (_messagesEndRef$curre2 = messagesEndRef.current) === null || _messagesEndRef$curre2 === void 0 || _messagesEndRef$curre2.scrollIntoView({
91
112
  behavior: "auto"
92
113
  });
93
- }, 0);
114
+ };
115
+ var observer = new MutationObserver(function () {
116
+ clearTimeout(stableTimer);
117
+ stableTimer = setTimeout(doScroll, 80);
118
+ });
119
+ observer.observe(el, {
120
+ childList: true,
121
+ subtree: true,
122
+ characterData: true
123
+ });
124
+
125
+ // 立即执行一次,处理内容已经就绪的情况
126
+ doScroll();
127
+ // 兜底:最多等 500ms 后强制滚动并断开观察
128
+ var maxTimer = setTimeout(function () {
129
+ observer.disconnect();
130
+ doScroll();
131
+ }, 500);
94
132
  return function () {
95
- return clearTimeout(timer);
133
+ clearTimeout(stableTimer);
134
+ clearTimeout(maxTimer);
135
+ observer.disconnect();
96
136
  };
97
137
  }, [initialized, messages]);
98
138
 
139
+ // 会话切换时重置滚动状态,允许重新触发初始化置底
140
+ useEffect(function () {
141
+ if (sessionId === undefined) return; // 未传 sessionId 不处理
142
+ if (prevSessionIdRef.current === sessionId) return; // 同一会话不处理
143
+ prevSessionIdRef.current = sessionId;
144
+ prevInitializedRef.current = false;
145
+ userHasScrolledRef.current = false;
146
+ }, [sessionId]);
147
+
99
148
  // 流式输出时滚动到底部
100
149
  useEffect(function () {
101
- var _messagesEndRef$curre2;
150
+ var _messagesEndRef$curre3;
102
151
  if (!loading) return;
103
152
  if (userHasScrolledRef.current) return;
104
- (_messagesEndRef$curre2 = messagesEndRef.current) === null || _messagesEndRef$curre2 === void 0 || _messagesEndRef$curre2.scrollIntoView({
153
+ (_messagesEndRef$curre3 = messagesEndRef.current) === null || _messagesEndRef$curre3 === void 0 || _messagesEndRef$curre3.scrollIntoView({
105
154
  behavior: "smooth"
106
155
  });
107
156
  }, [loading, messages]);
@@ -338,17 +387,22 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
338
387
  var actionExtraNode = actionsExtra === null || actionsExtra === void 0 ? void 0 : actionsExtra(actionProps);
339
388
 
340
389
  // 4. 渲染
390
+ var lastProcessIdx = nodes.findLastIndex(function (n) {
391
+ return n.type === "process";
392
+ });
341
393
  return /*#__PURE__*/_jsxs("div", {
342
394
  className: styles.botMsg,
343
395
  children: [nodes.map(function (node, idx) {
344
396
  if (node.type === "process") {
397
+ // 只有最后一个 process node 跟随 loading 状态,已完成的思维链不应显示 loading
398
+ var isLastProcess = idx === lastProcessIdx;
345
399
  return /*#__PURE__*/_jsx(XAdkThoughtChain, {
346
- loading: isGroupLoading,
400
+ loading: isLastProcess && isGroupLoading,
347
401
  title: "\u601D\u7EF4\u94FE\u5DF2\u5B8C\u6210",
348
402
  items: node.items,
349
403
  showFnCallDetail: showFnCallDetail,
350
404
  onConfirm: onConfirm,
351
- defaultOpen: isGroupLoading,
405
+ defaultOpen: isLastProcess && isGroupLoading,
352
406
  renderFunctionCall: renderFunctionCall,
353
407
  toolKindResolver: function toolKindResolver(name) {
354
408
  return resolveToolKind(name);
@@ -525,6 +579,7 @@ var XAdkChatbot = function XAdkChatbot(_ref) {
525
579
  })]
526
580
  })
527
581
  });
528
- };
582
+ });
583
+ XAdkChatbot.displayName = "XAdkChatbot";
529
584
  export default XAdkChatbot;
530
585
  //# sourceMappingURL=index.js.map