@stanleysun233/oneproxy-cli 1.0.6 → 1.0.7
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/daemon/http-proxy.js +89 -9
- package/dist/daemon/http-proxy.js.map +1 -1
- package/dist/main.js +3 -3
- package/dist/main.js.map +1 -1
- package/dist/session-env.d.ts +4 -0
- package/dist/session-env.js +80 -3
- package/dist/session-env.js.map +1 -1
- package/dist/shell.d.ts +4 -0
- package/dist/shell.js +74 -0
- package/dist/shell.js.map +1 -1
- package/dist/ssh.d.ts +6 -1
- package/dist/ssh.js +66 -2
- package/dist/ssh.js.map +1 -1
- package/dist/tui/capability.d.ts +48 -0
- package/dist/tui/capability.js +86 -0
- package/dist/tui/capability.js.map +1 -0
- package/dist/tui/footer.d.ts +54 -0
- package/dist/tui/footer.js +211 -0
- package/dist/tui/footer.js.map +1 -0
- package/dist/tui/pty.d.ts +23 -0
- package/dist/tui/pty.js +47 -0
- package/dist/tui/pty.js.map +1 -0
- package/dist/tui/runtime.d.ts +53 -0
- package/dist/tui/runtime.js +168 -0
- package/dist/tui/runtime.js.map +1 -0
- package/dist/tui/status.d.ts +9 -0
- package/dist/tui/status.js +65 -0
- package/dist/tui/status.js.map +1 -0
- package/package.json +4 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export { footerRowsForTerminal as footerRowsForTerminalHeight } from './footer.ts';
|
|
2
|
+
export declare const tuiUnavailableWarning = "onep tui: unavailable, using standard terminal mode";
|
|
3
|
+
export type TuiCapabilityInput = {
|
|
4
|
+
requested: boolean;
|
|
5
|
+
interactive: boolean;
|
|
6
|
+
json: boolean;
|
|
7
|
+
stdinIsTty: boolean;
|
|
8
|
+
stdoutIsTty: boolean;
|
|
9
|
+
stderrIsTty: boolean;
|
|
10
|
+
term?: string;
|
|
11
|
+
platform: NodeJS.Platform;
|
|
12
|
+
rows?: number;
|
|
13
|
+
ptyAvailable: boolean;
|
|
14
|
+
};
|
|
15
|
+
export type TuiCapabilityResult = {
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
warn: boolean;
|
|
18
|
+
reason?: TuiUnavailableReason;
|
|
19
|
+
};
|
|
20
|
+
export type TuiCapabilityProbeInput = {
|
|
21
|
+
requested: boolean;
|
|
22
|
+
interactive?: boolean;
|
|
23
|
+
json: boolean;
|
|
24
|
+
stdin: {
|
|
25
|
+
isTTY?: boolean;
|
|
26
|
+
};
|
|
27
|
+
stdout: {
|
|
28
|
+
isTTY?: boolean;
|
|
29
|
+
rows?: number;
|
|
30
|
+
};
|
|
31
|
+
stderr: {
|
|
32
|
+
isTTY?: boolean;
|
|
33
|
+
};
|
|
34
|
+
env?: NodeJS.ProcessEnv;
|
|
35
|
+
platform: NodeJS.Platform;
|
|
36
|
+
ptyAvailable: boolean;
|
|
37
|
+
};
|
|
38
|
+
export type TuiCapabilityProbeResult = {
|
|
39
|
+
available: boolean;
|
|
40
|
+
reason: TuiCapabilityProbeReason | null;
|
|
41
|
+
color: boolean;
|
|
42
|
+
};
|
|
43
|
+
export type TuiUnavailableReason = 'not_requested' | 'not_interactive' | 'json' | 'not_tty' | 'dumb_terminal' | 'unsupported_platform' | 'terminal_too_small' | 'pty_unavailable';
|
|
44
|
+
export type TuiCapabilityProbeReason = Exclude<TuiUnavailableReason, 'json'> | 'json_output';
|
|
45
|
+
export declare const minimumTuiRows = 10;
|
|
46
|
+
export declare function detectTuiCapability(input: TuiCapabilityInput): TuiCapabilityResult;
|
|
47
|
+
export declare function detectTuiCapability(input: TuiCapabilityProbeInput): TuiCapabilityProbeResult;
|
|
48
|
+
export declare function currentTuiCapabilityInput(requested: boolean, interactive: boolean, json: boolean, ptyAvailable: boolean): TuiCapabilityInput;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export { footerRowsForTerminal as footerRowsForTerminalHeight } from "./footer.js";
|
|
2
|
+
export const tuiUnavailableWarning = 'onep tui: unavailable, using standard terminal mode';
|
|
3
|
+
export const minimumTuiRows = 10;
|
|
4
|
+
const supportedPlatforms = new Set(['darwin', 'linux']);
|
|
5
|
+
export function detectTuiCapability(input) {
|
|
6
|
+
if (isProbeInput(input)) {
|
|
7
|
+
const normalized = normalizeProbeInput(input);
|
|
8
|
+
const reason = unavailableReason(normalized);
|
|
9
|
+
return {
|
|
10
|
+
available: reason === null,
|
|
11
|
+
reason: probeReason(reason),
|
|
12
|
+
color: Boolean(input.stdout.isTTY && input.env?.TERM !== 'dumb' && !input.env?.NO_COLOR)
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const reason = unavailableReason(input);
|
|
16
|
+
if (!reason) {
|
|
17
|
+
return { enabled: true, warn: false };
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
enabled: false,
|
|
21
|
+
warn: input.requested && reason !== 'not_requested',
|
|
22
|
+
reason
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function isProbeInput(input) {
|
|
26
|
+
return 'stdin' in input;
|
|
27
|
+
}
|
|
28
|
+
function normalizeProbeInput(input) {
|
|
29
|
+
return {
|
|
30
|
+
requested: input.requested,
|
|
31
|
+
interactive: input.interactive ?? true,
|
|
32
|
+
json: input.json,
|
|
33
|
+
stdinIsTty: Boolean(input.stdin.isTTY),
|
|
34
|
+
stdoutIsTty: Boolean(input.stdout.isTTY),
|
|
35
|
+
stderrIsTty: Boolean(input.stderr.isTTY),
|
|
36
|
+
term: input.env?.TERM,
|
|
37
|
+
platform: input.platform,
|
|
38
|
+
rows: input.stdout.rows,
|
|
39
|
+
ptyAvailable: input.ptyAvailable
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function probeReason(reason) {
|
|
43
|
+
return reason === 'json' ? 'json_output' : reason;
|
|
44
|
+
}
|
|
45
|
+
function unavailableReason(input) {
|
|
46
|
+
if (!input.requested) {
|
|
47
|
+
return 'not_requested';
|
|
48
|
+
}
|
|
49
|
+
if (!input.interactive) {
|
|
50
|
+
return 'not_interactive';
|
|
51
|
+
}
|
|
52
|
+
if (input.json) {
|
|
53
|
+
return 'json';
|
|
54
|
+
}
|
|
55
|
+
if (!input.stdinIsTty || !input.stdoutIsTty || !input.stderrIsTty) {
|
|
56
|
+
return 'not_tty';
|
|
57
|
+
}
|
|
58
|
+
if (input.term === 'dumb') {
|
|
59
|
+
return 'dumb_terminal';
|
|
60
|
+
}
|
|
61
|
+
if (!supportedPlatforms.has(input.platform)) {
|
|
62
|
+
return 'unsupported_platform';
|
|
63
|
+
}
|
|
64
|
+
if ((input.rows ?? 0) < minimumTuiRows) {
|
|
65
|
+
return 'terminal_too_small';
|
|
66
|
+
}
|
|
67
|
+
if (!input.ptyAvailable) {
|
|
68
|
+
return 'pty_unavailable';
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
export function currentTuiCapabilityInput(requested, interactive, json, ptyAvailable) {
|
|
73
|
+
return {
|
|
74
|
+
requested,
|
|
75
|
+
interactive,
|
|
76
|
+
json,
|
|
77
|
+
stdinIsTty: Boolean(process.stdin.isTTY),
|
|
78
|
+
stdoutIsTty: Boolean(process.stdout.isTTY),
|
|
79
|
+
stderrIsTty: Boolean(process.stderr.isTTY),
|
|
80
|
+
term: process.env.TERM,
|
|
81
|
+
platform: process.platform,
|
|
82
|
+
rows: process.stdout.rows,
|
|
83
|
+
ptyAvailable
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=capability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../../src/tui/capability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export type TuiPathNode = {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
kind: 'user' | 'node' | 'web' | string;
|
|
5
|
+
transport: string;
|
|
6
|
+
};
|
|
7
|
+
export type TuiStatusSnapshot = {
|
|
8
|
+
account: string;
|
|
9
|
+
tenant: string;
|
|
10
|
+
pingMs: number | null;
|
|
11
|
+
uploadBytes: number | null;
|
|
12
|
+
downloadBytes: number | null;
|
|
13
|
+
path: {
|
|
14
|
+
mode: string;
|
|
15
|
+
transport: string;
|
|
16
|
+
fallbackReason: string;
|
|
17
|
+
nodes: TuiPathNode[];
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export type FooterPlan = {
|
|
21
|
+
rows: number;
|
|
22
|
+
startRow: number;
|
|
23
|
+
terminalColumns: number;
|
|
24
|
+
terminalRows: number;
|
|
25
|
+
childColumns: number;
|
|
26
|
+
childRows: number;
|
|
27
|
+
};
|
|
28
|
+
export type RenderFooterOptions = {
|
|
29
|
+
columns: number;
|
|
30
|
+
rows: number;
|
|
31
|
+
color: boolean;
|
|
32
|
+
};
|
|
33
|
+
export declare function footerRowsForTerminal(terminalRows: number): number;
|
|
34
|
+
export type FormatFooterOptions = {
|
|
35
|
+
columns: number;
|
|
36
|
+
footerRows: number;
|
|
37
|
+
color: boolean;
|
|
38
|
+
};
|
|
39
|
+
export type FormattedFooter = {
|
|
40
|
+
lines: string[];
|
|
41
|
+
};
|
|
42
|
+
export declare function formatFooter(snapshot: TuiStatusSnapshot, options: FormatFooterOptions): FormattedFooter;
|
|
43
|
+
export declare function planFooter(terminalColumns: number, terminalRows: number): FooterPlan;
|
|
44
|
+
export declare function renderFooterLines(snapshot: TuiStatusSnapshot, options: RenderFooterOptions): string[];
|
|
45
|
+
export declare function renderStatusLine(snapshot: TuiStatusSnapshot, color: boolean): string;
|
|
46
|
+
export declare function renderTotalsLine(snapshot: TuiStatusSnapshot, color: boolean): string;
|
|
47
|
+
export declare function renderPathLine(snapshot: TuiStatusSnapshot, color: boolean): string;
|
|
48
|
+
export declare function formatPathText(path: Pick<TuiStatusSnapshot['path'], 'nodes'>): string;
|
|
49
|
+
export declare function latencyStyleName(pingMs: number | null): 'gray' | 'mint' | 'butter' | 'coral';
|
|
50
|
+
export declare function visibleWidth(value: string): number;
|
|
51
|
+
export declare function stripAnsi(value: string): string;
|
|
52
|
+
export declare function truncateVisible(value: string, columns: number): string;
|
|
53
|
+
export declare function truncateMiddleVisible(value: string, columns: number): string;
|
|
54
|
+
export declare function rightAlign(value: string, columns: number): string;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
const ansiPattern = /\u001b\[[0-9;]*m/g;
|
|
2
|
+
const minimumMainRows = 8;
|
|
3
|
+
const reset = '\u001b[0m';
|
|
4
|
+
const darkForeground = '\u001b[38;2;26;32;44m';
|
|
5
|
+
const styles = {
|
|
6
|
+
mint: segmentStyle(186, 242, 214),
|
|
7
|
+
lavender: segmentStyle(218, 207, 255),
|
|
8
|
+
butter: segmentStyle(255, 236, 169),
|
|
9
|
+
coral: segmentStyle(255, 190, 171),
|
|
10
|
+
gray: segmentStyle(217, 222, 226),
|
|
11
|
+
blue: foregroundStyle(93, 148, 255),
|
|
12
|
+
cyan: foregroundStyle(62, 194, 211),
|
|
13
|
+
muted: foregroundStyle(132, 140, 148),
|
|
14
|
+
failure: foregroundStyle(220, 72, 77),
|
|
15
|
+
fallback: foregroundStyle(180, 132, 0)
|
|
16
|
+
};
|
|
17
|
+
export function footerRowsForTerminal(terminalRows) {
|
|
18
|
+
if (terminalRows >= 18) {
|
|
19
|
+
return 3;
|
|
20
|
+
}
|
|
21
|
+
if (terminalRows >= 14) {
|
|
22
|
+
return 2;
|
|
23
|
+
}
|
|
24
|
+
if (terminalRows < 10) {
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
27
|
+
return 1;
|
|
28
|
+
}
|
|
29
|
+
export function formatFooter(snapshot, options) {
|
|
30
|
+
const lines = [];
|
|
31
|
+
if (options.footerRows >= 1) {
|
|
32
|
+
lines.push(truncateVisible(renderStatusLine(snapshot, options.color), options.columns));
|
|
33
|
+
}
|
|
34
|
+
if (options.footerRows >= 2) {
|
|
35
|
+
lines.push(rightAlign(renderTotalsLine(snapshot, options.color), options.columns));
|
|
36
|
+
}
|
|
37
|
+
if (options.footerRows >= 3) {
|
|
38
|
+
lines.push(truncateMiddleVisible(renderPathLine(snapshot, options.color), options.columns));
|
|
39
|
+
}
|
|
40
|
+
return { lines };
|
|
41
|
+
}
|
|
42
|
+
export function planFooter(terminalColumns, terminalRows) {
|
|
43
|
+
const rows = footerRowsForTerminal(terminalRows);
|
|
44
|
+
const childRows = Math.max(terminalRows - rows, minimumMainRows);
|
|
45
|
+
return {
|
|
46
|
+
rows,
|
|
47
|
+
startRow: Math.max(1, terminalRows - rows + 1),
|
|
48
|
+
terminalColumns,
|
|
49
|
+
terminalRows,
|
|
50
|
+
childColumns: terminalColumns,
|
|
51
|
+
childRows
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function renderFooterLines(snapshot, options) {
|
|
55
|
+
return formatFooter(snapshot, {
|
|
56
|
+
columns: options.columns,
|
|
57
|
+
footerRows: footerRowsForTerminal(options.rows),
|
|
58
|
+
color: options.color
|
|
59
|
+
}).lines;
|
|
60
|
+
}
|
|
61
|
+
export function renderStatusLine(snapshot, color) {
|
|
62
|
+
return [
|
|
63
|
+
styleSegment(snapshot.account || 'not logged in', styles.mint, color),
|
|
64
|
+
styleSegment(snapshot.tenant || 'none', styles.lavender, color),
|
|
65
|
+
styleSegment(formatPing(snapshot.pingMs), pingStyle(snapshot.pingMs), color)
|
|
66
|
+
].join(' ');
|
|
67
|
+
}
|
|
68
|
+
export function renderTotalsLine(snapshot, color) {
|
|
69
|
+
return [
|
|
70
|
+
'Total',
|
|
71
|
+
colorize('↑', styles.blue, color),
|
|
72
|
+
formatBytes(snapshot.uploadBytes),
|
|
73
|
+
'|',
|
|
74
|
+
colorize('↓', styles.cyan, color),
|
|
75
|
+
formatBytes(snapshot.downloadBytes)
|
|
76
|
+
].join(' ');
|
|
77
|
+
}
|
|
78
|
+
export function renderPathLine(snapshot, color) {
|
|
79
|
+
const nodes = snapshot.path.nodes
|
|
80
|
+
.map((node, index) => {
|
|
81
|
+
const label = (node.name || node.id).trim();
|
|
82
|
+
return label ? styleSegment(label, pathNodeStyle(node, index), color) : '';
|
|
83
|
+
})
|
|
84
|
+
.filter(Boolean);
|
|
85
|
+
if (nodes.length === 0) {
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
const separator = colorize('-', styles.muted, color);
|
|
89
|
+
const line = nodes.join(separator);
|
|
90
|
+
if (!snapshot.path.fallbackReason) {
|
|
91
|
+
return line;
|
|
92
|
+
}
|
|
93
|
+
return `${line}${separator}${colorize(snapshot.path.fallbackReason, styles.fallback, color)}`;
|
|
94
|
+
}
|
|
95
|
+
export function formatPathText(path) {
|
|
96
|
+
return path.nodes
|
|
97
|
+
.map((node) => (node.name || node.id).trim())
|
|
98
|
+
.filter(Boolean)
|
|
99
|
+
.join('-');
|
|
100
|
+
}
|
|
101
|
+
export function latencyStyleName(pingMs) {
|
|
102
|
+
if (pingMs === null) {
|
|
103
|
+
return 'gray';
|
|
104
|
+
}
|
|
105
|
+
if (pingMs < 100) {
|
|
106
|
+
return 'mint';
|
|
107
|
+
}
|
|
108
|
+
if (pingMs < 300) {
|
|
109
|
+
return 'butter';
|
|
110
|
+
}
|
|
111
|
+
return 'coral';
|
|
112
|
+
}
|
|
113
|
+
export function visibleWidth(value) {
|
|
114
|
+
return stripAnsi(value).length;
|
|
115
|
+
}
|
|
116
|
+
export function stripAnsi(value) {
|
|
117
|
+
return value.replace(ansiPattern, '');
|
|
118
|
+
}
|
|
119
|
+
export function truncateVisible(value, columns) {
|
|
120
|
+
if (columns <= 0 || visibleWidth(value) <= columns) {
|
|
121
|
+
return columns <= 0 ? '' : value;
|
|
122
|
+
}
|
|
123
|
+
const styled = ansiPattern.test(value);
|
|
124
|
+
ansiPattern.lastIndex = 0;
|
|
125
|
+
let output = '';
|
|
126
|
+
let width = 0;
|
|
127
|
+
for (let index = 0; index < value.length && width < columns;) {
|
|
128
|
+
const ansi = value.slice(index).match(/^\u001b\[[0-9;]*m/);
|
|
129
|
+
if (ansi) {
|
|
130
|
+
output += ansi[0];
|
|
131
|
+
index += ansi[0].length;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
output += value[index];
|
|
135
|
+
width += 1;
|
|
136
|
+
index += 1;
|
|
137
|
+
}
|
|
138
|
+
return styled && !output.endsWith(reset) ? `${output}${reset}` : output;
|
|
139
|
+
}
|
|
140
|
+
export function truncateMiddleVisible(value, columns) {
|
|
141
|
+
if (columns <= 0) {
|
|
142
|
+
return '';
|
|
143
|
+
}
|
|
144
|
+
if (visibleWidth(value) <= columns) {
|
|
145
|
+
return value;
|
|
146
|
+
}
|
|
147
|
+
if (columns <= 1) {
|
|
148
|
+
return '…';
|
|
149
|
+
}
|
|
150
|
+
const plain = stripAnsi(value);
|
|
151
|
+
const left = Math.ceil((columns - 1) / 2);
|
|
152
|
+
const right = Math.floor((columns - 1) / 2);
|
|
153
|
+
return `${plain.slice(0, left)}…${plain.slice(plain.length - right)}`;
|
|
154
|
+
}
|
|
155
|
+
export function rightAlign(value, columns) {
|
|
156
|
+
const width = visibleWidth(value);
|
|
157
|
+
if (width >= columns) {
|
|
158
|
+
return truncateVisible(value, columns);
|
|
159
|
+
}
|
|
160
|
+
return `${' '.repeat(columns - width)}${value}`;
|
|
161
|
+
}
|
|
162
|
+
function formatPing(pingMs) {
|
|
163
|
+
return pingMs === null ? '--' : `${Math.round(pingMs)}ms`;
|
|
164
|
+
}
|
|
165
|
+
function formatBytes(bytes) {
|
|
166
|
+
if (bytes === null) {
|
|
167
|
+
return '--';
|
|
168
|
+
}
|
|
169
|
+
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
170
|
+
let value = bytes;
|
|
171
|
+
let unit = 0;
|
|
172
|
+
while (value >= 1000 && unit < units.length - 1) {
|
|
173
|
+
value /= 1000;
|
|
174
|
+
unit += 1;
|
|
175
|
+
}
|
|
176
|
+
if (unit === 0) {
|
|
177
|
+
return `${value} ${units[unit]}`;
|
|
178
|
+
}
|
|
179
|
+
return `${value.toFixed(value >= 10 ? 1 : 2)} ${units[unit]}`;
|
|
180
|
+
}
|
|
181
|
+
function pingStyle(pingMs) {
|
|
182
|
+
return styles[latencyStyleName(pingMs)];
|
|
183
|
+
}
|
|
184
|
+
function pathNodeStyle(node, index) {
|
|
185
|
+
if (node.kind === 'user') {
|
|
186
|
+
return styles.mint;
|
|
187
|
+
}
|
|
188
|
+
if (node.kind === 'web') {
|
|
189
|
+
return styles.coral;
|
|
190
|
+
}
|
|
191
|
+
return index % 2 === 0 ? styles.lavender : styles.butter;
|
|
192
|
+
}
|
|
193
|
+
function styleSegment(value, style, color) {
|
|
194
|
+
return color ? colorize(` ${value} `, style, true) : value;
|
|
195
|
+
}
|
|
196
|
+
function colorize(value, style, color) {
|
|
197
|
+
return color ? `${style.open}${value}${style.close}` : value;
|
|
198
|
+
}
|
|
199
|
+
function segmentStyle(red, green, blue) {
|
|
200
|
+
return {
|
|
201
|
+
open: `\u001b[48;2;${red};${green};${blue}m${darkForeground}`,
|
|
202
|
+
close: reset
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
function foregroundStyle(red, green, blue) {
|
|
206
|
+
return {
|
|
207
|
+
open: `\u001b[38;2;${red};${green};${blue}m`,
|
|
208
|
+
close: reset
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../../src/tui/footer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type PtyProcess = {
|
|
2
|
+
pid: number;
|
|
3
|
+
write(data: string | Buffer): void;
|
|
4
|
+
resize(columns: number, rows: number): void;
|
|
5
|
+
kill(signal?: string): void;
|
|
6
|
+
onData(callback: (data: string) => void): void;
|
|
7
|
+
onExit(callback: (event: {
|
|
8
|
+
exitCode: number;
|
|
9
|
+
signal?: number;
|
|
10
|
+
}) => void): void;
|
|
11
|
+
};
|
|
12
|
+
export type PtySpawnOptions = {
|
|
13
|
+
columns: number;
|
|
14
|
+
cols?: number;
|
|
15
|
+
rows: number;
|
|
16
|
+
cwd?: string;
|
|
17
|
+
env?: NodeJS.ProcessEnv;
|
|
18
|
+
};
|
|
19
|
+
export type PtyAdapter = {
|
|
20
|
+
spawn(executable: string, args: string[], options: PtySpawnOptions): PtyProcess;
|
|
21
|
+
};
|
|
22
|
+
export declare function isNodePtyAvailable(): Promise<boolean>;
|
|
23
|
+
export declare function loadPtyAdapter(): Promise<PtyAdapter | null>;
|
package/dist/tui/pty.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export async function isNodePtyAvailable() {
|
|
2
|
+
return (await loadNodePty()) !== null;
|
|
3
|
+
}
|
|
4
|
+
export async function loadPtyAdapter() {
|
|
5
|
+
const nodePty = await loadNodePty();
|
|
6
|
+
if (!nodePty) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
return {
|
|
10
|
+
spawn(executable, args, options) {
|
|
11
|
+
const child = nodePty.spawn(executable, args, {
|
|
12
|
+
cols: options.columns,
|
|
13
|
+
rows: options.rows,
|
|
14
|
+
cwd: options.cwd,
|
|
15
|
+
env: options.env
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
pid: child.pid,
|
|
19
|
+
write(data) {
|
|
20
|
+
child.write(typeof data === 'string' ? data : data.toString('utf8'));
|
|
21
|
+
},
|
|
22
|
+
resize(columns, rows) {
|
|
23
|
+
child.resize(columns, rows);
|
|
24
|
+
},
|
|
25
|
+
kill(signal) {
|
|
26
|
+
child.kill(signal);
|
|
27
|
+
},
|
|
28
|
+
onData(callback) {
|
|
29
|
+
child.onData(callback);
|
|
30
|
+
},
|
|
31
|
+
onExit(callback) {
|
|
32
|
+
child.onExit(callback);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function loadNodePty() {
|
|
39
|
+
try {
|
|
40
|
+
const dynamicImport = new Function('specifier', 'return import(specifier)');
|
|
41
|
+
return await dynamicImport('node-pty');
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=pty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.js","sourceRoot":"","sources":["../../src/tui/pty.ts"],"names":[],"mappings":"AAqCA,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,OAAO,CAAC,MAAM,WAAW,EAAE,CAAC,KAAK,IAAI,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO;YAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE;gBAC5C,IAAI,EAAE,OAAO,CAAC,OAAO;gBACrB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC,CAAC;YACH,OAAO;gBACL,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,KAAK,CAAC,IAAI;oBACR,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBACvE,CAAC;gBACD,MAAM,CAAC,OAAO,EAAE,IAAI;oBAClB,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC9B,CAAC;gBACD,IAAI,CAAC,MAAM;oBACT,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,CAAC;gBACD,MAAM,CAAC,QAAQ;oBACb,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC;gBACD,MAAM,CAAC,QAAQ;oBACb,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAA4C,CAAC;QACvH,OAAO,MAAM,aAAa,CAAC,UAAU,CAAkB,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type TuiStatusSnapshot } from './footer.ts';
|
|
2
|
+
import { type PtyAdapter } from './pty.ts';
|
|
3
|
+
export type TuiCommand = {
|
|
4
|
+
executable: string;
|
|
5
|
+
args: string[];
|
|
6
|
+
cwd?: string;
|
|
7
|
+
env?: NodeJS.ProcessEnv;
|
|
8
|
+
};
|
|
9
|
+
export type TuiRuntimeOptions = {
|
|
10
|
+
command: TuiCommand;
|
|
11
|
+
snapshot: TuiStatusSnapshot | (() => TuiStatusSnapshot | Promise<TuiStatusSnapshot>);
|
|
12
|
+
requested: boolean;
|
|
13
|
+
interactive?: boolean;
|
|
14
|
+
json?: boolean;
|
|
15
|
+
ptyAdapter?: PtyAdapter;
|
|
16
|
+
};
|
|
17
|
+
export type TuiSessionOptions = {
|
|
18
|
+
command: string;
|
|
19
|
+
args: string[];
|
|
20
|
+
cwd?: string;
|
|
21
|
+
env?: NodeJS.ProcessEnv;
|
|
22
|
+
status: TuiStatusSnapshot | (() => TuiStatusSnapshot | Promise<TuiStatusSnapshot>);
|
|
23
|
+
stdin?: RuntimeInput;
|
|
24
|
+
stdout?: RuntimeOutput;
|
|
25
|
+
stderr?: RuntimeOutput;
|
|
26
|
+
ptyAdapter: PtyAdapter;
|
|
27
|
+
};
|
|
28
|
+
export type TuiRuntimeResult = {
|
|
29
|
+
ran: boolean;
|
|
30
|
+
exitCode?: number;
|
|
31
|
+
};
|
|
32
|
+
export declare function runTuiRuntime(options: TuiRuntimeOptions): Promise<TuiRuntimeResult>;
|
|
33
|
+
export declare function runTuiCommand(options: {
|
|
34
|
+
executable: string;
|
|
35
|
+
args: string[];
|
|
36
|
+
cwd?: string;
|
|
37
|
+
env?: NodeJS.ProcessEnv;
|
|
38
|
+
status?: unknown;
|
|
39
|
+
}): Promise<{
|
|
40
|
+
available: boolean;
|
|
41
|
+
exitCode?: number;
|
|
42
|
+
}>;
|
|
43
|
+
export declare function runTuiSession(options: TuiSessionOptions): Promise<number>;
|
|
44
|
+
type RuntimeInput = NodeJS.ReadStream & {
|
|
45
|
+
isTTY?: boolean;
|
|
46
|
+
setRawMode?: (mode: boolean) => void;
|
|
47
|
+
};
|
|
48
|
+
type RuntimeOutput = NodeJS.WriteStream & {
|
|
49
|
+
isTTY?: boolean;
|
|
50
|
+
columns?: number;
|
|
51
|
+
rows?: number;
|
|
52
|
+
};
|
|
53
|
+
export {};
|