mod agent;
mod derive_aliases;
mod dir_context;
mod error;
mod event;
mod exec;
mod hub;
mod model;
mod run;
mod runtime;
mod script;
mod support;
mod term;
mod tui;
mod tui_v1;
mod types;
#[cfg(test)]
mod _test_support;
use crate::exec::Executor;
use crate::exec::cli::CliArgs;
use crate::hub::{HubEvent, get_hub};
use crate::model::OnceModelManager;
use crate::tui_v1::TuiAppV1;
use clap::{Parser, crate_version};
use derive_aliases::*;
use error::{Error, Result};
use tracing_appender::rolling::never;
use tracing_subscriber::EnvFilter;
pub static VERSION: &str = crate_version!();
const DEBUG_LOG: bool = false;
#[tokio::main]
async fn main() -> Result<()> {
let args = CliArgs::parse();
let _tracing_guard = if DEBUG_LOG {
let file_appender = never(".aip-debug-log", "file.log");
let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender);
tracing_subscriber::fmt()
.with_writer(non_blocking)
.with_env_filter(EnvFilter::new("aip=debug,genai=debug,udiffx=debug"))
.without_time()
.with_ansi(false)
.init();
Some(_guard)
} else {
None
};
let once_mm = OnceModelManager;
let executor = Executor::new(once_mm);
let exec_tx = executor.sender();
tokio::spawn(async move {
if let Err(err) = executor.start().await {
let hub = get_hub();
hub.publish(HubEvent::Error { error: err.into() }).await;
hub.publish(HubEvent::Quit).await;
}
});
if args.cmd.is_interactive() && args.cmd.is_tui() {
let mm = once_mm.get().await?;
tui::start_tui(mm, exec_tx, args).await?;
} else {
let tui_v1 = TuiAppV1::new(exec_tx);
tui_v1.start_with_args(args).await?;
}
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
Ok(())
}