orbitx 0.1.1 → 0.1.3

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 (50) hide show
  1. package/Readme.md +65 -9
  2. package/dist/core/anthropic-provider.d.ts +15 -0
  3. package/dist/core/anthropic-provider.d.ts.map +1 -0
  4. package/dist/core/anthropic-provider.js +208 -0
  5. package/dist/core/anthropic-provider.js.map +1 -0
  6. package/dist/core/deepseek-provider.d.ts +1 -4
  7. package/dist/core/deepseek-provider.d.ts.map +1 -1
  8. package/dist/core/deepseek-provider.js +15 -15
  9. package/dist/core/deepseek-provider.js.map +1 -1
  10. package/dist/core/mcp-client.d.ts +0 -8
  11. package/dist/core/mcp-client.d.ts.map +1 -1
  12. package/dist/core/mcp-client.js +14 -20
  13. package/dist/core/mcp-client.js.map +1 -1
  14. package/dist/core/mcp-computer.d.ts +3 -5
  15. package/dist/core/mcp-computer.d.ts.map +1 -1
  16. package/dist/core/mcp-computer.js +71 -28
  17. package/dist/core/mcp-computer.js.map +1 -1
  18. package/dist/core/mcp-connection.d.ts +17 -0
  19. package/dist/core/mcp-connection.d.ts.map +1 -1
  20. package/dist/core/mcp-connection.js +24 -2
  21. package/dist/core/mcp-connection.js.map +1 -1
  22. package/dist/core/mcp-ipc-connection.d.ts +13 -14
  23. package/dist/core/mcp-ipc-connection.d.ts.map +1 -1
  24. package/dist/core/mcp-ipc-connection.js +75 -64
  25. package/dist/core/mcp-ipc-connection.js.map +1 -1
  26. package/dist/core/mcp-server.js +4 -4
  27. package/dist/core/mcp-server.js.map +1 -1
  28. package/dist/core/mcp-ws-connection.d.ts +45 -0
  29. package/dist/core/mcp-ws-connection.d.ts.map +1 -0
  30. package/dist/core/mcp-ws-connection.js +165 -0
  31. package/dist/core/mcp-ws-connection.js.map +1 -0
  32. package/dist/core/ollama-provider.d.ts +1 -4
  33. package/dist/core/ollama-provider.d.ts.map +1 -1
  34. package/dist/core/ollama-provider.js +16 -16
  35. package/dist/core/ollama-provider.js.map +1 -1
  36. package/dist/core/openai-provider.d.ts +15 -0
  37. package/dist/core/openai-provider.d.ts.map +1 -0
  38. package/dist/core/openai-provider.js +180 -0
  39. package/dist/core/openai-provider.js.map +1 -0
  40. package/dist/core/tool-schema-translator.d.ts +12 -2
  41. package/dist/core/tool-schema-translator.d.ts.map +1 -1
  42. package/dist/core/tool-schema-translator.js +29 -2
  43. package/dist/core/tool-schema-translator.js.map +1 -1
  44. package/dist/index.d.ts +3 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +3 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/sandbox.js +19 -3
  49. package/dist/sandbox.js.map +1 -1
  50. package/package.json +5 -2
@@ -2,54 +2,61 @@ import os from "os";
2
2
  import { randomUUID } from "crypto";
3
3
  import { spawn, execFileSync } from "child_process";
4
4
  import fs from "fs";
5
+ import net from "net";
5
6
  import path from "path";
