pub fn inspect_checkpoint(workspace: &dyn Workspace, logger: &Logger) -> anyhow::Result<()> {
match load_checkpoint_with_workspace(workspace) {
Ok(Some(checkpoint)) => {
logger.header("CHECKPOINT INSPECTION", crate::logger::Colors::cyan);
display_detailed_checkpoint_info(&checkpoint, logger);
Ok(())
}
Ok(None) => anyhow::bail!("No checkpoint found to inspect."),
Err(e) => anyhow::bail!("Failed to load checkpoint: {e}"),
}
}
pub fn handle_resume_with_validation(
args: &crate::cli::Args,
config: &Config,
registry: &AgentRegistry,
logger: &Logger,
developer_agent: &str,
reviewer_agent: &str,
workspace: &dyn Workspace,
) -> anyhow::Result<Option<ResumeResult>> {
if args.recovery.inspect_checkpoint {
match inspect_checkpoint(workspace, logger) {
Ok(()) => crate::app::env_access::exit_with_code(0),
Err(err) => {
logger.error(&err.to_string());
crate::app::env_access::exit_with_code(1);
}
}
}
if !args.recovery.resume {
return Ok(None);
}
match load_checkpoint_with_workspace(workspace) {
Ok(Some(checkpoint)) => {
logger.header("RESUME: Loading Checkpoint", crate::logger::Colors::yellow);
display_checkpoint_summary(&checkpoint, logger);
let validation = validate_checkpoint(&checkpoint, config, registry, workspace);
validation.warnings.iter().for_each(|warning| {
logger.warn(warning);
});
validation.errors.iter().for_each(|error| {
logger.error(error);
});
if !validation.is_valid {
logger.error("Checkpoint validation failed. Cannot resume.");
logger.info(
"Delete .agent/checkpoint.json and start fresh, or fix the issues above.",
);
return Err(anyhow::anyhow!(
"Checkpoint validation failed: {}",
validation.errors.join("; ")
));
}
if checkpoint.developer_agent != developer_agent {
logger.warn(&format!(
"Developer agent changed: {} -> {}",
checkpoint.developer_agent, developer_agent
));
}
if checkpoint.reviewer_agent != reviewer_agent {
logger.warn(&format!(
"Reviewer agent changed: {} -> {}",
checkpoint.reviewer_agent, reviewer_agent
));
}
check_rebase_state_on_resume(&checkpoint, logger);
let validation_outcome = checkpoint.file_system_state.as_ref().map_or(
ValidationOutcome::Passed,
|file_system_state| {
validate_file_system_state(
file_system_state,
logger,
args.recovery.recovery_strategy.into(),
workspace,
)
},
);
if let ValidationOutcome::Failed(reason) = validation_outcome {
return Err(anyhow::anyhow!(
"File system state validation failed: {reason}"
));
}
Ok(Some(ResumeResult { checkpoint }))
}
Ok(None) => {
logger.warn("No checkpoint found. Starting fresh pipeline...");
Ok(None)
}
Err(e) => {
Err(anyhow::anyhow!("Failed to load checkpoint: {e}"))
}
}
}