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