From 2b32cad4da8c5ddd0d293d45ed4b89b2f100477a Mon Sep 17 00:00:00 2001 From: Alex Yao <33379584+alexyao2015@users.noreply.github.com> Date: Mon, 20 Oct 2025 19:59:54 -0400 Subject: [PATCH] Fix extension manager resource deadlock (#5066) Signed-off-by: alexyao2015 Co-authored-by: alexyao2019@gmail.com --- crates/goose/src/agents/extension_manager.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/goose/src/agents/extension_manager.rs b/crates/goose/src/agents/extension_manager.rs index c5b29f1249..29294fc84c 100644 --- a/crates/goose/src/agents/extension_manager.rs +++ b/crates/goose/src/agents/extension_manager.rs @@ -705,9 +705,13 @@ impl ExtensionManager { // Loop through each extension and try to read the resource, don't raise an error if the resource is not found // TODO: do we want to find if a provided uri is in multiple extensions? // currently it will return the first match and skip any others - for extension_name in self.extensions.lock().await.keys() { + + // Collect extension names first to avoid holding the lock during iteration + let extension_names: Vec = self.extensions.lock().await.keys().cloned().collect(); + + for extension_name in extension_names { let result = self - .read_resource_from_extension(uri, extension_name, cancellation_token.clone()) + .read_resource_from_extension(uri, &extension_name, cancellation_token.clone()) .await; match result { Ok(result) => return Ok(result),