@will-17173/telegram-cli 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 (82) hide show
  1. package/LICENSE +675 -0
  2. package/README.md +264 -0
  3. package/README.zh-CN.md +264 -0
  4. package/dist/account/account-context.js +22 -0
  5. package/dist/account/account-context.js.map +1 -0
  6. package/dist/account/account-presets.js +22 -0
  7. package/dist/account/account-presets.js.map +1 -0
  8. package/dist/account/account-store.js +225 -0
  9. package/dist/account/account-store.js.map +1 -0
  10. package/dist/cli/app.js +21 -0
  11. package/dist/cli/app.js.map +1 -0
  12. package/dist/cli/output.js +39 -0
  13. package/dist/cli/output.js.map +1 -0
  14. package/dist/commands/account-options.js +55 -0
  15. package/dist/commands/account-options.js.map +1 -0
  16. package/dist/commands/account.js +449 -0
  17. package/dist/commands/account.js.map +1 -0
  18. package/dist/commands/config.js +63 -0
  19. package/dist/commands/config.js.map +1 -0
  20. package/dist/commands/data.js +52 -0
  21. package/dist/commands/data.js.map +1 -0
  22. package/dist/commands/query.js +116 -0
  23. package/dist/commands/query.js.map +1 -0
  24. package/dist/commands/telegram.js +423 -0
  25. package/dist/commands/telegram.js.map +1 -0
  26. package/dist/commands/types.js +12 -0
  27. package/dist/commands/types.js.map +1 -0
  28. package/dist/config/credential-store.js +82 -0
  29. package/dist/config/credential-store.js.map +1 -0
  30. package/dist/config/env.js +78 -0
  31. package/dist/config/env.js.map +1 -0
  32. package/dist/index.js +4 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/presenters/human.js +218 -0
  35. package/dist/presenters/human.js.map +1 -0
  36. package/dist/presenters/ink/DetailView.js +14 -0
  37. package/dist/presenters/ink/DetailView.js.map +1 -0
  38. package/dist/presenters/ink/TableView.js +9 -0
  39. package/dist/presenters/ink/TableView.js.map +1 -0
  40. package/dist/presenters/ink/TimelineView.js +34 -0
  41. package/dist/presenters/ink/TimelineView.js.map +1 -0
  42. package/dist/presenters/ink/display-width.js +149 -0
  43. package/dist/presenters/ink/display-width.js.map +1 -0
  44. package/dist/presenters/ink/image-preview.js +47 -0
  45. package/dist/presenters/ink/image-preview.js.map +1 -0
  46. package/dist/presenters/ink/listen-scroll.js +37 -0
  47. package/dist/presenters/ink/listen-scroll.js.map +1 -0
  48. package/dist/presenters/ink/listen-scrollbar.js +49 -0
  49. package/dist/presenters/ink/listen-scrollbar.js.map +1 -0
  50. package/dist/presenters/ink/listen.js +542 -0
  51. package/dist/presenters/ink/listen.js.map +1 -0
  52. package/dist/presenters/ink/mouse-scroll.js +55 -0
  53. package/dist/presenters/ink/mouse-scroll.js.map +1 -0
  54. package/dist/presenters/ink/render.js +45 -0
  55. package/dist/presenters/ink/render.js.map +1 -0
  56. package/dist/presenters/listen-message.js +267 -0
  57. package/dist/presenters/listen-message.js.map +1 -0
  58. package/dist/presenters/structured.js +30 -0
  59. package/dist/presenters/structured.js.map +1 -0
  60. package/dist/services/attachment-download.js +21 -0
  61. package/dist/services/attachment-download.js.map +1 -0
  62. package/dist/services/data-service.js +76 -0
  63. package/dist/services/data-service.js.map +1 -0
  64. package/dist/services/listen-album-aggregator.js +72 -0
  65. package/dist/services/listen-album-aggregator.js.map +1 -0
  66. package/dist/services/message-service.js +102 -0
  67. package/dist/services/message-service.js.map +1 -0
  68. package/dist/services/query-service.js +116 -0
  69. package/dist/services/query-service.js.map +1 -0
  70. package/dist/services/sync-service.js +134 -0
  71. package/dist/services/sync-service.js.map +1 -0
  72. package/dist/storage/chat-resolver.js +9 -0
  73. package/dist/storage/chat-resolver.js.map +1 -0
  74. package/dist/storage/message-db.js +246 -0
  75. package/dist/storage/message-db.js.map +1 -0
  76. package/dist/telegram/client-factory.js +27 -0
  77. package/dist/telegram/client-factory.js.map +1 -0
  78. package/dist/telegram/mtcute-client.js +324 -0
  79. package/dist/telegram/mtcute-client.js.map +1 -0
  80. package/dist/telegram/types.js +2 -0
  81. package/dist/telegram/types.js.map +1 -0
  82. package/package.json +50 -0
