use auths_id::keri::types::Prefix;
use serde::Serialize;
use crate::context::AuthsContext;
use crate::domains::org::delegation::list_members;
use crate::domains::org::error::OrgError;
use crate::domains::org::trace::walk_delegation_chain;
#[derive(Debug, Clone, Serialize)]
pub struct FleetMetrics {
pub org_did: String,
pub agents_total: usize,
pub agents_live: usize,
pub agents_revoked: usize,
pub agents_traceable_to_human: usize,
pub traceability_fraction: f64,
pub revocation_effect_latency_positions: u128,
}
pub fn fleet_metrics(ctx: &AuthsContext, org_prefix: &Prefix) -> Result<FleetMetrics, OrgError> {
let members = list_members(ctx, org_prefix)?;
let agents_total = members.len();
let agents_revoked = members.iter().filter(|m| m.revoked).count();
let agents_live = agents_total - agents_revoked;
let mut traceable = 0usize;
for member in members.iter().filter(|m| !m.revoked) {
let prefix = Prefix::new_unchecked(member.member_prefix.clone());
if let Ok(chain) = walk_delegation_chain(ctx, &prefix, None)
&& chain.depth >= 1
{
traceable += 1;
}
}
let traceability_fraction = if agents_live == 0 {
1.0
} else {
traceable as f64 / agents_live as f64
};
Ok(FleetMetrics {
org_did: format!("did:keri:{}", org_prefix.as_str()),
agents_total,
agents_live,
agents_revoked,
agents_traceable_to_human: traceable,
traceability_fraction,
revocation_effect_latency_positions: 0,
})
}