systemprompt_cli/commands/admin/agents/
show.rs1use anyhow::{Context, Result, anyhow};
7use clap::Args;
8
9use super::types::AgentDetailOutput;
10use crate::CliConfig;
11use crate::interactive::{Prompter, resolve_required};
12use crate::shared::CommandOutput;
13use systemprompt_loader::ConfigLoader;
14
15#[derive(Debug, Args)]
16pub struct ShowArgs {
17 #[arg(help = "Agent name (required in non-interactive mode)")]
18 pub name: Option<String>,
19}
20
21pub(super) fn execute(
22 args: ShowArgs,
23 prompter: &dyn Prompter,
24 config: &CliConfig,
25) -> Result<CommandOutput> {
26 let services_config = ConfigLoader::load().context("Failed to load services configuration")?;
27
28 let name = resolve_required(args.name, "name", config, || {
29 super::shared::prompt_agent_selection(prompter, "Select agent", &services_config)
30 })?;
31
32 let agent = services_config
33 .agents
34 .get(&name)
35 .ok_or_else(|| anyhow!("Agent '{}' not found", name))?;
36
37 let provider = agent
38 .metadata
39 .provider
40 .clone()
41 .unwrap_or_else(|| "-".to_owned());
42 let model = agent
43 .metadata
44 .model
45 .clone()
46 .unwrap_or_else(|| "-".to_owned());
47
48 let output = AgentDetailOutput {
49 name: agent.name.clone(),
50 display_name: agent.card.display_name.clone(),
51 description: agent.card.description.clone(),
52 port: agent.port,
53 endpoint: agent.endpoint.clone(),
54 enabled: agent.enabled,
55 provider,
56 model,
57 mcp_servers: agent.metadata.mcp_servers.include.clone(),
58 skills_count: agent.metadata.skills.include.len(),
59 };
60
61 Ok(CommandOutput::card_value(
62 format!("Agent: {}", name),
63 &output,
64 ))
65}