use salvor_core::{PendingCall, RunState, RunStatus, UnresolvedWrite};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ResumeKind {
Suspension,
Budget,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Disposition {
Resume(ResumeKind),
Recover,
Reconcile(PendingCall),
Completed(serde_json::Value),
Failed(String),
Abandoned {
reason: Option<String>,
unresolved_write: Option<UnresolvedWrite>,
},
NotStarted,
}
#[must_use]
pub fn classify(state: &RunState) -> Disposition {
match &state.status {
RunStatus::Suspended { .. } => Disposition::Resume(ResumeKind::Suspension),
RunStatus::BudgetExceeded { .. } => Disposition::Resume(ResumeKind::Budget),
RunStatus::Running | RunStatus::AwaitingModel | RunStatus::AwaitingTool => {
Disposition::Recover
}
RunStatus::NeedsReconciliation => {
match &state.pending_call {
Some(pending @ PendingCall::Tool { .. }) => Disposition::Reconcile(pending.clone()),
_ => Disposition::Recover,
}
}
RunStatus::Completed { output } => Disposition::Completed(output.clone()),
RunStatus::Failed { error } => Disposition::Failed(error.clone()),
RunStatus::Abandoned {
reason,
unresolved_write,
} => Disposition::Abandoned {
reason: reason.clone(),
unresolved_write: unresolved_write.clone(),
},
RunStatus::NotStarted => Disposition::NotStarted,
}
}