ai-agent 0.13.4

Idiomatic agent sdk inspired by the claude code source leak
Documentation
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParsedAgentId {
    pub agent_name: String,
    pub team_name: String,
}

pub fn format_agent_id(agent_name: &str, team_name: &str) -> String {
    format!("{}@{}", agent_name, team_name)
}

pub fn parse_agent_id(agent_id: &str) -> Option<ParsedAgentId> {
    let at_index = agent_id.find('@')?;
    Some(ParsedAgentId {
        agent_name: agent_id[..at_index].to_string(),
        team_name: agent_id[at_index + 1..].to_string(),
    })
}

pub fn generate_request_id(request_type: &str, agent_id: &str) -> String {
    let timestamp = std::time::SystemTime::now()
        .duration_since(std::time::UNIX_EPOCH)
        .unwrap()
        .as_millis();
    format!("{}-{}@{}", request_type, timestamp, agent_id)
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParsedRequestId {
    pub request_type: String,
    pub timestamp: u64,
    pub agent_id: String,
}

pub fn parse_request_id(request_id: &str) -> Option<ParsedRequestId> {
    let at_index = request_id.find('@')?;

    let prefix = &request_id[..at_index];
    let agent_id = &request_id[at_index + 1..];

    let last_dash_index = prefix.rfind('-')?;
    let request_type = prefix[..last_dash_index].to_string();
    let timestamp_str = &prefix[last_dash_index + 1..];

    let timestamp: u64 = timestamp_str.parse().ok()?;

    Some(ParsedRequestId {
        request_type,
        timestamp,
        agent_id: agent_id.to_string(),
    })
}

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

    #[test]
    fn test_format_agent_id() {
        let id = format_agent_id("team-lead", "my-project");
        assert_eq!(id, "team-lead@my-project");
    }

    #[test]
    fn test_parse_agent_id() {
        let parsed = parse_agent_id("researcher@my-project").unwrap();
        assert_eq!(parsed.agent_name, "researcher");
        assert_eq!(parsed.team_name, "my-project");

        assert!(parse_agent_id("invalid").is_none());
    }

    #[test]
    fn test_generate_and_parse_request_id() {
        let agent_id = "test@project";
        let request_id = generate_request_id("shutdown", agent_id);

        let parsed = parse_request_id(&request_id).unwrap();
        assert_eq!(parsed.request_type, "shutdown");
        assert_eq!(parsed.agent_id, agent_id);
        assert!(parsed.timestamp > 0);
    }
}