@will-17173/telegram-cli 0.2.0 → 0.4.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 (197) hide show
  1. package/README.md +241 -61
  2. package/README.zh-CN.md +250 -73
  3. package/dist/account/account-authenticator.js +95 -0
  4. package/dist/account/account-authenticator.js.map +1 -0
  5. package/dist/account/account-context.js +7 -0
  6. package/dist/account/account-context.js.map +1 -1
  7. package/dist/account/account-name.js +17 -0
  8. package/dist/account/account-name.js.map +1 -0
  9. package/dist/account/account-presets.js +20 -3
  10. package/dist/account/account-presets.js.map +1 -1
  11. package/dist/account/account-store.js +277 -37
  12. package/dist/account/account-store.js.map +1 -1
  13. package/dist/cli/app.js +12 -1
  14. package/dist/cli/app.js.map +1 -1
  15. package/dist/cli/output.js +21 -6
  16. package/dist/cli/output.js.map +1 -1
  17. package/dist/cli/secure-input.js +408 -0
  18. package/dist/cli/secure-input.js.map +1 -0
  19. package/dist/commands/account-options.js +37 -7
  20. package/dist/commands/account-options.js.map +1 -1
  21. package/dist/commands/account.js +192 -66
  22. package/dist/commands/account.js.map +1 -1
  23. package/dist/commands/archive.js +151 -0
  24. package/dist/commands/archive.js.map +1 -0
  25. package/dist/commands/config.js +119 -12
  26. package/dist/commands/config.js.map +1 -1
  27. package/dist/commands/contact.js +58 -0
  28. package/dist/commands/contact.js.map +1 -0
  29. package/dist/commands/data.js +14 -7
  30. package/dist/commands/data.js.map +1 -1
  31. package/dist/commands/dialog.js +156 -0
  32. package/dist/commands/dialog.js.map +1 -0
  33. package/dist/commands/folder.js +113 -0
  34. package/dist/commands/folder.js.map +1 -0
  35. package/dist/commands/group-write.js +128 -0
  36. package/dist/commands/group-write.js.map +1 -0
  37. package/dist/commands/group.js +43 -7
  38. package/dist/commands/group.js.map +1 -1
  39. package/dist/commands/notification.js +76 -0
  40. package/dist/commands/notification.js.map +1 -0
  41. package/dist/commands/query.js +22 -15
  42. package/dist/commands/query.js.map +1 -1
  43. package/dist/commands/telegram-runner.js +40 -18
  44. package/dist/commands/telegram-runner.js.map +1 -1
  45. package/dist/commands/telegram.js +172 -109
  46. package/dist/commands/telegram.js.map +1 -1
  47. package/dist/commands/time-range.js +39 -0
  48. package/dist/commands/time-range.js.map +1 -0
  49. package/dist/commands/types.js +3 -2
  50. package/dist/commands/types.js.map +1 -1
  51. package/dist/config/credential-store.js +24 -4
  52. package/dist/config/credential-store.js.map +1 -1
  53. package/dist/config/env.js +4 -1
  54. package/dist/config/env.js.map +1 -1
  55. package/dist/group-commands/catalog.js +79 -0
  56. package/dist/group-commands/catalog.js.map +1 -0
  57. package/dist/group-commands/executor.js +102 -0
  58. package/dist/group-commands/executor.js.map +1 -0
  59. package/dist/group-commands/parser.js +268 -0
  60. package/dist/group-commands/parser.js.map +1 -0
  61. package/dist/group-commands/tokenize.js +51 -0
  62. package/dist/group-commands/tokenize.js.map +1 -0
  63. package/dist/group-commands/types.js +2 -0
  64. package/dist/group-commands/types.js.map +1 -0
  65. package/dist/index.js +0 -0
  66. package/dist/listen-commands/catalog.js +61 -0
  67. package/dist/listen-commands/catalog.js.map +1 -0
  68. package/dist/listen-commands/dispatch.js +46 -0
  69. package/dist/listen-commands/dispatch.js.map +1 -0
  70. package/dist/listen-commands/match.js +113 -0
  71. package/dist/listen-commands/match.js.map +1 -0
  72. package/dist/presenters/group.js +40 -0
  73. package/dist/presenters/group.js.map +1 -1
  74. package/dist/presenters/human.js +135 -0
  75. package/dist/presenters/human.js.map +1 -1
  76. package/dist/presenters/ink/display-width.js +45 -7
  77. package/dist/presenters/ink/display-width.js.map +1 -1
  78. package/dist/presenters/ink/group-command-confirm.js +13 -0
  79. package/dist/presenters/ink/group-command-confirm.js.map +1 -0
  80. package/dist/presenters/ink/group-command-result.js +23 -0
  81. package/dist/presenters/ink/group-command-result.js.map +1 -0
  82. package/dist/presenters/ink/listen-command-menu.js +38 -0
  83. package/dist/presenters/ink/listen-command-menu.js.map +1 -0
  84. package/dist/presenters/ink/listen-scroll.js +9 -4
  85. package/dist/presenters/ink/listen-scroll.js.map +1 -1
  86. package/dist/presenters/ink/listen.js +572 -52
  87. package/dist/presenters/ink/listen.js.map +1 -1
  88. package/dist/presenters/ink/mouse-scroll.js +12 -0
  89. package/dist/presenters/ink/mouse-scroll.js.map +1 -1
  90. package/dist/presenters/ink/secure-input.js +68 -0
  91. package/dist/presenters/ink/secure-input.js.map +1 -0
  92. package/dist/presenters/ink/use-group-command.js +186 -0
  93. package/dist/presenters/ink/use-group-command.js.map +1 -0
  94. package/dist/presenters/listen-message.js +23 -6
  95. package/dist/presenters/listen-message.js.map +1 -1
  96. package/dist/presenters/logical-message.js +78 -0
  97. package/dist/presenters/logical-message.js.map +1 -0
  98. package/dist/presenters/markdown.js +54 -0
  99. package/dist/presenters/markdown.js.map +1 -0
  100. package/dist/presenters/structured.js +8 -3
  101. package/dist/presenters/structured.js.map +1 -1
  102. package/dist/services/account-session-service.js +241 -0
  103. package/dist/services/account-session-service.js.map +1 -0
  104. package/dist/services/archive-layout.js +61 -0
  105. package/dist/services/archive-layout.js.map +1 -0
  106. package/dist/services/archive-manifest.js +187 -0
  107. package/dist/services/archive-manifest.js.map +1 -0
  108. package/dist/services/archive-markdown.js +383 -0
  109. package/dist/services/archive-markdown.js.map +1 -0
  110. package/dist/services/archive-service.js +718 -0
  111. package/dist/services/archive-service.js.map +1 -0
  112. package/dist/services/archive-types.js +2 -0
  113. package/dist/services/archive-types.js.map +1 -0
  114. package/dist/services/attachment-download.js +7 -2
  115. package/dist/services/attachment-download.js.map +1 -1
  116. package/dist/services/auto-download-coordinator.js +2 -4
  117. package/dist/services/auto-download-coordinator.js.map +1 -1
  118. package/dist/services/contact-service.js +78 -0
  119. package/dist/services/contact-service.js.map +1 -0
  120. package/dist/services/dialog-service.js +140 -0
  121. package/dist/services/dialog-service.js.map +1 -0
  122. package/dist/services/folder-service.js +200 -0
  123. package/dist/services/folder-service.js.map +1 -0
  124. package/dist/services/group-service.js.map +1 -1
  125. package/dist/services/group-write-service.js +225 -0
  126. package/dist/services/group-write-service.js.map +1 -0
  127. package/dist/services/listen-album-aggregator.js +9 -29
  128. package/dist/services/listen-album-aggregator.js.map +1 -1
  129. package/dist/services/listen-attachment.js +23 -6
  130. package/dist/services/listen-attachment.js.map +1 -1
  131. package/dist/services/listen-composer-command.js +102 -0
  132. package/dist/services/listen-composer-command.js.map +1 -0
  133. package/dist/services/listen-reply-resolver.js +126 -0
  134. package/dist/services/listen-reply-resolver.js.map +1 -0
  135. package/dist/services/message-service.js +17 -1
  136. package/dist/services/message-service.js.map +1 -1
  137. package/dist/services/notification-service.js +142 -0
  138. package/dist/services/notification-service.js.map +1 -0
  139. package/dist/services/query-service.js +59 -3
  140. package/dist/services/query-service.js.map +1 -1
  141. package/dist/services/reply-context.js +29 -0
  142. package/dist/services/reply-context.js.map +1 -0
  143. package/dist/services/write-access-policy.js +19 -0
  144. package/dist/services/write-access-policy.js.map +1 -0
  145. package/dist/storage/message-db.js +241 -5
  146. package/dist/storage/message-db.js.map +1 -1
  147. package/dist/telegram/archive-types.js +2 -0
  148. package/dist/telegram/archive-types.js.map +1 -0
  149. package/dist/telegram/client-factory.js +51 -11
  150. package/dist/telegram/client-factory.js.map +1 -1
  151. package/dist/telegram/contact-types.js +10 -0
  152. package/dist/telegram/contact-types.js.map +1 -0
  153. package/dist/telegram/dialog-types.js +2 -0
  154. package/dist/telegram/dialog-types.js.map +1 -0
  155. package/dist/telegram/errors.js +14 -0
  156. package/dist/telegram/errors.js.map +1 -0
  157. package/dist/telegram/fake-group-management.js +122 -0
  158. package/dist/telegram/fake-group-management.js.map +1 -1
  159. package/dist/telegram/folder-types.js +13 -0
  160. package/dist/telegram/folder-types.js.map +1 -0
  161. package/dist/telegram/group-types.js +40 -0
  162. package/dist/telegram/group-types.js.map +1 -1
  163. package/dist/telegram/group-write-types.js +29 -0
  164. package/dist/telegram/group-write-types.js.map +1 -0
  165. package/dist/telegram/mtcute-archive.js +190 -0
  166. package/dist/telegram/mtcute-archive.js.map +1 -0
  167. package/dist/telegram/mtcute-client.js +73 -12
  168. package/dist/telegram/mtcute-client.js.map +1 -1
  169. package/dist/telegram/mtcute-contacts.js +90 -0
  170. package/dist/telegram/mtcute-contacts.js.map +1 -0
  171. package/dist/telegram/mtcute-dialogs.js +186 -0
  172. package/dist/telegram/mtcute-dialogs.js.map +1 -0
  173. package/dist/telegram/mtcute-folders.js +318 -0
  174. package/dist/telegram/mtcute-folders.js.map +1 -0
  175. package/dist/telegram/mtcute-group-helpers.js +56 -0
  176. package/dist/telegram/mtcute-group-helpers.js.map +1 -0
  177. package/dist/telegram/mtcute-group-invites.js +82 -0
  178. package/dist/telegram/mtcute-group-invites.js.map +1 -0
  179. package/dist/telegram/mtcute-group-management.js +60 -31
  180. package/dist/telegram/mtcute-group-management.js.map +1 -1
  181. package/dist/telegram/mtcute-group-members.js +158 -0
  182. package/dist/telegram/mtcute-group-members.js.map +1 -0
  183. package/dist/telegram/mtcute-group-settings.js +146 -0
  184. package/dist/telegram/mtcute-group-settings.js.map +1 -0
  185. package/dist/telegram/mtcute-group-topics.js +63 -0
  186. package/dist/telegram/mtcute-group-topics.js.map +1 -0
  187. package/dist/telegram/mtcute-message-normalizer.js +63 -0
  188. package/dist/telegram/mtcute-message-normalizer.js.map +1 -0
  189. package/dist/telegram/mtcute-notifications.js +101 -0
  190. package/dist/telegram/mtcute-notifications.js.map +1 -0
  191. package/dist/telegram/notification-types.js +11 -0
  192. package/dist/telegram/notification-types.js.map +1 -0
  193. package/dist/telegram/raw-message.js +46 -0
  194. package/dist/telegram/raw-message.js.map +1 -0
  195. package/dist/telegram/types.js +6 -1
  196. package/dist/telegram/types.js.map +1 -1
  197. package/package.json +20 -10
