refactor: apply 5-pass audit optimizations across mcp-memory codebase
This commit is contained in:
1 parent
924b6d09fa
commit
5bd8b1587a
43 files changed
+1866
-1658
No files matched your search
+59
-94
@@ -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("...");
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user