use crate::agents::DrainMode;
use crate::reducer::event::PipelinePhase;
use crate::reducer::state::{ContinuationState, PipelineState};
pub(in crate::reducer::state_reduction::review) fn reduce_output_validation_failed(
state: PipelineState,
pass: u32,
attempt: u32,
error_detail: Option<String>,
) -> PipelineState {
let new_xsd_count = state.continuation.xsd_retry_count + 1;
let will_retry = new_xsd_count < state.continuation.max_xsd_retry_count;
if new_xsd_count >= state.continuation.max_xsd_retry_count {
let new_agent_chain = state.agent_chain.switch_to_next_agent().clear_session_id();
PipelineState {
phase: PipelinePhase::Review,
reviewer_pass: pass,
agent_chain: new_agent_chain.with_mode(DrainMode::Normal),
continuation: ContinuationState {
invalid_output_attempts: 0,
xsd_retry_count: 0,
xsd_retry_pending: false,
xsd_retry_session_reuse_pending: false,
same_agent_retry_count: 0,
same_agent_retry_pending: false,
same_agent_retry_reason: None,
last_review_xsd_error: None,
..state.continuation
},
review_prompt_prepared_pass: None,
review_agent_invoked_pass: None,
review_required_files_cleaned_pass: None,
metrics: if will_retry {
state.metrics.increment_xsd_retry_review()
} else {
state.metrics
},
..state
}
} else {
PipelineState {
phase: PipelinePhase::Review,
reviewer_pass: pass,
agent_chain: state.agent_chain.with_mode(DrainMode::XsdRetry),
continuation: ContinuationState {
invalid_output_attempts: attempt + 1,
xsd_retry_count: new_xsd_count,
xsd_retry_pending: true,
xsd_retry_session_reuse_pending: true,
last_review_xsd_error: error_detail,
..state.continuation
},
review_prompt_prepared_pass: None,
review_agent_invoked_pass: None,
review_required_files_cleaned_pass: None,
metrics: if will_retry {
state.metrics.increment_xsd_retry_review()
} else {
state.metrics
},
..state
}
}
}