feagi_agent/command_and_control/
agent_registration_message.rs1use crate::{AgentCapabilities, AgentDescriptor, AuthToken, FeagiApiVersion};
2use feagi_io::traits_and_enums::shared::{
3 TransportProtocolEndpoint, TransportProtocolImplementation,
4};
5use feagi_io::AgentID;
6use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8
9#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
10#[serde(rename_all = "snake_case")]
11pub enum AgentRegistrationMessage {
12 ClientRequestRegistration(RegistrationRequest),
13 ServerRespondsRegistration(RegistrationResponse),
14 ClientRequestDeregistration(DeregistrationRequest),
19 ServerRespondsDeregistration(DeregistrationResponse),
24}
25
26#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
29pub struct RegistrationRequest {
30 agent_descriptor: AgentDescriptor,
31 auth_token: AuthToken,
32 requested_capabilities: Vec<AgentCapabilities>,
33 connection_protocol: TransportProtocolImplementation,
34 api_version: FeagiApiVersion,
35}
36
37impl RegistrationRequest {
38 pub const MAX_REQUEST_SIZE: usize = 1024;
40
41 pub fn new(
49 agent_descriptor: AgentDescriptor,
50 auth_token: AuthToken,
51 requested_capabilities: Vec<AgentCapabilities>,
52 connection_protocol: TransportProtocolImplementation,
53 ) -> Self {
54 Self {
55 agent_descriptor,
56 auth_token,
57 requested_capabilities,
58 connection_protocol,
59 api_version: FeagiApiVersion::get_current_api_version(),
60 }
61 }
62
63 pub fn api_version(&self) -> &FeagiApiVersion {
65 &self.api_version
66 }
67
68 pub fn agent_descriptor(&self) -> &AgentDescriptor {
70 &self.agent_descriptor
71 }
72
73 pub fn auth_token(&self) -> &AuthToken {
75 &self.auth_token
76 }
77
78 pub fn requested_capabilities(&self) -> &[AgentCapabilities] {
80 &self.requested_capabilities
81 }
82
83 pub fn connection_protocol(&self) -> &TransportProtocolImplementation {
85 &self.connection_protocol
86 }
87}
88
89#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
94#[serde(rename_all = "snake_case")]
95pub enum RegistrationResponse {
96 FailedInvalidRequest, FailedInvalidAuth, AlreadyRegistered,
99 Success(
100 AgentID,
101 HashMap<AgentCapabilities, TransportProtocolEndpoint>,
102 ),
103}
104
105#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
114pub struct DeregistrationRequest {
115 reason: Option<String>,
116}
117
118impl DeregistrationRequest {
119 pub fn new(reason: Option<String>) -> Self {
121 Self { reason }
122 }
123
124 pub fn reason(&self) -> Option<&str> {
126 self.reason.as_deref()
127 }
128}
129
130#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
132#[serde(rename_all = "snake_case")]
133pub enum DeregistrationResponse {
134 Success,
135 NotRegistered,
136}
137
138#[cfg(test)]
141mod tests {
142 use super::{AgentRegistrationMessage, DeregistrationRequest, DeregistrationResponse};
143
144 #[test]
145 fn deregistration_request_round_trip_serialization_preserves_reason() {
146 let request = AgentRegistrationMessage::ClientRequestDeregistration(
147 DeregistrationRequest::new(Some("shutdown".to_string())),
148 );
149 let encoded =
150 serde_json::to_string(&request).expect("deregistration request should serialize");
151 let decoded: AgentRegistrationMessage =
152 serde_json::from_str(&encoded).expect("deregistration request should deserialize");
153 assert_eq!(request, decoded);
154 }
155
156 #[test]
157 fn deregistration_response_round_trip_serialization_preserves_variant() {
158 let response = AgentRegistrationMessage::ServerRespondsDeregistration(
159 DeregistrationResponse::NotRegistered,
160 );
161 let encoded =
162 serde_json::to_string(&response).expect("deregistration response should serialize");
163 let decoded: AgentRegistrationMessage =
164 serde_json::from_str(&encoded).expect("deregistration response should deserialize");
165 assert_eq!(response, decoded);
166 }
167}