use async_trait::async_trait;
use serde::{Deserialize, Serialize};
#[async_trait]
pub trait Agent: Send + Sync {
fn id(&self) -> &str;
fn name(&self) -> &str;
fn capabilities(&self) -> &[String];
async fn execute(&self, task: Task) -> crate::Result<TaskResult>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Task {
pub id: String,
pub description: String,
pub context: serde_json::Value,
pub dependencies: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskResult {
pub task_id: String,
pub status: TaskStatus,
pub output: serde_json::Value,
pub error: Option<String>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum TaskStatus {
Pending,
Running,
Completed,
Failed,
}