diff --git a/server/src/handlers/graph.rs b/server/src/handlers/graph.rs index 6ca552c..7151c8b 100644 --- a/server/src/handlers/graph.rs +++ b/server/src/handlers/graph.rs @@ -126,11 +126,7 @@ impl McpTool for CreateEntitiesHandler { } } }); - let idx = state - .search_index - .read() - .unwrap_or_else(|e| e.into_inner()) - .clone(); + let idx = state.get_search_index(); for entity in inserted { drop(idx.index_entity(&entity)); } @@ -237,11 +233,7 @@ impl McpTool for DeleteEntitiesHandler { return Err(format!("Error: Entities not found: {}", missing.join(", "))); } - let idx = state - .search_index - .read() - .unwrap_or_else(|e| e.into_inner()) - .clone(); + let idx = state.get_search_index(); for name in to_delete { drop(idx.delete_document(&name)); } diff --git a/server/src/handlers/meta.rs b/server/src/handlers/meta.rs index 4d8804a..3d18ba1 100644 --- a/server/src/handlers/meta.rs +++ b/server/src/handlers/meta.rs @@ -21,11 +21,7 @@ impl McpTool for LogDecisionHandler { async fn execute(&self, args: Value, state: Arc) -> Result { let req: LogDecisionTool = serde_json::from_value(args).map_err(|e| e.to_string())?; - let idx = state - .search_index - .read() - .unwrap_or_else(|e| e.into_inner()) - .clone(); + let idx = state.get_search_index(); let mut final_id = String::new(); state.adrs.modify(|adrs| { @@ -344,7 +340,7 @@ impl McpTool for OmniSearchHandler { async fn execute(&self, args: Value, state: Arc) -> Result { let req: OmniSearchTool = serde_json::from_value(args).map_err(|e| e.to_string())?; let matches = { - let idx = state.search_index.read().unwrap_or_else(|e| e.into_inner()); + let idx = state.get_search_index(); idx.search(&req.query, req.namespace.as_deref()) .unwrap_or_default() }; diff --git a/server/src/handlers/tasks.rs b/server/src/handlers/tasks.rs index 4100014..acd079c 100644 --- a/server/src/handlers/tasks.rs +++ b/server/src/handlers/tasks.rs @@ -37,11 +37,7 @@ impl McpTool for AddTaskHandler { dependencies: deps, acceptance_criteria: vec![], }; - let idx = state - .search_index - .read() - .unwrap_or_else(|e| e.into_inner()) - .clone(); + let idx = state.get_search_index(); drop(idx.index_task(&task)); state.tasks.modify(|tasks| { tasks.push(task); @@ -108,11 +104,7 @@ impl McpTool for DeleteTaskHandler { }); if deleted_count > 0 { - let idx = state - .search_index - .read() - .unwrap_or_else(|e| e.into_inner()) - .clone(); + let idx = state.get_search_index(); for id in actually_deleted { drop(idx.delete_document(&id)); } diff --git a/server/src/handlers/workspaces.rs b/server/src/handlers/workspaces.rs index 2c19138..d9badea 100644 --- a/server/src/handlers/workspaces.rs +++ b/server/src/handlers/workspaces.rs @@ -118,11 +118,7 @@ impl McpTool for StoreSnippetHandler { updated_at: crate::handlers::utils::now_secs(), }; - let idx = state - .search_index - .read() - .unwrap_or_else(|e| e.into_inner()) - .clone(); + let idx = state.get_search_index(); drop(idx.index_snippet(&snippet)); state.snippets.modify(|snippets| { @@ -185,11 +181,7 @@ impl McpTool for DeleteSnippetHandler { deleted = snippets.len() < orig; }); if deleted { - let idx = state - .search_index - .read() - .unwrap_or_else(|e| e.into_inner()) - .clone(); + let idx = state.get_search_index(); drop(idx.delete_document(&req.name)); Ok("Snippet deleted.".to_string()) } else { diff --git a/server/src/state.rs b/server/src/state.rs index 66ad592..53e6ef7 100644 --- a/server/src/state.rs +++ b/server/src/state.rs @@ -123,6 +123,10 @@ impl MemoryState { self.graph.modify(update_fn); } + pub fn get_search_index(&self) -> MemoryIndex { + self.search_index.read().unwrap_or_else(|e| e.into_inner()).clone() + } + pub async fn rebuild_index(self: &Arc) { if let Ok(new_idx) = MemoryIndex::new(&self.base_dir) { let idx = new_idx.clone();