use clap::Parser;
use plexus_core::plexus::DynamicHub;
use plexus_transport::TransportServer;
use hyperforge::HyperforgeHub;
use std::sync::Arc;
#[derive(Parser, Debug)]
#[command(name = "hyperforge")]
#[command(about = "Hyperforge standalone server - JSON-RPC over WebSocket or stdio")]
struct Args {
#[arg(long)]
stdio: bool,
#[arg(short, long, default_value = "4446")]
port: u16,
#[arg(long)]
mcp: bool,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let args = Args::parse();
let filter = if args.stdio {
tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| {
tracing_subscriber::EnvFilter::new("hyperforge=warn,jsonrpsee=warn")
})
} else {
tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| {
#[cfg(debug_assertions)]
let default_filter = "warn,hyperforge=trace";
#[cfg(not(debug_assertions))]
let default_filter = "warn,hyperforge=debug";
tracing_subscriber::EnvFilter::new(default_filter)
})
};
tracing_subscriber::fmt()
.with_env_filter(filter)
.with_writer(std::io::stderr)
.init();
tracing::info!("Starting hyperforge at {}", chrono::Utc::now());
let lforge = Arc::new(
DynamicHub::new("lforge")
.register(HyperforgeHub::new())
);
tracing::info!("LFORGE2 initialized");
tracing::info!(" Namespace: lforge");
tracing::info!(" Activation: hyperforge");
tracing::info!(" Version: {}", env!("CARGO_PKG_VERSION"));
tracing::info!(" Description: Multi-forge repository management");
let rpc_converter = |arc: Arc<DynamicHub>| {
DynamicHub::arc_into_rpc_module(arc)
.map_err(|e| anyhow::anyhow!("Failed to create RPC module: {}", e))
};
let mut builder = TransportServer::builder(lforge, rpc_converter);
if args.stdio {
builder = builder.with_stdio();
} else {
builder = builder.with_websocket(args.port);
if args.mcp {
builder = builder.with_mcp_http(args.port + 1);
}
}
if args.stdio {
tracing::info!("Starting stdio transport (MCP-compatible)");
} else {
tracing::info!("LFORGE2 started");
tracing::info!(" WebSocket: ws://127.0.0.1:{}", args.port);
if args.mcp {
tracing::info!(" MCP HTTP: http://127.0.0.1:{}/mcp", args.port + 1);
}
tracing::info!("");
tracing::info!("Usage:");
tracing::info!(" synapse -p {} lforge hyperforge status", args.port);
tracing::info!(" synapse -p {} lforge hyperforge version", args.port);
}
builder.build().await?.serve().await
}