@hackerai/local 0.5.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/utils.test.d.ts +1 -4
- package/dist/__tests__/utils.test.d.ts.map +1 -1
- package/dist/__tests__/utils.test.js +1 -93
- package/dist/__tests__/utils.test.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +233 -372
- package/dist/index.js.map +1 -1
- package/dist/utils.d.ts +0 -30
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +1 -52
- package/dist/utils.js.map +1 -1
- package/package.json +2 -1
|
@@ -3,10 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* These tests verify:
|
|
5
5
|
* - Output truncation (25% head + 75% tail strategy)
|
|
6
|
-
* -
|
|
7
|
-
* - Docker run command building
|
|
8
|
-
* - Sandbox mode detection
|
|
9
|
-
* - Shell detection parsing
|
|
6
|
+
* - Platform shell detection
|
|
10
7
|
*/
|
|
11
8
|
export {};
|
|
12
9
|
//# sourceMappingURL=utils.test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/utils.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/utils.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -4,10 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* These tests verify:
|
|
6
6
|
* - Output truncation (25% head + 75% tail strategy)
|
|
7
|
-
* -
|
|
8
|
-
* - Docker run command building
|
|
9
|
-
* - Sandbox mode detection
|
|
10
|
-
* - Shell detection parsing
|
|
7
|
+
* - Platform shell detection
|
|
11
8
|
*/
|
|
12
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
10
|
const utils_1 = require("../utils");
|
|
@@ -47,95 +44,6 @@ describe("Output Truncation", () => {
|
|
|
47
44
|
expect(result).toContain(utils_1.TRUNCATION_MARKER);
|
|
48
45
|
});
|
|
49
46
|
});
|
|
50
|
-
describe("Docker Capabilities", () => {
|
|
51
|
-
it("should include NET_RAW for ping, nmap, raw sockets", () => {
|
|
52
|
-
expect(utils_1.DOCKER_CAPABILITIES).toContain("NET_RAW");
|
|
53
|
-
});
|
|
54
|
-
it("should include NET_ADMIN for network interface tools", () => {
|
|
55
|
-
expect(utils_1.DOCKER_CAPABILITIES).toContain("NET_ADMIN");
|
|
56
|
-
});
|
|
57
|
-
it("should include SYS_PTRACE for debugging tools", () => {
|
|
58
|
-
expect(utils_1.DOCKER_CAPABILITIES).toContain("SYS_PTRACE");
|
|
59
|
-
});
|
|
60
|
-
it("should build capability flags correctly", () => {
|
|
61
|
-
const flags = (0, utils_1.buildDockerCapabilityFlags)();
|
|
62
|
-
expect(flags).toBe("--cap-add=NET_RAW --cap-add=NET_ADMIN --cap-add=SYS_PTRACE");
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
describe("Docker Run Command", () => {
|
|
66
|
-
it("should build basic docker run command with capabilities", () => {
|
|
67
|
-
const cmd = (0, utils_1.buildDockerRunCommand)({ image: "hackerai/sandbox:latest" });
|
|
68
|
-
expect(cmd).toContain("docker run -d");
|
|
69
|
-
expect(cmd).toContain("--cap-add=NET_RAW");
|
|
70
|
-
expect(cmd).toContain("--cap-add=NET_ADMIN");
|
|
71
|
-
expect(cmd).toContain("--cap-add=SYS_PTRACE");
|
|
72
|
-
expect(cmd).toContain("--network host");
|
|
73
|
-
expect(cmd).toContain("hackerai/sandbox:latest");
|
|
74
|
-
expect(cmd).toContain("tail -f /dev/null");
|
|
75
|
-
});
|
|
76
|
-
it("should include container name when provided", () => {
|
|
77
|
-
const cmd = (0, utils_1.buildDockerRunCommand)({
|
|
78
|
-
image: "hackerai/sandbox:latest",
|
|
79
|
-
containerName: "my-container",
|
|
80
|
-
});
|
|
81
|
-
expect(cmd).toContain("--name my-container");
|
|
82
|
-
});
|
|
83
|
-
it("should not include container name when not provided", () => {
|
|
84
|
-
const cmd = (0, utils_1.buildDockerRunCommand)({ image: "hackerai/sandbox:latest" });
|
|
85
|
-
expect(cmd).not.toContain("--name");
|
|
86
|
-
});
|
|
87
|
-
it("should exclude capabilities when disabled", () => {
|
|
88
|
-
const cmd = (0, utils_1.buildDockerRunCommand)({
|
|
89
|
-
image: "alpine",
|
|
90
|
-
capabilities: false,
|
|
91
|
-
});
|
|
92
|
-
expect(cmd).not.toContain("--cap-add");
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
describe("Sandbox Mode Detection", () => {
|
|
96
|
-
it("should return 'dangerous' when dangerous flag is set", () => {
|
|
97
|
-
const mode = (0, utils_1.getSandboxMode)({
|
|
98
|
-
dangerous: true,
|
|
99
|
-
});
|
|
100
|
-
expect(mode).toBe("dangerous");
|
|
101
|
-
});
|
|
102
|
-
it("should return 'docker' when dangerous flag is not set", () => {
|
|
103
|
-
const mode = (0, utils_1.getSandboxMode)({
|
|
104
|
-
dangerous: false,
|
|
105
|
-
});
|
|
106
|
-
expect(mode).toBe("docker");
|
|
107
|
-
});
|
|
108
|
-
it("should return 'docker' when dangerous flag is undefined", () => {
|
|
109
|
-
const mode = (0, utils_1.getSandboxMode)({});
|
|
110
|
-
expect(mode).toBe("docker");
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
describe("Shell Detection Parsing", () => {
|
|
114
|
-
it("should return bash when found", () => {
|
|
115
|
-
const shell = (0, utils_1.parseShellDetectionOutput)("/bin/bash");
|
|
116
|
-
expect(shell).toBe("/bin/bash");
|
|
117
|
-
});
|
|
118
|
-
it("should return sh when bash not found", () => {
|
|
119
|
-
const shell = (0, utils_1.parseShellDetectionOutput)("/bin/sh");
|
|
120
|
-
expect(shell).toBe("/bin/sh");
|
|
121
|
-
});
|
|
122
|
-
it("should take first line when multiple results", () => {
|
|
123
|
-
const shell = (0, utils_1.parseShellDetectionOutput)("/bin/bash\n/bin/sh");
|
|
124
|
-
expect(shell).toBe("/bin/bash");
|
|
125
|
-
});
|
|
126
|
-
it("should return /bin/sh for empty output", () => {
|
|
127
|
-
const shell = (0, utils_1.parseShellDetectionOutput)("");
|
|
128
|
-
expect(shell).toBe("/bin/sh");
|
|
129
|
-
});
|
|
130
|
-
it("should return /bin/sh for whitespace-only output", () => {
|
|
131
|
-
const shell = (0, utils_1.parseShellDetectionOutput)(" \n ");
|
|
132
|
-
expect(shell).toBe("/bin/sh");
|
|
133
|
-
});
|
|
134
|
-
it("should handle Alpine busybox ash path", () => {
|
|
135
|
-
const shell = (0, utils_1.parseShellDetectionOutput)("/bin/ash");
|
|
136
|
-
expect(shell).toBe("/bin/ash");
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
47
|
describe("Platform Shell Detection", () => {
|
|
140
48
|
it("should return cmd.exe for Windows", () => {
|
|
141
49
|
const result = (0, utils_1.getDefaultShell)("win32");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../src/__tests__/utils.test.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../src/__tests__/utils.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* HackerAI Local Sandbox Client
|
|
4
4
|
*
|
|
5
|
-
* Connects to HackerAI backend via Convex
|
|
6
|
-
*
|
|
5
|
+
* Connects to HackerAI backend via Convex for connection lifecycle
|
|
6
|
+
* and uses Centrifugo for real-time command relay and streaming output.
|
|
7
|
+
*
|
|
8
|
+
* Runs commands directly on the host OS (no Docker isolation).
|
|
7
9
|
*
|
|
8
10
|
* Usage:
|
|
9
|
-
* npx @hackerai/local --token TOKEN --name "My
|
|
10
|
-
* npx @hackerai/local --token TOKEN --name "Work PC" --dangerous
|
|
11
|
+
* npx @hackerai/local --token TOKEN --name "My Machine"
|
|
11
12
|
*/
|
|
12
13
|
export {};
|
|
13
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG"}
|
package/dist/index.js
CHANGED
|
@@ -3,24 +3,28 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* HackerAI Local Sandbox Client
|
|
5
5
|
*
|
|
6
|
-
* Connects to HackerAI backend via Convex
|
|
7
|
-
*
|
|
6
|
+
* Connects to HackerAI backend via Convex for connection lifecycle
|
|
7
|
+
* and uses Centrifugo for real-time command relay and streaming output.
|
|
8
|
+
*
|
|
9
|
+
* Runs commands directly on the host OS (no Docker isolation).
|
|
8
10
|
*
|
|
9
11
|
* Usage:
|
|
10
|
-
* npx @hackerai/local --token TOKEN --name "My
|
|
11
|
-
* npx @hackerai/local --token TOKEN --name "Work PC" --dangerous
|
|
12
|
+
* npx @hackerai/local --token TOKEN --name "My Machine"
|
|
12
13
|
*/
|
|
13
14
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
15
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
16
|
};
|
|
16
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
18
|
const browser_1 = require("convex/browser");
|
|
19
|
+
const centrifuge_1 = require("centrifuge");
|
|
18
20
|
const child_process_1 = require("child_process");
|
|
19
21
|
const os_1 = __importDefault(require("os"));
|
|
20
22
|
const utils_1 = require("./utils");
|
|
21
23
|
const DEFAULT_SHELL = (0, utils_1.getDefaultShell)(os_1.default.platform());
|
|
22
24
|
// Idle timeout: auto-terminate after 1 hour without commands
|
|
23
25
|
const IDLE_TIMEOUT_MS = 60 * 60 * 1000; // 1 hour
|
|
26
|
+
// Idle check interval: check every 5 minutes
|
|
27
|
+
const IDLE_CHECK_INTERVAL_MS = 5 * 60 * 1000;
|
|
24
28
|
/**
|
|
25
29
|
* Runs a shell command using spawn for better output control.
|
|
26
30
|
* Collects stdout/stderr and handles timeouts gracefully.
|
|
@@ -64,7 +68,7 @@ function runShellCommand(command, options = {}) {
|
|
|
64
68
|
proc.on("close", (code) => {
|
|
65
69
|
if (timeoutId)
|
|
66
70
|
clearTimeout(timeoutId);
|
|
67
|
-
// Final truncation
|
|
71
|
+
// Final truncation
|
|
68
72
|
const truncatedStdout = (0, utils_1.truncateOutput)(stdout, maxOutputSize);
|
|
69
73
|
const truncatedStderr = (0, utils_1.truncateOutput)(stderr, maxOutputSize);
|
|
70
74
|
if (killed) {
|
|
@@ -93,31 +97,14 @@ function runShellCommand(command, options = {}) {
|
|
|
93
97
|
});
|
|
94
98
|
});
|
|
95
99
|
}
|
|
96
|
-
function runWithOutput(command, args) {
|
|
97
|
-
return new Promise((resolve, reject) => {
|
|
98
|
-
const proc = (0, child_process_1.spawn)(command, args, { stdio: "inherit" });
|
|
99
|
-
proc.on("close", (code) => {
|
|
100
|
-
if (code === 0)
|
|
101
|
-
resolve();
|
|
102
|
-
else
|
|
103
|
-
reject(new Error(`Process exited with code ${code}`));
|
|
104
|
-
});
|
|
105
|
-
proc.on("error", reject);
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
100
|
// Production Convex URL - hardcoded for the published package
|
|
109
101
|
const PRODUCTION_CONVEX_URL = "https://convex.haiusercontent.com";
|
|
110
|
-
// Default pre-built image with all pentesting tools
|
|
111
|
-
const DEFAULT_IMAGE = "hackerai/sandbox";
|
|
112
102
|
// Convex function references (string paths work at runtime)
|
|
113
103
|
const api = {
|
|
114
104
|
localSandbox: {
|
|
115
105
|
connect: "localSandbox:connect",
|
|
116
|
-
heartbeat: "localSandbox:heartbeat",
|
|
117
106
|
disconnect: "localSandbox:disconnect",
|
|
118
|
-
|
|
119
|
-
markCommandExecuting: "localSandbox:markCommandExecuting",
|
|
120
|
-
submitResult: "localSandbox:submitResult",
|
|
107
|
+
refreshCentrifugoToken: "localSandbox:refreshCentrifugoToken",
|
|
121
108
|
},
|
|
122
109
|
};
|
|
123
110
|
// ANSI color codes for terminal output
|
|
@@ -132,115 +119,24 @@ const chalk = {
|
|
|
132
119
|
};
|
|
133
120
|
class LocalSandboxClient {
|
|
134
121
|
config;
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
122
|
+
convexHttp;
|
|
123
|
+
centrifuge;
|
|
124
|
+
subscription;
|
|
138
125
|
userId;
|
|
139
126
|
connectionId;
|
|
140
|
-
session;
|
|
141
|
-
heartbeatInterval;
|
|
142
|
-
commandSubscription;
|
|
143
127
|
isShuttingDown = false;
|
|
144
128
|
lastActivityTime;
|
|
129
|
+
idleCheckInterval;
|
|
145
130
|
constructor(config) {
|
|
146
131
|
this.config = config;
|
|
147
|
-
this.
|
|
132
|
+
this.convexHttp = new browser_1.ConvexHttpClient(config.convexUrl);
|
|
148
133
|
this.lastActivityTime = Date.now();
|
|
149
134
|
}
|
|
150
135
|
async start() {
|
|
151
136
|
console.log(chalk.blue("🚀 Starting HackerAI local sandbox..."));
|
|
152
|
-
|
|
153
|
-
const dockerCheck = await runShellCommand("docker --version", {
|
|
154
|
-
timeout: 5000,
|
|
155
|
-
});
|
|
156
|
-
if (dockerCheck.exitCode !== 0) {
|
|
157
|
-
console.error(chalk.red("❌ Docker not found. Please install Docker or use --dangerous mode."));
|
|
158
|
-
process.exit(1);
|
|
159
|
-
}
|
|
160
|
-
console.log(chalk.green("✓ Docker is available"));
|
|
161
|
-
this.containerId = await this.createContainer();
|
|
162
|
-
console.log(chalk.green(`✓ Container: ${this.containerId.slice(0, 12)}`));
|
|
163
|
-
// Detect available shell (bash or sh fallback for Alpine/minimal images)
|
|
164
|
-
await this.detectContainerShell();
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
console.log(chalk.yellow("⚠️ DANGEROUS MODE - Commands will run directly on your OS!"));
|
|
168
|
-
}
|
|
137
|
+
console.log(chalk.yellow("⚠️ Commands run directly on your OS without any isolation."));
|
|
169
138
|
await this.connect();
|
|
170
139
|
}
|
|
171
|
-
getContainerName() {
|
|
172
|
-
// Generate a predictable container name for --persist mode
|
|
173
|
-
// Sanitize the connection name to be docker-compatible
|
|
174
|
-
const sanitized = this.config.name
|
|
175
|
-
.toLowerCase()
|
|
176
|
-
.replace(/[^a-z0-9-]/g, "-")
|
|
177
|
-
.replace(/-+/g, "-")
|
|
178
|
-
.replace(/^-|-$/g, "");
|
|
179
|
-
return `hackerai-sandbox-${sanitized || "default"}`;
|
|
180
|
-
}
|
|
181
|
-
async findExistingContainer(containerName) {
|
|
182
|
-
// Check if container with this name exists
|
|
183
|
-
const result = await runShellCommand(`docker ps -a --filter "name=^${containerName}$" --format "{{.ID}}|{{.State}}"`, { timeout: 5000 });
|
|
184
|
-
if (result.exitCode !== 0 || !result.stdout.trim()) {
|
|
185
|
-
return null;
|
|
186
|
-
}
|
|
187
|
-
const [id, state] = result.stdout.trim().split("|");
|
|
188
|
-
return { id, running: state === "running" };
|
|
189
|
-
}
|
|
190
|
-
async createContainer() {
|
|
191
|
-
// In persist mode, try to reuse existing container
|
|
192
|
-
if (this.config.persist) {
|
|
193
|
-
const containerName = this.getContainerName();
|
|
194
|
-
const existing = await this.findExistingContainer(containerName);
|
|
195
|
-
if (existing) {
|
|
196
|
-
if (existing.running) {
|
|
197
|
-
console.log(chalk.green(`✓ Reusing existing container: ${containerName}`));
|
|
198
|
-
return existing.id;
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
// Container exists but stopped - start it
|
|
202
|
-
console.log(chalk.blue(`Starting existing container: ${containerName}`));
|
|
203
|
-
const startResult = await runShellCommand(`docker start ${existing.id}`, { timeout: 30000 });
|
|
204
|
-
if (startResult.exitCode === 0) {
|
|
205
|
-
console.log(chalk.green(`✓ Container started: ${containerName}`));
|
|
206
|
-
return existing.id;
|
|
207
|
-
}
|
|
208
|
-
// If start failed, remove and create fresh
|
|
209
|
-
console.log(chalk.yellow(`⚠️ Failed to start, creating new container...`));
|
|
210
|
-
await runShellCommand(`docker rm -f ${existing.id}`, {
|
|
211
|
-
timeout: 5000,
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
if (this.config.build) {
|
|
217
|
-
console.log(chalk.red("❌ --build flag is not supported in the npx package."));
|
|
218
|
-
process.exit(1);
|
|
219
|
-
}
|
|
220
|
-
console.log(chalk.blue(`Pulling pre-built image: ${DEFAULT_IMAGE}`));
|
|
221
|
-
console.log(chalk.gray("(First run may take a few minutes to download the image)"));
|
|
222
|
-
console.log("");
|
|
223
|
-
try {
|
|
224
|
-
await runWithOutput("docker", ["pull", DEFAULT_IMAGE]);
|
|
225
|
-
console.log(chalk.green("✓ Image ready"));
|
|
226
|
-
}
|
|
227
|
-
catch (error) {
|
|
228
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
229
|
-
console.error(chalk.red("❌ Failed to pull image:"), message);
|
|
230
|
-
process.exit(1);
|
|
231
|
-
}
|
|
232
|
-
console.log(chalk.blue("Creating Docker container..."));
|
|
233
|
-
// Build docker run command with capabilities for penetration testing tools
|
|
234
|
-
const dockerCommand = (0, utils_1.buildDockerRunCommand)({
|
|
235
|
-
image: DEFAULT_IMAGE,
|
|
236
|
-
containerName: this.config.persist ? this.getContainerName() : undefined,
|
|
237
|
-
});
|
|
238
|
-
const result = await runShellCommand(dockerCommand, { timeout: 60000 });
|
|
239
|
-
if (result.exitCode !== 0) {
|
|
240
|
-
throw new Error(`Failed to create container: ${result.stderr}`);
|
|
241
|
-
}
|
|
242
|
-
return result.stdout.trim();
|
|
243
|
-
}
|
|
244
140
|
getOsInfo() {
|
|
245
141
|
return {
|
|
246
142
|
platform: os_1.default.platform(),
|
|
@@ -249,62 +145,27 @@ class LocalSandboxClient {
|
|
|
249
145
|
hostname: os_1.default.hostname(),
|
|
250
146
|
};
|
|
251
147
|
}
|
|
252
|
-
getMode() {
|
|
253
|
-
return (0, utils_1.getSandboxMode)({
|
|
254
|
-
dangerous: this.config.dangerous,
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
getModeDisplay() {
|
|
258
|
-
const mode = this.getMode();
|
|
259
|
-
if (mode === "dangerous") {
|
|
260
|
-
return "DANGEROUS";
|
|
261
|
-
}
|
|
262
|
-
return "Docker";
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Detects which shell is available in the container.
|
|
266
|
-
* Tries bash first, falls back to sh if bash is not available.
|
|
267
|
-
* This handles Alpine/BusyBox images that don't have bash installed.
|
|
268
|
-
*/
|
|
269
|
-
async detectContainerShell() {
|
|
270
|
-
if (!this.containerId)
|
|
271
|
-
return;
|
|
272
|
-
// Try to detect available shell using 'command -v' (POSIX compliant)
|
|
273
|
-
// We use 'sh' to run the detection since it's guaranteed to exist
|
|
274
|
-
const result = await runShellCommand(`docker exec ${this.containerId} sh -c 'command -v bash || command -v sh || echo /bin/sh'`, { timeout: 5000 });
|
|
275
|
-
if (result.exitCode === 0) {
|
|
276
|
-
this.containerShell = (0, utils_1.parseShellDetectionOutput)(result.stdout);
|
|
277
|
-
console.log(chalk.green(`✓ Shell: ${this.containerShell}`));
|
|
278
|
-
}
|
|
279
|
-
else {
|
|
280
|
-
// Fallback to /bin/sh if detection failed
|
|
281
|
-
this.containerShell = "/bin/sh";
|
|
282
|
-
console.log(chalk.yellow(`⚠️ Shell detection failed, using ${this.containerShell}`));
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
148
|
async connect() {
|
|
286
149
|
console.log(chalk.blue("Connecting to HackerAI..."));
|
|
287
150
|
try {
|
|
288
|
-
const result = (await this.
|
|
151
|
+
const result = (await this.convexHttp.mutation(api.localSandbox.connect, {
|
|
289
152
|
token: this.config.token,
|
|
290
153
|
connectionName: this.config.name,
|
|
291
|
-
containerId: this.containerId,
|
|
292
154
|
clientVersion: "1.0.0",
|
|
293
|
-
|
|
294
|
-
osInfo: this.config.dangerous ? this.getOsInfo() : undefined,
|
|
155
|
+
osInfo: this.getOsInfo(),
|
|
295
156
|
}));
|
|
296
|
-
if (!result.success ||
|
|
157
|
+
if (!result.success ||
|
|
158
|
+
!result.centrifugoToken ||
|
|
159
|
+
!result.centrifugoWsUrl) {
|
|
297
160
|
throw new Error(result.error || "Authentication failed");
|
|
298
161
|
}
|
|
299
162
|
this.userId = result.userId;
|
|
300
163
|
this.connectionId = result.connectionId;
|
|
301
|
-
this.session = result.session;
|
|
302
164
|
console.log(chalk.green("✓ Authenticated"));
|
|
303
165
|
console.log(chalk.bold(chalk.green("🎉 Local sandbox is ready!")));
|
|
304
166
|
console.log(chalk.gray(`Connection: ${this.connectionId}`));
|
|
305
|
-
|
|
306
|
-
this.
|
|
307
|
-
this.startCommandSubscription();
|
|
167
|
+
this.setupCentrifugo(result.centrifugoWsUrl, result.centrifugoToken);
|
|
168
|
+
this.startIdleCheck();
|
|
308
169
|
}
|
|
309
170
|
catch (error) {
|
|
310
171
|
const err = error;
|
|
@@ -318,52 +179,89 @@ class LocalSandboxClient {
|
|
|
318
179
|
process.exit(1);
|
|
319
180
|
}
|
|
320
181
|
}
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
182
|
+
setupCentrifugo(wsUrl, initialToken) {
|
|
183
|
+
this.centrifuge = new centrifuge_1.Centrifuge(wsUrl, {
|
|
184
|
+
token: initialToken,
|
|
185
|
+
getToken: async () => {
|
|
186
|
+
if (!this.connectionId) {
|
|
187
|
+
throw new Error("Cannot refresh token: connectionId is null");
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
const result = (await this.convexHttp.mutation(api.localSandbox.refreshCentrifugoToken, {
|
|
191
|
+
token: this.config.token,
|
|
192
|
+
connectionId: this.connectionId,
|
|
193
|
+
}));
|
|
194
|
+
return result.centrifugoToken;
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
console.error(chalk.red("Failed to refresh Centrifugo token:"), error);
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
332
200
|
},
|
|
333
|
-
}
|
|
201
|
+
});
|
|
202
|
+
const channel = `sandbox:user#${this.userId}`;
|
|
203
|
+
this.subscription = this.centrifuge.newSubscription(channel);
|
|
204
|
+
this.subscription.on("publication", (ctx) => {
|
|
334
205
|
if (this.isShuttingDown)
|
|
335
206
|
return;
|
|
336
|
-
|
|
337
|
-
if (
|
|
338
|
-
|
|
339
|
-
|
|
207
|
+
const message = ctx.data;
|
|
208
|
+
if (message.type === "command") {
|
|
209
|
+
if (message.targetConnectionId &&
|
|
210
|
+
message.targetConnectionId !== this.connectionId) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
this.lastActivityTime = Date.now();
|
|
214
|
+
this.handleCommand(message).catch((error) => {
|
|
215
|
+
const errorMsg = error instanceof Error ? error.message : JSON.stringify(error);
|
|
216
|
+
console.error(chalk.red(`Error handling command: ${errorMsg}`));
|
|
217
|
+
});
|
|
340
218
|
}
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
219
|
+
});
|
|
220
|
+
this.centrifuge.on("disconnected", (ctx) => {
|
|
221
|
+
if (!this.isShuttingDown) {
|
|
222
|
+
const isConnectionLimit = ctx.reason?.includes("connection limit") || ctx.code === 4503;
|
|
223
|
+
if (isConnectionLimit) {
|
|
224
|
+
console.error(chalk.red("❌ Connection limit reached. The server has too many active connections."));
|
|
225
|
+
console.error(chalk.yellow("Please try again later or contact support."));
|
|
226
|
+
this.cleanup().then(() => process.exit(1));
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
console.log(chalk.yellow(`⚠️ Disconnected from Centrifugo: ${ctx.reason}`));
|
|
230
|
+
}
|
|
345
231
|
}
|
|
346
232
|
});
|
|
233
|
+
this.centrifuge.on("connected", () => {
|
|
234
|
+
console.log(chalk.green("✓ Connected to command relay"));
|
|
235
|
+
});
|
|
236
|
+
this.subscription.subscribe();
|
|
237
|
+
this.centrifuge.connect();
|
|
347
238
|
}
|
|
348
|
-
async
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
239
|
+
async publishToChannel(data) {
|
|
240
|
+
if (!this.subscription) {
|
|
241
|
+
console.error(chalk.red("Cannot publish: no active subscription"));
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
try {
|
|
245
|
+
await this.subscription.publish(data);
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
const msg = err instanceof Error ? err.message : JSON.stringify(err);
|
|
249
|
+
console.error(chalk.red(`Publish failed: ${msg}`));
|
|
250
|
+
throw err;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async handleCommand(msg) {
|
|
254
|
+
const { commandId, command, env, cwd, timeout, background, displayName } = msg;
|
|
353
255
|
// Determine what to show in console:
|
|
354
|
-
// -
|
|
355
|
-
// -
|
|
356
|
-
// -
|
|
357
|
-
const shouldShow =
|
|
358
|
-
const displayText =
|
|
256
|
+
// - displayName === "" (empty string): hide command entirely
|
|
257
|
+
// - displayName === "something": show that instead of command
|
|
258
|
+
// - displayName === undefined: show actual command
|
|
259
|
+
const shouldShow = displayName !== "";
|
|
260
|
+
const displayText = displayName || command;
|
|
359
261
|
if (shouldShow) {
|
|
360
262
|
console.log(chalk.cyan(`▶ ${background ? "[BG] " : ""}${displayText}`));
|
|
361
263
|
}
|
|
362
264
|
try {
|
|
363
|
-
await this.convex.mutation(api.localSandbox.markCommandExecuting, {
|
|
364
|
-
token: this.config.token,
|
|
365
|
-
commandId: command_id,
|
|
366
|
-
});
|
|
367
265
|
let fullCommand = command;
|
|
368
266
|
if (cwd && cwd.trim() !== "") {
|
|
369
267
|
fullCommand = `cd "${cwd}" 2>/dev/null && ${fullCommand}`;
|
|
@@ -371,7 +269,6 @@ class LocalSandboxClient {
|
|
|
371
269
|
if (env) {
|
|
372
270
|
const envString = Object.entries(env)
|
|
373
271
|
.map(([k, v]) => {
|
|
374
|
-
// Escape quotes, backticks, and $ to prevent shell injection
|
|
375
272
|
const escaped = v
|
|
376
273
|
.replace(/\\/g, "\\\\")
|
|
377
274
|
.replace(/"/g, '\\"')
|
|
@@ -382,170 +279,169 @@ class LocalSandboxClient {
|
|
|
382
279
|
.join("; ");
|
|
383
280
|
fullCommand = `${envString}; ${fullCommand}`;
|
|
384
281
|
}
|
|
385
|
-
// Handle background mode - spawn and return immediately with PID
|
|
386
282
|
if (background) {
|
|
387
283
|
const pid = await this.spawnBackground(fullCommand);
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
commandId
|
|
391
|
-
token: this.config.token,
|
|
392
|
-
stdout: "",
|
|
393
|
-
stderr: "",
|
|
284
|
+
await this.publishToChannel({
|
|
285
|
+
type: "exit",
|
|
286
|
+
commandId,
|
|
394
287
|
exitCode: 0,
|
|
395
288
|
pid,
|
|
396
|
-
duration,
|
|
397
289
|
});
|
|
398
290
|
console.log(chalk.green(`✓ Background process started with PID: ${pid}`));
|
|
399
291
|
return;
|
|
400
292
|
}
|
|
401
|
-
|
|
402
|
-
if (this.config.dangerous) {
|
|
403
|
-
result = await runShellCommand(fullCommand, {
|
|
404
|
-
timeout: timeout ?? 30000,
|
|
405
|
-
// Use platform-appropriate shell (powershell on Windows, bash on Unix)
|
|
406
|
-
});
|
|
407
|
-
}
|
|
408
|
-
else {
|
|
409
|
-
// Use single quotes to prevent host shell from interpreting $(), backticks, etc.
|
|
410
|
-
// This ensures ALL command execution happens inside the Docker container
|
|
411
|
-
const escapedCommand = fullCommand.replace(/'/g, "'\\''");
|
|
412
|
-
// Extract shell name (e.g., "bash" from "/bin/bash" or "/usr/bin/bash")
|
|
413
|
-
const shellName = this.containerShell.split("/").pop() || "sh";
|
|
414
|
-
result = await runShellCommand(`docker exec ${this.containerId} ${shellName} -c '${escapedCommand}'`, { timeout: timeout ?? 30000 });
|
|
415
|
-
}
|
|
416
|
-
const duration = Date.now() - startTime;
|
|
417
|
-
await this.convex.mutation(api.localSandbox.submitResult, {
|
|
418
|
-
commandId: command_id,
|
|
419
|
-
token: this.config.token,
|
|
420
|
-
stdout: result.stdout,
|
|
421
|
-
stderr: result.stderr,
|
|
422
|
-
exitCode: result.exitCode,
|
|
423
|
-
duration,
|
|
424
|
-
});
|
|
425
|
-
if (shouldShow) {
|
|
426
|
-
if (result.exitCode === 0) {
|
|
427
|
-
console.log(chalk.green(`✓ ${displayText} ${chalk.gray(`(${duration}ms)`)}`));
|
|
428
|
-
}
|
|
429
|
-
else {
|
|
430
|
-
console.log(chalk.red(`✗ ${displayText} ${chalk.gray(`(exit ${result.exitCode}, ${duration}ms)`)}`));
|
|
431
|
-
if (result.stderr.trim()) {
|
|
432
|
-
// Indent each line of stderr for readability
|
|
433
|
-
const indented = result.stderr
|
|
434
|
-
.trim()
|
|
435
|
-
.split("\n")
|
|
436
|
-
.map((l) => ` ${l}`)
|
|
437
|
-
.join("\n");
|
|
438
|
-
console.log(chalk.red(indented));
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
}
|
|
293
|
+
await this.streamCommand(commandId, fullCommand, timeout, shouldShow, displayText);
|
|
442
294
|
}
|
|
443
295
|
catch (error) {
|
|
444
|
-
const duration = Date.now() - startTime;
|
|
445
296
|
const message = error instanceof Error ? error.message : String(error);
|
|
446
|
-
await this.
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
stderr: (0, utils_1.truncateOutput)(message),
|
|
451
|
-
exitCode: 1,
|
|
452
|
-
duration,
|
|
297
|
+
await this.publishToChannel({
|
|
298
|
+
type: "error",
|
|
299
|
+
commandId,
|
|
300
|
+
message: (0, utils_1.truncateOutput)(message),
|
|
453
301
|
});
|
|
454
|
-
console.log(chalk.red(`✗ ${displayText}
|
|
302
|
+
console.log(chalk.red(`✗ ${displayText}: ${message}`));
|
|
455
303
|
}
|
|
456
304
|
}
|
|
457
|
-
async
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
305
|
+
async streamCommand(commandId, fullCommand, timeout, shouldShow, displayText) {
|
|
306
|
+
const startTime = Date.now();
|
|
307
|
+
const commandTimeout = timeout ?? 30000;
|
|
308
|
+
return new Promise((resolve) => {
|
|
309
|
+
let killed = false;
|
|
310
|
+
let timeoutId;
|
|
311
|
+
const proc = (0, child_process_1.spawn)(DEFAULT_SHELL.shell, [DEFAULT_SHELL.shellFlag, fullCommand], {
|
|
312
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
463
313
|
});
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
if (result.exitCode === 0 && result.stdout.trim()) {
|
|
475
|
-
const pid = parseInt(result.stdout.trim(), 10);
|
|
476
|
-
return isNaN(pid) ? -1 : pid;
|
|
314
|
+
if (commandTimeout > 0) {
|
|
315
|
+
timeoutId = setTimeout(() => {
|
|
316
|
+
killed = true;
|
|
317
|
+
proc.kill("SIGTERM");
|
|
318
|
+
setTimeout(() => {
|
|
319
|
+
if (!proc.killed) {
|
|
320
|
+
proc.kill("SIGKILL");
|
|
321
|
+
}
|
|
322
|
+
}, 2000);
|
|
323
|
+
}, commandTimeout);
|
|
477
324
|
}
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
325
|
+
let accumulatedStderr = "";
|
|
326
|
+
proc.stdout?.on("data", (data) => {
|
|
327
|
+
const chunk = data.toString();
|
|
328
|
+
this.publishToChannel({
|
|
329
|
+
type: "stdout",
|
|
330
|
+
commandId,
|
|
331
|
+
data: chunk,
|
|
332
|
+
}).catch((err) => {
|
|
333
|
+
console.error(chalk.red(`[ERROR] Failed to publish stdout: ${err instanceof Error ? err.message : String(err)}`));
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
proc.stderr?.on("data", (data) => {
|
|
337
|
+
const chunk = data.toString();
|
|
338
|
+
accumulatedStderr += chunk;
|
|
339
|
+
this.publishToChannel({
|
|
340
|
+
type: "stderr",
|
|
341
|
+
commandId,
|
|
342
|
+
data: chunk,
|
|
343
|
+
}).catch((err) => {
|
|
344
|
+
console.error(chalk.red(`[ERROR] Failed to publish stderr: ${err instanceof Error ? err.message : String(err)}`));
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
proc.on("close", (code) => {
|
|
348
|
+
if (timeoutId)
|
|
349
|
+
clearTimeout(timeoutId);
|
|
350
|
+
const duration = Date.now() - startTime;
|
|
351
|
+
const exitCode = killed ? 124 : (code ?? 1);
|
|
352
|
+
if (killed) {
|
|
353
|
+
this.publishToChannel({
|
|
354
|
+
type: "stderr",
|
|
355
|
+
commandId,
|
|
356
|
+
data: "\n[Command timed out and was terminated]",
|
|
357
|
+
}).catch((err) => {
|
|
358
|
+
console.error(chalk.red(`[ERROR] Failed to publish timeout stderr: ${err instanceof Error ? err.message : String(err)}`));
|
|
359
|
+
});
|
|
496
360
|
}
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
361
|
+
this.publishToChannel({
|
|
362
|
+
type: "exit",
|
|
363
|
+
commandId,
|
|
364
|
+
exitCode,
|
|
365
|
+
}).catch((err) => {
|
|
366
|
+
console.error(chalk.red(`[CRITICAL] Failed to publish EXIT message: ${err instanceof Error ? err.message : String(err)}`));
|
|
367
|
+
});
|
|
368
|
+
if (shouldShow) {
|
|
369
|
+
if (exitCode === 0) {
|
|
370
|
+
console.log(chalk.green(`✓ ${displayText} ${chalk.gray(`(${duration}ms)`)}`));
|
|
507
371
|
}
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
372
|
+
else {
|
|
373
|
+
console.log(chalk.red(`✗ ${displayText} ${chalk.gray(`(exit ${exitCode}, ${duration}ms)`)}`));
|
|
374
|
+
if (accumulatedStderr.trim()) {
|
|
375
|
+
const indented = accumulatedStderr
|
|
376
|
+
.trim()
|
|
377
|
+
.split("\n")
|
|
378
|
+
.map((l) => ` ${l}`)
|
|
379
|
+
.join("\n");
|
|
380
|
+
console.log(chalk.red(indented));
|
|
381
|
+
}
|
|
512
382
|
}
|
|
513
383
|
}
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
384
|
+
resolve();
|
|
385
|
+
});
|
|
386
|
+
proc.on("error", (error) => {
|
|
387
|
+
if (timeoutId)
|
|
388
|
+
clearTimeout(timeoutId);
|
|
389
|
+
this.publishToChannel({
|
|
390
|
+
type: "error",
|
|
391
|
+
commandId,
|
|
392
|
+
message: error.message,
|
|
393
|
+
}).catch((err) => {
|
|
394
|
+
console.error(chalk.red(`[ERROR] Failed to publish error message: ${err instanceof Error ? err.message : String(err)}`));
|
|
395
|
+
});
|
|
396
|
+
this.publishToChannel({
|
|
397
|
+
type: "exit",
|
|
398
|
+
commandId,
|
|
399
|
+
exitCode: 1,
|
|
400
|
+
}).catch((err) => {
|
|
401
|
+
console.error(chalk.red(`[CRITICAL] Failed to publish EXIT after process error: ${err instanceof Error ? err.message : String(err)}`));
|
|
402
|
+
});
|
|
403
|
+
resolve();
|
|
404
|
+
});
|
|
405
|
+
});
|
|
524
406
|
}
|
|
525
|
-
|
|
526
|
-
|
|
407
|
+
async spawnBackground(fullCommand) {
|
|
408
|
+
const child = (0, child_process_1.spawn)(DEFAULT_SHELL.shell, [DEFAULT_SHELL.shellFlag, fullCommand], {
|
|
409
|
+
detached: os_1.default.platform() !== "win32",
|
|
410
|
+
stdio: "ignore",
|
|
411
|
+
});
|
|
412
|
+
child.unref();
|
|
413
|
+
return child.pid ?? -1;
|
|
527
414
|
}
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
415
|
+
startIdleCheck() {
|
|
416
|
+
this.idleCheckInterval = setInterval(() => {
|
|
417
|
+
const idleTime = Date.now() - this.lastActivityTime;
|
|
418
|
+
if (idleTime >= IDLE_TIMEOUT_MS) {
|
|
419
|
+
const idleMinutes = Math.floor(idleTime / 60000);
|
|
420
|
+
console.log(chalk.yellow(`\n⏰ Idle timeout: No commands received for ${idleMinutes} minutes`));
|
|
421
|
+
console.log(chalk.yellow("Auto-terminating to save resources..."));
|
|
422
|
+
this.cleanup().then(() => process.exit(0));
|
|
423
|
+
}
|
|
424
|
+
}, IDLE_CHECK_INTERVAL_MS);
|
|
533
425
|
}
|
|
534
|
-
|
|
535
|
-
if (this.
|
|
536
|
-
this.
|
|
537
|
-
this.
|
|
426
|
+
stopIdleCheck() {
|
|
427
|
+
if (this.idleCheckInterval) {
|
|
428
|
+
clearInterval(this.idleCheckInterval);
|
|
429
|
+
this.idleCheckInterval = undefined;
|
|
538
430
|
}
|
|
539
431
|
}
|
|
540
|
-
restartCommandSubscription() {
|
|
541
|
-
this.stopCommandSubscription();
|
|
542
|
-
this.startCommandSubscription();
|
|
543
|
-
}
|
|
544
432
|
async cleanup() {
|
|
545
433
|
console.log(chalk.blue("\n🧹 Cleaning up..."));
|
|
546
434
|
this.isShuttingDown = true;
|
|
547
|
-
this.
|
|
548
|
-
|
|
435
|
+
this.stopIdleCheck();
|
|
436
|
+
// Disconnect Centrifugo
|
|
437
|
+
if (this.subscription) {
|
|
438
|
+
this.subscription.unsubscribe();
|
|
439
|
+
this.subscription = undefined;
|
|
440
|
+
}
|
|
441
|
+
if (this.centrifuge) {
|
|
442
|
+
this.centrifuge.disconnect();
|
|
443
|
+
this.centrifuge = undefined;
|
|
444
|
+
}
|
|
549
445
|
// Set up force-exit timeout (5 seconds)
|
|
550
446
|
const forceExitTimeout = setTimeout(() => {
|
|
551
447
|
console.log(chalk.yellow("⚠️ Force exiting after 5 second timeout..."));
|
|
@@ -554,7 +450,7 @@ class LocalSandboxClient {
|
|
|
554
450
|
try {
|
|
555
451
|
if (this.connectionId) {
|
|
556
452
|
try {
|
|
557
|
-
await this.
|
|
453
|
+
await this.convexHttp.mutation(api.localSandbox.disconnect, {
|
|
558
454
|
token: this.config.token,
|
|
559
455
|
connectionId: this.connectionId,
|
|
560
456
|
});
|
|
@@ -565,25 +461,6 @@ class LocalSandboxClient {
|
|
|
565
461
|
console.warn(chalk.yellow(`⚠️ Failed to disconnect: ${message}`));
|
|
566
462
|
}
|
|
567
463
|
}
|
|
568
|
-
if (this.containerId) {
|
|
569
|
-
if (this.config.persist) {
|
|
570
|
-
console.log(chalk.green(`✓ Container preserved: ${this.getContainerName()}`));
|
|
571
|
-
console.log(chalk.gray(" (Use --persist again to reuse it, or docker rm to remove)"));
|
|
572
|
-
}
|
|
573
|
-
else {
|
|
574
|
-
const result = await runShellCommand(`docker rm -f ${this.containerId}`, {
|
|
575
|
-
timeout: 3000,
|
|
576
|
-
});
|
|
577
|
-
if (result.exitCode === 0) {
|
|
578
|
-
console.log(chalk.green("✓ Container removed"));
|
|
579
|
-
}
|
|
580
|
-
else {
|
|
581
|
-
console.error(chalk.red("Error removing container:"), result.stderr);
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
// Close the Convex client to clean up WebSocket connection
|
|
586
|
-
await this.convex.close();
|
|
587
464
|
}
|
|
588
465
|
finally {
|
|
589
466
|
clearTimeout(forceExitTimeout);
|
|
@@ -610,29 +487,16 @@ ${chalk.yellow("Usage:")}
|
|
|
610
487
|
${chalk.yellow("Options:")}
|
|
611
488
|
--token TOKEN Authentication token from Settings (required)
|
|
612
489
|
--name NAME Connection name (default: hostname)
|
|
613
|
-
--dangerous Run commands directly on host OS (no Docker)
|
|
614
|
-
--persist Keep container running on exit and reuse if exists
|
|
615
490
|
--convex-url URL Override Convex backend URL (for development)
|
|
616
491
|
--help, -h Show this help message
|
|
617
492
|
|
|
618
493
|
${chalk.yellow("Examples:")}
|
|
619
|
-
# Basic usage - pulls pre-built image with 30+ pentesting tools
|
|
620
494
|
npx @hackerai/local --token hsb_abc123 --name "My Laptop"
|
|
621
|
-
|
|
622
|
-
# Persistent container (faster restarts, preserves installed packages)
|
|
623
|
-
npx @hackerai/local --token hsb_abc123 --name "Dev" --persist
|
|
624
|
-
|
|
625
|
-
# Dangerous mode (no Docker isolation) - use with caution!
|
|
626
|
-
npx @hackerai/local --token hsb_abc123 --name "Work PC" --dangerous
|
|
627
|
-
|
|
628
|
-
${chalk.cyan("Pre-built Image:")}
|
|
629
|
-
The default image includes: nmap, sqlmap, ffuf, gobuster, nuclei, hydra,
|
|
630
|
-
nikto, wpscan, subfinder, httpx, and 20+ more pentesting tools.
|
|
495
|
+
npx @hackerai/local --token hsb_abc123 --name "Work PC"
|
|
631
496
|
|
|
632
497
|
${chalk.red("⚠️ Security Warning:")}
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
In DANGEROUS mode, commands run directly on your OS without any isolation.
|
|
498
|
+
Commands run directly on your OS without any isolation.
|
|
499
|
+
Only connect machines you trust and control.
|
|
636
500
|
|
|
637
501
|
${chalk.cyan("Auto-termination:")}
|
|
638
502
|
The client automatically terminates after 1 hour of inactivity (no commands
|
|
@@ -644,9 +508,6 @@ const config = {
|
|
|
644
508
|
convexUrl: getArg("--convex-url") || PRODUCTION_CONVEX_URL,
|
|
645
509
|
token: getArg("--token") || "",
|
|
646
510
|
name: getArg("--name") || os_1.default.hostname(),
|
|
647
|
-
dangerous: hasFlag("--dangerous"),
|
|
648
|
-
build: hasFlag("--build"),
|
|
649
|
-
persist: hasFlag("--persist"),
|
|
650
511
|
};
|
|
651
512
|
if (!config.token) {
|
|
652
513
|
console.error(chalk.red("❌ No authentication token provided"));
|
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/dist/utils.d.ts
CHANGED
|
@@ -4,41 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export declare const MAX_OUTPUT_SIZE = 12288;
|
|
6
6
|
export declare const TRUNCATION_MARKER = "\n\n[... OUTPUT TRUNCATED - middle content removed to fit context limits ...]\n\n";
|
|
7
|
-
/**
|
|
8
|
-
* Required Docker capabilities for penetration testing tools.
|
|
9
|
-
* - NET_RAW: ping, nmap, masscan, hping3, arp-scan, tcpdump, raw sockets
|
|
10
|
-
* - NET_ADMIN: network interface manipulation, arp-scan, netdiscover
|
|
11
|
-
* - SYS_PTRACE: gdb, strace, ltrace (debugging tools)
|
|
12
|
-
*/
|
|
13
|
-
export declare const DOCKER_CAPABILITIES: readonly ["NET_RAW", "NET_ADMIN", "SYS_PTRACE"];
|
|
14
7
|
/**
|
|
15
8
|
* Truncates output using 25% head + 75% tail strategy.
|
|
16
9
|
* This preserves both the command start (context) and the end (final results/errors).
|
|
17
10
|
*/
|
|
18
11
|
export declare function truncateOutput(content: string, maxSize?: number): string;
|
|
19
|
-
/**
|
|
20
|
-
* Build Docker capability flags for the docker run command.
|
|
21
|
-
*/
|
|
22
|
-
export declare function buildDockerCapabilityFlags(): string;
|
|
23
|
-
/**
|
|
24
|
-
* Build the full docker run command for creating a container.
|
|
25
|
-
*/
|
|
26
|
-
export declare function buildDockerRunCommand(options: {
|
|
27
|
-
image: string;
|
|
28
|
-
containerName?: string;
|
|
29
|
-
capabilities?: boolean;
|
|
30
|
-
}): string;
|
|
31
|
-
/**
|
|
32
|
-
* Determine the sandbox mode based on configuration.
|
|
33
|
-
*/
|
|
34
|
-
export declare function getSandboxMode(config: {
|
|
35
|
-
dangerous?: boolean;
|
|
36
|
-
}): "docker" | "dangerous";
|
|
37
|
-
/**
|
|
38
|
-
* Parse shell detection output to find available shell.
|
|
39
|
-
* Returns the first valid shell path found.
|
|
40
|
-
*/
|
|
41
|
-
export declare function parseShellDetectionOutput(output: string): string;
|
|
42
12
|
export interface ShellConfig {
|
|
43
13
|
shell: string;
|
|
44
14
|
shellFlag: string;
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,eAAO,MAAM,eAAe,QAAQ,CAAC;AAGrC,eAAO,MAAM,iBAAiB,sFACuD,CAAC;AAEtF
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,eAAO,MAAM,eAAe,QAAQ,CAAC;AAGrC,eAAO,MAAM,iBAAiB,sFACuD,CAAC;AAEtF;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAwB,GAChC,MAAM,CAcR;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAM7D"}
|
package/dist/utils.js
CHANGED
|
@@ -4,28 +4,13 @@
|
|
|
4
4
|
* Extracted for testability.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
7
|
+
exports.TRUNCATION_MARKER = exports.MAX_OUTPUT_SIZE = void 0;
|
|
8
8
|
exports.truncateOutput = truncateOutput;
|
|
9
|
-
exports.buildDockerCapabilityFlags = buildDockerCapabilityFlags;
|
|
10
|
-
exports.buildDockerRunCommand = buildDockerRunCommand;
|
|
11
|
-
exports.getSandboxMode = getSandboxMode;
|
|
12
|
-
exports.parseShellDetectionOutput = parseShellDetectionOutput;
|
|
13
9
|
exports.getDefaultShell = getDefaultShell;
|
|
14
10
|
// Align with LLM context limits (~4096 tokens ≈ 12288 chars)
|
|
15
11
|
exports.MAX_OUTPUT_SIZE = 12288;
|
|
16
12
|
// Truncation marker for 25% head + 75% tail strategy
|
|
17
13
|
exports.TRUNCATION_MARKER = "\n\n[... OUTPUT TRUNCATED - middle content removed to fit context limits ...]\n\n";
|
|
18
|
-
/**
|
|
19
|
-
* Required Docker capabilities for penetration testing tools.
|
|
20
|
-
* - NET_RAW: ping, nmap, masscan, hping3, arp-scan, tcpdump, raw sockets
|
|
21
|
-
* - NET_ADMIN: network interface manipulation, arp-scan, netdiscover
|
|
22
|
-
* - SYS_PTRACE: gdb, strace, ltrace (debugging tools)
|
|
23
|
-
*/
|
|
24
|
-
exports.DOCKER_CAPABILITIES = [
|
|
25
|
-
"NET_RAW",
|
|
26
|
-
"NET_ADMIN",
|
|
27
|
-
"SYS_PTRACE",
|
|
28
|
-
];
|
|
29
14
|
/**
|
|
30
15
|
* Truncates output using 25% head + 75% tail strategy.
|
|
31
16
|
* This preserves both the command start (context) and the end (final results/errors).
|
|
@@ -42,42 +27,6 @@ function truncateOutput(content, maxSize = exports.MAX_OUTPUT_SIZE) {
|
|
|
42
27
|
const tail = content.slice(-tailBudget);
|
|
43
28
|
return head + exports.TRUNCATION_MARKER + tail;
|
|
44
29
|
}
|
|
45
|
-
/**
|
|
46
|
-
* Build Docker capability flags for the docker run command.
|
|
47
|
-
*/
|
|
48
|
-
function buildDockerCapabilityFlags() {
|
|
49
|
-
return exports.DOCKER_CAPABILITIES.map((cap) => `--cap-add=${cap}`).join(" ");
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Build the full docker run command for creating a container.
|
|
53
|
-
*/
|
|
54
|
-
function buildDockerRunCommand(options) {
|
|
55
|
-
const { image, containerName, capabilities = true } = options;
|
|
56
|
-
const nameFlag = containerName ? `--name ${containerName} ` : "";
|
|
57
|
-
const capFlags = capabilities ? `${buildDockerCapabilityFlags()} ` : "";
|
|
58
|
-
return `docker run -d ${nameFlag}${capFlags}--network host ${image} tail -f /dev/null`;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Determine the sandbox mode based on configuration.
|
|
62
|
-
*/
|
|
63
|
-
function getSandboxMode(config) {
|
|
64
|
-
if (config.dangerous) {
|
|
65
|
-
return "dangerous";
|
|
66
|
-
}
|
|
67
|
-
return "docker";
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Parse shell detection output to find available shell.
|
|
71
|
-
* Returns the first valid shell path found.
|
|
72
|
-
*/
|
|
73
|
-
function parseShellDetectionOutput(output) {
|
|
74
|
-
if (!output || !output.trim()) {
|
|
75
|
-
return "/bin/sh";
|
|
76
|
-
}
|
|
77
|
-
// Take first line (first result from 'command -v bash || command -v sh')
|
|
78
|
-
const shell = output.trim().split("\n")[0];
|
|
79
|
-
return shell || "/bin/sh";
|
|
80
|
-
}
|
|
81
30
|
/**
|
|
82
31
|
* Get the default shell for a given platform.
|
|
83
32
|
* On Windows, uses cmd.exe (not PowerShell, which aliases curl to Invoke-WebRequest
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAaH,wCAiBC;AAYD,0CAMC;AA9CD,6DAA6D;AAChD,QAAA,eAAe,GAAG,KAAK,CAAC;AAErC,qDAAqD;AACxC,QAAA,iBAAiB,GAC5B,mFAAmF,CAAC;AAEtF;;;GAGG;AACH,SAAgB,cAAc,CAC5B,OAAe,EACf,UAAkB,uBAAe;IAEjC,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE9C,MAAM,YAAY,GAAG,yBAAiB,CAAC,MAAM,CAAC;IAC9C,MAAM,gBAAgB,GAAG,OAAO,GAAG,YAAY,CAAC;IAEhD,+BAA+B;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,gBAAgB,GAAG,UAAU,CAAC;IAEjD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;IAExC,OAAO,IAAI,GAAG,yBAAiB,GAAG,IAAI,CAAC;AACzC,CAAC;AAOD;;;;GAIG;AACH,SAAgB,eAAe,CAAC,QAAgB;IAC9C,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC/C,CAAC;IACD,yCAAyC;IACzC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACjD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hackerai/local",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "HackerAI Local Sandbox Client - Execute commands on your local machine",
|
|
5
5
|
"bin": {
|
|
6
6
|
"hackerai-local": "./dist/index.js"
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"node": ">=18"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
+
"centrifuge": "^5.0.0",
|
|
36
37
|
"convex": "^1.29.2"
|
|
37
38
|
},
|
|
38
39
|
"devDependencies": {
|