#![allow(dead_code)]
use std::cell::RefCell;
#[derive(Debug, Clone)]
pub struct AutoModeDenial {
pub tool_name: String,
pub display: String,
pub reason: String,
pub timestamp: u64,
}
thread_local! {
static DENIALS: RefCell<Vec<AutoModeDenial>> = const { RefCell::new(Vec::new()) };
}
const MAX_DENIALS: usize = 20;
pub fn record_auto_mode_denial(denial: AutoModeDenial) {
if !is_transcript_classifier_enabled() {
return;
}
DENIALS.with(|denials| {
let mut d = denials.borrow_mut();
d.insert(0, denial);
if d.len() > MAX_DENIALS {
d.truncate(MAX_DENIALS);
}
});
}
pub fn get_auto_mode_denials() -> Vec<AutoModeDenial> {
DENIALS.with(|denials| denials.borrow().clone())
}
fn is_transcript_classifier_enabled() -> bool {
std::env::var("AI_CODE_ENABLE_TRANSCRIPT_CLASSIFIER")
.map(|v| v == "1" || v.to_lowercase() == "true")
.unwrap_or(false)
}
#[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();
}
#[test]
fn test_max_denials() {
for i in 0..25 {
let denial = AutoModeDenial {
tool_name: "Bash".to_string(),
display: format!("cmd-{i}"),
reason: "denied".to_string(),
timestamp: i,
};
record_auto_mode_denial(denial);
}
let denials = get_auto_mode_denials();
assert!(denials.len() <= MAX_DENIALS);
}
}