@monoes/mcp 1.0.4 → 1.0.7

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 (54) hide show
  1. package/README.md +1 -1
  2. package/dist/protocol-types.d.ts +182 -0
  3. package/dist/protocol-types.d.ts.map +1 -0
  4. package/dist/protocol-types.js +8 -0
  5. package/dist/protocol-types.js.map +1 -0
  6. package/dist/resource-helpers.d.ts +32 -0
  7. package/dist/resource-helpers.d.ts.map +1 -0
  8. package/dist/resource-helpers.js +77 -0
  9. package/dist/resource-helpers.js.map +1 -0
  10. package/dist/resource-registry.d.ts +2 -24
  11. package/dist/resource-registry.d.ts.map +1 -1
  12. package/dist/resource-registry.js +1 -70
  13. package/dist/resource-registry.js.map +1 -1
  14. package/dist/server-builtins.d.ts +12 -0
  15. package/dist/server-builtins.d.ts.map +1 -0
  16. package/dist/server-builtins.js +165 -0
  17. package/dist/server-builtins.js.map +1 -0
  18. package/dist/server-core.d.ts +118 -0
  19. package/dist/server-core.d.ts.map +1 -0
  20. package/dist/server-core.js +343 -0
  21. package/dist/server-core.js.map +1 -0
  22. package/dist/server-handlers.d.ts +17 -0
  23. package/dist/server-handlers.d.ts.map +1 -0
  24. package/dist/server-handlers.js +173 -0
  25. package/dist/server-handlers.js.map +1 -0
  26. package/dist/server-routing.d.ts +16 -0
  27. package/dist/server-routing.d.ts.map +1 -0
  28. package/dist/server-routing.js +194 -0
  29. package/dist/server-routing.js.map +1 -0
  30. package/dist/server.d.ts +2 -115
  31. package/dist/server.d.ts.map +1 -1
  32. package/dist/server.js +2 -839
  33. package/dist/server.js.map +1 -1
  34. package/dist/transport/http-base.d.ts +84 -0
  35. package/dist/transport/http-base.d.ts.map +1 -0
  36. package/dist/transport/http-base.js +238 -0
  37. package/dist/transport/http-base.js.map +1 -0
  38. package/dist/transport/http.d.ts +5 -69
  39. package/dist/transport/http.d.ts.map +1 -1
  40. package/dist/transport/http.js +3 -228
  41. package/dist/transport/http.js.map +1 -1
  42. package/dist/transport/websocket-base.d.ts +71 -0
  43. package/dist/transport/websocket-base.d.ts.map +1 -0
  44. package/dist/transport/websocket-base.js +199 -0
  45. package/dist/transport/websocket-base.js.map +1 -0
  46. package/dist/transport/websocket.d.ts +4 -63
  47. package/dist/transport/websocket.d.ts.map +1 -1
  48. package/dist/transport/websocket.js +3 -191
  49. package/dist/transport/websocket.js.map +1 -1
  50. package/dist/types.d.ts +1 -174
  51. package/dist/types.d.ts.map +1 -1
  52. package/dist/types.js +5 -0
  53. package/dist/types.js.map +1 -1
  54. package/package.json +4 -4
