agent-termo 1.0.1 → 1.0.2

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 (65) hide show
  1. package/README.md +27 -2
  2. package/dist/agents/index.d.ts +5 -0
  3. package/dist/agents/index.d.ts.map +1 -0
  4. package/dist/agents/index.js +86 -0
  5. package/dist/agents/index.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +97 -168
  9. package/dist/cli.js.map +4 -4
  10. package/dist/diff/index.d.ts +9 -0
  11. package/dist/diff/index.d.ts.map +1 -0
  12. package/dist/diff/index.js +213 -0
  13. package/dist/diff/index.js.map +1 -0
  14. package/dist/llm/client.d.ts +39 -0
  15. package/dist/llm/client.d.ts.map +1 -0
  16. package/dist/llm/client.js +188 -0
  17. package/dist/llm/client.js.map +1 -0
  18. package/dist/llm/models.d.ts +19 -0
  19. package/dist/llm/models.d.ts.map +1 -0
  20. package/dist/llm/models.js +45 -0
  21. package/dist/llm/models.js.map +1 -0
  22. package/dist/llm/tools.d.ts +3 -0
  23. package/dist/llm/tools.d.ts.map +1 -0
  24. package/dist/llm/tools.js +204 -0
  25. package/dist/llm/tools.js.map +1 -0
  26. package/dist/main.d.ts +2 -0
  27. package/dist/main.d.ts.map +1 -0
  28. package/dist/main.js +91 -140
  29. package/dist/main.js.map +4 -4
  30. package/dist/memory/index.d.ts +10 -0
  31. package/dist/memory/index.d.ts.map +1 -0
  32. package/dist/memory/index.js +117 -0
  33. package/dist/memory/index.js.map +1 -0
  34. package/dist/tools/index.d.ts +5 -0
  35. package/dist/tools/index.d.ts.map +1 -0
  36. package/dist/tools/index.js +334 -0
  37. package/dist/tools/index.js.map +1 -0
  38. package/dist/types/index.d.ts +119 -0
  39. package/dist/types/index.d.ts.map +1 -0
  40. package/dist/types/index.js +5 -0
  41. package/dist/types/index.js.map +1 -0
  42. package/dist/ui/index.d.ts +47 -0
  43. package/dist/ui/index.d.ts.map +1 -0
  44. package/dist/ui/index.js +321 -0
  45. package/dist/ui/index.js.map +1 -0
  46. package/dist/ui/screen.d.ts +59 -0
  47. package/dist/ui/screen.d.ts.map +1 -0
  48. package/dist/ui/screen.js +629 -0
  49. package/dist/ui/screen.js.map +1 -0
  50. package/dist/utils/ansi.d.ts +62 -0
  51. package/dist/utils/ansi.d.ts.map +1 -0
  52. package/dist/utils/ansi.js +116 -0
  53. package/dist/utils/ansi.js.map +1 -0
  54. package/dist/utils/config.d.ts +9 -0
  55. package/dist/utils/config.d.ts.map +1 -0
  56. package/dist/utils/config.js +120 -0
  57. package/dist/utils/config.js.map +1 -0
  58. package/package.json +1 -1
  59. package/src/cli.ts +1 -1
  60. package/src/llm/client.ts +24 -0
  61. package/src/llm/models.ts +55 -0
  62. package/src/main.ts +201 -75
  63. package/src/ui/index.ts +256 -389
  64. package/src/ui/screen.ts +698 -0
  65. package/src/utils/config.ts +37 -20
