@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
@@ -0,0 +1,78 @@
1
+ import { discoverListenAttachments } from '../services/listen-attachment.js';
2
+ import { extractGroupedId, extractReplyToMessageId } from '../telegram/raw-message.js';
3
+ export function groupLogicalMessages(rows) {
4
+ const groups = new Map();
5
+ for (const row of rows) {
6
+ const key = logicalMessageKey(row);
7
+ const messages = groups.get(key);
8
+ if (messages == null)
9
+ groups.set(key, [row]);
10
+ else
11
+ messages.push(row);
12
+ }
13
+ return [...groups.entries()]
14
+ .map(([key, messages]) => toLogicalMessage(key, messages))
15
+ .sort(compareLogicalMessages);
16
+ }
17
+ export function logicalMessageKey(row) {
18
+ const groupedId = extractGroupedId(row.raw_json);
19
+ return groupedId == null
20
+ ? `${row.platform}:${row.chat_id}:message:${row.msg_id}`
21
+ : `${row.platform}:${row.chat_id}:${groupedId}`;
22
+ }
23
+ export function summarizeLogicalMedia(message) {
24
+ const attachments = message.messages.flatMap(discoverListenAttachments);
25
+ if (attachments.length === 0)
26
+ return null;
27
+ if (attachments.length === 1 && attachments[0].kind === 'Document' && attachments[0].fileName != null) {
28
+ return `📎 Document: ${attachments[0].fileName}`;
29
+ }
30
+ const counts = new Map();
31
+ for (const attachment of attachments) {
32
+ counts.set(attachment.kind, (counts.get(attachment.kind) ?? 0) + 1);
33
+ }
34
+ const parts = [...counts].map(([kind, count]) => `${count} ${count === 1 ? kind : pluralizeKind(kind)}`);
35
+ return `📎 ${parts.join(', ')}`;
36
+ }
37
+ function toLogicalMessage(key, rows) {
38
+ const messages = [...rows].sort((left, right) => left.msg_id - right.msg_id);
39
+ return {
40
+ key,
41
+ messages,
42
+ first: messages[0],
43
+ content: messages.find((row) => row.content?.trim())?.content ?? null,
44
+ replyToMessageId: firstReplyId(messages),
45
+ };
46
+ }
47
+ function firstReplyId(messages) {
48
+ for (const message of messages) {
49
+ const replyId = extractReplyToMessageId(message.raw_json);
50
+ if (replyId != null)
51
+ return replyId;
52
+ }
53
+ return null;
54
+ }
55
+ function compareLogicalMessages(left, right) {
56
+ const timestampOrder = left.first.timestamp.localeCompare(right.first.timestamp);
57
+ if (timestampOrder !== 0)
58
+ return timestampOrder;
59
+ const leftId = storedId(left.first);
60
+ const rightId = storedId(right.first);
61
+ return leftId != null && rightId != null ? leftId - rightId : left.first.msg_id - right.first.msg_id;
62
+ }
63
+ function storedId(message) {
64
+ return 'id' in message && typeof message.id === 'number' ? message.id : null;
65
+ }
66
+ function pluralizeKind(kind) {
67
+ return MEDIA_KIND_PLURALS[kind] ?? `${kind}s`;
68
+ }
69
+ const MEDIA_KIND_PLURALS = {
70
+ Photo: 'Photos',
71
+ Video: 'Videos',
72
+ Document: 'Documents',
73
+ Audio: 'Audio',
74
+ Voice: 'Voice Messages',
75
+ Sticker: 'Stickers',
76
+ Animation: 'Animations',
77
+ };
78
+ //# sourceMappingURL=logical-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logical-message.js","sourceRoot":"","sources":["../../src/presenters/logical-message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ export function renderHumanMarkdown(output) {
2
+ switch (output.kind) {
3
+ case 'text':
4
+ return normalizeNewlines(output.text);
5
+ case 'detail': {
6
+ const rows = output.fields.map((field) => formatField(field.label, field.value));
7
+ return `# ${escapeMarkdownField(output.title)}\n\n${rows.join('\n')}`;
8
+ }
9
+ case 'summary': {
10
+ const rows = output.fields.map((field) => formatField(field.label, field.value));
11
+ const title = `# ${escapeMarkdownField(output.title)}\n\n${rows.join('\n')}`;
12
+ const table = output.table == null
13
+ ? ''
14
+ : `\n\n${renderTable(output.table.columns, output.table.rows)}`;
15
+ return `${title}${table}`;
16
+ }
17
+ case 'table':
18
+ return `# ${escapeMarkdownField(output.title)}\n\n${renderTable(output.columns, output.rows)}`;
19
+ case 'timeline':
20
+ return `# ${escapeMarkdownField(output.title)}\n\n${renderTable(['PERIOD', 'COUNT'], output.rows.map((row) => [escapeMarkdownCell(row.period), escapeMarkdownCell(String(row.count))]))}`;
21
+ }
22
+ }
23
+ export function renderMarkdownError(code, message) {
24
+ return `# Error\n\n- **Code:** \`${escapeMarkdownField(code)}\`\n- **Message:** ${escapeMarkdownField(message)}`;
25
+ }
26
+ function formatField(label, value) {
27
+ return `- **${escapeMarkdownField(label)}:** ${escapeMarkdownField(value)}`;
28
+ }
29
+ function renderTable(columns, rows) {
30
+ const header = columns.map((column) => escapeMarkdownField(column)).join(' | ');
31
+ const separator = columns.map(() => '---').join(' | ');
32
+ const body = rows.length === 0
33
+ ? []
34
+ : rows.map((row) => `| ${row.map((cell) => escapeMarkdownCell(cell)).join(' | ')} |`);
35
+ return [`| ${header} |`, `| ${separator} |`, ...body].join('\n');
36
+ }
37
+ function escapeMarkdownField(value) {
38
+ return escapeMarkdown(value).replaceAll('\n', '<br>');
39
+ }
40
+ function escapeMarkdownCell(value) {
41
+ return escapeMarkdown(value).replaceAll('\n', '<br>');
42
+ }
43
+ function escapeMarkdown(value) {
44
+ return normalizeNewlines(value)
45
+ .replaceAll('\\', '\\\\')
46
+ .replaceAll('|', '\\|')
47
+ .replaceAll('`', '\\`');
48
+ }
49
+ function normalizeNewlines(value) {
50
+ return value
51
+ .replaceAll('\r\n', '\n')
52
+ .replaceAll('\r', '\n');
53
+ }
54
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/presenters/markdown.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,20 @@
1
1
  import YAML from 'yaml';
