use serde::{Deserialize, Serialize};
use crate::timestamp::Timestamp;
use crate::types::AgentId;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AgentRecord {
pub id: AgentId,
pub display_name: String,
pub created_at: Timestamp,
pub trust_score: f32,
pub confirmed_count: u32,
pub contradicted_count: u32,
}
impl AgentRecord {
pub fn new(id: AgentId, display_name: impl Into<String>) -> Self {
Self {
id,
display_name: display_name.into(),
created_at: Timestamp::now(),
trust_score: 0.5,
confirmed_count: 0,
contradicted_count: 0,
}
}
pub fn update_trust(&mut self) {
let alpha = 1.0_f32;
let beta = 1.0_f32;
self.trust_score = (self.confirmed_count as f32 + alpha)
/ (self.confirmed_count as f32 + self.contradicted_count as f32 + alpha + beta);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_agent_has_neutral_trust() {
let agent = AgentRecord::new(AgentId::new("test").unwrap(), "Test Agent");
assert!((agent.trust_score - 0.5).abs() < f32::EPSILON);
}
#[test]
fn trust_increases_with_confirmations() {
let mut agent = AgentRecord::new(AgentId::new("test").unwrap(), "Test Agent");
agent.confirmed_count = 9;
agent.contradicted_count = 1;
agent.update_trust();
assert!(agent.trust_score > 0.8);
}
#[test]
fn trust_decreases_with_contradictions() {
let mut agent = AgentRecord::new(AgentId::new("test").unwrap(), "Test Agent");
agent.confirmed_count = 2;
agent.contradicted_count = 8;
agent.update_trust();
assert!(agent.trust_score < 0.35);
}
#[test]
fn serde_round_trip() {
let agent = AgentRecord::new(AgentId::new("agent_a").unwrap(), "Agent A");
let bytes = bincode::serialize(&agent).unwrap();
let back: AgentRecord = bincode::deserialize(&bytes).unwrap();
assert_eq!(back.id, agent.id);
assert_eq!(back.display_name, agent.display_name);
}
}