@quukk/opencode-clawmessenger 0.1.0

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 (105) hide show
  1. package/README.md +526 -0
  2. package/bin/opencode-clawmessenger +2 -0
  3. package/bin/opencode-clawmessenger-setup +5 -0
  4. package/bin/opencode-clawmessenger.cmd +5 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +288 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/core/auto-register.d.ts +24 -0
  10. package/dist/core/auto-register.d.ts.map +1 -0
  11. package/dist/core/auto-register.js +174 -0
  12. package/dist/core/auto-register.js.map +1 -0
  13. package/dist/core/config.d.ts +68 -0
  14. package/dist/core/config.d.ts.map +1 -0
  15. package/dist/core/config.js +80 -0
  16. package/dist/core/config.js.map +1 -0
  17. package/dist/core/daemon.d.ts +19 -0
  18. package/dist/core/daemon.d.ts.map +1 -0
  19. package/dist/core/daemon.js +77 -0
  20. package/dist/core/daemon.js.map +1 -0
  21. package/dist/core/dedup.d.ts +8 -0
  22. package/dist/core/dedup.d.ts.map +1 -0
  23. package/dist/core/dedup.js +25 -0
  24. package/dist/core/dedup.js.map +1 -0
  25. package/dist/core/hook-manager.d.ts +11 -0
  26. package/dist/core/hook-manager.d.ts.map +1 -0
  27. package/dist/core/hook-manager.js +33 -0
  28. package/dist/core/hook-manager.js.map +1 -0
  29. package/dist/core/logger.d.ts +5 -0
  30. package/dist/core/logger.d.ts.map +1 -0
  31. package/dist/core/logger.js +49 -0
  32. package/dist/core/logger.js.map +1 -0
  33. package/dist/core/mac-address.d.ts +2 -0
  34. package/dist/core/mac-address.d.ts.map +1 -0
  35. package/dist/core/mac-address.js +43 -0
  36. package/dist/core/mac-address.js.map +1 -0
  37. package/dist/core/message-handler.d.ts +64 -0
  38. package/dist/core/message-handler.d.ts.map +1 -0
  39. package/dist/core/message-handler.js +879 -0
  40. package/dist/core/message-handler.js.map +1 -0
  41. package/dist/core/ops-assistant.d.ts +26 -0
  42. package/dist/core/ops-assistant.d.ts.map +1 -0
  43. package/dist/core/ops-assistant.js +270 -0
  44. package/dist/core/ops-assistant.js.map +1 -0
  45. package/dist/core/qr-crypto.d.ts +2 -0
  46. package/dist/core/qr-crypto.d.ts.map +1 -0
  47. package/dist/core/qr-crypto.js +66 -0
  48. package/dist/core/qr-crypto.js.map +1 -0
  49. package/dist/core/session-manager.d.ts +22 -0
  50. package/dist/core/session-manager.d.ts.map +1 -0
  51. package/dist/core/session-manager.js +144 -0
  52. package/dist/core/session-manager.js.map +1 -0
  53. package/dist/core/types.d.ts +78 -0
  54. package/dist/core/types.d.ts.map +1 -0
  55. package/dist/core/types.js +26 -0
  56. package/dist/core/types.js.map +1 -0
  57. package/dist/index.d.ts +13 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +12 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/openclaw/client.d.ts +36 -0
  62. package/dist/openclaw/client.d.ts.map +1 -0
  63. package/dist/openclaw/client.js +494 -0
  64. package/dist/openclaw/client.js.map +1 -0
  65. package/dist/opencode/client.d.ts +35 -0
  66. package/dist/opencode/client.d.ts.map +1 -0
  67. package/dist/opencode/client.js +276 -0
  68. package/dist/opencode/client.js.map +1 -0
  69. package/dist/opencode/event-handler.d.ts +38 -0
  70. package/dist/opencode/event-handler.d.ts.map +1 -0
  71. package/dist/opencode/event-handler.js +467 -0
  72. package/dist/opencode/event-handler.js.map +1 -0
  73. package/dist/plugin.d.ts +4 -0
  74. package/dist/plugin.d.ts.map +1 -0
  75. package/dist/plugin.js +84 -0
  76. package/dist/plugin.js.map +1 -0
  77. package/dist/rongcloud/client.d.ts +34 -0
  78. package/dist/rongcloud/client.d.ts.map +1 -0
  79. package/dist/rongcloud/client.js +292 -0
  80. package/dist/rongcloud/client.js.map +1 -0
  81. package/dist/rongcloud/env-polyfill.d.ts +2 -0
  82. package/dist/rongcloud/env-polyfill.d.ts.map +1 -0
  83. package/dist/rongcloud/env-polyfill.js +107 -0
  84. package/dist/rongcloud/env-polyfill.js.map +1 -0
  85. package/dist/rongcloud/server-api.d.ts +38 -0
  86. package/dist/rongcloud/server-api.d.ts.map +1 -0
  87. package/dist/rongcloud/server-api.js +157 -0
  88. package/dist/rongcloud/server-api.js.map +1 -0
  89. package/dist/standalone.d.ts +10 -0
  90. package/dist/standalone.d.ts.map +1 -0
  91. package/dist/standalone.js +229 -0
  92. package/dist/standalone.js.map +1 -0
  93. package/dist/types/plugin.d.ts +20 -0
  94. package/dist/types/plugin.d.ts.map +1 -0
  95. package/dist/types/plugin.js +2 -0
  96. package/dist/types/plugin.js.map +1 -0
  97. package/dist/websocket/client.d.ts +20 -0
  98. package/dist/websocket/client.d.ts.map +1 -0
  99. package/dist/websocket/client.js +88 -0
  100. package/dist/websocket/client.js.map +1 -0
  101. package/dist/websocket/server-client.d.ts +22 -0
  102. package/dist/websocket/server-client.d.ts.map +1 -0
  103. package/dist/websocket/server-client.js +98 -0
  104. package/dist/websocket/server-client.js.map +1 -0
  105. package/package.json +71 -0
