@structured-world/gitlab-mcp 6.31.0 → 6.31.2

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.
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionManager = void 0;
4
+ exports.getSessionManager = getSessionManager;
5
+ exports.resetSessionManager = resetSessionManager;
6
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
7
+ const config_1 = require("./config");
8
+ const handlers_1 = require("./handlers");
9
+ const schema_utils_1 = require("./utils/schema-utils");
10
+ const logger_1 = require("./logger");
11
+ const DEFAULT_SESSION_TIMEOUT_MS = 30 * 60 * 1000;
12
+ class SessionManager {
13
+ sessions = new Map();
14
+ cleanupInterval = null;
15
+ sessionTimeoutMs;
16
+ schemaModeDetected = false;
17
+ constructor(sessionTimeoutMs) {
18
+ this.sessionTimeoutMs = sessionTimeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS;
19
+ }
20
+ start() {
21
+ this.cleanupInterval = setInterval(() => {
22
+ this.cleanupStaleSessions();
23
+ }, 60_000);
24
+ this.cleanupInterval.unref();
25
+ logger_1.logger.info({ sessionTimeoutMs: this.sessionTimeoutMs }, "Session manager started");
26
+ }
27
+ async createSession(sessionId, transport) {
28
+ if (this.sessions.has(sessionId)) {
29
+ logger_1.logger.warn({ sessionId }, "Duplicate sessionId detected — closing existing session");
30
+ await this.removeSession(sessionId);
31
+ }
32
+ const server = new index_js_1.Server({ name: config_1.packageName, version: config_1.packageVersion }, { capabilities: { tools: { listChanged: true } } });
33
+ server.oninitialized = () => {
34
+ if (!this.schemaModeDetected) {
35
+ this.schemaModeDetected = true;
36
+ const clientVersion = server.getClientVersion();
37
+ (0, schema_utils_1.setDetectedSchemaMode)(clientVersion?.name);
38
+ }
39
+ };
40
+ await (0, handlers_1.setupHandlers)(server);
41
+ await server.connect(transport);
42
+ const now = Date.now();
43
+ this.sessions.set(sessionId, {
44
+ server,
45
+ sessionId,
46
+ createdAt: now,
47
+ lastActivityAt: now,
48
+ });
49
+ logger_1.logger.info({ sessionId, activeSessions: this.sessions.size }, "Session created");
50
+ return server;
51
+ }
52
+ touchSession(sessionId) {
53
+ const session = this.sessions.get(sessionId);
54
+ if (session) {
55
+ session.lastActivityAt = Date.now();
56
+ }
57
+ }
58
+ async removeSession(sessionId) {
59
+ const session = this.sessions.get(sessionId);
60
+ if (!session)
61
+ return;
62
+ this.sessions.delete(sessionId);
63
+ try {
64
+ await session.server.close();
65
+ }
66
+ catch (error) {
67
+ logger_1.logger.debug({ err: error, sessionId }, "Error closing session server (may already be closed)");
68
+ }
69
+ logger_1.logger.info({ sessionId, activeSessions: this.sessions.size }, "Session removed");
70
+ }
71
+ async broadcastToolsListChanged() {
72
+ const promises = [];
73
+ for (const [sessionId, session] of this.sessions) {
74
+ promises.push(session.server
75
+ .notification({ method: "notifications/tools/list_changed" })
76
+ .then(() => {
77
+ logger_1.logger.debug({ sessionId }, "Sent tools/list_changed to session");
78
+ })
79
+ .catch((error) => {
80
+ logger_1.logger.debug({ err: error, sessionId }, "Failed to send tools/list_changed to session");
81
+ }));
82
+ }
83
+ await Promise.allSettled(promises);
84
+ logger_1.logger.info({ sessionCount: this.sessions.size }, "Broadcast tools/list_changed to all sessions");
85
+ }
86
+ get activeSessionCount() {
87
+ return this.sessions.size;
88
+ }
89
+ cleanupStaleSessions() {
90
+ const now = Date.now();
91
+ const stale = [];
92
+ for (const [sessionId, session] of this.sessions) {
93
+ if (now - session.lastActivityAt > this.sessionTimeoutMs) {
94
+ stale.push(sessionId);
95
+ }
96
+ }
97
+ if (stale.length === 0)
98
+ return;
99
+ logger_1.logger.info({ staleCount: stale.length, activeSessions: this.sessions.size }, "Cleaning up stale sessions");
100
+ for (const sessionId of stale) {
101
+ this.removeSession(sessionId).catch((error) => {
102
+ logger_1.logger.error({ err: error, sessionId }, "Error during stale session cleanup");
103
+ });
104
+ }
105
+ }
106
+ async shutdown() {
107
+ if (this.cleanupInterval) {
108
+ clearInterval(this.cleanupInterval);
109
+ this.cleanupInterval = null;
110
+ }
111
+ const sessionIds = [...this.sessions.keys()];
112
+ await Promise.allSettled(sessionIds.map(id => this.removeSession(id)));
113
+ logger_1.logger.info("Session manager shut down");
114
+ }
115
+ }
116
+ exports.SessionManager = SessionManager;
117
+ let sessionManagerInstance = null;
118
+ function getSessionManager() {
119
+ sessionManagerInstance ??= new SessionManager();
120
+ return sessionManagerInstance;
121
+ }
122
+ function resetSessionManager() {
123
+ sessionManagerInstance = null;
124
+ }
125
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/session-manager.ts"],"names":[],"mappings":"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"}