mod config;
mod core;
mod llm;
mod session;
mod ui;
use crate::{llm::Llm, session::Session, ui::Ui};
use anyhow::Result;
#[tokio::main]
async fn main() -> Result<()> {
let config = config::load_config()?;
let terminal = ratatui::init();
let (session_tx, session_rx) = tokio::sync::mpsc::channel(128);
let (ui_tx, ui_rx) = tokio::sync::mpsc::channel(128);
let (llm_tx, llm_rx) = tokio::sync::mpsc::channel(32);
let mut ui = Ui::new(session_tx.clone(), ui_rx);
let mut session = Session::new(ui_tx, llm_tx, session_rx);
let mut llm = Llm::new(session_tx, llm_rx, config.clone());
tokio::spawn(async move {
session.run().await;
});
tokio::spawn(async move {
llm.run().await;
});
let app_result = ui.run(terminal).await;
ratatui::restore();
app_result
}