use crate::agent::AgentState;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum StreamType {
MessageStream, DataStream, EventStream, CommandStream, }
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum AgentMessage {
TaskRequest {
task_id: String,
content: String,
},
TaskResponse {
task_id: String,
result: String,
status: TaskStatus,
},
StateSync {
agent_id: String,
state: AgentState,
},
Event(AgentEvent),
StreamMessage {
stream_id: String,
message: Vec<u8>,
sequence: u64,
},
StreamControl {
stream_id: String,
command: StreamControlCommand,
metadata: std::collections::HashMap<String, String>,
}, }
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub enum TaskStatus {
Success,
Failed,
Pending,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AgentEvent {
TaskReceived(TaskRequest), TaskPreempted(String), Shutdown, Custom(String, Vec<u8>),
StreamMessage {
stream_id: String,
message: Vec<u8>,
sequence: u64,
},
StreamCreated {
stream_id: String,
stream_type: StreamType,
metadata: std::collections::HashMap<String, String>,
},
StreamClosed {
stream_id: String,
reason: String,
},
StreamSubscription {
stream_id: String,
subscriber_id: String,
},
StreamUnsubscription {
stream_id: String,
subscriber_id: String,
}, }
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub struct TaskRequest {
pub task_id: String,
pub content: String,
pub priority: TaskPriority,
pub deadline: Option<std::time::Duration>, pub metadata: std::collections::HashMap<String, String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
pub enum TaskPriority {
Critical = 0,
Highest = 1,
High = 2,
Medium = 3,
Normal = 4,
Low = 5,
}
impl PartialOrd for TaskPriority {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
impl Ord for TaskPriority {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
match (self, other) {
(TaskPriority::Critical, _) => std::cmp::Ordering::Greater,
(_, TaskPriority::Critical) => std::cmp::Ordering::Less,
(TaskPriority::High, TaskPriority::Medium | TaskPriority::Low) => {
std::cmp::Ordering::Greater
}
(TaskPriority::Medium, TaskPriority::Low) => std::cmp::Ordering::Greater,
(TaskPriority::Low, TaskPriority::Medium | TaskPriority::High) => {
std::cmp::Ordering::Less
}
(TaskPriority::Medium, TaskPriority::High) => std::cmp::Ordering::Less,
(a, b) if a == b => std::cmp::Ordering::Equal,
_ => unreachable!("All cases should be covered"),
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum StreamControlCommand {
Create(StreamType), Close(String), Subscribe, Unsubscribe, Pause, Resume, Seek(u64), }
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum SchedulingStatus {
Pending,
Running,
Preempted, Completed,
Failed,
}