@@ -22,6 +22,15 @@ interface CategoryStatus {
2222 status : 'pending' | 'running' | 'complete' ;
2323}
2424
25+ type EnrichmentPhase = 'idle' | 'code_analysis' | 'rag' | 'web_search' | 'complete' ;
26+ type EnrichmentStepStatus = 'pending' | 'running' | 'complete' | 'error' ;
27+
28+ interface EnrichmentStatus {
29+ code_analysis : EnrichmentStepStatus ;
30+ rag : EnrichmentStepStatus ;
31+ web_search : EnrichmentStepStatus ;
32+ }
33+
2534interface FullTechniquesStreamState {
2635 connectionStatus : 'connecting' | 'open' | 'retrying' | 'failed' | 'closed' ;
2736 retryCount : number ;
@@ -31,7 +40,7 @@ interface FullTechniquesStreamState {
3140 failedTechniques : number ;
3241 progressPercent : number ;
3342
34- currentStage : 'categories' | 'deep_synthesis' | 'quality_gate' | 'complete' | 'error' ;
43+ currentStage : 'enrichment' | ' categories' | 'deep_synthesis' | 'quality_gate' | 'complete' | 'error' ;
3544
3645 categories : Record < string , CategoryStatus > ;
3746
@@ -49,6 +58,10 @@ interface FullTechniquesStreamState {
4958
5059 startedAt ?: string ;
5160 etaSeconds ?: number ;
61+
62+ enrichmentPhase : EnrichmentPhase ;
63+ enrichmentMessage : string | null ;
64+ enrichmentStatus : EnrichmentStatus ;
5265}
5366
5467const CATEGORIES : Record < string , { name : string ; total : number } > = {
@@ -83,13 +96,20 @@ const initialState: FullTechniquesStreamState = {
8396 completedTechniques : 0 ,
8497 failedTechniques : 0 ,
8598 progressPercent : 0 ,
86- currentStage : 'categories ' ,
99+ currentStage : 'enrichment ' ,
87100 categories : INITIAL_CATEGORIES ,
88101 techniques : { } ,
89102 ledgerEvents : [ ] ,
90103 isComplete : false ,
91104 tokensUsed : 0 ,
92105 costUsd : 0 ,
106+ enrichmentPhase : 'idle' ,
107+ enrichmentMessage : null ,
108+ enrichmentStatus : {
109+ code_analysis : 'pending' ,
110+ rag : 'pending' ,
111+ web_search : 'pending' ,
112+ } ,
93113} ;
94114
95115type Action =
@@ -139,6 +159,11 @@ function reducer(state: FullTechniquesStreamState, action: Action): FullTechniqu
139159 switch ( event . event_type ) {
140160 case 'technique_start' :
141161 if ( event . technique_id && event . technique_name && event . category_id ) {
162+ if ( state . currentStage === 'enrichment' ) {
163+ newState . currentStage = 'categories' ;
164+ newState . enrichmentPhase = 'complete' ;
165+ newState . enrichmentMessage = null ;
166+ }
142167 newState . techniques = {
143168 ...state . techniques ,
144169 [ event . technique_id ] : {
@@ -264,6 +289,46 @@ function reducer(state: FullTechniquesStreamState, action: Action): FullTechniqu
264289 newState . currentStage = 'error' ;
265290 newState . error = event . error || event . message || 'Unknown error' ;
266291 break ;
292+
293+ case 'enrichment_start' :
294+ if ( event . sommelier ) {
295+ const phase = event . sommelier as EnrichmentPhase ;
296+ newState . enrichmentPhase = phase ;
297+ newState . enrichmentMessage = event . message || `${ event . sommelier } starting...` ;
298+ newState . currentStage = 'enrichment' ;
299+ newState . enrichmentStatus = {
300+ ...state . enrichmentStatus ,
301+ [ event . sommelier ] : 'running' as EnrichmentStepStatus ,
302+ } ;
303+ }
304+ break ;
305+
306+ case 'enrichment_complete' :
307+ if ( event . sommelier ) {
308+ newState . enrichmentStatus = {
309+ ...state . enrichmentStatus ,
310+ [ event . sommelier ] : 'complete' as EnrichmentStepStatus ,
311+ } ;
312+ const allComplete = Object . values ( newState . enrichmentStatus ) . every (
313+ s => s === 'complete'
314+ ) ;
315+ if ( allComplete ) {
316+ newState . enrichmentPhase = 'complete' ;
317+ newState . enrichmentMessage = null ;
318+ newState . currentStage = 'categories' ;
319+ }
320+ }
321+ break ;
322+
323+ case 'enrichment_error' :
324+ if ( event . sommelier ) {
325+ newState . enrichmentStatus = {
326+ ...state . enrichmentStatus ,
327+ [ event . sommelier ] : 'error' as EnrichmentStepStatus ,
328+ } ;
329+ newState . enrichmentMessage = event . message || `${ event . sommelier } failed` ;
330+ }
331+ break ;
267332 }
268333
269334 return newState ;
0 commit comments