refactor: eradicate deprecated tools (sticky_notes, pinned_files, context_workspaces, pr_checklist, preferences) and dead code
This commit is contained in:
1 parent
d80915635f
commit
79209da711
31 files changed
+1230
-3920
No files matched your search
+26
-207
@@ -261,21 +261,9 @@ impl McpResource for SessionDeltaResource {
|
||||
.unwrap_or_else(|e| e.into_inner());
|
||||
let active_tasks: Vec<_> = tasks.iter().filter(|t| t.is_active()).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,
|
||||
});
|
||||
|
||||
@@ -291,7 +279,7 @@ impl McpPrompt for ContextWarmupPrompt {
|
||||
}
|
||||
fn description(&self) -> Option<&'static str> {
|
||||
Some(
|
||||
"Consolidated context warmup prompt providing active tasks, pinned files, open tech debt, and sticky notes",
|
||||
"Consolidated context warmup prompt providing active tasks, active decisions, and unresolved tech debt",
|
||||
)
|
||||
}
|
||||
async fn get(
|
||||
@@ -305,7 +293,7 @@ impl McpPrompt for ContextWarmupPrompt {
|
||||
"role": "user",
|
||||
"content": {
|
||||
"type": "text",
|
||||
"text": "Perform a complete context warmup. Please read memory://session/delta, memory://tasks/active, memory://tech_debt/active, and memory://pinned_files to synthesize current project focus and active workspace constraints."
|
||||
"text": "Perform a complete context warmup. Please read memory://session/delta, memory://tasks/active, memory://decisions/active, and memory://tech_debt/unresolved to synthesize current project focus and active workspace constraints."
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -397,28 +385,6 @@ impl MemoryHandler {
|
||||
Ok(serde_json::to_string_pretty(&*items)?)
|
||||
}
|
||||
}
|
||||
struct PinnedFilesResource;
|
||||
#[async_trait]
|
||||
impl McpResource for PinnedFilesResource {
|
||||
fn uri(&self) -> &'static str {
|
||||
"memory://pinned_files"
|
||||
}
|
||||
fn name(&self) -> &'static str {
|
||||
"Pinned Files"
|
||||
}
|
||||
fn description(&self) -> Option<&'static str> {
|
||||
Some("Currently pinned files in the workspace")
|
||||
}
|
||||
async fn read(&self, state: Arc<MemoryState>) -> crate::error::Result<String> {
|
||||
let items = state
|
||||
.project
|
||||
.pinned_files
|
||||
.cache
|
||||
.read()
|
||||
.unwrap_or_else(|e| e.into_inner());
|
||||
Ok(serde_json::to_string_pretty(&*items)?)
|
||||
}
|
||||
}
|
||||
|
||||
struct MilestonesResource;
|
||||
#[async_trait]
|
||||
@@ -473,7 +439,6 @@ impl MemoryHandler {
|
||||
|
||||
register_resource!(TerminalHistoryResource);
|
||||
register_resource!(RecentActivitiesResource);
|
||||
register_resource!(PinnedFilesResource);
|
||||
register_resource!(MilestonesResource);
|
||||
struct ArchiveRoutinePrompt;
|
||||
#[async_trait]
|
||||
@@ -529,8 +494,6 @@ impl MemoryHandler {
|
||||
|
||||
register!(tasks::TasksHandler);
|
||||
register!(tasks::MilestonesHandler);
|
||||
|
||||
register!(notes::StickyNotesHandler);
|
||||
register!(notes::HandoffMemosHandler);
|
||||
register!(notes::AddSessionSummaryHandler);
|
||||
register!(notes::GenerateStandupReportHandler);
|
||||
@@ -542,16 +505,11 @@ impl MemoryHandler {
|
||||
register!(meta::SearchErrorFixesHandler);
|
||||
register!(meta::LogCodeChangeHandler);
|
||||
register!(meta::QueryRecentChangesHandler);
|
||||
register!(meta::LearnPreferenceHandler);
|
||||
register!(meta::ReadPreferencesHandler);
|
||||
register!(meta::OmniSearchHandler);
|
||||
register!(meta::GetProjectHealthHandler);
|
||||
|
||||
register!(env::EnvironmentHandler);
|
||||
|
||||
register!(workspaces::PinnedFilesHandler);
|
||||
register!(workspaces::ContextWorkspacesHandler);
|
||||
register!(workspaces::PrChecklistHandler);
|
||||
register!(workspaces::SnippetsHandler);
|
||||
register!(vision::ClipboardHandler);
|
||||
|
||||
@@ -574,7 +532,6 @@ impl MemoryHandler {
|
||||
register!(meta::GetNextActionableTasksHandler);
|
||||
register!(meta::LogHypothesisHandler);
|
||||
register!(meta::QueryHypothesesHandler);
|
||||
register!(workspaces::DiffContextWorkspacesHandler);
|
||||
register!(meta::GetPreflightContextHandler);
|
||||
register!(graph::ResolveStaleSymbolsHandler);
|
||||
register!(graph::SummarizeSubgraphHandler);
|
||||
@@ -774,14 +731,13 @@ impl MemoryHandler {
|
||||
"log_error_fix" => "ERROR_FIX",
|
||||
"tech_debt" => "TECH_DEBT",
|
||||
"tasks" | "milestones" => "TASK",
|
||||
"sticky_notes" | "handoff_memos" => "STICKY_NOTE",
|
||||
"handoff_memos" => "STICKY_NOTE",
|
||||
"manage_checkpoint" => "CHECKPOINT",
|
||||
"manage_subagent_namespace" => "SUBAGENT",
|
||||
"snippets" => "SNIPPET",
|
||||
"search_web" => "WEB_SEARCH",
|
||||
"omni_search" => "OMNI_SEARCH",
|
||||
"environment" => "ENVIRONMENT",
|
||||
"pinned_files" | "context_workspaces" | "pr_checklist" => "WORKSPACE",
|
||||
_ => "TOOL",
|
||||
};
|
||||
|
||||
@@ -880,157 +836,25 @@ pub fn format_tool_activity_description(name: &str, args: &serde_json::Value) ->
|
||||
.to_string(),
|
||||
)
|
||||
}
|
||||
"sticky_notes" => {
|
||||
let act = args.get("action").and_then(|v| v.as_str()).unwrap_or("add");
|
||||
let preview = args
|
||||
.get("content")
|
||||
.and_then(|v| v.as_str())
|
||||
.map(|c| c.chars().take(40).collect::<String>())
|
||||
.unwrap_or_default();
|
||||
(
|
||||
"Sticky Notes",
|
||||
format!("{}: {}", act, preview)
|
||||
.trim_end_matches(": ")
|
||||
.to_string(),
|
||||
)
|
||||
}
|
||||
"clipboard" => {
|
||||
let act = args
|
||||
.get("action")
|
||||
.and_then(|v| v.as_str())
|
||||
.unwrap_or("read");
|
||||
("Clipboard", act.to_string())
|
||||
}
|
||||
"snippets" => {
|
||||
let act = args
|
||||
.get("action")
|
||||
.and_then(|v| v.as_str())
|
||||
.unwrap_or("search");
|
||||
let q = args.get("query").and_then(|v| v.as_str()).unwrap_or("");
|
||||
(
|
||||
"Snippets",
|
||||
format!("{}: {}", act, q).trim_end_matches(": ").to_string(),
|
||||
)
|
||||
}
|
||||
"log_code_change" => {
|
||||
let file = args
|
||||
.get("file_path")
|
||||
.or_else(|| args.get("file"))
|
||||
.or_else(|| args.get("target_file"))
|
||||
.and_then(|v| v.as_str());
|
||||
let summary = args
|
||||
.get("summary")
|
||||
.or_else(|| args.get("description"))
|
||||
.and_then(|v| v.as_str());
|
||||
|
||||
let d = match (file, summary) {
|
||||
(Some(f), Some(s)) => format!("{}: {}", f, s),
|
||||
(Some(f), None) => f.to_string(),
|
||||
(None, Some(s)) => s.to_string(),
|
||||
(None, None) => String::new(),
|
||||
};
|
||||
("Log Code Change", d)
|
||||
}
|
||||
"log_error_fix" => {
|
||||
let d = args
|
||||
.get("error")
|
||||
.or_else(|| args.get("summary"))
|
||||
.or_else(|| args.get("solution"))
|
||||
.and_then(|v| v.as_str())
|
||||
.unwrap_or("")
|
||||
.to_string();
|
||||
("Log Error Fix", d)
|
||||
}
|
||||
"create_entities" => {
|
||||
let d = if let Some(entities) = args.get("entities").and_then(|v| v.as_array()) {
|
||||
let names: Vec<&str> = entities
|
||||
.iter()
|
||||
.filter_map(|e| {
|
||||
e.get("name")
|
||||
.or_else(|| e.get("entity_name"))
|
||||
.and_then(|n| n.as_str())
|
||||
})
|
||||
.take(3)
|
||||
.collect();
|
||||
if !names.is_empty() {
|
||||
let mut s = names.join(", ");
|
||||
if entities.len() > 3 {
|
||||
s.push_str(&format!(" (+{} more)", entities.len() - 3));
|
||||
}
|
||||
s
|
||||
} else {
|
||||
format!("{} entity/entities", entities.len())
|
||||
}
|
||||
} else if let Some(name) = args
|
||||
.get("name")
|
||||
.or_else(|| args.get("entity_name"))
|
||||
.and_then(|v| v.as_str())
|
||||
{
|
||||
name.to_string()
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
("Create Entities", d)
|
||||
}
|
||||
"create_relations" => {
|
||||
let d = if let Some(relations) = args.get("relations").and_then(|v| v.as_array()) {
|
||||
if let Some(first) = relations.first() {
|
||||
let from = first.get("from").and_then(|v| v.as_str()).unwrap_or("?");
|
||||
let to = first.get("to").and_then(|v| v.as_str()).unwrap_or("?");
|
||||
let pred = first
|
||||
.get("relation_type")
|
||||
.or_else(|| first.get("predicate"))
|
||||
.and_then(|v| v.as_str())
|
||||
.unwrap_or("->");
|
||||
if relations.len() > 1 {
|
||||
format!("{} {} {} (+{} more)", from, pred, to, relations.len() - 1)
|
||||
} else {
|
||||
format!("{} {} {}", from, pred, to)
|
||||
}
|
||||
} else {
|
||||
format!("{} relation(s)", relations.len())
|
||||
}
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
("Create Relations", d)
|
||||
}
|
||||
"omni_search" | "search_graph" | "search_web" => {
|
||||
let d = args
|
||||
.get("query")
|
||||
.and_then(|v| v.as_str())
|
||||
.map(|q| format!("\"{}\"", q))
|
||||
let names = args
|
||||
.get("entities")
|
||||
.and_then(|v| v.as_array())
|
||||
.map(|arr| {
|
||||
arr.iter()
|
||||
.filter_map(|e| e.get("name").and_then(|n| n.as_str()))
|
||||
.collect::<Vec<_>>()
|
||||
.join(", ")
|
||||
})
|
||||
.unwrap_or_default();
|
||||
("Search", d)
|
||||
}
|
||||
_ => {
|
||||
let d = args
|
||||
.get("title")
|
||||
.or_else(|| args.get("action"))
|
||||
.or_else(|| args.get("summary"))
|
||||
.or_else(|| args.get("description"))
|
||||
.or_else(|| args.get("name"))
|
||||
.or_else(|| args.get("query"))
|
||||
.or_else(|| args.get("file_path"))
|
||||
.or_else(|| args.get("file"))
|
||||
.or_else(|| args.get("path"))
|
||||
.and_then(|v| v.as_str())
|
||||
.unwrap_or("");
|
||||
(name, d.to_string())
|
||||
("Create Entities", names)
|
||||
}
|
||||
_ => return name.to_string(),
|
||||
};
|
||||
|
||||
let mut truncated = detail.trim().to_string();
|
||||
if truncated.len() > 80 {
|
||||
let valid_len = truncated.floor_char_boundary(77);
|
||||
truncated.truncate(valid_len);
|
||||
truncated.push_str("...");
|
||||
}
|
||||
|
||||
if !truncated.is_empty() {
|
||||
format!("{}: {}", action, truncated)
|
||||
if detail.is_empty() {
|
||||
action.to_string()
|
||||
} else {
|
||||
format!("{}", action)
|
||||
format!("{}: {}", action, detail)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1047,20 +871,20 @@ async fn execute_tool_span(
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use serde_json::json;
|
||||
use tempfile::tempdir;
|
||||
use serde_json::json;
|
||||
|
||||
#[test]
|
||||
fn test_format_tool_activity_description() {
|
||||
let msg1 = format_tool_activity_description(
|
||||
"log_code_change",
|
||||
&json!({ "file": "src/lib.rs", "summary": "Refactored library" }),
|
||||
let msg = format_tool_activity_description(
|
||||
"tasks",
|
||||
&serde_json::json!({ "action": "add", "title": "Refactor router" }),
|
||||
);
|
||||
assert_eq!(msg1, "Log Code Change: src/lib.rs: Refactored library");
|
||||
assert_eq!(msg, "Tasks: add: Refactor router");
|
||||
|
||||
let msg2 = format_tool_activity_description(
|
||||
"create_entities",
|
||||
&json!({ "entities": [{ "name": "EntityA" }, { "name": "EntityB" }] }),
|
||||
&serde_json::json!({ "entities": [{ "name": "EntityA" }, { "name": "EntityB" }] }),
|
||||
);
|
||||
assert_eq!(msg2, "Create Entities: EntityA, EntityB");
|
||||
|
||||
@@ -1115,7 +939,7 @@ mod tests {
|
||||
assert!(
|
||||
resources_arr
|
||||
.iter()
|
||||
.any(|r| r["uri"] == "memory://pinned_files")
|
||||
.any(|r| r["uri"] == "memory://decisions/active")
|
||||
);
|
||||
assert!(
|
||||
resources_arr
|
||||
@@ -1292,8 +1116,8 @@ mod tests {
|
||||
.as_array()
|
||||
.expect("tools array expected");
|
||||
assert!(
|
||||
tools.len() >= 40,
|
||||
"Expected at least 40 registered MCP tools, found {}",
|
||||
tools.len() >= 30,
|
||||
"Expected at least 30 registered MCP tools, found {}",
|
||||
tools.len()
|
||||
);
|
||||
|
||||
@@ -1353,16 +1177,11 @@ mod tests {
|
||||
("tasks", json!({"action": "list"})),
|
||||
("decisions", json!({"action": "query"})),
|
||||
("tech_debt", json!({"action": "list"})),
|
||||
("sticky_notes", json!({"action": "read"})),
|
||||
("pinned_files", json!({"action": "list"})),
|
||||
("context_workspaces", json!({"action": "list"})),
|
||||
("pr_checklist", json!({"action": "get"})),
|
||||
("snippets", json!({"action": "search", "query": "test"})),
|
||||
("clipboard", json!({"action": "read"})),
|
||||
("environment", json!({"action": "read_fingerprint"})),
|
||||
("omni_search", json!({"query": "test"})),
|
||||
("get_project_health", json!({})),
|
||||
("read_preferences", json!({})),
|
||||
("find_orphans", json!({})),
|
||||
("sweep_graph_health", json!({})),
|
||||
("get_next_actionable_tasks", json!({})),
|
||||
|
||||
Reference in new issue
Block a user