@@ -0,0 +1,467 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-handler.js","sourceRoot":"","sources":["../../src/opencode/event-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,MAAM,GAAG,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;AAczC,MAAM,OAAO,YAAY;IAWvB,YACE,cAA8B,EAC9B,UAA2B,EAC3B,QAAwB,EACxB,MAA2B;QATrB,cAAS,GAAG,KAAK,CAAC;QAClB,iBAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,iBAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC9C,gBAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAE,WAAW;QAQnD,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAA2D;QACrE,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAElC,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;gBAC7C,IAAI,CAAC,IAAI,CAAC,SAAS;oBAAE,MAAM;gBAC3B,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC;QACzC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACK,aAAa,CAAC,SAAiB;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;gBACpC,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,WAAgB;QACxC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC;YAE5C,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,oBAAoB,CAAC,CAAC;YAE5F,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,cAAc;oBACjB,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,oBAAoB,CAAC,CAAC;oBAC/D,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;oBACpC,MAAM;gBACR,KAAK,oBAAoB;oBACvB,kBAAkB;oBAClB,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;oBACzC,MAAM;gBACR,KAAK,sBAAsB;oBACzB,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,4BAA4B,CAAC,CAAC;oBACvE,MAAM,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;oBAC3C,MAAM;gBACR,KAAK,iBAAiB;oBACpB,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC;oBACjH,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;oBACvC,MAAM;gBACR,KAAK,gBAAgB;oBACnB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;oBAC/B,MAAM;gBACR,KAAK,eAAe;oBAClB,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBAC9B,MAAM;gBACR;oBACE,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,sBAAsB,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,sBAAsB,CAAC,UAA4E;QAC/G,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QACvC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,+BAA+B,CAAC,CAAC;QAE/I,oCAAoC;QACpC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,6CAA6C,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,iBAAiB;QACjB,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,6CAA6C,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QAC3G,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,4CAA4C;QAE5C,UAAU;QACV,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,wCAAwC,CAAC,CAAC;gBAClE,OAAO;YACT,CAAC;YAED,WAAW,GAAG;gBACZ,UAAU,EAAE,EAAE;gBACd,GAAG,EAAE,CAAC,EAAG,kBAAkB;gBAC3B,WAAW,EAAE,EAAE;gBACf,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;gBACxB,WAAW,EAAE,EAAE;gBACf,aAAa,EAAE,KAAK;gBACpB,MAAM;gBACN,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACrK,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;aACrC,CAAC;YACF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC;QAED,SAAS;QACT,WAAW,CAAC,WAAW,IAAI,KAAK,CAAC;QAEjC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAEjG,mBAAmB;QACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAClD,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,WAAY,CAAC,GAAG,KAAK,CAAC,CAAC;gBAE5C,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,WAAY,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,mCAAmC,CAAC,CAAC;gBAE9J,IAAI,WAAY,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;wBAClD,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;wBACzC,SAAS,EAAE,WAAY,CAAC,QAAQ;wBAChC,OAAO,EAAE,KAAK;wBACd,YAAY;wBACZ,WAAW,EAAE,KAAK;wBAClB,GAAG,EAAE,WAAY,CAAC,GAAG;wBACrB,UAAU,EAAE,WAAY,CAAC,UAAU,IAAI,IAAI;qBAC5C,CAAC,CAAC;oBACH,IAAI,MAAM,CAAC,UAAU;wBAAE,WAAY,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;gBACrE,CAAC;qBAAM,CAAC;oBACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;wBACpD,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;wBACzC,QAAQ,EAAE,WAAY,CAAC,QAAQ;wBAC/B,OAAO,EAAE,KAAK;wBACd,YAAY;wBACZ,WAAW,EAAE,KAAK;wBAClB,GAAG,EAAE,WAAY,CAAC,GAAG;wBACrB,UAAU,EAAE,WAAY,CAAC,UAAU,IAAI,IAAI;qBAC5C,CAAC,CAAC;oBACH,IAAI,MAAM,CAAC,UAAU;wBAAE,WAAY,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;gBACrE,CAAC;gBAED,WAAY,CAAC,GAAG,EAAE,CAAC;gBACnB,WAAY,CAAC,aAAa,GAAG,IAAI,CAAC;gBAClC,WAAY,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,WAAY,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;YAC1E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,0BAA0B,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,UAAiC;QAC/D,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QAEvC,mBAAmB;QACnB,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,+CAA+C,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEjC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAErD,wCAAwC;QACxC,IAAI,WAAW,IAAI,WAAW,CAAC,aAAa,EAAE,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,kCAAkC,CAAC,CAAC;YAExF,WAAW;YACX,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBAClD,IAAI,CAAC;oBACH,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;wBACxB,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;4BACnC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;4BACzC,SAAS,EAAE,WAAW,CAAC,QAAQ;4BAC/B,OAAO,EAAE,EAAE;4BACX,YAAY,EAAE,KAAK;4BACnB,WAAW,EAAE,IAAI;4BACjB,GAAG,EAAE,WAAW,CAAC,GAAG;4BACpB,UAAU,EAAE,WAAW,CAAC,UAAU,IAAI,IAAI;yBAC3C,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;4BACrC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;4BACzC,QAAQ,EAAE,WAAW,CAAC,QAAQ;4BAC9B,OAAO,EAAE,EAAE;4BACX,YAAY,EAAE,KAAK;4BACnB,WAAW,EAAE,IAAI;4BACjB,GAAG,EAAE,WAAW,CAAC,GAAG;4BACpB,UAAU,EAAE,WAAW,CAAC,UAAU,IAAI,IAAI;yBAC3C,CAAC,CAAC;oBACL,CAAC;oBACD,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,wBAAwB,CAAC,CAAC;gBAC1E,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,kCAAkC,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,WAAW,CAAC;YAEvB,wCAAwC;YACxC,IAAI,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC;wBACpC,kBAAkB,EAAE,IAAI;wBACxB,QAAQ,EAAE,WAAW,CAAC,UAAU,IAAI,SAAS;wBAC7C,IAAI,EAAE,WAAW,CAAC,WAAW;wBAC7B,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;qBACrB,CAAC,CAAC;oBACH,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrG,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC;gBAC7F,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,+BAA+B,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;YAED,SAAS;YACT,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,sBAAsB;QACtB,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,mCAAmC,CAAC,CAAC;QAE7D,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,6BAA6B,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,oBAAoB;QACpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAEzE,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YACzI,MAAM,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,kCAAkC,CAAC,CAAC;YAE5G,IAAI,aAAa,EAAE,CAAC;gBAClB,yCAAyC;gBACzC,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC;oBACpC,QAAQ,EAAE,uBAAuB;oBACjC,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,SAAS;oBACpB,MAAM,EAAE,QAAQ;oBAChB,MAAM,EAAE,SAAS;oBACjB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;iBACzC,CAAC,CAAC;gBACH,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;YAChF,CAAC;iBAAM,CAAC;gBACN,gBAAgB;gBAChB,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAEO,KAAK,CAAC,wBAAwB,CAAC,UAAgD;QACrF,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QAEvC,sCAAsC;QACtC,yCAAyC;QACzC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,wDAAwD,CAAC,CAAC;YACnF,OAAO;QACT,CAAC;QAED,oCAAoC;QACpC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,iFAAiF,CAAC,CAAC;YAC5G,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,0CAA0C,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,EAAE,uCAAuC,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAEzJ,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YACjE,IAAI,CAAC,IAAI;gBAAE,OAAO;YAEpB,UAAU;YACV,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBACjE,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,0CAA0C,CAAC,CAAC;oBACpE,OAAO;gBACT,CAAC;gBAED,WAAW,GAAG;oBACZ,UAAU,EAAE,EAAE;oBACd,GAAG,EAAE,CAAC,EAAG,kBAAkB;oBAC3B,WAAW,EAAE,EAAE;oBACf,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;oBACxB,WAAW,EAAE,EAAE;oBACf,aAAa,EAAE,KAAK;oBACpB,MAAM;oBACN,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACrK,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;iBACrC,CAAC;gBACF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAChD,CAAC;YAEC,UAAU;YACV,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,CAAC,UAAU;gBAAE,OAAO;YAExB,SAAS;YACT,WAAW,CAAC,WAAW,IAAI,UAAU,CAAC;YAEtC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,0CAA0C,CAAC,CAAC;YAExH,mBAAmB;YACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBAClD,IAAI,CAAC;oBACH,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;4BAClD,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;4BACzC,SAAS,EAAE,QAAQ;4BACnB,OAAO,EAAE,UAAU;4BACnB,YAAY,EAAE,WAAY,CAAC,GAAG,KAAK,CAAC;4BACpC,WAAW,EAAE,KAAK;4BAClB,GAAG,EAAE,WAAY,CAAC,GAAG;4BACrB,UAAU,EAAE,WAAY,CAAC,UAAU,IAAI,IAAI;yBAC5C,CAAC,CAAC;wBACH,IAAI,MAAM,CAAC,UAAU;4BAAE,WAAY,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;oBACrE,CAAC;yBAAM,CAAC;wBACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;4BACpD,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;4BACzC,QAAQ,EAAE,QAAQ;4BAClB,OAAO,EAAE,UAAU;4BACnB,YAAY,EAAE,WAAY,CAAC,GAAG,KAAK,CAAC;4BACpC,WAAW,EAAE,KAAK;4BAClB,GAAG,EAAE,WAAY,CAAC,GAAG;4BACrB,UAAU,EAAE,WAAY,CAAC,UAAU,IAAI,IAAI;yBAC5C,CAAC,CAAC;wBACH,IAAI,MAAM,CAAC,UAAU;4BAAE,WAAY,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;oBACrE,CAAC;oBAED,WAAY,CAAC,GAAG,EAAE,CAAC;oBACnB,WAAY,CAAC,aAAa,GAAG,IAAI,CAAC;oBAClC,WAAY,CAAC,WAAW,GAAG,IAAI,CAAC;oBAChC,WAAY,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACzC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,oBAAoB,CAAC,CAAC;oBAC9D,sCAAsC;oBACtC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,WAAW,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,0BAA0B,CAAC,CAAC;YACpE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,UAAgD;QACjF,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QAEvC,oCAAoC;QACpC,gBAAgB;QAChB,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,WAAW;QACX,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,gBAAgB;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,qCAAqC,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,mCAAmC;QACnC,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC;QAC/B,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC;YACxC,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7C,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;oBAC/D,IAAI,QAAQ,EAAE,IAAI,EAAE,CAAC;wBACnB,GAAG,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,6BAA6B,CAAC,CAAC;oBAC5F,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,UAA2D;QACpF,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC5E,IAAI,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChD,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACjD,0DAA0D;YAC1D,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnD,GAAG,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,wCAAwC,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,UAA8C;QACtE,IAAI,CAAC,UAAU,CAAC,SAAS;YAAE,OAAO;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,eAAe;QACf,IAAI,YAAoB,CAAC;QACzB,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACzC,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC;QAClC,CAAC;aAAM,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YAC3C,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/C,CAAC;aAAM,IAAI,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;YACrC,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,eAAe,CAAC;QACjC,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAE5C,gBAAgB;QAChB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAChE,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,eAAe,CAAC,CAAC;QACrF,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtF,MAAM,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzC,iBAAiB;QACjB,MAAM,SAAS,GAAG,YAAY,YAAY,EAAE,CAAC;QAC7C,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACzE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { Plugin } from './types/plugin.js';
2
+ declare const ClawMessengerPlugin: Plugin;
3
+ export default ClawMessengerPlugin;
4
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,mBAAmB,CAAC;AAY7D,QAAA,MAAM,mBAAmB,EAAE,MAmF1B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
package/dist/plugin.js ADDED
@@ -0,0 +1,84 @@
1
+ import { ConfigManager } from './core/config.js';
2
+ import { SessionManager } from './core/session-manager.js';
3
+ import { MessageHandler } from './core/message-handler.js';
4
+ import { RongCloudClient } from './rongcloud/client.js';
5
+ import { OpenCodeClient } from './opencode/client.js';
6
+ import { EventHandler } from './opencode/event-handler.js';
7
+ import { createLogger } from './core/logger.js';
8
+ import { getOrRegisterToken, loadAutoConfig, generateNodeId } from './core/auto-register.js';
9
+ const log = createLogger('plugin');
10
+ const ClawMessengerPlugin = {
11
+ id: 'clawmessenger',
12
+ server: async (input) => {
13
+ const { client, project, directory } = input;
14
+ log.info('Initializing...');
15
+ const configManager = new ConfigManager();
16
+ const config = configManager.load();
17
+ if (!config.token) {
18
+ log.info('Token missing, auto-registering...');
19
+ const token = await getOrRegisterToken(config.serverUrl, undefined, log);
20
+ if (!token)
21
+ throw new Error('自动注册失败,请运行: npx opencode-clawmessenger setup');
22
+ config.token = token;
23
+ config.accountId = (await loadAutoConfig())?.nodeId || generateNodeId();
24
+ }
25
+ log.info({ accountId: config.accountId, opencodeUrl: config.opencodeUrl }, 'Configuration loaded');
26
+ const opencode = new OpenCodeClient({
27
+ baseUrl: config.opencodeUrl,
28
+ directory: directory || project?.root || process.cwd(),
29
+ password: config.opencodePassword,
30
+ });
31
+ const sessionManager = new SessionManager(opencode);
32
+ const rongClient = new RongCloudClient({
33
+ appKey: config.appKey,
34
+ token: config.token,
35
+ accountId: config.accountId,
36
+ }, log);
37
+ const messageHandler = new MessageHandler(config, sessionManager, rongClient, opencode);
38
+ let eventHandler;
39
+ try {
40
+ const events = client.event?.subscribe
41
+ ? await client.event.subscribe({})
42
+ : await client.global.event({});
43
+ eventHandler = new EventHandler(sessionManager, rongClient, opencode, config);
44
+ eventHandler.start(events).catch((err) => {
45
+ log.error({ err }, 'Event stream error');
46
+ });
47
+ }
48
+ catch (err) {
49
+ log.warn({ err }, 'Failed to start event stream');
50
+ }
51
+ const connected = await rongClient.connect((msg) => {
52
+ messageHandler.handleMessage(msg).catch((err) => {
53
+ log.error({ err }, 'Message handling failed');
54
+ });
55
+ });
56
+ if (!connected)
57
+ throw new Error('融云连接失败');
58
+ log.info('ClawMessenger plugin started');
59
+ return {
60
+ cleanup: async () => {
61
+ log.info('Cleaning up...');
62
+ if (eventHandler)
63
+ eventHandler.stop();
64
+ rongClient.disconnect();
65
+ await sessionManager.cleanup();
66
+ },
67
+ /**
68
+ * 发送消息给指定用户或群组
69
+ * @param targetId 目标用户ID或群组ID
70
+ * @param content 消息内容(纯文本或JSON字符串)
71
+ * @param options 可选参数:conversationType(1=私聊,3=群聊,默认1)、extra(额外JSON字段)
72
+ * @returns { success: boolean, messageUId?: string, error?: string }
73
+ *
74
+ * 使用示例:
75
+ * - 私聊:await plugin.sendToUser('user123', '你好')
76
+ * - 群聊:await plugin.sendToUser('group456', '大家好', { conversationType: 3 })
77
+ * - 带额外数据:await plugin.sendToUser('admin', '需要添加知识库', { extra: { category: 'knowledge' } })
78
+ */
79
+ sendToUser: (targetId, content, options) => messageHandler.sendToUser(targetId, content, options),
80
+ };
81
+ },
82
+ };
83
+ export default ClawMessengerPlugin;
84
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import './env-polyfill.js';
2
+ import type { Logger } from '../core/logger.js';
3
+ import type { RongCloudMessage } from '../core/types.js';
4
+ export declare class RongCloudClient {
5
+ private config;
6
+ private log;
7
+ private _isConnected;
8
+ private messageHandler?;
9
+ private sentMessageUIds;
10
+ private CommandMessage;
11
+ private ServiceChatMessage;
12
+ private OpsChatMessage;
13
+ private OpsChatResponseMessage;
14
+ private DeviceStatusRequestMessage;
15
+ private DeviceStatusReportMessage;
16
+ private DeviceControlMessage;
17
+ private DeviceControlResultMessage;
18
+ constructor(config: {
19
+ appKey: string;
20
+ token: string;
21
+ accountId: string;
22
+ }, log: Logger);
23
+ get isConnected(): boolean;
24
+ connect(handler: (msg: RongCloudMessage) => void): Promise<{
25
+ success: boolean;
26
+ userId?: string;
27
+ }>;
28
+ private handleReceivedMessage;
29
+ sendMessage(targetId: string, content: string, conversationType?: number): Promise<void>;
30
+ sendReadReceipt(msg: RongCloudMessage): Promise<void>;
31
+ clearUnreadStatus(conversationType: number, targetId: string): Promise<void>;
32
+ disconnect(): void;
33
+ }
34
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/rongcloud/client.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAIzD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAuD;IACrE,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAAC,CAAkC;IACzD,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,kBAAkB,CAAM;IAChC,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,sBAAsB,CAAM;IACpC,OAAO,CAAC,0BAA0B,CAAM;IACxC,OAAO,CAAC,yBAAyB,CAAM;IACvC,OAAO,CAAC,oBAAoB,CAAM;IAClC,OAAO,CAAC,0BAA0B,CAAM;gBAE5B,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,EAAE,MAAM;IAKrF,IAAI,WAAW,IAAI,OAAO,CAEzB;IAEK,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA+FvG,OAAO,CAAC,qBAAqB;IAoDvB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAwD3F,eAAe,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuErD,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBlF,UAAU,IAAI,IAAI;CAOnB"}