@mcsherrylabs/evolver-mcp 0.13.0 → 0.15.0
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/deploy/docker-compose.http.yml +45 -0
- package/deploy/docker-compose.yml +4 -1
- package/dist/application-signer.d.ts +1 -1
- package/dist/application-signer.d.ts.map +1 -1
- package/dist/attachments.d.ts +1 -1
- package/dist/attachments.d.ts.map +1 -1
- package/dist/attachments.js +2 -2
- package/dist/attachments.js.map +1 -1
- package/dist/bootstrap.d.ts +36 -4
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +35 -11
- package/dist/bootstrap.js.map +1 -1
- package/dist/content-file-tools.js +1 -1
- package/dist/content-file-tools.js.map +1 -1
- package/dist/content-files.d.ts +1 -1
- package/dist/content-files.d.ts.map +1 -1
- package/dist/content-files.js +1 -1
- package/dist/content-files.js.map +1 -1
- package/dist/content-ranges.d.ts +1 -1
- package/dist/content-ranges.d.ts.map +1 -1
- package/dist/group-crypto-tools.js +1 -1
- package/dist/group-crypto-tools.js.map +1 -1
- package/dist/group-crypto.d.ts +2 -2
- package/dist/group-crypto.d.ts.map +1 -1
- package/dist/group-crypto.js +1 -1
- package/dist/group-crypto.js.map +1 -1
- package/dist/http-transport.d.ts +87 -0
- package/dist/http-transport.d.ts.map +1 -0
- package/dist/http-transport.js +359 -0
- package/dist/http-transport.js.map +1 -0
- package/dist/inbox.d.ts +1 -1
- package/dist/inbox.d.ts.map +1 -1
- package/dist/inbox.js +1 -1
- package/dist/inbox.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +254 -115
- package/dist/index.js.map +1 -1
- package/dist/install-http.d.ts +27 -0
- package/dist/install-http.d.ts.map +1 -0
- package/dist/install-http.js +192 -0
- package/dist/install-http.js.map +1 -0
- package/dist/install.d.ts +18 -0
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +128 -22
- package/dist/install.js.map +1 -1
- package/dist/login.d.ts +1 -1
- package/dist/login.d.ts.map +1 -1
- package/dist/mcp.d.ts +2 -2
- package/dist/mcp.d.ts.map +1 -1
- package/dist/p2p.d.ts +1 -1
- package/dist/p2p.d.ts.map +1 -1
- package/dist/p2p.js +1 -1
- package/dist/p2p.js.map +1 -1
- package/dist/processor.d.ts +1 -1
- package/dist/processor.d.ts.map +1 -1
- package/dist/processor.js +1 -1
- package/dist/processor.js.map +1 -1
- package/dist/signed-http.d.ts +1 -1
- package/dist/signed-http.d.ts.map +1 -1
- package/dist/tools.d.ts +5 -3
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +34 -34
- package/dist/tools.js.map +1 -1
- package/dist/transaction-interchange-tools.js +1 -1
- package/dist/transaction-interchange-tools.js.map +1 -1
- package/dist/transaction-interchange.d.ts +5 -2
- package/dist/transaction-interchange.d.ts.map +1 -1
- package/dist/transaction-interchange.js +10 -10
- package/dist/transaction-interchange.js.map +1 -1
- package/package.json +10 -16
- package/dist/amount.d.ts +0 -23
- package/dist/amount.d.ts.map +0 -1
- package/dist/amount.js +0 -53
- package/dist/amount.js.map +0 -1
- package/dist/channel.d.ts +0 -77
- package/dist/channel.d.ts.map +0 -1
- package/dist/channel.js +0 -287
- package/dist/channel.js.map +0 -1
- package/dist/claim.d.ts +0 -48
- package/dist/claim.d.ts.map +0 -1
- package/dist/claim.js +0 -81
- package/dist/claim.js.map +0 -1
- package/dist/content.d.ts +0 -94
- package/dist/content.d.ts.map +0 -1
- package/dist/content.js +0 -215
- package/dist/content.js.map +0 -1
- package/dist/group-ownership.d.ts +0 -78
- package/dist/group-ownership.d.ts.map +0 -1
- package/dist/group-ownership.js +0 -324
- package/dist/group-ownership.js.map +0 -1
- package/dist/group.d.ts +0 -60
- package/dist/group.d.ts.map +0 -1
- package/dist/group.js +0 -204
- package/dist/group.js.map +0 -1
- package/dist/identity.d.ts +0 -87
- package/dist/identity.d.ts.map +0 -1
- package/dist/identity.js +0 -236
- package/dist/identity.js.map +0 -1
- package/dist/node-transport.d.ts +0 -14
- package/dist/node-transport.d.ts.map +0 -1
- package/dist/node-transport.js +0 -54
- package/dist/node-transport.js.map +0 -1
- package/dist/read.d.ts +0 -252
- package/dist/read.d.ts.map +0 -1
- package/dist/read.js +0 -320
- package/dist/read.js.map +0 -1
- package/dist/result.d.ts +0 -110
- package/dist/result.d.ts.map +0 -1
- package/dist/result.js +0 -97
- package/dist/result.js.map +0 -1
- package/dist/signer.d.ts +0 -37
- package/dist/signer.d.ts.map +0 -1
- package/dist/signer.js +0 -76
- package/dist/signer.js.map +0 -1
- package/dist/write.d.ts +0 -214
- package/dist/write.d.ts.map +0 -1
- package/dist/write.js +0 -399
- package/dist/write.js.map +0 -1
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
// The Streamable HTTP transport: one process, N client sessions, ONE identity.
|
|
2
|
+
//
|
|
3
|
+
// Over stdio each client spawns its own process and therefore gets its own signing history by
|
|
4
|
+
// accident. Over HTTP every client reaches the same process, so the history must be handed out per
|
|
5
|
+
// MCP session explicitly (`createSigningStore`) — a shared one would let client A submit a
|
|
6
|
+
// transaction client B signed, silently defeating `not_signed_here`.
|
|
7
|
+
//
|
|
8
|
+
// ⚠️ ONE SERVER = ONE IDENTITY. The key, the identity and the node endpoint are fixed at startup
|
|
9
|
+
// from the environment; no tool parameter, HTTP header or client input can name any of them. The
|
|
10
|
+
// binding is the whole authorisation: a process that can reach the port can sign as this identity,
|
|
11
|
+
// which is why a non-loopback bind is refused unless explicitly overridden (see `resolveHttpAddress`)
|
|
12
|
+
// and why the default address is `127.0.0.1`.
|
|
13
|
+
import { createServer } from "node:http";
|
|
14
|
+
import { randomBytes } from "node:crypto";
|
|
15
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
16
|
+
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
17
|
+
/** The default loopback address. Binding anywhere else is a deliberate act, not a typo away. */
|
|
18
|
+
export const DEFAULT_HTTP_ADDR = "127.0.0.1";
|
|
19
|
+
/** Is this address reachable from outside the host? Anything that is not loopback is. */
|
|
20
|
+
export function isLoopbackAddress(addr) {
|
|
21
|
+
const a = addr.trim().toLowerCase().replace(/^\[|\]$/g, "");
|
|
22
|
+
return a === "localhost" || a === "::1" || /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(a);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the listen address from the environment.
|
|
26
|
+
*
|
|
27
|
+
* `EVOLVER_MCP_HTTP_ADDR` defaults to loopback. A non-loopback address (including `0.0.0.0` and
|
|
28
|
+
* `::`) is REFUSED unless `EVOLVER_MCP_HTTP_ALLOW_NON_LOOPBACK=1` is set, in which case it is
|
|
29
|
+
* reported as `wildcard: true` so the operator sees a warning in the log. The port is REQUIRED: a
|
|
30
|
+
* default could silently collide with the node's listeners (8440/8450) or the inbox (8090).
|
|
31
|
+
* Explicit port 0 requests an OS-assigned ephemeral listener; readiness reports its actual port.
|
|
32
|
+
*/
|
|
33
|
+
export function resolveHttpAddress(env) {
|
|
34
|
+
const host = (env.EVOLVER_MCP_HTTP_ADDR?.trim() || DEFAULT_HTTP_ADDR).toLowerCase();
|
|
35
|
+
const rawPort = env.EVOLVER_MCP_HTTP_PORT?.trim() ?? "";
|
|
36
|
+
if (!/^[0-9]{1,5}$/.test(rawPort)) {
|
|
37
|
+
return {
|
|
38
|
+
ok: false,
|
|
39
|
+
error: "EVOLVER_MCP_HTTP_PORT is required and must be a port number. There is deliberately no " +
|
|
40
|
+
`default: a guessed port could silently collide with the node's 8440/8450 or the inbox's 8090.`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const port = Number(rawPort);
|
|
44
|
+
if (port < 0 || port > 65535)
|
|
45
|
+
return { ok: false, error: `EVOLVER_MCP_HTTP_PORT ${rawPort} is not a port` };
|
|
46
|
+
if (port === 8440 || port === 8450 || port === 8090) {
|
|
47
|
+
return {
|
|
48
|
+
ok: false,
|
|
49
|
+
error: `EVOLVER_MCP_HTTP_PORT ${port} is a port the managed composition already uses (node chain ` +
|
|
50
|
+
`8440, node content 8450, inbox 8090). Pick another, e.g. 8461.`,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const loopback = isLoopbackAddress(host);
|
|
54
|
+
if (!loopback && env.EVOLVER_MCP_HTTP_ALLOW_NON_LOOPBACK?.trim() !== "1") {
|
|
55
|
+
return {
|
|
56
|
+
ok: false,
|
|
57
|
+
error: `EVOLVER_MCP_HTTP_ADDR "${host}" is not a loopback address. Reachability of the port is the ` +
|
|
58
|
+
`authorisation here, so any process that can reach a non-loopback bind can sign as the agent's ` +
|
|
59
|
+
`identity. Set EVOLVER_MCP_HTTP_ALLOW_NON_LOOPBACK=1 only if the network around it is the control.`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return { ok: true, host, port, wildcard: !loopback };
|
|
63
|
+
}
|
|
64
|
+
export const DEFAULT_MAX_BODY_BYTES = 4 * 1024 * 1024;
|
|
65
|
+
/** Bounds retained signing histories and initializing sessions, not an identity selector. */
|
|
66
|
+
export const MAX_SESSIONS = 64;
|
|
67
|
+
export function resolveMaxSessions(env) {
|
|
68
|
+
const raw = env.EVOLVER_MCP_MAX_SESSIONS;
|
|
69
|
+
if (raw === undefined)
|
|
70
|
+
return MAX_SESSIONS;
|
|
71
|
+
if (!/^[1-9][0-9]*$/.test(raw) || !Number.isSafeInteger(Number(raw)))
|
|
72
|
+
throw new Error("EVOLVER_MCP_MAX_SESSIONS must be a finite positive integer");
|
|
73
|
+
return Number(raw);
|
|
74
|
+
}
|
|
75
|
+
/** Read a request body with a hard cap, returning undefined when the cap is exceeded. */
|
|
76
|
+
async function readBody(req, limit) {
|
|
77
|
+
const chunks = [];
|
|
78
|
+
let total = 0;
|
|
79
|
+
// An early cap decision must still deliver its explicit 413. The default iterator destroys
|
|
80
|
+
// the request/socket on return, racing away that response before the client can read it.
|
|
81
|
+
for await (const chunk of req.iterator({ destroyOnReturn: false })) {
|
|
82
|
+
const b = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
83
|
+
total += b.length;
|
|
84
|
+
if (total > limit)
|
|
85
|
+
return undefined;
|
|
86
|
+
chunks.push(b);
|
|
87
|
+
}
|
|
88
|
+
return Buffer.concat(chunks);
|
|
89
|
+
}
|
|
90
|
+
const sendJson = (res, status, body, headers = {}) => {
|
|
91
|
+
if (res.headersSent)
|
|
92
|
+
return;
|
|
93
|
+
res.writeHead(status, { "content-type": "application/json", ...headers });
|
|
94
|
+
res.end(JSON.stringify(body));
|
|
95
|
+
};
|
|
96
|
+
/** A JSON-RPC error body, so a refused request is legible to an MCP client rather than a bare 500. */
|
|
97
|
+
const rpcError = (code, message, id = null) => ({ jsonrpc: "2.0", id, error: { code, message } });
|
|
98
|
+
/**
|
|
99
|
+
* A stateful listener: one `StreamableHTTPServerTransport` (and therefore one MCP session, one
|
|
100
|
+
* signing store, one `McpServer`) per `Mcp-Session-Id`.
|
|
101
|
+
*
|
|
102
|
+
* Initialization (`initialize` without a session header) creates a session; every later request
|
|
103
|
+
* must carry the id the server returned in the `Mcp-Session-Id` response header. A request naming
|
|
104
|
+
* an unknown id gets HTTP 404, which is what tells an MCP client its session is gone — the client
|
|
105
|
+
* then re-initialises and gets a FRESH, EMPTY signing store, so a stale txId is `not_signed_here`
|
|
106
|
+
* rather than silently accepted.
|
|
107
|
+
*/
|
|
108
|
+
export class HttpSessionListener {
|
|
109
|
+
opts;
|
|
110
|
+
// Sole writer: this listener on Node's event loop. Map insertion order is request-dispatch LRU.
|
|
111
|
+
sessions = new Map();
|
|
112
|
+
entries = new Set();
|
|
113
|
+
closing = false;
|
|
114
|
+
closePromise;
|
|
115
|
+
capacity;
|
|
116
|
+
constructor(opts) {
|
|
117
|
+
this.opts = opts;
|
|
118
|
+
this.capacity = opts.maxSessions ?? MAX_SESSIONS;
|
|
119
|
+
if (!Number.isSafeInteger(this.capacity) || this.capacity < 1)
|
|
120
|
+
throw new Error("maxSessions must be a finite positive integer");
|
|
121
|
+
}
|
|
122
|
+
get size() { return this.sessions.size; }
|
|
123
|
+
/** Live plus initializing reservations. Revocation removes authority synchronously. */
|
|
124
|
+
get reservedSize() { return [...this.entries].filter(entry => !entry.revoked).length; }
|
|
125
|
+
async handle(req, res) {
|
|
126
|
+
const log = this.opts.log ?? (() => { });
|
|
127
|
+
if (req.url?.split("?")[0] !== "/mcp") {
|
|
128
|
+
sendJson(res, 404, rpcError(-32000, "route not found; use /mcp"));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (!["POST", "GET", "DELETE"].includes(req.method ?? "")) {
|
|
132
|
+
sendJson(res, 405, rpcError(-32000, "method not allowed"), { allow: "POST, GET, DELETE" });
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (this.closing) {
|
|
136
|
+
sendJson(res, 503, rpcError(-32002, "server is shutting down"));
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (this.opts.allowedOrigins !== undefined) {
|
|
140
|
+
const origin = req.headers.origin;
|
|
141
|
+
if (origin !== undefined && !this.opts.allowedOrigins.includes(origin)) {
|
|
142
|
+
sendJson(res, 403, rpcError(-32000, "origin not allowed"));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const sessionHeader = req.headers["mcp-session-id"];
|
|
147
|
+
const sessionId = Array.isArray(sessionHeader) ? sessionHeader[0] : sessionHeader;
|
|
148
|
+
// A known session: hand the request straight to its transport.
|
|
149
|
+
if (sessionId !== undefined) {
|
|
150
|
+
const entry = this.sessions.get(sessionId);
|
|
151
|
+
if (entry === undefined) {
|
|
152
|
+
sendJson(res, 404, rpcError(-32001, "session not found or expired; re-initialise"));
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Only POST carries JSON-RPC. GET opens the SSE stream and DELETE terminates the session; both
|
|
156
|
+
// are legitimately body-less, and parsing them would refuse a valid request.
|
|
157
|
+
let body;
|
|
158
|
+
if (req.method === "POST") {
|
|
159
|
+
const parsed = await this.parseBody(req, res);
|
|
160
|
+
if (parsed === REFUSED)
|
|
161
|
+
return;
|
|
162
|
+
body = parsed.body;
|
|
163
|
+
}
|
|
164
|
+
// Parsing yields to other requests. An evicted entry must never regain dispatch authority.
|
|
165
|
+
if (entry.revoked || this.sessions.get(sessionId) !== entry) {
|
|
166
|
+
sendJson(res, 404, rpcError(-32001, "session not found or expired; re-initialise"));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
this.sessions.delete(sessionId);
|
|
170
|
+
this.sessions.set(sessionId, entry);
|
|
171
|
+
try {
|
|
172
|
+
await entry.transport.handleRequest(req, res, body);
|
|
173
|
+
}
|
|
174
|
+
catch (e) {
|
|
175
|
+
log(`evolver-mcp: http session ${sessionId}: request failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
176
|
+
if (!res.headersSent)
|
|
177
|
+
sendJson(res, 500, rpcError(-32603, "internal error"));
|
|
178
|
+
}
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// No session header. Only a POST carrying `initialize` may create one.
|
|
182
|
+
if (req.method !== "POST") {
|
|
183
|
+
sendJson(res, 400, rpcError(-32000, "Mcp-Session-Id header is required"));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const parsed = await this.parseBody(req, res);
|
|
187
|
+
if (parsed === REFUSED)
|
|
188
|
+
return;
|
|
189
|
+
if (!isInitializeRequest(parsed.body)) {
|
|
190
|
+
sendJson(res, 400, rpcError(-32000, "no valid session id: the first request must be initialize"));
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (this.closing) {
|
|
194
|
+
sendJson(res, 503, rpcError(-32002, "server is shutting down"));
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
// Revoke a live victim, then reserve the replacement BEFORE any await. If all slots are
|
|
198
|
+
// initializing, refuse rather than create an unbounded queue of provisional servers.
|
|
199
|
+
let victimCleanup;
|
|
200
|
+
if (this.reservedSize >= this.capacity) {
|
|
201
|
+
const victim = this.sessions.values().next().value;
|
|
202
|
+
if (!victim) {
|
|
203
|
+
sendJson(res, 503, rpcError(-32002, "session initialization capacity reached"));
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
victimCleanup = this.drop(victim);
|
|
207
|
+
}
|
|
208
|
+
let finishSetup;
|
|
209
|
+
const entry = { controller: new AbortController(), ready: new Promise(done => { finishSetup = done; }),
|
|
210
|
+
finishSetup: () => finishSetup(), revoked: false };
|
|
211
|
+
this.entries.add(entry);
|
|
212
|
+
try {
|
|
213
|
+
await victimCleanup;
|
|
214
|
+
if (entry.revoked || this.closing) {
|
|
215
|
+
sendJson(res, 503, rpcError(-32002, "server is shutting down"));
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const transport = new StreamableHTTPServerTransport({
|
|
219
|
+
sessionIdGenerator: () => randomBytes(32).toString("hex"),
|
|
220
|
+
onsessioninitialized: (id) => {
|
|
221
|
+
if (entry.revoked || this.closing)
|
|
222
|
+
throw new Error("session revoked during initialize");
|
|
223
|
+
entry.id = id;
|
|
224
|
+
try {
|
|
225
|
+
this.opts.onSessionInitialized?.(id);
|
|
226
|
+
this.sessions.set(id, entry);
|
|
227
|
+
log(`evolver-mcp: http session ${id} opened (${this.size} live, ${this.reservedSize} reserved)`);
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
// The SDK catches this exception and returns HTTP 400, so record revocation HERE.
|
|
231
|
+
entry.revoked = true;
|
|
232
|
+
this.sessions.delete(id);
|
|
233
|
+
entry.controller.abort();
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
onsessionclosed: () => this.drop(entry),
|
|
238
|
+
});
|
|
239
|
+
entry.transport = transport;
|
|
240
|
+
const sessionServer = this.opts.createSession(() => transport.sessionId, entry.controller.signal);
|
|
241
|
+
entry.server = sessionServer;
|
|
242
|
+
const previousClose = sessionServer.server.onclose;
|
|
243
|
+
sessionServer.server.onclose = () => { previousClose?.(); void this.drop(entry); };
|
|
244
|
+
await sessionServer.connect(transport);
|
|
245
|
+
if (entry.revoked || this.closing) {
|
|
246
|
+
sendJson(res, 503, rpcError(-32002, "server is shutting down"));
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
await transport.handleRequest(req, res, parsed.body);
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
// Never echo SDK/caller material; the protocol error is enough to diagnose the boundary.
|
|
253
|
+
log("evolver-mcp: http initialization failed");
|
|
254
|
+
entry.revoked = true;
|
|
255
|
+
sendJson(res, 500, rpcError(-32603, "internal error"));
|
|
256
|
+
}
|
|
257
|
+
finally {
|
|
258
|
+
entry.finishSetup();
|
|
259
|
+
// The SDK may return an HTTP error without throwing or minting an id.
|
|
260
|
+
if (entry.id === undefined || entry.revoked)
|
|
261
|
+
await this.drop(entry);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/** Parse a JSON body under the size cap, or answer the client and return the sentinel. */
|
|
265
|
+
async parseBody(req, res) {
|
|
266
|
+
const limit = this.opts.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;
|
|
267
|
+
let raw;
|
|
268
|
+
try {
|
|
269
|
+
raw = await readBody(req, limit);
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
sendJson(res, 400, rpcError(-32700, "could not read request body"));
|
|
273
|
+
return REFUSED;
|
|
274
|
+
}
|
|
275
|
+
if (raw === undefined) {
|
|
276
|
+
sendJson(res, 413, rpcError(-32000, `request body over the ${limit}-byte limit`), { connection: "close" });
|
|
277
|
+
return REFUSED;
|
|
278
|
+
}
|
|
279
|
+
if (raw.length === 0) {
|
|
280
|
+
sendJson(res, 400, rpcError(-32700, "empty request body"));
|
|
281
|
+
return REFUSED;
|
|
282
|
+
}
|
|
283
|
+
try {
|
|
284
|
+
return { body: JSON.parse(raw.toString("utf8")) };
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
sendJson(res, 400, rpcError(-32700, "request body is not JSON"));
|
|
288
|
+
return REFUSED;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
drop(entry) {
|
|
292
|
+
if (entry.cleanup)
|
|
293
|
+
return entry.cleanup;
|
|
294
|
+
entry.revoked = true;
|
|
295
|
+
if (entry.id !== undefined)
|
|
296
|
+
this.sessions.delete(entry.id);
|
|
297
|
+
entry.controller.abort();
|
|
298
|
+
// Memoize BEFORE the first close callback can re-enter. Cleanup acknowledges resource drain,
|
|
299
|
+
// not just removal from the authority map; reservations cannot resurrect after shutdown.
|
|
300
|
+
entry.cleanup = entry.ready.then(async () => {
|
|
301
|
+
try {
|
|
302
|
+
if (entry.server)
|
|
303
|
+
await entry.server.close();
|
|
304
|
+
else
|
|
305
|
+
await entry.transport?.close();
|
|
306
|
+
if (entry.id !== undefined)
|
|
307
|
+
await this.opts.closeSession?.(entry.id);
|
|
308
|
+
}
|
|
309
|
+
finally {
|
|
310
|
+
this.entries.delete(entry);
|
|
311
|
+
}
|
|
312
|
+
(this.opts.log ?? (() => { }))(`evolver-mcp: http session ${entry.id ?? "initializing"} closed (${this.size} live)`);
|
|
313
|
+
});
|
|
314
|
+
return entry.cleanup;
|
|
315
|
+
}
|
|
316
|
+
/** Synchronously revoke every live/reserved entry; then await each memoized resource drain. */
|
|
317
|
+
close() {
|
|
318
|
+
if (this.closePromise)
|
|
319
|
+
return this.closePromise;
|
|
320
|
+
this.closing = true;
|
|
321
|
+
this.closePromise = Promise.all([...this.entries].map(entry => this.drop(entry))).then(() => { });
|
|
322
|
+
return this.closePromise;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/** Returned by `parseBody` when it has already answered the client. */
|
|
326
|
+
const REFUSED = Object.freeze({ body: undefined });
|
|
327
|
+
/**
|
|
328
|
+
* Build and start the HTTP listener. Returns the server so the caller can await `close()` on
|
|
329
|
+
* shutdown; a bind failure rejects, so a caller that cannot honour the address fails at startup
|
|
330
|
+
* rather than serving nowhere.
|
|
331
|
+
*/
|
|
332
|
+
export async function startHttpListener(host, port, opts) {
|
|
333
|
+
const listener = new HttpSessionListener(opts);
|
|
334
|
+
const server = createServer((req, res) => {
|
|
335
|
+
void listener.handle(req, res).catch((e) => {
|
|
336
|
+
(opts.log ?? (() => { }))(`evolver-mcp: http: unhandled request error: ${e instanceof Error ? e.message : String(e)}`);
|
|
337
|
+
if (!res.headersSent)
|
|
338
|
+
res.writeHead(500).end();
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
await new Promise((resolve, reject) => {
|
|
342
|
+
server.once("error", reject);
|
|
343
|
+
server.listen(port, host, () => { server.off("error", reject); resolve(); });
|
|
344
|
+
});
|
|
345
|
+
let closePromise;
|
|
346
|
+
return { server, listener, close: () => closePromise ??= (async () => {
|
|
347
|
+
// Stop admission first. Incomplete bodies/idle sockets have no MCP session to revoke, so
|
|
348
|
+
// close those exact server-owned connections after the session work has drained as well.
|
|
349
|
+
const stopped = new Promise(done => server.close(() => done()));
|
|
350
|
+
try {
|
|
351
|
+
await listener.close();
|
|
352
|
+
}
|
|
353
|
+
finally {
|
|
354
|
+
server.closeAllConnections();
|
|
355
|
+
await stopped;
|
|
356
|
+
}
|
|
357
|
+
})() };
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=http-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../src/http-transport.ts"],"names":[],"mappings":"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"}
|
package/dist/inbox.d.ts
CHANGED
package/dist/inbox.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../src/inbox.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../src/inbox.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAGvC,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAIpF;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAkC9B"}
|
package/dist/inbox.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Read-only projection of the shared SDK inbox. Reads never advance the node.
|
|
2
2
|
// All retained bodies (including module-handled ones) stay lossless; only the display is bounded.
|
|
3
|
-
import { ok, partial } from "
|
|
3
|
+
import { ok, partial } from "@mcsherrylabs/evolver-core";
|
|
4
4
|
import { channelArgument, processorMissing, processorReadError } from "./processor.js";
|
|
5
5
|
export const INBOX_DEFAULT_LIMIT = 10;
|
|
6
6
|
export const INBOX_MAX_LIMIT = 50;
|
package/dist/inbox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../src/inbox.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,kGAAkG;AAClG,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../src/inbox.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AA0DvC;;;;;;4BAM4B;AAC5B,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,SAAS,CAI5E;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,CAyB5C;AAgBD,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAmM1C"}
|