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 pub fn test(registry: &AgentRegistry) -> Self {
27 let all_agents = registry.list();
28 let mut agent_status = Vec::new();
29 let mut available_count = 0;
30
31 for (name, cfg) in &all_agents {
32 let available = registry.is_agent_available(name);
33 if available {
34 available_count += 1;
35 }
36
37 agent_status.push(AgentStatus {
38 name: name.to_string(),
39 display_name: registry.display_name(name),
40 available,
41 json_parser: format!("{:?}", cfg.json_parser),
42 command: cfg
43 .cmd
44 .split_whitespace()
45 .next()
46 .unwrap_or(&cfg.cmd)
47 .to_string(),
48 });
49 }
50
51 let total_agents = all_agents.len();
52 let unavailable_agents = total_agents - available_count;
53
54 agent_status.sort_by(|a, b| a.name.cmp(&b.name));
56
57 Self {
58 total_agents,
59 available_agents: available_count,
60 unavailable_agents,
61 agent_status,
62 }
63 }
64}