@provos/ironcurtain 0.4.0 → 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/dist/config/index.js +6 -0
- 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/docker/adapters/claude-code.d.ts +4 -0
- package/dist/docker/adapters/claude-code.js +32 -29
- package/dist/docker/adapters/claude-code.js.map +1 -1
- package/dist/docker/agent-adapter.d.ts +4 -12
- 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 +7 -6
- package/dist/docker/docker-agent-session.js +94 -40
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-manager.js +24 -0
- package/dist/docker/docker-manager.js.map +1 -1
- package/dist/docker/orientation.d.ts +3 -2
- package/dist/docker/orientation.js +3 -3
- package/dist/docker/orientation.js.map +1 -1
- package/dist/docker/types.d.ts +12 -2
- 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 +3 -31
- 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/trusted-process/mcp-proxy-server.d.ts +111 -1
- package/dist/trusted-process/mcp-proxy-server.js +307 -266
- package/dist/trusted-process/mcp-proxy-server.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/types/argument-roles.d.ts +7 -0
- package/dist/types/argument-roles.js +12 -2
- package/dist/types/argument-roles.js.map +1 -1
- package/package.json +4 -2
- package/src/config/mcp-servers.json +3 -0
- package/dist/docker/managed-proxy.d.ts +0 -31
- package/dist/docker/managed-proxy.js +0 -265
- package/dist/docker/managed-proxy.js.map +0 -1
|
@@ -1,265 +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, readFileSync, unlinkSync } 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 via TCP.
|
|
32
|
-
* Used for listTools() queries in TCP mode.
|
|
33
|
-
*/
|
|
34
|
-
class TcpClientTransport {
|
|
35
|
-
socket = null;
|
|
36
|
-
readBuffer = new ReadBuffer();
|
|
37
|
-
host;
|
|
38
|
-
port;
|
|
39
|
-
onclose;
|
|
40
|
-
onerror;
|
|
41
|
-
onmessage;
|
|
42
|
-
constructor(host, port) {
|
|
43
|
-
this.host = host;
|
|
44
|
-
this.port = port;
|
|
45
|
-
}
|
|
46
|
-
async start() {
|
|
47
|
-
return new Promise((resolve, reject) => {
|
|
48
|
-
this.socket = netConnect({ host: this.host, port: this.port }, () => resolve());
|
|
49
|
-
this.socket.on('error', reject);
|
|
50
|
-
this.socket.on('data', (chunk) => {
|
|
51
|
-
this.readBuffer.append(chunk);
|
|
52
|
-
let message;
|
|
53
|
-
while ((message = this.readBuffer.readMessage()) !== null) {
|
|
54
|
-
this.onmessage?.(message);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
this.socket.on('close', () => this.onclose?.());
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
async send(message) {
|
|
61
|
-
const socket = this.socket;
|
|
62
|
-
if (!socket || socket.destroyed) {
|
|
63
|
-
throw new Error('TCP client not connected');
|
|
64
|
-
}
|
|
65
|
-
return new Promise((resolve, reject) => {
|
|
66
|
-
socket.write(serializeMessage(message), (err) => {
|
|
67
|
-
if (err)
|
|
68
|
-
reject(err);
|
|
69
|
-
else
|
|
70
|
-
resolve();
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
// eslint-disable-next-line @typescript-eslint/require-await -- must be async to satisfy Transport interface
|
|
75
|
-
async close() {
|
|
76
|
-
this.socket?.destroy();
|
|
77
|
-
this.socket = null;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Creates a temporary MCP client connection to the UDS socket.
|
|
82
|
-
* Used for listTools() queries.
|
|
83
|
-
*/
|
|
84
|
-
class UdsClientTransport {
|
|
85
|
-
socket = null;
|
|
86
|
-
readBuffer = new ReadBuffer();
|
|
87
|
-
socketPath;
|
|
88
|
-
onclose;
|
|
89
|
-
onerror;
|
|
90
|
-
onmessage;
|
|
91
|
-
constructor(socketPath) {
|
|
92
|
-
this.socketPath = socketPath;
|
|
93
|
-
}
|
|
94
|
-
async start() {
|
|
95
|
-
return new Promise((resolve, reject) => {
|
|
96
|
-
this.socket = netConnect(this.socketPath, () => resolve());
|
|
97
|
-
this.socket.on('error', reject);
|
|
98
|
-
this.socket.on('data', (chunk) => {
|
|
99
|
-
this.readBuffer.append(chunk);
|
|
100
|
-
let message;
|
|
101
|
-
while ((message = this.readBuffer.readMessage()) !== null) {
|
|
102
|
-
this.onmessage?.(message);
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
this.socket.on('close', () => this.onclose?.());
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
async send(message) {
|
|
109
|
-
const socket = this.socket;
|
|
110
|
-
if (!socket || socket.destroyed) {
|
|
111
|
-
throw new Error('UDS client not connected');
|
|
112
|
-
}
|
|
113
|
-
return new Promise((resolve, reject) => {
|
|
114
|
-
socket.write(serializeMessage(message), (err) => {
|
|
115
|
-
if (err)
|
|
116
|
-
reject(err);
|
|
117
|
-
else
|
|
118
|
-
resolve();
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
// eslint-disable-next-line @typescript-eslint/require-await -- must be async to satisfy Transport interface
|
|
123
|
-
async close() {
|
|
124
|
-
this.socket?.destroy();
|
|
125
|
-
this.socket = null;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
export function createManagedProxy(options) {
|
|
129
|
-
let childProcess = null;
|
|
130
|
-
const useTcp = options.listenMode === 'tcp';
|
|
131
|
-
let resolvedPort;
|
|
132
|
-
// In TCP mode, the proxy writes its port to this file after binding
|
|
133
|
-
const portFilePath = resolve(dirname(options.socketPath), 'proxy-port.txt');
|
|
134
|
-
return {
|
|
135
|
-
socketPath: options.socketPath,
|
|
136
|
-
get port() {
|
|
137
|
-
return resolvedPort;
|
|
138
|
-
},
|
|
139
|
-
async start() {
|
|
140
|
-
// Remove stale port file from a prior crashed run to prevent
|
|
141
|
-
// false readiness during polling.
|
|
142
|
-
if (useTcp) {
|
|
143
|
-
try {
|
|
144
|
-
unlinkSync(portFilePath);
|
|
145
|
-
}
|
|
146
|
-
catch {
|
|
147
|
-
/* file may not exist */
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
const modulePath = getProxyModulePath();
|
|
151
|
-
const isTsSource = modulePath.endsWith('.ts');
|
|
152
|
-
// Fork the proxy process with the appropriate transport env vars
|
|
153
|
-
const env = {
|
|
154
|
-
...process.env,
|
|
155
|
-
...options.env,
|
|
156
|
-
};
|
|
157
|
-
if (useTcp) {
|
|
158
|
-
// Ensure UDS-specific env vars do not leak from the parent environment
|
|
159
|
-
delete env.PROXY_SOCKET_PATH;
|
|
160
|
-
env.PROXY_TCP_PORT = '0'; // OS-assigned port
|
|
161
|
-
env.PROXY_PORT_FILE = portFilePath;
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
// Ensure TCP-specific env vars do not leak from the parent environment
|
|
165
|
-
delete env.PROXY_TCP_PORT;
|
|
166
|
-
delete env.PROXY_PORT_FILE;
|
|
167
|
-
env.PROXY_SOCKET_PATH = options.socketPath;
|
|
168
|
-
}
|
|
169
|
-
const cwd = options.cwd ?? process.cwd();
|
|
170
|
-
if (isTsSource) {
|
|
171
|
-
// In development, use tsx to run TypeScript directly
|
|
172
|
-
const { spawn } = await import('node:child_process');
|
|
173
|
-
childProcess = spawn('npx', ['tsx', modulePath], {
|
|
174
|
-
env,
|
|
175
|
-
cwd,
|
|
176
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
childProcess = fork(modulePath, [], {
|
|
181
|
-
env,
|
|
182
|
-
cwd,
|
|
183
|
-
stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
// Capture stderr and exit for diagnostics
|
|
187
|
-
let proxyStderr = '';
|
|
188
|
-
let proxyExited = false;
|
|
189
|
-
let proxyExitCode = null;
|
|
190
|
-
childProcess.stderr?.on('data', (chunk) => {
|
|
191
|
-
proxyStderr += chunk.toString();
|
|
192
|
-
});
|
|
193
|
-
childProcess.on('error', (err) => {
|
|
194
|
-
console.error(`MCP proxy process error: ${err.message}`);
|
|
195
|
-
});
|
|
196
|
-
childProcess.on('exit', (code) => {
|
|
197
|
-
proxyExited = true;
|
|
198
|
-
proxyExitCode = code;
|
|
199
|
-
});
|
|
200
|
-
// Poll for readiness: port file in TCP mode, socket file in UDS mode
|
|
201
|
-
const readinessTarget = useTcp ? portFilePath : options.socketPath;
|
|
202
|
-
const start = Date.now();
|
|
203
|
-
while (!existsSync(readinessTarget)) {
|
|
204
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- mutated by async 'exit' event handler
|
|
205
|
-
if (proxyExited) {
|
|
206
|
-
throw new Error(`MCP proxy process exited with code ${proxyExitCode} before becoming ready.\nStderr: ${proxyStderr}`);
|
|
207
|
-
}
|
|
208
|
-
if (Date.now() - start > SOCKET_READY_TIMEOUT_MS) {
|
|
209
|
-
throw new Error(`MCP proxy did not become ready within ${SOCKET_READY_TIMEOUT_MS}ms.\nStderr: ${proxyStderr}`);
|
|
210
|
-
}
|
|
211
|
-
await delay(SOCKET_POLL_INTERVAL_MS);
|
|
212
|
-
}
|
|
213
|
-
// In TCP mode, read the port from the file
|
|
214
|
-
if (useTcp && portFilePath) {
|
|
215
|
-
const rawPort = readFileSync(portFilePath, 'utf-8').trim();
|
|
216
|
-
const parsedPort = parseInt(rawPort, 10);
|
|
217
|
-
if (!Number.isInteger(parsedPort) || parsedPort <= 0 || parsedPort > 65535) {
|
|
218
|
-
throw new Error(`Invalid TCP port "${rawPort}" read from ${portFilePath}.`);
|
|
219
|
-
}
|
|
220
|
-
resolvedPort = parsedPort;
|
|
221
|
-
}
|
|
222
|
-
},
|
|
223
|
-
async listTools() {
|
|
224
|
-
const transport = useTcp && resolvedPort !== undefined
|
|
225
|
-
? new TcpClientTransport('127.0.0.1', resolvedPort)
|
|
226
|
-
: new UdsClientTransport(options.socketPath);
|
|
227
|
-
const client = new Client({ name: 'ironcurtain-tool-lister', version: VERSION }, {});
|
|
228
|
-
try {
|
|
229
|
-
await client.connect(transport);
|
|
230
|
-
const result = await client.listTools();
|
|
231
|
-
return result.tools.map((t) => ({
|
|
232
|
-
name: t.name,
|
|
233
|
-
description: t.description,
|
|
234
|
-
inputSchema: t.inputSchema,
|
|
235
|
-
}));
|
|
236
|
-
}
|
|
237
|
-
finally {
|
|
238
|
-
try {
|
|
239
|
-
await client.close();
|
|
240
|
-
}
|
|
241
|
-
catch {
|
|
242
|
-
/* ignore cleanup errors */
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
},
|
|
246
|
-
async stop() {
|
|
247
|
-
if (childProcess) {
|
|
248
|
-
childProcess.kill('SIGTERM');
|
|
249
|
-
// Give it a moment to clean up
|
|
250
|
-
await new Promise((resolve) => {
|
|
251
|
-
const timeout = setTimeout(() => {
|
|
252
|
-
childProcess?.kill('SIGKILL');
|
|
253
|
-
resolve();
|
|
254
|
-
}, 3000);
|
|
255
|
-
childProcess?.on('exit', () => {
|
|
256
|
-
clearTimeout(timeout);
|
|
257
|
-
resolve();
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
childProcess = null;
|
|
261
|
-
}
|
|
262
|
-
},
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
//# 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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"}
|