@vess-id/vess 0.4.0 → 0.5.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.
@@ -19,6 +19,13 @@ export interface McpServerFactoryResult {
19
19
  version: string;
20
20
  }) => void;
21
21
  }
22
+ export interface HttpTransportOptions {
23
+ healthCheck?: () => Promise<HealthStatus> | HealthStatus;
24
+ sessionTimeoutMs?: number;
25
+ maxSessions?: number;
26
+ /** Reaper sweep interval in ms (default: 60000). Exposed for testing. */
27
+ reaperIntervalMs?: number;
28
+ }
22
29
  /**
23
30
  * Start HTTP transport for daemon mode.
24
31
  *
@@ -26,9 +33,8 @@ export interface McpServerFactoryResult {
26
33
  * Can return just an McpServer (backward compat) or { server, onClientInfo }.
27
34
  * @param port Port to bind to (default: 3100)
28
35
  * @param host Host to bind to (default: 127.0.0.1, localhost only for security)
36
+ * @param options Session lifecycle and health check options
29
37
  * @returns Handle with close() for graceful shutdown
30
38
  */
31
- export declare function startHttpTransport(createMcpServerFn: () => McpServer | McpServerFactoryResult | Promise<McpServer | McpServerFactoryResult>, port?: number, host?: string, options?: {
32
- healthCheck?: () => Promise<HealthStatus> | HealthStatus;
33
- }): Promise<HttpTransportHandle>;
39
+ export declare function startHttpTransport(createMcpServerFn: () => McpServer | McpServerFactoryResult | Promise<McpServer | McpServerFactoryResult>, port?: number, host?: string, options?: HttpTransportOptions): Promise<HttpTransportHandle>;
34
40
  //# sourceMappingURL=http-transport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../../../src/adapter/mcp/http-transport.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAKnE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAA;IACb,EAAE,EAAE,OAAO,CAAA;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,MAAM,CAAA;CAC3B;AAED,kGAAkG;AAClG,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,SAAS,CAAA;IACjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CACjE;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,iBAAiB,EAAE,MAAM,SAAS,GAAG,sBAAsB,GAAG,OAAO,CAAC,SAAS,GAAG,sBAAsB,CAAC,EACzG,IAAI,GAAE,MAA4B,EAClC,IAAI,GAAE,MAAoB,EAC1B,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAA;CAAE,GACrE,OAAO,CAAC,mBAAmB,CAAC,CAqI9B"}
1
+ {"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../../../src/adapter/mcp/http-transport.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAWnE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAA;IACb,EAAE,EAAE,OAAO,CAAA;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,MAAM,CAAA;CAC3B;AAED,kGAAkG;AAClG,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,SAAS,CAAA;IACjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CACjE;AAQD,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAA;IACxD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAmBD;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,iBAAiB,EAAE,MAAM,SAAS,GAAG,sBAAsB,GAAG,OAAO,CAAC,SAAS,GAAG,sBAAsB,CAAC,EACzG,IAAI,GAAE,MAA4B,EAClC,IAAI,GAAE,MAAoB,EAC1B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAuL9B"}
@@ -8,6 +8,12 @@ exports.startHttpTransport = startHttpTransport;
8
8
  * its own transport + McpServer instance — a single transport does NOT
9
9
  * support concurrent clients.
10
10
  *
11
+ * Session lifecycle:
12
+ * - Sessions are created on first POST /mcp without mcp-session-id header
13
+ * - lastActivity is updated on every request to prevent idle reaping
14
+ * - A periodic reaper closes sessions idle longer than sessionTimeoutMs
15
+ * - Max concurrent sessions are capped; excess connections get 503
16
+ *
11
17
  * Security: binds to 127.0.0.1 only (localhost). No authentication on HTTP
12
18
  * endpoint — same trust model as stdio (any local process can connect).
13
19
  */
@@ -15,6 +21,17 @@ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamable
15
21
  const node_http_1 = require("node:http");
16
22
  const node_crypto_1 = require("node:crypto");
