@brutalist/mcp 0.6.0 → 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 +3 -1
- package/dist/brutalist-server.d.ts +5 -0
- package/dist/brutalist-server.d.ts.map +1 -1
- package/dist/brutalist-server.js +244 -80
- package/dist/brutalist-server.js.map +1 -1
- package/dist/cli-agents.d.ts +7 -3
- package/dist/cli-agents.d.ts.map +1 -1
- package/dist/cli-agents.js +307 -48
- 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.map +1 -1
- package/dist/tool-definitions.js +12 -6
- package/dist/tool-definitions.js.map +1 -1
- package/dist/types/brutalist.d.ts +3 -3
- package/dist/types/brutalist.d.ts.map +1 -1
- package/dist/types/tool-config.d.ts +0 -1
- package/dist/types/tool-config.d.ts.map +1 -1
- package/dist/types/tool-config.js +0 -1
- package/dist/types/tool-config.js.map +1 -1
- package/dist/utils/response-cache.d.ts +14 -7
- package/dist/utils/response-cache.d.ts.map +1 -1
- package/dist/utils/response-cache.js +173 -62
- package/dist/utils/response-cache.js.map +1 -1
- package/package.json +13 -3
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { logger } from '../logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Analysis progress phases with detailed milestones
|
|
5
|
+
*/
|
|
6
|
+
export var AnalysisPhase;
|
|
7
|
+
(function (AnalysisPhase) {
|
|
8
|
+
AnalysisPhase["INITIALIZING"] = "initializing";
|
|
9
|
+
AnalysisPhase["COLLECTING_DATA"] = "collecting_data";
|
|
10
|
+
AnalysisPhase["ANALYZING"] = "analyzing";
|
|
11
|
+
AnalysisPhase["PROCESSING_RESULTS"] = "processing_results";
|
|
12
|
+
AnalysisPhase["GENERATING_REPORT"] = "generating_report";
|
|
13
|
+
AnalysisPhase["COMPLETE"] = "complete";
|
|
14
|
+
AnalysisPhase["ERROR"] = "error";
|
|
15
|
+
})(AnalysisPhase || (AnalysisPhase = {}));
|
|
16
|
+
/**
|
|
17
|
+
* Analysis type-specific milestone definitions
|
|
18
|
+
*/
|
|
19
|
+
export const ANALYSIS_MILESTONES = {
|
|
20
|
+
roast_codebase: [
|
|
21
|
+
{
|
|
22
|
+
id: 'init_analysis',
|
|
23
|
+
phase: AnalysisPhase.INITIALIZING,
|
|
24
|
+
name: 'Initialize Analysis',
|
|
25
|
+
description: 'Setting up analysis environment and validating target path',
|
|
26
|
+
estimatedDuration: 5000,
|
|
27
|
+
weight: 0.05
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'scan_structure',
|
|
31
|
+
phase: AnalysisPhase.COLLECTING_DATA,
|
|
32
|
+
name: 'Scan Code Structure',
|
|
33
|
+
description: 'Analyzing directory structure and identifying files',
|
|
34
|
+
estimatedDuration: 15000,
|
|
35
|
+
weight: 0.15,
|
|
36
|
+
dependencies: ['init_analysis']
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: 'read_core_files',
|
|
40
|
+
phase: AnalysisPhase.COLLECTING_DATA,
|
|
41
|
+
name: 'Read Core Files',
|
|
42
|
+
description: 'Reading and parsing main source files',
|
|
43
|
+
estimatedDuration: 30000,
|
|
44
|
+
weight: 0.20,
|
|
45
|
+
dependencies: ['scan_structure']
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: 'analyze_architecture',
|
|
49
|
+
phase: AnalysisPhase.ANALYZING,
|
|
50
|
+
name: 'Analyze Architecture',
|
|
51
|
+
description: 'Evaluating system architecture and design patterns',
|
|
52
|
+
estimatedDuration: 45000,
|
|
53
|
+
weight: 0.25,
|
|
54
|
+
dependencies: ['read_core_files']
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'security_audit',
|
|
58
|
+
phase: AnalysisPhase.ANALYZING,
|
|
59
|
+
name: 'Security Audit',
|
|
60
|
+
description: 'Scanning for security vulnerabilities and issues',
|
|
61
|
+
estimatedDuration: 35000,
|
|
62
|
+
weight: 0.20,
|
|
63
|
+
dependencies: ['read_core_files']
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'performance_analysis',
|
|
67
|
+
phase: AnalysisPhase.ANALYZING,
|
|
68
|
+
name: 'Performance Analysis',
|
|
69
|
+
description: 'Identifying performance bottlenecks and inefficiencies',
|
|
70
|
+
estimatedDuration: 25000,
|
|
71
|
+
weight: 0.10,
|
|
72
|
+
dependencies: ['analyze_architecture'],
|
|
73
|
+
optional: true
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: 'generate_findings',
|
|
77
|
+
phase: AnalysisPhase.PROCESSING_RESULTS,
|
|
78
|
+
name: 'Generate Findings',
|
|
79
|
+
description: 'Compiling analysis results and prioritizing issues',
|
|
80
|
+
estimatedDuration: 20000,
|
|
81
|
+
weight: 0.05,
|
|
82
|
+
dependencies: ['analyze_architecture', 'security_audit']
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
roast_idea: [
|
|
86
|
+
{
|
|
87
|
+
id: 'idea_validation',
|
|
88
|
+
phase: AnalysisPhase.INITIALIZING,
|
|
89
|
+
name: 'Validate Idea',
|
|
90
|
+
description: 'Understanding and validating the core concept',
|
|
91
|
+
estimatedDuration: 8000,
|
|
92
|
+
weight: 0.10
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: 'market_research',
|
|
96
|
+
phase: AnalysisPhase.COLLECTING_DATA,
|
|
97
|
+
name: 'Market Research',
|
|
98
|
+
description: 'Analyzing market conditions and competition',
|
|
99
|
+
estimatedDuration: 25000,
|
|
100
|
+
weight: 0.30,
|
|
101
|
+
dependencies: ['idea_validation']
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: 'feasibility_analysis',
|
|
105
|
+
phase: AnalysisPhase.ANALYZING,
|
|
106
|
+
name: 'Feasibility Analysis',
|
|
107
|
+
description: 'Evaluating technical and business feasibility',
|
|
108
|
+
estimatedDuration: 30000,
|
|
109
|
+
weight: 0.35,
|
|
110
|
+
dependencies: ['market_research']
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: 'risk_assessment',
|
|
114
|
+
phase: AnalysisPhase.ANALYZING,
|
|
115
|
+
name: 'Risk Assessment',
|
|
116
|
+
description: 'Identifying potential risks and failure modes',
|
|
117
|
+
estimatedDuration: 20000,
|
|
118
|
+
weight: 0.20,
|
|
119
|
+
dependencies: ['feasibility_analysis']
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: 'recommendation_synthesis',
|
|
123
|
+
phase: AnalysisPhase.PROCESSING_RESULTS,
|
|
124
|
+
name: 'Synthesize Recommendations',
|
|
125
|
+
description: 'Generating actionable recommendations and critique',
|
|
126
|
+
estimatedDuration: 15000,
|
|
127
|
+
weight: 0.05,
|
|
128
|
+
dependencies: ['risk_assessment']
|
|
129
|
+
}
|
|
130
|
+
],
|
|
131
|
+
roast_security: [
|
|
132
|
+
{
|
|
133
|
+
id: 'threat_modeling',
|
|
134
|
+
phase: AnalysisPhase.INITIALIZING,
|
|
135
|
+
name: 'Threat Modeling',
|
|
136
|
+
description: 'Identifying attack vectors and threat landscape',
|
|
137
|
+
estimatedDuration: 15000,
|
|
138
|
+
weight: 0.20
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: 'vulnerability_scan',
|
|
142
|
+
phase: AnalysisPhase.ANALYZING,
|
|
143
|
+
name: 'Vulnerability Scan',
|
|
144
|
+
description: 'Scanning for known security vulnerabilities',
|
|
145
|
+
estimatedDuration: 40000,
|
|
146
|
+
weight: 0.40,
|
|
147
|
+
dependencies: ['threat_modeling']
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
id: 'privilege_analysis',
|
|
151
|
+
phase: AnalysisPhase.ANALYZING,
|
|
152
|
+
name: 'Privilege Analysis',
|
|
153
|
+
description: 'Analyzing access controls and privilege escalation',
|
|
154
|
+
estimatedDuration: 25000,
|
|
155
|
+
weight: 0.25,
|
|
156
|
+
dependencies: ['vulnerability_scan']
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
id: 'compliance_check',
|
|
160
|
+
phase: AnalysisPhase.ANALYZING,
|
|
161
|
+
name: 'Compliance Check',
|
|
162
|
+
description: 'Checking compliance with security standards',
|
|
163
|
+
estimatedDuration: 20000,
|
|
164
|
+
weight: 0.10,
|
|
165
|
+
dependencies: ['privilege_analysis'],
|
|
166
|
+
optional: true
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
id: 'security_recommendations',
|
|
170
|
+
phase: AnalysisPhase.PROCESSING_RESULTS,
|
|
171
|
+
name: 'Security Recommendations',
|
|
172
|
+
description: 'Generating prioritized security recommendations',
|
|
173
|
+
estimatedDuration: 10000,
|
|
174
|
+
weight: 0.05,
|
|
175
|
+
dependencies: ['privilege_analysis']
|
|
176
|
+
}
|
|
177
|
+
]
|
|
178
|
+
};
|
|
179
|
+
/**
|
|
180
|
+
* Progress milestone system with intelligent phase detection
|
|
181
|
+
*
|
|
182
|
+
* Features:
|
|
183
|
+
* - Dynamic milestone tracking based on analysis type
|
|
184
|
+
* - Intelligent progress estimation with dependencies
|
|
185
|
+
* - Phase transition detection from CLI output
|
|
186
|
+
* - ETA calculation with adaptive learning
|
|
187
|
+
* - Progress events for real-time updates
|
|
188
|
+
*/
|
|
189
|
+
export class ProgressTracker extends EventEmitter {
|
|
190
|
+
state;
|
|
191
|
+
milestones;
|
|
192
|
+
sessionId;
|
|
193
|
+
analysisType;
|
|
194
|
+
// Pattern matching for phase detection
|
|
195
|
+
PHASE_PATTERNS = {
|
|
196
|
+
[AnalysisPhase.INITIALIZING]: [
|
|
197
|
+
/initializing|starting|setting up|loading/i,
|
|
198
|
+
/^Starting analysis/i,
|
|
199
|
+
/Validating/i
|
|
200
|
+
],
|
|
201
|
+
[AnalysisPhase.COLLECTING_DATA]: [
|
|
202
|
+
/reading|scanning|collecting|gathering|loading files/i,
|
|
203
|
+
/Found \d+ files/i,
|
|
204
|
+
/Processing directory/i,
|
|
205
|
+
/Analyzing structure/i
|
|
206
|
+
],
|
|
207
|
+
[AnalysisPhase.ANALYZING]: [
|
|
208
|
+
/analyzing|examining|evaluating|processing|reviewing/i,
|
|
209
|
+
/Security scan/i,
|
|
210
|
+
/Architecture analysis/i,
|
|
211
|
+
/Performance check/i,
|
|
212
|
+
/^CRITICAL|^WARNING|^ERROR/i
|
|
213
|
+
],
|
|
214
|
+
[AnalysisPhase.PROCESSING_RESULTS]: [
|
|
215
|
+
/generating|compiling|summarizing|finalizing/i,
|
|
216
|
+
/Creating report/i,
|
|
217
|
+
/Summary of findings/i
|
|
218
|
+
],
|
|
219
|
+
[AnalysisPhase.COMPLETE]: [
|
|
220
|
+
/analysis complete|finished|done|summary complete/i,
|
|
221
|
+
/Total issues found/i,
|
|
222
|
+
/Analysis completed/i
|
|
223
|
+
],
|
|
224
|
+
[AnalysisPhase.ERROR]: [
|
|
225
|
+
/failed|error|exception|crashed|timeout/i,
|
|
226
|
+
/Analysis failed/i,
|
|
227
|
+
/Fatal error/i
|
|
228
|
+
]
|
|
229
|
+
};
|
|
230
|
+
// Milestone triggers based on content patterns
|
|
231
|
+
MILESTONE_TRIGGERS = {
|
|
232
|
+
scan_structure: [
|
|
233
|
+
/Found \d+ files/i,
|
|
234
|
+
/Directory structure:/i,
|
|
235
|
+
/Scanning.*files/i
|
|
236
|
+
],
|
|
237
|
+
read_core_files: [
|
|
238
|
+
/Reading.*\.js|\.ts|\.py|\.go/i,
|
|
239
|
+
/Processing.*files/i,
|
|
240
|
+
/File analysis/i
|
|
241
|
+
],
|
|
242
|
+
security_audit: [
|
|
243
|
+
/Security scan|vulnerability|CRITICAL|HIGH RISK/i,
|
|
244
|
+
/Authentication|Authorization|Injection/i,
|
|
245
|
+
/Security issue/i
|
|
246
|
+
],
|
|
247
|
+
performance_analysis: [
|
|
248
|
+
/Performance|bottleneck|optimization|slow/i,
|
|
249
|
+
/Memory usage|CPU intensive/i,
|
|
250
|
+
/Performance issue/i
|
|
251
|
+
],
|
|
252
|
+
threat_modeling: [
|
|
253
|
+
/Threat model|attack vector|threat landscape/i,
|
|
254
|
+
/Potential attacks/i
|
|
255
|
+
],
|
|
256
|
+
vulnerability_scan: [
|
|
257
|
+
/Vulnerability scan|CVE-|security flaw/i,
|
|
258
|
+
/Known vulnerabilities/i
|
|
259
|
+
]
|
|
260
|
+
};
|
|
261
|
+
constructor(sessionId, analysisType) {
|
|
262
|
+
super();
|
|
263
|
+
this.sessionId = sessionId;
|
|
264
|
+
this.analysisType = analysisType;
|
|
265
|
+
this.milestones = ANALYSIS_MILESTONES[analysisType] || [];
|
|
266
|
+
this.state = {
|
|
267
|
+
currentPhase: AnalysisPhase.INITIALIZING,
|
|
268
|
+
overallProgress: 0,
|
|
269
|
+
phaseProgress: 0,
|
|
270
|
+
completedMilestones: new Set(),
|
|
271
|
+
startTime: Date.now(),
|
|
272
|
+
lastUpdate: Date.now(),
|
|
273
|
+
errors: []
|
|
274
|
+
};
|
|
275
|
+
logger.info(`📊 Progress tracker initialized for ${analysisType} (${this.milestones.length} milestones)`);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Process streaming event and update progress
|
|
279
|
+
*/
|
|
280
|
+
processEvent(event) {
|
|
281
|
+
if (event.sessionId !== this.sessionId) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
const content = event.content || '';
|
|
285
|
+
this.state.lastUpdate = Date.now();
|
|
286
|
+
// Detect phase transitions
|
|
287
|
+
this.detectPhaseFromContent(content);
|
|
288
|
+
// Detect milestone completion
|
|
289
|
+
this.detectMilestonesFromContent(content);
|
|
290
|
+
// Handle errors
|
|
291
|
+
if (event.type === 'agent_error') {
|
|
292
|
+
this.handleError(content);
|
|
293
|
+
}
|
|
294
|
+
// Update progress calculations
|
|
295
|
+
this.updateProgress();
|
|
296
|
+
// Emit progress event
|
|
297
|
+
this.emitProgressEvent('progress_updated');
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Detect current phase from CLI output content
|
|
301
|
+
*/
|
|
302
|
+
detectPhaseFromContent(content) {
|
|
303
|
+
for (const [phase, patterns] of Object.entries(this.PHASE_PATTERNS)) {
|
|
304
|
+
for (const pattern of patterns) {
|
|
305
|
+
if (pattern.test(content)) {
|
|
306
|
+
this.transitionToPhase(phase);
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Detect milestone completion from content
|
|
314
|
+
*/
|
|
315
|
+
detectMilestonesFromContent(content) {
|
|
316
|
+
for (const milestone of this.milestones) {
|
|
317
|
+
// Skip already completed milestones
|
|
318
|
+
if (this.state.completedMilestones.has(milestone.id)) {
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
// Check if dependencies are met
|
|
322
|
+
if (!this.areDependenciesMet(milestone)) {
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
// Check milestone triggers
|
|
326
|
+
const triggers = this.MILESTONE_TRIGGERS[milestone.id];
|
|
327
|
+
if (triggers) {
|
|
328
|
+
for (const trigger of triggers) {
|
|
329
|
+
if (trigger.test(content)) {
|
|
330
|
+
this.completeMilestone(milestone);
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
// Auto-complete milestones when phase advances beyond milestone phase
|
|
336
|
+
if (this.shouldAutoCompleteMilestone(milestone)) {
|
|
337
|
+
this.completeMilestone(milestone);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Transition to new phase
|
|
343
|
+
*/
|
|
344
|
+
transitionToPhase(newPhase) {
|
|
345
|
+
if (this.state.currentPhase === newPhase) {
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
logger.debug(`🔄 Phase transition: ${this.state.currentPhase} → ${newPhase}`);
|
|
349
|
+
const oldPhase = this.state.currentPhase;
|
|
350
|
+
this.state.currentPhase = newPhase;
|
|
351
|
+
this.state.phaseProgress = 0;
|
|
352
|
+
// Auto-complete milestones from previous phases
|
|
353
|
+
this.autoCompletePreviousPhaseMilestones(oldPhase);
|
|
354
|
+
this.emitProgressEvent('phase_changed', {
|
|
355
|
+
previousPhase: oldPhase,
|
|
356
|
+
newPhase
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Complete a milestone
|
|
361
|
+
*/
|
|
362
|
+
completeMilestone(milestone) {
|
|
363
|
+
if (this.state.completedMilestones.has(milestone.id)) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
logger.info(`✅ Milestone completed: ${milestone.name}`);
|
|
367
|
+
this.state.completedMilestones.add(milestone.id);
|
|
368
|
+
this.state.currentMilestone = milestone;
|
|
369
|
+
this.emitProgressEvent('milestone_completed', {
|
|
370
|
+
milestone: milestone.id,
|
|
371
|
+
milestoneName: milestone.name
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Check if milestone dependencies are met
|
|
376
|
+
*/
|
|
377
|
+
areDependenciesMet(milestone) {
|
|
378
|
+
if (!milestone.dependencies) {
|
|
379
|
+
return true;
|
|
380
|
+
}
|
|
381
|
+
return milestone.dependencies.every(depId => this.state.completedMilestones.has(depId));
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Check if milestone should be auto-completed
|
|
385
|
+
*/
|
|
386
|
+
shouldAutoCompleteMilestone(milestone) {
|
|
387
|
+
// Get phase order
|
|
388
|
+
const phases = Object.values(AnalysisPhase);
|
|
389
|
+
const currentPhaseIndex = phases.indexOf(this.state.currentPhase);
|
|
390
|
+
const milestonePhaseIndex = phases.indexOf(milestone.phase);
|
|
391
|
+
// Auto-complete if we've moved past the milestone's phase
|
|
392
|
+
return currentPhaseIndex > milestonePhaseIndex;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Auto-complete milestones from previous phases
|
|
396
|
+
*/
|
|
397
|
+
autoCompletePreviousPhaseMilestones(previousPhase) {
|
|
398
|
+
const phases = Object.values(AnalysisPhase);
|
|
399
|
+
const previousPhaseIndex = phases.indexOf(previousPhase);
|
|
400
|
+
for (const milestone of this.milestones) {
|
|
401
|
+
const milestonePhaseIndex = phases.indexOf(milestone.phase);
|
|
402
|
+
if (milestonePhaseIndex <= previousPhaseIndex &&
|
|
403
|
+
!this.state.completedMilestones.has(milestone.id) &&
|
|
404
|
+
this.areDependenciesMet(milestone)) {
|
|
405
|
+
logger.debug(`🔄 Auto-completing milestone: ${milestone.name}`);
|
|
406
|
+
this.completeMilestone(milestone);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Update progress calculations
|
|
412
|
+
*/
|
|
413
|
+
updateProgress() {
|
|
414
|
+
// Calculate overall progress based on completed milestone weights
|
|
415
|
+
let totalWeight = 0;
|
|
416
|
+
let completedWeight = 0;
|
|
417
|
+
for (const milestone of this.milestones) {
|
|
418
|
+
totalWeight += milestone.weight;
|
|
419
|
+
if (this.state.completedMilestones.has(milestone.id)) {
|
|
420
|
+
completedWeight += milestone.weight;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
this.state.overallProgress = totalWeight > 0 ? completedWeight / totalWeight : 0;
|
|
424
|
+
// Calculate phase progress
|
|
425
|
+
const phaseMilestones = this.milestones.filter(m => m.phase === this.state.currentPhase);
|
|
426
|
+
const completedPhaseMilestones = phaseMilestones.filter(m => this.state.completedMilestones.has(m.id));
|
|
427
|
+
this.state.phaseProgress = phaseMilestones.length > 0
|
|
428
|
+
? completedPhaseMilestones.length / phaseMilestones.length
|
|
429
|
+
: 0;
|
|
430
|
+
// Estimate completion time
|
|
431
|
+
this.updateEstimatedCompletion();
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Update estimated completion time
|
|
435
|
+
*/
|
|
436
|
+
updateEstimatedCompletion() {
|
|
437
|
+
if (this.state.overallProgress <= 0) {
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
const elapsed = Date.now() - this.state.startTime;
|
|
441
|
+
const estimatedTotal = elapsed / this.state.overallProgress;
|
|
442
|
+
this.state.estimatedCompletion = this.state.startTime + estimatedTotal;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Handle error in analysis
|
|
446
|
+
*/
|
|
447
|
+
handleError(error) {
|
|
448
|
+
this.state.errors.push(error);
|
|
449
|
+
this.state.currentPhase = AnalysisPhase.ERROR;
|
|
450
|
+
this.emitProgressEvent('analysis_error', {
|
|
451
|
+
error,
|
|
452
|
+
errorCount: this.state.errors.length
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Mark analysis as complete
|
|
457
|
+
*/
|
|
458
|
+
markComplete() {
|
|
459
|
+
this.state.currentPhase = AnalysisPhase.COMPLETE;
|
|
460
|
+
this.state.overallProgress = 1.0;
|
|
461
|
+
this.state.phaseProgress = 1.0;
|
|
462
|
+
// Auto-complete any remaining milestones
|
|
463
|
+
for (const milestone of this.milestones) {
|
|
464
|
+
if (!this.state.completedMilestones.has(milestone.id) &&
|
|
465
|
+
this.areDependenciesMet(milestone)) {
|
|
466
|
+
this.completeMilestone(milestone);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
this.emitProgressEvent('analysis_complete', {
|
|
470
|
+
duration: Date.now() - this.state.startTime,
|
|
471
|
+
totalMilestones: this.milestones.length,
|
|
472
|
+
completedMilestones: this.state.completedMilestones.size,
|
|
473
|
+
errorCount: this.state.errors.length
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Emit progress event
|
|
478
|
+
*/
|
|
479
|
+
emitProgressEvent(type, metadata) {
|
|
480
|
+
const event = {
|
|
481
|
+
type,
|
|
482
|
+
sessionId: this.sessionId,
|
|
483
|
+
timestamp: Date.now(),
|
|
484
|
+
phase: this.state.currentPhase,
|
|
485
|
+
milestone: this.state.currentMilestone,
|
|
486
|
+
progress: {
|
|
487
|
+
overall: this.state.overallProgress,
|
|
488
|
+
phase: this.state.phaseProgress
|
|
489
|
+
},
|
|
490
|
+
estimatedCompletion: this.state.estimatedCompletion,
|
|
491
|
+
metadata
|
|
492
|
+
};
|
|
493
|
+
this.emit('progress', event);
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Get current progress state
|
|
497
|
+
*/
|
|
498
|
+
getState() {
|
|
499
|
+
return { ...this.state };
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Get progress summary for display
|
|
503
|
+
*/
|
|
504
|
+
getProgressSummary() {
|
|
505
|
+
const timeRemaining = this.state.estimatedCompletion
|
|
506
|
+
? Math.max(0, this.state.estimatedCompletion - Date.now())
|
|
507
|
+
: undefined;
|
|
508
|
+
return {
|
|
509
|
+
phase: this.state.currentPhase,
|
|
510
|
+
overallProgress: Math.round(this.state.overallProgress * 100) / 100,
|
|
511
|
+
phaseProgress: Math.round(this.state.phaseProgress * 100) / 100,
|
|
512
|
+
currentMilestone: this.state.currentMilestone?.name,
|
|
513
|
+
estimatedTimeRemaining: timeRemaining,
|
|
514
|
+
completedMilestones: this.state.completedMilestones.size,
|
|
515
|
+
totalMilestones: this.milestones.length
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
//# sourceMappingURL=progress-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-tracker.js","sourceRoot":"","sources":["../../src/streaming/progress-tracker.ts"],"names":[],"mappings":"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"}
|