dsh-ssh-tui 0.7.0-rc.1 → 0.7.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/README.en.md +134 -64
- package/README.md +81 -75
- package/docs/remote-ops.md +154 -0
- package/docs/screenshots/compare.png +0 -0
- package/docs/screenshots/headless.png +0 -0
- package/docs/screenshots/workspace.png +0 -0
- package/lib/attach.js +66 -7
- package/lib/attach.js.map +1 -1
- package/lib/color-depth.js +226 -0
- package/lib/color-depth.js.map +1 -0
- package/lib/copy-text.js +1 -0
- package/lib/copy-text.js.map +1 -1
- package/lib/dialogs.js +73 -1
- package/lib/dialogs.js.map +1 -1
- package/lib/display-sock.js +1 -1
- package/lib/display-sock.js.map +1 -1
- package/lib/footer.js +199 -22
- package/lib/footer.js.map +1 -1
- package/lib/i18n/en.js +23 -0
- package/lib/i18n/en.js.map +1 -1
- package/lib/i18n/zh.js +24 -1
- package/lib/i18n/zh.js.map +1 -1
- package/lib/index.js +4 -1
- package/lib/index.js.map +1 -1
- package/lib/keymap.js +172 -0
- package/lib/keymap.js.map +1 -0
- package/lib/line-diff.js +224 -0
- package/lib/line-diff.js.map +1 -0
- package/lib/line-mode.js +86 -0
- package/lib/line-mode.js.map +1 -0
- package/lib/paint.js +17 -2
- package/lib/paint.js.map +1 -1
- package/lib/plan.js +51 -8
- package/lib/plan.js.map +1 -1
- package/lib/preset-picker.js +105 -0
- package/lib/preset-picker.js.map +1 -0
- package/lib/quota.js +23 -2
- package/lib/quota.js.map +1 -1
- package/lib/selection.js +154 -0
- package/lib/selection.js.map +1 -0
- package/lib/term-text.js +106 -1
- package/lib/term-text.js.map +1 -1
- package/lib/tool-present.js +157 -21
- package/lib/tool-present.js.map +1 -1
- package/lib/tui.js +825 -91
- package/lib/tui.js.map +1 -1
- package/lib/types/attach.d.ts +29 -0
- package/lib/types/color-depth.d.ts +50 -0
- package/lib/types/dialogs.d.ts +30 -0
- package/lib/types/footer.d.ts +102 -7
- package/lib/types/keymap.d.ts +68 -0
- package/lib/types/line-diff.d.ts +107 -0
- package/lib/types/line-mode.d.ts +36 -0
- package/lib/types/paint.d.ts +9 -1
- package/lib/types/plan.d.ts +7 -0
- package/lib/types/preset-picker.d.ts +64 -0
- package/lib/types/quota.d.ts +17 -0
- package/lib/types/selection.d.ts +81 -0
- package/lib/types/term-text.d.ts +29 -0
- package/lib/types/tool-present.d.ts +53 -3
- package/lib/types/transcript-types.d.ts +20 -2
- package/lib/types/tui.d.ts +157 -4
- package/package.json +2 -1
package/lib/attach.js
CHANGED
|
@@ -22,6 +22,30 @@ export const RECOVERY_BURST_LIMIT = 3;
|
|
|
22
22
|
export const HOST_START_TIMEOUT_MS = 15_000;
|
|
23
23
|
/** Pause between "is the old Host gone yet" checks while recovering. */
|
|
24
24
|
const RECOVERY_POLL_MS = 150;
|
|
25
|
+
/**
|
|
26
|
+
* Waits between the automatic re-attach attempts of one run.
|
|
27
|
+
*
|
|
28
|
+
* A single retry was not enough for a link that flaps for half a minute: the
|
|
29
|
+
* burst breaker cut the run at three tries inside ten seconds and told the user
|
|
30
|
+
* to come back later, when one more try would have caught the link. One run now
|
|
31
|
+
* backs off — 250ms, 500ms, 1s, 2s, 4s — and only then gives up; the breaker
|
|
32
|
+
* still stops *runs* from fighting each other, which is what it was for.
|
|
33
|
+
*/
|
|
34
|
+
export const RECOVERY_BACKOFF_MS = [250, 500, 1_000, 2_000, 4_000];
|
|
35
|
+
/**
|
|
36
|
+
* How long to wait before attempt `attempt` (0-based), with jitter.
|
|
37
|
+
*
|
|
38
|
+
* Two windows that drop together must not retry in lockstep, so each wait is
|
|
39
|
+
* taken from the upper half of its base: 0.5–1× the nominal delay.
|
|
40
|
+
* @param attempt - 0 for the first retry after the initial failure.
|
|
41
|
+
* @param random - injectable for tests.
|
|
42
|
+
* @returns milliseconds to wait.
|
|
43
|
+
*/
|
|
44
|
+
export function recoveryDelay(attempt, random = Math.random) {
|
|
45
|
+
const last = RECOVERY_BACKOFF_MS[RECOVERY_BACKOFF_MS.length - 1] ?? 4_000;
|
|
46
|
+
const base = RECOVERY_BACKOFF_MS[Math.max(0, Math.min(attempt, RECOVERY_BACKOFF_MS.length - 1))] ?? last;
|
|
47
|
+
return Math.round(base * (0.5 + random() * 0.5));
|
|
48
|
+
}
|
|
25
49
|
/** True when a relay error means the peer vanished rather than a real fault. */
|
|
26
50
|
export function attachPeerVanished(error, elapsedMs) {
|
|
27
51
|
if (elapsedMs >= ATTACH_RECOVERY_WINDOW_MS)
|
|
@@ -71,12 +95,9 @@ export function createAttacher(deps) {
|
|
|
71
95
|
await attachExisting(sessionId, spawned.sock, recover, { announce: true, seed });
|
|
72
96
|
};
|
|
73
97
|
/** Wait out a Host that was mid-dispose, then take the normal path again. */
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if (deps.debug === true)
|
|
78
|
-
deps.report(deps.messages.recovering(sessionId));
|
|
79
|
-
// Between attempts the TTY is back in cooked mode: without this, a cursor
|
|
98
|
+
/** Let a Host that was mid-dispose finish before starting a fresh one. */
|
|
99
|
+
const waitOutLiveHost = async (sessionId) => {
|
|
100
|
+
// The TTY is back in cooked mode between attempts: without this, a cursor
|
|
80
101
|
// reply still owed to the relay that just ended is echoed as `^[[17;1R`
|
|
81
102
|
// for the whole (up to 3s) wait.
|
|
82
103
|
deps.quiet();
|
|
@@ -87,7 +108,45 @@ export function createAttacher(deps) {
|
|
|
87
108
|
break;
|
|
88
109
|
await new Promise(resolve => setTimeout(resolve, RECOVERY_POLL_MS));
|
|
89
110
|
}
|
|
90
|
-
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Attach again, with the bounded backoff in {@link RECOVERY_BACKOFF_MS}.
|
|
114
|
+
*
|
|
115
|
+
* One run gets the whole schedule; the burst breaker counts *runs*, not
|
|
116
|
+
* attempts, so its guard against two windows fighting stays exactly as it
|
|
117
|
+
* was while a single flapping link is no longer cut short. A real fault (not
|
|
118
|
+
* a vanished peer) still ends the run on the spot: retrying it would only
|
|
119
|
+
* repeat the same failure.
|
|
120
|
+
*/
|
|
121
|
+
const recoverAttach = async (sessionId) => {
|
|
122
|
+
if (!recoveryAllowed())
|
|
123
|
+
throw new Error(deps.messages.flapping(sessionId));
|
|
124
|
+
const schedule = deps.backoff ?? RECOVERY_BACKOFF_MS;
|
|
125
|
+
const startedAt = now();
|
|
126
|
+
for (let attempt = 0; attempt < Math.max(1, schedule.length); attempt += 1) {
|
|
127
|
+
if (attempt > 0) {
|
|
128
|
+
const wait = recoveryDelay(attempt - 1, deps.random);
|
|
129
|
+
if (deps.debug === true)
|
|
130
|
+
deps.report(`${deps.messages.recovering(sessionId)} [${attempt + 1}/${schedule.length} +${wait}ms]`);
|
|
131
|
+
await new Promise(resolve => setTimeout(resolve, wait));
|
|
132
|
+
}
|
|
133
|
+
else if (deps.debug === true) {
|
|
134
|
+
deps.report(deps.messages.recovering(sessionId));
|
|
135
|
+
}
|
|
136
|
+
await waitOutLiveHost(sessionId);
|
|
137
|
+
const attemptStartedAt = now();
|
|
138
|
+
try {
|
|
139
|
+
await spawnHostAndRelay(sessionId, false);
|
|
140
|
+
if (attempt > 0)
|
|
141
|
+
deps.onReconnected?.({ attempts: attempt, elapsedMs: now() - startedAt });
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (!attachPeerVanished(error, now() - attemptStartedAt))
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
throw new Error(deps.messages.flapping(sessionId));
|
|
91
150
|
};
|
|
92
151
|
const attachExisting = async (sessionId, sock, recover = true, options = {}) => {
|
|
93
152
|
const announce = options.announce === true;
|
package/lib/attach.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../src/attach.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,oFAAoF;AACpF,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAA;AAC9C,6EAA6E;AAC7E,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAA;AAC5C,8EAA8E;AAC9E,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAA;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAA;AACrC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAA;AAC3C,wEAAwE;AACxE,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAE5B,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,SAAiB;IAClE,IAAI,SAAS,IAAI,yBAAyB;QAAE,OAAO,KAAK,CAAA;IACxD,MAAM,IAAI,GAAI,KAA2C,EAAE,IAAI,CAAA;IAC/D,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACpC,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,sBAAsB,CAAA;AAChH,CAAC;
|
|
1
|
+
{"version":3,"file":"attach.js","sourceRoot":"","sources":["../src/attach.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How much colour the terminal can take, and what to do when it cannot take
|
|
3
|
+
* what a caller asked for.
|
|
4
|
+
*
|
|
5
|
+
* A truecolor pair (`38;2;…`) on an 8-colour terminal is not a cosmetic loss: a
|
|
6
|
+
* terminal that does not understand it either ignores the sequence or renders
|
|
7
|
+
* the row in the wrong colour, and the diff rows are the ones that suffer. The
|
|
8
|
+
* palette is downgraded here instead, by hue family rather than by nearest RGB
|
|
9
|
+
* distance — the diff colours are deliberately muted, and nearest-RGB maps them
|
|
10
|
+
* to grey, which throws away the only signal they carry. Status is never colour
|
|
11
|
+
* alone in this TUI (a `+`/`-`/`●`/`⚠`/`✖` is always present), so a downgraded
|
|
12
|
+
* palette stays readable.
|
|
13
|
+
* @module dsh-ssh-tui/color-depth
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Decide the palette from the environment.
|
|
17
|
+
*
|
|
18
|
+
* `DSH_TUI_COLOR_DEPTH` wins outright so a user can correct a wrong guess.
|
|
19
|
+
* Otherwise: no colour at all when `NO_COLOR` is set or `TERM` names a
|
|
20
|
+
* monochrome terminal; truecolor when `COLORTERM` says so; 256 for a
|
|
21
|
+
* `*256color` terminal and for tmux/screen (their default palette is 256 and
|
|
22
|
+
* they translate truecolor poorly); 8 for everything else.
|
|
23
|
+
* @param env - the environment to read (tests pass their own).
|
|
24
|
+
* @returns the palette to paint with.
|
|
25
|
+
*/
|
|
26
|
+
export function colorDepth(env = process.env) {
|
|
27
|
+
const forced = (env.DSH_TUI_COLOR_DEPTH ?? '').trim().toLowerCase();
|
|
28
|
+
if (forced === 'truecolor' || forced === '24bit' || forced === '16m')
|
|
29
|
+
return 'truecolor';
|
|
30
|
+
if (forced === '256' || forced === '256color')
|
|
31
|
+
return '256';
|
|
32
|
+
if (forced === '8' || forced === '8color' || forced === 'basic')
|
|
33
|
+
return '8';
|
|
34
|
+
if (forced === 'none' || forced === 'off' || forced === '0' || forced === 'no')
|
|
35
|
+
return 'none';
|
|
36
|
+
const noColor = (env.NO_COLOR ?? '').trim();
|
|
37
|
+
if (noColor !== '')
|
|
38
|
+
return 'none';
|
|
39
|
+
const term = (env.TERM ?? '').trim().toLowerCase();
|
|
40
|
+
if (term === '' || term === 'dumb' || term === 'linux' || term === 'vt100' || term === 'vt220')
|
|
41
|
+
return 'none';
|
|
42
|
+
const colorTerm = (env.COLORTERM ?? '').trim().toLowerCase();
|
|
43
|
+
if (colorTerm === 'truecolor' || colorTerm === '24bit')
|
|
44
|
+
return 'truecolor';
|
|
45
|
+
if (term.includes('256color'))
|
|
46
|
+
return '256';
|
|
47
|
+
if (term.startsWith('screen') || term.startsWith('tmux'))
|
|
48
|
+
return '256';
|
|
49
|
+
return '8';
|
|
50
|
+
}
|
|
51
|
+
/** The 16 standard colours, as the RGB a terminal roughly paints them with. */
|
|
52
|
+
const BASIC_RGB = [
|
|
53
|
+
[0, 0, 0], [205, 0, 0], [0, 205, 0], [205, 205, 0],
|
|
54
|
+
[0, 0, 238], [205, 0, 205], [0, 205, 205], [229, 229, 229],
|
|
55
|
+
[127, 127, 127], [255, 0, 0], [0, 255, 0], [255, 255, 0],
|
|
56
|
+
[92, 92, 255], [255, 0, 255], [0, 255, 255], [255, 255, 255],
|
|
57
|
+
];
|
|
58
|
+
/** SGR foreground for each of the 16 standard colours. */
|
|
59
|
+
const BASIC_SGR = [30, 31, 32, 33, 34, 35, 36, 37, 90, 91, 92, 93, 94, 95, 96, 97];
|
|
60
|
+
/** The xterm 256-colour cube index back to RGB. */
|
|
61
|
+
export function rgbFrom256(index) {
|
|
62
|
+
if (index < 16) {
|
|
63
|
+
const basic = BASIC_RGB[index] ?? BASIC_RGB[7] ?? [229, 229, 229];
|
|
64
|
+
return [basic[0], basic[1], basic[2]];
|
|
65
|
+
}
|
|
66
|
+
if (index < 232) {
|
|
67
|
+
const at = index - 16;
|
|
68
|
+
const steps = [0, 95, 135, 175, 215, 255];
|
|
69
|
+
return [steps[Math.floor(at / 36) % 6] ?? 0, steps[Math.floor(at / 6) % 6] ?? 0, steps[at % 6] ?? 0];
|
|
70
|
+
}
|
|
71
|
+
const grey = 8 + (index - 232) * 10;
|
|
72
|
+
return [grey, grey, grey];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The nearest standard colour, by hue family.
|
|
76
|
+
*
|
|
77
|
+
* Brightness picks the bright half of the palette; a colour whose channels are
|
|
78
|
+
* nearly equal becomes a grey. Everything else keeps its hue, so a muted green
|
|
79
|
+
* stays green instead of collapsing to grey the way nearest-RGB would leave it.
|
|
80
|
+
*/
|
|
81
|
+
export function basicSgrFor(r, g, b) {
|
|
82
|
+
const max = Math.max(r, g, b);
|
|
83
|
+
const min = Math.min(r, g, b);
|
|
84
|
+
// 204/255: the muted diff colours sit just under it and belong on the normal
|
|
85
|
+
// half of the palette, while a vivid primary (255) belongs on the bright half.
|
|
86
|
+
const bright = max > 204;
|
|
87
|
+
if (max - min < 24)
|
|
88
|
+
return bright ? 97 : 90;
|
|
89
|
+
// Hue family from the channels that share the maximum: yellow, cyan and
|
|
90
|
+
// magenta are the two-dominant-channel families.
|
|
91
|
+
if (r === max && g === max)
|
|
92
|
+
return bright ? 93 : 33;
|
|
93
|
+
if (g === max && b === max)
|
|
94
|
+
return bright ? 96 : 36;
|
|
95
|
+
if (r === max && b === max)
|
|
96
|
+
return bright ? 95 : 35;
|
|
97
|
+
if (r === max)
|
|
98
|
+
return bright ? 91 : 31;
|
|
99
|
+
if (g === max)
|
|
100
|
+
return bright ? 92 : 32;
|
|
101
|
+
if (b === max)
|
|
102
|
+
return bright ? 94 : 34;
|
|
103
|
+
return bright ? 97 : 90;
|
|
104
|
+
}
|
|
105
|
+
/** Cube axis step nearest to one channel value (the cube's 0/95/135/175/215/255). */
|
|
106
|
+
function cubeAxis(value) {
|
|
107
|
+
const steps = [0, 95, 135, 175, 215, 255];
|
|
108
|
+
let best = 0;
|
|
109
|
+
for (let at = 1; at < steps.length; at += 1) {
|
|
110
|
+
if (Math.abs((steps[at] ?? 0) - value) < Math.abs((steps[best] ?? 0) - value))
|
|
111
|
+
best = at;
|
|
112
|
+
}
|
|
113
|
+
return best;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* The nearest 256-cube colour. Unlike the 16-colour mapping this keeps
|
|
117
|
+
* brightness, which is what the text of a diff row needs to stay readable.
|
|
118
|
+
*/
|
|
119
|
+
function nearestCubeIndex(r, g, b) {
|
|
120
|
+
return 16 + cubeAxis(r) * 36 + cubeAxis(g) * 6 + cubeAxis(b);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* The row background at 256 colours: the ramp's dark grey (`#1c1c1c`).
|
|
124
|
+
*
|
|
125
|
+
* The cube's darkest step is `#005f00` / `#5f0000`, and the muted diff text on
|
|
126
|
+
* that measures 3.2:1 — below the 4.5:1 a row of code needs. A tinted row is not
|
|
127
|
+
* worth unreadable text, so the row goes neutral and the *hue* stays in the
|
|
128
|
+
* foreground, which is also what the 8-colour path does (black background, green
|
|
129
|
+
* or red text). Two consequences worth stating: a background can never equal its
|
|
130
|
+
* own foreground, and the tint is the one thing a 256-colour terminal loses.
|
|
131
|
+
*/
|
|
132
|
+
const DIFF_BACKGROUND_INDEX = 234;
|
|
133
|
+
/**
|
|
134
|
+
* Rewrite one SGR parameter list for the palette in use.
|
|
135
|
+
*
|
|
136
|
+
* Attributes (bold, dim, italic, underline, reverse) always survive: they are
|
|
137
|
+
* what carries meaning when colour cannot. Colour parameters are dropped at
|
|
138
|
+
* `none`, mapped to the standard 16 at `8`, and mapped into the 256-cube at
|
|
139
|
+
* `256`.
|
|
140
|
+
* @param code - the parameter list, e.g. `1;38;2;77;107;253`.
|
|
141
|
+
* @param depth - the palette to rewrite for.
|
|
142
|
+
* @returns the parameter list to emit, possibly empty.
|
|
143
|
+
*/
|
|
144
|
+
export function downgradeSgr(code, depth) {
|
|
145
|
+
if (depth === 'truecolor')
|
|
146
|
+
return code;
|
|
147
|
+
const parts = code.split(';');
|
|
148
|
+
const out = [];
|
|
149
|
+
for (let index = 0; index < parts.length; index += 1) {
|
|
150
|
+
const part = parts[index] ?? '';
|
|
151
|
+
if (part === '38' || part === '48') {
|
|
152
|
+
const background = part === '48';
|
|
153
|
+
const mode = parts[index + 1];
|
|
154
|
+
if (mode === '2') {
|
|
155
|
+
const rgb = [
|
|
156
|
+
Number(parts[index + 2]), Number(parts[index + 3]), Number(parts[index + 4]),
|
|
157
|
+
];
|
|
158
|
+
index += 4;
|
|
159
|
+
if (depth === 'none' || rgb.some(channel => !Number.isFinite(channel)))
|
|
160
|
+
continue;
|
|
161
|
+
if (depth === '256') {
|
|
162
|
+
// Truecolor keeps its brightness here, and a background is never the
|
|
163
|
+
// colour of its own foreground (green on green hid a `write` preview).
|
|
164
|
+
out.push(String(background ? 48 : 38), '5', String(background ? DIFF_BACKGROUND_INDEX : nearestCubeIndex(rgb[0], rgb[1], rgb[2])));
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
out.push(...paintColour(basicSgrFor(rgb[0], rgb[1], rgb[2]), background, depth));
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (mode === '5') {
|
|
171
|
+
const at = Number(parts[index + 2]);
|
|
172
|
+
index += 2;
|
|
173
|
+
if (depth === 'none' || !Number.isFinite(at))
|
|
174
|
+
continue;
|
|
175
|
+
if (depth === '256') {
|
|
176
|
+
out.push(String(background ? 48 : 38), '5', String(at));
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const [r, g, b] = rgbFrom256(at);
|
|
180
|
+
out.push(...paintColour(basicSgrFor(r, g, b), background, depth));
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
// A malformed introducer takes its payload with it rather than leaving a
|
|
184
|
+
// stray parameter behind.
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (depth === 'none' && BASIC_COLOUR.has(part))
|
|
188
|
+
continue;
|
|
189
|
+
out.push(part);
|
|
190
|
+
}
|
|
191
|
+
return out.filter(part => part !== '').join(';');
|
|
192
|
+
}
|
|
193
|
+
/** Whether one parameter is a bare colour (and so goes at `none`). */
|
|
194
|
+
const BASIC_COLOUR = new Set([
|
|
195
|
+
...Array.from({ length: 8 }, (_unused, at) => String(30 + at)),
|
|
196
|
+
...Array.from({ length: 8 }, (_unused, at) => String(40 + at)),
|
|
197
|
+
...Array.from({ length: 8 }, (_unused, at) => String(90 + at)),
|
|
198
|
+
...Array.from({ length: 8 }, (_unused, at) => String(100 + at)),
|
|
199
|
+
]);
|
|
200
|
+
/** Foreground/background parameters for one standard colour at the given depth. */
|
|
201
|
+
function paintColour(sgr, background, depth) {
|
|
202
|
+
if (depth === '256') {
|
|
203
|
+
// The 256-cube index of a basic colour: the first 16 answer directly.
|
|
204
|
+
return [String(background ? 48 : 38), '5', String(sgrTo256(sgr))];
|
|
205
|
+
}
|
|
206
|
+
const basic = sgrToBasicIndex(sgr);
|
|
207
|
+
if (background) {
|
|
208
|
+
// 8-colour terminals have no bright backgrounds worth trusting; a dim
|
|
209
|
+
// background would fight the text. Drop it and let the attribute carry on.
|
|
210
|
+
return ['40'];
|
|
211
|
+
}
|
|
212
|
+
return [String(basic >= 8 ? 90 + (basic - 8) : 30 + basic)];
|
|
213
|
+
}
|
|
214
|
+
/** Standard SGR (30-37 / 90-97) to the 0-15 index. */
|
|
215
|
+
function sgrToBasicIndex(sgr) {
|
|
216
|
+
if (sgr >= 90 && sgr <= 97)
|
|
217
|
+
return sgr - 90 + 8;
|
|
218
|
+
if (sgr >= 30 && sgr <= 37)
|
|
219
|
+
return sgr - 30;
|
|
220
|
+
return 7;
|
|
221
|
+
}
|
|
222
|
+
/** The 0-15 index back to a 256-cube index (the cube starts with them). */
|
|
223
|
+
function sgrTo256(sgr) {
|
|
224
|
+
return sgrToBasicIndex(sgr);
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=color-depth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-depth.js","sourceRoot":"","sources":["../src/color-depth.ts"],"names":[],"mappings":"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"}
|
package/lib/copy-text.js
CHANGED
package/lib/copy-text.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-text.js","sourceRoot":"","sources":["../src/copy-text.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"copy-text.js","sourceRoot":"","sources":["../src/copy-text.ts"],"names":[],"mappings":"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"}
|
package/lib/dialogs.js
CHANGED
|
@@ -14,12 +14,82 @@ export function questionOptionIndex(key, optionCount) {
|
|
|
14
14
|
return undefined;
|
|
15
15
|
return index;
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* The option indexes the current filter leaves visible, in list order.
|
|
19
|
+
*
|
|
20
|
+
* An empty or absent filter keeps everything. The match is the same shape the
|
|
21
|
+
* pickers use: the label or the description, case-insensitively.
|
|
22
|
+
*/
|
|
23
|
+
export function visibleQuestionIndexes(dialog) {
|
|
24
|
+
const options = dialog.question.options ?? [];
|
|
25
|
+
const needle = (dialog.filter ?? '').trim().toLowerCase();
|
|
26
|
+
const all = options.map((_option, index) => index);
|
|
27
|
+
if (needle === '')
|
|
28
|
+
return all;
|
|
29
|
+
return all.filter(index => {
|
|
30
|
+
const option = options[index];
|
|
31
|
+
if (option === undefined)
|
|
32
|
+
return false;
|
|
33
|
+
return [option.label, option.description ?? '', dialog.matchKeys?.[index] ?? '']
|
|
34
|
+
.some(field => field.toLowerCase().includes(needle));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/** Append a typed character to the filter (filter mode only). */
|
|
38
|
+
export function typeQuestionFilter(dialog, text) {
|
|
39
|
+
if (dialog.filtering !== true)
|
|
40
|
+
return false;
|
|
41
|
+
dialog.filter = `${dialog.filter ?? ''}${text}`;
|
|
42
|
+
clampCursorToVisible(dialog);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
/** Remove the last character of the filter; the caller exits when it is empty. */
|
|
46
|
+
export function backspaceQuestionFilter(dialog) {
|
|
47
|
+
if (dialog.filtering !== true)
|
|
48
|
+
return false;
|
|
49
|
+
dialog.filter = (dialog.filter ?? '').slice(0, -1);
|
|
50
|
+
clampCursorToVisible(dialog);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
/** Leave filter mode, keeping whatever was typed (Enter applies it). */
|
|
54
|
+
export function applyQuestionFilter(dialog) {
|
|
55
|
+
dialog.filtering = false;
|
|
56
|
+
}
|
|
57
|
+
/** Leave filter mode and show the whole list again (Esc clears it). */
|
|
58
|
+
export function clearQuestionFilter(dialog) {
|
|
59
|
+
dialog.filtering = false;
|
|
60
|
+
dialog.filter = '';
|
|
61
|
+
clampCursorToVisible(dialog);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Keep the highlight on a visible option after the filter changed: the cursor
|
|
65
|
+
* indexes the full list, and a filtered-out option would otherwise stay
|
|
66
|
+
* selected while invisible.
|
|
67
|
+
*/
|
|
68
|
+
function clampCursorToVisible(dialog) {
|
|
69
|
+
const visible = visibleQuestionIndexes(dialog);
|
|
70
|
+
if (visible.length === 0)
|
|
71
|
+
return;
|
|
72
|
+
if (visible.includes(dialog.cursor))
|
|
73
|
+
return;
|
|
74
|
+
dialog.cursor = visible[0] ?? dialog.cursor;
|
|
75
|
+
if (dialog.question.multiSelect !== true) {
|
|
76
|
+
dialog.selected.clear();
|
|
77
|
+
dialog.selected.add(dialog.cursor);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
17
80
|
/** Move the question highlight, clamped to its options. Returns false if not a question dialog. */
|
|
18
81
|
export function moveQuestionCursor(dialog, delta) {
|
|
19
82
|
const count = dialog.question.options?.length ?? 0;
|
|
20
83
|
if (count === 0)
|
|
21
84
|
return false;
|
|
22
|
-
|
|
85
|
+
const visible = visibleQuestionIndexes(dialog);
|
|
86
|
+
if (visible.length === 0)
|
|
87
|
+
return false;
|
|
88
|
+
const at = visible.indexOf(dialog.cursor);
|
|
89
|
+
const next = at === -1
|
|
90
|
+
? (delta >= 0 ? visible[0] : visible[visible.length - 1])
|
|
91
|
+
: visible[Math.max(0, Math.min(visible.length - 1, at + delta))];
|
|
92
|
+
dialog.cursor = next ?? dialog.cursor;
|
|
23
93
|
if (dialog.question.multiSelect !== true) {
|
|
24
94
|
dialog.selected.clear();
|
|
25
95
|
dialog.selected.add(dialog.cursor);
|
|
@@ -41,6 +111,8 @@ export function selectQuestionOption(dialog, index) {
|
|
|
41
111
|
}
|
|
42
112
|
/** Handle a hotkey: select its option and report whether it applied. */
|
|
43
113
|
export function selectQuestionOptionByKey(dialog, key) {
|
|
114
|
+
if (dialog.filtering === true)
|
|
115
|
+
return false;
|
|
44
116
|
const index = questionOptionIndex(key, dialog.question.options?.length ?? 0);
|
|
45
117
|
if (index === undefined)
|
|
46
118
|
return false;
|
package/lib/dialogs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialogs.js","sourceRoot":"","sources":["../src/dialogs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dialogs.js","sourceRoot":"","sources":["../src/dialogs.ts"],"names":[],"mappings":"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"}
|
package/lib/display-sock.js
CHANGED
|
@@ -823,7 +823,7 @@ export async function runDisplayRelay(path, options = {}) {
|
|
|
823
823
|
try {
|
|
824
824
|
stdout.write('\x1b]0;\x07');
|
|
825
825
|
stdout.write('\x1b[0m\x1b[2J\x1b[3J\x1b[H');
|
|
826
|
-
stdout.write(`\x1b[?1000l\x1b[?1006l\x1b[?2004l\x1b[?25h${useAltScreen ? '\x1b[?1049l' : ''}`);
|
|
826
|
+
stdout.write(`\x1b[?1000l\x1b[?1002l\x1b[?1006l\x1b[?2004l\x1b[?25h${useAltScreen ? '\x1b[?1049l' : ''}`);
|
|
827
827
|
}
|
|
828
828
|
catch {
|
|
829
829
|
// TTY may already be gone
|