claude-telegram-mirror 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +331 -0
  2. package/dist/bot/commands.d.ts +41 -0
  3. package/dist/bot/commands.d.ts.map +1 -0
  4. package/dist/bot/commands.js +231 -0
  5. package/dist/bot/commands.js.map +1 -0
  6. package/dist/bot/formatting.d.ts +62 -0
  7. package/dist/bot/formatting.d.ts.map +1 -0
  8. package/dist/bot/formatting.js +295 -0
  9. package/dist/bot/formatting.js.map +1 -0
  10. package/dist/bot/telegram.d.ts +93 -0
  11. package/dist/bot/telegram.d.ts.map +1 -0
  12. package/dist/bot/telegram.js +378 -0
  13. package/dist/bot/telegram.js.map +1 -0
  14. package/dist/bot/types.d.ts +28 -0
  15. package/dist/bot/types.d.ts.map +1 -0
  16. package/dist/bot/types.js +5 -0
  17. package/dist/bot/types.js.map +1 -0
  18. package/dist/bridge/daemon.d.ts +93 -0
  19. package/dist/bridge/daemon.d.ts.map +1 -0
  20. package/dist/bridge/daemon.js +626 -0
  21. package/dist/bridge/daemon.js.map +1 -0
  22. package/dist/bridge/index.d.ts +10 -0
  23. package/dist/bridge/index.d.ts.map +1 -0
  24. package/dist/bridge/index.js +9 -0
  25. package/dist/bridge/index.js.map +1 -0
  26. package/dist/bridge/injector.d.ts +97 -0
  27. package/dist/bridge/injector.d.ts.map +1 -0
  28. package/dist/bridge/injector.js +289 -0
  29. package/dist/bridge/injector.js.map +1 -0
  30. package/dist/bridge/session.d.ts +108 -0
  31. package/dist/bridge/session.d.ts.map +1 -0
  32. package/dist/bridge/session.js +381 -0
  33. package/dist/bridge/session.js.map +1 -0
  34. package/dist/bridge/socket.d.ts +97 -0
  35. package/dist/bridge/socket.d.ts.map +1 -0
  36. package/dist/bridge/socket.js +436 -0
  37. package/dist/bridge/socket.js.map +1 -0
  38. package/dist/bridge/types.d.ts +38 -0
  39. package/dist/bridge/types.d.ts.map +1 -0
  40. package/dist/bridge/types.js +5 -0
  41. package/dist/bridge/types.js.map +1 -0
  42. package/dist/cli.d.ts +7 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +332 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/hooks/handler.d.ts +94 -0
  47. package/dist/hooks/handler.d.ts.map +1 -0
  48. package/dist/hooks/handler.js +431 -0
  49. package/dist/hooks/handler.js.map +1 -0
  50. package/dist/hooks/index.d.ts +8 -0
  51. package/dist/hooks/index.d.ts.map +1 -0
  52. package/dist/hooks/index.js +7 -0
  53. package/dist/hooks/index.js.map +1 -0
  54. package/dist/hooks/installer.d.ts +46 -0
  55. package/dist/hooks/installer.d.ts.map +1 -0
  56. package/dist/hooks/installer.js +317 -0
  57. package/dist/hooks/installer.js.map +1 -0
  58. package/dist/hooks/types.d.ts +88 -0
  59. package/dist/hooks/types.d.ts.map +1 -0
  60. package/dist/hooks/types.js +6 -0
  61. package/dist/hooks/types.js.map +1 -0
  62. package/dist/index.d.ts +19 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +20 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/service/doctor.d.ts +10 -0
  67. package/dist/service/doctor.d.ts.map +1 -0
  68. package/dist/service/doctor.js +424 -0
  69. package/dist/service/doctor.js.map +1 -0
  70. package/dist/service/manager.d.ts +48 -0
  71. package/dist/service/manager.d.ts.map +1 -0
  72. package/dist/service/manager.js +584 -0
  73. package/dist/service/manager.js.map +1 -0
  74. package/dist/service/setup.d.ts +10 -0
  75. package/dist/service/setup.d.ts.map +1 -0
  76. package/dist/service/setup.js +266 -0
  77. package/dist/service/setup.js.map +1 -0
  78. package/dist/utils/chunker.d.ts +24 -0
  79. package/dist/utils/chunker.d.ts.map +1 -0
  80. package/dist/utils/chunker.js +123 -0
  81. package/dist/utils/chunker.js.map +1 -0
  82. package/dist/utils/config.d.ts +48 -0
  83. package/dist/utils/config.d.ts.map +1 -0
  84. package/dist/utils/config.js +154 -0
  85. package/dist/utils/config.js.map +1 -0
  86. package/dist/utils/logger.d.ts +7 -0
  87. package/dist/utils/logger.d.ts.map +1 -0
  88. package/dist/utils/logger.js +28 -0
  89. package/dist/utils/logger.js.map +1 -0
  90. package/package.json +88 -0
  91. package/postinstall.cjs +76 -0
  92. package/scripts/claude-wrapper.sh +122 -0
  93. package/scripts/doctor.sh +433 -0
  94. package/scripts/get-chat-id.sh +64 -0
  95. package/scripts/global-hooks.sh +39 -0
  96. package/scripts/install.sh +831 -0
  97. package/scripts/start-daemon.sh +49 -0
  98. package/scripts/telegram-hook.sh +449 -0
  99. package/scripts/uninstall.sh +261 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/bot/formatting.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYrD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,OAAO,EACf,OAAO,GAAE,OAAc,GACtB,MAAM,CA8BR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAGzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CASpG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ7E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,OAAO,GACd,MAAM,CAUR;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAoBnC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAa,GACvB,MAAM,EAAE,CAQV;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1E;AAmBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CA0GtE"}