7
+ import MCPIPCConnection from "./mcp-ipc-connection.js";
8
+ import MCPWSConnection from "./mcp-ws-connection.js";
6
9
  export class MCPComputer {
7
10
  #mountPath;
8
11
  #ports;
9
12
  #hostNetwork;
10
13
  #image;
11
- #ipcPath;
12
14
  #containerName;
13
15
  #child = null;
14
16
  #exitHandler = null;
17
+ #connectionMode;
18
+ #ipcPath;
19
+ #wsPort;
20
+ #wsToken;
15
21
  constructor(mountPath, ports, image = "orbitx-sandbox:0.1") {
16
- if (os.platform() === "win32") {
17
- throw new Error("This feature is not currently supported natively on Windows. " +
18
- "Please run via WSL, or use a Unix-like filesystem (this feature needs one).");
19
- }
22
+ this.#connectionMode = os.platform() === "win32" ? "ws" : "ipc";
20
23
  this.#hostNetwork = ports === "*";
21
- if (this.#hostNetwork && os.platform() !== "linux") {
22
- throw new Error("Host network mode (ports: \"*\") requires Docker's --network host, " +
23
- "which is only supported on Linux. Pass an explicit array of ports instead.");
24
- }
25
24
  this.#mountPath = path.resolve(mountPath);
26
25
  this.#ports = ports;
27
26
  this.#image = image;
28
- this.#ipcPath = `/tmp/mcp-server-${randomUUID()}`;
29
27
  this.#containerName = `mcp-sandbox-${randomUUID()}`;
28
+ this.#ipcPath = `/tmp/mcp-server-${randomUUID()}`;
29
+ this.#wsPort = 0;
30
+ this.#wsToken = randomUUID();
30
31
  }
31
- getIPCSocketPath() {
32
- return `${this.#ipcPath}/socket.sock`;
32
+ getConnection(wsHost = "localhost") {
33
+ if (this.#connectionMode === "ipc") {
34
+ return new MCPIPCConnection({
35
+ socketPath: `${this.#ipcPath}/socket.sock`,
36
+ mode: "client",
37
+ });
38
+ }
39
+ if (!this.#wsPort) {
40
+ throw new Error("getConnection() is only available in 'ws' mode after start() has resolved a port.");
41
+ }
42
+ return new MCPWSConnection({
43
+ mode: "client",
44
+ url: `ws://${wsHost}:${this.#wsPort}`,
45
+ token: this.#wsToken,
46
+ });
33
47
  }
34
48
  getPresentsHostPath() {
35
49
  return path.join(this.#mountPath, "presents");
36
50
  }
37
- isHostNetwork() {
38
- return this.#hostNetwork;
39
- }
40
- getPortUrl(port, host = "localhost") {
41
- if (!this.#hostNetwork && !this.#ports.includes(port)) {
42
- throw new Error(`Port ${port} was not exposed for this sandbox. ` +
43
- `Available ports: ${this.#ports.join(", ") || "none"}. ` +
44
- `Pass ports: "*" at construction time to allow any port.`);
45
- }
46
- return `http://${host}:${port}`;
47
- }
48
51
  #prepareHostPaths(containerUid = 1000, containerGid = 1000) {
49
52
  const workspaceHost = path.join(this.#mountPath, "workspace");
50
53
  const storageHost = path.join(this.#mountPath, "mcp-server-storage");
51
54
  const presentsHost = path.join(this.#mountPath, "presents");
52
- const dirs = [workspaceHost, storageHost, presentsHost, this.#ipcPath];
55
+ const userInputsHost = path.join(this.#mountPath, "user-inputs");
56
+ const dirs = [workspaceHost, storageHost, presentsHost, userInputsHost];
57
+ if (this.#connectionMode === "ipc") {
58
+ dirs.push(this.#ipcPath);
59
+ }
53
60
  for (const dir of dirs) {
54
61
  fs.mkdirSync(dir, { recursive: true });
55
62
  }
@@ -72,7 +79,25 @@ export class MCPComputer {
72
79
  }
73
80
  }
74
81
  }
75
- buildDockerArgs() {
82
+ /** Finds a free TCP port on the host by briefly binding to port 0. */
83
+ #pickFreePort() {
84
+ return new Promise((resolve, reject) => {
85
+ const srv = net.createServer();
86
+ srv.unref();
87
+ srv.on("error", reject);
88
+ srv.listen(0, () => {
89
+ const address = srv.address();
90
+ if (address && typeof address === "object") {
91
+ const port = address.port;
92
+ srv.close(() => resolve(port));
93
+ }
94
+ else {
95
+ srv.close(() => reject(new Error("Could not determine a free port.")));
96
+ }
97
+ });
98
+ });
99
+ }
100
+ #buildDockerArgs() {
76
101
  const workspaceHost = path.join(this.#mountPath, "workspace");
77
102
  const storageHost = path.join(this.#mountPath, "mcp-server-storage");
78
103
  const presentsHost = path.join(this.#mountPath, "presents");
@@ -84,9 +109,19 @@ export class MCPComputer {
84
109
  "-v", `${storageHost}:/home/ubuntu/mcp-data`,
85
110
  "-v", `${presentsHost}:/home/ubuntu/presents`,
86
111
  "-v", `${userInputsHost}:/home/ubuntu/user-inputs`,
87
- "-v", `${this.#ipcPath}:/tmp/mcp-server`,
88
112
  "-e", "PRESENT_PATH=/home/ubuntu/presents",
89
113
  ];
114
+ if (this.#connectionMode === "ipc") {
115
+ args.push("-v", `${this.#ipcPath}:/tmp/mcp-server`);
116
+ args.push("-e", "CONNECTION_MODE=IPC");
117
+ args.push("-e", "CONNECTION_PATH=/tmp/mcp-server/socket.sock");
118
+ }
119
+ else {
120
+ args.push("-e", "CONNECTION_MODE=WS");
121
+ args.push("-e", "CONNECTION_HOST=0.0.0.0");
122
+ args.push("-e", `CONNECTION_PORT=${this.#wsPort}`);
123
+ args.push("-e", `CONNECTION_TOKEN=${this.#wsToken}`);
124
+ }
90
125
  if (this.#hostNetwork) {
91
126
  args.push("--network", "host");
92
127
  }
@@ -94,13 +129,21 @@ export class MCPComputer {
94
129
  for (const port of this.#ports) {
95
130
  args.push("-p", `${port}:${port}`);
96
131
  }
132
+ // The WS control channel needs its own published port too, since
133
+ // it isn't part of the user-facing #ports list.
134
+ if (this.#connectionMode === "ws") {
135
+ args.push("-p", `${this.#wsPort}:${this.#wsPort}`);
136
+ }
97
137
  }
98
138
  args.push(this.#image);
99
139
  return args;
100
140
  }
101
- start() {
141
+ async start() {
142
+ if (this.#connectionMode === "ws") {
143
+ this.#wsPort = await this.#pickFreePort();
144
+ }
102
145
  this.#prepareHostPaths();
103
- const args = this.buildDockerArgs();
146
+ const args = this.#buildDockerArgs();
104
147
  const child = spawn("docker", args, { stdio: "ignore" });
105
148
  this.#child = child;
106
149
  this.#exitHandler = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-computer.js","sourceRoot":"","sources":["../../src/core/mcp-computer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-computer.js","sourceRoot":"","sources":["../../src/core/mcp-computer.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,21 @@
1
1
  import EventEmitter from "events";
2
+ /**
3
+ * Base class for all MCP connections.
4
+ *
5
+ * Two logical, one-directional channels are defined:
6
+ * - "write_to_server" -> received by the server side as "server_read"
7
+ * - "write_to_client" -> received by the client side as "client_read"
8
+ *
9
+ * This keeps client writes from looping back to the client (and vice versa)
10
+ * once a connection is shared/subscribed by both a client and a server on
11
+ * the same object, which was the bug with the old single "write"/"read" pair.
12
+ *
13
+ * Subclasses that talk to a real transport (IPC socket, WebSocket, etc.)
14
+ * should pass `overrided = true` and implement their own wiring: forward
15
+ * "write_to_server"/"write_to_client" over the wire, and emit
16
+ * "server_read"/"client_read" locally depending on which role the transport
17
+ * is currently playing.
18
+ */
2
19
  export declare class MCPConnection extends EventEmitter {
3
20
  constructor(overrided?: boolean);
4
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-connection.d.ts","sourceRoot":"","sources":["../../src/core/mcp-connection.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,qBAAa,aAAc,SAAQ,YAAY;gBAC/B,SAAS,GAAE,OAAe;CAMzC;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"mcp-connection.d.ts","sourceRoot":"","sources":["../../src/core/mcp-connection.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,aAAc,SAAQ,YAAY;gBAC/B,SAAS,GAAE,OAAe;CAWzC;AAED,eAAe,aAAa,CAAC"}
@@ -1,9 +1,31 @@
1
1
  import EventEmitter from "events";
2
+ /**
3
+ * Base class for all MCP connections.
4
+ *
5
+ * Two logical, one-directional channels are defined:
6
+ * - "write_to_server" -> received by the server side as "server_read"
7
+ * - "write_to_client" -> received by the client side as "client_read"
8
+ *
9
+ * This keeps client writes from looping back to the client (and vice versa)
10
+ * once a connection is shared/subscribed by both a client and a server on
11
+ * the same object, which was the bug with the old single "write"/"read" pair.
12
+ *
13
+ * Subclasses that talk to a real transport (IPC socket, WebSocket, etc.)
14
+ * should pass `overrided = true` and implement their own wiring: forward
15
+ * "write_to_server"/"write_to_client" over the wire, and emit
16
+ * "server_read"/"client_read" locally depending on which role the transport
17
+ * is currently playing.
18
+ */
2
19
  export class MCPConnection extends EventEmitter {
3
20
  constructor(overrided = false) {
4
21
  super();
5
- if (!overrided)
6
- this.on("write", (data) => this.emit("read", data));
22
+ if (!overrided) {
23
+ // Loopback mode (e.g. same-process client+server for testing):
24
+ // whatever is written to the server is what the server reads,
25
+ // whatever is written to the client is what the client reads.
26
+ this.on("write_to_server", (data) => this.emit("server_read", data));
27
+ this.on("write_to_client", (data) => this.emit("client_read", data));
28
+ }
7
29
  }
8
30
  }
9
31
  export default MCPConnection;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-connection.js","sourceRoot":"","sources":["../../src/core/mcp-connection.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC3C,YAAY,YAAqB,KAAK;QAClC,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,SAAS;YACV,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;IAC3D,CAAC;CACJ;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"mcp-connection.js","sourceRoot":"","sources":["../../src/core/mcp-connection.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC3C,YAAY,YAAqB,KAAK;QAClC,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,+DAA+D;YAC/D,8DAA8D;YAC9D,8DAA8D;YAC9D,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;YACrE,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;QACzE,CAAC;IACL,CAAC;CACJ;AAED,eAAe,aAAa,CAAC"}
@@ -1,20 +1,19 @@
1
1
  import MCPConnection from "./mcp-connection.js";
2
+ export interface MCPIPCConnectionOptions {
3
+ /** Filesystem path of the IPC socket. */
4
+ socketPath: string;
5
+ /**
6
+ * "server": bind the socket and listen for a peer to connect.
7
+ * "client": connect out to an existing socket.
8
+ */
9
+ mode: "server" | "client";
10
+ /** Reconnect delay (ms) for client mode after a disconnect. Default 500. */
11
+ reconnectDelay?: number;
12
+ }
2
13
  export declare class MCPIPCConnection extends MCPConnection {
3
- private readonly socketPath;
4
- private socket;
5
- private server;
6
- private role;
7
- private writeBuffer;
8
- private readBuffer;
9
- constructor(socketPath: string);
14
+ #private;
15
+ constructor(options: MCPIPCConnectionOptions);
10
16
  close(): void;
11
- private _tryConnect;
12
- private _becomeServer;
13
- private _attachSocket;
14
- private _sendJSON;
15
- private _handleIncoming;
16
- private _cleanSocketFile;
17
- private _maybeReconnect;
18
17
  }
19
18
  export default MCPIPCConnection;
20
19
  //# sourceMappingURL=mcp-ipc-connection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-ipc-connection.d.ts","sourceRoot":"","sources":["../../src/core/mcp-ipc-connection.ts"],"names":[],"mappings":"AAEA,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAIhD,qBAAa,gBAAiB,SAAQ,aAAa;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,UAAU,CAAM;gBAEZ,UAAU,EAAE,MAAM;IAa9B,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,SAAS;IAkBjB,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,eAAe;CAQ1B;AAED,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"mcp-ipc-connection.d.ts","sourceRoot":"","sources":["../../src/core/mcp-ipc-connection.ts"],"names":[],"mappings":"AAEA,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAEhD,MAAM,WAAW,uBAAuB;IACpC,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,gBAAiB,SAAQ,aAAa;;gBAQnC,OAAO,EAAE,uBAAuB;IAkB5C,KAAK,IAAI,IAAI;CA4HhB;AAED,eAAe,gBAAgB,CAAC"}
@@ -2,78 +2,83 @@ import * as net from "net";
2
2
  import * as fs from "fs";
3
3
  import MCPConnection from "./mcp-connection.js";
4
4
  export class MCPIPCConnection extends MCPConnection {
5
- socketPath;
6
- socket = null;
7
- server = null;
8
- role = "pending";
9
- writeBuffer = [];
10
- readBuffer = "";
11
- constructor(socketPath) {
5
+ #options;
6
+ #socket = null;
7
+ #server = null;
8
+ #writeBuffer = [];
9
+ #readBuffer = "";
10
+ #closed = false;
11
+ constructor(options) {
12
12
  super(true);
13
- this.socketPath = socketPath;
14
- this.on("write", (data) => {
15
- this._sendJSON(data);
13
+ this.#options = options;
14
+ this.on("write_to_server", (data) => {
15
+ if (this.#options.mode === "client")
16
+ this.#sendJSON(data);
16
17
  });
17
- setTimeout(() => {
18
- this._tryConnect();
19
- }, Math.random() * 200); // Pervent Race Condtion
18
+ this.on("write_to_client", (data) => {
19
+ if (this.#options.mode === "server")
20
+ this.#sendJSON(data);
21
+ });
22
+ if (this.#options.mode === "server") {
23
+ this.#startServer();
24
+ }
25
+ else {
26
+ this.#connectClient();
27
+ }
20
28
  }
21
29
  close() {
22
- this.socket?.destroy();
23
- this.server?.close();
24
- this._cleanSocketFile();
30
+ this.#closed = true;
31
+ this.#socket?.destroy();
32
+ this.#server?.close();
33
+ if (this.#options.mode === "server") {
34
+ this.#cleanSocketFile();
35
+ }
25
36
  }
26
- _tryConnect() {
27
- const sock = net.createConnection({ path: this.socketPath });
28
- sock.once("connect", () => {
29
- this.role = "client";
30
- this.emit("role", "client");
31
- this._attachSocket(sock);
37
+ #startServer() {
38
+ this.emit("role", "server");
39
+ this.#cleanSocketFile();
40
+ const srv = net.createServer((peer) => {
41
+ this.#attachSocket(peer);
32
42
  });
33
- sock.once("error", (err) => {
34
- if (err.code === "ENOENT" || err.code === "ECONNREFUSED") {
35
- sock.destroy();
36
- this._becomeServer();
37
- }
38
- else {
39
- this.emit("error", err);
40
- }
43
+ srv.on("error", (err) => this.emit("error", err));
44
+ srv.listen({ path: this.#options.socketPath }, () => {
45
+ this.#server = srv;
46
+ this.emit("listening", this.#options.socketPath);
41
47
  });
42
48
  }
43
- _becomeServer() {
44
- this._cleanSocketFile();
45
- const srv = net.createServer((peer) => {
46
- this.role = "server";
47
- this.emit("role", "server");
48
- srv.close();
49
- this._attachSocket(peer);
49
+ #connectClient() {
50
+ this.emit("role", "client");
51
+ const sock = net.createConnection({ path: this.#options.socketPath });
52
+ sock.once("connect", () => {
53
+ this.#attachSocket(sock);
50
54
  });
51
- srv.on("error", (err) => this.emit("error", err));
52
- srv.listen({ path: this.socketPath }, () => {
53
- this.server = srv;
54
- this.emit("listening", this.socketPath);
55
+ sock.once("error", (err) => {
56
+ this.emit("error", err);
57
+ this.#maybeReconnect();
55
58
  });
56
59
  }
57
- _attachSocket(sock) {
58
- this.socket = sock;
59
- for (const chunk of this.writeBuffer) {
60
+ #attachSocket(sock) {
61
+ this.#socket = sock;
62
+ for (const chunk of this.#writeBuffer) {
60
63
  sock.write(chunk);
61
64
  }
62
- this.writeBuffer = [];
65
+ this.#writeBuffer = [];
63
66
  sock.setEncoding("utf8");
64
67
  sock.on("data", (chunk) => {
65
- this._handleIncoming(chunk);
68
+ this.#handleIncoming(chunk);
66
69
  });
67
70
  sock.on("end", () => {
68
71
  this.emit("disconnected");
69
- this._maybeReconnect();
72
+ if (this.#socket === sock)
73
+ this.#socket = null;
74
+ this.#maybeReconnect();
70
75
  });
71
76
  sock.on("error", (err) => {
72
77
  this.emit("error", err);
73
78
  });
74
- this.emit("connected", this.role);
79
+ this.emit("connected", this.#options.mode);
75
80
  }
76
- _sendJSON(data) {
81
+ #sendJSON(data) {
77
82
  let line;
78
83
  try {
79
84
  line = JSON.stringify(data) + "\n";
@@ -83,42 +88,48 @@ export class MCPIPCConnection extends MCPConnection {
83
88
  return;
84
89
  }
85
90
  const chunk = Buffer.from(line, "utf8");
86
- if (this.socket && !this.socket.destroyed) {
87
- this.socket.write(chunk);
91
+ if (this.#socket && !this.#socket.destroyed) {
92
+ this.#socket.write(chunk);
88
93
  }
89
94
  else {
90
- this.writeBuffer.push(chunk);
95
+ this.#writeBuffer.push(chunk);
91
96
  }
92
97
  }
93
- _handleIncoming(chunk) {
94
- this.readBuffer += chunk;
95
- const lines = this.readBuffer.split("\n");
96
- this.readBuffer = lines.pop() ?? "";
98
+ #handleIncoming(chunk) {
99
+ this.#readBuffer += chunk;
100
+ const lines = this.#readBuffer.split("\n");
101
+ this.#readBuffer = lines.pop() ?? "";
97
102
  for (const line of lines) {
98
103
  const trimmed = line.trim();
99
104
  if (!trimmed)
100
105
  continue;
101
106
  try {
102
107
  const parsed = JSON.parse(trimmed);
103
- this.emit("read", parsed);
108
+ if (this.#options.mode === "server") {
109
+ this.emit("server_read", parsed);
110
+ }
111
+ else {
112
+ this.emit("client_read", parsed);
113
+ }
104
114
  }
105
115
  catch {
106
116
  this.emit("error", new Error(`MCPIPCConnection: malformed JSON – ${trimmed}`));
107
117
  }
108
118
  }
109
119
  }
110
- _cleanSocketFile() {
120
+ #cleanSocketFile() {
111
121
  try {
112
- fs.unlinkSync(this.socketPath);
122
+ fs.unlinkSync(this.#options.socketPath);
113
123
  }
114
124
  catch { }
115
125
  }
116
- _maybeReconnect() {
117
- if (this.role === "client") {
126
+ #maybeReconnect() {
127
+ if (this.#closed)
128
+ return;
129
+ if (this.#options.mode === "client") {
118
130
  setTimeout(() => {
119
- this.role = "pending";
120
- this._tryConnect();
121
- }, 500);
131
+ this.#connectClient();
132
+ }, this.#options.reconnectDelay ?? 500);
122
133
  }
123
134
  }
124
135
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-ipc-connection.js","sourceRoot":"","sources":["../../src/core/mcp-ipc-connection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-ipc-connection.js","sourceRoot":"","sources":["../../src/core/mcp-ipc-connection.ts"],"names":[],"mappings":"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"}
@@ -13,11 +13,11 @@ export class MCPServer extends MCP {
13
13
  if (!rng)
14
14
  rng = new MCPRNG(storage);
15
15
  this.#rng = rng;
16
- this.#connection.on("read", (data) => {
16
+ this.#connection.on("server_read", (data) => {
17
17
  const topic = data.topic;
18
18
  const pid = data.pid;
19
19
  if (topic == "getTools") {
20
- this.#connection.emit("write", {
20
+ this.#connection.emit("write_to_client", {
21
21
  pid,
22
22
  topic: "getToolsCallback",
23
23
  tools: this.#tools.map(tool => ({
@@ -31,13 +31,13 @@ export class MCPServer extends MCP {
31
31
  const tool = this.#tools.find(t => t.getOptions().name == data.tool);
32
32
  if (tool) {
33
33
  tool.getOptions().execute(data.envID, data.inputs, tool.getMCP(), tool.getOptions().customClass).then((response) => {
34
- this.#connection.emit("write", {
34
+ this.#connection.emit("write_to_client", {
35
35
  pid,
36
36
  topic: "toolCallCallback",
37
37
  output: response
38
38
  });
39
39
  }).catch(error => {
40
- this.#connection.emit("write", {
40
+ this.#connection.emit("write_to_client", {
41
41
  pid,
42
42
  topic: "toolCallCallback",
43
43
  output: { error: error.message }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/core/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAgB,MAAM,UAAU,CAAC;AAG7C,OAAO,YAAY,MAAM,qBAAqB,CAAC;AAC/C,OAAO,MAAM,MAAM,cAAc,CAAC;AAElC,MAAM,OAAO,SAAU,SAAQ,GAAG;IAC9B,WAAW,CAAC;IACZ,QAAQ,CAAC;IACT,IAAI,CAAC;IACL,MAAM,GAAmB,EAAE,CAAC;IAC5B,YAAY,UAAyB,EAAE,UAAsB,IAAI,YAAY,EAAE,EAAE,GAAY;QACzF,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,GAAG;YACJ,GAAG,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAS,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACrB,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;gBACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE;oBAC3B,GAAG;oBACH,KAAK,EAAE,kBAAkB;oBACzB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAC5B,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI;wBAC5B,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW;wBAC1C,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM;qBACnC,CAAC,CAAC;iBACN,CAAC,CAAC;YACP,CAAC;YACD,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrE,IAAI,IAAI,EAAE,CAAC;oBACP,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;wBAC/G,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE;4BAC3B,GAAG;4BACH,KAAK,EAAE,kBAAkB;4BACzB,MAAM,EAAE,QAAQ;yBACnB,CAAC,CAAC;oBACP,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;wBACb,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE;4BAC3B,GAAG;4BACH,KAAK,EAAE,kBAAkB;4BACzB,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE;yBACnC,CAAC,CAAC;oBACP,CAAC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,MAAM;QACF,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,YAAY,CAAC,IAAkB;QAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;CACJ;AAED,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/core/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAgB,MAAM,UAAU,CAAC;AAG7C,OAAO,YAAY,MAAM,qBAAqB,CAAC;AAC/C,OAAO,MAAM,MAAM,cAAc,CAAC;AAElC,MAAM,OAAO,SAAU,SAAQ,GAAG;IAC9B,WAAW,CAAC;IACZ,QAAQ,CAAC;IACT,IAAI,CAAC;IACL,MAAM,GAAmB,EAAE,CAAC;IAC5B,YAAY,UAAyB,EAAE,UAAsB,IAAI,YAAY,EAAE,EAAE,GAAY;QACzF,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,GAAG;YACJ,GAAG,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,IAAS,EAAE,EAAE;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACrB,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;gBACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,EAAE;oBACrC,GAAG;oBACH,KAAK,EAAE,kBAAkB;oBACzB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBAC5B,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI;wBAC5B,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW;wBAC1C,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM;qBACnC,CAAC,CAAC;iBACN,CAAC,CAAC;YACP,CAAC;YACD,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrE,IAAI,IAAI,EAAE,CAAC;oBACP,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;wBAC/G,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,EAAE;4BACrC,GAAG;4BACH,KAAK,EAAE,kBAAkB;4BACzB,MAAM,EAAE,QAAQ;yBACnB,CAAC,CAAC;oBACP,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;wBACb,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,EAAE;4BACrC,GAAG;4BACH,KAAK,EAAE,kBAAkB;4BACzB,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE;yBACnC,CAAC,CAAC;oBACP,CAAC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,MAAM;QACF,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,YAAY,CAAC,IAAkB;QAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;CACJ;AAED,eAAe,SAAS,CAAC"}
@@ -0,0 +1,45 @@
1
+ import MCPConnection from "./mcp-connection.js";
2
+ export interface MCPWSTLSOptions {
3
+ /** Private key (PEM), e.g. fs.readFileSync("key.pem") or its contents. */
4
+ key: string | Buffer;
5
+ /** Certificate (PEM), e.g. fs.readFileSync("cert.pem") or its contents. */
6
+ cert: string | Buffer;
7
+ /** Optional CA certificate(s), useful for verifying client certs or self-signed chains. */
8
+ ca?: string | Buffer | (string | Buffer)[];
9
+ }
10
+ export interface MCPWSConnectionOptions {
11
+ /**
12
+ * "server": bind a WebSocketServer and wait for a peer to connect.
13
+ * "client": connect out to `url`.
14
+ */
15
+ mode: "server" | "client";
16
+ /** Required when mode === "client". e.g. "ws://localhost:8080" or "wss://host:port" */
17
+ url?: string;
18
+ /** Required when mode === "server". Port to listen on. */
19
+ port?: number;
20
+ /** Optional host to bind to when mode === "server". */
21
+ host?: string;
22
+ /** Reconnect delay (ms) for client mode after a disconnect. Default 500. */
23
+ reconnectDelay?: number;
24
+ /**
25
+ * Shared token both sides must agree on. The server only accepts
26
+ * connections from clients that present this exact token; the client
27
+ * sends it automatically. If omitted, no auth check is performed.
28
+ */
29
+ token?: string;
30
+ /**
31
+ * Optional TLS key/cert (and CA). When provided:
32
+ * - server mode binds an HTTPS server and serves WSS.
33
+ * - client mode is expected to connect via a wss:// url; the ca
34
+ * (if given) is used to validate the server's certificate.
35
+ * When omitted, server mode uses plain HTTP/WS.
36
+ */
37
+ tls?: MCPWSTLSOptions;
38
+ }
39
+ export declare class MCPWSConnection extends MCPConnection {
40
+ #private;
41
+ constructor(options: MCPWSConnectionOptions);
42
+ close(): void;
43
+ }
44
+ export default MCPWSConnection;
45
+ //# sourceMappingURL=mcp-ws-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-ws-connection.d.ts","sourceRoot":"","sources":["../../src/core/mcp-ws-connection.ts"],"names":[],"mappings":"AAGA,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC5B,0EAA0E;IAC1E,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,2FAA2F;IAC3F,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,sBAAsB;IACnC;;;OAGG;IACH,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,uFAAuF;IACvF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,eAAe,CAAC;CACzB;AAID,qBAAa,eAAgB,SAAQ,aAAa;;gBAQlC,OAAO,EAAE,sBAAsB;IAyB3C,KAAK,IAAI,IAAI;CAmJhB;AAED,eAAe,eAAe,CAAC"}