@@ -0,0 +1,629 @@
1
+ // =============================================================================
2
+ // Screen layout + raw keyboard input
3
+ //
4
+ // Claude Code-style layout: output scrolls in a region at the top of the
5
+ // terminal while a bordered input box and a status line stay pinned to the
6
+ // bottom. Implemented with a DECSTBM scroll region, so every console.log /
7
+ // process.stdout.write elsewhere in the app lands in the scrolling region.
8
+ // =============================================================================
9
+ import Chalk from 'chalk';
10
+ import { createInterface } from 'node:readline';
11
+ const c = Chalk;
12
+ const out = process.stdout;
13
+ const CSI = '\x1b[';
14
+ const SAVE = '\x1b7'; // DECSC — save cursor
15
+ const RESTORE = '\x1b8'; // DECRC — restore cursor
16
+ /** Rows pinned to the bottom: top border, input row, bottom border, status row. */
17
+ const CHROME_ROWS = 4;
18
+ const MIN_ROWS = 12;
19
+ const MIN_COLS = 40;
20
+ const PLACEHOLDER = 'Ask anything… or type / for commands';
21
+ const S = {
22
+ active: false,
23
+ editing: false,
24
+ /** False when the output position saved at the start of editing is stale (resize). */
25
+ savedValid: true,
26
+ rows: 0,
27
+ model: '',
28
+ project: '',
29
+ commands: [],
30
+ buffer: '',
31
+ cursor: 0,
32
+ offset: 0,
33
+ };
34
+ export function setCommands(commands) {
35
+ S.commands = commands;
36
+ }
37
+ function dims() {
38
+ return { rows: out.rows || 24, cols: out.columns || 80 };
39
+ }
40
+ export function terminalWidth() {
41
+ return out.columns || 80;
42
+ }
43
+ export function clipText(text, max) {
44
+ if (max <= 0)
45
+ return '';
46
+ return text.length <= max ? text : text.slice(0, Math.max(0, max - 1)) + '…';
47
+ }
48
+ function shortPath(p) {
49
+ const home = process.env.HOME || process.env.USERPROFILE || '';
50
+ return home && p.startsWith(home) ? '~' + p.slice(home.length) : p;
51
+ }
52
+ export function layoutSupported() {
53
+ return Boolean(out.isTTY && process.stdin.isTTY && (out.rows ?? 0) >= MIN_ROWS && (out.columns ?? 0) >= MIN_COLS);
54
+ }
55
+ // =============================================================================
56
+ // Bottom chrome (input box + status line)
57
+ // =============================================================================
58
+ function statusLine(max) {
59
+ // While typing a slash command, the status line shows matching commands.
60
+ if (S.editing && S.buffer.startsWith('/') && !S.buffer.includes(' ')) {
61
+ const typed = S.buffer.toLowerCase();
62
+ const hits = S.commands.filter((cmd) => cmd.name.startsWith(typed));
63
+ const only = hits[0];
64
+ if (hits.length === 1 && only) {
65
+ return ' ' + c.cyan(only.name) + c.dim(clipText(' — ' + only.description, max - only.name.length - 1));
66
+ }
67
+ if (hits.length > 1) {
68
+ return c.cyan(clipText(' ' + hits.map((h) => h.name).join(' '), max));
69
+ }
70
+ }
71
+ const hint = '/help · /model · ctrl+c to exit';
72
+ const modelPart = clipText(' ' + S.model, max);
73
+ const roomWithHint = max - modelPart.length - hint.length - 2;
74
+ const showHint = roomWithHint >= 15;
75
+ const projPart = clipText(' · ' + shortPath(S.project), showHint ? roomWithHint : Math.max(0, max - modelPart.length));
76
+ const gap = Math.max(1, max - modelPart.length - projPart.length - hint.length);
77
+ return c.cyan(modelPart) + c.dim(projPart + (showHint ? ' '.repeat(gap) + hint : ''));
78
+ }
79
+ function chromeString() {
80
+ const { rows, cols } = dims();
81
+ const width = Math.max(1, cols - 6); // '│ ❯ ' + text + ' │'
82
+ // Keep the cursor inside the visible window of the input line.
83
+ S.offset = Math.min(S.offset, Math.max(0, S.buffer.length - width + 1));
84
+ if (S.cursor < S.offset)
85
+ S.offset = S.cursor;
86
+ if (S.cursor > S.offset + width - 1)
87
+ S.offset = S.cursor - width + 1;
88
+ const edge = S.editing ? c.magenta : c.dim;
89
+ const body = S.buffer
90
+ ? S.buffer.slice(S.offset, S.offset + width).padEnd(width)
91
+ : c.dim(clipText(PLACEHOLDER, width).padEnd(width));
92
+ const top = rows - 3;
93
+ const line = (row, text) => `${CSI}${row};1H${CSI}2K${text}`;
94
+ return [
95
+ line(top, edge('╭' + '─'.repeat(cols - 2) + '╮')),
96
+ line(top + 1, edge('│') + ' ' + c.magenta.bold('❯') + ' ' + body + ' ' + edge('│')),
97
+ line(top + 2, edge('╰' + '─'.repeat(cols - 2) + '╯')),
98
+ line(rows, statusLine(cols - 1)),
99
+ ].join('');
100
+ }
101
+ function inputCursor() {
102
+ const { rows } = dims();
103
+ return `${CSI}${rows - 2};${5 + S.cursor - S.offset}H`;
104
+ }
105
+ function paint() {
106
+ if (!S.active)
107
+ return;
108
+ if (S.editing) {
109
+ // The saved slot holds the output position while editing: don't touch it.
110
+ out.write(CSI + '?25l' + chromeString() + inputCursor() + CSI + '?25h');
111
+ }
112
+ else {
113
+ out.write(SAVE + chromeString() + RESTORE);
114
+ }
115
+ }
116
+ function regionBottom() {
117
+ return Math.max(1, dims().rows - CHROME_ROWS);
118
+ }
119
+ function applyRegion() {
120
+ out.write(`${CSI}1;${regionBottom()}r`); // also homes the cursor
121
+ }
122
+ function onResize() {
123
+ const { rows } = dims();
124
+ if (rows === S.rows) {
125
+ paint();
126
+ return;
127
+ }
128
+ // Height changed: old chrome rows are stale, so start from a clean screen.
129
+ S.rows = rows;
130
+ S.savedValid = false;
131
+ out.write(`${CSI}2J${CSI}H`);
132
+ applyRegion();
133
+ out.write(chromeString() + `${CSI}${regionBottom()};1H`);
134
+ if (S.editing)
135
+ paint();
136
+ }
137
+ // =============================================================================
138
+ // Screen lifecycle
139
+ // =============================================================================
140
+ export function initScreen(info) {
141
+ S.model = info.model;
142
+ S.project = info.project;
143
+ if (S.active || !layoutSupported())
144
+ return;
145
+ S.active = true;
146
+ S.rows = dims().rows;
147
+ out.write(`${CSI}2J${CSI}H`);
148
+ applyRegion();
149
+ out.write(chromeString() + `${CSI}1;1H`);
150
+ out.on('resize', onResize);
151
+ process.on('exit', teardownScreen);
152
+ }
153
+ export function setScreenStatus(info) {
154
+ if (info.model !== undefined)
155
+ S.model = info.model;
156
+ if (info.project !== undefined)
157
+ S.project = info.project;
158
+ paint();
159
+ }
160
+ /** Clear everything and start output again from the top (used by /clear). */
161
+ export function resetScreen() {
162
+ out.write(`${CSI}2J${CSI}H`);
163
+ if (!S.active)
164
+ return;
165
+ applyRegion();
166
+ out.write(chromeString() + `${CSI}1;1H`);
167
+ }
168
+ export function teardownScreen() {
169
+ if (!S.active)
170
+ return;
171
+ S.active = false;
172
+ const { rows } = dims();
173
+ const first = Math.max(1, rows - CHROME_ROWS + 1);
174
+ let wipe = '';
175
+ for (let r = first; r <= rows; r++)
176
+ wipe += `${CSI}${r};1H${CSI}2K`;
177
+ // Leave the shell prompt right after the last output line.
178
+ const head = S.editing ? '' : SAVE;
179
+ const back = S.editing && !S.savedValid ? `${CSI}${first};1H` : RESTORE;
180
+ out.write(head + CSI + 'r' + wipe + back + CSI + '?25h' + CSI + '?2004l');
181
+ }
182
+ // eslint-disable-next-line no-control-regex
183
+ const TOKEN_RE = /\x1b\[200~|\x1b\[201~|\x1b\[[0-9;?]*[ -/]*[@-~]|\x1bO[A-Za-z]|\x1b[\s\S]|[\s\S]/gu;
184
+ const NAMED = {
185
+ '\r': 'enter',
186
+ '\n': 'enter',
187
+ '\x03': 'ctrl+c',
188
+ '\x04': 'ctrl+d',
189
+ '\x7f': 'backspace',
190
+ '\b': 'backspace',
191
+ '\t': 'tab',
192
+ '\x1b': 'escape',
193
+ '\x01': 'home',
194
+ '\x05': 'end',
195
+ '\x15': 'ctrl+u',
196
+ '\x0b': 'ctrl+k',
197
+ '\x17': 'ctrl+w',
198
+ '\x0c': 'ctrl+l',
199
+ '\x1b[A': 'up',
200
+ '\x1bOA': 'up',
201
+ '\x1b[B': 'down',
202
+ '\x1bOB': 'down',
203
+ '\x1b[C': 'right',
204
+ '\x1bOC': 'right',
205
+ '\x1b[D': 'left',
206
+ '\x1bOD': 'left',
207
+ '\x1b[H': 'home',
208
+ '\x1bOH': 'home',
209
+ '\x1b[1~': 'home',
210
+ '\x1b[F': 'end',
211
+ '\x1bOF': 'end',
212
+ '\x1b[4~': 'end',
213
+ '\x1b[3~': 'delete',
214
+ '\x1b[5~': 'pageup',
215
+ '\x1b[6~': 'pagedown',
216
+ '\x1b[1;5D': 'word-left',
217
+ '\x1b[1;3D': 'word-left',
218
+ '\x1bb': 'word-left',
219
+ '\x1b[1;5C': 'word-right',
220
+ '\x1b[1;3C': 'word-right',
221
+ '\x1bf': 'word-right',
222
+ '\x1b\x7f': 'ctrl+w',
223
+ };
224
+ /**
225
+ * Split a stdin chunk into keys. Consecutive printable characters are merged
226
+ * into one `text` key, and bracketed pastes arrive as a single `paste` key.
227
+ * `state.paste` carries an unfinished paste across chunks.
228
+ */
229
+ export function parseKeys(chunk, state) {
230
+ const keys = [];
231
+ let run = '';
232
+ const flush = () => {
233
+ if (run)
234
+ keys.push({ name: 'text', text: run });
235
+ run = '';
236
+ };
237
+ for (const tok of chunk.match(TOKEN_RE) ?? []) {
238
+ if (tok === '\x1b[200~') {
239
+ flush();
240
+ state.paste = '';
241
+ continue;
242
+ }
243
+ if (tok === '\x1b[201~') {
244
+ flush();
245
+ if (state.paste !== null)
246
+ keys.push({ name: 'paste', text: state.paste });
247
+ state.paste = null;
248
+ continue;
249
+ }
250
+ if (state.paste !== null) {
251
+ state.paste += tok;
252
+ continue;
253
+ }
254
+ const named = NAMED[tok];
255
+ if (named) {
256
+ flush();
257
+ keys.push({ name: named });
258
+ }
259
+ else if ((tok.codePointAt(0) ?? 0) >= 0x20 && !tok.startsWith('\x1b') && tok !== '\x7f') {
260
+ run += tok;
261
+ }
262
+ else {
263
+ flush();
264
+ keys.push({ name: 'unknown' });
265
+ }
266
+ }
267
+ flush();
268
+ return keys;
269
+ }
270
+ /**
271
+ * Put stdin in raw mode and call `handler` for every key until the returned
272
+ * function is called, which restores the terminal.
273
+ */
274
+ export function listenKeys(handler) {
275
+ const stdin = process.stdin;
276
+ const state = { paste: null };
277
+ const onData = (chunk) => {
278
+ for (const key of parseKeys(chunk.toString(), state))
279
+ handler(key);
280
+ };
281
+ stdin.setRawMode?.(true);
282
+ stdin.resume();
283
+ stdin.setEncoding('utf8');
284
+ if (out.isTTY)
285
+ out.write(`${CSI}?2004h`); // bracketed paste
286
+ stdin.on('data', onData);
287
+ return () => {
288
+ stdin.off('data', onData);
289
+ if (out.isTTY)
290
+ out.write(`${CSI}?2004l`);
291
+ stdin.setRawMode?.(false);
292
+ stdin.pause();
293
+ };
294
+ }
295
+ // =============================================================================
296
+ // Line editor
297
+ // =============================================================================
298
+ function wordLeft(s, from) {
299
+ let i = from;
300
+ while (i > 0 && s[i - 1] === ' ')
301
+ i--;
302
+ while (i > 0 && s[i - 1] !== ' ')
303
+ i--;
304
+ return i;
305
+ }
306
+ function wordRight(s, from) {
307
+ let i = from;
308
+ while (i < s.length && s[i] === ' ')
309
+ i++;
310
+ while (i < s.length && s[i] !== ' ')
311
+ i++;
312
+ return i;
313
+ }
314
+ /** Pasted text is kept on one line: newlines become spaces, controls are dropped. */
315
+ function sanitizePaste(text) {
316
+ return [...text.replace(/\r\n|\r|\n/g, ' ').replace(/\t/g, ' ')]
317
+ .filter((ch) => (ch.codePointAt(0) ?? 0) >= 0x20 && ch !== '\x7f')
318
+ .join('');
319
+ }
320
+ function completeCommand() {
321
+ if (!S.buffer.startsWith('/') || S.buffer.includes(' '))
322
+ return;
323
+ const typed = S.buffer.toLowerCase();
324
+ const names = S.commands.map((cmd) => cmd.name).filter((n) => n.startsWith(typed));
325
+ const first = names[0];
326
+ if (!first)
327
+ return;
328
+ let prefix = first;
329
+ for (const n of names)
330
+ while (!n.startsWith(prefix))
331
+ prefix = prefix.slice(0, -1);
332
+ S.buffer = prefix;
333
+ S.cursor = prefix.length;
334
+ }
335
+ /** Cooked-mode fallback for non-TTY stdin and terminals too small for the layout. */
336
+ function plainQuestion() {
337
+ return new Promise((resolve) => {
338
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
339
+ rl.once('close', () => resolve('/exit'));
340
+ rl.question('> ', (answer) => {
341
+ rl.removeAllListeners('close');
342
+ rl.close();
343
+ resolve(answer.trim());
344
+ });
345
+ });
346
+ }
347
+ export function createInput() {
348
+ const history = [];
349
+ let stop = null;
350
+ return {
351
+ question() {
352
+ if (!S.active)
353
+ return plainQuestion();
354
+ return new Promise((resolve) => {
355
+ let histIdx = -1;
356
+ let draft = '';
357
+ let done = false;
358
+ S.editing = true;
359
+ S.savedValid = true;
360
+ S.buffer = '';
361
+ S.cursor = 0;
362
+ S.offset = 0;
363
+ out.write(SAVE); // remember where output continues
364
+ paint();
365
+ // Return the cursor to the scrolling region and go idle.
366
+ const leave = () => {
367
+ done = true;
368
+ stop?.();
369
+ stop = null;
370
+ S.editing = false;
371
+ S.buffer = '';
372
+ S.cursor = 0;
373
+ S.offset = 0;
374
+ out.write(S.savedValid ? RESTORE : `${CSI}${regionBottom()};1H`);
375
+ paint();
376
+ };
377
+ const quit = () => {
378
+ leave();
379
+ process.emit('SIGINT'); // lets the REPL print its session summary
380
+ process.exit(0);
381
+ };
382
+ const set = (text, cursor) => {
383
+ S.buffer = text;
384
+ S.cursor = cursor;
385
+ paint();
386
+ };
387
+ stop = listenKeys((key) => {
388
+ if (done)
389
+ return;
390
+ const { buffer, cursor } = S;
391
+ switch (key.name) {
392
+ case 'enter': {
393
+ const line = buffer.trim();
394
+ if (line && history[0] !== line)
395
+ history.unshift(line);
396
+ if (history.length > 100)
397
+ history.pop();
398
+ leave();
399
+ resolve(line);
400
+ return;
401
+ }
402
+ case 'ctrl+c':
403
+ if (buffer) {
404
+ histIdx = -1;
405
+ set('', 0);
406
+ }
407
+ else {
408
+ quit();
409
+ }
410
+ return;
411
+ case 'ctrl+d':
412
+ if (!buffer)
413
+ quit();
414
+ else
415
+ set(buffer.slice(0, cursor) + buffer.slice(cursor + 1), cursor);
416
+ return;
417
+ case 'backspace':
418
+ if (cursor > 0)
419
+ set(buffer.slice(0, cursor - 1) + buffer.slice(cursor), cursor - 1);
420
+ return;
421
+ case 'delete':
422
+ set(buffer.slice(0, cursor) + buffer.slice(cursor + 1), cursor);
423
+ return;
424
+ case 'left':
425
+ set(buffer, Math.max(0, cursor - 1));
426
+ return;
427
+ case 'right':
428
+ set(buffer, Math.min(buffer.length, cursor + 1));
429
+ return;
430
+ case 'home':
431
+ set(buffer, 0);
432
+ return;
433
+ case 'end':
434
+ set(buffer, buffer.length);
435
+ return;
436
+ case 'word-left':
437
+ set(buffer, wordLeft(buffer, cursor));
438
+ return;
439
+ case 'word-right':
440
+ set(buffer, wordRight(buffer, cursor));
441
+ return;
442
+ case 'ctrl+u':
443
+ set(buffer.slice(cursor), 0);
444
+ return;
445
+ case 'ctrl+k':
446
+ set(buffer.slice(0, cursor), cursor);
447
+ return;
448
+ case 'ctrl+w': {
449
+ const j = wordLeft(buffer, cursor);
450
+ set(buffer.slice(0, j) + buffer.slice(cursor), j);
451
+ return;
452
+ }
453
+ case 'ctrl+l':
454
+ paint();
455
+ return;
456
+ case 'tab':
457
+ completeCommand();
458
+ paint();
459
+ return;
460
+ case 'up':
461
+ if (histIdx < history.length - 1) {
462
+ if (histIdx === -1)
463
+ draft = buffer;
464
+ histIdx++;
465
+ const entry = history[histIdx] ?? '';
466
+ set(entry, entry.length);
467
+ }
468
+ return;
469
+ case 'down':
470
+ if (histIdx >= 0) {
471
+ histIdx--;
472
+ const entry = histIdx === -1 ? draft : (history[histIdx] ?? '');
473
+ set(entry, entry.length);
474
+ }
475
+ return;
476
+ case 'text':
477
+ case 'paste': {
478
+ const text = key.name === 'paste' ? sanitizePaste(key.text ?? '') : (key.text ?? '');
479
+ if (text)
480
+ set(buffer.slice(0, cursor) + text + buffer.slice(cursor), cursor + text.length);
481
+ return;
482
+ }
483
+ default:
484
+ return;
485
+ }
486
+ });
487
+ });
488
+ },
489
+ close() {
490
+ stop?.();
491
+ stop = null;
492
+ },
493
+ showPrompt() {
494
+ paint();
495
+ },
496
+ };
497
+ }
498
+ /**
499
+ * Let the user choose one item. Resolves with its value, or null when cancelled
500
+ * (or when there is no interactive terminal). With `allowCustom`, a typed value
501
+ * that matches nothing can be chosen as-is.
502
+ */
503
+ export function pick(opts) {
504
+ if (!process.stdin.isTTY || !out.isTTY)
505
+ return Promise.resolve(null);
506
+ const { rows, cols } = dims();
507
+ const visible = Math.max(3, Math.min(10, rows - (S.active ? CHROME_ROWS : 0) - 5));
508
+ const height = visible + 3; // title, search, items, footer
509
+ const max = cols - 1;
510
+ let filter = '';
511
+ let top = 0;
512
+ let sel = Math.max(0, opts.items.findIndex((it) => it.value === opts.current));
513
+ const matches = () => {
514
+ const words = filter.toLowerCase().split(/\s+/).filter(Boolean);
515
+ const list = opts.items.filter((it) => {
516
+ const hay = (it.label + ' ' + (it.hint ?? '')).toLowerCase();
517
+ return words.every((w) => hay.includes(w));
518
+ });
519
+ // Custom IDs look like "org/name". The entry goes last, so Enter picks the
520
+ // best filtered match and the custom ID is first only when nothing matches.
521
+ const typed = filter.trim();
522
+ if (opts.allowCustom && typed.includes('/') && !opts.items.some((it) => it.value === typed)) {
523
+ list.push({ value: typed, label: typed, hint: 'use as typed' });
524
+ }
525
+ return list;
526
+ };
527
+ const frame = () => {
528
+ const list = matches();
529
+ sel = Math.min(sel, Math.max(0, list.length - 1));
530
+ if (sel < top)
531
+ top = sel;
532
+ if (sel >= top + visible)
533
+ top = sel - visible + 1;
534
+ const lines = [
535
+ c.bold(clipText(opts.title, max - 16)) + c.dim(` ${list.length} of ${opts.items.length}`),
536
+ c.dim(' search › ') + clipText(filter, max - 14) + c.dim('▏'),
537
+ ];
538
+ for (let i = 0; i < visible; i++) {
539
+ const it = list[top + i];
540
+ if (!it) {
541
+ lines.push(i === 0 && list.length === 0 ? c.dim(' no matches') : '');
542
+ continue;
543
+ }
544
+ const isSel = top + i === sel;
545
+ const isCur = it.value === opts.current;
546
+ const label = clipText(it.label, max - 6);
547
+ const room = max - 3 - label.length - (isCur ? 2 : 0) - 2;
548
+ const hint = it.hint && room > 8 ? ' ' + clipText(it.hint, room) : '';
549
+ lines.push((isSel ? c.magenta(' › ') : ' ') +
550
+ (isSel ? c.magenta.bold(label) : label) +
551
+ (isCur ? c.green(' ✓') : '') +
552
+ c.dim(hint));
553
+ }
554
+ lines.push(c.dim(clipText(' ↑↓ move · enter select · esc cancel · type to filter', max)));
555
+ return lines;
556
+ };
557
+ const draw = (first) => {
558
+ const body = frame()
559
+ .map((l) => `${CSI}2K${l}\n`)
560
+ .join('');
561
+ out.write((first ? '' : `${CSI}${height}A\r`) + body);
562
+ };
563
+ return new Promise((resolve) => {
564
+ let done = false;
565
+ let stop = () => undefined;
566
+ const end = (value) => {
567
+ done = true;
568
+ stop();
569
+ // Remove the picker lines from the scrolling region.
570
+ out.write(`${CSI}${height}A\r${CSI}${height}M${CSI}?25h`);
571
+ resolve(value);
572
+ };
573
+ out.write(CSI + '?25l');
574
+ draw(true);
575
+ stop = listenKeys((key) => {
576
+ if (done)
577
+ return;
578
+ const list = matches();
579
+ const resetFilter = () => {
580
+ sel = 0;
581
+ top = 0;
582
+ };
583
+ switch (key.name) {
584
+ case 'up':
585
+ sel = Math.max(0, sel - 1);
586
+ break;
587
+ case 'down':
588
+ sel = Math.min(Math.max(0, list.length - 1), sel + 1);
589
+ break;
590
+ case 'pageup':
591
+ sel = Math.max(0, sel - visible);
592
+ break;
593
+ case 'pagedown':
594
+ sel = Math.min(Math.max(0, list.length - 1), sel + visible);
595
+ break;
596
+ case 'home':
597
+ sel = 0;
598
+ break;
599
+ case 'end':
600
+ sel = Math.max(0, list.length - 1);
601
+ break;
602
+ case 'backspace':
603
+ filter = filter.slice(0, -1);
604
+ resetFilter();
605
+ break;
606
+ case 'ctrl+u':
607
+ filter = '';
608
+ resetFilter();
609
+ break;
610
+ case 'text':
611
+ case 'paste':
612
+ filter += sanitizePaste(key.text ?? '');
613
+ resetFilter();
614
+ break;
615
+ case 'enter':
616
+ end(list[sel]?.value ?? null);
617
+ return;
618
+ case 'escape':
619
+ case 'ctrl+c':
620
+ end(null);
621
+ return;
622
+ default:
623
+ return;
624
+ }
625
+ draw(false);
626
+ });
627
+ });
628
+ }
629
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../../src/ui/screen.ts"],"names":[],"mappings":"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"}