@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,555 @@
|
|
|
1
|
+
import { logger } from '../logger.js';
|
|
2
|
+
/**
|
|
3
|
+
* Circular buffer for memory-efficient event storage
|
|
4
|
+
*/
|
|
5
|
+
class CircularBuffer {
|
|
6
|
+
buffer;
|
|
7
|
+
size;
|
|
8
|
+
head = 0;
|
|
9
|
+
tail = 0;
|
|
10
|
+
count = 0;
|
|
11
|
+
constructor(capacity) {
|
|
12
|
+
this.size = capacity;
|
|
13
|
+
this.buffer = new Array(capacity);
|
|
14
|
+
}
|
|
15
|
+
add(item) {
|
|
16
|
+
this.buffer[this.tail] = item;
|
|
17
|
+
this.tail = (this.tail + 1) % this.size;
|
|
18
|
+
if (this.count < this.size) {
|
|
19
|
+
this.count++;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
// Buffer full, move head
|
|
23
|
+
this.head = (this.head + 1) % this.size;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
flush() {
|
|
27
|
+
const items = [];
|
|
28
|
+
while (this.count > 0) {
|
|
29
|
+
items.push(this.buffer[this.head]);
|
|
30
|
+
this.head = (this.head + 1) % this.size;
|
|
31
|
+
this.count--;
|
|
32
|
+
}
|
|
33
|
+
return items;
|
|
34
|
+
}
|
|
35
|
+
peek(count = this.count) {
|
|
36
|
+
const items = [];
|
|
37
|
+
let current = this.head;
|
|
38
|
+
for (let i = 0; i < Math.min(count, this.count); i++) {
|
|
39
|
+
items.push(this.buffer[current]);
|
|
40
|
+
current = (current + 1) % this.size;
|
|
41
|
+
}
|
|
42
|
+
return items;
|
|
43
|
+
}
|
|
44
|
+
getCount() {
|
|
45
|
+
return this.count;
|
|
46
|
+
}
|
|
47
|
+
isFull() {
|
|
48
|
+
return this.count === this.size;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Priority queue implementation for event batching
|
|
53
|
+
*/
|
|
54
|
+
class PriorityQueue {
|
|
55
|
+
queues = new Map();
|
|
56
|
+
priorities = ['immediate', 'high', 'normal', 'low'];
|
|
57
|
+
constructor() {
|
|
58
|
+
this.priorities.forEach(priority => {
|
|
59
|
+
this.queues.set(priority, []);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
enqueue(item, priority) {
|
|
63
|
+
const queue = this.queues.get(priority);
|
|
64
|
+
if (queue) {
|
|
65
|
+
queue.push(item);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
dequeue() {
|
|
69
|
+
for (const priority of this.priorities) {
|
|
70
|
+
const queue = this.queues.get(priority);
|
|
71
|
+
if (queue && queue.length > 0) {
|
|
72
|
+
const item = queue.shift();
|
|
73
|
+
return { item, priority };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
dequeueAll(priority) {
|
|
79
|
+
if (priority) {
|
|
80
|
+
const queue = this.queues.get(priority);
|
|
81
|
+
if (queue) {
|
|
82
|
+
const items = [...queue];
|
|
83
|
+
queue.length = 0;
|
|
84
|
+
return items;
|
|
85
|
+
}
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
// Dequeue all items in priority order
|
|
89
|
+
const items = [];
|
|
90
|
+
for (const p of this.priorities) {
|
|
91
|
+
const queue = this.queues.get(p);
|
|
92
|
+
if (queue) {
|
|
93
|
+
items.push(...queue);
|
|
94
|
+
queue.length = 0;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return items;
|
|
98
|
+
}
|
|
99
|
+
size(priority) {
|
|
100
|
+
if (priority) {
|
|
101
|
+
return this.queues.get(priority)?.length || 0;
|
|
102
|
+
}
|
|
103
|
+
return Array.from(this.queues.values()).reduce((sum, queue) => sum + queue.length, 0);
|
|
104
|
+
}
|
|
105
|
+
isEmpty() {
|
|
106
|
+
return this.size() === 0;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Intelligent buffering system with adaptive throttling and content-aware batching
|
|
111
|
+
*
|
|
112
|
+
* Features:
|
|
113
|
+
* - Priority-based queuing with immediate delivery for critical events
|
|
114
|
+
* - Adaptive throttling based on content type and system load
|
|
115
|
+
* - Content coalescence to reduce noise
|
|
116
|
+
* - Memory-bounded circular buffers
|
|
117
|
+
* - Backpressure handling
|
|
118
|
+
* - Real-time metrics and monitoring
|
|
119
|
+
*/
|
|
120
|
+
export class IntelligentBuffer {
|
|
121
|
+
buffers = new Map();
|
|
122
|
+
flushTimers = new Map();
|
|
123
|
+
states = new Map();
|
|
124
|
+
backlog = new Map();
|
|
125
|
+
// Adaptive buffering rules based on content analysis
|
|
126
|
+
BUFFERING_RULES = {
|
|
127
|
+
// Critical findings bypass buffering
|
|
128
|
+
'critical_finding': {
|
|
129
|
+
delay: 0,
|
|
130
|
+
maxBatch: 1,
|
|
131
|
+
coalescence: false,
|
|
132
|
+
priority: 'immediate'
|
|
133
|
+
},
|
|
134
|
+
// Security issues get high priority
|
|
135
|
+
'security_finding': {
|
|
136
|
+
delay: 50,
|
|
137
|
+
maxBatch: 2,
|
|
138
|
+
coalescence: false,
|
|
139
|
+
priority: 'high'
|
|
140
|
+
},
|
|
141
|
+
// Regular findings with moderate batching
|
|
142
|
+
'finding': {
|
|
143
|
+
delay: 200,
|
|
144
|
+
maxBatch: 5,
|
|
145
|
+
coalescence: true,
|
|
146
|
+
priority: 'normal'
|
|
147
|
+
},
|
|
148
|
+
// Progress updates with standard throttling
|
|
149
|
+
'agent_progress': {
|
|
150
|
+
delay: 200,
|
|
151
|
+
maxBatch: 10,
|
|
152
|
+
coalescence: true,
|
|
153
|
+
priority: 'normal'
|
|
154
|
+
},
|
|
155
|
+
// Errors need immediate attention
|
|
156
|
+
'agent_error': {
|
|
157
|
+
delay: 0,
|
|
158
|
+
maxBatch: 1,
|
|
159
|
+
coalescence: false,
|
|
160
|
+
priority: 'immediate'
|
|
161
|
+
},
|
|
162
|
+
// Completion events are high priority
|
|
163
|
+
'agent_complete': {
|
|
164
|
+
delay: 100,
|
|
165
|
+
maxBatch: 1,
|
|
166
|
+
coalescence: false,
|
|
167
|
+
priority: 'high'
|
|
168
|
+
},
|
|
169
|
+
// Debug info can be heavily throttled
|
|
170
|
+
'debug_info': {
|
|
171
|
+
delay: 1000,
|
|
172
|
+
maxBatch: 20,
|
|
173
|
+
coalescence: true,
|
|
174
|
+
priority: 'low'
|
|
175
|
+
},
|
|
176
|
+
// Milestones are important but can be batched
|
|
177
|
+
'milestone': {
|
|
178
|
+
delay: 150,
|
|
179
|
+
maxBatch: 3,
|
|
180
|
+
coalescence: false,
|
|
181
|
+
priority: 'high'
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
DEFAULT_RULE = {
|
|
185
|
+
delay: 500,
|
|
186
|
+
maxBatch: 5,
|
|
187
|
+
coalescence: true,
|
|
188
|
+
priority: 'normal'
|
|
189
|
+
};
|
|
190
|
+
// Configuration
|
|
191
|
+
MAX_BUFFER_SIZE = 1000; // Events per session
|
|
192
|
+
MAX_MEMORY_MB = 50; // Memory limit per session
|
|
193
|
+
BACKLOG_SIZE = 500; // Backlog events for late subscribers
|
|
194
|
+
constructor() {
|
|
195
|
+
// Periodic cleanup of stale sessions
|
|
196
|
+
setInterval(() => this.cleanupStaleSessions(), 60000); // Every minute
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Add event to buffer with intelligent routing
|
|
200
|
+
*/
|
|
201
|
+
add(event) {
|
|
202
|
+
if (!event.sessionId) {
|
|
203
|
+
logger.warn('Event without sessionId dropped');
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
// Get or create buffer state
|
|
207
|
+
const state = this.getOrCreateState(event.sessionId);
|
|
208
|
+
// Check for backpressure
|
|
209
|
+
if (state.backpressure) {
|
|
210
|
+
logger.warn(`Backpressure detected for session ${event.sessionId}, dropping low priority events`);
|
|
211
|
+
if (this.getEventPriority(event) === 'low') {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Classify event and get buffering rule
|
|
216
|
+
const classification = this.classifyEvent(event);
|
|
217
|
+
const rule = this.BUFFERING_RULES[classification] || this.DEFAULT_RULE;
|
|
218
|
+
// Get or create buffer
|
|
219
|
+
const buffer = this.getOrCreateBuffer(event.sessionId);
|
|
220
|
+
// Add to backlog for late subscribers
|
|
221
|
+
this.addToBacklog(event);
|
|
222
|
+
// Enqueue with priority
|
|
223
|
+
buffer.enqueue(event, rule.priority);
|
|
224
|
+
// Update state
|
|
225
|
+
state.totalEvents++;
|
|
226
|
+
state.pendingEvents = buffer.size();
|
|
227
|
+
state.memoryUsage = this.estimateMemoryUsage(event.sessionId);
|
|
228
|
+
// Check memory limits
|
|
229
|
+
if (state.memoryUsage > this.MAX_MEMORY_MB * 1024 * 1024) {
|
|
230
|
+
this.handleMemoryPressure(event.sessionId);
|
|
231
|
+
}
|
|
232
|
+
// Schedule flush based on rule
|
|
233
|
+
this.scheduleFlush(event.sessionId, rule);
|
|
234
|
+
logger.debug(`Buffered ${classification} event for session ${event.sessionId} (${state.pendingEvents} pending)`);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Force flush of all pending events for a session
|
|
238
|
+
*/
|
|
239
|
+
flush(sessionId, priority) {
|
|
240
|
+
const buffer = this.buffers.get(sessionId);
|
|
241
|
+
const state = this.states.get(sessionId);
|
|
242
|
+
if (!buffer || !state) {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
const events = buffer.dequeueAll(priority);
|
|
246
|
+
if (events.length === 0) {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
// Apply coalescence if enabled
|
|
250
|
+
const coalescedEvents = this.applyCoalescence(events);
|
|
251
|
+
// Update state
|
|
252
|
+
state.pendingEvents = buffer.size();
|
|
253
|
+
state.lastFlush = Date.now();
|
|
254
|
+
state.flushCount++;
|
|
255
|
+
// Clear timer if exists
|
|
256
|
+
const timer = this.flushTimers.get(sessionId);
|
|
257
|
+
if (timer) {
|
|
258
|
+
clearTimeout(timer);
|
|
259
|
+
this.flushTimers.delete(sessionId);
|
|
260
|
+
}
|
|
261
|
+
const batch = {
|
|
262
|
+
sessionId,
|
|
263
|
+
events: coalescedEvents,
|
|
264
|
+
priority: priority || 'normal',
|
|
265
|
+
batchId: `${sessionId}-${state.flushCount}-${Date.now()}`,
|
|
266
|
+
createdAt: Date.now()
|
|
267
|
+
};
|
|
268
|
+
logger.debug(`Flushed ${coalescedEvents.length} events for session ${sessionId} (batch: ${batch.batchId})`);
|
|
269
|
+
return batch;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Get backlog events for late subscribers
|
|
273
|
+
*/
|
|
274
|
+
getBacklog(sessionId, limit) {
|
|
275
|
+
const backlog = this.backlog.get(sessionId);
|
|
276
|
+
if (!backlog) {
|
|
277
|
+
return [];
|
|
278
|
+
}
|
|
279
|
+
return backlog.peek(limit);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get buffer state for monitoring
|
|
283
|
+
*/
|
|
284
|
+
getState(sessionId) {
|
|
285
|
+
return this.states.get(sessionId) || null;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Get all active sessions
|
|
289
|
+
*/
|
|
290
|
+
getActiveSessions() {
|
|
291
|
+
return Array.from(this.buffers.keys());
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Cleanup session resources
|
|
295
|
+
*/
|
|
296
|
+
cleanup(sessionId) {
|
|
297
|
+
// Flush any remaining events
|
|
298
|
+
this.flush(sessionId);
|
|
299
|
+
// Clear timer
|
|
300
|
+
const timer = this.flushTimers.get(sessionId);
|
|
301
|
+
if (timer) {
|
|
302
|
+
clearTimeout(timer);
|
|
303
|
+
this.flushTimers.delete(sessionId);
|
|
304
|
+
}
|
|
305
|
+
// Remove all resources
|
|
306
|
+
this.buffers.delete(sessionId);
|
|
307
|
+
this.states.delete(sessionId);
|
|
308
|
+
this.backlog.delete(sessionId);
|
|
309
|
+
logger.info(`Cleaned up buffer resources for session ${sessionId}`);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Get total memory usage across all sessions
|
|
313
|
+
*/
|
|
314
|
+
getTotalMemoryUsage() {
|
|
315
|
+
return Array.from(this.states.values())
|
|
316
|
+
.reduce((sum, state) => sum + state.memoryUsage, 0);
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Get system-wide metrics
|
|
320
|
+
*/
|
|
321
|
+
getMetrics() {
|
|
322
|
+
const states = Array.from(this.states.values());
|
|
323
|
+
return {
|
|
324
|
+
activeSessions: states.length,
|
|
325
|
+
totalEvents: states.reduce((sum, s) => sum + s.totalEvents, 0),
|
|
326
|
+
totalMemoryMB: Math.round(this.getTotalMemoryUsage() / (1024 * 1024)),
|
|
327
|
+
backpressureSessions: states.filter(s => s.backpressure).length
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Classify event for buffering rules
|
|
332
|
+
*/
|
|
333
|
+
classifyEvent(event) {
|
|
334
|
+
const content = event.content?.toLowerCase() || '';
|
|
335
|
+
const metadata = event.metadata;
|
|
336
|
+
// Check metadata classification first
|
|
337
|
+
if (metadata?.contentType === 'finding') {
|
|
338
|
+
if (metadata.severity === 'critical') {
|
|
339
|
+
return 'critical_finding';
|
|
340
|
+
}
|
|
341
|
+
if (content.includes('security') || content.includes('vulnerability')) {
|
|
342
|
+
return 'security_finding';
|
|
343
|
+
}
|
|
344
|
+
return 'finding';
|
|
345
|
+
}
|
|
346
|
+
// Event type classification
|
|
347
|
+
if (event.type === 'agent_error') {
|
|
348
|
+
return 'agent_error';
|
|
349
|
+
}
|
|
350
|
+
if (event.type === 'agent_complete') {
|
|
351
|
+
return 'agent_complete';
|
|
352
|
+
}
|
|
353
|
+
// Content-based classification
|
|
354
|
+
if (content.includes('critical') || content.includes('security')) {
|
|
355
|
+
return 'critical_finding';
|
|
356
|
+
}
|
|
357
|
+
if (metadata?.contentType === 'milestone') {
|
|
358
|
+
return 'milestone';
|
|
359
|
+
}
|
|
360
|
+
if (metadata?.contentType === 'debug') {
|
|
361
|
+
return 'debug_info';
|
|
362
|
+
}
|
|
363
|
+
return 'agent_progress';
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Get event priority for backpressure handling
|
|
367
|
+
*/
|
|
368
|
+
getEventPriority(event) {
|
|
369
|
+
const classification = this.classifyEvent(event);
|
|
370
|
+
return this.BUFFERING_RULES[classification]?.priority || 'normal';
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Schedule flush based on buffering rule
|
|
374
|
+
*/
|
|
375
|
+
scheduleFlush(sessionId, rule) {
|
|
376
|
+
// Immediate delivery
|
|
377
|
+
if (rule.delay === 0) {
|
|
378
|
+
setImmediate(() => {
|
|
379
|
+
const batch = this.flush(sessionId, rule.priority);
|
|
380
|
+
if (batch) {
|
|
381
|
+
this.deliverBatch(batch);
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
// Check if we should flush due to batch size
|
|
387
|
+
const buffer = this.buffers.get(sessionId);
|
|
388
|
+
if (buffer && buffer.size(rule.priority) >= rule.maxBatch) {
|
|
389
|
+
const batch = this.flush(sessionId, rule.priority);
|
|
390
|
+
if (batch) {
|
|
391
|
+
this.deliverBatch(batch);
|
|
392
|
+
}
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
// Schedule timer if not already scheduled
|
|
396
|
+
if (!this.flushTimers.has(sessionId)) {
|
|
397
|
+
const timer = setTimeout(() => {
|
|
398
|
+
this.flushTimers.delete(sessionId);
|
|
399
|
+
const batch = this.flush(sessionId);
|
|
400
|
+
if (batch) {
|
|
401
|
+
this.deliverBatch(batch);
|
|
402
|
+
}
|
|
403
|
+
}, rule.delay);
|
|
404
|
+
this.flushTimers.set(sessionId, timer);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Apply content coalescence to reduce noise
|
|
409
|
+
*/
|
|
410
|
+
applyCoalescence(events) {
|
|
411
|
+
if (events.length <= 1) {
|
|
412
|
+
return events;
|
|
413
|
+
}
|
|
414
|
+
const coalesced = [];
|
|
415
|
+
const groups = new Map();
|
|
416
|
+
// Group similar events
|
|
417
|
+
for (const event of events) {
|
|
418
|
+
const key = this.getCoalescenceKey(event);
|
|
419
|
+
if (!groups.has(key)) {
|
|
420
|
+
groups.set(key, []);
|
|
421
|
+
}
|
|
422
|
+
groups.get(key).push(event);
|
|
423
|
+
}
|
|
424
|
+
// Coalesce each group
|
|
425
|
+
for (const group of groups.values()) {
|
|
426
|
+
if (group.length === 1) {
|
|
427
|
+
coalesced.push(group[0]);
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
const merged = this.mergeEvents(group);
|
|
431
|
+
coalesced.push(merged);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return coalesced.sort((a, b) => a.timestamp - b.timestamp);
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Generate coalescence key for grouping similar events
|
|
438
|
+
*/
|
|
439
|
+
getCoalescenceKey(event) {
|
|
440
|
+
return `${event.agent}-${event.type}-${event.metadata?.contentType || 'default'}`;
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Merge similar events into single event
|
|
444
|
+
*/
|
|
445
|
+
mergeEvents(events) {
|
|
446
|
+
const first = events[0];
|
|
447
|
+
const last = events[events.length - 1];
|
|
448
|
+
return {
|
|
449
|
+
...first,
|
|
450
|
+
content: events.length > 3
|
|
451
|
+
? `${first.content} ... [${events.length - 2} similar events] ... ${last.content}`
|
|
452
|
+
: events.map(e => e.content).join(' | '),
|
|
453
|
+
timestamp: last.timestamp,
|
|
454
|
+
metadata: {
|
|
455
|
+
...first.metadata,
|
|
456
|
+
coalescedCount: events.length,
|
|
457
|
+
timespan: last.timestamp - first.timestamp
|
|
458
|
+
}
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Get or create buffer for session
|
|
463
|
+
*/
|
|
464
|
+
getOrCreateBuffer(sessionId) {
|
|
465
|
+
if (!this.buffers.has(sessionId)) {
|
|
466
|
+
this.buffers.set(sessionId, new PriorityQueue());
|
|
467
|
+
}
|
|
468
|
+
return this.buffers.get(sessionId);
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Get or create buffer state
|
|
472
|
+
*/
|
|
473
|
+
getOrCreateState(sessionId) {
|
|
474
|
+
if (!this.states.has(sessionId)) {
|
|
475
|
+
this.states.set(sessionId, {
|
|
476
|
+
sessionId,
|
|
477
|
+
totalEvents: 0,
|
|
478
|
+
pendingEvents: 0,
|
|
479
|
+
lastFlush: Date.now(),
|
|
480
|
+
flushCount: 0,
|
|
481
|
+
backpressure: false,
|
|
482
|
+
memoryUsage: 0
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
return this.states.get(sessionId);
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Add event to backlog for late subscribers
|
|
489
|
+
*/
|
|
490
|
+
addToBacklog(event) {
|
|
491
|
+
if (!event.sessionId)
|
|
492
|
+
return;
|
|
493
|
+
if (!this.backlog.has(event.sessionId)) {
|
|
494
|
+
this.backlog.set(event.sessionId, new CircularBuffer(this.BACKLOG_SIZE));
|
|
495
|
+
}
|
|
496
|
+
this.backlog.get(event.sessionId).add(event);
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Estimate memory usage for session
|
|
500
|
+
*/
|
|
501
|
+
estimateMemoryUsage(sessionId) {
|
|
502
|
+
const buffer = this.buffers.get(sessionId);
|
|
503
|
+
const backlog = this.backlog.get(sessionId);
|
|
504
|
+
let size = 0;
|
|
505
|
+
// Estimate buffer size (rough approximation)
|
|
506
|
+
if (buffer) {
|
|
507
|
+
size += buffer.size() * 500; // ~500 bytes per event
|
|
508
|
+
}
|
|
509
|
+
// Estimate backlog size
|
|
510
|
+
if (backlog) {
|
|
511
|
+
size += backlog.getCount() * 500;
|
|
512
|
+
}
|
|
513
|
+
return size;
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Handle memory pressure by dropping low priority events
|
|
517
|
+
*/
|
|
518
|
+
handleMemoryPressure(sessionId) {
|
|
519
|
+
const state = this.getOrCreateState(sessionId);
|
|
520
|
+
const buffer = this.buffers.get(sessionId);
|
|
521
|
+
state.backpressure = true;
|
|
522
|
+
// Flush low priority events immediately to free memory
|
|
523
|
+
if (buffer) {
|
|
524
|
+
const lowPriorityEvents = buffer.dequeueAll('low');
|
|
525
|
+
logger.warn(`Memory pressure: dropped ${lowPriorityEvents.length} low priority events for session ${sessionId}`);
|
|
526
|
+
}
|
|
527
|
+
// Clear backpressure after a delay
|
|
528
|
+
setTimeout(() => {
|
|
529
|
+
state.backpressure = false;
|
|
530
|
+
}, 5000);
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Clean up stale sessions (no activity for > 1 hour)
|
|
534
|
+
*/
|
|
535
|
+
cleanupStaleSessions() {
|
|
536
|
+
const now = Date.now();
|
|
537
|
+
const staleThreshold = 60 * 60 * 1000; // 1 hour
|
|
538
|
+
for (const [sessionId, state] of this.states.entries()) {
|
|
539
|
+
if (now - state.lastFlush > staleThreshold) {
|
|
540
|
+
logger.info(`Cleaning up stale session: ${sessionId}`);
|
|
541
|
+
this.cleanup(sessionId);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* Deliver batch to subscribers (to be implemented by transport layer)
|
|
547
|
+
*/
|
|
548
|
+
deliverBatch(batch) {
|
|
549
|
+
// This will be called by the transport layer
|
|
550
|
+
// For now, just emit a custom event that can be listened to
|
|
551
|
+
// Emit batch as event (commented out as it's not needed for current implementation)
|
|
552
|
+
// process.emit('streaming-batch', batch);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
//# sourceMappingURL=intelligent-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intelligent-buffer.js","sourceRoot":"","sources":["../../src/streaming/intelligent-buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { StreamingEvent } from '../cli-agents.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parser state for tracking CLI output phases
|
|
4
|
+
*/
|
|
5
|
+
export interface ParserState {
|
|
6
|
+
phase: 'starting' | 'thinking' | 'analyzing' | 'outputting' | 'complete';
|
|
7
|
+
agent: string;
|
|
8
|
+
sessionId?: string;
|
|
9
|
+
bufferSize: number;
|
|
10
|
+
processedChunks: number;
|
|
11
|
+
lastEventTime: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Streaming parser interface for real-time CLI output processing
|
|
15
|
+
*/
|
|
16
|
+
export interface StreamingParser {
|
|
17
|
+
parse(chunk: string, agent: string): StreamingEvent[];
|
|
18
|
+
flush(): StreamingEvent[];
|
|
19
|
+
getState(): ParserState;
|
|
20
|
+
reset(): void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Advanced semantic output parser with boundary detection and content classification
|
|
24
|
+
*
|
|
25
|
+
* Key features:
|
|
26
|
+
* - State machine tracking for CLI phases
|
|
27
|
+
* - Sentence/paragraph boundary detection
|
|
28
|
+
* - Content classification (findings vs debug info)
|
|
29
|
+
* - Streaming tokenization with incomplete sentence handling
|
|
30
|
+
* - Memory-efficient circular buffering
|
|
31
|
+
*/
|
|
32
|
+
export declare class SemanticOutputParser implements StreamingParser {
|
|
33
|
+
private buffer;
|
|
34
|
+
private state;
|
|
35
|
+
private readonly BOUNDARY_PATTERNS;
|
|
36
|
+
private readonly CLASSIFICATION_PATTERNS;
|
|
37
|
+
private readonly PHASE_PATTERNS;
|
|
38
|
+
constructor(agent: string, sessionId?: string);
|
|
39
|
+
/**
|
|
40
|
+
* Parse incoming CLI output chunk into semantic streaming events
|
|
41
|
+
*/
|
|
42
|
+
parse(chunk: string, agent: string): StreamingEvent[];
|
|
43
|
+
/**
|
|
44
|
+
* Flush any remaining content as final events
|
|
45
|
+
*/
|
|
46
|
+
flush(): StreamingEvent[];
|
|
47
|
+
/**
|
|
48
|
+
* Get current parser state
|
|
49
|
+
*/
|
|
50
|
+
getState(): ParserState;
|
|
51
|
+
/**
|
|
52
|
+
* Reset parser to initial state
|
|
53
|
+
*/
|
|
54
|
+
reset(): void;
|
|
55
|
+
/**
|
|
56
|
+
* Detect semantic boundaries in text for clean chunking
|
|
57
|
+
*/
|
|
58
|
+
private detectBoundaries;
|
|
59
|
+
/**
|
|
60
|
+
* Check if text ends with complete sentence
|
|
61
|
+
*/
|
|
62
|
+
private isCompleteSentence;
|
|
63
|
+
/**
|
|
64
|
+
* Restore code blocks in text
|
|
65
|
+
*/
|
|
66
|
+
private restoreCodeBlocks;
|
|
67
|
+
/**
|
|
68
|
+
* Update parser phase based on content analysis
|
|
69
|
+
*/
|
|
70
|
+
private updatePhase;
|
|
71
|
+
/**
|
|
72
|
+
* Create streaming event from text segment
|
|
73
|
+
*/
|
|
74
|
+
private createEventFromSegment;
|
|
75
|
+
/**
|
|
76
|
+
* Classify content to determine event type and severity
|
|
77
|
+
*/
|
|
78
|
+
private classifyContent;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Factory for creating parsers optimized for different CLI agents
|
|
82
|
+
*/
|
|
83
|
+
export declare class ParserFactory {
|
|
84
|
+
/**
|
|
85
|
+
* Create parser optimized for specific CLI agent
|
|
86
|
+
*/
|
|
87
|
+
static createParser(agent: 'claude' | 'codex' | 'gemini', sessionId?: string): StreamingParser;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=output-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-parser.d.ts","sourceRoot":"","sources":["../../src/streaming/output-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAmBD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;IACtD,KAAK,IAAI,cAAc,EAAE,CAAC;IAC1B,QAAQ,IAAI,WAAW,CAAC;IACxB,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,KAAK,CAAc;IAG3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAMhC;IAGF,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAYtC;IAGF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAM7B;gBAEU,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAW7C;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE;IAuCrD;;OAEG;IACH,KAAK,IAAI,cAAc,EAAE;IAezB;;OAEG;IACH,QAAQ,IAAI,WAAW;IAIvB;;OAEG;IACH,KAAK,IAAI,IAAI;IAYb;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoCxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAwC9B;;OAEG;IACH,OAAO,CAAC,eAAe;CAgCxB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,eAAe;CAY/F"}
|