@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.
Files changed (101) hide show
  1. package/README.md +20 -1
  2. package/dist/cli.js +15 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config/index.js +12 -1
  5. package/dist/config/index.js.map +1 -1
  6. package/dist/config/mcp-servers.json +3 -0
  7. package/dist/config/types.d.ts +2 -0
  8. package/dist/config/user-config.d.ts +11 -0
  9. package/dist/config/user-config.js +56 -2
  10. package/dist/config/user-config.js.map +1 -1
  11. package/dist/docker/adapters/claude-code.d.ts +4 -0
  12. package/dist/docker/adapters/claude-code.js +35 -21
  13. package/dist/docker/adapters/claude-code.js.map +1 -1
  14. package/dist/docker/agent-adapter.d.ts +6 -12
  15. package/dist/docker/audit-log-tailer.d.ts +4 -3
  16. package/dist/docker/audit-log-tailer.js +9 -7
  17. package/dist/docker/audit-log-tailer.js.map +1 -1
  18. package/dist/docker/code-mode-proxy.d.ts +34 -0
  19. package/dist/docker/code-mode-proxy.js +137 -0
  20. package/dist/docker/code-mode-proxy.js.map +1 -0
  21. package/dist/docker/docker-agent-session.d.ts +17 -5
  22. package/dist/docker/docker-agent-session.js +171 -36
  23. package/dist/docker/docker-agent-session.js.map +1 -1
  24. package/dist/docker/docker-manager.js +106 -15
  25. package/dist/docker/docker-manager.js.map +1 -1
  26. package/dist/docker/mitm-proxy.d.ts +7 -4
  27. package/dist/docker/mitm-proxy.js +43 -13
  28. package/dist/docker/mitm-proxy.js.map +1 -1
  29. package/dist/docker/orientation.d.ts +3 -2
  30. package/dist/docker/orientation.js +6 -3
  31. package/dist/docker/orientation.js.map +1 -1
  32. package/dist/docker/platform.d.ts +20 -0
  33. package/dist/docker/platform.js +24 -0
  34. package/dist/docker/platform.js.map +1 -0
  35. package/dist/docker/types.d.ts +59 -7
  36. package/dist/sandbox/index.d.ts +25 -1
  37. package/dist/sandbox/index.js +78 -9
  38. package/dist/sandbox/index.js.map +1 -1
  39. package/dist/servers/fetch-server.d.ts +6 -1
  40. package/dist/servers/fetch-server.js +24 -12
  41. package/dist/servers/fetch-server.js.map +1 -1
  42. package/dist/session/agent-session.js +9 -5
  43. package/dist/session/agent-session.js.map +1 -1
  44. package/dist/session/index.js +18 -36
  45. package/dist/session/index.js.map +1 -1
  46. package/dist/session/preflight.js +6 -0
  47. package/dist/session/preflight.js.map +1 -1
  48. package/dist/session/prompts.d.ts +9 -3
  49. package/dist/session/prompts.js +28 -10
  50. package/dist/session/prompts.js.map +1 -1
  51. package/dist/signal/bot-command.d.ts +13 -0
  52. package/dist/signal/bot-command.js +54 -0
  53. package/dist/signal/bot-command.js.map +1 -0
  54. package/dist/signal/format.d.ts +31 -0
  55. package/dist/signal/format.js +101 -0
  56. package/dist/signal/format.js.map +1 -0
  57. package/dist/signal/index.d.ts +16 -0
  58. package/dist/signal/index.js +13 -0
  59. package/dist/signal/index.js.map +1 -0
  60. package/dist/signal/markdown-to-signal.d.ts +29 -0
  61. package/dist/signal/markdown-to-signal.js +154 -0
  62. package/dist/signal/markdown-to-signal.js.map +1 -0
  63. package/dist/signal/setup-signal.d.ts +48 -0
  64. package/dist/signal/setup-signal.js +443 -0
  65. package/dist/signal/setup-signal.js.map +1 -0
  66. package/dist/signal/signal-bot-daemon.d.ts +142 -0
  67. package/dist/signal/signal-bot-daemon.js +504 -0
  68. package/dist/signal/signal-bot-daemon.js.map +1 -0
  69. package/dist/signal/signal-config.d.ts +64 -0
  70. package/dist/signal/signal-config.js +53 -0
  71. package/dist/signal/signal-config.js.map +1 -0
  72. package/dist/signal/signal-container.d.ts +37 -0
  73. package/dist/signal/signal-container.js +112 -0
  74. package/dist/signal/signal-container.js.map +1 -0
  75. package/dist/signal/signal-transport.d.ts +34 -0
  76. package/dist/signal/signal-transport.js +70 -0
  77. package/dist/signal/signal-transport.js.map +1 -0
  78. package/dist/trusted-process/mcp-proxy-server.d.ts +111 -1
  79. package/dist/trusted-process/mcp-proxy-server.js +319 -247
  80. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  81. package/dist/trusted-process/path-utils.d.ts +5 -1
  82. package/dist/trusted-process/path-utils.js +47 -4
  83. package/dist/trusted-process/path-utils.js.map +1 -1
  84. package/dist/trusted-process/policy-engine.d.ts +3 -1
  85. package/dist/trusted-process/policy-engine.js +17 -6
  86. package/dist/trusted-process/policy-engine.js.map +1 -1
  87. package/dist/trusted-process/sandbox-integration.d.ts +11 -4
  88. package/dist/trusted-process/sandbox-integration.js +13 -7
  89. package/dist/trusted-process/sandbox-integration.js.map +1 -1
  90. package/dist/trusted-process/tcp-server-transport.d.ts +43 -0
  91. package/dist/trusted-process/tcp-server-transport.js +119 -0
  92. package/dist/trusted-process/tcp-server-transport.js.map +1 -0
  93. package/dist/types/argument-roles.d.ts +7 -0
  94. package/dist/types/argument-roles.js +30 -5
  95. package/dist/types/argument-roles.js.map +1 -1
  96. package/docker/Dockerfile.base.arm64 +23 -0
  97. package/package.json +9 -4
  98. package/src/config/mcp-servers.json +3 -0
  99. package/dist/docker/managed-proxy.d.ts +0 -27
  100. package/dist/docker/managed-proxy.js +0 -175
  101. 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
