use crate::cli::args::{GlobalFlags, ServeArgs};
use anyhow::{Context, Result};
use grex_core::{Registry, Scheduler};
use grex_mcp::{GrexMcpServer, ServerState};
use tokio_util::sync::CancellationToken;
pub fn run(args: ServeArgs, _global: &GlobalFlags, _cancel: &CancellationToken) -> Result<()> {
let workspace = match args.workspace {
Some(p) => p,
None => std::env::current_dir().context("resolve cwd for --workspace default")?,
};
let manifest_path = match args.manifest {
Some(p) => p,
None => workspace.join("grex.jsonl"),
};
let parallel = resolve_parallel(args.parallel);
let scheduler = Scheduler::new(parallel);
let registry = Registry::default();
let state = ServerState::new(scheduler, registry, manifest_path, workspace);
let server = GrexMcpServer::new(state);
let rt = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.context("build tokio runtime for grex serve")?;
rt.block_on(async move {
let transport = rmcp::transport::stdio();
tracing::info!(
target: "grex",
parallel,
"grex serve: MCP stdio transport ready",
);
server.run(transport).await.context("grex-mcp server exited with error")
})
}
fn resolve_parallel(opt: Option<u32>) -> usize {
match opt {
Some(n) => n as usize,
None => std::thread::available_parallelism().map(|n| n.get()).unwrap_or(1),
}
}