use smos_domain::{Fact, FactId, Heat, MemoryKey, SessionId, Timestamp};
use crate::errors::RepoError;
use crate::types::SearchHit;
pub trait FactRepository {
async fn save(&self, fact: &Fact) -> Result<(), RepoError>;
async fn get(&self, id: &FactId, memory_key: &MemoryKey) -> Result<Option<Fact>, RepoError>;
async fn list_accepted(&self, memory_key: &MemoryKey) -> Result<Vec<Fact>, RepoError>;
async fn list_pending(&self, memory_key: &MemoryKey) -> Result<Vec<Fact>, RepoError>;
async fn list_memory_keys_for_session(
&self,
session_id: &SessionId,
) -> Result<Vec<MemoryKey>, RepoError>;
async fn list_memory_keys(&self) -> Result<Vec<MemoryKey>, RepoError>;
async fn search_similar(
&self,
embedding: Vec<f32>,
memory_key: &MemoryKey,
limit: usize,
) -> Result<Vec<SearchHit>, RepoError>;
async fn search_for_dedup(
&self,
embedding: Vec<f32>,
memory_key: &MemoryKey,
limit: usize,
) -> Result<Vec<SearchHit>, RepoError> {
self.search_similar(embedding, memory_key, limit).await
}
async fn update_heat_batch(
&self,
ids: &[FactId],
memory_key: &MemoryKey,
heat_base: Heat,
last_access: Timestamp,
) -> Result<(), RepoError>;
}