ai-agent 0.13.4

Idiomatic agent sdk inspired by the claude code source leak
Documentation
#![allow(dead_code)]

#[derive(Debug, Clone)]
pub struct AutoModeDenial {
    pub tool_name: String,
    pub display: String,
    pub reason: String,
    pub timestamp: u64,
}

const MAX_DENIALS: usize = 20;

static DENIALS: std::sync::Mutex<Vec<AutoModeDenial>> = std::sync::Mutex::new(Vec::new());

pub fn record_auto_mode_denial(denial: AutoModeDenial) {
    if let Ok(mut denials) = DENIALS.lock() {
        denials.insert(0, denial);
        if denials.len() > MAX_DENIALS {
            denials.truncate(MAX_DENIALS);
        }
    }
}

pub fn get_auto_mode_denials() -> Vec<AutoModeDenial> {
    DENIALS.lock().map(|d| d.clone()).unwrap_or_default()
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_record_auto_mode_denial() {
        let denial = AutoModeDenial {
            tool_name: "Bash".to_string(),
            display: "ls -la".to_string(),
            reason: "Command denied".to_string(),
            timestamp: 1234567890,
        };
        record_auto_mode_denial(denial);
        let denials = get_auto_mode_denials();
        assert_eq!(denials.len(), 1);
    }
}