use super::super::Agent;
use crate::channel::Channel;
use zeph_agent_persistence::{LoadHistoryParams, MemoryPersistenceView, PersistenceService};
impl<C: Channel> Agent<C> {
#[tracing::instrument(name = "core.persist.load_history", skip_all, level = "debug", err)]
pub async fn load_history(&mut self) -> Result<(), super::super::error::AgentError> {
if self.msg.history_preloaded {
return Ok(());
}
let (Some(memory), Some(cid)) = (
self.services.memory.persistence.memory.as_ref(),
self.services.memory.persistence.conversation_id,
) else {
return Ok(());
};
let memory = memory.clone();
let mut unsummarized = self.services.memory.persistence.unsummarized_count;
let memory_view = MemoryPersistenceView {
memory: Some(&memory),
conversation_id: self.services.memory.persistence.conversation_id,
autosave_assistant: self.services.memory.persistence.autosave_assistant,
autosave_min_length: self.services.memory.persistence.autosave_min_length,
unsummarized_count: &mut unsummarized,
goal_text: self.services.memory.extraction.goal_text.clone(),
};
let svc = PersistenceService::new();
let outcome = svc
.load_history(LoadHistoryParams {
messages: &mut self.msg.messages,
last_persisted_message_id: &mut self.msg.last_persisted_message_id,
deferred_hide_ids: &mut self.msg.deferred_db_hide_ids,
memory_view: &memory_view,
})
.await
.map_err(|e| {
super::super::error::AgentError::Memory(zeph_memory::MemoryError::Other(
e.to_string(),
))
})?;
self.services.memory.persistence.unsummarized_count = unsummarized;
if outcome.messages_loaded > 0 {
let _ = memory
.sqlite()
.increment_session_counts_for_conversation(cid)
.await
.inspect_err(|e| {
tracing::warn!(error = %e, "failed to increment tier session counts");
});
}
self.update_metrics(|m| {
m.sqlite_message_count = outcome.sqlite_total_messages;
});
if let Ok(count) = memory.sqlite().count_semantic_facts().await {
let count_u64 = u64::try_from(count).unwrap_or(0);
self.update_metrics(|m| {
m.semantic_fact_count = count_u64;
});
}
if let Ok(count) = memory.unsummarized_message_count(cid).await {
self.services.memory.persistence.unsummarized_count =
usize::try_from(count).unwrap_or(0);
}
self.recompute_prompt_tokens();
Ok(())
}
}