Skip to main content

phi_agent/cli/
approval.rs

1use agent_base::{AgentResult, ApprovalDecision, ApprovalHandler, ApprovalRequest};
2use async_trait::async_trait;
3
4/// Approval mode
5#[derive(Clone, Debug)]
6pub enum ApprovalMode {
7    /// Auto-approve everything
8    Auto,
9    /// Deny everything
10    DenyAll,
11}
12
13/// I/O-free approval handler — pure strategy, suitable for all consumers.
14pub struct AutoApprovalHandler {
15    mode: ApprovalMode,
16}
17
18impl AutoApprovalHandler {
19    pub fn new(mode: ApprovalMode) -> Self {
20        Self { mode }
21    }
22}
23
24#[async_trait]
25impl ApprovalHandler for AutoApprovalHandler {
26    async fn approve(
27        &self,
28        request: ApprovalRequest,
29        _cancel_token: tokio_util::sync::CancellationToken,
30    ) -> AgentResult<ApprovalDecision> {
31        match &self.mode {
32            ApprovalMode::Auto => {
33                tracing::info!(decision = "AllowAlways", tool = %request.title, "auto-approved");
34                Ok(ApprovalDecision::AllowAlways)
35            }
36            ApprovalMode::DenyAll => {
37                tracing::info!(decision = "Deny", tool = %request.title, "auto-denied");
38                Ok(ApprovalDecision::Deny)
39            }
40        }
41    }
42}