use crate::agents::{AgentDrain, DrainMode};
use crate::reducer::event::PipelinePhase;
use crate::reducer::state::{
AgentChainState, ContinuationState, PipelineState, PromptInputsState, ReviewValidatedOutcome,
};
pub(in crate::reducer::state_reduction::review) fn reduce_phase_started(
state: PipelineState,
) -> PipelineState {
PipelineState {
phase: PipelinePhase::Review,
reviewer_pass: 0,
review_issues_found: false,
agent_chain: {
AgentChainState::initial()
.with_max_cycles(state.agent_chain.max_cycles)
.with_backoff_policy(
state.agent_chain.retry_delay_ms,
state.agent_chain.backoff_multiplier,
state.agent_chain.max_backoff_ms,
)
.reset_for_drain(AgentDrain::Review)
},
continuation: state.continuation.reset(),
review_required_files_cleaned_pass: None,
review_issue_snippets_extracted_pass: None,
fix_required_files_cleaned_pass: None,
..state
}
}
pub(in crate::reducer::state_reduction::review) fn reduce_pass_started(
state: PipelineState,
pass: u32,
) -> PipelineState {
let is_first_pass = state.metrics.review_passes_started == 0;
let is_new_pass = state.reviewer_pass != pass;
let metrics = {
let m = if is_first_pass || is_new_pass {
state.metrics.increment_review_passes_started()
} else {
state.metrics
};
let m = m.set_current_review_pass(pass);
if is_new_pass {
m.reset_fix_continuation_attempt()
} else {
m
}
};
PipelineState {
reviewer_pass: pass,
review_issues_found: false,
review_context_prepared_pass: None,
review_prompt_prepared_pass: None,
review_required_files_cleaned_pass: None,
review_agent_invoked_pass: None,
review_issues_xml_extracted_pass: None,
review_validated_outcome: None,
review_issues_markdown_written_pass: None,
review_issue_snippets_extracted_pass: None,
review_issues_xml_archived_pass: None,
agent_chain: {
let should_reset = pass != state.reviewer_pass;
if should_reset {
state.agent_chain.reset()
} else {
state.agent_chain
}
},
continuation: if pass == state.reviewer_pass {
ContinuationState {
xsd_retry_pending: false,
xsd_retry_session_reuse_pending: false,
same_agent_retry_pending: false,
same_agent_retry_reason: None,
..state.continuation
}
} else {
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
}
},
metrics,
..state
}
}
pub(in crate::reducer::state_reduction::review) fn reduce_context_prepared(
state: PipelineState,
pass: u32,
) -> PipelineState {
PipelineState {
review_context_prepared_pass: Some(pass),
prompt_inputs: PromptInputsState {
review: None,
..state.prompt_inputs.clone()
},
review_prompt_prepared_pass: None,
agent_chain: state.agent_chain.with_mode(DrainMode::Normal),
..state
}
}
pub(in crate::reducer::state_reduction::review) fn reduce_prompt_prepared(
state: PipelineState,
pass: u32,
) -> PipelineState {
PipelineState {
review_prompt_prepared_pass: Some(pass),
agent_chain: state.agent_chain,
continuation: ContinuationState {
xsd_retry_pending: false,
xsd_retry_session_reuse_pending: state.continuation.xsd_retry_session_reuse_pending,
same_agent_retry_pending: false,
same_agent_retry_reason: None,
..state.continuation
},
..state
}
}
pub(in crate::reducer::state_reduction::review) fn reduce_issues_xml_cleaned(
state: PipelineState,
pass: u32,
) -> PipelineState {
PipelineState {
review_required_files_cleaned_pass: Some(pass),
..state
}
}
pub(in crate::reducer::state_reduction::review) fn reduce_agent_invoked(
state: PipelineState,
pass: u32,
) -> PipelineState {
PipelineState {
review_agent_invoked_pass: Some(pass),
continuation: ContinuationState {
xsd_retry_pending: false,
xsd_retry_session_reuse_pending: false,
same_agent_retry_pending: false,
same_agent_retry_reason: None,
..state.continuation
},
metrics: state.metrics.increment_review_runs_total(),
..state
}
}
pub(in crate::reducer::state_reduction::review) fn reduce_issues_xml_extracted(
state: PipelineState,
pass: u32,
) -> PipelineState {
PipelineState {
review_issues_xml_extracted_pass: Some(pass),
..state
}
}
pub(in crate::reducer::state_reduction::review) fn reduce_issues_xml_validated(
state: PipelineState,
pass: u32,
issues_found: bool,
clean_no_issues: bool,
issues: Vec<String>,
no_issues_found: Option<String>,
) -> PipelineState {
PipelineState {
review_validated_outcome: Some(ReviewValidatedOutcome {
pass,
issues_found,
clean_no_issues,
issues: issues.into_boxed_slice(),
no_issues_found,
}),
continuation: ContinuationState {
last_review_xsd_error: None,
..state.continuation
},
..state
}
}
pub(in crate::reducer::state_reduction::review) fn reduce_issues_markdown_written(
state: PipelineState,
pass: u32,
) -> PipelineState {
PipelineState {
review_issues_markdown_written_pass: Some(pass),
..state
}
}
pub(in crate::reducer::state_reduction::review) fn reduce_issue_snippets_extracted(
state: PipelineState,
pass: u32,
) -> PipelineState {
PipelineState {
review_issue_snippets_extracted_pass: Some(pass),
..state
}
}
pub(in crate::reducer::state_reduction::review) fn reduce_issues_xml_archived(
state: PipelineState,
pass: u32,
) -> PipelineState {
PipelineState {
review_issues_xml_archived_pass: Some(pass),
..state
}
}