use basis::PreparedRun;
use crate::{inbox, state::TaskMeta};
use crate::data_dir::AgentPaths;
pub(super) enum Work {
Prompt,
Message(String, String),
Continue(Option<String>),
}
impl Work {
pub(super) fn message_id(&self) -> Option<&str> {
match self {
Self::Message(id, _) | Self::Continue(Some(id)) => Some(id),
Self::Prompt | Self::Continue(None) => None,
}
}
}
#[derive(Default)]
pub(super) struct Recovered {
pub(super) initial_done: bool,
pub(super) interrupted: Option<Option<String>>,
pub(super) last_result: String,
}
pub(super) fn recover(
paths: &AgentPaths,
meta: &TaskMeta,
run: &PreparedRun,
reverted: &[String],
) -> Result<Recovered, String> {
let past_inherited = run.answered_turns() > meta.answered_before;
let last_result = run.last_assistant_text().unwrap_or_default();
if !run.has_interrupted_turn() {
return Ok(Recovered {
initial_done: past_inherited,
interrupted: None,
last_result,
});
}
if let Some(id) = reverted.last()
&& inbox::claim(paths, id)?
{
return Ok(Recovered {
initial_done: true,
interrupted: Some(Some(id.clone())),
last_result,
});
}
Ok(Recovered {
initial_done: false,
interrupted: past_inherited.then_some(None),
last_result,
})
}