@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,408 @@
1
+ import { StringDecoder } from 'node:string_decoder';
2
+ export class CliInterruptedError extends Error {
3
+ code = 'interrupted';
4
+ exitCode;
5
+ signal;
6
+ constructor(signal = 'SIGINT') {
7
+ super('Operation interrupted.');
8
+ this.name = 'CliInterruptedError';
9
+ this.signal = signal;
10
+ this.exitCode = signal === 'SIGHUP' ? 129 : signal === 'SIGTERM' ? 143 : 130;
11
+ }
12
+ }
13
+ export class InteractionRequiredError extends Error {
14
+ code = 'interaction_required';
15
+ constructor() {
16
+ super('Interactive terminal input is required.');
17
+ this.name = 'InteractionRequiredError';
18
+ }
19
+ }
20
+ export class InvalidInputError extends Error {
21
+ code = 'invalid_input';
22
+ constructor(message) {
23
+ super(message);
24
+ this.name = 'InvalidInputError';
25
+ }
26
+ }
27
+ export class InputBusyError extends Error {
28
+ code = 'input_busy';
29
+ constructor() {
30
+ super('Interactive terminal input is already in use.');
31
+ this.name = 'InputBusyError';
32
+ }
33
+ }
34
+ const activeTerminalInputs = new WeakSet();
35
+ const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
36
+ // Match the Ink secret field: ignore printable input beyond 4096 complete graphemes.
37
+ export const MAX_SECRET_INPUT_LENGTH = 4096;
38
+ const MAX_SECRET_INPUT_CODE_POINTS = MAX_SECRET_INPUT_LENGTH * 16;
39
+ const SIGNAL_CLEANUP_GRACE_MS = 100;
40
+ const pendingOutputWrites = new WeakMap();
41
+ const inputsAwaitingLineFeed = new WeakSet();
42
+ const ignoreOutputError = () => undefined;
43
+ export function createInterruptScope() {
44
+ const controller = new AbortController();
45
+ const previousExitCode = process.exitCode;
46
+ let fallback;
47
+ let assignedExitCode;
48
+ let disposed = false;
49
+ const keepAlive = setTimeout(() => undefined, 2_147_483_647);
50
+ // SIGKILL cannot be observed; for catchable signals, re-raise after a short cooperative cleanup window.
51
+ // Signal exit-status behavior is Unix-tested; Windows signal delivery is limited by Node and the host console.
52
+ const handlers = Object.fromEntries(['SIGINT', 'SIGHUP', 'SIGTERM'].map(processSignal => [
53
+ processSignal,
54
+ () => {
55
+ if (controller.signal.aborted || disposed)
56
+ return;
57
+ const interruption = new CliInterruptedError(processSignal);
58
+ assignedExitCode = interruption.exitCode;
59
+ process.exitCode = interruption.exitCode;
60
+ clearTimeout(keepAlive);
61
+ controller.abort(interruption);
62
+ if (disposed)
63
+ return;
64
+ fallback = setTimeout(() => {
65
+ removeHandlers();
66
+ process.kill(process.pid, processSignal);
67
+ }, SIGNAL_CLEANUP_GRACE_MS);
68
+ fallback.unref();
69
+ },
70
+ ]));
71
+ const removeHandlers = () => {
72
+ for (const processSignal of Object.keys(handlers)) {
73
+ process.removeListener(processSignal, handlers[processSignal]);
74
+ }
75
+ };
76
+ for (const processSignal of Object.keys(handlers)) {
77
+ process.once(processSignal, handlers[processSignal]);
78
+ }
79
+ return {
80
+ signal: controller.signal,
81
+ dispose: () => {
82
+ disposed = true;
83
+ clearTimeout(keepAlive);
84
+ if (fallback)
85
+ clearTimeout(fallback);
86
+ removeHandlers();
87
+ if (assignedExitCode !== undefined && process.exitCode === assignedExitCode) {
88
+ process.exitCode = previousExitCode;
89
+ }
90
+ },
91
+ };
92
+ }
93
+ export async function readVisibleInput(prompt, streams = {}) {
94
+ return readTerminalInput(prompt, streams, false);
95
+ }
96
+ export async function readSecret(prompt, streams = {}) {
97
+ return readTerminalInput(prompt, streams, true);
98
+ }
99
+ async function readTerminalInput(prompt, streams, hidden) {
100
+ const input = streams.input ?? process.stdin;
101
+ const output = streams.output ?? process.stderr;
102
+ if (input.isTTY !== true || ((hidden || input.isRaw === true) && typeof input.setRawMode !== 'function')) {
103
+ throw new InteractionRequiredError();
104
+ }
105
+ throwIfAborted(streams.signal);
106
+ if (input.readableEnded || input.destroyed)
107
+ throw new CliInterruptedError();
108
+ if (activeTerminalInputs.has(input) || input.listenerCount('data') > 0)
109
+ throw new InputBusyError();
110
+ activeTerminalInputs.add(input);
111
+ try {
112
+ drainBufferedInput(input);
113
+ return await readOwnedTerminalInput(prompt, input, output, streams.signal, hidden);
114
+ }
115
+ finally {
116
+ activeTerminalInputs.delete(input);
117
+ }
118
+ }
119
+ async function readOwnedTerminalInput(prompt, input, output, signal, hidden) {
120
+ const originalRawMode = input.isRaw === true;
121
+ const wasFlowing = input.readableFlowing === true;
122
+ const decoder = new StringDecoder('utf8');
123
+ let value = '';
124
+ let settled = false;
125
+ let rawModeTouched = false;
126
+ let promptStarted = false;
127
+ let promptWrite;
128
+ let operationFailed = false;
129
+ let escapeState = 'none';
130
+ let resolveInput;
131
+ let rejectInput;
132
+ const result = new Promise((resolve, reject) => {
133
+ resolveInput = resolve;
134
+ rejectInput = reject;
135
+ });
136
+ const settleValue = (line) => {
137
+ if (settled)
138
+ return;
139
+ settled = true;
140
+ resolveInput?.(line);
141
+ };
142
+ const settleError = (error) => {
143
+ if (settled)
144
+ return;
145
+ settled = true;
146
+ rejectInput?.(error);
147
+ };
148
+ const onData = (chunk) => {
149
+ if (settled)
150
+ return;
151
+ const text = typeof chunk === 'string' ? chunk : decoder.write(chunk);
152
+ const printable = [];
153
+ let examinedPrintable = 0;
154
+ let printableWasTruncated = false;
155
+ const flushPrintable = () => {
156
+ if (printable.length === 0 && !printableWasTruncated)
157
+ return;
158
+ value = hidden
159
+ ? appendBoundedPrintable(value, printable, printableWasTruncated)
160
+ : value + printable.join('');
161
+ printable.fill('');
162
+ printable.length = 0;
163
+ examinedPrintable = 0;
164
+ printableWasTruncated = false;
165
+ };
166
+ for (const character of text) {
167
+ const code = character.codePointAt(0);
168
+ if (inputsAwaitingLineFeed.has(input)) {
169
+ inputsAwaitingLineFeed.delete(input);
170
+ if (character === '\n')
171
+ continue;
172
+ }
173
+ if (code === 3) {
174
+ flushPrintable();
175
+ settleError(new CliInterruptedError());
176
+ return;
177
+ }
178
+ if (character === '\r' || character === '\n') {
179
+ flushPrintable();
180
+ if (character === '\r')
181
+ inputsAwaitingLineFeed.add(input);
182
+ if (hidden && value.length === 0)
183
+ settleError(new InvalidInputError('Secret input cannot be empty.'));
184
+ else
185
+ settleValue(value);
186
+ return;
187
+ }
188
+ if (code === 27) {
189
+ flushPrintable();
190
+ escapeState = 'start';
191
+ continue;
192
+ }
193
+ if (escapeState === 'start') {
194
+ escapeState = character === ']'
195
+ ? 'osc'
196
+ : character === '[' || character === 'O' ? 'sequence' : 'none';
197
+ continue;
198
+ }
199
+ if (escapeState === 'sequence') {
200
+ if (code != null && code >= 0x40 && code <= 0x7e)
201
+ escapeState = 'none';
202
+ continue;
203
+ }
204
+ if (escapeState === 'osc') {
205
+ if (code === 7)
206
+ escapeState = 'none';
207
+ continue;
208
+ }
209
+ if (code === 8 || code === 127) {
210
+ flushPrintable();
211
+ value = removeFinalGrapheme(value);
212
+ continue;
213
+ }
214
+ if (code != null && code >= 32 && (code < 127 || code > 159)) {
215
+ if (!hidden || examinedPrintable < MAX_SECRET_INPUT_CODE_POINTS) {
216
+ printable.push(character);
217
+ examinedPrintable += 1;
218
+ }
219
+ else {
220
+ printableWasTruncated = true;
221
+ }
222
+ }
223
+ }
224
+ flushPrintable();
225
+ };
226
+ const onInputError = (error) => settleError(error);
227
+ const onOutputError = (error) => settleError(error);
228
+ const onInputUnavailable = () => settleError(new CliInterruptedError());
229
+ const onAbort = () => settleError(abortReason(signal));
230
+ signal?.addEventListener('abort', onAbort, { once: true });
231
+ output.on('error', onOutputError);
232
+ input.once('error', onInputError);
233
+ input.once('end', onInputUnavailable);
234
+ input.once('close', onInputUnavailable);
235
+ try {
236
+ if (signal?.aborted)
237
+ settleError(abortReason(signal));
238
+ if (input.readableEnded || input.destroyed)
239
+ settleError(new CliInterruptedError());
240
+ if (!settled && (hidden || originalRawMode)) {
241
+ rawModeTouched = true;
242
+ input.setRawMode(hidden);
243
+ }
244
+ if (!settled) {
245
+ input.on('data', onData);
246
+ const unexpectedDataListeners = input.listeners('data').filter(listener => listener !== onData);
247
+ if (unexpectedDataListeners.length > 0)
248
+ settleError(new InputBusyError());
249
+ }
250
+ if (!settled)
251
+ input.resume();
252
+ if (!settled) {
253
+ promptStarted = true;
254
+ promptWrite = startOutputWrite(output, prompt, settleError);
255
+ }
256
+ return await result;
257
+ }
258
+ catch (error) {
259
+ operationFailed = true;
260
+ throw error;
261
+ }
262
+ finally {
263
+ let cleanupError;
264
+ const cleanup = (action) => {
265
+ try {
266
+ action();
267
+ }
268
+ catch (error) {
269
+ cleanupError ??= error;
270
+ }
271
+ };
272
+ cleanup(() => input.removeListener('data', onData));
273
+ cleanup(() => input.removeListener('error', onInputError));
274
+ cleanup(() => input.removeListener('end', onInputUnavailable));
275
+ cleanup(() => input.removeListener('close', onInputUnavailable));
276
+ cleanup(() => signal?.removeEventListener('abort', onAbort));
277
+ cleanup(() => {
278
+ // A broken writer may keep the token forever, so detach the operation closure before releasing input.
279
+ promptWrite?.detachErrorHandler();
280
+ promptWrite = undefined;
281
+ });
282
+ cleanup(() => {
283
+ if (rawModeTouched)
284
+ input.setRawMode(originalRawMode);
285
+ });
286
+ cleanup(() => {
287
+ if (!wasFlowing)
288
+ input.pause();
289
+ });
290
+ cleanup(() => output.removeListener('error', onOutputError));
291
+ cleanup(() => {
292
+ if (promptStarted && hidden)
293
+ startOutputWrite(output, '\n');
294
+ });
295
+ value = '';
296
+ if (!operationFailed && cleanupError !== undefined)
297
+ throw cleanupError;
298
+ }
299
+ }
300
+ function startOutputWrite(output, text, onError = ignoreOutputError) {
301
+ const state = getOutputWriteState(output);
302
+ const pendingWrite = { onError };
303
+ const handle = {
304
+ detachErrorHandler: () => {
305
+ pendingWrite.onError = ignoreOutputError;
306
+ },
307
+ };
308
+ state.pending.add(pendingWrite);
309
+ try {
310
+ output.write(text, error => {
311
+ state.pending.delete(pendingWrite);
312
+ if (error) {
313
+ state.failed = true;
314
+ pendingWrite.onError(error);
315
+ if (state.pending.size === 0)
316
+ scheduleOutputStateRelease(output, state);
317
+ }
318
+ else if (state.pending.size === 0 && !state.failed) {
319
+ releaseOutputWriteState(output, state);
320
+ }
321
+ });
322
+ }
323
+ catch (error) {
324
+ state.pending.delete(pendingWrite);
325
+ if (state.pending.size === 0 && !state.failed)
326
+ releaseOutputWriteState(output, state);
327
+ throw error instanceof Error ? error : new Error(String(error));
328
+ }
329
+ return handle;
330
+ }
331
+ function scheduleOutputStateRelease(output, state) {
332
+ const immediate = setImmediate(() => {
333
+ if (state.pending.size === 0)
334
+ releaseOutputWriteState(output, state);
335
+ });
336
+ immediate.unref();
337
+ }
338
+ function getOutputWriteState(output) {
339
+ const existing = pendingOutputWrites.get(output);
340
+ if (existing)
341
+ return existing;
342
+ const state = {};
343
+ state.pending = new Set();
344
+ state.failed = false;
345
+ state.guard = error => {
346
+ for (const pendingWrite of state.pending)
347
+ pendingWrite.onError(error);
348
+ if (state.pending.size === 0)
349
+ releaseOutputWriteState(output, state);
350
+ };
351
+ state.onClose = () => releaseOutputWriteState(output, state);
352
+ pendingOutputWrites.set(output, state);
353
+ output.on('error', state.guard);
354
+ output.once('close', state.onClose);
355
+ return state;
356
+ }
357
+ function releaseOutputWriteState(output, state) {
358
+ if (pendingOutputWrites.get(output) !== state)
359
+ return;
360
+ pendingOutputWrites.delete(output);
361
+ state.pending.clear();
362
+ output.removeListener('error', state.guard);
363
+ output.removeListener('close', state.onClose);
364
+ }
365
+ function removeFinalGrapheme(value) {
366
+ return Array.from(graphemeSegmenter.segment(value), part => part.segment).slice(0, -1).join('');
367
+ }
368
+ function appendBoundedPrintable(value, appended, appendedWasTruncated) {
369
+ const codePoints = [];
370
+ let examinedCodePoints = 0;
371
+ let preprocessingWasTruncated = appendedWasTruncated;
372
+ inputSources: for (const source of [value, appended]) {
373
+ for (const character of source) {
374
+ if (examinedCodePoints === MAX_SECRET_INPUT_CODE_POINTS) {
375
+ preprocessingWasTruncated = true;
376
+ break inputSources;
377
+ }
378
+ codePoints.push(character);
379
+ examinedCodePoints += 1;
380
+ }
381
+ }
382
+ const graphemes = Array.from(graphemeSegmenter.segment(codePoints.join('')), part => part.segment);
383
+ if (preprocessingWasTruncated)
384
+ graphemes.pop();
385
+ return graphemes.slice(0, MAX_SECRET_INPUT_LENGTH).join('');
386
+ }
387
+ function drainBufferedInput(input) {
388
+ while (input.read() !== null) {
389
+ // Discard bytes entered before this prompt, including remainder from a multiline paste.
390
+ }
391
+ }
392
+ export function isCliInterruptedError(error) {
393
+ return error instanceof CliInterruptedError;
394
+ }
395
+ export function isCliInputError(error) {
396
+ return error instanceof CliInterruptedError
397
+ || error instanceof InteractionRequiredError
398
+ || error instanceof InvalidInputError
399
+ || error instanceof InputBusyError;
400
+ }
401
+ function throwIfAborted(signal) {
402
+ if (signal?.aborted)
403
+ throw abortReason(signal);
404
+ }
405
+ function abortReason(signal) {
406
+ return isCliInputError(signal.reason) ? signal.reason : new CliInterruptedError();
407
+ }
408
+ //# sourceMappingURL=secure-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-input.js","sourceRoot":"","sources":["../../src/cli/secure-input.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { getDataDir } from '../config/env.js';
2
- import { resolveAccountContext } from '../account/account-context.js';
2
+ import { resolveAccountContext, resolveAuthenticatedAccountContext } from '../account/account-context.js';
3
3
  import { renderResult } from '../cli/output.js';
