ralph_workflow/diagnostics/
agents.rs1use crate::agents::AgentRegistry;
4
5#[derive(Debug)]
7pub struct AgentDiagnostics {
8 pub total_agents: usize,
9 pub available_agents: usize,
10 pub unavailable_agents: usize,
11 pub agent_status: Vec<AgentStatus>,
12}
13
14#[derive(Debug)]
16pub struct AgentStatus {
17 pub name: String,
18 pub display_name: String,
19 pub available: bool,
20 pub json_parser: String,
21 pub command: String,
22}
23
24impl AgentDiagnostics {
25 #[must_use]
27 pub fn test(registry: &AgentRegistry) -> Self {
28 let all_agents = registry.list();
29 let mut agent_status = Vec::new();
30 let mut available_count = 0;
31
32 for (name, cfg) in &all_agents {
33 let available = registry.is_agent_available(name);
34 if available {
35 available_count += 1;
36 }
37
38 agent_status.push(AgentStatus {
39 name: name.to_string(),
40 display_name: registry.display_name(name),
41 available,
42 json_parser: format!("{:?}", cfg.json_parser),
43 command: cfg
44 .cmd
45 .split_whitespace()
46 .next()
47 .unwrap_or(&cfg.cmd)
48 .to_string(),
49 });
50 }
51
52 let total_agents = all_agents.len();
53 let unavailable_agents = total_agents - available_count;
54
55 agent_status.sort_by(|a, b| a.name.cmp(&b.name));
57
58 Self {
59 total_agents,
60 available_agents: available_count,
61 unavailable_agents,
62 agent_status,
63 }
64 }
65}