@@ -1,6 +1,6 @@
1
1
  import { renderResult } from '../cli/output.js';
2
2
  import { validateCredentials, writeConfiguration } from '../config/credential-store.js';
3
- import { getConfigPath, getTelegramCredentials, getTelegramProxyConfiguration, } from '../config/env.js';
3
+ import { getConfigPath, getTelegramCredentials, getTelegramWriteAccess, getTelegramProxyConfiguration, } from '../config/env.js';
4
4
  import { normalizeTelegramProxy } from '../telegram/proxy.js';
5
5
  import { outputFormatConflict } from './types.js';
6
6
  export function registerConfigCommands(app) {
@@ -12,8 +12,9 @@ export function registerConfigCommands(app) {
12
12
  .option('--proxy <url>', 'Telegram proxy URL')
13
13
  .option('--json')
14
14
  .option('--yaml')
15
- .action(async (options) => {
16
- const conflict = outputFormatConflict(options);
15
+ .action(async (options, command) => {
16
+ const effectiveOptions = mergeOptionsWithGlobals(command, options);
17
+ const conflict = outputFormatConflict(effectiveOptions);
17
18
  if (conflict) {
18
19
  await renderResult(conflict, { yaml: true });
19
20
  return;
@@ -27,7 +28,7 @@ export function registerConfigCommands(app) {
27
28
  code: 'invalid_config',
28
29
  message: 'Provide API credentials, a proxy, or both.',
29
30
  },
30
- }, options);
31
+ }, effectiveOptions);
31
32
  return;
32
33
  }
33
34
  let credentials;
@@ -49,7 +50,7 @@ export function registerConfigCommands(app) {
49
50
  code: 'invalid_config',
50
51
  message: error instanceof Error ? error.message : 'Telegram API configuration is invalid.',
51
52
  },
52
- }, options);
53
+ }, effectiveOptions);
53
54
  return;
