Skip to main content

second_brain_core/
store.rs

1use anyhow::Result;
2use uuid::Uuid;
3
4use crate::schema::{Conversation, Entity, Memory, MemoryType, Relation, RelationType};
5
6pub trait Store: Send + Sync {
7    fn store_memory(&self, memory: &Memory) -> Result<()>;
8    fn get_memory(&self, id: Uuid) -> Result<Option<Memory>>;
9    fn delete_memory(&self, id: Uuid) -> Result<()>;
10
11    fn store_entity(&self, entity: &Entity) -> Result<()>;
12    fn get_entity(&self, id: Uuid) -> Result<Option<Entity>>;
13    fn find_entity_by_name(&self, name: &str) -> Result<Option<Entity>>;
14
15    fn store_conversation(&self, conversation: &Conversation) -> Result<()>;
16
17    fn store_relation(&self, relation: &Relation) -> Result<()>;
18    fn get_relations(
19        &self,
20        node_id: Uuid,
21        relation_type: Option<RelationType>,
22    ) -> Result<Vec<Relation>>;
23
24    fn vector_search(&self, embedding: &[f32], limit: usize) -> Result<Vec<(Memory, f32)>>;
25
26    fn traverse(&self, start_id: Uuid, depth: u32) -> Result<Vec<(Memory, Vec<Relation>)>>;
27
28    fn memories_by_source(&self, source: &str) -> Result<Vec<Memory>>;
29    fn memories_by_type(&self, memory_type: MemoryType) -> Result<Vec<Memory>>;
30    fn memories_needing_decay(&self, threshold_days: u32) -> Result<Vec<Memory>>;
31
32    fn update_memory(&self, memory: &Memory) -> Result<()>;
33
34    fn record_access(&self, memory: &Memory) -> Result<()>;
35
36    fn text_search(&self, query: &str, limit: usize) -> Result<Vec<Memory>>;
37
38    fn memory_count(&self) -> Result<usize>;
39
40    fn all_memory_ids(&self) -> Result<Vec<Uuid>>;
41
42    // Every Memory-rooted edge as a Relation, mirroring get_relations: strength
43    // is always 1.0 and context is always None (get_relations discards edge
44    // properties), so a bulk fetch is interchangeable with per-id reads. Used to
45    // prewarm a relation cache in one scan instead of thousands of point reads.
46    fn all_relations(&self) -> Result<Vec<Relation>>;
47}