litmus-cli 1.4.71 → 1.4.72
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.md +39 -9
- package/dist/commands/connect.d.ts +1 -0
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +37 -36
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/forward.d.ts +4 -16
- package/dist/commands/forward.d.ts.map +1 -1
- package/dist/commands/forward.js +19 -70
- package/dist/commands/forward.js.map +1 -1
- package/dist/commands/ssh.d.ts +3 -0
- package/dist/commands/ssh.d.ts.map +1 -0
- package/dist/commands/ssh.js +50 -0
- package/dist/commands/ssh.js.map +1 -0
- package/dist/index.js +16 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/auto-forward.d.ts +29 -0
- package/dist/lib/auto-forward.d.ts.map +1 -0
- package/dist/lib/auto-forward.js +229 -0
- package/dist/lib/auto-forward.js.map +1 -0
- package/dist/lib/cursor-session.d.ts +6 -0
- package/dist/lib/cursor-session.d.ts.map +1 -1
- package/dist/lib/cursor-session.js +21 -1
- package/dist/lib/cursor-session.js.map +1 -1
- package/dist/lib/environment-checks.d.ts +1 -2
- package/dist/lib/environment-checks.d.ts.map +1 -1
- package/dist/lib/environment-checks.js +4 -9
- package/dist/lib/environment-checks.js.map +1 -1
- package/dist/lib/hook-logger.cjs +25 -19
- package/dist/lib/install-ssh-forward-hook.d.ts +6 -0
- package/dist/lib/install-ssh-forward-hook.d.ts.map +1 -0
- package/dist/lib/install-ssh-forward-hook.js +57 -0
- package/dist/lib/install-ssh-forward-hook.js.map +1 -0
- package/dist/lib/port-forward.d.ts +16 -0
- package/dist/lib/port-forward.d.ts.map +1 -0
- package/dist/lib/port-forward.js +46 -0
- package/dist/lib/port-forward.js.map +1 -0
- package/dist/lib/ssh-client.d.ts +6 -1
- package/dist/lib/ssh-client.d.ts.map +1 -1
- package/dist/lib/ssh-client.js +44 -4
- package/dist/lib/ssh-client.js.map +1 -1
- package/dist/lib/ssh-forward-hook.d.ts +13 -0
- package/dist/lib/ssh-forward-hook.d.ts.map +1 -0
- package/dist/lib/ssh-forward-hook.js +93 -0
- package/dist/lib/ssh-forward-hook.js.map +1 -0
- package/package.json +2 -2
package/dist/commands/forward.js
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
|
-
import
|
|
2
|
-
import readline from "readline";
|
|
1
|
+
import { tunnelArgs, localPortFree, localPortListening } from "../lib/port-forward.js";
|
|
3
2
|
import chalk from "chalk";
|
|
4
3
|
import { runConnect } from "./connect.js";
|
|
4
|
+
import { autoForward } from "../lib/auto-forward.js";
|
|
5
5
|
import { fatal } from "../lib/errors.js";
|
|
6
6
|
import { openSshTunnel, SSH_CONNECTION_FAILED } from "../lib/ssh-client.js";
|
|
7
|
+
/**
|
|
8
|
+
* ENG-3188: `litmus forward <token> [ports...]` opens the app a candidate runs in their
|
|
9
|
+
* workspace at `localhost` on their own computer, from one command.
|
|
10
|
+
*
|
|
11
|
+
* It is `litmus connect --ide ssh` up to the shell (the same key, workspace start, ssh
|
|
12
|
+
* config and preflight), then `ssh -N -L …` in place of the shell. A local forward
|
|
13
|
+
* reaches any port, a server listening on `localhost` only, and needs no dev-server
|
|
14
|
+
* config, which the browser links (ENG-2390) cannot offer.
|
|
15
|
+
*
|
|
16
|
+
* Without arguments, discover running apps continuously (ENG-3201). Explicit ports
|
|
17
|
+
* keep their selective meaning and work on older workspace images too.
|
|
18
|
+
* `5174:5173` forwards the workspace's 5173 to this computer's 5174.
|
|
19
|
+
*/
|
|
20
|
+
export { tunnelArgs, localPortFree, localPortListening } from "../lib/port-forward.js";
|
|
7
21
|
/** How long a tunnel must stay up for its drop to count as a drop, not a failure to connect. */
|
|
8
22
|
const STABLE_MS = 10000;
|
|
9
23
|
/** Failures to connect in a row before we stop retrying. */
|
|
@@ -34,21 +48,6 @@ export function parsePortArgs(args) {
|
|
|
34
48
|
}
|
|
35
49
|
return out;
|
|
36
50
|
}
|
|
37
|
-
/** `ssh` arguments for the tunnel. */
|
|
38
|
-
export function tunnelArgs(alias, forwards) {
|
|
39
|
-
return [
|
|
40
|
-
"-N",
|
|
41
|
-
// A forward that cannot bind is a failure to report, not a tunnel that is half up.
|
|
42
|
-
"-o", "ExitOnForwardFailure=yes",
|
|
43
|
-
"-o", "ServerAliveInterval=30",
|
|
44
|
-
"-o", "ServerAliveCountMax=3",
|
|
45
|
-
// Every connection to a port with nothing running on it would otherwise print
|
|
46
|
-
// "channel N: open failed" into the candidate's terminal.
|
|
47
|
-
"-o", "LogLevel=QUIET",
|
|
48
|
-
...forwards.flatMap((f) => ["-L", `${f.local}:localhost:${f.remote}`]),
|
|
49
|
-
alias,
|
|
50
|
-
];
|
|
51
|
-
}
|
|
52
51
|
export function forwardingLines(forwards) {
|
|
53
52
|
return [
|
|
54
53
|
"",
|
|
@@ -60,30 +59,6 @@ export function forwardingLines(forwards) {
|
|
|
60
59
|
"",
|
|
61
60
|
];
|
|
62
61
|
}
|
|
63
|
-
/** Whether this computer can listen on `port`, which ssh is about to need. */
|
|
64
|
-
export function localPortFree(port) {
|
|
65
|
-
return new Promise((resolve) => {
|
|
66
|
-
const server = net.createServer();
|
|
67
|
-
server.once("error", () => resolve(false));
|
|
68
|
-
server.listen(port, "127.0.0.1", () => server.close(() => resolve(true)));
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Whether something accepts connections on `port` here. ssh binds a forward's local
|
|
73
|
-
* port only once it has connected and authenticated, so this is how we know the tunnel
|
|
74
|
-
* is up. A connect, never a listen: a listen could hold the port at the moment ssh
|
|
75
|
-
* binds it, and `ExitOnForwardFailure` would end the tunnel over it.
|
|
76
|
-
*/
|
|
77
|
-
export function localPortListening(port) {
|
|
78
|
-
return new Promise((resolve) => {
|
|
79
|
-
const socket = net.connect({ port, host: "127.0.0.1" });
|
|
80
|
-
socket.setTimeout(1000);
|
|
81
|
-
const done = (up) => { socket.destroy(); resolve(up); };
|
|
82
|
-
socket.once("connect", () => done(true));
|
|
83
|
-
socket.once("error", () => done(false));
|
|
84
|
-
socket.once("timeout", () => done(false));
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
62
|
/** Calls `ready` once every forward is listening, unless ssh exits first. */
|
|
88
63
|
async function whenListening(forwards, exited, ready) {
|
|
89
64
|
while (!exited()) {
|
|
@@ -96,34 +71,6 @@ async function whenListening(forwards, exited, ready) {
|
|
|
96
71
|
await new Promise((r) => setTimeout(r, READY_POLL_MS));
|
|
97
72
|
}
|
|
98
73
|
}
|
|
99
|
-
function askForPorts() {
|
|
100
|
-
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
101
|
-
return new Promise((resolve) => {
|
|
102
|
-
rl.question(" Which port does your app run on? (for example 5173): ", (answer) => {
|
|
103
|
-
rl.close();
|
|
104
|
-
resolve(answer);
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
async function choosePorts(named, published) {
|
|
109
|
-
if (named.length)
|
|
110
|
-
return named;
|
|
111
|
-
if (published.length)
|
|
112
|
-
return published.map((p) => ({ local: p, remote: p }));
|
|
113
|
-
if (!process.stdin.isTTY) {
|
|
114
|
-
fatal("No port to forward.", "Name your app's port after the token, for example: litmus forward <token> 5173");
|
|
115
|
-
}
|
|
116
|
-
for (;;) {
|
|
117
|
-
try {
|
|
118
|
-
const chosen = parsePortArgs((await askForPorts()).split(/\s+/));
|
|
119
|
-
if (chosen.length)
|
|
120
|
-
return chosen;
|
|
121
|
-
}
|
|
122
|
-
catch (err) {
|
|
123
|
-
console.log(chalk.yellow(` ${err instanceof Error ? err.message : String(err)}`));
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
74
|
async function holdTunnel(alias, forwards) {
|
|
128
75
|
for (const f of forwards) {
|
|
129
76
|
if (!(await localPortFree(f.local))) {
|
|
@@ -181,7 +128,9 @@ export async function runForward(token, portArgs, opts = {}) {
|
|
|
181
128
|
await runConnect(token, "ssh", {
|
|
182
129
|
verbose: opts.verbose,
|
|
183
130
|
skills: false,
|
|
184
|
-
tunnel: async (alias
|
|
131
|
+
tunnel: async (alias) => named.length
|
|
132
|
+
? holdTunnel(alias, named)
|
|
133
|
+
: autoForward(alias, { args: tunnelArgs, free: localPortFree, listening: localPortListening }),
|
|
185
134
|
});
|
|
186
135
|
}
|
|
187
136
|
//# sourceMappingURL=forward.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forward.js","sourceRoot":"","sources":["../../src/commands/forward.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"forward.js","sourceRoot":"","sources":["../../src/commands/forward.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/commands/ssh.ts"],"names":[],"mappings":"AAIA,uFAAuF;AACvF,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCzD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { autoForward } from "../lib/auto-forward.js";
|
|
2
|
+
import { tunnelArgs, localPortFree, localPortListening } from "../lib/port-forward.js";
|
|
3
|
+
import { openSshSession, startManagedSshTunnel, SSH_CONNECTION_FAILED } from "../lib/ssh-client.js";
|
|
4
|
+
/** The shell owns stdin and Ctrl+C; the connection owns discovery and its children. */
|
|
5
|
+
export async function runSsh(alias) {
|
|
6
|
+
// Only our generated aliases, never SSH options or a shell command.
|
|
7
|
+
if (!/^litmus-[a-zA-Z0-9-]+$/.test(alias))
|
|
8
|
+
throw new Error("Use the litmus-… SSH alias from your assessment page.");
|
|
9
|
+
const abort = new AbortController();
|
|
10
|
+
const ignoreInterrupt = () => { };
|
|
11
|
+
process.on("SIGINT", ignoreInterrupt);
|
|
12
|
+
let terminated = 0;
|
|
13
|
+
const terminate = () => { terminated = 143; abort.abort(); };
|
|
14
|
+
const hangup = () => { terminated = 129; abort.abort(); };
|
|
15
|
+
process.on("SIGTERM", terminate);
|
|
16
|
+
process.on("SIGHUP", hangup);
|
|
17
|
+
const forwarding = autoForward(alias, { args: tunnelArgs, free: localPortFree, listening: localPortListening }, {
|
|
18
|
+
// A separate process group keeps a shell Ctrl+C from killing the tunnels.
|
|
19
|
+
// We still own and await every child; none is unref'd or left behind.
|
|
20
|
+
start: (args) => startManagedSshTunnel(args, undefined, true),
|
|
21
|
+
log: (line) => console.error(`\r\n${line}`),
|
|
22
|
+
}, abort.signal, { handleSignals: false, startupMessage: " App ports will forward automatically to localhost while this SSH session is open." }).catch(() => {
|
|
23
|
+
if (!abort.signal.aborted)
|
|
24
|
+
console.error("\r\n Automatic port forwarding stopped. Your SSH shell is still available. Reconnect to retry.");
|
|
25
|
+
});
|
|
26
|
+
try {
|
|
27
|
+
const status = await openSshSession(alias, "ssh", undefined, abort.signal);
|
|
28
|
+
if (status === null) {
|
|
29
|
+
console.error(" Couldn't start ssh. Install OpenSSH, then run the connection command again.");
|
|
30
|
+
process.exitCode = 1;
|
|
31
|
+
}
|
|
32
|
+
else if (terminated) {
|
|
33
|
+
process.exitCode = terminated;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
if (status === SSH_CONNECTION_FAILED)
|
|
37
|
+
console.error(` If the connection dropped, reconnect with: ssh ${alias}`);
|
|
38
|
+
if (status)
|
|
39
|
+
process.exitCode = status;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
abort.abort();
|
|
44
|
+
await forwarding;
|
|
45
|
+
process.off("SIGINT", ignoreInterrupt);
|
|
46
|
+
process.off("SIGTERM", terminate);
|
|
47
|
+
process.off("SIGHUP", hangup);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=ssh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/commands/ssh.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { runDiagnoseConnection } from "./commands/diagnose-connection.js";
|
|
3
3
|
import { program } from "commander";
|
|
4
|
+
import { cursorSessionFlags } from "./lib/cursor-session.js";
|
|
4
5
|
import { runInit } from "./commands/init.js";
|
|
5
6
|
import { runConnect } from "./commands/connect.js";
|
|
7
|
+
import { runSsh } from "./commands/ssh.js";
|
|
6
8
|
import { runForward } from "./commands/forward.js";
|
|
7
9
|
import { runPush } from "./commands/push.js";
|
|
8
10
|
import { runSubmit } from "./commands/submit.js";
|
|
@@ -44,12 +46,9 @@ program
|
|
|
44
46
|
process.exit(1);
|
|
45
47
|
}
|
|
46
48
|
});
|
|
47
|
-
program
|
|
48
|
-
.command("connect [token]")
|
|
49
|
+
cursorSessionFlags(program.command("connect [token]"))
|
|
49
50
|
.description("Open your assessment workspace in your editor of choice (codespace)")
|
|
50
51
|
.option("--ide <editor>", "Where to open: vscode (native VS Code), cursor (native Cursor), browser, or ssh")
|
|
51
|
-
.option("--cursor-session-cleanup", "Experimental: disconnect the ended Cursor IDE and remove its recent entry; does not delete chats")
|
|
52
|
-
.option("--cursor-agent-window", "Experimental: install the Litmus companion to hand this IDE workspace to Agents Window")
|
|
53
52
|
.option("--verbose", "Print what your editor wrote while opening, for support")
|
|
54
53
|
.option("--skills", "Import your AI skills (~/.claude/skills, ~/.agents/skills, ...) into the workspace without asking")
|
|
55
54
|
.option("--no-skills", "Don't offer to import your AI skills")
|
|
@@ -64,6 +63,18 @@ program
|
|
|
64
63
|
process.exit(1);
|
|
65
64
|
}
|
|
66
65
|
});
|
|
66
|
+
program
|
|
67
|
+
.command("ssh <alias>")
|
|
68
|
+
.description("Open a configured workspace SSH shell with automatic localhost forwarding")
|
|
69
|
+
.action(async (alias) => {
|
|
70
|
+
try {
|
|
71
|
+
await runSsh(alias);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
75
|
+
process.exitCode = 1;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
67
78
|
program
|
|
68
79
|
.command("diagnose-connection [token]")
|
|
69
80
|
.description("Collect connection diagnostics without changing your editor or workspace")
|
|
@@ -80,7 +91,7 @@ program
|
|
|
80
91
|
});
|
|
81
92
|
program
|
|
82
93
|
.command("forward [token] [ports...]")
|
|
83
|
-
.description("
|
|
94
|
+
.description("Automatically forward workspace apps to localhost; optionally choose ports (5173, or 5174:5173)")
|
|
84
95
|
.option("--verbose", "Print more detail, for support")
|
|
85
96
|
.action(async (token, ports, opts) => {
|
|
86
97
|
try {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAEhF;;;GAGG;AACH,KAAK,UAAU,WAAW,CAAC,GAAuB;IAChD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAA;IAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,mCAAmC,CAAC;KAChD,OAAO,CAAC,WAAW,CAAC,CAAA;AAEvB,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU;YAAE,OAAM;QACrC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,OAAO
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAEhF;;;GAGG;AACH,KAAK,UAAU,WAAW,CAAC,GAAuB;IAChD,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAA;IAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,mCAAmC,CAAC;KAChD,OAAO,CAAC,WAAW,CAAC,CAAA;AAEvB,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU;YAAE,OAAM;QACrC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;KACnD,WAAW,CAAC,qEAAqE,CAAC;KAClF,MAAM,CAAC,gBAAgB,EAAE,iFAAiF,CAAC;KAC3G,MAAM,CAAC,WAAW,EAAE,yDAAyD,CAAC;KAC9E,MAAM,CAAC,UAAU,EAAE,mGAAmG,CAAC;KACvH,MAAM,CAAC,aAAa,EAAE,sCAAsC,CAAC;KAC7D,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,IAAwH,EAAE,EAAE;IACpK,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAA;IAClM,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU;YAAE,OAAM;QACrC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,2EAA2E,CAAC;KACxF,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;IAC9B,IAAI,CAAC;QAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;IAAC,CAAC;IAC3B,OAAO,GAAG,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IAAC,CAAC;AACvG,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,6BAA6B,CAAC;KACtC,WAAW,CAAC,0EAA0E,CAAC;KACvF,MAAM,CAAC,gBAAgB,EAAE,qCAAqC,EAAE,QAAQ,CAAC;KACzE,MAAM,CAAC,cAAc,EAAE,qFAAqF,CAAC;KAC7G,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,IAAoC,EAAE,EAAE;IAChF,IAAI,CAAC;QAAC,MAAM,qBAAqB,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;IAAC,CAAC;IACnE,OAAO,GAAG,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IAAC,CAAC;AACvG,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,4BAA4B,CAAC;KACrC,WAAW,CAAC,iGAAiG,CAAC;KAC9G,MAAM,CAAC,WAAW,EAAE,gCAAgC,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,KAAe,EAAE,IAA2B,EAAE,EAAE;IACxF,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU;YAAE,OAAM;QACrC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kDAAkD,CAAC;IAChE,+EAA+E;IAC/E,kFAAkF;IAClF,gFAAgF;IAChF,iFAAiF;IACjF,6CAA6C;KAC5C,QAAQ,CAAC,SAAS,EAAE,iFAAiF,CAAC;KACtG,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,IAAuB,EAAE,EAAE;IACnE,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU;YAAE,OAAM;QACrC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,0EAA0E,CAAC;KACvF,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU;YAAE,OAAM;QACrC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4EAA4E,CAAC;KACzF,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;IACxC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU;YAAE,OAAM;QACrC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0DAA0D,CAAC;IACxE,sEAAsE;IACtE,qEAAqE;IACrE,yEAAyE;IACzE,6CAA6C;KAC5C,QAAQ,CAAC,SAAS,EAAE,iGAAiG,CAAC;KACtH,MAAM,CAAC,WAAW,EAAE,qCAAqC,CAAC;KAC1D,MAAM,CAAC,oBAAoB,EAAE,mIAAmI,CAAC;KACjK,MAAM,CAAC,qBAAqB,EAAE,8EAA8E,CAAC;KAC7G,MAAM,CAAC,gBAAgB,EAAE,yGAAyG,CAAC;KACnI,MAAM,CAAC,eAAe,EAAE,gCAAgC,CAAC;KACzD,MAAM,CAAC,QAAQ,EAAE,qGAAqG,CAAC;KACvH,MAAM,CAAC,KAAK,EAAE,KAAyB,EAAE,IAAiI,EAAE,EAAE;IAC7K,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU;YAAE,OAAM;QACrC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,2EAA2E,CAAC;KACxF,MAAM,CAAC,WAAW,EAAE,qCAAqC,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,IAA2B,EAAE,EAAE;IAC5C,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU;YAAE,OAAM;QACrC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,SAAS,EAAE,CAAA;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU;YAAE,OAAM;QACrC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,kFAAkF,CAAC;KAC/F,MAAM,CAAC,cAAc,EAAE,gFAAgF,CAAC;KACxG,MAAM,CAAC,KAAK,EAAE,IAA8B,EAAE,EAAE;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,UAAU;YAAE,OAAM;QACrC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC,CAAC,CAAA;AAEJ,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { startManagedSshTunnel } from "./ssh-client.js";
|
|
2
|
+
type Tunnel = ReturnType<typeof startManagedSshTunnel>;
|
|
3
|
+
type Forward = {
|
|
4
|
+
local: number;
|
|
5
|
+
remote: number;
|
|
6
|
+
};
|
|
7
|
+
export declare function parseDiscoveredPorts(body: unknown): number[];
|
|
8
|
+
/** Bounded HTTP over our loopback SSH forward; no proxy env, tokens or remote exec. */
|
|
9
|
+
export declare function readDiscoveredPorts(local: number, signal: AbortSignal): Promise<number[]>;
|
|
10
|
+
export declare function unusedLocalPort(excluded?: ReadonlySet<number>): Promise<number>;
|
|
11
|
+
declare function pause(ms: number, signal: AbortSignal): Promise<void>;
|
|
12
|
+
export interface AutoForwardDeps {
|
|
13
|
+
args: (alias: string, forwards: Forward[]) => string[];
|
|
14
|
+
free: (port: number) => Promise<boolean>;
|
|
15
|
+
listening: (port: number) => Promise<boolean>;
|
|
16
|
+
start: (args: string[]) => Tunnel;
|
|
17
|
+
read: (port: number, signal: AbortSignal) => Promise<number[]>;
|
|
18
|
+
reserve: (excluded?: ReadonlySet<number>) => Promise<number>;
|
|
19
|
+
log: (message: string) => void;
|
|
20
|
+
now: () => number;
|
|
21
|
+
pause: typeof pause;
|
|
22
|
+
}
|
|
23
|
+
/** One signal owner and reconciliation loop; adding a port never restarts another. */
|
|
24
|
+
export declare function autoForward(alias: string, network: Pick<AutoForwardDeps, "args" | "free" | "listening">, overrides?: Partial<AutoForwardDeps>, externalSignal?: AbortSignal, options?: {
|
|
25
|
+
handleSignals?: boolean;
|
|
26
|
+
startupMessage?: string;
|
|
27
|
+
}): Promise<void>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=auto-forward.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-forward.d.ts","sourceRoot":"","sources":["../../src/lib/auto-forward.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAQvD,KAAK,MAAM,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAA;AACtD,KAAK,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,CAO5D;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBzF;AAED,wBAAsB,eAAe,CAAC,QAAQ,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBhG;AAED,iBAAS,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAO7D;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,CAAA;IACtD,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACxC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7C,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,CAAA;IACjC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC9D,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5D,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,GAAG,EAAE,MAAM,MAAM,CAAA;IACjB,KAAK,EAAE,OAAO,KAAK,CAAA;CACpB;AAKD,sFAAsF;AACtF,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC,EAC7D,SAAS,GAAE,OAAO,CAAC,eAAe,CAAM,EACxC,cAAc,CAAC,EAAE,WAAW,EAC5B,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACjE,OAAO,CAAC,IAAI,CAAC,CAuIf"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import http from "http";
|
|
2
|
+
import net from "net";
|
|
3
|
+
import { startManagedSshTunnel } from "./ssh-client.js";
|
|
4
|
+
const DISCOVERY_PORT = 3998;
|
|
5
|
+
const MAX_PORTS = 256;
|
|
6
|
+
const DENIED = new Set([2222, 3000, DISCOVERY_PORT, 3999, 8053, 8080, 8081, 8443, 9090]);
|
|
7
|
+
const POLL_MS = 2000;
|
|
8
|
+
const RETRY_MS = 2000;
|
|
9
|
+
const CONNECT_MS = 20000;
|
|
10
|
+
export function parseDiscoveredPorts(body) {
|
|
11
|
+
const data = body;
|
|
12
|
+
if (!data || data.version !== 1 || !Array.isArray(data.ports) || data.ports.length > MAX_PORTS ||
|
|
13
|
+
data.ports.some((p) => !Number.isInteger(p) || p < 1024 || p > 65535 || DENIED.has(p))) {
|
|
14
|
+
throw new Error("Invalid workspace port discovery response");
|
|
15
|
+
}
|
|
16
|
+
return [...new Set(data.ports)].sort((a, b) => a - b);
|
|
17
|
+
}
|
|
18
|
+
/** Bounded HTTP over our loopback SSH forward; no proxy env, tokens or remote exec. */
|
|
19
|
+
export function readDiscoveredPorts(local, signal) {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
const req = http.get({ host: "127.0.0.1", port: local, path: "/ports", agent: false, signal }, (res) => {
|
|
22
|
+
let body = "";
|
|
23
|
+
res.setEncoding("utf8");
|
|
24
|
+
res.on("data", (chunk) => {
|
|
25
|
+
body += chunk;
|
|
26
|
+
if (body.length > 8192)
|
|
27
|
+
req.destroy(new Error("Discovery response too large"));
|
|
28
|
+
});
|
|
29
|
+
res.on("error", reject);
|
|
30
|
+
res.on("end", () => {
|
|
31
|
+
try {
|
|
32
|
+
if (res.statusCode !== 200)
|
|
33
|
+
throw new Error("Workspace discovery unavailable");
|
|
34
|
+
resolve(parseDiscoveredPorts(JSON.parse(body)));
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
reject(err);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
const deadline = setTimeout(() => req.destroy(new Error("Discovery request timed out")), 3000);
|
|
42
|
+
req.on("error", reject);
|
|
43
|
+
req.on("close", () => clearTimeout(deadline));
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export async function unusedLocalPort(excluded = new Set()) {
|
|
47
|
+
const held = [];
|
|
48
|
+
try {
|
|
49
|
+
for (;;) {
|
|
50
|
+
const server = net.createServer();
|
|
51
|
+
held.push(server);
|
|
52
|
+
await new Promise((resolve, reject) => {
|
|
53
|
+
server.once("error", reject);
|
|
54
|
+
server.listen(0, "127.0.0.1", resolve);
|
|
55
|
+
});
|
|
56
|
+
const port = server.address().port;
|
|
57
|
+
if (!excluded.has(port))
|
|
58
|
+
return port;
|
|
59
|
+
// Hold rejected sockets until selection finishes so the allocator cannot
|
|
60
|
+
// keep returning the same excluded port. At most excluded.size + 1 sockets.
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
await Promise.all(held.map((s) => new Promise((resolve) => s.close(() => resolve()))));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function pause(ms, signal) {
|
|
68
|
+
return new Promise((resolve) => {
|
|
69
|
+
if (signal.aborted) {
|
|
70
|
+
resolve();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const finish = () => { clearTimeout(timer); signal.removeEventListener("abort", finish); resolve(); };
|
|
74
|
+
const timer = setTimeout(finish, ms);
|
|
75
|
+
signal.addEventListener("abort", finish, { once: true });
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/** One signal owner and reconciliation loop; adding a port never restarts another. */
|
|
79
|
+
export async function autoForward(alias, network, overrides = {}, externalSignal, options = {}) {
|
|
80
|
+
const d = { ...network, start: startManagedSshTunnel, read: readDiscoveredPorts,
|
|
81
|
+
reserve: unusedLocalPort, log: console.log, now: Date.now, pause, ...overrides };
|
|
82
|
+
const abort = new AbortController();
|
|
83
|
+
const stop = () => abort.abort();
|
|
84
|
+
if (options.handleSignals !== false) {
|
|
85
|
+
process.on("SIGINT", stop);
|
|
86
|
+
process.on("SIGTERM", stop);
|
|
87
|
+
}
|
|
88
|
+
externalSignal?.addEventListener("abort", stop, { once: true });
|
|
89
|
+
if (externalSignal?.aborted)
|
|
90
|
+
stop();
|
|
91
|
+
const entries = new Map();
|
|
92
|
+
let control;
|
|
93
|
+
const entry = (local, remote) => ({ local, remote, done: false, status: 0,
|
|
94
|
+
ready: false, announced: false, started: 0, failures: 0, next: 0, blocked: false });
|
|
95
|
+
const hint = (port) => `${port === 65535 ? 65534 : port + 1}:${port}`;
|
|
96
|
+
let lastPoll = -Infinity;
|
|
97
|
+
let lastSuccess = d.now();
|
|
98
|
+
let everDiscovered = false;
|
|
99
|
+
let warned = false;
|
|
100
|
+
let limitWarned = false;
|
|
101
|
+
async function tick(e, isControl = false) {
|
|
102
|
+
if (e.child && e.done) {
|
|
103
|
+
e.child = undefined;
|
|
104
|
+
e.ready = false;
|
|
105
|
+
e.failures = d.now() - e.started >= 10000 ? 0 : e.failures + 1;
|
|
106
|
+
if (e.status === null)
|
|
107
|
+
throw new Error("Couldn't start ssh. Install OpenSSH, then run litmus forward again.");
|
|
108
|
+
if (e.failures >= 3) {
|
|
109
|
+
if (isControl) {
|
|
110
|
+
if (![...entries.values()].some((f) => f.ready && !f.done)) {
|
|
111
|
+
throw new Error("Couldn't keep the discovery connection open. Check the workspace and run litmus forward again.");
|
|
112
|
+
}
|
|
113
|
+
d.log(" Discovery connection failed; existing forwards remain open. Retrying in 30 seconds...");
|
|
114
|
+
e.failures = 0;
|
|
115
|
+
e.next = d.now() + 30000;
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
e.blocked = true;
|
|
119
|
+
d.log(` Port ${e.local} could not reconnect. Other forwards remain open. Rerun litmus forward to retry.`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
e.next = d.now() + RETRY_MS;
|
|
123
|
+
}
|
|
124
|
+
if (e.blocked || abort.signal.aborted)
|
|
125
|
+
return;
|
|
126
|
+
if (!e.child && d.now() >= e.next) {
|
|
127
|
+
if ((isControl && entries.has(e.local)) || !(await d.free(e.local))) {
|
|
128
|
+
if (isControl) {
|
|
129
|
+
e.local = await d.reserve(new Set(entries.keys()));
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (!e.announced)
|
|
133
|
+
d.log(` Port ${e.local} is already in use on this computer. Use another port: litmus forward <token> ${hint(e.remote)}`);
|
|
134
|
+
e.announced = true; // Warn once, but retry if the local port is released.
|
|
135
|
+
e.next = d.now() + POLL_MS;
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (abort.signal.aborted)
|
|
139
|
+
return;
|
|
140
|
+
e.done = false;
|
|
141
|
+
e.ready = false;
|
|
142
|
+
e.started = d.now();
|
|
143
|
+
const child = d.start(d.args(alias, [e]));
|
|
144
|
+
e.child = child;
|
|
145
|
+
void child.exited.then((status) => { e.status = status; e.done = true; });
|
|
146
|
+
}
|
|
147
|
+
if (e.child && !e.done && !e.ready) {
|
|
148
|
+
const up = await d.listening(e.local);
|
|
149
|
+
if (up && !e.done && !abort.signal.aborted) {
|
|
150
|
+
e.ready = true;
|
|
151
|
+
if (!isControl) {
|
|
152
|
+
d.log(` http://localhost:${e.local}${e.announced ? " (connected)" : ""}`);
|
|
153
|
+
e.announced = true;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else if (d.now() - e.started > CONNECT_MS) {
|
|
157
|
+
await e.child.stop();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
control = entry(await d.reserve(), DISCOVERY_PORT);
|
|
163
|
+
d.log(options.startupMessage ?? " Watching for apps in your workspace. Start a server in its terminal; keep this window open. Ctrl+C stops.");
|
|
164
|
+
while (!abort.signal.aborted) {
|
|
165
|
+
await tick(control, true);
|
|
166
|
+
if (control.ready && !control.done && d.now() - lastPoll >= POLL_MS) {
|
|
167
|
+
lastPoll = d.now();
|
|
168
|
+
try {
|
|
169
|
+
const ports = parseDiscoveredPorts({ version: 1, ports: await d.read(control.local, abort.signal) });
|
|
170
|
+
if (warned)
|
|
171
|
+
d.log(" Port discovery reconnected.");
|
|
172
|
+
warned = false;
|
|
173
|
+
everDiscovered = true;
|
|
174
|
+
lastSuccess = d.now();
|
|
175
|
+
for (const port of ports) {
|
|
176
|
+
if (!entries.has(port)) {
|
|
177
|
+
if (entries.size >= MAX_PORTS) {
|
|
178
|
+
if (!limitWarned)
|
|
179
|
+
d.log(" Forward limit reached (256). Rerun with explicit ports to choose another set.");
|
|
180
|
+
limitWarned = true;
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
entries.set(port, entry(port, port));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
if (abort.signal.aborted)
|
|
189
|
+
break;
|
|
190
|
+
if (!warned && d.now() - lastSuccess >= 10000) {
|
|
191
|
+
warned = true;
|
|
192
|
+
d.log(everDiscovered
|
|
193
|
+
? " Port discovery is unavailable; existing forwards remain open. Retrying..."
|
|
194
|
+
: " This workspace is not answering port discovery. An older workspace may need explicit ports: litmus forward <token> 5173. Retrying...");
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (entries.has(control.local)) {
|
|
199
|
+
// The private connection must yield to an app discovered on its port.
|
|
200
|
+
// Select outside every known app port, including not-yet-bound forwards.
|
|
201
|
+
const local = await d.reserve(new Set(entries.keys()));
|
|
202
|
+
await control.child?.stop();
|
|
203
|
+
control = entry(local, DISCOVERY_PORT);
|
|
204
|
+
lastPoll = -Infinity;
|
|
205
|
+
}
|
|
206
|
+
// At most one new application connection per tick; no burst of SSH logins.
|
|
207
|
+
let launched = false;
|
|
208
|
+
for (const e of entries.values()) {
|
|
209
|
+
if (!e.child && launched)
|
|
210
|
+
continue;
|
|
211
|
+
const before = e.child;
|
|
212
|
+
await tick(e);
|
|
213
|
+
if (!before && e.child)
|
|
214
|
+
launched = true;
|
|
215
|
+
}
|
|
216
|
+
await d.pause(250, abort.signal);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
stop();
|
|
221
|
+
await Promise.all([control, ...entries.values()].flatMap((e) => e?.child ? [e.child.stop()] : []));
|
|
222
|
+
if (options.handleSignals !== false) {
|
|
223
|
+
process.off("SIGINT", stop);
|
|
224
|
+
process.off("SIGTERM", stop);
|
|
225
|
+
}
|
|
226
|
+
externalSignal?.removeEventListener("abort", stop);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=auto-forward.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-forward.js","sourceRoot":"","sources":["../../src/lib/auto-forward.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
export declare function cursorSessionFlags(command: Command): Command;
|
|
1
3
|
export interface CursorSessionOptions {
|
|
2
4
|
handoff: boolean;
|
|
3
5
|
cleanup: boolean;
|
|
4
6
|
}
|
|
7
|
+
export declare function cursorSessionOptions(opts: {
|
|
8
|
+
cursorAgentWindow?: boolean;
|
|
9
|
+
cursorSessionCleanup?: boolean;
|
|
10
|
+
}, platform?: NodeJS.Platform): CursorSessionOptions;
|
|
5
11
|
/** Build from our bundled source; never download executable code at connect time. */
|
|
6
12
|
export declare function buildCursorSessionVsix(destination: string): Promise<void>;
|
|
7
13
|
export declare function prepareCursorSession(command: string, alias: string, backendUrl: string, token: string, options: CursorSessionOptions, home?: string, platform?: NodeJS.Platform): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-session.d.ts","sourceRoot":"","sources":["../../src/lib/cursor-session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cursor-session.d.ts","sourceRoot":"","sources":["../../src/lib/cursor-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAexC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAK5D;AAED,MAAM,WAAW,oBAAoB;IAAG,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE;AAE5E,wBAAgB,oBAAoB,CAClC,IAAI,EAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAAC,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,EACrE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,oBAAoB,CAKtB;AAED,qFAAqF;AACrF,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/E;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EACjE,OAAO,EAAE,oBAAoB,EAC7B,IAAI,SAAe,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAChE,OAAO,CAAC,OAAO,CAAC,CAiDlB"}
|