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 WorkloadContext {
    pub task_id: String,
    pub session_id: String,
    pub parent_task_id: Option<String>,
    pub priority: TaskPriority,
    pub metadata: serde_json::Value,
}

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum TaskPriority {
    Low,
    Normal,
    High,
    Critical,
}

impl TaskPriority {
    pub fn as_u8(&self) -> u8 {
        match self {
            TaskPriority::Low => 0,
            TaskPriority::Normal => 1,
            TaskPriority::High => 2,
            TaskPriority::Critical => 3,
        }
    }

    pub fn from_u8(v: u8) -> Self {
        match v {
            0 => TaskPriority::Low,
            1 => TaskPriority::Normal,
            2 => TaskPriority::High,
            _ => TaskPriority::Critical,
        }
    }
}

impl WorkloadContext {
    pub fn new(task_id: String, session_id: String) -> Self {
        Self {
            task_id,
            session_id,
            parent_task_id: None,
            priority: TaskPriority::Normal,
            metadata: serde_json::json!({}),
        }
    }

    pub fn with_parent(mut self, parent_id: String) -> Self {
        self.parent_task_id = Some(parent_id);
        self
    }

    pub fn with_priority(mut self, priority: TaskPriority) -> Self {
        self.priority = priority;
        self
    }

    pub fn with_metadata(mut self, metadata: serde_json::Value) -> Self {
        self.metadata = metadata;
        self
    }
}

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

    #[test]
    fn test_workload_context() {
        let ctx = WorkloadContext::new("task1".to_string(), "session1".to_string());
        assert_eq!(ctx.task_id, "task1");
        assert_eq!(ctx.priority, TaskPriority::Normal);
    }
}