@ywfe/openclaw-plugin-caryscloud-im 0.0.1

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.
@@ -0,0 +1,454 @@
1
+ import WebSocket from 'ws';
2
+ import { ConnectionError, MessageError, } from './shared/errors.js';
3
+ import { DEFAULT_HEARTBEAT_INTERVAL, DEFAULT_CONNECTION_TIMEOUT, DEFAULT_RECONNECT_MAX_ATTEMPTS, DEFAULT_RECONNECT_BASE_DELAY, DEFAULT_RECONNECT_MAX_DELAY, DEFAULT_MESSAGE_QUEUE_MAX_SIZE, DEFAULT_PONG_TIMEOUT, } from './shared/constants.js';
4
+ export class WebSocketClient {
5
+ ws = null;
6
+ _state = 'idle';
7
+ messageHandlers = [];
8
+ logger;
9
+ uuid;
10
+ wsUrl;
11
+ authToken;
12
+ isDestroyed = false;
13
+ heartbeatInterval;
14
+ connectionTimeout;
15
+ reconnectMaxAttempts;
16
+ reconnectBaseDelay;
17
+ reconnectMaxDelay;
18
+ messageQueueMaxSize;
19
+ pongTimeout;
20
+ reconnectAttempts = 0;
21
+ reconnectTimer = null;
22
+ connectionTimer = null;
23
+ heartbeatTimer = null;
24
+ pongTimer = null;
25
+ messageQueue = [];
26
+ lastPongTime = 0;
27
+ constructor(options, logger) {
28
+ this.wsUrl = options.wsUrl;
29
+ this.uuid = options.uuid;
30
+ this.authToken = options.authToken;
31
+ this.logger = logger;
32
+ this.heartbeatInterval = options.heartbeatInterval ?? DEFAULT_HEARTBEAT_INTERVAL;
33
+ this.connectionTimeout = options.connectionTimeout ?? DEFAULT_CONNECTION_TIMEOUT;
34
+ this.reconnectMaxAttempts = options.reconnectMaxAttempts ?? DEFAULT_RECONNECT_MAX_ATTEMPTS;
35
+ this.reconnectBaseDelay = options.reconnectBaseDelay ?? DEFAULT_RECONNECT_BASE_DELAY;
36
+ this.reconnectMaxDelay = options.reconnectMaxDelay ?? DEFAULT_RECONNECT_MAX_DELAY;
37
+ this.messageQueueMaxSize = options.messageQueueMaxSize ?? DEFAULT_MESSAGE_QUEUE_MAX_SIZE;
38
+ this.pongTimeout = options.pongTimeout ?? DEFAULT_PONG_TIMEOUT;
39
+ }
40
+ get state() {
41
+ return this._state;
42
+ }
43
+ getIsReady() {
44
+ return this._state === 'connected' && !this.isDestroyed;
45
+ }
46
+ isInConflict() {
47
+ return this._state === 'conflict';
48
+ }
49
+ getUuid() {
50
+ return this.uuid;
51
+ }
52
+ async initialize() {
53
+ if (this._state === 'connecting') {
54
+ this.logger.warn('Already connecting, skipping...');
55
+ return;
56
+ }
57
+ if (this.isDestroyed) {
58
+ throw new ConnectionError('Client has been destroyed, cannot initialize');
59
+ }
60
+ this._state = 'connecting';
61
+ this.reconnectAttempts = 0;
62
+ try {
63
+ await this.connect();
64
+ }
65
+ catch (error) {
66
+ this._state = 'error';
67
+ this.logger.error(`Failed to initialize: ${error}`);
68
+ throw error;
69
+ }
70
+ }
71
+ async connect() {
72
+ return new Promise((resolve, reject) => {
73
+ try {
74
+ this.logger.info(`Connecting to ${this.wsUrl}...`);
75
+ this.ws = new WebSocket(this.wsUrl);
76
+ this.connectionTimer = setTimeout(() => {
77
+ this.logger.error(`Connection timeout (${this.connectionTimeout}ms)`);
78
+ this.handleConnectionTimeout();
79
+ reject(new ConnectionError('Connection timeout'));
80
+ }, this.connectionTimeout);
81
+ this.ws.on('open', () => {
82
+ this.handleOpen();
83
+ resolve();
84
+ });
85
+ this.ws.on('message', (data) => {
86
+ this.handleMessage(data);
87
+ });
88
+ this.ws.on('close', (code, reason) => {
89
+ this.handleClose(code, reason.toString());
90
+ });
91
+ this.ws.on('error', (error) => {
92
+ this.handleError(error);
93
+ reject(error);
94
+ });
95
+ this.ws.on('pong', () => {
96
+ this.handlePong();
97
+ });
98
+ }
99
+ catch (error) {
100
+ this.logger.error(`Connection error: ${error}`);
101
+ reject(error);
102
+ }
103
+ });
104
+ }
105
+ handleOpen() {
106
+ this.logger.info('WebSocket connected');
107
+ if (this.connectionTimer) {
108
+ clearTimeout(this.connectionTimer);
109
+ this.connectionTimer = null;
110
+ }
111
+ if (this.authToken) {
112
+ this.sendAuthMessage();
113
+ }
114
+ else {
115
+ this._state = 'connected';
116
+ this.reconnectAttempts = 0;
117
+ this.startHeartbeat();
118
+ this.flushMessageQueue();
119
+ }
120
+ }
121
+ sendAuthMessage() {
122
+ const authMsg = {
123
+ type: 'auth',
124
+ payload: {
125
+ token: this.authToken,
126
+ uuid: this.uuid,
127
+ },
128
+ };
129
+ try {
130
+ this.ws?.send(JSON.stringify(authMsg));
131
+ this.logger.info('Auth message sent');
132
+ }
133
+ catch (error) {
134
+ this.logger.error(`Failed to send auth message: ${error}`);
135
+ this._state = 'error';
136
+ }
137
+ }
138
+ handleMessage(data) {
139
+ try {
140
+ const message = JSON.parse(data.toString());
141
+ if (message.type === 'auth_response') {
142
+ this.handleAuthResponse(message);
143
+ return;
144
+ }
145
+ if (message.type === 'pong') {
146
+ this.handlePong();
147
+ return;
148
+ }
149
+ if (message.type === 'conflict') {
150
+ this.handleConflict(message);
151
+ return;
152
+ }
153
+ this.messageHandlers.forEach(handler => {
154
+ try {
155
+ handler(message);
156
+ }
157
+ catch (error) {
158
+ this.logger.error(`Error in message handler: ${error}`);
159
+ }
160
+ });
161
+ }
162
+ catch (error) {
163
+ this.logger.error(`Failed to parse message: ${error}`);
164
+ }
165
+ }
166
+ handleAuthResponse(message) {
167
+ if (message.success) {
168
+ this.logger.info('Authentication successful');
169
+ this._state = 'connected';
170
+ this.reconnectAttempts = 0;
171
+ this.startHeartbeat();
172
+ this.flushMessageQueue();
173
+ }
174
+ else {
175
+ this.logger.error('Authentication failed');
176
+ this._state = 'error';
177
+ this.ws?.close(1008, 'Authentication failed');
178
+ }
179
+ }
180
+ handleConflict(message) {
181
+ this.logger.error(`UUID conflict detected: ${message.reason || 'duplicate UUID'}`);
182
+ this._state = 'conflict';
183
+ this.stopHeartbeat();
184
+ this.messageHandlers.forEach(handler => {
185
+ try {
186
+ handler({
187
+ type: 'SYSTEM_CONFLICT',
188
+ payload: {
189
+ uuid: this.uuid,
190
+ message: message.reason || 'UUID conflict detected',
191
+ },
192
+ });
193
+ }
194
+ catch (error) {
195
+ this.logger.error(`Error in conflict handler: ${error}`);
196
+ }
197
+ });
198
+ }
199
+ handleClose(code, reason) {
200
+ this.logger.warn(`WebSocket closed: code=${code}, reason=${reason}`);
201
+ this.stopHeartbeat();
202
+ if (this._state === 'conflict' || this.isDestroyed) {
203
+ this.logger.info('Skipping reconnection (conflict or destroyed)');
204
+ return;
205
+ }
206
+ this._state = 'disconnected';
207
+ this.scheduleReconnect('CONNECTION_CLOSED');
208
+ }
209
+ handleError(error) {
210
+ this.logger.error(`WebSocket error: ${error.message}`);
211
+ this._state = 'error';
212
+ }
213
+ handleConnectionTimeout() {
214
+ if (this.ws && this.ws.readyState !== WebSocket.OPEN) {
215
+ this.logger.error('Connection timeout, forcing close');
216
+ this.ws.close(1000, 'Connection timeout');
217
+ this._state = 'error';
218
+ this.scheduleReconnect('CONNECTION_TIMEOUT');
219
+ }
220
+ }
221
+ scheduleReconnect(reason) {
222
+ if (this.isDestroyed || this._state === 'conflict') {
223
+ this.logger.info('Skipping reconnection');
224
+ return;
225
+ }
226
+ if (this.reconnectAttempts >= this.reconnectMaxAttempts) {
227
+ this.logger.error(`Max reconnection attempts (${this.reconnectMaxAttempts}) reached`);
228
+ return;
229
+ }
230
+ this.reconnectAttempts++;
231
+ const delay = this.calculateReconnectDelay();
232
+ this.logger.info(`Scheduling reconnect attempt ${this.reconnectAttempts}/${this.reconnectMaxAttempts} in ${delay}ms (reason: ${reason})`);
233
+ this.reconnectTimer = setTimeout(async () => {
234
+ if (this.isDestroyed || this._state === 'conflict') {
235
+ return;
236
+ }
237
+ try {
238
+ this.logger.info(`Reconnecting (attempt ${this.reconnectAttempts})...`);
239
+ this._state = 'connecting';
240
+ await this.connect();
241
+ this._state = 'connected';
242
+ this.reconnectAttempts = 0;
243
+ this.logger.info('Reconnected successfully');
244
+ }
245
+ catch (error) {
246
+ this.logger.error(`Reconnect attempt ${this.reconnectAttempts} failed: ${error}`);
247
+ if (this.reconnectAttempts < this.reconnectMaxAttempts) {
248
+ this.scheduleReconnect('RECONNECT_FAILED');
249
+ }
250
+ }
251
+ }, delay);
252
+ }
253
+ calculateReconnectDelay() {
254
+ const jitter = Math.random() * 1000;
255
+ const baseDelay = Math.min(this.reconnectBaseDelay * Math.pow(2, this.reconnectAttempts - 1), this.reconnectMaxDelay);
256
+ return baseDelay + jitter;
257
+ }
258
+ startHeartbeat() {
259
+ this.stopHeartbeat();
260
+ this.heartbeatTimer = setInterval(() => {
261
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
262
+ try {
263
+ this.ws.ping();
264
+ if (this.pongTimer) {
265
+ clearTimeout(this.pongTimer);
266
+ }
267
+ this.pongTimer = setTimeout(() => {
268
+ this.logger.error('Pong timeout, reconnecting...');
269
+ this.ws?.close(1000, 'Pong timeout');
270
+ }, this.pongTimeout);
271
+ }
272
+ catch (error) {
273
+ this.logger.error(`Failed to send ping: ${error}`);
274
+ }
275
+ }
276
+ }, this.heartbeatInterval);
277
+ }
278
+ stopHeartbeat() {
279
+ if (this.heartbeatTimer) {
280
+ clearInterval(this.heartbeatTimer);
281
+ this.heartbeatTimer = null;
282
+ }
283
+ if (this.pongTimer) {
284
+ clearTimeout(this.pongTimer);
285
+ this.pongTimer = null;
286
+ }
287
+ }
288
+ handlePong() {
289
+ this.lastPongTime = Date.now();
290
+ if (this.pongTimer) {
291
+ clearTimeout(this.pongTimer);
292
+ this.pongTimer = null;
293
+ }
294
+ }
295
+ flushMessageQueue() {
296
+ if (this.messageQueue.length > 0 && this.ws?.readyState === WebSocket.OPEN) {
297
+ this.logger.info(`Flushing ${this.messageQueue.length} queued messages`);
298
+ while (this.messageQueue.length > 0) {
299
+ const message = this.messageQueue.shift();
300
+ if (message) {
301
+ try {
302
+ this.ws?.send(JSON.stringify(message));
303
+ }
304
+ catch (error) {
305
+ this.logger.error(`Failed to send queued message: ${error}`);
306
+ this.messageQueue.unshift(message);
307
+ break;
308
+ }
309
+ }
310
+ }
311
+ }
312
+ }
313
+ async sendTextMessage(toUserId, text) {
314
+ if (!this.getIsReady()) {
315
+ throw new MessageError('Client not ready for sending messages');
316
+ }
317
+ const messageId = `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
318
+ const message = {
319
+ type: 'text',
320
+ from: this.uuid,
321
+ to: toUserId,
322
+ text,
323
+ messageId,
324
+ timestamp: Date.now(),
325
+ };
326
+ return this.sendMessage(message);
327
+ }
328
+ async sendImageMessage(toUserId, imageFile) {
329
+ if (!this.getIsReady()) {
330
+ throw new MessageError('Client not ready');
331
+ }
332
+ const messageId = `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
333
+ const reader = new FileReader();
334
+ const base64 = await new Promise((resolve, reject) => {
335
+ reader.onload = () => resolve(reader.result);
336
+ reader.onerror = reject;
337
+ reader.readAsDataURL(imageFile);
338
+ });
339
+ const message = {
340
+ type: 'image',
341
+ from: this.uuid,
342
+ to: toUserId,
343
+ payload: {
344
+ base64,
345
+ filename: imageFile.name,
346
+ size: imageFile.size,
347
+ },
348
+ messageId,
349
+ timestamp: Date.now(),
350
+ };
351
+ return this.sendMessage(message);
352
+ }
353
+ async sendFileMessage(toUserId, file) {
354
+ if (!this.getIsReady()) {
355
+ throw new MessageError('Client not ready');
356
+ }
357
+ const messageId = `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
358
+ const reader = new FileReader();
359
+ const base64 = await new Promise((resolve, reject) => {
360
+ reader.onload = () => resolve(reader.result);
361
+ reader.onerror = reject;
362
+ reader.readAsDataURL(file);
363
+ });
364
+ const message = {
365
+ type: 'file',
366
+ from: this.uuid,
367
+ to: toUserId,
368
+ payload: {
369
+ base64,
370
+ filename: file.name,
371
+ size: file.size,
372
+ },
373
+ messageId,
374
+ timestamp: Date.now(),
375
+ };
376
+ return this.sendMessage(message);
377
+ }
378
+ sendMessage(message) {
379
+ return new Promise((resolve, reject) => {
380
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
381
+ if (this.messageQueue.length >= this.messageQueueMaxSize) {
382
+ this.messageQueue.shift();
383
+ this.logger.warn('Message queue full, dropping oldest message');
384
+ }
385
+ this.messageQueue.push(message);
386
+ this.logger.info('Message queued (not connected)');
387
+ resolve(message.messageId);
388
+ return;
389
+ }
390
+ try {
391
+ this.ws.send(JSON.stringify(message), (error) => {
392
+ if (error) {
393
+ this.logger.error(`Failed to send message: ${error}`);
394
+ if (this.messageQueue.length < this.messageQueueMaxSize) {
395
+ this.messageQueue.push(message);
396
+ }
397
+ reject(new MessageError(`Failed to send message: ${error.message}`, error));
398
+ }
399
+ else {
400
+ resolve(message.messageId);
401
+ }
402
+ });
403
+ }
404
+ catch (error) {
405
+ this.logger.error(`Send error: ${error}`);
406
+ reject(new MessageError(`Send error: ${error}`, error));
407
+ }
408
+ });
409
+ }
410
+ onMessage(handler) {
411
+ this.messageHandlers.push(handler);
412
+ }
413
+ offMessage(handler) {
414
+ const index = this.messageHandlers.indexOf(handler);
415
+ if (index > -1) {
416
+ this.messageHandlers.splice(index, 1);
417
+ }
418
+ }
419
+ async destroy() {
420
+ this.isDestroyed = true;
421
+ if (this.reconnectTimer) {
422
+ clearTimeout(this.reconnectTimer);
423
+ this.reconnectTimer = null;
424
+ }
425
+ if (this.connectionTimer) {
426
+ clearTimeout(this.connectionTimer);
427
+ this.connectionTimer = null;
428
+ }
429
+ this.stopHeartbeat();
430
+ if (this.ws) {
431
+ try {
432
+ if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {
433
+ this.ws.close(1000, 'Client destroyed');
434
+ }
435
+ }
436
+ catch (error) {
437
+ this.logger.error(`Error closing WebSocket: ${error}`);
438
+ }
439
+ this.ws.removeAllListeners();
440
+ this.ws = null;
441
+ }
442
+ this.messageHandlers = [];
443
+ this.messageQueue = [];
444
+ this._state = 'idle';
445
+ this.logger.info('Client destroyed');
446
+ }
447
+ isUserSignExpired() {
448
+ return false;
449
+ }
450
+ async refreshUserSign() {
451
+ this.logger.info('refreshUserSign called (no-op for WebSocket)');
452
+ }
453
+ }
454
+ //# sourceMappingURL=ws-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../src/ws-client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAG3B,OAAO,EACL,eAAe,EACf,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,8BAA8B,EAC9B,4BAA4B,EAC5B,2BAA2B,EAC3B,8BAA8B,EAC9B,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAiB/B,MAAM,OAAO,eAAe;IAClB,EAAE,GAAqB,IAAI,CAAC;IAC5B,MAAM,GAAgB,MAAM,CAAC;IAC7B,eAAe,GAAkC,EAAE,CAAC;IACpD,MAAM,CAAS;IACf,IAAI,CAAS;IACb,KAAK,CAAS;IACd,SAAS,CAAU;IACnB,WAAW,GAAG,KAAK,CAAC;IAEpB,iBAAiB,CAAS;IAC1B,iBAAiB,CAAS;IAC1B,oBAAoB,CAAS;IAC7B,kBAAkB,CAAS;IAC3B,iBAAiB,CAAS;IAC1B,mBAAmB,CAAS;IAC5B,WAAW,CAAS;IAEpB,iBAAiB,GAAG,CAAC,CAAC;IACtB,cAAc,GAAyC,IAAI,CAAC;IAC5D,eAAe,GAAyC,IAAI,CAAC;IAC7D,cAAc,GAA0C,IAAI,CAAC;IAC7D,SAAS,GAAyC,IAAI,CAAC;IAEvD,YAAY,GAA0B,EAAE,CAAC;IACzC,YAAY,GAAG,CAAC,CAAC;IAEzB,YAAY,OAA+B,EAAE,MAAc;QACzD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,0BAA0B,CAAC;QACjF,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,0BAA0B,CAAC;QACjF,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,IAAI,8BAA8B,CAAC;QAC3F,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,4BAA4B,CAAC;QACrF,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,2BAA2B,CAAC;QAClF,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,8BAA8B,CAAC;QACzF,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;IACjE,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IAC1D,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC;IACpC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,eAAe,CAAC,8CAA8C,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;YACpD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;gBAEnD,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEpC,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC,GAAG,EAAE;oBACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,iBAAiB,KAAK,CAAC,CAAC;oBACtE,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAC/B,MAAM,CAAC,IAAI,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBACpD,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAE3B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;oBACtB,IAAI,CAAC,UAAU,EAAE,CAAC;oBAClB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAoB,EAAE,EAAE;oBAC7C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE;oBACnD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5C,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;oBACnC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;oBACxB,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;oBACtB,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;gBAChD,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAExC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACnC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;YAC1B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,MAAM,OAAO,GAAwB;YACnC,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE;gBACP,KAAK,EAAE,IAAI,CAAC,SAAS;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;SACF,CAAC;QAEF,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,IAAoB;QACxC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE5C,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACrC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACjC,OAAO;YACT,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC5B,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAChC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBAC7B,OAAO;YACT,CAAC;YAED,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBACrC,IAAI,CAAC;oBACH,OAAO,CAAC,OAAO,CAAC,CAAC;gBACnB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,OAAY;QACrC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;YAC1B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;YACtB,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,OAAY;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;QACzB,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACrC,IAAI,CAAC;gBACH,OAAO,CAAC;oBACN,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE;wBACP,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,OAAO,EAAE,OAAO,CAAC,MAAM,IAAI,wBAAwB;qBACpD;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,IAAY,EAAE,MAAc;QAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,IAAI,YAAY,MAAM,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC;QAC7B,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC;IAEO,WAAW,CAAC,KAAY;QAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;IACxB,CAAC;IAEO,uBAAuB;QAC7B,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;YACtB,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,MAAc;QACtC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,IAAI,CAAC,oBAAoB,WAAW,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE7C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,oBAAoB,OAAO,KAAK,eAAe,MAAM,GAAG,CAAC,CAAC;QAE1I,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YAC1C,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,iBAAiB,MAAM,CAAC,CAAC;gBACxE,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;gBAC3B,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;gBACrB,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;gBAC1B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,CAAC,iBAAiB,YAAY,KAAK,EAAE,CAAC,CAAC;gBAClF,IAAI,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBACvD,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;IAEO,uBAAuB;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,EACjE,IAAI,CAAC,iBAAiB,CACvB,CAAC;QACF,OAAO,SAAS,GAAG,MAAM,CAAC;IAC5B,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACrD,IAAI,CAAC;oBACH,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;oBAEf,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC/B,CAAC;oBAED,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;wBAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;wBACnD,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;oBACvC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBACvB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC7B,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE/B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC3E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,MAAM,kBAAkB,CAAC,CAAC;YAEzE,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;gBAC1C,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC;wBACH,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;oBACzC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;wBAC7D,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBACnC,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,IAAY;QAClD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,MAAM,IAAI,YAAY,CAAC,uCAAuC,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACpF,MAAM,OAAO,GAAwB;YACnC,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,QAAQ;YACZ,IAAI;YACJ,SAAS;YACT,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAgB,EAAE,SAAe;QACtD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,MAAM,IAAI,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAEpF,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3D,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAgB,CAAC,CAAC;YACvD,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;YACxB,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAwB;YACnC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,QAAQ;YACZ,OAAO,EAAE;gBACP,MAAM;gBACN,QAAQ,EAAE,SAAS,CAAC,IAAI;gBACxB,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB;YACD,SAAS;YACT,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,IAAU;QAChD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACvB,MAAM,IAAI,YAAY,CAAC,kBAAkB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAEpF,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3D,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAgB,CAAC,CAAC;YACvD,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;YACxB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAwB;YACnC,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,QAAQ;YACZ,OAAO,EAAE;gBACP,MAAM;gBACN,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB;YACD,SAAS;YACT,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAEO,WAAW,CAAC,OAA4B;QAC9C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACtD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBACzD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;oBAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAClE,CAAC;gBAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBACnD,OAAO,CAAC,OAAO,CAAC,SAAU,CAAC,CAAC;gBAC5B,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC9C,IAAI,KAAK,EAAE,CAAC;wBACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;wBAEtD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;4BACxD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBAClC,CAAC;wBAED,MAAM,CAAC,IAAI,YAAY,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;oBAC9E,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,OAAO,CAAC,SAAU,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC;gBAC1C,MAAM,CAAC,IAAI,YAAY,CAAC,eAAe,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,OAA+B;QACvC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,UAAU,CAAC,OAA+B;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACnC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;oBACzF,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC;YAC7B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;QAED,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACvC,CAAC;IAED,iBAAiB;QACf,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACnE,CAAC;CACF"}
@@ -0,0 +1,79 @@
1
+ {
2
+ "id": "openclaw-plugin-caryscloud-im",
3
+ "name": "CarysCloud IM Channel",
4
+ "version": "1.0.0",
5
+ "description": "CarysCloud IM channel integration for OpenClaw",
6
+ "author": "YaoWang",
7
+ "license": "MIT",
8
+ "channels": ["caryscloud-im"],
9
+ "configSchema": {
10
+ "type": "object",
11
+ "additionalProperties": false,
12
+ "properties": {
13
+ "accounts": {
14
+ "type": "object",
15
+ "additionalProperties": {
16
+ "type": "object",
17
+ "properties": {
18
+ "uuid": {
19
+ "type": "string",
20
+ "description": "本地 OpenClaw 设备的唯一标识(可选,留空则自动从 OpenClaw deviceId 生成)"
21
+ },
22
+ "targetUserId": {
23
+ "type": "string",
24
+ "description": "对方的用户 ID,用于发送消息"
25
+ },
26
+ "wsUrl": {
27
+ "type": "string",
28
+ "description": "WebSocket 服务器地址 (wss://...)"
29
+ },
30
+ "name": {
31
+ "type": "string",
32
+ "description": "显示名称(可选,默认为 openclaw_${uuid})"
33
+ },
34
+ "avatarUrl": {
35
+ "type": "string",
36
+ "description": "头像 URL(可选)"
37
+ },
38
+ "authToken": {
39
+ "type": "string",
40
+ "description": "认证令牌(可选)"
41
+ },
42
+ "enabled": {
43
+ "type": "boolean",
44
+ "default": true
45
+ }
46
+ },
47
+ "required": ["targetUserId", "wsUrl"]
48
+ }
49
+ }
50
+ },
51
+ "required": []
52
+ },
53
+ "uiHints": {
54
+ "accounts.*.uuid": {
55
+ "label": "本地设备 UUID",
56
+ "help": "本地 OpenClaw 设备的唯一标识(可选,留空则自动生成)"
57
+ },
58
+ "accounts.*.targetUserId": {
59
+ "label": "目标用户 ID",
60
+ "help": "对方的用户 ID,用于发送消息"
61
+ },
62
+ "accounts.*.wsUrl": {
63
+ "label": "WebSocket 服务器地址",
64
+ "help": "WebSocket 服务器地址 (wss://...)"
65
+ },
66
+ "accounts.*.name": {
67
+ "label": "显示名称",
68
+ "help": "显示名称(可选,默认为 openclaw_${uuid})"
69
+ },
70
+ "accounts.*.avatarUrl": {
71
+ "label": "头像 URL",
72
+ "help": "头像地址(可选)"
73
+ },
74
+ "accounts.*.authToken": {
75
+ "label": "认证令牌",
76
+ "help": "用于 WebSocket 连接认证的令牌(可选)"
77
+ }
78
+ }
79
+ }
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@ywfe/openclaw-plugin-caryscloud-im",
3
+ "version": "0.0.1",
4
+ "description": "CarysCloud IM channel plugin for OpenClaw",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "openclaw": {
15
+ "extensions": [
16
+ "./dist/index.js"
17
+ ]
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "openclaw.plugin.json",
22
+ "README.md",
23
+ "INTEGRATION.md"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsc",
27
+ "dev": "tsc --watch",
28
+ "prepublishOnly": "pnpm build"
29
+ },
30
+ "keywords": [
31
+ "openclaw",
32
+ "plugin",
33
+ "caryscloud-im",
34
+ "channel"
35
+ ],
36
+ "author": "YaoWang FE Team",
37
+ "license": "MIT",
38
+ "devDependencies": {
39
+ "typescript": "^5.0.0",
40
+ "@types/node": "^20.0.0",
41
+ "@types/ws": "^8.5.10"
42
+ },
43
+ "dependencies": {
44
+ "ws": "^8.16.0",
45
+ "zod": "^3.22.4"
46
+ }
47
+ }