Skip to main content

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    #[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        // Sort by name for consistent output
56        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}