use serde::{Deserialize, Serialize}; use crate::ids::{AgentId, ThreadId}; use crate::message::{AgentContent, Role}; #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum ActionType { NewAgent, IngestFile, NewThread, AddMessage, RunThread, CheckThread, Shutdown, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct NewAgentAction { pub agent_id: Option, pub agent_name: String, pub agent_instructions: String, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct IngestFileAction { pub agent_id: AgentId, pub file_path: String, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct NewThreadAction { pub agent_id: AgentId, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct CheckThreadAction { pub agent_id: AgentId, pub thread_id: ThreadId, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct AddMessageAction { pub agent_id: AgentId, pub thread_id: ThreadId, pub message_role: Role, pub message_content: AgentContent, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct RunThreadAction { pub agent_id: AgentId, pub thread_id: ThreadId, } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde( tag = "action_type", content = "action_data", rename_all = "snake_case" )] pub enum AgiAction { NewAgent(NewAgentAction), IngestFile(IngestFileAction), NewThread(NewThreadAction), AddMessage(AddMessageAction), RunThread(RunThreadAction), CheckThread(CheckThreadAction), Shutdown, } impl AgiAction { pub fn action_type(&self) -> ActionType { match self { Self::NewAgent(_) => ActionType::NewAgent, Self::IngestFile(_) => ActionType::IngestFile, Self::NewThread(_) => ActionType::NewThread, Self::AddMessage(_) => ActionType::AddMessage, Self::RunThread(_) => ActionType::RunThread, Self::CheckThread(_) => ActionType::CheckThread, Self::Shutdown => ActionType::Shutdown, } } }