use std::sync::Arc; use anyhow::Result; use assistant_tool::Tool; use gpui::{App, Entity, Task}; use project::Project; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize, JsonSchema)] pub struct ListWorktreesToolInput {} pub struct ListWorktreesTool; impl Tool for ListWorktreesTool { fn name(&self) -> String { "list-worktrees".into() } fn description(&self) -> String { "Lists all worktrees in the current project. Use this tool when you need to find available worktrees and their IDs.".into() } fn input_schema(&self) -> serde_json::Value { serde_json::json!( { "type": "object", "properties": {}, "required": [] } ) } fn run( self: Arc, _input: serde_json::Value, project: Entity, cx: &mut App, ) -> Task> { cx.spawn(|cx| async move { cx.update(|cx| { #[derive(Debug, Serialize)] struct WorktreeInfo { id: usize, root_name: String, root_dir: Option, } let worktrees = project.update(cx, |project, cx| { project .visible_worktrees(cx) .map(|worktree| { worktree.read_with(cx, |worktree, _cx| WorktreeInfo { id: worktree.id().to_usize(), root_dir: worktree .root_dir() .map(|root_dir| root_dir.to_string_lossy().to_string()), root_name: worktree.root_name().to_string(), }) }) .collect::>() }); if worktrees.is_empty() { return Ok("No worktrees found in the current project.".to_string()); } let mut result = String::from("Worktrees in the current project:\n\n"); for worktree in worktrees { result.push_str(&serde_json::to_string(&worktree)?); } Ok(result) })? }) } }