use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub enum HookEvent {
SessionStart,
UserPromptSubmit,
PreToolUse,
PostToolUse,
Stop,
SessionEnd,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum HookHandler {
Command { script: String },
Prompt { template: String },
Agent { agent_name: String },
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "decision", rename_all = "snake_case")]
pub enum HookDecision {
Allow,
Block {
#[serde(default)]
reason: Option<String>,
},
Mutate {
arguments: serde_json::Value,
#[serde(default)]
reason: Option<String>,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct HookConfig {
pub event: HookEvent,
#[serde(default)]
pub matcher: Option<String>,
pub handler: HookHandler,
#[serde(default)]
pub async_mode: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct HooksConfig {
#[serde(default)]
pub hooks: Vec<HookConfig>,
}