use clap::Command;
use rmcp::ServiceExt;
use rmcp::transport::stdio;
use tokio_util::sync::CancellationToken;
use tracing::Level;
use crate::Result;
use crate::config::Config;
use crate::server::BrontesServer;
pub async fn serve_stdio(
cli: Command,
cfg_opt: Option<Config>,
log_level_override: Option<Level>,
) -> Result<()> {
let cfg = cfg_opt.unwrap_or_default();
init_tracing(log_level_override.or(cfg.log_level));
let cancel = CancellationToken::new();
crate::subcommands::signal::spawn_signal_listener(cancel.clone());
let server = BrontesServer::new(cli, cfg)?;
let running = server.serve_with_ct(stdio(), cancel).await?;
running
.waiting()
.await
.map_err(|e| crate::Error::Panic(format!("MCP stdio service join: {e}")))?;
Ok(())
}
fn init_tracing(level: Option<Level>) {
use tracing_subscriber::EnvFilter;
let filter = level.map_or_else(
|| EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")),
|lvl| EnvFilter::new(lvl.to_string()),
);
let _ = tracing_subscriber::fmt()
.with_writer(std::io::stderr)
.with_env_filter(filter)
.try_init();
}