Skip to main content

phi_agent/cli/
approval.rs

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