@grackle-ai/server 0.0.2 → 0.0.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/dist/adapters/codespace.d.ts +30 -0
- package/dist/adapters/codespace.d.ts.map +1 -0
- package/dist/adapters/codespace.js +135 -0
- package/dist/adapters/codespace.js.map +1 -0
- package/dist/adapters/docker.d.ts.map +1 -1
- package/dist/adapters/docker.js +31 -4
- package/dist/adapters/docker.js.map +1 -1
- package/dist/adapters/remote-adapter-utils.d.ts +90 -0
- package/dist/adapters/remote-adapter-utils.d.ts.map +1 -0
- package/dist/adapters/remote-adapter-utils.js +383 -0
- package/dist/adapters/remote-adapter-utils.js.map +1 -0
- package/dist/adapters/ssh.d.ts +35 -0
- package/dist/adapters/ssh.d.ts.map +1 -0
- package/dist/adapters/ssh.js +155 -0
- package/dist/adapters/ssh.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { EnvironmentAdapter, BaseEnvironmentConfig, PowerLineConnection, ProvisionEvent } from "./adapter.js";
|
|
2
|
+
/** GitHub Codespaces-specific environment configuration. */
|
|
3
|
+
export interface CodespaceEnvironmentConfig extends BaseEnvironmentConfig {
|
|
4
|
+
/** The codespace name from `gh codespace list` (required). */
|
|
5
|
+
codespaceName: string;
|
|
6
|
+
/** Override the local tunnel port (otherwise a free port is chosen). */
|
|
7
|
+
localPort?: number;
|
|
8
|
+
/** Additional environment variables forwarded to the remote PowerLine. */
|
|
9
|
+
env?: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
/** Environment adapter that provisions and manages GitHub Codespaces running the PowerLine. */
|
|
12
|
+
export declare class CodespaceAdapter implements EnvironmentAdapter {
|
|
13
|
+
type: string;
|
|
14
|
+
/** Provision the codespace: verify connectivity, bootstrap PowerLine, open port-forward. */
|
|
15
|
+
provision(environmentId: string, config: Record<string, unknown>, powerlineToken: string): AsyncGenerator<ProvisionEvent>;
|
|
16
|
+
/** Connect to the PowerLine through the port-forward tunnel. */
|
|
17
|
+
connect(environmentId: string, config: Record<string, unknown>, powerlineToken: string): Promise<PowerLineConnection>;
|
|
18
|
+
/** Close the port-forward tunnel without stopping the remote PowerLine. */
|
|
19
|
+
disconnect(environmentId: string): Promise<void>;
|
|
20
|
+
/** Stop the remote PowerLine process and close the tunnel. */
|
|
21
|
+
stop(environmentId: string, config: Record<string, unknown>): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Stop the remote PowerLine and remove artifacts from the codespace.
|
|
24
|
+
* This does NOT delete the codespace itself.
|
|
25
|
+
*/
|
|
26
|
+
destroy(environmentId: string, config: Record<string, unknown>): Promise<void>;
|
|
27
|
+
/** Check that the tunnel is alive and the PowerLine responds to a ping. */
|
|
28
|
+
healthCheck(connection: PowerLineConnection): Promise<boolean>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=codespace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codespace.d.ts","sourceRoot":"","sources":["../../src/adapters/codespace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAuBnH,4DAA4D;AAC5D,MAAM,WAAW,0BAA2B,SAAQ,qBAAqB;IACvE,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAwDD,+FAA+F;AAC/F,qBAAa,gBAAiB,YAAW,kBAAkB;IAClD,IAAI,EAAE,MAAM,CAAe;IAElC,4FAA4F;IAC9E,SAAS,CACrB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,cAAc,EAAE,MAAM,GACrB,cAAc,CAAC,cAAc,CAAC;IA8BjC,gEAAgE;IACnD,OAAO,CAClB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,mBAAmB,CAAC;IAQ/B,2EAA2E;IAC9D,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D,8DAA8D;IACjD,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxF;;;OAGG;IACU,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3F,2EAA2E;IAC9D,WAAW,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;CAY5E"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { DEFAULT_POWERLINE_PORT } from "@grackle-ai/common";
|
|
2
|
+
import { ProcessTunnel, bootstrapPowerLine, connectThroughTunnel, registerTunnel, getTunnel, closeTunnel, findFreePort, buildRemoteKillCommand, SSH_CONNECTIVITY_TIMEOUT_MS, REMOTE_EXEC_DEFAULT_TIMEOUT_MS, REMOTE_POWERLINE_DIRECTORY, } from "./remote-adapter-utils.js";
|
|
3
|
+
import { exec } from "../utils/exec.js";
|
|
4
|
+
import { logger } from "../logger.js";
|
|
5
|
+
const REMOTE_COPY_TIMEOUT_MS = 120_000;
|
|
6
|
+
// ─── Executor ───────────────────────────────────────────────
|
|
7
|
+
/** Execute commands inside a GitHub Codespace via the `gh` CLI. */
|
|
8
|
+
class CodespaceExecutor {
|
|
9
|
+
codespaceName;
|
|
10
|
+
constructor(codespaceName) {
|
|
11
|
+
this.codespaceName = codespaceName;
|
|
12
|
+
}
|
|
13
|
+
/** Execute a shell command inside the codespace and return trimmed stdout. */
|
|
14
|
+
async exec(command, opts) {
|
|
15
|
+
const args = ["codespace", "ssh", "-c", this.codespaceName, "--", command];
|
|
16
|
+
const result = await exec("gh", args, { timeout: opts?.timeout ?? REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
17
|
+
return result.stdout;
|
|
18
|
+
}
|
|
19
|
+
/** Copy a local file or directory into the codespace via `gh codespace cp`. */
|
|
20
|
+
async copyTo(localPath, remotePath) {
|
|
21
|
+
const args = [
|
|
22
|
+
"codespace", "cp", "-r", "-e",
|
|
23
|
+
"-c", this.codespaceName,
|
|
24
|
+
localPath,
|
|
25
|
+
`remote:${remotePath}`,
|
|
26
|
+
];
|
|
27
|
+
await exec("gh", args, { timeout: REMOTE_COPY_TIMEOUT_MS });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// ─── Tunnel ─────────────────────────────────────────────────
|
|
31
|
+
/** Port-forwarding tunnel using `gh codespace ports forward`. */
|
|
32
|
+
class CodespaceTunnel extends ProcessTunnel {
|
|
33
|
+
codespaceName;
|
|
34
|
+
constructor(localPort, codespaceName) {
|
|
35
|
+
super(localPort);
|
|
36
|
+
this.codespaceName = codespaceName;
|
|
37
|
+
}
|
|
38
|
+
/** Return the gh command and arguments for the port-forward process. */
|
|
39
|
+
spawnArgs() {
|
|
40
|
+
// gh codespace ports forward uses <remote>:<local> order (opposite of SSH -L)
|
|
41
|
+
const args = [
|
|
42
|
+
"codespace", "ports", "forward",
|
|
43
|
+
`${DEFAULT_POWERLINE_PORT}:${this.localPort}`,
|
|
44
|
+
"-c", this.codespaceName,
|
|
45
|
+
];
|
|
46
|
+
return { command: "gh", args };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// ─── Adapter ────────────────────────────────────────────────
|
|
50
|
+
/** Environment adapter that provisions and manages GitHub Codespaces running the PowerLine. */
|
|
51
|
+
export class CodespaceAdapter {
|
|
52
|
+
type = "codespace";
|
|
53
|
+
/** Provision the codespace: verify connectivity, bootstrap PowerLine, open port-forward. */
|
|
54
|
+
async *provision(environmentId, config, powerlineToken) {
|
|
55
|
+
const cfg = config;
|
|
56
|
+
if (!cfg.codespaceName) {
|
|
57
|
+
throw new Error("Codespace adapter requires a 'codespaceName' in the configuration");
|
|
58
|
+
}
|
|
59
|
+
const executor = new CodespaceExecutor(cfg.codespaceName);
|
|
60
|
+
// Test codespace connectivity
|
|
61
|
+
yield { stage: "connecting", message: `Connecting to codespace ${cfg.codespaceName}...`, progress: 0.05 };
|
|
62
|
+
try {
|
|
63
|
+
await executor.exec("echo ok", { timeout: SSH_CONNECTIVITY_TIMEOUT_MS });
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
throw new Error(`Cannot reach codespace '${cfg.codespaceName}' via gh CLI: ${err}`);
|
|
67
|
+
}
|
|
68
|
+
// Bootstrap PowerLine on the codespace
|
|
69
|
+
yield* bootstrapPowerLine(executor, powerlineToken, cfg.env);
|
|
70
|
+
// Open port-forward tunnel
|
|
71
|
+
const localPort = cfg.localPort || await findFreePort();
|
|
72
|
+
yield { stage: "tunneling", message: `Forwarding local port ${localPort} to codespace...`, progress: 0.80 };
|
|
73
|
+
const tunnel = new CodespaceTunnel(localPort, cfg.codespaceName);
|
|
74
|
+
await tunnel.open();
|
|
75
|
+
registerTunnel(environmentId, { tunnel });
|
|
76
|
+
yield { stage: "connecting", message: `Tunnel open, connecting on port ${localPort}...`, progress: 0.90 };
|
|
77
|
+
}
|
|
78
|
+
/** Connect to the PowerLine through the port-forward tunnel. */
|
|
79
|
+
async connect(environmentId, config, powerlineToken) {
|
|
80
|
+
const state = getTunnel(environmentId);
|
|
81
|
+
if (!state) {
|
|
82
|
+
throw new Error(`No tunnel registered for environment ${environmentId}`);
|
|
83
|
+
}
|
|
84
|
+
return connectThroughTunnel(environmentId, state.tunnel.localPort, powerlineToken);
|
|
85
|
+
}
|
|
86
|
+
/** Close the port-forward tunnel without stopping the remote PowerLine. */
|
|
87
|
+
async disconnect(environmentId) {
|
|
88
|
+
await closeTunnel(environmentId);
|
|
89
|
+
}
|
|
90
|
+
/** Stop the remote PowerLine process and close the tunnel. */
|
|
91
|
+
async stop(environmentId, config) {
|
|
92
|
+
const cfg = config;
|
|
93
|
+
const executor = new CodespaceExecutor(cfg.codespaceName);
|
|
94
|
+
try {
|
|
95
|
+
await executor.exec(buildRemoteKillCommand());
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
logger.debug({ environmentId, err }, "Failed to kill remote PowerLine (may already be stopped)");
|
|
99
|
+
}
|
|
100
|
+
await closeTunnel(environmentId);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Stop the remote PowerLine and remove artifacts from the codespace.
|
|
104
|
+
* This does NOT delete the codespace itself.
|
|
105
|
+
*/
|
|
106
|
+
async destroy(environmentId, config) {
|
|
107
|
+
const cfg = config;
|
|
108
|
+
const executor = new CodespaceExecutor(cfg.codespaceName);
|
|
109
|
+
try {
|
|
110
|
+
await executor.exec(`${buildRemoteKillCommand()}; `
|
|
111
|
+
+ 'CRED="$HOME/.claude/.credentials.json"; '
|
|
112
|
+
+ `if [ -L "$CRED" ]; then case "$(readlink "$CRED" 2>/dev/null)" in ${REMOTE_POWERLINE_DIRECTORY}/*) rm -f "$CRED";; esac; fi; `
|
|
113
|
+
+ `rm -rf ${REMOTE_POWERLINE_DIRECTORY}`);
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
logger.debug({ environmentId, err }, "Failed to clean up remote PowerLine artifacts");
|
|
117
|
+
}
|
|
118
|
+
await closeTunnel(environmentId);
|
|
119
|
+
}
|
|
120
|
+
/** Check that the tunnel is alive and the PowerLine responds to a ping. */
|
|
121
|
+
async healthCheck(connection) {
|
|
122
|
+
const state = getTunnel(connection.environmentId);
|
|
123
|
+
if (!state || !state.tunnel.isAlive()) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
await connection.client.ping({});
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=codespace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codespace.js","sourceRoot":"","sources":["../../src/adapters/codespace.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/adapters/docker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/adapters/docker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAwBnH,iDAAiD;AACjD,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAgJD,+FAA+F;AAC/F,qBAAa,aAAc,YAAW,kBAAkB;IAC/C,IAAI,EAAE,MAAM,CAAY;IAEjB,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,cAAc,CAAC,cAAc,CAAC;IAwC1H,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAoBrH,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3E,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E,WAAW,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAS3E,mEAAmE;IACnE,OAAO,CAAC,YAAY;CAqErB"}
|
package/dist/adapters/docker.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { DEFAULT_POWERLINE_PORT } from "@grackle-ai/common";
|
|
2
2
|
import { createPowerLineClient } from "./powerline-transport.js";
|
|
3
|
+
import { isDevMode } from "./remote-adapter-utils.js";
|
|
3
4
|
import { exec } from "../utils/exec.js";
|
|
4
5
|
import { findFreePort } from "../utils/ports.js";
|
|
5
6
|
import { sleep } from "../utils/sleep.js";
|
|
6
7
|
import { readFileSync } from "node:fs";
|
|
7
|
-
import { join } from "node:path";
|
|
8
|
+
import { join, resolve } from "node:path";
|
|
8
9
|
import { homedir } from "node:os";
|
|
9
10
|
import { logger } from "../logger.js";
|
|
10
11
|
const DOCKER_PULL_TIMEOUT_MS = 120_000;
|
|
12
|
+
/** Timeout for `docker build` when building the dev image from local artifacts. */
|
|
13
|
+
const DOCKER_BUILD_TIMEOUT_MS = 300_000;
|
|
11
14
|
const GIT_CLONE_TIMEOUT_MS = 120_000;
|
|
12
15
|
const GIT_PULL_TIMEOUT_MS = 60_000;
|
|
13
16
|
const CONTAINER_POLL_DELAY_MS = 1_000;
|
|
@@ -15,6 +18,8 @@ const CONTAINER_POLL_MAX_ATTEMPTS = 30;
|
|
|
15
18
|
const CONNECT_RETRY_DELAY_MS = 1_500;
|
|
16
19
|
const CONNECT_MAX_RETRIES = 10;
|
|
17
20
|
const WORKSPACE_PATH = "/workspace";
|
|
21
|
+
/** Default image name used when no custom image is specified. */
|
|
22
|
+
const DEFAULT_IMAGE = "grackle-powerline:latest";
|
|
18
23
|
const containerPorts = new Map();
|
|
19
24
|
// ─── Docker CLI Helpers ────────────────────────────────────
|
|
20
25
|
/** Pull a Docker image, suppressing errors if the image exists locally. */
|
|
@@ -135,17 +140,39 @@ async function getGitHubToken() {
|
|
|
135
140
|
return undefined;
|
|
136
141
|
}
|
|
137
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Build the PowerLine Docker image from local monorepo artifacts using the dev target.
|
|
145
|
+
* Resolves the monorepo root from import.meta.dirname (dist/adapters → 4 levels up).
|
|
146
|
+
*/
|
|
147
|
+
async function buildDevImage(tag) {
|
|
148
|
+
const monorepoRoot = resolve(import.meta.dirname, "../../../../");
|
|
149
|
+
logger.info({ tag, monorepoRoot }, "Building dev PowerLine image from local artifacts");
|
|
150
|
+
await exec("docker", [
|
|
151
|
+
"build",
|
|
152
|
+
"--target", "dev",
|
|
153
|
+
"-f", resolve(monorepoRoot, "Dockerfile.powerline"),
|
|
154
|
+
"-t", tag,
|
|
155
|
+
monorepoRoot,
|
|
156
|
+
], { timeout: DOCKER_BUILD_TIMEOUT_MS });
|
|
157
|
+
}
|
|
138
158
|
// ─── Docker Adapter ────────────────────────────────────────
|
|
139
159
|
/** Environment adapter that provisions and manages Docker containers running the PowerLine. */
|
|
140
160
|
export class DockerAdapter {
|
|
141
161
|
type = "docker";
|
|
142
162
|
async *provision(environmentId, config, powerlineToken) {
|
|
143
163
|
const cfg = config;
|
|
144
|
-
const image = cfg.image ||
|
|
164
|
+
const image = cfg.image || DEFAULT_IMAGE;
|
|
145
165
|
const containerName = cfg.containerName || `grackle-${environmentId}`;
|
|
146
166
|
const localPort = cfg.localPort || await findFreePort();
|
|
147
|
-
|
|
148
|
-
|
|
167
|
+
const isDefault = image === DEFAULT_IMAGE;
|
|
168
|
+
if (isDevMode() && isDefault) {
|
|
169
|
+
yield { stage: "creating", message: "Building PowerLine image from local artifacts...", progress: 0.1 };
|
|
170
|
+
await buildDevImage(image);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
yield { stage: "creating", message: `Pulling image ${image}...`, progress: 0.1 };
|
|
174
|
+
await pullImage(image);
|
|
175
|
+
}
|
|
149
176
|
yield { stage: "creating", message: `Creating container ${containerName}...`, progress: 0.3 };
|
|
150
177
|
const runArgs = this.buildRunArgs(containerName, localPort, image, cfg, powerlineToken);
|
|
151
178
|
const isNew = await createOrStartContainer(containerName, runArgs);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/adapters/docker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/adapters/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { PowerLineConnection, ProvisionEvent } from "./adapter.js";
|
|
2
|
+
import { findFreePort } from "../utils/ports.js";
|
|
3
|
+
import { type ChildProcess } from "node:child_process";
|
|
4
|
+
/** Default timeout for remote command execution. */
|
|
5
|
+
declare const REMOTE_EXEC_DEFAULT_TIMEOUT_MS: number;
|
|
6
|
+
/** Timeout for the initial SSH connectivity test. */
|
|
7
|
+
declare const SSH_CONNECTIVITY_TIMEOUT_MS: number;
|
|
8
|
+
/** Remote directory where PowerLine artifacts are installed. */
|
|
9
|
+
declare const REMOTE_POWERLINE_DIRECTORY: string;
|
|
10
|
+
/**
|
|
11
|
+
* Check if we are running from a monorepo source checkout.
|
|
12
|
+
* When running from the monorepo, sibling `powerline/dist/index.js` exists
|
|
13
|
+
* relative to the server's dist/adapters directory.
|
|
14
|
+
*/
|
|
15
|
+
export declare function isDevMode(): boolean;
|
|
16
|
+
/** Abstraction for executing commands on a remote host. */
|
|
17
|
+
export interface RemoteExecutor {
|
|
18
|
+
/** Execute a shell command on the remote host and return stdout. */
|
|
19
|
+
exec(command: string, opts?: {
|
|
20
|
+
timeout?: number;
|
|
21
|
+
}): Promise<string>;
|
|
22
|
+
/** Copy a local file or directory to a path on the remote host. */
|
|
23
|
+
copyTo(localPath: string, remotePath: string): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
/** Abstraction for a long-lived port-forwarding tunnel. */
|
|
26
|
+
export interface RemoteTunnel {
|
|
27
|
+
/** The local port the tunnel is bound to. */
|
|
28
|
+
localPort: number;
|
|
29
|
+
/** Open the tunnel (spawns a background process). */
|
|
30
|
+
open(): Promise<void>;
|
|
31
|
+
/** Close the tunnel (kills the background process). */
|
|
32
|
+
close(): Promise<void>;
|
|
33
|
+
/** Return true if the tunnel process is still running. */
|
|
34
|
+
isAlive(): boolean;
|
|
35
|
+
}
|
|
36
|
+
interface TunnelState {
|
|
37
|
+
tunnel: RemoteTunnel;
|
|
38
|
+
}
|
|
39
|
+
/** Register an active tunnel for an environment. */
|
|
40
|
+
export declare function registerTunnel(environmentId: string, state: TunnelState): void;
|
|
41
|
+
/** Get the tunnel state for an environment. */
|
|
42
|
+
export declare function getTunnel(environmentId: string): TunnelState | undefined;
|
|
43
|
+
/** Close and unregister the tunnel for an environment. */
|
|
44
|
+
export declare function closeTunnel(environmentId: string): Promise<void>;
|
|
45
|
+
/** Close all active tunnels (called during server shutdown). */
|
|
46
|
+
export declare function closeAllTunnels(): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Base class for tunnels backed by a long-lived child process.
|
|
49
|
+
* Subclasses provide the command and arguments to spawn.
|
|
50
|
+
*/
|
|
51
|
+
export declare abstract class ProcessTunnel implements RemoteTunnel {
|
|
52
|
+
localPort: number;
|
|
53
|
+
protected process: ChildProcess | undefined;
|
|
54
|
+
constructor(localPort: number);
|
|
55
|
+
/** Return the command and arguments to spawn the tunnel process. */
|
|
56
|
+
protected abstract spawnArgs(): {
|
|
57
|
+
command: string;
|
|
58
|
+
args: string[];
|
|
59
|
+
};
|
|
60
|
+
/** Open the tunnel by spawning the background process. */
|
|
61
|
+
open(): Promise<void>;
|
|
62
|
+
/** Close the tunnel by killing the background process. */
|
|
63
|
+
close(): Promise<void>;
|
|
64
|
+
/** Return true if the tunnel process is still running. */
|
|
65
|
+
isAlive(): boolean;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Bootstrap the PowerLine on a remote host via the given executor.
|
|
69
|
+
* Yields progress events for each stage of the process.
|
|
70
|
+
* @param extraEnv - Additional env vars to forward (from adapter config).
|
|
71
|
+
*/
|
|
72
|
+
export declare function bootstrapPowerLine(executor: RemoteExecutor, powerlineToken: string, extraEnv?: Record<string, string>): AsyncGenerator<ProvisionEvent>;
|
|
73
|
+
/**
|
|
74
|
+
* Connect to a PowerLine through a local tunnel port, retrying until the gRPC
|
|
75
|
+
* service responds to a ping.
|
|
76
|
+
*/
|
|
77
|
+
export declare function connectThroughTunnel(environmentId: string, localPort: number, powerlineToken: string): Promise<PowerLineConnection>;
|
|
78
|
+
/**
|
|
79
|
+
* Poll until a TCP connection can be established on localhost at the given port.
|
|
80
|
+
* Used to wait for a tunnel process to begin accepting connections.
|
|
81
|
+
*/
|
|
82
|
+
export declare function waitForLocalPort(port: number): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Build a shell command that kills the remote PowerLine process.
|
|
85
|
+
* Prefers killing by tracked PID (written at startup) to avoid terminating
|
|
86
|
+
* unrelated services on the same port. Falls back to port-based kill.
|
|
87
|
+
*/
|
|
88
|
+
export declare function buildRemoteKillCommand(): string;
|
|
89
|
+
export { findFreePort, REMOTE_POWERLINE_DIRECTORY, SSH_CONNECTIVITY_TIMEOUT_MS, REMOTE_EXEC_DEFAULT_TIMEOUT_MS };
|
|
90
|
+
//# sourceMappingURL=remote-adapter-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-adapter-utils.d.ts","sourceRoot":"","sources":["../../src/adapters/remote-adapter-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
import { DEFAULT_POWERLINE_PORT } from "@grackle-ai/common";
|
|
2
|
+
import { createPowerLineClient } from "./powerline-transport.js";
|
|
3
|
+
import { findFreePort } from "../utils/ports.js";
|
|
4
|
+
import { sleep } from "../utils/sleep.js";
|
|
5
|
+
import { logger } from "../logger.js";
|
|
6
|
+
import { spawn } from "node:child_process";
|
|
7
|
+
import { createConnection } from "node:net";
|
|
8
|
+
import { join, resolve } from "node:path";
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
11
|
+
// ─── Constants ──────────────────────────────────────────────
|
|
12
|
+
/** Timeout for `npm install` on the remote host. */
|
|
13
|
+
const BOOTSTRAP_NPM_INSTALL_TIMEOUT_MS = 120_000;
|
|
14
|
+
/** Default timeout for remote command execution. */
|
|
15
|
+
const REMOTE_EXEC_DEFAULT_TIMEOUT_MS = 60_000;
|
|
16
|
+
/** Delay between gRPC connect-with-retry attempts. */
|
|
17
|
+
const CONNECT_RETRY_DELAY_MS = 1_500;
|
|
18
|
+
/** Maximum number of gRPC connect-with-retry attempts. */
|
|
19
|
+
const CONNECT_MAX_RETRIES = 10;
|
|
20
|
+
/** Delay between port availability polls. */
|
|
21
|
+
const TUNNEL_PORT_POLL_DELAY_MS = 500;
|
|
22
|
+
/** Maximum number of port availability polls. */
|
|
23
|
+
const TUNNEL_PORT_POLL_MAX_ATTEMPTS = 20;
|
|
24
|
+
/** Wait after starting the remote PowerLine process before verifying. */
|
|
25
|
+
const POWERLINE_STARTUP_DELAY_MS = 2_000;
|
|
26
|
+
/** Grace period before sending SIGKILL to a tunnel process. */
|
|
27
|
+
const TUNNEL_KILL_GRACE_MS = 1_000;
|
|
28
|
+
/** Timeout for the initial SSH connectivity test. */
|
|
29
|
+
const SSH_CONNECTIVITY_TIMEOUT_MS = 15_000;
|
|
30
|
+
/** Remote directory where PowerLine artifacts are installed. */
|
|
31
|
+
const REMOTE_POWERLINE_DIRECTORY = "~/.grackle/powerline";
|
|
32
|
+
// ─── Dev vs Production Mode ─────────────────────────────────
|
|
33
|
+
/**
|
|
34
|
+
* Check if we are running from a monorepo source checkout.
|
|
35
|
+
* When running from the monorepo, sibling `powerline/dist/index.js` exists
|
|
36
|
+
* relative to the server's dist/adapters directory.
|
|
37
|
+
*/
|
|
38
|
+
export function isDevMode() {
|
|
39
|
+
return existsSync(resolve(import.meta.dirname, "../../../powerline/dist/index.js"));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Read the lockstep version from the server's own package.json.
|
|
43
|
+
* import.meta.dirname = dist/adapters, so ../../package.json = server's package.json.
|
|
44
|
+
*/
|
|
45
|
+
function getPackageVersion() {
|
|
46
|
+
const packageJsonPath = resolve(import.meta.dirname, "../../package.json");
|
|
47
|
+
const pkg = JSON.parse(readFileSync(packageJsonPath, "utf8"));
|
|
48
|
+
return pkg.version;
|
|
49
|
+
}
|
|
50
|
+
const tunnelMap = new Map();
|
|
51
|
+
/** Register an active tunnel for an environment. */
|
|
52
|
+
export function registerTunnel(environmentId, state) {
|
|
53
|
+
tunnelMap.set(environmentId, state);
|
|
54
|
+
}
|
|
55
|
+
/** Get the tunnel state for an environment. */
|
|
56
|
+
export function getTunnel(environmentId) {
|
|
57
|
+
return tunnelMap.get(environmentId);
|
|
58
|
+
}
|
|
59
|
+
/** Close and unregister the tunnel for an environment. */
|
|
60
|
+
export async function closeTunnel(environmentId) {
|
|
61
|
+
const state = tunnelMap.get(environmentId);
|
|
62
|
+
if (state) {
|
|
63
|
+
await state.tunnel.close();
|
|
64
|
+
tunnelMap.delete(environmentId);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Close all active tunnels (called during server shutdown). */
|
|
68
|
+
export async function closeAllTunnels() {
|
|
69
|
+
const ids = [...tunnelMap.keys()];
|
|
70
|
+
for (const id of ids) {
|
|
71
|
+
try {
|
|
72
|
+
await closeTunnel(id);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
logger.error({ environmentId: id, err }, "Failed to close tunnel during shutdown");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ─── Tunnel Process Base ────────────────────────────────────
|
|
80
|
+
/**
|
|
81
|
+
* Base class for tunnels backed by a long-lived child process.
|
|
82
|
+
* Subclasses provide the command and arguments to spawn.
|
|
83
|
+
*/
|
|
84
|
+
export class ProcessTunnel {
|
|
85
|
+
localPort;
|
|
86
|
+
process;
|
|
87
|
+
constructor(localPort) {
|
|
88
|
+
this.localPort = localPort;
|
|
89
|
+
}
|
|
90
|
+
/** Open the tunnel by spawning the background process. */
|
|
91
|
+
async open() {
|
|
92
|
+
const { command, args } = this.spawnArgs();
|
|
93
|
+
logger.info({ command, args }, "Opening tunnel");
|
|
94
|
+
this.process = spawn(command, args, {
|
|
95
|
+
stdio: ["ignore", "ignore", "pipe"],
|
|
96
|
+
detached: false,
|
|
97
|
+
});
|
|
98
|
+
this.process.on("error", (err) => {
|
|
99
|
+
logger.error({ err }, "Tunnel process error");
|
|
100
|
+
});
|
|
101
|
+
this.process.stderr?.on("data", (data) => {
|
|
102
|
+
logger.debug({ stderr: data.toString() }, "Tunnel stderr");
|
|
103
|
+
});
|
|
104
|
+
// Wait for the local port to become reachable
|
|
105
|
+
await waitForLocalPort(this.localPort);
|
|
106
|
+
}
|
|
107
|
+
/** Close the tunnel by killing the background process. */
|
|
108
|
+
async close() {
|
|
109
|
+
if (!this.process || this.process.exitCode !== null) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this.process.kill("SIGTERM");
|
|
113
|
+
await sleep(TUNNEL_KILL_GRACE_MS);
|
|
114
|
+
if (this.process.exitCode === null) {
|
|
115
|
+
this.process.kill("SIGKILL");
|
|
116
|
+
}
|
|
117
|
+
this.process = undefined;
|
|
118
|
+
}
|
|
119
|
+
/** Return true if the tunnel process is still running. */
|
|
120
|
+
isAlive() {
|
|
121
|
+
return this.process !== undefined && this.process.exitCode === null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// ─── Bootstrap PowerLine ────────────────────────────────────
|
|
125
|
+
/** Regex for valid POSIX environment variable names. */
|
|
126
|
+
const ENV_VAR_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
127
|
+
/** Environment variables to forward to the remote PowerLine process. */
|
|
128
|
+
const FORWARDED_ENV_VARS = [
|
|
129
|
+
"ANTHROPIC_API_KEY",
|
|
130
|
+
"GITHUB_TOKEN",
|
|
131
|
+
"GH_TOKEN",
|
|
132
|
+
"COPILOT_GITHUB_TOKEN",
|
|
133
|
+
"COPILOT_CLI_URL",
|
|
134
|
+
"COPILOT_CLI_PATH",
|
|
135
|
+
"COPILOT_PROVIDER_CONFIG",
|
|
136
|
+
];
|
|
137
|
+
/**
|
|
138
|
+
* Escape a value for safe use inside a shell single-quoted string.
|
|
139
|
+
* Replaces each `'` with `'\''` (end quote, escaped quote, start quote).
|
|
140
|
+
*/
|
|
141
|
+
function shellEscape(value) {
|
|
142
|
+
return value.replace(/'/g, "'\\''");
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Bootstrap the PowerLine on a remote host via the given executor.
|
|
146
|
+
* Yields progress events for each stage of the process.
|
|
147
|
+
* @param extraEnv - Additional env vars to forward (from adapter config).
|
|
148
|
+
*/
|
|
149
|
+
export async function* bootstrapPowerLine(executor, powerlineToken, extraEnv) {
|
|
150
|
+
// 1. Check Node.js (PowerLine requires >= 22)
|
|
151
|
+
yield { stage: "bootstrapping", message: "Checking Node.js on remote host...", progress: 0.10 };
|
|
152
|
+
try {
|
|
153
|
+
const nodeVersionOutput = await executor.exec("node --version", { timeout: SSH_CONNECTIVITY_TIMEOUT_MS });
|
|
154
|
+
const nodeVersion = String(nodeVersionOutput).trim();
|
|
155
|
+
logger.info({ nodeVersion }, "Remote Node.js version");
|
|
156
|
+
const versionMatch = nodeVersion.match(/^v?(\d+)\./);
|
|
157
|
+
if (!versionMatch) {
|
|
158
|
+
throw new Error(`Unable to parse Node.js version "${nodeVersion}" on remote host. Install Node.js >= 22 and try again.`);
|
|
159
|
+
}
|
|
160
|
+
const majorVersion = parseInt(versionMatch[1], 10);
|
|
161
|
+
if (isNaN(majorVersion) || majorVersion < 22) {
|
|
162
|
+
throw new Error(`Unsupported Node.js version "${nodeVersion}" on remote host. PowerLine requires Node.js >= 22.`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (error instanceof Error
|
|
167
|
+
&& (error.message.startsWith("Unable to parse Node.js version")
|
|
168
|
+
|| error.message.startsWith("Unsupported Node.js version"))) {
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
throw new Error("Node.js is not installed or not accessible on the remote host. Install Node.js >= 22 and try again.");
|
|
172
|
+
}
|
|
173
|
+
// 2. Check git
|
|
174
|
+
yield { stage: "bootstrapping", message: "Checking git on remote host...", progress: 0.15 };
|
|
175
|
+
try {
|
|
176
|
+
await executor.exec("git --version", { timeout: SSH_CONNECTIVITY_TIMEOUT_MS });
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
throw new Error("git is not installed on the remote host. Install git and try again.");
|
|
180
|
+
}
|
|
181
|
+
// 3. Install PowerLine — dev mode (copy artifacts) vs production (npm install)
|
|
182
|
+
const devMode = isDevMode();
|
|
183
|
+
let entryPoint;
|
|
184
|
+
if (devMode) {
|
|
185
|
+
// ── Dev mode: copy local monorepo artifacts ──
|
|
186
|
+
entryPoint = "dist/index.js";
|
|
187
|
+
yield { stage: "bootstrapping", message: "Creating remote directories...", progress: 0.20 };
|
|
188
|
+
await executor.exec(`mkdir -p ${REMOTE_POWERLINE_DIRECTORY}/node_modules/@grackle-ai/common`, { timeout: REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
189
|
+
// Resolve local artifact paths relative to server's built location.
|
|
190
|
+
// import.meta.dirname = packages/server/dist/adapters → up 3 levels → packages/
|
|
191
|
+
const serverDistDir = resolve(import.meta.dirname);
|
|
192
|
+
const commonPackageDir = resolve(serverDistDir, "../../../common");
|
|
193
|
+
const powerlinePackageDir = resolve(serverDistDir, "../../../powerline");
|
|
194
|
+
yield { stage: "bootstrapping", message: "Copying PowerLine artifacts...", progress: 0.25 };
|
|
195
|
+
await executor.copyTo(join(powerlinePackageDir, "dist"), `${REMOTE_POWERLINE_DIRECTORY}/dist`);
|
|
196
|
+
await executor.copyTo(join(powerlinePackageDir, "package.json"), `${REMOTE_POWERLINE_DIRECTORY}/package.json`);
|
|
197
|
+
// Strip @grackle-ai/* deps (they'll be copied manually) and npm install the rest
|
|
198
|
+
yield { stage: "bootstrapping", message: "Installing dependencies on remote host...", progress: 0.40 };
|
|
199
|
+
await executor.exec(`cd ${REMOTE_POWERLINE_DIRECTORY} && node -e "`
|
|
200
|
+
+ `const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));`
|
|
201
|
+
+ `for(const k of Object.keys(p.dependencies||{})){if(k.startsWith('@grackle-ai/'))delete p.dependencies[k];}`
|
|
202
|
+
+ `for(const k of Object.keys(p.devDependencies||{})){if(k.startsWith('@grackle-ai/'))delete p.devDependencies[k];}`
|
|
203
|
+
+ `require('fs').writeFileSync('package.json',JSON.stringify(p,null,2));"`, { timeout: REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
204
|
+
await executor.exec(`cd ${REMOTE_POWERLINE_DIRECTORY} && npm install --omit=dev`, { timeout: BOOTSTRAP_NPM_INSTALL_TIMEOUT_MS });
|
|
205
|
+
// Copy @grackle-ai/common into node_modules AFTER npm install (npm would wipe it)
|
|
206
|
+
yield { stage: "bootstrapping", message: "Copying @grackle-ai/common...", progress: 0.55 };
|
|
207
|
+
await executor.exec(`mkdir -p ${REMOTE_POWERLINE_DIRECTORY}/node_modules/@grackle-ai/common`, { timeout: REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
208
|
+
await executor.copyTo(join(commonPackageDir, "dist"), `${REMOTE_POWERLINE_DIRECTORY}/node_modules/@grackle-ai/common/dist`);
|
|
209
|
+
await executor.copyTo(join(commonPackageDir, "package.json"), `${REMOTE_POWERLINE_DIRECTORY}/node_modules/@grackle-ai/common/package.json`);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
// ── Production mode: npm install from registry ──
|
|
213
|
+
entryPoint = "node_modules/@grackle-ai/powerline/dist/index.js";
|
|
214
|
+
const version = getPackageVersion();
|
|
215
|
+
yield { stage: "bootstrapping", message: "Creating remote directories...", progress: 0.20 };
|
|
216
|
+
await executor.exec(`mkdir -p ${REMOTE_POWERLINE_DIRECTORY}`, { timeout: REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
217
|
+
yield { stage: "bootstrapping", message: `Installing @grackle-ai/powerline@${version}...`, progress: 0.25 };
|
|
218
|
+
await executor.exec(`cd ${REMOTE_POWERLINE_DIRECTORY} && npm init -y && npm install @grackle-ai/powerline@${version} --omit=dev`, { timeout: BOOTSTRAP_NPM_INSTALL_TIMEOUT_MS });
|
|
219
|
+
}
|
|
220
|
+
logger.info({ devMode, entryPoint }, "PowerLine bootstrap mode");
|
|
221
|
+
// 7. Copy Claude Code credentials for subscription auth (if present on host).
|
|
222
|
+
// Stored under the PowerLine directory so destroy() cleans them up.
|
|
223
|
+
const hostCredsPath = join(homedir(), ".claude", ".credentials.json");
|
|
224
|
+
if (existsSync(hostCredsPath)) {
|
|
225
|
+
yield { stage: "pushing_tokens", message: "Copying Claude credentials...", progress: 0.57 };
|
|
226
|
+
try {
|
|
227
|
+
await executor.exec(`mkdir -p ${REMOTE_POWERLINE_DIRECTORY}/.claude`, { timeout: REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
228
|
+
await executor.copyTo(hostCredsPath, `${REMOTE_POWERLINE_DIRECTORY}/.claude/.credentials.json`);
|
|
229
|
+
await executor.exec(`chmod 600 ${REMOTE_POWERLINE_DIRECTORY}/.claude/.credentials.json`, { timeout: REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
230
|
+
// Symlink so Claude Code finds it at the expected ~/.claude path.
|
|
231
|
+
// Only create if no credentials file already exists (avoid clobbering user's own setup).
|
|
232
|
+
await executor.exec(`mkdir -p ~/.claude && if [ ! -e ~/.claude/.credentials.json ]; then ln -s ${REMOTE_POWERLINE_DIRECTORY}/.claude/.credentials.json ~/.claude/.credentials.json; fi`, { timeout: REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
logger.warn({ err }, "Failed to copy Claude credentials (agent may need manual login)");
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// 8. Kill any existing PowerLine process on the port (with fallbacks)
|
|
239
|
+
yield { stage: "bootstrapping", message: "Stopping any existing PowerLine process...", progress: 0.60 };
|
|
240
|
+
try {
|
|
241
|
+
await executor.exec(buildRemoteKillCommand(), { timeout: REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
242
|
+
await sleep(1_000);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// Ignore — no process to kill
|
|
246
|
+
}
|
|
247
|
+
// 9. Write env vars to a file on the remote host, then source it at startup.
|
|
248
|
+
// This avoids shell injection from values containing quotes or special chars.
|
|
249
|
+
const envLines = [];
|
|
250
|
+
if (powerlineToken) {
|
|
251
|
+
envLines.push(`export GRACKLE_POWERLINE_TOKEN='${shellEscape(powerlineToken)}'`);
|
|
252
|
+
}
|
|
253
|
+
for (const varName of FORWARDED_ENV_VARS) {
|
|
254
|
+
const value = process.env[varName];
|
|
255
|
+
if (value) {
|
|
256
|
+
envLines.push(`export ${varName}='${shellEscape(value)}'`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (extraEnv) {
|
|
260
|
+
for (const [key, value] of Object.entries(extraEnv)) {
|
|
261
|
+
if (!ENV_VAR_NAME_PATTERN.test(key)) {
|
|
262
|
+
logger.warn({ key }, "Skipping invalid env var name");
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
envLines.push(`export ${key}='${shellEscape(value)}'`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (envLines.length > 0) {
|
|
269
|
+
const envFileContent = envLines.join("\n") + "\n";
|
|
270
|
+
const envFileContentBase64 = Buffer.from(envFileContent, "utf8").toString("base64");
|
|
271
|
+
await executor.exec(`cd ${REMOTE_POWERLINE_DIRECTORY} && node -e "require('fs').writeFileSync('.env.sh',Buffer.from(process.argv[1],'base64').toString('utf8'))" '${shellEscape(envFileContentBase64)}'`, { timeout: REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
272
|
+
await executor.exec(`chmod 600 ${REMOTE_POWERLINE_DIRECTORY}/.env.sh`, { timeout: REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
273
|
+
}
|
|
274
|
+
// 10. Start PowerLine by sourcing the env file and backgrounding.
|
|
275
|
+
// We avoid capturing $! because some transports (gh codespace ssh) exit
|
|
276
|
+
// with code 255 when the shell backgrounds a process.
|
|
277
|
+
yield { stage: "bootstrapping", message: "Starting PowerLine on remote host...", progress: 0.65 };
|
|
278
|
+
const sourceEnv = envLines.length > 0
|
|
279
|
+
? `. ${REMOTE_POWERLINE_DIRECTORY}/.env.sh && `
|
|
280
|
+
: "";
|
|
281
|
+
const startScript = `cd ${REMOTE_POWERLINE_DIRECTORY}`
|
|
282
|
+
+ ` && ${sourceEnv}nohup node ${entryPoint} --port=${DEFAULT_POWERLINE_PORT}`
|
|
283
|
+
+ ` > ~/.grackle/powerline.log 2>&1 & echo $! > ${REMOTE_POWERLINE_DIRECTORY}/powerline.pid`;
|
|
284
|
+
try {
|
|
285
|
+
await executor.exec(`bash -c '${shellEscape(startScript)}'`, { timeout: REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
// Some SSH transports return non-zero when the session ends after backgrounding.
|
|
289
|
+
// We'll verify the process is running below — only log the error.
|
|
290
|
+
logger.debug({ err }, "Start command returned non-zero (expected with background process)");
|
|
291
|
+
}
|
|
292
|
+
// 11. Wait for process to stabilize, then verify port is listening
|
|
293
|
+
yield { stage: "bootstrapping", message: "Waiting for PowerLine to start...", progress: 0.70 };
|
|
294
|
+
await sleep(POWERLINE_STARTUP_DELAY_MS);
|
|
295
|
+
// Verify the port is listening using a Node.js one-liner (pgrep may not be in PATH)
|
|
296
|
+
try {
|
|
297
|
+
await executor.exec(`node -e "const s=require('net').createConnection(${DEFAULT_POWERLINE_PORT},'127.0.0.1');\
|
|
298
|
+
s.on('connect',()=>{s.destroy();process.exit(0)});\
|
|
299
|
+
s.on('error',()=>process.exit(1))"`, { timeout: REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
300
|
+
logger.info("Remote PowerLine is listening on port %d", DEFAULT_POWERLINE_PORT);
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
throw new Error("PowerLine process died immediately after starting. Check ~/.grackle/powerline.log on the remote host.");
|
|
304
|
+
}
|
|
305
|
+
yield { stage: "bootstrapping", message: "PowerLine is running on remote host", progress: 0.75 };
|
|
306
|
+
}
|
|
307
|
+
// ─── Connect Through Tunnel ────────────────────────────────
|
|
308
|
+
/**
|
|
309
|
+
* Connect to a PowerLine through a local tunnel port, retrying until the gRPC
|
|
310
|
+
* service responds to a ping.
|
|
311
|
+
*/
|
|
312
|
+
export async function connectThroughTunnel(environmentId, localPort, powerlineToken) {
|
|
313
|
+
const client = createPowerLineClient(`http://127.0.0.1:${localPort}`, powerlineToken);
|
|
314
|
+
let lastError;
|
|
315
|
+
for (let attempt = 0; attempt < CONNECT_MAX_RETRIES; attempt++) {
|
|
316
|
+
try {
|
|
317
|
+
await client.ping({});
|
|
318
|
+
return { client, environmentId, port: localPort };
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
lastError = err;
|
|
322
|
+
await sleep(CONNECT_RETRY_DELAY_MS);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// Clean up the tunnel so we don't leak background processes on connect failure
|
|
326
|
+
try {
|
|
327
|
+
await closeTunnel(environmentId);
|
|
328
|
+
}
|
|
329
|
+
catch (err) {
|
|
330
|
+
logger.error({ environmentId, err }, "Failed to close tunnel after connect failure");
|
|
331
|
+
}
|
|
332
|
+
throw new Error(`Could not reach PowerLine after ${CONNECT_MAX_RETRIES} attempts: ${lastError}`);
|
|
333
|
+
}
|
|
334
|
+
// ─── Wait for Local Port ────────────────────────────────────
|
|
335
|
+
/**
|
|
336
|
+
* Poll until a TCP connection can be established on localhost at the given port.
|
|
337
|
+
* Used to wait for a tunnel process to begin accepting connections.
|
|
338
|
+
*/
|
|
339
|
+
export async function waitForLocalPort(port) {
|
|
340
|
+
for (let attempt = 0; attempt < TUNNEL_PORT_POLL_MAX_ATTEMPTS; attempt++) {
|
|
341
|
+
const reachable = await new Promise((resolve) => {
|
|
342
|
+
const socket = createConnection({ host: "127.0.0.1", port });
|
|
343
|
+
socket.once("connect", () => {
|
|
344
|
+
socket.destroy();
|
|
345
|
+
resolve(true);
|
|
346
|
+
});
|
|
347
|
+
socket.once("error", () => {
|
|
348
|
+
socket.destroy();
|
|
349
|
+
resolve(false);
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
if (reachable) {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
await sleep(TUNNEL_PORT_POLL_DELAY_MS);
|
|
356
|
+
}
|
|
357
|
+
throw new Error(`Local port ${port} did not become reachable after ${TUNNEL_PORT_POLL_MAX_ATTEMPTS} attempts`);
|
|
358
|
+
}
|
|
359
|
+
// ─── Remote Process Kill ────────────────────────────────────
|
|
360
|
+
/**
|
|
361
|
+
* Build a shell command that kills the remote PowerLine process.
|
|
362
|
+
* Prefers killing by tracked PID (written at startup) to avoid terminating
|
|
363
|
+
* unrelated services on the same port. Falls back to port-based kill.
|
|
364
|
+
*/
|
|
365
|
+
export function buildRemoteKillCommand() {
|
|
366
|
+
const pidfile = `${REMOTE_POWERLINE_DIRECTORY}/powerline.pid`;
|
|
367
|
+
// Try pidfile-based kill first (safe — only kills what we started)
|
|
368
|
+
const pidfileKill = [
|
|
369
|
+
`[ -f "${pidfile}" ]`,
|
|
370
|
+
`PID=$(cat "${pidfile}" 2>/dev/null)`,
|
|
371
|
+
`[ -n "$PID" ]`,
|
|
372
|
+
`kill "$PID" 2>/dev/null`,
|
|
373
|
+
`rm -f "${pidfile}"`,
|
|
374
|
+
].join(" && ");
|
|
375
|
+
// Fallback: port-based kill (for upgrades from before pidfile support)
|
|
376
|
+
const portKill = `fuser -k ${DEFAULT_POWERLINE_PORT}/tcp 2>/dev/null`
|
|
377
|
+
+ ` || lsof -ti:${DEFAULT_POWERLINE_PORT} | xargs kill 2>/dev/null`
|
|
378
|
+
+ ` || pkill -f "powerline.*${DEFAULT_POWERLINE_PORT}" 2>/dev/null`;
|
|
379
|
+
return `(${pidfileKill}) || (${portKill}) || true`;
|
|
380
|
+
}
|
|
381
|
+
// ─── Exports for Adapter Use ────────────────────────────────
|
|
382
|
+
export { findFreePort, REMOTE_POWERLINE_DIRECTORY, SSH_CONNECTIVITY_TIMEOUT_MS, REMOTE_EXEC_DEFAULT_TIMEOUT_MS };
|
|
383
|
+
//# sourceMappingURL=remote-adapter-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-adapter-utils.js","sourceRoot":"","sources":["../../src/adapters/remote-adapter-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { EnvironmentAdapter, BaseEnvironmentConfig, PowerLineConnection, ProvisionEvent } from "./adapter.js";
|
|
2
|
+
/** SSH-specific environment configuration. */
|
|
3
|
+
export interface SshEnvironmentConfig extends BaseEnvironmentConfig {
|
|
4
|
+
/** Remote hostname or IP address (required). */
|
|
5
|
+
host: string;
|
|
6
|
+
/** SSH username (defaults to the current OS user). */
|
|
7
|
+
user?: string;
|
|
8
|
+
/** SSH port on the remote host (defaults to 22). */
|
|
9
|
+
sshPort?: number;
|
|
10
|
+
/** Path to an SSH private key file. */
|
|
11
|
+
identityFile?: string;
|
|
12
|
+
/** Extra SSH options passed as `-o Key=Value`. */
|
|
13
|
+
sshOptions?: Record<string, string>;
|
|
14
|
+
/** Override the local tunnel port (otherwise a free port is chosen). */
|
|
15
|
+
localPort?: number;
|
|
16
|
+
/** Additional environment variables forwarded to the remote PowerLine. */
|
|
17
|
+
env?: Record<string, string>;
|
|
18
|
+
}
|
|
19
|
+
/** Environment adapter that provisions and manages remote environments via SSH. */
|
|
20
|
+
export declare class SshAdapter implements EnvironmentAdapter {
|
|
21
|
+
type: string;
|
|
22
|
+
/** Provision the remote host: test connectivity, bootstrap PowerLine, open tunnel. */
|
|
23
|
+
provision(environmentId: string, config: Record<string, unknown>, powerlineToken: string): AsyncGenerator<ProvisionEvent>;
|
|
24
|
+
/** Connect to the PowerLine through the SSH tunnel. */
|
|
25
|
+
connect(environmentId: string, config: Record<string, unknown>, powerlineToken: string): Promise<PowerLineConnection>;
|
|
26
|
+
/** Close the SSH tunnel without stopping the remote PowerLine. */
|
|
27
|
+
disconnect(environmentId: string): Promise<void>;
|
|
28
|
+
/** Stop the remote PowerLine process and close the tunnel. */
|
|
29
|
+
stop(environmentId: string, config: Record<string, unknown>): Promise<void>;
|
|
30
|
+
/** Stop the remote PowerLine, remove artifacts, and close the tunnel. */
|
|
31
|
+
destroy(environmentId: string, config: Record<string, unknown>): Promise<void>;
|
|
32
|
+
/** Check that the tunnel is alive and the PowerLine responds to a ping. */
|
|
33
|
+
healthCheck(connection: PowerLineConnection): Promise<boolean>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=ssh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/adapters/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAuBnH,8CAA8C;AAC9C,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IACjE,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAkFD,mFAAmF;AACnF,qBAAa,UAAW,YAAW,kBAAkB;IAC5C,IAAI,EAAE,MAAM,CAAS;IAE5B,sFAAsF;IACxE,SAAS,CACrB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,cAAc,EAAE,MAAM,GACrB,cAAc,CAAC,cAAc,CAAC;IA8BjC,uDAAuD;IAC1C,OAAO,CAClB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,mBAAmB,CAAC;IAQ/B,kEAAkE;IACrD,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D,8DAA8D;IACjD,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxF,yEAAyE;IAC5D,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3F,2EAA2E;IAC9D,WAAW,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;CAY5E"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { DEFAULT_POWERLINE_PORT } from "@grackle-ai/common";
|
|
2
|
+
import { ProcessTunnel, bootstrapPowerLine, connectThroughTunnel, registerTunnel, getTunnel, closeTunnel, findFreePort, buildRemoteKillCommand, SSH_CONNECTIVITY_TIMEOUT_MS, REMOTE_EXEC_DEFAULT_TIMEOUT_MS, REMOTE_POWERLINE_DIRECTORY, } from "./remote-adapter-utils.js";
|
|
3
|
+
import { exec } from "../utils/exec.js";
|
|
4
|
+
import { logger } from "../logger.js";
|
|
5
|
+
const REMOTE_COPY_TIMEOUT_MS = 120_000;
|
|
6
|
+
// ─── SSH Helpers ────────────────────────────────────────────
|
|
7
|
+
/** Build the common SSH flags shared across exec, scp, and tunnel commands. */
|
|
8
|
+
function buildSshFlags(cfg) {
|
|
9
|
+
const flags = ["-o", "BatchMode=yes", "-o", "StrictHostKeyChecking=accept-new"];
|
|
10
|
+
if (cfg.sshPort) {
|
|
11
|
+
flags.push("-p", String(cfg.sshPort));
|
|
12
|
+
}
|
|
13
|
+
if (cfg.identityFile) {
|
|
14
|
+
flags.push("-i", cfg.identityFile);
|
|
15
|
+
}
|
|
16
|
+
if (cfg.sshOptions) {
|
|
17
|
+
for (const [key, value] of Object.entries(cfg.sshOptions)) {
|
|
18
|
+
flags.push("-o", `${key}=${value}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return flags;
|
|
22
|
+
}
|
|
23
|
+
/** Build the `user@host` destination string. */
|
|
24
|
+
function buildDestination(cfg) {
|
|
25
|
+
return cfg.user ? `${cfg.user}@${cfg.host}` : cfg.host;
|
|
26
|
+
}
|
|
27
|
+
// ─── Executor ───────────────────────────────────────────────
|
|
28
|
+
/** Execute commands on a remote host via SSH. */
|
|
29
|
+
class SshExecutor {
|
|
30
|
+
cfg;
|
|
31
|
+
constructor(cfg) {
|
|
32
|
+
this.cfg = cfg;
|
|
33
|
+
}
|
|
34
|
+
/** Execute a shell command on the remote host and return trimmed stdout. */
|
|
35
|
+
async exec(command, opts) {
|
|
36
|
+
const args = [...buildSshFlags(this.cfg), buildDestination(this.cfg), command];
|
|
37
|
+
const result = await exec("ssh", args, { timeout: opts?.timeout ?? REMOTE_EXEC_DEFAULT_TIMEOUT_MS });
|
|
38
|
+
return result.stdout;
|
|
39
|
+
}
|
|
40
|
+
/** Copy a local file or directory to the remote host via scp. */
|
|
41
|
+
async copyTo(localPath, remotePath) {
|
|
42
|
+
const flags = buildSshFlags(this.cfg);
|
|
43
|
+
// scp uses -P (uppercase) instead of -p for port
|
|
44
|
+
const scpFlags = flags.map((f, i) => (f === "-p" && i > 0 && flags[i - 1] !== "-o") ? "-P" : f);
|
|
45
|
+
const args = ["-r", ...scpFlags, localPath, `${buildDestination(this.cfg)}:${remotePath}`];
|
|
46
|
+
await exec("scp", args, { timeout: REMOTE_COPY_TIMEOUT_MS });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// ─── Tunnel ─────────────────────────────────────────────────
|
|
50
|
+
/** SSH tunnel that forwards a local port to the remote PowerLine port. */
|
|
51
|
+
class SshTunnel extends ProcessTunnel {
|
|
52
|
+
cfg;
|
|
53
|
+
constructor(localPort, cfg) {
|
|
54
|
+
super(localPort);
|
|
55
|
+
this.cfg = cfg;
|
|
56
|
+
}
|
|
57
|
+
/** Return the ssh command and arguments for the tunnel process. */
|
|
58
|
+
spawnArgs() {
|
|
59
|
+
const flags = buildSshFlags(this.cfg);
|
|
60
|
+
const args = [
|
|
61
|
+
"-N",
|
|
62
|
+
"-L", `${this.localPort}:127.0.0.1:${DEFAULT_POWERLINE_PORT}`,
|
|
63
|
+
"-o", "ExitOnForwardFailure=yes",
|
|
64
|
+
"-o", "ServerAliveInterval=15",
|
|
65
|
+
"-o", "ServerAliveCountMax=3",
|
|
66
|
+
...flags,
|
|
67
|
+
buildDestination(this.cfg),
|
|
68
|
+
];
|
|
69
|
+
return { command: "ssh", args };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// ─── Adapter ────────────────────────────────────────────────
|
|
73
|
+
/** Environment adapter that provisions and manages remote environments via SSH. */
|
|
74
|
+
export class SshAdapter {
|
|
75
|
+
type = "ssh";
|
|
76
|
+
/** Provision the remote host: test connectivity, bootstrap PowerLine, open tunnel. */
|
|
77
|
+
async *provision(environmentId, config, powerlineToken) {
|
|
78
|
+
const cfg = config;
|
|
79
|
+
if (!cfg.host) {
|
|
80
|
+
throw new Error("SSH adapter requires a 'host' in the configuration");
|
|
81
|
+
}
|
|
82
|
+
const executor = new SshExecutor(cfg);
|
|
83
|
+
// Test SSH connectivity
|
|
84
|
+
yield { stage: "connecting", message: `Testing SSH connectivity to ${cfg.host}...`, progress: 0.05 };
|
|
85
|
+
try {
|
|
86
|
+
await executor.exec("echo ok", { timeout: SSH_CONNECTIVITY_TIMEOUT_MS });
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
throw new Error(`Cannot reach ${cfg.host} via SSH: ${err}`);
|
|
90
|
+
}
|
|
91
|
+
// Bootstrap PowerLine on the remote host
|
|
92
|
+
yield* bootstrapPowerLine(executor, powerlineToken, cfg.env);
|
|
93
|
+
// Open SSH tunnel
|
|
94
|
+
const localPort = cfg.localPort || await findFreePort();
|
|
95
|
+
yield { stage: "tunneling", message: `Opening SSH tunnel on local port ${localPort}...`, progress: 0.80 };
|
|
96
|
+
const tunnel = new SshTunnel(localPort, cfg);
|
|
97
|
+
await tunnel.open();
|
|
98
|
+
registerTunnel(environmentId, { tunnel });
|
|
99
|
+
yield { stage: "connecting", message: `Tunnel open, connecting on port ${localPort}...`, progress: 0.90 };
|
|
100
|
+
}
|
|
101
|
+
/** Connect to the PowerLine through the SSH tunnel. */
|
|
102
|
+
async connect(environmentId, config, powerlineToken) {
|
|
103
|
+
const state = getTunnel(environmentId);
|
|
104
|
+
if (!state) {
|
|
105
|
+
throw new Error(`No tunnel registered for environment ${environmentId}`);
|
|
106
|
+
}
|
|
107
|
+
return connectThroughTunnel(environmentId, state.tunnel.localPort, powerlineToken);
|
|
108
|
+
}
|
|
109
|
+
/** Close the SSH tunnel without stopping the remote PowerLine. */
|
|
110
|
+
async disconnect(environmentId) {
|
|
111
|
+
await closeTunnel(environmentId);
|
|
112
|
+
}
|
|
113
|
+
/** Stop the remote PowerLine process and close the tunnel. */
|
|
114
|
+
async stop(environmentId, config) {
|
|
115
|
+
const cfg = config;
|
|
116
|
+
const executor = new SshExecutor(cfg);
|
|
117
|
+
try {
|
|
118
|
+
await executor.exec(buildRemoteKillCommand());
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
logger.debug({ environmentId, err }, "Failed to kill remote PowerLine (may already be stopped)");
|
|
122
|
+
}
|
|
123
|
+
await closeTunnel(environmentId);
|
|
124
|
+
}
|
|
125
|
+
/** Stop the remote PowerLine, remove artifacts, and close the tunnel. */
|
|
126
|
+
async destroy(environmentId, config) {
|
|
127
|
+
const cfg = config;
|
|
128
|
+
const executor = new SshExecutor(cfg);
|
|
129
|
+
try {
|
|
130
|
+
await executor.exec(`${buildRemoteKillCommand()}; `
|
|
131
|
+
+ 'CRED="$HOME/.claude/.credentials.json"; '
|
|
132
|
+
+ `if [ -L "$CRED" ]; then case "$(readlink "$CRED" 2>/dev/null)" in ${REMOTE_POWERLINE_DIRECTORY}/*) rm -f "$CRED";; esac; fi; `
|
|
133
|
+
+ `rm -rf ${REMOTE_POWERLINE_DIRECTORY}`);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
logger.debug({ environmentId, err }, "Failed to clean up remote PowerLine artifacts");
|
|
137
|
+
}
|
|
138
|
+
await closeTunnel(environmentId);
|
|
139
|
+
}
|
|
140
|
+
/** Check that the tunnel is alive and the PowerLine responds to a ping. */
|
|
141
|
+
async healthCheck(connection) {
|
|
142
|
+
const state = getTunnel(connection.environmentId);
|
|
143
|
+
if (!state || !state.tunnel.isAlive()) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
await connection.client.ping({});
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=ssh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/adapters/ssh.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAoBA,OAAO,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,9 @@ import { registerAdapter, startHeartbeat } from "./adapter-manager.js";
|
|
|
7
7
|
import { updateEnvironmentStatus, resetAllStatuses } from "./env-registry.js";
|
|
8
8
|
import { DockerAdapter } from "./adapters/docker.js";
|
|
9
9
|
import { LocalAdapter } from "./adapters/local.js";
|
|
10
|
+
import { SshAdapter } from "./adapters/ssh.js";
|
|
11
|
+
import { CodespaceAdapter } from "./adapters/codespace.js";
|
|
12
|
+
import { closeAllTunnels } from "./adapters/remote-adapter-utils.js";
|
|
10
13
|
import { createWsBridge } from "./ws-bridge.js";
|
|
11
14
|
import { DEFAULT_SERVER_PORT, DEFAULT_WEB_PORT } from "@grackle-ai/common";
|
|
12
15
|
import { readFileSync, existsSync } from "node:fs";
|
|
@@ -64,6 +67,8 @@ function main() {
|
|
|
64
67
|
// Register adapters
|
|
65
68
|
registerAdapter(new DockerAdapter());
|
|
66
69
|
registerAdapter(new LocalAdapter());
|
|
70
|
+
registerAdapter(new SshAdapter());
|
|
71
|
+
registerAdapter(new CodespaceAdapter());
|
|
67
72
|
// Start heartbeat
|
|
68
73
|
startHeartbeat((environmentId) => {
|
|
69
74
|
updateEnvironmentStatus(environmentId, "disconnected");
|
|
@@ -95,8 +100,9 @@ function main() {
|
|
|
95
100
|
logger.info({ port: webPort }, "Web UI + WebSocket on http://127.0.0.1:%d", webPort);
|
|
96
101
|
});
|
|
97
102
|
// Graceful shutdown
|
|
98
|
-
function shutdown() {
|
|
103
|
+
async function shutdown() {
|
|
99
104
|
logger.info("Shutting down...");
|
|
105
|
+
await closeAllTunnels();
|
|
100
106
|
grpcServer.close();
|
|
101
107
|
webServer.close();
|
|
102
108
|
process.exit(0);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grackle-ai/server",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "Central gRPC server with SQLite storage and WebSocket bridge for Grackle",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@bufbuild/protobuf": "^2.5.0",
|
|
29
29
|
"@connectrpc/connect": "^2.0.0",
|
|
30
30
|
"@connectrpc/connect-node": "^2.0.0",
|
|
31
|
-
"@grackle-ai/common": "0.0.
|
|
31
|
+
"@grackle-ai/common": "0.0.4",
|
|
32
32
|
"better-sqlite3": "^11.0.0",
|
|
33
33
|
"drizzle-orm": "^0.38.0",
|
|
34
34
|
"pino": "^10.3.1",
|