54
55
  }
55
56
  try {
@@ -65,7 +66,7 @@ export function registerConfigCommands(app) {
65
66
  code: 'config_write_failed',
66
67
  message: 'Failed to save Telegram configuration.',
67
68
  },
68
- }, options);
69
+ }, effectiveOptions);
69
70
  return;
70
71
  }
71
72
  const data = {
@@ -85,24 +86,27 @@ export function registerConfigCommands(app) {
85
86
  : 'Telegram proxy saved.',
86
87
  },
87
88
  };
88
- await renderResult(result, options);
89
+ await renderResult(result, effectiveOptions);
89
90
  });
90
91
  config.command('list')
91
92
  .description('Show effective Telegram CLI configuration')
92
93
  .option('--show-secrets', 'Show the complete API hash')
93
94
  .option('--json')
94
95
  .option('--yaml')
95
- .action(async (options) => {
96
- const conflict = outputFormatConflict(options);
96
+ .action(async (options, command) => {
97
+ const effectiveOptions = mergeOptionsWithGlobals(command, options);
98
+ const conflict = outputFormatConflict(effectiveOptions);
97
99
  if (conflict) {
98
100
  await renderResult(conflict, { yaml: true });
99
101
  return;
100
102
  }
101
103
  let credentials;
102
104
  let proxy;
105
+ let writeAccess;
103
106
  try {
104
107
  credentials = getTelegramCredentials();
105
108
  proxy = getTelegramProxyConfiguration();
109
+ writeAccess = getTelegramWriteAccess();
106
110
  }
107
111
  catch {
108
112
  await renderResult({
@@ -111,15 +115,16 @@ export function registerConfigCommands(app) {
111
115
  code: 'invalid_config',
112
116
  message: 'Telegram configuration is invalid.',
113
117
  },
114
- }, options);
118
+ }, effectiveOptions);
115
119
  return;
116
120
  }
117
121
  const data = {
118
122
  api_id: credentials.apiId,
119
123
  api_hash: options.showSecrets ? credentials.apiHash : maskSecret(credentials.apiHash),
120
124
  credentials_source: credentials.source,
121
- proxy: proxy?.url ?? null,
125
+ proxy: proxy == null ? null : maskProxyCredentials(proxy.url),
122
126
  proxy_source: proxy?.source ?? null,
127
+ write_access: writeAccess,
123
128
  };
124
129
  const result = {
125
130
  ok: true,
@@ -132,15 +137,117 @@ export function registerConfigCommands(app) {
132
137
  `Credentials source ${data.credentials_source}`,
133
138
  `Proxy ${data.proxy ?? 'none'}`,
134
139
  `Proxy source ${data.proxy_source ?? 'none'}`,
140
+ `Write access ${data.write_access}`,
135
141
  ].join('\n'),
136
142
  },
137
143
  };
138
- await renderResult(result, options);
144
+ await renderResult(result, effectiveOptions);
139
145
  });
