@quukk/opencode-clawmessenger 0.3.0 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/README.md +71 -623
  2. package/bin/opencode-clawmessenger +2 -2
  3. package/bin/opencode-clawmessenger-setup +5 -5
  4. package/dist/cli.d.ts +0 -1
  5. package/dist/cli.js +1 -288
  6. package/dist/core/auto-register.d.ts +0 -1
  7. package/dist/core/auto-register.js +1 -174
  8. package/dist/core/auto-serve.d.ts +13 -0
  9. package/dist/core/auto-serve.js +1 -0
  10. package/dist/core/config.d.ts +2 -3
  11. package/dist/core/config.js +1 -80
  12. package/dist/core/daemon.d.ts +0 -1
  13. package/dist/core/daemon.js +1 -77
  14. package/dist/core/dedup.d.ts +0 -1
  15. package/dist/core/dedup.js +1 -25
  16. package/dist/core/hook-manager.d.ts +0 -1
  17. package/dist/core/hook-manager.js +1 -33
  18. package/dist/core/logger.d.ts +0 -1
  19. package/dist/core/logger.js +1 -49
  20. package/dist/core/mac-address.d.ts +0 -1
  21. package/dist/core/mac-address.js +1 -43
  22. package/dist/core/message-handler.d.ts +0 -1
  23. package/dist/core/message-handler.js +1 -988
  24. package/dist/core/ops-assistant.d.ts +0 -1
  25. package/dist/core/ops-assistant.js +1 -270
  26. package/dist/core/qr-crypto.d.ts +0 -1
  27. package/dist/core/qr-crypto.js +1 -66
  28. package/dist/core/session-manager.d.ts +0 -1
  29. package/dist/core/session-manager.js +1 -144
  30. package/dist/core/types.d.ts +1 -2
  31. package/dist/core/types.js +1 -26
  32. package/dist/index.d.ts +0 -1
  33. package/dist/index.js +1 -16
  34. package/dist/openclaw/client.d.ts +0 -1
  35. package/dist/openclaw/client.js +1 -494
  36. package/dist/opencode/client.d.ts +0 -1
  37. package/dist/opencode/client.js +1 -279
  38. package/dist/opencode/event-handler.d.ts +0 -1
  39. package/dist/opencode/event-handler.js +1 -467
  40. package/dist/plugin.d.ts +0 -1
  41. package/dist/plugin.js +1 -148
  42. package/dist/rongcloud/client.d.ts +0 -1
  43. package/dist/rongcloud/client.js +1 -292
  44. package/dist/rongcloud/env-polyfill.d.ts +0 -1
  45. package/dist/rongcloud/env-polyfill.js +1 -107
  46. package/dist/rongcloud/server-api.d.ts +0 -1
  47. package/dist/rongcloud/server-api.js +1 -157
  48. package/dist/standalone.d.ts +0 -1
  49. package/dist/standalone.js +1 -229
  50. package/dist/types/plugin.d.ts +0 -1
  51. package/dist/types/plugin.js +1 -2
  52. package/dist/websocket/client.d.ts +0 -1
  53. package/dist/websocket/client.js +1 -88
  54. package/dist/websocket/server-client.d.ts +0 -1
  55. package/dist/websocket/server-client.js +1 -98
  56. package/package.json +83 -81
  57. package/dist/cli.d.ts.map +0 -1
  58. package/dist/cli.js.map +0 -1
  59. package/dist/core/auto-register.d.ts.map +0 -1
  60. package/dist/core/auto-register.js.map +0 -1
  61. package/dist/core/config.d.ts.map +0 -1
  62. package/dist/core/config.js.map +0 -1
  63. package/dist/core/daemon.d.ts.map +0 -1
  64. package/dist/core/daemon.js.map +0 -1
  65. package/dist/core/dedup.d.ts.map +0 -1
  66. package/dist/core/dedup.js.map +0 -1
  67. package/dist/core/hook-manager.d.ts.map +0 -1
  68. package/dist/core/hook-manager.js.map +0 -1
  69. package/dist/core/logger.d.ts.map +0 -1
  70. package/dist/core/logger.js.map +0 -1
  71. package/dist/core/mac-address.d.ts.map +0 -1
  72. package/dist/core/mac-address.js.map +0 -1
  73. package/dist/core/message-handler.d.ts.map +0 -1
  74. package/dist/core/message-handler.js.map +0 -1
  75. package/dist/core/ops-assistant.d.ts.map +0 -1
  76. package/dist/core/ops-assistant.js.map +0 -1
  77. package/dist/core/qr-crypto.d.ts.map +0 -1
  78. package/dist/core/qr-crypto.js.map +0 -1
  79. package/dist/core/session-manager.d.ts.map +0 -1
  80. package/dist/core/session-manager.js.map +0 -1
  81. package/dist/core/types.d.ts.map +0 -1
  82. package/dist/core/types.js.map +0 -1
  83. package/dist/index.d.ts.map +0 -1
  84. package/dist/index.js.map +0 -1
  85. package/dist/openclaw/client.d.ts.map +0 -1
  86. package/dist/openclaw/client.js.map +0 -1
  87. package/dist/opencode/client.d.ts.map +0 -1
  88. package/dist/opencode/client.js.map +0 -1
  89. package/dist/opencode/event-handler.d.ts.map +0 -1
  90. package/dist/opencode/event-handler.js.map +0 -1
  91. package/dist/plugin.d.ts.map +0 -1
  92. package/dist/plugin.js.map +0 -1
  93. package/dist/rongcloud/client.d.ts.map +0 -1
  94. package/dist/rongcloud/client.js.map +0 -1
  95. package/dist/rongcloud/env-polyfill.d.ts.map +0 -1
  96. package/dist/rongcloud/env-polyfill.js.map +0 -1
  97. package/dist/rongcloud/server-api.d.ts.map +0 -1
  98. package/dist/rongcloud/server-api.js.map +0 -1
  99. package/dist/standalone.d.ts.map +0 -1
  100. package/dist/standalone.js.map +0 -1
  101. package/dist/types/plugin.d.ts.map +0 -1
  102. package/dist/types/plugin.js.map +0 -1
  103. package/dist/websocket/client.d.ts.map +0 -1
  104. package/dist/websocket/client.js.map +0 -1
  105. package/dist/websocket/server-client.d.ts.map +0 -1
  106. package/dist/websocket/server-client.js.map +0 -1