@@ -0,0 +1,116 @@
1
+ import { renderResult } from '../cli/output.js';
2
+ import { MessageDB } from '../storage/message-db.js';
3
+ import { QueryService } from '../services/query-service.js';
4
+ import { outputFormatConflict } from './types.js';
5
+ import { runWithAccountContext } from './account-options.js';
6
+ export function registerQueryCommands(app) {
7
+ app.command('search')
8
+ .description('Search locally stored messages by keyword')
9
+ .argument('<keyword>')
10
+ .option('-c, --chat <chat>')
11
+ .option('-s, --sender <sender>')
12
+ .option('--hours <hours>')
13
+ .option('--regex')
14
+ .option('-n, --limit <limit>', 'Max results', '50')
15
+ .option('--json')
16
+ .option('--yaml')
17
+ .action(async (keyword, options) => {
18
+ await renderQueryResult(options, (service) => service.search({
19
+ keyword,
20
+ chat: options.chat,
21
+ sender: options.sender,
22
+ hours: numberOption(options.hours),
23
+ regex: Boolean(options.regex),
24
+ limit: numberOption(options.limit),
25
+ }));
26
+ });
27
+ app.command('recent')
28
+ .description('Show recently stored messages')
29
+ .option('-c, --chat <chat>')
30
+ .option('-s, --sender <sender>')
31
+ .option('--hours <hours>', 'Only show last N hours', '24')
32
+ .option('-n, --limit <limit>', 'Max messages', '50')
33
+ .option('--json')
34
+ .option('--yaml')
35
+ .action(async (options) => {
36
+ await renderQueryResult(options, (service) => service.recent({
37
+ chat: options.chat,
38
+ sender: options.sender,
39
+ hours: numberOption(options.hours),
40
+ limit: numberOption(options.limit),
41
+ }));
42
+ });
43
+ app.command('stats')
44
+ .description('Show local message and chat statistics')
45
+ .option('--json')
46
+ .option('--yaml')
47
+ .action(async (options) => renderQueryResult(options, (service) => service.stats()));
48
+ app.command('top')
49
+ .description('Show the most active message senders')
50
+ .option('-c, --chat <chat>')
51
+ .option('--hours <hours>')
52
+ .option('-n, --limit <limit>', 'Top N senders', '20')
53
+ .option('--json')
54
+ .option('--yaml')
55
+ .action(async (options) => {
56
+ await renderQueryResult(options, (service) => service.top({
57
+ chat: options.chat,
58
+ hours: numberOption(options.hours),
59
+ limit: numberOption(options.limit),
60
+ }));
61
+ });
62
+ app.command('timeline')
63
+ .description('Show message activity over time')
64
+ .option('-c, --chat <chat>')
65
+ .option('--hours <hours>')
66
+ .option('--by <granularity>', 'day or hour', 'day')
67
+ .option('--json')
68
+ .option('--yaml')
69
+ .action(async (options) => {
70
+ await renderQueryResult(options, (service) => service.timeline({
71
+ chat: options.chat,
72
+ hours: numberOption(options.hours),
73
+ granularity: options.by,
74
+ }));
75
+ });
76
+ app.command('today')
77
+ .description('Show messages stored today')
78
+ .option('-c, --chat <chat>')
79
+ .option('--json')
80
+ .option('--yaml')
81
+ .action(async (options) => renderQueryResult(options, (service) => service.today({ chat: options.chat })));
82
+ app.command('filter')
83
+ .description('Filter locally stored messages by keywords')
84
+ .argument('<keywords>')
85
+ .option('-c, --chat <chat>')
86
+ .option('--hours <hours>')
87
+ .option('--json')
88
+ .option('--yaml')
89
+ .action(async (keywords, options) => {
90
+ await renderQueryResult(options, (service) => service.filter({
91
+ keywords,
92
+ chat: options.chat,
93
+ hours: numberOption(options.hours),
94
+ }));
95
+ });
96
+ }
97
+ function numberOption(value) {
98
+ return value == null ? undefined : Number(value);
99
+ }
100
+ async function renderQueryResult(options, handler) {
101
+ const conflict = outputFormatConflict(options);
102
+ if (conflict) {
103
+ await renderResult(conflict, { yaml: true });
104
+ return;
105
+ }
106
+ await runWithAccountContext(options, (context) => {
107
+ const service = new QueryService(new MessageDB(context.dbPath));
108
+ try {
109
+ return handler(service);
110
+ }
111
+ finally {
112
+ service.close();
113
+ }
114
+ });
115
+ }
116
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,423 @@
1
+ import { MessageDB } from '../storage/message-db.js';
2
+ import { createTelegramClient } from '../telegram/client-factory.js';
3
+ import { MessageService } from '../services/message-service.js';
4
+ import { SyncService } from '../services/sync-service.js';
5
+ import { ListenAlbumAggregator } from '../services/listen-album-aggregator.js';
6
+ import { actionDetail, chatTable, recordDetail, syncSummary, userDetail } from '../presenters/human.js';
7
+ import { formatListenLine } from '../presenters/listen-message.js';
8
+ import { renderInteractiveListen } from '../presenters/ink/listen.js';
9
+ import { runWithAccountContext } from './account-options.js';
10
+ export function registerTelegramCommands(app) {
11
+ app.command('status')
12
+ .description('Show Telegram authentication status')
13
+ .option('--json')
14
+ .option('--yaml')
15
+ .action(async (options) => {
16
+ await renderTelegramResult(options, async (client) => {
17
+ try {
18
+ const user = await client.getCurrentUser();
19
+ return {
20
+ ok: true,
21
+ data: {
22
+ authenticated: true,
23
+ user: normalizeTelegramUser(user),
24
+ },
25
+ human: {
26
+ kind: 'summary',
27
+ title: 'Telegram status',
28
+ fields: [
29
+ { label: 'Authenticated', value: 'Yes', tone: 'success' },
30
+ ...userDetail(normalizeTelegramUser(user)).fields,
31
+ ],
32
+ },
33
+ };
34
+ }
35
+ catch (error) {
36
+ return {
37
+ ok: false,
38
+ error: { code: 'auth_error', message: errorMessage(error) },
39
+ };
40
+ }
41
+ });
42
+ });
43
+ app.command('whoami')
44
+ .description('Show the authenticated Telegram account')
45
+ .option('--json')
46
+ .option('--yaml')
47
+ .action(async (options) => {
48
+ await renderTelegramResult(options, async (client) => {
49
+ try {
50
+ const user = normalizeTelegramUser(await client.getCurrentUser());
51
+ return {
52
+ ok: true,
53
+ data: { user },
54
+ human: userDetail(user),
55
+ };
56
+ }
57
+ catch (error) {
58
+ return {
59
+ ok: false,
60
+ error: { code: 'auth_error', message: errorMessage(error) },
61
+ };
62
+ }
63
+ });
64
+ });
65
+ app.command('chats')
66
+ .description('List available Telegram chats')
67
+ .option('--type <type>')
68
+ .option('--json')
69
+ .option('--yaml')
70
+ .action(async (options) => {
71
+ await renderTelegramResult(options, async (client) => {
72
+ const chats = await client.listChats(options.type);
73
+ return { ok: true, data: chats, human: chatTable(chats) };
74
+ });
75
+ });
76
+ app.command('history')
77
+ .description('Fetch chat history and store it locally')
78
+ .argument('<chat>')
79
+ .option('-n, --limit <limit>', 'Max messages to fetch', '1000')
80
+ .option('--json')
81
+ .option('--yaml')
82
+ .action(async (chat, options) => {
83
+ const limit = Number.parseInt(options.limit ?? '0', 10);
84
+ await renderSyncResult(options, async (service) => service.history({ chat, limit }));
85
+ });
86
+ app.command('sync')
87
+ .description('Sync new messages from a Telegram chat')
88
+ .argument('<chat>')
89
+ .option('-n, --limit <limit>', 'Max messages to fetch', '5000')
90
+ .option('--json')
91
+ .option('--yaml')
92
+ .action(async (chat, options) => {
93
+ const limit = Number.parseInt(options.limit ?? '0', 10);
94
+ await renderSyncResult(options, async (service) => service.sync({ chat, limit }));
95
+ });
96
+ app.command('sync-all')
97
+ .description('Sync messages from all Telegram chats')
98
+ .option('-n, --limit <limit>', 'Max messages per chat', '5000')
99
+ .option('--delay <delay>', 'Seconds between chats', '1')
100
+ .option('--max-chats <maxChats>', 'Maximum chats to sync')
101
+ .option('--json')
102
+ .option('--yaml')
103
+ .action(async (options) => {
104
+ const limit = Number.parseInt(options.limit ?? '0', 10);
105
+ const delay = Number.parseFloat(options.delay ?? '0');
106
+ const maxChats = options.maxChats == null ? undefined : Number.parseInt(options.maxChats, 10);
107
+ await renderSyncResult(options, async (service) => {
108
+ const result = await service.refresh({ limit, delay, maxChats });
109
+ if (!result.ok)
110
+ return result;
111
+ return {
112
+ ok: true,
113
+ data: {
114
+ new_messages: result.data.new_messages,
115
+ chats: result.data.chats,
116
+ results: result.data.results,
117
+ },
118
+ human: syncSummary(result.data),
119
+ };
120
+ });
121
+ });
122
+ app.command('refresh')
123
+ .description('Refresh all chats with new Telegram messages')
124
+ .option('-n, --limit <limit>', 'Max messages per chat', '5000')
125
+ .option('--delay <delay>', 'Seconds between chats', '1')
126
+ .option('--max-chats <maxChats>', 'Maximum chats to sync')
127
+ .option('--json')
128
+ .option('--yaml')
129
+ .action(async (options) => {
130
+ const limit = Number.parseInt(options.limit ?? '0', 10);
131
+ const delay = Number.parseFloat(options.delay ?? '0');
132
+ const maxChats = options.maxChats == null ? undefined : Number.parseInt(options.maxChats, 10);
133
+ await renderSyncResult(options, async (service) => service.refresh({ limit, delay, maxChats }));
134
+ });
135
+ app.command('info')
136
+ .description('Show information about a Telegram chat')
137
+ .argument('<chat>')
138
+ .option('--json')
139
+ .option('--yaml')
140
+ .action(async (chat, options) => {
141
+ await renderTelegramResult(options, async (client) => {
142
+ const info = await client.getChatInfo(parseChat(chat));
143
+ if (!info)
144
+ return { ok: false, error: { code: 'chat_not_found', message: `Chat '${chat}' not found on Telegram.` } };
145
+ return { ok: true, data: info, human: recordDetail('Chat info', info) };
146
+ });
147
+ });
148
+ app.command('send')
149
+ .description('Send a message to a Telegram chat')
150
+ .argument('<chat>')
151
+ .argument('<message>')
152
+ .option('-r, --reply <reply>', 'Message ID to reply to')
153
+ .option('--no-preview')
154
+ .option('--json')
155
+ .option('--yaml')
156
+ .action(async (chat, message, options) => {
157
+ const reply = options.reply == null ? undefined : Number.parseInt(options.reply, 10);
158
+ await renderMessageResult(options, 'Message sent', (service) => service.send({
159
+ chat,
160
+ message,
161
+ reply,
162
+ linkPreview: options.preview,
163
+ }));
164
+ });
165
+ app.command('edit')
166
+ .description('Edit a Telegram message')
167
+ .argument('<chat>')
168
+ .argument('<msgId>')
169
+ .argument('<text>')
170
+ .option('--no-preview')
171
+ .option('--json')
172
+ .option('--yaml')
173
+ .action(async (chat, msgId, text, options) => {
174
+ const msgIdNum = Number.parseInt(msgId, 10);
175
+ await renderMessageResult(options, 'Message edited', (service) => service.edit({
176
+ chat,
177
+ msgId: msgIdNum,
178
+ text,
179
+ linkPreview: options.preview,
180
+ }));
181
+ });
182
+ app.command('delete')
183
+ .description('Delete Telegram messages')
184
+ .argument('<chat>')
185
+ .argument('<msgIds...>')
186
+ .option('--json')
187
+ .option('--yaml')
188
+ .action(async (chat, msgIds, options) => {
189
+ await renderMessageResult(options, 'Messages deleted', (service) => service.delete({
190
+ chat,
191
+ msgIds: msgIds.map((id) => Number.parseInt(id, 10)),
192
+ }));
193
+ });
194
+ app.command('listen')
195
+ .description('Listen for new Telegram messages')
196
+ .argument('[chats...]')
197
+ .option('--persist', 'Reconnect automatically')
198
+ .option('--retry-seconds <seconds>', 'Reconnect delay', '5')
199
+ .option('--send-to <chat>', 'Set default outgoing chat for interactive mode')
200
+ .option('--no-media', 'Hide attachment summary for incoming messages')
201
+ .option('--no-interactive', 'Use plain text listen output')
202
+ .action(async (chats, options) => {
203
+ const persist = Boolean(options.persist);
204
+ const retrySeconds = Number.parseFloat(options.retrySeconds ?? '5');
205
+ const parsedChats = parseChats(chats)?.map(parseChat);
206
+ const showMedia = options.media !== false;
207
+ const useInteractive = options.interactive !== false && process.stdin.isTTY === true && process.stdout.isTTY === true;
208
+ const sendTo = options.sendTo == null ? resolveSingleSendTarget(parsedChats) : parseChat(options.sendTo);
209
+ const seenMessages = new Set();
210
+ const seenMessageOrder = [];
211
+ const controller = new AbortController();
212
+ const stopListening = () => controller.abort();
213
+ const restoreUpdateWarnings = hideBenignUpdateWarnings(process.stdout.write.bind(process.stdout), process.stdout);
214
+ const restoreUpdateErrors = hideBenignUpdateWarnings(process.stderr.write.bind(process.stderr), process.stderr);
215
+ const albumAggregator = new ListenAlbumAggregator({
216
+ emit: (messages) => process.stdout.write(formatListenLine(messages, { showMedia })),
217
+ });
218
+ process.on('SIGINT', stopListening);
219
+ process.on('SIGTERM', stopListening);
220
+ try {
221
+ await runWithAccountContext(options, async (context) => {
222
+ const createClient = () => createTelegramClient(context.sessionPath);
223
+ if (useInteractive) {
224
+ await renderInteractiveListen({
225
+ chats: parsedChats,
226
+ persist,
227
+ retrySeconds,
228
+ sendTo,
229
+ showMedia,
230
+ createClient,
231
+ stopSignal: controller.signal,
232
+ onRequestStop: stopListening,
233
+ });
234
+ return;
235
+ }
236
+ while (true) {
237
+ const client = createClient();
238
+ let retry = false;
239
+ try {
240
+ const result = await client.listen({
241
+ chats: parsedChats,
242
+ signal: controller.signal,
243
+ onMessage: (message) => {
244
+ const key = `${message.chat_id}:${message.msg_id}`;
245
+ if (seenMessages.has(key))
246
+ return;
247
+ seenMessages.add(key);
248
+ seenMessageOrder.push(key);
249
+ if (seenMessages.size > 5000) {
250
+ const oldest = seenMessageOrder.shift();
251
+ if (oldest != null)
252
+ seenMessages.delete(oldest);
253
+ }
254
+ albumAggregator.add(message);
255
+ },
256
+ });
257
+ if (!persist || result === 'stopped')
258
+ break;
259
+ if (result === 'disconnected') {
260
+ retry = true;
261
+ }
262
+ }
263
+ catch (error) {
264
+ if (!persist)
265
+ throw error;
266
+ retry = true;
267
+ }
268
+ finally {
269
+ albumAggregator.flush();
270
+ await client.close().catch(() => undefined);
271
+ }
272
+ if (retry) {
273
+ await sleep(retrySeconds);
274
+ continue;
275
+ }
276
+ break;
277
+ }
278
+ });
279
+ }
280
+ finally {
281
+ process.off('SIGINT', stopListening);
282
+ process.off('SIGTERM', stopListening);
283
+ restoreUpdateWarnings();
284
+ restoreUpdateErrors();
285
+ albumAggregator.dispose();
286
+ }
287
+ process.stdout.write('listening completed\n');
288
+ });
289
+ }
290
+ function parseChats(values) {
291
+ if (!values || values.length === 0)
292
+ return undefined;
293
+ return values;
294
+ }
295
+ function resolveSingleSendTarget(chats) {
296
+ return chats?.length === 1 ? chats[0] : undefined;
297
+ }
298
+ function parseChat(chat) {
299
+ const parsed = Number.parseInt(chat, 10);
300
+ return Number.isNaN(parsed) || String(parsed) !== chat.trim() ? chat : parsed;
301
+ }
302
+ async function renderSyncResult(options, handler) {
303
+ await renderTelegramResult(options, async (client, context) => {
304
+ const result = await runWithSync(client, context.dbPath, handler);
305
+ return result.ok && result.human == null
306
+ ? { ...result, human: syncSummary(result.data) }
307
+ : result;
308
+ });
309
+ }
310
+ async function runWithSync(client, dbPath, handler) {
311
+ const service = new SyncService(client, new MessageDB(dbPath));
312
+ try {
313
+ return await handler(service);
314
+ }
315
+ finally {
316
+ service.close();
317
+ }
318
+ }
319
+ const BENIGN_UPDATE_WARNINGS = [
320
+ 'pts_before does not match local_pts',
321
+ 'local pts not available for postponed updateNewChannelMessage',
322
+ 'error fetching common difference',
323
+ 'error fetching difference for',
324
+ 'Session is reset',
325
+ 'MtprotoSession.resetState',
326
+ ];
327
+ function hideBenignUpdateWarnings(write, stream) {
328
+ stream.write = ((chunk, encoding, cb) => {
329
+ const rendered = typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString();
330
+ const isBenignUpdateWarning = BENIGN_UPDATE_WARNINGS.some((warning) => rendered.includes(warning))
331
+ || (rendered.includes('error fetching difference for') && rendered.includes('400 CHANNEL_INVALID'));
332
+ if (isBenignUpdateWarning) {
333
+ return true;
334
+ }
335
+ return write.call(stream, chunk, encoding, cb);
336
+ });
337
+ return () => {
338
+ stream.write = write;
339
+ };
340
+ }
341
+ async function renderMessageResult(options, title, handler) {
342
+ await renderTelegramResult(options, async (client) => {
343
+ const service = new MessageService(client);
344
+ const result = await handler(service);
345
+ return result.ok && result.human == null
346
+ ? { ...result, human: actionDetail(title, result.data) }
347
+ : result;
348
+ });
349
+ }
350
+ async function renderTelegramResult(options, handler) {
351
+ await runWithAccountContext(options, async (context) => {
352
+ const restoreStdoutWarnings = hideBenignUpdateWarnings(process.stdout.write.bind(process.stdout), process.stdout);
353
+ const restoreStderrWarnings = hideBenignUpdateWarnings(process.stderr.write.bind(process.stderr), process.stderr);
354
+ let client;
355
+ try {
356
+ client = createTelegramClient(context.sessionPath);
357
+ }
358
+ catch (error) {
359
+ restoreStdoutWarnings();
360
+ restoreStderrWarnings();
361
+ return commandFailure('config_error', error);
362
+ }
363
+ try {
364
+ return await handler(client, context);
365
+ }
366
+ catch (error) {
367
+ const authError = toAuthSessionError(error, context.account.name);
368
+ return authError ?? commandFailure('telegram_error', error);
369
+ }
370
+ finally {
371
+ restoreStdoutWarnings();
372
+ restoreStderrWarnings();
373
+ await client.close().catch(() => undefined);
374
+ }
375
+ });
376
+ }
377
+ function toAuthSessionError(error, accountName) {
378
+ if (isAuthKeyUnregistered(error)) {
379
+ return {
380
+ ok: false,
381
+ error: {
382
+ code: 'telegram_account_session_expired',
383
+ message: `Session for account "${accountName}" is no longer valid. Re-add the account: tg account remove ${accountName} --force && tg account add.`,
384
+ },
385
+ };
386
+ }
387
+ return null;
388
+ }
389
+ function isAuthKeyUnregistered(error) {
390
+ const candidate = error;
391
+ const text = typeof candidate.text === 'string'
392
+ ? candidate.text
393
+ : undefined;
394
+ if (text === 'AUTH_KEY_UNREGISTERED')
395
+ return true;
396
+ const code = typeof candidate.code === 'number' ? candidate.code : undefined;
397
+ const message = typeof candidate.message === 'string' ? candidate.message : '';
398
+ return message.includes('AUTH_KEY_UNREGISTERED') && code === 401;
399
+ }
400
+ function commandFailure(code, error) {
401
+ return { ok: false, error: { code, message: errorMessage(error) } };
402
+ }
403
+ function normalizeTelegramUser(user) {
404
+ const name = [user.first_name, user.last_name].filter(Boolean).join(' ');
405
+ return {
406
+ id: user.id,
407
+ name: name || user.username || String(user.id),
408
+ username: user.username,
409
+ first_name: user.first_name,
410
+ last_name: user.last_name,
411
+ phone: user.phone,
412
+ };
413
+ }
414
+ function errorMessage(error) {
415
+ return error instanceof Error ? error.message : String(error);
416
+ }
417
+ function sleep(seconds) {
418
+ const delay = Number.isFinite(seconds) && seconds > 0 ? seconds * 1000 : 0;
419
+ return new Promise((resolve) => {
420
+ setTimeout(resolve, delay);
421
+ });
422
+ }
423
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/commands/telegram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export function outputFormatConflict(options) {
2
+ if (!options.json || !options.yaml)
3
+ return undefined;
4
+ return {
5
+ ok: false,
6
+ error: {
7
+ code: 'invalid_output_format',
8
+ message: 'Use only one of --json or --yaml.',
9
+ },
10
+ };
11
+ }
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"AA4CA,MAAM,UAAU,oBAAoB,CAAC,OAAoB;IACvD,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI;QAAE,OAAO,SAAS,CAAA;IACpD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE;YACL,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,mCAAmC;SAC7C;KACF,CAAA;AACH,CAAC"}