ai-agent 0.13.4

Idiomatic agent sdk inspired by the claude code source leak
Documentation
// Source: /data/home/swei/claudecode/openclaudecode/src/utils/timeouts.ts
use std::collections::HashMap;

const DEFAULT_TIMEOUT_MS: u64 = 120_000;
const MAX_TIMEOUT_MS: u64 = 600_000;

pub fn get_default_bash_timeout_ms(env: Option<&HashMap<String, String>>) -> u64 {
    let env = env.unwrap_or(&HashMap::new());

    if let Some(value) = env.get("BASH_DEFAULT_TIMEOUT_MS") {
        if let Ok(parsed) = value.parse::<u64>() {
            if parsed > 0 {
                return parsed;
            }
        }
    }
    DEFAULT_TIMEOUT_MS
}

pub fn get_max_bash_timeout_ms(env: Option<&HashMap<String, String>>) -> u64 {
    let env = env.unwrap_or(&HashMap::new());

    if let Some(value) = env.get("BASH_MAX_TIMEOUT_MS") {
        if let Ok(parsed) = value.parse::<u64>() {
            if parsed > 0 {
                return parsed.max(get_default_bash_timeout_ms(Some(env)));
            }
        }
    }
    MAX_TIMEOUT_MS.max(get_default_bash_timeout_ms(env))
}

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

    #[test]
    fn test_default_timeout() {
        assert_eq!(get_default_bash_timeout_ms(None), DEFAULT_TIMEOUT_MS);
    }

    #[test]
    fn test_env_override() {
        let mut env = HashMap::new();
        env.insert("BASH_DEFAULT_TIMEOUT_MS".to_string(), "60000".to_string());
        assert_eq!(get_default_bash_timeout_ms(Some(&env)), 60000);
    }
}