@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.
Files changed (75) hide show
  1. package/README.md +65 -63
  2. package/dist/brutalist-server.d.ts +15 -0
  3. package/dist/brutalist-server.d.ts.map +1 -1
  4. package/dist/brutalist-server.js +405 -357
  5. package/dist/brutalist-server.js.map +1 -1
  6. package/dist/cli-agents.d.ts +8 -3
  7. package/dist/cli-agents.d.ts.map +1 -1
  8. package/dist/cli-agents.js +352 -50
  9. package/dist/cli-agents.js.map +1 -1
  10. package/dist/streaming/circuit-breaker.d.ts +186 -0
  11. package/dist/streaming/circuit-breaker.d.ts.map +1 -0
  12. package/dist/streaming/circuit-breaker.js +463 -0
  13. package/dist/streaming/circuit-breaker.js.map +1 -0
  14. package/dist/streaming/intelligent-buffer.d.ts +141 -0
  15. package/dist/streaming/intelligent-buffer.d.ts.map +1 -0
  16. package/dist/streaming/intelligent-buffer.js +555 -0
  17. package/dist/streaming/intelligent-buffer.js.map +1 -0
  18. package/dist/streaming/output-parser.d.ts +89 -0
  19. package/dist/streaming/output-parser.d.ts.map +1 -0
  20. package/dist/streaming/output-parser.js +349 -0
  21. package/dist/streaming/output-parser.js.map +1 -0
  22. package/dist/streaming/progress-tracker.d.ts +149 -0
  23. package/dist/streaming/progress-tracker.d.ts.map +1 -0
  24. package/dist/streaming/progress-tracker.js +519 -0
  25. package/dist/streaming/progress-tracker.js.map +1 -0
  26. package/dist/streaming/session-manager.d.ts +238 -0
  27. package/dist/streaming/session-manager.d.ts.map +1 -0
  28. package/dist/streaming/session-manager.js +546 -0
  29. package/dist/streaming/session-manager.js.map +1 -0
  30. package/dist/streaming/sse-transport.d.ts +95 -0
  31. package/dist/streaming/sse-transport.d.ts.map +1 -0
  32. package/dist/streaming/sse-transport.js +319 -0
  33. package/dist/streaming/sse-transport.js.map +1 -0
  34. package/dist/streaming/streaming-orchestrator.d.ts +153 -0
  35. package/dist/streaming/streaming-orchestrator.d.ts.map +1 -0
  36. package/dist/streaming/streaming-orchestrator.js +436 -0
  37. package/dist/streaming/streaming-orchestrator.js.map +1 -0
  38. package/dist/test-utils/process-manager.d.ts +61 -0
  39. package/dist/test-utils/process-manager.d.ts.map +1 -0
  40. package/dist/test-utils/process-manager.js +262 -0
  41. package/dist/test-utils/process-manager.js.map +1 -0
  42. package/dist/test-utils/server-harness.d.ts +73 -0
  43. package/dist/test-utils/server-harness.d.ts.map +1 -0
  44. package/dist/test-utils/server-harness.js +296 -0
  45. package/dist/test-utils/server-harness.js.map +1 -0
  46. package/dist/test-utils/streaming-fuzz.d.ts +57 -0
  47. package/dist/test-utils/streaming-fuzz.d.ts.map +1 -0
  48. package/dist/test-utils/streaming-fuzz.js +287 -0
  49. package/dist/test-utils/streaming-fuzz.js.map +1 -0
  50. package/dist/test-utils/test-isolation.d.ts +70 -0
  51. package/dist/test-utils/test-isolation.d.ts.map +1 -0
  52. package/dist/test-utils/test-isolation.js +193 -0
  53. package/dist/test-utils/test-isolation.js.map +1 -0
  54. package/dist/tool-definitions.d.ts +6 -0
  55. package/dist/tool-definitions.d.ts.map +1 -0
  56. package/dist/tool-definitions.js +217 -0
  57. package/dist/tool-definitions.js.map +1 -0
  58. package/dist/types/brutalist.d.ts +3 -19
  59. package/dist/types/brutalist.d.ts.map +1 -1
  60. package/dist/types/tool-config.d.ts +51 -0
  61. package/dist/types/tool-config.d.ts.map +1 -0
  62. package/dist/types/tool-config.js +24 -0
  63. package/dist/types/tool-config.js.map +1 -0
  64. package/dist/utils/pagination.d.ts +2 -2
  65. package/dist/utils/pagination.d.ts.map +1 -1
  66. package/dist/utils/pagination.js +1 -1
  67. package/dist/utils/pagination.js.map +1 -1
  68. package/dist/utils/response-cache.d.ts +96 -0
  69. package/dist/utils/response-cache.d.ts.map +1 -0
  70. package/dist/utils/response-cache.js +371 -0
  71. package/dist/utils/response-cache.js.map +1 -0
  72. package/dist/utils.d.ts.map +1 -1
  73. package/dist/utils.js +22 -3
  74. package/dist/utils.js.map +1 -1
  75. 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"}