@hackerai/local 0.1.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/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # @hackerai/local
2
+
3
+ HackerAI Local Sandbox Client - Execute commands on your local machine from HackerAI.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npx @hackerai/local --token YOUR_TOKEN
9
+ ```
10
+
11
+ Or install globally:
12
+
13
+ ```bash
14
+ npm install -g @hackerai/local
15
+ hackerai-local --token YOUR_TOKEN
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ ### Basic Usage (Docker Mode)
21
+
22
+ ```bash
23
+ npx @hackerai/local --token hsb_abc123 --name "My Laptop"
24
+ ```
25
+
26
+ This pulls the pre-built HackerAI sandbox image (~2GB) with 30+ pentesting tools including:
27
+ nmap, sqlmap, ffuf, gobuster, nuclei, hydra, nikto, wpscan, subfinder, httpx, and more.
28
+
29
+ ### Custom Docker Image
30
+
31
+ ```bash
32
+ npx @hackerai/local --token hsb_abc123 --name "Kali" --image kalilinux/kali-rolling
33
+ ```
34
+
35
+ ### Dangerous Mode (No Docker)
36
+
37
+ ```bash
38
+ npx @hackerai/local --token hsb_abc123 --name "Work PC" --dangerous
39
+ ```
40
+
41
+ **Warning:** Dangerous mode runs commands directly on your host OS without isolation.
42
+
43
+ ## Options
44
+
45
+ | Option | Description |
46
+ |--------|-------------|
47
+ | `--token TOKEN` | Authentication token from HackerAI Settings (required) |
48
+ | `--name NAME` | Connection name shown in HackerAI (default: hostname) |
49
+ | `--image IMAGE` | Docker image to use (default: hackeraidev/sandbox) |
50
+ | `--dangerous` | Run commands directly on host OS without Docker |
51
+ | `--convex-url URL` | Override backend URL (for development) |
52
+ | `--help, -h` | Show help message |
53
+
54
+ ## Getting Your Token
55
+
56
+ 1. Go to [HackerAI Settings](https://hackerai.com/settings)
57
+ 2. Navigate to the "Local Sandbox" tab
58
+ 3. Click "Generate Token" or copy your existing token
59
+
60
+ ## Security
61
+
62
+ - **Docker Mode**: Commands run in an isolated container with `--network host` for network access
63
+ - **Dangerous Mode**: Commands run directly on your OS - use with caution
64
+
65
+ ## License
66
+
67
+ MIT
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * HackerAI Local Sandbox Client
4
+ *
5
+ * Connects to HackerAI backend via Convex and executes commands
6
+ * on the local machine (either in Docker or directly on the host OS).
7
+ *
8
+ * Usage:
9
+ * npx @hackerai/local --token TOKEN --name "My Laptop"
10
+ * npx @hackerai/local --token TOKEN --name "Kali" --image kalilinux/kali-rolling
11
+ * npx @hackerai/local --token TOKEN --name "Work PC" --dangerous
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG"}
package/dist/index.js ADDED
@@ -0,0 +1,380 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * HackerAI Local Sandbox Client
5
+ *
6
+ * Connects to HackerAI backend via Convex and executes commands
7
+ * on the local machine (either in Docker or directly on the host OS).
8
+ *
9
+ * Usage:
10
+ * npx @hackerai/local --token TOKEN --name "My Laptop"
11
+ * npx @hackerai/local --token TOKEN --name "Kali" --image kalilinux/kali-rolling
12
+ * npx @hackerai/local --token TOKEN --name "Work PC" --dangerous
13
+ */
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const browser_1 = require("convex/browser");
19
+ const child_process_1 = require("child_process");
20
+ const util_1 = require("util");
21
+ const os_1 = __importDefault(require("os"));
22
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
23
+ function runWithOutput(command, args) {
24
+ return new Promise((resolve, reject) => {
25
+ const proc = (0, child_process_1.spawn)(command, args, { stdio: "inherit" });
26
+ proc.on("close", (code) => {
27
+ if (code === 0)
28
+ resolve();
29
+ else
30
+ reject(new Error(`Process exited with code ${code}`));
31
+ });
32
+ proc.on("error", reject);
33
+ });
34
+ }
35
+ // Production Convex URL - hardcoded for the published package
36
+ const PRODUCTION_CONVEX_URL = "https://convex.haiusercontent.com";
37
+ // Default pre-built image with all pentesting tools
38
+ const DEFAULT_IMAGE = "hackeraidev/sandbox";
39
+ // Convex function references (string paths work at runtime)
40
+ const api = {
41
+ localSandbox: {
42
+ connect: "localSandbox:connect",
43
+ heartbeat: "localSandbox:heartbeat",
44
+ disconnect: "localSandbox:disconnect",
45
+ getPendingCommands: "localSandbox:getPendingCommands",
46
+ markCommandExecuting: "localSandbox:markCommandExecuting",
47
+ submitResult: "localSandbox:submitResult",
48
+ },
49
+ };
50
+ // ANSI color codes for terminal output
51
+ const chalk = {
52
+ blue: (s) => `\x1b[34m${s}\x1b[0m`,
53
+ green: (s) => `\x1b[32m${s}\x1b[0m`,
54
+ red: (s) => `\x1b[31m${s}\x1b[0m`,
55
+ yellow: (s) => `\x1b[33m${s}\x1b[0m`,
56
+ cyan: (s) => `\x1b[36m${s}\x1b[0m`,
57
+ gray: (s) => `\x1b[90m${s}\x1b[0m`,
58
+ bold: (s) => `\x1b[1m${s}\x1b[0m`,
59
+ };
60
+ class LocalSandboxClient {
61
+ config;
62
+ convex;
63
+ containerId;
64
+ userId;
65
+ connectionId;
66
+ heartbeatInterval;
67
+ pollInterval;
68
+ isShuttingDown = false;
69
+ constructor(config) {
70
+ this.config = config;
71
+ this.convex = new browser_1.ConvexHttpClient(config.convexUrl);
72
+ }
73
+ async start() {
74
+ console.log(chalk.blue("🚀 Starting HackerAI local sandbox..."));
75
+ if (!this.config.dangerous) {
76
+ try {
77
+ await execAsync("docker --version");
78
+ console.log(chalk.green("✓ Docker is available"));
79
+ }
80
+ catch {
81
+ console.error(chalk.red("❌ Docker not found. Please install Docker or use --dangerous mode."));
82
+ process.exit(1);
83
+ }
84
+ this.containerId = await this.createContainer();
85
+ console.log(chalk.green(`✓ Container: ${this.containerId.slice(0, 12)}`));
86
+ }
87
+ else {
88
+ console.log(chalk.yellow("⚠️ DANGEROUS MODE - Commands will run directly on your OS!"));
89
+ }
90
+ await this.connect();
91
+ }
92
+ async createContainer() {
93
+ const image = this.config.image;
94
+ const isDefaultImage = image === DEFAULT_IMAGE;
95
+ if (this.config.build) {
96
+ console.log(chalk.red("❌ --build flag is not supported in the npx package."));
97
+ console.log(chalk.yellow("Use the pre-built image or specify a custom --image."));
98
+ process.exit(1);
99
+ }
100
+ else if (isDefaultImage) {
101
+ console.log(chalk.blue(`Pulling pre-built image: ${image}`));
102
+ console.log(chalk.gray("(First run may take a few minutes to download the image)"));
103
+ console.log("");
104
+ try {
105
+ await runWithOutput("docker", ["pull", image]);
106
+ console.log(chalk.green("✓ Image ready"));
107
+ }
108
+ catch (error) {
109
+ const message = error instanceof Error ? error.message : String(error);
110
+ console.error(chalk.red("❌ Failed to pull image:"), message);
111
+ process.exit(1);
112
+ }
113
+ }
114
+ console.log(chalk.blue("Creating Docker container..."));
115
+ const { stdout } = await execAsync(`docker run -d --network host ${this.config.image} tail -f /dev/null`);
116
+ return stdout.trim();
117
+ }
118
+ getOsInfo() {
119
+ return {
120
+ platform: os_1.default.platform(),
121
+ arch: os_1.default.arch(),
122
+ release: os_1.default.release(),
123
+ hostname: os_1.default.hostname(),
124
+ };
125
+ }
126
+ async connect() {
127
+ console.log(chalk.blue("Connecting to HackerAI..."));
128
+ try {
129
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
130
+ const result = (await this.convex.mutation(api.localSandbox.connect, {
131
+ token: this.config.token,
132
+ connectionName: this.config.name,
133
+ containerId: this.containerId,
134
+ clientVersion: "1.0.0",
135
+ mode: this.config.dangerous ? "dangerous" : "docker",
136
+ osInfo: this.config.dangerous ? this.getOsInfo() : undefined,
137
+ }));
138
+ if (!result.success) {
139
+ throw new Error(result.error || "Authentication failed");
140
+ }
141
+ this.userId = result.userId;
142
+ this.connectionId = result.connectionId;
143
+ console.log(chalk.green("✓ Authenticated"));
144
+ console.log(chalk.bold(chalk.green("🎉 Local sandbox is ready!")));
145
+ console.log(chalk.gray(`Connection: ${this.connectionId}`));
146
+ console.log(chalk.gray(`Mode: ${this.config.dangerous ? "DANGEROUS" : "Docker"}`));
147
+ this.startHeartbeat();
148
+ this.startPolling();
149
+ }
150
+ catch (error) {
151
+ const err = error;
152
+ const errorMessage = err?.data?.message || err?.message || JSON.stringify(error);
153
+ console.error(chalk.red("❌ Connection failed:"), errorMessage);
154
+ if (errorMessage.includes("Invalid token") ||
155
+ errorMessage.includes("token")) {
156
+ console.error(chalk.yellow("Please regenerate your token in Settings"));
157
+ }
158
+ await this.cleanup();
159
+ process.exit(1);
160
+ }
161
+ }
162
+ startPolling() {
163
+ this.pollInterval = setInterval(async () => {
164
+ if (this.isShuttingDown || !this.connectionId)
165
+ return;
166
+ try {
167
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
168
+ const data = (await this.convex.query(api.localSandbox.getPendingCommands, {
169
+ connectionId: this.connectionId,
170
+ }));
171
+ if (data?.commands && data.commands.length > 0) {
172
+ for (const cmd of data.commands) {
173
+ await this.executeCommand(cmd);
174
+ }
175
+ }
176
+ }
177
+ catch {
178
+ // Ignore polling errors
179
+ }
180
+ }, 500);
181
+ }
182
+ async executeCommand(cmd) {
183
+ const { command_id, command, env, cwd, timeout } = cmd;
184
+ const startTime = Date.now();
185
+ console.log(chalk.cyan(`▶ Executing: ${command}`));
186
+ try {
187
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
188
+ await this.convex.mutation(api.localSandbox.markCommandExecuting, {
189
+ commandId: command_id,
190
+ });
191
+ let fullCommand = command;
192
+ if (cwd && cwd.trim() !== "") {
193
+ fullCommand = `cd "${cwd}" 2>/dev/null && ${fullCommand}`;
194
+ }
195
+ if (env) {
196
+ const envString = Object.entries(env)
197
+ .map(([k, v]) => `export ${k}="${v}"`)
198
+ .join("; ");
199
+ fullCommand = `${envString}; ${fullCommand}`;
200
+ }
201
+ let result;
202
+ if (this.config.dangerous) {
203
+ result = await execAsync(fullCommand, {
204
+ timeout: timeout ?? 30000,
205
+ shell: "/bin/bash",
206
+ }).catch((error) => ({
207
+ stdout: error.stdout || "",
208
+ stderr: error.stderr || error.message || "",
209
+ code: error.code || 1,
210
+ }));
211
+ }
212
+ else {
213
+ const escapedCommand = fullCommand.replace(/"/g, '\\"');
214
+ result = await execAsync(`docker exec ${this.containerId} bash -c "${escapedCommand}"`, { timeout: timeout ?? 30000 }).catch((error) => ({
215
+ stdout: error.stdout || "",
216
+ stderr: error.stderr || error.message || "",
217
+ code: error.code || 1,
218
+ }));
219
+ }
220
+ const duration = Date.now() - startTime;
221
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
222
+ await this.convex.mutation(api.localSandbox.submitResult, {
223
+ commandId: command_id,
224
+ userId: this.userId,
225
+ stdout: result.stdout || "",
226
+ stderr: result.stderr || "",
227
+ exitCode: result.code || 0,
228
+ duration,
229
+ });
230
+ console.log(chalk.green(`✓ Command completed in ${duration}ms`));
231
+ }
232
+ catch (error) {
233
+ const duration = Date.now() - startTime;
234
+ const message = error instanceof Error ? error.message : String(error);
235
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
236
+ await this.convex.mutation(api.localSandbox.submitResult, {
237
+ commandId: command_id,
238
+ userId: this.userId,
239
+ stdout: "",
240
+ stderr: message,
241
+ exitCode: 1,
242
+ duration,
243
+ });
244
+ console.log(chalk.red(`✗ Command failed: ${message}`));
245
+ }
246
+ }
247
+ startHeartbeat() {
248
+ this.heartbeatInterval = setInterval(async () => {
249
+ if (this.connectionId) {
250
+ try {
251
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
252
+ const result = (await this.convex.mutation(api.localSandbox.heartbeat, {
253
+ connectionId: this.connectionId,
254
+ }));
255
+ if (!result.success) {
256
+ console.log(chalk.yellow("⚠️ Heartbeat failed, connection may be stale"));
257
+ }
258
+ }
259
+ catch {
260
+ // Ignore heartbeat errors
261
+ }
262
+ }
263
+ }, 10000);
264
+ }
265
+ stopHeartbeat() {
266
+ if (this.heartbeatInterval) {
267
+ clearInterval(this.heartbeatInterval);
268
+ this.heartbeatInterval = undefined;
269
+ }
270
+ }
271
+ stopPolling() {
272
+ if (this.pollInterval) {
273
+ clearInterval(this.pollInterval);
274
+ this.pollInterval = undefined;
275
+ }
276
+ }
277
+ async cleanup() {
278
+ console.log(chalk.blue("\n🧹 Cleaning up..."));
279
+ this.isShuttingDown = true;
280
+ this.stopHeartbeat();
281
+ this.stopPolling();
282
+ if (this.connectionId) {
283
+ try {
284
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
285
+ await this.convex.mutation(api.localSandbox.disconnect, {
286
+ connectionId: this.connectionId,
287
+ });
288
+ console.log(chalk.green("✓ Disconnected"));
289
+ }
290
+ catch {
291
+ // Ignore disconnect errors
292
+ }
293
+ }
294
+ if (this.containerId) {
295
+ try {
296
+ await execAsync(`docker rm -f ${this.containerId}`);
297
+ console.log(chalk.green("✓ Container removed"));
298
+ }
299
+ catch (error) {
300
+ const message = error instanceof Error ? error.message : String(error);
301
+ console.error(chalk.red("Error removing container:"), message);
302
+ }
303
+ }
304
+ }
305
+ }
306
+ // Parse command-line arguments
307
+ const args = process.argv.slice(2);
308
+ const getArg = (flag) => {
309
+ const index = args.indexOf(flag);
310
+ return index >= 0 ? args[index + 1] : undefined;
311
+ };
312
+ const hasFlag = (flag) => {
313
+ return args.includes(flag);
314
+ };
315
+ // Show help
316
+ if (hasFlag("--help") || hasFlag("-h")) {
317
+ console.log(`
318
+ ${chalk.bold("HackerAI Local Sandbox Client")}
319
+
320
+ ${chalk.yellow("Usage:")}
321
+ npx @hackerai/local --token TOKEN [options]
322
+
323
+ ${chalk.yellow("Options:")}
324
+ --token TOKEN Authentication token from Settings (required)
325
+ --name NAME Connection name (default: hostname)
326
+ --image IMAGE Docker image to use (default: pre-built HackerAI sandbox)
327
+ --dangerous Run commands directly on host OS (no Docker)
328
+ --convex-url URL Override Convex backend URL (for development)
329
+ --help, -h Show this help message
330
+
331
+ ${chalk.yellow("Examples:")}
332
+ # Basic usage - pulls pre-built image with 30+ pentesting tools
333
+ npx @hackerai/local --token hsb_abc123 --name "My Laptop"
334
+
335
+ # Use a custom Docker image (e.g., Kali Linux)
336
+ npx @hackerai/local --token hsb_abc123 --name "Kali" --image kalilinux/kali-rolling
337
+
338
+ # Dangerous mode (no Docker isolation) - use with caution!
339
+ npx @hackerai/local --token hsb_abc123 --name "Work PC" --dangerous
340
+
341
+ ${chalk.cyan("Pre-built Image:")}
342
+ The default image includes: nmap, sqlmap, ffuf, gobuster, nuclei, hydra,
343
+ nikto, wpscan, subfinder, httpx, and 20+ more pentesting tools.
344
+
345
+ ${chalk.red("⚠️ Security Warning:")}
346
+ In Docker mode, commands run in an isolated container with --network host.
347
+ In DANGEROUS mode, commands run directly on your OS without isolation.
348
+ `);
349
+ process.exit(0);
350
+ }
351
+ const config = {
352
+ convexUrl: getArg("--convex-url") || PRODUCTION_CONVEX_URL,
353
+ token: getArg("--token") || "",
354
+ name: getArg("--name") || os_1.default.hostname(),
355
+ image: getArg("--image") || DEFAULT_IMAGE,
356
+ dangerous: hasFlag("--dangerous"),
357
+ build: hasFlag("--build"),
358
+ };
359
+ if (!config.token) {
360
+ console.error(chalk.red("❌ No authentication token provided"));
361
+ console.error(chalk.yellow("Usage: npx @hackerai/local --token YOUR_TOKEN"));
362
+ console.error(chalk.yellow("Get your token from HackerAI Settings > Local Sandbox"));
363
+ process.exit(1);
364
+ }
365
+ const client = new LocalSandboxClient(config);
366
+ process.on("SIGINT", async () => {
367
+ console.log(chalk.yellow("\n🛑 Shutting down..."));
368
+ await client.cleanup();
369
+ process.exit(0);
370
+ });
371
+ process.on("SIGTERM", async () => {
372
+ await client.cleanup();
373
+ process.exit(0);
374
+ });
375
+ client.start().catch((error) => {
376
+ const message = error instanceof Error ? error.message : String(error);
377
+ console.error(chalk.red("Fatal error:"), message);
378
+ process.exit(1);
379
+ });
380
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@hackerai/local",
3
+ "version": "0.1.0",
4
+ "description": "HackerAI Local Sandbox Client - Execute commands on your local machine",
5
+ "bin": {
6
+ "hackerai-local": "./dist/index.js"
7
+ },
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsc --watch",
16
+ "prepublishOnly": "npm run build"
17
+ },
18
+ "keywords": [
19
+ "hackerai",
20
+ "sandbox",
21
+ "pentesting",
22
+ "security",
23
+ "cli"
24
+ ],
25
+ "author": "HackerAI",
26
+ "license": "MIT",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/hackerai-tech/hackerai.git",
30
+ "directory": "packages/local"
31
+ },
32
+ "engines": {
33
+ "node": ">=18"
34
+ },
35
+ "dependencies": {
36
+ "convex": "^1.29.2"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^22.0.0",
40
+ "typescript": "^5.0.0"
41
+ }
42
+ }