ralph_workflow/diagnostics/
agents.rs

1//! Agent diagnostics and availability testing.
2
3use crate::agents::AgentRegistry;
4
5/// Agent diagnostics.
6#[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/// Individual agent status.
15#[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    /// Test agent availability.
26    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        // Sort by name for consistent output
55        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}