//! Storage backend abstraction and implementations //! //! Provides multiple storage backends for KOGRAL: //! - Filesystem: Git-friendly markdown files //! - Memory: In-memory graph for dev/cache //! - `SurrealDB`: Scalable database backend (optional) use async_trait::async_trait; use crate::error::Result; use crate::models::{Graph, Node}; /// Storage backend trait /// /// Provides abstraction over different storage implementations (filesystem, /// `SurrealDB`, memory). All operations are async and return Result for /// error handling. #[async_trait] pub trait Storage: Send + Sync { /// Save a complete graph to storage /// /// Persists the entire graph including all nodes and edges. async fn save_graph(&mut self, graph: &Graph) -> Result<()>; /// Load a graph from storage /// /// Returns a fully reconstructed graph with all nodes and relationships. async fn load_graph(&self, name: &str) -> Result; /// Save a single node to storage /// /// Persists a node, updating if it already exists. async fn save_node(&mut self, node: &Node) -> Result<()>; /// Load a node by ID from storage /// /// Searches across all node types (notes, decisions, guidelines, patterns, /// journal, execution). async fn load_node(&self, graph_name: &str, node_id: &str) -> Result; /// Delete a node from storage /// /// Removes the node and cleans up relationships. async fn delete_node(&mut self, graph_name: &str, node_id: &str) -> Result<()>; /// List all graphs in storage async fn list_graphs(&self) -> Result>; /// List nodes in a graph, optionally filtered by type /// /// Returns all nodes of a specific type if `node_type` is provided, /// otherwise returns all nodes in the graph. async fn list_nodes(&self, graph_name: &str, node_type: Option<&str>) -> Result>; } pub mod filesystem; pub mod memory; #[cfg(feature = "surrealdb-backend")] pub mod surrealdb;