2
2
  const SCHEMA_VERSION = '1';
3
3
  export function resolveOutputFormat(options) {
4
- if (options.json && options.yaml) {
5
- throw new Error('Use only one of --json or --yaml.');
4
+ if (options.json && (options.yaml || options.markdown)) {
5
+ throw new Error('Use only one of --json, --yaml, or --markdown.');
6
+ }
7
+ if (options.yaml && options.markdown) {
8
+ throw new Error('Use only one of --json, --yaml, or --markdown.');
6
9
  }
7
10
  if (options.yaml)
8
11
  return 'yaml';
9
12
  if (options.json)
10
13
  return 'json';
14
+ if (options.markdown)
15
+ return 'markdown';
11
16
  const mode = (process.env.OUTPUT || 'auto').trim().toLowerCase();
12
- if (mode === 'yaml' || mode === 'json' || mode === 'rich')
17
+ if (mode === 'yaml' || mode === 'json' || mode === 'rich' || mode === 'markdown')
13
18
  return mode;
14
19
  return options.isTty === false ? 'yaml' : 'rich';
15
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"structured.js","sourceRoot":"","sources":["../../src/presenters/structured.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,MAAM,cAAc,GAAG,GAAG,CAAA;AAQ1B,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IACtD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI;QAAE,OAAO,MAAM,CAAA;IAC/B,IAAI,OAAO,CAAC,IAAI;QAAE,OAAO,MAAM,CAAA;IAE/B,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAChE,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACtE,OAAO,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,EAAE,IAAI,EAAE,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAe,EAAE,OAAiB;IAC3E,MAAM,KAAK,GAA4B,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IACxD,IAAI,OAAO,KAAK,SAAS;QAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;IAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,MAAuB;IACtE,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAC9D,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAA;AAC3D,CAAC"}
1
+ {"version":3,"file":"structured.js","sourceRoot":"","sources":["../../src/presenters/structured.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,MAAM,cAAc,GAAG,GAAG,CAAA;AAS1B,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACnE,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAA;IACnE,CAAC;IACD,IAAI,OAAO,CAAC,IAAI;QAAE,OAAO,MAAM,CAAA;IAC/B,IAAI,OAAO,CAAC,IAAI;QAAE,OAAO,MAAM,CAAA;IAC/B,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,UAAU,CAAA;IAEvC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAChE,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAA;IAC7F,OAAO,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,EAAE,IAAI,EAAE,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAe,EAAE,OAAiB;IAC3E,MAAM,KAAK,GAA4B,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IACxD,IAAI,OAAO,KAAK,SAAS;QAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;IAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,MAAuB;IACtE,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAC9D,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAA;AAC3D,CAAC"}
@@ -0,0 +1,241 @@
1
+ import { existsSync, mkdirSync, mkdtempSync, renameSync, rmSync } from 'node:fs';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { dirname, join } from 'node:path';
4
+ import { authenticateAccountAt } from '../account/account-authenticator.js';
5
+ import { accountSessionPath } from '../account/account-presets.js';
6
+ import { createTelegramClient } from '../telegram/client-factory.js';
7
+ import { TelegramSessionTerminatedError } from '../telegram/types.js';
8
+ import { isCliInterruptedError } from '../cli/secure-input.js';
9
+ export class AccountSessionService {
10
+ options;
11
+ createClient;
12
+ authenticate;
13
+ createTemporaryDirectory;
14
+ removePath;
15
+ renamePath;
16
+ constructor(options) {
17
+ this.options = options;
18
+ this.createClient = options.createClient ?? createTelegramClient;
19
+ this.authenticate = options.authenticate ?? authenticateAccountAt;
20
+ this.createTemporaryDirectory = options.createTemporaryDirectory ?? mkdtempSync;
21
+ this.removePath = options.removePath ?? ((path) => rmSync(path, { recursive: true, force: true }));
22
+ this.renamePath = options.renamePath ?? renameSync;
23
+ }
24
+ async logout(input) {
25
+ return this.options.store.withLock(async () => {
26
+ const registry = this.options.store.read();
27
+ const account = findAccount(registry, input.name);
28
+ if (!account)
29
+ return accountNotFound(input.name);
30
+ if (account.auth_state === 'logged_out')
31
+ return success(account, false);
32
+ let client;
33
+ try {
34
+ client = this.createClient(accountSessionPath(this.options.dataDir, account.name));
35
+ }
36
+ catch {
37
+ return failure('account_logout_failed', 'Unable to initialize Telegram logout.');
38
+ }
39
+ let logoutError;
40
+ try {
41
+ await client.logOut();
42
+ }
43
+ catch (error) {
44
+ logoutError = error;
45
+ }
46
+ try {
47
+ await client.close();
48
+ }
49
+ catch (error) {
50
+ if (logoutError == null)
51
+ logoutError = error;
52
+ }
53
+ if (logoutError != null && !isTerminalSessionError(logoutError)) {
54
+ return failure('account_logout_failed', 'Unable to log out the Telegram account.');
55
+ }
56
+ const updated = { ...account, auth_state: 'logged_out' };
57
+ try {
58
+ this.options.store.write(updateAccount(registry, updated));
59
+ }
60
+ catch {
61
+ return failure('account_store_error', 'Unable to update account authentication state.');
62
+ }
63
+ return success(updated, true);
64
+ });
65
+ }
66
+ async login(input) {
67
+ return this.options.store.withLock(async () => {
68
+ const registry = this.options.store.read();
69
+ const account = findAccount(registry, input.name);
70
+ if (!account)
71
+ return accountNotFound(input.name);
72
+ if (account.auth_state === 'authenticated')
73
+ return success(account, false);
74
+ if (input.interactive === false) {
75
+ return failure('interaction_required', 'Account login requires an interactive terminal.');
76
+ }
77
+ const sessionPath = accountSessionPath(this.options.dataDir, account.name);
78
+ let temporaryDir;
79
+ try {
80
+ mkdirSync(dirname(sessionPath), { recursive: true });
81
+ temporaryDir = this.createTemporaryDirectory(join(dirname(sessionPath), '.login-'));
82
+ }
83
+ catch {
84
+ return failure('account_session_replace_failed', 'Unable to create staged account session storage.');
85
+ }
86
+ const stagedSessionPath = join(temporaryDir, 'session');
87
+ const discardedSessionPath = join(temporaryDir, 'discarded-session');
88
+ const tombstonePath = join(dirname(sessionPath), `.session-${randomUUID()}.bak`);
89
+ let preserveTombstone = false;
90
+ let preserveTemporaryDir = false;
91
+ let completedAccount;
92
+ const cleanupRecoveryPaths = [];
93
+ try {
94
+ let authenticated;
95
+ try {
96
+ authenticated = await this.authenticate(stagedSessionPath);
97
+ }
98
+ catch (error) {
99
+ if (isCliInterruptedError(error))
100
+ throw error;
101
+ return failure(errorCode(error, 'account_login_failed'), 'Unable to authenticate the Telegram account.');
102
+ }
103
+ try {
104
+ await authenticated.close();
105
+ }
106
+ catch (error) {
107
+ preserveTemporaryDir = true;
108
+ return failure('account_login_failed', 'Unable to confirm staged Telegram session shutdown.', { recovery_path: temporaryDir });
109
+ }
110
+ if (authenticated.user.id !== account.user_id) {
111
+ return failure('account_identity_mismatch', `Authenticated Telegram user ${authenticated.user.id} does not match account "${account.name}" (${account.user_id}).`);
112
+ }
113
+ if (!existsSync(stagedSessionPath)) {
114
+ return failure('account_session_replace_failed', 'Authentication did not create a staged session.');
115
+ }
116
+ const hadOriginalSession = existsSync(sessionPath);
117
+ try {
118
+ if (hadOriginalSession)
119
+ this.renamePath(sessionPath, tombstonePath);
120
+ this.renamePath(stagedSessionPath, sessionPath);
121
+ }
122
+ catch (error) {
123
+ if (hadOriginalSession && existsSync(tombstonePath)) {
124
+ const restoreError = restoreSession(tombstonePath, sessionPath, this.renamePath);
125
+ if (restoreError) {
126
+ preserveTombstone = true;
127
+ return recoveryFailure('account_session_replace_failed', tombstonePath);
128
+ }
129
+ }
130
+ return failure('account_session_replace_failed', 'Unable to replace the Telegram session safely.');
131
+ }
132
+ const updated = { ...account, auth_state: 'authenticated' };
133
+ try {
134
+ this.options.store.write(updateAccount(registry, updated));
135
+ }
136
+ catch (error) {
137
+ const rollbackError = rollbackInstalledSession({
138
+ discardedSessionPath,
139
+ hadOriginalSession,
140
+ renamePath: this.renamePath,
141
+ sessionPath,
142
+ tombstonePath,
143
+ });
144
+ if (rollbackError) {
145
+ preserveTombstone = hadOriginalSession && existsSync(tombstonePath);
146
+ return preserveTombstone
147
+ ? recoveryFailure('account_store_error', tombstonePath)
148
+ : failure('account_store_error', 'Unable to update account authentication state and roll back the staged session.');
149
+ }
150
+ return failure('account_store_error', 'Unable to update account authentication state.');
151
+ }
152
+ completedAccount = updated;
153
+ }
154
+ finally {
155
+ if (!preserveTemporaryDir && !safelyRemove(this.removePath, temporaryDir))
156
+ cleanupRecoveryPaths.push(temporaryDir);
157
+ if (!preserveTombstone && !safelyRemove(this.removePath, tombstonePath))
158
+ cleanupRecoveryPaths.push(tombstonePath);
159
+ }
160
+ if (cleanupRecoveryPaths.length > 0) {
161
+ const primaryRecoveryPath = cleanupRecoveryPaths[cleanupRecoveryPaths.length - 1];
162
+ return failure('account_session_cleanup_failed', 'Account login succeeded, but secure session cleanup did not complete.', { recovery_path: primaryRecoveryPath, recovery_paths: cleanupRecoveryPaths });
163
+ }
164
+ return success(completedAccount, true);
165
+ });
166
+ }
167
+ }
168
+ function safelyRemove(removePath, path) {
169
+ try {
170
+ removePath(path);
171
+ return true;
172
+ }
173
+ catch {
174
+ return false;
175
+ }
176
+ }
177
+ function findAccount(registry, name) {
178
+ return registry.accounts.find((account) => account.name === name);
179
+ }
180
+ function updateAccount(registry, updated) {
181
+ return {
182
+ ...registry,
183
+ accounts: registry.accounts.map((account) => account.name === updated.name ? updated : account),
184
+ };
185
+ }
186
+ function success(account, changed) {
187
+ return { ok: true, data: { account, changed } };
188
+ }
189
+ function accountNotFound(name) {
190
+ return failure('account_not_found', `Account "${name}" is not registered.`);
191
+ }
192
+ function failure(code, message, details) {
193
+ return { ok: false, error: { code, message, ...(details === undefined ? {} : { details }) } };
194
+ }
195
+ function recoveryFailure(code, recoveryPath) {
196
+ return failure(code, code === 'account_store_error'
197
+ ? 'Unable to update account authentication state; the original session requires recovery.'
198
+ : 'Unable to replace the Telegram session; the original session requires recovery.', { recovery_path: recoveryPath });
199
+ }
200
+ function restoreSession(tombstonePath, sessionPath, renamePath) {
201
+ if (existsSync(sessionPath)) {
202
+ return new Error(`Cannot restore original session because destination exists: ${sessionPath}`);
203
+ }
204
+ try {
205
+ renamePath(tombstonePath, sessionPath);
206
+ return undefined;
207
+ }
208
+ catch (error) {
209
+ return error;
210
+ }
211
+ }
212
+ function rollbackInstalledSession(options) {
213
+ if (existsSync(options.sessionPath)) {
214
+ try {
215
+ options.renamePath(options.sessionPath, options.discardedSessionPath);
216
+ }
217
+ catch {
218
+ try {
219
+ rmSync(options.sessionPath, { recursive: true, force: true });
220
+ }
221
+ catch {
222
+ return new Error('Unable to discard the staged session during rollback.');
223
+ }
224
+ }
225
+ }
226
+ if (!options.hadOriginalSession || !existsSync(options.tombstonePath))
227
+ return undefined;
228
+ return restoreSession(options.tombstonePath, options.sessionPath, options.renamePath);
229
+ }
230
+ function isTerminalSessionError(error) {
231
+ return error instanceof TelegramSessionTerminatedError;
232
+ }
233
+ function errorCode(error, fallback) {
234
+ if (error !== null && typeof error === 'object' && 'code' in error) {
235
+ const code = error.code;
236
+ if (typeof code === 'string' && code.length > 0)
237
+ return code;
238
+ }
239
+ return fallback;
240
+ }
241
+ //# sourceMappingURL=account-session-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-session-service.js","sourceRoot":"","sources":["../../src/services/account-session-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { posix } from 'node:path';
2
+ const MAX_CHAT_SLUG_BYTES = 80;
3
+ const MAX_FILENAME_BYTES = 255;
4
+ const MAX_EXTENSION_BYTES = 32;
5
+ const WINDOWS_RESERVED_NAME = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/iu;
6
+ const graphemeSegmenter = new Intl.Segmenter('und', { granularity: 'grapheme' });
7
+ function sanitizePart(value) {
8
+ return value
9
+ .normalize('NFKC')
10
+ .toLocaleLowerCase('und')
11
+ .replace(/[\p{C}\\/:*?"<>|_\s.]+/gu, '-')
12
+ .replace(/[^\p{L}\p{N}\p{M}-]+/gu, '-')
13
+ .replace(/-+/gu, '-')
14
+ .replace(/^-|-$/gu, '');
15
+ }
16
+ function safeInteger(value, label) {
17
+ if (!Number.isSafeInteger(value)) {
18
+ throw new Error(`archive_invalid_${label}`);
19
+ }
20
+ return String(value);
21
+ }
22
+ function truncateUtf8(value, maxBytes) {
23
+ let result = '';
24
+ let bytes = 0;
25
+ for (const { segment } of graphemeSegmenter.segment(value)) {
26
+ const segmentBytes = Buffer.byteLength(segment);
27
+ if (bytes + segmentBytes > maxBytes)
28
+ break;
29
+ result += segment;
30
+ bytes += segmentBytes;
31
+ }
32
+ return result.replace(/-$/u, '');
33
+ }
34
+ export function archiveChatFile(chatId, title) {
35
+ const id = safeInteger(chatId, 'chat_id');
36
+ const slug = truncateUtf8(sanitizePart(title), MAX_CHAT_SLUG_BYTES) || 'chat';
37
+ return `${id}-${slug}.md`;
38
+ }
39
+ function mediaBasename(filename, messagePrefix) {
40
+ const basename = filename.replace(/\\/gu, '/').split('/').at(-1) ?? '';
41
+ const extensionIndex = basename.lastIndexOf('.');
42
+ const hasExtension = extensionIndex > 0 && extensionIndex < basename.length - 1;
43
+ const rawStem = hasExtension ? basename.slice(0, extensionIndex) : basename;
44
+ const rawExtension = hasExtension ? basename.slice(extensionIndex + 1) : '';
45
+ let stem = sanitizePart(rawStem) || 'file';
46
+ const extension = truncateUtf8(sanitizePart(rawExtension), MAX_EXTENSION_BYTES);
47
+ if (WINDOWS_RESERVED_NAME.test(stem)) {
48
+ stem = `file-${stem}`;
49
+ }
50
+ const reservedBytes = Buffer.byteLength(messagePrefix)
51
+ + (extension ? Buffer.byteLength(extension) + 1 : 0);
52
+ stem = truncateUtf8(stem, MAX_FILENAME_BYTES - reservedBytes) || 'file';
53
+ return extension ? `${stem}.${extension}` : stem;
54
+ }
55
+ export function archiveMediaFile(chatId, messageId, filename) {
56
+ const chat = safeInteger(chatId, 'chat_id');
57
+ const message = safeInteger(messageId, 'message_id');
58
+ const messagePrefix = `${message}-`;
59
+ return posix.join('media', chat, `${messagePrefix}${mediaBasename(filename, messagePrefix)}`);
60
+ }
61
+ //# sourceMappingURL=archive-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-layout.js","sourceRoot":"","sources":["../../src/services/archive-layout.ts"],"names":[],"mappings":"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"}