@brutalist/mcp 0.5.1 → 0.6.1
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/README.md +65 -63
- package/dist/brutalist-server.d.ts +15 -0
- package/dist/brutalist-server.d.ts.map +1 -1
- package/dist/brutalist-server.js +405 -357
- package/dist/brutalist-server.js.map +1 -1
- package/dist/cli-agents.d.ts +8 -3
- package/dist/cli-agents.d.ts.map +1 -1
- package/dist/cli-agents.js +352 -50
- package/dist/cli-agents.js.map +1 -1
- package/dist/streaming/circuit-breaker.d.ts +186 -0
- package/dist/streaming/circuit-breaker.d.ts.map +1 -0
- package/dist/streaming/circuit-breaker.js +463 -0
- package/dist/streaming/circuit-breaker.js.map +1 -0
- package/dist/streaming/intelligent-buffer.d.ts +141 -0
- package/dist/streaming/intelligent-buffer.d.ts.map +1 -0
- package/dist/streaming/intelligent-buffer.js +555 -0
- package/dist/streaming/intelligent-buffer.js.map +1 -0
- package/dist/streaming/output-parser.d.ts +89 -0
- package/dist/streaming/output-parser.d.ts.map +1 -0
- package/dist/streaming/output-parser.js +349 -0
- package/dist/streaming/output-parser.js.map +1 -0
- package/dist/streaming/progress-tracker.d.ts +149 -0
- package/dist/streaming/progress-tracker.d.ts.map +1 -0
- package/dist/streaming/progress-tracker.js +519 -0
- package/dist/streaming/progress-tracker.js.map +1 -0
- package/dist/streaming/session-manager.d.ts +238 -0
- package/dist/streaming/session-manager.d.ts.map +1 -0
- package/dist/streaming/session-manager.js +546 -0
- package/dist/streaming/session-manager.js.map +1 -0
- package/dist/streaming/sse-transport.d.ts +95 -0
- package/dist/streaming/sse-transport.d.ts.map +1 -0
- package/dist/streaming/sse-transport.js +319 -0
- package/dist/streaming/sse-transport.js.map +1 -0
- package/dist/streaming/streaming-orchestrator.d.ts +153 -0
- package/dist/streaming/streaming-orchestrator.d.ts.map +1 -0
- package/dist/streaming/streaming-orchestrator.js +436 -0
- package/dist/streaming/streaming-orchestrator.js.map +1 -0
- package/dist/test-utils/process-manager.d.ts +61 -0
- package/dist/test-utils/process-manager.d.ts.map +1 -0
- package/dist/test-utils/process-manager.js +262 -0
- package/dist/test-utils/process-manager.js.map +1 -0
- package/dist/test-utils/server-harness.d.ts +73 -0
- package/dist/test-utils/server-harness.d.ts.map +1 -0
- package/dist/test-utils/server-harness.js +296 -0
- package/dist/test-utils/server-harness.js.map +1 -0
- package/dist/test-utils/streaming-fuzz.d.ts +57 -0
- package/dist/test-utils/streaming-fuzz.d.ts.map +1 -0
- package/dist/test-utils/streaming-fuzz.js +287 -0
- package/dist/test-utils/streaming-fuzz.js.map +1 -0
- package/dist/test-utils/test-isolation.d.ts +70 -0
- package/dist/test-utils/test-isolation.d.ts.map +1 -0
- package/dist/test-utils/test-isolation.js +193 -0
- package/dist/test-utils/test-isolation.js.map +1 -0
- package/dist/tool-definitions.d.ts +6 -0
- package/dist/tool-definitions.d.ts.map +1 -0
- package/dist/tool-definitions.js +217 -0
- package/dist/tool-definitions.js.map +1 -0
- package/dist/types/brutalist.d.ts +3 -19
- package/dist/types/brutalist.d.ts.map +1 -1
- package/dist/types/tool-config.d.ts +51 -0
- package/dist/types/tool-config.d.ts.map +1 -0
- package/dist/types/tool-config.js +24 -0
- package/dist/types/tool-config.js.map +1 -0
- package/dist/utils/pagination.d.ts +2 -2
- package/dist/utils/pagination.d.ts.map +1 -1
- package/dist/utils/pagination.js +1 -1
- package/dist/utils/pagination.js.map +1 -1
- package/dist/utils/response-cache.d.ts +96 -0
- package/dist/utils/response-cache.d.ts.map +1 -0
- package/dist/utils/response-cache.js +371 -0
- package/dist/utils/response-cache.js.map +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +22 -3
- package/dist/utils.js.map +1 -1
- package/package.json +14 -4
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { randomUUID } from 'crypto';
|
|
3
|
+
import { logger } from '../logger.js';
|
|
4
|
+
import { IntelligentBuffer } from './intelligent-buffer.js';
|
|
5
|
+
/**
|
|
6
|
+
* Session channel manager with comprehensive lifecycle management
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Session isolation with secure access control
|
|
10
|
+
* - Automatic resource cleanup and garbage collection
|
|
11
|
+
* - Connection pooling and limits
|
|
12
|
+
* - Real-time monitoring and metrics
|
|
13
|
+
* - Event buffering and delivery guarantees
|
|
14
|
+
* - Analysis state tracking
|
|
15
|
+
* - Graceful error handling and recovery
|
|
16
|
+
*/
|
|
17
|
+
export class SessionChannelManager extends EventEmitter {
|
|
18
|
+
sessions = new Map();
|
|
19
|
+
cleanupTimers = new Map();
|
|
20
|
+
globalBuffer;
|
|
21
|
+
startTime = Date.now();
|
|
22
|
+
// Configuration
|
|
23
|
+
config;
|
|
24
|
+
DEFAULT_CONFIG = {
|
|
25
|
+
ttl: 2 * 60 * 60 * 1000, // 2 hours
|
|
26
|
+
maxConnections: 5, // 5 concurrent connections
|
|
27
|
+
maxMemoryMB: 100, // 100MB per session
|
|
28
|
+
maxEvents: 10000, // 10k events
|
|
29
|
+
autoCleanup: true, // Auto cleanup
|
|
30
|
+
bufferConfig: {
|
|
31
|
+
enableCoalescence: true,
|
|
32
|
+
adaptiveThrottling: true,
|
|
33
|
+
backpressureThreshold: 1000
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
// Metrics tracking
|
|
37
|
+
metrics = {
|
|
38
|
+
totalSessions: 0,
|
|
39
|
+
activeSessions: 0,
|
|
40
|
+
totalEvents: 0,
|
|
41
|
+
totalSubscribers: 0,
|
|
42
|
+
memoryUsage: 0,
|
|
43
|
+
uptime: Date.now()
|
|
44
|
+
};
|
|
45
|
+
constructor(config = {}) {
|
|
46
|
+
super();
|
|
47
|
+
this.config = { ...this.DEFAULT_CONFIG, ...config };
|
|
48
|
+
this.globalBuffer = new IntelligentBuffer();
|
|
49
|
+
// Setup global event handlers
|
|
50
|
+
this.setupEventHandlers();
|
|
51
|
+
// Start periodic maintenance
|
|
52
|
+
this.startMaintenance();
|
|
53
|
+
logger.info('SessionChannelManager initialized', {
|
|
54
|
+
ttl: this.config.ttl,
|
|
55
|
+
maxConnections: this.config.maxConnections,
|
|
56
|
+
autoCleanup: this.config.autoCleanup
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create new session with full context
|
|
61
|
+
*/
|
|
62
|
+
createSession(sessionId, metadata = {}) {
|
|
63
|
+
const id = sessionId || randomUUID();
|
|
64
|
+
if (this.sessions.has(id)) {
|
|
65
|
+
throw new Error(`Session ${id} already exists`);
|
|
66
|
+
}
|
|
67
|
+
const context = {
|
|
68
|
+
id,
|
|
69
|
+
startTime: Date.now(),
|
|
70
|
+
lastActivity: Date.now(),
|
|
71
|
+
subscribers: new Set(),
|
|
72
|
+
eventBuffer: new IntelligentBuffer(),
|
|
73
|
+
metadata: { ...metadata, createdAt: Date.now() },
|
|
74
|
+
analysis: {
|
|
75
|
+
status: 'starting',
|
|
76
|
+
activeAgents: new Set(),
|
|
77
|
+
completedAgents: new Set(),
|
|
78
|
+
failedAgents: new Set(),
|
|
79
|
+
findings: [],
|
|
80
|
+
startTime: Date.now(),
|
|
81
|
+
progress: {
|
|
82
|
+
totalPhases: 5, // starting, scanning, analyzing, synthesizing, complete
|
|
83
|
+
currentPhase: 0,
|
|
84
|
+
phaseName: 'starting',
|
|
85
|
+
phaseProgress: 0
|
|
86
|
+
},
|
|
87
|
+
metrics: {
|
|
88
|
+
totalEvents: 0,
|
|
89
|
+
findingsCount: 0,
|
|
90
|
+
errorsCount: 0,
|
|
91
|
+
avgResponseTime: 0
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
connectionCount: 0,
|
|
95
|
+
maxConnections: this.config.maxConnections,
|
|
96
|
+
resources: {
|
|
97
|
+
memoryUsage: 0,
|
|
98
|
+
eventCount: 0,
|
|
99
|
+
connectionTime: 0
|
|
100
|
+
},
|
|
101
|
+
cleanup: {
|
|
102
|
+
ttl: this.config.ttl,
|
|
103
|
+
scheduled: false
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
this.sessions.set(id, context);
|
|
107
|
+
this.metrics.totalSessions++;
|
|
108
|
+
this.metrics.activeSessions++;
|
|
109
|
+
// Schedule cleanup
|
|
110
|
+
if (this.config.autoCleanup) {
|
|
111
|
+
this.scheduleCleanup(id);
|
|
112
|
+
}
|
|
113
|
+
this.emit('sessionCreated', id, context);
|
|
114
|
+
logger.info(`Session created: ${id}`, {
|
|
115
|
+
metadata: Object.keys(metadata),
|
|
116
|
+
totalSessions: this.metrics.activeSessions
|
|
117
|
+
});
|
|
118
|
+
return context;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get session context with access validation
|
|
122
|
+
*/
|
|
123
|
+
getSession(sessionId, requireActive = true) {
|
|
124
|
+
const session = this.sessions.get(sessionId);
|
|
125
|
+
if (!session) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
if (requireActive && session.analysis.status === 'failed') {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
// Update activity
|
|
132
|
+
session.lastActivity = Date.now();
|
|
133
|
+
return session;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Subscribe to session events with connection management
|
|
137
|
+
*/
|
|
138
|
+
async subscribe(sessionId, subscriber) {
|
|
139
|
+
const session = this.getSession(sessionId);
|
|
140
|
+
if (!session) {
|
|
141
|
+
logger.warn(`Subscription attempt to non-existent session: ${sessionId}`);
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
// Check connection limits
|
|
145
|
+
if (session.connectionCount >= session.maxConnections) {
|
|
146
|
+
logger.warn(`Connection limit exceeded for session ${sessionId} (${session.connectionCount}/${session.maxConnections})`);
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
// Add subscriber
|
|
150
|
+
session.subscribers.add(subscriber);
|
|
151
|
+
session.connectionCount++;
|
|
152
|
+
session.resources.connectionTime = Date.now();
|
|
153
|
+
this.metrics.totalSubscribers++;
|
|
154
|
+
// Send backlog to new subscriber
|
|
155
|
+
const backlog = session.eventBuffer.getBacklog(sessionId, 50); // Last 50 events
|
|
156
|
+
for (const event of backlog) {
|
|
157
|
+
await subscriber.emit(event);
|
|
158
|
+
}
|
|
159
|
+
this.emit('subscriberConnected', { sessionId, subscriber });
|
|
160
|
+
this.emit('sessionActivity', { sessionId, activity: 'subscriber_connected' });
|
|
161
|
+
logger.debug(`Subscriber connected to session ${sessionId} (${session.connectionCount} total)`);
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Unsubscribe from session events
|
|
166
|
+
*/
|
|
167
|
+
unsubscribe(sessionId, subscriberId) {
|
|
168
|
+
const session = this.getSession(sessionId, false);
|
|
169
|
+
if (!session) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
// Find and remove subscriber
|
|
173
|
+
let found = false;
|
|
174
|
+
for (const subscriber of session.subscribers) {
|
|
175
|
+
if (subscriber.id === subscriberId) {
|
|
176
|
+
session.subscribers.delete(subscriber);
|
|
177
|
+
session.connectionCount--;
|
|
178
|
+
this.metrics.totalSubscribers--;
|
|
179
|
+
found = true;
|
|
180
|
+
// Close subscriber connection
|
|
181
|
+
try {
|
|
182
|
+
subscriber.close();
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
logger.warn(`Error closing subscriber ${subscriberId}:`, error);
|
|
186
|
+
}
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (found) {
|
|
191
|
+
this.emit('subscriberDisconnected', { sessionId, subscriberId });
|
|
192
|
+
this.emit('sessionActivity', { sessionId, activity: 'subscriber_disconnected' });
|
|
193
|
+
logger.debug(`Subscriber ${subscriberId} disconnected from session ${sessionId}`);
|
|
194
|
+
}
|
|
195
|
+
return found;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Emit event to session with intelligent buffering
|
|
199
|
+
*/
|
|
200
|
+
async emitToSession(sessionId, event) {
|
|
201
|
+
// Use the sessionId parameter, not event.sessionId
|
|
202
|
+
const session = this.getSession(sessionId);
|
|
203
|
+
if (!session) {
|
|
204
|
+
logger.warn(`Event for unknown session: ${sessionId}`);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
// Update session activity
|
|
208
|
+
session.lastActivity = Date.now();
|
|
209
|
+
session.analysis.metrics.totalEvents++;
|
|
210
|
+
session.resources.eventCount++;
|
|
211
|
+
// Update analysis state
|
|
212
|
+
this.updateAnalysisState(session, event);
|
|
213
|
+
// Add to buffer for intelligent delivery
|
|
214
|
+
session.eventBuffer.add(event);
|
|
215
|
+
// Update memory usage
|
|
216
|
+
session.resources.memoryUsage = session.eventBuffer.getState(sessionId)?.memoryUsage || 0;
|
|
217
|
+
// Update metrics immediately for real-time tracking
|
|
218
|
+
this.updateMetrics();
|
|
219
|
+
// Emit activity event
|
|
220
|
+
this.emit('sessionActivity', { sessionId, activity: 'event_received' });
|
|
221
|
+
logger.debug(`Event emitted to session ${sessionId}: ${event.type} from ${event.agent}`);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Start analysis tracking for session
|
|
225
|
+
*/
|
|
226
|
+
startAnalysis(sessionId, agents) {
|
|
227
|
+
const session = this.getSession(sessionId);
|
|
228
|
+
if (!session) {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
session.analysis.status = 'running';
|
|
232
|
+
session.analysis.activeAgents = new Set(agents);
|
|
233
|
+
session.analysis.startTime = Date.now();
|
|
234
|
+
this.emit('analysisStarted', { sessionId, agents });
|
|
235
|
+
logger.info(`Analysis started for session ${sessionId} with agents: ${agents.join(', ')}`);
|
|
236
|
+
return true;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Complete analysis for session
|
|
240
|
+
*/
|
|
241
|
+
completeAnalysis(sessionId) {
|
|
242
|
+
const session = this.getSession(sessionId);
|
|
243
|
+
if (!session) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
session.analysis.status = 'complete';
|
|
247
|
+
session.analysis.endTime = Date.now();
|
|
248
|
+
session.analysis.progress.currentPhase = session.analysis.progress.totalPhases;
|
|
249
|
+
session.analysis.progress.phaseName = 'complete';
|
|
250
|
+
session.analysis.progress.phaseProgress = 100;
|
|
251
|
+
this.emit('analysisCompleted', { sessionId, analysis: session.analysis });
|
|
252
|
+
logger.info(`Analysis completed for session ${sessionId}`, {
|
|
253
|
+
duration: session.analysis.endTime - session.analysis.startTime,
|
|
254
|
+
findings: session.analysis.findings.length,
|
|
255
|
+
agents: Array.from(session.analysis.completedAgents)
|
|
256
|
+
});
|
|
257
|
+
return true;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Fail analysis for session
|
|
261
|
+
*/
|
|
262
|
+
failAnalysis(sessionId, error) {
|
|
263
|
+
const session = this.getSession(sessionId, false);
|
|
264
|
+
if (!session) {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
session.analysis.status = 'failed';
|
|
268
|
+
session.analysis.endTime = Date.now();
|
|
269
|
+
this.emit('analysisFailed', { sessionId, error });
|
|
270
|
+
this.emit('sessionError', { sessionId, error });
|
|
271
|
+
logger.error(`Analysis failed for session ${sessionId}:`, error.message);
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Destroy session and cleanup resources
|
|
276
|
+
*/
|
|
277
|
+
destroySession(sessionId) {
|
|
278
|
+
const session = this.sessions.get(sessionId);
|
|
279
|
+
if (!session) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
// Close all subscribers
|
|
283
|
+
for (const subscriber of session.subscribers) {
|
|
284
|
+
try {
|
|
285
|
+
subscriber.close();
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
logger.warn(`Error closing subscriber during session cleanup:`, error);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// Cleanup timers
|
|
292
|
+
const timer = this.cleanupTimers.get(sessionId);
|
|
293
|
+
if (timer) {
|
|
294
|
+
clearTimeout(timer);
|
|
295
|
+
this.cleanupTimers.delete(sessionId);
|
|
296
|
+
}
|
|
297
|
+
// Cleanup buffer
|
|
298
|
+
session.eventBuffer.cleanup(sessionId);
|
|
299
|
+
// Remove session
|
|
300
|
+
this.sessions.delete(sessionId);
|
|
301
|
+
this.metrics.activeSessions--;
|
|
302
|
+
this.metrics.totalSubscribers -= session.connectionCount;
|
|
303
|
+
this.emit('sessionDestroyed', { sessionId });
|
|
304
|
+
logger.info(`Session destroyed: ${sessionId}`, {
|
|
305
|
+
lifetime: Date.now() - session.startTime,
|
|
306
|
+
events: session.resources.eventCount,
|
|
307
|
+
connections: session.connectionCount
|
|
308
|
+
});
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Get all active sessions
|
|
313
|
+
*/
|
|
314
|
+
getActiveSessions() {
|
|
315
|
+
return Array.from(this.sessions.values())
|
|
316
|
+
.filter(session => session.analysis.status !== 'failed');
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Get session statistics
|
|
320
|
+
*/
|
|
321
|
+
/**
|
|
322
|
+
* Get global system metrics
|
|
323
|
+
*/
|
|
324
|
+
getGlobalMetrics() {
|
|
325
|
+
const bufferMetrics = this.globalBuffer.getMetrics();
|
|
326
|
+
return {
|
|
327
|
+
...this.metrics,
|
|
328
|
+
uptime: Date.now() - this.metrics.uptime,
|
|
329
|
+
buffer: bufferMetrics,
|
|
330
|
+
sessions: Array.from(this.sessions.values()).map(s => ({
|
|
331
|
+
id: s.id,
|
|
332
|
+
status: s.analysis.status,
|
|
333
|
+
connections: s.connectionCount,
|
|
334
|
+
events: s.resources.eventCount,
|
|
335
|
+
memoryUsage: s.resources.memoryUsage
|
|
336
|
+
}))
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Check if session exists
|
|
341
|
+
*/
|
|
342
|
+
hasSession(sessionId) {
|
|
343
|
+
return this.sessions.has(sessionId);
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Get session statistics
|
|
347
|
+
*/
|
|
348
|
+
getSessionStats(sessionId) {
|
|
349
|
+
const session = this.getSession(sessionId);
|
|
350
|
+
if (!session) {
|
|
351
|
+
return null;
|
|
352
|
+
}
|
|
353
|
+
return {
|
|
354
|
+
eventsEmitted: session.resources.eventCount,
|
|
355
|
+
bufferStats: {
|
|
356
|
+
flushCount: session.eventBuffer.getState(sessionId)?.flushCount || 0
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* End analysis for session
|
|
362
|
+
*/
|
|
363
|
+
endAnalysis(sessionId) {
|
|
364
|
+
const session = this.getSession(sessionId);
|
|
365
|
+
if (!session) {
|
|
366
|
+
return false;
|
|
367
|
+
}
|
|
368
|
+
session.analysis.status = 'complete';
|
|
369
|
+
session.analysis.endTime = Date.now();
|
|
370
|
+
this.emit('analysisCompleted', { sessionId, analysis: session.analysis });
|
|
371
|
+
return true;
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Complete session (alias for endAnalysis)
|
|
375
|
+
*/
|
|
376
|
+
completeSession(sessionId) {
|
|
377
|
+
return this.endAnalysis(sessionId);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Get global statistics
|
|
381
|
+
*/
|
|
382
|
+
getGlobalStats() {
|
|
383
|
+
return {
|
|
384
|
+
...this.metrics,
|
|
385
|
+
uptime: Date.now() - this.startTime
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Shutdown session manager
|
|
390
|
+
*/
|
|
391
|
+
shutdown() {
|
|
392
|
+
this.destroy();
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Cleanup all resources
|
|
396
|
+
*/
|
|
397
|
+
destroy() {
|
|
398
|
+
// Destroy all sessions
|
|
399
|
+
for (const sessionId of this.sessions.keys()) {
|
|
400
|
+
this.destroySession(sessionId);
|
|
401
|
+
}
|
|
402
|
+
// Clear all timers
|
|
403
|
+
for (const timer of this.cleanupTimers.values()) {
|
|
404
|
+
clearTimeout(timer);
|
|
405
|
+
}
|
|
406
|
+
this.cleanupTimers.clear();
|
|
407
|
+
// Remove all listeners
|
|
408
|
+
this.removeAllListeners();
|
|
409
|
+
logger.info('SessionChannelManager destroyed');
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Update analysis state based on events
|
|
413
|
+
*/
|
|
414
|
+
updateAnalysisState(session, event) {
|
|
415
|
+
const analysis = session.analysis;
|
|
416
|
+
// Track agent activity
|
|
417
|
+
if (event.agent) {
|
|
418
|
+
if (event.type === 'agent_start') {
|
|
419
|
+
analysis.activeAgents.add(event.agent);
|
|
420
|
+
}
|
|
421
|
+
else if (event.type === 'agent_complete') {
|
|
422
|
+
analysis.activeAgents.delete(event.agent);
|
|
423
|
+
analysis.completedAgents.add(event.agent);
|
|
424
|
+
}
|
|
425
|
+
else if (event.type === 'agent_error') {
|
|
426
|
+
analysis.activeAgents.delete(event.agent);
|
|
427
|
+
analysis.failedAgents.add(event.agent);
|
|
428
|
+
analysis.metrics.errorsCount++;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
// Track findings
|
|
432
|
+
if (event.metadata?.contentType === 'finding') {
|
|
433
|
+
analysis.findings.push(event);
|
|
434
|
+
analysis.metrics.findingsCount++;
|
|
435
|
+
}
|
|
436
|
+
// Update progress based on phase
|
|
437
|
+
if (event.metadata?.phase) {
|
|
438
|
+
const phaseMap = {
|
|
439
|
+
'starting': 0,
|
|
440
|
+
'scanning': 1,
|
|
441
|
+
'analyzing': 2,
|
|
442
|
+
'synthesizing': 3,
|
|
443
|
+
'complete': 4
|
|
444
|
+
};
|
|
445
|
+
const phaseNumber = phaseMap[event.metadata.phase];
|
|
446
|
+
if (phaseNumber !== undefined && phaseNumber > analysis.progress.currentPhase) {
|
|
447
|
+
analysis.progress.currentPhase = phaseNumber;
|
|
448
|
+
analysis.progress.phaseName = event.metadata.phase;
|
|
449
|
+
analysis.progress.phaseProgress = Math.round((phaseNumber / analysis.progress.totalPhases) * 100);
|
|
450
|
+
this.emit('analysisProgress', { sessionId: session.id, progress: analysis.progress });
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// Update response time
|
|
454
|
+
const now = Date.now();
|
|
455
|
+
analysis.metrics.avgResponseTime = analysis.metrics.totalEvents > 0
|
|
456
|
+
? (analysis.metrics.avgResponseTime * (analysis.metrics.totalEvents - 1) + (now - event.timestamp)) / analysis.metrics.totalEvents
|
|
457
|
+
: now - event.timestamp;
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Schedule session cleanup
|
|
461
|
+
*/
|
|
462
|
+
scheduleCleanup(sessionId) {
|
|
463
|
+
const session = this.sessions.get(sessionId);
|
|
464
|
+
if (!session || session.cleanup?.scheduled) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
const timer = setTimeout(() => {
|
|
468
|
+
const currentSession = this.sessions.get(sessionId);
|
|
469
|
+
if (currentSession && Date.now() - currentSession.lastActivity > this.config.ttl) {
|
|
470
|
+
logger.info(`Auto-cleaning up inactive session: ${sessionId}`);
|
|
471
|
+
this.destroySession(sessionId);
|
|
472
|
+
}
|
|
473
|
+
}, this.config.ttl);
|
|
474
|
+
session.cleanup.timer = timer;
|
|
475
|
+
session.cleanup.scheduled = true;
|
|
476
|
+
this.cleanupTimers.set(sessionId, timer);
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Setup global event handlers
|
|
480
|
+
*/
|
|
481
|
+
setupEventHandlers() {
|
|
482
|
+
// Listen for buffer batch events
|
|
483
|
+
process.on('streaming-batch', (batch) => {
|
|
484
|
+
this.deliverBatch(batch);
|
|
485
|
+
});
|
|
486
|
+
// Handle uncaught errors
|
|
487
|
+
this.on('error', (error) => {
|
|
488
|
+
logger.error('SessionChannelManager error:', error);
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Deliver event batch to session subscribers
|
|
493
|
+
*/
|
|
494
|
+
async deliverBatch(batch) {
|
|
495
|
+
const session = this.getSession(batch.sessionId, false);
|
|
496
|
+
if (!session) {
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
const deliveryPromises = [];
|
|
500
|
+
for (const subscriber of session.subscribers) {
|
|
501
|
+
if (subscriber.isConnected()) {
|
|
502
|
+
deliveryPromises.push(subscriber.emitBatch(batch).catch(error => {
|
|
503
|
+
logger.warn(`Failed to deliver batch to subscriber ${subscriber.id}:`, error);
|
|
504
|
+
// Auto-disconnect failed subscribers
|
|
505
|
+
this.unsubscribe(batch.sessionId, subscriber.id);
|
|
506
|
+
}));
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
await Promise.allSettled(deliveryPromises);
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Start periodic maintenance tasks
|
|
513
|
+
*/
|
|
514
|
+
startMaintenance() {
|
|
515
|
+
// Cleanup stale sessions every 5 minutes
|
|
516
|
+
setInterval(() => {
|
|
517
|
+
const now = Date.now();
|
|
518
|
+
const staleThreshold = this.config.ttl;
|
|
519
|
+
for (const [sessionId, session] of this.sessions.entries()) {
|
|
520
|
+
if (now - session.lastActivity > staleThreshold) {
|
|
521
|
+
logger.info(`Maintenance cleanup: stale session ${sessionId}`);
|
|
522
|
+
this.destroySession(sessionId);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}, 5 * 60 * 1000);
|
|
526
|
+
// Update metrics every minute
|
|
527
|
+
setInterval(() => {
|
|
528
|
+
this.updateMetrics();
|
|
529
|
+
}, 60 * 1000);
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Update internal metrics
|
|
533
|
+
*/
|
|
534
|
+
updateMetrics() {
|
|
535
|
+
this.metrics.activeSessions = this.sessions.size;
|
|
536
|
+
this.metrics.totalEvents = Array.from(this.sessions.values())
|
|
537
|
+
.reduce((sum, s) => sum + s.resources.eventCount, 0);
|
|
538
|
+
this.metrics.memoryUsage = Array.from(this.sessions.values())
|
|
539
|
+
.reduce((sum, s) => sum + s.resources.memoryUsage, 0);
|
|
540
|
+
this.metrics.totalSubscribers = Array.from(this.sessions.values())
|
|
541
|
+
.reduce((sum, s) => sum + s.connectionCount, 0);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
// Export SessionManager as alias to SessionChannelManager for compatibility
|
|
545
|
+
export const SessionManager = SessionChannelManager;
|
|
546
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/streaming/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { Request, Response } from 'express';
|
|
3
|
+
import { SessionManager } from './session-manager.js';
|
|
4
|
+
/**
|
|
5
|
+
* SSE connection metadata for tracking active streams
|
|
6
|
+
*/
|
|
7
|
+
export interface SSEConnection {
|
|
8
|
+
id: string;
|
|
9
|
+
sessionId: string;
|
|
10
|
+
response: Response;
|
|
11
|
+
clientOrigin: string;
|
|
12
|
+
connectedAt: number;
|
|
13
|
+
lastActivity: number;
|
|
14
|
+
eventsSent: number;
|
|
15
|
+
isActive: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Enhanced Server-Sent Events transport with session isolation
|
|
19
|
+
*
|
|
20
|
+
* Features:
|
|
21
|
+
* - Session-scoped connections with isolation guarantees
|
|
22
|
+
* - Connection pooling with resource limits
|
|
23
|
+
* - Heartbeat monitoring and automatic cleanup
|
|
24
|
+
* - Graceful connection management
|
|
25
|
+
* - Event filtering and routing by session
|
|
26
|
+
* - Memory-efficient streaming with backpressure
|
|
27
|
+
*/
|
|
28
|
+
export declare class EnhancedSSETransport extends EventEmitter {
|
|
29
|
+
private connections;
|
|
30
|
+
private sessionManager;
|
|
31
|
+
private heartbeatInterval;
|
|
32
|
+
private readonly MAX_CONNECTIONS;
|
|
33
|
+
private readonly HEARTBEAT_INTERVAL;
|
|
34
|
+
private readonly CONNECTION_TIMEOUT;
|
|
35
|
+
private readonly MAX_EVENTS_PER_CONNECTION;
|
|
36
|
+
constructor(sessionManager: SessionManager);
|
|
37
|
+
/**
|
|
38
|
+
* Establish SSE connection for a session
|
|
39
|
+
*/
|
|
40
|
+
connect(req: Request, res: Response, sessionId: string): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Handle streaming events from session manager
|
|
43
|
+
*/
|
|
44
|
+
private handleSessionEvent;
|
|
45
|
+
/**
|
|
46
|
+
* Handle session completion
|
|
47
|
+
*/
|
|
48
|
+
private handleSessionComplete;
|
|
49
|
+
/**
|
|
50
|
+
* Send streaming event to specific connection
|
|
51
|
+
*/
|
|
52
|
+
private sendStreamingEvent;
|
|
53
|
+
/**
|
|
54
|
+
* Send buffered events for a newly connected session
|
|
55
|
+
*/
|
|
56
|
+
private sendBufferedEvents;
|
|
57
|
+
/**
|
|
58
|
+
* Send raw SSE event
|
|
59
|
+
*/
|
|
60
|
+
private sendEvent;
|
|
61
|
+
/**
|
|
62
|
+
* Disconnect and cleanup SSE connection
|
|
63
|
+
*/
|
|
64
|
+
private disconnect;
|
|
65
|
+
/**
|
|
66
|
+
* Start heartbeat monitoring
|
|
67
|
+
*/
|
|
68
|
+
private startHeartbeat;
|
|
69
|
+
/**
|
|
70
|
+
* Check connection health and cleanup stale connections
|
|
71
|
+
*/
|
|
72
|
+
private checkConnectionHealth;
|
|
73
|
+
/**
|
|
74
|
+
* Get connection statistics
|
|
75
|
+
*/
|
|
76
|
+
getStats(): {
|
|
77
|
+
totalConnections: number;
|
|
78
|
+
activeConnections: number;
|
|
79
|
+
sessionDistribution: Record<string, number>;
|
|
80
|
+
averageEventsPerConnection: number;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Force disconnect all connections for a session
|
|
84
|
+
*/
|
|
85
|
+
disconnectSession(sessionId: string, reason?: string): void;
|
|
86
|
+
/**
|
|
87
|
+
* Cleanup and shutdown transport
|
|
88
|
+
*/
|
|
89
|
+
shutdown(): void;
|
|
90
|
+
/**
|
|
91
|
+
* Get active connection for session (for testing)
|
|
92
|
+
*/
|
|
93
|
+
getSessionConnections(sessionId: string): SSEConnection[];
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=sse-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-transport.d.ts","sourceRoot":"","sources":["../../src/streaming/sse-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAkB,MAAM,sBAAsB,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,iBAAiB,CAA+B;IAGxD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAO;IACvC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAS;gBAEvC,cAAc,EAAE,cAAc;IAU1C;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkE5E;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAmB7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2B1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,UAAU;IAsClB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA4C7B;;OAEG;IACH,QAAQ,IAAI;QACV,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5C,0BAA0B,EAAE,MAAM,CAAC;KACpC;IAuBD;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAsB,GAAG,IAAI;IASxE;;OAEG;IACH,QAAQ,IAAI,IAAI;IAiBhB;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE;CAI1D"}
|