4
4
  import { outputFormatConflict } from './types.js';
5
- export async function runWithAccountContext(options, handler) {
6
- const conflict = outputFormatConflict(options);
5
+ export async function runWithAccountContext(options, handler, command) {
6
+ const effectiveOptions = command == null ? options : mergeOptionsWithGlobals(command, options);
7
+ const conflict = outputFormatConflict(effectiveOptions);
7
8
  if (conflict) {
8
9
  await renderResult(conflict, { yaml: true });
9
10
  return;
@@ -11,23 +12,52 @@ export async function runWithAccountContext(options, handler) {
11
12
  let context;
12
13
  try {
13
14
  context = resolveAccountContext({
14
- explicitName: options.account,
15
+ explicitName: effectiveOptions.account,
15
16
  dataDir: getDataDir(),
16
17
  });
17
18
  }
18
19
  catch (error) {
19
- await renderResult(accountFailureFromError(error), options);
20
+ await renderResult(accountFailureFromError(error), effectiveOptions);
20
21
  return;
21
22
  }
22
23
  const result = await handler(context);
23
24
  if (result !== undefined) {
24
- await renderResult(result, options);
25
+ await renderResult(result, effectiveOptions);
25
26
  }
26
27
  }
28
+ export async function runWithAuthenticatedAccountContext(options, handler, command) {
29
+ const effectiveOptions = command == null ? options : mergeOptionsWithGlobals(command, options);
30
+ const conflict = outputFormatConflict(effectiveOptions);
31
+ if (conflict) {
32
+ await renderResult(conflict, { yaml: true });
33
+ return;
34
+ }
35
+ let context;
36
+ try {
37
+ context = resolveAuthenticatedAccountContext({
38
+ explicitName: effectiveOptions.account,
39
+ dataDir: getDataDir(),
40
+ });
41
+ }
42
+ catch (error) {
43
+ await renderResult(accountFailureFromError(error), effectiveOptions);
44
+ return;
45
+ }
46
+ const result = await handler(context);
47
+ if (result !== undefined) {
48
+ await renderResult(result, effectiveOptions);
49
+ }
50
+ }
51
+ function mergeOptionsWithGlobals(command, options) {
52
+ return {
53
+ ...command.optsWithGlobals(),
54
+ ...options,
55
+ };
56
+ }
27
57
  export function accountFailureFromError(error) {
28
58
  const message = error instanceof Error ? error.message : String(error);
29
59
  const [code, detail] = splitError(message);
30
- if (code === 'account_required' || code === 'account_not_found' || code === 'account_session_missing') {
60
+ if (code === 'account_required' || code === 'account_not_found' || code === 'account_logged_out' || code === 'account_session_missing') {
31
61
  return {
32
62
  ok: false,
33
63
  error: {
@@ -1 +1 @@
1
- {"version":3,"file":"account-options.js","sourceRoot":"","sources":["../../src/commands/account-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,oBAAoB,EAAwC,MAAM,YAAY,CAAA;AAMvF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAA8B,EAC9B,OAAkG;IAElG,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,IAAI,OAAuB,CAAA;IAC3B,IAAI,CAAC;QACH,OAAO,GAAG,qBAAqB,CAAC;YAC9B,YAAY,EAAE,OAAO,CAAC,OAAO;YAC7B,OAAO,EAAE,UAAU,EAAE;SACtB,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAA;QAC3D,OAAM;IACR,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IACrC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IAE1C,IAAI,IAAI,KAAK,kBAAkB,IAAI,IAAI,KAAK,mBAAmB,IAAI,IAAI,KAAK,yBAAyB,EAAE,CAAC;QACtG,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI;gBACJ,OAAO,EAAE,MAAM;aAChB;SACF,CAAA;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE;YACL,IAAI,EAAE,qBAAqB;YAC3B,OAAO;SACR;KACF,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,MAAM,SAAS,GAAG,IAAI,CAAA;IACtB,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACxC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IACtB,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;AAC3E,CAAC"}
1
+ {"version":3,"file":"account-options.js","sourceRoot":"","sources":["../../src/commands/account-options.ts"],"names":[],"mappings":"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"}