146
+ config.command('write-access [status|on|off]')
147
+ .description('Show or update Telegram remote write permission')
148
+ .option('--json')
149
+ .option('--yaml')
150
+ .action(async (action, options, command) => {
151
+ const effectiveOptions = mergeOptionsWithGlobals(command, options);
152
+ const conflict = outputFormatConflict(effectiveOptions);
153
+ if (conflict) {
154
+ await renderResult(conflict, { yaml: true });
155
+ return;
156
+ }
157
+ const target = action?.trim().toLowerCase();
158
+ if (target !== undefined && target !== 'status' && target !== 'on' && target !== 'off') {
159
+ await renderResult({
160
+ ok: false,
161
+ error: {
162
+ code: 'invalid_config',
163
+ message: 'Action must be one of: status, on, or off.',
164
+ },
165
+ }, effectiveOptions);
166
+ return;
167
+ }
168
+ if (target === undefined || target === 'status') {
169
+ try {
170
+ const data = {
171
+ write_access: getTelegramWriteAccess(),
172
+ changed: false,
173
+ };
174
+ await renderResult({ ok: true, data }, effectiveOptions);
175
+ return;
176
+ }
177
+ catch {
178
+ await renderResult({
179
+ ok: false,
180
+ error: {
181
+ code: 'invalid_config',
182
+ message: 'Telegram configuration is invalid.',
183
+ },
184
+ }, effectiveOptions);
185
+ return;
186
+ }
187
+ }
188
+ const writeAccess = target === 'on';
189
+ try {
190
+ writeConfiguration(getConfigPath(), { writeAccess });
191
+ }
192
+ catch {
193
+ await renderResult({
194
+ ok: false,
195
+ error: {
196
+ code: 'config_write_failed',
197
+ message: 'Failed to save Telegram configuration.',
198
+ },
199
+ }, effectiveOptions);
200
+ return;
201
+ }
202
+ const data = {
203
+ write_access: writeAccess,
204
+ changed: true,
205
+ };
206
+ const result = {
207
+ ok: true,
208
+ data,
209
+ human: {
210
+ kind: 'text',
211
+ text: writeAccess ? 'Telegram remote writes enabled.' : 'Telegram remote writes disabled.',
212
+ },
213
+ };
214
+ await renderResult(result, effectiveOptions);
215
+ });
216
+ }
217
+ function mergeOptionsWithGlobals(command, options) {
218
+ return {
219
+ ...command.optsWithGlobals(),
220
+ ...options,
221
+ };
140
222
  }
