paul-ai-assistant 1.0.5 → 1.0.7

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.
package/README.md CHANGED
@@ -43,6 +43,54 @@ function App() {
43
43
  }
44
44
  ```
45
45
 
46
+ ## API 参数
47
+
48
+ ### customFeedbackRender
49
+
50
+ 自定义点赞点踩组件渲染函数。如果不传入此参数,将使用默认的点赞点踩组件。
51
+
52
+ **类型定义:**
53
+
54
+ ```typescript
55
+ customFeedbackRender?: (props: {
56
+ feedbackValue?: { feedback: 'helpful' | 'unhelpful' };
57
+ onFeedback: (feedback: 'helpful' | 'unhelpful') => void;
58
+ message: any;
59
+ }) => ReactNode;
60
+ ```
61
+
62
+ **参数说明:**
63
+
64
+ | 参数 | 说明 | 类型 |
65
+ |------|------|------|
66
+ | feedbackValue | 当前反馈值 | `{ feedback: 'helpful' \| 'unhelpful' } \| undefined` |
67
+ | onFeedback | 反馈回调函数,调用后会提交反馈到服务端 | `(feedback: 'helpful' \| 'unhelpful') => void` |
68
+ | message | 当前消息的完整数据 | `any` |
69
+
70
+ **使用示例:**
71
+
72
+ ```tsx
73
+ <PaulAiAssistant
74
+ bizId="your-biz-id"
75
+ customFeedbackRender={({ feedbackValue, onFeedback }) => (
76
+ <div>
77
+ <button
78
+ onClick={() => onFeedback('helpful')}
79
+ style={{ color: feedbackValue?.feedback === 'helpful' ? 'green' : 'gray' }}
80
+ >
81
+ 有帮助
82
+ </button>
83
+ <button
84
+ onClick={() => onFeedback('unhelpful')}
85
+ style={{ color: feedbackValue?.feedback === 'unhelpful' ? 'red' : 'gray' }}
86
+ >
87
+ 没帮助
88
+ </button>
89
+ </div>
90
+ )}
91
+ />
92
+ ```
93
+
46
94
  ## 开发
47
95
 
48
96
  ### 环境要求
@@ -28,7 +28,8 @@ var AssistantChatApp = function AssistantChatApp(_, ref) {
28
28
  toggleMessageSelection = _useContext.toggleMessageSelection,
29
29
  isMessageSelected = _useContext.isMessageSelected,
30
30
  canCancelSelection = _useContext.canCancelSelection,
31
- enterShareMode = _useContext.enterShareMode;
31
+ enterShareMode = _useContext.enterShareMode,
32
+ customFeedbackRender = _useContext.customFeedbackRender;
32
33
  var chatListRef = useRef(null);
33
34
  var stopScrollToEndRef = useRef(false);
34
35
  var messageWidth = (MESSAGE_CARD_WIDTH === null || MESSAGE_CARD_WIDTH === void 0 ? void 0 : MESSAGE_CARD_WIDTH[messageCardWidth]) || messageCardWidth;
@@ -174,7 +175,8 @@ var AssistantChatApp = function AssistantChatApp(_, ref) {
174
175
  meta: {
175
176
  originData: message
176
177
  }
177
- }
178
+ },
179
+ customFeedbackRender: customFeedbackRender
178
180
  })), /*#__PURE__*/React.createElement(AigcTipsRender, {
179
181
  ctx: {
180
182
  meta: {
@@ -9,7 +9,7 @@ var AigcTipsRender = function AigcTipsRender(props) {
9
9
  var _ctx$meta;
10
10
  var ctx = props.ctx,
11
11
  _props$showAigcTips = props.showAigcTips,
12
- showAigcTips = _props$showAigcTips === void 0 ? true : _props$showAigcTips;
12
+ showAigcTips = _props$showAigcTips === void 0 ? false : _props$showAigcTips;
13
13
  var _ref = (ctx === null || ctx === void 0 || (_ctx$meta = ctx.meta) === null || _ctx$meta === void 0 ? void 0 : _ctx$meta.originData) || {},
14
14
  dataInfo = _ref.dataInfo;
15
15
  var headerTips = useMemo(function () {
@@ -14,7 +14,8 @@ export var FEEDBACK_TYPE = /*#__PURE__*/function (FEEDBACK_TYPE) {
14
14
  }({}); // 点踩
15
15
  var FeedBack = function FeedBack(props) {
16
16
  var _ctx$meta, _headerInfo$props;
17
- var ctx = props.ctx;
17
+ var ctx = props.ctx,
18
+ customFeedbackRender = props.customFeedbackRender;
18
19
  var _ref = (ctx === null || ctx === void 0 || (_ctx$meta = ctx.meta) === null || _ctx$meta === void 0 ? void 0 : _ctx$meta.originData) || {},
19
20
  dialogId = _ref.dialogId,
20
21
  subjectId = _ref.subjectId,
@@ -52,6 +53,25 @@ var FeedBack = function FeedBack(props) {
52
53
  }
53
54
  });
54
55
  };
56
+
57
+ // 如果传入了自定义渲染函数,使用自定义组件
58
+ if (typeof customFeedbackRender === 'function') {
59
+ var _ctx$meta2;
60
+ return customFeedbackRender({
61
+ feedbackValue: feedBackValue,
62
+ onFeedback: function onFeedback(feedback) {
63
+ setFeedBackValue({
64
+ feedback: feedback
65
+ });
66
+ onChange({
67
+ feedback: feedback
68
+ });
69
+ },
70
+ message: ctx === null || ctx === void 0 || (_ctx$meta2 = ctx.meta) === null || _ctx$meta2 === void 0 ? void 0 : _ctx$meta2.originData
71
+ });
72
+ }
73
+
74
+ // 默认渲染逻辑
55
75
  return /*#__PURE__*/React.createElement(React.Fragment, null, feedBackValue && (feedBackValue === null || feedBackValue === void 0 ? void 0 : feedBackValue.feedback) === FEEDBACK_TYPE.HELPFUL ? /*#__PURE__*/React.createElement(CSECustomIcon, {
56
76
  type: "icondianzan-mianxing",
57
77
  size: "small",
@@ -11,6 +11,7 @@
11
11
 
12
12
  .assistant-chat-paul-ai-bottom-reply {
13
13
  width: 100%;
14
+ box-sizing: border-box;
14
15
  background-color: #fff;
15
16
  border: 1px solid #d4d6db;
16
17
  border-radius: 6px;
@@ -32,6 +33,10 @@
32
33
  box-shadow: none !important;
33
34
  }
34
35
 
36
+ textarea:focus-visible {
37
+ outline: none;
38
+ }
39
+
35
40
  .ant-input:focus {
36
41
  box-shadow: none !important;
37
42
  }
@@ -6,7 +6,6 @@ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
6
6
  * @file 智能辅助-巡检报告卡片
7
7
  */
8
8
  import React, { useContext, useState } from 'react';
9
- import { Message } from '@alifd/next';
10
9
  import { message } from 'antd';
11
10
  import _ from 'lodash';
12
11
  import AgentCardRender from "../../AssistantChat/AssistantChatCard/AgentCardRender";
@@ -84,7 +83,7 @@ var InspectionCard = function InspectionCard(props) {
84
83
  setFormData(values);
85
84
  setIsSubmitted(true);
86
85
  } else {
87
- Message.error(response.message || '表单提交失败,请重试');
86
+ message.error(response.message || '表单提交失败,请重试');
88
87
  enableSubmit === null || enableSubmit === void 0 || enableSubmit(); // 重新启用提交按钮
89
88
  }
90
89
  _context.next = 13;
@@ -4,14 +4,14 @@ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
4
4
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
5
5
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
6
6
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
7
- var _excluded = ["children", "bizId", "bizDomain", "locateAfterSingleMessageUpdate", "dataSource", "interruptLlmMessageScroll", "toolConfig", "placeholder", "messageCardWidth", "enableWsConnectCallback", "onSend", "assistantChat", "log", "logTrace", "messagesMaxLength", "mode", "activeToken", "onStopMessage", "imConnectCallback", "chatTitle", "isAssistant", "isThirdEmbed", "getApiHost"],
7
+ var _excluded = ["children", "bizId", "bizDomain", "locateAfterSingleMessageUpdate", "dataSource", "interruptLlmMessageScroll", "toolConfig", "placeholder", "messageCardWidth", "enableWsConnectCallback", "onSend", "assistantChat", "log", "logTrace", "messagesMaxLength", "mode", "activeToken", "onStopMessage", "imConnectCallback", "chatTitle", "isAssistant", "isThirdEmbed", "getApiHost", "subjectId", "autoConnect", "autoSendMessage", "onConnectionReady", "onSendSuccess", "onSendError"],
8
8
  _excluded2 = ["chatType", "onSuccessCallback"];
9
9
  import React, { createContext, useEffect, useRef, useState } from 'react';
10
10
  import { event } from "../utils/event";
11
11
  import { getWorkId } from "../utils/helpers";
12
12
  import { FEATURE_MODE_TYPE_KEY } from "../components/ModelSelect/const";
13
13
  import { ASSIST_CHAT_EVENT } from "../constants/assistChatEvent";
14
- import { CHAT_TYPE, ChatTypeEnum, COPILOT_TOOL_TYPE_ENUM, initPlaceholder } from "../constants/common";
14
+ import { CHAT_TYPE, ChatTypeEnum, COPILOT_TOOL_TYPE_ENUM, initPlaceholder, REQUEST_SUCCESS_CODE } from "../constants/common";
15
15
  import { LOG_TRACE_TYPE_ENUMS } from "../constants/logTrace";
16
16
  import { ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS, disconnectAssistantWs, startAssistantWs } from "../utils/apushAssistant";
17
17
  import { triggerPlugin } from "../utils/clientPlugin";
@@ -21,17 +21,53 @@ import { AesCustomLogEventEnum, setAesCustomEvent } from "../utils/log";
21
21
  import { updateMessageList, updateMessageValue, updateSingleMessage } from "./utils/messages";
22
22
  import { clickSendMessage, sendMessageRequest, stopMessage, successCallback } from "./utils/send";
23
23
  import { clearContext, initTools, searchTools } from "./utils/tool";
24
+ import { getConversationConnection } from "../service/conversation";
25
+ import { useAutoSend } from "../hooks/useAutoSend";
26
+
27
+ // ======================================= URL 参数工具函数 =======================================
28
+ var SUBJECT_ID_URL_PARAM = 'subjectId';
29
+
30
+ /**
31
+ * 从 URL 中读取 subjectId 参数
32
+ */
33
+ var getSubjectIdFromUrl = function getSubjectIdFromUrl() {
34
+ if (typeof window === 'undefined') return null;
35
+ var urlParams = new URLSearchParams(window.location.search);
36
+ return urlParams.get(SUBJECT_ID_URL_PARAM);
37
+ };
38
+
39
+ /**
40
+ * 将 subjectId 写入 URL(使用 history.pushState 产生浏览历史)
41
+ * 只有当 URL 中的 subjectId 与传入的不同时才更新
42
+ */
43
+ var updateUrlWithSubjectId = function updateUrlWithSubjectId(subjectId) {
44
+ if (typeof window === 'undefined') return;
45
+
46
+ // 获取当前 URL 中的 subjectId
47
+ var currentSubjectId = getSubjectIdFromUrl();
48
+ var newSubjectId = String(subjectId);
49
+
50
+ // 如果 subjectId 没有变化,不更新 URL
51
+ if (currentSubjectId === newSubjectId) {
52
+ return;
53
+ }
54
+ var url = new URL(window.location.href);
55
+ url.searchParams.set(SUBJECT_ID_URL_PARAM, newSubjectId);
56
+ window.history.pushState({
57
+ subjectId: newSubjectId
58
+ }, '', url.toString());
59
+ };
24
60
  export var AssistantChatContext = /*#__PURE__*/createContext({
25
61
  bizId: '',
26
- bizDomain: 'CSE',
62
+ bizDomain: 'CHAT',
27
63
  messagesLoading: true
28
64
  });
29
65
  var AssistantChatProvider = function AssistantChatProvider() {
30
66
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
31
67
  var children = props.children,
32
- bizId = props.bizId,
68
+ propBizId = props.bizId,
33
69
  _props$bizDomain = props.bizDomain,
34
- bizDomain = _props$bizDomain === void 0 ? 'CSE' : _props$bizDomain,
70
+ bizDomain = _props$bizDomain === void 0 ? 'CHAT' : _props$bizDomain,
35
71
  _props$locateAfterSin = props.locateAfterSingleMessageUpdate,
36
72
  locateAfterSingleMessageUpdate = _props$locateAfterSin === void 0 ? true : _props$locateAfterSin,
37
73
  dataSource = props.dataSource,
@@ -45,7 +81,7 @@ var AssistantChatProvider = function AssistantChatProvider() {
45
81
  _props$enableWsConnec = props.enableWsConnectCallback,
46
82
  enableWsConnectCallback = _props$enableWsConnec === void 0 ? false : _props$enableWsConnec,
47
83
  onSend = props.onSend,
48
- assistantChat = props.assistantChat,
84
+ propAssistantChat = props.assistantChat,
49
85
  _props$log = props.log,
50
86
  log = _props$log === void 0 ? setAesCustomEvent : _props$log,
51
87
  logTrace = props.logTrace,
@@ -61,44 +97,63 @@ var AssistantChatProvider = function AssistantChatProvider() {
61
97
  isAssistant = _props$isAssistant === void 0 ? false : _props$isAssistant,
62
98
  isThirdEmbed = props.isThirdEmbed,
63
99
  getApiHost = props.getApiHost,
100
+ subjectId = props.subjectId,
101
+ _props$autoConnect = props.autoConnect,
102
+ autoConnect = _props$autoConnect === void 0 ? true : _props$autoConnect,
103
+ autoSendMessage = props.autoSendMessage,
104
+ onConnectionReady = props.onConnectionReady,
105
+ onSendSuccess = props.onSendSuccess,
106
+ onSendError = props.onSendError,
64
107
  otherProps = _objectWithoutProperties(props, _excluded);
108
+
109
+ // 内部维护的 bizId,支持自动获取会话时使用
110
+ var _useState = useState(propBizId),
111
+ _useState2 = _slicedToArray(_useState, 2),
112
+ internalBizId = _useState2[0],
113
+ setInternalBizId = _useState2[1];
114
+ // 实际使用的 bizId:优先使用外部传入的,其次使用内部状态
115
+ var bizId = propBizId || internalBizId;
116
+ // 标记是否已自动发送过消息
117
+ var autoSendDoneRef = useRef(false);
118
+ // 标记是否正在获取会话连接
119
+ var isConnectingRef = useRef(false);
65
120
  // 是否受控数据
66
121
  var hasDefaultDataSource = dataSource && Array.isArray(dataSource);
67
122
  // 消息流
68
- var _useState = useState([]),
69
- _useState2 = _slicedToArray(_useState, 2),
70
- messages = _useState2[0],
71
- setMessageList = _useState2[1];
72
- var _useState3 = useState(true),
123
+ var _useState3 = useState([]),
73
124
  _useState4 = _slicedToArray(_useState3, 2),
74
- messagesLoading = _useState4[0],
75
- setMessagesLoading = _useState4[1];
125
+ messages = _useState4[0],
126
+ setMessageList = _useState4[1];
127
+ var _useState5 = useState(true),
128
+ _useState6 = _slicedToArray(_useState5, 2),
129
+ messagesLoading = _useState6[0],
130
+ setMessagesLoading = _useState6[1];
76
131
 
77
132
  // 工具展示List
78
- var _useState5 = useState([]),
79
- _useState6 = _slicedToArray(_useState5, 2),
80
- toolShowList = _useState6[0],
81
- setToolShowList = _useState6[1];
82
- var _useState7 = useState(false),
133
+ var _useState7 = useState([]),
83
134
  _useState8 = _slicedToArray(_useState7, 2),
84
- showAddTag = _useState8[0],
85
- setShowAddTag = _useState8[1];
86
-
87
- // 分享模式相关状态
135
+ toolShowList = _useState8[0],
136
+ setToolShowList = _useState8[1];
88
137
  var _useState9 = useState(false),
89
138
  _useState10 = _slicedToArray(_useState9, 2),
90
- shareMode = _useState10[0],
91
- setShareMode = _useState10[1];
92
- var _useState11 = useState([]),
139
+ showAddTag = _useState10[0],
140
+ setShowAddTag = _useState10[1];
141
+
142
+ // 分享模式相关状态
143
+ var _useState11 = useState(false),
93
144
  _useState12 = _slicedToArray(_useState11, 2),
94
- selectedMessages = _useState12[0],
95
- setSelectedMessages = _useState12[1];
145
+ shareMode = _useState12[0],
146
+ setShareMode = _useState12[1];
147
+ var _useState13 = useState([]),
148
+ _useState14 = _slicedToArray(_useState13, 2),
149
+ selectedMessages = _useState14[0],
150
+ setSelectedMessages = _useState14[1];
96
151
 
97
152
  // WebSocket 连接状态
98
- var _useState13 = useState(null),
99
- _useState14 = _slicedToArray(_useState13, 2),
100
- wsConnectionStatus = _useState14[0],
101
- setWsConnectionStatus = _useState14[1];
153
+ var _useState15 = useState(null),
154
+ _useState16 = _slicedToArray(_useState15, 2),
155
+ wsConnectionStatus = _useState16[0],
156
+ setWsConnectionStatus = _useState16[1];
102
157
  var chatAppRef = useRef(null);
103
158
  var chatInputRef = useRef(null);
104
159
  var messageListRef = useRef([]);
@@ -108,22 +163,27 @@ var AssistantChatProvider = function AssistantChatProvider() {
108
163
  var textAreaRef = useRef(null);
109
164
  // 请求版本号,用于忽略过时的 API 响应
110
165
  var requestVersionRef = useRef(0);
166
+
167
+ // 存储最新的 getMessageList 函数引用,避免闭包陷阱
168
+ var getMessageListRef = useRef();
169
+ // 防抖定时器 ref
170
+ var getMessageListDebounceRef = useRef();
111
171
  var inputFormRef = useRef(null);
112
- var _useState15 = useState(null),
113
- _useState16 = _slicedToArray(_useState15, 2),
114
- inputFormSchema = _useState16[0],
115
- setInputFormSchema = _useState16[1];
172
+ var _useState17 = useState(null),
173
+ _useState18 = _slicedToArray(_useState17, 2),
174
+ inputFormSchema = _useState18[0],
175
+ setInputFormSchema = _useState18[1];
116
176
  // 当前消息id
117
177
  var currentUpdateMessageIdRef = useRef(null);
118
178
  // 当前消息id index
119
179
  var currentUpdateMessageIndexRef = useRef(-1);
120
- var _useState17 = useState({
180
+ var _useState19 = useState({
121
181
  thinkingMode: FEATURE_MODE_TYPE_KEY.AUTO,
122
182
  webSearchMode: FEATURE_MODE_TYPE_KEY.AUTO
123
183
  }),
124
- _useState18 = _slicedToArray(_useState17, 2),
125
- featureConfig = _useState18[0],
126
- setFeatureConfig = _useState18[1];
184
+ _useState20 = _slicedToArray(_useState19, 2),
185
+ featureConfig = _useState20[0],
186
+ setFeatureConfig = _useState20[1];
127
187
  useEffect(function () {
128
188
  if (hasDefaultDataSource) {
129
189
  var _chatAppRef$current;
@@ -140,6 +200,68 @@ var AssistantChatProvider = function AssistantChatProvider() {
140
200
  }
141
201
  }, [dataSource, hasDefaultDataSource]);
142
202
 
203
+ // ======================================= 开箱即用:自动获取会话连接 =======================================
204
+ /**
205
+ * 自动获取会话连接逻辑
206
+ * 当 autoConnect 为 true 且没有传入 bizId 时,自动调用 API 获取会话连接
207
+ * 只在 CHAT 场景下生效
208
+ *
209
+ * 优先级:propBizId > URL参数中的subjectId > props中的subjectId > 自动创建新会话
210
+ */
211
+ useEffect(function () {
212
+ // 只有在 CHAT 模式下才启用自动连接
213
+ var isChatMode = mode === ChatTypeEnum.Chat || bizDomain === 'CHAT';
214
+ // 检查是否需要自动连接:启用自动连接 && 没有外部传入的 bizId && 是 CHAT 模式 && 不在连接中
215
+ var shouldAutoConnect = autoConnect && !propBizId && isChatMode && !isConnectingRef.current;
216
+ if (shouldAutoConnect) {
217
+ isConnectingRef.current = true;
218
+
219
+ // 优先从 URL 读取 subjectId,其次使用 props 中的 subjectId
220
+ var urlSubjectId = getSubjectIdFromUrl();
221
+ var effectiveSubjectId = urlSubjectId || subjectId;
222
+ getConversationConnection({
223
+ bizDomain: 'CHAT',
224
+ subjectId: effectiveSubjectId
225
+ }).then(function (res) {
226
+ if ((res === null || res === void 0 ? void 0 : res.code) === REQUEST_SUCCESS_CODE) {
227
+ var connectionInfo = res.data;
228
+ // 更新内部 bizId
229
+ setInternalBizId(connectionInfo.subjectId);
230
+ // 将 subjectId 持久化到 URL
231
+ updateUrlWithSubjectId(connectionInfo.subjectId);
232
+ // 触发回调
233
+ onConnectionReady === null || onConnectionReady === void 0 || onConnectionReady(connectionInfo);
234
+ } else {
235
+ console.warn('自动获取会话连接失败:', res === null || res === void 0 ? void 0 : res.message);
236
+ }
237
+ }).catch(function (error) {
238
+ console.error('自动获取会话连接出错:', error);
239
+ }).finally(function () {
240
+ isConnectingRef.current = false;
241
+ });
242
+ }
243
+ }, [autoConnect, propBizId, subjectId, mode, bizDomain]);
244
+
245
+ // 当 propBizId 变化时,同步更新内部状态
246
+ useEffect(function () {
247
+ if (propBizId) {
248
+ setInternalBizId(propBizId);
249
+ }
250
+ }, [propBizId]);
251
+
252
+ // ======================================= 内置 onSend 逻辑 =======================================
253
+ /**
254
+ * 使用 useAutoSend Hook 获取有效的 onSend 方法
255
+ * 如果用户传入了 onSend,使用用户的;否则使用内置逻辑
256
+ */
257
+ var effectiveOnSend = useAutoSend({
258
+ bizId: bizId,
259
+ bizDomain: bizDomain,
260
+ onSend: onSend,
261
+ onSendSuccess: onSendSuccess,
262
+ onSendError: onSendError
263
+ });
264
+
143
265
  // ======================================= log埋点 =======================================
144
266
  /**
145
267
  * 辅助交互通用监控日志上报
@@ -169,27 +291,38 @@ var AssistantChatProvider = function AssistantChatProvider() {
169
291
  };
170
292
 
171
293
  // ======================================= 消息更新 =======================================
172
- // 拉取消息列表
294
+ // 拉取消息列表(带防抖机制)
173
295
  var getMessageList = function getMessageList() {
174
- var _chatInputRef$current;
175
296
  var isInit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
176
297
  var scroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
177
- updateMessageList({
178
- bizId: bizId,
179
- bizDomain: bizDomain,
180
- messagesMaxLength: messagesMaxLength,
181
- setMessagesLoading: setMessagesLoading,
182
- currentUpdateMessageIdRef: currentUpdateMessageIdRef,
183
- messageListRef: messageListRef,
184
- setMessageList: setMessageList,
185
- chatAppRef: chatAppRef,
186
- currentUpdateMessageIndexRef: currentUpdateMessageIndexRef,
187
- isInit: isInit,
188
- scroll: scroll,
189
- setSendMessageDisabled: chatInputRef === null || chatInputRef === void 0 || (_chatInputRef$current = chatInputRef.current) === null || _chatInputRef$current === void 0 ? void 0 : _chatInputRef$current.setSendMessageDisabled,
190
- requestVersionRef: requestVersionRef
191
- });
298
+ // 清除之前的定时器,实现防抖
299
+ if (getMessageListDebounceRef.current) {
300
+ clearTimeout(getMessageListDebounceRef.current);
301
+ }
302
+
303
+ // 使用 50ms 防抖,防止短时间内多次调用产生多个请求
304
+ getMessageListDebounceRef.current = setTimeout(function () {
305
+ var _chatInputRef$current;
306
+ updateMessageList({
307
+ bizId: bizId,
308
+ bizDomain: bizDomain,
309
+ messagesMaxLength: messagesMaxLength,
310
+ setMessagesLoading: setMessagesLoading,
311
+ currentUpdateMessageIdRef: currentUpdateMessageIdRef,
312
+ messageListRef: messageListRef,
313
+ setMessageList: setMessageList,
314
+ chatAppRef: chatAppRef,
315
+ currentUpdateMessageIndexRef: currentUpdateMessageIndexRef,
316
+ isInit: isInit,
317
+ scroll: scroll,
318
+ setSendMessageDisabled: chatInputRef === null || chatInputRef === void 0 || (_chatInputRef$current = chatInputRef.current) === null || _chatInputRef$current === void 0 ? void 0 : _chatInputRef$current.setSendMessageDisabled,
319
+ requestVersionRef: requestVersionRef
320
+ });
321
+ }, 50);
192
322
  };
323
+
324
+ // 更新 ref 为最新的 getMessageList 函数
325
+ getMessageListRef.current = getMessageList;
193
326
  var initMessageList = function initMessageList() {
194
327
  getMessageList === null || getMessageList === void 0 || getMessageList(true);
195
328
  };
@@ -237,6 +370,19 @@ var AssistantChatProvider = function AssistantChatProvider() {
237
370
  if (imConnectCallback && typeof imConnectCallback === 'function') {
238
371
  imConnectCallback();
239
372
  }
373
+ // 开箱即用:自动发送消息
374
+ if (autoSendMessage && !autoSendDoneRef.current) {
375
+ autoSendDoneRef.current = true;
376
+ // 延迟一下,确保消息列表已加载
377
+ setTimeout(function () {
378
+ effectiveOnSend === null || effectiveOnSend === void 0 || effectiveOnSend({
379
+ params: {
380
+ query: autoSendMessage
381
+ },
382
+ featureConfig: featureConfig
383
+ }, function () {});
384
+ }, 100);
385
+ }
240
386
  },
241
387
  log: log,
242
388
  // 连接状态变化回调
@@ -294,12 +440,12 @@ var AssistantChatProvider = function AssistantChatProvider() {
294
440
  };
295
441
  }, [bizId]);
296
442
  useEffect(function () {
297
- // 监听全部list
298
- var listenerGetMessageList = function listenerGetMessageList(x) {
299
- var _logTrace$closeTrace;
443
+ // 监听全部list - 使用 ref 调用最新的 getMessageList 函数,避免闭包陷阱
444
+ var listenerGetMessageList = function listenerGetMessageList() {
445
+ var _logTrace$closeTrace, _getMessageListRef$cu;
300
446
  logTrace === null || logTrace === void 0 || (_logTrace$closeTrace = logTrace.closeTrace) === null || _logTrace$closeTrace === void 0 || _logTrace$closeTrace.call(logTrace, LOG_TRACE_TYPE_ENUMS.LLM_GET_MESSAGE_LIET_APUSH, window.currentMessageSendTimestamp);
301
447
  window.currentMessageSendTimestamp = undefined;
302
- getMessageList();
448
+ (_getMessageListRef$cu = getMessageListRef.current) === null || _getMessageListRef$cu === void 0 || _getMessageListRef$cu.call(getMessageListRef);
303
449
  };
304
450
  // 监听单条数据
305
451
  var listenerGetSingleMessage = function listenerGetSingleMessage(argJson) {
@@ -343,22 +489,26 @@ var AssistantChatProvider = function AssistantChatProvider() {
343
489
  chatInputRef === null || chatInputRef === void 0 || (_chatInputRef$current9 = chatInputRef.current) === null || _chatInputRef$current9 === void 0 || (_chatInputRef$current10 = _chatInputRef$current9.setSendMessageDisabled) === null || _chatInputRef$current10 === void 0 || _chatInputRef$current10.call(_chatInputRef$current9, false);
344
490
  }
345
491
  };
346
- if (!hasDefaultDataSource) {
347
- // 消息受控,不再监听消息列表刷新
492
+
493
+ // 保存当前 hasDefaultDataSource 值用于 cleanup,确保清理时使用相同的条件
494
+ var shouldListen = !hasDefaultDataSource;
495
+ if (shouldListen) {
496
+ // 消息非受控,监听消息列表刷新
348
497
  event.on(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_GET_MESSAGE_LIST, listenerGetMessageList);
349
498
  event.on(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_GET_MESSAGE, listenerGetSingleMessage);
350
499
  }
351
500
  event.on(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_LLM_STREAM_MESSAGE, updateStreamMessage);
352
501
  event.on(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_LLM_TRACE_MESSAGE, updateTraceMessage);
353
502
  return function () {
354
- if (!hasDefaultDataSource) {
503
+ if (shouldListen) {
355
504
  event.off(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_GET_MESSAGE_LIST, listenerGetMessageList);
356
505
  event.off(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_GET_MESSAGE, listenerGetSingleMessage);
357
506
  }
358
507
  event.off(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_LLM_STREAM_MESSAGE, updateStreamMessage);
359
508
  event.off(ASSISTANT_APUSH_MESSAGE_TYPE_ENUMS.COPILOT_LLM_TRACE_MESSAGE, updateTraceMessage);
360
509
  };
361
- }, [bizId]);
510
+ }, [bizId, hasDefaultDataSource]); // 添加 hasDefaultDataSource 依赖,确保条件变化时正确清理和重新注册 listener
511
+
362
512
  useEffect(function () {
363
513
  var updateInputValue = function updateInputValue(_value) {
364
514
  var _chatInputRef$current11, _chatInputRef$current12;
@@ -395,7 +545,7 @@ var AssistantChatProvider = function AssistantChatProvider() {
395
545
  chatType: chatType
396
546
  }, otherSendProps);
397
547
  sendMessageRequest({
398
- onSend: onSend,
548
+ onSend: effectiveOnSend,
399
549
  sendInfoQuery: sendInfoQuery,
400
550
  onSuccessCallback: onSuccessCallback
401
551
  // setSendMessageDisabled: chatInputRef?.current?.setSendMessageDisabled,
@@ -720,9 +870,12 @@ var AssistantChatProvider = function AssistantChatProvider() {
720
870
  placeholder: placeholder,
721
871
  messageCardWidth: messageCardWidth,
722
872
  enableWsConnectCallback: enableWsConnectCallback,
723
- onSend: onSend,
724
- assistantChat: assistantChat,
873
+ // 使用有效的 onSend(可能是用户传入的,也可能是内置的)
874
+ onSend: effectiveOnSend,
875
+ assistantChat: propAssistantChat,
725
876
  isAssistant: isAssistant,
877
+ // WebSocket 连接状态
878
+ wsConnectionStatus: wsConnectionStatus,
726
879
  textAreaRef: textAreaRef,
727
880
  messages: messages,
728
881
  setMessageList: setMessageList,
@@ -0,0 +1 @@
1
+ export { useAutoSend } from "./useAutoSend";