pub struct Storage { /* private fields */ }Expand description
SQLite-backed storage for Codemem memories, embeddings, and graph data.
Wraps rusqlite::Connection in a Mutex to satisfy Send + Sync bounds
required by the StorageBackend trait.
Implementations§
Source§impl Storage
impl Storage
Sourcepub fn store_embedding(
&self,
memory_id: &str,
embedding: &[f32],
) -> Result<(), CodememError>
pub fn store_embedding( &self, memory_id: &str, embedding: &[f32], ) -> Result<(), CodememError>
Store an embedding for a memory.
Sourcepub fn get_embedding(
&self,
memory_id: &str,
) -> Result<Option<Vec<f32>>, CodememError>
pub fn get_embedding( &self, memory_id: &str, ) -> Result<Option<Vec<f32>>, CodememError>
Get an embedding by memory ID.
Sourcepub fn insert_graph_node(&self, node: &GraphNode) -> Result<(), CodememError>
pub fn insert_graph_node(&self, node: &GraphNode) -> Result<(), CodememError>
Insert a graph node.
Sourcepub fn get_graph_node(
&self,
id: &str,
) -> Result<Option<GraphNode>, CodememError>
pub fn get_graph_node( &self, id: &str, ) -> Result<Option<GraphNode>, CodememError>
Get a graph node by ID.
Sourcepub fn delete_graph_node(&self, id: &str) -> Result<bool, CodememError>
pub fn delete_graph_node(&self, id: &str) -> Result<bool, CodememError>
Delete a graph node by ID.
Sourcepub fn all_graph_nodes(&self) -> Result<Vec<GraphNode>, CodememError>
pub fn all_graph_nodes(&self) -> Result<Vec<GraphNode>, CodememError>
Get all graph nodes.
Sourcepub fn insert_graph_edge(&self, edge: &Edge) -> Result<(), CodememError>
pub fn insert_graph_edge(&self, edge: &Edge) -> Result<(), CodememError>
Insert a graph edge.
Sourcepub fn get_edges_for_node(
&self,
node_id: &str,
) -> Result<Vec<Edge>, CodememError>
pub fn get_edges_for_node( &self, node_id: &str, ) -> Result<Vec<Edge>, CodememError>
Get all edges from or to a node.
Sourcepub fn all_graph_edges(&self) -> Result<Vec<Edge>, CodememError>
pub fn all_graph_edges(&self) -> Result<Vec<Edge>, CodememError>
Get all graph edges.
Sourcepub fn delete_graph_edges_for_node(
&self,
node_id: &str,
) -> Result<usize, CodememError>
pub fn delete_graph_edges_for_node( &self, node_id: &str, ) -> Result<usize, CodememError>
Delete all graph edges connected to a node (as src or dst).
Sourcepub fn graph_edges_for_namespace(
&self,
namespace: &str,
) -> Result<Vec<Edge>, CodememError>
pub fn graph_edges_for_namespace( &self, namespace: &str, ) -> Result<Vec<Edge>, CodememError>
Get all graph edges where both src and dst nodes belong to the given namespace.
Sourcepub fn delete_graph_edge(&self, id: &str) -> Result<bool, CodememError>
pub fn delete_graph_edge(&self, id: &str) -> Result<bool, CodememError>
Delete a graph edge by ID.
Source§impl Storage
impl Storage
Sourcepub fn insert_memory(&self, memory: &MemoryNode) -> Result<(), CodememError>
pub fn insert_memory(&self, memory: &MemoryNode) -> Result<(), CodememError>
Insert a new memory. Returns Err(Duplicate) if content hash already exists.
Sourcepub fn get_memory(&self, id: &str) -> Result<Option<MemoryNode>, CodememError>
pub fn get_memory(&self, id: &str) -> Result<Option<MemoryNode>, CodememError>
Get a memory by ID. Updates access_count and last_accessed_at.
Sourcepub fn update_memory(
&self,
id: &str,
content: &str,
importance: Option<f64>,
) -> Result<(), CodememError>
pub fn update_memory( &self, id: &str, content: &str, importance: Option<f64>, ) -> Result<(), CodememError>
Update a memory’s content and re-hash.
Sourcepub fn delete_memory(&self, id: &str) -> Result<bool, CodememError>
pub fn delete_memory(&self, id: &str) -> Result<bool, CodememError>
Delete a memory by ID.
Sourcepub fn list_memory_ids(&self) -> Result<Vec<String>, CodememError>
pub fn list_memory_ids(&self) -> Result<Vec<String>, CodememError>
List all memory IDs.
Sourcepub fn list_memory_ids_for_namespace(
&self,
namespace: &str,
) -> Result<Vec<String>, CodememError>
pub fn list_memory_ids_for_namespace( &self, namespace: &str, ) -> Result<Vec<String>, CodememError>
List memory IDs scoped to a specific namespace.
Sourcepub fn list_namespaces(&self) -> Result<Vec<String>, CodememError>
pub fn list_namespaces(&self) -> Result<Vec<String>, CodememError>
List all distinct namespaces.
Sourcepub fn memory_count(&self) -> Result<usize, CodememError>
pub fn memory_count(&self) -> Result<usize, CodememError>
Get memory count.
Source§impl Storage
impl Storage
Sourcepub fn integrity_check(&self) -> Result<bool, CodememError>
pub fn integrity_check(&self) -> Result<bool, CodememError>
Run SQLite PRAGMA integrity_check. Returns true if the database is OK.
Sourcepub fn schema_version(&self) -> Result<u32, CodememError>
pub fn schema_version(&self) -> Result<u32, CodememError>
Return the current schema version (max applied migration number).
Sourcepub fn stats(&self) -> Result<StorageStats, CodememError>
pub fn stats(&self) -> Result<StorageStats, CodememError>
Get database statistics.
Sourcepub fn insert_consolidation_log(
&self,
cycle_type: &str,
affected_count: usize,
) -> Result<(), CodememError>
pub fn insert_consolidation_log( &self, cycle_type: &str, affected_count: usize, ) -> Result<(), CodememError>
Record a consolidation run.
Sourcepub fn last_consolidation_runs(
&self,
) -> Result<Vec<ConsolidationLogEntry>, CodememError>
pub fn last_consolidation_runs( &self, ) -> Result<Vec<ConsolidationLogEntry>, CodememError>
Get the last consolidation run for each cycle type.
Sourcepub fn get_repeated_searches(
&self,
min_count: usize,
namespace: Option<&str>,
) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>
pub fn get_repeated_searches( &self, min_count: usize, namespace: Option<&str>, ) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>
Find repeated search patterns (Grep/Glob) by extracting the “pattern” field from memory metadata JSON. Returns (pattern, count, memory_ids) tuples where count >= min_count, ordered by count descending.
Sourcepub fn get_file_hotspots(
&self,
min_count: usize,
namespace: Option<&str>,
) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>
pub fn get_file_hotspots( &self, min_count: usize, namespace: Option<&str>, ) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>
Find file hotspots by extracting the “file_path” field from memory metadata.
Sourcepub fn get_tool_usage_stats(
&self,
namespace: Option<&str>,
) -> Result<HashMap<String, usize>, CodememError>
pub fn get_tool_usage_stats( &self, namespace: Option<&str>, ) -> Result<HashMap<String, usize>, CodememError>
Get tool usage statistics from memory metadata.
Sourcepub fn get_decision_chains(
&self,
min_count: usize,
namespace: Option<&str>,
) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>
pub fn get_decision_chains( &self, min_count: usize, namespace: Option<&str>, ) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>
Find decision chains: files with multiple Edit/Write memories over time.
Sourcepub fn start_session(
&self,
id: &str,
namespace: Option<&str>,
) -> Result<(), CodememError>
pub fn start_session( &self, id: &str, namespace: Option<&str>, ) -> Result<(), CodememError>
Start a new session.
Sourcepub fn end_session(
&self,
id: &str,
summary: Option<&str>,
) -> Result<(), CodememError>
pub fn end_session( &self, id: &str, summary: Option<&str>, ) -> Result<(), CodememError>
End a session by setting ended_at and optionally a summary.
Sourcepub fn list_sessions(
&self,
namespace: Option<&str>,
) -> Result<Vec<Session>, CodememError>
pub fn list_sessions( &self, namespace: Option<&str>, ) -> Result<Vec<Session>, CodememError>
List sessions, optionally filtered by namespace.
Source§impl Storage
impl Storage
Sourcepub fn open(path: &Path) -> Result<Self, CodememError>
pub fn open(path: &Path) -> Result<Self, CodememError>
Open (or create) a Codemem database at the given path.
Sourcepub fn open_without_migrations(path: &Path) -> Result<Self, CodememError>
pub fn open_without_migrations(path: &Path) -> Result<Self, CodememError>
Open an existing database without running migrations.
Use this in lifecycle hooks (context, prompt, summarize) where the
database has already been migrated by codemem init or codemem serve,
to avoid SQLITE_BUSY race conditions with the concurrent MCP server.
Sourcepub fn open_in_memory() -> Result<Self, CodememError>
pub fn open_in_memory() -> Result<Self, CodememError>
Open an in-memory database (for testing).
Sourcepub fn content_hash(content: &str) -> String
pub fn content_hash(content: &str) -> String
Compute SHA-256 hash of content for deduplication.
Trait Implementations§
Source§impl StorageBackend for Storage
impl StorageBackend for Storage
Source§fn insert_memory(&self, memory: &MemoryNode) -> Result<(), CodememError>
fn insert_memory(&self, memory: &MemoryNode) -> Result<(), CodememError>
Source§fn get_memory(&self, id: &str) -> Result<Option<MemoryNode>, CodememError>
fn get_memory(&self, id: &str) -> Result<Option<MemoryNode>, CodememError>
Source§fn get_memories_batch(
&self,
ids: &[&str],
) -> Result<Vec<MemoryNode>, CodememError>
fn get_memories_batch( &self, ids: &[&str], ) -> Result<Vec<MemoryNode>, CodememError>
Source§fn update_memory(
&self,
id: &str,
content: &str,
importance: Option<f64>,
) -> Result<(), CodememError>
fn update_memory( &self, id: &str, content: &str, importance: Option<f64>, ) -> Result<(), CodememError>
Source§fn delete_memory(&self, id: &str) -> Result<bool, CodememError>
fn delete_memory(&self, id: &str) -> Result<bool, CodememError>
Source§fn list_memory_ids(&self) -> Result<Vec<String>, CodememError>
fn list_memory_ids(&self) -> Result<Vec<String>, CodememError>
Source§fn list_memory_ids_for_namespace(
&self,
namespace: &str,
) -> Result<Vec<String>, CodememError>
fn list_memory_ids_for_namespace( &self, namespace: &str, ) -> Result<Vec<String>, CodememError>
Source§fn list_namespaces(&self) -> Result<Vec<String>, CodememError>
fn list_namespaces(&self) -> Result<Vec<String>, CodememError>
Source§fn memory_count(&self) -> Result<usize, CodememError>
fn memory_count(&self) -> Result<usize, CodememError>
Source§fn store_embedding(
&self,
memory_id: &str,
embedding: &[f32],
) -> Result<(), CodememError>
fn store_embedding( &self, memory_id: &str, embedding: &[f32], ) -> Result<(), CodememError>
Source§fn get_embedding(
&self,
memory_id: &str,
) -> Result<Option<Vec<f32>>, CodememError>
fn get_embedding( &self, memory_id: &str, ) -> Result<Option<Vec<f32>>, CodememError>
Source§fn delete_embedding(&self, memory_id: &str) -> Result<bool, CodememError>
fn delete_embedding(&self, memory_id: &str) -> Result<bool, CodememError>
Source§fn list_all_embeddings(&self) -> Result<Vec<(String, Vec<f32>)>, CodememError>
fn list_all_embeddings(&self) -> Result<Vec<(String, Vec<f32>)>, CodememError>
Source§fn insert_graph_node(&self, node: &GraphNode) -> Result<(), CodememError>
fn insert_graph_node(&self, node: &GraphNode) -> Result<(), CodememError>
Source§fn get_graph_node(&self, id: &str) -> Result<Option<GraphNode>, CodememError>
fn get_graph_node(&self, id: &str) -> Result<Option<GraphNode>, CodememError>
Source§fn delete_graph_node(&self, id: &str) -> Result<bool, CodememError>
fn delete_graph_node(&self, id: &str) -> Result<bool, CodememError>
Source§fn all_graph_nodes(&self) -> Result<Vec<GraphNode>, CodememError>
fn all_graph_nodes(&self) -> Result<Vec<GraphNode>, CodememError>
Source§fn insert_graph_edge(&self, edge: &Edge) -> Result<(), CodememError>
fn insert_graph_edge(&self, edge: &Edge) -> Result<(), CodememError>
Source§fn get_edges_for_node(&self, node_id: &str) -> Result<Vec<Edge>, CodememError>
fn get_edges_for_node(&self, node_id: &str) -> Result<Vec<Edge>, CodememError>
Source§fn all_graph_edges(&self) -> Result<Vec<Edge>, CodememError>
fn all_graph_edges(&self) -> Result<Vec<Edge>, CodememError>
Source§fn delete_graph_edges_for_node(
&self,
node_id: &str,
) -> Result<usize, CodememError>
fn delete_graph_edges_for_node( &self, node_id: &str, ) -> Result<usize, CodememError>
Source§fn start_session(
&self,
id: &str,
namespace: Option<&str>,
) -> Result<(), CodememError>
fn start_session( &self, id: &str, namespace: Option<&str>, ) -> Result<(), CodememError>
Source§fn end_session(
&self,
id: &str,
summary: Option<&str>,
) -> Result<(), CodememError>
fn end_session( &self, id: &str, summary: Option<&str>, ) -> Result<(), CodememError>
Source§fn list_sessions(
&self,
namespace: Option<&str>,
limit: usize,
) -> Result<Vec<Session>, CodememError>
fn list_sessions( &self, namespace: Option<&str>, limit: usize, ) -> Result<Vec<Session>, CodememError>
Source§fn insert_consolidation_log(
&self,
cycle_type: &str,
affected_count: usize,
) -> Result<(), CodememError>
fn insert_consolidation_log( &self, cycle_type: &str, affected_count: usize, ) -> Result<(), CodememError>
Source§fn last_consolidation_runs(
&self,
) -> Result<Vec<ConsolidationLogEntry>, CodememError>
fn last_consolidation_runs( &self, ) -> Result<Vec<ConsolidationLogEntry>, CodememError>
Source§fn get_repeated_searches(
&self,
min_count: usize,
namespace: Option<&str>,
) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>
fn get_repeated_searches( &self, min_count: usize, namespace: Option<&str>, ) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>
Source§fn get_file_hotspots(
&self,
min_count: usize,
namespace: Option<&str>,
) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>
fn get_file_hotspots( &self, min_count: usize, namespace: Option<&str>, ) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>
Source§fn get_tool_usage_stats(
&self,
namespace: Option<&str>,
) -> Result<Vec<(String, usize)>, CodememError>
fn get_tool_usage_stats( &self, namespace: Option<&str>, ) -> Result<Vec<(String, usize)>, CodememError>
Source§fn get_decision_chains(
&self,
min_count: usize,
namespace: Option<&str>,
) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>
fn get_decision_chains( &self, min_count: usize, namespace: Option<&str>, ) -> Result<Vec<(String, usize, Vec<String>)>, CodememError>
Source§fn decay_stale_memories(
&self,
threshold_ts: i64,
decay_factor: f64,
) -> Result<usize, CodememError>
fn decay_stale_memories( &self, threshold_ts: i64, decay_factor: f64, ) -> Result<usize, CodememError>
Source§fn list_memories_for_creative(
&self,
) -> Result<Vec<(String, String, Vec<String>)>, CodememError>
fn list_memories_for_creative( &self, ) -> Result<Vec<(String, String, Vec<String>)>, CodememError>
Source§fn find_cluster_duplicates(
&self,
) -> Result<Vec<(String, String, f64)>, CodememError>
fn find_cluster_duplicates( &self, ) -> Result<Vec<(String, String, f64)>, CodememError>
Source§fn find_forgettable(
&self,
importance_threshold: f64,
) -> Result<Vec<String>, CodememError>
fn find_forgettable( &self, importance_threshold: f64, ) -> Result<Vec<String>, CodememError>
Source§fn insert_memories_batch(
&self,
memories: &[MemoryNode],
) -> Result<(), CodememError>
fn insert_memories_batch( &self, memories: &[MemoryNode], ) -> Result<(), CodememError>
Source§fn store_embeddings_batch(
&self,
items: &[(&str, &[f32])],
) -> Result<(), CodememError>
fn store_embeddings_batch( &self, items: &[(&str, &[f32])], ) -> Result<(), CodememError>
Source§fn load_file_hashes(&self) -> Result<HashMap<String, String>, CodememError>
fn load_file_hashes(&self) -> Result<HashMap<String, String>, CodememError>
Source§fn save_file_hashes(
&self,
hashes: &HashMap<String, String>,
) -> Result<(), CodememError>
fn save_file_hashes( &self, hashes: &HashMap<String, String>, ) -> Result<(), CodememError>
Source§fn insert_graph_nodes_batch(
&self,
nodes: &[GraphNode],
) -> Result<(), CodememError>
fn insert_graph_nodes_batch( &self, nodes: &[GraphNode], ) -> Result<(), CodememError>
Source§fn insert_graph_edges_batch(&self, edges: &[Edge]) -> Result<(), CodememError>
fn insert_graph_edges_batch(&self, edges: &[Edge]) -> Result<(), CodememError>
Source§fn get_edges_at_time(
&self,
node_id: &str,
timestamp: i64,
) -> Result<Vec<Edge>, CodememError>
fn get_edges_at_time( &self, node_id: &str, timestamp: i64, ) -> Result<Vec<Edge>, CodememError>
Source§fn get_stale_memories_for_decay(
&self,
threshold_ts: i64,
) -> Result<Vec<(String, f64, u32, i64)>, CodememError>
fn get_stale_memories_for_decay( &self, threshold_ts: i64, ) -> Result<Vec<(String, f64, u32, i64)>, CodememError>
Source§fn batch_update_importance(
&self,
updates: &[(String, f64)],
) -> Result<usize, CodememError>
fn batch_update_importance( &self, updates: &[(String, f64)], ) -> Result<usize, CodememError>
Source§fn session_count(&self, namespace: Option<&str>) -> Result<usize, CodememError>
fn session_count(&self, namespace: Option<&str>) -> Result<usize, CodememError>
Source§fn find_unembedded_memories(
&self,
) -> Result<Vec<(String, String)>, CodememError>
fn find_unembedded_memories( &self, ) -> Result<Vec<(String, String)>, CodememError>
Source§fn search_graph_nodes(
&self,
query: &str,
namespace: Option<&str>,
limit: usize,
) -> Result<Vec<GraphNode>, CodememError>
fn search_graph_nodes( &self, query: &str, namespace: Option<&str>, limit: usize, ) -> Result<Vec<GraphNode>, CodememError>
limit results.