use std::sync::Arc;
use crate::context::CompactionReport;
use crate::error::AgentError;
use crate::loop_::AgentEvent;
use super::Agent;
impl Agent {
pub async fn compact_context(&mut self) -> Result<Option<CompactionReport>, AgentError> {
self.check_not_running()?;
let async_report = match self.async_transform_context.as_ref().map(Arc::clone) {
Some(transformer) => transformer.transform(&mut self.state.messages, true).await,
None => None,
};
if let Some(ref report) = async_report {
self.dispatch_event(&AgentEvent::ContextCompacted {
report: report.clone(),
});
}
let sync_report = match self.transform_context.as_ref().map(Arc::clone) {
Some(transformer) => transformer.transform(&mut self.state.messages, true),
None => None,
};
if let Some(ref report) = sync_report {
self.dispatch_event(&AgentEvent::ContextCompacted {
report: report.clone(),
});
}
Ok(sync_report.or(async_report))
}
}