@1mcp/agent 0.29.0-beta5 → 0.29.0-beta7
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/build/config/configLoader.d.ts.map +1 -1
- package/build/config/configLoader.js +20 -2
- package/build/config/configLoader.js.map +1 -1
- package/build/constants/mcp.d.ts +1 -1
- package/build/constants/mcp.js +1 -1
- package/build/constants/paths.d.ts +5 -1
- package/build/constants/paths.d.ts.map +1 -1
- package/build/constants/paths.js +7 -1
- package/build/constants/paths.js.map +1 -1
- package/build/constants/schema.d.ts +35 -0
- package/build/constants/schema.d.ts.map +1 -0
- package/build/constants/schema.js +35 -0
- package/build/constants/schema.js.map +1 -0
- package/build/core/tools/handlers/serverManagementHandler.d.ts +5 -5
- package/build/core/tools/internal/adapters/helpers/configTransformers.d.ts +1 -1
- package/build/core/types/transport.d.ts +5 -4
- package/build/core/types/transport.d.ts.map +1 -1
- package/build/core/types/transport.js +71 -38
- package/build/core/types/transport.js.map +1 -1
- package/build/template/handlebarsTemplateRenderer.d.ts +7 -0
- package/build/template/handlebarsTemplateRenderer.d.ts.map +1 -1
- package/build/template/handlebarsTemplateRenderer.js +15 -0
- package/build/template/handlebarsTemplateRenderer.js.map +1 -1
- package/build/transport/http/restorableStreamableTransport.d.ts +56 -11
- package/build/transport/http/restorableStreamableTransport.d.ts.map +1 -1
- package/build/transport/http/restorableStreamableTransport.js +93 -21
- package/build/transport/http/restorableStreamableTransport.js.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts +2 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.js +77 -238
- package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -1
- package/build/transport/http/utils/sdkInternals.d.ts +32 -0
- package/build/transport/http/utils/sdkInternals.d.ts.map +1 -0
- package/build/transport/http/utils/sdkInternals.js +6 -0
- package/build/transport/http/utils/sdkInternals.js.map +1 -0
- package/build/transport/http/utils/sessionService.d.ts +76 -0
- package/build/transport/http/utils/sessionService.d.ts.map +1 -0
- package/build/transport/http/utils/sessionService.js +232 -0
- package/build/transport/http/utils/sessionService.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
3
|
+
import { AUTH_CONFIG } from '../../../constants.js';
|
|
4
|
+
import { ServerStatus } from '../../../core/types/index.js';
|
|
5
|
+
import logger from '../../../logger/logger.js';
|
|
6
|
+
import { RestorableStreamableHTTPServerTransport } from '../../../transport/http/restorableStreamableTransport.js';
|
|
7
|
+
/**
|
|
8
|
+
* Validates a session ID format.
|
|
9
|
+
*
|
|
10
|
+
* @param sessionId - The session ID to validate
|
|
11
|
+
* @returns true if the session ID is valid, false otherwise
|
|
12
|
+
*/
|
|
13
|
+
function isValidSessionId(sessionId) {
|
|
14
|
+
return typeof sessionId === 'string' && sessionId.trim().length > 0;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Service to handle session management logic for Streamable HTTP transport.
|
|
18
|
+
* Encapsulates creation, restoration, and cleanup of sessions.
|
|
19
|
+
*/
|
|
20
|
+
export class SessionService {
|
|
21
|
+
serverManager;
|
|
22
|
+
sessionRepository;
|
|
23
|
+
asyncOrchestrator;
|
|
24
|
+
constructor(serverManager, sessionRepository, asyncOrchestrator) {
|
|
25
|
+
this.serverManager = serverManager;
|
|
26
|
+
this.sessionRepository = sessionRepository;
|
|
27
|
+
this.asyncOrchestrator = asyncOrchestrator;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Retrieves an existing session transport or tries to restore it.
|
|
31
|
+
*
|
|
32
|
+
* @param sessionId - The session ID to retrieve
|
|
33
|
+
* @returns The transport if found or restored successfully, null otherwise
|
|
34
|
+
*/
|
|
35
|
+
async getSession(sessionId) {
|
|
36
|
+
// Validate sessionId
|
|
37
|
+
if (!isValidSessionId(sessionId)) {
|
|
38
|
+
logger.debug('Invalid sessionId provided to getSession');
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const existingTransport = this.serverManager.getTransport(sessionId);
|
|
42
|
+
if (existingTransport) {
|
|
43
|
+
// Verify the transport is the correct type for this endpoint
|
|
44
|
+
if (existingTransport instanceof StreamableHTTPServerTransport ||
|
|
45
|
+
existingTransport instanceof RestorableStreamableHTTPServerTransport) {
|
|
46
|
+
// Update last accessed time for active sessions
|
|
47
|
+
this.sessionRepository.updateAccess(sessionId);
|
|
48
|
+
return existingTransport;
|
|
49
|
+
}
|
|
50
|
+
// Transport exists but is wrong type (e.g., STDIO), so it's not usable here
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
// Try to restore from persistent storage
|
|
54
|
+
const result = await this.restoreSession(sessionId);
|
|
55
|
+
return result.transport;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Restores a session from persistent storage.
|
|
59
|
+
*
|
|
60
|
+
* @param sessionId - The session ID to restore
|
|
61
|
+
* @returns SessionRestoreResult with transport or error details
|
|
62
|
+
*/
|
|
63
|
+
async restoreSession(sessionId) {
|
|
64
|
+
try {
|
|
65
|
+
const sessionData = this.sessionRepository.get(sessionId);
|
|
66
|
+
if (!sessionData) {
|
|
67
|
+
logger.debug(`No persisted session found for: ${sessionId}`);
|
|
68
|
+
return { transport: null, errorType: 'not_found' };
|
|
69
|
+
}
|
|
70
|
+
const config = sessionData;
|
|
71
|
+
logger.info(`Restoring streamable session: ${sessionId}`);
|
|
72
|
+
// Create new transport with the original session ID using wrapper class
|
|
73
|
+
const transport = new RestorableStreamableHTTPServerTransport({
|
|
74
|
+
sessionIdGenerator: () => sessionId,
|
|
75
|
+
});
|
|
76
|
+
// Mark the transport as initialized for restored session
|
|
77
|
+
const initResult = transport.markAsInitialized();
|
|
78
|
+
if (!initResult.success) {
|
|
79
|
+
logger.warn(`Failed to mark transport ${sessionId} as initialized: ${initResult.error}`);
|
|
80
|
+
return { transport: null, error: initResult.error, errorType: 'transport_failed' };
|
|
81
|
+
}
|
|
82
|
+
// Set the sessionId for the restored session
|
|
83
|
+
const setSessionResult = transport.setSessionId(sessionId);
|
|
84
|
+
if (!setSessionResult.success) {
|
|
85
|
+
logger.warn(`Failed to set sessionId ${sessionId}: ${setSessionResult.error}`);
|
|
86
|
+
return { transport: null, error: setSessionResult.error, errorType: 'transport_failed' };
|
|
87
|
+
}
|
|
88
|
+
// Convert config context to ContextData format if available
|
|
89
|
+
const context = config.context;
|
|
90
|
+
const contextData = context
|
|
91
|
+
? {
|
|
92
|
+
project: context.project || { name: 'unknown' },
|
|
93
|
+
user: context.user || {},
|
|
94
|
+
environment: context.environment || {},
|
|
95
|
+
timestamp: context.timestamp || new Date().toISOString(),
|
|
96
|
+
sessionId: context.sessionId || sessionId,
|
|
97
|
+
version: context.version || 'unknown',
|
|
98
|
+
transport: context.transport || { type: 'unknown' },
|
|
99
|
+
}
|
|
100
|
+
: undefined;
|
|
101
|
+
// Reconnect with the original configuration and context
|
|
102
|
+
try {
|
|
103
|
+
await this.serverManager.connectTransport(transport, sessionId, config, contextData);
|
|
104
|
+
}
|
|
105
|
+
catch (connectError) {
|
|
106
|
+
const errorMessage = connectError instanceof Error ? connectError.message : String(connectError);
|
|
107
|
+
logger.error(`Failed to connect transport ${sessionId}:`, connectError);
|
|
108
|
+
return { transport: null, error: errorMessage, errorType: 'connection_failed' };
|
|
109
|
+
}
|
|
110
|
+
// Initialize notifications
|
|
111
|
+
this.initializeNotifications(sessionId);
|
|
112
|
+
// Set up handlers
|
|
113
|
+
this.setupTransportHandlers(transport, sessionId);
|
|
114
|
+
// Update last accessed time
|
|
115
|
+
this.sessionRepository.updateAccess(sessionId);
|
|
116
|
+
logger.info(`Successfully restored streamable session: ${sessionId} (restored: ${transport.isRestored()})`);
|
|
117
|
+
return { transport };
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
121
|
+
logger.error(`Failed to restore streamable session ${sessionId}:`, error);
|
|
122
|
+
return { transport: null, error: errorMessage, errorType: 'transport_failed' };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Creates a new session with the given configuration.
|
|
127
|
+
*
|
|
128
|
+
* @param config - The inbound connection configuration
|
|
129
|
+
* @param context - Optional context data for the session
|
|
130
|
+
* @param providedSessionId - Optional session ID to use instead of generating one
|
|
131
|
+
* @returns SessionCreateResult with transport and persistence status
|
|
132
|
+
* @throws Error if session creation fails (but not if persistence fails)
|
|
133
|
+
*/
|
|
134
|
+
async createSession(config, context, providedSessionId) {
|
|
135
|
+
const sessionId = providedSessionId || AUTH_CONFIG.SERVER.STREAMABLE_SESSION.ID_PREFIX + randomUUID();
|
|
136
|
+
let transport;
|
|
137
|
+
try {
|
|
138
|
+
transport = new StreamableHTTPServerTransport({
|
|
139
|
+
sessionIdGenerator: () => sessionId,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
144
|
+
logger.error(`Failed to create transport for session ${sessionId}:`, error);
|
|
145
|
+
throw new Error(`Session creation failed: transport initialization error - ${errorMessage}`);
|
|
146
|
+
}
|
|
147
|
+
if (context && context.project?.name && context.sessionId) {
|
|
148
|
+
logger.info(`New session with context: ${context.project.name} (${context.sessionId})${providedSessionId ? ` (ID: ${providedSessionId})` : ''}`);
|
|
149
|
+
}
|
|
150
|
+
// Include full context in config for session persistence
|
|
151
|
+
const configWithContext = {
|
|
152
|
+
...config,
|
|
153
|
+
context: context || undefined,
|
|
154
|
+
};
|
|
155
|
+
// Pass context to ServerManager
|
|
156
|
+
const validContext = context && context.project && context.user && context.environment ? context : undefined;
|
|
157
|
+
try {
|
|
158
|
+
await this.serverManager.connectTransport(transport, sessionId, configWithContext, validContext);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
162
|
+
logger.error(`Failed to connect transport ${sessionId}:`, error);
|
|
163
|
+
throw new Error(`Session creation failed: connection error - ${errorMessage}`);
|
|
164
|
+
}
|
|
165
|
+
// Try to persist session to storage
|
|
166
|
+
let persisted = false;
|
|
167
|
+
let persistenceError;
|
|
168
|
+
try {
|
|
169
|
+
this.sessionRepository.create(sessionId, configWithContext);
|
|
170
|
+
persisted = true;
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
persistenceError = error instanceof Error ? error.message : String(error);
|
|
174
|
+
logger.warn(`Failed to persist session ${sessionId} to repository: ${persistenceError}`);
|
|
175
|
+
// Continue anyway - transport is connected, just not persisted
|
|
176
|
+
}
|
|
177
|
+
// Initialize notifications
|
|
178
|
+
this.initializeNotifications(sessionId);
|
|
179
|
+
// Set up handlers
|
|
180
|
+
this.setupTransportHandlers(transport, sessionId);
|
|
181
|
+
return { transport, persisted, persistenceError };
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Deletes a session and cleans up resources.
|
|
185
|
+
*
|
|
186
|
+
* @param sessionId - The session ID to delete
|
|
187
|
+
*/
|
|
188
|
+
async deleteSession(sessionId) {
|
|
189
|
+
try {
|
|
190
|
+
this.sessionRepository.delete(sessionId);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
194
|
+
logger.error(`Failed to delete session ${sessionId} from repository: ${errorMessage}`);
|
|
195
|
+
// Consider: should this throw? Or is best-effort deletion acceptable?
|
|
196
|
+
// At minimum, the error is logged for monitoring
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Initializes async loading notifications for a session.
|
|
201
|
+
*
|
|
202
|
+
* This method should be called after connecting a transport to enable
|
|
203
|
+
* the async orchestrator to send capability updates to the client.
|
|
204
|
+
* Only applicable when async loading is enabled.
|
|
205
|
+
*
|
|
206
|
+
* @param sessionId - The session ID to initialize notifications for
|
|
207
|
+
*/
|
|
208
|
+
initializeNotifications(sessionId) {
|
|
209
|
+
if (this.asyncOrchestrator) {
|
|
210
|
+
const inboundConnection = this.serverManager.getServer(sessionId);
|
|
211
|
+
if (inboundConnection) {
|
|
212
|
+
this.asyncOrchestrator.initializeNotifications(inboundConnection);
|
|
213
|
+
logger.debug(`Async loading notifications initialized for Streamable HTTP session ${sessionId}`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
setupTransportHandlers(transport, sessionId) {
|
|
218
|
+
transport.onclose = () => {
|
|
219
|
+
this.serverManager.disconnectTransport(sessionId);
|
|
220
|
+
this.sessionRepository.delete(sessionId);
|
|
221
|
+
};
|
|
222
|
+
transport.onerror = (error) => {
|
|
223
|
+
logger.error(`Streamable HTTP transport error for session ${sessionId}:`, error);
|
|
224
|
+
const server = this.serverManager.getServer(sessionId);
|
|
225
|
+
if (server) {
|
|
226
|
+
server.status = ServerStatus.Error;
|
|
227
|
+
server.lastError = error instanceof Error ? error : new Error(String(error));
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=sessionService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionService.js","sourceRoot":"","sources":["../../../../src/transport/http/utils/sessionService.ts"],"names":[],"mappings":"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"}
|