@quukk/opencode-clawmessenger 0.2.0 → 1.0.3
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 +71 -623
- package/bin/opencode-clawmessenger +2 -2
- package/bin/opencode-clawmessenger-setup +5 -5
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +1 -288
- package/dist/core/auto-register.d.ts +0 -1
- package/dist/core/auto-register.js +1 -174
- package/dist/core/auto-serve.d.ts +13 -0
- package/dist/core/auto-serve.js +1 -0
- package/dist/core/config.d.ts +2 -3
- package/dist/core/config.js +1 -80
- package/dist/core/daemon.d.ts +0 -1
- package/dist/core/daemon.js +1 -77
- package/dist/core/dedup.d.ts +0 -1
- package/dist/core/dedup.js +1 -25
- package/dist/core/hook-manager.d.ts +0 -1
- package/dist/core/hook-manager.js +1 -33
- package/dist/core/logger.d.ts +0 -1
- package/dist/core/logger.js +1 -49
- package/dist/core/mac-address.d.ts +0 -1
- package/dist/core/mac-address.js +1 -43
- package/dist/core/message-handler.d.ts +1 -1
- package/dist/core/message-handler.js +1 -984
- package/dist/core/ops-assistant.d.ts +0 -1
- package/dist/core/ops-assistant.js +1 -270
- package/dist/core/qr-crypto.d.ts +0 -1
- package/dist/core/qr-crypto.js +1 -66
- package/dist/core/session-manager.d.ts +0 -1
- package/dist/core/session-manager.js +1 -144
- package/dist/core/types.d.ts +1 -2
- package/dist/core/types.js +1 -26
- package/dist/index.d.ts +0 -1
- package/dist/index.js +1 -16
- package/dist/openclaw/client.d.ts +0 -1
- package/dist/openclaw/client.js +1 -494
- package/dist/opencode/client.d.ts +0 -1
- package/dist/opencode/client.js +1 -279
- package/dist/opencode/event-handler.d.ts +0 -1
- package/dist/opencode/event-handler.js +1 -467
- package/dist/plugin.d.ts +0 -1
- package/dist/plugin.js +1 -148
- package/dist/rongcloud/client.d.ts +0 -1
- package/dist/rongcloud/client.js +1 -292
- package/dist/rongcloud/env-polyfill.d.ts +0 -1
- package/dist/rongcloud/env-polyfill.js +1 -107
- package/dist/rongcloud/server-api.d.ts +0 -1
- package/dist/rongcloud/server-api.js +1 -157
- package/dist/standalone.d.ts +0 -1
- package/dist/standalone.js +1 -229
- package/dist/types/plugin.d.ts +0 -1
- package/dist/types/plugin.js +1 -2
- package/dist/websocket/client.d.ts +0 -1
- package/dist/websocket/client.js +1 -88
- package/dist/websocket/server-client.d.ts +0 -1
- package/dist/websocket/server-client.js +1 -98
- package/package.json +83 -81
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/core/auto-register.d.ts.map +0 -1
- package/dist/core/auto-register.js.map +0 -1
- package/dist/core/config.d.ts.map +0 -1
- package/dist/core/config.js.map +0 -1
- package/dist/core/daemon.d.ts.map +0 -1
- package/dist/core/daemon.js.map +0 -1
- package/dist/core/dedup.d.ts.map +0 -1
- package/dist/core/dedup.js.map +0 -1
- package/dist/core/hook-manager.d.ts.map +0 -1
- package/dist/core/hook-manager.js.map +0 -1
- package/dist/core/logger.d.ts.map +0 -1
- package/dist/core/logger.js.map +0 -1
- package/dist/core/mac-address.d.ts.map +0 -1
- package/dist/core/mac-address.js.map +0 -1
- package/dist/core/message-handler.d.ts.map +0 -1
- package/dist/core/message-handler.js.map +0 -1
- package/dist/core/ops-assistant.d.ts.map +0 -1
- package/dist/core/ops-assistant.js.map +0 -1
- package/dist/core/qr-crypto.d.ts.map +0 -1
- package/dist/core/qr-crypto.js.map +0 -1
- package/dist/core/session-manager.d.ts.map +0 -1
- package/dist/core/session-manager.js.map +0 -1
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/openclaw/client.d.ts.map +0 -1
- package/dist/openclaw/client.js.map +0 -1
- package/dist/opencode/client.d.ts.map +0 -1
- package/dist/opencode/client.js.map +0 -1
- package/dist/opencode/event-handler.d.ts.map +0 -1
- package/dist/opencode/event-handler.js.map +0 -1
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js.map +0 -1
- package/dist/rongcloud/client.d.ts.map +0 -1
- package/dist/rongcloud/client.js.map +0 -1
- package/dist/rongcloud/env-polyfill.d.ts.map +0 -1
- package/dist/rongcloud/env-polyfill.js.map +0 -1
- package/dist/rongcloud/server-api.d.ts.map +0 -1
- package/dist/rongcloud/server-api.js.map +0 -1
- package/dist/standalone.d.ts.map +0 -1
- package/dist/standalone.js.map +0 -1
- package/dist/types/plugin.d.ts.map +0 -1
- package/dist/types/plugin.js.map +0 -1
- package/dist/websocket/client.d.ts.map +0 -1
- package/dist/websocket/client.js.map +0 -1
- package/dist/websocket/server-client.d.ts.map +0 -1
- package/dist/websocket/server-client.js.map +0 -1
|
@@ -1,984 +1 @@
|
|
|
1
|
-
import { RongyunMessageTypeEnum } from './types.js';
|
|
2
|
-
import { MessageDeduplicator } from './dedup.js';
|
|
3
|
-
import { OpenCodeClient, checkOpencodeStatus } from '../opencode/client.js';
|
|
4
|
-
import { createLogger } from './logger.js';
|
|
5
|
-
import axios from 'axios';
|
|
6
|
-
const log = createLogger('MessageHandler');
|
|
7
|
-
const ROUND_COOLDOWN_MS = 30_000;
|
|
8
|
-
const GROUP_STATE_CACHE_TTL_MS = 30_000;
|
|
9
|
-
export class MessageHandler {
|
|
10
|
-
constructor(config, sessionManager, rongClient, opencode) {
|
|
11
|
-
// 群聊对话轮数计数器
|
|
12
|
-
this.groupRoundCounters = new Map();
|
|
13
|
-
// 群聊状态缓存(暂停/最大轮数)
|
|
14
|
-
this.groupStatusCache = new Map();
|
|
15
|
-
this.groupStatusLastFetch = 0;
|
|
16
|
-
this.config = config;
|
|
17
|
-
this.sessionManager = sessionManager;
|
|
18
|
-
this.rongClient = rongClient;
|
|
19
|
-
this.opencode = opencode;
|
|
20
|
-
// 运维助手使用独立的 OpenCode server(端口19877)
|
|
21
|
-
// 优先级:环境变量 CLAW_OPS_OPENCODE_DIR > process.cwd()
|
|
22
|
-
const opsDir = process.env.CLAW_OPS_OPENCODE_DIR || process.cwd();
|
|
23
|
-
this.opsOpencode = new OpenCodeClient({
|
|
24
|
-
baseUrl: 'http://127.0.0.1:19877',
|
|
25
|
-
directory: opsDir,
|
|
26
|
-
});
|
|
27
|
-
this.dedup = new MessageDeduplicator();
|
|
28
|
-
this.pendingRequests = new Map();
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* 从后端查询群组的 OpenClaw 状态(暂停、最大轮数)
|
|
32
|
-
*/
|
|
33
|
-
async fetchGroupStatus(groupId) {
|
|
34
|
-
try {
|
|
35
|
-
const serverUrl = this.config.serverUrl || process.env.DM_SERVER_URL || 'https://newsradar.dreamdt.cn/im';
|
|
36
|
-
const url = `${serverUrl}/api/group/${groupId}/status`;
|
|
37
|
-
const response = await axios.get(url, { timeout: 5000 });
|
|
38
|
-
if (response.data?.code === 200 && response.data?.data) {
|
|
39
|
-
return {
|
|
40
|
-
openclawStopped: response.data.data.openclawStopped ?? false,
|
|
41
|
-
openclawMaxRounds: response.data.data.openclawMaxRounds ?? 10,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
catch (err) {
|
|
47
|
-
log.warn({ groupId, err: err.message }, 'fetchGroupStatus failed');
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* 检查并更新群聊对话轮数。
|
|
53
|
-
* 返回 { allowed: true } 表示可以继续处理;
|
|
54
|
-
* 返回 { allowed: false, reason: string } 表示已暂停或达到上限。
|
|
55
|
-
*/
|
|
56
|
-
async checkGroupRoundLimit(groupId) {
|
|
57
|
-
// 优先使用缓存,避免频繁请求后端
|
|
58
|
-
let status = this.groupStatusCache.get(groupId);
|
|
59
|
-
const now = Date.now();
|
|
60
|
-
if (!status || now - this.groupStatusLastFetch > GROUP_STATE_CACHE_TTL_MS) {
|
|
61
|
-
const fresh = await this.fetchGroupStatus(groupId);
|
|
62
|
-
if (fresh) {
|
|
63
|
-
status = fresh;
|
|
64
|
-
this.groupStatusCache.set(groupId, status);
|
|
65
|
-
this.groupStatusLastFetch = now;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
// 如果拿不到状态,使用默认宽松策略(允许继续)
|
|
69
|
-
if (!status) {
|
|
70
|
-
return { allowed: true };
|
|
71
|
-
}
|
|
72
|
-
// 检查暂停状态
|
|
73
|
-
if (status.openclawStopped) {
|
|
74
|
-
return { allowed: false, reason: '群聊已暂停' };
|
|
75
|
-
}
|
|
76
|
-
// 检查轮数限制
|
|
77
|
-
let roundState = this.groupRoundCounters.get(groupId);
|
|
78
|
-
if (!roundState) {
|
|
79
|
-
roundState = { count: 0, lastTimestamp: 0 };
|
|
80
|
-
this.groupRoundCounters.set(groupId, roundState);
|
|
81
|
-
}
|
|
82
|
-
// 30 秒冷却:超过冷却时间则重置计数器
|
|
83
|
-
if (now - roundState.lastTimestamp > ROUND_COOLDOWN_MS) {
|
|
84
|
-
roundState.count = 0;
|
|
85
|
-
}
|
|
86
|
-
if (roundState.count >= status.openclawMaxRounds) {
|
|
87
|
-
return { allowed: false, reason: `已达到本轮对话上限 (${status.openclawMaxRounds} 轮)` };
|
|
88
|
-
}
|
|
89
|
-
return { allowed: true };
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* 成功处理一条群聊消息后,累加轮数计数器
|
|
93
|
-
*/
|
|
94
|
-
incrementGroupRound(groupId) {
|
|
95
|
-
let roundState = this.groupRoundCounters.get(groupId);
|
|
96
|
-
if (!roundState) {
|
|
97
|
-
roundState = { count: 0, lastTimestamp: 0 };
|
|
98
|
-
this.groupRoundCounters.set(groupId, roundState);
|
|
99
|
-
}
|
|
100
|
-
roundState.count += 1;
|
|
101
|
-
roundState.lastTimestamp = Date.now();
|
|
102
|
-
log.info({ groupId, count: roundState.count }, 'Group round incremented');
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* 发送消息给指定用户或群组
|
|
106
|
-
* 供 agent 智能体调用,支持:
|
|
107
|
-
* - 私聊:sendToUser('userId', '消息内容')
|
|
108
|
-
* - 群聊:sendToUser('groupId', '消息内容', { conversationType: 3 })
|
|
109
|
-
*/
|
|
110
|
-
async sendToUser(targetId, content, options = {}) {
|
|
111
|
-
const { conversationType = 1, extra } = options;
|
|
112
|
-
if (!targetId || !content) {
|
|
113
|
-
log.warn({ targetId, hasContent: !!content }, 'sendToUser: 缺少 targetId 或 content');
|
|
114
|
-
return { success: false, error: '缺少 targetId 或 content' };
|
|
115
|
-
}
|
|
116
|
-
try {
|
|
117
|
-
let messageContent;
|
|
118
|
-
if (extra && Object.keys(extra).length > 0) {
|
|
119
|
-
messageContent = JSON.stringify({ content, ...extra });
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
messageContent = content;
|
|
123
|
-
}
|
|
124
|
-
await this.rongClient.sendMessage(targetId, messageContent, conversationType);
|
|
125
|
-
log.info({ targetId, conversationType, contentPreview: content.substring(0, 100) }, 'sendToUser: 消息发送成功');
|
|
126
|
-
return { success: true };
|
|
127
|
-
}
|
|
128
|
-
catch (err) {
|
|
129
|
-
log.error({ err, targetId, conversationType }, 'sendToUser: 消息发送失败');
|
|
130
|
-
return { success: false, error: err.message || String(err) };
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
async handleMessage(msg) {
|
|
134
|
-
try {
|
|
135
|
-
// 过滤已读回执消息,避免日志噪音
|
|
136
|
-
if (msg.messageType === 'RC:ReadNtf') {
|
|
137
|
-
log.debug({ messageUId: msg.messageUId, senderUserId: msg.senderUserId }, 'Read receipt notification ignored');
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
if (msg.messageUId && this.dedup.isDuplicate(msg.messageUId)) {
|
|
141
|
-
log.debug({ messageUId: msg.messageUId }, 'Duplicate message filtered');
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
// 发送已读回执(fire-and-forget,不阻塞消息处理)
|
|
145
|
-
// 在消息去重之后、业务处理之前发送,确保只给实际处理的消息发送已读回执
|
|
146
|
-
this.sendReadReceipt(msg);
|
|
147
|
-
let msgContent;
|
|
148
|
-
if (typeof msg.content === 'string') {
|
|
149
|
-
try {
|
|
150
|
-
msgContent = JSON.parse(msg.content);
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
msgContent = { content: msg.content };
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
else if (msg.content && typeof msg.content === 'object') {
|
|
157
|
-
msgContent = msg.content;
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
let innerContent = {};
|
|
163
|
-
if (msgContent.content && typeof msgContent.content === 'string') {
|
|
164
|
-
try {
|
|
165
|
-
innerContent = JSON.parse(msgContent.content);
|
|
166
|
-
}
|
|
167
|
-
catch {
|
|
168
|
-
innerContent = { content: msgContent.content };
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
// 兼容驼峰和下划线两种命名方式
|
|
172
|
-
// 同时检查 msgContent 和 innerContent 的 msg_type,因为融云消息可能嵌套两层
|
|
173
|
-
const customMsgType = msgContent.msg_type || innerContent.msg_type;
|
|
174
|
-
const sourceImId = msgContent.source_im_id || msgContent.sourceImId || msg.senderUserId;
|
|
175
|
-
const destinationImId = msgContent.destination_im_id || msgContent.destinationImId || msg.targetId;
|
|
176
|
-
const requestId = msgContent.request_id || msgContent.requestId;
|
|
177
|
-
const merged = {
|
|
178
|
-
...msgContent,
|
|
179
|
-
...innerContent,
|
|
180
|
-
request_id: requestId,
|
|
181
|
-
source_im_id: sourceImId,
|
|
182
|
-
destination_im_id: destinationImId,
|
|
183
|
-
};
|
|
184
|
-
// 过滤系统通知消息(前端通过 __sys_notify__ 标记发送),避免AI响应
|
|
185
|
-
if (msgContent.__sys_notify__ === true || innerContent.__sys_notify__ === true) {
|
|
186
|
-
log.debug({ messageType: msg.messageType, text: msgContent.text || innerContent.text }, 'System notification ignored');
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
log.info({
|
|
190
|
-
messageType: msg.messageType,
|
|
191
|
-
customMsgType,
|
|
192
|
-
senderUserId: msg.senderUserId,
|
|
193
|
-
targetId: msg.targetId,
|
|
194
|
-
contentKeys: Object.keys(msgContent),
|
|
195
|
-
hasMsgType: !!msgContent.msg_type,
|
|
196
|
-
msgContentPreview: JSON.stringify(msgContent).substring(0, 200)
|
|
197
|
-
}, 'Message received details');
|
|
198
|
-
switch (customMsgType || msg.messageType) {
|
|
199
|
-
case RongyunMessageTypeEnum.CREATE_OPENCODE_SESSION:
|
|
200
|
-
case 'create_opencode_session':
|
|
201
|
-
await this.handleCreateOpencodeSession(merged, msg);
|
|
202
|
-
return;
|
|
203
|
-
case 'RC:TxtMsg':
|
|
204
|
-
case 'TextMessage':
|
|
205
|
-
// RC:TxtMsg = 普通文本消息 → 点点(主OpenCode)
|
|
206
|
-
await this.handleChatMessage(merged, msg, customMsgType);
|
|
207
|
-
return;
|
|
208
|
-
case RongyunMessageTypeEnum.CHAT_MESSAGE:
|
|
209
|
-
case 'chat_message':
|
|
210
|
-
// chat_message = 普通聊天消息 → 点点(主OpenCode)
|
|
211
|
-
await this.handleChatMessage(merged, msg, customMsgType);
|
|
212
|
-
return;
|
|
213
|
-
case RongyunMessageTypeEnum.DEVICE_STATUS_REQUEST:
|
|
214
|
-
case 'device_status_request':
|
|
215
|
-
await this.handleDeviceStatusRequest(merged, msg);
|
|
216
|
-
return;
|
|
217
|
-
case RongyunMessageTypeEnum.DEVICE_CONTROL:
|
|
218
|
-
case 'device_control':
|
|
219
|
-
await this.handleDeviceControl(merged, msg);
|
|
220
|
-
return;
|
|
221
|
-
case 'command':
|
|
222
|
-
await this.handleCommand(merged, msg);
|
|
223
|
-
return;
|
|
224
|
-
case RongyunMessageTypeEnum.OPS_CHAT_MESSAGE:
|
|
225
|
-
case 'ops_chat_message':
|
|
226
|
-
await this.handleOpsChatMessage(merged, msg);
|
|
227
|
-
return;
|
|
228
|
-
case RongyunMessageTypeEnum.CREATE_SERVICE_SESSION:
|
|
229
|
-
case 'create_service_session':
|
|
230
|
-
await this.handleCreateServiceSession(merged, msg);
|
|
231
|
-
return;
|
|
232
|
-
case RongyunMessageTypeEnum.SERVICE_CHAT_MESSAGE:
|
|
233
|
-
case 'service_chat_message':
|
|
234
|
-
await this.handleServiceChatMessage(merged, msg);
|
|
235
|
-
return;
|
|
236
|
-
case 'RC:HQVCMsg':
|
|
237
|
-
case 'RC:VCMsg':
|
|
238
|
-
// 高质量语音消息:先语音识别,再作为文本消息处理
|
|
239
|
-
await this.handleVoiceMessage(merged, msg);
|
|
240
|
-
return;
|
|
241
|
-
case RongyunMessageTypeEnum.DELETE_OPENCODE_SESSION:
|
|
242
|
-
case 'delete_opencode_session':
|
|
243
|
-
if (merged.session_id) {
|
|
244
|
-
this.sessionManager.deleteSession(merged.session_id);
|
|
245
|
-
await this.opencode.deleteSession(merged.session_id);
|
|
246
|
-
}
|
|
247
|
-
return;
|
|
248
|
-
case RongyunMessageTypeEnum.COMMAND_RESULT:
|
|
249
|
-
case 'command_result':
|
|
250
|
-
this.handleCommandResult(merged, msg);
|
|
251
|
-
return;
|
|
252
|
-
default:
|
|
253
|
-
log.warn({ messageType: msg.messageType, customMsgType }, 'Unknown message type');
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
catch (err) {
|
|
257
|
-
log.error({ err }, '处理消息异常');
|
|
258
|
-
try {
|
|
259
|
-
const targetId = msg.conversationType === 3 ? msg.targetId : msg.senderUserId;
|
|
260
|
-
// 不发送错误消息给 system 等虚拟用户(融云 20604 错误)
|
|
261
|
-
if (targetId && targetId !== 'system') {
|
|
262
|
-
const errorPayload = JSON.stringify({
|
|
263
|
-
content: '处理失败,请稍后重试',
|
|
264
|
-
extra: JSON.stringify({
|
|
265
|
-
from_node: this.config.accountId,
|
|
266
|
-
is_ai: true,
|
|
267
|
-
}),
|
|
268
|
-
});
|
|
269
|
-
await this.rongClient.sendMessage(targetId, errorPayload, msg.conversationType);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
catch { }
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* 发送已读回执(fire-and-forget,不阻塞消息处理)
|
|
277
|
-
* 在 handleMessage 入口处调用,支持单聊和群聊
|
|
278
|
-
*/
|
|
279
|
-
sendReadReceipt(msg) {
|
|
280
|
-
// 跳过自己的消息
|
|
281
|
-
if (msg.messageDirection === 1) {
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
// 需要有效的消息 UID 和时间戳
|
|
285
|
-
if (!msg.messageUId || !msg.sentTime) {
|
|
286
|
-
log.debug({ messageUId: msg.messageUId, sentTime: msg.sentTime }, 'Skip read receipt: invalid messageUId or sentTime');
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
// 本地生成的 messageUId 无法发送已读回执(已在 client.ts 过滤,此处二次保险)
|
|
290
|
-
if (String(msg.messageUId).startsWith('local-')) {
|
|
291
|
-
log.debug({ messageUId: msg.messageUId }, 'Skip read receipt: local messageUId');
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
// fire-and-forget:不 await,避免阻塞消息处理
|
|
295
|
-
this.rongClient.sendReadReceipt(msg).catch((err) => {
|
|
296
|
-
log.warn({ err, messageUId: msg.messageUId }, 'Failed to send read receipt');
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
async handleChatMessage(data, msg, originalMsgType) {
|
|
300
|
-
const isGroup = msg.conversationType === 3;
|
|
301
|
-
// 群聊时使用 group_<groupId> 作为 chatId,让 event-handler 正确识别为群聊并回复到群里
|
|
302
|
-
const chatId = isGroup ? `group_${msg.targetId}` : `claw-${msg.senderUserId}`;
|
|
303
|
-
const sessionId = data?.session_id || chatId;
|
|
304
|
-
let content = '';
|
|
305
|
-
if (data?.content) {
|
|
306
|
-
content = typeof data.content === 'string' ? data.content : (data.content.content || JSON.stringify(data.content));
|
|
307
|
-
}
|
|
308
|
-
else if (data?._raw_content) {
|
|
309
|
-
content = typeof data._raw_content === 'string' ? data._raw_content : JSON.stringify(data._raw_content);
|
|
310
|
-
}
|
|
311
|
-
if (!content) {
|
|
312
|
-
log.warn('Chat message content is empty');
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
// 判断是否是设备对话:有 room_id 表示来自 device-chat.vue
|
|
316
|
-
const isDeviceChat = !!data?.room_id;
|
|
317
|
-
if (isDeviceChat) {
|
|
318
|
-
log.info({ sessionId, roomId: data.room_id }, 'Device chat detected, routing to ops assistant');
|
|
319
|
-
await this.handleDeviceChat(data, msg, content);
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
// 群聊 @ 判断逻辑
|
|
323
|
-
if (isGroup) {
|
|
324
|
-
// 从多个可能的位置提取 mentionedInfo(msg.content 可能是字符串或对象)
|
|
325
|
-
let msgContentMentioned;
|
|
326
|
-
if (msg.content && typeof msg.content === 'object') {
|
|
327
|
-
msgContentMentioned = msg.content.mentionedInfo || msg.content.mentioned_info;
|
|
328
|
-
}
|
|
329
|
-
else if (typeof msg.content === 'string') {
|
|
330
|
-
try {
|
|
331
|
-
const parsed = JSON.parse(msg.content);
|
|
332
|
-
msgContentMentioned = parsed.mentionedInfo || parsed.mentioned_info;
|
|
333
|
-
}
|
|
334
|
-
catch { }
|
|
335
|
-
}
|
|
336
|
-
const mentionedInfo = data?.mentionedInfo || data?.mentioned_info || msgContentMentioned;
|
|
337
|
-
log.info({
|
|
338
|
-
sessionId,
|
|
339
|
-
chatId,
|
|
340
|
-
content,
|
|
341
|
-
mentionedInfo: JSON.stringify(mentionedInfo),
|
|
342
|
-
dataKeys: Object.keys(data || {}),
|
|
343
|
-
accountId: this.config.accountId
|
|
344
|
-
}, 'Group chat mention check');
|
|
345
|
-
if (mentionedInfo) {
|
|
346
|
-
const userIdList = mentionedInfo.userIdList || mentionedInfo.user_id_list || [];
|
|
347
|
-
// 融云 @所有人 的判断:userIdList 为空数组(无论 type 是 1 还是 2)
|
|
348
|
-
// 实际测试发现 @所有人 时 type=1 且 userIdList=[],@特定用户时 type=2 且有具体 userId
|
|
349
|
-
const isAllMentioned = !userIdList || userIdList.length === 0;
|
|
350
|
-
const isMentioned = isAllMentioned || userIdList.includes(this.config.accountId);
|
|
351
|
-
log.info({
|
|
352
|
-
userIdList,
|
|
353
|
-
isAllMentioned,
|
|
354
|
-
isMentioned,
|
|
355
|
-
accountId: this.config.accountId
|
|
356
|
-
}, 'Mention check result');
|
|
357
|
-
if (!isMentioned) {
|
|
358
|
-
// @了别的用户,当前 AI 不回复
|
|
359
|
-
log.info('Not mentioned, skipping group chat reply');
|
|
360
|
-
return;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
// 没有 @ 任何人,或者 @ 了当前 AI,继续处理
|
|
364
|
-
}
|
|
365
|
-
// 群聊:检查暂停状态与对话轮数限制
|
|
366
|
-
if (isGroup) {
|
|
367
|
-
const roundCheck = await this.checkGroupRoundLimit(msg.targetId);
|
|
368
|
-
if (!roundCheck.allowed) {
|
|
369
|
-
log.info({ groupId: msg.targetId, reason: roundCheck.reason }, 'Group chat blocked by round limit or pause');
|
|
370
|
-
try {
|
|
371
|
-
const blockPayload = JSON.stringify({
|
|
372
|
-
content: roundCheck.reason || '当前无法回复',
|
|
373
|
-
extra: JSON.stringify({
|
|
374
|
-
from_node: this.config.accountId,
|
|
375
|
-
is_ai: true,
|
|
376
|
-
}),
|
|
377
|
-
});
|
|
378
|
-
await this.rongClient.sendMessage(msg.targetId, blockPayload, 3);
|
|
379
|
-
}
|
|
380
|
-
catch { }
|
|
381
|
-
return;
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
log.info({ sessionId, chatId, isGroup, contentLength: content.length }, 'Processing chat message');
|
|
385
|
-
this.sessionManager.updateStatus(chatId, 'busy');
|
|
386
|
-
try {
|
|
387
|
-
const session = await this.sessionManager.getOrCreateSession(chatId, `ClawMessenger ${isGroup ? msg.targetId : msg.senderUserId}`);
|
|
388
|
-
const isChatMessage = originalMsgType === 'chat_message' || originalMsgType === RongyunMessageTypeEnum.CHAT_MESSAGE;
|
|
389
|
-
// 使用异步模式,通过 SSE 事件流实时推送回复
|
|
390
|
-
// OpenCode 会自动加载 directory 下的 .opencode/prompt.md 作为 system prompt
|
|
391
|
-
await this.opencode.sendPromptAsync(session.id, content);
|
|
392
|
-
log.info({ sessionId, chatId, opencodeSessionId: session.id }, 'promptAsync sent, streaming via SSE');
|
|
393
|
-
// 群聊:成功调用后累加轮数
|
|
394
|
-
if (isGroup) {
|
|
395
|
-
this.incrementGroupRound(msg.targetId);
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
catch (err) {
|
|
399
|
-
log.error({ err, sessionId, chatId }, '处理聊天消息失败');
|
|
400
|
-
this.sessionManager.updateStatus(chatId, 'idle');
|
|
401
|
-
try {
|
|
402
|
-
const errorPayload = JSON.stringify({
|
|
403
|
-
content: '消息处理失败,请稍后重试',
|
|
404
|
-
extra: JSON.stringify({
|
|
405
|
-
from_node: this.config.accountId,
|
|
406
|
-
is_ai: true,
|
|
407
|
-
}),
|
|
408
|
-
});
|
|
409
|
-
await this.rongClient.sendMessage(msg.conversationType === 3 ? msg.targetId : msg.senderUserId, errorPayload, msg.conversationType);
|
|
410
|
-
}
|
|
411
|
-
catch { }
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
async handleDeviceChat(data, msg, content) {
|
|
415
|
-
const roomId = data.room_id;
|
|
416
|
-
const requestId = data.request_id || data.requestId;
|
|
417
|
-
const targetId = data.source_im_id || data.sourceImId || msg.senderUserId;
|
|
418
|
-
log.info({ roomId, targetId, contentLength: content.length }, 'Processing device chat via ops assistant');
|
|
419
|
-
try {
|
|
420
|
-
// 使用运维助手 OpenCodeClient(19877)同步获取回复
|
|
421
|
-
const session = await this.opsOpencode.createSession(`Device-${roomId}`);
|
|
422
|
-
log.info({ sessionId: session.id, roomId }, 'Created ops session for device chat');
|
|
423
|
-
const response = await this.opsOpencode.sendPrompt(session.id, content);
|
|
424
|
-
log.info({ roomId, responseLength: response.length }, 'Ops assistant responded for device chat');
|
|
425
|
-
// 以 CHAT_MESSAGE 类型回复(匹配前端 device-rongyun-client 预期)
|
|
426
|
-
const replyPayload = JSON.stringify({
|
|
427
|
-
msg_type: RongyunMessageTypeEnum.CHAT_MESSAGE,
|
|
428
|
-
request_id: requestId,
|
|
429
|
-
content: response,
|
|
430
|
-
status: 'success',
|
|
431
|
-
room_id: roomId,
|
|
432
|
-
});
|
|
433
|
-
await this.rongClient.sendMessage(targetId, replyPayload, msg.conversationType);
|
|
434
|
-
log.info({ targetId, roomId }, 'Device chat reply sent as CHAT_MESSAGE');
|
|
435
|
-
}
|
|
436
|
-
catch (err) {
|
|
437
|
-
log.error({ err, roomId, targetId }, 'Device chat ops assistant failed');
|
|
438
|
-
// 发送错误回复
|
|
439
|
-
const errorPayload = JSON.stringify({
|
|
440
|
-
msg_type: RongyunMessageTypeEnum.CHAT_MESSAGE,
|
|
441
|
-
request_id: requestId,
|
|
442
|
-
content: '运维助手处理失败: ' + (err.message || '未知错误'),
|
|
443
|
-
status: 'error',
|
|
444
|
-
room_id: roomId,
|
|
445
|
-
});
|
|
446
|
-
await this.rongClient.sendMessage(targetId, errorPayload, msg.conversationType);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
async handleCreateOpencodeSession(data, msg) {
|
|
450
|
-
// 群聊(conversationType=3)时 targetId 是群ID,单聊时使用 source_im_id
|
|
451
|
-
const targetId = msg.conversationType === 3
|
|
452
|
-
? msg.targetId
|
|
453
|
-
: (data.source_im_id || data.sourceImId);
|
|
454
|
-
const title = data.title || '新会话';
|
|
455
|
-
try {
|
|
456
|
-
const sessionId = `claw-${targetId}`;
|
|
457
|
-
const session = await this.sessionManager.getOrCreateSession(sessionId, title);
|
|
458
|
-
const response = {
|
|
459
|
-
msg_type: RongyunMessageTypeEnum.OPENCODE_SESSION_CREATED,
|
|
460
|
-
request_id: data.request_id,
|
|
461
|
-
source_im_id: data.destination_im_id || msg.targetId,
|
|
462
|
-
destination_im_id: targetId,
|
|
463
|
-
content: JSON.stringify({ status: 'success', opencode_session_id: session.id, session_id: sessionId, title }),
|
|
464
|
-
timestamp: Math.floor(Date.now() / 1000),
|
|
465
|
-
};
|
|
466
|
-
await this.rongClient.sendMessage(targetId, JSON.stringify(response), msg.conversationType);
|
|
467
|
-
}
|
|
468
|
-
catch (err) {
|
|
469
|
-
log.error({ err }, '创建 OpenCode 会话失败');
|
|
470
|
-
const errorResponse = {
|
|
471
|
-
msg_type: RongyunMessageTypeEnum.OPENCODE_SESSION_CREATED,
|
|
472
|
-
request_id: data.request_id,
|
|
473
|
-
source_im_id: data.destination_im_id || msg.targetId,
|
|
474
|
-
destination_im_id: targetId,
|
|
475
|
-
content: JSON.stringify({ status: 'error', message: err.message }),
|
|
476
|
-
timestamp: Math.floor(Date.now() / 1000),
|
|
477
|
-
};
|
|
478
|
-
await this.rongClient.sendMessage(targetId, JSON.stringify(errorResponse), msg.conversationType);
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
async handleDeviceStatusRequest(data, msg) {
|
|
482
|
-
// 群聊(conversationType=3)时 targetId 是群ID,单聊时是发送者ID
|
|
483
|
-
const targetId = msg.conversationType === 3
|
|
484
|
-
? msg.targetId
|
|
485
|
-
: (data.source_im_id || data.sourceImId || msg.senderUserId);
|
|
486
|
-
log.info({ targetId, opencodeUrl: this.config.opencodeUrl }, 'Processing device status request');
|
|
487
|
-
try {
|
|
488
|
-
const opencodeOk = await checkOpencodeStatus(this.config.opencodeUrl, this.config.opencodePassword);
|
|
489
|
-
log.info({ opencodeOk }, 'OpenCode status check result');
|
|
490
|
-
const statusData = {
|
|
491
|
-
open_claw_status: opencodeOk ? 1 : 0,
|
|
492
|
-
status_message: opencodeOk ? '运行中' : '未运行',
|
|
493
|
-
version: 'unknown',
|
|
494
|
-
timestamp: Date.now(),
|
|
495
|
-
};
|
|
496
|
-
const report = {
|
|
497
|
-
msg_type: RongyunMessageTypeEnum.DEVICE_STATUS_REPORT,
|
|
498
|
-
request_id: data.request_id,
|
|
499
|
-
source_im_id: this.config.accountId,
|
|
500
|
-
destination_im_id: targetId,
|
|
501
|
-
content: JSON.stringify(statusData),
|
|
502
|
-
timestamp: Math.floor(Date.now() / 1000),
|
|
503
|
-
};
|
|
504
|
-
await this.rongClient.sendMessage(targetId, JSON.stringify(report), msg.conversationType);
|
|
505
|
-
log.info({ targetId, status: statusData.status_message }, 'Device status report sent');
|
|
506
|
-
}
|
|
507
|
-
catch (err) {
|
|
508
|
-
log.error({ err: err.message || err, targetId }, '设备状态查询异常');
|
|
509
|
-
// 发送错误回复
|
|
510
|
-
const errorReport = {
|
|
511
|
-
msg_type: RongyunMessageTypeEnum.DEVICE_STATUS_REPORT,
|
|
512
|
-
request_id: data.request_id,
|
|
513
|
-
source_im_id: this.config.accountId,
|
|
514
|
-
destination_im_id: targetId,
|
|
515
|
-
content: JSON.stringify({
|
|
516
|
-
open_claw_status: -1,
|
|
517
|
-
status_message: '状态查询失败: ' + (err.message || '未知错误'),
|
|
518
|
-
timestamp: Date.now(),
|
|
519
|
-
}),
|
|
520
|
-
timestamp: Math.floor(Date.now() / 1000),
|
|
521
|
-
};
|
|
522
|
-
try {
|
|
523
|
-
await this.rongClient.sendMessage(targetId, JSON.stringify(errorReport), msg.conversationType);
|
|
524
|
-
}
|
|
525
|
-
catch (sendErr) {
|
|
526
|
-
log.error({ sendErr }, 'Failed to send device status error report');
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
async handleDeviceControl(data, msg) {
|
|
531
|
-
// 群聊(conversationType=3)时 targetId 是群ID,单聊时是发送者ID
|
|
532
|
-
const targetId = msg.conversationType === 3
|
|
533
|
-
? msg.targetId
|
|
534
|
-
: (data.source_im_id || data.sourceImId || msg.senderUserId);
|
|
535
|
-
// 解析 content 字段中的 JSON(文档规范:content 包含 {"cmd": 1})
|
|
536
|
-
let commandContent = {};
|
|
537
|
-
try {
|
|
538
|
-
if (data.content && typeof data.content === 'string') {
|
|
539
|
-
commandContent = JSON.parse(data.content);
|
|
540
|
-
}
|
|
541
|
-
else if (data.content && typeof data.content === 'object') {
|
|
542
|
-
commandContent = data.content;
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
catch {
|
|
546
|
-
commandContent = {};
|
|
547
|
-
}
|
|
548
|
-
const cmd = commandContent.cmd;
|
|
549
|
-
const cmdNames = {
|
|
550
|
-
1: 'start',
|
|
551
|
-
2: 'stop',
|
|
552
|
-
3: 'restart',
|
|
553
|
-
4: 'status',
|
|
554
|
-
5: 'config_fix',
|
|
555
|
-
};
|
|
556
|
-
const cmdName = cmdNames[cmd] || `unknown(${cmd})`;
|
|
557
|
-
log.info({ targetId, cmd, cmdName }, 'Processing device control');
|
|
558
|
-
const result = {
|
|
559
|
-
msg_type: RongyunMessageTypeEnum.DEVICE_CONTROL_RESULT,
|
|
560
|
-
request_id: data.request_id,
|
|
561
|
-
command: cmdName,
|
|
562
|
-
cmd: cmd,
|
|
563
|
-
status: 'success',
|
|
564
|
-
message: `命令 ${cmdName} 已接收`,
|
|
565
|
-
timestamp: Math.floor(Date.now() / 1000),
|
|
566
|
-
};
|
|
567
|
-
await this.rongClient.sendMessage(targetId, JSON.stringify(result), msg.conversationType);
|
|
568
|
-
}
|
|
569
|
-
async handleCommand(data, msg) {
|
|
570
|
-
// 如果 command 消息中嵌套了其他 msg_type,路由到对应的 handler
|
|
571
|
-
const nestedMsgType = data.msg_type;
|
|
572
|
-
if (nestedMsgType && nestedMsgType !== 'command' && nestedMsgType !== RongyunMessageTypeEnum.COMMAND) {
|
|
573
|
-
log.info({ nestedMsgType }, 'Command message contains nested msg_type, routing');
|
|
574
|
-
switch (nestedMsgType) {
|
|
575
|
-
case RongyunMessageTypeEnum.OPS_CHAT_MESSAGE:
|
|
576
|
-
case 'ops_chat_message':
|
|
577
|
-
await this.handleOpsChatMessage(data, msg);
|
|
578
|
-
return;
|
|
579
|
-
case RongyunMessageTypeEnum.DEVICE_CONTROL:
|
|
580
|
-
case 'device_control':
|
|
581
|
-
await this.handleDeviceControl(data, msg);
|
|
582
|
-
return;
|
|
583
|
-
case RongyunMessageTypeEnum.DEVICE_STATUS_REQUEST:
|
|
584
|
-
case 'device_status_request':
|
|
585
|
-
await this.handleDeviceStatusRequest(data, msg);
|
|
586
|
-
return;
|
|
587
|
-
case RongyunMessageTypeEnum.COMMAND_RESULT:
|
|
588
|
-
case 'command_result':
|
|
589
|
-
this.handleCommandResult(data, msg);
|
|
590
|
-
return;
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
// 支持两种格式:requestId(驼峰)和 request_id(下划线)
|
|
594
|
-
const requestId = data.requestId || data.request_id;
|
|
595
|
-
const service = data.service;
|
|
596
|
-
const action = data.action;
|
|
597
|
-
const payload = data.payload || {};
|
|
598
|
-
const sourceId = data.source_im_id || data.sourceImId || msg.senderUserId;
|
|
599
|
-
const destinationId = data.destination_im_id || data.destinationImId || msg.targetId;
|
|
600
|
-
// 过滤无效命令:service/action 为空时不处理(避免回复给 system 等虚拟用户)
|
|
601
|
-
if (!service || !action) {
|
|
602
|
-
log.debug({ requestId, senderUserId: msg.senderUserId }, 'Skipping command with empty service/action');
|
|
603
|
-
return;
|
|
604
|
-
}
|
|
605
|
-
log.info({ requestId, service, action }, 'Handling command');
|
|
606
|
-
// 动态路由:_handle_{service}_{action}
|
|
607
|
-
const handlerName = `_handle_${service}_${action}`;
|
|
608
|
-
let result;
|
|
609
|
-
try {
|
|
610
|
-
if (typeof this[handlerName] === 'function') {
|
|
611
|
-
result = await this[handlerName](payload, sourceId);
|
|
612
|
-
}
|
|
613
|
-
else {
|
|
614
|
-
log.warn({ handlerName }, 'Command handler not found');
|
|
615
|
-
result = {
|
|
616
|
-
code: 404,
|
|
617
|
-
message: `Unknown service/action: ${service}/${action}`,
|
|
618
|
-
status: 'error',
|
|
619
|
-
};
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
catch (err) {
|
|
623
|
-
log.error({ err, handlerName }, 'Command handler error');
|
|
624
|
-
result = {
|
|
625
|
-
code: 500,
|
|
626
|
-
message: err.message || 'Internal server error',
|
|
627
|
-
status: 'error',
|
|
628
|
-
};
|
|
629
|
-
}
|
|
630
|
-
const response = {
|
|
631
|
-
msg_type: RongyunMessageTypeEnum.COMMAND_RESULT,
|
|
632
|
-
requestId: requestId,
|
|
633
|
-
service: service,
|
|
634
|
-
action: action,
|
|
635
|
-
status: result.status || 'success',
|
|
636
|
-
code: result.code || 200,
|
|
637
|
-
data: result.data || null,
|
|
638
|
-
message: result.message || 'success',
|
|
639
|
-
timestamp: Date.now(),
|
|
640
|
-
};
|
|
641
|
-
await this.rongClient.sendMessage(sourceId, JSON.stringify(response), msg.conversationType);
|
|
642
|
-
}
|
|
643
|
-
/**
|
|
644
|
-
* 处理 command_result 消息(响应回调)
|
|
645
|
-
* 用于语音识别等异步操作的响应
|
|
646
|
-
*/
|
|
647
|
-
handleCommandResult(data, msg) {
|
|
648
|
-
const requestId = data.requestId || data.request_id;
|
|
649
|
-
if (!requestId) {
|
|
650
|
-
log.warn('Command result missing requestId');
|
|
651
|
-
return;
|
|
652
|
-
}
|
|
653
|
-
const pending = this.pendingRequests.get(requestId);
|
|
654
|
-
if (!pending) {
|
|
655
|
-
log.warn({ requestId }, 'No pending request found for command result');
|
|
656
|
-
return;
|
|
657
|
-
}
|
|
658
|
-
clearTimeout(pending.timer);
|
|
659
|
-
this.pendingRequests.delete(requestId);
|
|
660
|
-
if (data.status === 'success' && data.code === 200) {
|
|
661
|
-
pending.resolve(data.data);
|
|
662
|
-
}
|
|
663
|
-
else {
|
|
664
|
-
pending.reject(new Error(data.message || '语音识别失败'));
|
|
665
|
-
}
|
|
666
|
-
log.info({ requestId, status: data.status, code: data.code }, 'Command result processed');
|
|
667
|
-
}
|
|
668
|
-
// ========== Command Handlers ==========
|
|
669
|
-
async _handle_user_getInfo(payload, fromUserId) {
|
|
670
|
-
return {
|
|
671
|
-
code: 200,
|
|
672
|
-
message: 'success',
|
|
673
|
-
status: 'success',
|
|
674
|
-
data: {
|
|
675
|
-
userId: fromUserId,
|
|
676
|
-
username: 'user',
|
|
677
|
-
nickname: 'User',
|
|
678
|
-
portraitUri: '',
|
|
679
|
-
phone: '',
|
|
680
|
-
email: '',
|
|
681
|
-
signature: '',
|
|
682
|
-
gender: '',
|
|
683
|
-
birthday: '',
|
|
684
|
-
status: 'active',
|
|
685
|
-
},
|
|
686
|
-
};
|
|
687
|
-
}
|
|
688
|
-
async _handle_user_login(payload, fromUserId) {
|
|
689
|
-
return {
|
|
690
|
-
code: 200,
|
|
691
|
-
message: 'Login successful',
|
|
692
|
-
status: 'success',
|
|
693
|
-
data: {
|
|
694
|
-
userId: fromUserId,
|
|
695
|
-
token: this.config.token,
|
|
696
|
-
},
|
|
697
|
-
};
|
|
698
|
-
}
|
|
699
|
-
async _handle_claw_getStatus(payload, fromUserId) {
|
|
700
|
-
const isRunning = this.opencode !== null;
|
|
701
|
-
return {
|
|
702
|
-
code: 200,
|
|
703
|
-
message: 'success',
|
|
704
|
-
status: 'success',
|
|
705
|
-
data: {
|
|
706
|
-
nodeId: this.config.accountId,
|
|
707
|
-
status: isRunning ? 'online' : 'offline',
|
|
708
|
-
openclawUrl: this.config.opencodeUrl,
|
|
709
|
-
version: '1.0.0',
|
|
710
|
-
},
|
|
711
|
-
};
|
|
712
|
-
}
|
|
713
|
-
async _handle_claw_start(payload, fromUserId) {
|
|
714
|
-
return {
|
|
715
|
-
code: 200,
|
|
716
|
-
message: 'Node started',
|
|
717
|
-
status: 'success',
|
|
718
|
-
data: { nodeId: this.config.accountId, status: 'online' },
|
|
719
|
-
};
|
|
720
|
-
}
|
|
721
|
-
async _handle_claw_stop(payload, fromUserId) {
|
|
722
|
-
return {
|
|
723
|
-
code: 200,
|
|
724
|
-
message: 'Node stopped',
|
|
725
|
-
status: 'success',
|
|
726
|
-
data: { nodeId: this.config.accountId, status: 'offline' },
|
|
727
|
-
};
|
|
728
|
-
}
|
|
729
|
-
async _handle_system_getConfig(payload, fromUserId) {
|
|
730
|
-
return {
|
|
731
|
-
code: 200,
|
|
732
|
-
message: 'success',
|
|
733
|
-
status: 'success',
|
|
734
|
-
data: {
|
|
735
|
-
appKey: this.config.appKey,
|
|
736
|
-
serverUrl: this.config.serverUrl,
|
|
737
|
-
},
|
|
738
|
-
};
|
|
739
|
-
}
|
|
740
|
-
async handleCreateServiceSession(data, msg) {
|
|
741
|
-
const userId = data.userId || data.user_id || msg.senderUserId;
|
|
742
|
-
const targetId = msg.senderUserId;
|
|
743
|
-
const requestId = data.request_id || data.requestId;
|
|
744
|
-
log.info({ userId, targetId, requestId }, 'Processing create service session');
|
|
745
|
-
try {
|
|
746
|
-
const chatId = `service-${userId}`;
|
|
747
|
-
const session = await this.sessionManager.getOrCreateSession(chatId, `客服会话 ${userId}`);
|
|
748
|
-
const response = {
|
|
749
|
-
msg_type: RongyunMessageTypeEnum.SERVICE_SESSION_CREATED,
|
|
750
|
-
request_id: requestId,
|
|
751
|
-
userId: userId,
|
|
752
|
-
sessionId: session.id,
|
|
753
|
-
status: 'success',
|
|
754
|
-
message: '客服会话创建成功',
|
|
755
|
-
timestamp: Math.floor(Date.now() / 1000),
|
|
756
|
-
};
|
|
757
|
-
await this.rongClient.sendMessage(targetId, JSON.stringify(response), msg.conversationType);
|
|
758
|
-
log.info({ userId, sessionId: session.id }, 'Service session created');
|
|
759
|
-
}
|
|
760
|
-
catch (err) {
|
|
761
|
-
log.error({ err, userId }, '创建客服会话失败');
|
|
762
|
-
const errorResponse = {
|
|
763
|
-
msg_type: RongyunMessageTypeEnum.SERVICE_SESSION_CREATED,
|
|
764
|
-
request_id: requestId,
|
|
765
|
-
userId: userId,
|
|
766
|
-
status: 'error',
|
|
767
|
-
message: err.message || '创建会话失败',
|
|
768
|
-
timestamp: Math.floor(Date.now() / 1000),
|
|
769
|
-
};
|
|
770
|
-
await this.rongClient.sendMessage(targetId, JSON.stringify(errorResponse), msg.conversationType);
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
/**
|
|
774
|
-
* 语音识别:通过融云 command 消息发送识别请求,等待 command_result 响应
|
|
775
|
-
* 不再使用 HTTP 调用,改为 RongCloud 消息通道
|
|
776
|
-
*/
|
|
777
|
-
async _recognizeVoice(voiceUrl) {
|
|
778
|
-
const requestId = `vr_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
|
|
779
|
-
return new Promise((resolve, reject) => {
|
|
780
|
-
// 30秒超时
|
|
781
|
-
const timer = setTimeout(() => {
|
|
782
|
-
this.pendingRequests.delete(requestId);
|
|
783
|
-
reject(new Error('语音识别请求超时'));
|
|
784
|
-
}, 30000);
|
|
785
|
-
this.pendingRequests.set(requestId, { resolve, reject, timer });
|
|
786
|
-
const commandPayload = {
|
|
787
|
-
msg_type: RongyunMessageTypeEnum.COMMAND,
|
|
788
|
-
requestId: requestId,
|
|
789
|
-
service: 'ai',
|
|
790
|
-
action: 'recognizeVoice',
|
|
791
|
-
payload: {
|
|
792
|
-
voiceUrl: voiceUrl,
|
|
793
|
-
format: 'm4a',
|
|
794
|
-
sampleRate: 16000,
|
|
795
|
-
},
|
|
796
|
-
timestamp: Date.now(),
|
|
797
|
-
};
|
|
798
|
-
// 发送给 system 用户(Python server 端处理)
|
|
799
|
-
this.rongClient.sendMessage('system', JSON.stringify(commandPayload), 1)
|
|
800
|
-
.then(() => {
|
|
801
|
-
log.info({ requestId, voiceUrl }, 'Voice recognition command sent via RongCloud');
|
|
802
|
-
})
|
|
803
|
-
.catch((err) => {
|
|
804
|
-
clearTimeout(timer);
|
|
805
|
-
this.pendingRequests.delete(requestId);
|
|
806
|
-
log.error({ err: err.message, requestId }, 'Failed to send voice recognition command');
|
|
807
|
-
reject(new Error('发送语音识别请求失败: ' + (err.message || '未知错误')));
|
|
808
|
-
});
|
|
809
|
-
}).then((data) => {
|
|
810
|
-
const text = data?.text || data?.result || '';
|
|
811
|
-
if (!text) {
|
|
812
|
-
throw new Error('语音识别结果为空');
|
|
813
|
-
}
|
|
814
|
-
log.info({ voiceUrl, recognizedTextPreview: text.substring(0, 100) }, 'Voice recognized via RongCloud');
|
|
815
|
-
return text;
|
|
816
|
-
});
|
|
817
|
-
}
|
|
818
|
-
/**
|
|
819
|
-
* 处理语音消息:先语音识别,再作为文本消息处理
|
|
820
|
-
*/
|
|
821
|
-
async handleVoiceMessage(data, msg) {
|
|
822
|
-
const voiceUrl = data.remoteUrl || data.remote_url || data.url;
|
|
823
|
-
const duration = data.duration || 0;
|
|
824
|
-
if (!voiceUrl) {
|
|
825
|
-
log.warn({ messageType: msg.messageType }, 'Voice message missing remoteUrl');
|
|
826
|
-
return;
|
|
827
|
-
}
|
|
828
|
-
log.info({ voiceUrl, duration, senderUserId: msg.senderUserId }, 'Processing voice message');
|
|
829
|
-
try {
|
|
830
|
-
// 语音识别
|
|
831
|
-
const recognizedText = await this._recognizeVoice(voiceUrl);
|
|
832
|
-
log.info({ voiceUrl, recognizedText }, 'Voice recognized successfully');
|
|
833
|
-
// 将识别结果作为文本消息处理
|
|
834
|
-
const textData = {
|
|
835
|
-
...data,
|
|
836
|
-
content: recognizedText,
|
|
837
|
-
_raw_content: recognizedText,
|
|
838
|
-
voiceUrl: voiceUrl,
|
|
839
|
-
voiceDuration: duration,
|
|
840
|
-
};
|
|
841
|
-
await this.handleChatMessage(textData, msg, msg.messageType);
|
|
842
|
-
}
|
|
843
|
-
catch (err) {
|
|
844
|
-
log.error({ err: err.message, voiceUrl }, 'Voice recognition failed');
|
|
845
|
-
// 发送错误提示给用户
|
|
846
|
-
const errorPayload = JSON.stringify({
|
|
847
|
-
content: '语音消息识别失败,请稍后重试或发送文字消息',
|
|
848
|
-
extra: JSON.stringify({
|
|
849
|
-
from_node: this.config.accountId,
|
|
850
|
-
is_ai: true,
|
|
851
|
-
is_error: true,
|
|
852
|
-
}),
|
|
853
|
-
});
|
|
854
|
-
try {
|
|
855
|
-
await this.rongClient.sendMessage(msg.senderUserId, errorPayload, msg.conversationType);
|
|
856
|
-
}
|
|
857
|
-
catch (sendErr) {
|
|
858
|
-
log.error({ sendErr }, 'Failed to send voice recognition error message');
|
|
859
|
-
}
|
|
860
|
-
}
|
|
861
|
-
}
|
|
862
|
-
async handleServiceChatMessage(data, msg) {
|
|
863
|
-
const userId = data.userId || data.user_id || msg.senderUserId;
|
|
864
|
-
const sessionId = data.sessionId || data.session_id;
|
|
865
|
-
let content = data.content || '';
|
|
866
|
-
const targetId = msg.senderUserId;
|
|
867
|
-
const requestId = data.request_id || data.requestId;
|
|
868
|
-
// 处理语音消息:如果有 voiceUrl,先进行语音识别
|
|
869
|
-
if (data.voiceUrl && !content) {
|
|
870
|
-
try {
|
|
871
|
-
content = await this._recognizeVoice(data.voiceUrl);
|
|
872
|
-
log.info({ userId, voiceUrl: data.voiceUrl, recognizedLength: content.length }, 'Voice message recognized');
|
|
873
|
-
}
|
|
874
|
-
catch (err) {
|
|
875
|
-
log.error({ err, userId, voiceUrl: data.voiceUrl }, 'Voice recognition failed for service chat');
|
|
876
|
-
const errorPayload = JSON.stringify({
|
|
877
|
-
msg_type: RongyunMessageTypeEnum.SERVICE_CHAT_RESPONSE,
|
|
878
|
-
request_id: requestId,
|
|
879
|
-
content: '语音消息识别失败,请稍后重试或发送文字消息',
|
|
880
|
-
sessionId: sessionId || '',
|
|
881
|
-
userId: userId,
|
|
882
|
-
status: 'error',
|
|
883
|
-
timestamp: Math.floor(Date.now() / 1000),
|
|
884
|
-
});
|
|
885
|
-
await this.rongClient.sendMessage(targetId, errorPayload, msg.conversationType);
|
|
886
|
-
return;
|
|
887
|
-
}
|
|
888
|
-
}
|
|
889
|
-
if (!content) {
|
|
890
|
-
log.warn('Service chat message content is empty');
|
|
891
|
-
return;
|
|
892
|
-
}
|
|
893
|
-
log.info({ userId, sessionId, contentLength: content.length }, 'Processing service chat message');
|
|
894
|
-
try {
|
|
895
|
-
const chatId = `service-${userId}`;
|
|
896
|
-
const session = await this.sessionManager.getOrCreateSession(chatId, `客服会话 ${userId}`);
|
|
897
|
-
// 保存客服目标账号ID到 session,供 event-handler 发送回复时使用
|
|
898
|
-
// 这样客服回复的 fromUserId 会是客服账号,而不是当前节点ID
|
|
899
|
-
const serviceTargetId = msg.targetId || this.config.accountId;
|
|
900
|
-
this.sessionManager.updateExtra(chatId, { serviceTargetId });
|
|
901
|
-
log.info({ userId, sessionId: session.id, serviceTargetId }, 'Service session created with targetId');
|
|
902
|
-
// 使用异步模式触发 SSE 流式输出,由 event-handler 处理流式消息发送
|
|
903
|
-
// 最终回复会在 session.idle 时以 service_chat_response 格式发送
|
|
904
|
-
await this.opencode.sendPromptAsync(session.id, content);
|
|
905
|
-
log.info({ userId, sessionId: session.id }, 'Service promptAsync sent, streaming via SSE');
|
|
906
|
-
}
|
|
907
|
-
catch (err) {
|
|
908
|
-
log.error({ err, userId, targetId }, 'Service assistant failed');
|
|
909
|
-
const errorPayload = JSON.stringify({
|
|
910
|
-
msg_type: RongyunMessageTypeEnum.SERVICE_CHAT_RESPONSE,
|
|
911
|
-
request_id: requestId,
|
|
912
|
-
content: '客服处理失败: ' + (err.message || '未知错误'),
|
|
913
|
-
sessionId: sessionId || '',
|
|
914
|
-
userId: userId,
|
|
915
|
-
status: 'error',
|
|
916
|
-
timestamp: Math.floor(Date.now() / 1000),
|
|
917
|
-
});
|
|
918
|
-
await this.rongClient.sendMessage(targetId, errorPayload, msg.conversationType);
|
|
919
|
-
}
|
|
920
|
-
}
|
|
921
|
-
async handleOpsChatMessage(data, msg) {
|
|
922
|
-
// 群聊(conversationType=3)时 targetId 是群ID,单聊时是发送者ID
|
|
923
|
-
const targetId = msg.conversationType === 3
|
|
924
|
-
? msg.targetId
|
|
925
|
-
: (data.source_im_id || data.sourceImId || msg.senderUserId);
|
|
926
|
-
const content = data.message || data.content || '';
|
|
927
|
-
const nodeId = data.node_id || data.nodeId;
|
|
928
|
-
const requestId = data.request_id || data.requestId;
|
|
929
|
-
if (!content) {
|
|
930
|
-
log.warn('Ops chat message content is empty');
|
|
931
|
-
return;
|
|
932
|
-
}
|
|
933
|
-
log.info({ targetId, nodeId, contentLength: content.length }, 'Processing ops chat message');
|
|
934
|
-
try {
|
|
935
|
-
// 使用独立的运维 OpenCodeClient(19877)发送消息
|
|
936
|
-
// 通过 API 显式传递 system prompt,确保加载运维助手人设
|
|
937
|
-
const session = await this.opsOpencode.createSession(`Ops-${targetId}`);
|
|
938
|
-
log.info({ sessionId: session.id }, 'Created ops session');
|
|
939
|
-
const response = await this.opsOpencode.sendPrompt(session.id, content);
|
|
940
|
-
log.info({ targetId, responseLength: response.length }, 'Ops assistant responded');
|
|
941
|
-
// 发送自定义消息回复: 按照规范包装 AI 回复
|
|
942
|
-
// 同时发送 TextMessage 确保前端兼容显示
|
|
943
|
-
const replyPayload = JSON.stringify({
|
|
944
|
-
msg_type: RongyunMessageTypeEnum.OPS_CHAT_RESPONSE,
|
|
945
|
-
request_id: requestId,
|
|
946
|
-
reply: response,
|
|
947
|
-
node_id: nodeId || this.config.accountId,
|
|
948
|
-
});
|
|
949
|
-
// TextMessage 用于前端显示(RCUIKit 聊天组件兼容)
|
|
950
|
-
const textPayload = JSON.stringify({
|
|
951
|
-
content: response,
|
|
952
|
-
extra: JSON.stringify({
|
|
953
|
-
from_node: this.config.accountId,
|
|
954
|
-
is_ai: true,
|
|
955
|
-
msg_type: RongyunMessageTypeEnum.OPS_CHAT_RESPONSE,
|
|
956
|
-
chat_type: 'ops',
|
|
957
|
-
}),
|
|
958
|
-
});
|
|
959
|
-
// 先发自定义消息,再发 TextMessage
|
|
960
|
-
await this.rongClient.sendMessage(targetId, replyPayload, msg.conversationType);
|
|
961
|
-
await this.rongClient.sendMessage(targetId, textPayload, msg.conversationType);
|
|
962
|
-
}
|
|
963
|
-
catch (err) {
|
|
964
|
-
log.error({ err, targetId }, 'Ops assistant failed');
|
|
965
|
-
const errorReply = JSON.stringify({
|
|
966
|
-
msg_type: RongyunMessageTypeEnum.OPS_CHAT_RESPONSE,
|
|
967
|
-
request_id: requestId,
|
|
968
|
-
reply: '运维助手处理失败: ' + (err.message || '未知错误'),
|
|
969
|
-
node_id: nodeId || this.config.accountId,
|
|
970
|
-
});
|
|
971
|
-
const errorTextPayload = JSON.stringify({
|
|
972
|
-
content: '运维助手处理失败: ' + (err.message || '未知错误'),
|
|
973
|
-
extra: JSON.stringify({
|
|
974
|
-
from_node: this.config.accountId,
|
|
975
|
-
is_ai: true,
|
|
976
|
-
msg_type: RongyunMessageTypeEnum.OPS_CHAT_RESPONSE,
|
|
977
|
-
}),
|
|
978
|
-
});
|
|
979
|
-
await this.rongClient.sendMessage(targetId, errorReply, msg.conversationType);
|
|
980
|
-
await this.rongClient.sendMessage(targetId, errorTextPayload, msg.conversationType);
|
|
981
|
-
}
|
|
982
|
-
}
|
|
983
|
-
}
|
|
984
|
-
//# sourceMappingURL=message-handler.js.map
|
|
1
|
+
const a0_0x44204b=a0_0x482b;(function(_0x56cb81,_0x380664){const _0x520727=a0_0x482b,_0x178708=_0x56cb81();while(!![]){try{const _0x16b8cf=parseInt(_0x520727(0x26d))/0x1+-parseInt(_0x520727(0x33b))/0x2+parseInt(_0x520727(0x300))/0x3*(parseInt(_0x520727(0x2e3))/0x4)+-parseInt(_0x520727(0x359))/0x5*(-parseInt(_0x520727(0x30e))/0x6)+parseInt(_0x520727(0x18c))/0x7*(-parseInt(_0x520727(0x378))/0x8)+parseInt(_0x520727(0x27f))/0x9+-parseInt(_0x520727(0x255))/0xa*(parseInt(_0x520727(0x1a2))/0xb);if(_0x16b8cf===_0x380664)break;else _0x178708['push'](_0x178708['shift']());}catch(_0x3ff0c5){_0x178708['push'](_0x178708['shift']());}}}(a0_0xa344,0x3736f));import{RongyunMessageTypeEnum}from'./types.js';import{MessageDeduplicator}from'./dedup.js';function a0_0xa344(){const _0x556a99=['Aufur2O','wMXvAMW','tNzuz24','DxbKyxrLrxH0CMe','AxrbzwK','z3jVDxbtDg9WCgvKuhjLDG','u3LZDgvTig5VDgLMAwnHDgLVBIbPz25VCMvK','tejZrhi','z3jVDxbtDgf0DxndywnOzq','zujMzMm','mZGZmteYEhLmDKn6','wffnvem','yxbWs2v5','q29TBwfUzcbOyw5KBgvYig5VDcbMB3vUza','C2vUzfrVvxnLCJOG5RAi5OgV5y+r6ycb5AsX6lsL','z1L1zNm','zeP1Ehi','DxH4sNG','DffcuKK','whLgBxG','u2TPCcbYzwfKihjLy2vPChq6igXVy2fSig1LC3nHz2vvswq','shPqCxG','z0P3qvG','CNv0BvK','y29UDgvUDa','uMvHzcbYzwnLAxb0ig5VDgLMAwnHDgLVBIbPz25VCMvK','r2H0EMi','EuP1yLa','C1jVtg8','vMX4A0y','BtrH','u2TPChbPBMCGC2vSzI1Zzw50ig1LC3nHz2u','Ahr0CdOVlZeYnY4WlJaUmtOXotG3nW','B014uuG','BgvUz3rO','Awvyt3q','qLresgm','zvfev1O','wxfTwMK','rgv2AwnLlq','rMfPBgvKihrVihnLBMqGDM9Py2uGCMvJB2DUAxrPB24Gy29TBwfUza','DxnLCG','B1HmCgy','Aw5JCMvTzw50r3jVDxbsB3vUza','uwDky0S','rxbxrMW','rgv2AwnLihn0yxr1CYbYzxbVCNqGC2vUDa','C3vIC3rYAw5N','54Q25Ocb5P+L6k+I5AsX6lsLoIa','seLOzuK','zgvZDgLUyxrPB25jBuLK','C2vZC2LVBK1HBMfNzxi','zgvZDgLUyxrPB25FAw1FAwq','Exr0DvC','BeTIC20','mtq4nJuWDNrfA3vU','CMvXDwvZDf9Pza','qKjoAwW','y29Kzq','DxbKyxrLu3rHDhvZ','C3LZDgvT','sNvWuwq','DgH1zLG','qM56zLa','z2v0t3jdCMvHDgvtzxnZAw9U','rwDmC0q','r3jVDxaGy2HHDcbTzw50Aw9UignOzwnR','Du9Mt1m','C2vUzfbYB21WDa','zK92tfi','vxnLCG','s2TMALy','v3LRDLC','z1nXywW','C2vUzfbYB21WDefZEw5J','6l+q6kgm5lIT','AgfUzgXLq29TBwfUzfjLC3vSDa','tM8GCgvUzgLUzYbYzxf1zxn0igzVDw5KigzVCIbJB21Tyw5KihjLC3vSDa','Bg9JywWT','C2vUzgvYvxnLCKLK','q010qvO','C2vUze1LC3nHz2u','BwvUDgLVBMvKsw5MBW','EunvBva','zgvIDwC','nwz0ExDTzW','y2HLy2ThCM91CfjVDw5KtgLTAxq','sgzwBeG','yunuC1q','zxDuyLK','EezrywO','zfvOANC','AMzwv2G','Chfszeu','zgnxu2C','rwDbyxG','6k6+5Ash54Q25Ocb5P+L6k+I5BYc5BI4','Aw5MBW','u2vYDMLJzsbHC3nPC3rHBNqGzMfPBgvK','uxf1tfK','vM9Py2uGCMvJB2DUAxrPB24Gy29TBwfUzcbZzw50ihzPysbsB25Nq2XVDwq','C3vJy2vZCW','CMLKs3q','z2v0','BwvZC2fNzq','EMnzwgW','AgXxDKW','y29UzMLN','DLfLue8','CNLAuMK','y29TBwfUzf9Yzxn1Bhq','uunPAwi','AeHWvMm','EhfmCgW','yMTlze0','DM5OsNC','oefnBw5rzG','Dw5RBM93BIG','tw9RBwm','5yIB5BU65A6I5PYn5lYA6k+D5AsX6lsL','Avvyt0q','ywXSB3DLza','sNrXwKy','5yIB5BU65lYA6k+D5AsX6lsL','C2vUDfrPBwu','BgfZDfrPBwvZDgfTCa','D2fYBG','DM9JwMG','zMv0y2HhCM91Cfn0yxr1CW','zgvSzxrLu2vZC2LVBG','r0rvrvK','qNf2ANa','uLfYBKW','C2v0','A3j4y0G','y291BNq','y29UDMvYC2f0Aw9UvhLWzq','shHSy3K','C2vYDMLJzs0','AuDJzgW','mtG2mJu4mwjOCeT5Cq','B2vxAwK','t3PKu3y','rMfPBgvKihrVihnLBMqGzgv2AwnLihn0yxr1CYbLCNjVCIbYzxbVCNq','EfLwBeK','BvD1tgO','u0vsvKLdrv9trvntsu9ox0nsrufuruq','C2vZC2LVBL9Pza','revwsunfx0nptLrst0W','x3jLy29NBML6zvzVAwnL','CgfYC2u','yMjzB1i','B25SAw5L','t3bZignOyxqGBwvZC2fNzsbJB250zw50igLZigvTChr5','zvPev1C','r0XrvxG','vevdtfy','tvvyq2S','EKLyqNe','EK10uLO','5PYQ6l+q6kgm','u0vsvKLdrv9dsefux01fu1nbr0u','nJzrswj5uMG','BwvZC2fNzvvjza','zefjvwC','q2HHDcbTzxnZywDLignVBNrLBNqGAxmGzw1WDhK','sMLVrhK','C2vYDMvYvxjS','BxnNx3r5Cgu','Dg9tDhjPBMC','AgfUzgXLq29TBwfUza','rffusu4','rvD6r3a','ugvzwwK','t3bZigfZC2LZDgfUDcbYzxnWB25Kzwq','6l+q57U05yQP5OMl5Ase55cg5AsX6lsLoIa','rgvRzvK','AgfUzgXLq2HHDe1LC3nHz2u','C2vYDMLJzv9JAgf0x21LC3nHz2u','5PYQ55+L6zsz6k+V','vvbRBhq','y1jcEwi','r21uBeG','A01Tv0i','zgv2AwnLx2nVBNrYB2W','C3rHCNrZv2L0Aa','tKrVBLy','yNvZEq','uuTIuLC','qxbkrhu','C3rYAw5N','5A6I5PYn5lYA6k+Dia','twjivge','EhHRuK8','uw1Sq3G','AKvYu3K','u2TPChbPBMCGy29TBwfUzcb3AxrOigvTChr5ihnLCNzPy2uVywn0Aw9U','v09qEuC','y2HHDf9TzxnZywDL','r3jVDxaGCM91BMqGAw5JCMvTzw50zwq','AvjTBM8','uenhCNu','uw1Oyw4','CM5ouwW','svjgD0m','ELHwB0u','rMfPBgvKihrVihnLBMqGCMvHzcbYzwnLAxb0','zgf0yq','t3v1s1q','rwzlvKm','C2XPy2u','AgfUzgXLu2vYDMLJzunOyxrnzxnZywDL','576K6igk5BEY5PQc5ygC','C2vZC2LVBKLK','DxnLCKLKtgLZDa','u2vYDMLJzsbZzxnZAw9UignYzwf0zwqGD2L0Acb0yxjNzxrjza','wvHQt00','r1DNquO','BwvZC2fNzurPCMvJDgLVBG','AgfUzgXLrgv2AwnLu3rHDhvZuMvXDwvZDa','uhjVy2vZC2LUzYb2B2LJzsbTzxnZywDL','sePOAg8','AgfUzgXLt3bZq2HHDe1LC3nHz2u','s1fqBvu','tgDYuwC','yMnssfK','C05nre4','Ahr0Chm6lY9UzxDZCMfKyxiUzhjLyw1KDc5JBI9PBq','ioI9RIK','rgv2AwnLignOyxqGB3bZigfZC2LZDgfUDcbMywLSzwq','yxvWD0i','C2vUzfjLywrszwnLAxb0','x2HHBMrSzv9JBgf3x3n0B3a','uhjVy2vZC2LUzYbJCMvHDguGC2vYDMLJzsbZzxnZAw9U','vM9Py2uGCMvJB2DUAxrPB24GzMfPBgvK','z29SuKm','senHu0C','zgvSzxrL','zuLnsMG','sfPxwKW','qNfWC2e','CM9Uz0nSAwvUDa','t1btx0niqvrFuKvtue9ou0u','z3jVDxbF','s01mDfe','Bu9UChG','y3jLyxrLx29Wzw5JB2rLx3nLC3nPB24','x19ZExnFBM90Awz5x18','5PAW5lYA6k+D','sxzuA2O','y29TBwfUza','B3bLBMnVzgvqyxnZD29Yza','CMvTB3rLvxjS','Dg9Rzw4','vgv4De1LC3nHz2u','u2vYDMLJzsbWCM9TChrbC3LUyYbZzw50lcbZDhjLyw1PBMCGDMLHifntrq','AujlD0G','B3bLBMnSyxDtDg9WCgvK','DgHLBG','tM90ig1LBNrPB25LzcWGC2TPChbPBMCGz3jVDxaGy2HHDcbYzxbSEq','5Ase55cg5RAi5OgV5BYc5BI4','y1Ppwxu','uhnkzha','q29TBwfUzcbYzxn1BhqGChjVy2vZC2vK','AMzwD3m','ywn0Aw9U','t21qq3m','BM9KzuLK','sLH4rKW','AwrSzq','CMvQzwn0','zg9Wyuu','z3PmBeC','revmrvrfx09qru5dt0rfx1nfu1njt04','CMvZDgfYDa','yM1tCu4','ze1xtKK','vKPPu1y','CvzVEwe','C29hswW','uKm6vhH0txnN','s3H6q2i','q09ntufora','5yIB5BU6ie9Wzw5dB2rLios8MUIVNEwKSEI0Pq','uuzntw0','B3bLBMnVzgvvCMW','ze1iBuW','DgLTzxi','D0DMALK','r3jVDxaGCMvZDw1LzcbMCM9Tihn0B3bWzwqGC3rHDguSihjLC2v0DgLUzYbYB3vUzcbJB3vUDgvY','6k+T6z+Z6k+g5yIR57Ut5P6C5lI656M6','vhbequq','AfLgwve','r3jVDxaGy2HHDcbIBg9JA2vKigj5ihjVDw5KigXPBwL0ig9YihbHDxnL','CMvJB2DUAxPLvM9Py2u','v0f2z1u','u0zdt2O','C291CMnLsw1jza','6k+T6z+Z6k+g5yIR6k+35Rgc6lAf5PE2','DgfYz2v0swq','6k+T6z+Z6k+g5yIR5AsX6lsL','A2nvseK','qvLHs1a','rMPwDNm','v2rtzK4','CMvZB2X2zq','DM9Py2vvCMW','BuHeCLK','B3bZx2nOyxrFBwvZC2fNzq','v3bXAhC','zhvYyxrPB24','q0Hbvf9nrvntquDf','u1z1BNi','DxjS','A1PiDKG','EhP3y2q','tLPwBeq','revwsunfx1nuqvrvu19srvbpuLq','DeLxrLa','C3rHDhvZx21LC3nHz2u','x2HHBMrSzv9JBgf3x2DLDfn0yxr1CW','q1jfqvrfx09qru5dt0rfx1nfu1njt04','6k+T6z+Z5RAi5OgV6k+g5yIR5AsX6lsL77Ym6k+356In5zco6yEn6k+v5OIw5y+r6ycb5PAh5A2x5RAi5OgV','AfDpDe8','C3rHCNq','t2HztMG','r0fwA3u','DMjyufG','u2vYDMLJzsbZzxnZAw9UignYzwf0zwq','sw50zxjUywWGC2vYDMvYigvYCM9Y','C3PKDvO','r2XPDum','B2jQzwn0','uKm6sffwq01ZzW','rMfPBgvKihrVihnLBMqGDM9Py2uGCMvJB2DUAxrPB24GzxjYB3iGBwvZC2fNzq','CgvUzgLUz1jLCxvLC3rZ','vfjdqw8','sK5tq08','5y+r6ycb6k+T6z+Z6k+g5yIR6k+35Rgc5AsX6lsLoIa','sgfUzgXPBMCGy29TBwfUza','u2vYDMLJzsbJAgf0ig1LC3nHz2uGy29UDgvUDcbPCYbLBxb0Eq','nJq1ntbovKfpt0q','y21SCfq','Chvdq0e','swzfBKu','z1nNCgG','A2v5CW','BfPZwee','q29TBwfUzcbOyw5KBgvYigvYCM9Y','r1P3C1a','t3bZlq','yuX2sfK','sLfOswq','BwvUDgLVBMvKx2LUzM8','l3n0yxr1CW','rgvgEge','BLzOvLq','D0XZzxG','q1f2ufq','y3jLyxrLu2vZC2LVBG','tNb2wKq','5BEY6l6+5yIW5PYS6l2U5A+56k+D5lIk6zMqicG','EfvqrxC','CwfLy04','wg9sDNa','mtmYotKXvNrQqMTk','CgTRAuG','twvZC2fNzsbYzwnLAxzLzcbKzxrHAwXZ','A2fVA0W','rgv2AwnLignOyxqGCMvWBhKGC2vUDcbHCYbdsefux01fu1nbr0u','C291CMnLx2LTx2LK','u2TPCcbYzwfKihjLy2vPChq6igLUDMfSAwqGBwvZC2fNzvvjzcbVCIbZzw50vgLTzq','Ew5ZtxK','CMvXDwvZDeLK','quXLwxq','rgv2AwnLignOyxqGzgv0zwn0zwqSihjVDxrPBMCGDg8GB3bZigfZC2LZDgfUDa','q1jfqvrfx1nfuLzjq0vFu0vtu0LptG','vur3Ahe','vw5RBM93BIbTzxnZywDLihr5Cgu','vM9Py2uGBwvZC2fNzsbTAxnZAw5NihjLBw90zvvYBa','uMrwzKe','vwfWEwq','u0vsvKLdrv9dsefux1jfu1bptLnf','mJy4nZyXnLnxDfz0yq','tg9NAw4GC3vJy2vZC2z1Ba','DeDQwM0','C3vhyxa','z3jVDxbsB3vUzenVDw50zxjZ','whrRq00','q29TBwfUzcbYzxn1BhqGBwLZC2LUzYbYzxf1zxn0swq','EwPIEwu','AgfUzgXLrgv2AwnLq29UDhjVBa','l2fWAs9NCM91Cc8','BwvZC2fNzvr5Cgu','y29UzMLNx2zPEa','EunOzuO','x3jHD19JB250zw50','zuLHyue','uhjVy2vZC2LUzYbKzxzPy2uGy29UDhjVBa','x2HHBMrSzv8','zMXVB3i','y21K','q0TNzM0','B3bZ','ywnJB3vUDeLK','t3LdrLa','CM9VBv9Pza','y2f0y2G','5A6I5PYn5lYA6k+D5yIB5BU65OIq5yQF','t1btx0niqvrFtuvtu0fhrq','uhjVy2vZC2LUzYbJAgf0ig1LC3nHz2u','CM96wue','uKm6vKnnC2C','rhvWBgLJyxrLig1LC3nHz2uGzMLSDgvYzwq','zxPty2i','5RAi5OgV5Ase55cg5AsX6lsL77Ym6k+356In5zco6yEn6k+v','revwsunfx1nuqvrvu19srvfvrvnu','B3bLBMnSyxDnyxHsB3vUzhm','C2vUzfrVvxnLCG','q2XHD01LC3nLBMDLCIa','AvDAEgS','z3Pky1K','EeLet2C','DMvuvva','Aw5JBhvKzxm','CMfUzg9T','DgL0Bgu','BNDItuG','zwHNvwy','zgvKDxa','DxnLCL9Pza','x2HHBMrSzv9JBgf3x3n0yxj0','zNvUy3rPB24','v2Xjq1K','z3jVDxbtDgf0Dxnmyxn0rMv0y2G','vM9Py2uGCMvJB2DUAxPLzcbZDwnJzxnZzNvSBhK','AgfUzgXLq3jLyxrLu2vYDMLJzvnLC3nPB24','t1roCu4','C3rYAw5NAwz5','57Y65BcrihrHCMDLDeLKioAiLIbJB250zw50','5Ase55cg5AsX6lsL77Ym6k+356In5zco6yEn6k+v','uKm6uMvHze50zG','CwnXy04','tg1zDK4','vw5RBM93BIbZzxj2AwnLl2fJDgLVBJOG','yLrQAKy','AuPTBg0','q3jLyxrLzcbVChmGC2vZC2LVBIbMB3iGzgv2AwnLignOyxq','q1PXs2O','t1bftKnprevFu0vtu0LptL9duKvbveve','twzTzg4','zMrHzLy','v1burxC','B3bZt3bLBMnVzgu','zgv2AwnLx3n0yxr1C19Yzxf1zxn0','A0j0ugK','Aufru1y','vw9hEei','x2HHBMrSzv9ZExn0zw1Fz2v0q29UzMLN','wxfSA1e','ueXYtNq','tgDpyKy','C2vUzfrVvxnLCJOG57Y65BcrihrHCMDLDeLKioAiLIbJB250zw50','Bg9ht2i','AeXPtwy','zxjYB3i','AwPNy1a','BfzYtw0','revwsunfx0nptLrst0XFuKvtvuXu','sLbiCKe','B2zMBgLUzq','zuHjEfO','C3rHDhvZ','DuPVwNK','zKvNCxm','AKPYBuu','AfnWtM8','D3r3vLG','AgfUzgXLrgv2AwnLq2HHDa','AgfUzgXLvM9Py2vnzxnZywDL','BNf1reS','BvjxsNy','yxDoyw8','nJi3nJbvu2nzrha','wxrit0i','AgfUzgXLq3jLyxrLt3bLBMnVzgvtzxnZAw9U','r3f6Dvu','q09ntuforf9srvnvtfq','zMv0y2HhCM91Cfn0yxr1CYbMywLSzwq','Bgzitg4','r2XozMm','DwHKAg4','5Ase55cg6igk5AsP5RAi5OgV5AsX6lsL','v2rvseu','BM93','Dgnewei','ChjVBxb0qxn5BMmGC2vUDcWGC3rYzwfTAw5NihzPysbtu0u','tKHHwuy','q3jLyxrLzcbVChmGC2vZC2LVBG','v09Mr1u','B3bLBMnVzgu','twvUDgLVBIbJAgvJAYbYzxn1Bhq','tM9KzsbZDgfYDgvK','Dgv4Da','CePOt1K','qMP3wfO','tvPoBMC','CMvZDwX0','iow3SUAoPEAuTG','CeDWsKi','Awr2wK0','y2zuAgO','mJf5EeTiuxG','t3bLBKnVzguGC3rHDhvZignOzwnRihjLC3vSDa','DxnLCKLK','AxLjAMi'];a0_0xa344=function(){return _0x556a99;};return a0_0xa344();}import{OpenCodeClient,checkOpencodeStatus}from'../opencode/client.js';import{createLogger}from'./logger.js';import a0_0x322150 from'axios';const log=createLogger('MessageHandler'),ROUND_COOLDOWN_MS=0x7530,GROUP_STATE_CACHE_TTL_MS=0x7530;function a0_0x482b(_0x401618,_0x4797ff){_0x401618=_0x401618-0x17e;const _0xa344fa=a0_0xa344();let _0x482b69=_0xa344fa[_0x401618];if(a0_0x482b['MMejLN']===undefined){var _0x5a72d3=function(_0x41c9cb){const _0x5ef912='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x16e39d='',_0xbd03d8='';for(let _0x3e0a1b=0x0,_0x7159ec,_0x2c5e41,_0x613094=0x0;_0x2c5e41=_0x41c9cb['charAt'](_0x613094++);~_0x2c5e41&&(_0x7159ec=_0x3e0a1b%0x4?_0x7159ec*0x40+_0x2c5e41:_0x2c5e41,_0x3e0a1b++%0x4)?_0x16e39d+=String['fromCharCode'](0xff&_0x7159ec>>(-0x2*_0x3e0a1b&0x6)):0x0){_0x2c5e41=_0x5ef912['indexOf'](_0x2c5e41);}for(let _0x18658f=0x0,_0x2b9d99=_0x16e39d['length'];_0x18658f<_0x2b9d99;_0x18658f++){_0xbd03d8+='%'+('00'+_0x16e39d['charCodeAt'](_0x18658f)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xbd03d8);};a0_0x482b['aknFaf']=_0x5a72d3,a0_0x482b['FdqIhD']={},a0_0x482b['MMejLN']=!![];}const _0x4ef81a=_0xa344fa[0x0],_0x5860b1=_0x401618+_0x4ef81a,_0x4dffbf=a0_0x482b['FdqIhD'][_0x5860b1];return!_0x4dffbf?(_0x482b69=a0_0x482b['aknFaf'](_0x482b69),a0_0x482b['FdqIhD'][_0x5860b1]=_0x482b69):_0x482b69=_0x4dffbf,_0x482b69;}export class MessageHandler{constructor(_0x40490d,_0x5496e0,_0x5675cf,_0x5e48e0){const _0x50e0f0=a0_0x482b;this[_0x50e0f0(0x283)]=new Map(),this[_0x50e0f0(0x30c)]=new Map(),this[_0x50e0f0(0x309)]=new Map(),this[_0x50e0f0(0x2b2)]=0x0,this[_0x50e0f0(0x36f)]=_0x40490d,this['sessionManager']=_0x5496e0,this[_0x50e0f0(0x1f1)]=_0x5675cf,this[_0x50e0f0(0x2f4)]=_0x5e48e0;const _0x17e61e=process.env.CLAW_OPS_OPENCODE_DIR||process['cwd']();this[_0x50e0f0(0x2c5)]=new OpenCodeClient({'baseUrl':_0x50e0f0(0x324),'directory':_0x17e61e}),this[_0x50e0f0(0x2ad)]=new MessageDeduplicator(),this[_0x50e0f0(0x24f)]=new Map();}async[a0_0x44204b(0x180)](_0x18f1d5){const _0x21b152=a0_0x44204b,_0x100527={'TpDAD':function(_0x397cbf,_0x1fcd81){return _0x397cbf===_0x1fcd81;}};try{const _0x2dc286=this[_0x21b152(0x36f)][_0x21b152(0x1a7)]||process.env.DM_SERVER_URL||_0x21b152(0x1e3),_0x5b177d=_0x2dc286+_0x21b152(0x288)+_0x18f1d5+_0x21b152(0x262),_0xa63c8f=await a0_0x322150[_0x21b152(0x36b)](_0x5b177d,{'timeout':0x1388});if(_0x100527[_0x21b152(0x223)](_0xa63c8f[_0x21b152(0x1cf)]?.['code'],0xc8)&&_0xa63c8f[_0x21b152(0x1cf)]?.[_0x21b152(0x1cf)])return{'openclawStopped':_0xa63c8f[_0x21b152(0x1cf)][_0x21b152(0x1cf)][_0x21b152(0x201)]??![],'openclawMaxRounds':_0xa63c8f[_0x21b152(0x1cf)][_0x21b152(0x1cf)][_0x21b152(0x2a1)]??0xa};return null;}catch(_0x481366){return log[_0x21b152(0x17e)]({'groupId':_0x18f1d5,'err':_0x481366['message']},'fetchGroupStatus\x20failed'),null;}}async[a0_0x44204b(0x35a)](_0x5d7a07){const _0x3fe655=a0_0x44204b,_0x2cc161={'nVhVT':'语音识别结果为空','WOPyG':function(_0x2289b5,_0x41ef51){return _0x2289b5(_0x41ef51);},'iRmno':_0x3fe655(0x22a),'mRWJv':function(_0x468b6b,_0x523568){return _0x468b6b>_0x523568;},'rutmY':function(_0x82570b,_0x1c27fe){return _0x82570b===_0x1c27fe;},'kiirv':_0x3fe655(0x1ba),'suGap':_0x3fe655(0x2cc),'yCheJ':_0x3fe655(0x1d4),'GmTlH':function(_0x374cb8,_0x4429a5){return _0x374cb8!==_0x4429a5;},'wtwVX':_0x3fe655(0x1e0),'XPkHD':function(_0x29bb11,_0x8e6cf3){return _0x29bb11-_0x8e6cf3;},'Uapyd':_0x3fe655(0x1cb),'OhYNh':function(_0x5d45ea,_0x301aa3){return _0x5d45ea>=_0x301aa3;}};let _0x49825b=this[_0x3fe655(0x30c)][_0x3fe655(0x36b)](_0x5d7a07);const _0x3ae6d7=Date[_0x3fe655(0x2ee)]();if(!_0x49825b||_0x2cc161[_0x3fe655(0x2e1)](_0x3ae6d7-this['groupStatusLastFetch'],GROUP_STATE_CACHE_TTL_MS)){const _0x19975e=await this[_0x3fe655(0x180)](_0x5d7a07);_0x19975e&&(_0x49825b=_0x19975e,this[_0x3fe655(0x30c)][_0x3fe655(0x185)](_0x5d7a07,_0x49825b),this[_0x3fe655(0x2b2)]=_0x3ae6d7);}if(!_0x49825b){if(_0x2cc161[_0x3fe655(0x31b)](_0x2cc161['kiirv'],_0x3fe655(0x19c)))_0x3696bf[_0x3fe655(0x187)]=0x0;else return{'allowed':!![]};}const _0x133863=this['groupStoppedPrev']['get'](_0x5d7a07);_0x133863===!![]&&_0x49825b[_0x3fe655(0x201)]===![]&&(log[_0x3fe655(0x365)]({'groupId':_0x5d7a07},_0x3fe655(0x221)),this[_0x3fe655(0x283)][_0x3fe655(0x185)](_0x5d7a07,{'count':0x0,'lastTimestamp':0x0}));this['groupStoppedPrev'][_0x3fe655(0x185)](_0x5d7a07,_0x49825b[_0x3fe655(0x201)]);if(_0x49825b[_0x3fe655(0x201)]){if(_0x2cc161[_0x3fe655(0x282)]!==_0x2cc161[_0x3fe655(0x282)])throw new _0x2538d1(_0x2cc161[_0x3fe655(0x264)]);else return{'allowed':![],'reason':_0x2cc161[_0x3fe655(0x28b)]};}let _0xc35cf=this[_0x3fe655(0x283)][_0x3fe655(0x36b)](_0x5d7a07);!_0xc35cf&&(_0x2cc161[_0x3fe655(0x1b6)](_0x2cc161[_0x3fe655(0x2dd)],_0x2cc161[_0x3fe655(0x2dd)])?(this[_0x3fe655(0x24f)][_0x3fe655(0x1ed)](_0x3a0c84),_0x2cc161[_0x3fe655(0x1c5)](_0x20b34e,new _0x27266e(_0x2cc161[_0x3fe655(0x1c8)]))):(_0xc35cf={'count':0x0,'lastTimestamp':0x0},this['groupRoundCounters'][_0x3fe655(0x185)](_0x5d7a07,_0xc35cf)));if(_0x2cc161[_0x3fe655(0x2e1)](_0x2cc161['XPkHD'](_0x3ae6d7,_0xc35cf[_0x3fe655(0x381)]),ROUND_COOLDOWN_MS)){if(_0x2cc161['rutmY'](_0x2cc161[_0x3fe655(0x27d)],_0x3fe655(0x34d))){_0x1cf8d2[_0x3fe655(0x358)]({'messageUId':_0x138f1d['messageUId'],'senderUserId':_0x5631a8[_0x3fe655(0x353)]},_0x3fe655(0x31d));return;}else _0xc35cf['count']=0x0;}if(_0x2cc161[_0x3fe655(0x245)](_0xc35cf['count'],_0x49825b['openclawMaxRounds']))return{'allowed':![],'reason':_0x3fe655(0x269)+_0x49825b['openclawMaxRounds']+_0x3fe655(0x1e4)};return{'allowed':!![]};}['incrementGroupRound'](_0xb7b6ca){const _0x36b011=a0_0x44204b,_0x10645a={'pkkiH':function(_0x409282,_0x12776b){return _0x409282===_0x12776b;},'zMtRZ':_0x36b011(0x1ad)};let _0x42832b=this['groupRoundCounters'][_0x36b011(0x36b)](_0xb7b6ca);if(!_0x42832b){if(_0x10645a[_0x36b011(0x26e)](_0x10645a[_0x36b011(0x19f)],_0x36b011(0x1ad)))_0x42832b={'count':0x0,'lastTimestamp':0x0},this[_0x36b011(0x283)][_0x36b011(0x185)](_0xb7b6ca,_0x42832b);else{const _0x46cee5=_0x55b526[_0x36b011(0x196)](_0x5588c6[_0x36b011(0x31c)]);_0x255f0c=_0x46cee5[_0x36b011(0x356)]||_0x46cee5['mentioned_info'];}}_0x42832b[_0x36b011(0x187)]+=0x1,_0x42832b[_0x36b011(0x381)]=Date[_0x36b011(0x2ee)](),log[_0x36b011(0x365)]({'groupId':_0xb7b6ca,'count':_0x42832b['count']},'Group\x20round\x20incremented');}async[a0_0x44204b(0x2a2)](_0xb21b0,_0x5f074a,_0x6a4d64={}){const _0x5c3d77=a0_0x44204b,_0x291a9a={'yJubP':_0x5c3d77(0x312),'QCiib':'Group\x20resumed\x20from\x20stopped\x20state,\x20resetting\x20round\x20counter','cejOI':function(_0x5e97e5,_0x2c0660){return _0x5e97e5!==_0x2c0660;},'kZHvH':'pczZg','JtqZF':_0x5c3d77(0x2ce),'awNao':_0x5c3d77(0x2b7),'hgANZ':function(_0x317c2b,_0x21c896){return _0x317c2b>_0x21c896;},'uJoZy':function(_0x598e7f,_0x35772e){return _0x598e7f!==_0x35772e;},'Xiydg':'MJEwW','tIWFP':function(_0x537bba,_0x26c068){return _0x537bba===_0x26c068;},'puCCA':_0x5c3d77(0x2c9),'GliuC':'sendToUser:\x20消息发送成功'},{conversationType:conversationType=0x1,extra:_0x60e135}=_0x6a4d64;if(!_0xb21b0||!_0x5f074a)return _0x291a9a['cejOI'](_0x291a9a[_0x5c3d77(0x23a)],_0x291a9a[_0x5c3d77(0x23a)])?(_0x2380e8[_0x5c3d77(0x2d1)]({'err':_0x4b607d,'targetId':_0x2c9b0e,'conversationType':_0x1ba067},_0x291a9a[_0x5c3d77(0x31f)]),{'success':![],'error':_0x3c9fd1[_0x5c3d77(0x36c)]||_0x4952d5(_0x28dc41)}):(log[_0x5c3d77(0x17e)]({'targetId':_0xb21b0,'hasContent':!!_0x5f074a},_0x291a9a[_0x5c3d77(0x37e)]),{'success':![],'error':_0x291a9a[_0x5c3d77(0x2e2)]});try{let _0x35a4d4;return _0x60e135&&_0x291a9a['hgANZ'](Object[_0x5c3d77(0x25a)](_0x60e135)[_0x5c3d77(0x326)],0x0)?_0x291a9a[_0x5c3d77(0x2d9)](_0x291a9a['Xiydg'],'bEeAj')?_0x35a4d4=JSON[_0x5c3d77(0x2b6)]({'content':_0x5f074a,..._0x60e135}):_0x535666=_0x2d940c[_0x5c3d77(0x31c)]:_0x291a9a[_0x5c3d77(0x23e)](_0x291a9a[_0x5c3d77(0x257)],_0x5c3d77(0x2c9))?_0x35a4d4=_0x5f074a:(_0x5e1c37['info']({'groupId':_0x52dcd3},kQVLhC[_0x5c3d77(0x373)]),this[_0x5c3d77(0x283)]['set'](_0x104acf,{'count':0x0,'lastTimestamp':0x0})),await this['rongClient'][_0x5c3d77(0x355)](_0xb21b0,_0x35a4d4,conversationType),log[_0x5c3d77(0x365)]({'targetId':_0xb21b0,'conversationType':conversationType,'contentPreview':_0x5f074a[_0x5c3d77(0x333)](0x0,0x64)},_0x291a9a[_0x5c3d77(0x24b)]),{'success':!![]};}catch(_0x28c6be){return log[_0x5c3d77(0x2d1)]({'err':_0x28c6be,'targetId':_0xb21b0,'conversationType':conversationType},_0x291a9a[_0x5c3d77(0x31f)]),{'success':![],'error':_0x28c6be[_0x5c3d77(0x36c)]||String(_0x28c6be)};}}async['handleMessage'](_0x225545){const _0x261113=a0_0x44204b,_0x6c71a9={'hSpNo':_0x261113(0x24e),'xUPEw':_0x261113(0x25c),'LmYvN':_0x261113(0x249),'BBNil':_0x261113(0x2d1),'yCUmP':function(_0x2864bf,_0x2b9587){return _0x2864bf===_0x2b9587;},'sRoLo':_0x261113(0x371),'tcDXB':'Read\x20receipt\x20notification\x20ignored','szduZ':function(_0x2b7c2c,_0x5b1458){return _0x2b7c2c!==_0x5b1458;},'NpvZD':'wWmYp','kcUHI':'Duplicate\x20message\x20filtered','jJrmE':_0x261113(0x2ab),'ridKt':_0x261113(0x228),'nquDK':function(_0x3250b1,_0x378642){return _0x3250b1===_0x378642;},'rozYA':_0x261113(0x24c),'jErSy':function(_0xa9dfcf,_0x2c5449){return _0xa9dfcf===_0x2c5449;},'gYufs':'Gwqlw','jfVWh':_0x261113(0x317),'GWgAJ':function(_0x9727d,_0x3415f1){return _0x9727d===_0x3415f1;},'FjVvs':function(_0x100316,_0xad846f){return _0x100316===_0xad846f;},'xhXgk':_0x261113(0x30a),'iWZxk':_0x261113(0x26f),'iAQSV':_0x261113(0x1f6),'xxkRO':_0x261113(0x218),'MUXCk':_0x261113(0x1fe),'dMWNI':_0x261113(0x1c6),'YqlkQ':_0x261113(0x2c6),'wLsex':'create_service_session','OyCFP':_0x261113(0x1b2),'PCGru':_0x261113(0x29c),'pcoUu':'delete_opencode_session','qKSqi':_0x261113(0x372),'xzwcd':_0x261113(0x27a),'JPHrA':'oOHPZ','ALeYt':'yYGcc','AYaKP':_0x261113(0x204),'golRC':function(_0x119a59,_0x245821){return _0x119a59===_0x245821;},'HCaSG':_0x261113(0x2b8)};try{if(_0x6c71a9[_0x261113(0x357)](_0x225545[_0x261113(0x289)],_0x261113(0x2b9))){if(_0x6c71a9['yCUmP'](_0x6c71a9[_0x261113(0x320)],_0x261113(0x235)))_0x5bf5f1=_0x2c0376['stringify']({'content':_0x21d841,..._0x41d018});else{log[_0x261113(0x358)]({'messageUId':_0x225545[_0x261113(0x1a3)],'senderUserId':_0x225545[_0x261113(0x353)]},_0x6c71a9[_0x261113(0x2ef)]);return;}}if(_0x225545[_0x261113(0x1a3)]&&this[_0x261113(0x2ad)]['isDuplicate'](_0x225545['messageUId'])){if(_0x6c71a9[_0x261113(0x24a)](_0x261113(0x1a6),_0x6c71a9[_0x261113(0x268)])){log[_0x261113(0x358)]({'messageUId':_0x225545[_0x261113(0x1a3)]},_0x6c71a9[_0x261113(0x22d)]);return;}else return{'allowed':![],'reason':_0x261113(0x269)+_0x25ba82['openclawMaxRounds']+_0x261113(0x1e4)};}this[_0x261113(0x1e7)](_0x225545);let _0x406dd5;if(typeof _0x225545[_0x261113(0x31c)]===_0x261113(0x1be))try{_0x6c71a9[_0x261113(0x24a)](_0x6c71a9[_0x261113(0x2db)],_0x6c71a9[_0x261113(0x36a)])?_0x406dd5=JSON[_0x261113(0x196)](_0x225545['content']):_0x123430['error']({'sendErr':_0x483667},_0x6c71a9[_0x261113(0x2dc)]);}catch{_0x406dd5={'content':_0x225545['content']};}else{if(_0x225545[_0x261113(0x31c)]&&_0x6c71a9[_0x261113(0x2e0)](typeof _0x225545[_0x261113(0x31c)],_0x6c71a9[_0x261113(0x29b)])){if(_0x6c71a9[_0x261113(0x1c3)](_0x6c71a9[_0x261113(0x313)],_0x6c71a9[_0x261113(0x313)]))_0x406dd5=_0x225545[_0x261113(0x31c)];else{_0x5e796d[_0x261113(0x17e)]({'requestId':_0x501ab1},'No\x20pending\x20request\x20found\x20for\x20command\x20result');return;}}else return;}let _0x1f8d89={};if(_0x406dd5[_0x261113(0x31c)]&&_0x6c71a9['yCUmP'](typeof _0x406dd5[_0x261113(0x31c)],_0x261113(0x1be))){if(_0x261113(0x317)===_0x6c71a9[_0x261113(0x360)])try{_0x1f8d89=JSON['parse'](_0x406dd5['content']);}catch{_0x1f8d89={'content':_0x406dd5[_0x261113(0x31c)]};}else _0x21060d[_0x261113(0x2d1)]({'err':_0x16c388,'handlerName':_0x167bd6},_0x6c71a9[_0x261113(0x26a)]),_0x1813b1={'code':0x1f4,'message':_0x1aa967[_0x261113(0x36c)]||_0x6c71a9[_0x261113(0x2bb)],'status':_0x6c71a9[_0x261113(0x33d)]};}const _0x47817e=_0x406dd5['msg_type']||_0x1f8d89[_0x261113(0x1a8)],_0x4f2fd9=_0x406dd5[_0x261113(0x272)]||_0x406dd5[_0x261113(0x229)]||_0x225545[_0x261113(0x353)],_0x4116db=_0x406dd5[_0x261113(0x338)]||_0x406dd5[_0x261113(0x336)]||_0x225545[_0x261113(0x22b)],_0x1003f5=_0x406dd5[_0x261113(0x33c)]||_0x406dd5[_0x261113(0x275)],_0x1ec95d={..._0x406dd5,..._0x1f8d89,'request_id':_0x1003f5,'source_im_id':_0x4f2fd9,'destination_im_id':_0x4116db};if(_0x6c71a9[_0x261113(0x1d9)](_0x406dd5[_0x261113(0x1f7)],!![])||_0x6c71a9[_0x261113(0x22f)](_0x1f8d89[_0x261113(0x1f7)],!![])){log[_0x261113(0x358)]({'messageType':_0x225545['messageType'],'text':_0x406dd5[_0x261113(0x2f7)]||_0x1f8d89['text']},_0x6c71a9['xhXgk']);return;}log['info']({'messageType':_0x225545[_0x261113(0x289)],'customMsgType':_0x47817e,'senderUserId':_0x225545[_0x261113(0x353)],'targetId':_0x225545['targetId'],'contentKeys':Object[_0x261113(0x25a)](_0x406dd5),'hasMsgType':!!_0x406dd5[_0x261113(0x1a8)],'msgContentPreview':JSON[_0x261113(0x2b6)](_0x406dd5)[_0x261113(0x333)](0x0,0xc8)},_0x6c71a9[_0x261113(0x2a4)]);switch(_0x47817e||_0x225545[_0x261113(0x289)]){case RongyunMessageTypeEnum[_0x261113(0x241)]:case _0x6c71a9[_0x261113(0x2c8)]:await this['handleCreateOpencodeSession'](_0x1ec95d,_0x225545);return;case _0x6c71a9[_0x261113(0x1c1)]:case _0x6c71a9[_0x261113(0x19d)]:await this['handleChatMessage'](_0x1ec95d,_0x225545,_0x47817e);return;case RongyunMessageTypeEnum['CHAT_MESSAGE']:case _0x6c71a9[_0x261113(0x214)]:await this[_0x261113(0x1b1)](_0x1ec95d,_0x225545,_0x47817e);return;case RongyunMessageTypeEnum[_0x261113(0x2a0)]:case _0x6c71a9[_0x261113(0x2cb)]:await this[_0x261113(0x1db)](_0x1ec95d,_0x225545);return;case RongyunMessageTypeEnum[_0x261113(0x194)]:case _0x261113(0x1b8):await this[_0x261113(0x287)](_0x1ec95d,_0x225545);return;case _0x261113(0x1fa):await this[_0x261113(0x1aa)](_0x1ec95d,_0x225545);return;case RongyunMessageTypeEnum[_0x261113(0x299)]:case _0x261113(0x234):await this[_0x261113(0x1de)](_0x1ec95d,_0x225545);return;case RongyunMessageTypeEnum[_0x261113(0x278)]:case _0x6c71a9[_0x261113(0x265)]:await this['handleCreateServiceSession'](_0x1ec95d,_0x225545);return;case RongyunMessageTypeEnum[_0x261113(0x1a1)]:case _0x6c71a9[_0x261113(0x295)]:await this[_0x261113(0x1d3)](_0x1ec95d,_0x225545);return;case _0x261113(0x24d):case _0x6c71a9[_0x261113(0x1c9)]:await this['handleVoiceMessage'](_0x1ec95d,_0x225545);return;case RongyunMessageTypeEnum[_0x261113(0x211)]:case _0x6c71a9['pcoUu']:_0x1ec95d[_0x261113(0x193)]&&(this['sessionManager'][_0x261113(0x181)](_0x1ec95d[_0x261113(0x193)]),await this['opencode'][_0x261113(0x181)](_0x1ec95d[_0x261113(0x193)]));return;case RongyunMessageTypeEnum[_0x261113(0x2e7)]:case _0x6c71a9['qKSqi']:this['handleCommandResult'](_0x1ec95d,_0x225545);return;default:log[_0x261113(0x17e)]({'messageType':_0x225545[_0x261113(0x289)],'customMsgType':_0x47817e},_0x6c71a9[_0x261113(0x23b)]);}}catch(_0x3201cb){if(_0x6c71a9[_0x261113(0x24a)](_0x6c71a9[_0x261113(0x2d5)],_0x6c71a9[_0x261113(0x276)])){log[_0x261113(0x2d1)]({'err':_0x3201cb},_0x6c71a9[_0x261113(0x22e)]);try{const _0x29dbaf=_0x6c71a9[_0x261113(0x1eb)](_0x225545[_0x261113(0x188)],0x3)?_0x225545['targetId']:_0x225545[_0x261113(0x353)];if(_0x29dbaf&&_0x6c71a9[_0x261113(0x24a)](_0x29dbaf,_0x261113(0x340))){const _0x5d7f44=JSON[_0x261113(0x2b6)]({'content':_0x6c71a9[_0x261113(0x1ec)],'extra':JSON[_0x261113(0x2b6)]({'from_node':this['config'][_0x261113(0x294)],'is_ai':!![]})});await this['rongClient'][_0x261113(0x355)](_0x29dbaf,_0x5d7f44,_0x225545[_0x261113(0x188)]);}}catch{}}else _0xa09927=_0x7e9c03;}}['sendReadReceipt'](_0x3c5036){const _0x5887b6=a0_0x44204b,_0x426d02={'GDUEY':_0x5887b6(0x1ce),'cfThj':function(_0x37c297,_0x2cd026){return _0x37c297===_0x2cd026;},'EgLsD':function(_0x53ba70,_0x53b4b5){return _0x53ba70!==_0x53b4b5;},'qcqcN':_0x5887b6(0x258),'oLTtw':_0x5887b6(0x273),'GLQUx':function(_0x10b323,_0xb04b01){return _0x10b323(_0xb04b01);},'VlxkF':_0x5887b6(0x352),'NHaYF':_0x5887b6(0x318)};if(_0x426d02[_0x5887b6(0x2ff)](_0x3c5036[_0x5887b6(0x1da)],0x1)){if(_0x426d02[_0x5887b6(0x345)](_0x5887b6(0x21e),_0x426d02[_0x5887b6(0x2ba)]))return;else{_0x249db4[_0x5887b6(0x358)]({'messageUId':_0x6603b6[_0x5887b6(0x1a3)]},_0x5887b6(0x29d));return;}}if(!_0x3c5036['messageUId']||!_0x3c5036[_0x5887b6(0x380)]){log['debug']({'messageUId':_0x3c5036[_0x5887b6(0x1a3)],'sentTime':_0x3c5036['sentTime']},_0x426d02['oLTtw']);return;}if(_0x426d02[_0x5887b6(0x19b)](String,_0x3c5036[_0x5887b6(0x1a3)])[_0x5887b6(0x1b9)](_0x426d02[_0x5887b6(0x321)])){log[_0x5887b6(0x358)]({'messageUId':_0x3c5036[_0x5887b6(0x1a3)]},_0x426d02[_0x5887b6(0x2f1)]);return;}this[_0x5887b6(0x1f1)][_0x5887b6(0x1e7)](_0x3c5036)[_0x5887b6(0x297)](_0x2e224a=>{const _0x189f1c=_0x5887b6;log[_0x189f1c(0x17e)]({'err':_0x2e224a,'messageUId':_0x3c5036[_0x189f1c(0x1a3)]},_0x426d02[_0x189f1c(0x182)]);});}async['handleChatMessage'](_0xd9ec3d,_0x2e40fd,_0x121872){const _0x53e428=a0_0x44204b,_0x30d97f={'tQBRI':_0x53e428(0x18f),'Ghtzb':function(_0x1b8556,_0x298343){return _0x1b8556===_0x298343;},'QFMMm':function(_0x376f53,_0x452186){return _0x376f53===_0x452186;},'oMxQH':_0x53e428(0x1be),'idvZM':function(_0x5e6835,_0x5ae03c){return _0x5e6835!==_0x5ae03c;},'aupwB':_0x53e428(0x330),'vocZh':function(_0x23136d,_0xcc9178){return _0x23136d===_0xcc9178;},'JrcEm':_0x53e428(0x1f4),'fOvLR':_0x53e428(0x327),'iJmlm':_0x53e428(0x1a5),'YjIGt':function(_0x1f8fa8,_0x19d0c0){return _0x1f8fa8===_0x19d0c0;},'lZsXA':_0x53e428(0x24c),'cRByb':function(_0x4960a0,_0x9a4393){return _0x4960a0||_0x9a4393;},'iyIjb':_0x53e428(0x346),'Qmhan':_0x53e428(0x203),'cmlpT':'mYwBC','ezScb':_0x53e428(0x1bb),'gJwAX':_0x53e428(0x1c6),'aCTsT':function(_0xee3231,_0x24f9ef){return _0xee3231===_0x24f9ef;},'hlWvL':_0x53e428(0x2f0),'DeFxa':_0x53e428(0x2ec),'TPVZE':_0x53e428(0x20d),'Yendz':_0x53e428(0x29f)},_0x335e3b=_0x30d97f[_0x53e428(0x31e)](_0x2e40fd[_0x53e428(0x188)],0x3),_0x34f189=_0x335e3b?_0x53e428(0x1f3)+_0x2e40fd['targetId']:'claw-'+_0x2e40fd[_0x53e428(0x353)],_0x475d10=_0xd9ec3d?.[_0x53e428(0x193)]||_0x34f189;if(_0x30d97f[_0x53e428(0x21c)](_0x2e40fd[_0x53e428(0x353)],this[_0x53e428(0x36f)][_0x53e428(0x294)])){log[_0x53e428(0x358)]({'chatId':_0x34f189,'sessionId':_0x475d10},_0x53e428(0x323));return;}let _0x5b385c='';if(_0xd9ec3d?.[_0x53e428(0x31c)])_0x5b385c=typeof _0xd9ec3d['content']===_0x30d97f[_0x53e428(0x325)]?_0xd9ec3d['content']:_0xd9ec3d[_0x53e428(0x31c)][_0x53e428(0x31c)]||JSON[_0x53e428(0x2b6)](_0xd9ec3d[_0x53e428(0x31c)]);else{if(_0xd9ec3d?.['_raw_content']){if(_0x30d97f[_0x53e428(0x2fe)](_0x30d97f[_0x53e428(0x1e6)],_0x53e428(0x330)))return{'openclawStopped':_0x58c487[_0x53e428(0x1cf)][_0x53e428(0x1cf)][_0x53e428(0x201)]??![],'openclawMaxRounds':_0x1d0ce5[_0x53e428(0x1cf)][_0x53e428(0x1cf)][_0x53e428(0x2a1)]??0xa};else _0x5b385c=_0x30d97f['Ghtzb'](typeof _0xd9ec3d['_raw_content'],_0x53e428(0x1be))?_0xd9ec3d[_0x53e428(0x28c)]:JSON[_0x53e428(0x2b6)](_0xd9ec3d[_0x53e428(0x28c)]);}}if(!_0x5b385c){if(_0x30d97f[_0x53e428(0x17f)](_0x30d97f['JrcEm'],_0x30d97f[_0x53e428(0x349)]))_0x51727c[_0x53e428(0x2d1)]({'sendErr':_0x1e1b09},_0x30d97f[_0x53e428(0x316)]);else{log[_0x53e428(0x17e)](_0x30d97f[_0x53e428(0x2be)]);return;}}const _0x1aae69=!!_0xd9ec3d?.[_0x53e428(0x296)];if(_0x1aae69){log['info']({'sessionId':_0x475d10,'roomId':_0xd9ec3d['room_id']},_0x53e428(0x277)),await this[_0x53e428(0x2de)](_0xd9ec3d,_0x2e40fd,_0x5b385c);return;}if(_0x335e3b){let _0x2e2b5f;if(_0x2e40fd[_0x53e428(0x31c)]&&_0x30d97f['YjIGt'](typeof _0x2e40fd['content'],_0x30d97f[_0x53e428(0x25b)]))_0x2e2b5f=_0x2e40fd[_0x53e428(0x31c)][_0x53e428(0x356)]||_0x2e40fd[_0x53e428(0x31c)][_0x53e428(0x261)];else{if(typeof _0x2e40fd[_0x53e428(0x31c)]===_0x53e428(0x1be))try{const _0x1b9fe8=JSON[_0x53e428(0x196)](_0x2e40fd['content']);_0x2e2b5f=_0x1b9fe8['mentionedInfo']||_0x1b9fe8['mentioned_info'];}catch{}}const _0x2fd9a8=_0xd9ec3d?.[_0x53e428(0x356)]||_0xd9ec3d?.['mentioned_info']||_0x2e2b5f;log[_0x53e428(0x365)]({'sessionId':_0x475d10,'chatId':_0x34f189,'content':_0x5b385c,'mentionedInfo':JSON[_0x53e428(0x2b6)](_0x2fd9a8),'dataKeys':Object[_0x53e428(0x25a)](_0x30d97f[_0x53e428(0x1b5)](_0xd9ec3d,{})),'accountId':this[_0x53e428(0x36f)][_0x53e428(0x294)]},_0x30d97f[_0x53e428(0x303)]);if(_0x2fd9a8){const _0x572dec=_0x2fd9a8[_0x53e428(0x1d6)]||_0x2fd9a8['user_id_list']||[],_0x5ba5f3=!_0x572dec||_0x572dec['length']===0x0,_0x533b1a=_0x5ba5f3||_0x572dec[_0x53e428(0x2a8)](this[_0x53e428(0x36f)][_0x53e428(0x294)]);log[_0x53e428(0x365)]({'userIdList':_0x572dec,'isAllMentioned':_0x5ba5f3,'isMentioned':_0x533b1a,'accountId':this[_0x53e428(0x36f)][_0x53e428(0x294)]},_0x53e428(0x2f5));if(!_0x533b1a){log['info'](_0x30d97f[_0x53e428(0x1ca)]);return;}}}if(_0x335e3b){if(_0x30d97f['idvZM'](_0x30d97f['cmlpT'],_0x30d97f[_0x53e428(0x256)])){_0x415141[_0x53e428(0x358)]({'messageUId':_0x45f5e4[_0x53e428(0x1a3)],'sentTime':_0x5f4ab0[_0x53e428(0x380)]},_0x53e428(0x273));return;}else{const _0x4616c1=await this[_0x53e428(0x35a)](_0x2e40fd['targetId']);if(!_0x4616c1[_0x53e428(0x37d)]){log[_0x53e428(0x365)]({'groupId':_0x2e40fd[_0x53e428(0x22b)],'reason':_0x4616c1['reason']},_0x53e428(0x225));return;}}}log[_0x53e428(0x365)]({'sessionId':_0x475d10,'chatId':_0x34f189,'isGroup':_0x335e3b,'contentLength':_0x5b385c[_0x53e428(0x326)]},_0x53e428(0x29a)),this[_0x53e428(0x337)][_0x53e428(0x33f)](_0x34f189,_0x30d97f[_0x53e428(0x29e)]);try{const _0x298706=await this[_0x53e428(0x337)][_0x53e428(0x344)](_0x34f189,_0x53e428(0x2a3)+(_0x335e3b?_0x2e40fd[_0x53e428(0x22b)]:_0x2e40fd[_0x53e428(0x353)])),_0x5a3482=_0x30d97f[_0x53e428(0x21c)](_0x121872,_0x30d97f[_0x53e428(0x31a)])||_0x30d97f[_0x53e428(0x35c)](_0x121872,RongyunMessageTypeEnum['CHAT_MESSAGE']);await this[_0x53e428(0x2f4)][_0x53e428(0x34e)](_0x298706['id'],_0x5b385c),log[_0x53e428(0x365)]({'sessionId':_0x475d10,'chatId':_0x34f189,'opencodeSessionId':_0x298706['id']},_0x30d97f[_0x53e428(0x36e)]),_0x335e3b&&this[_0x53e428(0x32f)](_0x2e40fd[_0x53e428(0x22b)]);}catch(_0x511654){log[_0x53e428(0x2d1)]({'err':_0x511654,'sessionId':_0x475d10,'chatId':_0x34f189},_0x30d97f[_0x53e428(0x263)]),this['sessionManager'][_0x53e428(0x33f)](_0x34f189,_0x30d97f['TPVZE']);try{const _0x588d31=JSON['stringify']({'content':_0x30d97f['Yendz'],'extra':JSON[_0x53e428(0x2b6)]({'from_node':this[_0x53e428(0x36f)][_0x53e428(0x294)],'is_ai':!![]})});await this[_0x53e428(0x1f1)][_0x53e428(0x355)](_0x30d97f[_0x53e428(0x35c)](_0x2e40fd[_0x53e428(0x188)],0x3)?_0x2e40fd[_0x53e428(0x22b)]:_0x2e40fd['senderUserId'],_0x588d31,_0x2e40fd[_0x53e428(0x188)]);}catch{}}}async[a0_0x44204b(0x2de)](_0x41e6b7,_0x579fd7,_0xb3e3f0){const _0x518042=a0_0x44204b,_0x5ea9c5={'krxcH':'Processing\x20device\x20chat\x20via\x20ops\x20assistant','DekeY':'Ops\x20assistant\x20responded\x20for\x20device\x20chat','GlNfc':_0x518042(0x369),'eHIxZ':_0x518042(0x271),'BjwXZ':function(_0x32967e,_0x56ab98){return _0x32967e===_0x56ab98;},'YtHOB':_0x518042(0x266),'NQOCB':_0x518042(0x1e5),'mWuLj':function(_0x4bffc8,_0xab46){return _0x4bffc8+_0xab46;},'tGjZm':'运维助手处理失败:\x20','GZwsP':_0x518042(0x2d1)},_0x2275f1=_0x41e6b7['room_id'],_0x1d8fab=_0x41e6b7[_0x518042(0x33c)]||_0x41e6b7[_0x518042(0x275)],_0x3ec514=_0x41e6b7[_0x518042(0x272)]||_0x41e6b7['sourceImId']||_0x579fd7[_0x518042(0x353)];log[_0x518042(0x365)]({'roomId':_0x2275f1,'targetId':_0x3ec514,'contentLength':_0xb3e3f0[_0x518042(0x326)]},_0x5ea9c5[_0x518042(0x186)]);try{const _0x33b52e=await this[_0x518042(0x2c5)][_0x518042(0x267)](_0x518042(0x32b)+_0x2275f1);log[_0x518042(0x365)]({'sessionId':_0x33b52e['id'],'roomId':_0x2275f1},_0x518042(0x2bf));const _0x3ff3c7=await this[_0x518042(0x2c5)]['sendPrompt'](_0x33b52e['id'],_0xb3e3f0);log['info']({'roomId':_0x2275f1,'responseLength':_0x3ff3c7[_0x518042(0x326)]},_0x5ea9c5[_0x518042(0x1b0)]);const _0x59cf64=JSON[_0x518042(0x2b6)]({'msg_type':RongyunMessageTypeEnum['CHAT_MESSAGE'],'request_id':_0x1d8fab,'content':_0x3ff3c7,'status':_0x5ea9c5[_0x518042(0x2ea)],'room_id':_0x2275f1});await this[_0x518042(0x1f1)][_0x518042(0x355)](_0x3ec514,_0x59cf64,_0x579fd7['conversationType']),log['info']({'targetId':_0x3ec514,'roomId':_0x2275f1},_0x5ea9c5[_0x518042(0x2d7)]);}catch(_0x5c134f){if(_0x5ea9c5[_0x518042(0x2f9)](_0x518042(0x266),_0x5ea9c5[_0x518042(0x2e4)])){log['error']({'err':_0x5c134f,'roomId':_0x2275f1,'targetId':_0x3ec514},_0x5ea9c5['NQOCB']);const _0x53dc9e=JSON[_0x518042(0x2b6)]({'msg_type':RongyunMessageTypeEnum[_0x518042(0x237)],'request_id':_0x1d8fab,'content':_0x5ea9c5[_0x518042(0x191)](_0x5ea9c5[_0x518042(0x281)],_0x5c134f[_0x518042(0x36c)]||'未知错误'),'status':_0x5ea9c5[_0x518042(0x25d)],'room_id':_0x2275f1});await this[_0x518042(0x1f1)][_0x518042(0x355)](_0x3ec514,_0x53dc9e,_0x579fd7['conversationType']);}else try{_0x430352=_0xeb0f28[_0x518042(0x196)](_0x1bebeb[_0x518042(0x31c)]);}catch{_0x3e0795={'content':_0x5f2e18[_0x518042(0x31c)]};}}}async[a0_0x44204b(0x2e5)](_0x590d0e,_0x5f20dd){const _0x20329c=a0_0x44204b,_0x31d950={'BTDHc':function(_0xd2ce4c,_0x14321a){return _0xd2ce4c===_0x14321a;},'GAVku':_0x20329c(0x369),'IzhJv':function(_0x5f4654,_0x3d83b7){return _0x5f4654/_0x3d83b7;},'vJlkx':function(_0x4c558c,_0xc51f41){return _0x4c558c!==_0xc51f41;},'gSgph':'gSywN','XtkCM':_0x20329c(0x292),'hULWx':_0x20329c(0x21b),'oXLpf':_0x20329c(0x2d1)},_0x191699=_0x31d950[_0x20329c(0x328)](_0x5f20dd[_0x20329c(0x188)],0x3)?_0x5f20dd[_0x20329c(0x22b)]:_0x590d0e[_0x20329c(0x272)]||_0x590d0e[_0x20329c(0x229)],_0x2a16f2=_0x590d0e[_0x20329c(0x2aa)]||_0x20329c(0x1f8);try{const _0x2f7e81='claw-'+_0x191699,_0x2bd7fc=await this[_0x20329c(0x337)][_0x20329c(0x344)](_0x2f7e81,_0x2a16f2),_0x1172ca={'msg_type':RongyunMessageTypeEnum[_0x20329c(0x2c1)],'request_id':_0x590d0e[_0x20329c(0x33c)],'source_im_id':_0x590d0e[_0x20329c(0x338)]||_0x5f20dd['targetId'],'destination_im_id':_0x191699,'content':JSON[_0x20329c(0x2b6)]({'status':_0x31d950[_0x20329c(0x246)],'opencode_session_id':_0x2bd7fc['id'],'session_id':_0x2f7e81,'title':_0x2a16f2}),'timestamp':Math[_0x20329c(0x290)](_0x31d950['IzhJv'](Date[_0x20329c(0x2ee)](),0x3e8))};await this[_0x20329c(0x1f1)]['sendMessage'](_0x191699,JSON['stringify'](_0x1172ca),_0x5f20dd[_0x20329c(0x188)]);}catch(_0x160346){if(_0x31d950['vJlkx'](_0x31d950[_0x20329c(0x259)],_0x31d950[_0x20329c(0x284)])){log[_0x20329c(0x2d1)]({'err':_0x160346},_0x31d950['hULWx']);const _0x73eaf={'msg_type':RongyunMessageTypeEnum[_0x20329c(0x2c1)],'request_id':_0x590d0e[_0x20329c(0x33c)],'source_im_id':_0x590d0e[_0x20329c(0x338)]||_0x5f20dd[_0x20329c(0x22b)],'destination_im_id':_0x191699,'content':JSON['stringify']({'status':_0x31d950[_0x20329c(0x32e)],'message':_0x160346['message']}),'timestamp':Math[_0x20329c(0x290)](Date[_0x20329c(0x2ee)]()/0x3e8)};await this[_0x20329c(0x1f1)][_0x20329c(0x355)](_0x191699,JSON['stringify'](_0x73eaf),_0x5f20dd['conversationType']);}else _0x486bdb=_0x444792[_0x20329c(0x196)](_0x48c6dc[_0x20329c(0x31c)]);}}async[a0_0x44204b(0x1db)](_0x5a72d9,_0x555a41){const _0x3f1f4e=a0_0x44204b,_0xa65564={'Bqvjp':'Processing\x20device\x20status\x20request','oUELz':function(_0x3c85fb,_0x4ee5e2,_0x391593){return _0x3c85fb(_0x4ee5e2,_0x391593);},'WAvgU':_0x3f1f4e(0x1a0),'NvTgn':'unknown','XWKnK':function(_0x516dc7,_0x128e6f){return _0x516dc7/_0x128e6f;},'qVoya':_0x3f1f4e(0x332),'VJiSV':_0x3f1f4e(0x364),'Hxlcy':function(_0x235288,_0x2bb741){return _0x235288+_0x2bb741;},'HIheI':_0x3f1f4e(0x334),'xYVlI':'未知错误','vQePO':function(_0x13d311,_0x2e37be){return _0x13d311/_0x2e37be;},'zIXBq':function(_0x2df06a,_0x54aa5b){return _0x2df06a===_0x54aa5b;},'BnzfP':'gnNal','veTUP':_0x3f1f4e(0x18f)},_0x483d4f=_0x555a41['conversationType']===0x3?_0x555a41[_0x3f1f4e(0x22b)]:_0x5a72d9[_0x3f1f4e(0x272)]||_0x5a72d9['sourceImId']||_0x555a41['senderUserId'],_0xc81afb=this['config'][_0x3f1f4e(0x21d)];log[_0x3f1f4e(0x365)]({'targetId':_0x483d4f,'opencodeUrl':_0xc81afb},_0xa65564[_0x3f1f4e(0x183)]);try{const _0x5bfa3f=_0xc81afb?await _0xa65564['oUELz'](checkOpencodeStatus,_0xc81afb,this[_0x3f1f4e(0x36f)][_0x3f1f4e(0x1fb)]):![];log[_0x3f1f4e(0x365)]({'opencodeOk':_0x5bfa3f},_0x3f1f4e(0x301));const _0x21c9ec={'open_claw_status':_0x5bfa3f?0x1:0x0,'status_message':_0x5bfa3f?_0x3f1f4e(0x34f):_0xa65564[_0x3f1f4e(0x227)],'version':_0xa65564[_0x3f1f4e(0x306)],'timestamp':Date['now']()},_0x1f9cde={'msg_type':RongyunMessageTypeEnum[_0x3f1f4e(0x23d)],'request_id':_0x5a72d9[_0x3f1f4e(0x33c)],'source_im_id':this[_0x3f1f4e(0x36f)][_0x3f1f4e(0x294)],'destination_im_id':_0x483d4f,'content':JSON[_0x3f1f4e(0x2b6)](_0x21c9ec),'timestamp':Math[_0x3f1f4e(0x290)](_0xa65564['XWKnK'](Date[_0x3f1f4e(0x2ee)](),0x3e8))};await this[_0x3f1f4e(0x1f1)][_0x3f1f4e(0x355)](_0x483d4f,JSON[_0x3f1f4e(0x2b6)](_0x1f9cde),_0x555a41[_0x3f1f4e(0x188)]),log['info']({'targetId':_0x483d4f,'status':_0x21c9ec[_0x3f1f4e(0x23f)]},_0xa65564[_0x3f1f4e(0x216)]);}catch(_0x40fbd1){log[_0x3f1f4e(0x2d1)]({'err':_0x40fbd1[_0x3f1f4e(0x36c)]||_0x40fbd1,'targetId':_0x483d4f},_0xa65564[_0x3f1f4e(0x215)]);const _0xcc1213={'msg_type':RongyunMessageTypeEnum[_0x3f1f4e(0x23d)],'request_id':_0x5a72d9[_0x3f1f4e(0x33c)],'source_im_id':this[_0x3f1f4e(0x36f)]['accountId'],'destination_im_id':_0x483d4f,'content':JSON[_0x3f1f4e(0x2b6)]({'open_claw_status':-0x1,'status_message':_0xa65564[_0x3f1f4e(0x189)](_0xa65564[_0x3f1f4e(0x335)],_0x40fbd1['message']||_0xa65564[_0x3f1f4e(0x190)]),'timestamp':Date[_0x3f1f4e(0x2ee)]()}),'timestamp':Math[_0x3f1f4e(0x290)](_0xa65564[_0x3f1f4e(0x370)](Date[_0x3f1f4e(0x2ee)](),0x3e8))};try{_0xa65564[_0x3f1f4e(0x19e)](_0xa65564[_0x3f1f4e(0x343)],_0xa65564[_0x3f1f4e(0x343)])?await this[_0x3f1f4e(0x1f1)]['sendMessage'](_0x483d4f,JSON[_0x3f1f4e(0x2b6)](_0xcc1213),_0x555a41[_0x3f1f4e(0x188)]):_0x484d63[_0x3f1f4e(0x231)](_0x516582[_0x3f1f4e(0x1cf)]);}catch(_0xa4a829){log[_0x3f1f4e(0x2d1)]({'sendErr':_0xa4a829},_0xa65564[_0x3f1f4e(0x2a7)]);}}}async['handleDeviceControl'](_0xacb557,_0x4c18b1){const _0x1b1a58=a0_0x44204b,_0x135b4e={'KxzCb':function(_0xbf4502,_0x4b2461){return _0xbf4502===_0x4b2461;},'QKbRW':_0x1b1a58(0x1be),'OzdSv':_0x1b1a58(0x24c),'mHDrY':_0x1b1a58(0x244),'QmlCx':_0x1b1a58(0x212),'ICfWf':_0x1b1a58(0x2d8),'vbXPX':_0x1b1a58(0x28a),'thufX':_0x1b1a58(0x28e),'KkfjV':_0x1b1a58(0x369),'dopaE':function(_0x46a127,_0x18dcbb){return _0x46a127/_0x18dcbb;}},_0x4a5ea1=_0x135b4e[_0x1b1a58(0x219)](_0x4c18b1[_0x1b1a58(0x188)],0x3)?_0x4c18b1[_0x1b1a58(0x22b)]:_0xacb557[_0x1b1a58(0x272)]||_0xacb557[_0x1b1a58(0x229)]||_0x4c18b1[_0x1b1a58(0x353)];let _0x243127={};try{if(_0xacb557['content']&&_0x135b4e['KxzCb'](typeof _0xacb557[_0x1b1a58(0x31c)],_0x135b4e[_0x1b1a58(0x1bc)]))_0x243127=JSON['parse'](_0xacb557['content']);else _0xacb557[_0x1b1a58(0x31c)]&&typeof _0xacb557[_0x1b1a58(0x31c)]===_0x135b4e[_0x1b1a58(0x18e)]&&(_0x243127=_0xacb557[_0x1b1a58(0x31c)]);}catch{_0x243127={};}const _0x42d3cb=_0x243127[_0x1b1a58(0x291)],_0x3bf74f={0x1:_0x135b4e[_0x1b1a58(0x233)],0x2:'stop',0x3:_0x135b4e[_0x1b1a58(0x1c2)],0x4:_0x135b4e['ICfWf'],0x5:_0x135b4e[_0x1b1a58(0x247)]},_0x3cba84=_0x3bf74f[_0x42d3cb]||_0x1b1a58(0x379)+_0x42d3cb+')';log[_0x1b1a58(0x365)]({'targetId':_0x4a5ea1,'cmd':_0x42d3cb,'cmdName':_0x3cba84},_0x135b4e[_0x1b1a58(0x342)]);const _0x1c63e3={'msg_type':RongyunMessageTypeEnum[_0x1b1a58(0x2d4)],'request_id':_0xacb557[_0x1b1a58(0x33c)],'command':_0x3cba84,'cmd':_0x42d3cb,'status':_0x135b4e[_0x1b1a58(0x34b)],'message':'命令\x20'+_0x3cba84+_0x1b1a58(0x2fc),'timestamp':Math[_0x1b1a58(0x290)](_0x135b4e[_0x1b1a58(0x20f)](Date[_0x1b1a58(0x2ee)](),0x3e8))};await this['rongClient'][_0x1b1a58(0x355)](_0x4a5ea1,JSON['stringify'](_0x1c63e3),_0x4c18b1['conversationType']);}async[a0_0x44204b(0x1aa)](_0x18f643,_0x32d0b2){const _0x469ac6=a0_0x44204b,_0x16b2cb={'IvTkj':_0x469ac6(0x22c),'WdUHE':function(_0x3e880a,_0x43577d){return _0x3e880a!==_0x43577d;},'iGcdl':'Command\x20message\x20contains\x20nested\x20msg_type,\x20routing','ijgcP':_0x469ac6(0x234),'xIDOg':_0x469ac6(0x372),'zcYXl':function(_0x47efb6,_0x5abfb4){return _0x47efb6||_0x5abfb4;},'lCjyx':'ZZenp','JXxFL':_0x469ac6(0x253),'hHpVc':_0x469ac6(0x2b0),'ynsMy':_0x469ac6(0x361),'dTCmJ':_0x469ac6(0x25c),'myjUd':_0x469ac6(0x249),'soGIl':_0x469ac6(0x369)},_0x3f622d=_0x18f643[_0x469ac6(0x1a8)];if(_0x3f622d&&_0x16b2cb[_0x469ac6(0x2ed)](_0x3f622d,_0x469ac6(0x1fa))&&_0x3f622d!==RongyunMessageTypeEnum[_0x469ac6(0x21a)]){log[_0x469ac6(0x365)]({'nestedMsgType':_0x3f622d},_0x16b2cb[_0x469ac6(0x18b)]);switch(_0x3f622d){case RongyunMessageTypeEnum[_0x469ac6(0x299)]:case _0x16b2cb[_0x469ac6(0x2d2)]:await this[_0x469ac6(0x1de)](_0x18f643,_0x32d0b2);return;case RongyunMessageTypeEnum['DEVICE_CONTROL']:case _0x469ac6(0x1b8):await this[_0x469ac6(0x287)](_0x18f643,_0x32d0b2);return;case RongyunMessageTypeEnum['DEVICE_STATUS_REQUEST']:case'device_status_request':await this['handleDeviceStatusRequest'](_0x18f643,_0x32d0b2);return;case RongyunMessageTypeEnum['COMMAND_RESULT']:case _0x16b2cb[_0x469ac6(0x2a6)]:this[_0x469ac6(0x350)](_0x18f643,_0x32d0b2);return;}}const _0x45634c=_0x18f643[_0x469ac6(0x275)]||_0x18f643[_0x469ac6(0x33c)],_0x2d8721=_0x18f643['service'],_0x373df1=_0x18f643[_0x469ac6(0x209)],_0x4e6e3c=_0x18f643['payload']||{},_0x225fb5=_0x18f643['source_im_id']||_0x18f643[_0x469ac6(0x229)]||_0x32d0b2[_0x469ac6(0x353)],_0x317783=_0x18f643[_0x469ac6(0x338)]||_0x18f643[_0x469ac6(0x336)]||_0x32d0b2[_0x469ac6(0x22b)];if(_0x16b2cb[_0x469ac6(0x36d)](!_0x2d8721,!_0x373df1)){if(_0x16b2cb[_0x469ac6(0x2ed)](_0x16b2cb['lCjyx'],'ZZenp'))_0x579c4f[_0x469ac6(0x20e)](new _0x4290fa(_0x3b4176[_0x469ac6(0x36c)]||_0x16b2cb[_0x469ac6(0x1f9)]));else{log[_0x469ac6(0x358)]({'requestId':_0x45634c,'senderUserId':_0x32d0b2[_0x469ac6(0x353)]},_0x469ac6(0x1c4));return;}}log['info']({'requestId':_0x45634c,'service':_0x2d8721,'action':_0x373df1},_0x16b2cb[_0x469ac6(0x20c)]);const _0x2f67c9=_0x469ac6(0x28f)+_0x2d8721+'_'+_0x373df1;let _0x4db622;try{typeof this[_0x2f67c9]===_0x16b2cb[_0x469ac6(0x374)]?_0x4db622=await this[_0x2f67c9](_0x4e6e3c,_0x225fb5):(log[_0x469ac6(0x17e)]({'handlerName':_0x2f67c9},_0x469ac6(0x311)),_0x4db622={'code':0x194,'message':_0x469ac6(0x2bc)+_0x2d8721+'/'+_0x373df1,'status':_0x469ac6(0x2d1)});}catch(_0x1442d5){_0x16b2cb['ynsMy']!==_0x16b2cb[_0x469ac6(0x274)]?_0x401417=_0x193830['content'][_0x469ac6(0x356)]||_0x84241f[_0x469ac6(0x31c)][_0x469ac6(0x261)]:(log['error']({'err':_0x1442d5,'handlerName':_0x2f67c9},_0x16b2cb['dTCmJ']),_0x4db622={'code':0x1f4,'message':_0x1442d5['message']||_0x16b2cb['myjUd'],'status':_0x469ac6(0x2d1)});}const _0x2e5b55={'msg_type':RongyunMessageTypeEnum[_0x469ac6(0x2e7)],'requestId':_0x45634c,'service':_0x2d8721,'action':_0x373df1,'status':_0x4db622[_0x469ac6(0x2d8)]||_0x16b2cb[_0x469ac6(0x217)],'code':_0x4db622[_0x469ac6(0x33e)]||0xc8,'data':_0x4db622[_0x469ac6(0x1cf)]||null,'message':_0x4db622[_0x469ac6(0x36c)]||_0x16b2cb['soGIl'],'timestamp':Date['now']()};await this[_0x469ac6(0x1f1)][_0x469ac6(0x355)](_0x225fb5,JSON[_0x469ac6(0x2b6)](_0x2e5b55),_0x32d0b2[_0x469ac6(0x188)]);}[a0_0x44204b(0x350)](_0x492627,_0x42779a){const _0x1cd4aa=a0_0x44204b,_0x56c9f2={'eZDWW':function(_0x3c638e,_0x43b362){return _0x3c638e===_0x43b362;},'bcRHY':_0x1cd4aa(0x1ab),'OmPCs':_0x1cd4aa(0x205),'LlQZZ':_0x1cd4aa(0x351),'dcWSg':function(_0x58600a,_0x1ca9e2){return _0x58600a(_0x1ca9e2);},'hMSML':function(_0x5155c5,_0x6a66ff){return _0x5155c5===_0x6a66ff;},'JNSCO':_0x1cd4aa(0x369),'bkKdM':function(_0x44544c,_0x35ec9c){return _0x44544c===_0x35ec9c;},'pJhOY':_0x1cd4aa(0x22c),'HfVlH':_0x1cd4aa(0x207)},_0x395c2e=_0x492627[_0x1cd4aa(0x275)]||_0x492627[_0x1cd4aa(0x33c)];if(!_0x395c2e){log['warn'](_0x1cd4aa(0x285));return;}const _0x2be471=this['pendingRequests'][_0x1cd4aa(0x36b)](_0x395c2e);if(!_0x2be471){if(_0x56c9f2[_0x1cd4aa(0x19a)](_0x56c9f2[_0x1cd4aa(0x1e1)],_0x56c9f2[_0x1cd4aa(0x20a)]))return _0x4edc66[_0x1cd4aa(0x17e)]({'groupId':_0x505f56,'err':_0x5ab02b[_0x1cd4aa(0x36c)]},_0x1cd4aa(0x2e8)),null;else{log['warn']({'requestId':_0x395c2e},_0x56c9f2['LlQZZ']);return;}}_0x56c9f2[_0x1cd4aa(0x362)](clearTimeout,_0x2be471[_0x1cd4aa(0x21f)]),this[_0x1cd4aa(0x24f)][_0x1cd4aa(0x1ed)](_0x395c2e),_0x56c9f2['hMSML'](_0x492627[_0x1cd4aa(0x2d8)],_0x56c9f2[_0x1cd4aa(0x251)])&&_0x56c9f2[_0x1cd4aa(0x376)](_0x492627[_0x1cd4aa(0x33e)],0xc8)?_0x2be471[_0x1cd4aa(0x231)](_0x492627[_0x1cd4aa(0x1cf)]):_0x2be471[_0x1cd4aa(0x20e)](new Error(_0x492627['message']||_0x56c9f2[_0x1cd4aa(0x2f8)])),log[_0x1cd4aa(0x365)]({'requestId':_0x395c2e,'status':_0x492627[_0x1cd4aa(0x2d8)],'code':_0x492627[_0x1cd4aa(0x33e)]},_0x56c9f2[_0x1cd4aa(0x35b)]);}async['_handle_user_getInfo'](_0x260dc5,_0x3d9e24){const _0x66738a=a0_0x44204b,_0x444a2b={'iBKwH':_0x66738a(0x369),'WdSfN':_0x66738a(0x32d),'JIRLh':_0x66738a(0x34a),'JQhId':'active'};return{'code':0xc8,'message':_0x444a2b[_0x66738a(0x200)],'status':_0x444a2b['iBKwH'],'data':{'userId':_0x3d9e24,'username':_0x444a2b[_0x66738a(0x230)],'nickname':_0x444a2b['JIRLh'],'portraitUri':'','phone':'','email':'','signature':'','gender':'','birthday':'','status':_0x444a2b[_0x66738a(0x260)]}};}async['_handle_user_login'](_0x574170,_0x1df4df){const _0x2a5fd2=a0_0x44204b,_0x5cb92a={'lfHLn':_0x2a5fd2(0x280),'HZWZL':_0x2a5fd2(0x369)};return{'code':0xc8,'message':_0x5cb92a[_0x2a5fd2(0x2e9)],'status':_0x5cb92a[_0x2a5fd2(0x1ef)],'data':{'userId':_0x1df4df,'token':this[_0x2a5fd2(0x36f)]['token']}};}async[a0_0x44204b(0x240)](_0x8f07b7,_0xdfc8b0){const _0x362ee9=a0_0x44204b,_0x438730={'TRCAo':function(_0x366714,_0x356b08){return _0x366714!==_0x356b08;},'uOfOS':_0x362ee9(0x369),'hWOtO':_0x362ee9(0x198),'GqzuU':_0x362ee9(0x2d6),'eBffc':'1.0.0'},_0x236552=_0x438730[_0x362ee9(0x250)](this[_0x362ee9(0x2f4)],null);return{'code':0xc8,'message':_0x438730['uOfOS'],'status':_0x438730[_0x362ee9(0x347)],'data':{'nodeId':this[_0x362ee9(0x36f)]['accountId'],'status':_0x236552?_0x438730[_0x362ee9(0x243)]:_0x438730[_0x362ee9(0x2e6)],'openclawUrl':this[_0x362ee9(0x36f)][_0x362ee9(0x21d)],'version':_0x438730[_0x362ee9(0x30d)]}};}async[a0_0x44204b(0x2af)](_0x52c9f7,_0x7c355c){const _0x333cac=a0_0x44204b,_0x2baa86={'fdafV':_0x333cac(0x369),'keCCm':_0x333cac(0x198)};return{'code':0xc8,'message':_0x333cac(0x2f6),'status':_0x2baa86[_0x333cac(0x2c3)],'data':{'nodeId':this[_0x333cac(0x36f)][_0x333cac(0x294)],'status':_0x2baa86['keCCm']}};}async[a0_0x44204b(0x1e8)](_0x398e51,_0x336a96){const _0x19e7e1=a0_0x44204b,_0x24cbb7={'HzPqx':'Node\x20stopped','hLiMf':_0x19e7e1(0x369),'SVunr':_0x19e7e1(0x2d6)};return{'code':0xc8,'message':_0x24cbb7[_0x19e7e1(0x319)],'status':_0x24cbb7[_0x19e7e1(0x2d0)],'data':{'nodeId':this['config'][_0x19e7e1(0x294)],'status':_0x24cbb7[_0x19e7e1(0x238)]}};}async[a0_0x44204b(0x2ca)](_0x3eb46c,_0x3c86bf){const _0x490102=a0_0x44204b;return{'code':0xc8,'message':_0x490102(0x369),'status':_0x490102(0x369),'data':{'appKey':this['config'][_0x490102(0x310)],'serverUrl':this[_0x490102(0x36f)][_0x490102(0x1a7)]}};}async[a0_0x44204b(0x2b4)](_0x2dd81e,_0x322850){const _0x353056=a0_0x44204b,_0x5c5115={'mTuLE':'cNIJd','KShzN':_0x353056(0x369),'pGpJB':function(_0xf1dc61,_0x4e4af9){return _0xf1dc61/_0x4e4af9;},'mOnpx':_0x353056(0x248),'OuuKT':function(_0x1a166c,_0x54966){return _0x1a166c!==_0x54966;},'XoRvp':_0x353056(0x304),'kMmWB':'error','KUQEY':_0x353056(0x37f),'Mfmdn':function(_0x4c184c,_0x53fda5){return _0x4c184c/_0x53fda5;}},_0x229a92=_0x2dd81e[_0x353056(0x302)]||_0x2dd81e['user_id']||_0x322850['senderUserId'],_0x3bd3fc=_0x322850[_0x353056(0x353)],_0x1172b7=_0x2dd81e[_0x353056(0x33c)]||_0x2dd81e[_0x353056(0x275)];log['info']({'userId':_0x229a92,'targetId':_0x3bd3fc,'requestId':_0x1172b7},_0x353056(0x1e9));try{if('rLvkc'!==_0x5c5115['mTuLE']){const _0x231895=_0x353056(0x18a)+_0x229a92,_0x361345=await this['sessionManager']['getOrCreateSession'](_0x231895,_0x353056(0x1bf)+_0x229a92),_0x125058={'msg_type':RongyunMessageTypeEnum['SERVICE_SESSION_CREATED'],'request_id':_0x1172b7,'userId':_0x229a92,'sessionId':_0x361345['id'],'status':_0x5c5115['KShzN'],'message':_0x353056(0x298),'timestamp':Math[_0x353056(0x290)](_0x5c5115[_0x353056(0x2fd)](Date[_0x353056(0x2ee)](),0x3e8))};await this['rongClient'][_0x353056(0x355)](_0x3bd3fc,JSON['stringify'](_0x125058),_0x322850['conversationType']),log[_0x353056(0x365)]({'userId':_0x229a92,'sessionId':_0x361345['id']},_0x5c5115[_0x353056(0x1f5)]);}else _0x2ff509={'count':0x0,'lastTimestamp':0x0},this[_0x353056(0x283)][_0x353056(0x185)](_0x1ce29d,_0x1c40b2);}catch(_0x40e168){if(_0x5c5115[_0x353056(0x1d0)](_0x5c5115[_0x353056(0x26c)],_0x5c5115[_0x353056(0x26c)])){_0x4d1c77['warn']({'messageType':_0xce4d70[_0x353056(0x289)]},_0x353056(0x27b));return;}else{log[_0x353056(0x2d1)]({'err':_0x40e168,'userId':_0x229a92},_0x353056(0x37b));const _0x59c6b1={'msg_type':RongyunMessageTypeEnum[_0x353056(0x192)],'request_id':_0x1172b7,'userId':_0x229a92,'status':_0x5c5115[_0x353056(0x1b7)],'message':_0x40e168[_0x353056(0x36c)]||_0x5c5115['KUQEY'],'timestamp':Math[_0x353056(0x290)](_0x5c5115[_0x353056(0x2c2)](Date[_0x353056(0x2ee)](),0x3e8))};await this[_0x353056(0x1f1)][_0x353056(0x355)](_0x3bd3fc,JSON[_0x353056(0x2b6)](_0x59c6b1),_0x322850[_0x353056(0x188)]);}}}async[a0_0x44204b(0x195)](_0x5705e2){const _0x32251a=a0_0x44204b,_0x2279b9={'uhdhn':'Voice\x20recognized\x20via\x20RongCloud','eQDWZ':_0x32251a(0x1df),'jfVws':function(_0x14e701,_0x2d99da){return _0x14e701(_0x2d99da);},'fEgqs':function(_0x1d48fc,_0x28f46d){return _0x1d48fc===_0x28f46d;},'lVrMm':_0x32251a(0x1be),'WOfGU':_0x32251a(0x2ac),'aLvHY':_0x32251a(0x331),'eIMJh':_0x32251a(0x368),'gzLlG':function(_0x16363a,_0x5611e3){return _0x16363a+_0x5611e3;},'CMtAZ':_0x32251a(0x252),'gzJcY':_0x32251a(0x1b3),'MbHTa':'wncSQ','AzzfQ':function(_0x32db97,_0x18572a,_0x326e6b){return _0x32db97(_0x18572a,_0x326e6b);},'GHKrZ':_0x32251a(0x226),'sNMDN':_0x32251a(0x322),'YqmZi':_0x32251a(0x340),'Mokmc':_0x32251a(0x222)},_0x5f0f02='vr_'+Date[_0x32251a(0x2ee)]()+'_'+Math[_0x32251a(0x2a9)]()[_0x32251a(0x1a9)](0x24)[_0x32251a(0x1d2)](0x2,0xa);return new Promise((_0xc9b8a8,_0x4d6791)=>{const _0x448788=_0x32251a,_0x6e1660={'RdVfA':_0x2279b9[_0x448788(0x329)],'NZVlD':function(_0x5f2393,_0x39a56d){const _0x242f7a=_0x448788;return _0x2279b9[_0x242f7a(0x208)](_0x5f2393,_0x39a56d);},'lKbsm':function(_0x4ac934,_0x5b677e){const _0x1f4136=_0x448788;return _0x2279b9[_0x1f4136(0x2da)](_0x4ac934,_0x5b677e);},'oeWii':_0x2279b9[_0x448788(0x2d3)],'dAIUg':function(_0x37ff8d,_0x22a4d3){return _0x37ff8d!==_0x22a4d3;},'yjbye':_0x2279b9[_0x448788(0x2f3)],'RxjsS':_0x2279b9[_0x448788(0x25f)],'PsJdp':_0x2279b9[_0x448788(0x1ee)],'dJuxr':_0x448788(0x32c),'QquLY':function(_0x1354fc,_0x106f3a){const _0x1a4db5=_0x448788;return _0x2279b9[_0x1a4db5(0x210)](_0x1354fc,_0x106f3a);},'CZqKj':_0x2279b9[_0x448788(0x354)],'ManSK':_0x2279b9[_0x448788(0x2a5)]};if(_0x2279b9[_0x448788(0x2da)](_0x2279b9[_0x448788(0x1c0)],_0x2279b9[_0x448788(0x1c0)])){const _0x51f546=_0x2279b9['AzzfQ'](setTimeout,()=>{const _0x23cd0e=_0x448788;'KQPmU'!==_0x6e1660[_0x23cd0e(0x27c)]?_0x305916=_0x57539e[_0x23cd0e(0x31c)]:(this[_0x23cd0e(0x24f)]['delete'](_0x5f0f02),_0x6e1660['NZVlD'](_0x4d6791,new Error('语音识别请求超时')));},0x7530);this[_0x448788(0x24f)][_0x448788(0x185)](_0x5f0f02,{'resolve':_0xc9b8a8,'reject':_0x4d6791,'timer':_0x51f546});const _0x12efdf={'msg_type':RongyunMessageTypeEnum[_0x448788(0x21a)],'requestId':_0x5f0f02,'service':'ai','action':_0x2279b9['GHKrZ'],'payload':{'voiceUrl':_0x5705e2,'format':_0x2279b9[_0x448788(0x1e2)],'sampleRate':0x3e80},'timestamp':Date[_0x448788(0x2ee)]()};this['rongClient'][_0x448788(0x355)](_0x2279b9[_0x448788(0x32a)],JSON[_0x448788(0x2b6)](_0x12efdf),0x1)[_0x448788(0x202)](()=>{const _0x1c4713=_0x448788;_0x6e1660[_0x1c4713(0x1a4)](_0x6e1660[_0x1c4713(0x286)],_0x6e1660['RxjsS'])?log['info']({'requestId':_0x5f0f02,'voiceUrl':_0x5705e2},_0x6e1660[_0x1c4713(0x206)]):_0x31f178=HLXWbx[_0x1c4713(0x33a)](typeof _0x24dba6['_raw_content'],HLXWbx[_0x1c4713(0x18d)])?_0x595f5c['_raw_content']:_0x49fd70[_0x1c4713(0x2b6)](_0x327665[_0x1c4713(0x28c)]);})['catch'](_0x186121=>{const _0x1938c4=_0x448788;_0x6e1660[_0x1938c4(0x23c)](clearTimeout,_0x51f546),this[_0x1938c4(0x24f)]['delete'](_0x5f0f02),log[_0x1938c4(0x2d1)]({'err':_0x186121[_0x1938c4(0x36c)],'requestId':_0x5f0f02},_0x6e1660[_0x1938c4(0x314)]),_0x6e1660[_0x1938c4(0x23c)](_0x4d6791,new Error(_0x6e1660[_0x1938c4(0x367)](_0x6e1660[_0x1938c4(0x2c0)],_0x186121[_0x1938c4(0x36c)]||_0x6e1660['ManSK'])));});}else{const _0xa6200b=_0x5cd803?.['text']||_0x4b6264?.[_0x448788(0x2fb)]||'';if(!_0xa6200b)throw new _0x2403cf('语音识别结果为空');return _0x517c3f[_0x448788(0x365)]({'voiceUrl':_0x44c890,'recognizedTextPreview':_0xa6200b[_0x448788(0x333)](0x0,0x64)},_0x2279b9[_0x448788(0x2eb)]),_0xa6200b;}})['then'](_0x53886b=>{const _0x1d618b=_0x32251a,_0x5bfdb2=_0x53886b?.[_0x1d618b(0x2f7)]||_0x53886b?.[_0x1d618b(0x2fb)]||'';if(!_0x5bfdb2)throw new Error(_0x2279b9[_0x1d618b(0x37a)]);return log[_0x1d618b(0x365)]({'voiceUrl':_0x5705e2,'recognizedTextPreview':_0x5bfdb2[_0x1d618b(0x333)](0x0,0x64)},_0x2279b9[_0x1d618b(0x2eb)]),_0x5bfdb2;});}async[a0_0x44204b(0x2df)](_0x378fcb,_0xdbffe4){const _0x4b707e=a0_0x44204b,_0x5e7d72={'MZNng':_0x4b707e(0x1c7),'dNaiv':_0x4b707e(0x27b),'LBsDr':function(_0x403985,_0x2a1a9b){return _0x403985===_0x2a1a9b;},'qaecN':_0x4b707e(0x197),'YXjOM':_0x4b707e(0x2b3),'iUXOD':_0x4b707e(0x1ea),'xFQaj':_0x4b707e(0x242),'ldKsg':_0x4b707e(0x2b1),'HJhho':_0x4b707e(0x213),'IRFwC':_0x4b707e(0x24e)},_0x41dd5a=_0x378fcb[_0x4b707e(0x1fc)]||_0x378fcb['remote_url']||_0x378fcb[_0x4b707e(0x239)],_0x2d74b7=_0x378fcb[_0x4b707e(0x236)]||0x0;if(!_0x41dd5a){log['warn']({'messageType':_0xdbffe4[_0x4b707e(0x289)]},_0x5e7d72['dNaiv']);return;}log[_0x4b707e(0x365)]({'voiceUrl':_0x41dd5a,'duration':_0x2d74b7,'senderUserId':_0xdbffe4[_0x4b707e(0x353)]},_0x4b707e(0x1dc));try{if(_0x5e7d72[_0x4b707e(0x30b)](_0x4b707e(0x279),_0x5e7d72[_0x4b707e(0x26b)])){let _0x49aa60=this[_0x4b707e(0x283)][_0x4b707e(0x36b)](_0x36883f);!_0x49aa60&&(_0x49aa60={'count':0x0,'lastTimestamp':0x0},this[_0x4b707e(0x283)]['set'](_0x25bb55,_0x49aa60)),_0x49aa60[_0x4b707e(0x187)]+=0x1,_0x49aa60[_0x4b707e(0x381)]=_0x1c3ab4['now'](),_0x3eb694['info']({'groupId':_0x3462fc,'count':_0x49aa60[_0x4b707e(0x187)]},WsunsT[_0x4b707e(0x2fa)]);}else{const _0x1cf191=await this[_0x4b707e(0x195)](_0x41dd5a);log[_0x4b707e(0x365)]({'voiceUrl':_0x41dd5a,'recognizedText':_0x1cf191},_0x5e7d72[_0x4b707e(0x1d8)]);const _0x4cd9f4={..._0x378fcb,'content':_0x1cf191,'_raw_content':_0x1cf191,'voiceUrl':_0x41dd5a,'voiceDuration':_0x2d74b7};await this[_0x4b707e(0x1b1)](_0x4cd9f4,_0xdbffe4,_0xdbffe4[_0x4b707e(0x289)]);}}catch(_0x43adb2){log[_0x4b707e(0x2d1)]({'err':_0x43adb2[_0x4b707e(0x36c)],'voiceUrl':_0x41dd5a},_0x5e7d72[_0x4b707e(0x37c)]);const _0x279142=JSON[_0x4b707e(0x2b6)]({'content':_0x5e7d72[_0x4b707e(0x35e)],'extra':JSON[_0x4b707e(0x2b6)]({'from_node':this[_0x4b707e(0x36f)][_0x4b707e(0x294)],'is_ai':!![],'is_error':!![]})});try{if(_0x5e7d72[_0x4b707e(0x30b)](_0x5e7d72['ldKsg'],_0x5e7d72[_0x4b707e(0x1dd)]))try{const _0x132cb4=_0x7469bc[_0x4b707e(0x196)](_0xa97023[_0x4b707e(0x31c)]);_0x406cb0=_0x132cb4[_0x4b707e(0x356)]||_0x132cb4[_0x4b707e(0x261)];}catch{}else await this[_0x4b707e(0x1f1)][_0x4b707e(0x355)](_0xdbffe4[_0x4b707e(0x353)],_0x279142,_0xdbffe4[_0x4b707e(0x188)]);}catch(_0x1bb176){log[_0x4b707e(0x2d1)]({'sendErr':_0x1bb176},_0x5e7d72[_0x4b707e(0x1cc)]);}}}async[a0_0x44204b(0x1d3)](_0x22ab3d,_0x971eaf){const _0x45ca94=a0_0x44204b,_0x1f24cd={'yttuW':'success','EgAax':_0x45ca94(0x311),'BJBcd':_0x45ca94(0x2d1),'LgObF':function(_0x574730,_0x212dc8){return _0x574730!==_0x212dc8;},'hYFYQ':_0x45ca94(0x184),'RUrug':_0x45ca94(0x308),'vnhJw':_0x45ca94(0x1d1),'dUhjw':'Voice\x20recognition\x20failed\x20for\x20service\x20chat','EWzGp':_0x45ca94(0x242),'JupQd':function(_0x190c55,_0x3c4ff8){return _0x190c55||_0x3c4ff8;},'wGfjY':function(_0x59cf06,_0x44844f){return _0x59cf06/_0x44844f;},'zXVoE':function(_0x59d9bd,_0x2e3825){return _0x59d9bd!==_0x2e3825;},'OTNqN':_0x45ca94(0x2c4),'UPklt':_0x45ca94(0x254),'XQMTC':'Processing\x20service\x20chat\x20message','FeFvw':_0x45ca94(0x1ff),'xqLpl':function(_0x185e62,_0x1a4346){return _0x185e62===_0x1a4346;},'ewTbY':_0x45ca94(0x2c7),'WykvW':'客服处理失败:\x20','uxxJx':_0x45ca94(0x1b3),'MVXZa':function(_0x2188ce,_0x5e653b){return _0x2188ce||_0x5e653b;},'ApJDu':function(_0x24b752,_0x3022b2){return _0x24b752/_0x3022b2;}},_0x41db96=_0x22ab3d[_0x45ca94(0x302)]||_0x22ab3d[_0x45ca94(0x2ae)]||_0x971eaf[_0x45ca94(0x353)],_0x55804e=_0x22ab3d[_0x45ca94(0x1d5)]||_0x22ab3d[_0x45ca94(0x193)];let _0x527b9e=_0x22ab3d[_0x45ca94(0x31c)]||'';const _0x291bb9=_0x971eaf[_0x45ca94(0x353)],_0x34fbc2=_0x22ab3d[_0x45ca94(0x33c)]||_0x22ab3d[_0x45ca94(0x275)];if(_0x22ab3d['voiceUrl']&&!_0x527b9e){if(_0x1f24cd[_0x45ca94(0x2cd)](_0x45ca94(0x305),_0x45ca94(0x305)))return{'code':0xc8,'message':tkysoJ[_0x45ca94(0x339)],'status':tkysoJ[_0x45ca94(0x339)],'data':{'appKey':this['config'][_0x45ca94(0x310)],'serverUrl':this[_0x45ca94(0x36f)][_0x45ca94(0x1a7)]}};else try{if(_0x1f24cd[_0x45ca94(0x2cd)](_0x1f24cd[_0x45ca94(0x224)],_0x1f24cd['RUrug']))_0x527b9e=await this[_0x45ca94(0x195)](_0x22ab3d[_0x45ca94(0x232)]),log[_0x45ca94(0x365)]({'userId':_0x41db96,'voiceUrl':_0x22ab3d[_0x45ca94(0x232)],'recognizedLength':_0x527b9e['length']},'Voice\x20message\x20recognized');else return{'code':0xc8,'message':_0x45ca94(0x280),'status':tkysoJ[_0x45ca94(0x339)],'data':{'userId':_0xdb84eb,'token':this[_0x45ca94(0x36f)][_0x45ca94(0x1fd)]}};}catch(_0x264d69){if(_0x1f24cd[_0x45ca94(0x2cd)](_0x45ca94(0x1d1),_0x1f24cd[_0x45ca94(0x377)]))return;else{log[_0x45ca94(0x2d1)]({'err':_0x264d69,'userId':_0x41db96,'voiceUrl':_0x22ab3d[_0x45ca94(0x232)]},_0x1f24cd[_0x45ca94(0x35f)]);const _0x4ef456=JSON[_0x45ca94(0x2b6)]({'msg_type':RongyunMessageTypeEnum[_0x45ca94(0x27e)],'request_id':_0x34fbc2,'content':_0x1f24cd[_0x45ca94(0x1ac)],'sessionId':_0x1f24cd[_0x45ca94(0x341)](_0x55804e,''),'userId':_0x41db96,'status':_0x1f24cd['BJBcd'],'timestamp':Math['floor'](_0x1f24cd[_0x45ca94(0x220)](Date['now'](),0x3e8))});await this[_0x45ca94(0x1f1)][_0x45ca94(0x355)](_0x291bb9,_0x4ef456,_0x971eaf[_0x45ca94(0x188)]);return;}}}if(!_0x527b9e){if(_0x1f24cd[_0x45ca94(0x1cd)](_0x1f24cd['OTNqN'],_0x1f24cd[_0x45ca94(0x2b5)]))_0x4dd458=_0x152336['parse'](_0x4537c8[_0x45ca94(0x31c)]);else{log[_0x45ca94(0x17e)](_0x1f24cd[_0x45ca94(0x1b4)]);return;}}log[_0x45ca94(0x365)]({'userId':_0x41db96,'sessionId':_0x55804e,'contentLength':_0x527b9e['length']},_0x1f24cd[_0x45ca94(0x30f)]);try{const _0x172f45=_0x45ca94(0x18a)+_0x41db96,_0x3bfcfe=await this[_0x45ca94(0x337)]['getOrCreateSession'](_0x172f45,_0x45ca94(0x1bf)+_0x41db96),_0x202a27=_0x971eaf['targetId']||this[_0x45ca94(0x36f)][_0x45ca94(0x294)];this[_0x45ca94(0x337)][_0x45ca94(0x307)](_0x172f45,{'serviceTargetId':_0x202a27}),log[_0x45ca94(0x365)]({'userId':_0x41db96,'sessionId':_0x3bfcfe['id'],'serviceTargetId':_0x202a27},_0x45ca94(0x1d7)),await this[_0x45ca94(0x2f4)][_0x45ca94(0x34e)](_0x3bfcfe['id'],_0x527b9e),log[_0x45ca94(0x365)]({'userId':_0x41db96,'sessionId':_0x3bfcfe['id']},_0x1f24cd['FeFvw']);}catch(_0x11979b){if(_0x1f24cd[_0x45ca94(0x375)](_0x1f24cd[_0x45ca94(0x35d)],_0x45ca94(0x2c7))){log[_0x45ca94(0x2d1)]({'err':_0x11979b,'userId':_0x41db96,'targetId':_0x291bb9},_0x45ca94(0x366));const _0x1bf158=JSON[_0x45ca94(0x2b6)]({'msg_type':RongyunMessageTypeEnum[_0x45ca94(0x27e)],'request_id':_0x34fbc2,'content':_0x1f24cd[_0x45ca94(0x34c)]+(_0x11979b['message']||_0x1f24cd[_0x45ca94(0x315)]),'sessionId':_0x1f24cd['MVXZa'](_0x55804e,''),'userId':_0x41db96,'status':_0x1f24cd['BJBcd'],'timestamp':Math[_0x45ca94(0x290)](_0x1f24cd[_0x45ca94(0x1bd)](Date[_0x45ca94(0x2ee)](),0x3e8))});await this['rongClient']['sendMessage'](_0x291bb9,_0x1bf158,_0x971eaf[_0x45ca94(0x188)]);}else _0x4f5941['warn']({'handlerName':_0x1db765},tkysoJ[_0x45ca94(0x363)]),_0x33f8b4={'code':0x194,'message':_0x45ca94(0x2bc)+_0x5a3f10+'/'+_0x4ee320,'status':tkysoJ['BJBcd']};}}async[a0_0x44204b(0x1de)](_0x4b7163,_0x422df3){const _0x1be0d0=a0_0x44204b,_0xce034f={'kaokL':function(_0x205524,_0x4d2dbe){return _0x205524===_0x4d2dbe;},'bTjjF':_0x1be0d0(0x199),'ZRGUG':_0x1be0d0(0x2f2),'Bqpsa':_0x1be0d0(0x1ae),'rqxZv':_0x1be0d0(0x293),'XNzkX':'Ops\x20assistant\x20failed','loGOb':_0x1be0d0(0x1af),'eIaaA':function(_0x2d2959,_0x340c96){return _0x2d2959+_0x340c96;}},_0x11a93c=_0xce034f[_0x1be0d0(0x270)](_0x422df3[_0x1be0d0(0x188)],0x3)?_0x422df3[_0x1be0d0(0x22b)]:_0x4b7163[_0x1be0d0(0x272)]||_0x4b7163[_0x1be0d0(0x229)]||_0x422df3[_0x1be0d0(0x353)],_0x19e112=_0x4b7163[_0x1be0d0(0x36c)]||_0x4b7163[_0x1be0d0(0x31c)]||'',_0x384725=_0x4b7163['node_id']||_0x4b7163[_0x1be0d0(0x20b)],_0x4695f7=_0x4b7163[_0x1be0d0(0x33c)]||_0x4b7163[_0x1be0d0(0x275)];if(!_0x19e112){log[_0x1be0d0(0x17e)](_0xce034f[_0x1be0d0(0x2bd)]);return;}log[_0x1be0d0(0x365)]({'targetId':_0x11a93c,'nodeId':_0x384725,'contentLength':_0x19e112[_0x1be0d0(0x326)]},'Processing\x20ops\x20chat\x20message');try{const _0x4908ac=await this[_0x1be0d0(0x2c5)][_0x1be0d0(0x267)](_0x1be0d0(0x25e)+_0x11a93c);log['info']({'sessionId':_0x4908ac['id']},_0xce034f['ZRGUG']);const _0x3c5816=await this[_0x1be0d0(0x2c5)][_0x1be0d0(0x348)](_0x4908ac['id'],_0x19e112);log['info']({'targetId':_0x11a93c,'responseLength':_0x3c5816[_0x1be0d0(0x326)]},_0xce034f[_0x1be0d0(0x1f0)]);const _0x12708a=JSON[_0x1be0d0(0x2b6)]({'msg_type':RongyunMessageTypeEnum[_0x1be0d0(0x1f2)],'request_id':_0x4695f7,'reply':_0x3c5816,'node_id':_0x384725||this[_0x1be0d0(0x36f)][_0x1be0d0(0x294)]}),_0x1b99e6=JSON[_0x1be0d0(0x2b6)]({'content':_0x3c5816,'extra':JSON[_0x1be0d0(0x2b6)]({'from_node':this[_0x1be0d0(0x36f)][_0x1be0d0(0x294)],'is_ai':!![],'msg_type':RongyunMessageTypeEnum[_0x1be0d0(0x1f2)],'chat_type':_0xce034f['rqxZv']})});await this[_0x1be0d0(0x1f1)][_0x1be0d0(0x355)](_0x11a93c,_0x12708a,_0x422df3['conversationType']),await this[_0x1be0d0(0x1f1)][_0x1be0d0(0x355)](_0x11a93c,_0x1b99e6,_0x422df3[_0x1be0d0(0x188)]);}catch(_0x328fd2){log['error']({'err':_0x328fd2,'targetId':_0x11a93c},_0xce034f['XNzkX']);const _0x2289cf=JSON['stringify']({'msg_type':RongyunMessageTypeEnum[_0x1be0d0(0x1f2)],'request_id':_0x4695f7,'reply':_0xce034f[_0x1be0d0(0x2cf)]+(_0x328fd2[_0x1be0d0(0x36c)]||'未知错误'),'node_id':_0x384725||this['config'][_0x1be0d0(0x294)]}),_0x35af41=JSON[_0x1be0d0(0x2b6)]({'content':_0xce034f[_0x1be0d0(0x28d)](_0x1be0d0(0x1af),_0x328fd2[_0x1be0d0(0x36c)]||_0x1be0d0(0x1b3)),'extra':JSON[_0x1be0d0(0x2b6)]({'from_node':this[_0x1be0d0(0x36f)][_0x1be0d0(0x294)],'is_ai':!![],'msg_type':RongyunMessageTypeEnum[_0x1be0d0(0x1f2)]})});await this[_0x1be0d0(0x1f1)][_0x1be0d0(0x355)](_0x11a93c,_0x2289cf,_0x422df3[_0x1be0d0(0x188)]),await this[_0x1be0d0(0x1f1)][_0x1be0d0(0x355)](_0x11a93c,_0x35af41,_0x422df3[_0x1be0d0(0x188)]);}}}
|