use std::collections::HashSet;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolCapabilities {
#[serde(default = "default_allowed_categories")]
pub allowed_categories: HashSet<ToolCategory>,
#[serde(default)]
pub denied_tools: HashSet<String>,
#[serde(default)]
pub allowed_tools: Option<HashSet<String>>,
#[serde(default)]
pub always_approve: HashSet<String>,
}
fn default_allowed_categories() -> HashSet<ToolCategory> {
let mut set = HashSet::new();
set.insert(ToolCategory::FileRead);
set.insert(ToolCategory::Search);
set.insert(ToolCategory::Web);
set
}
impl Default for ToolCapabilities {
fn default() -> Self {
Self {
allowed_categories: default_allowed_categories(),
denied_tools: HashSet::new(),
allowed_tools: None,
always_approve: HashSet::new(),
}
}
}
impl ToolCapabilities {
pub fn full() -> Self {
let mut categories = HashSet::new();
categories.insert(ToolCategory::FileRead);
categories.insert(ToolCategory::FileWrite);
categories.insert(ToolCategory::Search);
categories.insert(ToolCategory::Git);
categories.insert(ToolCategory::GitDestructive);
categories.insert(ToolCategory::Bash);
categories.insert(ToolCategory::Web);
categories.insert(ToolCategory::CodeExecution);
categories.insert(ToolCategory::AgentSpawn);
categories.insert(ToolCategory::Planning);
categories.insert(ToolCategory::System);
Self {
allowed_categories: categories,
denied_tools: HashSet::new(),
allowed_tools: None,
always_approve: HashSet::new(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ToolCategory {
FileRead,
FileWrite,
Search,
Git,
GitDestructive,
Bash,
Web,
CodeExecution,
AgentSpawn,
Planning,
System,
}