@qwen-code/channel-telegram 0.21.0-preview.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.
@@ -0,0 +1,34 @@
1
+ import { ChannelBase } from '@qwen-code/channel-base';
2
+ import type { ChannelAgentBridge, ChannelBaseOptions, ChannelConfig, ChannelTaskLifecycleEvent, Envelope, SessionTarget } from '@qwen-code/channel-base';
3
+ export declare class TelegramChannel extends ChannelBase {
4
+ private bot;
5
+ private botId;
6
+ private botUsername;
7
+ private hasConnectedOnce;
8
+ private signalHandlersRegistered;
9
+ private readonly inboundRoute;
10
+ constructor(name: string, config: ChannelConfig, bridge: ChannelAgentBridge, options?: ChannelBaseOptions);
11
+ supportsProactiveSend(): boolean;
12
+ protected supportsProactiveTarget(target: SessionTarget): boolean;
13
+ private createBot;
14
+ private getFileUrl;
15
+ connect(): Promise<void>;
16
+ private registerBotCommands;
17
+ /** Per-chat typing interval — repeats every 4s since Telegram expires it after 5s. */
18
+ private typingIntervals;
19
+ private activeTypingSessions;
20
+ private sendTyping;
21
+ private startTyping;
22
+ private stopTyping;
23
+ protected onTaskLifecycle(event: ChannelTaskLifecycleEvent): void;
24
+ protected onPromptStart(chatId: string, sessionId?: string): void;
25
+ protected onPromptEnd(chatId: string, sessionId?: string): void;
26
+ onSessionDied(sessionId: string): void;
27
+ handleInbound(envelope: Envelope): Promise<void>;
28
+ sendMessage(chatId: string, text: string): Promise<void>;
29
+ protected sendResponseMessage(chatId: string, text: string, sessionId: string): Promise<void>;
30
+ protected pushProactive(target: SessionTarget, text: string): Promise<void>;
31
+ private sendTelegramMessage;
32
+ disconnect(): void;
33
+ private buildEnvelope;
34
+ }
@@ -0,0 +1,356 @@
1
+ import { mkdirSync, writeFileSync } from 'node:fs';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { AsyncLocalStorage } from 'node:async_hooks';
4
+ import { basename, join } from 'node:path';
5
+ import { tmpdir } from 'node:os';
6
+ import { Bot } from 'grammy';
7
+ import { HttpsProxyAgent } from 'https-proxy-agent';
8
+ import { telegramFormat, splitHtmlForTelegram, } from 'telegram-markdown-formatter';
9
+ import { ChannelBase, isTerminalTaskLifecycleType, } from '@qwen-code/channel-base';
10
+ const TELEGRAM_BOT_COMMANDS = [
11
+ { command: 'start', description: 'Show quick-start help' },
12
+ { command: 'help', description: 'Show available commands' },
13
+ { command: 'new', description: 'Start a fresh conversation' },
14
+ { command: 'cancel', description: 'Cancel the running request' },
15
+ { command: 'status', description: 'Show session info' },
16
+ ];
17
+ const TELEGRAM_START_MESSAGE = [
18
+ 'Qwen Code Telegram bot',
19
+ '',
20
+ 'Send any message to chat with Qwen Code.',
21
+ 'Use /new to start a fresh conversation.',
22
+ 'Use /cancel to stop a running request.',
23
+ 'Use /help to see available commands.',
24
+ ].join('\n');
25
+ export class TelegramChannel extends ChannelBase {
26
+ bot;
27
+ botId = 0;
28
+ botUsername = '';
29
+ hasConnectedOnce = false;
30
+ signalHandlersRegistered = false;
31
+ inboundRoute = new AsyncLocalStorage();
32
+ constructor(name, config, bridge, options) {
33
+ super(name, config, bridge, options);
34
+ this.bot = this.createBot();
35
+ this.registerCommand('start', async (envelope) => {
36
+ await this.sendMessage(envelope.chatId, TELEGRAM_START_MESSAGE);
37
+ return true;
38
+ });
39
+ this.registerCancelCommand();
40
+ }
41
+ supportsProactiveSend() {
42
+ return true;
43
+ }
44
+ supportsProactiveTarget(target) {
45
+ return target.threadId === undefined || /^\d+$/u.test(target.threadId);
46
+ }
47
+ createBot() {
48
+ const botConfig = this.proxy
49
+ ? {
50
+ client: {
51
+ baseFetchConfig: { agent: new HttpsProxyAgent(this.proxy) },
52
+ },
53
+ }
54
+ : undefined;
55
+ return new Bot(this.config.token, botConfig);
56
+ }
57
+ getFileUrl(filePath) {
58
+ return `https://api.telegram.org/file/bot${this.bot.token}/${filePath}`;
59
+ }
60
+ async connect() {
61
+ if (this.hasConnectedOnce) {
62
+ this.bot = this.createBot();
63
+ }
64
+ this.hasConnectedOnce = true;
65
+ const botInfo = await this.bot.api.getMe();
66
+ this.botId = botInfo.id;
67
+ this.botUsername = botInfo.username ?? '';
68
+ await this.registerBotCommands();
69
+ // All messages (including slash commands) go through handleInbound
70
+ // where ChannelBase dispatches shared commands (/help, /clear, /status, etc.)
71
+ this.bot.on('message:text', async (ctx) => {
72
+ const msg = ctx.message;
73
+ const text = msg.text;
74
+ const envelope = this.buildEnvelope(msg, text, msg.entities);
75
+ // Don't await — long prompts would block the update loop
76
+ this.handleInbound(envelope).catch((err) => {
77
+ process.stderr.write(`[Telegram:${this.name}] Error handling message: ${err}\n`);
78
+ ctx
79
+ .reply('Sorry, something went wrong processing your message.')
80
+ .catch(() => { });
81
+ });
82
+ });
83
+ // Photo messages
84
+ this.bot.on('message:photo', async (ctx) => {
85
+ const msg = ctx.message;
86
+ const envelope = this.buildEnvelope(msg, msg.caption || '(image)', msg.caption_entities);
87
+ // Pick the largest photo size (last in array)
88
+ const photo = msg.photo[msg.photo.length - 1];
89
+ if (!photo)
90
+ return;
91
+ try {
92
+ const file = await ctx.api.getFile(photo.file_id);
93
+ const fileUrl = this.getFileUrl(file.file_path);
94
+ const resp = await fetch(fileUrl);
95
+ if (!resp.ok)
96
+ throw new Error(`HTTP ${resp.status}`);
97
+ const buf = Buffer.from(await resp.arrayBuffer());
98
+ envelope.imageBase64 = buf.toString('base64');
99
+ envelope.imageMimeType = 'image/jpeg'; // Telegram always converts photos to JPEG
100
+ }
101
+ catch (err) {
102
+ process.stderr.write(`[Telegram:${this.name}] Failed to download photo: ${err instanceof Error ? err.message : err}\n`);
103
+ }
104
+ this.handleInbound(envelope).catch((err) => {
105
+ process.stderr.write(`[Telegram:${this.name}] Error handling message: ${err}\n`);
106
+ ctx
107
+ .reply('Sorry, something went wrong processing your message.')
108
+ .catch(() => { });
109
+ });
110
+ });
111
+ // Document/file messages
112
+ this.bot.on('message:document', async (ctx) => {
113
+ const msg = ctx.message;
114
+ const doc = msg.document;
115
+ const fileName = doc.file_name || `file_${Date.now()}`;
116
+ const envelope = this.buildEnvelope(msg, msg.caption || `(file: ${fileName})`, msg.caption_entities);
117
+ try {
118
+ const file = await ctx.api.getFile(doc.file_id);
119
+ const fileUrl = this.getFileUrl(file.file_path);
120
+ const resp = await fetch(fileUrl);
121
+ if (!resp.ok)
122
+ throw new Error(`HTTP ${resp.status}`);
123
+ const buf = Buffer.from(await resp.arrayBuffer());
124
+ // Save to temp dir so the agent can read it via read-file tool
125
+ const dir = join(tmpdir(), 'channel-files', randomUUID());
126
+ mkdirSync(dir, { recursive: true });
127
+ const filePath = join(dir, basename(fileName) || `file_${Date.now()}`);
128
+ writeFileSync(filePath, buf);
129
+ envelope.text = msg.caption || '';
130
+ envelope.attachments = [
131
+ {
132
+ type: 'file',
133
+ filePath,
134
+ mimeType: doc.mime_type || 'application/octet-stream',
135
+ fileName,
136
+ },
137
+ ];
138
+ }
139
+ catch (err) {
140
+ process.stderr.write(`[Telegram:${this.name}] Failed to download document: ${err instanceof Error ? err.message : err}\n`);
141
+ envelope.text =
142
+ (msg.caption || '') +
143
+ `\n\n(User sent a file "${fileName}" but download failed)`;
144
+ }
145
+ this.handleInbound(envelope).catch((err) => {
146
+ process.stderr.write(`[Telegram:${this.name}] Error handling message: ${err}\n`);
147
+ ctx
148
+ .reply('Sorry, something went wrong processing your message.')
149
+ .catch(() => { });
150
+ });
151
+ });
152
+ // Voice messages
153
+ this.bot.on('message:voice', async (ctx) => {
154
+ const msg = ctx.message;
155
+ const voice = msg.voice;
156
+ const fileName = `voice_${Date.now()}.ogg`;
157
+ const envelope = this.buildEnvelope(msg, msg.caption || '(voice message)', msg.caption_entities);
158
+ try {
159
+ const file = await ctx.api.getFile(voice.file_id);
160
+ const fileUrl = this.getFileUrl(file.file_path);
161
+ const resp = await fetch(fileUrl);
162
+ if (!resp.ok)
163
+ throw new Error(`HTTP ${resp.status}`);
164
+ const buf = Buffer.from(await resp.arrayBuffer());
165
+ // Save to temp dir so the agent can read it via read-file tool
166
+ const dir = join(tmpdir(), 'channel-files', randomUUID());
167
+ mkdirSync(dir, { recursive: true });
168
+ const filePath = join(dir, fileName);
169
+ writeFileSync(filePath, buf);
170
+ envelope.text = msg.caption || '';
171
+ envelope.attachments = [
172
+ {
173
+ type: 'audio',
174
+ filePath,
175
+ mimeType: voice.mime_type || 'audio/ogg',
176
+ fileName,
177
+ },
178
+ ];
179
+ }
180
+ catch (err) {
181
+ process.stderr.write(`[Telegram:${this.name}] Failed to download voice message: ${err instanceof Error ? err.message : err}\n`);
182
+ envelope.text =
183
+ (msg.caption || '') +
184
+ `\n\n(User sent a voice message but download failed)`;
185
+ }
186
+ this.handleInbound(envelope).catch((err) => {
187
+ process.stderr.write(`[Telegram:${this.name}] Error handling message: ${err}\n`);
188
+ ctx
189
+ .reply('Sorry, something went wrong processing your message.')
190
+ .catch(() => { });
191
+ });
192
+ });
193
+ this.bot.start({ drop_pending_updates: true }).catch((err) => {
194
+ process.stderr.write(`[Telegram:${this.name}] Bot launch error: ${err}\n`);
195
+ });
196
+ if (!this.signalHandlersRegistered) {
197
+ process.once('SIGINT', () => this.bot.stop());
198
+ process.once('SIGTERM', () => this.bot.stop());
199
+ this.signalHandlersRegistered = true;
200
+ }
201
+ }
202
+ async registerBotCommands() {
203
+ try {
204
+ await this.bot.api.setMyCommands(TELEGRAM_BOT_COMMANDS);
205
+ }
206
+ catch (err) {
207
+ process.stderr.write(`[Telegram:${this.name}] Failed to register bot commands: ${err instanceof Error ? err.message : err}\n`);
208
+ }
209
+ }
210
+ /** Per-chat typing interval — repeats every 4s since Telegram expires it after 5s. */
211
+ typingIntervals = new Map();
212
+ activeTypingSessions = new Map();
213
+ sendTyping(chatId) {
214
+ try {
215
+ void this.bot.api.sendChatAction(chatId, 'typing').catch(() => { });
216
+ }
217
+ catch {
218
+ // Best-effort typing indicator.
219
+ }
220
+ }
221
+ startTyping(chatId, sessionId = chatId) {
222
+ const sessions = this.activeTypingSessions.get(chatId) ?? new Set();
223
+ sessions.add(sessionId);
224
+ this.activeTypingSessions.set(chatId, sessions);
225
+ if (this.typingIntervals.has(chatId))
226
+ return;
227
+ this.sendTyping(chatId);
228
+ this.typingIntervals.set(chatId, setInterval(() => this.sendTyping(chatId), 4000));
229
+ }
230
+ stopTyping(chatId, sessionId = chatId) {
231
+ const sessions = this.activeTypingSessions.get(chatId);
232
+ if (sessions) {
233
+ sessions.delete(sessionId);
234
+ if (sessions.size > 0)
235
+ return;
236
+ this.activeTypingSessions.delete(chatId);
237
+ }
238
+ const interval = this.typingIntervals.get(chatId);
239
+ if (!interval)
240
+ return;
241
+ clearInterval(interval);
242
+ this.typingIntervals.delete(chatId);
243
+ }
244
+ onTaskLifecycle(event) {
245
+ if (event.type === 'started') {
246
+ this.startTyping(event.chatId, event.sessionId);
247
+ return;
248
+ }
249
+ if (isTerminalTaskLifecycleType(event.type)) {
250
+ this.stopTyping(event.chatId, event.sessionId);
251
+ }
252
+ }
253
+ onPromptStart(chatId, sessionId) {
254
+ this.startTyping(chatId, sessionId);
255
+ }
256
+ onPromptEnd(chatId, sessionId) {
257
+ this.stopTyping(chatId, sessionId);
258
+ }
259
+ onSessionDied(sessionId) {
260
+ for (const [chatId, sessions] of this.activeTypingSessions) {
261
+ if (sessions.has(sessionId)) {
262
+ this.stopTyping(chatId, sessionId);
263
+ }
264
+ }
265
+ super.onSessionDied(sessionId);
266
+ }
267
+ async handleInbound(envelope) {
268
+ const route = envelope.threadId === undefined ? {} : { threadId: envelope.threadId };
269
+ await this.inboundRoute.run(route, () => super.handleInbound(envelope));
270
+ }
271
+ async sendMessage(chatId, text) {
272
+ await this.sendTelegramMessage(chatId, text, this.inboundRoute.getStore()?.threadId);
273
+ }
274
+ async sendResponseMessage(chatId, text, sessionId) {
275
+ const inboundRoute = this.inboundRoute.getStore();
276
+ const target = this.router.getTarget(sessionId);
277
+ const threadId = inboundRoute !== undefined
278
+ ? inboundRoute.threadId
279
+ : target?.channelName === this.name && target.chatId === chatId
280
+ ? target.threadId
281
+ : undefined;
282
+ await this.sendTelegramMessage(chatId, text, threadId);
283
+ }
284
+ async pushProactive(target, text) {
285
+ await this.sendTelegramMessage(target.chatId, text, target.threadId);
286
+ }
287
+ async sendTelegramMessage(chatId, text, threadId) {
288
+ const html = telegramFormat(text);
289
+ const chunks = splitHtmlForTelegram(html);
290
+ const options = threadId === undefined
291
+ ? { parse_mode: 'HTML' }
292
+ : { parse_mode: 'HTML', message_thread_id: Number(threadId) };
293
+ for (const chunk of chunks) {
294
+ try {
295
+ await this.bot.api.sendMessage(chatId, chunk, options);
296
+ }
297
+ catch {
298
+ // Fallback to plain text for the failed chunk only
299
+ await this.bot.api.sendMessage(chatId, chunk.replace(/<[^>]*>/g, ''), threadId === undefined
300
+ ? undefined
301
+ : { message_thread_id: Number(threadId) });
302
+ }
303
+ }
304
+ }
305
+ disconnect() {
306
+ for (const interval of this.typingIntervals.values()) {
307
+ clearInterval(interval);
308
+ }
309
+ this.typingIntervals.clear();
310
+ this.activeTypingSessions.clear();
311
+ this.bot.stop();
312
+ }
313
+ buildEnvelope(msg, text, entities) {
314
+ const isGroup = msg.chat.type === 'group' || msg.chat.type === 'supergroup';
315
+ const isMentioned = entities?.some((e) => {
316
+ if (!this.botUsername)
317
+ return false;
318
+ const value = text.slice(e.offset, e.offset + e.length).toLowerCase();
319
+ const username = this.botUsername.toLowerCase();
320
+ if (e.type === 'mention') {
321
+ return value === `@${username}`;
322
+ }
323
+ if (e.type === 'bot_command') {
324
+ const mentionIndex = value.indexOf('@');
325
+ return (mentionIndex !== -1 && value.slice(mentionIndex + 1) === username);
326
+ }
327
+ return false;
328
+ }) ?? false;
329
+ const isReplyToBot = msg.reply_to_message?.from?.id === this.botId;
330
+ let cleanText = text;
331
+ if (isMentioned && this.botUsername) {
332
+ cleanText = text
333
+ .replace(new RegExp(`@${this.botUsername}`, 'gi'), '')
334
+ .trim();
335
+ }
336
+ // Extract referenced message text (when user replies to a message)
337
+ const referencedText = msg.reply_to_message?.text || undefined;
338
+ return {
339
+ channelName: this.name,
340
+ senderId: String(msg.from.id),
341
+ senderName: msg.from.first_name +
342
+ (msg.from.last_name ? ` ${msg.from.last_name}` : ''),
343
+ chatId: String(msg.chat.id),
344
+ ...(isGroup && msg.chat.title ? { chatName: msg.chat.title } : {}),
345
+ threadId: typeof msg.message_thread_id === 'number'
346
+ ? String(msg.message_thread_id)
347
+ : undefined,
348
+ text: cleanText,
349
+ isGroup,
350
+ isMentioned,
351
+ isReplyToBot,
352
+ referencedText,
353
+ };
354
+ }
355
+ }
356
+ //# sourceMappingURL=TelegramAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramAdapter.js","sourceRoot":"","sources":["../src/TelegramAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,cAAc,EACd,oBAAoB,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,WAAW,EACX,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AAUjC,MAAM,qBAAqB,GAAG;IAC5B,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE;IAC1D,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,yBAAyB,EAAE;IAC3D,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAC7D,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAChE,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;CAC/C,CAAC;AAEX,MAAM,sBAAsB,GAAG;IAC7B,wBAAwB;IACxB,EAAE;IACF,0CAA0C;IAC1C,yCAAyC;IACzC,wCAAwC;IACxC,sCAAsC;CACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,OAAO,eAAgB,SAAQ,WAAW;IACtC,GAAG,CAAM;IACT,KAAK,GAAW,CAAC,CAAC;IAClB,WAAW,GAAW,EAAE,CAAC;IACzB,gBAAgB,GAAG,KAAK,CAAC;IACzB,wBAAwB,GAAG,KAAK,CAAC;IACxB,YAAY,GAAG,IAAI,iBAAiB,EAEjD,CAAC;IAEL,YACE,IAAY,EACZ,MAAqB,EACrB,MAA0B,EAC1B,OAA4B;QAE5B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC/C,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAEQ,qBAAqB;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAEkB,uBAAuB,CAAC,MAAqB;QAC9D,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzE,CAAC;IAEO,SAAS;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK;YAC1B,CAAC,CAAC;gBACE,MAAM,EAAE;oBACN,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;iBAC5D;aACF;YACH,CAAC,CAAC,SAAS,CAAC;QACd,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;IAEO,UAAU,CAAC,QAAgB;QACjC,OAAO,oCAAoC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACjC,mEAAmE;QACnE,8EAA8E;QAC9E,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACxC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC;YACxB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YAE7D,yDAAyD;YACzD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,aAAa,IAAI,CAAC,IAAI,6BAA6B,GAAG,IAAI,CAC3D,CAAC;gBACF,GAAG;qBACA,KAAK,CAAC,sDAAsD,CAAC;qBAC7D,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,iBAAiB;QACjB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACzC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CACjC,GAAG,EACH,GAAG,CAAC,OAAO,IAAI,SAAS,EACxB,GAAG,CAAC,gBAAgB,CACrB,CAAC;YAEF,8CAA8C;YAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC;gBACjD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBACrD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBAClD,QAAQ,CAAC,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAC9C,QAAQ,CAAC,aAAa,GAAG,YAAY,CAAC,CAAC,0CAA0C;YACnF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,aAAa,IAAI,CAAC,IAAI,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAClG,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,aAAa,IAAI,CAAC,IAAI,6BAA6B,GAAG,IAAI,CAC3D,CAAC;gBACF,GAAG;qBACA,KAAK,CAAC,sDAAsD,CAAC;qBAC7D,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,yBAAyB;QACzB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC;YACxB,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC;YACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAEvD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CACjC,GAAG,EACH,GAAG,CAAC,OAAO,IAAI,UAAU,QAAQ,GAAG,EACpC,GAAG,CAAC,gBAAgB,CACrB,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAChD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC;gBACjD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBACrD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBAElD,+DAA+D;gBAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC1D,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACvE,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAE7B,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;gBAClC,QAAQ,CAAC,WAAW,GAAG;oBACrB;wBACE,IAAI,EAAE,MAAM;wBACZ,QAAQ;wBACR,QAAQ,EAAE,GAAG,CAAC,SAAS,IAAI,0BAA0B;wBACrD,QAAQ;qBACT;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,aAAa,IAAI,CAAC,IAAI,kCAAkC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CACrG,CAAC;gBACF,QAAQ,CAAC,IAAI;oBACX,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;wBACnB,0BAA0B,QAAQ,wBAAwB,CAAC;YAC/D,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,aAAa,IAAI,CAAC,IAAI,6BAA6B,GAAG,IAAI,CAC3D,CAAC;gBACF,GAAG;qBACA,KAAK,CAAC,sDAAsD,CAAC;qBAC7D,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,iBAAiB;QACjB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACzC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC;YACxB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YACxB,MAAM,QAAQ,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;YAE3C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CACjC,GAAG,EACH,GAAG,CAAC,OAAO,IAAI,iBAAiB,EAChC,GAAG,CAAC,gBAAgB,CACrB,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC;gBACjD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBACrD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBAElD,+DAA+D;gBAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC1D,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACrC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAE7B,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;gBAClC,QAAQ,CAAC,WAAW,GAAG;oBACrB;wBACE,IAAI,EAAE,OAAO;wBACb,QAAQ;wBACR,QAAQ,EAAE,KAAK,CAAC,SAAS,IAAI,WAAW;wBACxC,QAAQ;qBACT;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,aAAa,IAAI,CAAC,IAAI,uCAAuC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAC1G,CAAC;gBACF,QAAQ,CAAC,IAAI;oBACX,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;wBACnB,qDAAqD,CAAC;YAC1D,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,aAAa,IAAI,CAAC,IAAI,6BAA6B,GAAG,IAAI,CAC3D,CAAC;gBACF,GAAG;qBACA,KAAK,CAAC,sDAAsD,CAAC;qBAC7D,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,aAAa,IAAI,CAAC,IAAI,uBAAuB,GAAG,IAAI,CACrD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/C,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QACvC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,aAAa,IAAI,CAAC,IAAI,sCAAsC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CACzG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,sFAAsF;IAC9E,eAAe,GAAG,IAAI,GAAG,EAA0C,CAAC;IACpE,oBAAoB,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEtD,UAAU,CAAC,MAAc;QAC/B,IAAI,CAAC;YACH,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,MAAc,EAAE,SAAS,GAAG,MAAM;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QACpE,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QAC7C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,CAAC,eAAe,CAAC,GAAG,CACtB,MAAM,EACN,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CACjD,CAAC;IACJ,CAAC;IAEO,UAAU,CAAC,MAAc,EAAE,SAAS,GAAG,MAAM;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC;gBAAE,OAAO;YAC9B,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAEkB,eAAe,CAAC,KAAgC;QACjE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QACD,IAAI,2BAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAEkB,aAAa,CAAC,MAAc,EAAE,SAAkB;QACjE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;IAEkB,WAAW,CAAC,MAAc,EAAE,SAAkB;QAC/D,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC;IAEQ,aAAa,CAAC,SAAiB;QACtC,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC3D,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAEQ,KAAK,CAAC,aAAa,CAAC,QAAkB;QAC7C,MAAM,KAAK,GACT,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACzE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,IAAY;QAC5C,MAAM,IAAI,CAAC,mBAAmB,CAC5B,MAAM,EACN,IAAI,EACJ,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,QAAQ,CACvC,CAAC;IACJ,CAAC;IAEkB,KAAK,CAAC,mBAAmB,CAC1C,MAAc,EACd,IAAY,EACZ,SAAiB;QAEjB,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,QAAQ,GACZ,YAAY,KAAK,SAAS;YACxB,CAAC,CAAC,YAAY,CAAC,QAAQ;YACvB,CAAC,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;gBAC7D,CAAC,CAAC,MAAM,CAAC,QAAQ;gBACjB,CAAC,CAAC,SAAS,CAAC;QAClB,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IAEkB,KAAK,CAAC,aAAa,CACpC,MAAqB,EACrB,IAAY;QAEZ,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvE,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,MAAc,EACd,IAAY,EACZ,QAAiB;QAEjB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,OAAO,GACX,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,EAAE,UAAU,EAAE,MAAe,EAAE;YACjC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAe,EAAE,iBAAiB,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,mDAAmD;gBACnD,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAC5B,MAAM,EACN,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,EAC7B,QAAQ,KAAK,SAAS;oBACpB,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,EAAE,iBAAiB,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAC5C,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU;QACR,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;YACrD,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAClB,CAAC;IAEO,aAAa,CACnB,GAKC,EACD,IAAY,EACZ,QAAkE;QAElE,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;QAE5E,MAAM,WAAW,GACf,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACnB,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,OAAO,KAAK,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;YAChD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,KAAK,KAAK,IAAI,QAAQ,EAAE,CAAC;YAClC,CAAC;YACD,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC7B,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACxC,OAAO,CACL,YAAY,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,KAAK,QAAQ,CAClE,CAAC;YACJ,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,IAAI,KAAK,CAAC;QAEd,MAAM,YAAY,GAAG,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC;QAEnE,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,IAAI,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,SAAS,GAAG,IAAI;iBACb,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;iBACrD,IAAI,EAAE,CAAC;QACZ,CAAC;QAED,mEAAmE;QACnE,MAAM,cAAc,GAAG,GAAG,CAAC,gBAAgB,EAAE,IAAI,IAAI,SAAS,CAAC;QAE/D,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,IAAI;YACtB,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,UAAU,EACR,GAAG,CAAC,IAAI,CAAC,UAAU;gBACnB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,QAAQ,EACN,OAAO,GAAG,CAAC,iBAAiB,KAAK,QAAQ;gBACvC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC;gBAC/B,CAAC,CAAC,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO;YACP,WAAW;YACX,YAAY;YACZ,cAAc;SACf,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export { TelegramChannel } from './TelegramAdapter.js';
2
+ import type { ChannelPlugin } from '@qwen-code/channel-base';
3
+ export declare const plugin: ChannelPlugin;
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { TelegramChannel } from './TelegramAdapter.js';
2
+ import { TelegramChannel } from './TelegramAdapter.js';
3
+ export const plugin = {
4
+ channelType: 'telegram',
5
+ displayName: 'Telegram',
6
+ requiredConfigFields: ['token'],
7
+ createChannel: (name, config, bridge, options) => new TelegramChannel(name, config, bridge, options),
8
+ };
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,CAAC,MAAM,MAAM,GAAkB;IACnC,WAAW,EAAE,UAAU;IACvB,WAAW,EAAE,UAAU;IACvB,oBAAoB,EAAE,CAAC,OAAO,CAAC;IAC/B,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAC/C,IAAI,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;CACrD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@qwen-code/channel-telegram",
3
+ "version": "0.21.0-preview.0",
4
+ "description": "Telegram channel adapter for Qwen Code",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc --build",
19
+ "test": "vitest run",
20
+ "test:ci": "vitest run"
21
+ },
22
+ "dependencies": {
23
+ "@qwen-code/channel-base": "^0.21.0",
24
+ "grammy": "^1.41.1",
25
+ "https-proxy-agent": "^7.0.6",
26
+ "telegram-markdown-formatter": "^0.1.2"
27
+ },
28
+ "devDependencies": {
29
+ "typescript": "^5.0.0"
30
+ }
31
+ }