refactor: apply 5-pass audit optimizations across mcp-memory codebase

This commit is contained in:
Riz Ashraf committed 2026-10-06 06:05:38 +01:00
1 parent 924b6d09fa
commit 5bd8b1587a
43 files changed
+1866 -1658

No files matched your search

+59 -94
View File
@@ -57,23 +57,18 @@ impl McpResource for GraphEntitiesResource {
Some("All nodes and entities currently stored in the knowledge graph")
}
async fn read(&self, state: Arc<MemoryState>) -> crate::error::Result<String> {
let state_clone = Arc::clone(&state);
tokio::task::spawn_blocking(move || -> crate::error::Result<String> {
let graph = state_clone.graph.cache.read().unwrap();
let data: Vec<_> = graph.entities.values().collect();
if data.len() > 100 {
let truncated: Vec<_> = data.iter().take(100).cloned().collect();
let res = serde_json::json!({
"_meta": format!("Showing 100 of {} total entities. Use omni_search or get_subgraph for targeted entity discovery.", data.len()),
"entities": truncated
});
Ok(serde_json::to_string_pretty(&res)?)
} else {
Ok(serde_json::to_string_pretty(&data)?)
}
})
.await
.map_err(|e| crate::error::AppError::Internal(e.to_string()))?
let graph = state.graph.cache.read().unwrap_or_else(|e| e.into_inner());
let data: Vec<_> = graph.entities.values().collect();
if data.len() > 100 {
let truncated: Vec<_> = data.iter().take(100).cloned().collect();
let res = serde_json::json!({
"_meta": format!("Showing 100 of {} total entities. Use omni_search or get_subgraph for targeted entity discovery.", data.len()),
"entities": truncated
});
Ok(serde_json::to_string_pretty(&res)?)
} else {
Ok(serde_json::to_string_pretty(&data)?)
}
}
}
@@ -90,14 +85,18 @@ impl McpResource for GraphRelationsResource {
Some("All relationships between entities currently stored in the knowledge graph")
}
async fn read(&self, state: Arc<MemoryState>) -> crate::error::Result<String> {
let state_clone = Arc::clone(&state);
tokio::task::spawn_blocking(move || -> crate::error::Result<String> {
let graph = state_clone.graph.cache.read().unwrap();
let data = &graph.relations;
let graph = state.graph.cache.read().unwrap_or_else(|e| e.into_inner());
let data = &graph.relations;
if data.len() > 200 {
let truncated: Vec<_> = data.iter().take(200).cloned().collect();
let res = serde_json::json!({
"_meta": format!("Showing 200 of {} total relations. Use query_graph_path or get_subgraph for targeted relation discovery.", data.len()),
"relations": truncated
});
Ok(serde_json::to_string_pretty(&res)?)
} else {
Ok(serde_json::to_string_pretty(&data)?)
})
.await
.map_err(|e| crate::error::AppError::Internal(e.to_string()))?
}
}
}
@@ -114,17 +113,12 @@ impl McpResource for TasksActiveResource {
Some("List of currently active tasks")
}
async fn read(&self, state: Arc<MemoryState>) -> crate::error::Result<String> {
let state_clone = Arc::clone(&state);
tokio::task::spawn_blocking(move || -> crate::error::Result<String> {
let tasks = state_clone.project.tasks.cache.read().unwrap();
let data: Vec<_> = tasks
.iter()
.filter(|t| t.status != "completed" && t.status != "done")
.collect();
Ok(serde_json::to_string_pretty(&data)?)
})
.await
.map_err(|e| crate::error::AppError::Internal(e.to_string()))?
let tasks = state.project.tasks.cache.read().unwrap_or_else(|e| e.into_inner());
let data: Vec<_> = tasks
.iter()
.filter(|t| t.is_active())
.collect();
Ok(serde_json::to_string_pretty(&data)?)
}
}
@@ -141,14 +135,9 @@ impl McpResource for DecisionsActiveResource {
Some("All accepted Architectural Decision Records (ADRs)")
}
async fn read(&self, state: Arc<MemoryState>) -> crate::error::Result<String> {
let state_clone = Arc::clone(&state);
tokio::task::spawn_blocking(move || -> crate::error::Result<String> {
let adrs = state_clone.code.adrs.cache.read().unwrap();
let data: Vec<_> = adrs.iter().filter(|a| a.status == "accepted").collect();
Ok(serde_json::to_string_pretty(&data)?)
})
.await
.map_err(|e| crate::error::AppError::Internal(e.to_string()))?
let adrs = state.code.adrs.cache.read().unwrap_or_else(|e| e.into_inner());
let data: Vec<_> = adrs.iter().filter(|a| a.status == "accepted").collect();
Ok(serde_json::to_string_pretty(&data)?)
}
}
@@ -165,14 +154,9 @@ impl McpResource for TechDebtActiveResource {
Some("All currently unresolved technical debt items")
}
async fn read(&self, state: Arc<MemoryState>) -> crate::error::Result<String> {
let state_clone = Arc::clone(&state);
tokio::task::spawn_blocking(move || -> crate::error::Result<String> {
let debts = state_clone.code.tech_debts.cache.read().unwrap();
let data: Vec<_> = debts.iter().filter(|d| !d.is_resolved).collect();
Ok(serde_json::to_string_pretty(&data)?)
})
.await
.map_err(|e| crate::error::AppError::Internal(e.to_string()))?
let debts = state.code.tech_debts.cache.read().unwrap_or_else(|e| e.into_inner());
let data: Vec<_> = debts.iter().filter(|d| !d.is_resolved).collect();
Ok(serde_json::to_string_pretty(&data)?)
}
}
@@ -245,32 +229,27 @@ impl McpResource for SessionDeltaResource {
Some("Recent changes, active tasks, code edits, and notes created in the current session")
}
async fn read(&self, state: Arc<MemoryState>) -> crate::error::Result<String> {
let state_clone = Arc::clone(&state);
tokio::task::spawn_blocking(move || -> crate::error::Result<String> {
let now = crate::handlers::utils::now_secs();
let lookback = 7200; // last 2 hours
let cutoff = now.saturating_sub(lookback);
let now = crate::handlers::utils::now_secs();
let lookback = 7200; // last 2 hours
let cutoff = now.saturating_sub(lookback);
let changes = state_clone.code.ledger.cache.read().unwrap();
let recent_changes: Vec<_> = changes.iter().filter(|c| c.timestamp >= cutoff).collect();
let changes = state.code.ledger.cache.read().unwrap_or_else(|e| e.into_inner());
let recent_changes: Vec<_> = changes.iter().filter(|c| c.timestamp >= cutoff).collect();
let tasks = state_clone.project.tasks.cache.read().unwrap();
let active_tasks: Vec<_> = tasks.iter().filter(|t| t.status != "completed" && t.status != "done").collect();
let tasks = state.project.tasks.cache.read().unwrap_or_else(|e| e.into_inner());
let active_tasks: Vec<_> = tasks.iter().filter(|t| t.is_active()).collect();
let notes = state_clone.code.sticky.cache.read().unwrap();
let active_notes: Vec<_> = notes.iter().filter(|n| n.expires_at.map_or(true, |exp| exp > now)).collect();
let notes = state.code.sticky.cache.read().unwrap_or_else(|e| e.into_inner());
let active_notes: Vec<_> = notes.iter().filter(|n| n.expires_at.map_or(true, |exp| exp > now)).collect();
let delta = serde_json::json!({
"recent_changes": recent_changes,
"active_tasks": active_tasks,
"active_sticky_notes": active_notes,
"timestamp": now,
});
let delta = serde_json::json!({
"recent_changes": recent_changes,
"active_tasks": active_tasks,
"active_sticky_notes": active_notes,
"timestamp": now,
});
Ok(serde_json::to_string_pretty(&delta)?)
})
.await
.map_err(|e| crate::error::AppError::Internal(e.to_string()))?
Ok(serde_json::to_string_pretty(&delta)?)
}
}
@@ -355,13 +334,8 @@ impl MemoryHandler {
Some("Recent terminal execution history and exit codes")
}
async fn read(&self, state: Arc<MemoryState>) -> crate::error::Result<String> {
let state_clone = Arc::clone(&state);
tokio::task::spawn_blocking(move || -> crate::error::Result<String> {
let items = state_clone.telemetry.terminal_history.cache.read().unwrap();
Ok(serde_json::to_string_pretty(&*items)?)
})
.await
.map_err(|e| crate::error::AppError::Internal(e.to_string()))?
let items = state.telemetry.terminal_history.cache.read().unwrap_or_else(|e| e.into_inner());
Ok(serde_json::to_string_pretty(&*items)?)
}
}
struct PinnedFilesResource;
@@ -377,13 +351,8 @@ impl MemoryHandler {
Some("Currently pinned files in the workspace")
}
async fn read(&self, state: Arc<MemoryState>) -> crate::error::Result<String> {
let state_clone = Arc::clone(&state);
tokio::task::spawn_blocking(move || -> crate::error::Result<String> {
let items = state_clone.project.pinned_files.cache.read().unwrap();
Ok(serde_json::to_string_pretty(&*items)?)
})
.await
.map_err(|e| crate::error::AppError::Internal(e.to_string()))?
let items = state.project.pinned_files.cache.read().unwrap_or_else(|e| e.into_inner());
Ok(serde_json::to_string_pretty(&*items)?)
}
}
@@ -400,13 +369,8 @@ impl MemoryHandler {
Some("Project milestones and their status")
}
async fn read(&self, state: Arc<MemoryState>) -> crate::error::Result<String> {
let state_clone = Arc::clone(&state);
tokio::task::spawn_blocking(move || -> crate::error::Result<String> {
let items = state_clone.project.milestones.cache.read().unwrap();
Ok(serde_json::to_string_pretty(&*items)?)
})
.await
.map_err(|e| crate::error::AppError::Internal(e.to_string()))?
let items = state.project.milestones.cache.read().unwrap_or_else(|e| e.into_inner());
Ok(serde_json::to_string_pretty(&*items)?)
}
}
@@ -905,7 +869,8 @@ pub fn format_tool_activity_description(name: &str, args: &serde_json::Value) ->
let mut truncated = detail.trim().to_string();
if truncated.len() > 80 {
truncated.truncate(77);
let valid_len = truncated.floor_char_boundary(77);
truncated.truncate(valid_len);
truncated.push_str("...");
}