systemprompt-cli 0.1.22

systemprompt.io OS - CLI for agent orchestration, AI operations, and system management
Documentation
use anyhow::Result;
use systemprompt_logging::CliService;
use systemprompt_models::ProfileBootstrap;
use systemprompt_models::profile::TierMultipliers;

use super::helpers::apply_multiplier;
use crate::CliConfig;
use crate::cli_settings::OutputFormat;
use crate::shared::{CommandResult, render_result};

use super::super::types::{CompareOutput, EndpointComparison, ValidateOutput};

pub fn execute_validate(config: &CliConfig) -> Result<()> {
    let profile = ProfileBootstrap::get()?;
    let limits = &profile.rate_limits;

    let mut errors: Vec<String> = Vec::new();
    let mut warnings: Vec<String> = Vec::new();

    if limits.oauth_public_per_second == 0 {
        errors.push("oauth_public_per_second is 0".to_string());
    }
    if limits.oauth_auth_per_second == 0 {
        errors.push("oauth_auth_per_second is 0".to_string());
    }
    if limits.contexts_per_second == 0 {
        errors.push("contexts_per_second is 0".to_string());
    }
    if limits.tasks_per_second == 0 {
        errors.push("tasks_per_second is 0".to_string());
    }
    if limits.artifacts_per_second == 0 {
        errors.push("artifacts_per_second is 0".to_string());
    }
    if limits.agents_per_second == 0 {
        errors.push("agents_per_second is 0".to_string());
    }
    if limits.mcp_per_second == 0 {
        errors.push("mcp_per_second is 0".to_string());
    }
    if limits.stream_per_second == 0 {
        errors.push("stream_per_second is 0".to_string());
    }
    if limits.content_per_second == 0 {
        errors.push("content_per_second is 0".to_string());
    }

    let tiers = &limits.tier_multipliers;
    if tiers.anon >= tiers.user {
        warnings.push(format!(
            "anon multiplier ({:.1}) >= user multiplier ({:.1})",
            tiers.anon, tiers.user
        ));
    }
    if tiers.user >= tiers.admin {
        warnings.push(format!(
            "user multiplier ({:.1}) >= admin multiplier ({:.1})",
            tiers.user, tiers.admin
        ));
    }

    if tiers.admin <= 0.0 {
        errors.push("admin multiplier must be positive".to_string());
    }
    if tiers.user <= 0.0 {
        errors.push("user multiplier must be positive".to_string());
    }
    if tiers.anon <= 0.0 {
        errors.push("anon multiplier must be positive".to_string());
    }
    if tiers.a2a <= 0.0 {
        errors.push("a2a multiplier must be positive".to_string());
    }
    if tiers.mcp <= 0.0 {
        errors.push("mcp multiplier must be positive".to_string());
    }
    if tiers.service <= 0.0 {
        errors.push("service multiplier must be positive".to_string());
    }

    if limits.burst_multiplier == 0 {
        errors.push("burst_multiplier is 0".to_string());
    }
    if limits.burst_multiplier > 10 {
        warnings.push(format!(
            "burst_multiplier {} exceeds recommended maximum of 10",
            limits.burst_multiplier
        ));
    }

    if limits.disabled {
        warnings.push("Rate limiting is currently DISABLED".to_string());
    }

    let valid = errors.is_empty();
    let output = ValidateOutput {
        valid,
        errors,
        warnings,
    };

    render_result(&CommandResult::card(output).with_title("Rate Limits Validation"));

    if config.output_format() == OutputFormat::Table {
        if valid {
            CliService::success("Configuration is valid");
        } else {
            CliService::error("Configuration has errors");
        }
    }

    Ok(())
}

pub fn execute_compare(config: &CliConfig) -> Result<()> {
    let profile = ProfileBootstrap::get()?;
    let limits = &profile.rate_limits;
    let tiers = &limits.tier_multipliers;

    let endpoints = vec![
        create_comparison("OAuth Public", limits.oauth_public_per_second, tiers),
        create_comparison("OAuth Auth", limits.oauth_auth_per_second, tiers),
        create_comparison("Contexts", limits.contexts_per_second, tiers),
        create_comparison("Tasks", limits.tasks_per_second, tiers),
        create_comparison("Artifacts", limits.artifacts_per_second, tiers),
        create_comparison("Agent Registry", limits.agent_registry_per_second, tiers),
        create_comparison("Agents", limits.agents_per_second, tiers),
        create_comparison("MCP Registry", limits.mcp_registry_per_second, tiers),
        create_comparison("MCP", limits.mcp_per_second, tiers),
        create_comparison("Stream (SSE)", limits.stream_per_second, tiers),
        create_comparison("Content", limits.content_per_second, tiers),
    ];

    let output = CompareOutput { endpoints };

    render_result(&CommandResult::table(output).with_title("Rate Limits Comparison"));

    if config.output_format() == OutputFormat::Table && limits.disabled {
        CliService::warning("Rate limiting is currently DISABLED");
    }

    Ok(())
}

fn create_comparison(name: &str, base: u64, tiers: &TierMultipliers) -> EndpointComparison {
    EndpointComparison {
        endpoint: name.to_string(),
        admin: apply_multiplier(base, tiers.admin),
        user: apply_multiplier(base, tiers.user),
        a2a: apply_multiplier(base, tiers.a2a),
        mcp: apply_multiplier(base, tiers.mcp),
        service: apply_multiplier(base, tiers.service),
        anon: apply_multiplier(base, tiers.anon),
    }
}