use crate::CliError;
use clap::Subcommand;
use uuid::Uuid;
use vllora_core::mcp::server::VlloraMcp;
use vllora_core::metadata::pool::DbPool;
use vllora_core::metadata::services::project::ProjectServiceImpl;
use vllora_core::metadata::services::trace::TraceServiceImpl as MetadataTraceServiceImpl;
use vllora_core::metadata::DatabaseServiceTrait;
use vllora_core::types::metadata::services::project::ProjectService;
mod call_info;
mod list;
mod overview;
mod run_info;
#[derive(Subcommand)]
pub enum TracesCommands {
List {
#[arg(long, default_value_t = 20)]
limit: i64,
#[arg(long, default_value_t = 0)]
offset: i64,
#[arg(long)]
run_id: Option<String>,
#[arg(long)]
thread_id: Option<String>,
#[arg(long)]
operation_name: Option<String>,
#[arg(long)]
text: Option<String>,
#[arg(long)]
last_n_minutes: Option<i64>,
#[arg(long, default_value = "start_time")]
sort_by: String,
#[arg(long, default_value = "desc")]
sort_order: String,
#[arg(long, default_value = "table")]
output: String,
},
CallInfo {
#[arg(long)]
span_id: String,
#[arg(long, default_value = "table")]
output: String,
},
RunInfo {
#[arg(long)]
run_id: String,
#[arg(long, default_value = "table")]
output: String,
},
Overview {
#[arg(long)]
last_n_minutes: i64,
#[arg(long, default_value = "table")]
output: String,
},
}
pub async fn handle_traces(db_pool: DbPool, cmd: TracesCommands) -> Result<(), CliError> {
let project_service = ProjectServiceImpl::new(db_pool.clone());
let project_slug = project_service
.get_default(Uuid::nil())
.ok()
.map(|p| p.slug);
let trace_service = MetadataTraceServiceImpl::init(db_pool.clone());
let vllora_mcp = VlloraMcp::new(trace_service, project_slug);
match cmd {
TracesCommands::List {
limit,
offset,
run_id,
thread_id,
operation_name,
text,
last_n_minutes,
sort_by,
sort_order,
output,
} => {
list::handle_list(
&vllora_mcp,
limit,
offset,
run_id,
thread_id,
operation_name,
text,
last_n_minutes,
sort_by,
sort_order,
output,
)
.await
}
TracesCommands::CallInfo { span_id, output } => {
call_info::handle_call_info(&vllora_mcp, span_id, output).await
}
TracesCommands::RunInfo { run_id, output } => {
run_info::handle_run_info(&vllora_mcp, run_id, output).await
}
TracesCommands::Overview {
last_n_minutes,
output,
} => overview::handle_overview(&vllora_mcp, last_n_minutes, output).await,
}
}