use std::net::SocketAddr;
use clap::{Parser, Subcommand};
use tracing_subscriber::{Layer, layer::SubscriberExt, util::SubscriberInitExt};
use trusty_mpm_daemon::{DaemonState, run_http, run_mcp};
#[derive(Debug, Parser)]
#[command(name = "trusty-mpmd", version, about = "trusty-mpm daemon")]
struct Args {
#[command(subcommand)]
mode: Option<Mode>,
}
#[derive(Debug, Subcommand)]
enum Mode {
Http {
#[arg(long, env = "TRUSTY_MPM_ADDR", default_value = "127.0.0.1:7880")]
addr: SocketAddr,
},
Mcp,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let log_dir = dirs::home_dir()
.expect("home dir")
.join(".trusty-mpm")
.join("logs");
std::fs::create_dir_all(&log_dir)?;
let file_appender = tracing_appender::rolling::daily(&log_dir, "trusty-mpm.log");
let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender);
let env_filter =
tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| "info".into());
let file_filter =
tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| "info".into());
tracing_subscriber::registry()
.with(
tracing_subscriber::fmt::layer()
.with_writer(std::io::stderr)
.with_filter(env_filter),
)
.with(
tracing_subscriber::fmt::layer()
.with_writer(non_blocking)
.with_ansi(false)
.with_filter(file_filter),
)
.init();
let args = Args::parse();
let state = DaemonState::shared();
match args.mode.unwrap_or(Mode::Http {
addr: "127.0.0.1:7880".parse().expect("valid default addr"),
}) {
Mode::Http { addr } => run_http(state, addr).await,
Mode::Mcp => run_mcp(state).await,
}
}