@fonz/tgcc 0.0.1 → 0.2.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,380 @@
1
+ import { Bot, InputFile } from 'grammy';
2
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
3
+ import { join, extname } from 'node:path';
4
+ // ── Slash command definitions ──
5
+ export const COMMANDS = [
6
+ { command: 'start', description: 'Welcome message & register commands' },
7
+ { command: 'new', description: 'Start a fresh session' },
8
+ { command: 'sessions', description: 'List recent sessions' },
9
+ { command: 'resume', description: 'Resume a session by ID' },
10
+ { command: 'session', description: 'Current session info' },
11
+ { command: 'status', description: 'Process state and session info' },
12
+ { command: 'cost', description: 'Show session cost' },
13
+ { command: 'catchup', description: 'Summarize external CC activity' },
14
+ { command: 'cancel', description: 'Abort current CC turn' },
15
+ { command: 'model', description: 'Switch model' },
16
+ { command: 'permissions', description: 'Set permission mode' },
17
+ { command: 'repo', description: 'Manage repos & switch working directory' },
18
+ { command: 'ping', description: 'Quick liveness check' },
19
+ { command: 'help', description: 'List all commands' },
20
+ ];
21
+ // ── Media type detection ──
22
+ function detectImageMediaType(fileName) {
23
+ const ext = extname(fileName).toLowerCase();
24
+ switch (ext) {
25
+ case '.png': return 'image/png';
26
+ case '.gif': return 'image/gif';
27
+ case '.webp': return 'image/webp';
28
+ default: return 'image/jpeg';
29
+ }
30
+ }
31
+ // ── Reply message map (for reply context) ──
32
+ const MESSAGE_MAP_SIZE = 50;
33
+ class ReplyMap {
34
+ entries = [];
35
+ add(messageId, text) {
36
+ this.entries.push({ messageId, text: text.slice(0, 200) });
37
+ if (this.entries.length > MESSAGE_MAP_SIZE) {
38
+ this.entries.shift();
39
+ }
40
+ }
41
+ get(messageId) {
42
+ return this.entries.find(e => e.messageId === messageId)?.text;
43
+ }
44
+ }
45
+ // ── Telegram Agent Bot ──
46
+ export class TelegramBot {
47
+ agentId;
48
+ bot;
49
+ config;
50
+ logger;
51
+ mediaDir;
52
+ onMessage;
53
+ onCommand;
54
+ onCallback;
55
+ replyMaps = new Map(); // per-chat reply maps
56
+ running = false;
57
+ constructor(agentId, config, mediaDir, onMessage, onCommand, logger, onCallback) {
58
+ this.agentId = agentId;
59
+ this.config = config;
60
+ this.mediaDir = mediaDir;
61
+ this.logger = logger.child({ agentId, component: 'telegram' });
62
+ this.onMessage = onMessage;
63
+ this.onCommand = onCommand;
64
+ this.onCallback = onCallback ?? null;
65
+ this.bot = new Bot(config.botToken);
66
+ this.setupHandlers();
67
+ }
68
+ isAllowed(userId) {
69
+ return this.config.allowedUsers.includes(String(userId));
70
+ }
71
+ getReplyMap(chatId) {
72
+ let map = this.replyMaps.get(chatId);
73
+ if (!map) {
74
+ map = new ReplyMap();
75
+ this.replyMaps.set(chatId, map);
76
+ }
77
+ return map;
78
+ }
79
+ trackBotMessage(chatId, messageId, text) {
80
+ this.getReplyMap(chatId).add(messageId, text);
81
+ }
82
+ setupHandlers() {
83
+ // ── Slash commands ──
84
+ for (const { command } of COMMANDS) {
85
+ this.bot.command(command, (ctx) => this.handleCommand(ctx, command));
86
+ }
87
+ // ── Callback queries (inline button presses) ──
88
+ this.bot.on('callback_query:data', (ctx) => this.handleCallbackQuery(ctx));
89
+ // ── Text messages ──
90
+ this.bot.on('message:text', (ctx) => this.handleText(ctx));
91
+ // ── Photos ──
92
+ this.bot.on('message:photo', (ctx) => this.handlePhoto(ctx));
93
+ // ── Documents ──
94
+ this.bot.on('message:document', (ctx) => this.handleDocument(ctx));
95
+ // ── Voice ──
96
+ this.bot.on('message:voice', (ctx) => this.handleVoice(ctx));
97
+ // ── Video ──
98
+ this.bot.on('message:video', (ctx) => this.handleVideo(ctx));
99
+ }
100
+ handleCallbackQuery(ctx) {
101
+ const userId = ctx.from?.id;
102
+ if (!userId || !this.isAllowed(userId))
103
+ return;
104
+ if (!ctx.callbackQuery?.data)
105
+ return;
106
+ if (!this.onCallback)
107
+ return;
108
+ const data = ctx.callbackQuery.data;
109
+ const colonIdx = data.indexOf(':');
110
+ if (colonIdx === -1)
111
+ return;
112
+ const action = data.slice(0, colonIdx);
113
+ const payload = data.slice(colonIdx + 1);
114
+ this.onCallback({
115
+ action,
116
+ data: payload,
117
+ chatId: ctx.chat.id,
118
+ userId: String(userId),
119
+ callbackQueryId: ctx.callbackQuery.id,
120
+ });
121
+ }
122
+ handleCommand(ctx, command) {
123
+ const userId = ctx.from?.id;
124
+ if (!userId || !this.isAllowed(userId))
125
+ return;
126
+ const text = ctx.message?.text ?? '';
127
+ const args = text.replace(`/${command}`, '').trim();
128
+ this.onCommand({
129
+ command,
130
+ args,
131
+ chatId: ctx.chat.id,
132
+ userId: String(userId),
133
+ });
134
+ }
135
+ handleText(ctx) {
136
+ const userId = ctx.from?.id;
137
+ if (!userId || !this.isAllowed(userId))
138
+ return;
139
+ if (!ctx.message?.text)
140
+ return;
141
+ // Skip if it's a command (already handled)
142
+ if (ctx.message.text.startsWith('/'))
143
+ return;
144
+ // Check for reply context
145
+ let replyToText;
146
+ if (ctx.message.reply_to_message?.message_id) {
147
+ replyToText = this.getReplyMap(ctx.chat.id).get(ctx.message.reply_to_message.message_id);
148
+ }
149
+ this.onMessage({
150
+ type: 'text',
151
+ chatId: ctx.chat.id,
152
+ userId: String(userId),
153
+ text: ctx.message.text,
154
+ replyToText,
155
+ });
156
+ }
157
+ async handlePhoto(ctx) {
158
+ const userId = ctx.from?.id;
159
+ if (!userId || !this.isAllowed(userId))
160
+ return;
161
+ try {
162
+ // Get the largest photo
163
+ const photos = ctx.message?.photo;
164
+ if (!photos || photos.length === 0)
165
+ return;
166
+ const largest = photos[photos.length - 1];
167
+ const file = await ctx.api.getFile(largest.file_id);
168
+ const fileUrl = `https://api.telegram.org/file/bot${this.config.botToken}/${file.file_path}`;
169
+ // Download and convert to base64
170
+ const response = await fetch(fileUrl);
171
+ const buffer = Buffer.from(await response.arrayBuffer());
172
+ const base64 = buffer.toString('base64');
173
+ const mediaType = detectImageMediaType(file.file_path ?? 'photo.jpg');
174
+ const caption = ctx.message?.caption ?? 'What do you see in this image?';
175
+ this.onMessage({
176
+ type: 'photo',
177
+ chatId: ctx.chat.id,
178
+ userId: String(userId),
179
+ text: caption,
180
+ imageBase64: base64,
181
+ imageMediaType: mediaType,
182
+ });
183
+ }
184
+ catch (err) {
185
+ this.logger.error({ err }, 'Failed to handle photo');
186
+ }
187
+ }
188
+ async handleDocument(ctx) {
189
+ const userId = ctx.from?.id;
190
+ if (!userId || !this.isAllowed(userId))
191
+ return;
192
+ try {
193
+ const doc = ctx.message?.document;
194
+ if (!doc)
195
+ return;
196
+ const file = await ctx.api.getFile(doc.file_id);
197
+ const fileUrl = `https://api.telegram.org/file/bot${this.config.botToken}/${file.file_path}`;
198
+ // Download to disk
199
+ const response = await fetch(fileUrl);
200
+ const buffer = Buffer.from(await response.arrayBuffer());
201
+ const fileName = doc.file_name ?? `doc_${Date.now()}`;
202
+ const savePath = join(this.mediaDir, fileName);
203
+ if (!existsSync(this.mediaDir))
204
+ mkdirSync(this.mediaDir, { recursive: true });
205
+ writeFileSync(savePath, buffer);
206
+ const caption = ctx.message?.caption ?? '';
207
+ // Check if it's an image — send as image content block
208
+ if (doc.mime_type?.startsWith('image/')) {
209
+ const base64 = buffer.toString('base64');
210
+ const mediaType = detectImageMediaType(fileName);
211
+ this.onMessage({
212
+ type: 'photo',
213
+ chatId: ctx.chat.id,
214
+ userId: String(userId),
215
+ text: caption || 'What do you see in this image?',
216
+ imageBase64: base64,
217
+ imageMediaType: mediaType,
218
+ });
219
+ return;
220
+ }
221
+ this.onMessage({
222
+ type: 'document',
223
+ chatId: ctx.chat.id,
224
+ userId: String(userId),
225
+ text: caption,
226
+ filePath: savePath,
227
+ fileName,
228
+ });
229
+ }
230
+ catch (err) {
231
+ this.logger.error({ err }, 'Failed to handle document');
232
+ }
233
+ }
234
+ async handleVoice(ctx) {
235
+ const userId = ctx.from?.id;
236
+ if (!userId || !this.isAllowed(userId))
237
+ return;
238
+ try {
239
+ const voice = ctx.message?.voice;
240
+ if (!voice)
241
+ return;
242
+ const file = await ctx.api.getFile(voice.file_id);
243
+ const fileUrl = `https://api.telegram.org/file/bot${this.config.botToken}/${file.file_path}`;
244
+ const response = await fetch(fileUrl);
245
+ const buffer = Buffer.from(await response.arrayBuffer());
246
+ const fileName = `voice_${Date.now()}.ogg`;
247
+ const savePath = join(this.mediaDir, fileName);
248
+ if (!existsSync(this.mediaDir))
249
+ mkdirSync(this.mediaDir, { recursive: true });
250
+ writeFileSync(savePath, buffer);
251
+ this.onMessage({
252
+ type: 'voice',
253
+ chatId: ctx.chat.id,
254
+ userId: String(userId),
255
+ text: ctx.message?.caption ?? '',
256
+ filePath: savePath,
257
+ fileName,
258
+ });
259
+ }
260
+ catch (err) {
261
+ this.logger.error({ err }, 'Failed to handle voice');
262
+ }
263
+ }
264
+ async handleVideo(ctx) {
265
+ const userId = ctx.from?.id;
266
+ if (!userId || !this.isAllowed(userId))
267
+ return;
268
+ try {
269
+ const video = ctx.message?.video;
270
+ if (!video)
271
+ return;
272
+ const file = await ctx.api.getFile(video.file_id);
273
+ const fileUrl = `https://api.telegram.org/file/bot${this.config.botToken}/${file.file_path}`;
274
+ const response = await fetch(fileUrl);
275
+ const buffer = Buffer.from(await response.arrayBuffer());
276
+ const fileName = video.file_name ?? `video_${Date.now()}.mp4`;
277
+ const savePath = join(this.mediaDir, fileName);
278
+ if (!existsSync(this.mediaDir))
279
+ mkdirSync(this.mediaDir, { recursive: true });
280
+ writeFileSync(savePath, buffer);
281
+ this.onMessage({
282
+ type: 'video',
283
+ chatId: ctx.chat.id,
284
+ userId: String(userId),
285
+ text: ctx.message?.caption ?? '',
286
+ filePath: savePath,
287
+ fileName,
288
+ });
289
+ }
290
+ catch (err) {
291
+ this.logger.error({ err }, 'Failed to handle video');
292
+ }
293
+ }
294
+ // ── Bot lifecycle ──
295
+ async start() {
296
+ // Register commands with BotFather
297
+ try {
298
+ await this.bot.api.setMyCommands(COMMANDS);
299
+ this.logger.info('Registered slash commands with BotFather');
300
+ }
301
+ catch (err) {
302
+ this.logger.warn({ err }, 'Failed to register commands');
303
+ }
304
+ this.running = true;
305
+ this.bot.start({
306
+ drop_pending_updates: true,
307
+ onStart: (info) => {
308
+ this.logger.info({ username: info.username }, 'Bot started');
309
+ },
310
+ });
311
+ }
312
+ async stop() {
313
+ if (this.running) {
314
+ this.running = false;
315
+ this.bot.stop();
316
+ this.logger.info('Bot stopped');
317
+ }
318
+ }
319
+ // ── Send methods (used by bridge/streaming) ──
320
+ async sendText(chatId, text, parseMode) {
321
+ const msg = await this.bot.api.sendMessage(Number(chatId), text, {
322
+ parse_mode: parseMode,
323
+ });
324
+ this.trackBotMessage(Number(chatId), msg.message_id, text);
325
+ return msg.message_id;
326
+ }
327
+ async sendTextWithKeyboard(chatId, text, keyboard, parseMode) {
328
+ const msg = await this.bot.api.sendMessage(Number(chatId), text, {
329
+ parse_mode: parseMode,
330
+ reply_markup: keyboard,
331
+ });
332
+ this.trackBotMessage(Number(chatId), msg.message_id, text);
333
+ return msg.message_id;
334
+ }
335
+ async answerCallbackQuery(callbackQueryId, text) {
336
+ await this.bot.api.answerCallbackQuery(callbackQueryId, { text });
337
+ }
338
+ async editText(chatId, messageId, text, parseMode) {
339
+ await this.bot.api.editMessageText(Number(chatId), messageId, text, {
340
+ parse_mode: parseMode,
341
+ });
342
+ this.trackBotMessage(Number(chatId), messageId, text);
343
+ }
344
+ async sendFile(chatId, filePath, caption) {
345
+ await this.bot.api.sendDocument(Number(chatId), new InputFile(filePath), {
346
+ caption,
347
+ });
348
+ }
349
+ async sendImage(chatId, filePath, caption) {
350
+ await this.bot.api.sendPhoto(Number(chatId), new InputFile(filePath), {
351
+ caption,
352
+ });
353
+ }
354
+ async sendPhotoBuffer(chatId, buffer, caption) {
355
+ const msg = await this.bot.api.sendPhoto(Number(chatId), new InputFile(buffer, 'image.png'), {
356
+ caption,
357
+ });
358
+ return msg.message_id;
359
+ }
360
+ async sendVoice(chatId, filePath, caption) {
361
+ await this.bot.api.sendVoice(Number(chatId), new InputFile(filePath), {
362
+ caption,
363
+ });
364
+ }
365
+ async replyToMessage(chatId, text, replyToMessageId, parseMode) {
366
+ const msg = await this.bot.api.sendMessage(Number(chatId), text, {
367
+ parse_mode: parseMode,
368
+ reply_parameters: { message_id: replyToMessageId },
369
+ });
370
+ this.trackBotMessage(Number(chatId), msg.message_id, text);
371
+ return msg.message_id;
372
+ }
373
+ async sendTyping(chatId) {
374
+ try {
375
+ await this.bot.api.sendChatAction(Number(chatId), 'typing');
376
+ }
377
+ catch { }
378
+ }
379
+ }
380
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAkB,SAAS,EAAgB,MAAM,QAAQ,CAAC;AACtE,OAAO,EAAgB,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqC1C,kCAAkC;AAElC,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,qCAAqC,EAAE;IACxE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE;IACxD,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC5D,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,wBAAwB,EAAE;IAC5D,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAC3D,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;IACpE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE;IACrD,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,gCAAgC,EAAE;IACrE,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,uBAAuB,EAAE;IAC3D,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE;IACjD,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,qBAAqB,EAAE;IAC9D,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,yCAAyC,EAAE;IAC3E,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE;IACxD,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE;CACtD,CAAC;AAEF,6BAA6B;AAE7B,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC,CAAC,OAAO,WAAW,CAAC;QAChC,KAAK,MAAM,CAAC,CAAC,OAAO,WAAW,CAAC;QAChC,KAAK,OAAO,CAAC,CAAC,OAAO,YAAY,CAAC;QAClC,OAAO,CAAC,CAAC,OAAO,YAAY,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,8CAA8C;AAE9C,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,MAAM,QAAQ;IACJ,OAAO,GAA+C,EAAE,CAAC;IAEjE,GAAG,CAAC,SAAiB,EAAE,IAAY;QACjC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,SAAiB;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,IAAI,CAAC;IACjE,CAAC;CACF;AAED,2BAA2B;AAE3B,MAAM,OAAO,WAAW;IACb,OAAO,CAAS;IAChB,GAAG,CAAM;IACV,MAAM,CAAc;IACpB,MAAM,CAAc;IACpB,QAAQ,CAAS;IACjB,SAAS,CAAiB;IAC1B,SAAS,CAAiB;IAC1B,UAAU,CAAyB;IACnC,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC,CAAC,sBAAsB;IAC/D,OAAO,GAAG,KAAK,CAAC;IAExB,YACE,OAAe,EACf,MAAmB,EACnB,QAAgB,EAChB,SAAyB,EACzB,SAAyB,EACzB,MAAmB,EACnB,UAA4B;QAE5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,CAAC;QAErC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,SAAS,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEO,WAAW,CAAC,MAAc;QAChC,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,eAAe,CAAC,MAAc,EAAE,SAAiB,EAAE,IAAY;QAC7D,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAEO,aAAa;QACnB,uBAAuB;QACvB,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,iDAAiD;QACjD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3E,sBAAsB;QACtB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3D,eAAe;QACf,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAE7D,kBAAkB;QAClB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QAEnE,cAAc;QACd,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAE7D,cAAc;QACd,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,mBAAmB,CAAC,GAAY;QACtC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAAE,OAAO;QAC/C,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI;YAAE,OAAO;QACrC,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAE7B,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,CAAC,CAAC;YAAE,OAAO;QAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAEzC,IAAI,CAAC,UAAU,CAAC;YACd,MAAM;YACN,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE;YACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YACtB,eAAe,EAAE,GAAG,CAAC,aAAa,CAAC,EAAE;SACtC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,GAAY,EAAE,OAAe;QACjD,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAAE,OAAO;QAE/C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAEpD,IAAI,CAAC,SAAS,CAAC;YACb,OAAO;YACP,IAAI;YACJ,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE;YACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;SACvB,CAAC,CAAC;IACL,CAAC;IAEO,UAAU,CAAC,GAAY;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAAE,OAAO;QAC/C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI;YAAE,OAAO;QAE/B,2CAA2C;QAC3C,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO;QAE7C,0BAA0B;QAC1B,IAAI,WAA+B,CAAC;QACpC,IAAI,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,UAAU,EAAE,CAAC;YAC7C,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE;YACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;YACtB,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;YACtB,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,GAAY;QACpC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAAE,OAAO;QAE/C,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;YAClC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAE3C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,oCAAoC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAE7F,iCAAiC;YACjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEzC,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC;YACtE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,gCAAgC,CAAC;YAEzE,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE;gBACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;gBACtB,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,MAAM;gBACnB,cAAc,EAAE,SAAS;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,wBAAwB,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,GAAY;QACvC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAAE,OAAO;QAE/C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC;YAClC,IAAI,CAAC,GAAG;gBAAE,OAAO;YAEjB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,oCAAoC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAE7F,mBAAmB;YACnB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YACzD,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAE/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9E,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAEhC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;YAE3C,uDAAuD;YACvD,IAAI,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACzC,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;gBACjD,IAAI,CAAC,SAAS,CAAC;oBACb,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE;oBACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;oBACtB,IAAI,EAAE,OAAO,IAAI,gCAAgC;oBACjD,WAAW,EAAE,MAAM;oBACnB,cAAc,EAAE,SAAS;iBAC1B,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,UAAU;gBAChB,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE;gBACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;gBACtB,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,QAAQ;gBAClB,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,2BAA2B,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,GAAY;QACpC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAAE,OAAO;QAE/C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;YACjC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,oCAAoC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAE7F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YACzD,MAAM,QAAQ,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAE/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9E,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAEhC,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE;gBACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;gBACtB,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE;gBAChC,QAAQ,EAAE,QAAQ;gBAClB,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,wBAAwB,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,GAAY;QACpC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAAE,OAAO;QAE/C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;YACjC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,oCAAoC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAE7F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,IAAI,SAAS,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;YAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAE/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9E,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAEhC,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE;gBACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;gBACtB,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE;gBAChC,QAAQ,EAAE,QAAQ;gBAClB,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,wBAAwB,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,sBAAsB;IAEtB,KAAK,CAAC,KAAK;QACT,mCAAmC;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,6BAA6B,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YACb,oBAAoB,EAAE,IAAI;YAC1B,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAC;YAC/D,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,gDAAgD;IAEhD,KAAK,CAAC,QAAQ,CAAC,MAAuB,EAAE,IAAY,EAAE,SAAkB;QACtE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE;YAC/D,UAAU,EAAE,SAA2D;SACxE,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC3D,OAAO,GAAG,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,MAAuB,EAAE,IAAY,EAAE,QAAwB,EAAE,SAAkB;QAC5G,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE;YAC/D,UAAU,EAAE,SAA2D;YACvE,YAAY,EAAE,QAAQ;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC3D,OAAO,GAAG,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,eAAuB,EAAE,IAAa;QAC9D,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAuB,EAAE,SAAiB,EAAE,IAAY,EAAE,SAAkB;QACzF,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;YAClE,UAAU,EAAE,SAA2D;SACxE,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAuB,EAAE,QAAgB,EAAE,OAAgB;QACxE,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;YACvE,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAuB,EAAE,QAAgB,EAAE,OAAgB;QACzE,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;YACpE,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAuB,EAAE,MAAc,EAAE,OAAgB;QAC7E,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE;YAC3F,OAAO;SACR,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAuB,EAAE,QAAgB,EAAE,OAAgB;QACzE,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;YACpE,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAuB,EAAE,IAAY,EAAE,gBAAwB,EAAE,SAAkB;QACtG,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE;YAC/D,UAAU,EAAE,SAA2D;YACvE,gBAAgB,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE;SACnD,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC3D,OAAO,GAAG,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAuB;QACtC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;CACF"}
package/package.json CHANGED
@@ -1,7 +1,90 @@
1
1
  {
2
2
  "name": "@fonz/tgcc",
3
- "version": "0.0.1",
4
- "description": "Telegram ↔ Claude Code bridge",
5
- "keywords": ["telegram", "claude", "claude-code"],
6
- "license": "MIT"
3
+ "version": "0.2.0",
4
+ "description": "Telegram ↔ Claude Code CLI bridge",
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
+ "./process": {
14
+ "types": "./dist/cc-process.d.ts",
15
+ "import": "./dist/cc-process.js"
16
+ },
17
+ "./protocol": {
18
+ "types": "./dist/cc-protocol.d.ts",
19
+ "import": "./dist/cc-protocol.js"
20
+ },
21
+ "./session": {
22
+ "types": "./dist/session.d.ts",
23
+ "import": "./dist/session.js"
24
+ },
25
+ "./streaming": {
26
+ "types": "./dist/streaming.d.ts",
27
+ "import": "./dist/streaming.js"
28
+ }
29
+ },
30
+ "typesVersions": {
31
+ "*": {
32
+ "process": [
33
+ "dist/cc-process.d.ts"
34
+ ],
35
+ "protocol": [
36
+ "dist/cc-protocol.d.ts"
37
+ ],
38
+ "session": [
39
+ "dist/session.d.ts"
40
+ ],
41
+ "streaming": [
42
+ "dist/streaming.d.ts"
43
+ ]
44
+ }
45
+ },
46
+ "scripts": {
47
+ "build": "tsc",
48
+ "dev": "tsx src/service.ts",
49
+ "start": "node dist/service.js",
50
+ "test": "vitest run",
51
+ "test:watch": "vitest"
52
+ },
53
+ "pnpm": {
54
+ "onlyBuiltDependencies": [
55
+ "esbuild"
56
+ ]
57
+ },
58
+ "bin": {
59
+ "tgcc": "dist/cli.js"
60
+ },
61
+ "author": "fnz",
62
+ "license": "MIT",
63
+ "keywords": [
64
+ "telegram",
65
+ "claude",
66
+ "claude-code",
67
+ "cli",
68
+ "bridge",
69
+ "ai",
70
+ "anthropic"
71
+ ],
72
+ "repository": {
73
+ "type": "git",
74
+ "url": "https://github.com/fonzio/tgcc"
75
+ },
76
+ "dependencies": {
77
+ "@modelcontextprotocol/sdk": "^1.26.0",
78
+ "grammy": "^1.40.0",
79
+ "pino": "^10.3.1",
80
+ "uuid": "^13.0.0",
81
+ "zod": "^4.3.6"
82
+ },
83
+ "devDependencies": {
84
+ "@types/node": "^25.3.0",
85
+ "@types/uuid": "^11.0.0",
86
+ "tsx": "^4.21.0",
87
+ "typescript": "^5.9.3",
88
+ "vitest": "^4.0.18"
89
+ }
7
90
  }