dsh-ssh-tui 0.5.2 → 0.5.4
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 +36 -6
- package/README.md +24 -13
- package/lib/approval-reviewer.js +102 -17
- package/lib/approval-reviewer.js.map +1 -1
- package/lib/auto-approval.js +312 -29
- package/lib/auto-approval.js.map +1 -1
- package/lib/footer.js +337 -0
- package/lib/footer.js.map +1 -0
- package/lib/i18n/en.js +83 -8
- package/lib/i18n/en.js.map +1 -1
- package/lib/i18n/index.js +1 -0
- package/lib/i18n/index.js.map +1 -1
- package/lib/i18n/zh.js +83 -8
- package/lib/i18n/zh.js.map +1 -1
- package/lib/json-args.js +30 -0
- package/lib/json-args.js.map +1 -0
- package/lib/paint.js +262 -0
- package/lib/paint.js.map +1 -0
- package/lib/picker.js +407 -56
- package/lib/picker.js.map +1 -1
- package/lib/plan.js +369 -0
- package/lib/plan.js.map +1 -0
- package/lib/quota.js +408 -0
- package/lib/quota.js.map +1 -0
- package/lib/session-list.js +18 -21
- package/lib/session-list.js.map +1 -1
- package/lib/term-text.js +827 -0
- package/lib/term-text.js.map +1 -0
- package/lib/tool-present.js +744 -0
- package/lib/tool-present.js.map +1 -0
- package/lib/transcript-types.js +6 -0
- package/lib/transcript-types.js.map +1 -0
- package/lib/tui.js +747 -3077
- package/lib/tui.js.map +1 -1
- package/lib/types/approval-reviewer.d.ts +18 -4
- package/lib/types/auto-approval.d.ts +53 -2
- package/lib/types/footer.d.ts +155 -0
- package/lib/types/i18n/index.d.ts +2 -0
- package/lib/types/json-args.d.ts +7 -0
- package/lib/types/paint.d.ts +78 -0
- package/lib/types/picker.d.ts +99 -7
- package/lib/types/plan.d.ts +80 -0
- package/lib/types/quota.d.ts +94 -0
- package/lib/types/session-list.d.ts +13 -0
- package/lib/types/term-text.d.ts +130 -0
- package/lib/types/tool-present.d.ts +165 -0
- package/lib/types/transcript-types.d.ts +152 -0
- package/lib/types/tui.d.ts +39 -665
- package/package.json +1 -1
package/lib/paint.js
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental ANSI paint, SSH cadence, hangup signals, and sliding windows.
|
|
3
|
+
*
|
|
4
|
+
* Kept off `tui.ts` so the launch picker can dirty-paint without loading
|
|
5
|
+
* the agent-backed SshTui class.
|
|
6
|
+
*/
|
|
7
|
+
import { t } from './i18n/index.js';
|
|
8
|
+
import { padAnsiToWidth } from './term-text.js';
|
|
9
|
+
const RENDER_INTERVAL_MS = 160;
|
|
10
|
+
const LOCAL_PAINT_INTERVAL_MS = 80;
|
|
11
|
+
const MIN_PAINT_INTERVAL_MS = 40;
|
|
12
|
+
const MAX_PAINT_INTERVAL_MS = 1000;
|
|
13
|
+
export const DSR_PROBE_TIMEOUT_MS = 800;
|
|
14
|
+
/** Give a running turn this long to settle after cancel before we flush anyway. */
|
|
15
|
+
export const HANGUP_CANCEL_TIMEOUT_MS = 10_000;
|
|
16
|
+
/** In-app dialog / slash-suggestion page size. Launch picker uses 9 of its own. */
|
|
17
|
+
export const PICKER_WINDOW = 12;
|
|
18
|
+
/**
|
|
19
|
+
* Explicit env/config always wins. Otherwise local TTYs stay snappy and SSH
|
|
20
|
+
* sessions pick a tier from a measured round-trip (CSI 6n), falling back to
|
|
21
|
+
* 160 ms when the probe is missing.
|
|
22
|
+
*/
|
|
23
|
+
export function resolvePaintIntervalMs(configured, env = process.env, options = {}) {
|
|
24
|
+
const raw = configured ?? Number.parseInt(env.DSH_TUI_PAINT_MS ?? '', 10);
|
|
25
|
+
if (Number.isFinite(raw) && raw > 0) {
|
|
26
|
+
return Math.min(MAX_PAINT_INTERVAL_MS, Math.max(MIN_PAINT_INTERVAL_MS, Math.floor(raw)));
|
|
27
|
+
}
|
|
28
|
+
if (options.ssh === true)
|
|
29
|
+
return paintIntervalForRtt(options.rttMs);
|
|
30
|
+
return LOCAL_PAINT_INTERVAL_MS;
|
|
31
|
+
}
|
|
32
|
+
/** True when this process is attached to an SSH session (jump host / proxy). */
|
|
33
|
+
export function detectSshSession(env = process.env) {
|
|
34
|
+
return Boolean(env.SSH_CONNECTION || env.SSH_CLIENT || env.SSH_TTY);
|
|
35
|
+
}
|
|
36
|
+
/** Node errno on a write/close that means the TTY is gone (SSH drop, HUP). */
|
|
37
|
+
export function isHangupErrno(error) {
|
|
38
|
+
const code = error?.code;
|
|
39
|
+
return code === 'EIO' || code === 'EPIPE' || code === 'ENXIO' || code === 'ECONNRESET';
|
|
40
|
+
}
|
|
41
|
+
const HANGUP_SIGNAL_NAMES = ['SIGHUP', 'SIGTERM', 'SIGINT'];
|
|
42
|
+
/**
|
|
43
|
+
* Replace launcher SIGTERM/SIGINT/SIGHUP handlers with `handler`. SSH drop
|
|
44
|
+
* otherwise lets `dsh` dispose the whole tree before this plugin can detach.
|
|
45
|
+
*/
|
|
46
|
+
export function captureHangupSignals(handler) {
|
|
47
|
+
for (const name of HANGUP_SIGNAL_NAMES) {
|
|
48
|
+
process.removeAllListeners(name);
|
|
49
|
+
process.prependListener(name, handler);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function releaseHangupSignals(handler) {
|
|
53
|
+
for (const name of HANGUP_SIGNAL_NAMES) {
|
|
54
|
+
process.removeListener(name, handler);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** After detach, extra HUP/TERM from sshd must not kill the leftover Host. */
|
|
58
|
+
export function ignoreFurtherHangupSignals() {
|
|
59
|
+
const ignore = () => { };
|
|
60
|
+
for (const name of HANGUP_SIGNAL_NAMES) {
|
|
61
|
+
process.removeAllListeners(name);
|
|
62
|
+
process.on(name, ignore);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Wait until `isIdle` is true or `timeoutMs` elapses. Used after cancel so a
|
|
67
|
+
* hangup can flush a settled session log instead of tearing a live write.
|
|
68
|
+
*/
|
|
69
|
+
export async function waitUntilIdleOrTimeout(isIdle, timeoutMs, now = Date.now, wait = (ms) => new Promise(resolve => {
|
|
70
|
+
setTimeout(resolve, ms);
|
|
71
|
+
})) {
|
|
72
|
+
const deadline = now() + Math.max(0, timeoutMs);
|
|
73
|
+
while (!isIdle()) {
|
|
74
|
+
if (now() >= deadline)
|
|
75
|
+
return 'timeout';
|
|
76
|
+
await wait(Math.min(50, Math.max(0, deadline - now())));
|
|
77
|
+
}
|
|
78
|
+
return 'idle';
|
|
79
|
+
}
|
|
80
|
+
/** Map a CSI-6n round-trip to a paint cadence. Unknown RTT uses the SSH default. */
|
|
81
|
+
export function paintIntervalForRtt(rttMs) {
|
|
82
|
+
if (rttMs === undefined || !Number.isFinite(rttMs) || rttMs < 0)
|
|
83
|
+
return RENDER_INTERVAL_MS;
|
|
84
|
+
if (rttMs < 50)
|
|
85
|
+
return LOCAL_PAINT_INTERVAL_MS;
|
|
86
|
+
if (rttMs < 150)
|
|
87
|
+
return 160;
|
|
88
|
+
if (rttMs < 350)
|
|
89
|
+
return 250;
|
|
90
|
+
return 400;
|
|
91
|
+
}
|
|
92
|
+
export function paintLinkLabel(kind, intervalMs, probed) {
|
|
93
|
+
if (kind === 'local')
|
|
94
|
+
return t('paint.localMs', { ms: intervalMs });
|
|
95
|
+
return probed ? t('paint.sshMs', { ms: intervalMs }) : t('paint.sshMsUnprobed', { ms: intervalMs });
|
|
96
|
+
}
|
|
97
|
+
/** Signal-bar quality from a measured SSH round-trip, or local TTY. */
|
|
98
|
+
export function linkQualityOf(kind, rttMs) {
|
|
99
|
+
if (kind === 'local')
|
|
100
|
+
return 'local';
|
|
101
|
+
if (rttMs === undefined || !Number.isFinite(rttMs) || rttMs < 0)
|
|
102
|
+
return 'unknown';
|
|
103
|
+
if (rttMs < 50)
|
|
104
|
+
return 'good';
|
|
105
|
+
if (rttMs < 150)
|
|
106
|
+
return 'ok';
|
|
107
|
+
if (rttMs < 350)
|
|
108
|
+
return 'slow';
|
|
109
|
+
return 'poor';
|
|
110
|
+
}
|
|
111
|
+
/** How many filled signal pips: 4 local/fast, 3 ok, 2 slow, 1 poor, 0 unknown. */
|
|
112
|
+
export function linkSignalPips(quality) {
|
|
113
|
+
if (quality === 'local' || quality === 'good')
|
|
114
|
+
return 4;
|
|
115
|
+
if (quality === 'ok')
|
|
116
|
+
return 3;
|
|
117
|
+
if (quality === 'slow')
|
|
118
|
+
return 2;
|
|
119
|
+
if (quality === 'poor')
|
|
120
|
+
return 1;
|
|
121
|
+
return 0;
|
|
122
|
+
}
|
|
123
|
+
const LINK_PIP_COLOR = {
|
|
124
|
+
0: '90',
|
|
125
|
+
1: '31',
|
|
126
|
+
2: '33',
|
|
127
|
+
3: '32',
|
|
128
|
+
4: '32',
|
|
129
|
+
};
|
|
130
|
+
/** Compact footer chip: `SSH ●●●○ 90ms` — 1 pip red, 2 yellow, 3+ green. */
|
|
131
|
+
export function formatLinkQualityChip(kind, intervalMs, rttMs, probed, color = false) {
|
|
132
|
+
const quality = linkQualityOf(kind, probed ? rttMs : undefined);
|
|
133
|
+
const filled = linkSignalPips(quality);
|
|
134
|
+
const pips = `${'●'.repeat(filled)}${'○'.repeat(4 - filled)}`;
|
|
135
|
+
const colored = color
|
|
136
|
+
? `\x1b[${LINK_PIP_COLOR[filled] ?? '90'}m${pips}\x1b[0m`
|
|
137
|
+
: pips;
|
|
138
|
+
if (kind === 'local')
|
|
139
|
+
return t('paint.localChip', { pips: colored });
|
|
140
|
+
const delay = probed && rttMs !== undefined && Number.isFinite(rttMs)
|
|
141
|
+
? `${Math.round(rttMs)}ms`
|
|
142
|
+
: `${intervalMs}ms`;
|
|
143
|
+
return t('paint.sshChip', { pips: colored, delay });
|
|
144
|
+
}
|
|
145
|
+
/** One incremental paint as a single stdout write (one SSH packet when corked). */
|
|
146
|
+
export function composePaintOutput(options) {
|
|
147
|
+
const { width, height, paintRows, previousRows, sizeChanged, chromeChanged, chromeStart } = options;
|
|
148
|
+
const previousChromeStart = options.previousChromeStart ?? chromeStart;
|
|
149
|
+
// When a card expands, the input box moves up. Rows that used to be
|
|
150
|
+
// transcript may now be chrome (or vice versa); force-repaint from the
|
|
151
|
+
// higher of the two chrome starts so leftover tool-body glyphs cannot sit
|
|
152
|
+
// on the prompt.
|
|
153
|
+
const dirtyChromeStart = Math.min(chromeStart, previousChromeStart);
|
|
154
|
+
let out = '\x1b[?25l';
|
|
155
|
+
const prev = sizeChanged ? [] : previousRows;
|
|
156
|
+
if (sizeChanged)
|
|
157
|
+
out += '\x1b[H\x1b[J';
|
|
158
|
+
// Never address row height+1: that scrolls the SSH viewport and leaves
|
|
159
|
+
// thinking/tool/assistant glyphs sitting on the next card.
|
|
160
|
+
const rowCount = Math.min(height, paintRows.length);
|
|
161
|
+
let painted = sizeChanged;
|
|
162
|
+
for (let i = 0; i < rowCount; i++) {
|
|
163
|
+
const current = paintRows[i] ?? '';
|
|
164
|
+
if (current === prev[i] && !(chromeChanged && i >= dirtyChromeStart))
|
|
165
|
+
continue;
|
|
166
|
+
painted = true;
|
|
167
|
+
const clipped = padAnsiToWidth(current, width);
|
|
168
|
+
// EL2 *before* the glyphs, from column 1. A full-width write followed
|
|
169
|
+
// by EL hits DEC auto-margin: the cursor wraps, and EL then blanks the
|
|
170
|
+
// next card instead of the row we just drew.
|
|
171
|
+
out += `\x1b[${i + 1};1H\x1b[0m\x1b[2K${clipped}\x1b[0m`;
|
|
172
|
+
}
|
|
173
|
+
if (rowCount < height && (sizeChanged || previousRows.length !== paintRows.length)) {
|
|
174
|
+
painted = true;
|
|
175
|
+
out += `\x1b[${rowCount + 1};1H\x1b[J`;
|
|
176
|
+
}
|
|
177
|
+
if (!painted && options.hideCursor === true)
|
|
178
|
+
return '';
|
|
179
|
+
out += '\x1b[0m';
|
|
180
|
+
if (options.hideCursor === true)
|
|
181
|
+
return out;
|
|
182
|
+
const cursorRow = Math.min(height, Math.max(1, options.cursorRow));
|
|
183
|
+
out += `\x1b[${cursorRow};${Math.max(1, options.cursorColumn)}H\x1b[?25h`;
|
|
184
|
+
return out;
|
|
185
|
+
}
|
|
186
|
+
/** Whether `text` could still grow into a recognized escape sequence. */
|
|
187
|
+
export function isEscapePrefix(text) {
|
|
188
|
+
if (text === '\x1b')
|
|
189
|
+
return true;
|
|
190
|
+
if (!text.startsWith('\x1b'))
|
|
191
|
+
return false;
|
|
192
|
+
if (text === '\x1b[')
|
|
193
|
+
return true;
|
|
194
|
+
if (text === '\x1bO' || /^\x1bO[A-Z]?$/u.test(text))
|
|
195
|
+
return true;
|
|
196
|
+
if (/^\x1b\[[A-D]$/u.test(text))
|
|
197
|
+
return true;
|
|
198
|
+
if (/^\x1b\[[HF]$/u.test(text))
|
|
199
|
+
return true;
|
|
200
|
+
if (/^\x1b\[\d+~?$/u.test(text))
|
|
201
|
+
return true;
|
|
202
|
+
if (/^\x1b\[\d+(?:;\d+)?R?$/u.test(text))
|
|
203
|
+
return true;
|
|
204
|
+
if (/^\x1b\[<(?:\d*;?)*[Mm]?$/u.test(text))
|
|
205
|
+
return true;
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
/** Parse a Device Status Report cursor reply (`CSI row;col R`). */
|
|
209
|
+
export function parseCursorPositionReply(text) {
|
|
210
|
+
const match = /^\x1b\[(\d+);(\d+)R$/u.exec(text);
|
|
211
|
+
if (match === null)
|
|
212
|
+
return undefined;
|
|
213
|
+
return { row: Number(match[1]), column: Number(match[2]) };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Round-trip to the attached terminal via CSI 6n. Returns undefined when the
|
|
217
|
+
* reply never arrives (dumb pipe, blocked DSR). Does not interpret the
|
|
218
|
+
* coordinates — only the elapsed milliseconds matter.
|
|
219
|
+
*/
|
|
220
|
+
export async function probeTerminalRttMs(stdin = process.stdin, stdout = process.stdout, timeoutMs = DSR_PROBE_TIMEOUT_MS) {
|
|
221
|
+
if (!stdin.isTTY || !stdout.isTTY)
|
|
222
|
+
return undefined;
|
|
223
|
+
return await new Promise(resolve => {
|
|
224
|
+
let buffer = '';
|
|
225
|
+
let settled = false;
|
|
226
|
+
const started = Date.now();
|
|
227
|
+
const finish = (value) => {
|
|
228
|
+
if (settled)
|
|
229
|
+
return;
|
|
230
|
+
settled = true;
|
|
231
|
+
clearTimeout(timer);
|
|
232
|
+
stdin.removeListener('data', onData);
|
|
233
|
+
resolve(value);
|
|
234
|
+
};
|
|
235
|
+
const onData = (chunk) => {
|
|
236
|
+
buffer += chunk.toString('utf8');
|
|
237
|
+
if (parseCursorPositionReply(buffer) !== undefined) {
|
|
238
|
+
finish(Math.max(0, Date.now() - started));
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (buffer.length > 32 && !buffer.includes('\x1b['))
|
|
242
|
+
finish(undefined);
|
|
243
|
+
};
|
|
244
|
+
const timer = setTimeout(() => finish(undefined), timeoutMs);
|
|
245
|
+
stdin.on('data', onData);
|
|
246
|
+
try {
|
|
247
|
+
stdout.write('\x1b[6n');
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
finish(undefined);
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
/** Sliding window of `windowSize` items that keeps `cursor` visible. */
|
|
255
|
+
export function pickerWindowStart(cursor, total, windowSize = PICKER_WINDOW) {
|
|
256
|
+
if (total <= windowSize)
|
|
257
|
+
return 0;
|
|
258
|
+
const maxStart = Math.max(0, total - windowSize);
|
|
259
|
+
const start = cursor - Math.floor((windowSize - 1) / 2);
|
|
260
|
+
return Math.max(0, Math.min(maxStart, start));
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=paint.js.map
|
package/lib/paint.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paint.js","sourceRoot":"","sources":["../src/paint.ts"],"names":[],"mappings":"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"}
|