@integsec/agentic-pentest-proxy 0.3.8 → 0.4.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 +2 -0
- package/cloudflare/src/worker.mjs +2 -2
- package/cloudflare/wrangler.jsonc +1 -1
- package/dist/bin/integsec-agentic-pentest-bridge.js +2 -2
- package/dist/bin/integsec-agentic-pentest-scanners-mcp.js +21 -7
- package/dist/bin/integsec-agentic-pentest-scanners-mcp.js.map +1 -1
- package/dist/src/config.js +1 -1
- package/dist/src/extractor.d.ts.map +1 -1
- package/dist/src/extractor.js +2 -0
- package/dist/src/extractor.js.map +1 -1
- package/dist/src/gateway/admin.js +126 -18
- package/dist/src/gateway/command.d.ts +20 -0
- package/dist/src/gateway/command.d.ts.map +1 -0
- package/dist/src/gateway/command.js +81 -0
- package/dist/src/gateway/command.js.map +1 -0
- package/dist/src/gateway/docs-home.html +1 -1
- package/dist/src/gateway/docs.d.ts.map +1 -1
- package/dist/src/gateway/docs.js +1 -0
- package/dist/src/gateway/docs.js.map +1 -1
- package/dist/src/gateway/jobs.d.ts +26 -0
- package/dist/src/gateway/jobs.d.ts.map +1 -0
- package/dist/src/gateway/jobs.js +97 -0
- package/dist/src/gateway/jobs.js.map +1 -0
- package/dist/src/gateway/runtime.d.ts +14 -0
- package/dist/src/gateway/runtime.d.ts.map +1 -1
- package/dist/src/gateway/runtime.js +280 -55
- package/dist/src/gateway/runtime.js.map +1 -1
- package/dist/src/gateway/server.d.ts.map +1 -1
- package/dist/src/gateway/server.js +69 -2
- package/dist/src/gateway/server.js.map +1 -1
- package/dist/src/gateway/state.d.ts +15 -1
- package/dist/src/gateway/state.d.ts.map +1 -1
- package/dist/src/gateway/state.js +20 -6
- package/dist/src/gateway/state.js.map +1 -1
- package/dist/src/gateway/workbench-client.js +180 -0
- package/dist/src/gateway/workbench.css +3 -0
- package/dist/src/gateway/workbench.d.ts +51 -0
- package/dist/src/gateway/workbench.d.ts.map +1 -0
- package/dist/src/gateway/workbench.html +41 -0
- package/dist/src/gateway/workbench.js +157 -0
- package/dist/src/gateway/workbench.js.map +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/proxy.d.ts +3 -1
- package/dist/src/proxy.d.ts.map +1 -1
- package/dist/src/proxy.js +20 -2
- package/dist/src/proxy.js.map +1 -1
- package/dist/src/scanners/jobs.d.ts +25 -0
- package/dist/src/scanners/jobs.d.ts.map +1 -0
- package/dist/src/scanners/jobs.js +65 -0
- package/dist/src/scanners/jobs.js.map +1 -0
- package/dist/src/scanners/runner.d.ts +2 -1
- package/dist/src/scanners/runner.d.ts.map +1 -1
- package/dist/src/scanners/runner.js +10 -7
- package/dist/src/scanners/runner.js.map +1 -1
- package/dist/src/technique-checker.js +1 -1
- package/dist/src/technique-checker.js.map +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/validator.d.ts.map +1 -1
- package/dist/src/validator.js +3 -2
- package/dist/src/validator.js.map +1 -1
- package/docs/managed-gateway.md +11 -3
- package/docs/workbench.md +28 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,6 +8,8 @@ An MCP proxy that checks tool calls against a pentest scope manifest before forw
|
|
|
8
8
|
|
|
9
9
|
**Managing several tools?** The [managed gateway](docs/managed-gateway.md) adds a browser UI with local MCP server presets, scope templates and technique checkboxes, JSON policy import and download, administrator approval and assignment, and a separate engagement choice for each user. It exposes scoped tools, an active engagement resource, and planning prompts. It supports one hosted MCP URL for ChatGPT and Claude and a local Burp route.
|
|
10
10
|
|
|
11
|
+
The [MCP workbench](docs/workbench.md) shows your live tool calls and background jobs. Intercept requests, edit arguments before forwarding, or drop a call. Long calls return a job ID that you can inspect or cancel without waiting for one MCP request to stay open. The gateway checks scope again after any edit.
|
|
12
|
+
|
|
11
13
|
## Quick start: add an MCP tool
|
|
12
14
|
|
|
13
15
|
1. Install the proxy:
|
|
@@ -15,7 +15,7 @@ function tokenMatches(header, expected) {
|
|
|
15
15
|
export class PentestGatewayContainer extends Container {
|
|
16
16
|
defaultPort = 9091;
|
|
17
17
|
pingEndpoint = 'localhost/healthz';
|
|
18
|
-
sleepAfter = '
|
|
18
|
+
sleepAfter = '35m';
|
|
19
19
|
writeQueue = Promise.resolve();
|
|
20
20
|
|
|
21
21
|
constructor(ctx, env) {
|
|
@@ -59,7 +59,7 @@ export class PentestGatewayContainer extends Container {
|
|
|
59
59
|
if (url.hostname !== new URL(this.env.GATEWAY_PUBLIC_URL).hostname) return text('Not found', 404);
|
|
60
60
|
if (url.pathname === '/api/audit' && request.method === 'GET') return this.listAudit(request);
|
|
61
61
|
if (url.pathname.startsWith('/__internal/')) return text('Not found', 404);
|
|
62
|
-
const mutatesState = url.pathname.startsWith('/api/') && ['POST', 'PUT', 'PATCH', 'DELETE'].includes(request.method);
|
|
62
|
+
const mutatesState = url.pathname.startsWith('/api/') && !url.pathname.startsWith('/api/workbench/') && ['POST', 'PUT', 'PATCH', 'DELETE'].includes(request.method);
|
|
63
63
|
if (!mutatesState) return this.containerFetch(request);
|
|
64
64
|
|
|
65
65
|
const result = this.writeQueue.then(() => this.persistMutation(request));
|
|
@@ -12,9 +12,9 @@ const url = new URL(process.argv[2] ?? process.env.GATEWAY_URL ?? "http://127.0.
|
|
|
12
12
|
if (!["127.0.0.1", "localhost", "[::1]"].includes(url.hostname) || url.protocol !== "http:") {
|
|
13
13
|
throw new Error("The local bridge only accepts a loopback HTTP gateway URL");
|
|
14
14
|
}
|
|
15
|
-
const upstream = new Client({ name: "agentic-pentest-bridge", version: "0.
|
|
15
|
+
const upstream = new Client({ name: "agentic-pentest-bridge", version: "0.4.0" });
|
|
16
16
|
await upstream.connect(new StreamableHTTPClientTransport(url));
|
|
17
|
-
const bridge = new Server({ name: "agentic-pentest-local", version: "0.
|
|
17
|
+
const bridge = new Server({ name: "agentic-pentest-local", version: "0.4.0" }, { capabilities: { tools: {} } });
|
|
18
18
|
bridge.setRequestHandler(ListToolsRequestSchema, async (request) => upstream.listTools(request.params));
|
|
19
19
|
bridge.setRequestHandler(CallToolRequestSchema, async (request) => upstream.callTool(request.params));
|
|
20
20
|
await bridge.connect(new StdioServerTransport());
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
4
|
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
-
import { nmapArgs,
|
|
5
|
+
import { nmapArgs, runScanner } from "../src/scanners/runner.js";
|
|
6
|
+
import { NucleiJobs } from "../src/scanners/jobs.js";
|
|
6
7
|
const mode = process.argv[2];
|
|
7
8
|
if (mode !== "nmap" && mode !== "nuclei") {
|
|
8
9
|
console.error("Usage: integsec-agentic-pentest-scanners-mcp <nmap|nuclei>");
|
|
@@ -16,20 +17,33 @@ const tool = mode === "nmap" ? {
|
|
|
16
17
|
serviceDetection: { type: "boolean", description: "Probe open ports for service versions." },
|
|
17
18
|
}, required: ["target"], additionalProperties: false },
|
|
18
19
|
} : {
|
|
19
|
-
name: "nuclei_scan", description: "
|
|
20
|
+
name: "nuclei_scan", description: "Start a bounded HTTP Nuclei scan against one approved URL. Returns a scan ID immediately; use nuclei_scan_status for results. Disables OAST and automatic updates.",
|
|
20
21
|
inputSchema: { type: "object", properties: {
|
|
21
22
|
url: { type: "string", description: "One authorized HTTP or HTTPS URL." },
|
|
22
23
|
}, required: ["url"], additionalProperties: false },
|
|
23
24
|
};
|
|
24
|
-
const
|
|
25
|
-
|
|
25
|
+
const jobs = new NucleiJobs();
|
|
26
|
+
const jobTool = (name, description) => ({ name, description, inputSchema: { type: "object", properties: {
|
|
27
|
+
scanId: { type: "string", description: "Scan ID returned by nuclei_scan." },
|
|
28
|
+
url: { type: "string", description: "The same authorized URL used to start the scan." },
|
|
29
|
+
}, required: ["scanId", "url"], additionalProperties: false } });
|
|
30
|
+
const server = new Server({ name: `integsec-${mode}-mcp`, version: "0.4.0" }, { capabilities: { tools: {} } });
|
|
31
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: mode === "nuclei" ? [tool,
|
|
32
|
+
jobTool("nuclei_scan_status", "Check progress and get results of a Nuclei scan for the same approved URL."),
|
|
33
|
+
jobTool("nuclei_scan_cancel", "Stop a running Nuclei scan for the same approved URL.")] : [tool] }));
|
|
26
34
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
27
|
-
if (request.params.name !== tool.name)
|
|
35
|
+
if (request.params.name !== tool.name && !(mode === "nuclei" && ["nuclei_scan_status", "nuclei_scan_cancel"].includes(request.params.name)))
|
|
28
36
|
return { content: [{ type: "text", text: "Unknown scanner tool." }], isError: true };
|
|
29
37
|
try {
|
|
30
38
|
const input = request.params.arguments ?? {};
|
|
31
|
-
|
|
32
|
-
|
|
39
|
+
if (mode === "nuclei") {
|
|
40
|
+
const result = request.params.name === "nuclei_scan_status" ? jobs.status(input.scanId, input.url)
|
|
41
|
+
: request.params.name === "nuclei_scan_cancel" ? jobs.cancel(input.scanId, input.url)
|
|
42
|
+
: jobs.start(input.url, input._gatewayDeadline);
|
|
43
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
44
|
+
}
|
|
45
|
+
const args = nmapArgs(input);
|
|
46
|
+
return { content: [{ type: "text", text: await runScanner("nmap", args) }] };
|
|
33
47
|
}
|
|
34
48
|
catch (error) {
|
|
35
49
|
return { content: [{ type: "text", text: error instanceof Error ? error.message : String(error) }], isError: true };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integsec-agentic-pentest-scanners-mcp.js","sourceRoot":"","sources":["../../bin/integsec-agentic-pentest-scanners-mcp.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACnG,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"integsec-agentic-pentest-scanners-mcp.js","sourceRoot":"","sources":["../../bin/integsec-agentic-pentest-scanners-mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/src/config.js
CHANGED
|
@@ -50,7 +50,7 @@ export function loadConfig() {
|
|
|
50
50
|
techniqueMapPath: process.env.TECHNIQUE_MAP_PATH,
|
|
51
51
|
dnsCacheTtl: parseInt(process.env.DNS_CACHE_TTL || "60", 10),
|
|
52
52
|
logLevel: process.env.LOG_LEVEL || "INFO",
|
|
53
|
-
proxyVersion: process.env.PROXY_VERSION || "0.
|
|
53
|
+
proxyVersion: process.env.PROXY_VERSION || "0.4.0",
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf;oDACgD;IAChD,YAAY,EAAE,OAAO,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf;oDACgD;IAChD,YAAY,EAAE,OAAO,CAAC;CACvB;AA+gBD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,gBAAgB,EAAE,CA6DpB;AAMD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,gBAAgB,GAAG,IAAI,CAmBzB"}
|
package/dist/src/extractor.js
CHANGED
|
@@ -105,6 +105,8 @@ const TOOL_MAPPINGS = [
|
|
|
105
105
|
// Hex Strike AI MCP — https://github.com/0x4m4/hexstrike-ai
|
|
106
106
|
{ match: "gobuster_scan", params: ["url", "target"] },
|
|
107
107
|
{ match: "nuclei_scan", params: ["target", "url"] },
|
|
108
|
+
{ match: "nuclei_scan_status", params: ["url"] },
|
|
109
|
+
{ match: "nuclei_scan_cancel", params: ["url"] },
|
|
108
110
|
{ match: "sqlmap_scan", params: ["url", "target"] },
|
|
109
111
|
{ match: "ffuf_scan", params: ["url", "target"] },
|
|
110
112
|
{ match: "feroxbuster_scan", params: ["url", "target"] },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/extractor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,44 @@ let editing = null;
|
|
|
9
9
|
let viewingScopeId = null;
|
|
10
10
|
let dirty = false;
|
|
11
11
|
let bootstrapAdmins = new Set();
|
|
12
|
+
let upstreamStatuses = {};
|
|
13
|
+
const osNames = { windows: 'Windows', macos: 'macOS', linux: 'Linux (Debian/Ubuntu)' };
|
|
14
|
+
const platform = navigator.userAgentData?.platform || navigator.platform || navigator.userAgent || '';
|
|
15
|
+
const detectedOS = /win/i.test(platform) ? 'windows' : /mac/i.test(platform) ? 'macos' : 'linux';
|
|
16
|
+
let selectedOS = localStorage.getItem('gateway-docs-os');
|
|
17
|
+
if (!osNames[selectedOS]) selectedOS = detectedOS;
|
|
18
|
+
const installHelp = {
|
|
19
|
+
burp: {
|
|
20
|
+
windows: { command: "Start-Process 'https://portswigger.net/burp/releases'", note: 'Open the official installer, then enable MCP inside Burp.' },
|
|
21
|
+
macos: { command: "open 'https://portswigger.net/burp/releases'", note: 'Open the official installer, then enable MCP inside Burp.' },
|
|
22
|
+
linux: { command: "xdg-open 'https://portswigger.net/burp/releases'", note: 'Open the official installer, then enable MCP inside Burp.' },
|
|
23
|
+
},
|
|
24
|
+
semgrep: {
|
|
25
|
+
windows: { command: 'py -m pip install --user semgrep\nsemgrep --version', note: 'Requires Python and pip; confirm the Scripts folder is on PATH.' },
|
|
26
|
+
macos: { command: 'brew install semgrep\nsemgrep --version', note: 'Requires Homebrew.' },
|
|
27
|
+
linux: { command: 'pipx install semgrep\nsemgrep --version', note: 'Requires pipx; install it through your distribution first.' },
|
|
28
|
+
},
|
|
29
|
+
trivy: {
|
|
30
|
+
windows: { command: "Start-Process 'https://github.com/aquasecurity/trivy/releases/latest'", note: 'Install the official Windows archive, put trivy on PATH, then run trivy plugin install mcp.' },
|
|
31
|
+
macos: { command: 'brew install trivy\ntrivy plugin install mcp\ntrivy --version', note: 'Requires Homebrew.' },
|
|
32
|
+
linux: { command: "sudo apt-get update\nsudo apt-get install -y wget gnupg\nwget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null\necho 'deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb generic main' | sudo tee /etc/apt/sources.list.d/trivy.list\nsudo apt-get update\nsudo apt-get install -y trivy\ntrivy plugin install mcp\ntrivy --version", note: 'Debian and Ubuntu. For other distributions, follow the official Trivy install guide.' },
|
|
33
|
+
},
|
|
34
|
+
nmap: {
|
|
35
|
+
windows: { command: "Start-Process 'https://nmap.org/download.html'", note: 'Run the official Windows installer. The MCP adapter is already in the gateway package.' },
|
|
36
|
+
macos: { command: "open 'https://nmap.org/download.html'", note: 'Run the official macOS installer. The MCP adapter is already in the gateway package.' },
|
|
37
|
+
linux: { command: 'sudo apt-get update\nsudo apt-get install nmap\nnmap --version', note: 'Debian and Ubuntu. Other distributions: use the official Nmap download page.' },
|
|
38
|
+
},
|
|
39
|
+
nuclei: {
|
|
40
|
+
windows: { command: 'go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest\nnuclei -version', note: 'Requires Go; add the Go bin folder to PATH. The MCP adapter is in the gateway package.' },
|
|
41
|
+
macos: { command: 'brew install nuclei\nnuclei -version', note: 'Requires Homebrew. The MCP adapter is in the gateway package.' },
|
|
42
|
+
linux: { command: 'go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest\nnuclei -version', note: 'Requires Go; add the Go bin folder to PATH. The MCP adapter is in the gateway package.' },
|
|
43
|
+
},
|
|
44
|
+
snyk: {
|
|
45
|
+
windows: { command: 'npm install -g snyk\nsnyk auth', note: 'Requires Node.js and a Snyk account.' },
|
|
46
|
+
macos: { command: 'npm install -g snyk\nsnyk auth', note: 'Requires Node.js and a Snyk account.' },
|
|
47
|
+
linux: { command: 'npm install -g snyk\nsnyk auth', note: 'Requires Node.js and a Snyk account.' },
|
|
48
|
+
},
|
|
49
|
+
};
|
|
12
50
|
const techniques = [
|
|
13
51
|
['recon', 'Reconnaissance and discovery'], ['web_app', 'Web and API testing'],
|
|
14
52
|
['exploitation', 'Exploitation'], ['cloud_audit', 'Cloud assessment'],
|
|
@@ -16,12 +54,12 @@ const techniques = [
|
|
|
16
54
|
['social_engineering', 'Social engineering'],
|
|
17
55
|
];
|
|
18
56
|
const presets = [
|
|
19
|
-
{ name: 'burp', label: 'Burp Suite', transport: 'sse', url: 'http://127.0.0.1:9876', local: true, source: 'https://
|
|
20
|
-
{ name: 'semgrep', label: 'Semgrep', transport: 'stdio', command: 'semgrep', args: ['mcp'], local: true, source: 'https://
|
|
21
|
-
{ name: 'trivy', label: 'Trivy', transport: 'stdio', command: 'trivy', args: ['mcp'], local: true, source: 'https://github.com/aquasecurity/trivy-mcp', note: 'Install Trivy and its official MCP plugin first; pin and review your version.' },
|
|
22
|
-
{ name: 'nmap', label: 'Nmap', transport: 'stdio', command: 'integsec-agentic-pentest-scanners-mcp', args: ['nmap'], local: true, source: 'https://nmap.org/
|
|
23
|
-
{ name: 'nuclei', label: 'Nuclei', transport: 'stdio', command: 'integsec-agentic-pentest-scanners-mcp', args: ['nuclei'], local: true, source: 'https://
|
|
24
|
-
{ name: 'snyk', label: 'Snyk', transport: 'stdio', command: 'snyk', args: ['mcp', '-t', 'stdio'], local: true, source: 'https://
|
|
57
|
+
{ name: 'burp', label: 'Burp Suite', transport: 'sse', url: 'http://127.0.0.1:9876', local: true, source: 'https://portswigger.net/bappstore/9952290f04ed4f628e624d0aa9dccebc', note: 'Enable the official MCP extension inside the tester’s local Burp.' },
|
|
58
|
+
{ name: 'semgrep', label: 'Semgrep', transport: 'stdio', command: 'semgrep', args: ['mcp'], local: true, source: 'https://semgrep.dev/products/community-edition/', note: 'Install and configure the official Semgrep CLI first.' },
|
|
59
|
+
{ name: 'trivy', label: 'Trivy', transport: 'stdio', command: 'trivy', args: ['mcp'], local: true, source: 'https://github.com/aquasecurity/trivy-mcp/blob/main/docs/quickstart.md', note: 'Install Trivy and its official MCP plugin first; pin and review your version.' },
|
|
60
|
+
{ name: 'nmap', label: 'Nmap', transport: 'stdio', command: 'integsec-agentic-pentest-scanners-mcp', args: ['nmap'], local: true, source: 'https://nmap.org/download.html', note: 'Install Nmap locally first. The bundled MCP adapter offers one-host, rate-limited TCP scans.' },
|
|
61
|
+
{ name: 'nuclei', label: 'Nuclei', transport: 'stdio', command: 'integsec-agentic-pentest-scanners-mcp', args: ['nuclei'], local: true, source: 'https://docs.projectdiscovery.io/opensource/nuclei/install', note: 'Install ProjectDiscovery Nuclei locally first. The bundled MCP adapter limits HTTP scans and disables OAST.' },
|
|
62
|
+
{ name: 'snyk', label: 'Snyk', transport: 'stdio', command: 'snyk', args: ['mcp', '-t', 'stdio'], local: true, source: 'https://docs.snyk.io/developer-tools/snyk-cli/install-the-snyk-cli', note: 'Install the Snyk CLI and authenticate locally first.' },
|
|
25
63
|
{ label: 'OWASP ZAP', source: 'https://www.zaproxy.org/docs/desktop/addons/mcp-integration/mcp-options/', note: 'Reference only: its MCP security key needs authenticated upstream support.' },
|
|
26
64
|
{ label: 'PortSwigger DAST', source: 'https://portswigger.net/burp/documentation/dast/user-guide/using-ai/mcp-server', note: 'Reference only: its hosted MCP endpoint requires an API key.' },
|
|
27
65
|
{ label: 'Prowler Cloud', source: 'https://prowler.com/prowler-cloud', note: 'Reference only: its hosted MCP endpoint requires an API key.' },
|
|
@@ -56,6 +94,7 @@ function configureServerUI() {
|
|
|
56
94
|
: 'Use the command or URL from the MCP server’s own setup instructions. Adding an entry does not install the tool.';
|
|
57
95
|
$('hosted-server-choice').hidden = !hosted;
|
|
58
96
|
$('local-presets').hidden = hosted;
|
|
97
|
+
$('command-panel').hidden = hosted;
|
|
59
98
|
$('local-setup').hidden = !hosted;
|
|
60
99
|
$('add-server-panel').hidden = hosted;
|
|
61
100
|
if (hosted) chooseServerPath('local');
|
|
@@ -84,12 +123,62 @@ localPathInput.id = 'local-paths';
|
|
|
84
123
|
localPathInput.placeholder = 'Absolute folder path containing authorized source code';
|
|
85
124
|
localPathField.append(localPathInput);
|
|
86
125
|
$('hosts').closest('label').after(localPathField);
|
|
126
|
+
const allLocalLabel = document.createElement('label'); allLocalLabel.style.cssText = 'display:flex;align-items:center;gap:8px';
|
|
127
|
+
const allLocalInput = document.createElement('input'); allLocalInput.type = 'checkbox'; allLocalInput.id = 'all-local-paths';
|
|
128
|
+
allLocalLabel.append(allLocalInput, document.createTextNode('Allow all local code paths (explicit administrator approval; may expose unrelated files)'));
|
|
129
|
+
localPathField.after(allLocalLabel);
|
|
130
|
+
allLocalInput.onchange = () => { localPathInput.disabled = allLocalInput.checked; };
|
|
87
131
|
const make = (tag, value) => { const node = document.createElement(tag); node.textContent = value; return node; };
|
|
132
|
+
const osBar = make('div', ''); osBar.className = 'help'; osBar.style.cssText = 'margin:0;padding:10px 5vw;display:flex;align-items:center;gap:12px;flex-wrap:wrap';
|
|
133
|
+
const osLabel = make('label', 'Install commands for '); osLabel.style.cssText = 'display:flex;align-items:center;gap:8px';
|
|
134
|
+
const osChoice = document.createElement('select'); osChoice.id = 'docs-os'; osChoice.style.cssText = 'width:auto;margin:0';
|
|
135
|
+
for (const [value, label] of Object.entries(osNames)) { const option = make('option', label); option.value = value; osChoice.append(option); }
|
|
136
|
+
osChoice.value = selectedOS; osLabel.append(osChoice); osBar.append(osLabel, make('span', 'Choose the tester’s operating system. The browser picked a starting value.'));
|
|
137
|
+
document.querySelector('header').after(osBar);
|
|
138
|
+
const workbenchLink = make('a', 'MCP workbench'); workbenchLink.href = '/workbench';
|
|
139
|
+
document.querySelector('header nav').prepend(workbenchLink, document.createTextNode(' · '));
|
|
140
|
+
const toolStyles = document.createElement('style');
|
|
141
|
+
toolStyles.textContent = '#upstreams-card{grid-column:1/-1}#presets,#local-tool-guide-items{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px;margin-top:12px}#presets .row,#local-tool-guide-items .row{display:block;border:1px solid #294454;border-radius:9px;padding:14px}#presets .row>*:first-child,#local-tool-guide-items .row>*:first-child{min-width:0}#presets pre,#local-tool-guide-items pre{font-size:13px}';
|
|
142
|
+
document.head.append(toolStyles);
|
|
143
|
+
const localGuide = make('section', ''); localGuide.id = 'local-tool-guide'; localGuide.className = 'card wide'; localGuide.hidden = true;
|
|
144
|
+
localGuide.append(make('h2', 'Local MCP tools'), make('p', 'Install these on the tester’s computer, then add and turn them on in that computer’s local gateway. The hosted gateway cannot run laptop tools.'));
|
|
145
|
+
const localGuideItems = make('div', ''); localGuideItems.id = 'local-tool-guide-items'; localGuide.append(localGuideItems);
|
|
146
|
+
$('my-card').after(localGuide);
|
|
147
|
+
function updateInstallOS() {
|
|
148
|
+
const shell = selectedOS === 'windows' ? 'PowerShell' : 'a terminal';
|
|
149
|
+
$('local-command').textContent = 'npm install -g @integsec/agentic-pentest-proxy\nintegsec-gateway start';
|
|
150
|
+
$('local-command').closest('li').firstChild.textContent = `Copy these commands into ${shell}:`;
|
|
151
|
+
renderPresets();
|
|
152
|
+
}
|
|
153
|
+
osChoice.onchange = () => { selectedOS = osChoice.value; localStorage.setItem('gateway-docs-os', selectedOS); updateInstallOS(); };
|
|
88
154
|
function button(label, action, style = 'secondary') {
|
|
89
155
|
const node = make('button', label); node.className = style;
|
|
90
156
|
node.addEventListener('click', () => Promise.resolve().then(action).catch((error) => status(error.message, true)));
|
|
91
157
|
return node;
|
|
92
158
|
}
|
|
159
|
+
const commandPanel = make('section', ''); commandPanel.id = 'command-panel'; commandPanel.hidden = true;
|
|
160
|
+
commandPanel.append(make('h3', 'Add a local command as an MCP tool'),
|
|
161
|
+
make('p', 'Use an installed executable and fixed arguments. Put {target} on one argument line. The AI can supply one approved host or URL; it cannot supply flags. Review the command and its configuration before turning it on.'));
|
|
162
|
+
const commandFields = make('div', ''); commandFields.className = 'grid';
|
|
163
|
+
const commandNameLabel = make('label', 'Short name'); const commandName = document.createElement('input'); commandName.id = 'cli-name'; commandName.placeholder = 'my_scanner'; commandNameLabel.append(commandName);
|
|
164
|
+
const commandExeLabel = make('label', 'Installed executable'); const commandExe = document.createElement('input'); commandExe.id = 'cli-command'; commandExe.placeholder = 'scanner'; commandExeLabel.append(commandExe);
|
|
165
|
+
const commandTargetLabel = make('label', 'Target type'); const commandTarget = document.createElement('select'); commandTarget.id = 'cli-target';
|
|
166
|
+
for (const [value, label] of [['host', 'Hostname or IP'], ['url', 'HTTP or HTTPS URL']]) { const option = make('option', label); option.value = value; commandTarget.append(option); }
|
|
167
|
+
commandTargetLabel.append(commandTarget);
|
|
168
|
+
const commandTechniqueLabel = make('label', 'Technique category'); const commandTechnique = document.createElement('select'); commandTechnique.id = 'cli-technique';
|
|
169
|
+
for (const [value, label] of techniques) { const option = make('option', label); option.value = value; commandTechnique.append(option); }
|
|
170
|
+
commandTechniqueLabel.append(commandTechnique);
|
|
171
|
+
commandFields.append(commandNameLabel, commandExeLabel, commandTargetLabel, commandTechniqueLabel); commandPanel.append(commandFields);
|
|
172
|
+
const commandArgsLabel = make('label', 'Fixed arguments, one per line'); const commandArgs = document.createElement('textarea'); commandArgs.id = 'cli-args'; commandArgs.placeholder = '-u\n{target}\n-json'; commandArgsLabel.append(commandArgs); commandPanel.append(commandArgsLabel);
|
|
173
|
+
commandPanel.append(button('Add command (off)', async () => {
|
|
174
|
+
const name = commandName.value.trim(); const executable = commandExe.value.trim(); const args = commandArgs.value.split(/\r?\n/).map((arg) => arg.trim()).filter(Boolean);
|
|
175
|
+
if (!/^[a-z][a-z0-9_-]{0,31}$/.test(name)) throw new Error('Use a short lowercase command name starting with a letter.');
|
|
176
|
+
if (!executable) throw new Error('Enter the installed executable name or path.');
|
|
177
|
+
if (args.filter((arg) => arg === '{target}').length !== 1) throw new Error('Put {target} on exactly one argument line.');
|
|
178
|
+
await api('/api/upstreams', 'POST', { name, enabled: false, transport: 'cli', command: executable, args, targetKind: commandTarget.value, technique: commandTechnique.value });
|
|
179
|
+
commandName.value = ''; commandExe.value = ''; commandArgs.value = ''; await refresh(); status('Local command saved and off. Review it, then turn it on.');
|
|
180
|
+
}));
|
|
181
|
+
$('local-presets').after(commandPanel);
|
|
93
182
|
function choiceList(container, name) {
|
|
94
183
|
const result = [];
|
|
95
184
|
for (const [value, label] of techniques) {
|
|
@@ -111,13 +200,13 @@ function draftFromForm() {
|
|
|
111
200
|
return { profile: $('profile').value, allowedHosts: lines('hosts'), manifest: {
|
|
112
201
|
engagement_id: $('engagement').value.trim(), client: $('client').value.trim(), operator: $('operator').value.trim(),
|
|
113
202
|
authorized_targets: { ip_ranges: lines('ips'), domains: lines('domains'), urls: lines('urls'), cloud_accounts: lines('cloud') },
|
|
114
|
-
excluded_targets: lines('excluded-targets'), authorized_local_paths: lines('local-paths'), authorized_techniques: checked(authorizedChoices),
|
|
203
|
+
excluded_targets: lines('excluded-targets'), authorized_local_paths: allLocalInput.checked ? ['*'] : lines('local-paths'), authorized_techniques: checked(authorizedChoices),
|
|
115
204
|
excluded_techniques: checked(excludedChoices), engagement_window: { start: start.toISOString(), end: end.toISOString() },
|
|
116
205
|
} };
|
|
117
206
|
}
|
|
118
207
|
function summarize(scope) {
|
|
119
208
|
const m = scope.manifest;
|
|
120
|
-
return `Engagement: ${m.engagement_id || '(missing)'}\nClient: ${m.client || '(missing)'} · Operator: ${m.operator || '(missing)'}\nWindow: ${m.engagement_window.start} → ${m.engagement_window.end}\nProfile: ${scope.profile}\nTargets: ${Object.values(m.authorized_targets).flat().join(', ') || '(none)'}\nExcluded targets: ${m.excluded_targets.join(', ') || '(none)'}\nLocal code folders: ${(m.authorized_local_paths || []).join(', ') || '(none)'}\nAuthorized techniques: ${m.authorized_techniques.join(', ') || '(none)'}\nExcluded techniques: ${m.excluded_techniques.join(', ') || '(none)'}\nAllowed MCP hosts: ${scope.allowedHosts.join(', ') || '(none)'}`;
|
|
209
|
+
return `Engagement: ${m.engagement_id || '(missing)'}\nClient: ${m.client || '(missing)'} · Operator: ${m.operator || '(missing)'}\nWindow: ${m.engagement_window.start} → ${m.engagement_window.end}\nProfile: ${scope.profile}\nTargets: ${Object.values(m.authorized_targets).flat().join(', ') || '(none)'}\nExcluded targets: ${m.excluded_targets.join(', ') || '(none)'}\nLocal code folders: ${m.authorized_local_paths?.includes('*') ? 'ALL accessible local paths' : (m.authorized_local_paths || []).join(', ') || '(none)'}\nAuthorized techniques: ${m.authorized_techniques.join(', ') || '(none)'}\nExcluded techniques: ${m.excluded_techniques.join(', ') || '(none)'}\nAllowed MCP hosts: ${scope.allowedHosts.join(', ') || '(none)'}`;
|
|
121
210
|
}
|
|
122
211
|
function downloadPolicy(scope) {
|
|
123
212
|
const policy = { ...scope.manifest, gateway: { profile: scope.profile, allowed_hosts: scope.allowedHosts || [] } };
|
|
@@ -152,6 +241,7 @@ function reviewForm() {
|
|
|
152
241
|
if (m.authorized_targets.domains.some((value) => value.includes('example.'))) warnings.push('Replace documentation domains with real authorized domains.');
|
|
153
242
|
if (m.authorized_targets.urls.some((value) => value.includes('example.'))) warnings.push('Replace documentation URLs with real authorized URLs.');
|
|
154
243
|
if (Date.parse(m.engagement_window.end) <= Date.now()) warnings.push('Choose an end time in the future.');
|
|
244
|
+
if (m.authorized_local_paths.includes('*')) warnings.push('All accessible local paths are allowed for Semgrep and Trivy. Review this broad access before approval.');
|
|
155
245
|
$('scope-review').textContent = `${warnings.length ? `Before approval: ${warnings.join(' ')}\n\n` : ''}${summarize(scope)}`;
|
|
156
246
|
} catch (error) { $('scope-review').textContent = error.message; }
|
|
157
247
|
updateEditorActions();
|
|
@@ -181,8 +271,11 @@ async function refresh() {
|
|
|
181
271
|
$('connection').textContent = `MCP endpoint: ${location.origin}/mcp. ${selected ? `Current engagement: ${selected.manifest.engagement_id}.` : 'Select an engagement before using tools.'}`;
|
|
182
272
|
if (role === 'admin') {
|
|
183
273
|
state = await api('/api/state');
|
|
184
|
-
|
|
274
|
+
upstreamStatuses = await api('/api/upstreams/status');
|
|
275
|
+
renderUsers(); renderUpstreams(); renderScopes();
|
|
276
|
+
for (const card of document.querySelectorAll('.admin-only')) card.hidden = card.id === 'users-card' && mode !== 'access';
|
|
185
277
|
}
|
|
278
|
+
renderPresets();
|
|
186
279
|
status('Gateway state loaded.');
|
|
187
280
|
}
|
|
188
281
|
function renderUsers() {
|
|
@@ -202,15 +295,20 @@ function renderUpstreams() {
|
|
|
202
295
|
const container = $('upstreams'); container.replaceChildren();
|
|
203
296
|
for (const item of state.upstreams) {
|
|
204
297
|
const row = make('div', ''); row.className = 'row';
|
|
205
|
-
|
|
206
|
-
|
|
298
|
+
const check = upstreamStatuses[item.id] || { state: item.enabled ? 'not_checked' : 'off' };
|
|
299
|
+
const connection = check.state === 'connected' ? `Connected · ${check.toolCount} tools found` : check.state === 'error' ? 'Connection failed' : check.state === 'configured' ? 'Runs on demand' : check.state === 'not_checked' ? 'Not checked' : 'Off';
|
|
300
|
+
row.append(make('span', `${item.name} · ${item.transport === 'cli' ? 'local command' : item.transport} · ${item.enabled ? 'On' : 'Off'} · ${connection} · ${['stdio', 'cli'].includes(item.transport) ? item.command : item.url}`));
|
|
301
|
+
if (check.detail && item.enabled) row.append(make('span', check.detail));
|
|
302
|
+
row.append(button(item.enabled ? 'Turn off' : 'Turn on', async () => { await api(`/api/upstreams/${item.id}`, 'PATCH', { enabled: !item.enabled }); await refresh(); status(`${item.name} turned ${item.enabled ? 'off' : 'on'} immediately. Refresh the tool list in a client that caches it.`); }));
|
|
303
|
+
if (item.enabled && item.transport !== 'cli') row.append(button('Check connection', async () => { await api(`/api/upstreams/${item.id}/check`, 'POST'); await refresh(); }));
|
|
207
304
|
row.append(button('Remove', async () => { if (confirm(`Remove server ${item.name}?`)) { await api(`/api/upstreams/${item.id}`, 'DELETE'); await refresh(); } }, 'danger'));
|
|
208
305
|
container.append(row);
|
|
209
306
|
}
|
|
210
307
|
if (!state.upstreams.length) container.append(make('p', 'No MCP servers added yet. Choose a connection path below.'));
|
|
211
308
|
}
|
|
212
309
|
function renderPresets() {
|
|
213
|
-
const container = $('presets'); container.replaceChildren();
|
|
310
|
+
const container = mode === 'access' ? localGuideItems : $('presets'); container.replaceChildren();
|
|
311
|
+
localGuide.hidden = mode !== 'access';
|
|
214
312
|
const references = $('references'); references.replaceChildren();
|
|
215
313
|
for (const preset of presets) {
|
|
216
314
|
if (!preset.name) {
|
|
@@ -219,12 +317,17 @@ function renderPresets() {
|
|
|
219
317
|
const link = make('a', 'Official information'); link.href = preset.source; link.target = '_blank'; link.rel = 'noopener noreferrer'; row.append(link);
|
|
220
318
|
references.append(row); continue;
|
|
221
319
|
}
|
|
222
|
-
if (mode === 'access') continue;
|
|
223
320
|
const row = make('div', ''); row.className = 'row'; const detail = make('div', `${preset.label} · ${preset.note} `);
|
|
224
321
|
const link = make('a', 'Official information'); link.href = preset.source; link.target = '_blank'; link.rel = 'noopener noreferrer'; detail.append(link);
|
|
322
|
+
const install = installHelp[preset.name]?.[selectedOS];
|
|
323
|
+
if (install) {
|
|
324
|
+
detail.append(make('p', install.note));
|
|
325
|
+
const code = make('code', install.command); const pre = make('pre', ''); pre.append(code); detail.append(pre);
|
|
326
|
+
detail.append(button('Copy command', async () => { await navigator.clipboard.writeText(install.command); status(`${preset.label} ${osNames[selectedOS]} command copied.`); }));
|
|
327
|
+
}
|
|
225
328
|
row.append(detail);
|
|
226
|
-
if (state
|
|
227
|
-
else row.append(button('Add server (off)', async () => { await api('/api/upstreams', 'POST', { name: preset.name, enabled: false, transport: preset.transport, command: preset.command, args: preset.args || [], url: preset.url }); await refresh(); status(`${preset.label} added and off. Turn it on when ready.`); }));
|
|
329
|
+
if (mode !== 'access' && state?.upstreams.some((item) => item.name === preset.name)) row.append(make('span', 'Added'));
|
|
330
|
+
else if (mode !== 'access') row.append(button('Add server (off)', async () => { await api('/api/upstreams', 'POST', { name: preset.name, enabled: false, transport: preset.transport, command: preset.command, args: preset.args || [], url: preset.url }); await refresh(); status(`${preset.label} added and off. Turn it on when ready.`); }));
|
|
228
331
|
container.append(row);
|
|
229
332
|
}
|
|
230
333
|
}
|
|
@@ -258,9 +361,11 @@ function loadScope(scope) {
|
|
|
258
361
|
$('starts').value = localDate(m.engagement_window.start); $('ends').value = localDate(m.engagement_window.end);
|
|
259
362
|
$('profile').value = scope.profile; setLines('ips', m.authorized_targets.ip_ranges); setLines('domains', m.authorized_targets.domains);
|
|
260
363
|
setLines('urls', m.authorized_targets.urls); setLines('cloud', m.authorized_targets.cloud_accounts);
|
|
261
|
-
setLines('excluded-targets', m.excluded_targets); setLines('hosts', scope.allowedHosts); setLines('local-paths', m.authorized_local_paths || []);
|
|
364
|
+
setLines('excluded-targets', m.excluded_targets); setLines('hosts', scope.allowedHosts); setLines('local-paths', (m.authorized_local_paths || []).filter((path) => path !== '*'));
|
|
365
|
+
allLocalInput.checked = m.authorized_local_paths?.includes('*') || false;
|
|
262
366
|
setChecked(authorizedChoices, m.authorized_techniques); setChecked(excludedChoices, m.excluded_techniques);
|
|
263
367
|
for (const field of $('editor-card').querySelectorAll('input,select,textarea')) field.disabled = scope.status !== 'draft';
|
|
368
|
+
localPathInput.disabled = allLocalInput.checked || scope.status !== 'draft';
|
|
264
369
|
$('save-scope').disabled = scope.status !== 'draft';
|
|
265
370
|
$('editor-help').textContent = scope.status === 'draft' ? 'Editing a saved scope. Replace any example details and choose a future end date before approval.' : 'Viewing an immutable scope. Choose Duplicate to create an editable scope.';
|
|
266
371
|
reviewForm(); $('editor-card').scrollIntoView({ behavior: 'smooth' });
|
|
@@ -268,6 +373,7 @@ function loadScope(scope) {
|
|
|
268
373
|
function clearEditor() {
|
|
269
374
|
editing = null; viewingScopeId = null; dirty = false;
|
|
270
375
|
for (const id of ['engagement', 'client', 'operator', 'starts', 'ends', 'ips', 'domains', 'urls', 'cloud', 'excluded-targets', 'hosts', 'local-paths']) $(id).value = '';
|
|
376
|
+
allLocalInput.checked = false;
|
|
271
377
|
$('profile').value = mode === 'access' ? 'connected' : 'isolated'; setChecked(authorizedChoices, []); setChecked(excludedChoices, []);
|
|
272
378
|
for (const field of $('editor-card').querySelectorAll('input,select,textarea')) field.disabled = false;
|
|
273
379
|
$('save-scope').disabled = false; $('editor-help').textContent = 'New scope. Enter the client, exact authorized targets, window and techniques, then Save.'; reviewForm();
|
|
@@ -303,7 +409,7 @@ $('clear-selection').onclick = () => api('/api/my-scope', 'POST', { scopeId: nul
|
|
|
303
409
|
$('choose-local').onclick = () => chooseServerPath('local');
|
|
304
410
|
$('choose-remote').onclick = () => chooseServerPath('remote');
|
|
305
411
|
$('copy-local-command').onclick = async () => { try {
|
|
306
|
-
await navigator.clipboard.writeText($('local-command').textContent.trim()); status(
|
|
412
|
+
await navigator.clipboard.writeText($('local-command').textContent.trim()); status(`Local setup commands copied. Paste them into ${selectedOS === 'windows' ? 'PowerShell' : 'a terminal'} on the tester’s computer.`);
|
|
307
413
|
} catch { status('Copy failed. Select the commands above and copy them manually.', true); } };
|
|
308
414
|
$('up-transport').onchange = updateTransportFields;
|
|
309
415
|
$('add-user').onclick = async () => { try { await api('/api/users', 'POST', { email: $('user-email').value.trim(), role: $('user-role').value }); $('user-email').value = ''; await refresh(); } catch (error) { status(error.message, true); } };
|
|
@@ -347,8 +453,10 @@ async function initialize() {
|
|
|
347
453
|
bootstrapAdmins = new Set(session.bootstrapAdminEmails || []);
|
|
348
454
|
$('identity').textContent = email ? `${email} · ${role}` : 'Local gateway';
|
|
349
455
|
$('token-card').hidden = mode !== 'token';
|
|
350
|
-
for (const card of document.querySelectorAll('.admin-only')) card.hidden =
|
|
456
|
+
for (const card of document.querySelectorAll('.admin-only')) card.hidden = true;
|
|
351
457
|
configureServerUI();
|
|
458
|
+
$('token-card').querySelector('p').textContent = 'Paste the admin token printed when the gateway started. It stays in this browser tab only.';
|
|
459
|
+
updateInstallOS();
|
|
352
460
|
clearEditor();
|
|
353
461
|
if (mode === 'access' || token.value) await refresh();
|
|
354
462
|
reviewForm();
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Upstream } from "./state.js";
|
|
2
|
+
export declare const commandToolName = "run_local_command";
|
|
3
|
+
export declare function commandTool(upstream: Upstream): {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: "object";
|
|
8
|
+
properties: {
|
|
9
|
+
target: {
|
|
10
|
+
type: string;
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
required: string[];
|
|
15
|
+
additionalProperties: boolean;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export declare function commandTarget(upstream: Upstream, input: Record<string, unknown>): string;
|
|
19
|
+
export declare function runCommand(upstream: Upstream, target: string, signal?: AbortSignal, maxDurationMs?: number): Promise<string>;
|
|
20
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/gateway/command.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAK3C,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAEnD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ;;;;;;;;;;;;;;EAQ7C;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAmBxF;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,aAAa,SAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAkCxI"}
|