use agent_client_protocol::schema::v1::{
CompactionId, CompactionStatus, CompactionUpdate, SessionUpdate,
};
pub(super) const UNFINISHED: &str = "compaction ended without a result";
#[derive(Debug)]
pub(super) struct CompactionCard {
id: CompactionId,
}
impl CompactionCard {
pub(super) fn new() -> Self {
Self {
id: CompactionId::new(format!("compaction-{}", uuid::Uuid::new_v4())),
}
}
pub(super) fn in_progress(&self) -> SessionUpdate {
self.update(CompactionStatus::InProgress)
}
pub(super) fn completed(self) -> SessionUpdate {
self.update(CompactionStatus::Completed)
}
pub(super) fn failed(self, error: impl Into<String>) -> SessionUpdate {
SessionUpdate::CompactionUpdate(
CompactionUpdate::new(self.id, CompactionStatus::Failed).error(error.into()),
)
}
pub(super) fn cancelled(self) -> SessionUpdate {
self.update(CompactionStatus::Cancelled)
}
fn update(&self, status: CompactionStatus) -> SessionUpdate {
SessionUpdate::CompactionUpdate(CompactionUpdate::new(self.id.clone(), status))
}
}
pub(super) fn outcome_summary(outcome: &rho_sdk::CompactionOutcome) -> String {
if crate::compaction::outcome_reduced_context(outcome) {
format!(
"context compacted: {} → {} messages, {} → {} tokens",
outcome.previous_messages(),
outcome.current_messages(),
outcome.previous_tokens(),
outcome.current_tokens(),
)
} else {
"context not compacted: compaction ran but did not reduce context".into()
}
}