1use std::sync::Arc;
4
5use adk_core::{ReadonlyContext, Result, Tool, Toolset};
6use async_trait::async_trait;
7
8use crate::tools::{BashTool, EditFileTool, GlobTool, GrepTool, ReadFileTool, WriteFileTool};
9use crate::workspace::Workspace;
10
11pub struct DevToolset {
18 workspace: Workspace,
19 include_bash: bool,
20}
21
22impl DevToolset {
23 pub fn new(workspace: Workspace) -> Self {
25 Self { workspace, include_bash: true }
26 }
27
28 pub fn with_bash(mut self, include: bool) -> Self {
31 self.include_bash = include;
32 self
33 }
34}
35
36#[async_trait]
37impl Toolset for DevToolset {
38 fn name(&self) -> &str {
39 "devtools"
40 }
41
42 async fn tools(&self, _ctx: Arc<dyn ReadonlyContext>) -> Result<Vec<Arc<dyn Tool>>> {
43 let ws = self.workspace.clone();
44 let mut tools: Vec<Arc<dyn Tool>> = vec![
45 Arc::new(ReadFileTool::new(ws.clone())),
46 Arc::new(GlobTool::new(ws.clone())),
47 Arc::new(GrepTool::new(ws.clone())),
48 ];
49 if ws.is_writable() {
50 tools.push(Arc::new(WriteFileTool::new(ws.clone())));
51 tools.push(Arc::new(EditFileTool::new(ws.clone())));
52 }
53 if self.include_bash && ws.bash_allowed() {
54 tools.push(Arc::new(BashTool::new(ws.clone())));
55 }
56 Ok(tools)
57 }
58}