pub const GC_DEADLINE: u32 = 24;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Status {
Running,
Waiting,
Idle,
Done,
}
pub struct Session {
pub status: Status,
pub elapsed: u32,
}
impl Default for Session {
fn default() -> Self {
Session {
status: Status::Running,
elapsed: 0,
}
}
}
pub fn transition(s: &Session, action: &str) -> Option<Session> {
let next = |status| Session {
status,
elapsed: s.elapsed + 1,
};
match (action, &s.status) {
("tool_call", Status::Running) => Some(next(Status::Waiting)),
("user_responds", Status::Waiting) => Some(next(Status::Running)),
("agent_idles", Status::Running) => Some(next(Status::Idle)),
("agent_resumes", Status::Idle) => Some(next(Status::Running)),
("session_ends", st) if *st != Status::Done => Some(next(Status::Done)),
("gc", st) if *st != Status::Done && s.elapsed >= GC_DEADLINE => Some(next(Status::Done)),
_ => None,
}
}