use std::sync::Arc;
use adk_core::{ReadonlyContext, Result, Tool, Toolset};
use async_trait::async_trait;
use crate::tools::{BashTool, EditFileTool, GlobTool, GrepTool, ReadFileTool, WriteFileTool};
use crate::workspace::Workspace;
pub struct DevToolset {
workspace: Workspace,
include_bash: bool,
}
impl DevToolset {
pub fn new(workspace: Workspace) -> Self {
Self { workspace, include_bash: true }
}
pub fn with_bash(mut self, include: bool) -> Self {
self.include_bash = include;
self
}
}
#[async_trait]
impl Toolset for DevToolset {
fn name(&self) -> &str {
"devtools"
}
async fn tools(&self, _ctx: Arc<dyn ReadonlyContext>) -> Result<Vec<Arc<dyn Tool>>> {
let ws = self.workspace.clone();
let mut tools: Vec<Arc<dyn Tool>> = vec![
Arc::new(ReadFileTool::new(ws.clone())),
Arc::new(GlobTool::new(ws.clone())),
Arc::new(GrepTool::new(ws.clone())),
];
if ws.is_writable() {
tools.push(Arc::new(WriteFileTool::new(ws.clone())));
tools.push(Arc::new(EditFileTool::new(ws.clone())));
}
if self.include_bash && ws.bash_allowed() {
tools.push(Arc::new(BashTool::new(ws.clone())));
}
Ok(tools)
}
}