compact-agent 1.33.0 → 1.33.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.
- package/dist/index.js +34 -23
- package/dist/index.js.map +1 -1
- package/dist/inline-suggest.d.ts +20 -5
- package/dist/inline-suggest.js +208 -137
- package/dist/inline-suggest.js.map +1 -1
- package/package.json +1 -1
package/dist/inline-suggest.d.ts
CHANGED
|
@@ -5,10 +5,25 @@ export interface SuggestItem {
|
|
|
5
5
|
/** One-line description shown in the second column. */
|
|
6
6
|
description: string;
|
|
7
7
|
}
|
|
8
|
+
export interface InlineSuggestOptions {
|
|
9
|
+
/**
|
|
10
|
+
* The styled prompt prefix to repaint at the start of every render
|
|
11
|
+
* (includes any chalk codes). Defaults to " ❯ " (no decorative).
|
|
12
|
+
*/
|
|
13
|
+
promptPrefix?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Visible character width of `promptPrefix` (i.e. its length minus
|
|
16
|
+
* any ANSI escape sequences). Used to position the cursor at the
|
|
17
|
+
* end of the filter after a render. Defaults to counting the
|
|
18
|
+
* stripped prefix when omitted.
|
|
19
|
+
*/
|
|
20
|
+
promptVisibleLen?: number;
|
|
21
|
+
}
|
|
8
22
|
export interface InlineSuggestResult {
|
|
9
23
|
/** True if the user picked an item (Enter); false on Esc / Ctrl+C / Backspace-to-empty. */
|
|
10
24
|
accepted: boolean;
|
|
11
|
-
/** The chosen command, only set when accepted=true.
|
|
25
|
+
/** The chosen command, only set when accepted=true. Trailing space
|
|
26
|
+
* means "fill but don't submit" (Tab pathway). */
|
|
12
27
|
command?: string;
|
|
13
28
|
/** The filter string at exit. Caller restores rl.line to this on
|
|
14
29
|
* cancel so the user can keep typing the partial command. */
|
|
@@ -18,8 +33,8 @@ export interface InlineSuggestResult {
|
|
|
18
33
|
* Show the inline suggest dropdown and resolve when the user picks
|
|
19
34
|
* or cancels.
|
|
20
35
|
*
|
|
21
|
-
* The caller
|
|
22
|
-
*
|
|
23
|
-
*
|
|
36
|
+
* The caller should have cleared rl.line and refreshed the prompt
|
|
37
|
+
* before calling — we repaint the prompt line ourselves but the
|
|
38
|
+
* cursor needs to be on a stable row (not mid-scroll).
|
|
24
39
|
*/
|
|
25
|
-
export declare function inlineSuggest(_rl: RLInterface, items: SuggestItem[], initialFilter?: string): Promise<InlineSuggestResult>;
|
|
40
|
+
export declare function inlineSuggest(_rl: RLInterface, items: SuggestItem[], initialFilter?: string, opts?: InlineSuggestOptions): Promise<InlineSuggestResult>;
|
package/dist/inline-suggest.js
CHANGED
|
@@ -10,57 +10,54 @@
|
|
|
10
10
|
* and only paints a few rows of dropdown below the cursor — the
|
|
11
11
|
* surrounding chat output stays visible.
|
|
12
12
|
*
|
|
13
|
-
* Render strategy
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
13
|
+
* Render strategy — RELATIVE cursor positioning only
|
|
14
|
+
* ──────────────────────────────────────────────────
|
|
15
|
+
* The first cut of this module used DECSC/DECRC (`\x1b7`/`\x1b8`) to
|
|
16
|
+
* pin an anchor at the start of the filter, then restored to it on
|
|
17
|
+
* every render. That fails on Windows PowerShell legacy ConHost as
|
|
18
|
+
* soon as the dropdown content scrolls the terminal — the saved
|
|
19
|
+
* position is stored in *visible* coordinates, so after a scroll it
|
|
20
|
+
* lands on the wrong row and renders pile up below the previous one.
|
|
18
21
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* expects to be typing)
|
|
22
|
+
* The fix: track our own row count and use relative cursor moves
|
|
23
|
+
* (`\x1b[<N>A` go up, `\r` col 0, `\x1b[<N>C` advance N cols). Every
|
|
24
|
+
* render writes the FULL prompt line — prompt prefix + filter — so
|
|
25
|
+
* we don't need to "skip over" the prefix to reach the filter cell.
|
|
26
|
+
* The caller hands us the prompt prefix (ANSI-styled string + the
|
|
27
|
+
* visible char count) so we can repaint it each frame.
|
|
26
28
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
29
|
+
* Per-frame sequence:
|
|
30
|
+
* 1. Up `_dropdownRows` lines → back to the filter row
|
|
31
|
+
* 2. `\r` → col 0 of that row
|
|
32
|
+
* 3. `\x1b[J` → clear from cursor to end of screen
|
|
33
|
+
* 4. promptPrefix + filter → repaint the prompt line
|
|
34
|
+
* 5. `\r\n` + each dropdown row → fill the rows below
|
|
35
|
+
* 6. Up `rowsDrawn` + `\r` + right (promptVisLen + filter.length)
|
|
36
|
+
* → cursor settles at end of filter
|
|
30
37
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* the screen scrolls and the saved cursor position becomes
|
|
36
|
-
* stale. We cap visible rows to MAX_ROWS to keep this rare.
|
|
38
|
+
* Steps 1–3 only refer to rows we previously printed (which are still
|
|
39
|
+
* on screen, because they came AFTER the prompt). Even if the screen
|
|
40
|
+
* scrolled between renders, relative up-moves still target our own
|
|
41
|
+
* rows correctly because they're contiguous with the cursor.
|
|
37
42
|
*
|
|
38
43
|
* Key handling
|
|
39
44
|
* ────────────
|
|
40
45
|
* While suggest is active, we detach all non-hotkey `keypress`
|
|
41
|
-
* listeners so readline's line editor stops processing input
|
|
42
|
-
*
|
|
43
|
-
* and emit 'line' on Enter — fighting our dropdown). We add a raw
|
|
44
|
-
* `data` listener that parses bytes directly:
|
|
46
|
+
* listeners so readline's line editor stops processing input. A raw
|
|
47
|
+
* `data` listener parses bytes directly:
|
|
45
48
|
*
|
|
46
49
|
* Ctrl+C / Esc cancel
|
|
47
50
|
* Enter (CR or LF) accept current selection
|
|
48
51
|
* Up / Down move selection
|
|
49
52
|
* Backspace delete last filter char; dismiss if empty
|
|
53
|
+
* Tab accept without submitting (sentinel:
|
|
54
|
+
* trailing space on command)
|
|
50
55
|
* Printable ASCII append to filter, reset selection to 0
|
|
51
|
-
*
|
|
52
|
-
* Returns `{ accepted, command?, filter }`. The caller is
|
|
53
|
-
* responsible for:
|
|
54
|
-
* - On accept: stashing the chosen command in
|
|
55
|
-
* __crowcoderQueuedInput and emitting 'line' to submit
|
|
56
|
-
* - On cancel: restoring rl.line to `filter` so the user can keep
|
|
57
|
-
* typing the partial command they had
|
|
58
56
|
*/
|
|
59
57
|
import { stdin, stdout } from 'node:process';
|
|
60
58
|
const ANSI = {
|
|
61
|
-
cursorSave: '\x1b7',
|
|
62
|
-
cursorRestore: '\x1b8',
|
|
63
59
|
clearToEnd: '\x1b[J',
|
|
60
|
+
clearLine: '\x1b[K',
|
|
64
61
|
reverse: '\x1b[7m',
|
|
65
62
|
dim: '\x1b[2m',
|
|
66
63
|
reset: '\x1b[0m',
|
|
@@ -68,25 +65,29 @@ const ANSI = {
|
|
|
68
65
|
/** Cap visible dropdown rows. Trades discoverability for keeping the
|
|
69
66
|
* surrounding chat output visible. Matches Claude Code's behavior. */
|
|
70
67
|
const MAX_ROWS = 8;
|
|
68
|
+
/** Strip ANSI SGR escape sequences for visible-width math. */
|
|
69
|
+
function ansiVisibleLen(s) {
|
|
70
|
+
return s.replace(/\x1b\[[0-9;]*m/g, '').length;
|
|
71
|
+
}
|
|
71
72
|
/**
|
|
72
73
|
* Show the inline suggest dropdown and resolve when the user picks
|
|
73
74
|
* or cancels.
|
|
74
75
|
*
|
|
75
|
-
* The caller
|
|
76
|
-
*
|
|
77
|
-
*
|
|
76
|
+
* The caller should have cleared rl.line and refreshed the prompt
|
|
77
|
+
* before calling — we repaint the prompt line ourselves but the
|
|
78
|
+
* cursor needs to be on a stable row (not mid-scroll).
|
|
78
79
|
*/
|
|
79
|
-
export async function inlineSuggest(_rl, items, initialFilter = '/') {
|
|
80
|
+
export async function inlineSuggest(_rl, items, initialFilter = '/', opts = {}) {
|
|
80
81
|
return new Promise((resolve) => {
|
|
81
82
|
let filter = initialFilter;
|
|
82
83
|
let selected = 0;
|
|
83
|
-
//
|
|
84
|
-
//
|
|
85
|
-
|
|
84
|
+
// Rows of dropdown printed on the previous frame (NOT including
|
|
85
|
+
// the filter row). The next frame goes up by this many to land
|
|
86
|
+
// back on the filter row.
|
|
87
|
+
let dropdownRows = 0;
|
|
88
|
+
const promptPrefix = opts.promptPrefix ?? ' ❯ ';
|
|
89
|
+
const promptVisLen = opts.promptVisibleLen ?? ansiVisibleLen(promptPrefix);
|
|
86
90
|
// Defensive: ensure raw mode is on and the stream is flowing.
|
|
87
|
-
// readline normally has these set already, but if the parent ever
|
|
88
|
-
// pauses stdin or flips raw mode off, our data listener wouldn't
|
|
89
|
-
// see typed bytes and the per-char update would silently break.
|
|
90
91
|
const wasRaw = stdin.isRaw;
|
|
91
92
|
try {
|
|
92
93
|
stdin.setRawMode(true);
|
|
@@ -96,8 +97,7 @@ export async function inlineSuggest(_rl, items, initialFilter = '/') {
|
|
|
96
97
|
// Detach readline's keypress listeners so the line editor doesn't
|
|
97
98
|
// also process input. The hotkey listener (tagged
|
|
98
99
|
// __crowcoderHotkey__) stays attached because it has its own
|
|
99
|
-
// bail for `pickerActive`; the others
|
|
100
|
-
// emitter, history nav) get pulled.
|
|
100
|
+
// bail for `pickerActive`; the others get pulled.
|
|
101
101
|
const allKeypress = stdin.listeners('keypress').slice();
|
|
102
102
|
const togglable = allKeypress.filter((l) => !l.__crowcoderHotkey__);
|
|
103
103
|
for (const l of togglable)
|
|
@@ -125,13 +125,28 @@ export async function inlineSuggest(_rl, items, initialFilter = '/') {
|
|
|
125
125
|
// enough space on narrow terminals.
|
|
126
126
|
const cmdCol = Math.min(20, Math.max(10, shown.reduce((m, it) => Math.max(m, it.command.length), 0)));
|
|
127
127
|
const termCols = stdout.columns || 80;
|
|
128
|
-
// Reserve: 2 (indent) + cmdCol + 2 (gutter) + descMax + safety
|
|
129
128
|
const descMax = Math.max(20, termCols - cmdCol - 6);
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
129
|
+
// ── Reposition to the filter row ──
|
|
130
|
+
// Up by however many dropdown rows we left on screen last
|
|
131
|
+
// frame. Then \r to col 0. Then clear from cursor to end of
|
|
132
|
+
// screen — that erases the rest of the filter row AND every
|
|
133
|
+
// dropdown row below.
|
|
134
|
+
if (dropdownRows > 0) {
|
|
135
|
+
stdout.write(`\x1b[${dropdownRows}A`);
|
|
136
|
+
}
|
|
137
|
+
stdout.write('\r');
|
|
138
|
+
stdout.write(ANSI.clearToEnd);
|
|
139
|
+
// Repaint the prompt line: styled prefix + filter chars. We
|
|
140
|
+
// own this line now (the clear above wiped whatever was here).
|
|
141
|
+
stdout.write(promptPrefix + filter);
|
|
142
|
+
// Draw dropdown rows beneath. Each row gets a "\r\n" prefix
|
|
143
|
+
// so it lands on a fresh line at col 0 regardless of where the
|
|
144
|
+
// previous write left the cursor. (Bare "\n" in raw mode only
|
|
145
|
+
// moves down, not back to col 0.)
|
|
146
|
+
let rowsDrawn = 0;
|
|
133
147
|
if (shown.length === 0) {
|
|
134
148
|
stdout.write(`\r\n ${ANSI.dim}(no matches — Backspace to clear, Esc to dismiss)${ANSI.reset}`);
|
|
149
|
+
rowsDrawn = 1;
|
|
135
150
|
}
|
|
136
151
|
else {
|
|
137
152
|
for (let i = 0; i < shown.length; i++) {
|
|
@@ -145,129 +160,185 @@ export async function inlineSuggest(_rl, items, initialFilter = '/') {
|
|
|
145
160
|
let desc = it.description;
|
|
146
161
|
if (desc.length > descMax)
|
|
147
162
|
desc = desc.slice(0, descMax - 1) + '…';
|
|
148
|
-
// Selected row: reverse-video the whole row for clear
|
|
149
|
-
// contrast (matches Claude Code's highlight). Unselected:
|
|
150
|
-
// command in default color, description dim — keeps the
|
|
151
|
-
// dropdown visually quiet.
|
|
152
163
|
const line = isSel
|
|
153
164
|
? `${ANSI.reverse} ${cmd} ${desc}${ANSI.reset}`
|
|
154
165
|
: ` ${cmd} ${ANSI.dim}${desc}${ANSI.reset}`;
|
|
155
166
|
stdout.write(`\r\n${line}`);
|
|
167
|
+
rowsDrawn++;
|
|
156
168
|
}
|
|
157
169
|
if (visible.length > shown.length) {
|
|
158
170
|
stdout.write(`\r\n ${ANSI.dim}… ${visible.length - shown.length} more · type to narrow${ANSI.reset}`);
|
|
171
|
+
rowsDrawn++;
|
|
159
172
|
}
|
|
160
173
|
}
|
|
161
|
-
// Cursor back to
|
|
162
|
-
//
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
174
|
+
// Cursor back to the end of the filter on the prompt row.
|
|
175
|
+
// After the last write we're at end-of-last-dropdown-row;
|
|
176
|
+
// go up `rowsDrawn` lines, \r to col 0, then advance to the
|
|
177
|
+
// visible column of end-of-filter.
|
|
178
|
+
stdout.write(`\x1b[${rowsDrawn}A\r`);
|
|
179
|
+
const endCol = promptVisLen + filter.length;
|
|
180
|
+
if (endCol > 0) {
|
|
181
|
+
stdout.write(`\x1b[${endCol}C`);
|
|
166
182
|
}
|
|
183
|
+
dropdownRows = rowsDrawn;
|
|
167
184
|
}
|
|
168
185
|
function teardown() {
|
|
169
186
|
stdin.removeListener('data', onData);
|
|
170
187
|
for (const l of togglable)
|
|
171
188
|
stdin.on('keypress', l);
|
|
172
|
-
// Restore raw-mode state. (Leaving stdin paused or in cooked
|
|
173
|
-
// mode would break readline's next prompt.)
|
|
174
189
|
try {
|
|
175
190
|
stdin.setRawMode(wasRaw);
|
|
176
191
|
}
|
|
177
192
|
catch { /* noop */ }
|
|
178
|
-
// Wipe the dropdown
|
|
179
|
-
//
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
193
|
+
// Wipe the dropdown area. We're at end-of-filter; go down +
|
|
194
|
+
// \r + clear-to-end clears everything we drew below the
|
|
195
|
+
// prompt row. Leave the filter on screen — the caller decides
|
|
196
|
+
// whether to overwrite (on accept) or restore rl.line + redraw
|
|
197
|
+
// (on cancel).
|
|
198
|
+
if (dropdownRows > 0) {
|
|
199
|
+
stdout.write('\r\n');
|
|
200
|
+
stdout.write(ANSI.clearToEnd);
|
|
201
|
+
// Cursor is now at col 0 of the row after the filter.
|
|
202
|
+
// Move back up + to end of filter so caller sees a clean
|
|
203
|
+
// single-row state.
|
|
204
|
+
stdout.write(`\x1b[1A\r`);
|
|
205
|
+
const endCol = promptVisLen + filter.length;
|
|
206
|
+
if (endCol > 0) {
|
|
207
|
+
stdout.write(`\x1b[${endCol}C`);
|
|
208
|
+
}
|
|
190
209
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
210
|
+
dropdownRows = 0;
|
|
211
|
+
}
|
|
212
|
+
function moveSelection(delta) {
|
|
213
|
+
const visible = visibleItems();
|
|
214
|
+
if (visible.length === 0)
|
|
196
215
|
return;
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
216
|
+
selected = (selected + delta + visible.length) % visible.length;
|
|
217
|
+
render();
|
|
218
|
+
}
|
|
219
|
+
function onData(buf) {
|
|
220
|
+
// Defensive wrapper — if any branch throws we don't want the
|
|
221
|
+
// dropdown to silently freeze. Restore listeners so the user
|
|
222
|
+
// can keep typing.
|
|
223
|
+
try {
|
|
224
|
+
// Ctrl+C — cancel.
|
|
225
|
+
if (buf.length === 1 && buf[0] === 0x03) {
|
|
226
|
+
teardown();
|
|
227
|
+
resolve({ accepted: false, filter });
|
|
202
228
|
return;
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
}
|
|
208
|
-
// Backspace (DEL 0x7F on POSIX, BS 0x08 on Windows).
|
|
209
|
-
if (buf.length === 1 && (buf[0] === 0x7F || buf[0] === 0x08)) {
|
|
210
|
-
if (filter.length <= 1) {
|
|
211
|
-
// Deleting the only char (typically the leading '/') —
|
|
212
|
-
// dismiss the dropdown and let the user have a blank line.
|
|
213
|
-
filter = '';
|
|
229
|
+
}
|
|
230
|
+
// Esc (bare) — cancel. Multi-byte chunks starting with 0x1B
|
|
231
|
+
// are arrow keys / function keys (handled below).
|
|
232
|
+
if (buf.length === 1 && buf[0] === 0x1B) {
|
|
214
233
|
teardown();
|
|
215
234
|
resolve({ accepted: false, filter });
|
|
216
235
|
return;
|
|
217
236
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
// Arrow keys: `Esc [ <code>` (3 bytes).
|
|
224
|
-
if (buf.length >= 3 && buf[0] === 0x1B && buf[1] === 0x5B) {
|
|
225
|
-
const code = buf[2];
|
|
226
|
-
if (code === 0x41) { // Up
|
|
237
|
+
// Enter — accept current selection. CR (0x0D) and LF (0x0A)
|
|
238
|
+
// both count; some terminals deliver one, some the other.
|
|
239
|
+
if (buf.length === 1 && (buf[0] === 0x0D || buf[0] === 0x0A)) {
|
|
227
240
|
const visible = visibleItems();
|
|
228
|
-
if (visible.length
|
|
229
|
-
|
|
241
|
+
if (visible.length === 0)
|
|
242
|
+
return;
|
|
243
|
+
const chosen = visible[selected];
|
|
244
|
+
teardown();
|
|
245
|
+
resolve({ accepted: true, command: chosen.command, filter });
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
// Backspace (DEL 0x7F on POSIX, BS 0x08 on Windows).
|
|
249
|
+
//
|
|
250
|
+
// Behavior: shrink the filter by one char. If the filter is
|
|
251
|
+
// already empty we dismiss; otherwise we KEEP THE DROPDOWN
|
|
252
|
+
// OPEN even when the filter shrinks to "" (so the user can
|
|
253
|
+
// see the full list when they backspace past the trigger '/'
|
|
254
|
+
// — previous behavior dismissed on filter='/' which felt
|
|
255
|
+
// jumpy when the user just wanted to clear their typing).
|
|
256
|
+
if (buf.length === 1 && (buf[0] === 0x7F || buf[0] === 0x08)) {
|
|
257
|
+
if (filter.length === 0) {
|
|
258
|
+
teardown();
|
|
259
|
+
resolve({ accepted: false, filter });
|
|
260
|
+
return;
|
|
230
261
|
}
|
|
262
|
+
filter = filter.slice(0, -1);
|
|
263
|
+
selected = 0;
|
|
231
264
|
render();
|
|
232
265
|
return;
|
|
233
266
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
267
|
+
// Tab — navigate to the next item (alias for Down arrow).
|
|
268
|
+
// The previous "Tab = fill but don't submit" sentinel was
|
|
269
|
+
// confusing and never matched user muscle memory; treating
|
|
270
|
+
// Tab as navigation matches what most CLI completers do and
|
|
271
|
+
// pairs naturally with Shift+Tab below.
|
|
272
|
+
if (buf.length === 1 && buf[0] === 0x09) {
|
|
273
|
+
moveSelection(1);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
// Shift+Tab — navigate to the previous item. Delivered as
|
|
277
|
+
// the CSI back-tab sequence `\x1b[Z` (3 bytes) on most
|
|
278
|
+
// modern terminals including Windows Terminal + ConHost
|
|
279
|
+
// with VT100 enabled.
|
|
280
|
+
if (buf.length === 3 && buf[0] === 0x1B && buf[1] === 0x5B && buf[2] === 0x5A) {
|
|
281
|
+
moveSelection(-1);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
// Arrow keys: `Esc [ <code>` (3 bytes). Up/Down navigate;
|
|
285
|
+
// Page Up / Page Down skip by 5 (also reachable via the 4-
|
|
286
|
+
// byte forms `\x1b[5~` and `\x1b[6~`).
|
|
287
|
+
if (buf.length >= 3 && buf[0] === 0x1B && buf[1] === 0x5B) {
|
|
288
|
+
const code = buf[2];
|
|
289
|
+
if (code === 0x41) {
|
|
290
|
+
moveSelection(-1);
|
|
291
|
+
return;
|
|
292
|
+
} // Up
|
|
293
|
+
if (code === 0x42) {
|
|
294
|
+
moveSelection(1);
|
|
295
|
+
return;
|
|
296
|
+
} // Down
|
|
297
|
+
if (buf.length >= 4 && (code === 0x35 || code === 0x36) && buf[3] === 0x7E) {
|
|
298
|
+
moveSelection(code === 0x35 ? -5 : 5); // Page Up/Down
|
|
299
|
+
return;
|
|
238
300
|
}
|
|
239
|
-
|
|
301
|
+
// Left/Right/Home/End and other unhandled CSI escapes:
|
|
302
|
+
// swallow them silently rather than letting their bytes
|
|
303
|
+
// fall through to the printable-char branch (which would
|
|
304
|
+
// see e.g. "[D" and start appending '[' + 'D' to the
|
|
305
|
+
// filter). Anything starting with ESC [ is some terminal
|
|
306
|
+
// sequence — definitely not user-intended filter text.
|
|
240
307
|
return;
|
|
241
308
|
}
|
|
242
|
-
//
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
if (buf.length === 1 && buf[0] === 0x09) {
|
|
249
|
-
const visible = visibleItems();
|
|
250
|
-
if (visible.length === 0)
|
|
309
|
+
// Any other bare control byte (Ctrl+A..Ctrl+Z minus the ones
|
|
310
|
+
// we explicitly handled above): silently ignore. The user
|
|
311
|
+
// expects Ctrl+letter to do SOMETHING, but we don't have a
|
|
312
|
+
// mapping for most of them in this context — better to do
|
|
313
|
+
// nothing than to dump a 0x01 into the filter.
|
|
314
|
+
if (buf.length === 1 && buf[0] < 0x20)
|
|
251
315
|
return;
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
//
|
|
255
|
-
//
|
|
256
|
-
|
|
257
|
-
|
|
316
|
+
// Printable input — extend filter and re-render. Robust
|
|
317
|
+
// against mixed chunks: instead of all-or-nothing, strip
|
|
318
|
+
// ANY non-printable bytes from the chunk and append only
|
|
319
|
+
// the printable subset. This means a chunk like `[h, 0x01]`
|
|
320
|
+
// (an 'h' followed by a stray Ctrl+A) still appends the 'h'
|
|
321
|
+
// instead of dropping the whole chunk.
|
|
322
|
+
//
|
|
323
|
+
// This is the per-char update path: every printable byte
|
|
324
|
+
// lands here and triggers render() with the new filter.
|
|
325
|
+
const s = buf.toString('utf-8');
|
|
326
|
+
const printable = s.replace(/[\x00-\x1F\x7F]/g, '');
|
|
327
|
+
if (printable.length > 0) {
|
|
328
|
+
filter += printable;
|
|
329
|
+
selected = 0;
|
|
330
|
+
render();
|
|
331
|
+
}
|
|
258
332
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
filter += s;
|
|
269
|
-
selected = 0;
|
|
270
|
-
render();
|
|
333
|
+
catch {
|
|
334
|
+
// Don't let a render error wedge the user in the dropdown
|
|
335
|
+
// with a dead handler. Tear down, resolve as cancelled with
|
|
336
|
+
// the current filter, and let the parent restore the prompt.
|
|
337
|
+
try {
|
|
338
|
+
teardown();
|
|
339
|
+
}
|
|
340
|
+
catch { /* noop */ }
|
|
341
|
+
resolve({ accepted: false, filter });
|
|
271
342
|
}
|
|
272
343
|
}
|
|
273
344
|
stdin.on('data', onData);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inline-suggest.js","sourceRoot":"","sources":["../src/inline-suggest.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"inline-suggest.js","sourceRoot":"","sources":["../src/inline-suggest.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "compact-agent",
|
|
3
|
-
"version": "1.33.
|
|
3
|
+
"version": "1.33.2",
|
|
4
4
|
"description": "Terminal AI coding CLI. Speaks any OpenAI-compatible API (OpenRouter, OpenAI, NVIDIA, Ollama, LM Studio, DeepSeek). Modes, slash commands, multi-agent swarming, key-rotation pool, optional voice + screen-reader, sandbox + permission gates, persistent input box, bundled everything-claude-code skills.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|