agent: Restore find path tool card after restart (#30580)

Bennet Bo Fenner created

Release Notes:

- N/A

Change summary

crates/assistant_tools/src/find_path_tool.rs | 39 ++++++++++++++++++++-
1 file changed, 37 insertions(+), 2 deletions(-)

Detailed changes

crates/assistant_tools/src/find_path_tool.rs 🔗

@@ -1,6 +1,6 @@
 use crate::{schema::json_schema_for, ui::ToolCallCardHeader};
 use anyhow::{Result, anyhow};
-use assistant_tool::{ActionLog, Tool, ToolCard, ToolResult, ToolUseStatus};
+use assistant_tool::{ActionLog, Tool, ToolCard, ToolResult, ToolResultOutput, ToolUseStatus};
 use editor::Editor;
 use futures::channel::oneshot::{self, Receiver};
 use gpui::{
@@ -38,6 +38,12 @@ pub struct FindPathToolInput {
     pub offset: usize,
 }
 
+#[derive(Debug, Serialize, Deserialize)]
+struct FindPathToolOutput {
+    glob: String,
+    paths: Vec<PathBuf>,
+}
+
 const RESULTS_PER_PAGE: usize = 50;
 
 pub struct FindPathTool;
@@ -111,10 +117,18 @@ impl Tool for FindPathTool {
                     )
                     .unwrap();
                 }
+                let output = FindPathToolOutput {
+                    glob,
+                    paths: matches.clone(),
+                };
+
                 for mat in matches.into_iter().skip(offset).take(RESULTS_PER_PAGE) {
                     write!(&mut message, "\n{}", mat.display()).unwrap();
                 }
-                Ok(message.into())
+                Ok(ToolResultOutput {
+                    content: message,
+                    output: Some(serde_json::to_value(output)?),
+                })
             }
         });
 
@@ -123,6 +137,18 @@ impl Tool for FindPathTool {
             card: Some(card.into()),
         }
     }
+
+    fn deserialize_card(
+        self: Arc<Self>,
+        output: serde_json::Value,
+        _project: Entity<Project>,
+        _window: &mut Window,
+        cx: &mut App,
+    ) -> Option<assistant_tool::AnyToolCard> {
+        let output = serde_json::from_value::<FindPathToolOutput>(output).ok()?;
+        let card = cx.new(|_| FindPathToolCard::from_output(output));
+        Some(card.into())
+    }
 }
 
 fn search_paths(glob: &str, project: Entity<Project>, cx: &mut App) -> Task<Result<Vec<PathBuf>>> {
@@ -180,6 +206,15 @@ impl FindPathToolCard {
             _receiver_task: Some(_receiver_task),
         }
     }
+
+    fn from_output(output: FindPathToolOutput) -> Self {
+        Self {
+            glob: output.glob,
+            paths: output.paths,
+            expanded: false,
+            _receiver_task: None,
+        }
+    }
 }
 
 impl ToolCard for FindPathToolCard {