17
23
  const constants_1 = require("../../config/constants");
24
+ function shortId(sid) {
25
+ return sid.slice(0, 8);
26
+ }
27
+ /** Close with a timeout to prevent hanging on stuck transports/servers. */
28
+ const CLOSE_TIMEOUT_MS = 5_000;
29
+ function closeWithTimeout(closeable) {
30
+ return new Promise((resolve, reject) => {
31
+ const timer = setTimeout(() => reject(new Error('close timed out')), CLOSE_TIMEOUT_MS);
32
+ Promise.resolve(closeable.close()).then(() => { clearTimeout(timer); resolve(); }, (err) => { clearTimeout(timer); reject(err); });
33
+ });
34
+ }
18
35
  /**
19
36
  * Start HTTP transport for daemon mode.
20
37
  *
@@ -22,26 +39,50 @@ const constants_1 = require("../../config/constants");
22
39
  * Can return just an McpServer (backward compat) or { server, onClientInfo }.
23
40
  * @param port Port to bind to (default: 3100)
24
41
  * @param host Host to bind to (default: 127.0.0.1, localhost only for security)
42
+ * @param options Session lifecycle and health check options
25
43
  * @returns Handle with close() for graceful shutdown
26
44
  */
27
45
  async function startHttpTransport(createMcpServerFn, port = constants_1.DEFAULT_DAEMON_PORT, host = '127.0.0.1', options) {
28
46
  const sessions = new Map();
47
+ const sessionTimeoutMs = options?.sessionTimeoutMs ?? constants_1.DEFAULT_SESSION_TIMEOUT_MS;
48
+ const maxSessions = options?.maxSessions ?? constants_1.DEFAULT_MAX_SESSIONS;
49
+ const reaperIntervalMs = options?.reaperIntervalMs ?? constants_1.DEFAULT_REAPER_INTERVAL_MS;
50
+ // Periodic reaper: evict sessions idle longer than timeout.
51
+ // Delete from Map first (synchronous), then close resources (async).
52
+ // This prevents routing requests to a session mid-close.
53
+ const reaperInterval = setInterval(async () => {
54
+ const now = Date.now();
55
+ for (const [sid, entry] of sessions) {
56
+ if (now - entry.lastActivity > sessionTimeoutMs) {
57
+ const elapsed = Math.round((now - entry.lastActivity) / 1000);
58
+ sessions.delete(sid);
59
+ process.stderr.write(`[agentd] session ${shortId(sid)}… timed out after ${elapsed}s, closing\n`);
60
+ try {
61
+ await closeWithTimeout(entry.transport);
62
+ await closeWithTimeout(entry.server);
63
+ }
64
+ catch { /* best-effort cleanup — includes close timeout */ }
65
+ }
66
+ }
67
+ }, reaperIntervalMs);
68
+ reaperInterval.unref();
29
69
  const httpServer = (0, node_http_1.createServer)(async (req, res) => {
30
70
  // Health endpoint
31
71
  if (req.method === 'GET' && req.url === '/health') {
32
72
  res.writeHead(200, { 'Content-Type': 'application/json' });
73
+ const sessionsDegraded = sessions.size >= constants_1.SESSION_DEGRADED_THRESHOLD;
33
74
  if (options?.healthCheck) {
34
75
  try {
35
76
  const extra = await options.healthCheck();
36
- const allOk = extra.auth && extra.db;
37
- res.end(JSON.stringify({ status: allOk ? 'ok' : 'degraded', sessions: sessions.size, ...extra }));
77
+ const allOk = extra.auth && extra.db && !sessionsDegraded;
78
+ res.end(JSON.stringify({ status: allOk ? 'ok' : 'degraded', sessions: sessions.size, maxSessions, ...extra }));
38
79
  }
39
80
  catch {
40
- res.end(JSON.stringify({ status: 'degraded', sessions: sessions.size, error: 'health check failed' }));
81
+ res.end(JSON.stringify({ status: 'degraded', sessions: sessions.size, maxSessions, error: 'health check failed' }));
41
82
  }
42
83
  }
43
84
  else {
44
- res.end(JSON.stringify({ status: 'ok', sessions: sessions.size }));
85
+ res.end(JSON.stringify({ status: sessionsDegraded ? 'degraded' : 'ok', sessions: sessions.size, maxSessions }));
45
86
  }
46
87
  return;
47
88
  }
@@ -54,11 +95,26 @@ async function startHttpTransport(createMcpServerFn, port = constants_1.DEFAULT_
54
95
  // Extract session ID from header (MCP protocol)
55
96
  const sessionId = req.headers['mcp-session-id'];
56
97
  if (sessionId && sessions.has(sessionId)) {
57
- // Existing session — route to its transport
98
+ // Existing session — route to its transport, update activity timestamp
58
99
  const session = sessions.get(sessionId);
100
+ session.lastActivity = Date.now();
59
101
  await session.transport.handleRequest(req, res);
60
102
  }
61
103
  else {
104
+ // Max sessions cap — reject if at limit
105
+ if (sessions.size >= maxSessions) {
106
+ process.stderr.write(`[agentd] max sessions (${maxSessions}) reached, rejecting\n`);
107
+ res.writeHead(503, {
108
+ 'Content-Type': 'application/json',
109
+ 'Retry-After': '60',
110
+ });
111
+ res.end(JSON.stringify({
112
+ jsonrpc: '2.0',
113
+ error: { code: -32000, message: 'Too many sessions' },
114
+ id: null,
115
+ }));
116
+ return;
117
+ }
62
118
  // New session — create transport + server instance
63
119
  let transport;
64
120
  try {
@@ -78,12 +134,14 @@ async function startHttpTransport(createMcpServerFn, port = constants_1.DEFAULT_
78
134
  mcpServer = factoryResult.server;
79
135
  onClientInfo = factoryResult.onClientInfo;
80
136
  }
81
- // Track session cleanup
137
+ // Track session cleanup on explicit close (DELETE request or transport teardown)
82
138
  const t = transport;
83
139
  t.onclose = () => {
84
140
  const sid = t.sessionId;
85
- if (sid)
141
+ if (sid && sessions.has(sid)) {
86
142
  sessions.delete(sid);
143
+ process.stderr.write(`[agentd] session ${shortId(sid)}… closed (remaining: ${sessions.size})\n`);
144
+ }
87
145
  };
88
146
  // Set up oninitialized BEFORE connect to capture clientInfo from MCP handshake
89
147
  if (onClientInfo) {
@@ -100,16 +158,21 @@ async function startHttpTransport(createMcpServerFn, port = constants_1.DEFAULT_
100
158
  await transport.handleRequest(req, res);
101
159
  // Store session after handleRequest (sessionId becomes available)
102
160
  if (transport.sessionId) {
103
- sessions.set(transport.sessionId, { transport, server: mcpServer });
161
+ sessions.set(transport.sessionId, {
162
+ transport,
163
+ server: mcpServer,
164
+ lastActivity: Date.now(),
165
+ });
166
+ process.stderr.write(`[agentd] new session ${shortId(transport.sessionId)}… (total: ${sessions.size})\n`);
104
167
  }
105
168
  }
106
169
  catch (err) {
107
170
  const message = err instanceof Error ? err.message : String(err);
108
- process.stderr.write(`[ERROR] Failed to create MCP session: ${message}\n`);
171
+ process.stderr.write(`[agentd] [ERROR] Failed to create MCP session: ${message}\n`);
109
172
  // Clean up transport if it was created before the error
110
173
  if (transport) {
111
174
  try {
112
- transport.close?.();
175
+ await closeWithTimeout(transport);
113
176
  }
114
177
  catch { /* best-effort cleanup */ }
115
178
  }
@@ -136,11 +199,18 @@ async function startHttpTransport(createMcpServerFn, port = constants_1.DEFAULT_
136
199
  port,
137
200
  host,
138
201
  sessionCount: () => sessions.size,
139
- close: () => {
140
- // Graceful shutdown: close all sessions first
141
- for (const [, session] of sessions) {
142
- session.transport.close?.();
143
- }
202
+ close: async () => {
203
+ clearInterval(reaperInterval);
204
+ // Graceful shutdown: close all sessions in parallel
205
+ const closePromises = [...sessions].map(async ([sid, session]) => {
206
+ process.stderr.write(`[agentd] shutting down session ${shortId(sid)}…\n`);
207
+ try {
208
+ await closeWithTimeout(session.transport);
209
+ await closeWithTimeout(session.server);
210
+ }
211
+ catch { /* best-effort — includes close timeout */ }
212
+ });
213
+ await Promise.all(closePromises);
144
214
  sessions.clear();
145
215
  // Force-close all keep-alive connections (Node 18.2+)
146
216
  httpServer.closeAllConnections();
@@ -1 +1 @@
1
- {"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../../../src/adapter/mcp/http-transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../../../src/adapter/mcp/http-transport.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,11 @@
1
1
  /** Default port for the VESS daemon HTTP transport. */
2
2
  export declare const DEFAULT_DAEMON_PORT = 3100;
3
+ /** Session inactivity timeout in ms (10 minutes). */
4
+ export declare const DEFAULT_SESSION_TIMEOUT_MS: number;
5
+ /** Maximum concurrent MCP sessions. */
6
+ export declare const DEFAULT_MAX_SESSIONS = 20;
7
+ /** Session count threshold for "degraded" health status. */
8
+ export declare const SESSION_DEGRADED_THRESHOLD = 15;
9
+ /** Reaper sweep interval in ms (60 seconds). */
10
+ export declare const DEFAULT_REAPER_INTERVAL_MS = 60000;
3
11
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,OAAO,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,OAAO,CAAA;AAEvC,qDAAqD;AACrD,eAAO,MAAM,0BAA0B,QAAiB,CAAA;AAExD,uCAAuC;AACvC,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC,4DAA4D;AAC5D,eAAO,MAAM,0BAA0B,KAAK,CAAA;AAE5C,gDAAgD;AAChD,eAAO,MAAM,0BAA0B,QAAS,CAAA"}
@@ -1,6 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_DAEMON_PORT = void 0;
3
+ exports.DEFAULT_REAPER_INTERVAL_MS = exports.SESSION_DEGRADED_THRESHOLD = exports.DEFAULT_MAX_SESSIONS = exports.DEFAULT_SESSION_TIMEOUT_MS = exports.DEFAULT_DAEMON_PORT = void 0;
4
4
  /** Default port for the VESS daemon HTTP transport. */
5
5
  exports.DEFAULT_DAEMON_PORT = 3100;
6
+ /** Session inactivity timeout in ms (10 minutes). */
7
+ exports.DEFAULT_SESSION_TIMEOUT_MS = 10 * 60 * 1000;
8
+ /** Maximum concurrent MCP sessions. */
9
+ exports.DEFAULT_MAX_SESSIONS = 20;
10
+ /** Session count threshold for "degraded" health status. */
11
+ exports.SESSION_DEGRADED_THRESHOLD = 15;
12
+ /** Reaper sweep interval in ms (60 seconds). */
13
+ exports.DEFAULT_REAPER_INTERVAL_MS = 60_000;
6
14
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":";;;AAAA,uDAAuD;AAC1C,QAAA,mBAAmB,GAAG,IAAI,CAAA"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":";;;AAAA,uDAAuD;AAC1C,QAAA,mBAAmB,GAAG,IAAI,CAAA;AAEvC,qDAAqD;AACxC,QAAA,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAExD,uCAAuC;AAC1B,QAAA,oBAAoB,GAAG,EAAE,CAAA;AAEtC,4DAA4D;AAC/C,QAAA,0BAA0B,GAAG,EAAE,CAAA;AAE5C,gDAAgD;AACnC,QAAA,0BAA0B,GAAG,MAAM,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vess-id/vess",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "VESS local AI agent runtime — manages agent identity, permissions, and execution boundaries",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",