feat(mcp): enhance MCP server registration with error handling and improve transport process management

refactor: update various tools for better error handling and path resolution
fix: improve markdown rendering and input display in TUI
This commit is contained in:
asepharyana
2026-07-20 13:12:04 +07:00
parent 89ee213454
commit 148ba4e07b
17 changed files with 242 additions and 82 deletions
+5 -4
View File
@@ -1,6 +1,6 @@
//! Change the working directory for subsequent commands.
use crate::tools::{Tool, ToolCtx};
use crate::tools::{resolve_path, Tool, ToolCtx};
use anyhow::Result;
use serde_json::{json, Value};
@@ -28,9 +28,10 @@ impl Tool for Cd {
})
}
fn run(&self, _ctx: &ToolCtx, args: &Value) -> Result<String> {
fn run(&self, ctx: &ToolCtx, args: &Value) -> Result<String> {
let dir = crate::tools::arg_str(args, "directory")?;
std::env::set_current_dir(&dir)?;
Ok(format!("Changed directory to '{dir}'"))
let resolved = resolve_path(&ctx.workspaces, &dir)?;
std::env::set_current_dir(&resolved)?;
Ok(format!("Changed directory to '{}'", resolved.display()))
}
}
@@ -1,8 +1,10 @@
//! Update the shared directory cache.
//! Update the shared directory cache by resolving each path against
//! workspaces and storing the resolved paths in `ctx.dir_cache`.
use crate::tools::ToolCtx;
use crate::tools::{resolve_path, ToolCtx};
use anyhow::Result;
use serde_json::{json, Value};
use std::path::PathBuf;
pub struct DirCacheUpdate;
@@ -28,7 +30,7 @@ impl crate::tools::Tool for DirCacheUpdate {
})
}
fn run(&self, _ctx: &ToolCtx, args: &Value) -> Result<String> {
fn run(&self, ctx: &ToolCtx, args: &Value) -> Result<String> {
let paths: Vec<String> = args
.get("paths")
.and_then(|v| v.as_array())
@@ -39,7 +41,19 @@ impl crate::tools::Tool for DirCacheUpdate {
})
.unwrap_or_default();
let count = paths.len();
let resolved: Vec<PathBuf> = paths
.iter()
.map(|p| resolve_path(&ctx.workspaces, p))
.collect::<Result<Vec<_>>>()?;
let count = resolved.len();
// Persist the resolved paths into the shared DirCache so the TUI
// and other tools can read the cached listing without re-scanning.
let dc = ctx.dir_cache.clone();
let rt = tokio::runtime::Runtime::new()?;
rt.block_on(async { dc.write().await.set(resolved).await });
Ok(format!("Directory cache updated with {} entries", count))
}
}