@@ -0,0 +1,165 @@
1
+ /**
2
+ * @monoes/mcp - MCP Server (built-ins)
3
+ *
4
+ * Built-in system tools, resources and prompts registered on start().
5
+ */
6
+ import { arch, platform } from 'node:os';
7
+ import { MCPServerCore } from './server-core.js';
8
+ export class MCPServerBuiltins extends MCPServerCore {
9
+ async registerBuiltInTools() {
10
+ this.registerTool({
11
+ name: 'system/info',
12
+ description: 'Get system information',
13
+ inputSchema: { type: 'object', properties: {} },
14
+ handler: async () => ({
15
+ name: this.serverInfo.name,
16
+ version: this.serverInfo.version,
17
+ platform: platform(),
18
+ arch: arch(),
19
+ runtime: 'Node.js',
20
+ uptime: this.startTime ? Date.now() - this.startTime.getTime() : 0,
21
+ }),
22
+ category: 'system',
23
+ });
24
+ this.registerTool({
25
+ name: 'system/health',
26
+ description: 'Get system health status',
27
+ inputSchema: { type: 'object', properties: {} },
28
+ handler: async () => await this.getHealthStatus(),
29
+ category: 'system',
30
+ cacheable: true,
31
+ cacheTTL: 2000,
32
+ });
33
+ this.registerTool({
34
+ name: 'system/metrics',
35
+ description: 'Get server metrics',
36
+ inputSchema: { type: 'object', properties: {} },
37
+ handler: async () => this.getMetrics(),
38
+ category: 'system',
39
+ cacheable: true,
40
+ cacheTTL: 1000,
41
+ });
42
+ this.registerTool({
43
+ name: 'tools/list-detailed',
44
+ description: 'List all registered tools with details',
45
+ inputSchema: {
46
+ type: 'object',
47
+ properties: {
48
+ category: { type: 'string', description: 'Filter by category' },
49
+ },
50
+ },
51
+ handler: async (input) => {
52
+ const params = input;
53
+ if (params.category) {
54
+ return this.toolRegistry.getByCategory(params.category);
55
+ }
56
+ return this.toolRegistry.listTools();
57
+ },
58
+ category: 'system',
59
+ });
60
+ this.logger.info('Built-in tools registered', {
61
+ count: 4,
62
+ });
63
+ }
64
+ // P2-1: Populate the Resources registry with system-level resources.
65
+ // The registry scaffolding always shipped empty — these adapter registrations
66
+ // surface monomind's state to MCP clients as app-driven context.
67
+ registerBuiltInResources() {
68
+ this.resourceRegistry.registerResource({
69
+ uri: 'monomind://system/status',
70
+ name: 'System Status',
71
+ description: 'Current monomind MCP server health, uptime, and tool count',
72
+ mimeType: 'application/json',
73
+ }, async (uri) => [
74
+ {
75
+ uri,
76
+ mimeType: 'application/json',
77
+ text: JSON.stringify({
78
+ status: 'running',
79
+ uptime: this.startTime ? Date.now() - this.startTime.getTime() : 0,
80
+ tools: this.toolRegistry.listTools().length,
81
+ version: this.serverInfo.version,
82
+ }, null, 2),
83
+ },
84
+ ]);
85
+ this.resourceRegistry.registerResource({
86
+ uri: 'monomind://system/metrics',
87
+ name: 'Server Metrics',
88
+ description: 'Request count, cache hit rate, error rate',
89
+ mimeType: 'application/json',
90
+ }, async (uri) => [
91
+ {
92
+ uri,
93
+ mimeType: 'application/json',
94
+ text: JSON.stringify(this.getMetrics(), null, 2),
95
+ },
96
+ ]);
97
+ this.resourceRegistry.registerResource({
98
+ uri: 'monomind://system/tools',
99
+ name: 'Tool Inventory',
100
+ description: 'Complete list of registered MCP tools with categories',
101
+ mimeType: 'application/json',
102
+ }, async (uri) => [
103
+ {
104
+ uri,
105
+ mimeType: 'application/json',
106
+ text: JSON.stringify(this.toolRegistry.listTools(), null, 2),
107
+ },
108
+ ]);
109
+ this.logger.info('Built-in resources registered', { count: 3 });
110
+ }
111
+ // P2-2: Populate the Prompts registry with curated workflow templates.
112
+ // These give MCP clients pre-built prompt structures for common dev tasks.
113
+ registerBuiltInPrompts() {
114
+ this.promptRegistry.register({
115
+ name: 'monomind:research-plan',
116
+ description: 'Generate a structured research plan for a topic',
117
+ arguments: [{ name: 'topic', description: 'The research topic', required: true }],
118
+ handler: async (args) => [
119
+ {
120
+ role: 'user',
121
+ content: {
122
+ type: 'text',
123
+ text: `Research plan for: ${args.topic ?? '(unspecified)'}\n\n1. Define scope and key questions\n2. Identify sources and prior work\n3. Outline methodology\n4. Execute research (parallel agents if appropriate)\n5. Synthesize findings\n6. Review and refine`,
124
+ },
125
+ },
126
+ ],
127
+ });
128
+ this.promptRegistry.register({
129
+ name: 'monomind:pr-review',
130
+ description: 'Structured pull-request review checklist',
131
+ arguments: [{ name: 'changes', description: 'Description of the changes', required: true }],
132
+ handler: async (args) => [
133
+ {
134
+ role: 'user',
135
+ content: {
136
+ type: 'text',
137
+ text: `PR Review checklist for: ${args.changes ?? '(unspecified)'}\n\n- [ ] Correctness: does the code do what it claims?\n- [ ] Tests: are there tests covering the changes?\n- [ ] Security: any input validation gaps?\n- [ ] Performance: any O(n²) or unnecessary allocations?\n- [ ] Docs: are relevant docs updated?\n- [ ] Breaking changes: any removed APIs or changed behavior?\n- [ ] Honesty: any fabricated metrics or misleading output?`,
138
+ },
139
+ },
140
+ ],
141
+ });
142
+ this.promptRegistry.register({
143
+ name: 'monomind:debug-protocol',
144
+ description: 'Systematic root-cause debugging protocol (4-phase)',
145
+ arguments: [
146
+ {
147
+ name: 'symptom',
148
+ description: 'Description of the bug or unexpected behavior',
149
+ required: true,
150
+ },
151
+ ],
152
+ handler: async (args) => [
153
+ {
154
+ role: 'user',
155
+ content: {
156
+ type: 'text',
157
+ text: `Debug protocol for: ${args.symptom ?? '(unspecified)'}\n\nPhase 1 — REPRODUCE: Write a test that triggers the bug. Verify it fails.\nPhase 2 — ISOLATE: Binary-search the cause. What's the smallest change that triggers it?\nPhase 3 — FIX: Make the test pass with the minimal code change.\nPhase 4 — VERIFY: Run the full test suite. Confirm no regressions.`,
158
+ },
159
+ },
160
+ ],
161
+ });
162
+ this.logger.info('Built-in prompts registered', { count: 3 });
163
+ }
164
+ }
165
+ //# sourceMappingURL=server-builtins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-builtins.js","sourceRoot":"","sources":["../src/server-builtins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * @monoes/mcp - MCP Server (core)
3
+ *
4
+ * Server state, sub-system wiring, public registry/metrics accessors,
5
+ * per-connection session binding and event forwarding. Extended by the
6
+ * handler layers and finally MCPServer (server.ts).
7
+ */
8
+ import { EventEmitter } from 'node:events';
9
+ import { type ConnectionPool } from './connection-pool.js';
10
+ import { type PromptRegistry } from './prompt-registry.js';
11
+ import { type RateLimiter } from './rate-limiter.js';
12
+ import { type ResourceRegistry } from './resource-registry.js';
13
+ import { type LLMProvider, type SamplingManager } from './sampling.js';
14
+ import { type SessionManager } from './session-manager.js';
15
+ import { type TaskManager } from './task-manager.js';
16
+ import { type ToolRegistry } from './tool-registry.js';
17
+ import type { ILogger, ITransport, MCPCapabilities, MCPProtocolVersion, MCPResponse, MCPServerConfig, MCPServerMetrics, MCPSession, MCPTool } from './types.js';
18
+ export declare abstract class MCPServerCore extends EventEmitter {
19
+ protected readonly logger: ILogger;
20
+ protected readonly orchestrator?: unknown;
21
+ protected readonly swarmCoordinator?: unknown;
22
+ protected readonly config: MCPServerConfig;
23
+ protected readonly toolRegistry: ToolRegistry;
24
+ protected readonly sessionManager: SessionManager;
25
+ protected readonly resourceRegistry: ResourceRegistry;
26
+ protected readonly promptRegistry: PromptRegistry;
27
+ protected readonly taskManager: TaskManager;
28
+ protected readonly connectionPool?: ConnectionPool;
29
+ protected readonly rateLimiter: RateLimiter;
30
+ protected readonly samplingManager: SamplingManager;
31
+ protected transport?: ITransport;
32
+ protected running: boolean;
33
+ protected startTime?: Date;
34
+ protected startupDuration?: number;
35
+ protected currentSession?: MCPSession;
36
+ protected readonly connectionSessions: Map<string, MCPSession>;
37
+ protected resourceSubscriptions: Map<string, Map<string, string>>;
38
+ protected readonly serverInfo: {
39
+ name: string;
40
+ version: string;
41
+ };
42
+ protected readonly protocolVersion: MCPProtocolVersion;
43
+ protected capabilities: MCPCapabilities;
44
+ protected requestStats: {
45
+ total: number;
46
+ successful: number;
47
+ failed: number;
48
+ totalResponseTime: number;
49
+ };
50
+ constructor(config: Partial<MCPServerConfig>, logger: ILogger, orchestrator?: unknown, swarmCoordinator?: unknown);
51
+ /**
52
+ * Get resource registry for external registration
53
+ */
54
+ getResourceRegistry(): ResourceRegistry;
55
+ /**
56
+ * Get prompt registry for external registration
57
+ */
58
+ getPromptRegistry(): PromptRegistry;
59
+ /**
60
+ * Get task manager for async operations
61
+ */
62
+ getTaskManager(): TaskManager;
63
+ /**
64
+ * Get rate limiter for configuration
65
+ */
66
+ getRateLimiter(): RateLimiter;
67
+ /**
68
+ * Get sampling manager for LLM provider registration
69
+ */
70
+ getSamplingManager(): SamplingManager;
71
+ /**
72
+ * Register an LLM provider for sampling
73
+ */
74
+ registerLLMProvider(provider: LLMProvider, isDefault?: boolean): void;
75
+ registerTool(tool: MCPTool): boolean;
76
+ registerTools(tools: MCPTool[]): {
77
+ registered: number;
78
+ failed: string[];
79
+ };
80
+ unregisterTool(name: string): boolean;
81
+ getHealthStatus(): Promise<{
82
+ healthy: boolean;
83
+ error?: string;
84
+ metrics?: Record<string, number>;
85
+ }>;
86
+ getMetrics(): MCPServerMetrics;
87
+ getSessions(): MCPSession[];
88
+ getSession(sessionId: string): MCPSession | undefined;
89
+ /**
90
+ * Resolve the session bound to a connection without creating one.
91
+ * Multi-client transports (http, websocket) pass a `connectionId`, which is
92
+ * looked up in `connectionSessions`. Single-client transports (stdio,
93
+ * in-process) omit it, falling back to the `currentSession` singleton.
94
+ */
95
+ protected getSessionForConnection(connectionId?: string): MCPSession | undefined;
96
+ /**
97
+ * Bind a newly-created session to a connection: per-connectionId when the
98
+ * transport supports multiple clients, otherwise the singleton fallback.
99
+ */
100
+ protected bindSessionToConnection(session: MCPSession, connectionId?: string): void;
101
+ /**
102
+ * Tear down the session owned by a connection when the transport reports
103
+ * that connection has closed — prevents closed clients' sessions (and any
104
+ * resource subscriptions) from lingering until the idle-timeout sweep.
105
+ */
106
+ protected closeConnectionSession(connectionId: string): void;
107
+ /**
108
+ * Detach every registry subscription owned by a session. Called whenever a
109
+ * session ends (terminated, connection closed, expired, server stopped) so
110
+ * no update callback outlives its session (issue #92).
111
+ */
112
+ protected purgeSessionSubscriptions(sessionId: string): void;
113
+ protected sendNotification(method: string, params?: Record<string, unknown>): Promise<void>;
114
+ protected getOrCreateSession(connectionId?: string): MCPSession;
115
+ protected createErrorResponse(id: string | number | null, code: number, message: string): MCPResponse;
116
+ private setupEventHandlers;
117
+ }
118
+ //# sourceMappingURL=server-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-core.d.ts","sourceRoot":"","sources":["../src/server-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,343 @@
1
+ /**
2
+ * @monoes/mcp - MCP Server (core)
3
+ *
4
+ * Server state, sub-system wiring, public registry/metrics accessors,
5
+ * per-connection session binding and event forwarding. Extended by the
6
+ * handler layers and finally MCPServer (server.ts).
7
+ */
8
+ import { EventEmitter } from 'node:events';
9
+ import { createConnectionPool } from './connection-pool.js';
10
+ import { createPromptRegistry } from './prompt-registry.js';
11
+ import { createRateLimiter } from './rate-limiter.js';
12
+ import { createResourceRegistry } from './resource-registry.js';
13
+ import { createSamplingManager } from './sampling.js';
14
+ import { createSessionManager } from './session-manager.js';
15
+ import { createTaskManager } from './task-manager.js';
16
+ import { createToolRegistry } from './tool-registry.js';
17
+ const DEFAULT_CONFIG = {
18
+ name: 'Monomind MCP Server V1',
19
+ version: '3.0.0',
20
+ transport: 'stdio',
21
+ host: 'localhost',
22
+ port: 3000,
23
+ enableMetrics: true,
24
+ enableCaching: true,
25
+ cacheTTL: 10000,
26
+ logLevel: 'info',
27
+ requestTimeout: 30000,
28
+ maxRequestSize: 10 * 1024 * 1024,
29
+ };
30
+ export class MCPServerCore extends EventEmitter {
31
+ logger;
32
+ orchestrator;
33
+ swarmCoordinator;
34
+ config;
35
+ toolRegistry;
36
+ sessionManager;
37
+ resourceRegistry;
38
+ promptRegistry;
39
+ taskManager;
40
+ connectionPool;
41
+ rateLimiter;
42
+ samplingManager;
43
+ transport;
44
+ running = false;
45
+ startTime;
46
+ startupDuration;
47
+ // Fallback singleton session, used only for transports that are inherently
48
+ // single-client (stdio, in-process) where the transport never supplies a
49
+ // connectionId to handleRequest/handleNotification.
50
+ currentSession;
51
+ // connectionId -> session, for multi-client transports (http, websocket).
52
+ // Without this, every connection shared `currentSession` above and a
53
+ // second client's `initialize` would silently reassign the session out
54
+ // from under the first client (issue #93).
55
+ connectionSessions = new Map();
56
+ // sessionId -> (uri -> subscriptionId). The registry-issued subscriptionId
57
+ // must be retained so resources/unsubscribe (and session teardown) can call
58
+ // resourceRegistry.unsubscribe(id) — without it callbacks leak and phantom
59
+ // notifications fire after unsubscribe (issue #92).
60
+ resourceSubscriptions = new Map();
61
+ serverInfo = {
62
+ name: 'Monomind MCP Server V1',
63
+ version: '3.0.0',
64
+ };
65
+ // MCP 2025-11-25 protocol version
66
+ protocolVersion = {
67
+ major: 2025,
68
+ minor: 11,
69
+ patch: 25,
70
+ };
71
+ // Full MCP 2025-11-25 capabilities
72
+ capabilities = {
73
+ logging: { level: 'info' },
74
+ tools: { listChanged: true },
75
+ resources: { listChanged: true, subscribe: true },
76
+ prompts: { listChanged: true },
77
+ sampling: {},
78
+ };
79
+ requestStats = {
80
+ total: 0,
81
+ successful: 0,
82
+ failed: 0,
83
+ totalResponseTime: 0,
84
+ };
85
+ constructor(config, logger, orchestrator, swarmCoordinator) {
86
+ super();
87
+ this.logger = logger;
88
+ this.orchestrator = orchestrator;
89
+ this.swarmCoordinator = swarmCoordinator;
90
+ this.config = { ...DEFAULT_CONFIG, ...config };
91
+ this.toolRegistry = createToolRegistry(logger);
92
+ this.sessionManager = createSessionManager(logger, {
93
+ maxSessions: 100,
94
+ sessionTimeout: 30 * 60 * 1000,
95
+ });
96
+ this.resourceRegistry = createResourceRegistry(logger, {
97
+ enableSubscriptions: true,
98
+ cacheEnabled: true,
99
+ cacheTTL: 60000,
100
+ });
101
+ this.promptRegistry = createPromptRegistry(logger);
102
+ this.taskManager = createTaskManager(logger, {
103
+ maxConcurrentTasks: 10,
104
+ taskTimeout: 300000,
105
+ });
106
+ this.rateLimiter = createRateLimiter(logger, {
107
+ requestsPerSecond: 100,
108
+ burstSize: 200,
109
+ perSessionLimit: 50,
110
+ });
111
+ this.samplingManager = createSamplingManager(logger);
112
+ if (this.config.connectionPool) {
113
+ this.connectionPool = createConnectionPool(this.config.connectionPool, logger, this.config.transport);
114
+ }
115
+ this.setupEventHandlers();
116
+ }
117
+ /**
118
+ * Get resource registry for external registration
119
+ */
120
+ getResourceRegistry() {
121
+ return this.resourceRegistry;
122
+ }
123
+ /**
124
+ * Get prompt registry for external registration
125
+ */
126
+ getPromptRegistry() {
127
+ return this.promptRegistry;
128
+ }
129
+ /**
130
+ * Get task manager for async operations
131
+ */
132
+ getTaskManager() {
133
+ return this.taskManager;
134
+ }
135
+ /**
136
+ * Get rate limiter for configuration
137
+ */
138
+ getRateLimiter() {
139
+ return this.rateLimiter;
140
+ }
141
+ /**
142
+ * Get sampling manager for LLM provider registration
143
+ */
144
+ getSamplingManager() {
145
+ return this.samplingManager;
146
+ }
147
+ /**
148
+ * Register an LLM provider for sampling
149
+ */
150
+ registerLLMProvider(provider, isDefault = false) {
151
+ this.samplingManager.registerProvider(provider, isDefault);
152
+ }
153
+ registerTool(tool) {
154
+ return this.toolRegistry.register(tool);
155
+ }
156
+ registerTools(tools) {
157
+ return this.toolRegistry.registerBatch(tools);
158
+ }
159
+ unregisterTool(name) {
160
+ return this.toolRegistry.unregister(name);
161
+ }
162
+ async getHealthStatus() {
163
+ try {
164
+ const transportHealth = this.transport
165
+ ? await this.transport.getHealthStatus()
166
+ : { healthy: false, error: 'Transport not initialized' };
167
+ const sessionMetrics = this.sessionManager.getSessionMetrics();
168
+ const poolStats = this.connectionPool?.getStats();
169
+ const metrics = {
170
+ registeredTools: this.toolRegistry.getToolCount(),
171
+ totalRequests: this.requestStats.total,
172
+ successfulRequests: this.requestStats.successful,
173
+ failedRequests: this.requestStats.failed,
174
+ totalSessions: sessionMetrics.total,
175
+ activeSessions: sessionMetrics.active,
176
+ ...(transportHealth.metrics || {}),
177
+ };
178
+ if (poolStats) {
179
+ metrics.poolConnections = poolStats.totalConnections;
180
+ metrics.poolIdleConnections = poolStats.idleConnections;
181
+ metrics.poolBusyConnections = poolStats.busyConnections;
182
+ }
183
+ return {
184
+ healthy: this.running && transportHealth.healthy,
185
+ error: transportHealth.error,
186
+ metrics,
187
+ };
188
+ }
189
+ catch (error) {
190
+ return {
191
+ healthy: false,
192
+ error: error instanceof Error ? error.message : 'Unknown error',
193
+ };
194
+ }
195
+ }
196
+ getMetrics() {
197
+ const sessionMetrics = this.sessionManager.getSessionMetrics();
198
+ const registryStats = this.toolRegistry.getStats();
199
+ return {
200
+ totalRequests: this.requestStats.total,
201
+ successfulRequests: this.requestStats.successful,
202
+ failedRequests: this.requestStats.failed,
203
+ averageResponseTime: this.requestStats.total > 0
204
+ ? this.requestStats.totalResponseTime / this.requestStats.total
205
+ : 0,
206
+ activeSessions: sessionMetrics.active,
207
+ toolInvocations: Object.fromEntries(registryStats.topTools.map((t) => [t.name, t.calls])),
208
+ errors: {},
209
+ lastReset: this.startTime || new Date(),
210
+ startupTime: this.startupDuration,
211
+ uptime: this.startTime ? Date.now() - this.startTime.getTime() : 0,
212
+ };
213
+ }
214
+ getSessions() {
215
+ return this.sessionManager.getActiveSessions();
216
+ }
217
+ getSession(sessionId) {
218
+ return this.sessionManager.getSession(sessionId);
219
+ }
220
+ /**
221
+ * Resolve the session bound to a connection without creating one.
222
+ * Multi-client transports (http, websocket) pass a `connectionId`, which is
223
+ * looked up in `connectionSessions`. Single-client transports (stdio,
224
+ * in-process) omit it, falling back to the `currentSession` singleton.
225
+ */
226
+ getSessionForConnection(connectionId) {
227
+ if (connectionId) {
228
+ return this.connectionSessions.get(connectionId);
229
+ }
230
+ return this.currentSession;
231
+ }
232
+ /**
233
+ * Bind a newly-created session to a connection: per-connectionId when the
234
+ * transport supports multiple clients, otherwise the singleton fallback.
235
+ */
236
+ bindSessionToConnection(session, connectionId) {
237
+ if (connectionId) {
238
+ this.connectionSessions.set(connectionId, session);
239
+ }
240
+ else {
241
+ this.currentSession = session;
242
+ }
243
+ }
244
+ /**
245
+ * Tear down the session owned by a connection when the transport reports
246
+ * that connection has closed — prevents closed clients' sessions (and any
247
+ * resource subscriptions) from lingering until the idle-timeout sweep.
248
+ */
249
+ closeConnectionSession(connectionId) {
250
+ const session = this.connectionSessions.get(connectionId);
251
+ this.connectionSessions.delete(connectionId);
252
+ if (session) {
253
+ // closeSession emits 'session:closed', which purges the session's
254
+ // resource subscriptions (see setupEventHandlers).
255
+ this.sessionManager.closeSession(session.id, 'Connection closed');
256
+ }
257
+ }
258
+ /**
259
+ * Detach every registry subscription owned by a session. Called whenever a
260
+ * session ends (terminated, connection closed, expired, server stopped) so
261
+ * no update callback outlives its session (issue #92).
262
+ */
263
+ purgeSessionSubscriptions(sessionId) {
264
+ const sessionSubs = this.resourceSubscriptions.get(sessionId);
265
+ if (!sessionSubs) {
266
+ return;
267
+ }
268
+ for (const subscriptionId of sessionSubs.values()) {
269
+ this.resourceRegistry.unsubscribe(subscriptionId);
270
+ }
271
+ this.resourceSubscriptions.delete(sessionId);
272
+ }
273
+ // ============================================================================
274
+ // Notification Sender
275
+ // ============================================================================
276
+ async sendNotification(method, params) {
277
+ if (this.transport?.sendNotification) {
278
+ await this.transport.sendNotification({
279
+ jsonrpc: '2.0',
280
+ method,
281
+ params,
282
+ });
283
+ }
284
+ }
285
+ getOrCreateSession(connectionId) {
286
+ const existing = this.getSessionForConnection(connectionId);
287
+ if (existing) {
288
+ return existing;
289
+ }
290
+ // A client is calling a non-initialize method on a connection that never
291
+ // sent `initialize` (or whose session already expired). Create a fresh
292
+ // session bound to this specific connection rather than reusing/
293
+ // overwriting another client's session.
294
+ const session = this.sessionManager.createSession(this.config.transport);
295
+ this.bindSessionToConnection(session, connectionId);
296
+ return session;
297
+ }
298
+ createErrorResponse(id, code, message) {
299
+ return {
300
+ jsonrpc: '2.0',
301
+ id,
302
+ error: { code, message },
303
+ };
304
+ }
305
+ setupEventHandlers() {
306
+ this.toolRegistry.on('tool:registered', (name) => {
307
+ this.emit('tool:registered', name);
308
+ });
309
+ this.toolRegistry.on('tool:called', (data) => {
310
+ this.emit('tool:called', data);
311
+ });
312
+ this.toolRegistry.on('tool:completed', (data) => {
313
+ this.emit('tool:completed', data);
314
+ });
315
+ this.toolRegistry.on('tool:error', (data) => {
316
+ this.emit('tool:error', data);
317
+ });
318
+ this.sessionManager.on('session:created', (session) => {
319
+ this.emit('session:created', session);
320
+ });
321
+ this.sessionManager.on('session:closed', (data) => {
322
+ this.purgeSessionSubscriptions(data.session.id);
323
+ this.emit('session:closed', data);
324
+ });
325
+ this.sessionManager.on('session:expired', (session) => {
326
+ this.purgeSessionSubscriptions(session.id);
327
+ // Drop references to the expired session — otherwise `currentSession` /
328
+ // `connectionSessions` keep pointing at a session the manager has
329
+ // already reaped, and subsequent updateActivity calls fail silently
330
+ // against the ghost (issue #93).
331
+ if (this.currentSession?.id === session.id) {
332
+ this.currentSession = undefined;
333
+ }
334
+ for (const [connectionId, s] of this.connectionSessions) {
335
+ if (s.id === session.id) {
336
+ this.connectionSessions.delete(connectionId);
337
+ }
338
+ }
339
+ this.emit('session:expired', session);
340
+ });
341
+ }
342
+ }
343
+ //# sourceMappingURL=server-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-core.js","sourceRoot":"","sources":["../src/server-core.ts"],"names":[],"mappings":"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"}