use async_trait::async_trait;
use super::{AgentHook, ToolCallAction, ToolCallContext};
pub struct ApprovalHook {
auto_approve: bool,
}
impl ApprovalHook {
pub fn new() -> Self {
Self { auto_approve: false }
}
pub fn auto_approve() -> Self {
Self { auto_approve: true }
}
pub fn with_auto_approve(mut self, auto_approve: bool) -> Self {
self.auto_approve = auto_approve;
self
}
}
impl Default for ApprovalHook {
fn default() -> Self {
Self::new()
}
}
#[async_trait]
impl AgentHook for ApprovalHook {
fn on_before_tool_call(&self, ctx: &mut ToolCallContext) -> ToolCallAction {
if self.auto_approve {
ToolCallAction::Continue
} else {
ToolCallAction::Reject {
reason: format!(
"Tool call '{}' requires manual approval. Arguments: {}",
ctx.name, ctx.arguments
),
}
}
}
}