use super::database::Store;
use crate::provider::ChatMessage;
use anyhow::{Context, Result};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AgentStateData {
pub name: Arc<str>,
pub model: Arc<str>,
pub system_prompt: Arc<str>,
pub message_count: usize,
pub created_at: u64,
pub last_active: u64,
}
pub struct AgentStore {
store: Arc<Store>,
}
impl AgentStore {
pub fn new(store: Arc<Store>) -> Self {
Self { store }
}
pub fn save(
&self,
name: &str,
model: &str,
system_prompt: &str,
message_count: usize,
) -> Result<()> {
let now = std::time::SystemTime::now()
.duration_since(std::time::SystemTime::UNIX_EPOCH)?
.as_secs();
let state = AgentStateData {
name: Arc::from(name),
model: Arc::from(model),
system_prompt: Arc::from(system_prompt),
message_count,
created_at: now,
last_active: now,
};
let serialized = serde_json::to_vec(&state)?;
self.store.save_agent(name, &serialized)?;
tracing::info!("Agent '{}' state saved", name);
Ok(())
}
pub fn load(&self, name: &str) -> Result<Option<AgentStateData>> {
match self.store.get_agent(name)? {
Some(data) => {
let state: AgentStateData = serde_json::from_slice(&data)?;
Ok(Some(state))
}
None => Ok(None),
}
}
pub fn delete(&self, name: &str) -> Result<bool> {
self.store.delete_agent(name)
}
pub fn list(&self) -> Result<Vec<String>> {
self.store.list_agents()
}
}