use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum PermissionMode {
#[default]
Default,
AcceptEdits,
DontAsk,
BypassPermissions,
Plan,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum MemoryScope {
User,
Project,
Local,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ToolPolicy {
AllowList(Vec<String>),
DenyList(Vec<String>),
InheritAll,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SkillFilter {
pub include: Vec<String>,
pub exclude: Vec<String>,
}
impl SkillFilter {
#[must_use]
pub fn is_empty(&self) -> bool {
self.include.is_empty() && self.exclude.is_empty()
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum HookType {
Command,
}
fn default_hook_timeout() -> u64 {
30
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HookDef {
#[serde(rename = "type")]
pub hook_type: HookType,
pub command: String,
#[serde(default = "default_hook_timeout")]
pub timeout_secs: u64,
#[serde(default)]
pub fail_closed: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HookMatcher {
pub matcher: String,
pub hooks: Vec<HookDef>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct SubagentHooks {
#[serde(default)]
pub pre_tool_use: Vec<HookMatcher>,
#[serde(default)]
pub post_tool_use: Vec<HookMatcher>,
}
impl SubagentHooks {
#[must_use]
pub fn is_empty(&self) -> bool {
self.pre_tool_use.is_empty() && self.post_tool_use.is_empty()
}
}