inbox-to-md 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +43 -0
- package/dist/ansi.d.ts +5 -0
- package/dist/ansi.js +13 -0
- package/dist/ansi.js.map +1 -0
- package/dist/archive.d.ts +2 -0
- package/dist/archive.js +175 -0
- package/dist/archive.js.map +1 -0
- package/dist/auth.d.ts +1 -0
- package/dist/auth.js +167 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +52 -0
- package/dist/cli.js.map +1 -0
- package/dist/compact.d.ts +3 -0
- package/dist/compact.js +211 -0
- package/dist/compact.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.js +79 -0
- package/dist/config.js.map +1 -0
- package/dist/imap.d.ts +7 -0
- package/dist/imap.js +38 -0
- package/dist/imap.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown.d.ts +18 -0
- package/dist/markdown.js +129 -0
- package/dist/markdown.js.map +1 -0
- package/dist/mime.d.ts +15 -0
- package/dist/mime.js +105 -0
- package/dist/mime.js.map +1 -0
- package/dist/prompts.d.ts +1 -0
- package/dist/prompts.js +11 -0
- package/dist/prompts.js.map +1 -0
- package/dist/ref-emails.d.ts +6 -0
- package/dist/ref-emails.js +16 -0
- package/dist/ref-emails.js.map +1 -0
- package/dist/sync.d.ts +10 -0
- package/dist/sync.js +296 -0
- package/dist/sync.js.map +1 -0
- package/dist/tui.d.ts +42 -0
- package/dist/tui.js +371 -0
- package/dist/tui.js.map +1 -0
- package/package.json +52 -0
package/dist/tui.js
ADDED
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
// Dependency-free terminal UI primitives, in the style of a promise-based
|
|
2
|
+
// prompt flow: raw-mode stdin is parsed into a queue of discrete key events,
|
|
3
|
+
// and each screen is an async function that awaits keys and redraws itself.
|
|
4
|
+
//
|
|
5
|
+
// Two primitives carry the whole UI:
|
|
6
|
+
// - pickFromMenu — vertical option list, arrow / numeric / enter.
|
|
7
|
+
// - runForm — multi-field form with up/down nav, esc-to-go-back, and an
|
|
8
|
+
// optional verify callback (red inline error on failure).
|
|
9
|
+
import { bold, dim, red } from './ansi.js';
|
|
10
|
+
const ESC = '\x1b[';
|
|
11
|
+
const CLEAR_SCREEN = `${ESC}2J${ESC}H`;
|
|
12
|
+
const HIDE_CURSOR = `${ESC}?25l`;
|
|
13
|
+
const SHOW_CURSOR = `${ESC}?25h`;
|
|
14
|
+
const keyQueue = [];
|
|
15
|
+
let keyWaiter = null;
|
|
16
|
+
let stdinHandler = null;
|
|
17
|
+
function parseKeys(s) {
|
|
18
|
+
const out = [];
|
|
19
|
+
let i = 0;
|
|
20
|
+
while (i < s.length) {
|
|
21
|
+
const c = s[i];
|
|
22
|
+
if (c === '\x1b' && s[i + 1] === '[' && i + 2 < s.length) {
|
|
23
|
+
// CSI sequence: \x1b[ <params> <final>. Consume parameter bytes so keys
|
|
24
|
+
// like Delete (\x1b[3~) or PageUp (\x1b[5~) don't leak their trailing
|
|
25
|
+
// bytes into the input as literal characters.
|
|
26
|
+
let j = i + 2;
|
|
27
|
+
while (j < s.length && /[0-9;]/.test(s[j]))
|
|
28
|
+
j++;
|
|
29
|
+
const final = s[j];
|
|
30
|
+
if (final === 'A')
|
|
31
|
+
out.push({ name: 'up' });
|
|
32
|
+
else if (final === 'B')
|
|
33
|
+
out.push({ name: 'down' });
|
|
34
|
+
else if (final === 'C')
|
|
35
|
+
out.push({ name: 'right' });
|
|
36
|
+
else if (final === 'D')
|
|
37
|
+
out.push({ name: 'left' });
|
|
38
|
+
i = j + 1;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (c === '\x1b' && s[i + 1] === 'O' && i + 2 < s.length) {
|
|
42
|
+
// SS3 arrows (\x1bOA…) — sent instead of CSI by terminals in
|
|
43
|
+
// "application cursor keys" mode; both forms must be handled.
|
|
44
|
+
const code = s[i + 2];
|
|
45
|
+
if (code === 'A')
|
|
46
|
+
out.push({ name: 'up' });
|
|
47
|
+
else if (code === 'B')
|
|
48
|
+
out.push({ name: 'down' });
|
|
49
|
+
else if (code === 'C')
|
|
50
|
+
out.push({ name: 'right' });
|
|
51
|
+
else if (code === 'D')
|
|
52
|
+
out.push({ name: 'left' });
|
|
53
|
+
i += 3;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (c === '\x1b') {
|
|
57
|
+
out.push({ name: 'escape' });
|
|
58
|
+
i++;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (c === '\r' || c === '\n') {
|
|
62
|
+
out.push({ name: 'enter' });
|
|
63
|
+
i++;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (c === '\x7f' || c === '\x08') {
|
|
67
|
+
out.push({ name: 'backspace' });
|
|
68
|
+
i++;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (c === '\x03') {
|
|
72
|
+
out.push({ name: 'ctrl-c' });
|
|
73
|
+
i++;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (c === '\x18') {
|
|
77
|
+
out.push({ name: 'ctrl-x' });
|
|
78
|
+
i++;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const code = c.charCodeAt(0);
|
|
82
|
+
if (code >= 0x20 && code !== 0x7f) {
|
|
83
|
+
out.push({ name: 'char', ch: c });
|
|
84
|
+
i++;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
i++;
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
function pumpData(chunk) {
|
|
92
|
+
const s = typeof chunk === 'string' ? chunk : chunk.toString('utf8');
|
|
93
|
+
for (const k of parseKeys(s))
|
|
94
|
+
keyQueue.push(k);
|
|
95
|
+
while (keyWaiter && keyQueue.length > 0) {
|
|
96
|
+
const w = keyWaiter;
|
|
97
|
+
keyWaiter = null;
|
|
98
|
+
w(keyQueue.shift());
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function readKey() {
|
|
102
|
+
return new Promise((resolve) => {
|
|
103
|
+
if (keyQueue.length > 0)
|
|
104
|
+
return resolve(keyQueue.shift());
|
|
105
|
+
keyWaiter = resolve;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// ── Terminal lifecycle ────────────────────────────────────────────────────
|
|
109
|
+
//
|
|
110
|
+
// Raw mode must be undone no matter how the process ends — a crash that
|
|
111
|
+
// leaves the terminal raw and cursorless makes the user's shell unusable.
|
|
112
|
+
// restoreTerminal is idempotent and registered on exit/SIGINT/SIGTERM.
|
|
113
|
+
let tuiActive = false;
|
|
114
|
+
function restoreTerminal() {
|
|
115
|
+
if (!tuiActive)
|
|
116
|
+
return;
|
|
117
|
+
tuiActive = false;
|
|
118
|
+
if (process.stdin.isTTY)
|
|
119
|
+
process.stdin.setRawMode(false);
|
|
120
|
+
process.stdout.write(SHOW_CURSOR);
|
|
121
|
+
}
|
|
122
|
+
export function enterTui() {
|
|
123
|
+
if (tuiActive)
|
|
124
|
+
return;
|
|
125
|
+
tuiActive = true;
|
|
126
|
+
process.stdin.setRawMode(true);
|
|
127
|
+
process.stdin.resume();
|
|
128
|
+
stdinHandler = pumpData;
|
|
129
|
+
process.stdin.on('data', stdinHandler);
|
|
130
|
+
process.stdout.write(HIDE_CURSOR);
|
|
131
|
+
process.on('exit', restoreTerminal);
|
|
132
|
+
// In raw mode Ctrl+C arrives as \x03 (handled in the key loop), but an
|
|
133
|
+
// external kill still delivers these signals — restore before dying.
|
|
134
|
+
process.on('SIGINT', () => { restoreTerminal(); process.exit(130); });
|
|
135
|
+
process.on('SIGTERM', () => { restoreTerminal(); process.exit(143); });
|
|
136
|
+
}
|
|
137
|
+
export function exitTui() {
|
|
138
|
+
restoreTerminal();
|
|
139
|
+
if (stdinHandler) {
|
|
140
|
+
process.stdin.removeListener('data', stdinHandler);
|
|
141
|
+
stdinHandler = null;
|
|
142
|
+
}
|
|
143
|
+
process.stdin.pause();
|
|
144
|
+
process.stdout.write(CLEAR_SCREEN);
|
|
145
|
+
}
|
|
146
|
+
function exitOnCtrlC() {
|
|
147
|
+
restoreTerminal();
|
|
148
|
+
process.stdout.write('\n');
|
|
149
|
+
process.exit(130);
|
|
150
|
+
}
|
|
151
|
+
// ── Header ────────────────────────────────────────────────────────────────
|
|
152
|
+
function renderHeader() {
|
|
153
|
+
return `${bold('inbox-to-md')}\n${dim('Sync IMAP inboxes to markdown files.')}\n\n`;
|
|
154
|
+
}
|
|
155
|
+
function renderMenu(title, options, selected, footer) {
|
|
156
|
+
let out = CLEAR_SCREEN;
|
|
157
|
+
out += renderHeader();
|
|
158
|
+
out += `${title}\n`;
|
|
159
|
+
for (let i = 0; i < options.length; i++) {
|
|
160
|
+
const cursor = i === selected ? '>' : ' ';
|
|
161
|
+
const label = `${cursor} [${i + 1}] ${options[i].label}`;
|
|
162
|
+
out += (i === selected ? bold(label) : label) + '\n';
|
|
163
|
+
}
|
|
164
|
+
if (footer)
|
|
165
|
+
out += '\n' + dim(footer) + '\n';
|
|
166
|
+
return out;
|
|
167
|
+
}
|
|
168
|
+
export async function pickFromMenu(title, options, footer = null, opts = {}) {
|
|
169
|
+
let selected = 0;
|
|
170
|
+
process.stdout.write(renderMenu(title, options, selected, footer));
|
|
171
|
+
while (true) {
|
|
172
|
+
const key = await readKey();
|
|
173
|
+
if (key.name === 'ctrl-c')
|
|
174
|
+
exitOnCtrlC();
|
|
175
|
+
if (key.name === 'escape')
|
|
176
|
+
return { kind: 'escape' };
|
|
177
|
+
if (key.name === 'up') {
|
|
178
|
+
selected = (selected - 1 + options.length) % options.length;
|
|
179
|
+
}
|
|
180
|
+
else if (key.name === 'down') {
|
|
181
|
+
selected = (selected + 1) % options.length;
|
|
182
|
+
}
|
|
183
|
+
else if (key.name === 'char' && /^[1-9]$/.test(key.ch)) {
|
|
184
|
+
const idx = parseInt(key.ch, 10) - 1;
|
|
185
|
+
if (idx >= 0 && idx < options.length)
|
|
186
|
+
return { kind: 'pick', value: options[idx].value };
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
else if (key.name === 'enter') {
|
|
190
|
+
return { kind: 'pick', value: options[selected].value };
|
|
191
|
+
}
|
|
192
|
+
else if (key.name === 'ctrl-x' && opts.enableCtrlX) {
|
|
193
|
+
return { kind: 'ctrl-x', value: options[selected].value };
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
process.stdout.write(renderMenu(title, options, selected, footer));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const CURSOR_BLOCK = '█';
|
|
202
|
+
// The block marker is one terminal cell, so it can be appended to display
|
|
203
|
+
// strings without re-running width math. Only added on the focused field so
|
|
204
|
+
// the user can see exactly where the next keystroke will land.
|
|
205
|
+
function fieldValueDisplay(f, focused) {
|
|
206
|
+
if (f.kind === 'secret')
|
|
207
|
+
return '*'.repeat(f.value.length) + (focused ? CURSOR_BLOCK : '');
|
|
208
|
+
if (f.kind === 'select') {
|
|
209
|
+
const opts = f.options || [];
|
|
210
|
+
const current = f.value || opts[0] || '';
|
|
211
|
+
return focused ? `< ${current} >` : current;
|
|
212
|
+
}
|
|
213
|
+
return f.value + (focused ? CURSOR_BLOCK : '');
|
|
214
|
+
}
|
|
215
|
+
function renderForm(spec, focused, errorLine, status) {
|
|
216
|
+
let out = CLEAR_SCREEN;
|
|
217
|
+
out += renderHeader();
|
|
218
|
+
out += `${spec.title}\n`;
|
|
219
|
+
out += '\n';
|
|
220
|
+
// Align all value columns to the widest label so the form reads like a
|
|
221
|
+
// table. Width is computed on the raw text (no ANSI) — bold codes are
|
|
222
|
+
// applied after padding so they don't throw off the math.
|
|
223
|
+
const labelWidth = spec.fields.reduce((w, f) => Math.max(w, ` ${f.label}:`.length), 0);
|
|
224
|
+
for (let i = 0; i < spec.fields.length; i++) {
|
|
225
|
+
const f = spec.fields[i];
|
|
226
|
+
const isFocus = i === focused;
|
|
227
|
+
const cursor = isFocus ? '>' : ' ';
|
|
228
|
+
const labelStr = `${cursor} ${f.label}:`;
|
|
229
|
+
const labelOut = isFocus ? bold(labelStr) : labelStr;
|
|
230
|
+
const padding = ' '.repeat(Math.max(0, labelWidth - labelStr.length));
|
|
231
|
+
out += labelOut + padding + ' ' + fieldValueDisplay(f, isFocus) + '\n';
|
|
232
|
+
if (f.hint)
|
|
233
|
+
out += ' '.repeat(labelWidth + 2) + dim(f.hint) + '\n';
|
|
234
|
+
}
|
|
235
|
+
if (spec.submitLabel !== '') {
|
|
236
|
+
out += '\n';
|
|
237
|
+
const isFocus = focused === spec.fields.length;
|
|
238
|
+
const cursor = isFocus ? '>' : ' ';
|
|
239
|
+
const labelStr = `${cursor} [ ${spec.submitLabel || 'Save'} ]`;
|
|
240
|
+
out += (isFocus ? bold(labelStr) : labelStr) + '\n';
|
|
241
|
+
}
|
|
242
|
+
if (spec.hint)
|
|
243
|
+
out += '\n' + dim(spec.hint) + '\n';
|
|
244
|
+
if (status)
|
|
245
|
+
out += '\n' + status + '\n';
|
|
246
|
+
if (errorLine)
|
|
247
|
+
out += '\n' + red(errorLine) + '\n';
|
|
248
|
+
return out;
|
|
249
|
+
}
|
|
250
|
+
// Multi-field form runner. Up/Down moves between fields (and the Save row
|
|
251
|
+
// when present). Enter on a field advances to the next, or submits when the
|
|
252
|
+
// form is Save-less or every field is already filled. Left/Right cycles
|
|
253
|
+
// select options. Esc returns 'back' without saving.
|
|
254
|
+
export async function runForm(spec) {
|
|
255
|
+
// Init select fields with their first option if the caller left value blank.
|
|
256
|
+
for (const f of spec.fields) {
|
|
257
|
+
if (f.kind === 'select' && !f.value && f.options && f.options.length > 0) {
|
|
258
|
+
f.value = f.options[0];
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const rowCount = spec.fields.length + (spec.submitLabel === '' ? 0 : 1);
|
|
262
|
+
const saveRow = spec.fields.length; // index of Save row, even if hidden
|
|
263
|
+
let focused = 0;
|
|
264
|
+
let errorLine = null;
|
|
265
|
+
let status = null;
|
|
266
|
+
const draw = () => {
|
|
267
|
+
process.stdout.write(renderForm(spec, focused, errorLine, status));
|
|
268
|
+
};
|
|
269
|
+
draw();
|
|
270
|
+
const collect = () => {
|
|
271
|
+
const out = {};
|
|
272
|
+
for (const f of spec.fields)
|
|
273
|
+
out[f.key] = f.value;
|
|
274
|
+
return out;
|
|
275
|
+
};
|
|
276
|
+
const trySubmit = async () => {
|
|
277
|
+
if (!spec.verify)
|
|
278
|
+
return collect();
|
|
279
|
+
status = dim('Verifying…');
|
|
280
|
+
errorLine = null;
|
|
281
|
+
draw();
|
|
282
|
+
const err = await spec.verify(collect());
|
|
283
|
+
status = null;
|
|
284
|
+
if (err === null)
|
|
285
|
+
return collect();
|
|
286
|
+
errorLine = err;
|
|
287
|
+
// Clear secret fields so they don't show an old, wrong asterisk count.
|
|
288
|
+
for (const f of spec.fields)
|
|
289
|
+
if (f.kind === 'secret')
|
|
290
|
+
f.value = '';
|
|
291
|
+
draw();
|
|
292
|
+
return null;
|
|
293
|
+
};
|
|
294
|
+
const allFieldsFilled = () => spec.fields.every((f) => (f.kind === 'select' ? !!f.value : f.value.trim() !== ''));
|
|
295
|
+
while (true) {
|
|
296
|
+
const key = await readKey();
|
|
297
|
+
if (key.name === 'ctrl-c')
|
|
298
|
+
exitOnCtrlC();
|
|
299
|
+
if (key.name === 'escape')
|
|
300
|
+
return 'back';
|
|
301
|
+
const onSave = focused === saveRow && spec.submitLabel !== '';
|
|
302
|
+
const field = focused < spec.fields.length ? spec.fields[focused] : null;
|
|
303
|
+
if (key.name === 'up') {
|
|
304
|
+
focused = (focused - 1 + rowCount) % rowCount;
|
|
305
|
+
draw();
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
if (key.name === 'down') {
|
|
309
|
+
focused = (focused + 1) % rowCount;
|
|
310
|
+
draw();
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (onSave) {
|
|
314
|
+
if (key.name === 'enter') {
|
|
315
|
+
const submitted = await trySubmit();
|
|
316
|
+
if (submitted)
|
|
317
|
+
return submitted;
|
|
318
|
+
}
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
if (!field)
|
|
322
|
+
continue;
|
|
323
|
+
if (key.name === 'enter') {
|
|
324
|
+
if (spec.submitLabel === '' || allFieldsFilled()) {
|
|
325
|
+
// Save-less form: Enter saves from any field (move with ↑/↓). With a
|
|
326
|
+
// Save row, Enter still submits once every field has a value so the
|
|
327
|
+
// user doesn't have to navigate down past every input.
|
|
328
|
+
const submitted = await trySubmit();
|
|
329
|
+
if (submitted)
|
|
330
|
+
return submitted;
|
|
331
|
+
}
|
|
332
|
+
else if (focused < spec.fields.length - 1) {
|
|
333
|
+
focused += 1;
|
|
334
|
+
draw();
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
focused = saveRow;
|
|
338
|
+
draw();
|
|
339
|
+
}
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
if (key.name === 'left' || key.name === 'right') {
|
|
343
|
+
if (field.kind === 'select' && field.options && field.options.length > 0) {
|
|
344
|
+
const idx = field.options.indexOf(field.value);
|
|
345
|
+
const step = key.name === 'right' ? 1 : -1;
|
|
346
|
+
const next = (idx + step + field.options.length) % field.options.length;
|
|
347
|
+
field.value = field.options[next];
|
|
348
|
+
draw();
|
|
349
|
+
}
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
if (key.name === 'backspace') {
|
|
353
|
+
if (field.kind === 'select')
|
|
354
|
+
continue;
|
|
355
|
+
if (field.value.length > 0)
|
|
356
|
+
field.value = field.value.slice(0, -1);
|
|
357
|
+
draw();
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
if (key.name === 'char') {
|
|
361
|
+
if (field.kind === 'select')
|
|
362
|
+
continue;
|
|
363
|
+
if (field.kind === 'number' && !/[0-9]/.test(key.ch))
|
|
364
|
+
continue;
|
|
365
|
+
field.value += key.ch;
|
|
366
|
+
draw();
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=tui.js.map
|
package/dist/tui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "inbox-to-md",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Sync IMAP inboxes to Markdown files — one file per email, with YAML frontmatter",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"inbox-to-md": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=20"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"imap",
|
|
17
|
+
"email",
|
|
18
|
+
"markdown",
|
|
19
|
+
"inbox",
|
|
20
|
+
"sync",
|
|
21
|
+
"cli"
|
|
22
|
+
],
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "git+https://github.com/chaidhat/inbox-to-md.git"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://github.com/chaidhat/inbox-to-md#readme",
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/chaidhat/inbox-to-md/issues"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsc",
|
|
33
|
+
"prepublishOnly": "npm run build",
|
|
34
|
+
"auth": "tsx src/auth.ts",
|
|
35
|
+
"dev": "tsx src/index.ts",
|
|
36
|
+
"start": "tsx src/index.ts",
|
|
37
|
+
"archive": "tsx src/archive.ts",
|
|
38
|
+
"compact": "tsx src/compact.ts"
|
|
39
|
+
},
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^26.1.1",
|
|
43
|
+
"@types/turndown": "^5.0.6",
|
|
44
|
+
"tsx": "^4.19.0",
|
|
45
|
+
"typescript": "^5.5.0"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@anthropic-ai/claude-agent-sdk": "^0.3.211",
|
|
49
|
+
"imapflow": "^1.4.7",
|
|
50
|
+
"turndown": "^7.2.4"
|
|
51
|
+
}
|
|
52
|
+
}
|