systemprompt-cli 0.2.1

Unified CLI for systemprompt.io AI governance: agent orchestration, MCP governance, analytics, profiles, cloud deploy, and self-hosted operations.
Documentation
use crate::shared::{CommandResult, render_result};
use serde_json::Value;
use systemprompt_logging::{
    AiRequestSummary, ExecutionStepSummary, McpExecutionSummary, TraceEvent,
};

pub fn print_json(
    events: &[TraceEvent],
    trace_id: &str,
    ai_summary: &AiRequestSummary,
    mcp_summary: &McpExecutionSummary,
    step_summary: &ExecutionStepSummary,
) {
    let json_events: Vec<Value> = events
        .iter()
        .map(|e| {
            let mut obj = serde_json::Map::new();
            obj.insert("type".to_string(), Value::String(e.event_type.clone()));
            obj.insert(
                "timestamp".to_string(),
                Value::String(e.timestamp.format("%Y-%m-%d %H:%M:%S%.3f").to_string()),
            );
            obj.insert("details".to_string(), Value::String(e.details.clone()));

            if let Some(ref user_id) = e.user_id {
                obj.insert("user_id".to_string(), Value::String(user_id.to_string()));
            }
            if let Some(ref session_id) = e.session_id {
                obj.insert(
                    "session_id".to_string(),
                    Value::String(session_id.to_string()),
                );
            }
            if let Some(ref task_id) = e.task_id {
                obj.insert("task_id".to_string(), Value::String(task_id.to_string()));
            }
            if let Some(ref context_id) = e.context_id {
                obj.insert(
                    "context_id".to_string(),
                    Value::String(context_id.to_string()),
                );
            }
            if let Some(ref metadata) = e.metadata {
                if let Ok(parsed) = serde_json::from_str::<Value>(metadata) {
                    obj.insert("metadata".to_string(), parsed);
                }
            }

            Value::Object(obj)
        })
        .collect();

    let output = serde_json::json!({
        "trace_id": trace_id,
        "events": json_events,
        "count": events.len(),
        "ai_summary": {
            "request_count": ai_summary.request_count,
            "total_tokens": ai_summary.total_tokens,
            "input_tokens": ai_summary.total_input_tokens,
            "output_tokens": ai_summary.total_output_tokens,
            "cost_microdollars": ai_summary.total_cost_microdollars,
            "total_latency_ms": ai_summary.total_latency_ms,
        },
        "mcp_summary": {
            "execution_count": mcp_summary.execution_count,
            "total_execution_time_ms": mcp_summary.total_execution_time_ms,
        },
        "step_summary": {
            "step_count": step_summary.total,
            "completed_count": step_summary.completed,
            "failed_count": step_summary.failed,
            "pending_count": step_summary.pending,
        }
    });

    let result = CommandResult::copy_paste(output).with_title("Trace JSON");
    render_result(&result);
}