@@ -0,0 +1,295 @@
1
+ /**
2
+ * Message Formatting Utilities
3
+ * Formats Claude Code output for Telegram display
4
+ */
5
+ import { chunkMessage, needsChunking } from '../utils/chunker.js';
6
+ // ANSI escape code pattern
7
+ const ANSI_REGEX = /\x1b\[[0-9;]*[a-zA-Z]/g;
8
+ // MarkdownV2 special characters that need escaping
9
+ const MARKDOWN_V2_SPECIAL = /([_*\[\]()~`>#+\-=|{}.!\\])/g;
10
+ /**
11
+ * Strip ANSI escape codes from text
12
+ */
13
+ export function stripAnsi(text) {
14
+ return text.replace(ANSI_REGEX, '');
15
+ }
16
+ /**
17
+ * Escape special characters for MarkdownV2
18
+ * Note: Don't escape inside code blocks
19
+ */
20
+ export function escapeMarkdownV2(text) {
21
+ // Split by code blocks to avoid escaping inside them
22
+ const parts = text.split(/(```[\s\S]*?```|`[^`]+`)/g);
23
+ return parts.map((part, index) => {
24
+ // Odd indices are code blocks, don't escape them
25
+ if (index % 2 === 1) {
26
+ return part;
27
+ }
28
+ // Escape special characters in regular text
29
+ return part.replace(MARKDOWN_V2_SPECIAL, '\\$1');
30
+ }).join('');
31
+ }
32
+ /**
33
+ * Format agent response for Telegram
34
+ */
35
+ export function formatAgentResponse(content) {
36
+ const cleaned = stripAnsi(content);
37
+ return `🤖 *Claude:*\n\n${cleaned}`;
38
+ }
39
+ /**
40
+ * Format tool execution for Telegram
41
+ */
42
+ export function formatToolExecution(tool, input, output, verbose = true) {
43
+ let message = `🔧 *Tool: ${tool}*\n`;
44
+ if (verbose && input) {
45
+ const inputStr = typeof input === 'string'
46
+ ? input
47
+ : JSON.stringify(input, null, 2);
48
+ // Truncate long inputs
49
+ const truncatedInput = inputStr.length > 500
50
+ ? inputStr.slice(0, 500) + '...'
51
+ : inputStr;
52
+ message += `\n📥 Input:\n\`\`\`\n${truncatedInput}\n\`\`\`\n`;
53
+ }
54
+ if (output) {
55
+ const outputStr = typeof output === 'string'
56
+ ? output
57
+ : JSON.stringify(output, null, 2);
58
+ // Truncate long outputs
59
+ const truncatedOutput = outputStr.length > 1000
60
+ ? outputStr.slice(0, 1000) + '\n... (truncated)'
61
+ : outputStr;
62
+ message += `\n📤 Output:\n\`\`\`\n${stripAnsi(truncatedOutput)}\n\`\`\``;
63
+ }
64
+ return message;
65
+ }
66
+ /**
67
+ * Format approval request for Telegram
68
+ */
69
+ export function formatApprovalRequest(prompt) {
70
+ return `⚠️ *Approval Required*\n\n${stripAnsi(prompt)}\n\nPlease respond:`;
71
+ }
72
+ /**
73
+ * Format error message for Telegram
74
+ */
75
+ export function formatError(error) {
76
+ const message = error instanceof Error ? error.message : error;
77
+ return `❌ *Error:*\n\n\`\`\`\n${stripAnsi(message)}\n\`\`\``;
78
+ }
79
+ /**
80
+ * Format session start notification
81
+ */
82
+ export function formatSessionStart(sessionId, projectDir, hostname) {
83
+ let message = `🚀 *Session Started*\n\nSession ID: \`${sessionId}\``;
84
+ if (hostname) {
85
+ message += `\nHost: \`${hostname}\``;
86
+ }
87
+ if (projectDir) {
88
+ message += `\nProject: \`${projectDir}\``;
89
+ }
90
+ return message;
91
+ }
92
+ /**
93
+ * Format session end notification
94
+ */
95
+ export function formatSessionEnd(sessionId, duration) {
96
+ let message = `👋 *Session Ended*\n\nSession ID: \`${sessionId}\``;
97
+ if (duration) {
98
+ const minutes = Math.floor(duration / 60000);
99
+ const seconds = Math.floor((duration % 60000) / 1000);
100
+ message += `\nDuration: ${minutes}m ${seconds}s`;
101
+ }
102
+ return message;
103
+ }
104
+ /**
105
+ * Format status message
106
+ */
107
+ export function formatStatus(isActive, sessionId, muted) {
108
+ if (!isActive) {
109
+ return '📊 *Status*\n\nNo active session attached.';
110
+ }
111
+ let message = `📊 *Status*\n\n`;
112
+ message += `Session: \`${sessionId}\`\n`;
113
+ message += `Notifications: ${muted ? '🔇 Muted' : '🔔 Active'}`;
114
+ return message;
115
+ }
116
+ /**
117
+ * Format help message
118
+ */
119
+ export function formatHelp() {
120
+ return `📚 *Claude Code Mirror - Commands*
121
+
122
+ /status - Show current session status
123
+ /sessions - List active sessions
124
+ /attach <id> - Attach to a session
125
+ /detach - Detach from current session
126
+ /mute - Mute notifications
127
+ /unmute - Resume notifications
128
+ /abort - Abort current session
129
+ /help - Show this message
130
+
131
+ *Inline Responses:*
132
+ Simply reply with text to send input to the attached session.
133
+
134
+ *Approval Buttons:*
135
+ When Claude requests permission, tap:
136
+ ✅ Approve - Allow the action
137
+ ❌ Reject - Deny the action
138
+ 🛑 Abort - End the session`;
139
+ }
140
+ /**
141
+ * Format a message and chunk if necessary
142
+ */
143
+ export function formatAndChunk(content, maxLength = 4000) {
144
+ const cleaned = stripAnsi(content);
145
+ if (needsChunking(cleaned, maxLength)) {
146
+ return chunkMessage(cleaned, { maxLength, preserveCodeBlocks: true });
147
+ }
148
+ return [cleaned];
149
+ }
150
+ /**
151
+ * Detect code language from content (best effort)
152
+ */
153
+ export function detectLanguage(content) {
154
+ const patterns = [
155
+ [/^#!\/usr\/bin\/env node|^import .* from ['"]|^const .* = require\(/, 'javascript'],
156
+ [/^#!\/usr\/bin\/env python|^import |^from .* import |^def /, 'python'],
157
+ [/^package |^import ".*"|^func /, 'go'],
158
+ [/^use |^fn |^let mut |^impl /, 'rust'],
159
+ [/^#include |^int main\(|^void /, 'cpp'],
160
+ [/^\$ |^#.*bash|^#!/, 'bash'],
161
+ [/^\{[\s\S]*\}$|^\[[\s\S]*\]$/, 'json'],
162
+ [/^<\?xml|^<!DOCTYPE|^<html/, 'xml'],
163
+ ];
164
+ for (const [pattern, lang] of patterns) {
165
+ if (pattern.test(content.trim())) {
166
+ return lang;
167
+ }
168
+ }
169
+ return '';
170
+ }
171
+ /**
172
+ * Wrap content in code block with language detection
173
+ */
174
+ export function wrapInCodeBlock(content, language) {
175
+ const lang = language || detectLanguage(content);
176
+ return `\`\`\`${lang}\n${content}\n\`\`\``;
177
+ }
178
+ /**
179
+ * Truncate text with ellipsis, respecting a max length
180
+ */
181
+ function truncate(text, maxLen) {
182
+ if (text.length <= maxLen)
183
+ return text;
184
+ return text.slice(0, maxLen - 3) + '...';
185
+ }
186
+ /**
187
+ * Get short filename from path
188
+ */
189
+ function shortPath(path) {
190
+ const parts = path.split('/');
191
+ if (parts.length <= 2)
192
+ return path;
193
+ return '.../' + parts.slice(-2).join('/');
194
+ }
195
+ /**
196
+ * Format tool details for mobile-friendly Telegram display
197
+ */
198
+ export function formatToolDetails(tool, input) {
199
+ const data = input;
200
+ switch (tool) {
201
+ case 'Edit': {
202
+ const file = shortPath(String(data.file_path || ''));
203
+ const oldStr = String(data.old_string || '');
204
+ const newStr = String(data.new_string || '');
205
+ let msg = `✏️ *Edit*\n📄 \`${file}\`\n\n`;
206
+ // Show diff-style view
207
+ if (oldStr) {
208
+ msg += `➖ *Remove:*\n\`\`\`\n${truncate(oldStr, 800)}\n\`\`\`\n\n`;
209
+ }
210
+ if (newStr) {
211
+ msg += `➕ *Add:*\n\`\`\`\n${truncate(newStr, 800)}\n\`\`\``;
212
+ }
213
+ return msg;
214
+ }
215
+ case 'Write': {
216
+ const file = shortPath(String(data.file_path || ''));
217
+ const content = String(data.content || '');
218
+ const lines = content.split('\n').length;
219
+ let msg = `📝 *Write*\n📄 \`${file}\`\n📏 ${lines} lines\n\n`;
220
+ msg += `\`\`\`\n${truncate(content, 1500)}\n\`\`\``;
221
+ return msg;
222
+ }
223
+ case 'Read': {
224
+ const file = shortPath(String(data.file_path || ''));
225
+ let msg = `👁 *Read*\n📄 \`${file}\``;
226
+ if (data.offset)
227
+ msg += `\n📍 Line ${data.offset}`;
228
+ if (data.limit)
229
+ msg += ` (+${data.limit} lines)`;
230
+ return msg;
231
+ }
232
+ case 'Bash': {
233
+ const cmd = String(data.command || '');
234
+ let msg = `💻 *Bash*\n\n\`\`\`bash\n${truncate(cmd, 1500)}\n\`\`\``;
235
+ if (data.timeout)
236
+ msg += `\n⏱ Timeout: ${data.timeout}ms`;
237
+ return msg;
238
+ }
239
+ case 'Grep': {
240
+ const pattern = String(data.pattern || '');
241
+ const path = data.path ? shortPath(String(data.path)) : 'cwd';
242
+ let msg = `🔍 *Grep*\n🎯 Pattern: \`${truncate(pattern, 100)}\`\n📂 Path: \`${path}\``;
243
+ if (data.glob)
244
+ msg += `\n📋 Glob: \`${data.glob}\``;
245
+ return msg;
246
+ }
247
+ case 'Glob': {
248
+ const pattern = String(data.pattern || '');
249
+ const path = data.path ? shortPath(String(data.path)) : 'cwd';
250
+ return `📂 *Glob*\n🎯 Pattern: \`${pattern}\`\n📂 Path: \`${path}\``;
251
+ }
252
+ case 'Task': {
253
+ const desc = String(data.description || '');
254
+ const prompt = String(data.prompt || '');
255
+ let msg = `🤖 *Task*\n📋 ${desc}`;
256
+ if (prompt) {
257
+ msg += `\n\n\`\`\`\n${truncate(prompt, 1000)}\n\`\`\``;
258
+ }
259
+ return msg;
260
+ }
261
+ case 'WebFetch': {
262
+ const url = String(data.url || '');
263
+ const prompt = String(data.prompt || '');
264
+ return `🌐 *WebFetch*\n🔗 \`${truncate(url, 100)}\`\n📝 ${truncate(prompt, 200)}`;
265
+ }
266
+ case 'WebSearch': {
267
+ const query = String(data.query || '');
268
+ return `🔎 *WebSearch*\n📝 "${query}"`;
269
+ }
270
+ case 'TodoWrite': {
271
+ const todos = data.todos;
272
+ if (!todos || !Array.isArray(todos))
273
+ return `📋 *TodoWrite*`;
274
+ let msg = `📋 *TodoWrite* (${todos.length} items)\n\n`;
275
+ const statusEmoji = {
276
+ 'pending': '⬜',
277
+ 'in_progress': '🔄',
278
+ 'completed': '✅'
279
+ };
280
+ for (const todo of todos.slice(0, 10)) {
281
+ const emoji = statusEmoji[todo.status] || '⬜';
282
+ msg += `${emoji} ${truncate(todo.content, 60)}\n`;
283
+ }
284
+ if (todos.length > 10)
285
+ msg += `... +${todos.length - 10} more`;
286
+ return msg;
287
+ }
288
+ default: {
289
+ // Generic JSON fallback but nicely formatted
290
+ const jsonStr = JSON.stringify(input, null, 2);
291
+ return `🔧 *${tool}*\n\n\`\`\`json\n${truncate(jsonStr, 2000)}\n\`\`\``;
292
+ }
293
+ }
294
+ }
295
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/bot/formatting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Telegram Bot Implementation
3
+ * Core bot using grammY with rate limiting and message queue
4
+ */
5
+ import { Bot, Context, SessionFlavor } from 'grammy';
6
+ import { TelegramMirrorConfig } from '../utils/config.js';
7
+ import type { SendOptions, InlineButton } from './types.js';
8
+ interface SessionData {
9
+ attachedSessionId: string | null;
10
+ muted: boolean;
11
+ lastActivity: number;
12
+ }
13
+ type BotContext = Context & SessionFlavor<SessionData>;
14
+ /**
15
+ * Telegram Bot Class
16
+ */
17
+ export declare class TelegramBot {
18
+ private bot;
19
+ private config;
20
+ private messageQueue;
21
+ private running;
22
+ private messageHandlers;
23
+ private callbackHandlers;
24
+ constructor(config?: TelegramMirrorConfig);
25
+ /**
26
+ * Setup middleware
27
+ */
28
+ private setupMiddleware;
29
+ /**
30
+ * Setup error handling
31
+ */
32
+ private setupErrorHandling;
33
+ /**
34
+ * Setup message queue handler
35
+ */
36
+ private setupMessageQueueHandler;
37
+ /**
38
+ * Start the bot
39
+ */
40
+ start(): Promise<void>;
41
+ /**
42
+ * Stop the bot
43
+ */
44
+ stop(): Promise<void>;
45
+ /**
46
+ * Send a message (queued with rate limiting)
47
+ */
48
+ sendMessage(text: string, options?: SendOptions, threadId?: number): Promise<void>;
49
+ /**
50
+ * Send message with inline buttons
51
+ */
52
+ sendWithButtons(text: string, buttons: InlineButton[], options?: SendOptions, threadId?: number): Promise<void>;
53
+ private static readonly TOPIC_COLORS;
54
+ /**
55
+ * Create a forum topic for a session
56
+ * Returns the thread ID if successful, null if not supported
57
+ */
58
+ createForumTopic(name: string, colorIndex?: number): Promise<number | null>;
59
+ /**
60
+ * Close a forum topic
61
+ */
62
+ closeForumTopic(threadId: number): Promise<boolean>;
63
+ /**
64
+ * Register text message handler
65
+ */
66
+ onMessage(handler: (text: string, chatId: number, threadId?: number) => void): void;
67
+ /**
68
+ * Register callback query handler
69
+ */
70
+ onCallback(handler: (data: string, chatId: number) => void): void;
71
+ /**
72
+ * Get the underlying grammY bot instance
73
+ */
74
+ getBot(): Bot<BotContext>;
75
+ /**
76
+ * Check if bot is running
77
+ */
78
+ isRunning(): boolean;
79
+ /**
80
+ * Get session data for a chat
81
+ */
82
+ getSession(_chatId: number): SessionData | null;
83
+ /**
84
+ * Update message (for editing after button press)
85
+ */
86
+ editMessage(messageId: number, text: string, options?: SendOptions): Promise<void>;
87
+ /**
88
+ * Remove inline keyboard from message
89
+ */
90
+ removeKeyboard(messageId: number): Promise<void>;
91
+ }
92
+ export default TelegramBot;
93
+ //# sourceMappingURL=telegram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/bot/telegram.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,OAAO,EAAW,aAAa,EAA0B,MAAM,QAAQ,CAAC;AAEtF,OAAO,EAAc,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAGtE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAoB,MAAM,YAAY,CAAC;AAG9E,UAAU,WAAW;IACnB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,UAAU,GAAG,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;AAiEvD;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAwE;IAC/F,OAAO,CAAC,gBAAgB,CAAqD;gBAEjE,MAAM,CAAC,EAAE,oBAAoB;IAUzC;;OAEG;IACH,OAAO,CAAC,eAAe;IA6BvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAiEhC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxF;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAOzB;IAEX;;;OAGG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,GAAE,MAAU,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAuBpF;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWzD;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAkBnF;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAkBjE;;OAEG;IACH,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC;IAIzB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAK/C;;OAEG;IACG,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC;IAehB;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAWvD;AAED,eAAe,WAAW,CAAC"}