@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.
Files changed (52) hide show
  1. package/dist/config/index.js +6 -0
  2. package/dist/config/index.js.map +1 -1
  3. package/dist/config/mcp-servers.json +3 -0
  4. package/dist/config/types.d.ts +2 -0
  5. package/dist/docker/adapters/claude-code.d.ts +4 -0
  6. package/dist/docker/adapters/claude-code.js +32 -29
  7. package/dist/docker/adapters/claude-code.js.map +1 -1
  8. package/dist/docker/agent-adapter.d.ts +4 -12
  9. package/dist/docker/code-mode-proxy.d.ts +34 -0
  10. package/dist/docker/code-mode-proxy.js +137 -0
  11. package/dist/docker/code-mode-proxy.js.map +1 -0
  12. package/dist/docker/docker-agent-session.d.ts +7 -6
  13. package/dist/docker/docker-agent-session.js +94 -40
  14. package/dist/docker/docker-agent-session.js.map +1 -1
  15. package/dist/docker/docker-manager.js +24 -0
  16. package/dist/docker/docker-manager.js.map +1 -1
  17. package/dist/docker/orientation.d.ts +3 -2
  18. package/dist/docker/orientation.js +3 -3
  19. package/dist/docker/orientation.js.map +1 -1
  20. package/dist/docker/types.d.ts +12 -2
  21. package/dist/sandbox/index.d.ts +25 -1
  22. package/dist/sandbox/index.js +78 -9
  23. package/dist/sandbox/index.js.map +1 -1
  24. package/dist/servers/fetch-server.d.ts +6 -1
  25. package/dist/servers/fetch-server.js +24 -12
  26. package/dist/servers/fetch-server.js.map +1 -1
  27. package/dist/session/agent-session.js +9 -5
  28. package/dist/session/agent-session.js.map +1 -1
  29. package/dist/session/index.js +3 -31
  30. package/dist/session/index.js.map +1 -1
  31. package/dist/session/preflight.js +6 -0
  32. package/dist/session/preflight.js.map +1 -1
  33. package/dist/session/prompts.d.ts +9 -3
  34. package/dist/session/prompts.js +28 -10
  35. package/dist/session/prompts.js.map +1 -1
  36. package/dist/trusted-process/mcp-proxy-server.d.ts +111 -1
  37. package/dist/trusted-process/mcp-proxy-server.js +307 -266
  38. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  39. package/dist/trusted-process/policy-engine.d.ts +3 -1
  40. package/dist/trusted-process/policy-engine.js +17 -6
  41. package/dist/trusted-process/policy-engine.js.map +1 -1
  42. package/dist/trusted-process/sandbox-integration.d.ts +11 -4
  43. package/dist/trusted-process/sandbox-integration.js +13 -7
  44. package/dist/trusted-process/sandbox-integration.js.map +1 -1
  45. package/dist/types/argument-roles.d.ts +7 -0
  46. package/dist/types/argument-roles.js +12 -2
  47. package/dist/types/argument-roles.js.map +1 -1
  48. package/package.json +4 -2
  49. package/src/config/mcp-servers.json +3 -0
  50. package/dist/docker/managed-proxy.d.ts +0 -31
  51. package/dist/docker/managed-proxy.js +0 -265
  52. 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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"}