141
223
  function maskSecret(secret) {
142
224
  if (secret.length <= 4)
143
225
  return '*'.repeat(secret.length);
144
226
  return `${'*'.repeat(secret.length - 4)}${secret.slice(-4)}`;
145
227
  }
228
+ function maskProxyCredentials(proxy) {
229
+ try {
230
+ const url = new URL(proxy);
231
+ if (url.username)
232
+ url.username = '***';
233
+ if (url.password)
234
+ url.password = '***';
235
+ for (const key of [...url.searchParams.keys()]) {
236
+ if (PROXY_CREDENTIAL_QUERY_KEYS.has(key.toLowerCase())) {
237
+ url.searchParams.set(key, '***');
238
+ }
239
+ }
240
+ return url.toString();
241
+ }
242
+ catch {
243
+ return '[invalid proxy URL]';
244
+ }
245
+ }
246
+ const PROXY_CREDENTIAL_QUERY_KEYS = new Set([
247
+ 'secret',
248
+ 'user',
249
+ 'pass',
250
+ 'username',
251
+ 'password',
252
+ ]);
146
253
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { renderResult } from '../cli/output.js';
2
+ import { ContactService } from '../services/contact-service.js';
3
+ import { outputFormatConflict } from './types.js';
4
+ import { runTelegramCommand } from './telegram-runner.js';
5
+ export function registerContactCommands(app) {
6
+ const contact = app.command('contact')
7
+ .description('Inspect Telegram contacts');
8
+ contact.command('list')
9
+ .description('List Telegram contacts')
10
+ .option('-n, --limit <limit>', 'Max contacts to list')
11
+ .option('--json')
12
+ .option('--yaml')
13
+ .action(async (_options, command) => {
14
+ const options = optionsWithGlobals(command);
15
+ if (await renderInvalidLimit(options))
16
+ return;
17
+ await runContactAction({
18
+ options,
19
+ handler: (client) => new ContactService(client.contacts).list({ limit: options.limit }),
20
+ }, command);
21
+ });
22
+ contact.command('info')
23
+ .description('Show a Telegram contact by id, username, or phone')
24
+ .argument('<user_or_phone>')
25
+ .option('--json')
26
+ .option('--yaml')
27
+ .action(async (userOrPhone, _options, command) => {
28
+ await runContactAction({
29
+ options: optionsWithGlobals(command),
30
+ handler: (client) => new ContactService(client.contacts).info({ userOrPhone }),
31
+ }, command);
32
+ });
33
+ }
34
+ async function renderInvalidLimit(options) {
35
+ if (options.limit == null)
36
+ return false;
37
+ const text = options.limit.trim();
38
+ const limit = /^\d+$/.test(text) ? Number(text) : Number.NaN;
39
+ if (Number.isSafeInteger(limit) && limit >= 1 && limit <= 500)
40
+ return false;
41
+ await renderResult({
42
+ ok: false,
43
+ error: { code: 'invalid_option', message: 'limit must be an integer between 1 and 500.' },
44
+ }, options);
45
+ return true;
46
+ }
47
+ async function runContactAction(input, command) {
48
+ const conflict = outputFormatConflict(input.options);
49
+ if (conflict) {
50
+ await renderResult(conflict, { yaml: true });
51
+ return;
52
+ }
53
+ await runTelegramCommand(input.options, (client) => input.handler(client), command);
54
+ }
55
+ function optionsWithGlobals(command) {
56
+ return command.optsWithGlobals();
57
+ }
58
+ //# sourceMappingURL=contact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact.js","sourceRoot":"","sources":["../../src/commands/contact.ts"],"names":[],"mappings":"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"}
@@ -12,13 +12,13 @@ export function registerDataCommands(app) {
12
12
  .option('--hours <hours>')
13
13
  .option('--json')
14
14
  .option('--yaml')
15
- .action(async (chat, options) => {
15
+ .action(async (chat, options, command) => {
16
16
  await renderDataResult(options, (service) => service.exportMessages({
17
17
  chat,
18
18
  format: options.format ?? 'text',
19
19
  output: options.output,
20
20
  hours: numberOption(options.hours),
21
- }));
21
+ }), command);
22
22
  });
23
23
  app.command('purge')
24
24
  .description('Delete locally stored messages from a chat')