- try {
48
- return join(realpathSync(dirname(absolute)), basename(absolute));
49
- }
50
- catch {
51
- return absolute;
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;YACH,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,MAAM,eAAe,GAAqC;IACxD;QACE,WAAW;QACX;YACE,WAAW,EAAE,mCAAmC;YAChD,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,MAAM;YAChB,YAAY,EAAE,eAAe;YAC7B,kBAAkB,EAChB,yEAAyE;gBACzE,mDAAmD;YACrD,WAAW,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;SACnC;KACF;IACD;QACE,YAAY;QACZ;YACE,WAAW,EAAE,yCAAyC;YACtD,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,MAAM;YAChB,YAAY,EAAE,eAAe;YAC7B,kBAAkB,EAChB,+EAA+E;gBAC/E,gEAAgE;YAClE,WAAW,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;SACnC;KACF;IACD;QACE,aAAa;QACb;YACE,WAAW,EAAE,sCAAsC;YACnD,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,MAAM;YAChB,YAAY,EAAE,eAAe;YAC7B,kBAAkB,EAChB,gFAAgF;gBAChF,uFAAuF;YACzF,WAAW,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;SACnC;KACF;IACD;QACE,eAAe;QACf;YACE,WAAW,EAAE,qDAAqD;YAClE,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,MAAM;YAChB,YAAY,EAAE,eAAe;YAC7B,kBAAkB,EAChB,gGAAgG;gBAChG,sFAAsF;gBACtF,qFAAqF;YACvF,WAAW,EAAE,CAAC,KAAK,CAAC;SACrB;KACF;IACD;QACE,gBAAgB;QAChB;YACE,WAAW,EAAE,2DAA2D;YACxE,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,MAAM;YAChB,YAAY,EAAE,eAAe;YAC7B,kBAAkB,EAChB,8FAA8F;gBAC9F,oFAAoF;gBACpF,qFAAqF;YACvF,WAAW,EAAE,CAAC,KAAK,CAAC;SACrB;KACF;IACD;QACE,WAAW;QACX;YACE,WAAW,EAAE,sCAAsC;YACnD,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,YAAY;YAC1B,kBAAkB,EAChB,iEAAiE;gBACjE,8CAA8C;YAChD,WAAW,EAAE,CAAC,OAAO,CAAC;SACvB;KACF;IACD;QACE,gBAAgB;QAChB;YACE,WAAW,EAAE,uDAAuD;YACpE,oBAAoB,EAAE,IAAI;YAC1B,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,eAAe;YAC7B,kBAAkB,EAChB,sFAAsF;gBACtF,kGAAkG;YACpG,WAAW,EAAE,CAAC,KAAK,CAAC;SACrB;KACF;IACD;QACE,aAAa;QACb;YACE,WAAW,EAAE,iBAAiB;YAC9B,oBAAoB,EAAE,KAAK;YAC3B,QAAQ,EAAE,QAAQ;YAClB,YAAY,EAAE,QAAQ;YACtB,kBAAkB,EAChB,iDAAiD;gBACjD,2FAA2F;YAC7F,WAAW,EAAE,CAAC,KAAK,CAAC;SACrB;KACF;IACD;QACE,gBAAgB;QAChB;YACE,WAAW,EAAE,yBAAyB;YACtC,oBAAoB,EAAE,KAAK;YAC3B,QAAQ,EAAE,QAAQ;YAClB,YAAY,EAAE,QAAQ;YACtB,kBAAkB,EAAE,oDAAoD,GAAG,kCAAkC;YAC7G,WAAW,EAAE,CAAC,KAAK,CAAC;SACrB;KACF;IACD;QACE,MAAM;QACN;YACE,WAAW,EAAE,mDAAmD;YAChE,oBAAoB,EAAE,KAAK;YAC3B,QAAQ,EAAE,QAAQ;YAClB,YAAY,EAAE,QAAQ;YACtB,kBAAkB,EAChB,kEAAkE;gBAClE,gFAAgF;SACnF;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAA8C,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;AAE1G,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,6DAA6D;AAC7D,MAAM,wBAAwB,GAA+B;IAC3D,WAAW,EAAE,IAAI;IACjB,YAAY,EAAE,IAAI;IAClB,aAAa,EAAE,IAAI;IACnB,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,IAAI;IACtB,WAAW,EAAE,IAAI;IACjB,gBAAgB,EAAE,IAAI;IACtB,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,IAAI;IACtB,IAAI,EAAE,IAAI;CACX,CAAC;AAEF,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,uEAAuE;AACvE,MAAM,UAAU,iBAAiB,CAAC,IAAkB;IAClD,MAAM,GAAG,GAAG,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,gBAAgB;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC;SACtC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,oBAAoB,CAAC;SAC7C,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,sBAAsB,CAAC,GAAG,CAAC,KAAqB,CAAC,CAAC;AAC3D,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,qBAAqB;IACnC,MAAM,KAAK,GAAG,CAAC,GAAG,sBAAsB,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,OAAO,KAA0C,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,OAAO,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAC9C,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CACtE,CAAC;AACJ,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,kBAAkB,CAAC,QAAsB;IACvD,OAAO,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC;SACtC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC;SAC9C,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,YAAY;IAC1B,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,WAAW;IACzB,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA8B,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,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.1",
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": ">=20.19.0"
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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"}