mod lifetime;
mod server;
use rmcp::{transport::stdio, ServiceExt};
fn main() -> anyhow::Result<()> {
let runtime = tokio::runtime::Builder::new_multi_thread()
.worker_threads(2)
.max_blocking_threads(8)
.thread_keep_alive(std::time::Duration::from_secs(2))
.enable_all()
.build()?;
let ended = runtime.block_on(serve());
runtime.shutdown_timeout(std::time::Duration::from_secs(2));
ended
}
async fn serve() -> anyhow::Result<()> {
ljos_cli::normalize_tracker_env();
ljos_cli::load_seat_env();
if let Some(line) = ljos_cli::cloud::missing_mcp_line() {
eprintln!("{line}");
}
ljos_cli::ballot_sig::pin_connection_session(None);
if std::env::args().any(|a| a == "--version" || a == "-V") {
println!("ljos-mcp {}", env!("CARGO_PKG_VERSION"));
return Ok(());
}
lifetime::watch_parent();
ljos_cli::runner_skills::refresh_on_new_version();
ljos_cli::runner_env::refresh_on_new_version();
ljos_cli::bookkeep::spawn_idle_finish();
ljos_cli::idle_drop::spawn_idle_drop();
let _book_finish = ljos_cli::bookkeep::ShutdownFinish;
let (read, write) = stdio();
let running = server::LjosServer::from_env()
.serve((server::InboundOrder::new(read), write))
.await?;
let ended = running.waiting().await;
ljos_cli::retire_seat(ljos_cli::runner_pid());
ended?;
Ok(())
}