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 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_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 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.