1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4use crate::{CodememError, Edge, GraphNode, MemoryNode, Session};
5
6pub trait VectorBackend: Send + Sync {
10 fn insert(&mut self, id: &str, embedding: &[f32]) -> Result<(), CodememError>;
12
13 fn insert_batch(&mut self, items: &[(String, Vec<f32>)]) -> Result<(), CodememError>;
15
16 fn search(&self, query: &[f32], k: usize) -> Result<Vec<(String, f32)>, CodememError>;
18
19 fn remove(&mut self, id: &str) -> Result<bool, CodememError>;
21
22 fn save(&self, path: &std::path::Path) -> Result<(), CodememError>;
24
25 fn load(&mut self, path: &std::path::Path) -> Result<(), CodememError>;
27
28 fn stats(&self) -> VectorStats;
30}
31
32#[derive(Debug, Clone, Default, Serialize, Deserialize)]
34pub struct VectorStats {
35 pub count: usize,
36 pub dimensions: usize,
37 pub metric: String,
38 pub memory_bytes: usize,
39}
40
41pub trait GraphBackend: Send + Sync {
43 fn add_node(&mut self, node: GraphNode) -> Result<(), CodememError>;
45
46 fn get_node(&self, id: &str) -> Result<Option<GraphNode>, CodememError>;
48
49 fn remove_node(&mut self, id: &str) -> Result<bool, CodememError>;
51
52 fn add_edge(&mut self, edge: Edge) -> Result<(), CodememError>;
54
55 fn get_edges(&self, node_id: &str) -> Result<Vec<Edge>, CodememError>;
57
58 fn remove_edge(&mut self, id: &str) -> Result<bool, CodememError>;
60
61 fn bfs(&self, start_id: &str, max_depth: usize) -> Result<Vec<GraphNode>, CodememError>;
63
64 fn dfs(&self, start_id: &str, max_depth: usize) -> Result<Vec<GraphNode>, CodememError>;
66
67 fn shortest_path(&self, from: &str, to: &str) -> Result<Vec<String>, CodememError>;
69
70 fn stats(&self) -> GraphStats;
72}
73
74#[derive(Debug, Clone, Default, Serialize, Deserialize)]
76pub struct GraphStats {
77 pub node_count: usize,
78 pub edge_count: usize,
79 pub node_kind_counts: HashMap<String, usize>,
80 pub relationship_type_counts: HashMap<String, usize>,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct StorageStats {
88 pub memory_count: usize,
89 pub embedding_count: usize,
90 pub node_count: usize,
91 pub edge_count: usize,
92}
93
94#[derive(Debug, Clone)]
96pub struct ConsolidationLogEntry {
97 pub cycle_type: String,
98 pub run_at: i64,
99 pub affected_count: usize,
100}
101
102pub trait StorageBackend: Send + Sync {
111 fn insert_memory(&self, memory: &MemoryNode) -> Result<(), CodememError>;
115
116 fn get_memory(&self, id: &str) -> Result<Option<MemoryNode>, CodememError>;
118
119 fn get_memories_batch(&self, ids: &[&str]) -> Result<Vec<MemoryNode>, CodememError>;
121
122 fn update_memory(
124 &self,
125 id: &str,
126 content: &str,
127 importance: Option<f64>,
128 ) -> Result<(), CodememError>;
129
130 fn delete_memory(&self, id: &str) -> Result<bool, CodememError>;
132
133 fn list_memory_ids(&self) -> Result<Vec<String>, CodememError>;
135
136 fn list_memory_ids_for_namespace(&self, namespace: &str) -> Result<Vec<String>, CodememError>;
138
139 fn list_namespaces(&self) -> Result<Vec<String>, CodememError>;
141
142 fn memory_count(&self) -> Result<usize, CodememError>;
144
145 fn store_embedding(&self, memory_id: &str, embedding: &[f32]) -> Result<(), CodememError>;
149
150 fn get_embedding(&self, memory_id: &str) -> Result<Option<Vec<f32>>, CodememError>;
152
153 fn delete_embedding(&self, memory_id: &str) -> Result<bool, CodememError>;
155
156 fn list_all_embeddings(&self) -> Result<Vec<(String, Vec<f32>)>, CodememError>;
158
159 fn insert_graph_node(&self, node: &GraphNode) -> Result<(), CodememError>;
163
164 fn get_graph_node(&self, id: &str) -> Result<Option<GraphNode>, CodememError>;
166
167 fn delete_graph_node(&self, id: &str) -> Result<bool, CodememError>;
169
170 fn all_graph_nodes(&self) -> Result<Vec<GraphNode>, CodememError>;
172
173 fn insert_graph_edge(&self, edge: &Edge) -> Result<(), CodememError>;
175
176 fn get_edges_for_node(&self, node_id: &str) -> Result<Vec<Edge>, CodememError>;
178
179 fn all_graph_edges(&self) -> Result<Vec<Edge>, CodememError>;
181
182 fn delete_graph_edges_for_node(&self, node_id: &str) -> Result<usize, CodememError>;
184
185 fn start_session(&self, id: &str, namespace: Option<&str>) -> Result<(), CodememError>;
189
190 fn end_session(&self, id: &str, summary: Option<&str>) -> Result<(), CodememError>;
192
193 fn list_sessions(
195 &self,
196 namespace: Option<&str>,
197 limit: usize,
198 ) -> Result<Vec<Session>, CodememError>;
199
200 fn insert_consolidation_log(
204 &self,
205 cycle_type: &str,
206 affected_count: usize,
207 ) -> Result<(), CodememError>;
208
209 fn last_consolidation_runs(&self) -> Result<Vec<ConsolidationLogEntry>, CodememError>;
211
212 fn get_repeated_searches(
216 &self,
217 min_count: usize,
218 namespace: Option<&str>,
219 ) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>;
220
221 fn get_file_hotspots(
223 &self,
224 min_count: usize,
225 namespace: Option<&str>,
226 ) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>;
227
228 fn get_tool_usage_stats(
230 &self,
231 namespace: Option<&str>,
232 ) -> Result<Vec<(String, usize)>, CodememError>;
233
234 fn get_decision_chains(
236 &self,
237 min_count: usize,
238 namespace: Option<&str>,
239 ) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>;
240
241 fn decay_stale_memories(
246 &self,
247 threshold_ts: i64,
248 decay_factor: f64,
249 ) -> Result<usize, CodememError>;
250
251 fn list_memories_for_creative(
253 &self,
254 ) -> Result<Vec<(String, String, Vec<String>)>, CodememError>;
255
256 fn find_cluster_duplicates(&self) -> Result<Vec<(String, String, f64)>, CodememError>;
259
260 fn find_forgettable(&self, importance_threshold: f64) -> Result<Vec<String>, CodememError>;
263
264 fn insert_memories_batch(&self, memories: &[MemoryNode]) -> Result<(), CodememError> {
268 for memory in memories {
269 self.insert_memory(memory)?;
270 }
271 Ok(())
272 }
273
274 fn store_embeddings_batch(&self, items: &[(&str, &[f32])]) -> Result<(), CodememError> {
276 for (id, embedding) in items {
277 self.store_embedding(id, embedding)?;
278 }
279 Ok(())
280 }
281
282 fn insert_graph_nodes_batch(&self, nodes: &[GraphNode]) -> Result<(), CodememError> {
284 for node in nodes {
285 self.insert_graph_node(node)?;
286 }
287 Ok(())
288 }
289
290 fn insert_graph_edges_batch(&self, edges: &[Edge]) -> Result<(), CodememError> {
292 for edge in edges {
293 self.insert_graph_edge(edge)?;
294 }
295 Ok(())
296 }
297
298 fn find_unembedded_memories(&self) -> Result<Vec<(String, String)>, CodememError>;
302
303 fn search_graph_nodes(
306 &self,
307 query: &str,
308 namespace: Option<&str>,
309 limit: usize,
310 ) -> Result<Vec<GraphNode>, CodememError>;
311
312 fn list_memories_filtered(
314 &self,
315 namespace: Option<&str>,
316 memory_type: Option<&str>,
317 ) -> Result<Vec<MemoryNode>, CodememError>;
318
319 fn graph_edges_for_namespace(&self, namespace: &str) -> Result<Vec<Edge>, CodememError>;
321
322 fn load_file_hashes(&self) -> Result<HashMap<String, String>, CodememError>;
326
327 fn save_file_hashes(&self, hashes: &HashMap<String, String>) -> Result<(), CodememError>;
329
330 fn stats(&self) -> Result<StorageStats, CodememError>;
334}