codex-mobile-bridge 0.2.10

Remote bridge and service manager for codex-mobile.
Documentation
use anyhow::Result;
use clap::Parser;
use codex_mobile_bridge::config::Config;
use codex_mobile_bridge::manage::{ManageCli, run as run_manage};
use codex_mobile_bridge::server::build_router;
use codex_mobile_bridge::state::BridgeState;
use std::ffi::OsString;
use std::sync::Arc;
use tokio::net::TcpListener;
use tracing_subscriber::EnvFilter;

#[tokio::main]
async fn main() -> Result<()> {
    let raw_args: Vec<OsString> = std::env::args_os().collect();
    if raw_args.get(1).and_then(|value| value.to_str()) == Some("manage") {
        let manage_args = std::iter::once(OsString::from("codex-mobile-bridge"))
            .chain(raw_args.into_iter().skip(2))
            .collect::<Vec<_>>();
        return run_manage(ManageCli::parse_from(manage_args));
    }

    init_tracing();

    let config = Config::parse_from(raw_args).validated()?;
    let state = BridgeState::bootstrap(config.clone()).await?;
    let router = build_router(Arc::clone(&state));
    let listener = TcpListener::bind(&config.listen_addr).await?;

    tracing::info!("codex-mobile bridge listening on {}", config.listen_addr);
    axum::serve(listener, router).await?;
    Ok(())
}

fn init_tracing() {
    let filter = EnvFilter::try_from_default_env()
        .unwrap_or_else(|_| EnvFilter::new("codex_mobile_bridge=info,tower_http=info"));

    tracing_subscriber::fmt()
        .with_env_filter(filter)
        .with_target(false)
        .compact()
        .init();
}