Skip to main content

systemprompt_cli/commands/admin/agents/
show.rs

1use 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}