@@ -26,20 +26,21 @@ export function registerDataCommands(app) {
26
26
  .option('-y, --yes')
27
27
  .option('--json')
28
28
  .option('--yaml')
29
- .action(async (chat, options) => {
30
- await renderDataResult(options, (service) => service.purge({ chat, yes: Boolean(options.yes) }));
29
+ .action(async (chat, options, command) => {
30
+ await renderDataResult(options, (service) => service.purge({ chat, yes: Boolean(options.yes) }), command);
31
31
  });
32
32
  }
33
33
  function numberOption(value) {
34
34
  return value == null ? undefined : Number(value);
35
35
  }
36
- async function renderDataResult(options, handler) {
37
- const conflict = outputFormatConflict(options);
36
+ async function renderDataResult(options, handler, command) {
37
+ const effectiveOptions = command == null ? options : mergeOptionsWithGlobals(command, options);
38
+ const conflict = outputFormatConflict(effectiveOptions);
38
39
  if (conflict) {
39
40
  await renderResult(conflict, { yaml: true });
40
41
  return;
41
42
  }
42
- await runWithAccountContext(options, (context) => {
43
+ await runWithAccountContext(effectiveOptions, (context) => {
43
44
  const service = new DataService(new MessageDB(context.dbPath));
44
45
  try {
45
46
  return handler(service);
@@ -49,4 +50,10 @@ async function renderDataResult(options, handler) {
49
50
  }
50
51
  });
51
52
  }
53
+ function mergeOptionsWithGlobals(command, options) {
54
+ return {
55
+ ...command.optsWithGlobals(),
56
+ ...options,
57
+ };
58
+ }
52
59
  //# sourceMappingURL=data.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/commands/data.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAsB,MAAM,YAAY,CAAA;AACrE,OAAO,EAAE,qBAAqB,EAA8B,MAAM,sBAAsB,CAAA;AAWxF,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;SAClB,WAAW,CAAC,4CAA4C,CAAC;SACzD,QAAQ,CAAC,QAAQ,CAAC;SAClB,MAAM,CAAC,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,CAAC;SAC9D,MAAM,CAAC,uBAAuB,CAAC;SAC/B,MAAM,CAAC,iBAAiB,CAAC;SACzB,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAkB,EAAE,EAAE;QACjD,MAAM,gBAAgB,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC;YAClE,IAAI;YACJ,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM;YAChC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC,CAAA;IACL,CAAC,CAAC,CAAA;IAEJ,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;SACjB,WAAW,CAAC,4CAA4C,CAAC;SACzD,QAAQ,CAAC,QAAQ,CAAC;SAClB,MAAM,CAAC,WAAW,CAAC;SACnB,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAkB,EAAE,EAAE;QACjD,MAAM,gBAAgB,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAClG,CAAC,CAAC,CAAA;AACN,CAAC;AAED,SAAS,YAAY,CAAC,KAAyB;IAC7C,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAClD,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,OAAkB,EAAE,OAAgD;IAClG,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC9C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,YAAY,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5C,OAAM;IACR,CAAC;IAED,MAAM,qBAAqB,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;QAC/C,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;QAC9D,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,OAAO,CAAC,CAAA;QACzB,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,KAAK,EAAE,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/commands/data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ import { renderResult } from '../cli/output.js';
2
+ import { DialogService } from '../services/dialog-service.js';
3
+ import { parseTimeRange } from './time-range.js';
4
+ import { outputFormatConflict } from './types.js';
5
+ import { runTelegramCommand } from './telegram-runner.js';
6
+ export function registerDialogCommands(app) {
7
+ registerInboxCommand(app, 'inbox');
8
+ registerReadCommand(app, 'read');
9
+ registerSearchCommand(app, 'search-online');
10
+ const dialog = app.command('dialog')
11
+ .description('Inspect Telegram dialogs, online messages, and managed groups');
12
+ registerInboxCommand(dialog, 'inbox');
13
+ registerReadCommand(dialog, 'read');
14
+ registerSearchCommand(dialog, 'search');
15
+ registerGroupsCommand(dialog);
16
+ }
17
+ function registerInboxCommand(parent, name) {
18
+ parent.command(name)
19
+ .description('List chats with unread messages')
20
+ .option('-n, --limit <limit>', 'Max dialogs to display')
21
+ .option('--json')
22
+ .option('--yaml')
23
+ .action(async (_options, command) => {
24
+ const options = optionsWithGlobals(command);
25
+ if (await renderInvalidLimit(options.limit, 500, options))
26
+ return;
27
+ await runDialogAction({
28
+ options,
29
+ handler: (service) => service.inbox({ limit: options.limit }),
30
+ });
31
+ });
32
+ }
33
+ function registerReadCommand(parent, name) {
34
+ parent.command(name)
35
+ .description('Read recent messages from a Telegram chat')
36
+ .argument('<chat>')
37
+ .option('-n, --limit <limit>', 'Max messages to read')
38
+ .option('--since <since>', 'Only include messages after this time')
39
+ .option('--until <until>', 'Only include messages before this time')
40
+ .option('--json')
41
+ .option('--yaml')
42
+ .action(async (chat, options, command) => {
43
+ const effectiveOptions = optionsWithGlobals(command);
44
+ if (await renderInvalidLimit(effectiveOptions.limit, 1000, effectiveOptions))
45
+ return;
46
+ await runDialogReadResult({
47
+ action: 'read',
48
+ args: { chat },
49
+ options: effectiveOptions,
50
+ });
51
+ });
52
+ }
53
+ function registerSearchCommand(parent, name) {
54
+ parent.command(name)
55
+ .description('Search Telegram online messages')
56
+ .argument('<query>')
57
+ .option('--chat <chat>', 'Limit search to one chat')
58
+ .option('-n, --limit <limit>', 'Max messages to return')
59
+ .option('--since <since>', 'Only include messages after this time')
60
+ .option('--until <until>', 'Only include messages before this time')
61
+ .option('--json')
62
+ .option('--yaml')
63
+ .action(async (query, options, command) => {
64
+ const effectiveOptions = optionsWithGlobals(command);
65
+ if (await renderInvalidLimit(effectiveOptions.limit, 1000, effectiveOptions))
66
+ return;
67
+ await runDialogReadResult({
68
+ action: 'search',
69
+ args: { query, chat: options.chat },
70
+ options: effectiveOptions,
71
+ });
72
+ });
73
+ }
74
+ function registerGroupsCommand(parent) {
75
+ parent.command('groups')
76
+ .description('List Telegram managed groups')
77
+ .option('--admin', 'Only groups where you are an admin or creator')
78
+ .option('-n, --limit <limit>', 'Max groups to list')
79
+ .option('--json')
80
+ .option('--yaml')
81
+ .action(async (_options, command) => {
82
+ const effectiveOptions = optionsWithGlobals(command);
83
+ if (await renderInvalidLimit(effectiveOptions.limit, 500, effectiveOptions))
84
+ return;
85
+ const conflict = outputFormatConflict(effectiveOptions);
86
+ if (conflict) {
87
+ await renderResult(conflict, { yaml: true });
88
+ return;
89
+ }
90
+ await runTelegramCommand(effectiveOptions, (client) => new DialogService(client.dialogs).groups({
91
+ adminOnly: Boolean(effectiveOptions.admin),
92
+ limit: effectiveOptions.limit,
93
+ }), command);
94
+ });
95
+ }
96
+ async function renderInvalidLimit(value, max, options) {
97
+ if (value == null)
98
+ return false;
99
+ const text = value.trim();
100
+ const limit = /^\d+$/.test(text) ? Number(text) : Number.NaN;
101
+ if (Number.isSafeInteger(limit) && limit >= 1 && limit <= max)
102
+ return false;
103
+ await renderResult({
104
+ ok: false,
105
+ error: { code: 'invalid_option', message: `limit must be an integer between 1 and ${max}.` },
106
+ }, options);
107
+ return true;
108
+ }
109
+ async function runDialogReadResult(input) {
110
+ const { action, args, options } = input;
111
+ const conflict = outputFormatConflict(options);
112
+ if (conflict) {
113
+ await renderResult(conflict, { yaml: true });
114
+ return;
115
+ }
116
+ const range = parseRange(options.since, options.until);
117
+ if (!range.ok) {
118
+ await renderResult(range, options);
119
+ return;
120
+ }
121
+ await runTelegramCommand(options, (client) => {
122
+ const service = new DialogService(client.dialogs);
123
+ if (action === 'read') {
124
+ if (args.chat == null)
125
+ throw new Error('Missing chat argument for read.');
126
+ return service.read({ chat: args.chat, limit: options.limit, ...range.data });
127
+ }
128
+ return service.search({ query: args.query ?? '', limit: options.limit, chat: options.chat, ...range.data });
129
+ });
130
+ }
131
+ async function runDialogAction(input) {
132
+ const conflict = outputFormatConflict(input.options);
133
+ if (conflict) {
134
+ await renderResult(conflict, { yaml: true });
135
+ return;
136
+ }
137
+ await runTelegramCommand(input.options, (client) => input.handler(new DialogService(client.dialogs)));
138
+ }
139
+ function parseRange(since, until) {
140
+ try {
141
+ return { ok: true, data: parseTimeRange({ since, until }) };
142
+ }
143
+ catch (error) {
144
+ return {
145
+ ok: false,
146
+ error: {
147
+ code: 'invalid_option',
148
+ message: error instanceof Error ? error.message : String(error),
149
+ },
150
+ };
151
+ }
152
+ }
153
+ function optionsWithGlobals(command) {
154
+ return command.optsWithGlobals();
155
+ }
156
+ //# sourceMappingURL=dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../src/commands/dialog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ import { renderResult } from '../cli/output.js';
2
+ import { FolderService, parseFolderChatInput } from '../services/folder-service.js';
3
+ import { runTelegramCommand, runTelegramWriteCommand } from './telegram-runner.js';
4
+ import { outputFormatConflict } from './types.js';
5
+ export function registerFolderCommands(app) {
6
+ const folder = app.command('folder')
7
+ .description('Inspect and manage Telegram chat folders');
8
+ folder.command('list')
9
+ .description('List Telegram chat folders')
10
+ .option('--json')
11
+ .option('--yaml')
12
+ .action(async (_options, command) => {
13
+ await runFolderAction({
14
+ options: optionsWithGlobals(command),
15
+ command,
16
+ handler: client => new FolderService(client.folders).list(),
17
+ });
18
+ });
19
+ folder.command('info')
20
+ .description('Show a Telegram chat folder')
21
+ .argument('<folder>')
22
+ .option('--json')
23
+ .option('--yaml')
24
+ .action(async (folderToken, _options, command) => {
25
+ await runFolderInputAction(folderToken, command, (client, parsedFolder) => (new FolderService(client.folders).info(parsedFolder)));
26
+ });
27
+ const chat = folder.command('chat')
28
+ .description('Manage explicit chats in a Telegram folder');
29
+ registerChatMutation(chat, 'add');
30
+ registerChatMutation(chat, 'remove');
31
+ }
32
+ function registerChatMutation(parent, operation) {
33
+ parent.command(operation)
34
+ .description(`${operation === 'add' ? 'Add a chat to' : 'Remove a chat from'} a Telegram folder`)
35
+ .argument('<folder>')
36
+ .argument('<chat>')
37
+ .option('--json')
38
+ .option('--yaml')
39
+ .action(async (folderToken, chatToken, _options, command) => {
40
+ await runFolderChatAction(folderToken, chatToken, command, (client, parsedFolder, parsedChat) => {
41
+ const service = new FolderService(client.folders);
42
+ return operation === 'add'
43
+ ? service.addChat(parsedFolder, parsedChat)
44
+ : service.removeChat(parsedFolder, parsedChat);
45
+ });
46
+ });
47
+ }
48
+ async function runFolderInputAction(folderToken, command, handler) {
49
+ const options = optionsWithGlobals(command);
50
+ const parsed = parseFolderInput(folderToken);
51
+ if (!parsed.ok) {
52
+ await renderResult(parsed, options);
53
+ return;
54
+ }
55
+ const conflict = outputFormatConflict(options);
56
+ if (conflict) {
57
+ await renderResult(conflict, { yaml: true });
58
+ return;
59
+ }
60
+ await runTelegramCommand(options, client => handler(client, parsed.data), command);
61
+ }
62
+ async function runFolderChatAction(folderToken, chatToken, command, handler) {
63
+ const options = optionsWithGlobals(command);
64
+ const parsedFolder = parseFolderInput(folderToken);
65
+ if (!parsedFolder.ok) {
66
+ await renderResult(parsedFolder, options);
67
+ return;
68
+ }
69
+ const parsedChat = parseFolderChatInput(chatToken);
70
+ if (!parsedChat.ok) {
71
+ await renderResult(parsedChat, options);
72
+ return;
73
+ }
74
+ const conflict = outputFormatConflict(options);
75
+ if (conflict) {
76
+ await renderResult(conflict, { yaml: true });
77
+ return;
78
+ }
79
+ await runTelegramWriteCommand(options, client => handler(client, parsedFolder.data, parsedChat.data), command);
80
+ }
81
+ async function runFolderAction(input) {
82
+ const conflict = outputFormatConflict(input.options);
83
+ if (conflict) {
84
+ await renderResult(conflict, { yaml: true });
85
+ return;
86
+ }
87
+ await runTelegramCommand(input.options, client => input.handler(client), input.command);
88
+ }
89
+ export function parseFolderInput(token) {
90
+ const normalized = token.trim();
91
+ if (normalized.length === 0)
92
+ return invalidFolder();
93
+ if (/^\d+$/.test(normalized)) {
94
+ const value = Number(normalized);
95
+ return Number.isSafeInteger(value) ? { ok: true, data: value } : invalidFolder();
96
+ }
97
+ if (/^[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?$/i.test(normalized))
98
+ return invalidFolder();
99
+ return { ok: true, data: normalized };
100
+ }
101
+ function invalidFolder() {
102
+ return {
103
+ ok: false,
104
+ error: {
105
+ code: 'invalid_folder',
106
+ message: 'Folder must be a non-empty title or safe integer ID.',
107
+ },
108
+ };
109
+ }
110
+ function optionsWithGlobals(command) {
111
+ return command.optsWithGlobals();
112
+ }
113
+ //# sourceMappingURL=folder.js.map