1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
6pub enum AgentRole {
7 #[serde(rename = "ROUTA")]
8 Routa,
9 #[serde(rename = "CRAFTER")]
10 Crafter,
11 #[serde(rename = "GATE")]
12 Gate,
13 #[serde(rename = "DEVELOPER")]
14 Developer,
15}
16
17impl AgentRole {
18 pub fn as_str(&self) -> &'static str {
19 match self {
20 Self::Routa => "ROUTA",
21 Self::Crafter => "CRAFTER",
22 Self::Gate => "GATE",
23 Self::Developer => "DEVELOPER",
24 }
25 }
26
27 #[allow(clippy::should_implement_trait)]
28 pub fn from_str(s: &str) -> Option<Self> {
29 match s {
30 "ROUTA" => Some(Self::Routa),
31 "CRAFTER" => Some(Self::Crafter),
32 "GATE" => Some(Self::Gate),
33 "DEVELOPER" => Some(Self::Developer),
34 _ => None,
35 }
36 }
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
40pub enum ModelTier {
41 #[serde(rename = "SMART")]
42 Smart,
43 #[serde(rename = "BALANCED")]
44 Balanced,
45 #[serde(rename = "FAST")]
46 Fast,
47}
48
49impl ModelTier {
50 pub fn as_str(&self) -> &'static str {
51 match self {
52 Self::Smart => "SMART",
53 Self::Balanced => "BALANCED",
54 Self::Fast => "FAST",
55 }
56 }
57
58 #[allow(clippy::should_implement_trait)]
59 pub fn from_str(s: &str) -> Option<Self> {
60 match s {
61 "SMART" => Some(Self::Smart),
62 "BALANCED" => Some(Self::Balanced),
63 "FAST" => Some(Self::Fast),
64 _ => None,
65 }
66 }
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
70pub enum AgentStatus {
71 #[serde(rename = "PENDING")]
72 Pending,
73 #[serde(rename = "ACTIVE")]
74 Active,
75 #[serde(rename = "COMPLETED")]
76 Completed,
77 #[serde(rename = "ERROR")]
78 Error,
79 #[serde(rename = "CANCELLED")]
80 Cancelled,
81}
82
83impl AgentStatus {
84 pub fn as_str(&self) -> &'static str {
85 match self {
86 Self::Pending => "PENDING",
87 Self::Active => "ACTIVE",
88 Self::Completed => "COMPLETED",
89 Self::Error => "ERROR",
90 Self::Cancelled => "CANCELLED",
91 }
92 }
93
94 #[allow(clippy::should_implement_trait)]
95 pub fn from_str(s: &str) -> Option<Self> {
96 match s {
97 "PENDING" => Some(Self::Pending),
98 "ACTIVE" => Some(Self::Active),
99 "COMPLETED" => Some(Self::Completed),
100 "ERROR" => Some(Self::Error),
101 "CANCELLED" => Some(Self::Cancelled),
102 _ => None,
103 }
104 }
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
108#[serde(rename_all = "camelCase")]
109pub struct Agent {
110 pub id: String,
111 pub name: String,
112 pub role: AgentRole,
113 pub model_tier: ModelTier,
114 pub workspace_id: String,
115 #[serde(skip_serializing_if = "Option::is_none")]
116 pub parent_id: Option<String>,
117 pub status: AgentStatus,
118 pub created_at: DateTime<Utc>,
119 pub updated_at: DateTime<Utc>,
120 #[serde(default)]
121 pub metadata: HashMap<String, String>,
122}
123
124impl Agent {
125 pub fn new(
126 id: String,
127 name: String,
128 role: AgentRole,
129 workspace_id: String,
130 parent_id: Option<String>,
131 model_tier: Option<ModelTier>,
132 metadata: Option<HashMap<String, String>>,
133 ) -> Self {
134 let now = Utc::now();
135 Self {
136 id,
137 name,
138 role,
139 model_tier: model_tier.unwrap_or(ModelTier::Smart),
140 workspace_id,
141 parent_id,
142 status: AgentStatus::Pending,
143 created_at: now,
144 updated_at: now,
145 metadata: metadata.unwrap_or_default(),
146 }
147 }
148}