Skip to main content

systemprompt_cli/commands/admin/agents/
show.rs

1//! `admin agents show` command.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use 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}