ai-agent 0.88.0

Idiomatic agent sdk inspired by the claude code source leak
Documentation
pub struct RateLimit {
    pub max_requests: u32,
    pub window_ms: u64,
    pub requests: Vec<u64>,
}

impl RateLimit {
    pub fn new(max_requests: u32, window_ms: u64) -> Self {
        Self {
            max_requests,
            window_ms,
            requests: Vec::new(),
        }
    }

    pub fn try_acquire(&mut self) -> bool {
        let now = std::time::SystemTime::now()
            .duration_since(std::time::UNIX_EPOCH)
            .unwrap()
            .as_millis() as u64;

        self.requests
            .retain(|t| now.saturating_sub(*t) < self.window_ms);

        if self.requests.len() < self.max_requests as usize {
            self.requests.push(now);
            true
        } else {
            false
        }
    }

    pub fn remaining(&self) -> u32 {
        let now = std::time::SystemTime::now()
            .duration_since(std::time::UNIX_EPOCH)
            .unwrap()
            .as_millis() as u64;

        let active = self
            .requests
            .iter()
            .filter(|t| now.saturating_sub(**t) < self.window_ms)
            .count();
        self.max_requests.saturating_sub(active as u32)
    }

    pub fn reset(&mut self) {
        self.requests.clear();
    }
}