@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.
- package/README.md +71 -623
- package/bin/opencode-clawmessenger +2 -2
- package/bin/opencode-clawmessenger-setup +5 -5
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +1 -288
- package/dist/core/auto-register.d.ts +0 -1
- package/dist/core/auto-register.js +1 -174
- package/dist/core/auto-serve.d.ts +13 -0
- package/dist/core/auto-serve.js +1 -0
- package/dist/core/config.d.ts +2 -3
- package/dist/core/config.js +1 -80
- package/dist/core/daemon.d.ts +0 -1
- package/dist/core/daemon.js +1 -77
- package/dist/core/dedup.d.ts +0 -1
- package/dist/core/dedup.js +1 -25
- package/dist/core/hook-manager.d.ts +0 -1
- package/dist/core/hook-manager.js +1 -33
- package/dist/core/logger.d.ts +0 -1
- package/dist/core/logger.js +1 -49
- package/dist/core/mac-address.d.ts +0 -1
- package/dist/core/mac-address.js +1 -43
- package/dist/core/message-handler.d.ts +0 -1
- package/dist/core/message-handler.js +1 -988
- package/dist/core/ops-assistant.d.ts +0 -1
- package/dist/core/ops-assistant.js +1 -270
- package/dist/core/qr-crypto.d.ts +0 -1
- package/dist/core/qr-crypto.js +1 -66
- package/dist/core/session-manager.d.ts +0 -1
- package/dist/core/session-manager.js +1 -144
- package/dist/core/types.d.ts +1 -2
- package/dist/core/types.js +1 -26
- package/dist/index.d.ts +0 -1
- package/dist/index.js +1 -16
- package/dist/openclaw/client.d.ts +0 -1
- package/dist/openclaw/client.js +1 -494
- package/dist/opencode/client.d.ts +0 -1
- package/dist/opencode/client.js +1 -279
- package/dist/opencode/event-handler.d.ts +0 -1
- package/dist/opencode/event-handler.js +1 -467
- package/dist/plugin.d.ts +0 -1
- package/dist/plugin.js +1 -148
- package/dist/rongcloud/client.d.ts +0 -1
- package/dist/rongcloud/client.js +1 -292
- package/dist/rongcloud/env-polyfill.d.ts +0 -1
- package/dist/rongcloud/env-polyfill.js +1 -107
- package/dist/rongcloud/server-api.d.ts +0 -1
- package/dist/rongcloud/server-api.js +1 -157
- package/dist/standalone.d.ts +0 -1
- package/dist/standalone.js +1 -229
- package/dist/types/plugin.d.ts +0 -1
- package/dist/types/plugin.js +1 -2
- package/dist/websocket/client.d.ts +0 -1
- package/dist/websocket/client.js +1 -88
- package/dist/websocket/server-client.d.ts +0 -1
- package/dist/websocket/server-client.js +1 -98
- package/package.json +83 -81
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/core/auto-register.d.ts.map +0 -1
- package/dist/core/auto-register.js.map +0 -1
- package/dist/core/config.d.ts.map +0 -1
- package/dist/core/config.js.map +0 -1
- package/dist/core/daemon.d.ts.map +0 -1
- package/dist/core/daemon.js.map +0 -1
- package/dist/core/dedup.d.ts.map +0 -1
- package/dist/core/dedup.js.map +0 -1
- package/dist/core/hook-manager.d.ts.map +0 -1
- package/dist/core/hook-manager.js.map +0 -1
- package/dist/core/logger.d.ts.map +0 -1
- package/dist/core/logger.js.map +0 -1
- package/dist/core/mac-address.d.ts.map +0 -1
- package/dist/core/mac-address.js.map +0 -1
- package/dist/core/message-handler.d.ts.map +0 -1
- package/dist/core/message-handler.js.map +0 -1
- package/dist/core/ops-assistant.d.ts.map +0 -1
- package/dist/core/ops-assistant.js.map +0 -1
- package/dist/core/qr-crypto.d.ts.map +0 -1
- package/dist/core/qr-crypto.js.map +0 -1
- package/dist/core/session-manager.d.ts.map +0 -1
- package/dist/core/session-manager.js.map +0 -1
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/openclaw/client.d.ts.map +0 -1
- package/dist/openclaw/client.js.map +0 -1
- package/dist/opencode/client.d.ts.map +0 -1
- package/dist/opencode/client.js.map +0 -1
- package/dist/opencode/event-handler.d.ts.map +0 -1
- package/dist/opencode/event-handler.js.map +0 -1
- package/dist/plugin.d.ts.map +0 -1
- package/dist/plugin.js.map +0 -1
- package/dist/rongcloud/client.d.ts.map +0 -1
- package/dist/rongcloud/client.js.map +0 -1
- package/dist/rongcloud/env-polyfill.d.ts.map +0 -1
- package/dist/rongcloud/env-polyfill.js.map +0 -1
- package/dist/rongcloud/server-api.d.ts.map +0 -1
- package/dist/rongcloud/server-api.js.map +0 -1
- package/dist/standalone.d.ts.map +0 -1
- package/dist/standalone.js.map +0 -1
- package/dist/types/plugin.d.ts.map +0 -1
- package/dist/types/plugin.js.map +0 -1
- package/dist/websocket/client.d.ts.map +0 -1
- package/dist/websocket/client.js.map +0 -1
- package/dist/websocket/server-client.d.ts.map +0 -1
- package/dist/websocket/server-client.js.map +0 -1
|
@@ -1,467 +1 @@
|
|
|
1
|
-
import { createLogger } from '../core/logger.js';
|
|
2
|
-
import { RongCloudServerAPI } from '../rongcloud/server-api.js';
|
|
3
|
-
const log = createLogger('EventHandler');
|
|
4
|
-
export class EventHandler {
|
|
5
|
-
constructor(sessionManager, rongClient, opencode, config) {
|
|
6
|
-
this.isRunning = false;
|
|
7
|
-
this.sentSessions = new Set();
|
|
8
|
-
this.streamStates = new Map();
|
|
9
|
-
this.streamQueue = Promise.resolve(); // 流式消息串行队列
|
|
10
|
-
this.sessionManager = sessionManager;
|
|
11
|
-
this.rongClient = rongClient;
|
|
12
|
-
this.opencode = opencode;
|
|
13
|
-
this.config = config;
|
|
14
|
-
this.streamAPI = new RongCloudServerAPI(config.appKey, config.appSecret || '');
|
|
15
|
-
}
|
|
16
|
-
async start(eventStream) {
|
|
17
|
-
if (this.isRunning)
|
|
18
|
-
return;
|
|
19
|
-
this.isRunning = true;
|
|
20
|
-
log.info('Event handler started');
|
|
21
|
-
try {
|
|
22
|
-
for await (const event of eventStream.stream) {
|
|
23
|
-
if (!this.isRunning)
|
|
24
|
-
break;
|
|
25
|
-
await this.handleEvent(event);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
catch (err) {
|
|
29
|
-
log.error({ err }, 'SSE stream error');
|
|
30
|
-
}
|
|
31
|
-
finally {
|
|
32
|
-
this.isRunning = false;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
stop() {
|
|
36
|
-
this.isRunning = false;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* 获取发送者ID
|
|
40
|
-
* 对于客服聊天,使用客服账号ID作为发送者,而不是当前节点ID
|
|
41
|
-
* 这样可以确保客服消息和普通消息在不同的会话中
|
|
42
|
-
*/
|
|
43
|
-
getFromUserId(sessionId) {
|
|
44
|
-
const chatId = this.sessionManager.getChatIdBySession(sessionId);
|
|
45
|
-
if (chatId) {
|
|
46
|
-
const session = this.sessionManager.getSession(chatId);
|
|
47
|
-
if (session?.extra?.serviceTargetId) {
|
|
48
|
-
return session.extra.serviceTargetId;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return this.config.accountId;
|
|
52
|
-
}
|
|
53
|
-
async handleEvent(globalEvent) {
|
|
54
|
-
try {
|
|
55
|
-
const payload = globalEvent.payload || globalEvent;
|
|
56
|
-
const props = payload.properties || payload;
|
|
57
|
-
log.info({ type: payload.type, hasProperties: !!payload.properties }, 'SSE event received');
|
|
58
|
-
switch (payload.type) {
|
|
59
|
-
case 'session.idle':
|
|
60
|
-
log.info({ sessionId: props.sessionID }, 'Session idle event');
|
|
61
|
-
await this.handleSessionIdle(props);
|
|
62
|
-
break;
|
|
63
|
-
case 'message.part.delta':
|
|
64
|
-
// 细粒度 token 级流式增量
|
|
65
|
-
await this.handleMessagePartDelta(props);
|
|
66
|
-
break;
|
|
67
|
-
case 'message.part.updated':
|
|
68
|
-
log.info({ sessionId: props.sessionID }, 'Message part updated event');
|
|
69
|
-
await this.handleMessagePartUpdated(props);
|
|
70
|
-
break;
|
|
71
|
-
case 'message.updated':
|
|
72
|
-
log.info({ sessionId: props.sessionID, messageKeys: Object.keys(props.message || {}) }, 'Message updated event');
|
|
73
|
-
await this.handleMessageUpdated(props);
|
|
74
|
-
break;
|
|
75
|
-
case 'session.status':
|
|
76
|
-
this.handleStatusChange(props);
|
|
77
|
-
break;
|
|
78
|
-
case 'session.error':
|
|
79
|
-
await this.handleError(props);
|
|
80
|
-
break;
|
|
81
|
-
default:
|
|
82
|
-
log.debug({ type: payload.type }, 'Unhandled event type');
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
catch (err) {
|
|
86
|
-
log.error({ err }, 'Error handling event');
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* 处理 message.part.delta 事件(细粒度 token 级流式增量)
|
|
91
|
-
* 从事件中直接提取增量文本,无需调用 fetchLastMessageText
|
|
92
|
-
*/
|
|
93
|
-
async handleMessagePartDelta(properties) {
|
|
94
|
-
const sessionId = properties.sessionID;
|
|
95
|
-
log.info({ sessionId, hasDelta: !!properties.delta, hasText: !!properties.text, hasPart: !!properties.part }, 'handleMessagePartDelta called');
|
|
96
|
-
// 需要 appSecret 才能调用融云服务端 API 发送流式消息
|
|
97
|
-
if (!this.config.appSecret) {
|
|
98
|
-
log.warn({ sessionId }, 'Streaming skipped: appSecret not configured');
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
// 如果已经发送过完整回复,跳过
|
|
102
|
-
if (this.sentSessions.has(sessionId)) {
|
|
103
|
-
log.warn({ sessionId }, 'Session already sent, skipping stream delta');
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
// 从事件中提取增量文本(兼容多种可能的结构)
|
|
107
|
-
const delta = properties.delta || properties.text || properties.part?.delta || properties.part?.text || '';
|
|
108
|
-
if (typeof delta !== 'string') {
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
// 注意:空字符串的 delta 是合法的(无新内容块),不跳过,继续执行以维持流状态
|
|
112
|
-
// 初始化流式状态
|
|
113
|
-
let streamState = this.streamStates.get(sessionId);
|
|
114
|
-
if (!streamState) {
|
|
115
|
-
const chatId = this.sessionManager.getChatIdBySession(sessionId);
|
|
116
|
-
if (!chatId) {
|
|
117
|
-
log.warn({ sessionId }, 'No chatId found for message.part.delta');
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
streamState = {
|
|
121
|
-
messageUID: '',
|
|
122
|
-
seq: 1, // 融云要求 seq 从 1 开始
|
|
123
|
-
lastContent: '',
|
|
124
|
-
lastSentTime: Date.now(),
|
|
125
|
-
fullContent: '',
|
|
126
|
-
hasSentStream: false,
|
|
127
|
-
chatId,
|
|
128
|
-
targetId: chatId.startsWith('group_') ? chatId.replace('group_', '') : (chatId.startsWith('service-') ? chatId.replace('service-', '') : chatId.replace('claw-', '')),
|
|
129
|
-
isGroup: chatId.startsWith('group_'),
|
|
130
|
-
};
|
|
131
|
-
this.streamStates.set(sessionId, streamState);
|
|
132
|
-
}
|
|
133
|
-
// 累积完整内容
|
|
134
|
-
streamState.fullContent += delta;
|
|
135
|
-
log.info({ sessionId, seq: streamState.seq, deltaLength: delta.length }, 'Sending stream delta');
|
|
136
|
-
// 使用队列确保流式消息片段串行发送
|
|
137
|
-
this.streamQueue = this.streamQueue.then(async () => {
|
|
138
|
-
try {
|
|
139
|
-
const isFirstChunk = streamState.seq === 1;
|
|
140
|
-
log.info({ sessionId, seq: streamState.seq, isFirstChunk, targetId: streamState.targetId, deltaLength: delta.length }, 'Sending stream chunk to RongCloud');
|
|
141
|
-
if (streamState.isGroup) {
|
|
142
|
-
const result = await this.streamAPI.sendStreamGroup({
|
|
143
|
-
fromUserId: this.getFromUserId(sessionId),
|
|
144
|
-
toGroupId: streamState.targetId,
|
|
145
|
-
content: delta,
|
|
146
|
-
isFirstChunk,
|
|
147
|
-
isLastChunk: false,
|
|
148
|
-
seq: streamState.seq,
|
|
149
|
-
messageUID: streamState.messageUID || null,
|
|
150
|
-
});
|
|
151
|
-
if (result.messageUID)
|
|
152
|
-
streamState.messageUID = result.messageUID;
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
const result = await this.streamAPI.sendStreamPrivate({
|
|
156
|
-
fromUserId: this.getFromUserId(sessionId),
|
|
157
|
-
toUserId: streamState.targetId,
|
|
158
|
-
content: delta,
|
|
159
|
-
isFirstChunk,
|
|
160
|
-
isLastChunk: false,
|
|
161
|
-
seq: streamState.seq,
|
|
162
|
-
messageUID: streamState.messageUID || null,
|
|
163
|
-
});
|
|
164
|
-
if (result.messageUID)
|
|
165
|
-
streamState.messageUID = result.messageUID;
|
|
166
|
-
}
|
|
167
|
-
streamState.seq++;
|
|
168
|
-
streamState.hasSentStream = true;
|
|
169
|
-
streamState.lastSentTime = Date.now();
|
|
170
|
-
log.info({ sessionId, seq: streamState.seq - 1 }, 'Stream delta sent');
|
|
171
|
-
}
|
|
172
|
-
catch (err) {
|
|
173
|
-
log.error({ err, sessionId, delta: delta.substring(0, 50) }, 'Stream delta send failed');
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
await this.streamQueue;
|
|
177
|
-
}
|
|
178
|
-
async handleSessionIdle(properties) {
|
|
179
|
-
const sessionId = properties.sessionID;
|
|
180
|
-
// 立即标记已处理,防止并发重复发送
|
|
181
|
-
if (this.sentSessions.has(sessionId)) {
|
|
182
|
-
log.debug({ sessionId }, 'Already sent reply for this session, skipping');
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
this.sentSessions.add(sessionId);
|
|
186
|
-
const streamState = this.streamStates.get(sessionId);
|
|
187
|
-
// 如果已发送过流式片段,发送结束标记和 __stream_history__
|
|
188
|
-
if (streamState && streamState.hasSentStream) {
|
|
189
|
-
log.info({ sessionId, streamSeq: streamState.seq }, 'Finishing stream with last chunk');
|
|
190
|
-
// 发送结束流式片段
|
|
191
|
-
this.streamQueue = this.streamQueue.then(async () => {
|
|
192
|
-
try {
|
|
193
|
-
if (streamState.isGroup) {
|
|
194
|
-
await this.streamAPI.sendStreamGroup({
|
|
195
|
-
fromUserId: this.getFromUserId(sessionId),
|
|
196
|
-
toGroupId: streamState.targetId,
|
|
197
|
-
content: '',
|
|
198
|
-
isFirstChunk: false,
|
|
199
|
-
isLastChunk: true,
|
|
200
|
-
seq: streamState.seq,
|
|
201
|
-
messageUID: streamState.messageUID || null,
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
await this.streamAPI.sendStreamPrivate({
|
|
206
|
-
fromUserId: this.getFromUserId(sessionId),
|
|
207
|
-
toUserId: streamState.targetId,
|
|
208
|
-
content: '',
|
|
209
|
-
isFirstChunk: false,
|
|
210
|
-
isLastChunk: true,
|
|
211
|
-
seq: streamState.seq,
|
|
212
|
-
messageUID: streamState.messageUID || null,
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
log.info({ sessionId, seq: streamState.seq }, 'Stream last chunk sent');
|
|
216
|
-
}
|
|
217
|
-
catch (err) {
|
|
218
|
-
log.error({ err, sessionId }, 'Failed to send stream last chunk');
|
|
219
|
-
}
|
|
220
|
-
});
|
|
221
|
-
await this.streamQueue;
|
|
222
|
-
// 发送 __stream_history__ 普通文本消息作为持久化历史记录
|
|
223
|
-
if (streamState.fullContent.trim()) {
|
|
224
|
-
try {
|
|
225
|
-
const historyContent = JSON.stringify({
|
|
226
|
-
__stream_history__: true,
|
|
227
|
-
streamId: streamState.messageUID || sessionId,
|
|
228
|
-
text: streamState.fullContent,
|
|
229
|
-
sentTime: Date.now(),
|
|
230
|
-
});
|
|
231
|
-
await this.rongClient.sendMessage(streamState.targetId, historyContent, streamState.isGroup ? 3 : 1);
|
|
232
|
-
log.info({ sessionId, textLength: streamState.fullContent.length }, 'Stream history sent');
|
|
233
|
-
}
|
|
234
|
-
catch (err) {
|
|
235
|
-
log.error({ err, sessionId }, 'Failed to send stream history');
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
// 清理流式状态
|
|
239
|
-
this.streamStates.delete(sessionId);
|
|
240
|
-
this.sessionManager.updateStatus(streamState.chatId, 'idle');
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
// 清理流式状态(如果存在但未发送过流式)
|
|
244
|
-
if (streamState) {
|
|
245
|
-
this.streamStates.delete(sessionId);
|
|
246
|
-
}
|
|
247
|
-
log.info({ sessionId }, 'Handling session idle (no stream)');
|
|
248
|
-
const chatId = this.sessionManager.getChatIdBySession(sessionId);
|
|
249
|
-
if (!chatId) {
|
|
250
|
-
log.warn({ sessionId }, 'No chatId found for session');
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
// 没有流式发送过时,兜底发送完整消息
|
|
254
|
-
const text = await this.opencode.fetchLastMessageText(sessionId);
|
|
255
|
-
log.info({ sessionId, chatId, hasText: !!text }, 'Fetched last message');
|
|
256
|
-
if (text) {
|
|
257
|
-
const isGroup = chatId.startsWith('group_');
|
|
258
|
-
const isServiceChat = chatId.startsWith('service-');
|
|
259
|
-
const targetId = isGroup ? chatId.replace('group_', '') : (isServiceChat ? chatId.replace('service-', '') : chatId.replace('claw-', ''));
|
|
260
|
-
const conversationType = isGroup ? 3 : 1;
|
|
261
|
-
log.info({ targetId, textLength: text.length, isGroup, isServiceChat }, 'Sending reply via normal message');
|
|
262
|
-
if (isServiceChat) {
|
|
263
|
-
// 客服会话:发送 service_chat_response 格式的自定义消息
|
|
264
|
-
const servicePayload = JSON.stringify({
|
|
265
|
-
msg_type: 'service_chat_response',
|
|
266
|
-
content: text,
|
|
267
|
-
sessionId: sessionId,
|
|
268
|
-
userId: targetId,
|
|
269
|
-
status: 'success',
|
|
270
|
-
timestamp: Math.floor(Date.now() / 1000),
|
|
271
|
-
});
|
|
272
|
-
await this.rongClient.sendMessage(targetId, servicePayload, conversationType);
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
// 普通会话:直接发送文本内容
|
|
276
|
-
await this.rongClient.sendMessage(targetId, text, conversationType);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
this.sessionManager.updateStatus(chatId, 'idle');
|
|
280
|
-
}
|
|
281
|
-
async handleMessagePartUpdated(properties) {
|
|
282
|
-
const sessionId = properties.sessionID;
|
|
283
|
-
// message.part.updated 表示消息片段已更新(非增量)
|
|
284
|
-
// 如果已经在流式发送中(由 message.part.delta 驱动),忽略
|
|
285
|
-
if (this.streamStates.has(sessionId)) {
|
|
286
|
-
log.debug({ sessionId }, 'Stream already active via delta, ignoring part.updated');
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
// 需要 appSecret 才能调用融云服务端 API 发送流式消息
|
|
290
|
-
if (!this.config.appSecret) {
|
|
291
|
-
log.debug({ sessionId }, 'Streaming skipped: appSecret not configured, falling back to session.idle reply');
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
const chatId = this.sessionManager.getChatIdBySession(sessionId);
|
|
295
|
-
if (!chatId) {
|
|
296
|
-
log.warn({ sessionId }, 'No chatId found for message.part.updated');
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
// 如果已经发送过完整回复,跳过流式
|
|
300
|
-
if (this.sentSessions.has(sessionId)) {
|
|
301
|
-
log.debug({ sessionId }, 'Session already sent, skipping stream');
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
const isGroup = chatId.startsWith('group_');
|
|
305
|
-
const targetId = isGroup ? chatId.replace('group_', '') : (chatId.startsWith('service-') ? chatId.replace('service-', '') : chatId.replace('claw-', ''));
|
|
306
|
-
try {
|
|
307
|
-
const text = await this.opencode.fetchLastMessageText(sessionId);
|
|
308
|
-
if (!text)
|
|
309
|
-
return;
|
|
310
|
-
// 初始化流式状态
|
|
311
|
-
let streamState = this.streamStates.get(sessionId);
|
|
312
|
-
if (!streamState) {
|
|
313
|
-
const chatId = this.sessionManager.getChatIdBySession(sessionId);
|
|
314
|
-
if (!chatId) {
|
|
315
|
-
log.warn({ sessionId }, 'No chatId found for message.part.updated');
|
|
316
|
-
return;
|
|
317
|
-
}
|
|
318
|
-
streamState = {
|
|
319
|
-
messageUID: '',
|
|
320
|
-
seq: 1, // 融云要求 seq 从 1 开始
|
|
321
|
-
lastContent: '',
|
|
322
|
-
lastSentTime: Date.now(),
|
|
323
|
-
fullContent: '',
|
|
324
|
-
hasSentStream: false,
|
|
325
|
-
chatId,
|
|
326
|
-
targetId: chatId.startsWith('group_') ? chatId.replace('group_', '') : (chatId.startsWith('service-') ? chatId.replace('service-', '') : chatId.replace('claw-', '')),
|
|
327
|
-
isGroup: chatId.startsWith('group_'),
|
|
328
|
-
};
|
|
329
|
-
this.streamStates.set(sessionId, streamState);
|
|
330
|
-
}
|
|
331
|
-
// 只发送新增内容
|
|
332
|
-
const newContent = text.slice(streamState.lastContent.length);
|
|
333
|
-
if (!newContent)
|
|
334
|
-
return;
|
|
335
|
-
// 累积完整内容
|
|
336
|
-
streamState.fullContent += newContent;
|
|
337
|
-
log.info({ sessionId, seq: streamState.seq, newLength: newContent.length }, 'Sending stream chunk (from part.updated)');
|
|
338
|
-
// 使用队列确保流式消息片段串行发送
|
|
339
|
-
this.streamQueue = this.streamQueue.then(async () => {
|
|
340
|
-
try {
|
|
341
|
-
if (isGroup) {
|
|
342
|
-
const result = await this.streamAPI.sendStreamGroup({
|
|
343
|
-
fromUserId: this.getFromUserId(sessionId),
|
|
344
|
-
toGroupId: targetId,
|
|
345
|
-
content: newContent,
|
|
346
|
-
isFirstChunk: streamState.seq === 1,
|
|
347
|
-
isLastChunk: false,
|
|
348
|
-
seq: streamState.seq,
|
|
349
|
-
messageUID: streamState.messageUID || null,
|
|
350
|
-
});
|
|
351
|
-
if (result.messageUID)
|
|
352
|
-
streamState.messageUID = result.messageUID;
|
|
353
|
-
}
|
|
354
|
-
else {
|
|
355
|
-
const result = await this.streamAPI.sendStreamPrivate({
|
|
356
|
-
fromUserId: this.getFromUserId(sessionId),
|
|
357
|
-
toUserId: targetId,
|
|
358
|
-
content: newContent,
|
|
359
|
-
isFirstChunk: streamState.seq === 1,
|
|
360
|
-
isLastChunk: false,
|
|
361
|
-
seq: streamState.seq,
|
|
362
|
-
messageUID: streamState.messageUID || null,
|
|
363
|
-
});
|
|
364
|
-
if (result.messageUID)
|
|
365
|
-
streamState.messageUID = result.messageUID;
|
|
366
|
-
}
|
|
367
|
-
streamState.seq++;
|
|
368
|
-
streamState.hasSentStream = true;
|
|
369
|
-
streamState.lastContent = text;
|
|
370
|
-
streamState.lastSentTime = Date.now();
|
|
371
|
-
}
|
|
372
|
-
catch (err) {
|
|
373
|
-
log.error({ err, sessionId, targetId }, 'Stream send failed');
|
|
374
|
-
// 流式发送失败时清理状态,让 session.idle 兜底发送完整消息
|
|
375
|
-
this.streamStates.delete(sessionId);
|
|
376
|
-
}
|
|
377
|
-
});
|
|
378
|
-
await this.streamQueue;
|
|
379
|
-
}
|
|
380
|
-
catch (err) {
|
|
381
|
-
log.error({ err, sessionId, targetId }, 'Stream processing failed');
|
|
382
|
-
this.streamStates.delete(sessionId);
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
async handleMessageUpdated(properties) {
|
|
386
|
-
const sessionId = properties.sessionID;
|
|
387
|
-
// message.updated 只用于追踪消息内容更新,不发送消息
|
|
388
|
-
// 如果已经在流式发送中,忽略
|
|
389
|
-
if (this.streamStates.has(sessionId)) {
|
|
390
|
-
return;
|
|
391
|
-
}
|
|
392
|
-
// 如果已发送,忽略
|
|
393
|
-
if (this.sentSessions.has(sessionId)) {
|
|
394
|
-
return;
|
|
395
|
-
}
|
|
396
|
-
// 只记录消息内容更新,不发送
|
|
397
|
-
const chatId = this.sessionManager.getChatIdBySession(sessionId);
|
|
398
|
-
if (!chatId) {
|
|
399
|
-
log.warn({ sessionId }, 'No chatId found for message.updated');
|
|
400
|
-
return;
|
|
401
|
-
}
|
|
402
|
-
const session = this.sessionManager.getSession(chatId);
|
|
403
|
-
if (!session || session.status !== 'busy') {
|
|
404
|
-
return;
|
|
405
|
-
}
|
|
406
|
-
// 尝试从事件的 message 对象直接获取文本(仅用于日志记录)
|
|
407
|
-
const msg = properties.message;
|
|
408
|
-
if (msg) {
|
|
409
|
-
const role = msg.info?.role || msg.role;
|
|
410
|
-
if (role === 'assistant' || role === 'model') {
|
|
411
|
-
if (msg.parts && msg.parts.length > 0) {
|
|
412
|
-
const textPart = msg.parts.find((p) => p.type === 'text');
|
|
413
|
-
if (textPart?.text) {
|
|
414
|
-
log.debug({ sessionId, textLength: textPart.text.length }, 'AI response content updated');
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
handleStatusChange(properties) {
|
|
421
|
-
const chatId = this.sessionManager.getChatIdBySession(properties.sessionID);
|
|
422
|
-
if (chatId && properties.status.type === 'busy') {
|
|
423
|
-
this.sessionManager.updateStatus(chatId, 'busy');
|
|
424
|
-
// Clear sentSessions to allow new replies in this session
|
|
425
|
-
if (this.sentSessions.delete(properties.sessionID)) {
|
|
426
|
-
log.debug({ sessionId: properties.sessionID }, 'Cleared sent flag for new message turn');
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
async handleError(properties) {
|
|
431
|
-
if (!properties.sessionID)
|
|
432
|
-
return;
|
|
433
|
-
const chatId = this.sessionManager.getChatIdBySession(properties.sessionID);
|
|
434
|
-
if (!chatId)
|
|
435
|
-
return;
|
|
436
|
-
// 从错误对象中提取可读消息
|
|
437
|
-
let errorMessage;
|
|
438
|
-
if (typeof properties.error === 'string') {
|
|
439
|
-
errorMessage = properties.error;
|
|
440
|
-
}
|
|
441
|
-
else if (properties.error?.data?.message) {
|
|
442
|
-
errorMessage = properties.error.data.message;
|
|
443
|
-
}
|
|
444
|
-
else if (properties.error?.message) {
|
|
445
|
-
errorMessage = properties.error.message;
|
|
446
|
-
}
|
|
447
|
-
else {
|
|
448
|
-
errorMessage = 'AI 处理失败,请稍后重试';
|
|
449
|
-
}
|
|
450
|
-
// 标记为已处理,防止 session.idle 重复发送
|
|
451
|
-
this.sentSessions.add(properties.sessionID);
|
|
452
|
-
// 如果正在流式发送,清理状态
|
|
453
|
-
const streamState = this.streamStates.get(properties.sessionID);
|
|
454
|
-
if (streamState) {
|
|
455
|
-
this.streamStates.delete(properties.sessionID);
|
|
456
|
-
}
|
|
457
|
-
log.error({ sessionId: properties.sessionID, error: errorMessage }, 'Session error');
|
|
458
|
-
const isGroup = chatId.startsWith('group_');
|
|
459
|
-
const targetId = isGroup ? chatId.replace('group_', '') : chatId.replace('claw-', '');
|
|
460
|
-
const conversationType = isGroup ? 3 : 1;
|
|
461
|
-
// 发送错误消息(直接文本格式)
|
|
462
|
-
const errorText = `AI 处理出错: ${errorMessage}`;
|
|
463
|
-
await this.rongClient.sendMessage(targetId, errorText, conversationType);
|
|
464
|
-
this.sessionManager.updateStatus(chatId, 'idle');
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
//# sourceMappingURL=event-handler.js.map
|
|
1
|
+
function a0_0x5666(_0x4e7e47,_0x590636){_0x4e7e47=_0x4e7e47-0xf0;const _0x2b7940=a0_0x2b79();let _0x566691=_0x2b7940[_0x4e7e47];if(a0_0x5666['SouBnV']===undefined){var _0x45877b=function(_0x44faed){const _0x3bbd9e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x31f5fb='',_0x33791b='';for(let _0x493d21=0x0,_0x14241c,_0x2d86ff,_0x1d076f=0x0;_0x2d86ff=_0x44faed['charAt'](_0x1d076f++);~_0x2d86ff&&(_0x14241c=_0x493d21%0x4?_0x14241c*0x40+_0x2d86ff:_0x2d86ff,_0x493d21++%0x4)?_0x31f5fb+=String['fromCharCode'](0xff&_0x14241c>>(-0x2*_0x493d21&0x6)):0x0){_0x2d86ff=_0x3bbd9e['indexOf'](_0x2d86ff);}for(let _0xe52570=0x0,_0x2c0c3d=_0x31f5fb['length'];_0xe52570<_0x2c0c3d;_0xe52570++){_0x33791b+='%'+('00'+_0x31f5fb['charCodeAt'](_0xe52570)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x33791b);};a0_0x5666['mhPCQS']=_0x45877b,a0_0x5666['spQqLK']={},a0_0x5666['SouBnV']=!![];}const _0x4d312e=_0x2b7940[0x0],_0x14f9af=_0x4e7e47+_0x4d312e,_0x4d67cd=a0_0x5666['spQqLK'][_0x14f9af];return!_0x4d67cd?(_0x566691=a0_0x5666['mhPCQS'](_0x566691),a0_0x5666['spQqLK'][_0x14f9af]=_0x566691):_0x566691=_0x4d67cd,_0x566691;}const a0_0x54df74=a0_0x5666;(function(_0x51e113,_0x354638){const _0x424983=a0_0x5666,_0x262569=_0x51e113();while(!![]){try{const _0x2149f7=-parseInt(_0x424983(0x14a))/0x1*(parseInt(_0x424983(0x15e))/0x2)+-parseInt(_0x424983(0x1cc))/0x3*(-parseInt(_0x424983(0xfe))/0x4)+parseInt(_0x424983(0x13f))/0x5*(parseInt(_0x424983(0x162))/0x6)+-parseInt(_0x424983(0x1b0))/0x7+-parseInt(_0x424983(0xf4))/0x8*(-parseInt(_0x424983(0x15f))/0x9)+parseInt(_0x424983(0x1c6))/0xa+parseInt(_0x424983(0x118))/0xb*(-parseInt(_0x424983(0x137))/0xc);if(_0x2149f7===_0x354638)break;else _0x262569['push'](_0x262569['shift']());}catch(_0x313cc8){_0x262569['push'](_0x262569['shift']());}}}(a0_0x2b79,0xe0a92));function a0_0x2b79(){const _0x25691a=['zMv0y2Hmyxn0twvZC2fNzvrLEhq','Be55s3O','C3rYAw5N','A1rzzxm','q2zju3O','C2vZC2LVBK1HBMfNzxi','qvzArNO','tgnlDuK','rMXXsvy','Chb3qwS','rLncuNq','C3rYzwfT','tMnzwwC','C3rHCNrZv2L0Aa','ve14reK','u05mquq','tM1uyLC','u3rYzwfTigrLBhrHihnLBNq','z1nHvui','DhLWzq','y29UzMLN','AwXWv1G','z2v0q2HHDeLKqNLtzxnZAw9U','nZi4odeXnMn1AgXMCa','uhDzCvu','C2vUzfn0CMvHBuDYB3vW','ExbVqLe','y29NreS','q2XLyxjLzcbZzw50igzSywCGzM9Yig5LDYbTzxnZywDLihr1CM4','A0LeDge','AgfZ','C2v0','sfLxtum','s2v2DMq','B0Phr1a','zg5ssMy','tM8Gy2HHDeLKigzVDw5KigzVCIbZzxnZAw9U','zMLUza','yxbWs2v5','zMHez0m','D3nyr2y','AxnsDw5UAw5N','zM1oBK4','rgHpuvq','tM8Gy2HHDeLKigzVDw5KigzVCIbTzxnZywDLlNvWzgf0zwq','v2TTrvy','u3rYzwfTigHPC3rVCNKGC2vUDa','zxH0CMe','C2vUzfn0CMvHBvbYAxzHDgu','C2vYDMLJzvrHCMDLDeLK','s2XnBuy','z2v0u2vZC2LVBG','rhHPs3C','D3bdqve','mJr3uwjhtwG','BgvUz3rO','ChjVCgvYDgLLCW','BgfZDenVBNrLBNq','AgfUzgXLtwvZC2fNzvbHCNrezwX0ysbJywXSzwq','vwPJDg0','rMv0y2HLzcbSyxn0ig1LC3nHz2u','zxjYB3i','nvDvvevgvG','ANbxBgC','C2vUze1LC3nHz2u','CMvZB2X2zq','quKG5Ase55cg5AsX6lsL77Ym6k+356In5zco6yEn6k+v','zgXjuvC','BeTyu3a','ve5Qs04','tevwyxC','DM9OrwS','C3rHDhvZ','nZCZsvbytgHz','sgfUzgXPBMCGC2vZC2LVBIbPzgXLicHUBYbZDhjLyw0P','r1bWCwK','C3rYzwfTuxvLDwu','zhz4ruC','Ewj0v2C','rxzLBNriyw5KBgvY','u3rYzwfTigrLBhrHihnLBMqGzMfPBgvK','CvLYBgm','CMztqKq','u3rYzwfTAw5NihnRAxbWzwq6igfWCfnLy3jLDcbUB3qGy29UzMLNDxjLzcWGzMfSBgLUzYbIywnRihrVihnLC3nPB24UAwrSzsbYzxbSEq','BwvZC2fNzs5Wyxj0lMrLBhrH','u2vUzgLUzYbYzxbSEsb2AweGBM9YBwfSig1LC3nHz2u','tKTxvei','v2HKBhK','zKfRt0e','wvjqBfy','Cgf5Bg9Hza','u3rYzwfTihnLBMqGzMfPBgvK','u2vUzgLUzYbZDhjLyw0Gy2H1BMSGkgzYB20GCgfYDc51CgrHDgvKkq','ndq5mLzMBxLdyW','nJy4nZyZALHpv1HX','zNvSBenVBNrLBNq','nNWYFdH8mxW0Fdn8n3WWFdu','nZyXmdi4nNH0ruPhyq','u1f4v24','z1nvEuy','DfnvC1K','AwrSzq','A0XPy2W','u3rYzwfTAw5NihnRAxbWzwq6igfWCfnLy3jLDcbUB3qGy29UzMLNDxjLza','C2vZC2LVBI5LCNjVCG','t0TOtgS','BNfHsgC','u2vZC2LVBIbLCNjVCG','rxzLBNqGAgfUzgXLCIbZDgfYDgvK','DgPXzMu','u3rYzwfTihbYB2nLC3nPBMCGzMfPBgvK','C2vUDfnLC3nPB25Z','C2XPy2u','yNvZEq','svDnq2S','CMvWBgfJzq','tNrLyxi','z2v0rNjVBvvZzxjjza','y1fxCfK','D2TWBvC','D29wvg4','zgvSzxrL','BgfZDfnLBNruAw1L','s0vUuu8','rKPYzg0','AgfUzgXLu3rHDhvZq2HHBMDL','DgHLBG','yLbpzuW','C3rYzwfTu3rHDgvZ','vKDjy3O','AgfUzgXLrxjYB3i','CgfYDhm','reDkzNK','reDgqui','y0zTqwq','C2vZC2LVBI5ZDgf0Dxm','AgfUzgXLrxzLBNq','Bw9KzwW','AgfUzgXLtwvZC2fNzvbHCNrezwX0yq','C3rYAw5NAwz5','u2vZC2LVBIbHBhjLywr5ihnLBNqSihnRAxbWAw5Nihn0CMvHBsbKzwX0yq','yLHxuxq','zgvIDwC','BeXqq3e','DgfYz2v0swq','B1Ppt0q','C2vZC2LVBKLe','Dur5wfC','C3rYzwfTqvbj','DLzAqvy','C2vYDMLJzs0','z3jVDxbF','EuTmzuG','BwvZC2fNzvvjra','sKP1yNa','Buntz0C','AgfUzgXLu2vZC2LVBKLKBgu','C3rVCa','u1rzAMm','tLDbqMW','z2v0','u3rYzwfTigfSCMvHzhKGywn0AxzLihzPysbKzwX0ysWGAwDUB3jPBMCGCgfYDc51CgrHDgvK','DhjPBq','AxnhCM91Ca','quKG5Ase55cg5yE66zszoIa','BKn3uMu','zNbOugW','v2zqrMq','BeHwAKm','ANPTshO','ruTyDLO','AunOsKW','C2vZC2LVBI5PzgXL','AgXIy1u','r29czw0','otmXmti2ueXNy3Pe','AgfUzgXLtwvZC2fNzvvWzgf0zwq','CM9Uz0nSAwvUDa','y2XHDY0','u2vZC2LVBIbPzgXLigv2zw50','CM9Szq','yxnZAxn0yw50','C2vYDMLJzv9JAgf0x3jLC3bVBNnL','rxzXCfC','Dgv4Da','tM8Gy2HHDeLKigzVDw5KigzVCIbTzxnZywDLlNbHCNqUDxbKyxrLza','Aw5MBW','D2fYBG','zgf0yq','tw1hDxe','CurPAgK','tM8Gy2HHDeLKigzVDw5KigzVCIbTzxnZywDLlNbHCNqUzgvSDge','C3vJy2vZCW','rxjYB3iGAgfUzgXPBMCGzxzLBNq','zgvSDge','ywrK','tgztwMu','nZq1mJiZmffgEurSvG','C2vX','C3bSAxq','zND5zMC','u3rYzwfTigXHC3qGy2H1BMSGC2vUDa','AgfZu2vUDfn0CMvHBq','mJu1reT6t3fp','DxbKyxrLu3rHDhvZ','rg5hyK0','y2HHDeLK','AgfUzgXLtwvZC2fNzvbHCNrvCgrHDgvK','BM93','z2zbB2G','DeH4vfa','C3rHCNq','zhr3thK','wenlu3O','rMfPBgvKihrVihnLBMqGC3rYzwfTigXHC3qGy2H1BMS','ntzHzeH2EgW','CgfYDa','rMfPBgvKihrVihnLBMqGC3rYzwfTigHPC3rVCNK','rejbz1q','z2PqzNy','u1nfigv2zw50ihjLy2vPDMvK','rMDru2m','quKGCMvZCg9UC2uGy29UDgvUDcb1CgrHDgvK','BLrLB1C','BwvZC2fNzs5Wyxj0lNvWzgf0zwq','nZqZodHrzgPWrxC','BwvZC2fNzq','yxbWu2vJCMv0'];a0_0x2b79=function(){return _0x25691a;};return a0_0x2b79();}import{createLogger}from'../core/logger.js';import{RongCloudServerAPI}from'../rongcloud/server-api.js';const log=createLogger(a0_0x54df74(0x150));export class EventHandler{constructor(_0x401703,_0x4fd72,_0x33a92d,_0x48fc0c){const _0x5a9880=a0_0x54df74,_0x38983f=_0x5a9880(0x161)[_0x5a9880(0x1c8)]('|');let _0x1f9abc=0x0;while(!![]){switch(_0x38983f[_0x1f9abc++]){case'0':this['config']=_0x48fc0c;continue;case'1':this[_0x5a9880(0x14d)]=Promise[_0x5a9880(0x142)]();continue;case'2':this[_0x5a9880(0x170)]=new Set();continue;case'3':this[_0x5a9880(0x1b2)]=_0x4fd72;continue;case'4':this['sessionManager']=_0x401703;continue;case'5':this[_0x5a9880(0x195)]=new RongCloudServerAPI(_0x48fc0c[_0x5a9880(0x127)],_0x48fc0c[_0x5a9880(0x100)]||'');continue;case'6':this[_0x5a9880(0x12a)]=![];continue;case'7':this['opencode']=_0x33a92d;continue;case'8':this[_0x5a9880(0x181)]=new Map();continue;}break;}}async[a0_0x54df74(0xf0)](_0x577297){const _0x2149a0=a0_0x54df74,_0x44c3f8={'Bgjpk':_0x2149a0(0xfb),'EvqpW':_0x2149a0(0x16d),'ppwAk':_0x2149a0(0x18e),'fwcjC':'SSE\x20stream\x20error'};if(this[_0x2149a0(0x12a)])return;this[_0x2149a0(0x12a)]=!![],log[_0x2149a0(0x1bb)](_0x44c3f8[_0x2149a0(0x1b8)]);try{if('bXWQt'===_0x44c3f8[_0x2149a0(0x10a)])for await(const _0x5a3d73 of _0x577297[_0x2149a0(0x10c)]){if(!this['isRunning'])break;await this[_0x2149a0(0x189)](_0x5a3d73);}else{if(_0x20c241[_0x2149a0(0x184)]&&_0x21d4bc[_0x2149a0(0x184)][_0x2149a0(0x138)]>0x0){const _0x3651a7=_0x4350dc[_0x2149a0(0x184)][_0x2149a0(0x126)](_0x165cb5=>_0x165cb5[_0x2149a0(0x114)]===_0x2149a0(0x1b9));_0x3651a7?.[_0x2149a0(0x1b9)]&&_0x15a528[_0x2149a0(0x18f)]({'sessionId':_0x24b5f2,'textLength':_0x3651a7[_0x2149a0(0x1b9)][_0x2149a0(0x138)]},_0x44c3f8['Bgjpk']);}}}catch(_0x7f97d){log[_0x2149a0(0x13e)]({'err':_0x7f97d},_0x44c3f8['fwcjC']);}finally{this[_0x2149a0(0x12a)]=![];}}[a0_0x54df74(0x19e)](){const _0x2cd27c=a0_0x54df74;this[_0x2cd27c(0x12a)]=![];}[a0_0x54df74(0x176)](_0x2275fa){const _0x2bc948=a0_0x54df74,_0x534e60=this[_0x2bc948(0x106)]['getChatIdBySession'](_0x2275fa);if(_0x534e60){const _0x124920=this[_0x2bc948(0x106)][_0x2bc948(0x134)](_0x534e60);if(_0x124920?.[_0x2bc948(0x130)]?.['serviceTargetId'])return _0x124920['extra'][_0x2bc948(0x132)];}return this['config']['accountId'];}async[a0_0x54df74(0x189)](_0x365ac4){const _0x55cc23=a0_0x54df74,_0x301e82={'tSUsY':'AI\x20response\x20content\x20updated','jpWlg':_0x55cc23(0xf9),'FJrdm':_0x55cc23(0x1b4),'qYrlc':_0x55cc23(0xfd),'SQxWn':'message.updated','YOSYn':'Message\x20updated\x20event','cFmAd':_0x55cc23(0x188),'kTYes':_0x55cc23(0x169),'EKXvZ':'Unhandled\x20event\x20type','gjPfv':function(_0x2e1edb,_0x303079){return _0x2e1edb!==_0x303079;},'lKXSp':_0x55cc23(0xf1)};try{const _0x2b266a=_0x365ac4[_0x55cc23(0x15b)]||_0x365ac4,_0x882ea3=_0x2b266a[_0x55cc23(0x139)]||_0x2b266a;log[_0x55cc23(0x1bb)]({'type':_0x2b266a[_0x55cc23(0x114)],'hasProperties':!!_0x2b266a[_0x55cc23(0x139)]},_0x301e82[_0x55cc23(0x140)]);switch(_0x2b266a[_0x55cc23(0x114)]){case _0x55cc23(0x1ad):log['info']({'sessionId':_0x882ea3[_0x55cc23(0x193)]},_0x301e82[_0x55cc23(0x17d)]),await this[_0x55cc23(0x19d)](_0x882ea3);break;case _0x55cc23(0x155):await this[_0x55cc23(0x18b)](_0x882ea3);break;case _0x301e82[_0x55cc23(0x152)]:log[_0x55cc23(0x1bb)]({'sessionId':_0x882ea3[_0x55cc23(0x193)]},'Message\x20part\x20updated\x20event'),await this[_0x55cc23(0x1d0)](_0x882ea3);break;case _0x301e82[_0x55cc23(0x163)]:log[_0x55cc23(0x1bb)]({'sessionId':_0x882ea3['sessionID'],'messageKeys':Object['keys'](_0x882ea3[_0x55cc23(0xff)]||{})},_0x301e82['YOSYn']),await this[_0x55cc23(0x1b1)](_0x882ea3);break;case _0x301e82[_0x55cc23(0x187)]:this[_0x55cc23(0x17e)](_0x882ea3);break;case _0x301e82[_0x55cc23(0x104)]:await this[_0x55cc23(0x183)](_0x882ea3);break;default:log[_0x55cc23(0x18f)]({'type':_0x2b266a[_0x55cc23(0x114)]},_0x301e82[_0x55cc23(0x1ab)]);}}catch(_0x1a5b84){if(_0x301e82[_0x55cc23(0xf8)](_0x301e82[_0x55cc23(0x145)],_0x55cc23(0xf1))){const _0x2a4794=_0x3f2d11[_0x55cc23(0x184)][_0x55cc23(0x126)](_0x79bbe1=>_0x79bbe1[_0x55cc23(0x114)]==='text');_0x2a4794?.['text']&&_0x598b9e[_0x55cc23(0x18f)]({'sessionId':_0x1a1ecb,'textLength':_0x2a4794[_0x55cc23(0x1b9)][_0x55cc23(0x138)]},_0x301e82[_0x55cc23(0x165)]);}else log[_0x55cc23(0x13e)]({'err':_0x1a5b84},_0x55cc23(0x1c2));}}async[a0_0x54df74(0x18b)](_0x257d91){const _0x310239=a0_0x54df74,_0x550179={'AVZFz':_0x310239(0x11d),'SMHYH':'Session\x20already\x20sent,\x20skipping\x20stream','Ntear':function(_0x1757c5,_0x28ddd7){return _0x1757c5!==_0x28ddd7;},'IWMCk':_0x310239(0x129),'WkmEV':_0x310239(0x1d2),'bPOeL':function(_0xfb5e26,_0x48d18b){return _0xfb5e26===_0x48d18b;},'tHxTP':'Sending\x20stream\x20chunk\x20to\x20RongCloud','GPpqi':function(_0x375efd,_0x58cff7){return _0x375efd!==_0x58cff7;},'anord':_0x310239(0xfc),'EYfxK':function(_0x33a030,_0x560a91){return _0x33a030-_0x560a91;},'eKCzs':_0x310239(0x151),'wuXUW':_0x310239(0x13b),'GoBem':_0x310239(0x168),'woVTn':_0x310239(0x18d),'ypoBQ':function(_0x388567,_0x147545){return _0x388567!==_0x147545;},'YRPlV':'string','lLPCq':_0x310239(0x136),'Whdly':'mIRBf','dlIQW':_0x310239(0x1c0),'FlqIV':_0x310239(0x198),'kIDta':_0x310239(0x197),'FgQSc':'claw-','fwyfg':'Sending\x20stream\x20delta'},_0x5791a6=_0x257d91[_0x310239(0x193)];log[_0x310239(0x1bb)]({'sessionId':_0x5791a6,'hasDelta':!!_0x257d91[_0x310239(0x1c3)],'hasText':!!_0x257d91[_0x310239(0x1b9)],'hasPart':!!_0x257d91[_0x310239(0xf5)]},_0x550179['wuXUW']);if(!this[_0x310239(0x115)][_0x310239(0x100)]){log[_0x310239(0x1bc)]({'sessionId':_0x5791a6},_0x550179[_0x310239(0x1af)]);return;}if(this[_0x310239(0x170)]['has'](_0x5791a6)){log['warn']({'sessionId':_0x5791a6},_0x550179[_0x310239(0x179)]);return;}const _0x403db2=_0x257d91[_0x310239(0x1c3)]||_0x257d91[_0x310239(0x1b9)]||_0x257d91[_0x310239(0xf5)]?.[_0x310239(0x1c3)]||_0x257d91[_0x310239(0xf5)]?.['text']||'';if(_0x550179[_0x310239(0x11b)](typeof _0x403db2,_0x550179[_0x310239(0x15a)])){if(_0x550179['bPOeL'](_0x550179[_0x310239(0x190)],_0x550179[_0x310239(0x158)]))this['streamStates'][_0x310239(0x17a)](_0xb9bd27);else return;}let _0x537dc2=this[_0x310239(0x181)][_0x310239(0x1a1)](_0x5791a6);if(!_0x537dc2){const _0x4a772a=this[_0x310239(0x106)]['getChatIdBySession'](_0x5791a6);if(!_0x4a772a){log[_0x310239(0x1bc)]({'sessionId':_0x5791a6},_0x550179[_0x310239(0x144)]);return;}_0x537dc2={'messageUID':'','seq':0x1,'lastContent':'','lastSentTime':Date[_0x310239(0x1d1)](),'fullContent':'','hasSentStream':![],'chatId':_0x4a772a,'targetId':_0x4a772a[_0x310239(0x10e)](_0x310239(0x198))?_0x4a772a['replace'](_0x550179[_0x310239(0x109)],''):_0x4a772a[_0x310239(0x10e)](_0x310239(0x197))?_0x4a772a[_0x310239(0x174)](_0x550179[_0x310239(0x11e)],''):_0x4a772a[_0x310239(0x174)](_0x550179[_0x310239(0xfa)],''),'isGroup':_0x4a772a[_0x310239(0x10e)](_0x310239(0x198))},this[_0x310239(0x181)][_0x310239(0x120)](_0x5791a6,_0x537dc2);}_0x537dc2[_0x310239(0x160)]+=_0x403db2,log['info']({'sessionId':_0x5791a6,'seq':_0x537dc2[_0x310239(0x1c7)],'deltaLength':_0x403db2[_0x310239(0x138)]},_0x550179[_0x310239(0x1c9)]),this[_0x310239(0x14d)]=this[_0x310239(0x14d)][_0x310239(0x17f)](async()=>{const _0x119275=_0x310239,_0x5445cc={'FWhWC':_0x550179['SMHYH']};try{if(_0x550179[_0x119275(0x175)](_0x550179[_0x119275(0x173)],_0x550179[_0x119275(0x12e)])){const _0x2b0d96=_0x550179[_0x119275(0x180)](_0x537dc2['seq'],0x1);log[_0x119275(0x1bb)]({'sessionId':_0x5791a6,'seq':_0x537dc2[_0x119275(0x1c7)],'isFirstChunk':_0x2b0d96,'targetId':_0x537dc2[_0x119275(0x191)],'deltaLength':_0x403db2[_0x119275(0x138)]},_0x550179[_0x119275(0x1d3)]);if(_0x537dc2[_0x119275(0x1a4)]){if(_0x550179[_0x119275(0x14c)](_0x119275(0xfc),_0x550179['anord'])){_0x5ad5c6[_0x119275(0x18f)]({'sessionId':_0x2d017c},_0x5445cc['FWhWC']);return;}else{const _0x1a28b9=await this[_0x119275(0x195)]['sendStreamGroup']({'fromUserId':this['getFromUserId'](_0x5791a6),'toGroupId':_0x537dc2[_0x119275(0x191)],'content':_0x403db2,'isFirstChunk':_0x2b0d96,'isLastChunk':![],'seq':_0x537dc2['seq'],'messageUID':_0x537dc2[_0x119275(0x19a)]||null});if(_0x1a28b9['messageUID'])_0x537dc2[_0x119275(0x19a)]=_0x1a28b9[_0x119275(0x19a)];}}else{const _0x575e29=await this['streamAPI'][_0x119275(0x131)]({'fromUserId':this[_0x119275(0x176)](_0x5791a6),'toUserId':_0x537dc2['targetId'],'content':_0x403db2,'isFirstChunk':_0x2b0d96,'isLastChunk':![],'seq':_0x537dc2['seq'],'messageUID':_0x537dc2[_0x119275(0x19a)]||null});if(_0x575e29[_0x119275(0x19a)])_0x537dc2[_0x119275(0x19a)]=_0x575e29[_0x119275(0x19a)];}_0x537dc2[_0x119275(0x1c7)]++,_0x537dc2[_0x119275(0x1cb)]=!![],_0x537dc2['lastSentTime']=Date[_0x119275(0x1d1)](),log['info']({'sessionId':_0x5791a6,'seq':_0x550179['EYfxK'](_0x537dc2[_0x119275(0x1c7)],0x1)},_0x119275(0x112));}else this[_0x119275(0x106)][_0x119275(0x1cd)](_0x3d311c,_0x119275(0x172)),this[_0x119275(0x170)][_0x119275(0x17a)](_0xdf3825[_0x119275(0x193)])&&_0x53d162['debug']({'sessionId':_0x280799[_0x119275(0x193)]},_0x550179[_0x119275(0x107)]);}catch(_0xeed4a5){log[_0x119275(0x13e)]({'err':_0xeed4a5,'sessionId':_0x5791a6,'delta':_0x403db2['substring'](0x0,0x32)},_0x550179['eKCzs']);}}),await this[_0x310239(0x14d)];}async[a0_0x54df74(0x19d)](_0x4244bb){const _0x14b431=a0_0x54df74,_0x14999f={'uDyXW':function(_0x229c5f,_0x5afd70){return _0x229c5f!==_0x5afd70;},'FSBRt':_0x14b431(0x146),'WfPFd':_0x14b431(0x123),'KAnBU':_0x14b431(0x1ca),'PwYqU':_0x14b431(0xf3),'vVZAV':'Already\x20sent\x20reply\x20for\x20this\x20session,\x20skipping','Ujctm':_0x14b431(0x12f),'MmGuq':_0x14b431(0xf6),'cQWpY':_0x14b431(0x1ae),'cogDK':_0x14b431(0x125),'NcYYg':_0x14b431(0x198),'iChJL':_0x14b431(0x197),'fhDgC':_0x14b431(0x156),'DGFAB':_0x14b431(0x1b7),'DGJfy':_0x14b431(0x159),'dnRJf':'idle'},_0x3fbee9=_0x4244bb[_0x14b431(0x193)];if(this[_0x14b431(0x170)]['has'](_0x3fbee9)){log[_0x14b431(0x18f)]({'sessionId':_0x3fbee9},_0x14999f['vVZAV']);return;}this['sentSessions'][_0x14b431(0x1c4)](_0x3fbee9);const _0x3204a9=this[_0x14b431(0x181)][_0x14b431(0x1a1)](_0x3fbee9);if(_0x3204a9&&_0x3204a9[_0x14b431(0x1cb)]){log[_0x14b431(0x1bb)]({'sessionId':_0x3fbee9,'streamSeq':_0x3204a9[_0x14b431(0x1c7)]},'Finishing\x20stream\x20with\x20last\x20chunk'),this[_0x14b431(0x14d)]=this[_0x14b431(0x14d)][_0x14b431(0x17f)](async()=>{const _0x295640=_0x14b431;if(_0x14999f[_0x295640(0x194)](_0x14999f[_0x295640(0x10b)],_0x14999f[_0x295640(0x1a8)]))try{_0x3204a9['isGroup']?await this[_0x295640(0x195)][_0x295640(0x11a)]({'fromUserId':this[_0x295640(0x176)](_0x3fbee9),'toGroupId':_0x3204a9[_0x295640(0x191)],'content':'','isFirstChunk':![],'isLastChunk':!![],'seq':_0x3204a9[_0x295640(0x1c7)],'messageUID':_0x3204a9[_0x295640(0x19a)]||null}):await this[_0x295640(0x195)][_0x295640(0x131)]({'fromUserId':this[_0x295640(0x176)](_0x3fbee9),'toUserId':_0x3204a9['targetId'],'content':'','isFirstChunk':![],'isLastChunk':!![],'seq':_0x3204a9[_0x295640(0x1c7)],'messageUID':_0x3204a9[_0x295640(0x19a)]||null}),log[_0x295640(0x1bb)]({'sessionId':_0x3fbee9,'seq':_0x3204a9[_0x295640(0x1c7)]},_0x14999f['KAnBU']);}catch(_0x132a13){log[_0x295640(0x13e)]({'err':_0x132a13,'sessionId':_0x3fbee9},_0x14999f[_0x295640(0x119)]);}else{_0x45eb7d[_0x295640(0x1bc)]({'sessionId':_0x409648},_0x295640(0x12d));return;}}),await this[_0x14b431(0x14d)];if(_0x3204a9[_0x14b431(0x160)][_0x14b431(0x1a3)]())try{const _0x4deeed=JSON[_0x14b431(0x18c)]({'__stream_history__':!![],'streamId':_0x3204a9[_0x14b431(0x19a)]||_0x3fbee9,'text':_0x3204a9[_0x14b431(0x160)],'sentTime':Date[_0x14b431(0x1d1)]()});await this[_0x14b431(0x1b2)][_0x14b431(0x141)](_0x3204a9['targetId'],_0x4deeed,_0x3204a9[_0x14b431(0x1a4)]?0x3:0x1),log[_0x14b431(0x1bb)]({'sessionId':_0x3fbee9,'textLength':_0x3204a9[_0x14b431(0x160)][_0x14b431(0x138)]},_0x14999f[_0x14b431(0x13c)]);}catch(_0x29f219){log[_0x14b431(0x13e)]({'err':_0x29f219,'sessionId':_0x3fbee9},_0x14999f[_0x14b431(0x1be)]);}this[_0x14b431(0x181)][_0x14b431(0x17a)](_0x3fbee9),this[_0x14b431(0x106)][_0x14b431(0x1cd)](_0x3204a9[_0x14b431(0x1cf)],_0x14b431(0x166));return;}if(_0x3204a9){if(_0x14b431(0x1ae)!==_0x14999f[_0x14b431(0x177)]){_0xcf6e22[_0x14b431(0x18f)]({'sessionId':_0x4d0a94},_0x14999f[_0x14b431(0x196)]);return;}else this[_0x14b431(0x181)][_0x14b431(0x17a)](_0x3fbee9);}log['info']({'sessionId':_0x3fbee9},_0x14b431(0x14b));const _0x19fb00=this[_0x14b431(0x106)]['getChatIdBySession'](_0x3fbee9);if(!_0x19fb00){log['warn']({'sessionId':_0x3fbee9},_0x14999f[_0x14b431(0x11c)]);return;}const _0x59b2b5=await this['opencode'][_0x14b431(0x101)](_0x3fbee9);log[_0x14b431(0x1bb)]({'sessionId':_0x3fbee9,'chatId':_0x19fb00,'hasText':!!_0x59b2b5},_0x14b431(0x13d));if(_0x59b2b5){const _0x5b3c20=_0x19fb00[_0x14b431(0x10e)](_0x14999f['NcYYg']),_0x1b353a=_0x19fb00[_0x14b431(0x10e)](_0x14999f[_0x14b431(0x1ac)]),_0x88891b=_0x5b3c20?_0x19fb00['replace'](_0x14999f[_0x14b431(0x10d)],''):_0x1b353a?_0x19fb00[_0x14b431(0x174)](_0x14999f[_0x14b431(0x1ac)],''):_0x19fb00[_0x14b431(0x174)]('claw-',''),_0x564e11=_0x5b3c20?0x3:0x1;log['info']({'targetId':_0x88891b,'textLength':_0x59b2b5['length'],'isGroup':_0x5b3c20,'isServiceChat':_0x1b353a},_0x14999f[_0x14b431(0x128)]);if(_0x1b353a){const _0x57a807=JSON[_0x14b431(0x18c)]({'msg_type':_0x14999f[_0x14b431(0x186)],'content':_0x59b2b5,'sessionId':_0x3fbee9,'userId':_0x88891b,'status':_0x14b431(0x1c1),'timestamp':Math['floor'](Date[_0x14b431(0x1d1)]()/0x3e8)});await this[_0x14b431(0x1b2)][_0x14b431(0x141)](_0x88891b,_0x57a807,_0x564e11);}else _0x14999f[_0x14b431(0x185)]!=='fAkOA'?_0xcd77c[_0x14b431(0x13e)]({'err':_0x29ad39,'sessionId':_0x431878},_0x14999f[_0x14b431(0x119)]):await this[_0x14b431(0x1b2)][_0x14b431(0x141)](_0x88891b,_0x59b2b5,_0x564e11);}this['sessionManager'][_0x14b431(0x1cd)](_0x19fb00,_0x14999f[_0x14b431(0x124)]);}async[a0_0x54df74(0x1d0)](_0x2038f1){const _0x5d4871=a0_0x54df74,_0x5541ce={'CfISz':_0x5d4871(0x1c0),'oZOOD':'group_','TMxDI':'service-','fphPl':_0x5d4871(0x1b3),'NWABl':function(_0x5255af,_0x334d6d){return _0x5255af!==_0x334d6d;},'XCKSz':_0x5d4871(0x110),'DhOQT':_0x5d4871(0x1a9),'ilpWX':_0x5d4871(0x1c5),'DnGbM':'ZlAOU','NmTbW':function(_0x30e3b0,_0x5edbc2){return _0x30e3b0===_0x5edbc2;},'wkpmW':function(_0x10fc1e,_0x3a12e2){return _0x10fc1e===_0x3a12e2;},'OKhLk':_0x5d4871(0x14f),'LEVaw':_0x5d4871(0x15c),'VdQEK':_0x5d4871(0x1a2),'vDuHD':_0x5d4871(0x154),'gSaUB':_0x5d4871(0x1ba),'LcKuI':'Session\x20already\x20sent,\x20skipping\x20stream','DxiKw':_0x5d4871(0xf7),'HYWMC':_0x5d4871(0x17c)},_0x2e0345=_0x2038f1[_0x5d4871(0x193)];if(this[_0x5d4871(0x181)][_0x5d4871(0x11f)](_0x2e0345)){log[_0x5d4871(0x18f)]({'sessionId':_0x2e0345},_0x5541ce['VdQEK']);return;}if(!this[_0x5d4871(0x115)][_0x5d4871(0x100)]){log[_0x5d4871(0x18f)]({'sessionId':_0x2e0345},_0x5541ce['vDuHD']);return;}const _0x384965=this['sessionManager'][_0x5d4871(0x117)](_0x2e0345);if(!_0x384965){log[_0x5d4871(0x1bc)]({'sessionId':_0x2e0345},_0x5541ce[_0x5d4871(0x113)]);return;}if(this['sentSessions'][_0x5d4871(0x11f)](_0x2e0345)){log['debug']({'sessionId':_0x2e0345},_0x5541ce[_0x5d4871(0x108)]);return;}const _0x46583d=_0x384965[_0x5d4871(0x10e)](_0x5541ce[_0x5d4871(0x192)]),_0xf6013e=_0x46583d?_0x384965[_0x5d4871(0x174)](_0x5541ce[_0x5d4871(0x192)],''):_0x384965['startsWith'](_0x5541ce[_0x5d4871(0x10f)])?_0x384965[_0x5d4871(0x174)](_0x5541ce[_0x5d4871(0x10f)],''):_0x384965[_0x5d4871(0x174)](_0x5541ce[_0x5d4871(0x1a7)],'');try{if(_0x5541ce[_0x5d4871(0x135)]===_0x5541ce[_0x5d4871(0x121)]){const _0x1181ec=this['sessionManager'][_0x5d4871(0x117)](_0x1cf7c2);if(!_0x1181ec){_0x382b13[_0x5d4871(0x1bc)]({'sessionId':_0x3f783a},Uakhkt[_0x5d4871(0x105)]);return;}_0x3cd26c={'messageUID':'','seq':0x1,'lastContent':'','lastSentTime':_0x5c76e3[_0x5d4871(0x1d1)](),'fullContent':'','hasSentStream':![],'chatId':_0x1181ec,'targetId':_0x1181ec[_0x5d4871(0x10e)](Uakhkt[_0x5d4871(0x192)])?_0x1181ec[_0x5d4871(0x174)](Uakhkt[_0x5d4871(0x192)],''):_0x1181ec['startsWith'](Uakhkt['TMxDI'])?_0x1181ec[_0x5d4871(0x174)](Uakhkt['TMxDI'],''):_0x1181ec[_0x5d4871(0x174)](Uakhkt[_0x5d4871(0x1a7)],''),'isGroup':_0x1181ec[_0x5d4871(0x10e)](Uakhkt[_0x5d4871(0x192)])},this[_0x5d4871(0x181)][_0x5d4871(0x120)](_0x620ece,_0x5997dc);}else{const _0x37f55d=await this['opencode'][_0x5d4871(0x101)](_0x2e0345);if(!_0x37f55d)return;let _0x4ece7a=this['streamStates']['get'](_0x2e0345);if(!_0x4ece7a){const _0x35d7d5=this['sessionManager'][_0x5d4871(0x117)](_0x2e0345);if(!_0x35d7d5){log[_0x5d4871(0x1bc)]({'sessionId':_0x2e0345},_0x5541ce['gSaUB']);return;}_0x4ece7a={'messageUID':'','seq':0x1,'lastContent':'','lastSentTime':Date['now'](),'fullContent':'','hasSentStream':![],'chatId':_0x35d7d5,'targetId':_0x35d7d5[_0x5d4871(0x10e)](_0x5541ce[_0x5d4871(0x192)])?_0x35d7d5[_0x5d4871(0x174)](_0x5d4871(0x198),''):_0x35d7d5[_0x5d4871(0x10e)](_0x5d4871(0x197))?_0x35d7d5['replace'](_0x5541ce[_0x5d4871(0x10f)],''):_0x35d7d5[_0x5d4871(0x174)](_0x5541ce[_0x5d4871(0x1a7)],''),'isGroup':_0x35d7d5[_0x5d4871(0x10e)](_0x5541ce[_0x5d4871(0x192)])},this[_0x5d4871(0x181)][_0x5d4871(0x120)](_0x2e0345,_0x4ece7a);}const _0x291ada=_0x37f55d[_0x5d4871(0x171)](_0x4ece7a[_0x5d4871(0x13a)][_0x5d4871(0x138)]);if(!_0x291ada)return;_0x4ece7a[_0x5d4871(0x160)]+=_0x291ada,log[_0x5d4871(0x1bb)]({'sessionId':_0x2e0345,'seq':_0x4ece7a[_0x5d4871(0x1c7)],'newLength':_0x291ada[_0x5d4871(0x138)]},_0x5d4871(0x15d)),this[_0x5d4871(0x14d)]=this[_0x5d4871(0x14d)][_0x5d4871(0x17f)](async()=>{const _0x15caf7=_0x5d4871;if(_0x5541ce[_0x15caf7(0x1a0)](_0x5541ce[_0x15caf7(0xf2)],_0x5541ce[_0x15caf7(0x12c)]))try{if(_0x5541ce[_0x15caf7(0x1a0)](_0x5541ce[_0x15caf7(0x116)],_0x5541ce[_0x15caf7(0x1ce)])){if(_0x46583d){const _0x32ae2d=await this[_0x15caf7(0x195)][_0x15caf7(0x11a)]({'fromUserId':this[_0x15caf7(0x176)](_0x2e0345),'toGroupId':_0xf6013e,'content':_0x291ada,'isFirstChunk':_0x5541ce[_0x15caf7(0x111)](_0x4ece7a[_0x15caf7(0x1c7)],0x1),'isLastChunk':![],'seq':_0x4ece7a[_0x15caf7(0x1c7)],'messageUID':_0x4ece7a[_0x15caf7(0x19a)]||null});if(_0x32ae2d['messageUID'])_0x4ece7a[_0x15caf7(0x19a)]=_0x32ae2d[_0x15caf7(0x19a)];}else{const _0x50e8a8=await this[_0x15caf7(0x195)][_0x15caf7(0x131)]({'fromUserId':this[_0x15caf7(0x176)](_0x2e0345),'toUserId':_0xf6013e,'content':_0x291ada,'isFirstChunk':_0x5541ce['NmTbW'](_0x4ece7a[_0x15caf7(0x1c7)],0x1),'isLastChunk':![],'seq':_0x4ece7a[_0x15caf7(0x1c7)],'messageUID':_0x4ece7a[_0x15caf7(0x19a)]||null});if(_0x50e8a8[_0x15caf7(0x19a)])_0x4ece7a['messageUID']=_0x50e8a8[_0x15caf7(0x19a)];}_0x4ece7a[_0x15caf7(0x1c7)]++,_0x4ece7a['hasSentStream']=!![],_0x4ece7a[_0x15caf7(0x13a)]=_0x37f55d,_0x4ece7a[_0x15caf7(0x17b)]=Date[_0x15caf7(0x1d1)]();}else return;}catch(_0x5b85e2){_0x5541ce[_0x15caf7(0x178)](_0x5541ce[_0x15caf7(0x16a)],'sBSxv')?this[_0x15caf7(0x12a)]=![]:(log['error']({'err':_0x5b85e2,'sessionId':_0x2e0345,'targetId':_0xf6013e},_0x5541ce[_0x15caf7(0x147)]),this[_0x15caf7(0x181)]['delete'](_0x2e0345));}else{_0x252430['warn']({'sessionId':_0x201711},_0x15caf7(0x168));return;}}),await this[_0x5d4871(0x14d)];}}catch(_0x46505c){log['error']({'err':_0x46505c,'sessionId':_0x2e0345,'targetId':_0xf6013e},_0x5d4871(0x16f)),this[_0x5d4871(0x181)]['delete'](_0x2e0345);}}async['handleMessageUpdated'](_0x1293ba){const _0x3bee47=a0_0x54df74,_0x5660ad={'NbJtP':function(_0x430fbb,_0x42d560){return _0x430fbb!==_0x42d560;},'vohEk':_0x3bee47(0x12b),'JJubp':_0x3bee47(0x157),'VGIcz':_0x3bee47(0x12d),'AipqE':_0x3bee47(0x172),'jzmHz':function(_0x59f064,_0x48efd0){return _0x59f064===_0x48efd0;},'yKLeH':function(_0x5ab28a,_0x7aa20c){return _0x5ab28a>_0x7aa20c;},'qDihi':'jOhyd','dvxEG':'AI\x20response\x20content\x20updated'},_0x453956=_0x1293ba[_0x3bee47(0x193)];if(this['streamStates']['has'](_0x453956)){if(_0x5660ad['NbJtP'](_0x5660ad[_0x3bee47(0x148)],_0x5660ad[_0x3bee47(0x19b)]))return;else{_0x39c14a['warn']({'sessionId':_0x1e4f5c},'Session\x20already\x20sent,\x20skipping\x20stream\x20delta');return;}}if(this['sentSessions'][_0x3bee47(0x11f)](_0x453956))return;const _0x1d2abe=this['sessionManager']['getChatIdBySession'](_0x453956);if(!_0x1d2abe){log[_0x3bee47(0x1bc)]({'sessionId':_0x453956},_0x5660ad[_0x3bee47(0x182)]);return;}const _0x3082fc=this[_0x3bee47(0x106)][_0x3bee47(0x134)](_0x1d2abe);if(!_0x3082fc||_0x5660ad['NbJtP'](_0x3082fc[_0x3bee47(0x149)],_0x5660ad['AipqE']))return;const _0x4d0a8f=_0x1293ba[_0x3bee47(0xff)];if(_0x4d0a8f){const _0x4fb92d=_0x4d0a8f[_0x3bee47(0x1bb)]?.[_0x3bee47(0x1b5)]||_0x4d0a8f['role'];if(_0x5660ad['jzmHz'](_0x4fb92d,_0x3bee47(0x1b6))||_0x5660ad[_0x3bee47(0x1aa)](_0x4fb92d,_0x3bee47(0x18a))){if(_0x4d0a8f[_0x3bee47(0x184)]&&_0x5660ad[_0x3bee47(0x199)](_0x4d0a8f[_0x3bee47(0x184)][_0x3bee47(0x138)],0x0)){if(_0x5660ad['NbJtP'](_0x5660ad[_0x3bee47(0x1bf)],_0x5660ad[_0x3bee47(0x1bf)])){_0x3f43e4[_0x3bee47(0x1bc)]({'sessionId':_0x1f4498},'No\x20chatId\x20found\x20for\x20message.part.updated');return;}else{const _0x221143=_0x4d0a8f[_0x3bee47(0x184)][_0x3bee47(0x126)](_0x179c78=>_0x179c78[_0x3bee47(0x114)]===_0x3bee47(0x1b9));_0x221143?.['text']&&log[_0x3bee47(0x18f)]({'sessionId':_0x453956,'textLength':_0x221143[_0x3bee47(0x1b9)][_0x3bee47(0x138)]},_0x5660ad[_0x3bee47(0x14e)]);}}}}}[a0_0x54df74(0x17e)](_0x31526b){const _0xe9e5dd=a0_0x54df74,_0x3f675b={'nqaHg':function(_0x356a59,_0x38ddbe){return _0x356a59===_0x38ddbe;},'gSUyF':_0xe9e5dd(0x172),'mCSgG':'Cleared\x20sent\x20flag\x20for\x20new\x20message\x20turn'},_0x58a395=this[_0xe9e5dd(0x106)][_0xe9e5dd(0x117)](_0x31526b[_0xe9e5dd(0x193)]);_0x58a395&&_0x3f675b[_0xe9e5dd(0x16b)](_0x31526b[_0xe9e5dd(0x149)][_0xe9e5dd(0x114)],_0x3f675b['gSUyF'])&&(this[_0xe9e5dd(0x106)]['updateStatus'](_0x58a395,_0x3f675b[_0xe9e5dd(0x164)]),this[_0xe9e5dd(0x170)][_0xe9e5dd(0x17a)](_0x31526b['sessionID'])&&log[_0xe9e5dd(0x18f)]({'sessionId':_0x31526b[_0xe9e5dd(0x193)]},_0x3f675b[_0xe9e5dd(0x19c)]));}async[a0_0x54df74(0x183)](_0x136edd){const _0x702664=a0_0x54df74,_0x5e95ff={'DUsUA':_0x702664(0x11d),'tjqfe':function(_0x3be246,_0x194141){return _0x3be246===_0x194141;},'lNyKz':_0x702664(0x103),'WvZyl':function(_0x48acee,_0x5c85c7){return _0x48acee!==_0x5c85c7;},'STYjc':'KlMmF','KcpNd':function(_0x40b6aa,_0x16749f){return _0x40b6aa!==_0x16749f;},'Kevvd':'aJZqx','kLicl':_0x702664(0x16c),'nCwRe':_0x702664(0x198),'rfSBD':'claw-','pascs':_0x702664(0x166)};if(!_0x136edd[_0x702664(0x193)])return;const _0x5dd1e7=this[_0x702664(0x106)]['getChatIdBySession'](_0x136edd[_0x702664(0x193)]);if(!_0x5dd1e7)return;let _0x16aa78;if(_0x5e95ff[_0x702664(0x16e)](typeof _0x136edd['error'],_0x5e95ff[_0x702664(0x102)]))_0x5e95ff['WvZyl'](_0x702664(0x133),_0x5e95ff[_0x702664(0x19f)])?_0x59778e['debug']({'sessionId':_0xf074cd[_0x702664(0x193)]},gLPXPw['DUsUA']):_0x16aa78=_0x136edd[_0x702664(0x13e)];else{if(_0x136edd[_0x702664(0x13e)]?.[_0x702664(0x1bd)]?.[_0x702664(0xff)])_0x16aa78=_0x136edd['error'][_0x702664(0x1bd)][_0x702664(0xff)];else{if(_0x136edd[_0x702664(0x13e)]?.[_0x702664(0xff)]){if(_0x5e95ff['KcpNd']('fnUko','pMLAa'))_0x16aa78=_0x136edd[_0x702664(0x13e)][_0x702664(0xff)];else{_0x117b6e['warn']({'sessionId':_0x2596d4},_0x702664(0x1ba));return;}}else _0x16aa78=_0x702664(0x143);}}this[_0x702664(0x170)][_0x702664(0x1c4)](_0x136edd[_0x702664(0x193)]);const _0x396cbd=this['streamStates'][_0x702664(0x1a1)](_0x136edd['sessionID']);_0x396cbd&&(_0x5e95ff['tjqfe'](_0x5e95ff[_0x702664(0x122)],_0x5e95ff[_0x702664(0x122)])?this['streamStates'][_0x702664(0x17a)](_0x136edd[_0x702664(0x193)]):this[_0x702664(0x12a)]=![]);log[_0x702664(0x13e)]({'sessionId':_0x136edd[_0x702664(0x193)],'error':_0x16aa78},_0x5e95ff[_0x702664(0x167)]);const _0x2a838d=_0x5dd1e7[_0x702664(0x10e)](_0x5e95ff[_0x702664(0x1a6)]),_0x3ecdca=_0x2a838d?_0x5dd1e7[_0x702664(0x174)](_0x5e95ff['nCwRe'],''):_0x5dd1e7['replace'](_0x5e95ff[_0x702664(0x153)],''),_0x2e1e29=_0x2a838d?0x3:0x1,_0x4817dc=_0x702664(0x1a5)+_0x16aa78;await this[_0x702664(0x1b2)]['sendMessage'](_0x3ecdca,_0x4817dc,_0x2e1e29),this['sessionManager']['updateStatus'](_0x5dd1e7,_0x5e95ff['pascs']);}}
|
package/dist/plugin.d.ts
CHANGED