@provos/ironcurtain 0.3.1 → 0.4.1
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 +20 -1
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/index.js +12 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-servers.json +3 -0
- package/dist/config/types.d.ts +2 -0
- package/dist/config/user-config.d.ts +11 -0
- package/dist/config/user-config.js +56 -2
- package/dist/config/user-config.js.map +1 -1
- package/dist/docker/adapters/claude-code.d.ts +4 -0
- package/dist/docker/adapters/claude-code.js +35 -21
- package/dist/docker/adapters/claude-code.js.map +1 -1
- package/dist/docker/agent-adapter.d.ts +6 -12
- package/dist/docker/audit-log-tailer.d.ts +4 -3
- package/dist/docker/audit-log-tailer.js +9 -7
- package/dist/docker/audit-log-tailer.js.map +1 -1
- package/dist/docker/code-mode-proxy.d.ts +34 -0
- package/dist/docker/code-mode-proxy.js +137 -0
- package/dist/docker/code-mode-proxy.js.map +1 -0
- package/dist/docker/docker-agent-session.d.ts +17 -5
- package/dist/docker/docker-agent-session.js +171 -36
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-manager.js +106 -15
- package/dist/docker/docker-manager.js.map +1 -1
- package/dist/docker/mitm-proxy.d.ts +7 -4
- package/dist/docker/mitm-proxy.js +43 -13
- package/dist/docker/mitm-proxy.js.map +1 -1
- package/dist/docker/orientation.d.ts +3 -2
- package/dist/docker/orientation.js +6 -3
- package/dist/docker/orientation.js.map +1 -1
- package/dist/docker/platform.d.ts +20 -0
- package/dist/docker/platform.js +24 -0
- package/dist/docker/platform.js.map +1 -0
- package/dist/docker/types.d.ts +59 -7
- package/dist/sandbox/index.d.ts +25 -1
- package/dist/sandbox/index.js +78 -9
- package/dist/sandbox/index.js.map +1 -1
- package/dist/servers/fetch-server.d.ts +6 -1
- package/dist/servers/fetch-server.js +24 -12
- package/dist/servers/fetch-server.js.map +1 -1
- package/dist/session/agent-session.js +9 -5
- package/dist/session/agent-session.js.map +1 -1
- package/dist/session/index.js +18 -36
- package/dist/session/index.js.map +1 -1
- package/dist/session/preflight.js +6 -0
- package/dist/session/preflight.js.map +1 -1
- package/dist/session/prompts.d.ts +9 -3
- package/dist/session/prompts.js +28 -10
- package/dist/session/prompts.js.map +1 -1
- package/dist/signal/bot-command.d.ts +13 -0
- package/dist/signal/bot-command.js +54 -0
- package/dist/signal/bot-command.js.map +1 -0
- package/dist/signal/format.d.ts +31 -0
- package/dist/signal/format.js +101 -0
- package/dist/signal/format.js.map +1 -0
- package/dist/signal/index.d.ts +16 -0
- package/dist/signal/index.js +13 -0
- package/dist/signal/index.js.map +1 -0
- package/dist/signal/markdown-to-signal.d.ts +29 -0
- package/dist/signal/markdown-to-signal.js +154 -0
- package/dist/signal/markdown-to-signal.js.map +1 -0
- package/dist/signal/setup-signal.d.ts +48 -0
- package/dist/signal/setup-signal.js +443 -0
- package/dist/signal/setup-signal.js.map +1 -0
- package/dist/signal/signal-bot-daemon.d.ts +142 -0
- package/dist/signal/signal-bot-daemon.js +504 -0
- package/dist/signal/signal-bot-daemon.js.map +1 -0
- package/dist/signal/signal-config.d.ts +64 -0
- package/dist/signal/signal-config.js +53 -0
- package/dist/signal/signal-config.js.map +1 -0
- package/dist/signal/signal-container.d.ts +37 -0
- package/dist/signal/signal-container.js +112 -0
- package/dist/signal/signal-container.js.map +1 -0
- package/dist/signal/signal-transport.d.ts +34 -0
- package/dist/signal/signal-transport.js +70 -0
- package/dist/signal/signal-transport.js.map +1 -0
- package/dist/trusted-process/mcp-proxy-server.d.ts +111 -1
- package/dist/trusted-process/mcp-proxy-server.js +319 -247
- package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
- package/dist/trusted-process/path-utils.d.ts +5 -1
- package/dist/trusted-process/path-utils.js +47 -4
- package/dist/trusted-process/path-utils.js.map +1 -1
- package/dist/trusted-process/policy-engine.d.ts +3 -1
- package/dist/trusted-process/policy-engine.js +17 -6
- package/dist/trusted-process/policy-engine.js.map +1 -1
- package/dist/trusted-process/sandbox-integration.d.ts +11 -4
- package/dist/trusted-process/sandbox-integration.js +13 -7
- package/dist/trusted-process/sandbox-integration.js.map +1 -1
- package/dist/trusted-process/tcp-server-transport.d.ts +43 -0
- package/dist/trusted-process/tcp-server-transport.js +119 -0
- package/dist/trusted-process/tcp-server-transport.js.map +1 -0
- package/dist/types/argument-roles.d.ts +7 -0
- package/dist/types/argument-roles.js +30 -5
- package/dist/types/argument-roles.js.map +1 -1
- package/docker/Dockerfile.base.arm64 +23 -0
- package/package.json +9 -4
- package/src/config/mcp-servers.json +3 -0
- package/dist/docker/managed-proxy.d.ts +0 -27
- package/dist/docker/managed-proxy.js +0 -175
- package/dist/docker/managed-proxy.js.map +0 -1
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TCP server transport for the MCP SDK.
|
|
3
|
+
*
|
|
4
|
+
* Listens on a configurable TCP host and port and bridges each
|
|
5
|
+
* connection to the MCP SDK's Transport interface. Uses the same
|
|
6
|
+
* newline-delimited JSON framing as StdioServerTransport.
|
|
7
|
+
*
|
|
8
|
+
* This is the TCP equivalent of UdsServerTransport, used on macOS
|
|
9
|
+
* where Docker Desktop's VirtioFS does not support Unix domain
|
|
10
|
+
* sockets in bind mounts. The caller controls the bind address:
|
|
11
|
+
* 127.0.0.1 for loopback-only or 0.0.0.0 for all interfaces.
|
|
12
|
+
*
|
|
13
|
+
* Only one concurrent client is expected (the agent in the container).
|
|
14
|
+
* If a new connection arrives while one is active, the old connection
|
|
15
|
+
* is closed.
|
|
16
|
+
*/
|
|
17
|
+
import { createServer } from 'node:net';
|
|
18
|
+
import { ReadBuffer, serializeMessage } from '@modelcontextprotocol/sdk/shared/stdio.js';
|
|
19
|
+
export class TcpServerTransport {
|
|
20
|
+
host;
|
|
21
|
+
requestedPort;
|
|
22
|
+
server = null;
|
|
23
|
+
activeSocket = null;
|
|
24
|
+
readBuffer = new ReadBuffer();
|
|
25
|
+
_port = null;
|
|
26
|
+
onclose;
|
|
27
|
+
onerror;
|
|
28
|
+
onmessage;
|
|
29
|
+
constructor(host, port) {
|
|
30
|
+
this.host = host;
|
|
31
|
+
this.requestedPort = port;
|
|
32
|
+
}
|
|
33
|
+
/** The actual port the server is listening on. Only valid after start(). */
|
|
34
|
+
get port() {
|
|
35
|
+
if (this._port === null) {
|
|
36
|
+
throw new Error('TcpServerTransport has not been started');
|
|
37
|
+
}
|
|
38
|
+
return this._port;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Starts listening on the TCP port.
|
|
42
|
+
* Resolves once the server is bound and ready for connections.
|
|
43
|
+
* Idempotent: subsequent calls are no-ops (the MCP SDK's
|
|
44
|
+
* server.connect() calls start() internally).
|
|
45
|
+
*/
|
|
46
|
+
async start() {
|
|
47
|
+
if (this.server)
|
|
48
|
+
return;
|
|
49
|
+
const server = createServer((socket) => this.handleConnection(socket));
|
|
50
|
+
this.server = server;
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
server.on('error', (err) => {
|
|
53
|
+
reject(err);
|
|
54
|
+
});
|
|
55
|
+
server.listen(this.requestedPort, this.host, () => {
|
|
56
|
+
const addr = server.address();
|
|
57
|
+
if (addr && typeof addr === 'object') {
|
|
58
|
+
this._port = addr.port;
|
|
59
|
+
}
|
|
60
|
+
resolve();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- options included for Transport interface compliance
|
|
65
|
+
async send(message, options) {
|
|
66
|
+
const socket = this.activeSocket;
|
|
67
|
+
if (!socket || socket.destroyed) {
|
|
68
|
+
throw new Error('No active TCP connection to send message to');
|
|
69
|
+
}
|
|
70
|
+
return new Promise((resolve, reject) => {
|
|
71
|
+
const data = serializeMessage(message);
|
|
72
|
+
socket.write(data, (err) => {
|
|
73
|
+
if (err)
|
|
74
|
+
reject(err);
|
|
75
|
+
else
|
|
76
|
+
resolve();
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
async close() {
|
|
81
|
+
this.activeSocket?.destroy();
|
|
82
|
+
this.activeSocket = null;
|
|
83
|
+
const server = this.server;
|
|
84
|
+
if (server) {
|
|
85
|
+
this.server = null;
|
|
86
|
+
await new Promise((resolve) => {
|
|
87
|
+
server.close(() => resolve());
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
this.onclose?.();
|
|
91
|
+
}
|
|
92
|
+
handleConnection(socket) {
|
|
93
|
+
// Close any existing connection -- only one client expected
|
|
94
|
+
if (this.activeSocket && !this.activeSocket.destroyed) {
|
|
95
|
+
this.activeSocket.destroy();
|
|
96
|
+
}
|
|
97
|
+
this.activeSocket = socket;
|
|
98
|
+
this.readBuffer = new ReadBuffer();
|
|
99
|
+
socket.on('data', (chunk) => {
|
|
100
|
+
this.readBuffer.append(chunk);
|
|
101
|
+
this.processReadBuffer();
|
|
102
|
+
});
|
|
103
|
+
socket.on('error', (err) => {
|
|
104
|
+
this.onerror?.(err);
|
|
105
|
+
});
|
|
106
|
+
socket.on('close', () => {
|
|
107
|
+
if (this.activeSocket === socket) {
|
|
108
|
+
this.activeSocket = null;
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
processReadBuffer() {
|
|
113
|
+
let message;
|
|
114
|
+
while ((message = this.readBuffer.readMessage()) !== null) {
|
|
115
|
+
this.onmessage?.(message);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=tcp-server-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcp-server-transport.js","sourceRoot":"","sources":["../../src/trusted-process/tcp-server-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -74,5 +74,12 @@ export declare function getUrlRoles(): ArgumentRole[];
|
|
|
74
74
|
* `delete-history` are NOT sandbox-safe: even when the repo path is inside
|
|
75
75
|
* the sandbox, these operations require compiled rule evaluation (and
|
|
76
76
|
* typically human approval) because they can destroy git history.
|
|
77
|
+
*
|
|
78
|
+
* NOTE: The policy engine's filesystem sandbox fast path
|
|
79
|
+
* (structural-sandbox-allow in policy-engine.ts) assumes that the
|
|
80
|
+
* filesystem server only has sandbox-safe path roles and no other roles.
|
|
81
|
+
* If a non-sandbox-safe path role is ever added with
|
|
82
|
+
* serverNames including 'filesystem', the fast path must be updated
|
|
83
|
+
* to check for those roles before auto-allowing.
|
|
77
84
|
*/
|
|
78
85
|
export declare const SANDBOX_SAFE_PATH_ROLES: ReadonlySet<ArgumentRole>;
|
|
@@ -44,12 +44,30 @@ export function resolveRealPath(filePath) {
|
|
|
44
44
|
return realpathSync(absolute);
|
|
45
45
|
}
|
|
46
46
|
catch {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
// Walk up to find the deepest existing ancestor, resolve it, then reattach the tail.
|
|
48
|
+
// This handles cases like /tmp/nonexistent/file.txt on macOS where /tmp → /private/tmp
|
|
49
|
+
// but the intermediate directory doesn't exist yet.
|
|
50
|
+
let current = absolute;
|
|
51
|
+
const tail = [];
|
|
52
|
+
const MAX_DEPTH = 64;
|
|
53
|
+
for (let i = 0; i < MAX_DEPTH; i++) {
|
|
54
|
+
const parent = dirname(current);
|
|
55
|
+
tail.unshift(basename(current));
|
|
56
|
+
if (parent === current) {
|
|
57
|
+
// Reached filesystem root without finding an existing path
|
|
58
|
+
return absolute;
|
|
59
|
+
}
|
|
60
|
+
current = parent;
|
|
61
|
+
try {
|
|
62
|
+
return join(realpathSync(current), ...tail);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Continue walking up
|
|
66
|
+
}
|
|
52
67
|
}
|
|
68
|
+
// TODO: revisit whether falling back to the unresolved path has security
|
|
69
|
+
// implications in the policy engine (symlink-based sandbox escapes).
|
|
70
|
+
return absolute;
|
|
53
71
|
}
|
|
54
72
|
}
|
|
55
73
|
/** Identity function -- returns the value unchanged. */
|
|
@@ -254,6 +272,13 @@ export function getUrlRoles() {
|
|
|
254
272
|
* `delete-history` are NOT sandbox-safe: even when the repo path is inside
|
|
255
273
|
* the sandbox, these operations require compiled rule evaluation (and
|
|
256
274
|
* typically human approval) because they can destroy git history.
|
|
275
|
+
*
|
|
276
|
+
* NOTE: The policy engine's filesystem sandbox fast path
|
|
277
|
+
* (structural-sandbox-allow in policy-engine.ts) assumes that the
|
|
278
|
+
* filesystem server only has sandbox-safe path roles and no other roles.
|
|
279
|
+
* If a non-sandbox-safe path role is ever added with
|
|
280
|
+
* serverNames including 'filesystem', the fast path must be updated
|
|
281
|
+
* to check for those roles before auto-allowing.
|
|
257
282
|
*/
|
|
258
283
|
export const SANDBOX_SAFE_PATH_ROLES = new Set(['read-path', 'write-path', 'delete-path']);
|
|
259
284
|
//# sourceMappingURL=argument-roles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"argument-roles.js","sourceRoot":"","sources":["../../src/types/argument-roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AA2CnF,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,QAAQ,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IACvC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"argument-roles.js","sourceRoot":"","sources":["../../src/types/argument-roles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
FROM node:22-bookworm
|
|
2
|
+
|
|
3
|
+
# Replicate the 'codespace' user (uid 1000) from the devcontainers/universal
|
|
4
|
+
# image so Dockerfile.claude-code works unchanged on both platforms.
|
|
5
|
+
# node:22-bookworm already has node:node at uid/gid 1000 — rename it.
|
|
6
|
+
RUN usermod -l codespace -d /home/codespace -m node && \
|
|
7
|
+
groupmod -n codespace node
|
|
8
|
+
|
|
9
|
+
USER root
|
|
10
|
+
RUN apt-get update && \
|
|
11
|
+
apt-get install -y --no-install-recommends git socat ca-certificates && \
|
|
12
|
+
rm -rf /var/lib/apt/lists/*
|
|
13
|
+
|
|
14
|
+
# IronCurtain CA (for MITM proxy trust)
|
|
15
|
+
# This file is copied into a temporary build context by ensureImage().
|
|
16
|
+
COPY ironcurtain-ca-cert.pem /usr/local/share/ca-certificates/ironcurtain-ca.crt
|
|
17
|
+
RUN update-ca-certificates
|
|
18
|
+
|
|
19
|
+
RUN mkdir -p /workspace /etc/ironcurtain /run/ironcurtain && \
|
|
20
|
+
chown codespace:codespace /workspace /etc/ironcurtain /run/ironcurtain
|
|
21
|
+
|
|
22
|
+
WORKDIR /workspace
|
|
23
|
+
USER codespace
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@provos/ironcurtain",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Secure agent runtime with trusted process mediation",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"model-context-protocol"
|
|
27
27
|
],
|
|
28
28
|
"engines": {
|
|
29
|
-
"node": ">=
|
|
29
|
+
"node": ">=22.0.0 <26"
|
|
30
30
|
},
|
|
31
31
|
"bin": {
|
|
32
32
|
"ironcurtain": "dist/cli.js"
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"annotate-tools": "tsx src/cli.ts annotate-tools",
|
|
51
51
|
"compile-policy": "tsx src/cli.ts compile-policy",
|
|
52
52
|
"customize-policy": "tsx src/cli.ts customize-policy",
|
|
53
|
+
"bot": "tsx src/cli.ts bot",
|
|
53
54
|
"config": "tsx src/cli.ts config",
|
|
54
55
|
"setup": "tsx src/cli.ts setup",
|
|
55
56
|
"prepublishOnly": "npm run build",
|
|
@@ -57,7 +58,8 @@
|
|
|
57
58
|
"test:watch": "vitest",
|
|
58
59
|
"lint": "eslint src/ test/",
|
|
59
60
|
"format": "prettier --log-level=warn --write 'src/**/*.ts' 'test/**/*.ts'",
|
|
60
|
-
"format:check": "prettier --check 'src/**/*.ts' 'test/**/*.ts'"
|
|
61
|
+
"format:check": "prettier --check 'src/**/*.ts' 'test/**/*.ts'",
|
|
62
|
+
"setup-hooks": "cp .hooks/pre-commit .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit && echo 'Pre-commit hook installed.'"
|
|
61
63
|
},
|
|
62
64
|
"dependencies": {
|
|
63
65
|
"@ai-sdk/anthropic": "^3.0.44",
|
|
@@ -94,12 +96,15 @@
|
|
|
94
96
|
"@types/node-forge": "^1.3.14",
|
|
95
97
|
"@types/shell-quote": "^1.7.5",
|
|
96
98
|
"@types/turndown": "^5.0.6",
|
|
99
|
+
"@types/ws": "^8.18.1",
|
|
100
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
97
101
|
"eslint": "^10.0.1",
|
|
98
102
|
"eslint-config-prettier": "^10.1.8",
|
|
99
103
|
"prettier": "^3.8.1",
|
|
100
104
|
"tsx": "^4.19.0",
|
|
101
105
|
"typescript": "^5.7.0",
|
|
102
106
|
"typescript-eslint": "^8.56.0",
|
|
103
|
-
"vitest": "^4.0.18"
|
|
107
|
+
"vitest": "^4.0.18",
|
|
108
|
+
"ws": "^8.19.0"
|
|
104
109
|
}
|
|
105
110
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"filesystem": {
|
|
3
|
+
"description": "Read, write, search, and manage files and directories",
|
|
3
4
|
"command": "npx",
|
|
4
5
|
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp/ironcurtain-sandbox"],
|
|
5
6
|
"sandbox": false
|
|
6
7
|
},
|
|
7
8
|
"git": {
|
|
9
|
+
"description": "Git version control operations (commits, branches, diffs, etc.)",
|
|
8
10
|
"command": "node",
|
|
9
11
|
"args": ["node_modules/.bin/git-mcp-server"],
|
|
10
12
|
"env": {
|
|
@@ -20,6 +22,7 @@
|
|
|
20
22
|
}
|
|
21
23
|
},
|
|
22
24
|
"fetch": {
|
|
25
|
+
"description": "HTTP requests and web search",
|
|
23
26
|
"command": "tsx",
|
|
24
27
|
"args": ["./src/servers/fetch-server.ts"],
|
|
25
28
|
"sandbox": false,
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Manages the lifecycle of an MCP proxy server process for a Docker session.
|
|
3
|
-
*
|
|
4
|
-
* Spawns the proxy as a child process with PROXY_SOCKET_PATH set.
|
|
5
|
-
* The proxy process is the same mcp-proxy-server.ts used by the
|
|
6
|
-
* built-in session, just with a UDS transport instead of stdio.
|
|
7
|
-
*/
|
|
8
|
-
import type { ToolInfo } from './agent-adapter.js';
|
|
9
|
-
export interface ManagedProxy {
|
|
10
|
-
/** Start the proxy process. Resolves when the UDS is ready for connections. */
|
|
11
|
-
start(): Promise<void>;
|
|
12
|
-
/** Query available tools from the running proxy. */
|
|
13
|
-
listTools(): Promise<ToolInfo[]>;
|
|
14
|
-
/** Stop the proxy process and clean up the socket. */
|
|
15
|
-
stop(): Promise<void>;
|
|
16
|
-
/** The socket path the proxy is listening on. */
|
|
17
|
-
readonly socketPath: string;
|
|
18
|
-
}
|
|
19
|
-
export interface ManagedProxyOptions {
|
|
20
|
-
/** Absolute path for the UDS socket. */
|
|
21
|
-
readonly socketPath: string;
|
|
22
|
-
/** Environment variables to pass to the proxy process. */
|
|
23
|
-
readonly env: Record<string, string>;
|
|
24
|
-
/** Working directory for the proxy process. Defaults to process.cwd(). */
|
|
25
|
-
readonly cwd?: string;
|
|
26
|
-
}
|
|
27
|
-
export declare function createManagedProxy(options: ManagedProxyOptions): ManagedProxy;
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Manages the lifecycle of an MCP proxy server process for a Docker session.
|
|
3
|
-
*
|
|
4
|
-
* Spawns the proxy as a child process with PROXY_SOCKET_PATH set.
|
|
5
|
-
* The proxy process is the same mcp-proxy-server.ts used by the
|
|
6
|
-
* built-in session, just with a UDS transport instead of stdio.
|
|
7
|
-
*/
|
|
8
|
-
import { fork } from 'node:child_process';
|
|
9
|
-
import { existsSync } from 'node:fs';
|
|
10
|
-
import { setTimeout as delay } from 'node:timers/promises';
|
|
11
|
-
import { resolve, dirname } from 'node:path';
|
|
12
|
-
import { fileURLToPath } from 'node:url';
|
|
13
|
-
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
14
|
-
import { connect as netConnect } from 'node:net';
|
|
15
|
-
import { ReadBuffer, serializeMessage } from '@modelcontextprotocol/sdk/shared/stdio.js';
|
|
16
|
-
import { VERSION } from '../version.js';
|
|
17
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
18
|
-
/** Timeout for socket readiness polling. */
|
|
19
|
-
const SOCKET_READY_TIMEOUT_MS = 15_000;
|
|
20
|
-
const SOCKET_POLL_INTERVAL_MS = 50;
|
|
21
|
-
/** Path to the mcp-proxy-server module. */
|
|
22
|
-
function getProxyModulePath() {
|
|
23
|
-
// In compiled mode: dist/trusted-process/mcp-proxy-server.js
|
|
24
|
-
// In source mode: src/trusted-process/mcp-proxy-server.ts (needs tsx)
|
|
25
|
-
const compiledPath = resolve(__dirname, '..', 'trusted-process', 'mcp-proxy-server.js');
|
|
26
|
-
if (existsSync(compiledPath))
|
|
27
|
-
return compiledPath;
|
|
28
|
-
return resolve(__dirname, '..', 'trusted-process', 'mcp-proxy-server.ts');
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Creates a temporary MCP client connection to the UDS socket.
|
|
32
|
-
* Used for listTools() queries.
|
|
33
|
-
*/
|
|
34
|
-
class UdsClientTransport {
|
|
35
|
-
socket = null;
|
|
36
|
-
readBuffer = new ReadBuffer();
|
|
37
|
-
socketPath;
|
|
38
|
-
onclose;
|
|
39
|
-
onerror;
|
|
40
|
-
onmessage;
|
|
41
|
-
constructor(socketPath) {
|
|
42
|
-
this.socketPath = socketPath;
|
|
43
|
-
}
|
|
44
|
-
async start() {
|
|
45
|
-
return new Promise((resolve, reject) => {
|
|
46
|
-
this.socket = netConnect(this.socketPath, () => resolve());
|
|
47
|
-
this.socket.on('error', reject);
|
|
48
|
-
this.socket.on('data', (chunk) => {
|
|
49
|
-
this.readBuffer.append(chunk);
|
|
50
|
-
let message;
|
|
51
|
-
while ((message = this.readBuffer.readMessage()) !== null) {
|
|
52
|
-
this.onmessage?.(message);
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
this.socket.on('close', () => this.onclose?.());
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
async send(message) {
|
|
59
|
-
const socket = this.socket;
|
|
60
|
-
if (!socket || socket.destroyed) {
|
|
61
|
-
throw new Error('UDS client not connected');
|
|
62
|
-
}
|
|
63
|
-
return new Promise((resolve, reject) => {
|
|
64
|
-
socket.write(serializeMessage(message), (err) => {
|
|
65
|
-
if (err)
|
|
66
|
-
reject(err);
|
|
67
|
-
else
|
|
68
|
-
resolve();
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
// eslint-disable-next-line @typescript-eslint/require-await -- must be async to satisfy Transport interface
|
|
73
|
-
async close() {
|
|
74
|
-
this.socket?.destroy();
|
|
75
|
-
this.socket = null;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
export function createManagedProxy(options) {
|
|
79
|
-
let childProcess = null;
|
|
80
|
-
return {
|
|
81
|
-
socketPath: options.socketPath,
|
|
82
|
-
async start() {
|
|
83
|
-
const modulePath = getProxyModulePath();
|
|
84
|
-
const isTsSource = modulePath.endsWith('.ts');
|
|
85
|
-
// Fork the proxy process with PROXY_SOCKET_PATH set
|
|
86
|
-
const env = {
|
|
87
|
-
...process.env,
|
|
88
|
-
...options.env,
|
|
89
|
-
PROXY_SOCKET_PATH: options.socketPath,
|
|
90
|
-
};
|
|
91
|
-
const cwd = options.cwd ?? process.cwd();
|
|
92
|
-
if (isTsSource) {
|
|
93
|
-
// In development, use tsx to run TypeScript directly
|
|
94
|
-
const { spawn } = await import('node:child_process');
|
|
95
|
-
childProcess = spawn('npx', ['tsx', modulePath], {
|
|
96
|
-
env,
|
|
97
|
-
cwd,
|
|
98
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
childProcess = fork(modulePath, [], {
|
|
103
|
-
env,
|
|
104
|
-
cwd,
|
|
105
|
-
stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
// Capture stderr and exit for diagnostics
|
|
109
|
-
let proxyStderr = '';
|
|
110
|
-
let proxyExited = false;
|
|
111
|
-
let proxyExitCode = null;
|
|
112
|
-
childProcess.stderr?.on('data', (chunk) => {
|
|
113
|
-
proxyStderr += chunk.toString();
|
|
114
|
-
});
|
|
115
|
-
childProcess.on('error', (err) => {
|
|
116
|
-
console.error(`MCP proxy process error: ${err.message}`);
|
|
117
|
-
});
|
|
118
|
-
childProcess.on('exit', (code) => {
|
|
119
|
-
proxyExited = true;
|
|
120
|
-
proxyExitCode = code;
|
|
121
|
-
});
|
|
122
|
-
// Poll for socket readiness
|
|
123
|
-
const start = Date.now();
|
|
124
|
-
while (!existsSync(options.socketPath)) {
|
|
125
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- mutated by async 'exit' event handler
|
|
126
|
-
if (proxyExited) {
|
|
127
|
-
throw new Error(`MCP proxy process exited with code ${proxyExitCode} before creating socket.\nStderr: ${proxyStderr}`);
|
|
128
|
-
}
|
|
129
|
-
if (Date.now() - start > SOCKET_READY_TIMEOUT_MS) {
|
|
130
|
-
throw new Error(`MCP proxy did not create socket at ${options.socketPath} within ${SOCKET_READY_TIMEOUT_MS}ms.\nStderr: ${proxyStderr}`);
|
|
131
|
-
}
|
|
132
|
-
await delay(SOCKET_POLL_INTERVAL_MS);
|
|
133
|
-
}
|
|
134
|
-
},
|
|
135
|
-
async listTools() {
|
|
136
|
-
const transport = new UdsClientTransport(options.socketPath);
|
|
137
|
-
const client = new Client({ name: 'ironcurtain-tool-lister', version: VERSION }, {});
|
|
138
|
-
try {
|
|
139
|
-
await client.connect(transport);
|
|
140
|
-
const result = await client.listTools();
|
|
141
|
-
return result.tools.map((t) => ({
|
|
142
|
-
name: t.name,
|
|
143
|
-
description: t.description,
|
|
144
|
-
inputSchema: t.inputSchema,
|
|
145
|
-
}));
|
|
146
|
-
}
|
|
147
|
-
finally {
|
|
148
|
-
try {
|
|
149
|
-
await client.close();
|
|
150
|
-
}
|
|
151
|
-
catch {
|
|
152
|
-
/* ignore cleanup errors */
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
},
|
|
156
|
-
async stop() {
|
|
157
|
-
if (childProcess) {
|
|
158
|
-
childProcess.kill('SIGTERM');
|
|
159
|
-
// Give it a moment to clean up
|
|
160
|
-
await new Promise((resolve) => {
|
|
161
|
-
const timeout = setTimeout(() => {
|
|
162
|
-
childProcess?.kill('SIGKILL');
|
|
163
|
-
resolve();
|
|
164
|
-
}, 3000);
|
|
165
|
-
childProcess?.on('exit', () => {
|
|
166
|
-
clearTimeout(timeout);
|
|
167
|
-
resolve();
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
childProcess = null;
|
|
171
|
-
}
|
|
172
|
-
},
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
//# sourceMappingURL=managed-proxy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"managed-proxy.js","sourceRoot":"","sources":["../../src/docker/managed-proxy.ts"],"names":[],"mappings":"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"}
|