1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4use crate::{CodememError, Edge, GraphNode, MemoryNode, NodeKind, RelationshipType, 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 bfs_filtered(
70 &self,
71 start_id: &str,
72 max_depth: usize,
73 exclude_kinds: &[NodeKind],
74 include_relationships: Option<&[RelationshipType]>,
75 ) -> Result<Vec<GraphNode>, CodememError> {
76 let _ = (exclude_kinds, include_relationships);
78 self.bfs(start_id, max_depth)
79 }
80
81 fn dfs_filtered(
84 &self,
85 start_id: &str,
86 max_depth: usize,
87 exclude_kinds: &[NodeKind],
88 include_relationships: Option<&[RelationshipType]>,
89 ) -> Result<Vec<GraphNode>, CodememError> {
90 let _ = (exclude_kinds, include_relationships);
92 self.dfs(start_id, max_depth)
93 }
94
95 fn shortest_path(&self, from: &str, to: &str) -> Result<Vec<String>, CodememError>;
97
98 fn stats(&self) -> GraphStats;
100}
101
102#[derive(Debug, Clone, Default, Serialize, Deserialize)]
104pub struct GraphStats {
105 pub node_count: usize,
106 pub edge_count: usize,
107 pub node_kind_counts: HashMap<String, usize>,
108 pub relationship_type_counts: HashMap<String, usize>,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
115pub struct StorageStats {
116 pub memory_count: usize,
117 pub embedding_count: usize,
118 pub node_count: usize,
119 pub edge_count: usize,
120}
121
122#[derive(Debug, Clone)]
124pub struct ConsolidationLogEntry {
125 pub cycle_type: String,
126 pub run_at: i64,
127 pub affected_count: usize,
128}
129
130pub trait StorageBackend: Send + Sync {
139 fn insert_memory(&self, memory: &MemoryNode) -> Result<(), CodememError>;
143
144 fn get_memory(&self, id: &str) -> Result<Option<MemoryNode>, CodememError>;
146
147 fn get_memories_batch(&self, ids: &[&str]) -> Result<Vec<MemoryNode>, CodememError>;
149
150 fn update_memory(
152 &self,
153 id: &str,
154 content: &str,
155 importance: Option<f64>,
156 ) -> Result<(), CodememError>;
157
158 fn delete_memory(&self, id: &str) -> Result<bool, CodememError>;
160
161 fn list_memory_ids(&self) -> Result<Vec<String>, CodememError>;
163
164 fn list_memory_ids_for_namespace(&self, namespace: &str) -> Result<Vec<String>, CodememError>;
166
167 fn list_namespaces(&self) -> Result<Vec<String>, CodememError>;
169
170 fn memory_count(&self) -> Result<usize, CodememError>;
172
173 fn store_embedding(&self, memory_id: &str, embedding: &[f32]) -> Result<(), CodememError>;
177
178 fn get_embedding(&self, memory_id: &str) -> Result<Option<Vec<f32>>, CodememError>;
180
181 fn delete_embedding(&self, memory_id: &str) -> Result<bool, CodememError>;
183
184 fn list_all_embeddings(&self) -> Result<Vec<(String, Vec<f32>)>, CodememError>;
186
187 fn insert_graph_node(&self, node: &GraphNode) -> Result<(), CodememError>;
191
192 fn get_graph_node(&self, id: &str) -> Result<Option<GraphNode>, CodememError>;
194
195 fn delete_graph_node(&self, id: &str) -> Result<bool, CodememError>;
197
198 fn all_graph_nodes(&self) -> Result<Vec<GraphNode>, CodememError>;
200
201 fn insert_graph_edge(&self, edge: &Edge) -> Result<(), CodememError>;
203
204 fn get_edges_for_node(&self, node_id: &str) -> Result<Vec<Edge>, CodememError>;
206
207 fn all_graph_edges(&self) -> Result<Vec<Edge>, CodememError>;
209
210 fn delete_graph_edges_for_node(&self, node_id: &str) -> Result<usize, CodememError>;
212
213 fn delete_graph_nodes_by_prefix(&self, prefix: &str) -> Result<usize, CodememError>;
216
217 fn start_session(&self, id: &str, namespace: Option<&str>) -> Result<(), CodememError>;
221
222 fn end_session(&self, id: &str, summary: Option<&str>) -> Result<(), CodememError>;
224
225 fn list_sessions(
227 &self,
228 namespace: Option<&str>,
229 limit: usize,
230 ) -> Result<Vec<Session>, CodememError>;
231
232 fn insert_consolidation_log(
236 &self,
237 cycle_type: &str,
238 affected_count: usize,
239 ) -> Result<(), CodememError>;
240
241 fn last_consolidation_runs(&self) -> Result<Vec<ConsolidationLogEntry>, CodememError>;
243
244 fn get_repeated_searches(
248 &self,
249 min_count: usize,
250 namespace: Option<&str>,
251 ) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>;
252
253 fn get_file_hotspots(
255 &self,
256 min_count: usize,
257 namespace: Option<&str>,
258 ) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>;
259
260 fn get_tool_usage_stats(
262 &self,
263 namespace: Option<&str>,
264 ) -> Result<Vec<(String, usize)>, CodememError>;
265
266 fn get_decision_chains(
268 &self,
269 min_count: usize,
270 namespace: Option<&str>,
271 ) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>;
272
273 fn decay_stale_memories(
278 &self,
279 threshold_ts: i64,
280 decay_factor: f64,
281 ) -> Result<usize, CodememError>;
282
283 fn list_memories_for_creative(
285 &self,
286 ) -> Result<Vec<(String, String, Vec<String>)>, CodememError>;
287
288 fn find_cluster_duplicates(&self) -> Result<Vec<(String, String, f64)>, CodememError>;
291
292 fn find_forgettable(&self, importance_threshold: f64) -> Result<Vec<String>, CodememError>;
295
296 fn insert_memories_batch(&self, memories: &[MemoryNode]) -> Result<(), CodememError> {
300 for memory in memories {
301 self.insert_memory(memory)?;
302 }
303 Ok(())
304 }
305
306 fn store_embeddings_batch(&self, items: &[(&str, &[f32])]) -> Result<(), CodememError> {
308 for (id, embedding) in items {
309 self.store_embedding(id, embedding)?;
310 }
311 Ok(())
312 }
313
314 fn insert_graph_nodes_batch(&self, nodes: &[GraphNode]) -> Result<(), CodememError> {
316 for node in nodes {
317 self.insert_graph_node(node)?;
318 }
319 Ok(())
320 }
321
322 fn insert_graph_edges_batch(&self, edges: &[Edge]) -> Result<(), CodememError> {
324 for edge in edges {
325 self.insert_graph_edge(edge)?;
326 }
327 Ok(())
328 }
329
330 fn find_unembedded_memories(&self) -> Result<Vec<(String, String)>, CodememError>;
334
335 fn search_graph_nodes(
338 &self,
339 query: &str,
340 namespace: Option<&str>,
341 limit: usize,
342 ) -> Result<Vec<GraphNode>, CodememError>;
343
344 fn list_memories_filtered(
346 &self,
347 namespace: Option<&str>,
348 memory_type: Option<&str>,
349 ) -> Result<Vec<MemoryNode>, CodememError>;
350
351 fn graph_edges_for_namespace(&self, namespace: &str) -> Result<Vec<Edge>, CodememError>;
353
354 fn get_edges_at_time(&self, node_id: &str, _timestamp: i64) -> Result<Vec<Edge>, CodememError> {
358 self.get_edges_for_node(node_id)
359 }
360
361 fn get_stale_memories_for_decay(
364 &self,
365 threshold_ts: i64,
366 ) -> Result<Vec<(String, f64, u32, i64)>, CodememError>;
367
368 fn batch_update_importance(&self, updates: &[(String, f64)]) -> Result<usize, CodememError>;
370
371 fn session_count(&self, namespace: Option<&str>) -> Result<usize, CodememError>;
373
374 fn load_file_hashes(&self) -> Result<HashMap<String, String>, CodememError>;
378
379 fn save_file_hashes(&self, hashes: &HashMap<String, String>) -> Result<(), CodememError>;
381
382 fn record_session_activity(
386 &self,
387 session_id: &str,
388 tool_name: &str,
389 file_path: Option<&str>,
390 directory: Option<&str>,
391 pattern: Option<&str>,
392 ) -> Result<(), CodememError>;
393
394 fn get_session_activity_summary(
396 &self,
397 session_id: &str,
398 ) -> Result<crate::SessionActivitySummary, CodememError>;
399
400 fn get_session_hot_directories(
402 &self,
403 session_id: &str,
404 limit: usize,
405 ) -> Result<Vec<(String, usize)>, CodememError>;
406
407 fn has_auto_insight(&self, session_id: &str, dedup_tag: &str) -> Result<bool, CodememError>;
409
410 fn count_directory_reads(
412 &self,
413 session_id: &str,
414 directory: &str,
415 ) -> Result<usize, CodememError>;
416
417 fn was_file_read_in_session(
419 &self,
420 session_id: &str,
421 file_path: &str,
422 ) -> Result<bool, CodememError>;
423
424 fn count_search_pattern_in_session(
426 &self,
427 session_id: &str,
428 pattern: &str,
429 ) -> Result<usize, CodememError>;
430
431 fn stats(&self) -> Result<StorageStats, CodememError>;
435}