use std::path::PathBuf;
use clap::Parser;
use clap::Subcommand;
use codex_arg0::Arg0DispatchPaths;
use codex_arg0::arg0_dispatch_or_else;
use codex_config::LoaderOverrides;
use codex_utils_cli::CliConfigOverrides;
use codex_web::AppServerCommand;
use codex_web::WebOptions;
#[derive(Debug, Parser)]
#[command(name = "typeduck-codex-web", version)]
struct Cli {
#[command(subcommand)]
command: Option<Command>,
#[arg(long, default_value_t = 0)]
port: u16,
#[arg(long)]
no_open: bool,
#[arg(long = "cd", short = 'C', value_name = "DIR")]
cwd: Option<PathBuf>,
#[arg(short = 'c', value_name = "KEY=VALUE")]
config_overrides: Vec<String>,
#[arg(long, default_value_t = false)]
strict_config: bool,
#[arg(long, default_value_t = false)]
reset_token: bool,
#[arg(long, value_name = "PATH")]
daemon_config: Option<PathBuf>,
#[arg(long, value_name = "PATH", hide = true)]
codex_bin: Option<PathBuf>,
}
#[derive(Debug, Subcommand)]
enum Command {
#[command(name = "__app-server", hide = true)]
AppServer(AppServerArgs),
}
#[derive(Debug, Parser)]
struct AppServerArgs {
#[arg(short = 'c', value_name = "KEY=VALUE")]
config_overrides: Vec<String>,
#[arg(long, default_value_t = false)]
strict_config: bool,
}
fn main() -> anyhow::Result<()> {
arg0_dispatch_or_else(|arg0_paths| async move { main_with_arg0(arg0_paths).await })
}
async fn main_with_arg0(arg0_paths: Arg0DispatchPaths) -> anyhow::Result<()> {
let cli = Cli::parse();
match cli.command {
Some(Command::AppServer(args)) => {
codex_app_server::run_main(
arg0_paths,
CliConfigOverrides {
raw_overrides: args.config_overrides,
},
LoaderOverrides::default(),
args.strict_config,
false,
)
.await?;
}
None => {
let app_server_command = match cli.codex_bin {
Some(executable) => AppServerCommand::CodexCli { executable },
None => AppServerCommand::Standalone {
executable: std::env::current_exe()?,
},
};
codex_web::run(WebOptions {
port: cli.port,
open_browser: !cli.no_open,
cwd: cli.cwd,
app_server_command,
config_overrides: cli.config_overrides,
strict_config: cli.strict_config,
reset_token: cli.reset_token,
daemon_config: cli.daemon_config,
})
.await?;
}
}
Ok(())
}