@remnux/mcp-server 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/LICENSE +674 -0
- package/README.md +720 -0
- package/dist/archive-extractor.d.ts +46 -0
- package/dist/archive-extractor.d.ts.map +1 -0
- package/dist/archive-extractor.js +268 -0
- package/dist/archive-extractor.js.map +1 -0
- package/dist/catalog/index.d.ts +40 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +114 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +154 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/archive-passwords.txt +3 -0
- package/dist/connectors/docker.d.ts +13 -0
- package/dist/connectors/docker.d.ts.map +1 -0
- package/dist/connectors/docker.js +201 -0
- package/dist/connectors/docker.js.map +1 -0
- package/dist/connectors/index.d.ts +27 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +23 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/local.d.ts +10 -0
- package/dist/connectors/local.d.ts.map +1 -0
- package/dist/connectors/local.js +105 -0
- package/dist/connectors/local.js.map +1 -0
- package/dist/connectors/ssh.d.ts +21 -0
- package/dist/connectors/ssh.d.ts.map +1 -0
- package/dist/connectors/ssh.js +237 -0
- package/dist/connectors/ssh.js.map +1 -0
- package/dist/errors/error-mapper.d.ts +9 -0
- package/dist/errors/error-mapper.d.ts.map +1 -0
- package/dist/errors/error-mapper.js +24 -0
- package/dist/errors/error-mapper.js.map +1 -0
- package/dist/errors/remnux-error.d.ts +14 -0
- package/dist/errors/remnux-error.d.ts.map +1 -0
- package/dist/errors/remnux-error.js +19 -0
- package/dist/errors/remnux-error.js.map +1 -0
- package/dist/file-type-mappings.d.ts +30 -0
- package/dist/file-type-mappings.d.ts.map +1 -0
- package/dist/file-type-mappings.js +136 -0
- package/dist/file-type-mappings.js.map +1 -0
- package/dist/file-upload.d.ts +44 -0
- package/dist/file-upload.d.ts.map +1 -0
- package/dist/file-upload.js +170 -0
- package/dist/file-upload.js.map +1 -0
- package/dist/handlers/analyze-file.d.ts +10 -0
- package/dist/handlers/analyze-file.d.ts.map +1 -0
- package/dist/handlers/analyze-file.js +149 -0
- package/dist/handlers/analyze-file.js.map +1 -0
- package/dist/handlers/check-tools.d.ts +9 -0
- package/dist/handlers/check-tools.d.ts.map +1 -0
- package/dist/handlers/check-tools.js +47 -0
- package/dist/handlers/check-tools.js.map +1 -0
- package/dist/handlers/download-file.d.ts +10 -0
- package/dist/handlers/download-file.d.ts.map +1 -0
- package/dist/handlers/download-file.js +113 -0
- package/dist/handlers/download-file.js.map +1 -0
- package/dist/handlers/download-from-url.d.ts +30 -0
- package/dist/handlers/download-from-url.d.ts.map +1 -0
- package/dist/handlers/download-from-url.js +295 -0
- package/dist/handlers/download-from-url.js.map +1 -0
- package/dist/handlers/extract-archive.d.ts +10 -0
- package/dist/handlers/extract-archive.d.ts.map +1 -0
- package/dist/handlers/extract-archive.js +57 -0
- package/dist/handlers/extract-archive.js.map +1 -0
- package/dist/handlers/extract-iocs.d.ts +10 -0
- package/dist/handlers/extract-iocs.d.ts.map +1 -0
- package/dist/handlers/extract-iocs.js +21 -0
- package/dist/handlers/extract-iocs.js.map +1 -0
- package/dist/handlers/get-file-info.d.ts +10 -0
- package/dist/handlers/get-file-info.d.ts.map +1 -0
- package/dist/handlers/get-file-info.js +89 -0
- package/dist/handlers/get-file-info.js.map +1 -0
- package/dist/handlers/list-files.d.ts +10 -0
- package/dist/handlers/list-files.d.ts.map +1 -0
- package/dist/handlers/list-files.js +60 -0
- package/dist/handlers/list-files.js.map +1 -0
- package/dist/handlers/run-tool.d.ts +10 -0
- package/dist/handlers/run-tool.d.ts.map +1 -0
- package/dist/handlers/run-tool.js +99 -0
- package/dist/handlers/run-tool.js.map +1 -0
- package/dist/handlers/suggest-tools.d.ts +10 -0
- package/dist/handlers/suggest-tools.d.ts.map +1 -0
- package/dist/handlers/suggest-tools.js +202 -0
- package/dist/handlers/suggest-tools.js.map +1 -0
- package/dist/handlers/types.d.ts +15 -0
- package/dist/handlers/types.d.ts.map +1 -0
- package/dist/handlers/types.js +2 -0
- package/dist/handlers/types.js.map +1 -0
- package/dist/handlers/upload-file.d.ts +10 -0
- package/dist/handlers/upload-file.d.ts.map +1 -0
- package/dist/handlers/upload-file.js +33 -0
- package/dist/handlers/upload-file.js.map +1 -0
- package/dist/handlers/upload-from-host.d.ts +10 -0
- package/dist/handlers/upload-from-host.d.ts.map +1 -0
- package/dist/handlers/upload-from-host.js +33 -0
- package/dist/handlers/upload-from-host.js.map +1 -0
- package/dist/handlers/upload-sample.d.ts +10 -0
- package/dist/handlers/upload-sample.d.ts.map +1 -0
- package/dist/handlers/upload-sample.js +26 -0
- package/dist/handlers/upload-sample.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +254 -0
- package/dist/index.js.map +1 -0
- package/dist/ioc/extractor.d.ts +21 -0
- package/dist/ioc/extractor.d.ts.map +1 -0
- package/dist/ioc/extractor.js +91 -0
- package/dist/ioc/extractor.js.map +1 -0
- package/dist/ioc/known-values.d.ts +7 -0
- package/dist/ioc/known-values.d.ts.map +1 -0
- package/dist/ioc/known-values.js +43 -0
- package/dist/ioc/known-values.js.map +1 -0
- package/dist/ioc/noise.d.ts +6 -0
- package/dist/ioc/noise.d.ts.map +1 -0
- package/dist/ioc/noise.js +170 -0
- package/dist/ioc/noise.js.map +1 -0
- package/dist/ioc/patterns.d.ts +10 -0
- package/dist/ioc/patterns.d.ts.map +1 -0
- package/dist/ioc/patterns.js +65 -0
- package/dist/ioc/patterns.js.map +1 -0
- package/dist/ioc/scoring.d.ts +6 -0
- package/dist/ioc/scoring.d.ts.map +1 -0
- package/dist/ioc/scoring.js +69 -0
- package/dist/ioc/scoring.js.map +1 -0
- package/dist/parsers/capa.d.ts +9 -0
- package/dist/parsers/capa.d.ts.map +1 -0
- package/dist/parsers/capa.js +55 -0
- package/dist/parsers/capa.js.map +1 -0
- package/dist/parsers/diec.d.ts +9 -0
- package/dist/parsers/diec.d.ts.map +1 -0
- package/dist/parsers/diec.js +53 -0
- package/dist/parsers/diec.js.map +1 -0
- package/dist/parsers/floss.d.ts +14 -0
- package/dist/parsers/floss.d.ts.map +1 -0
- package/dist/parsers/floss.js +89 -0
- package/dist/parsers/floss.js.map +1 -0
- package/dist/parsers/index.d.ts +16 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +46 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/oleid.d.ts +8 -0
- package/dist/parsers/oleid.d.ts.map +1 -0
- package/dist/parsers/oleid.js +94 -0
- package/dist/parsers/oleid.js.map +1 -0
- package/dist/parsers/olevba.d.ts +8 -0
- package/dist/parsers/olevba.d.ts.map +1 -0
- package/dist/parsers/olevba.js +83 -0
- package/dist/parsers/olevba.js.map +1 -0
- package/dist/parsers/passthrough.d.ts +6 -0
- package/dist/parsers/passthrough.d.ts.map +1 -0
- package/dist/parsers/passthrough.js +13 -0
- package/dist/parsers/passthrough.js.map +1 -0
- package/dist/parsers/pdf-parser.d.ts +9 -0
- package/dist/parsers/pdf-parser.d.ts.map +1 -0
- package/dist/parsers/pdf-parser.js +76 -0
- package/dist/parsers/pdf-parser.js.map +1 -0
- package/dist/parsers/pdfid.d.ts +9 -0
- package/dist/parsers/pdfid.d.ts.map +1 -0
- package/dist/parsers/pdfid.js +56 -0
- package/dist/parsers/pdfid.js.map +1 -0
- package/dist/parsers/peframe.d.ts +8 -0
- package/dist/parsers/peframe.d.ts.map +1 -0
- package/dist/parsers/peframe.js +76 -0
- package/dist/parsers/peframe.js.map +1 -0
- package/dist/parsers/readelf.d.ts +8 -0
- package/dist/parsers/readelf.d.ts.map +1 -0
- package/dist/parsers/readelf.js +50 -0
- package/dist/parsers/readelf.js.map +1 -0
- package/dist/parsers/types.d.ts +30 -0
- package/dist/parsers/types.d.ts.map +1 -0
- package/dist/parsers/types.js +5 -0
- package/dist/parsers/types.js.map +1 -0
- package/dist/parsers/yara.d.ts +8 -0
- package/dist/parsers/yara.d.ts.map +1 -0
- package/dist/parsers/yara.js +88 -0
- package/dist/parsers/yara.js.map +1 -0
- package/dist/response.d.ts +44 -0
- package/dist/response.d.ts.map +1 -0
- package/dist/response.js +48 -0
- package/dist/response.js.map +1 -0
- package/dist/schemas/tools.d.ts +135 -0
- package/dist/schemas/tools.d.ts.map +1 -0
- package/dist/schemas/tools.js +53 -0
- package/dist/schemas/tools.js.map +1 -0
- package/dist/security/blocklist.d.ts +69 -0
- package/dist/security/blocklist.d.ts.map +1 -0
- package/dist/security/blocklist.js +148 -0
- package/dist/security/blocklist.js.map +1 -0
- package/dist/state/session.d.ts +35 -0
- package/dist/state/session.d.ts.map +1 -0
- package/dist/state/session.js +45 -0
- package/dist/state/session.js.map +1 -0
- package/dist/tools/definitions.d.ts +9 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +708 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/invoker.d.ts +17 -0
- package/dist/tools/invoker.d.ts.map +1 -0
- package/dist/tools/invoker.js +44 -0
- package/dist/tools/invoker.js.map +1 -0
- package/dist/tools/registry.d.ts +62 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +53 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/workflows/engine.d.ts +27 -0
- package/dist/workflows/engine.d.ts.map +1 -0
- package/dist/workflows/engine.js +224 -0
- package/dist/workflows/engine.js.map +1 -0
- package/dist/workflows/loader.d.ts +33 -0
- package/dist/workflows/loader.d.ts.map +1 -0
- package/dist/workflows/loader.js +130 -0
- package/dist/workflows/loader.js.map +1 -0
- package/dist/workflows/types.d.ts +109 -0
- package/dist/workflows/types.d.ts.map +1 -0
- package/dist/workflows/types.js +5 -0
- package/dist/workflows/types.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Connector, ExecOptions, ExecResult } from "./index.js";
|
|
2
|
+
export declare class DockerConnector implements Connector {
|
|
3
|
+
private docker;
|
|
4
|
+
private containerName;
|
|
5
|
+
constructor(containerName: string);
|
|
6
|
+
execute(command: string[], options?: ExecOptions): Promise<ExecResult>;
|
|
7
|
+
writeFile(remotePath: string, content: Buffer): Promise<void>;
|
|
8
|
+
writeFileFromPath(remotePath: string, hostPath: string): Promise<void>;
|
|
9
|
+
readFileToPath(remotePath: string, hostPath: string): Promise<void>;
|
|
10
|
+
executeShell(command: string, options?: ExecOptions): Promise<ExecResult>;
|
|
11
|
+
disconnect(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/connectors/docker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKrE,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,EAAE,MAAM;IAU3B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAmJ1E,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0C7D,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAK7E,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import Docker from "dockerode";
|
|
2
|
+
import { writeFileSync, unlinkSync, mkdtempSync } from "fs";
|
|
3
|
+
import { tmpdir } from "os";
|
|
4
|
+
import { join, basename } from "path";
|
|
5
|
+
// Output size limit (10MB)
|
|
6
|
+
const MAX_OUTPUT_SIZE = 10 * 1024 * 1024;
|
|
7
|
+
export class DockerConnector {
|
|
8
|
+
docker;
|
|
9
|
+
containerName;
|
|
10
|
+
constructor(containerName) {
|
|
11
|
+
// Docker container names can only contain [a-zA-Z0-9][a-zA-Z0-9_.-]*
|
|
12
|
+
const sanitized = containerName.replace(/[^a-zA-Z0-9_.-]/g, "");
|
|
13
|
+
if (sanitized !== containerName) {
|
|
14
|
+
throw new Error(`Invalid container name: ${containerName}`);
|
|
15
|
+
}
|
|
16
|
+
this.docker = new Docker();
|
|
17
|
+
this.containerName = containerName;
|
|
18
|
+
}
|
|
19
|
+
async execute(command, options = {}) {
|
|
20
|
+
// Validate command array is not empty
|
|
21
|
+
if (command.length === 0) {
|
|
22
|
+
throw new Error("Command array cannot be empty");
|
|
23
|
+
}
|
|
24
|
+
const container = this.docker.getContainer(this.containerName);
|
|
25
|
+
// Check container exists and is running
|
|
26
|
+
const info = await container.inspect();
|
|
27
|
+
if (!info.State.Running) {
|
|
28
|
+
throw new Error(`Container '${this.containerName}' is not running`);
|
|
29
|
+
}
|
|
30
|
+
const exec = await container.exec({
|
|
31
|
+
Cmd: command,
|
|
32
|
+
AttachStdout: true,
|
|
33
|
+
AttachStderr: true,
|
|
34
|
+
WorkingDir: options.cwd || "/home/remnux",
|
|
35
|
+
});
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
const timeout = options.timeout || 300000;
|
|
38
|
+
let timedOut = false;
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
40
|
+
let activeStream = null;
|
|
41
|
+
const timer = setTimeout(async () => {
|
|
42
|
+
timedOut = true;
|
|
43
|
+
// Destroy the stream to stop reading output
|
|
44
|
+
if (activeStream && typeof activeStream.destroy === "function") {
|
|
45
|
+
activeStream.destroy();
|
|
46
|
+
}
|
|
47
|
+
reject(new Error(`Command timed out after ${timeout / 1000} seconds`));
|
|
48
|
+
}, timeout);
|
|
49
|
+
exec.start({ hijack: true, stdin: false }, (err, stream) => {
|
|
50
|
+
if (err) {
|
|
51
|
+
clearTimeout(timer);
|
|
52
|
+
return reject(err);
|
|
53
|
+
}
|
|
54
|
+
if (!stream) {
|
|
55
|
+
clearTimeout(timer);
|
|
56
|
+
return reject(new Error("No stream returned from exec"));
|
|
57
|
+
}
|
|
58
|
+
// Store stream reference for timeout cleanup
|
|
59
|
+
activeStream = stream;
|
|
60
|
+
let stdout = "";
|
|
61
|
+
let stderr = "";
|
|
62
|
+
let outputTruncated = false;
|
|
63
|
+
// Docker multiplexes stdout/stderr in the stream when using hijack mode
|
|
64
|
+
// Each frame has an 8-byte header: [type(1)][0][0][0][size(4 bytes BE)]
|
|
65
|
+
// type: 1 = stdout, 2 = stderr
|
|
66
|
+
let buffer = Buffer.alloc(0);
|
|
67
|
+
const processBuffer = () => {
|
|
68
|
+
// Need at least 8 bytes for the header
|
|
69
|
+
while (buffer.length >= 8) {
|
|
70
|
+
const streamType = buffer[0]; // 1 = stdout, 2 = stderr
|
|
71
|
+
const payloadSize = buffer.readUInt32BE(4);
|
|
72
|
+
// Check if we have the full frame
|
|
73
|
+
if (buffer.length < 8 + payloadSize) {
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
const payload = buffer.slice(8, 8 + payloadSize).toString("utf8");
|
|
77
|
+
buffer = buffer.slice(8 + payloadSize);
|
|
78
|
+
if (streamType === 1) {
|
|
79
|
+
// stdout
|
|
80
|
+
if (stdout.length < MAX_OUTPUT_SIZE) {
|
|
81
|
+
stdout += payload;
|
|
82
|
+
if (stdout.length >= MAX_OUTPUT_SIZE) {
|
|
83
|
+
stdout = stdout.slice(0, MAX_OUTPUT_SIZE);
|
|
84
|
+
outputTruncated = true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else if (streamType === 2) {
|
|
89
|
+
// stderr
|
|
90
|
+
if (stderr.length < MAX_OUTPUT_SIZE) {
|
|
91
|
+
stderr += payload;
|
|
92
|
+
if (stderr.length >= MAX_OUTPUT_SIZE) {
|
|
93
|
+
stderr = stderr.slice(0, MAX_OUTPUT_SIZE);
|
|
94
|
+
outputTruncated = true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
stream.on("data", (chunk) => {
|
|
101
|
+
buffer = Buffer.concat([buffer, chunk]);
|
|
102
|
+
processBuffer();
|
|
103
|
+
});
|
|
104
|
+
stream.on("end", async () => {
|
|
105
|
+
if (timedOut)
|
|
106
|
+
return;
|
|
107
|
+
clearTimeout(timer);
|
|
108
|
+
// Process any remaining data
|
|
109
|
+
processBuffer();
|
|
110
|
+
// If demuxing didn't work (no headers), treat all data as stdout
|
|
111
|
+
// This handles the case where TTY is attached or raw mode is used
|
|
112
|
+
if (stdout === "" && stderr === "" && buffer.length > 0) {
|
|
113
|
+
stdout = buffer.toString("utf8");
|
|
114
|
+
if (stdout.length > MAX_OUTPUT_SIZE) {
|
|
115
|
+
stdout = stdout.slice(0, MAX_OUTPUT_SIZE);
|
|
116
|
+
outputTruncated = true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
const inspectResult = await exec.inspect();
|
|
121
|
+
let finalStdout = stdout.trim();
|
|
122
|
+
if (outputTruncated) {
|
|
123
|
+
finalStdout += "\n\n[OUTPUT TRUNCATED - exceeded 10MB limit]";
|
|
124
|
+
}
|
|
125
|
+
resolve({
|
|
126
|
+
stdout: finalStdout,
|
|
127
|
+
stderr: stderr.trim(),
|
|
128
|
+
exitCode: inspectResult.ExitCode ?? 0,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch (_inspectErr) {
|
|
132
|
+
resolve({
|
|
133
|
+
stdout: stdout.trim(),
|
|
134
|
+
stderr: stderr.trim(),
|
|
135
|
+
exitCode: -1,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
stream.on("error", (streamErr) => {
|
|
140
|
+
clearTimeout(timer);
|
|
141
|
+
reject(streamErr);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
async writeFile(remotePath, content) {
|
|
147
|
+
const container = this.docker.getContainer(this.containerName);
|
|
148
|
+
// Check container exists and is running
|
|
149
|
+
const info = await container.inspect();
|
|
150
|
+
if (!info.State.Running) {
|
|
151
|
+
throw new Error(`Container '${this.containerName}' is not running`);
|
|
152
|
+
}
|
|
153
|
+
// Create a temp file on the host
|
|
154
|
+
const tempDir = mkdtempSync(join(tmpdir(), "remnux-upload-"));
|
|
155
|
+
const filename = basename(remotePath);
|
|
156
|
+
const tempPath = join(tempDir, filename);
|
|
157
|
+
try {
|
|
158
|
+
// Write content to temp file
|
|
159
|
+
writeFileSync(tempPath, content);
|
|
160
|
+
// Use docker cp to copy into container
|
|
161
|
+
// docker cp tempPath containerName:remotePath
|
|
162
|
+
// Escape single quotes in paths for shell safety (defense-in-depth)
|
|
163
|
+
const escapedTempPath = tempPath.replace(/'/g, "'\\''");
|
|
164
|
+
const escapedRemotePath = remotePath.replace(/'/g, "'\\''");
|
|
165
|
+
const { execSync } = await import("child_process");
|
|
166
|
+
execSync(`docker cp '${escapedTempPath}' '${this.containerName}:${escapedRemotePath}'`, { stdio: "pipe" });
|
|
167
|
+
// Files are owned by whatever user the container runs as (typically root)
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
// Clean up temp file
|
|
171
|
+
try {
|
|
172
|
+
unlinkSync(tempPath);
|
|
173
|
+
const { rmdirSync } = await import("fs");
|
|
174
|
+
rmdirSync(tempDir);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Ignore cleanup errors
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async writeFileFromPath(remotePath, hostPath) {
|
|
182
|
+
const escapedRemotePath = remotePath.replace(/'/g, "'\\''");
|
|
183
|
+
const escapedHostPath = hostPath.replace(/'/g, "'\\''");
|
|
184
|
+
const { execSync } = await import("child_process");
|
|
185
|
+
execSync(`docker cp '${escapedHostPath}' '${this.containerName}:${escapedRemotePath}'`, { stdio: "pipe" });
|
|
186
|
+
}
|
|
187
|
+
async readFileToPath(remotePath, hostPath) {
|
|
188
|
+
const escapedRemotePath = remotePath.replace(/'/g, "'\\''");
|
|
189
|
+
const escapedHostPath = hostPath.replace(/'/g, "'\\''");
|
|
190
|
+
const { execSync } = await import("child_process");
|
|
191
|
+
execSync(`docker cp '${this.containerName}:${escapedRemotePath}' '${escapedHostPath}'`, { stdio: "pipe" });
|
|
192
|
+
}
|
|
193
|
+
async executeShell(command, options = {}) {
|
|
194
|
+
// Execute command through bash shell to support pipes and redirects
|
|
195
|
+
return this.execute(["bash", "-c", command], options);
|
|
196
|
+
}
|
|
197
|
+
async disconnect() {
|
|
198
|
+
// Docker client doesn't maintain persistent connections
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/connectors/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface ExecOptions {
|
|
2
|
+
timeout?: number;
|
|
3
|
+
cwd?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ExecResult {
|
|
6
|
+
stdout: string;
|
|
7
|
+
stderr: string;
|
|
8
|
+
exitCode: number;
|
|
9
|
+
}
|
|
10
|
+
export interface Connector {
|
|
11
|
+
execute(command: string[], options?: ExecOptions): Promise<ExecResult>;
|
|
12
|
+
executeShell(command: string, options?: ExecOptions): Promise<ExecResult>;
|
|
13
|
+
writeFile(remotePath: string, content: Buffer): Promise<void>;
|
|
14
|
+
writeFileFromPath(remotePath: string, hostPath: string): Promise<void>;
|
|
15
|
+
readFileToPath(remotePath: string, hostPath: string): Promise<void>;
|
|
16
|
+
disconnect(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export interface ConnectorConfig {
|
|
19
|
+
mode: "docker" | "ssh" | "local";
|
|
20
|
+
container?: string;
|
|
21
|
+
host?: string;
|
|
22
|
+
user?: string;
|
|
23
|
+
port?: number;
|
|
24
|
+
password?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function createConnector(config: ConnectorConfig): Promise<Connector>;
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACvE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1E,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAuBjF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export async function createConnector(config) {
|
|
2
|
+
switch (config.mode) {
|
|
3
|
+
case "docker":
|
|
4
|
+
const { DockerConnector } = await import("./docker.js");
|
|
5
|
+
return new DockerConnector(config.container || "remnux");
|
|
6
|
+
case "ssh":
|
|
7
|
+
const { SSHConnector } = await import("./ssh.js");
|
|
8
|
+
if (!config.host)
|
|
9
|
+
throw new Error("SSH mode requires --host");
|
|
10
|
+
return new SSHConnector({
|
|
11
|
+
host: config.host,
|
|
12
|
+
user: config.user || "remnux",
|
|
13
|
+
port: config.port || 22,
|
|
14
|
+
...(config.password ? { password: config.password } : {}),
|
|
15
|
+
});
|
|
16
|
+
case "local":
|
|
17
|
+
const { LocalConnector } = await import("./local.js");
|
|
18
|
+
return new LocalConnector();
|
|
19
|
+
default:
|
|
20
|
+
throw new Error(`Unknown connection mode: ${config.mode}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AA6BA,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAuB;IAC3D,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACxD,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC;QAE3D,KAAK,KAAK;YACR,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9D,OAAO,IAAI,YAAY,CAAC;gBACtB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ;gBAC7B,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;gBACvB,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1D,CAAC,CAAC;QAEL,KAAK,OAAO;YACV,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YACtD,OAAO,IAAI,cAAc,EAAE,CAAC;QAE9B;YACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Connector, ExecOptions, ExecResult } from "./index.js";
|
|
2
|
+
export declare class LocalConnector implements Connector {
|
|
3
|
+
execute(command: string[], options?: ExecOptions): Promise<ExecResult>;
|
|
4
|
+
executeShell(command: string, options?: ExecOptions): Promise<ExecResult>;
|
|
5
|
+
writeFile(remotePath: string, content: Buffer): Promise<void>;
|
|
6
|
+
writeFileFromPath(remotePath: string, hostPath: string): Promise<void>;
|
|
7
|
+
readFileToPath(remotePath: string, hostPath: string): Promise<void>;
|
|
8
|
+
disconnect(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/connectors/local.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAqBrE,qBAAa,cAAe,YAAW,SAAS;IACxC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IA8E1E,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAK7E,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import { copyFileSync, writeFileSync } from "fs";
|
|
3
|
+
// Output size limit (10MB)
|
|
4
|
+
const MAX_OUTPUT_SIZE = 10 * 1024 * 1024;
|
|
5
|
+
// Allowed environment variables for tool execution
|
|
6
|
+
// Only pass essential vars to prevent leaking sensitive data
|
|
7
|
+
const ALLOWED_ENV_VARS = [
|
|
8
|
+
"PATH",
|
|
9
|
+
"HOME",
|
|
10
|
+
"USER",
|
|
11
|
+
"SHELL",
|
|
12
|
+
"TERM",
|
|
13
|
+
"LANG",
|
|
14
|
+
"LC_ALL",
|
|
15
|
+
"TZ",
|
|
16
|
+
// Tool-specific vars that may be needed
|
|
17
|
+
"PYTHONPATH",
|
|
18
|
+
"JAVA_HOME",
|
|
19
|
+
];
|
|
20
|
+
export class LocalConnector {
|
|
21
|
+
async execute(command, options = {}) {
|
|
22
|
+
// Validate command array is not empty
|
|
23
|
+
if (command.length === 0) {
|
|
24
|
+
throw new Error("Command array cannot be empty");
|
|
25
|
+
}
|
|
26
|
+
const timeout = options.timeout || 300000;
|
|
27
|
+
const [cmd, ...args] = command;
|
|
28
|
+
// Filter environment variables to only allowed ones
|
|
29
|
+
const filteredEnv = {};
|
|
30
|
+
for (const key of ALLOWED_ENV_VARS) {
|
|
31
|
+
if (process.env[key]) {
|
|
32
|
+
filteredEnv[key] = process.env[key];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
let timedOut = false;
|
|
37
|
+
let stdout = "";
|
|
38
|
+
let stderr = "";
|
|
39
|
+
let outputTruncated = false;
|
|
40
|
+
const proc = spawn(cmd, args, {
|
|
41
|
+
cwd: options.cwd,
|
|
42
|
+
env: filteredEnv,
|
|
43
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
44
|
+
});
|
|
45
|
+
const timer = setTimeout(() => {
|
|
46
|
+
timedOut = true;
|
|
47
|
+
proc.kill("SIGKILL");
|
|
48
|
+
reject(new Error(`Command timed out after ${timeout / 1000} seconds`));
|
|
49
|
+
}, timeout);
|
|
50
|
+
proc.stdout.on("data", (data) => {
|
|
51
|
+
if (stdout.length < MAX_OUTPUT_SIZE) {
|
|
52
|
+
stdout += data.toString();
|
|
53
|
+
if (stdout.length >= MAX_OUTPUT_SIZE) {
|
|
54
|
+
stdout = stdout.slice(0, MAX_OUTPUT_SIZE);
|
|
55
|
+
outputTruncated = true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
proc.stderr.on("data", (data) => {
|
|
60
|
+
if (stderr.length < MAX_OUTPUT_SIZE) {
|
|
61
|
+
stderr += data.toString();
|
|
62
|
+
if (stderr.length >= MAX_OUTPUT_SIZE) {
|
|
63
|
+
stderr = stderr.slice(0, MAX_OUTPUT_SIZE);
|
|
64
|
+
outputTruncated = true;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
proc.on("error", (err) => {
|
|
69
|
+
clearTimeout(timer);
|
|
70
|
+
reject(err);
|
|
71
|
+
});
|
|
72
|
+
proc.on("close", (code) => {
|
|
73
|
+
if (timedOut)
|
|
74
|
+
return;
|
|
75
|
+
clearTimeout(timer);
|
|
76
|
+
let finalStdout = stdout.trim();
|
|
77
|
+
if (outputTruncated) {
|
|
78
|
+
finalStdout += "\n\n[OUTPUT TRUNCATED - exceeded 10MB limit]";
|
|
79
|
+
}
|
|
80
|
+
resolve({
|
|
81
|
+
stdout: finalStdout,
|
|
82
|
+
stderr: stderr.trim(),
|
|
83
|
+
exitCode: code ?? 0,
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async executeShell(command, options = {}) {
|
|
89
|
+
// Execute command through bash shell to support pipes and redirects
|
|
90
|
+
return this.execute(["bash", "-c", command], options);
|
|
91
|
+
}
|
|
92
|
+
async writeFile(remotePath, content) {
|
|
93
|
+
writeFileSync(remotePath, content);
|
|
94
|
+
}
|
|
95
|
+
async writeFileFromPath(remotePath, hostPath) {
|
|
96
|
+
copyFileSync(hostPath, remotePath);
|
|
97
|
+
}
|
|
98
|
+
async readFileToPath(remotePath, hostPath) {
|
|
99
|
+
copyFileSync(remotePath, hostPath);
|
|
100
|
+
}
|
|
101
|
+
async disconnect() {
|
|
102
|
+
// No persistent connection for local mode
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/connectors/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Connector, ExecOptions, ExecResult } from "./index.js";
|
|
2
|
+
export interface SSHConfig {
|
|
3
|
+
host: string;
|
|
4
|
+
user: string;
|
|
5
|
+
port: number;
|
|
6
|
+
privateKey?: string;
|
|
7
|
+
password?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class SSHConnector implements Connector {
|
|
10
|
+
private config;
|
|
11
|
+
private client;
|
|
12
|
+
constructor(config: SSHConfig);
|
|
13
|
+
private connect;
|
|
14
|
+
execute(command: string[], options?: ExecOptions): Promise<ExecResult>;
|
|
15
|
+
executeShell(command: string, options?: ExecOptions): Promise<ExecResult>;
|
|
16
|
+
writeFile(remotePath: string, content: Buffer): Promise<void>;
|
|
17
|
+
writeFileFromPath(remotePath: string, hostPath: string): Promise<void>;
|
|
18
|
+
readFileToPath(remotePath: string, hostPath: string): Promise<void>;
|
|
19
|
+
disconnect(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ssh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/connectors/ssh.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKrE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAa,YAAW,SAAS;IAC5C,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,SAAS;YAIf,OAAO;IAiCf,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAgF1E,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAmE7E,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B7D,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BtE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BnE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAMlC"}
|