use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use chrono::{DateTime, Utc};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskRequest {
pub task: String,
pub task_id: Option<String>,
pub context: Option<TaskContext>,
pub priority: Option<TaskPriority>,
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskContext {
pub working_directory: Option<String>,
pub environment: Option<HashMap<String, String>>,
pub tools: Option<Vec<String>>,
pub constraints: Option<TaskConstraints>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskConstraints {
pub max_execution_time: Option<u64>,
pub max_steps: Option<u32>,
pub allowed_paths: Option<Vec<String>>,
pub forbidden_operations: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum TaskPriority {
Low,
Normal,
High,
Critical,
}
impl Default for TaskPriority {
fn default() -> Self {
TaskPriority::Normal
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskResponse {
pub task_id: String,
pub status: TaskStatus,
pub result: Option<TaskResult>,
pub plan: Option<TaskPlan>,
pub steps: Vec<ExecutionStep>,
pub metrics: TaskMetrics,
pub error: Option<ServiceError>,
pub created_at: DateTime<Utc>,
pub started_at: Option<DateTime<Utc>>,
pub completed_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum TaskStatus {
Queued,
Running,
Completed,
Failed,
Cancelled,
Timeout,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct TaskResult {
#[serde(default)]
pub success: bool,
#[serde(default)]
pub summary: String,
#[serde(default)]
pub details: Option<String>,
#[serde(default)]
pub artifacts: Vec<TaskArtifact>,
#[serde(default)]
pub execution_time: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskArtifact {
pub artifact_type: ArtifactType,
pub name: String,
pub content: Option<String>,
pub size: Option<u64>,
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ArtifactType {
File,
Text,
Json,
Image,
Log,
Report,
Other(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskPlan {
pub understanding: String,
pub approach: String,
pub complexity: TaskComplexity,
pub estimated_steps: u32,
pub requirements: Vec<String>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum TaskComplexity {
Simple,
Moderate,
Complex,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionStep {
pub step_number: u32,
pub step_type: StepType,
pub description: String,
pub input: Option<serde_json::Value>,
pub output: Option<serde_json::Value>,
pub status: StepStatus,
pub error: Option<String>,
pub execution_time_ms: u64,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum StepType {
Analysis,
Planning,
ToolUse,
Execution,
Verification,
Completion,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum StepStatus {
Pending,
Running,
Completed,
Failed,
Skipped,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskMetrics {
pub total_execution_time: u64,
pub planning_time_ms: u64,
pub execution_time_ms: u64,
pub steps_executed: u32,
pub tools_used: u32,
pub memory_usage_mb: Option<f64>,
pub cpu_usage_percent: Option<f64>,
pub custom_metrics: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServiceError {
pub code: String,
pub message: String,
pub details: Option<String>,
pub stack_trace: Option<String>,
pub timestamp: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServiceStatus {
pub name: String,
pub version: String,
pub status: ServiceHealth,
pub uptime_seconds: u64,
pub active_tasks: u32,
pub completed_tasks: u64,
pub failed_tasks: u64,
pub available_tools: Vec<String>,
pub system_metrics: SystemMetrics,
pub last_updated: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ServiceHealth {
Healthy,
Degraded,
Unhealthy,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SystemMetrics {
pub cpu_usage_percent: f64,
pub memory_usage_mb: f64,
pub disk_usage_mb: f64,
pub network_io: NetworkMetrics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkMetrics {
pub bytes_received: u64,
pub bytes_sent: u64,
pub active_connections: u32,
}
impl Default for NetworkMetrics {
fn default() -> Self {
Self {
bytes_received: 0,
bytes_sent: 0,
active_connections: 0,
}
}
}
impl Default for SystemMetrics {
fn default() -> Self {
Self {
cpu_usage_percent: 0.0,
memory_usage_mb: 0.0,
disk_usage_mb: 0.0,
network_io: NetworkMetrics::default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServiceConfig {
pub max_concurrent_tasks: u32,
pub default_task_timeout: u64,
pub max_task_timeout: u64,
pub enable_metrics: bool,
pub log_level: String,
pub cors: CorsConfig,
pub rate_limiting: Option<RateLimitConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CorsConfig {
pub allowed_origins: Vec<String>,
pub allowed_methods: Vec<String>,
pub allowed_headers: Vec<String>,
pub allow_credentials: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RateLimitConfig {
pub requests_per_minute: u32,
pub burst_size: u32,
pub cleanup_interval_seconds: u64,
}
impl Default for ServiceConfig {
fn default() -> Self {
Self {
max_concurrent_tasks: 10,
default_task_timeout: 300, max_task_timeout: 3600, enable_metrics: true,
log_level: "info".to_string(),
cors: CorsConfig {
allowed_origins: vec!["*".to_string()],
allowed_methods: vec!["GET".to_string(), "POST".to_string(), "DELETE".to_string()],
allowed_headers: vec!["*".to_string()],
allow_credentials: false,
},
rate_limiting: Some(RateLimitConfig {
requests_per_minute: 60,
burst_size: 10,
cleanup_interval_seconds: 300,
}),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchTaskRequest {
pub tasks: Vec<TaskRequest>,
pub mode: BatchExecutionMode,
pub continue_on_error: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum BatchExecutionMode {
Sequential,
Parallel,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchTaskResponse {
pub batch_id: String,
pub responses: Vec<TaskResponse>,
pub statistics: BatchStatistics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchStatistics {
pub total_tasks: u32,
pub completed_tasks: u32,
pub failed_tasks: u32,
pub total_execution_time: u64,
pub average_execution_time: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", content = "data")]
pub enum WebSocketMessage {
TaskUpdate { task_id: String, status: TaskStatus },
TaskProgress { task_id: String, progress: f64, message: Option<String> },
StepUpdate { task_id: String, step: ExecutionStep },
TaskCompleted { task_id: String, result: TaskResult },
TaskFailed { task_id: String, error: ServiceError },
ServiceStatus { status: ServiceStatus },
Heartbeat { timestamp: DateTime<Utc> },
}