diff --git a/crates/goose/src/agents/agent.rs b/crates/goose/src/agents/agent.rs index 397f0d8e0357..e0bd75e51303 100644 --- a/crates/goose/src/agents/agent.rs +++ b/crates/goose/src/agents/agent.rs @@ -529,11 +529,11 @@ impl Agent { "tool_execution_failed", &format!("{}: {}", tool_call.name, e), ); - ToolCallResult::from(Err(ErrorData::new( - ErrorCode::INTERNAL_ERROR, - e.to_string(), - None, - ))) + // Try to downcast to ErrorData to avoid double wrapping + let error_data = e.downcast::().unwrap_or_else(|e| { + ErrorData::new(ErrorCode::INTERNAL_ERROR, e.to_string(), None) + }); + ToolCallResult::from(Err(error_data)) }) }; diff --git a/crates/goose/src/agents/extension_manager.rs b/crates/goose/src/agents/extension_manager.rs index bc071ecfa3c0..86192049c2b6 100644 --- a/crates/goose/src/agents/extension_manager.rs +++ b/crates/goose/src/agents/extension_manager.rs @@ -1086,7 +1086,11 @@ impl ExtensionManager { self.get_client_for_tool(&tool_call.name) .await .ok_or_else(|| { - ErrorData::new(ErrorCode::RESOURCE_NOT_FOUND, tool_call.name.clone(), None) + ErrorData::new( + ErrorCode::RESOURCE_NOT_FOUND, + format!("Tool '{}' not found", tool_call.name), + None, + ) })?; // rsplit returns the iterator in reverse, tool_name is then at 0 @@ -1095,7 +1099,11 @@ impl ExtensionManager { .strip_prefix(client_name.as_str()) .and_then(|s| s.strip_prefix("__")) .ok_or_else(|| { - ErrorData::new(ErrorCode::RESOURCE_NOT_FOUND, tool_call.name.clone(), None) + ErrorData::new( + ErrorCode::RESOURCE_NOT_FOUND, + format!("Invalid tool name format: '{}'", tool_call.name), + None, + ) })? .to_string();