@@ -1,988 +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
- // 记录每个群上次获取到的暂停状态,用于检测从暂停恢复
16
- this.groupStoppedPrev = new Map();
17
- this.groupStatusLastFetch = 0;
18
- this.config = config;
19
- this.sessionManager = sessionManager;
20
- this.rongClient = rongClient;
21
- this.opencode = opencode;
22
- // 运维助手使用独立的 OpenCode server(端口19877)
23
- // 优先级:环境变量 CLAW_OPS_OPENCODE_DIR > process.cwd()
24
- const opsDir = process.env.CLAW_OPS_OPENCODE_DIR || process.cwd();
25
- this.opsOpencode = new OpenCodeClient({
26
- baseUrl: 'http://127.0.0.1:19877',
27
- directory: opsDir,
28
- });
29
- this.dedup = new MessageDeduplicator();
30
- this.pendingRequests = new Map();
31
- }
32
- /**
33
- * 从后端查询群组的 OpenClaw 状态(暂停、最大轮数)
34
- */
35
- async fetchGroupStatus(groupId) {
36
- try {
37
- const serverUrl = this.config.serverUrl || process.env.DM_SERVER_URL || 'https://newsradar.dreamdt.cn/im';
38
- const url = `${serverUrl}/api/group/${groupId}/status`;
39
- const response = await axios.get(url, { timeout: 5000 });
40
- if (response.data?.code === 200 && response.data?.data) {
41
- return {
42
- openclawStopped: response.data.data.openclawStopped ?? false,
43
- openclawMaxRounds: response.data.data.openclawMaxRounds ?? 10,
44
- };
45
- }
46
- return null;
47
- }
48
- catch (err) {
49
- log.warn({ groupId, err: err.message }, 'fetchGroupStatus failed');
50
- return null;
51
- }
52
- }
53
- /**
54
- * 检查并更新群聊对话轮数。
55
- * 返回 { allowed: true } 表示可以继续处理;
56
- * 返回 { allowed: false, reason: string } 表示已暂停或达到上限。
57
- */
58
- async checkGroupRoundLimit(groupId) {
59
- // 优先使用缓存,避免频繁请求后端
60
- let status = this.groupStatusCache.get(groupId);
61
- const now = Date.now();
62
- if (!status || now - this.groupStatusLastFetch > GROUP_STATE_CACHE_TTL_MS) {
63
- const fresh = await this.fetchGroupStatus(groupId);
64
- if (fresh) {
65
- status = fresh;
66
- this.groupStatusCache.set(groupId, status);
67
- this.groupStatusLastFetch = now;
68
- }
69
- }
70
- // 如果拿不到状态,使用默认宽松策略(允许继续)
71
- if (!status) {
72
- return { allowed: true };
73
- }
74
- // 检测从暂停恢复到运行:重置轮数计数器,避免恢复后继续旧对话
75
- const prevStopped = this.groupStoppedPrev.get(groupId);
76
- if (prevStopped === true && status.openclawStopped === false) {
77
- log.info({ groupId }, 'Group resumed from stopped state, resetting round counter');
78
- this.groupRoundCounters.set(groupId, { count: 0, lastTimestamp: 0 });
79
- }
80
- this.groupStoppedPrev.set(groupId, status.openclawStopped);
81
- // 检查暂停状态
82
- if (status.openclawStopped) {
83
- return { allowed: false, reason: '群聊已暂停' };
84
- }
85
- // 检查轮数限制
86
- let roundState = this.groupRoundCounters.get(groupId);
87
- if (!roundState) {
88
- roundState = { count: 0, lastTimestamp: 0 };
89
- this.groupRoundCounters.set(groupId, roundState);
90
- }
91
- // 30 秒冷却:超过冷却时间则重置计数器
92
- if (now - roundState.lastTimestamp > ROUND_COOLDOWN_MS) {
93
- roundState.count = 0;
94
- }
95
- if (roundState.count >= status.openclawMaxRounds) {
96
- return { allowed: false, reason: `已达到本轮对话上限 (${status.openclawMaxRounds} 轮)` };
97
- }
98
- return { allowed: true };
99
- }
100
- /**
101
- * 成功处理一条群聊消息后,累加轮数计数器
102
- */
103
- incrementGroupRound(groupId) {
104
- let roundState = this.groupRoundCounters.get(groupId);
105
- if (!roundState) {
106
- roundState = { count: 0, lastTimestamp: 0 };
107
- this.groupRoundCounters.set(groupId, roundState);
108
- }
109
- roundState.count += 1;
110
- roundState.lastTimestamp = Date.now();
111
- log.info({ groupId, count: roundState.count }, 'Group round incremented');
112
- }
113
- /**
114
- * 发送消息给指定用户或群组
115
- * 供 agent 智能体调用,支持:
116
- * - 私聊:sendToUser('userId', '消息内容')
117
- * - 群聊:sendToUser('groupId', '消息内容', { conversationType: 3 })
118
- */
119
- async sendToUser(targetId, content, options = {}) {
120
- const { conversationType = 1, extra } = options;
121
- if (!targetId || !content) {
122
- log.warn({ targetId, hasContent: !!content }, 'sendToUser: 缺少 targetId 或 content');
123
- return { success: false, error: '缺少 targetId 或 content' };
124
- }
125
- try {
126
- let messageContent;
127
- if (extra && Object.keys(extra).length > 0) {
128
- messageContent = JSON.stringify({ content, ...extra });
129
- }
130
- else {
131
- messageContent = content;
132
- }
133
- await this.rongClient.sendMessage(targetId, messageContent, conversationType);
134
- log.info({ targetId, conversationType, contentPreview: content.substring(0, 100) }, 'sendToUser: 消息发送成功');
135
- return { success: true };
136
- }
137
- catch (err) {
138
- log.error({ err, targetId, conversationType }, 'sendToUser: 消息发送失败');
139
- return { success: false, error: err.message || String(err) };
140
- }
141
- }
142
- async handleMessage(msg) {
143
- try {
144
- // 过滤已读回执消息,避免日志噪音
145
- if (msg.messageType === 'RC:ReadNtf') {
146
- log.debug({ messageUId: msg.messageUId, senderUserId: msg.senderUserId }, 'Read receipt notification ignored');
147
- return;
148
- }
149
- if (msg.messageUId && this.dedup.isDuplicate(msg.messageUId)) {
150
- log.debug({ messageUId: msg.messageUId }, 'Duplicate message filtered');
151
- return;
152
- }
153
- // 发送已读回执(fire-and-forget,不阻塞消息处理)
154
- // 在消息去重之后、业务处理之前发送,确保只给实际处理的消息发送已读回执
155
- this.sendReadReceipt(msg);
156
- let msgContent;
157
- if (typeof msg.content === 'string') {
158
- try {
159
- msgContent = JSON.parse(msg.content);
160
- }
161
- catch {
162
- msgContent = { content: msg.content };
163
- }
164
- }
165
- else if (msg.content && typeof msg.content === 'object') {
166
- msgContent = msg.content;
167
- }
168
- else {
169
- return;
170
- }
171
- let innerContent = {};
172
- if (msgContent.content && typeof msgContent.content === 'string') {
173
- try {
174
- innerContent = JSON.parse(msgContent.content);
175
- }
176
- catch {
177
- innerContent = { content: msgContent.content };
178
- }
179
- }
180
- // 兼容驼峰和下划线两种命名方式
181
- // 同时检查 msgContent 和 innerContent 的 msg_type,因为融云消息可能嵌套两层
182
- const customMsgType = msgContent.msg_type || innerContent.msg_type;
183
- const sourceImId = msgContent.source_im_id || msgContent.sourceImId || msg.senderUserId;
184
- const destinationImId = msgContent.destination_im_id || msgContent.destinationImId || msg.targetId;
185
- const requestId = msgContent.request_id || msgContent.requestId;
186
- const merged = {
187
- ...msgContent,
188
- ...innerContent,
189
- request_id: requestId,
190
- source_im_id: sourceImId,
191
- destination_im_id: destinationImId,
192
- };
193
- // 过滤系统通知消息(前端通过 __sys_notify__ 标记发送),避免AI响应
194
- if (msgContent.__sys_notify__ === true || innerContent.__sys_notify__ === true) {
195
- log.debug({ messageType: msg.messageType, text: msgContent.text || innerContent.text }, 'System notification ignored');
196
- return;
197
- }
198
- log.info({
199
- messageType: msg.messageType,
200
- customMsgType,
201
- senderUserId: msg.senderUserId,
202
- targetId: msg.targetId,
203
- contentKeys: Object.keys(msgContent),
204
- hasMsgType: !!msgContent.msg_type,
205
- msgContentPreview: JSON.stringify(msgContent).substring(0, 200)
206
- }, 'Message received details');
207
- switch (customMsgType || msg.messageType) {
208
- case RongyunMessageTypeEnum.CREATE_OPENCODE_SESSION:
209
- case 'create_opencode_session':
210
- await this.handleCreateOpencodeSession(merged, msg);
211
- return;
212
- case 'RC:TxtMsg':
213
- case 'TextMessage':
214
- // RC:TxtMsg = 普通文本消息 → 点点(主OpenCode)
215
- await this.handleChatMessage(merged, msg, customMsgType);
216
- return;
217
- case RongyunMessageTypeEnum.CHAT_MESSAGE:
218
- case 'chat_message':
219
- // chat_message = 普通聊天消息 → 点点(主OpenCode)
220
- await this.handleChatMessage(merged, msg, customMsgType);
221
- return;
222
- case RongyunMessageTypeEnum.DEVICE_STATUS_REQUEST:
223
- case 'device_status_request':
224
- await this.handleDeviceStatusRequest(merged, msg);
225
- return;
226
- case RongyunMessageTypeEnum.DEVICE_CONTROL:
227
- case 'device_control':
228
- await this.handleDeviceControl(merged, msg);
229
- return;
230
- case 'command':
231
- await this.handleCommand(merged, msg);
232
- return;
233
- case RongyunMessageTypeEnum.OPS_CHAT_MESSAGE:
234
- case 'ops_chat_message':
235
- await this.handleOpsChatMessage(merged, msg);
236
- return;
237
- case RongyunMessageTypeEnum.CREATE_SERVICE_SESSION:
238
- case 'create_service_session':
239
- await this.handleCreateServiceSession(merged, msg);
240
- return;
241
- case RongyunMessageTypeEnum.SERVICE_CHAT_MESSAGE:
242
- case 'service_chat_message':
243
- await this.handleServiceChatMessage(merged, msg);
244
- return;
245
- case 'RC:HQVCMsg':
246
- case 'RC:VCMsg':
247
- // 高质量语音消息:先语音识别,再作为文本消息处理
248
- await this.handleVoiceMessage(merged, msg);
249
- return;
250
- case RongyunMessageTypeEnum.DELETE_OPENCODE_SESSION:
251
- case 'delete_opencode_session':
252
- if (merged.session_id) {
253
- this.sessionManager.deleteSession(merged.session_id);
254
- await this.opencode.deleteSession(merged.session_id);
255
- }
256
- return;
257
- case RongyunMessageTypeEnum.COMMAND_RESULT:
258
- case 'command_result':
259
- this.handleCommandResult(merged, msg);
260
- return;
261
- default:
262
- log.warn({ messageType: msg.messageType, customMsgType }, 'Unknown message type');
263
- }
264
- }
265
- catch (err) {
266
- log.error({ err }, '处理消息异常');
267
- try {
268
- const targetId = msg.conversationType === 3 ? msg.targetId : msg.senderUserId;
269
- // 不发送错误消息给 system 等虚拟用户(融云 20604 错误)
270
- if (targetId && targetId !== 'system') {
271
- const errorPayload = JSON.stringify({
272
- content: '处理失败,请稍后重试',
273
- extra: JSON.stringify({
274
- from_node: this.config.accountId,
275
- is_ai: true,
276
- }),
277
- });
278
- await this.rongClient.sendMessage(targetId, errorPayload, msg.conversationType);
279
- }
280
- }
281
- catch { }
282
- }
283
- }
284
- /**
285
- * 发送已读回执(fire-and-forget,不阻塞消息处理)
286
- * 在 handleMessage 入口处调用,支持单聊和群聊
287
- */
288
- sendReadReceipt(msg) {
289
- // 跳过自己的消息
290
- if (msg.messageDirection === 1) {
291
- return;
292
- }
293
- // 需要有效的消息 UID 和时间戳
294
- if (!msg.messageUId || !msg.sentTime) {
295
- log.debug({ messageUId: msg.messageUId, sentTime: msg.sentTime }, 'Skip read receipt: invalid messageUId or sentTime');
296
- return;
297
- }
298
- // 本地生成的 messageUId 无法发送已读回执(已在 client.ts 过滤,此处二次保险)
299
- if (String(msg.messageUId).startsWith('local-')) {
300
- log.debug({ messageUId: msg.messageUId }, 'Skip read receipt: local messageUId');
301
- return;
302
- }
303
- // fire-and-forget:不 await,避免阻塞消息处理
304
- this.rongClient.sendReadReceipt(msg).catch((err) => {
305
- log.warn({ err, messageUId: msg.messageUId }, 'Failed to send read receipt');
306
- });
307
- }
308
- async handleChatMessage(data, msg, originalMsgType) {
309
- const isGroup = msg.conversationType === 3;
310
- // 群聊时使用 group_<groupId> 作为 chatId,让 event-handler 正确识别为群聊并回复到群里
311
- const chatId = isGroup ? `group_${msg.targetId}` : `claw-${msg.senderUserId}`;
312
- const sessionId = data?.session_id || chatId;
313
- // 跳过自己发送的消息,避免自循环
314
- if (msg.senderUserId === this.config.accountId) {
315
- log.debug({ chatId, sessionId }, 'Skipping self-sent message');
316
- return;
317
- }
318
- let content = '';
319
- if (data?.content) {
320
- content = typeof data.content === 'string' ? data.content : (data.content.content || JSON.stringify(data.content));
321
- }
322
- else if (data?._raw_content) {
323
- content = typeof data._raw_content === 'string' ? data._raw_content : JSON.stringify(data._raw_content);
324
- }
325
- if (!content) {
326
- log.warn('Chat message content is empty');
327
- return;
328
- }
329
- // 判断是否是设备对话:有 room_id 表示来自 device-chat.vue
330
- const isDeviceChat = !!data?.room_id;
331
- if (isDeviceChat) {
332
- log.info({ sessionId, roomId: data.room_id }, 'Device chat detected, routing to ops assistant');
333
- await this.handleDeviceChat(data, msg, content);
334
- return;
335
- }
336
- // 群聊 @ 判断逻辑
337
- if (isGroup) {
338
- // 从多个可能的位置提取 mentionedInfo(msg.content 可能是字符串或对象)
339
- let msgContentMentioned;
340
- if (msg.content && typeof msg.content === 'object') {
341
- msgContentMentioned = msg.content.mentionedInfo || msg.content.mentioned_info;
342
- }
343
- else if (typeof msg.content === 'string') {
344
- try {
345
- const parsed = JSON.parse(msg.content);
346
- msgContentMentioned = parsed.mentionedInfo || parsed.mentioned_info;
347
- }
348
- catch { }
349
- }
350
- const mentionedInfo = data?.mentionedInfo || data?.mentioned_info || msgContentMentioned;
351
- log.info({
352
- sessionId,
353
- chatId,
354
- content,
355
- mentionedInfo: JSON.stringify(mentionedInfo),
356
- dataKeys: Object.keys(data || {}),
357
- accountId: this.config.accountId
358
- }, 'Group chat mention check');
359
- if (mentionedInfo) {
360
- const userIdList = mentionedInfo.userIdList || mentionedInfo.user_id_list || [];
361
- // 融云 @所有人 的判断:userIdList 为空数组(无论 type 是 1 还是 2)
362
- // 实际测试发现 @所有人 时 type=1 且 userIdList=[],@特定用户时 type=2 且有具体 userId
363
- const isAllMentioned = !userIdList || userIdList.length === 0;
364
- const isMentioned = isAllMentioned || userIdList.includes(this.config.accountId);
365
- log.info({
366
- userIdList,
367
- isAllMentioned,
368
- isMentioned,
369
- accountId: this.config.accountId
370
- }, 'Mention check result');
371
- if (!isMentioned) {
372
- // @了别的用户,当前 AI 不回复
373
- log.info('Not mentioned, skipping group chat reply');
374
- return;
375
- }
376
- }
377
- // 没有 @ 任何人,或者 @ 了当前 AI,继续处理
378
- }
379
- // 群聊:检查暂停状态与对话轮数限制
380
- if (isGroup) {
381
- const roundCheck = await this.checkGroupRoundLimit(msg.targetId);
382
- if (!roundCheck.allowed) {
383
- log.info({ groupId: msg.targetId, reason: roundCheck.reason }, 'Group chat blocked by round limit or pause');
384
- // 静默丢弃,不发送任何回复,避免回复消息触发下一轮处理形成死循环
385
- return;
386
- }
387
- }
388
- log.info({ sessionId, chatId, isGroup, contentLength: content.length }, 'Processing chat message');
389
- this.sessionManager.updateStatus(chatId, 'busy');
390
- try {
391
- const session = await this.sessionManager.getOrCreateSession(chatId, `ClawMessenger ${isGroup ? msg.targetId : msg.senderUserId}`);
392
- const isChatMessage = originalMsgType === 'chat_message' || originalMsgType === RongyunMessageTypeEnum.CHAT_MESSAGE;
393
- // 使用异步模式,通过 SSE 事件流实时推送回复
394
- // OpenCode 会自动加载 directory 下的 .opencode/prompt.md 作为 system prompt
395
- await this.opencode.sendPromptAsync(session.id, content);
396
- log.info({ sessionId, chatId, opencodeSessionId: session.id }, 'promptAsync sent, streaming via SSE');
397
- // 群聊:成功调用后累加轮数
398
- if (isGroup) {
399
- this.incrementGroupRound(msg.targetId);
400
- }
401
- }
402
- catch (err) {
403
- log.error({ err, sessionId, chatId }, '处理聊天消息失败');
404
- this.sessionManager.updateStatus(chatId, 'idle');
405
- try {
406
- const errorPayload = JSON.stringify({
407
- content: '消息处理失败,请稍后重试',
408
- extra: JSON.stringify({
409
- from_node: this.config.accountId,
410
- is_ai: true,
411
- }),
412
- });
413
- await this.rongClient.sendMessage(msg.conversationType === 3 ? msg.targetId : msg.senderUserId, errorPayload, msg.conversationType);
414
- }
415
- catch { }
416
- }
417
- }
418
- async handleDeviceChat(data, msg, content) {
419
- const roomId = data.room_id;
420
- const requestId = data.request_id || data.requestId;
421
- const targetId = data.source_im_id || data.sourceImId || msg.senderUserId;
422
- log.info({ roomId, targetId, contentLength: content.length }, 'Processing device chat via ops assistant');
423
- try {
424
- // 使用运维助手 OpenCodeClient(19877)同步获取回复
425
- const session = await this.opsOpencode.createSession(`Device-${roomId}`);
426
- log.info({ sessionId: session.id, roomId }, 'Created ops session for device chat');
427
- const response = await this.opsOpencode.sendPrompt(session.id, content);
428
- log.info({ roomId, responseLength: response.length }, 'Ops assistant responded for device chat');
429
- // 以 CHAT_MESSAGE 类型回复(匹配前端 device-rongyun-client 预期)
430
- const replyPayload = JSON.stringify({
431
- msg_type: RongyunMessageTypeEnum.CHAT_MESSAGE,
432
- request_id: requestId,
433
- content: response,
434
- status: 'success',
435
- room_id: roomId,
436
- });
437
- await this.rongClient.sendMessage(targetId, replyPayload, msg.conversationType);
438
- log.info({ targetId, roomId }, 'Device chat reply sent as CHAT_MESSAGE');
439
- }
440
- catch (err) {
441
- log.error({ err, roomId, targetId }, 'Device chat ops assistant failed');
442
- // 发送错误回复
443
- const errorPayload = JSON.stringify({
444
- msg_type: RongyunMessageTypeEnum.CHAT_MESSAGE,
445
- request_id: requestId,
446
- content: '运维助手处理失败: ' + (err.message || '未知错误'),
447
- status: 'error',
448
- room_id: roomId,
449
- });
450
- await this.rongClient.sendMessage(targetId, errorPayload, msg.conversationType);
451
- }
452
- }
453
- async handleCreateOpencodeSession(data, msg) {
454
- // 群聊(conversationType=3)时 targetId 是群ID,单聊时使用 source_im_id
455
- const targetId = msg.conversationType === 3
456
- ? msg.targetId
457
- : (data.source_im_id || data.sourceImId);
458
- const title = data.title || '新会话';
459
- try {
460
- const sessionId = `claw-${targetId}`;
461
- const session = await this.sessionManager.getOrCreateSession(sessionId, title);
462
- const response = {
463
- msg_type: RongyunMessageTypeEnum.OPENCODE_SESSION_CREATED,
464
- request_id: data.request_id,
465
- source_im_id: data.destination_im_id || msg.targetId,
466
- destination_im_id: targetId,
467
- content: JSON.stringify({ status: 'success', opencode_session_id: session.id, session_id: sessionId, title }),
468
- timestamp: Math.floor(Date.now() / 1000),
469
- };
470
- await this.rongClient.sendMessage(targetId, JSON.stringify(response), msg.conversationType);
471
- }
472
- catch (err) {
473
- log.error({ err }, '创建 OpenCode 会话失败');
474
- const errorResponse = {
475
- msg_type: RongyunMessageTypeEnum.OPENCODE_SESSION_CREATED,
476
- request_id: data.request_id,
477
- source_im_id: data.destination_im_id || msg.targetId,
478
- destination_im_id: targetId,
479
- content: JSON.stringify({ status: 'error', message: err.message }),
480
- timestamp: Math.floor(Date.now() / 1000),
481
- };
482
- await this.rongClient.sendMessage(targetId, JSON.stringify(errorResponse), msg.conversationType);
483
- }
484
- }
485
- async handleDeviceStatusRequest(data, msg) {
486
- // 群聊(conversationType=3)时 targetId 是群ID,单聊时是发送者ID
487
- const targetId = msg.conversationType === 3
488
- ? msg.targetId
489
- : (data.source_im_id || data.sourceImId || msg.senderUserId);
490
- log.info({ targetId, opencodeUrl: this.config.opencodeUrl }, 'Processing device status request');
491
- try {
492
- const opencodeOk = await checkOpencodeStatus(this.config.opencodeUrl, this.config.opencodePassword);
493
- log.info({ opencodeOk }, 'OpenCode status check result');
494
- const statusData = {
495
- open_claw_status: opencodeOk ? 1 : 0,
496
- status_message: opencodeOk ? '运行中' : '未运行',
497
- version: 'unknown',
498
- timestamp: Date.now(),
499
- };
500
- const report = {
501
- msg_type: RongyunMessageTypeEnum.DEVICE_STATUS_REPORT,
502
- request_id: data.request_id,
503
- source_im_id: this.config.accountId,
504
- destination_im_id: targetId,
505
- content: JSON.stringify(statusData),
506
- timestamp: Math.floor(Date.now() / 1000),
507
- };
508
- await this.rongClient.sendMessage(targetId, JSON.stringify(report), msg.conversationType);
509
- log.info({ targetId, status: statusData.status_message }, 'Device status report sent');
510
- }
511
- catch (err) {
512
- log.error({ err: err.message || err, targetId }, '设备状态查询异常');
513
- // 发送错误回复
514
- const errorReport = {
515
- msg_type: RongyunMessageTypeEnum.DEVICE_STATUS_REPORT,
516
- request_id: data.request_id,
517
- source_im_id: this.config.accountId,
518
- destination_im_id: targetId,
519
- content: JSON.stringify({
520
- open_claw_status: -1,
521
- status_message: '状态查询失败: ' + (err.message || '未知错误'),
522
- timestamp: Date.now(),
523
- }),
524
- timestamp: Math.floor(Date.now() / 1000),
525
- };
526
- try {
527
- await this.rongClient.sendMessage(targetId, JSON.stringify(errorReport), msg.conversationType);
528
- }
529
- catch (sendErr) {
530
- log.error({ sendErr }, 'Failed to send device status error report');
531
- }
532
- }
533
- }
534
- async handleDeviceControl(data, msg) {
535
- // 群聊(conversationType=3)时 targetId 是群ID,单聊时是发送者ID
536
- const targetId = msg.conversationType === 3
537
- ? msg.targetId
538
- : (data.source_im_id || data.sourceImId || msg.senderUserId);
539
- // 解析 content 字段中的 JSON(文档规范:content 包含 {"cmd": 1})
540
- let commandContent = {};
541
- try {
542
- if (data.content && typeof data.content === 'string') {
543
- commandContent = JSON.parse(data.content);
544
- }
545
- else if (data.content && typeof data.content === 'object') {
546
- commandContent = data.content;
547
- }
548
- }
549
- catch {
550
- commandContent = {};
551
- }
552
- const cmd = commandContent.cmd;
553
- const cmdNames = {
554
- 1: 'start',
555
- 2: 'stop',
556
- 3: 'restart',
557
- 4: 'status',
558
- 5: 'config_fix',
559
- };
560
- const cmdName = cmdNames[cmd] || `unknown(${cmd})`;
561
- log.info({ targetId, cmd, cmdName }, 'Processing device control');
562
- const result = {
563
- msg_type: RongyunMessageTypeEnum.DEVICE_CONTROL_RESULT,
564
- request_id: data.request_id,
565
- command: cmdName,
566
- cmd: cmd,
567
- status: 'success',
568
- message: `命令 ${cmdName} 已接收`,
569
- timestamp: Math.floor(Date.now() / 1000),
570
- };
571
- await this.rongClient.sendMessage(targetId, JSON.stringify(result), msg.conversationType);
572
- }
573
- async handleCommand(data, msg) {
574
- // 如果 command 消息中嵌套了其他 msg_type,路由到对应的 handler
575
- const nestedMsgType = data.msg_type;
576
- if (nestedMsgType && nestedMsgType !== 'command' && nestedMsgType !== RongyunMessageTypeEnum.COMMAND) {
577
- log.info({ nestedMsgType }, 'Command message contains nested msg_type, routing');
578
- switch (nestedMsgType) {
579
- case RongyunMessageTypeEnum.OPS_CHAT_MESSAGE:
580
- case 'ops_chat_message':
581
- await this.handleOpsChatMessage(data, msg);
582
- return;
583
- case RongyunMessageTypeEnum.DEVICE_CONTROL:
584
- case 'device_control':
585
- await this.handleDeviceControl(data, msg);
586
- return;
587
- case RongyunMessageTypeEnum.DEVICE_STATUS_REQUEST:
588
- case 'device_status_request':
589
- await this.handleDeviceStatusRequest(data, msg);
590
- return;
591
- case RongyunMessageTypeEnum.COMMAND_RESULT:
592
- case 'command_result':
593
- this.handleCommandResult(data, msg);
594
- return;
595
- }
596
- }
597
- // 支持两种格式:requestId(驼峰)和 request_id(下划线)
598
- const requestId = data.requestId || data.request_id;
599
- const service = data.service;
600
- const action = data.action;
601
- const payload = data.payload || {};
602
- const sourceId = data.source_im_id || data.sourceImId || msg.senderUserId;
603
- const destinationId = data.destination_im_id || data.destinationImId || msg.targetId;
604
- // 过滤无效命令:service/action 为空时不处理(避免回复给 system 等虚拟用户)
605
- if (!service || !action) {
606
- log.debug({ requestId, senderUserId: msg.senderUserId }, 'Skipping command with empty service/action');
607
- return;
608
- }
609
- log.info({ requestId, service, action }, 'Handling command');
610
- // 动态路由:_handle_{service}_{action}
611
- const handlerName = `_handle_${service}_${action}`;
612
- let result;
613
- try {
614
- if (typeof this[handlerName] === 'function') {
615
- result = await this[handlerName](payload, sourceId);
616
- }
617
- else {
618
- log.warn({ handlerName }, 'Command handler not found');
619
- result = {
620
- code: 404,
621
- message: `Unknown service/action: ${service}/${action}`,
622
- status: 'error',
623
- };
624
- }
625
- }
626
- catch (err) {
627
- log.error({ err, handlerName }, 'Command handler error');
628
- result = {
629
- code: 500,
630
- message: err.message || 'Internal server error',
631
- status: 'error',
632
- };
633
- }
634
- const response = {
635
- msg_type: RongyunMessageTypeEnum.COMMAND_RESULT,
636
- requestId: requestId,
637
- service: service,
638
- action: action,
639
- status: result.status || 'success',
640
- code: result.code || 200,
641
- data: result.data || null,
642
- message: result.message || 'success',
643
- timestamp: Date.now(),
644
- };
645
- await this.rongClient.sendMessage(sourceId, JSON.stringify(response), msg.conversationType);
646
- }
647
- /**
648
- * 处理 command_result 消息(响应回调)
649
- * 用于语音识别等异步操作的响应
650
- */
651
- handleCommandResult(data, msg) {
652
- const requestId = data.requestId || data.request_id;
653
- if (!requestId) {
654
- log.warn('Command result missing requestId');
655
- return;
656
- }
657
- const pending = this.pendingRequests.get(requestId);
658
- if (!pending) {
659
- log.warn({ requestId }, 'No pending request found for command result');
660
- return;
661
- }
662
- clearTimeout(pending.timer);
663
- this.pendingRequests.delete(requestId);
664
- if (data.status === 'success' && data.code === 200) {
665
- pending.resolve(data.data);
666
- }
667
- else {
668
- pending.reject(new Error(data.message || '语音识别失败'));
669
- }
670
- log.info({ requestId, status: data.status, code: data.code }, 'Command result processed');
671
- }
672
- // ========== Command Handlers ==========
673
- async _handle_user_getInfo(payload, fromUserId) {
674
- return {
675
- code: 200,
676
- message: 'success',
677
- status: 'success',
678
- data: {
679
- userId: fromUserId,
680
- username: 'user',
681
- nickname: 'User',
682
- portraitUri: '',
683
- phone: '',
684
- email: '',
685
- signature: '',
686
- gender: '',
687
- birthday: '',
688
- status: 'active',
689
- },
690
- };
691
- }
692
- async _handle_user_login(payload, fromUserId) {
693
- return {
694
- code: 200,
695
- message: 'Login successful',
696
- status: 'success',
697
- data: {
698
- userId: fromUserId,
699
- token: this.config.token,
700
- },
701
- };
702
- }
703
- async _handle_claw_getStatus(payload, fromUserId) {
704
- const isRunning = this.opencode !== null;
705
- return {
706
- code: 200,
707
- message: 'success',
708
- status: 'success',
709
- data: {
710
- nodeId: this.config.accountId,
711
- status: isRunning ? 'online' : 'offline',
712
- openclawUrl: this.config.opencodeUrl,
713
- version: '1.0.0',
714
- },
715
- };
716
- }
717
- async _handle_claw_start(payload, fromUserId) {
718
- return {
719
- code: 200,
720
- message: 'Node started',
721
- status: 'success',
722
- data: { nodeId: this.config.accountId, status: 'online' },
723
- };
724
- }
725
- async _handle_claw_stop(payload, fromUserId) {
726
- return {
727
- code: 200,
728
- message: 'Node stopped',
729
- status: 'success',
730
- data: { nodeId: this.config.accountId, status: 'offline' },
731
- };
732
- }
733
- async _handle_system_getConfig(payload, fromUserId) {
734
- return {
735
- code: 200,
736
- message: 'success',
737
- status: 'success',
738
- data: {
739
- appKey: this.config.appKey,
740
- serverUrl: this.config.serverUrl,
741
- },
742
- };
743
- }
744
- async handleCreateServiceSession(data, msg) {
745
- const userId = data.userId || data.user_id || msg.senderUserId;
746
- const targetId = msg.senderUserId;
747
- const requestId = data.request_id || data.requestId;
748
- log.info({ userId, targetId, requestId }, 'Processing create service session');
749
- try {
750
- const chatId = `service-${userId}`;
751
- const session = await this.sessionManager.getOrCreateSession(chatId, `客服会话 ${userId}`);
752
- const response = {
753
- msg_type: RongyunMessageTypeEnum.SERVICE_SESSION_CREATED,
754
- request_id: requestId,
755
- userId: userId,
756
- sessionId: session.id,
757
- status: 'success',
758
- message: '客服会话创建成功',
759
- timestamp: Math.floor(Date.now() / 1000),
760
- };
761
- await this.rongClient.sendMessage(targetId, JSON.stringify(response), msg.conversationType);
762
- log.info({ userId, sessionId: session.id }, 'Service session created');
763
- }
764
- catch (err) {
765
- log.error({ err, userId }, '创建客服会话失败');
766
- const errorResponse = {
767
- msg_type: RongyunMessageTypeEnum.SERVICE_SESSION_CREATED,
768
- request_id: requestId,
769
- userId: userId,
770
- status: 'error',
771
- message: err.message || '创建会话失败',
772
- timestamp: Math.floor(Date.now() / 1000),
773
- };
774
- await this.rongClient.sendMessage(targetId, JSON.stringify(errorResponse), msg.conversationType);
775
- }
776
- }
777
- /**
778
- * 语音识别:通过融云 command 消息发送识别请求,等待 command_result 响应
779
- * 不再使用 HTTP 调用,改为 RongCloud 消息通道
780
- */
781
- async _recognizeVoice(voiceUrl) {
782
- const requestId = `vr_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
783
- return new Promise((resolve, reject) => {
784
- // 30秒超时
785
- const timer = setTimeout(() => {
786
- this.pendingRequests.delete(requestId);
787
- reject(new Error('语音识别请求超时'));
788
- }, 30000);
789
- this.pendingRequests.set(requestId, { resolve, reject, timer });
790
- const commandPayload = {
791
- msg_type: RongyunMessageTypeEnum.COMMAND,
792
- requestId: requestId,
793
- service: 'ai',
794
- action: 'recognizeVoice',
795
- payload: {
796
- voiceUrl: voiceUrl,
797
- format: 'm4a',
798
- sampleRate: 16000,
799
- },
800
- timestamp: Date.now(),
801
- };
802
- // 发送给 system 用户(Python server 端处理)
803
- this.rongClient.sendMessage('system', JSON.stringify(commandPayload), 1)
804
- .then(() => {
805
- log.info({ requestId, voiceUrl }, 'Voice recognition command sent via RongCloud');
806
- })
807
- .catch((err) => {
808
- clearTimeout(timer);
809
- this.pendingRequests.delete(requestId);
810
- log.error({ err: err.message, requestId }, 'Failed to send voice recognition command');
811
- reject(new Error('发送语音识别请求失败: ' + (err.message || '未知错误')));
812
- });
813
- }).then((data) => {
814
- const text = data?.text || data?.result || '';
815
- if (!text) {
816
- throw new Error('语音识别结果为空');
817
- }
818
- log.info({ voiceUrl, recognizedTextPreview: text.substring(0, 100) }, 'Voice recognized via RongCloud');
819
- return text;
820
- });
821
- }
822
- /**
823
- * 处理语音消息:先语音识别,再作为文本消息处理
824
- */
825
- async handleVoiceMessage(data, msg) {
826
- const voiceUrl = data.remoteUrl || data.remote_url || data.url;
827
- const duration = data.duration || 0;
828
- if (!voiceUrl) {
829
- log.warn({ messageType: msg.messageType }, 'Voice message missing remoteUrl');
830
- return;
831
- }
832
- log.info({ voiceUrl, duration, senderUserId: msg.senderUserId }, 'Processing voice message');
833
- try {
834
- // 语音识别
835
- const recognizedText = await this._recognizeVoice(voiceUrl);
836
- log.info({ voiceUrl, recognizedText }, 'Voice recognized successfully');
837
- // 将识别结果作为文本消息处理
838
- const textData = {
839
- ...data,
840
- content: recognizedText,
841
- _raw_content: recognizedText,
842
- voiceUrl: voiceUrl,
843
- voiceDuration: duration,
844
- };
845
- await this.handleChatMessage(textData, msg, msg.messageType);
846
- }
847
- catch (err) {
848
- log.error({ err: err.message, voiceUrl }, 'Voice recognition failed');
849
- // 发送错误提示给用户
850
- const errorPayload = JSON.stringify({
851
- content: '语音消息识别失败,请稍后重试或发送文字消息',
852
- extra: JSON.stringify({
853
- from_node: this.config.accountId,
854
- is_ai: true,
855
- is_error: true,
856
- }),
857
- });
858
- try {
859
- await this.rongClient.sendMessage(msg.senderUserId, errorPayload, msg.conversationType);
860
- }
861
- catch (sendErr) {
862
- log.error({ sendErr }, 'Failed to send voice recognition error message');
863
- }
864
- }
865
- }
866
- async handleServiceChatMessage(data, msg) {
867
- const userId = data.userId || data.user_id || msg.senderUserId;
868
- const sessionId = data.sessionId || data.session_id;
869
- let content = data.content || '';
870
- const targetId = msg.senderUserId;
871
- const requestId = data.request_id || data.requestId;
872
- // 处理语音消息:如果有 voiceUrl,先进行语音识别
873
- if (data.voiceUrl && !content) {
874
- try {
875
- content = await this._recognizeVoice(data.voiceUrl);
876
- log.info({ userId, voiceUrl: data.voiceUrl, recognizedLength: content.length }, 'Voice message recognized');
877
- }
878
- catch (err) {
879
- log.error({ err, userId, voiceUrl: data.voiceUrl }, 'Voice recognition failed for service chat');
880
- const errorPayload = JSON.stringify({
881
- msg_type: RongyunMessageTypeEnum.SERVICE_CHAT_RESPONSE,
882
- request_id: requestId,
883
- content: '语音消息识别失败,请稍后重试或发送文字消息',
884
- sessionId: sessionId || '',
885
- userId: userId,
886
- status: 'error',
887
- timestamp: Math.floor(Date.now() / 1000),
888
- });
889
- await this.rongClient.sendMessage(targetId, errorPayload, msg.conversationType);
890
- return;
891
- }
892
- }
893
- if (!content) {
894
- log.warn('Service chat message content is empty');
895
- return;
896
- }
897
- log.info({ userId, sessionId, contentLength: content.length }, 'Processing service chat message');
898
- try {
899
- const chatId = `service-${userId}`;
900
- const session = await this.sessionManager.getOrCreateSession(chatId, `客服会话 ${userId}`);
901
- // 保存客服目标账号ID到 session,供 event-handler 发送回复时使用
902
- // 这样客服回复的 fromUserId 会是客服账号,而不是当前节点ID
903
- const serviceTargetId = msg.targetId || this.config.accountId;
904
- this.sessionManager.updateExtra(chatId, { serviceTargetId });
905
- log.info({ userId, sessionId: session.id, serviceTargetId }, 'Service session created with targetId');
906
- // 使用异步模式触发 SSE 流式输出,由 event-handler 处理流式消息发送
907
- // 最终回复会在 session.idle 时以 service_chat_response 格式发送
908
- await this.opencode.sendPromptAsync(session.id, content);
909
- log.info({ userId, sessionId: session.id }, 'Service promptAsync sent, streaming via SSE');
910
- }
911
- catch (err) {
912
- log.error({ err, userId, targetId }, 'Service assistant failed');
913
- const errorPayload = JSON.stringify({
914
- msg_type: RongyunMessageTypeEnum.SERVICE_CHAT_RESPONSE,
915
- request_id: requestId,
916
- content: '客服处理失败: ' + (err.message || '未知错误'),
917
- sessionId: sessionId || '',
918
- userId: userId,
919
- status: 'error',
920
- timestamp: Math.floor(Date.now() / 1000),
921
- });
922
- await this.rongClient.sendMessage(targetId, errorPayload, msg.conversationType);
923
- }
924
- }
925
- async handleOpsChatMessage(data, msg) {
926
- // 群聊(conversationType=3)时 targetId 是群ID,单聊时是发送者ID
927
- const targetId = msg.conversationType === 3
928
- ? msg.targetId
929
- : (data.source_im_id || data.sourceImId || msg.senderUserId);
930
- const content = data.message || data.content || '';
931
- const nodeId = data.node_id || data.nodeId;
932
- const requestId = data.request_id || data.requestId;
933
- if (!content) {
934
- log.warn('Ops chat message content is empty');
935
- return;
936
- }
937
- log.info({ targetId, nodeId, contentLength: content.length }, 'Processing ops chat message');
938
- try {
939
- // 使用独立的运维 OpenCodeClient(19877)发送消息
940
- // 通过 API 显式传递 system prompt,确保加载运维助手人设
941
- const session = await this.opsOpencode.createSession(`Ops-${targetId}`);
942
- log.info({ sessionId: session.id }, 'Created ops session');
943
- const response = await this.opsOpencode.sendPrompt(session.id, content);
944
- log.info({ targetId, responseLength: response.length }, 'Ops assistant responded');
945
- // 发送自定义消息回复: 按照规范包装 AI 回复
946
- // 同时发送 TextMessage 确保前端兼容显示
947
- const replyPayload = JSON.stringify({
948
- msg_type: RongyunMessageTypeEnum.OPS_CHAT_RESPONSE,
949
- request_id: requestId,
950
- reply: response,
951
- node_id: nodeId || this.config.accountId,
952
- });
953
- // TextMessage 用于前端显示(RCUIKit 聊天组件兼容)
954
- const textPayload = JSON.stringify({
955
- content: response,
956
- extra: JSON.stringify({
957
- from_node: this.config.accountId,
958
- is_ai: true,
959
- msg_type: RongyunMessageTypeEnum.OPS_CHAT_RESPONSE,
960
- chat_type: 'ops',
961
- }),
962
- });
963
- // 先发自定义消息,再发 TextMessage
964
- await this.rongClient.sendMessage(targetId, replyPayload, msg.conversationType);
965
- await this.rongClient.sendMessage(targetId, textPayload, msg.conversationType);
966
- }
967
- catch (err) {
968
- log.error({ err, targetId }, 'Ops assistant failed');
969
- const errorReply = JSON.stringify({
970
- msg_type: RongyunMessageTypeEnum.OPS_CHAT_RESPONSE,
971
- request_id: requestId,
972
- reply: '运维助手处理失败: ' + (err.message || '未知错误'),
973
- node_id: nodeId || this.config.accountId,
974
- });
975
- const errorTextPayload = JSON.stringify({
976
- content: '运维助手处理失败: ' + (err.message || '未知错误'),
977
- extra: JSON.stringify({
978
- from_node: this.config.accountId,
979
- is_ai: true,
980
- msg_type: RongyunMessageTypeEnum.OPS_CHAT_RESPONSE,
981
- }),
982
- });
983
- await this.rongClient.sendMessage(targetId, errorReply, msg.conversationType);
984
- await this.rongClient.sendMessage(targetId, errorTextPayload, msg.conversationType);
985
- }
986
- }
987
- }
988
- //# sourceMappingURL=message-handler.js.map
1
+ const a0_0x43e8cf=a0_0x580b;(function(_0x5d305c,_0x551979){const _0x5b85f9=a0_0x580b,_0x39e8cc=_0x5d305c();while(!![]){try{const _0x56aaae=parseInt(_0x5b85f9(0x375))/0x1*(parseInt(_0x5b85f9(0x1a1))/0x2)+-parseInt(_0x5b85f9(0x23d))/0x3*(-parseInt(_0x5b85f9(0x222))/0x4)+parseInt(_0x5b85f9(0x173))/0x5+-parseInt(_0x5b85f9(0x28e))/0x6+parseInt(_0x5b85f9(0x381))/0x7*(parseInt(_0x5b85f9(0x1db))/0x8)+-parseInt(_0x5b85f9(0x282))/0x9+parseInt(_0x5b85f9(0x330))/0xa*(parseInt(_0x5b85f9(0x2b7))/0xb);if(_0x56aaae===_0x551979)break;else _0x39e8cc['push'](_0x39e8cc['shift']());}catch(_0x223c0d){_0x39e8cc['push'](_0x39e8cc['shift']());}}}(a0_0x3f20,0xbd6fc));function a0_0x580b(_0x1f363f,_0x53c893){_0x1f363f=_0x1f363f-0x171;const _0x3f2047=a0_0x3f20();let _0x580b96=_0x3f2047[_0x1f363f];if(a0_0x580b['tKuxbX']===undefined){var _0x2c3d55=function(_0x10a05d){const _0x2c060e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4945eb='',_0x421195='';for(let _0x6d4117=0x0,_0x198fe5,_0x336c5b,_0x4d777f=0x0;_0x336c5b=_0x10a05d['charAt'](_0x4d777f++);~_0x336c5b&&(_0x198fe5=_0x6d4117%0x4?_0x198fe5*0x40+_0x336c5b:_0x336c5b,_0x6d4117++%0x4)?_0x4945eb+=String['fromCharCode'](0xff&_0x198fe5>>(-0x2*_0x6d4117&0x6)):0x0){_0x336c5b=_0x2c060e['indexOf'](_0x336c5b);}for(let _0x379ebc=0x0,_0x2ee864=_0x4945eb['length'];_0x379ebc<_0x2ee864;_0x379ebc++){_0x421195+='%'+('00'+_0x4945eb['charCodeAt'](_0x379ebc)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x421195);};a0_0x580b['VkOQwN']=_0x2c3d55,a0_0x580b['ymXfGj']={},a0_0x580b['tKuxbX']=!![];}const _0x496cdc=_0x3f2047[0x0],_0x514d5d=_0x1f363f+_0x496cdc,_0x47c75f=a0_0x580b['ymXfGj'][_0x514d5d];return!_0x47c75f?(_0x580b96=a0_0x580b['VkOQwN'](_0x580b96),a0_0x580b['ymXfGj'][_0x514d5d]=_0x580b96):_0x580b96=_0x47c75f,_0x580b96;}import{RongyunMessageTypeEnum}from'./types.js';import{MessageDeduplicator}from'./dedup.js';import{OpenCodeClient,checkOpencodeStatus}from'../opencode/client.js';import{createLogger}from'./logger.js';import a0_0x563723 from'axios';const log=createLogger(a0_0x43e8cf(0x20b)),ROUND_COOLDOWN_MS=0x7530,GROUP_STATE_CACHE_TTL_MS=0x7530;function a0_0x3f20(){const _0x36ebb5=['uhjVy2vZC2LUzYbJCMvHDguGC2vYDMLJzsbZzxnZAw9U','AxnOt1y','vfDtBNi','CMvZB2X2zq','y29UDMvYC2f0Aw9UvhLWzq','C2vZC2LVBKLK','uufmqMy','u2TPCcbYzwfKihjLy2vPChq6igXVy2fSig1LC3nHz2vvswq','zgf0yq','uhjVy2vZC2LUzYb2B2LJzsbTzxnZywDL','vK5pyxG','AuD4DuW','zMXVB3i','BwvZC2fNzvr5Cgu','revoDxa','C291CMnLx2LTx2LK','Dhzhv0i','AgfUzgXLq29TBwfUzfjLC3vSDa','u2vYDMLJzsbZzxnZAw9UignYzwf0zwq','BMzbDwq','y29TBwfUzf9Yzxn1Bhq','BgfZDfrPBwvZDgfTCa','zgDezu4','s1fWB04','q3jLyxrLzcbVChmGC2vZC2LVBG','q09ntuforf9srvnvtfq','CMvZDgfYDa','y29UzMLN','wfPgu24','AxnwCvu','CMvTB3rLvxjS','ANrtyKG','vKjhsuS','DMvvt3m','EKXgAwC','q29TBwfUzcbTzxnZywDLignVBNrHAw5Zig5LC3rLzcbTC2DFDhLWzsWGCM91DgLUzW','AxnIweq','y3DK','t1bftKnprevFu0vtu0LptL9duKvbveve','rgv2AwnLlq','tuzZDKG','x2HHBMrSzv9ZExn0zw1Fz2v0q29UzMLN','s2nNs1i','rgLYrKm','CgvUzgLUz1jLCxvLC3rZ','C2vUDfrPBwu','C2vUzfbYB21WDa','C3vIC3rYAw5N','BvzjCu0','x19ZExnFBM90Awz5x18','rMfPBgvKihrVihnLBMqGDM9Py2uGCMvJB2DUAxrPB24GzxjYB3iGBwvZC2fNzq','AfDRAKi','rvDvq2e','uhjTwxq','Dg9tDhjPBMC','Ahr0Chm6lY9UzxDZCMfKyxiUzhjLyw1KDc5JBI9PBq','BgvUz3rO','oda2mJy0mw5QsLjWBG','t3bZigfZC2LZDgfUDcbYzxnWB25Kzwq','AwXRBNC','CMvQzwn0','vML4tNq','vhDbDuC','ALfVsve','vLrxz2K','AKTAwg0','rMTPrwS','vNjcv0e','C3rYAw5NAwz5','mJaYodG3mhDICg9grq','ywn0AxzL','u2vYDMLJzsbHC3nPC3rHBNqGzMfPBgvK','vw5RBM93BIbTzxnZywDLihr5Cgu','CKXMs3O','54Q25Ocb5P+L6k+I5AsX6lsLoIa','A2nQsu4','qMDWqLi','C3vJy2vZCW','BvfKCM4','AergwvO','uNnLwxG','rLDxq0m','q0HLBfy','iow3SUAoPEAuTG','tMHwv1G','B3bZt3bLBMnVzgu','ueHzz0W','Eg9Ou3y','yxrOsxC','5Ase55cg5RAi5OgV5BYc5BI4','yu1tz0C','wKvIugW','q2HHDcbTzxnZywDLignVBNrLBNqGAxmGzw1WDhK','qunyCfe','tM90ig1LBNrPB25LzcWGC2TPChbPBMCGz3jVDxaGy2HHDcbYzxbSEq','suPqy2O','vM9Py2uGBwvZC2fNzsbTAxnZAw5NihjLBw90zvvYBa','A1HZCum','6k+T6z+Z6k+g5yIR57Ut5P6C5lI656M6','qwvdq1y','zKjyy2G','C3LZDgvT','BfH2AfG','z3jVDxbsB3vUzenVDw50zxjZ','AgTdAxq','zgv2AwnLx2nVBNrYB2W','DxbKyxrLu3rHDhvZ','reP1s0u','Afzysvq','DvzhzwS','mJjTBuHiugG','zffsvg4','y291BNq','yKnSB24','x3jHD19JB250zw50','Cfv1zvi','B25SAw5L','z3jVDxbtDg9WCgvKuhjLDG','5PYQ6l+q6kgm','t2npDgm','uMXLzxq','x2HHBMrSzv9JBgf3x2DLDfn0yxr1CW','ywnJB3vUDeLK','sgfUzgXPBMCGy29TBwfUza','Ahr0CdOVlZeYnY4WlJaUmtOXotG3nW','C2vYDMLJzv9JAgf0x21LC3nHz2u','BwvZC2fNzq','CMvXDwvZDeLK','C2vYDMLJzq','C2XPy2u','ANz0yNK','vgv4De1LC3nHz2u','A3PeDMy','rhjqBuq','AgfUzgXLt3bZq2HHDe1LC3nHz2u','C2vZC2LVBK1HBMfNzxi','CgfYC2u','Afflz1y','s3nWuNe','q0nLCvO','Aw5JBhvKzxm','BgrADgW','D2HztKe','CMvJB2DUAxPLvM9Py2u','CxvZuKe','r3jVDxaGy2HHDcbIBg9JA2vKigj5ihjVDw5KigXPBwL0ig9YihbHDxnL','y29UDgvUDa','BKTgwMm','BuHUqxC','uMvHzcbYzwnLAxb0ig5VDgLMAwnHDgLVBIbPz25VCMvK','y2HHDf9TzxnZywDL','CMzwrgO','y2P2EKe','Dgv4Da','y29UzMLNx2zPEa','uhjVy2vZC2LUzYbVChmGy2HHDcbTzxnZywDL','DM1QDNu','CM91yuq','revwsunfx1nuqvrvu19srvbpuLq','D2jKugG','wMfWEKu','C0LLCeO','C2vUzfjLywrszwnLAxb0','5RAi5OgV5Ase55cg5AsX6lsL77Ym6k+356In5zco6yEn6k+v','tM9KzsbZDg9WCgvK','AgfUzgXLrgv2AwnLq2HHDa','yMXNvhi','u1r5uue','tMvYtvG','A2Htzw4','wfLJEgW','zgvSzxrLu2vZC2LVBG','576K6igk5BEY5PQc5ygC','zhvWzhm','sgLqB0W','uxLQAwi','6l+q57U05yQP5OMl5Ase55cg5AsX6lsLoIa','sgzwzgK','wKrNuMK','BwvZC2fNzvvjza','EvLoAee','DxnLCKLK','v0D1zhe','C0LguMi','vfDizfO','teD6rKq','vwzhBKO','y3jLyxrLu2vZC2LVBG','zgvZDgLUyxrPB25FAw1FAwq','rur4BeW','vM9Py2uGCMvJB2DUAxrPB24GzMfPBgvK','Ce1fv1u','rhvWBgLJyxrLig1LC3nHz2uGzMLSDgvYzwq','x2HHBMrSzv9JBgf3x3n0yxj0','r3z3r3u','C2vUze1LC3nHz2u','q0zlCui','x2HHBMrSzv9JBgf3x3n0B3a','5BEY6l6+5yIW5PYS6l2U5A+56k+D5lIk6zMqicG','zeXwvKW','vfDjy0u','yNDjvfu','x2HHBMrSzv8','yNzKwKK','zwDrA2S','tgzzshq','qNb1ugu','B2jQzwn0','s1b1Bve','BwLNwNC','BuLPvxe','A0fkC2y','5yIB5BU65lYA6k+D5AsX6lsL','wvD5ug0','B3bLBMnSyxDnyxHsB3vUzhm','CM9Uz0nSAwvUDa','revwsunfx0nptLrst0XFuKvtvuXu','r3DhDhm','57Y65BcrihrHCMDLDeLKioAiLIbJB250zw50','AfPYq2C','rK1tD3a','DxnLCL9Pzf9SAxn0','BwvUDgLVBMvKsw5MBW','y29Kzq','uhjVy2vZC2LUzYbJAgf0ig1LC3nHz2u','zgvSzxrL','zgvKDxa','B3bLBMnVzgu','zxvZwfq','yvrKuu8','s3rJyue','mJGYmta3mgniwgD3yW','rwviDfi','y3jLyxrLx29Wzw5JB2rLx3nLC3nPB24','uKm6vKnnC2C','AgfUzgXLq3jLyxrLu2vYDMLJzvnLC3nPB24','C2vUzfbYB21WDefZEw5J','C2vUzgvYvxnLCKLK','vKPkCwu','sNrvsfy','DMj0uge','5A6I5PYn5lYA6k+D5yIB5BU65OIq5yQF','yvzfsK0','r3jVDxaGy2HHDcbTzw50Aw9UignOzwnR','B25eBwm','zeXyv2O','revXuvq','u2TPChbPBMCGy29TBwfUzcb3AxrOigvTChr5ihnLCNzPy2uVywn0Aw9U','BM93','rgv2AwnLignOyxqGzgv0zwn0zwqSihjVDxrPBMCGDg8GB3bZigfZC2LZDgfUDa','EeDcBei','ELDcCM4','rMXptg4','revmrvrfx09qru5dt0rfx1nfu1njt04','r2vRuKy','C2vYDMLJzs0','z3jVDxbF','BeL3CKi','z2XoDem','B2zMBgLUzq','vLvru2i','zhvYyxrPB24','5zg95lUKia','rezMALi','6k6+5Ash54Q25Ocb5P+L6k+I5BYc5BI4','uNnPA08','CMvZDwX0','tuv1r3C','sw50zxjUywWGC2vYDMvYigvYCM9Y','u0foqNi','CM9VBv9Pza','z2v0t3jdCMvHDgvtzxnZAw9U','x2HHBMrSzv91C2vYx2DLDeLUzM8','se1JueC','BerOEhG','rMfPBgvKihrVihnLBMqGzgv2AwnLihn0yxr1CYbLCNjVCIbYzxbVCNq','CeDrswy','DKL2Dhe','C2X6vwm','qM5eu0W','tM9KzsbZDgfYDgvK','q29TBwfUzcbYzxn1BhqGBwLZC2LUzYbYzxf1zxn0swq','5Ase55cg5AsX6lsL77Ym6k+356In5zco6yEn6k+v','CLfOv2W','qLnwvKq','whLWy3e','B3bLBMnVzgvqyxnZD29Yza','q1jfqvrfx1nfuLzjq0vFu0vtu0LptG','C2vUzfrVvxnLCJOG5RAi5OgV5y+r6ycb5AsX6lsL','zMv0y2HhCM91Cfn0yxr1CW','t1btx0niqvrFtuvtu0fhrq','A2PJr20','AMDNtey','EgnRuNO','Eu1dEhy','AxneDxbSAwnHDgu','z2v0','r2TeCwi','q3LXBey','rwD3EvG','nJi4ndz1y1nbDLa','zMv0y2HhCM91Cfn0yxr1CYbMywLSzwq','Dg9Rzw4','revwsunfx0nptLrst0W','Ae1nsLm','Ee56Avm','C2v0','q09ntufora','rMfPBgvKihrVihnLBMqGDM9Py2uGCMvJB2DUAxrPB24Gy29TBwfUza','Bg5vsgS','v0Xnr2e','Aw5MBW','mJfgDKDeCxm','BKvgtgS','BhnMAeO','u1P5t2C','C2vUzfrVvxnLCJOG57Y65BcrihrHCMDLDeLKioAiLIbJB250zw50','sgLYBNu','rgv2AwnLignOyxqGB3bZigfZC2LZDgfUDcbMywLSzwq','Aw5JCMvTzw50r3jVDxbsB3vUza','A2v5CW','qNj6A0m','CKPIC3G','A090DKu','EK9OtgW','zgvSzxrLx29Wzw5JB2rLx3nLC3nPB24','tKvjDhG','vxr3r0m','zgvIDwC','DxnLCG','mJi4mJeZnu9sshHurW','zwnvy1m','CuLyrw8','DezrzMu','C3rHDhvZx21LC3nHz2u','wxLpzhi','5PYQ55+L6zsz6k+V','revwsunfx1nuqvrvu19srvfvrvnu','sg14Dvy','z0zmz00','AgfUzgXLq29TBwfUza','sKHgtKS','teTMuxu','zuzQB00','AMP0wuS','y3P0Afi','vvPZDKm','B3bLBMnSyxDtDg9WCgvK','qvjfrgC','CwXdANm','yunmA3i','z3bOrNu','CMfkvxu','zMjZvNa','BMzNt0C','CgnuzuC','DxzHCxe','zgv2AwnLx3n0yxr1C19Yzxf1zxn0','tKnoBK0','yNrizKq','6k+T6z+Z6k+g5yIR6k+35Rgc6lAf5PE2','zfj3uMm','r2XjDvq','s2zyEMi','Bencq0C','vg52D3G','zur6ufi','twvUDgLVBIbJAgvJAYbYzxn1Bhq','BxnNx3r5Cgu','ueHwuw0','q29TBwfUzcbYzxn1BhqGChjVy2vZC2vK','BM9KzuLK','ChLJrNe','zxjYB3i','Be5TCwi','DM9Py2vvCMW','mtHcA3znwgW','sKXVtee','uuXLzxq','AM5hBM0','v093rvu','u0vsvKLdrv9dsefux1jfu1bptLnf','vM9Py2uGCMvJB2DUAxPLzcbZDwnJzxnZzNvSBhK','qKDryNi','B3bZx2nOyxrFBwvZC2fNzq','6k+T6z+Z6k+g5yIR5AsX6lsL','wfDethO','sfbvuhC','u0vsvKLdrv9dsefux01fu1nbr0u','txrXz0W','6k+T6z+Z5RAi5OgV6k+g5yIR5AsX6lsL77Ym6k+356In5zco6yEn6k+v5OIw5y+r6ycb5PAh5A2x5RAi5OgV','tgXQsuO','u3HcBxi','DxjS','zfD3ugW','A21kBuC','5y+r6ycb6k+T6z+Z6k+g5yIR6k+35Rgc5AsX6lsLoIa','sgjlB3m','C2vZC2LVBL9Pza','vwjSwey','uMHzzu0','u3LZDgvTig5VDgLMAwnHDgLVBIbPz25VCMvK','Dw12y3q','l2fWAs9NCM91Cc8','C0Duthi','vM9Py2uGCMvJB2DUAxPLzcb2AweGuM9Uz0nSB3vK','AgfUzgXLq2HHDe1LC3nHz2u','t2vLu2i','sevvCwO','q29TBwfUzcbOyw5KBgvYigvYCM9Y','u0vsvKLdrv9trvntsu9ox0nsrufuruq','DxbKyxrLrxH0CMe','r3jVDxaGCM91BMqGAw5JCMvTzw50zwq','sxLLtKe','uhjVy2vZC2LUzYbKzxzPy2uGy2HHDcb2AweGB3bZigfZC2LZDgfUDa','t3bZigfZC2LZDgfUDcbYzxnWB25KzwqGzM9YigrLDMLJzsbJAgf0','BtrH','ug1YC3C','DMDvuuy','tfrxt2u','u2TPCcbYzwfKihjLy2vPChq6igLUDMfSAwqGBwvZC2fNzvvjzcbVCIbZzw50vgLTzq','C291CMnLsw1jza','y2XHDY0','wLbMBvy','zhfVseO','wejLtNi','y1PpCu4','DxnLCKLKtgLZDa','y21WzMW','DKrNte4','AgfUzgXLrgv2AwnLu3rHDhvZuMvXDwvZDa','t3bZigfZC2LZDgfUDcbMywLSzwq','tgrNwuy','CLnvqvu','mZqZmJG4DhzQExHi','sfHZvxm','uMfiq3e','5A6I5PYn5Ase55cg5AsX6lsLoIa','5A6I5PYn5lYA6k+Dia','ENLjtgK','BwvUDgLVBMvKx2LUzM8','seDNz3G','rgv2AwnLihn0yxr1CYbYzxbVCNqGC2vUDa','B3bZ','CMfUzg9T','AhHMtuS','DxnLCL9Pza','r3jVDxaGCMvZDw1LzcbMCM9Tihn0B3bWzwqGC3rHDguSihjLC2v0DgLUzYbYB3vUzcbJB3vUDgvY','y2HLy2ThCM91CfjVDw5KtgLTAxq','refwuvK','C3rHDhvZ','twzVtwO','C3rVCa','ms4WlJa','C2DNqKW','sMLUDKS','DvPZCxK','l3n0yxr1CW','v251rfG','D2fYBG','q0Hbvf9nrvntquDf','u2vYDMLJzsbWCM9TChrbC3LUyYbZzw50lcbZDhjLyw1PBMCGDMLHifntrq','A3HeBum','5yIB5BU65A6I5PYn5lYA6k+D5AsX6lsL','twvZC2fNzsbYzwnLAxzLzcbKzxrHAwXZ','AgfUzgXLrgv2AwnLq29UDhjVBa','AgfUzgXLvM9Py2vnzxnZywDL','De1kANi','CMvHC29U','z216AMy','z3jVDxbtDgf0Dxnmyxn0rMv0y2G','ywXSB3DLza','rw9bA0y','DgLTzxi','shL0sLi','BxvMCuy','vxHWv0G','ioI9RIK','C3rHCNq','DgfYz2v0swq','x3jLy29NBML6zvzVAwnL','vvjSqLu','twvZC2fNzuHHBMrSzxi','uKm6sffwq01ZzW','EertvLK','BxnzrMq','uLvoveq','v1j2wg0','uu5bzvy','C2vUzfrVvxnLCJOG5RAi5OgV5y+r6ycb5OIq5yQF','D29ksxm','B01hB2e','BNz5EuC','y3f4AgS','B2rUwKy','u2vYDMLJzsbJAgf0ig1LC3nHz2uGy29UDgvUDcbPCYbLBxb0Eq','u2TPChbPBMCGC2vSzI1Zzw50ig1LC3nHz2u','t1btx0niqvrFuKvtue9ou0u','z0X6swS','rNLsANu','u2vYDMLJzsbZzxnZAw9UignYzwf0zwqGD2L0Acb0yxjNzxrjza','y29TBwfUza','vKz4zgO','CMvXDwvZDf9Pza','t3bZlq','mJHcBhzqBe8','z3jVDxbtDgf0DxndywnOzq','zLrfBeC','C3rYAw5N','BMfJwum','q0TXAhm','Eej5A1C','y2jmr3e','t3bZignOyxqGBwvZC2fNzsbJB250zw50igLZigvTChr5','rvDSC1K','uenktem','DgHLBG','q2voBgG','ugH1wxu','AhHQyLe','Cvf5rNu','tg9NAw4GC3vJy2vZC2z1Ba','B3bLBMnVzgvvCMW','q29TBwfUzcbOyw5KBgvYig5VDcbMB3vUza','y2f0y2G','vw5RBM93BIbZzxj2AwnLl2fJDgLVBJOG','Der2se0','yMHsrgS','AgfUzgXLtwvZC2fNzq','B3DpsMC','Bw5grfq','AgfUzgXLu2vYDMLJzunOyxrnzxnZywDL','mti2ndaYrer5tKLg','C2TptgG','Bg1bqvO','wxnoqwq','zNLzsvO','Dw5RBM93BIG','suPrvhi','ugXSvhG','zMjXwxu','tM8GCgvUzgLUzYbYzxf1zxn0igzVDw5KigzVCIbJB21Tyw5KihjLC3vSDa','uwPUBNi','EgDqtuC'];a0_0x3f20=function(){return _0x36ebb5;};return a0_0x3f20();}export class MessageHandler{constructor(_0x455f97,_0x4b1324,_0x29bfde,_0x55dbdb){const _0x4677a3=a0_0x43e8cf,_0x49782b={'CHelV':'http://127.0.0.1:19877'};this[_0x4677a3(0x2b0)]=new Map(),this['groupStatusCache']=new Map(),this[_0x4677a3(0x2be)]=new Map(),this[_0x4677a3(0x1ff)]=0x0,this[_0x4677a3(0x264)]=_0x455f97,this[_0x4677a3(0x2d0)]=_0x4b1324,this[_0x4677a3(0x320)]=_0x29bfde,this[_0x4677a3(0x32c)]=_0x55dbdb;const _0x5e1a0b=process.env.CLAW_OPS_OPENCODE_DIR||process['cwd']();this[_0x4677a3(0x29e)]=new OpenCodeClient({'baseUrl':_0x49782b[_0x4677a3(0x29b)],'directory':_0x5e1a0b}),this[_0x4677a3(0x32b)]=new MessageDeduplicator(),this[_0x4677a3(0x275)]=new Map();}async[a0_0x43e8cf(0x36a)](_0x4ce5de){const _0x2f7a0a=a0_0x43e8cf,_0x1c3e54={'qlCjs':_0x2f7a0a(0x218),'xEnqE':function(_0x2a4a1f,_0x2b1786){return _0x2a4a1f!==_0x2b1786;},'egQkk':_0x2f7a0a(0x1f0),'leQxh':_0x2f7a0a(0x324),'yeLbu':_0x2f7a0a(0x280),'FWWCC':function(_0x306f2b,_0x5adfa5){return _0x306f2b===_0x5adfa5;},'mhmlL':_0x2f7a0a(0x376)};try{if(_0x1c3e54['xEnqE'](_0x1c3e54[_0x2f7a0a(0x315)],_0x1c3e54['leQxh'])){const _0x2911c9=this[_0x2f7a0a(0x264)]['serverUrl']||process.env.DM_SERVER_URL||_0x1c3e54['yeLbu'],_0x484259=_0x2911c9+_0x2f7a0a(0x1bc)+_0x4ce5de+_0x2f7a0a(0x1f2),_0x2fd903=await a0_0x563723[_0x2f7a0a(0x371)](_0x484259,{'timeout':0x1388});if(_0x1c3e54[_0x2f7a0a(0x29a)](_0x2fd903[_0x2f7a0a(0x251)]?.[_0x2f7a0a(0x328)],0xc8)&&_0x2fd903[_0x2f7a0a(0x251)]?.[_0x2f7a0a(0x251)])return{'openclawStopped':_0x2fd903[_0x2f7a0a(0x251)][_0x2f7a0a(0x251)][_0x2f7a0a(0x184)]??![],'openclawMaxRounds':_0x2fd903[_0x2f7a0a(0x251)][_0x2f7a0a(0x251)][_0x2f7a0a(0x31f)]??0xa};return null;}else{_0x355f28[_0x2f7a0a(0x1f4)](_0x1c3e54[_0x2f7a0a(0x186)]);return;}}catch(_0x176d5a){return log[_0x2f7a0a(0x1f4)]({'groupId':_0x4ce5de,'err':_0x176d5a[_0x2f7a0a(0x2c7)]},_0x1c3e54['mhmlL']),null;}}async[a0_0x43e8cf(0x1e9)](_0x3778fa){const _0x162daf=a0_0x43e8cf,_0x29f22d={'btHfD':function(_0x21f370,_0xb6d4cc){return _0x21f370(_0xb6d4cc);},'EoAkF':_0x162daf(0x191),'mPbnk':'Voice\x20recognition\x20command\x20sent\x20via\x20RongCloud','cmpfl':function(_0x2d43b7,_0xb53ec4){return _0x2d43b7(_0xb53ec4);},'Qyjib':_0x162daf(0x37d),'whYNA':function(_0x18b4fe,_0x559d8c){return _0x18b4fe(_0x559d8c);},'DFfjR':_0x162daf(0x1b5),'DrPmD':'recognizeVoice','Hirnu':_0x162daf(0x2ae),'yUWTx':_0x162daf(0x2a7),'cXIBq':function(_0x3d832f,_0x1df2ea){return _0x3d832f(_0x1df2ea);},'bhRDk':'Skip\x20read\x20receipt:\x20local\x20messageUId','umvct':_0x162daf(0x35c),'DirFC':function(_0x8631c2,_0xb6288){return _0x8631c2>_0xb6288;},'VJJqe':function(_0x6f937f,_0x3fd586){return _0x6f937f-_0x3fd586;},'TCHCr':function(_0x2759f3,_0x17a0d5){return _0x2759f3!==_0x17a0d5;},'dUcVO':_0x162daf(0x2a0),'bvdZI':function(_0x1c9f16,_0x1b4173){return _0x1c9f16!==_0x1b4173;},'ldZtl':_0x162daf(0x2d9),'xLxbN':function(_0x5810ad,_0x15fc35){return _0x5810ad===_0x15fc35;},'OcOtc':function(_0x1dcd5e,_0x296bb6){return _0x1dcd5e===_0x296bb6;},'aCLkr':function(_0x530d5a,_0x2ba578){return _0x530d5a!==_0x2ba578;},'iGxuL':_0x162daf(0x1f1),'mHnAw':_0x162daf(0x1e8),'sggBL':_0x162daf(0x2f5),'BgpBR':function(_0x2c202a,_0x16e6f4){return _0x2c202a===_0x16e6f4;},'LGzFD':_0x162daf(0x322),'rouaD':function(_0x2107e4,_0x1132f1){return _0x2107e4>_0x1132f1;},'lnUHk':_0x162daf(0x1a5)};let _0x21a923=this[_0x162daf(0x223)][_0x162daf(0x371)](_0x3778fa);const _0x4c190d=Date[_0x162daf(0x341)]();if(!_0x21a923||_0x29f22d[_0x162daf(0x274)](_0x29f22d[_0x162daf(0x337)](_0x4c190d,this[_0x162daf(0x1ff)]),GROUP_STATE_CACHE_TTL_MS)){const _0x13d729=await this['fetchGroupStatus'](_0x3778fa);if(_0x13d729){if(_0x29f22d['TCHCr'](_0x29f22d['dUcVO'],_0x162daf(0x2d2)))_0x21a923=_0x13d729,this[_0x162daf(0x223)]['set'](_0x3778fa,_0x21a923),this[_0x162daf(0x1ff)]=_0x4c190d;else{const _0x4fd313=_0x36eb02(()=>{const _0xf5b5dd=_0x162daf;this[_0xf5b5dd(0x275)][_0xf5b5dd(0x32a)](_0x19e65c),_0x29f22d[_0xf5b5dd(0x190)](_0x3c167e,new _0x39a74c(_0x29f22d[_0xf5b5dd(0x201)]));},0x7530);this[_0x162daf(0x275)][_0x162daf(0x37b)](_0x5f170a,{'resolve':_0x54670d,'reject':_0x19dea3,'timer':_0x4fd313});const _0x5db095={'msg_type':_0x160a42[_0x162daf(0x37c)],'requestId':_0x28605a,'service':'ai','action':_0x29f22d[_0x162daf(0x2ce)],'payload':{'voiceUrl':_0x348117,'format':'m4a','sampleRate':0x3e80},'timestamp':_0x522ca7[_0x162daf(0x341)]()};this[_0x162daf(0x320)][_0x162daf(0x30c)](_0x29f22d[_0x162daf(0x386)],_0x1bd9e8[_0x162daf(0x28d)](_0x5db095),0x1)['then'](()=>{const _0x37383d=_0x162daf;_0xfe9a71[_0x37383d(0x380)]({'requestId':_0xe345db,'voiceUrl':_0x1ac728},_0x29f22d['mPbnk']);})[_0x162daf(0x235)](_0x1b5b3c=>{const _0x5df5e6=_0x162daf;_0x29f22d[_0x5df5e6(0x1d5)](_0x45aad7,_0x4fd313),this[_0x5df5e6(0x275)][_0x5df5e6(0x32a)](_0x1c9908),_0x424858[_0x5df5e6(0x19e)]({'err':_0x1b5b3c[_0x5df5e6(0x2c7)],'requestId':_0x209aa0},_0x29f22d[_0x5df5e6(0x2f8)]),_0x29f22d[_0x5df5e6(0x2d7)](_0x5b4fc3,new _0xd4f51f(_0x29f22d[_0x5df5e6(0x350)]+(_0x1b5b3c[_0x5df5e6(0x2c7)]||_0x5df5e6(0x179))));});}}}if(!_0x21a923){if(_0x29f22d[_0x162daf(0x314)](_0x29f22d[_0x162daf(0x2d6)],'gsVWS'))return{'allowed':!![]};else{_0x3c7e21[_0x162daf(0x380)](_0x29f22d['yUWTx']);return;}}const _0x3c29c9=this['groupStoppedPrev'][_0x162daf(0x371)](_0x3778fa);_0x29f22d['xLxbN'](_0x3c29c9,!![])&&_0x29f22d[_0x162daf(0x2c0)](_0x21a923[_0x162daf(0x184)],![])&&(_0x29f22d[_0x162daf(0x187)](_0x162daf(0x1f1),_0x29f22d[_0x162daf(0x254)])?(this[_0x162daf(0x275)][_0x162daf(0x32a)](_0x32ac77),_0x29f22d['cXIBq'](_0x2e2bc2,new _0x3f23c3(_0x29f22d[_0x162daf(0x201)]))):(log[_0x162daf(0x380)]({'groupId':_0x3778fa},_0x29f22d[_0x162daf(0x2dd)]),this[_0x162daf(0x2b0)]['set'](_0x3778fa,{'count':0x0,'lastTimestamp':0x0})));this[_0x162daf(0x2be)]['set'](_0x3778fa,_0x21a923['openclawStopped']);if(_0x21a923[_0x162daf(0x184)])return{'allowed':![],'reason':_0x29f22d[_0x162daf(0x1ef)]};let _0x1fa687=this[_0x162daf(0x2b0)][_0x162daf(0x371)](_0x3778fa);if(!_0x1fa687){if(_0x29f22d[_0x162daf(0x295)](_0x29f22d[_0x162daf(0x302)],_0x162daf(0x322)))_0x1fa687={'count':0x0,'lastTimestamp':0x0},this[_0x162daf(0x2b0)][_0x162daf(0x37b)](_0x3778fa,_0x1fa687);else{_0x396acf[_0x162daf(0x171)]({'messageUId':_0x268ee3['messageUId']},_0x29f22d[_0x162daf(0x238)]);return;}}_0x29f22d[_0x162daf(0x2e6)](_0x4c190d-_0x1fa687[_0x162daf(0x25e)],ROUND_COOLDOWN_MS)&&(_0x1fa687[_0x162daf(0x2b9)]=0x0);if(_0x1fa687[_0x162daf(0x2b9)]>=_0x21a923[_0x162daf(0x31f)]){if(_0x29f22d[_0x162daf(0x187)](_0x29f22d[_0x162daf(0x37e)],_0x29f22d[_0x162daf(0x37e)]))_0xa0a1e8[_0x162daf(0x19e)]({'sendErr':_0x2b7866},_0x29f22d[_0x162daf(0x1bb)]);else return{'allowed':![],'reason':_0x162daf(0x30f)+_0x21a923[_0x162daf(0x31f)]+_0x162daf(0x206)};}return{'allowed':!![]};}[a0_0x43e8cf(0x388)](_0xde025b){const _0x16facd=a0_0x43e8cf,_0x3a803b={'DuBBP':function(_0x3a2a0a,_0x1214d5){return _0x3a2a0a!==_0x1214d5;},'HEUqj':_0x16facd(0x24b),'khSen':'Group\x20round\x20incremented'};let _0x223036=this[_0x16facd(0x2b0)]['get'](_0xde025b);!_0x223036&&(_0x3a803b['DuBBP'](_0x3a803b[_0x16facd(0x1c1)],_0x3a803b[_0x16facd(0x1c1)])?(_0x3d9024=_0x3b227f,this[_0x16facd(0x223)]['set'](_0x3c736d,_0x49abe3),this[_0x16facd(0x1ff)]=_0x69b564):(_0x223036={'count':0x0,'lastTimestamp':0x0},this['groupRoundCounters']['set'](_0xde025b,_0x223036))),_0x223036[_0x16facd(0x2b9)]+=0x1,_0x223036[_0x16facd(0x25e)]=Date[_0x16facd(0x341)](),log['info']({'groupId':_0xde025b,'count':_0x223036[_0x16facd(0x2b9)]},_0x3a803b[_0x16facd(0x2f2)]);}async['sendToUser'](_0x32a757,_0x44f5f7,_0x4bca5a={}){const _0x1514a6=a0_0x43e8cf,_0x33ad07={'ZPfmV':_0x1514a6(0x2da),'EDxlL':_0x1514a6(0x2a9),'wBSNh':function(_0x150191,_0x10da0e){return _0x150191||_0x10da0e;},'vbtPa':function(_0x448861,_0x1b10be){return _0x448861===_0x1b10be;},'NerMX':_0x1514a6(0x385),'jjtYK':function(_0x5f349c,_0x5afebd){return _0x5f349c===_0x5afebd;},'nQQIR':_0x1514a6(0x1d6),'CyqlF':function(_0x4f8708,_0x3ebbc5){return _0x4f8708>_0x3ebbc5;},'fBXch':function(_0x9ff659,_0x2cd072){return _0x9ff659!==_0x2cd072;},'qBORz':_0x1514a6(0x203),'nacYC':_0x1514a6(0x212),'ychuc':_0x1514a6(0x21f),'pcTeG':_0x1514a6(0x369),'mVIqM':function(_0x2fa726,_0x178376){return _0x2fa726(_0x178376);}},{conversationType:conversationType=0x1,extra:_0x54ab52}=_0x4bca5a;if(_0x33ad07['wBSNh'](!_0x32a757,!_0x44f5f7)){if(_0x33ad07[_0x1514a6(0x339)]('JmuIU',_0x1514a6(0x338))){_0x1386f1[_0x1514a6(0x380)]({'groupId':_0x234e4d['targetId'],'reason':_0x542f56[_0x1514a6(0x1fd)]},_0x33ad07[_0x1514a6(0x1d0)]);return;}else return log[_0x1514a6(0x1f4)]({'targetId':_0x32a757,'hasContent':!!_0x44f5f7},_0x33ad07[_0x1514a6(0x2f1)]),{'success':![],'error':_0x1514a6(0x323)};}try{if(_0x33ad07[_0x1514a6(0x181)](_0x1514a6(0x2e0),_0x33ad07['nQQIR']))_0x38d234=_0x3c0ed8[_0x1514a6(0x2d1)](_0x415275['content']);else{let _0x32eeaa;if(_0x54ab52&&_0x33ad07[_0x1514a6(0x373)](Object[_0x1514a6(0x389)](_0x54ab52)[_0x1514a6(0x281)],0x0)){if(_0x33ad07[_0x1514a6(0x2ad)](_0x33ad07['qBORz'],_0x33ad07['qBORz'])){_0x31913d[_0x1514a6(0x1f4)]({'messageType':_0x5120b9['messageType']},_0x33ad07[_0x1514a6(0x306)]);return;}else _0x32eeaa=JSON[_0x1514a6(0x28d)]({'content':_0x44f5f7,..._0x54ab52});}else _0x32eeaa=_0x44f5f7;return await this[_0x1514a6(0x320)][_0x1514a6(0x30c)](_0x32a757,_0x32eeaa,conversationType),log[_0x1514a6(0x380)]({'targetId':_0x32a757,'conversationType':conversationType,'contentPreview':_0x44f5f7['substring'](0x0,0x64)},_0x33ad07[_0x1514a6(0x226)]),{'success':!![]};}}catch(_0x1911a5){return _0x33ad07[_0x1514a6(0x339)](_0x1514a6(0x21f),_0x33ad07['ychuc'])?(log['error']({'err':_0x1911a5,'targetId':_0x32a757,'conversationType':conversationType},_0x33ad07[_0x1514a6(0x18c)]),{'success':![],'error':_0x1911a5[_0x1514a6(0x2c7)]||_0x33ad07[_0x1514a6(0x279)](String,_0x1911a5)}):(_0xe82a8c[_0x1514a6(0x1f4)]({'groupId':_0x50e191,'err':_0x1b4bc7[_0x1514a6(0x2c7)]},_0x1514a6(0x376)),null);}}async[a0_0x43e8cf(0x239)](_0x395520){const _0x46c27d=a0_0x43e8cf,_0x385a29={'FxVDo':_0x46c27d(0x1e8),'QNAeV':_0x46c27d(0x37d),'qliQk':function(_0xe323f5,_0xe8efb2){return _0xe323f5+_0xe8efb2;},'xckRz':_0x46c27d(0x1b5),'cbLGq':_0x46c27d(0x179),'czthR':function(_0x98419,_0x1a40a3){return _0x98419===_0x1a40a3;},'GvwGu':'RC:ReadNtf','TuUdb':_0x46c27d(0x2de),'PHYgL':_0x46c27d(0x309),'CygmA':_0x46c27d(0x225),'mnFDT':_0x46c27d(0x318),'veUOs':function(_0x57dff3,_0x3b80a4){return _0x57dff3===_0x3b80a4;},'zWBrn':function(_0x495bba,_0x1ee718){return _0x495bba!==_0x1ee718;},'jggLF':_0x46c27d(0x2b6),'mufqF':_0x46c27d(0x193),'fTElG':function(_0x3f89c3,_0x19473a){return _0x3f89c3===_0x19473a;},'GZcKn':_0x46c27d(0x2cb),'EWlsY':'sVIwM','dgDeN':function(_0x33d08c,_0x41efc5){return _0x33d08c===_0x41efc5;},'viapU':function(_0x3dbd18,_0x4d8d8a){return _0x3dbd18===_0x4d8d8a;},'cZOqN':_0x46c27d(0x1ba),'URlBU':_0x46c27d(0x1f9),'TWHdZ':_0x46c27d(0x332),'rsdSx':'RC:TxtMsg','pycFq':_0x46c27d(0x2cc),'NzedM':_0x46c27d(0x2df),'STyQA':_0x46c27d(0x2b2),'RaHCq':_0x46c27d(0x21e),'NhVWX':_0x46c27d(0x1a9),'Clurw':'create_service_session','WRVNV':_0x46c27d(0x2c6),'hxfMK':_0x46c27d(0x20c),'DJuKE':_0x46c27d(0x333),'hkCit':_0x46c27d(0x38e),'aAWhl':_0x46c27d(0x291),'PNPDy':_0x46c27d(0x31b),'qrAaY':_0x46c27d(0x2a2),'owOJg':function(_0x32b527,_0xb8d230){return _0x32b527===_0xb8d230;},'dQRTn':function(_0x77f52d,_0x214da4){return _0x77f52d!==_0x214da4;},'ogCoR':_0x46c27d(0x2ae)};try{if(_0x385a29[_0x46c27d(0x182)](_0x395520[_0x46c27d(0x256)],_0x385a29[_0x46c27d(0x30b)])){log[_0x46c27d(0x171)]({'messageUId':_0x395520[_0x46c27d(0x2fc)],'senderUserId':_0x395520[_0x46c27d(0x336)]},_0x385a29['TuUdb']);return;}if(_0x395520['messageUId']&&this[_0x46c27d(0x32b)][_0x46c27d(0x370)](_0x395520['messageUId'])){log['debug']({'messageUId':_0x395520[_0x46c27d(0x2fc)]},_0x385a29[_0x46c27d(0x29f)]);return;}this[_0x46c27d(0x2eb)](_0x395520);let _0x36b03d;if(typeof _0x395520['content']===_0x385a29['CygmA'])try{_0x36b03d=JSON[_0x46c27d(0x2d1)](_0x395520[_0x46c27d(0x2db)]);}catch{_0x36b03d={'content':_0x395520[_0x46c27d(0x2db)]};}else{if(_0x395520['content']&&typeof _0x395520[_0x46c27d(0x2db)]===_0x385a29[_0x46c27d(0x23b)])_0x385a29[_0x46c27d(0x26a)](_0x46c27d(0x1b4),_0x46c27d(0x2aa))?(_0x537021['info']({'groupId':_0x3915b5},YHZyGD['FxVDo']),this[_0x46c27d(0x2b0)]['set'](_0x3a5220,{'count':0x0,'lastTimestamp':0x0})):_0x36b03d=_0x395520['content'];else{if(_0x385a29[_0x46c27d(0x344)](_0x385a29[_0x46c27d(0x36d)],_0x385a29[_0x46c27d(0x204)]))return;else{const _0x5e0665=_0x2d83aa[_0x46c27d(0x2d1)](_0x512aa3[_0x46c27d(0x2db)]);_0x3629da=_0x5e0665['mentionedInfo']||_0x5e0665['mentioned_info'];}}}let _0x47ed08={};if(_0x36b03d[_0x46c27d(0x2db)]&&_0x385a29[_0x46c27d(0x26a)](typeof _0x36b03d['content'],'string'))try{_0x385a29[_0x46c27d(0x224)](_0x385a29['GZcKn'],_0x385a29[_0x46c27d(0x22b)])?(_0x5e803b(_0x3fd282),this[_0x46c27d(0x275)][_0x46c27d(0x32a)](_0x20dbcb),_0x20f577[_0x46c27d(0x19e)]({'err':_0xe06ea0[_0x46c27d(0x2c7)],'requestId':_0x228fb5},_0x385a29[_0x46c27d(0x211)]),_0x5b4e1c(new _0x298e42(_0x385a29['qliQk'](_0x385a29[_0x46c27d(0x36e)],_0x38aff5[_0x46c27d(0x2c7)]||_0x385a29[_0x46c27d(0x229)])))):_0x47ed08=JSON[_0x46c27d(0x2d1)](_0x36b03d[_0x46c27d(0x2db)]);}catch{_0x47ed08={'content':_0x36b03d[_0x46c27d(0x2db)]};}const _0x5172f3=_0x36b03d[_0x46c27d(0x199)]||_0x47ed08[_0x46c27d(0x199)],_0x4f3f2e=_0x36b03d[_0x46c27d(0x258)]||_0x36b03d['sourceImId']||_0x395520[_0x46c27d(0x336)],_0x1987bb=_0x36b03d[_0x46c27d(0x305)]||_0x36b03d['destinationImId']||_0x395520[_0x46c27d(0x208)],_0x1e12fe=_0x36b03d[_0x46c27d(0x220)]||_0x36b03d[_0x46c27d(0x2c8)],_0x2cf911={..._0x36b03d,..._0x47ed08,'request_id':_0x1e12fe,'source_im_id':_0x4f3f2e,'destination_im_id':_0x1987bb};if(_0x385a29[_0x46c27d(0x25f)](_0x36b03d['__sys_notify__'],!![])||_0x385a29['viapU'](_0x47ed08[_0x46c27d(0x27a)],!![])){log[_0x46c27d(0x171)]({'messageType':_0x395520[_0x46c27d(0x256)],'text':_0x36b03d[_0x46c27d(0x2e2)]||_0x47ed08[_0x46c27d(0x2e2)]},_0x385a29[_0x46c27d(0x1d3)]);return;}log['info']({'messageType':_0x395520[_0x46c27d(0x256)],'customMsgType':_0x5172f3,'senderUserId':_0x395520['senderUserId'],'targetId':_0x395520[_0x46c27d(0x208)],'contentKeys':Object['keys'](_0x36b03d),'hasMsgType':!!_0x36b03d[_0x46c27d(0x199)],'msgContentPreview':JSON[_0x46c27d(0x28d)](_0x36b03d)[_0x46c27d(0x278)](0x0,0xc8)},_0x385a29[_0x46c27d(0x20a)]);switch(_0x5172f3||_0x395520['messageType']){case RongyunMessageTypeEnum['CREATE_OPENCODE_SESSION']:case _0x385a29[_0x46c27d(0x301)]:await this['handleCreateOpencodeSession'](_0x2cf911,_0x395520);return;case _0x385a29['rsdSx']:case _0x385a29[_0x46c27d(0x19d)]:await this[_0x46c27d(0x1bf)](_0x2cf911,_0x395520,_0x5172f3);return;case RongyunMessageTypeEnum[_0x46c27d(0x1f5)]:case _0x385a29['NzedM']:await this[_0x46c27d(0x1bf)](_0x2cf911,_0x395520,_0x5172f3);return;case RongyunMessageTypeEnum[_0x46c27d(0x17a)]:case _0x46c27d(0x18e):await this[_0x46c27d(0x1d7)](_0x2cf911,_0x395520);return;case RongyunMessageTypeEnum[_0x46c27d(0x378)]:case _0x385a29[_0x46c27d(0x2f0)]:await this['handleDeviceControl'](_0x2cf911,_0x395520);return;case _0x385a29[_0x46c27d(0x1dd)]:await this[_0x46c27d(0x17d)](_0x2cf911,_0x395520);return;case RongyunMessageTypeEnum[_0x46c27d(0x36b)]:case _0x385a29[_0x46c27d(0x29d)]:await this['handleOpsChatMessage'](_0x2cf911,_0x395520);return;case RongyunMessageTypeEnum[_0x46c27d(0x368)]:case _0x385a29['Clurw']:await this[_0x46c27d(0x334)](_0x2cf911,_0x395520);return;case RongyunMessageTypeEnum[_0x46c27d(0x1ad)]:case _0x385a29['WRVNV']:await this[_0x46c27d(0x23c)](_0x2cf911,_0x395520);return;case _0x385a29[_0x46c27d(0x1e6)]:case _0x385a29[_0x46c27d(0x2b4)]:await this[_0x46c27d(0x1fb)](_0x2cf911,_0x395520);return;case RongyunMessageTypeEnum[_0x46c27d(0x346)]:case _0x385a29[_0x46c27d(0x2b1)]:_0x2cf911[_0x46c27d(0x1b7)]&&(this['sessionManager'][_0x46c27d(0x2f4)](_0x2cf911[_0x46c27d(0x1b7)]),await this[_0x46c27d(0x32c)]['deleteSession'](_0x2cf911[_0x46c27d(0x1b7)]));return;case RongyunMessageTypeEnum[_0x46c27d(0x262)]:case _0x46c27d(0x25d):this[_0x46c27d(0x25a)](_0x2cf911,_0x395520);return;default:log['warn']({'messageType':_0x395520[_0x46c27d(0x256)],'customMsgType':_0x5172f3},_0x385a29['aAWhl']);}}catch(_0x438863){if(_0x385a29[_0x46c27d(0x344)](_0x46c27d(0x331),_0x385a29['PNPDy'])){log[_0x46c27d(0x19e)]({'err':_0x438863},_0x385a29['qrAaY']);try{const _0x45d00c=_0x385a29[_0x46c27d(0x23a)](_0x395520[_0x46c27d(0x24d)],0x3)?_0x395520[_0x46c27d(0x208)]:_0x395520[_0x46c27d(0x336)];if(_0x45d00c&&_0x385a29[_0x46c27d(0x2b8)](_0x45d00c,_0x385a29['ogCoR'])){const _0x198a46=JSON[_0x46c27d(0x28d)]({'content':_0x46c27d(0x363),'extra':JSON['stringify']({'from_node':this['config']['accountId'],'is_ai':!![]})});await this[_0x46c27d(0x320)][_0x46c27d(0x30c)](_0x45d00c,_0x198a46,_0x395520[_0x46c27d(0x24d)]);}}catch{}}else _0x390197={};}}['sendReadReceipt'](_0x472cd4){const _0x30333f=a0_0x43e8cf,_0x5ea1f6={'Mflez':_0x30333f(0x362),'HmxuV':_0x30333f(0x385),'uzPTP':function(_0x48630c,_0x22402f){return _0x48630c===_0x22402f;},'XBeNr':_0x30333f(0x2c1),'odnZF':'Failed\x20to\x20send\x20read\x20receipt','gphFu':function(_0x2d1460,_0x12324e){return _0x2d1460===_0x12324e;},'dLXWj':_0x30333f(0x294),'isbXD':_0x30333f(0x2e5),'pMEWU':_0x30333f(0x345),'dLVVL':_0x30333f(0x1cd),'lNmqb':function(_0x1d22d0,_0x3457c1){return _0x1d22d0(_0x3457c1);},'dupds':'local-','OCJEz':function(_0x3c9fb7,_0x502c24){return _0x3c9fb7!==_0x502c24;},'BnDSL':'AMxTZ','lsfhJ':_0x30333f(0x250)};if(_0x5ea1f6['uzPTP'](_0x472cd4['messageDirection'],0x1)){if(_0x5ea1f6[_0x30333f(0x188)](_0x5ea1f6[_0x30333f(0x33e)],_0x5ea1f6[_0x30333f(0x33e)]))return;else{_0x57c323[_0x30333f(0x1f4)](_0x5ea1f6['Mflez']);return;}}if(!_0x472cd4[_0x30333f(0x2fc)]||!_0x472cd4[_0x30333f(0x276)]){if(_0x5ea1f6[_0x30333f(0x26d)]===_0x5ea1f6[_0x30333f(0x308)])return{'allowed':![],'reason':_0x30333f(0x30f)+_0x12c797['openclawMaxRounds']+_0x30333f(0x206)};else{log[_0x30333f(0x171)]({'messageUId':_0x472cd4[_0x30333f(0x2fc)],'sentTime':_0x472cd4[_0x30333f(0x276)]},_0x5ea1f6[_0x30333f(0x310)]);return;}}if(_0x5ea1f6[_0x30333f(0x19f)](String,_0x472cd4[_0x30333f(0x2fc)])['startsWith'](_0x5ea1f6[_0x30333f(0x2f6)])){if(_0x5ea1f6['OCJEz'](_0x5ea1f6[_0x30333f(0x360)],_0x5ea1f6[_0x30333f(0x360)]))try{_0x43e40f=_0x510684[_0x30333f(0x2d1)](_0x18d149['content']);}catch{_0x22e681={'content':_0x41c8d5[_0x30333f(0x2db)]};}else{log['debug']({'messageUId':_0x472cd4[_0x30333f(0x2fc)]},_0x5ea1f6[_0x30333f(0x383)]);return;}}this[_0x30333f(0x320)]['sendReadReceipt'](_0x472cd4)[_0x30333f(0x235)](_0x3b65c6=>{const _0x7d80f9=_0x30333f;if(_0x5ea1f6['uzPTP'](_0x5ea1f6[_0x7d80f9(0x1d2)],'Rleet'))log[_0x7d80f9(0x1f4)]({'err':_0x3b65c6,'messageUId':_0x472cd4[_0x7d80f9(0x2fc)]},_0x5ea1f6[_0x7d80f9(0x217)]);else return _0x4b017c[_0x7d80f9(0x1f4)]({'targetId':_0x32caf1,'hasContent':!!_0xaaea80},ojSSIX[_0x7d80f9(0x17b)]),{'success':![],'error':'缺少\x20targetId\x20或\x20content'};});}async[a0_0x43e8cf(0x1bf)](_0x3e0b42,_0xc22abe,_0x417673){const _0x19ffc0=a0_0x43e8cf,_0x40a286={'HbKos':_0x19ffc0(0x2ab),'TwAuG':_0x19ffc0(0x1be),'dWwPl':_0x19ffc0(0x296),'Tsiot':'User','HiPoL':function(_0x4230ce,_0xf27287){return _0x4230ce(_0xf27287);},'ZkZTr':_0x19ffc0(0x2c5),'VNOax':_0x19ffc0(0x225),'LljIJ':function(_0x1958e2,_0x34348e){return _0x1958e2===_0x34348e;},'tFQfe':_0x19ffc0(0x318),'VixNt':function(_0x510455,_0x4cb817){return _0x510455===_0x4cb817;},'TIPIQ':_0x19ffc0(0x2a4),'VrBWA':'Skipping\x20self-sent\x20message','HfVdi':function(_0x48e598,_0x565184){return _0x48e598!==_0x565184;},'SANBr':_0x19ffc0(0x2af),'msYFd':_0x19ffc0(0x1fe),'NCNnM':function(_0x4eb5cf,_0x1a3e39){return _0x4eb5cf===_0x1a3e39;},'WGudq':_0x19ffc0(0x2a5),'UxpWH':_0x19ffc0(0x21c),'PhuYu':_0x19ffc0(0x342),'DENup':function(_0x11c719,_0xb5ef24){return _0x11c719===_0xb5ef24;},'fbsVp':function(_0x38e53c,_0x1d2be7){return _0x38e53c||_0x1d2be7;},'YsNAd':function(_0x2a83e8,_0x150b32){return _0x2a83e8!==_0x150b32;},'nvyyG':_0x19ffc0(0x379),'lIwrB':function(_0xaa3cc5,_0x37d904){return _0xaa3cc5===_0x37d904;},'woJIs':'Not\x20mentioned,\x20skipping\x20group\x20chat\x20reply','hVXIT':'gHmFX','zOaSb':_0x19ffc0(0x2da),'Qjnnr':_0x19ffc0(0x329),'tvGWB':'busy','uvaqq':'QYqgf','IJPcj':function(_0x4edbdd,_0x3c1e38){return _0x4edbdd===_0x3c1e38;},'SZyOg':_0x19ffc0(0x2df),'WnuDX':'promptAsync\x20sent,\x20streaming\x20via\x20SSE','IyeNA':'PEuUV','MtqgL':'处理聊天消息失败','aMSgG':'idle','YWyPm':_0x19ffc0(0x2ec)},_0x1efa61=_0x40a286['LljIJ'](_0xc22abe['conversationType'],0x3),_0x556141=_0x1efa61?_0x19ffc0(0x349)+_0xc22abe['targetId']:_0x19ffc0(0x1cf)+_0xc22abe[_0x19ffc0(0x336)],_0x16f2f3=_0x3e0b42?.[_0x19ffc0(0x1b7)]||_0x556141;if(_0x40a286[_0x19ffc0(0x286)](_0xc22abe[_0x19ffc0(0x336)],this['config']['accountId'])){if(_0x40a286[_0x19ffc0(0x286)](_0x40a286['TIPIQ'],_0x19ffc0(0x372)))_0x38e2f0=_0x53255e[_0x19ffc0(0x2db)];else{log[_0x19ffc0(0x171)]({'chatId':_0x556141,'sessionId':_0x16f2f3},_0x40a286[_0x19ffc0(0x28c)]);return;}}let _0x37acdd='';if(_0x3e0b42?.[_0x19ffc0(0x2db)]){if(_0x40a286[_0x19ffc0(0x2fa)]('lXvhX',_0x40a286[_0x19ffc0(0x356)])){const _0x506957=_0x353326?.[_0x19ffc0(0x2e2)]||_0x1ac9fb?.[_0x19ffc0(0x353)]||'';if(!_0x506957)throw new _0x5c6058(_0x40a286[_0x19ffc0(0x1b6)]);return _0x14e03e['info']({'voiceUrl':_0x5f39ee,'recognizedTextPreview':_0x506957['substring'](0x0,0x64)},_0x40a286[_0x19ffc0(0x287)]),_0x506957;}else _0x37acdd=typeof _0x3e0b42[_0x19ffc0(0x2db)]===_0x40a286[_0x19ffc0(0x253)]?_0x3e0b42[_0x19ffc0(0x2db)]:_0x3e0b42[_0x19ffc0(0x2db)][_0x19ffc0(0x2db)]||JSON['stringify'](_0x3e0b42['content']);}else{if(_0x3e0b42?.[_0x19ffc0(0x2bb)]){if(_0x40a286[_0x19ffc0(0x20e)]===_0x19ffc0(0x2dc))return{'code':0xc8,'message':_0x19ffc0(0x296),'status':_0x40a286[_0x19ffc0(0x1b3)],'data':{'userId':_0xdd4065,'username':'user','nickname':_0x40a286['Tsiot'],'portraitUri':'','phone':'','email':'','signature':'','gender':'','birthday':'','status':_0x19ffc0(0x28f)}};else _0x37acdd=_0x40a286[_0x19ffc0(0x18f)](typeof _0x3e0b42['_raw_content'],_0x40a286[_0x19ffc0(0x253)])?_0x3e0b42[_0x19ffc0(0x2bb)]:JSON[_0x19ffc0(0x28d)](_0x3e0b42[_0x19ffc0(0x2bb)]);}}if(!_0x37acdd){log[_0x19ffc0(0x1f4)](_0x40a286[_0x19ffc0(0x2ff)]);return;}const _0xbd411b=!!_0x3e0b42?.['room_id'];if(_0xbd411b){if(_0x40a286['HfVdi'](_0x40a286[_0x19ffc0(0x205)],_0x19ffc0(0x21c)))return _0x50a419[_0x19ffc0(0x19e)]({'err':_0x1eb812,'targetId':_0x2029b5,'conversationType':_0x14aea3},'sendToUser:\x20消息发送失败'),{'success':![],'error':_0xf4b24f['message']||vdRkzX[_0x19ffc0(0x2f7)](_0x357252,_0x17e32b)};else{log['info']({'sessionId':_0x16f2f3,'roomId':_0x3e0b42['room_id']},_0x40a286[_0x19ffc0(0x22f)]),await this[_0x19ffc0(0x2ee)](_0x3e0b42,_0xc22abe,_0x37acdd);return;}}if(_0x1efa61){let _0x17a4e9;if(_0xc22abe['content']&&_0x40a286[_0x19ffc0(0x257)](typeof _0xc22abe[_0x19ffc0(0x2db)],_0x40a286['tFQfe']))_0x17a4e9=_0xc22abe[_0x19ffc0(0x2db)][_0x19ffc0(0x327)]||_0xc22abe[_0x19ffc0(0x2db)][_0x19ffc0(0x1e1)];else{if(typeof _0xc22abe[_0x19ffc0(0x2db)]===_0x40a286['VNOax'])try{const _0x17fad4=JSON[_0x19ffc0(0x2d1)](_0xc22abe[_0x19ffc0(0x2db)]);_0x17a4e9=_0x17fad4['mentionedInfo']||_0x17fad4['mentioned_info'];}catch{}}const _0x534bab=_0x3e0b42?.['mentionedInfo']||_0x3e0b42?.[_0x19ffc0(0x1e1)]||_0x17a4e9;log['info']({'sessionId':_0x16f2f3,'chatId':_0x556141,'content':_0x37acdd,'mentionedInfo':JSON[_0x19ffc0(0x28d)](_0x534bab),'dataKeys':Object[_0x19ffc0(0x389)](_0x40a286[_0x19ffc0(0x18a)](_0x3e0b42,{})),'accountId':this[_0x19ffc0(0x264)][_0x19ffc0(0x2c3)]},_0x19ffc0(0x33c));if(_0x534bab){if(_0x40a286[_0x19ffc0(0x240)](_0x40a286[_0x19ffc0(0x215)],_0x40a286[_0x19ffc0(0x215)]))_0x4365f0=_0x30f4f5[_0x19ffc0(0x2db)];else{const _0x945083=_0x534bab[_0x19ffc0(0x1d4)]||_0x534bab[_0x19ffc0(0x326)]||[],_0x191c49=!_0x945083||_0x40a286[_0x19ffc0(0x34a)](_0x945083[_0x19ffc0(0x281)],0x0),_0x19489e=_0x191c49||_0x945083['includes'](this[_0x19ffc0(0x264)]['accountId']);log['info']({'userIdList':_0x945083,'isAllMentioned':_0x191c49,'isMentioned':_0x19489e,'accountId':this[_0x19ffc0(0x264)]['accountId']},_0x19ffc0(0x198));if(!_0x19489e){log[_0x19ffc0(0x380)](_0x40a286[_0x19ffc0(0x213)]);return;}}}}if(_0x1efa61){if(_0x40a286['lIwrB'](_0x40a286[_0x19ffc0(0x2b5)],_0x40a286[_0x19ffc0(0x2b5)])){const _0x15dc91=await this[_0x19ffc0(0x1e9)](_0xc22abe[_0x19ffc0(0x208)]);if(!_0x15dc91[_0x19ffc0(0x200)]){log[_0x19ffc0(0x380)]({'groupId':_0xc22abe['targetId'],'reason':_0x15dc91[_0x19ffc0(0x1fd)]},_0x40a286['zOaSb']);return;}}else{this[_0x19ffc0(0x2b0)]=new _0x2992a2(),this['groupStatusCache']=new _0x1cbe16(),this[_0x19ffc0(0x2be)]=new _0x3bb945(),this['groupStatusLastFetch']=0x0,this['config']=_0x1a2cce,this[_0x19ffc0(0x2d0)]=_0x1c43f5,this['rongClient']=_0x56d84d,this[_0x19ffc0(0x32c)]=_0x1221fa;const _0x4743f5=_0x580f35.env.CLAW_OPS_OPENCODE_DIR||_0x4e2d78[_0x19ffc0(0x26e)]();this[_0x19ffc0(0x29e)]=new _0x4ae1ef({'baseUrl':vdRkzX['ZkZTr'],'directory':_0x4743f5}),this[_0x19ffc0(0x32b)]=new _0x199030(),this['pendingRequests']=new _0x4320d7();}}log[_0x19ffc0(0x380)]({'sessionId':_0x16f2f3,'chatId':_0x556141,'isGroup':_0x1efa61,'contentLength':_0x37acdd[_0x19ffc0(0x281)]},_0x40a286[_0x19ffc0(0x247)]),this[_0x19ffc0(0x2d0)]['updateStatus'](_0x556141,_0x40a286[_0x19ffc0(0x259)]);try{if(_0x40a286[_0x19ffc0(0x18d)]!=='Dqhly'){const _0x26b12e=await this[_0x19ffc0(0x2d0)]['getOrCreateSession'](_0x556141,'ClawMessenger\x20'+(_0x1efa61?_0xc22abe['targetId']:_0xc22abe[_0x19ffc0(0x336)])),_0x4cd68f=_0x40a286[_0x19ffc0(0x2a8)](_0x417673,_0x40a286[_0x19ffc0(0x384)])||_0x417673===RongyunMessageTypeEnum[_0x19ffc0(0x1f5)];await this[_0x19ffc0(0x32c)][_0x19ffc0(0x335)](_0x26b12e['id'],_0x37acdd),log[_0x19ffc0(0x380)]({'sessionId':_0x16f2f3,'chatId':_0x556141,'opencodeSessionId':_0x26b12e['id']},_0x40a286[_0x19ffc0(0x1f3)]);if(_0x1efa61){if(_0x40a286['YsNAd'](_0x40a286[_0x19ffc0(0x1c6)],_0x40a286[_0x19ffc0(0x1c6)]))return;else this[_0x19ffc0(0x388)](_0xc22abe['targetId']);}}else{if(_0x4358ce[_0x19ffc0(0x2db)]&&typeof _0x25d5ad['content']===_0x40a286[_0x19ffc0(0x253)])_0x59a9b0=_0x186546[_0x19ffc0(0x2d1)](_0x5d676c[_0x19ffc0(0x2db)]);else _0x555516['content']&&_0x40a286[_0x19ffc0(0x1b0)](typeof _0xd1cd7c[_0x19ffc0(0x2db)],_0x40a286[_0x19ffc0(0x176)])&&(_0x368436=_0x264094['content']);}}catch(_0x4ca9a6){log[_0x19ffc0(0x19e)]({'err':_0x4ca9a6,'sessionId':_0x16f2f3,'chatId':_0x556141},_0x40a286[_0x19ffc0(0x1ae)]),this[_0x19ffc0(0x2d0)][_0x19ffc0(0x2b3)](_0x556141,_0x40a286[_0x19ffc0(0x2a3)]);try{const _0x516231=JSON[_0x19ffc0(0x28d)]({'content':_0x40a286[_0x19ffc0(0x31e)],'extra':JSON[_0x19ffc0(0x28d)]({'from_node':this[_0x19ffc0(0x264)]['accountId'],'is_ai':!![]})});await this['rongClient'][_0x19ffc0(0x30c)](_0x40a286['NCNnM'](_0xc22abe[_0x19ffc0(0x24d)],0x3)?_0xc22abe[_0x19ffc0(0x208)]:_0xc22abe['senderUserId'],_0x516231,_0xc22abe['conversationType']);}catch{}}}async[a0_0x43e8cf(0x2ee)](_0x448190,_0x3823c1,_0x401672){const _0x3c648f=a0_0x43e8cf,_0x2cd32d={'LdgYF':'Duplicate\x20message\x20filtered','TWIcE':_0x3c648f(0x1c7),'UblXF':_0x3c648f(0x31a),'jnGnm':'fVqBD','JlWYJ':_0x3c648f(0x1c8),'PllTx':_0x3c648f(0x296),'UJcty':'Device\x20chat\x20reply\x20sent\x20as\x20CHAT_MESSAGE','GKVrP':function(_0x5d0f2d,_0x42001b){return _0x5d0f2d+_0x42001b;},'kxDmC':_0x3c648f(0x2f9),'QALBf':_0x3c648f(0x179),'RhYeM':_0x3c648f(0x19e)},_0x5850b4=_0x448190[_0x3c648f(0x357)],_0x485bb7=_0x448190['request_id']||_0x448190['requestId'],_0x1f5ec2=_0x448190[_0x3c648f(0x258)]||_0x448190['sourceImId']||_0x3823c1[_0x3c648f(0x336)];log['info']({'roomId':_0x5850b4,'targetId':_0x1f5ec2,'contentLength':_0x401672[_0x3c648f(0x281)]},_0x2cd32d[_0x3c648f(0x311)]);try{if(_0x2cd32d[_0x3c648f(0x1b8)]===_0x2cd32d[_0x3c648f(0x1a4)]){_0x1dc322[_0x3c648f(0x171)]({'messageUId':_0x5afcd7[_0x3c648f(0x2fc)]},arvPaK[_0x3c648f(0x1d9)]);return;}else{const _0x4de9cd=await this['opsOpencode'][_0x3c648f(0x304)](_0x3c648f(0x270)+_0x5850b4);log[_0x3c648f(0x380)]({'sessionId':_0x4de9cd['id'],'roomId':_0x5850b4},'Created\x20ops\x20session\x20for\x20device\x20chat');const _0x17cae7=await this[_0x3c648f(0x29e)][_0x3c648f(0x277)](_0x4de9cd['id'],_0x401672);log[_0x3c648f(0x380)]({'roomId':_0x5850b4,'responseLength':_0x17cae7[_0x3c648f(0x281)]},_0x2cd32d['JlWYJ']);const _0x26f07c=JSON[_0x3c648f(0x28d)]({'msg_type':RongyunMessageTypeEnum['CHAT_MESSAGE'],'request_id':_0x485bb7,'content':_0x17cae7,'status':_0x2cd32d[_0x3c648f(0x244)],'room_id':_0x5850b4});await this[_0x3c648f(0x320)][_0x3c648f(0x30c)](_0x1f5ec2,_0x26f07c,_0x3823c1[_0x3c648f(0x24d)]),log[_0x3c648f(0x380)]({'targetId':_0x1f5ec2,'roomId':_0x5850b4},_0x2cd32d['UJcty']);}}catch(_0x383050){log[_0x3c648f(0x19e)]({'err':_0x383050,'roomId':_0x5850b4,'targetId':_0x1f5ec2},_0x3c648f(0x387));const _0x3a0b62=JSON['stringify']({'msg_type':RongyunMessageTypeEnum[_0x3c648f(0x1f5)],'request_id':_0x485bb7,'content':_0x2cd32d['GKVrP'](_0x2cd32d[_0x3c648f(0x1f7)],_0x383050[_0x3c648f(0x2c7)]||_0x2cd32d[_0x3c648f(0x24f)]),'status':_0x2cd32d[_0x3c648f(0x1b9)],'room_id':_0x5850b4});await this[_0x3c648f(0x320)][_0x3c648f(0x30c)](_0x1f5ec2,_0x3a0b62,_0x3823c1[_0x3c648f(0x24d)]);}}async['handleCreateOpencodeSession'](_0x3e2054,_0x495018){const _0x3746c6=a0_0x43e8cf,_0x231e3e={'CKqhs':function(_0x194245,_0x24dec5){return _0x194245!==_0x24dec5;},'MfoMj':'success','RUNTD':_0x3746c6(0x2bd),'gaEQi':_0x3746c6(0x34c),'KfXzb':_0x3746c6(0x1ee),'EWUCa':_0x3746c6(0x2ab),'ocPQS':function(_0x365e92,_0x4f02c9){return _0x365e92===_0x4f02c9;},'pAGCb':_0x3746c6(0x2f3),'ZapzE':function(_0x396833,_0x24b965){return _0x396833/_0x24b965;},'hDFYZ':_0x3746c6(0x178),'EFLkZ':'创建\x20OpenCode\x20会话失败','eFjoM':_0x3746c6(0x19e)},_0x2b9e04=_0x231e3e['ocPQS'](_0x495018[_0x3746c6(0x24d)],0x3)?_0x495018['targetId']:_0x3e2054[_0x3746c6(0x258)]||_0x3e2054[_0x3746c6(0x1ce)],_0x129fe2=_0x3e2054['title']||'新会话';try{if(_0x231e3e['pAGCb']!==_0x231e3e['pAGCb']){const _0x202b31=_0x231e3e[_0x3746c6(0x227)](this[_0x3746c6(0x32c)],null);return{'code':0xc8,'message':_0x3746c6(0x296),'status':_0x231e3e[_0x3746c6(0x1ec)],'data':{'nodeId':this[_0x3746c6(0x264)]['accountId'],'status':_0x202b31?_0x231e3e[_0x3746c6(0x20f)]:_0x231e3e['gaEQi'],'openclawUrl':this[_0x3746c6(0x264)][_0x3746c6(0x233)],'version':_0x231e3e[_0x3746c6(0x194)]}};}else{const _0x5556b4='claw-'+_0x2b9e04,_0x37d25f=await this[_0x3746c6(0x2d0)][_0x3746c6(0x358)](_0x5556b4,_0x129fe2),_0x4e7710={'msg_type':RongyunMessageTypeEnum['OPENCODE_SESSION_CREATED'],'request_id':_0x3e2054[_0x3746c6(0x220)],'source_im_id':_0x3e2054[_0x3746c6(0x305)]||_0x495018[_0x3746c6(0x208)],'destination_im_id':_0x2b9e04,'content':JSON[_0x3746c6(0x28d)]({'status':_0x231e3e['MfoMj'],'opencode_session_id':_0x37d25f['id'],'session_id':_0x5556b4,'title':_0x129fe2}),'timestamp':Math[_0x3746c6(0x255)](_0x231e3e['ZapzE'](Date['now'](),0x3e8))};await this[_0x3746c6(0x320)][_0x3746c6(0x30c)](_0x2b9e04,JSON[_0x3746c6(0x28d)](_0x4e7710),_0x495018[_0x3746c6(0x24d)]);}}catch(_0x15e060){if(_0x231e3e['CKqhs'](_0x231e3e[_0x3746c6(0x298)],_0x231e3e[_0x3746c6(0x298)]))throw new _0x200c8a(_0x231e3e[_0x3746c6(0x27d)]);else{log[_0x3746c6(0x19e)]({'err':_0x15e060},_0x231e3e['EFLkZ']);const _0x3efce7={'msg_type':RongyunMessageTypeEnum[_0x3746c6(0x26f)],'request_id':_0x3e2054[_0x3746c6(0x220)],'source_im_id':_0x3e2054[_0x3746c6(0x305)]||_0x495018[_0x3746c6(0x208)],'destination_im_id':_0x2b9e04,'content':JSON['stringify']({'status':_0x231e3e[_0x3746c6(0x180)],'message':_0x15e060[_0x3746c6(0x2c7)]}),'timestamp':Math['floor'](_0x231e3e[_0x3746c6(0x2e9)](Date[_0x3746c6(0x341)](),0x3e8))};await this[_0x3746c6(0x320)][_0x3746c6(0x30c)](_0x2b9e04,JSON[_0x3746c6(0x28d)](_0x3efce7),_0x495018[_0x3746c6(0x24d)]);}}}async[a0_0x43e8cf(0x1d7)](_0x453e07,_0xf006c2){const _0x337897=a0_0x43e8cf,_0x5d1342={'ocVYY':'Ops\x20chat\x20message\x20content\x20is\x20empty','zLFig':function(_0x256f0b,_0x12868c){return _0x256f0b===_0x12868c;},'PPVgp':_0x337897(0x364),'sIepJ':_0x337897(0x32f),'qQyFu':function(_0x5adbfc,_0x2ad079,_0x233a4f){return _0x5adbfc(_0x2ad079,_0x233a4f);},'slzUc':'OpenCode\x20status\x20check\x20result','bwITU':'运行中','CFKqB':'unknown','VUQSb':function(_0x59c2ca,_0x4531e2){return _0x59c2ca/_0x4531e2;},'nfgOG':_0x337897(0x1e3),'LKfQu':_0x337897(0x351),'mbugE':function(_0x3b7bd8,_0xcaa35a){return _0x3b7bd8+_0xcaa35a;},'jKZXm':_0x337897(0x293),'AREDg':function(_0x428135,_0x24b85d){return _0x428135!==_0x24b85d;},'xUgih':_0x337897(0x1b1),'ykswT':'Failed\x20to\x20send\x20device\x20status\x20error\x20report'},_0x5cf5e6=_0x5d1342[_0x337897(0x26b)](_0xf006c2[_0x337897(0x24d)],0x3)?_0xf006c2[_0x337897(0x208)]:_0x453e07[_0x337897(0x258)]||_0x453e07[_0x337897(0x1ce)]||_0xf006c2['senderUserId'],_0x53be31=this['config'][_0x337897(0x233)];log[_0x337897(0x380)]({'targetId':_0x5cf5e6,'opencodeUrl':_0x53be31},'Processing\x20device\x20status\x20request');try{if(_0x5d1342['PPVgp']===_0x5d1342[_0x337897(0x2ea)])_0x13e117=_0x761b38['parse'](_0xea88c7[_0x337897(0x2db)]);else{const _0x4903dc=_0x53be31?await _0x5d1342[_0x337897(0x231)](checkOpencodeStatus,_0x53be31,this['config'][_0x337897(0x367)]):![];log[_0x337897(0x380)]({'opencodeOk':_0x4903dc},_0x5d1342[_0x337897(0x35f)]);const _0x462daf={'open_claw_status':_0x4903dc?0x1:0x0,'status_message':_0x4903dc?_0x5d1342[_0x337897(0x312)]:_0x337897(0x2bf),'version':_0x5d1342[_0x337897(0x30d)],'timestamp':Date[_0x337897(0x341)]()},_0x5b976f={'msg_type':RongyunMessageTypeEnum[_0x337897(0x2e7)],'request_id':_0x453e07['request_id'],'source_im_id':this[_0x337897(0x264)]['accountId'],'destination_im_id':_0x5cf5e6,'content':JSON[_0x337897(0x28d)](_0x462daf),'timestamp':Math[_0x337897(0x255)](_0x5d1342[_0x337897(0x34d)](Date['now'](),0x3e8))};await this[_0x337897(0x320)][_0x337897(0x30c)](_0x5cf5e6,JSON['stringify'](_0x5b976f),_0xf006c2[_0x337897(0x24d)]),log[_0x337897(0x380)]({'targetId':_0x5cf5e6,'status':_0x462daf[_0x337897(0x177)]},_0x5d1342[_0x337897(0x18b)]);}}catch(_0x29520a){log[_0x337897(0x19e)]({'err':_0x29520a['message']||_0x29520a,'targetId':_0x5cf5e6},_0x5d1342[_0x337897(0x17f)]);const _0xb83d9b={'msg_type':RongyunMessageTypeEnum['DEVICE_STATUS_REPORT'],'request_id':_0x453e07[_0x337897(0x220)],'source_im_id':this[_0x337897(0x264)][_0x337897(0x2c3)],'destination_im_id':_0x5cf5e6,'content':JSON[_0x337897(0x28d)]({'open_claw_status':-0x1,'status_message':_0x5d1342['mbugE'](_0x5d1342[_0x337897(0x28a)],_0x29520a[_0x337897(0x2c7)]||_0x337897(0x179)),'timestamp':Date[_0x337897(0x341)]()}),'timestamp':Math[_0x337897(0x255)](_0x5d1342[_0x337897(0x34d)](Date['now'](),0x3e8))};try{if(_0x5d1342[_0x337897(0x185)](_0x337897(0x243),_0x5d1342['xUgih']))await this[_0x337897(0x320)][_0x337897(0x30c)](_0x5cf5e6,JSON[_0x337897(0x28d)](_0xb83d9b),_0xf006c2[_0x337897(0x24d)]);else{_0x38c216[_0x337897(0x1f4)](_0x5d1342['ocVYY']);return;}}catch(_0x10c57d){if(_0x5d1342[_0x337897(0x26b)](_0x337897(0x1e0),_0x337897(0x1e0)))log['error']({'sendErr':_0x10c57d},_0x5d1342['ykswT']);else return{'allowed':!![]};}}}async[a0_0x43e8cf(0x1fa)](_0x373fc9,_0x31eea1){const _0x20e53d=a0_0x43e8cf,_0x363124={'gLzIk':function(_0x398079,_0x3b8ac9){return _0x398079===_0x3b8ac9;},'xBykW':_0x20e53d(0x225),'pFvUC':function(_0x375e28,_0x4fa662){return _0x375e28===_0x4fa662;},'UfGnJ':_0x20e53d(0x318),'athIw':_0x20e53d(0x266),'xgPMG':'xIrTR','BSVVD':_0x20e53d(0x207),'Tnvwx':_0x20e53d(0x1ed),'PCJLC':_0x20e53d(0x263)},_0x2c3b2c=_0x363124[_0x20e53d(0x21b)](_0x31eea1['conversationType'],0x3)?_0x31eea1[_0x20e53d(0x208)]:_0x373fc9[_0x20e53d(0x258)]||_0x373fc9['sourceImId']||_0x31eea1[_0x20e53d(0x336)];let _0x5e0242={};try{if(_0x373fc9[_0x20e53d(0x2db)]&&_0x363124[_0x20e53d(0x21b)](typeof _0x373fc9[_0x20e53d(0x2db)],_0x363124[_0x20e53d(0x228)]))_0x5e0242=JSON[_0x20e53d(0x2d1)](_0x373fc9[_0x20e53d(0x2db)]);else _0x373fc9[_0x20e53d(0x2db)]&&_0x363124['pFvUC'](typeof _0x373fc9[_0x20e53d(0x2db)],_0x363124[_0x20e53d(0x303)])&&(_0x5e0242=_0x373fc9[_0x20e53d(0x2db)]);}catch{_0x363124[_0x20e53d(0x2a1)]!==_0x363124[_0x20e53d(0x248)]?_0x5e0242={}:_0x3e976d={'content':_0x24f441[_0x20e53d(0x2db)]};}const _0x48046c=_0x5e0242['cmd'],_0x1ccb13={0x1:_0x363124[_0x20e53d(0x365)],0x2:_0x363124[_0x20e53d(0x196)],0x3:_0x363124[_0x20e53d(0x22c)],0x4:_0x20e53d(0x1eb),0x5:_0x20e53d(0x2e3)},_0x75969f=_0x1ccb13[_0x48046c]||_0x20e53d(0x242)+_0x48046c+')';log[_0x20e53d(0x380)]({'targetId':_0x2c3b2c,'cmd':_0x48046c,'cmdName':_0x75969f},'Processing\x20device\x20control');const _0x1a5175={'msg_type':RongyunMessageTypeEnum[_0x20e53d(0x321)],'request_id':_0x373fc9[_0x20e53d(0x220)],'command':_0x75969f,'cmd':_0x48046c,'status':_0x20e53d(0x296),'message':_0x20e53d(0x34f)+_0x75969f+_0x20e53d(0x29c),'timestamp':Math[_0x20e53d(0x255)](Date[_0x20e53d(0x341)]()/0x3e8)};await this[_0x20e53d(0x320)][_0x20e53d(0x30c)](_0x2c3b2c,JSON[_0x20e53d(0x28d)](_0x1a5175),_0x31eea1['conversationType']);}async[a0_0x43e8cf(0x17d)](_0x1d68e3,_0x26183c){const _0x3c3752=a0_0x43e8cf,_0x21c5bb={'ilknw':_0x3c3752(0x219),'BrzkC':function(_0x1fc9d7,_0x532de0){return _0x1fc9d7!==_0x532de0;},'vgUQF':_0x3c3752(0x21e),'gFLgM':_0x3c3752(0x2b2),'oMGoa':'device_status_request','KPumQ':'command_result','FkiEk':function(_0x275a70,_0x31af68){return _0x275a70||_0x31af68;},'mQdrn':function(_0x1aeac5,_0x2bef59){return _0x1aeac5!==_0x2bef59;},'oXOGf':_0x3c3752(0x23e),'yWvvY':_0x3c3752(0x340),'pGQIf':_0x3c3752(0x2c4),'GBHNz':function(_0x16e80f,_0x4b4b34){return _0x16e80f===_0x4b4b34;},'XWDLz':'function','JLoLA':function(_0x1b841a,_0x74d3b9){return _0x1b841a===_0x74d3b9;},'ycsek':_0x3c3752(0x175),'lCBCG':_0x3c3752(0x32e),'KQpoN':'error','sIFRb':_0x3c3752(0x1c2),'hTMfA':_0x3c3752(0x355),'UZsvC':'success'},_0x3bec8b=_0x1d68e3[_0x3c3752(0x199)];if(_0x3bec8b&&_0x21c5bb[_0x3c3752(0x38a)](_0x3bec8b,_0x21c5bb[_0x3c3752(0x1cb)])&&_0x21c5bb['BrzkC'](_0x3bec8b,RongyunMessageTypeEnum[_0x3c3752(0x37c)])){log[_0x3c3752(0x380)]({'nestedMsgType':_0x3bec8b},_0x3c3752(0x26c));switch(_0x3bec8b){case RongyunMessageTypeEnum[_0x3c3752(0x36b)]:case _0x3c3752(0x1a9):await this[_0x3c3752(0x2cf)](_0x1d68e3,_0x26183c);return;case RongyunMessageTypeEnum['DEVICE_CONTROL']:case _0x21c5bb[_0x3c3752(0x17c)]:await this[_0x3c3752(0x1fa)](_0x1d68e3,_0x26183c);return;case RongyunMessageTypeEnum['DEVICE_STATUS_REQUEST']:case _0x21c5bb[_0x3c3752(0x214)]:await this[_0x3c3752(0x1d7)](_0x1d68e3,_0x26183c);return;case RongyunMessageTypeEnum[_0x3c3752(0x262)]:case _0x21c5bb[_0x3c3752(0x319)]:this[_0x3c3752(0x25a)](_0x1d68e3,_0x26183c);return;}}const _0xc90e5e=_0x1d68e3[_0x3c3752(0x2c8)]||_0x1d68e3[_0x3c3752(0x220)],_0x3cc57a=_0x1d68e3[_0x3c3752(0x2c9)],_0x591672=_0x1d68e3['action'],_0x460fa4=_0x1d68e3['payload']||{},_0x468168=_0x1d68e3[_0x3c3752(0x258)]||_0x1d68e3['sourceImId']||_0x26183c[_0x3c3752(0x336)],_0x8eedac=_0x1d68e3[_0x3c3752(0x305)]||_0x1d68e3['destinationImId']||_0x26183c[_0x3c3752(0x208)];if(_0x21c5bb[_0x3c3752(0x28b)](!_0x3cc57a,!_0x591672)){if(_0x21c5bb[_0x3c3752(0x297)](_0x21c5bb['oXOGf'],_0x21c5bb['oXOGf']))return;else{log[_0x3c3752(0x171)]({'requestId':_0xc90e5e,'senderUserId':_0x26183c['senderUserId']},_0x21c5bb['yWvvY']);return;}}log[_0x3c3752(0x380)]({'requestId':_0xc90e5e,'service':_0x3cc57a,'action':_0x591672},_0x21c5bb[_0x3c3752(0x35d)]);const _0xfbd8ee=_0x3c3752(0x313)+_0x3cc57a+'_'+_0x591672;let _0x424214;try{if(_0x21c5bb['GBHNz'](typeof this[_0xfbd8ee],_0x21c5bb[_0x3c3752(0x1ab)]))_0x424214=await this[_0xfbd8ee](_0x460fa4,_0x468168);else{if(_0x21c5bb[_0x3c3752(0x1a2)](_0x21c5bb['ycsek'],_0x21c5bb[_0x3c3752(0x195)])){_0x4fa543[_0x3c3752(0x171)]({'chatId':_0x4f468c,'sessionId':_0x5859f9},IFrsNn[_0x3c3752(0x284)]);return;}else log[_0x3c3752(0x1f4)]({'handlerName':_0xfbd8ee},_0x3c3752(0x234)),_0x424214={'code':0x194,'message':_0x3c3752(0x236)+_0x3cc57a+'/'+_0x591672,'status':_0x21c5bb[_0x3c3752(0x260)]};}}catch(_0x54367c){log[_0x3c3752(0x19e)]({'err':_0x54367c,'handlerName':_0xfbd8ee},_0x21c5bb[_0x3c3752(0x300)]),_0x424214={'code':0x1f4,'message':_0x54367c[_0x3c3752(0x2c7)]||_0x21c5bb['hTMfA'],'status':_0x3c3752(0x19e)};}const _0x1f5653={'msg_type':RongyunMessageTypeEnum['COMMAND_RESULT'],'requestId':_0xc90e5e,'service':_0x3cc57a,'action':_0x591672,'status':_0x424214[_0x3c3752(0x1eb)]||_0x3c3752(0x296),'code':_0x424214['code']||0xc8,'data':_0x424214['data']||null,'message':_0x424214[_0x3c3752(0x2c7)]||_0x21c5bb[_0x3c3752(0x183)],'timestamp':Date['now']()};await this['rongClient'][_0x3c3752(0x30c)](_0x468168,JSON[_0x3c3752(0x28d)](_0x1f5653),_0x26183c[_0x3c3752(0x24d)]);}['handleCommandResult'](_0x354ee8,_0x2b8bd6){const _0x584f8e=a0_0x43e8cf,_0x8c2a2b={'RseYx':function(_0x39f8c4,_0x2e8102){return _0x39f8c4===_0x2e8102;},'tMJjr':_0x584f8e(0x2a7),'gPEEN':'Command\x20result\x20missing\x20requestId','jtSbH':_0x584f8e(0x2fb),'rJbsx':_0x584f8e(0x35e),'uohfQ':'No\x20pending\x20request\x20found\x20for\x20command\x20result','WkaML':function(_0x3a2315,_0x35f6cc){return _0x3a2315(_0x35f6cc);},'onDmc':function(_0x30843f,_0x2cda06){return _0x30843f===_0x2cda06;},'YzjYR':'success','PrmYt':function(_0x54a706,_0x39e830){return _0x54a706===_0x39e830;},'PHVQm':_0x584f8e(0x1aa),'anSlP':_0x584f8e(0x19b)},_0x457ee7=_0x354ee8['requestId']||_0x354ee8['request_id'];if(!_0x457ee7){log[_0x584f8e(0x1f4)](_0x8c2a2b['gPEEN']);return;}const _0xa04de8=this[_0x584f8e(0x275)][_0x584f8e(0x371)](_0x457ee7);if(!_0xa04de8){if(_0x8c2a2b[_0x584f8e(0x268)]===_0x8c2a2b[_0x584f8e(0x38b)]){const _0x54feef=_0x33b807[_0x584f8e(0x1d4)]||_0x5a95cf[_0x584f8e(0x326)]||[],_0x1f1187=!_0x54feef||oYHRkj[_0x584f8e(0x299)](_0x54feef[_0x584f8e(0x281)],0x0),_0x460a26=_0x1f1187||_0x54feef[_0x584f8e(0x2d5)](this[_0x584f8e(0x264)][_0x584f8e(0x2c3)]);_0x49bf9f['info']({'userIdList':_0x54feef,'isAllMentioned':_0x1f1187,'isMentioned':_0x460a26,'accountId':this['config'][_0x584f8e(0x2c3)]},_0x584f8e(0x198));if(!_0x460a26){_0x2c2df0[_0x584f8e(0x380)](oYHRkj[_0x584f8e(0x1fc)]);return;}}else{log[_0x584f8e(0x1f4)]({'requestId':_0x457ee7},_0x8c2a2b['uohfQ']);return;}}_0x8c2a2b['WkaML'](clearTimeout,_0xa04de8[_0x584f8e(0x202)]),this['pendingRequests'][_0x584f8e(0x32a)](_0x457ee7),_0x8c2a2b[_0x584f8e(0x33d)](_0x354ee8['status'],_0x8c2a2b['YzjYR'])&&_0x8c2a2b[_0x584f8e(0x27e)](_0x354ee8[_0x584f8e(0x328)],0xc8)?_0xa04de8['resolve'](_0x354ee8[_0x584f8e(0x251)]):_0xa04de8[_0x584f8e(0x285)](new Error(_0x354ee8[_0x584f8e(0x2c7)]||_0x8c2a2b[_0x584f8e(0x19a)])),log['info']({'requestId':_0x457ee7,'status':_0x354ee8['status'],'code':_0x354ee8['code']},_0x8c2a2b['anSlP']);}async[a0_0x43e8cf(0x359)](_0x95dd73,_0x23ff12){const _0x2c05ac=a0_0x43e8cf,_0x52fb34={'Xsqcn':'success','JHFNK':_0x2c05ac(0x172),'HXsUs':'User','DMMsA':_0x2c05ac(0x28f)};return{'code':0xc8,'message':_0x52fb34['Xsqcn'],'status':_0x2c05ac(0x296),'data':{'userId':_0x23ff12,'username':_0x52fb34[_0x2c05ac(0x17e)],'nickname':_0x52fb34[_0x2c05ac(0x1dc)],'portraitUri':'','phone':'','email':'','signature':'','gender':'','birthday':'','status':_0x52fb34['DMMsA']}};}async['_handle_user_login'](_0x13c1cb,_0x535898){const _0x56a4ee=a0_0x43e8cf;return{'code':0xc8,'message':_0x56a4ee(0x232),'status':_0x56a4ee(0x296),'data':{'userId':_0x535898,'token':this[_0x56a4ee(0x264)][_0x56a4ee(0x377)]}};}async[a0_0x43e8cf(0x2c2)](_0x314b02,_0x52d079){const _0x48a978=a0_0x43e8cf,_0x171ee6={'kAJsf':function(_0x2b370d,_0x1fa532){return _0x2b370d!==_0x1fa532;},'xGBlB':_0x48a978(0x296),'DAVQY':_0x48a978(0x34c)},_0x8e7287=_0x171ee6[_0x48a978(0x31c)](this['opencode'],null);return{'code':0xc8,'message':_0x171ee6[_0x48a978(0x343)],'status':_0x171ee6[_0x48a978(0x343)],'data':{'nodeId':this[_0x48a978(0x264)][_0x48a978(0x2c3)],'status':_0x8e7287?_0x48a978(0x2bd):_0x171ee6[_0x48a978(0x1ea)],'openclawUrl':this[_0x48a978(0x264)][_0x48a978(0x233)],'version':_0x48a978(0x1ee)}};}async[a0_0x43e8cf(0x30a)](_0x4522c4,_0xdf7ffe){const _0x59852c=a0_0x43e8cf,_0x4adbaf={'qhyLQ':'Node\x20started','bClon':_0x59852c(0x296),'rnfud':_0x59852c(0x2bd)};return{'code':0xc8,'message':_0x4adbaf['qhyLQ'],'status':_0x4adbaf[_0x59852c(0x2ba)],'data':{'nodeId':this[_0x59852c(0x264)]['accountId'],'status':_0x4adbaf['rnfud']}};}async[a0_0x43e8cf(0x30e)](_0x2b9c6c,_0x1daa8f){const _0x1f15b6=a0_0x43e8cf,_0x27df44={'QLeet':_0x1f15b6(0x2ed),'OsuWK':'offline'};return{'code':0xc8,'message':_0x27df44[_0x1f15b6(0x1a3)],'status':_0x1f15b6(0x296),'data':{'nodeId':this[_0x1f15b6(0x264)][_0x1f15b6(0x2c3)],'status':_0x27df44['OsuWK']}};}async[a0_0x43e8cf(0x272)](_0x25a17d,_0x54d50d){const _0xc9061c=a0_0x43e8cf,_0x557daf={'VTWgi':_0xc9061c(0x296)};return{'code':0xc8,'message':_0x557daf[_0xc9061c(0x289)],'status':_0x557daf[_0xc9061c(0x289)],'data':{'appKey':this[_0xc9061c(0x264)]['appKey'],'serverUrl':this[_0xc9061c(0x264)]['serverUrl']}};}async[a0_0x43e8cf(0x334)](_0x55325f,_0x3907eb){const _0x23f276=a0_0x43e8cf,_0x3f9544={'jpuUj':_0x23f276(0x249),'EgwyX':'success','CeNlh':_0x23f276(0x33a),'MEuGw':function(_0x34e1dd,_0xc6753e){return _0x34e1dd/_0xc6753e;},'sHhFn':_0x23f276(0x1f8),'kHRgl':_0x23f276(0x19e),'iQEOR':_0x23f276(0x31d)},_0x5f32df=_0x55325f[_0x23f276(0x2fe)]||_0x55325f['user_id']||_0x3907eb[_0x23f276(0x336)],_0x5b964c=_0x3907eb[_0x23f276(0x336)],_0x121461=_0x55325f[_0x23f276(0x220)]||_0x55325f[_0x23f276(0x2c8)];log[_0x23f276(0x380)]({'userId':_0x5f32df,'targetId':_0x5b964c,'requestId':_0x121461},_0x3f9544['jpuUj']);try{const _0x2220bd=_0x23f276(0x348)+_0x5f32df,_0x5e222c=await this['sessionManager'][_0x23f276(0x358)](_0x2220bd,_0x23f276(0x1df)+_0x5f32df),_0x312280={'msg_type':RongyunMessageTypeEnum[_0x23f276(0x1c3)],'request_id':_0x121461,'userId':_0x5f32df,'sessionId':_0x5e222c['id'],'status':_0x3f9544[_0x23f276(0x374)],'message':_0x3f9544[_0x23f276(0x22e)],'timestamp':Math[_0x23f276(0x255)](_0x3f9544[_0x23f276(0x354)](Date[_0x23f276(0x341)](),0x3e8))};await this[_0x23f276(0x320)][_0x23f276(0x30c)](_0x5b964c,JSON[_0x23f276(0x28d)](_0x312280),_0x3907eb[_0x23f276(0x24d)]),log[_0x23f276(0x380)]({'userId':_0x5f32df,'sessionId':_0x5e222c['id']},_0x23f276(0x25b));}catch(_0x1fd663){log[_0x23f276(0x19e)]({'err':_0x1fd663,'userId':_0x5f32df},_0x3f9544['sHhFn']);const _0x3b0f18={'msg_type':RongyunMessageTypeEnum['SERVICE_SESSION_CREATED'],'request_id':_0x121461,'userId':_0x5f32df,'status':_0x3f9544['kHRgl'],'message':_0x1fd663[_0x23f276(0x2c7)]||_0x3f9544['iQEOR'],'timestamp':Math[_0x23f276(0x255)](_0x3f9544[_0x23f276(0x354)](Date[_0x23f276(0x341)](),0x3e8))};await this[_0x23f276(0x320)][_0x23f276(0x30c)](_0x5b964c,JSON['stringify'](_0x3b0f18),_0x3907eb[_0x23f276(0x24d)]);}}async['_recognizeVoice'](_0x4fd347){const _0x4ce1b9=a0_0x43e8cf,_0x530c5c={'xNziS':_0x4ce1b9(0x361),'TrwjB':_0x4ce1b9(0x296),'pUueR':_0x4ce1b9(0x2bd),'WRvXm':function(_0xae3e3e,_0x59b7ba){return _0xae3e3e!==_0x59b7ba;},'cqxhk':'axKoU','yMCxv':_0x4ce1b9(0x27c),'KcgKR':function(_0x404a32,_0x27314d){return _0x404a32(_0x27314d);},'KspRq':'语音识别请求超时','BGQbr':'Voice\x20recognition\x20command\x20sent\x20via\x20RongCloud','GekRF':_0x4ce1b9(0x246),'rrrHr':'arQLi','TOzoL':'rzWUg','gieAQ':_0x4ce1b9(0x37d),'kOtvE':function(_0x587e61,_0x2860ee){return _0x587e61(_0x2860ee);},'yYwGL':_0x4ce1b9(0x179),'jCDgs':_0x4ce1b9(0x192),'glNtC':_0x4ce1b9(0x1da),'eDzPR':function(_0x2ed00a,_0x28f321,_0x511608){return _0x2ed00a(_0x28f321,_0x511608);},'HMcPG':_0x4ce1b9(0x2d8),'euZtB':_0x4ce1b9(0x2ae),'gFuVD':_0x4ce1b9(0x1c5),'RamaK':function(_0x553a45,_0x5b8d7e){return _0x553a45!==_0x5b8d7e;},'xurku':_0x4ce1b9(0x366),'BpuPe':_0x4ce1b9(0x2ab)},_0x147319='vr_'+Date[_0x4ce1b9(0x341)]()+'_'+Math[_0x4ce1b9(0x1e5)]()[_0x4ce1b9(0x27f)](0x24)[_0x4ce1b9(0x2ca)](0x2,0xa);return new Promise((_0x5d7c16,_0x1881c6)=>{const _0xfe350=_0x4ce1b9,_0x402948={'nfAud':_0x530c5c[_0xfe350(0x1a8)],'AeCCV':_0x530c5c[_0xfe350(0x347)],'sGTLr':function(_0x3904d5,_0x543b47){return _0x530c5c['WRvXm'](_0x3904d5,_0x543b47);},'jKUMM':_0x530c5c['rrrHr'],'RsikO':_0x530c5c['TOzoL'],'rLfKz':_0x530c5c['gieAQ'],'cOHuR':function(_0x18f910,_0x48ba6b){const _0x163e62=_0xfe350;return _0x530c5c[_0x163e62(0x38c)](_0x18f910,_0x48ba6b);},'dqoHJ':function(_0x706b5,_0x1f8b77){return _0x706b5+_0x1f8b77;},'jQoIQ':_0x530c5c['yYwGL']};if(_0x530c5c['jCDgs']===_0x530c5c[_0xfe350(0x34b)])return{'code':0xc8,'message':fYLRPo[_0xfe350(0x37a)],'status':fYLRPo['TrwjB'],'data':{'nodeId':this[_0xfe350(0x264)][_0xfe350(0x2c3)],'status':fYLRPo[_0xfe350(0x2bc)]}};else{const _0x3bd676=_0x530c5c[_0xfe350(0x197)](setTimeout,()=>{const _0x41333f=_0xfe350;_0x530c5c[_0x41333f(0x210)](_0x530c5c[_0x41333f(0x216)],_0x530c5c[_0x41333f(0x36f)])?(this[_0x41333f(0x275)]['delete'](_0x147319),_0x530c5c[_0x41333f(0x273)](_0x1881c6,new Error(_0x530c5c[_0x41333f(0x2d3)]))):_0x9890d6[_0x41333f(0x24c)](_0x586211[_0x41333f(0x251)]);},0x7530);this[_0xfe350(0x275)]['set'](_0x147319,{'resolve':_0x5d7c16,'reject':_0x1881c6,'timer':_0x3bd676});const _0x2aa544={'msg_type':RongyunMessageTypeEnum[_0xfe350(0x37c)],'requestId':_0x147319,'service':'ai','action':_0x530c5c[_0xfe350(0x35a)],'payload':{'voiceUrl':_0x4fd347,'format':_0xfe350(0x1c9),'sampleRate':0x3e80},'timestamp':Date[_0xfe350(0x341)]()};this[_0xfe350(0x320)][_0xfe350(0x30c)](_0x530c5c['euZtB'],JSON[_0xfe350(0x28d)](_0x2aa544),0x1)[_0xfe350(0x22d)](()=>{const _0x13bc6b=_0xfe350;log[_0x13bc6b(0x380)]({'requestId':_0x147319,'voiceUrl':_0x4fd347},_0x402948[_0x13bc6b(0x25c)]);})['catch'](_0x56bddd=>{const _0x385633=_0xfe350,_0x361ccb={'OeeSb':_0x402948[_0x385633(0x2ac)]};if(_0x402948[_0x385633(0x1bd)](_0x402948['jKUMM'],_0x402948[_0x385633(0x352)]))clearTimeout(_0x3bd676),this['pendingRequests']['delete'](_0x147319),log[_0x385633(0x19e)]({'err':_0x56bddd[_0x385633(0x2c7)],'requestId':_0x147319},_0x402948[_0x385633(0x292)]),_0x402948['cOHuR'](_0x1881c6,new Error(_0x402948[_0x385633(0x1d1)]('发送语音识别请求失败:\x20',_0x56bddd[_0x385633(0x2c7)]||_0x402948[_0x385633(0x288)])));else{_0x2c8020[_0x385633(0x1f4)]({'requestId':_0x130012},yeKWtp[_0x385633(0x1c0)]);return;}});}})[_0x4ce1b9(0x22d)](_0x4e3db0=>{const _0x47a1fd=_0x4ce1b9,_0x52f5f8=_0x4e3db0?.[_0x47a1fd(0x2e2)]||_0x4e3db0?.[_0x47a1fd(0x353)]||'';if(!_0x52f5f8){if(_0x530c5c['RamaK'](_0x530c5c['xurku'],_0x47a1fd(0x1ca)))throw new Error(_0x530c5c[_0x47a1fd(0x317)]);else{let _0x473f2d=this[_0x47a1fd(0x2b0)][_0x47a1fd(0x371)](_0x14f5d3);!_0x473f2d&&(_0x473f2d={'count':0x0,'lastTimestamp':0x0},this[_0x47a1fd(0x2b0)][_0x47a1fd(0x37b)](_0x15fd51,_0x473f2d)),_0x473f2d[_0x47a1fd(0x2b9)]+=0x1,_0x473f2d[_0x47a1fd(0x25e)]=_0x197d42[_0x47a1fd(0x341)](),_0x1b5514[_0x47a1fd(0x380)]({'groupId':_0x2ed2e5,'count':_0x473f2d[_0x47a1fd(0x2b9)]},fYLRPo['gFuVD']);}}return log['info']({'voiceUrl':_0x4fd347,'recognizedTextPreview':_0x52f5f8[_0x47a1fd(0x278)](0x0,0x64)},_0x47a1fd(0x1be)),_0x52f5f8;});}async[a0_0x43e8cf(0x1fb)](_0x43045e,_0x347adc){const _0x3ed6d5=a0_0x43e8cf,_0x566bf2={'adEaO':_0x3ed6d5(0x2ed),'qfUcl':_0x3ed6d5(0x34c),'tDvHM':_0x3ed6d5(0x38d),'HPUPw':_0x3ed6d5(0x1e2),'fbqYu':_0x3ed6d5(0x252),'aVEJM':_0x3ed6d5(0x1a7),'UtwGC':_0x3ed6d5(0x1af),'LfYHt':function(_0x203bb3,_0x203463){return _0x203bb3!==_0x203463;},'fyYIZ':_0x3ed6d5(0x265),'NRfzN':_0x3ed6d5(0x27b)},_0x57e1da=_0x43045e[_0x3ed6d5(0x267)]||_0x43045e['remote_url']||_0x43045e[_0x3ed6d5(0x1b2)],_0x248229=_0x43045e[_0x3ed6d5(0x34e)]||0x0;if(!_0x57e1da){if(_0x566bf2[_0x3ed6d5(0x237)]===_0x566bf2[_0x3ed6d5(0x1ac)])try{const _0x4d9b12=_0xaf8e57[_0x3ed6d5(0x2d1)](_0x2ff57d[_0x3ed6d5(0x2db)]);_0x404b2c=_0x4d9b12[_0x3ed6d5(0x327)]||_0x4d9b12[_0x3ed6d5(0x1e1)];}catch{}else{log[_0x3ed6d5(0x1f4)]({'messageType':_0x347adc[_0x3ed6d5(0x256)]},'Voice\x20message\x20missing\x20remoteUrl');return;}}log[_0x3ed6d5(0x380)]({'voiceUrl':_0x57e1da,'duration':_0x248229,'senderUserId':_0x347adc[_0x3ed6d5(0x336)]},_0x566bf2[_0x3ed6d5(0x245)]);try{const _0x5d1e22=await this[_0x3ed6d5(0x209)](_0x57e1da);log[_0x3ed6d5(0x380)]({'voiceUrl':_0x57e1da,'recognizedText':_0x5d1e22},_0x566bf2[_0x3ed6d5(0x33b)]);const _0x4a9edd={..._0x43045e,'content':_0x5d1e22,'_raw_content':_0x5d1e22,'voiceUrl':_0x57e1da,'voiceDuration':_0x248229};await this[_0x3ed6d5(0x1bf)](_0x4a9edd,_0x347adc,_0x347adc['messageType']);}catch(_0x9d0555){log[_0x3ed6d5(0x19e)]({'err':_0x9d0555[_0x3ed6d5(0x2c7)],'voiceUrl':_0x57e1da},_0x3ed6d5(0x307));const _0x407f74=JSON[_0x3ed6d5(0x28d)]({'content':_0x566bf2[_0x3ed6d5(0x390)],'extra':JSON[_0x3ed6d5(0x28d)]({'from_node':this[_0x3ed6d5(0x264)]['accountId'],'is_ai':!![],'is_error':!![]})});try{await this[_0x3ed6d5(0x320)]['sendMessage'](_0x347adc['senderUserId'],_0x407f74,_0x347adc[_0x3ed6d5(0x24d)]);}catch(_0x3a5ad3){if(_0x566bf2[_0x3ed6d5(0x316)](_0x566bf2['fyYIZ'],_0x566bf2[_0x3ed6d5(0x241)]))return{'code':0xc8,'message':DpxHkN['adEaO'],'status':'success','data':{'nodeId':this['config'][_0x3ed6d5(0x2c3)],'status':DpxHkN['qfUcl']}};else log[_0x3ed6d5(0x19e)]({'sendErr':_0x3a5ad3},_0x566bf2['NRfzN']);}}}async[a0_0x43e8cf(0x23c)](_0xc910b1,_0x2ea4cb){const _0x4a9cf1=a0_0x43e8cf,_0x593856={'ACXpQ':_0x4a9cf1(0x27b),'NurRm':function(_0x5f5152,_0x2a140a){return _0x5f5152!==_0x2a140a;},'ecUcS':'VBGIK','lmAAZ':'Voice\x20message\x20recognized','ishOV':'Voice\x20recognition\x20failed\x20for\x20service\x20chat','raJUu':'语音消息识别失败,请稍后重试或发送文字消息','CCeqZ':function(_0x20f47c,_0x5f52e7){return _0x20f47c||_0x5f52e7;},'xDSVY':'error','FMSwp':function(_0x2dd993,_0x2d1d2a){return _0x2dd993/_0x2d1d2a;},'blgTr':_0x4a9cf1(0x218),'cjvzA':_0x4a9cf1(0x21d),'lYUnb':_0x4a9cf1(0x1f6),'RRzUi':function(_0x7cefef,_0x5e435){return _0x7cefef===_0x5e435;},'MFsvH':_0x4a9cf1(0x37f),'lDhxx':_0x4a9cf1(0x290),'djJLD':function(_0x516c33,_0x26e74c){return _0x516c33||_0x26e74c;},'DEqQT':function(_0x55f47d,_0x6f2fba){return _0x55f47d/_0x6f2fba;}},_0x297ae9=_0xc910b1[_0x4a9cf1(0x2fe)]||_0xc910b1[_0x4a9cf1(0x1e7)]||_0x2ea4cb[_0x4a9cf1(0x336)],_0x358eed=_0xc910b1[_0x4a9cf1(0x24e)]||_0xc910b1[_0x4a9cf1(0x1b7)];let _0xb10a6c=_0xc910b1[_0x4a9cf1(0x2db)]||'';const _0x24947d=_0x2ea4cb[_0x4a9cf1(0x336)],_0x138f88=_0xc910b1[_0x4a9cf1(0x220)]||_0xc910b1['requestId'];if(_0xc910b1['voiceUrl']&&!_0xb10a6c){if(_0x593856['NurRm'](_0x4a9cf1(0x269),_0x593856[_0x4a9cf1(0x174)]))try{_0x543fdd=_0xb38748[_0x4a9cf1(0x2d1)](_0x5061b6[_0x4a9cf1(0x2db)]);}catch{_0x5af114={'content':_0x4e174c['content']};}else try{_0xb10a6c=await this['_recognizeVoice'](_0xc910b1[_0x4a9cf1(0x1a0)]),log[_0x4a9cf1(0x380)]({'userId':_0x297ae9,'voiceUrl':_0xc910b1[_0x4a9cf1(0x1a0)],'recognizedLength':_0xb10a6c[_0x4a9cf1(0x281)]},_0x593856[_0x4a9cf1(0x23f)]);}catch(_0x553fd1){log[_0x4a9cf1(0x19e)]({'err':_0x553fd1,'userId':_0x297ae9,'voiceUrl':_0xc910b1[_0x4a9cf1(0x1a0)]},_0x593856[_0x4a9cf1(0x24a)]);const _0x1968ba=JSON[_0x4a9cf1(0x28d)]({'msg_type':RongyunMessageTypeEnum[_0x4a9cf1(0x1a6)],'request_id':_0x138f88,'content':_0x593856[_0x4a9cf1(0x189)],'sessionId':_0x593856[_0x4a9cf1(0x2d4)](_0x358eed,''),'userId':_0x297ae9,'status':_0x593856['xDSVY'],'timestamp':Math['floor'](_0x593856[_0x4a9cf1(0x325)](Date['now'](),0x3e8))});await this['rongClient'][_0x4a9cf1(0x30c)](_0x24947d,_0x1968ba,_0x2ea4cb[_0x4a9cf1(0x24d)]);return;}}if(!_0xb10a6c){log[_0x4a9cf1(0x1f4)](_0x593856[_0x4a9cf1(0x2ef)]);return;}log[_0x4a9cf1(0x380)]({'userId':_0x297ae9,'sessionId':_0x358eed,'contentLength':_0xb10a6c[_0x4a9cf1(0x281)]},'Processing\x20service\x20chat\x20message');try{const _0x169d1a='service-'+_0x297ae9,_0x20a89f=await this['sessionManager'][_0x4a9cf1(0x358)](_0x169d1a,_0x4a9cf1(0x1df)+_0x297ae9),_0x1072b7=_0x2ea4cb[_0x4a9cf1(0x208)]||this[_0x4a9cf1(0x264)][_0x4a9cf1(0x2c3)];this[_0x4a9cf1(0x2d0)][_0x4a9cf1(0x1c4)](_0x169d1a,{'serviceTargetId':_0x1072b7}),log['info']({'userId':_0x297ae9,'sessionId':_0x20a89f['id'],'serviceTargetId':_0x1072b7},_0x593856[_0x4a9cf1(0x2e1)]),await this['opencode'][_0x4a9cf1(0x335)](_0x20a89f['id'],_0xb10a6c),log[_0x4a9cf1(0x380)]({'userId':_0x297ae9,'sessionId':_0x20a89f['id']},_0x593856['lYUnb']);}catch(_0x594401){if(_0x593856['RRzUi'](_0x4a9cf1(0x37f),_0x593856[_0x4a9cf1(0x271)])){log[_0x4a9cf1(0x19e)]({'err':_0x594401,'userId':_0x297ae9,'targetId':_0x24947d},_0x593856[_0x4a9cf1(0x35b)]);const _0x3f0182=JSON[_0x4a9cf1(0x28d)]({'msg_type':RongyunMessageTypeEnum[_0x4a9cf1(0x1a6)],'request_id':_0x138f88,'content':_0x4a9cf1(0x1de)+(_0x594401[_0x4a9cf1(0x2c7)]||_0x4a9cf1(0x179)),'sessionId':_0x593856['djJLD'](_0x358eed,''),'userId':_0x297ae9,'status':_0x593856[_0x4a9cf1(0x20d)],'timestamp':Math[_0x4a9cf1(0x255)](_0x593856[_0x4a9cf1(0x33f)](Date[_0x4a9cf1(0x341)](),0x3e8))});await this['rongClient']['sendMessage'](_0x24947d,_0x3f0182,_0x2ea4cb['conversationType']);}else _0x2fac45[_0x4a9cf1(0x19e)]({'sendErr':_0x27af21},pXQuzF[_0x4a9cf1(0x2a6)]);}}async[a0_0x43e8cf(0x2cf)](_0x5cceab,_0x4805e0){const _0x366775=a0_0x43e8cf,_0x38c5dd={'nEFLk':function(_0x5f254e,_0x13981e){return _0x5f254e===_0x13981e;},'LTWOe':function(_0x4135f4,_0x502d8e){return _0x4135f4!==_0x502d8e;},'jzWJL':_0x366775(0x230),'wbdPh':_0x366775(0x22a),'eKSMi':_0x366775(0x2e4),'yYNhA':_0x366775(0x261),'NEItx':_0x366775(0x283),'blXEJ':_0x366775(0x1e4),'kzDvf':_0x366775(0x2f9),'kjcGm':_0x366775(0x179)},_0x526ea0=_0x38c5dd[_0x366775(0x382)](_0x4805e0[_0x366775(0x24d)],0x3)?_0x4805e0[_0x366775(0x208)]:_0x5cceab['source_im_id']||_0x5cceab[_0x366775(0x1ce)]||_0x4805e0[_0x366775(0x336)],_0x4d7615=_0x5cceab[_0x366775(0x2c7)]||_0x5cceab[_0x366775(0x2db)]||'',_0x1236d0=_0x5cceab['node_id']||_0x5cceab[_0x366775(0x19c)],_0x411699=_0x5cceab[_0x366775(0x220)]||_0x5cceab[_0x366775(0x2c8)];if(!_0x4d7615){if(_0x38c5dd[_0x366775(0x1cc)](_0x38c5dd['jzWJL'],_0x366775(0x32d))){log[_0x366775(0x1f4)](_0x38c5dd[_0x366775(0x2e8)]);return;}else _0x4946b2=_0x593b4c[_0x366775(0x28d)]({'content':_0x56a712,..._0x58b668});}log[_0x366775(0x380)]({'targetId':_0x526ea0,'nodeId':_0x1236d0,'contentLength':_0x4d7615[_0x366775(0x281)]},_0x38c5dd['eKSMi']);try{const _0x27c4dc=await this[_0x366775(0x29e)]['createSession'](_0x366775(0x221)+_0x526ea0);log['info']({'sessionId':_0x27c4dc['id']},_0x38c5dd[_0x366775(0x2fd)]);const _0xe8d93b=await this[_0x366775(0x29e)]['sendPrompt'](_0x27c4dc['id'],_0x4d7615);log[_0x366775(0x380)]({'targetId':_0x526ea0,'responseLength':_0xe8d93b[_0x366775(0x281)]},_0x38c5dd[_0x366775(0x38f)]);const _0x330428=JSON[_0x366775(0x28d)]({'msg_type':RongyunMessageTypeEnum['OPS_CHAT_RESPONSE'],'request_id':_0x411699,'reply':_0xe8d93b,'node_id':_0x1236d0||this[_0x366775(0x264)]['accountId']}),_0x3052e2=JSON[_0x366775(0x28d)]({'content':_0xe8d93b,'extra':JSON['stringify']({'from_node':this[_0x366775(0x264)]['accountId'],'is_ai':!![],'msg_type':RongyunMessageTypeEnum['OPS_CHAT_RESPONSE'],'chat_type':_0x38c5dd['blXEJ']})});await this[_0x366775(0x320)][_0x366775(0x30c)](_0x526ea0,_0x330428,_0x4805e0[_0x366775(0x24d)]),await this[_0x366775(0x320)][_0x366775(0x30c)](_0x526ea0,_0x3052e2,_0x4805e0[_0x366775(0x24d)]);}catch(_0x172c69){log['error']({'err':_0x172c69,'targetId':_0x526ea0},_0x366775(0x1d8));const _0x16bc63=JSON[_0x366775(0x28d)]({'msg_type':RongyunMessageTypeEnum[_0x366775(0x21a)],'request_id':_0x411699,'reply':_0x38c5dd[_0x366775(0x2cd)]+(_0x172c69[_0x366775(0x2c7)]||_0x38c5dd['kjcGm']),'node_id':_0x1236d0||this['config'][_0x366775(0x2c3)]}),_0x337a33=JSON['stringify']({'content':_0x38c5dd[_0x366775(0x2cd)]+(_0x172c69[_0x366775(0x2c7)]||_0x38c5dd[_0x366775(0x36c)]),'extra':JSON[_0x366775(0x28d)]({'from_node':this[_0x366775(0x264)][_0x366775(0x2c3)],'is_ai':!![],'msg_type':RongyunMessageTypeEnum[_0x366775(0x21a)]})});await this[_0x366775(0x320)][_0x366775(0x30c)](_0x526ea0,_0x16bc63,_0x4805e0[_0x366775(0x24d)]),await this['rongClient'][_0x366775(0x30c)](_0x526ea0,_0x337a33,_0x4805e0[_0x366775(0x24d)]);}}}