tsk/agent/
provider.rs

1use super::{Agent, ClaudeCodeAgent, NoOpAgent};
2use std::sync::Arc;
3
4/// Provider for creating and managing AI agents
5pub struct AgentProvider;
6
7impl AgentProvider {
8    /// Get an agent by name
9    pub fn get_agent(name: &str) -> anyhow::Result<Arc<dyn Agent>> {
10        match name {
11            "claude-code" => Ok(Arc::new(ClaudeCodeAgent::new())),
12            "no-op" => Ok(Arc::new(NoOpAgent)),
13            _ => Err(anyhow::anyhow!("Unknown agent: {}", name)),
14        }
15    }
16
17    /// List all available agents
18    pub fn list_agents() -> Vec<&'static str> {
19        vec!["claude-code", "no-op"]
20    }
21
22    /// Get the default agent name
23    pub fn default_agent() -> &'static str {
24        "claude-code"
25    }
26
27    /// Validate an agent name
28    pub fn is_valid_agent(name: &str) -> bool {
29        Self::list_agents().contains(&name)
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn test_agent_provider_get_agent() {
39        // Test getting a valid agent
40        let agent = AgentProvider::get_agent("claude-code");
41        assert!(agent.is_ok());
42        let agent = agent.unwrap();
43        assert_eq!(agent.name(), "claude-code");
44    }
45
46    #[test]
47    fn test_agent_provider_get_invalid_agent() {
48        // Test getting an invalid agent
49        let agent = AgentProvider::get_agent("invalid-agent");
50        assert!(agent.is_err());
51        let err = agent.err().unwrap();
52        assert!(err.to_string().contains("Unknown agent"));
53    }
54
55    #[test]
56    fn test_agent_provider_list_agents() {
57        let agents = AgentProvider::list_agents();
58        assert!(!agents.is_empty());
59        assert!(agents.contains(&"claude-code"));
60    }
61
62    #[test]
63    fn test_agent_provider_default_agent() {
64        assert_eq!(AgentProvider::default_agent(), "claude-code");
65    }
66
67    #[test]
68    fn test_agent_provider_is_valid_agent() {
69        assert!(AgentProvider::is_valid_agent("claude-code"));
70        assert!(AgentProvider::is_valid_agent("no-op"));
71        assert!(!AgentProvider::is_valid_agent("invalid-agent"));
72    }
73
74    #[test]
75    fn test_agent_provider_get_no_op_agent() {
76        // Test getting the no-op agent
77        let agent = AgentProvider::get_agent("no-op");
78        assert!(agent.is_ok());
79        let agent = agent.unwrap();
80        assert_eq!(agent.name(), "no-op");
81    }
82
83    #[test]
84    fn test_agent_provider_list_includes_no_op() {
85        let agents = AgentProvider::list_agents();
86        assert!(agents.contains(&"no-op"));
87    }
88}