diff --git a/crates/owlen-cli/Cargo.toml b/crates/owlen-cli/Cargo.toml index 5ec86a8..6d53808 100644 --- a/crates/owlen-cli/Cargo.toml +++ b/crates/owlen-cli/Cargo.toml @@ -11,18 +11,12 @@ description = "Command-line interface for OWLEN LLM client" [features] default = ["chat-client"] chat-client = ["owlen-tui"] -code-client = [] [[bin]] name = "owlen" path = "src/main.rs" required-features = ["chat-client"] -[[bin]] -name = "owlen-code" -path = "src/code_main.rs" -required-features = ["code-client"] - [[bin]] name = "owlen-agent" path = "src/agent_main.rs" diff --git a/crates/owlen-cli/src/code_main.rs b/crates/owlen-cli/src/code_main.rs deleted file mode 100644 index bcda185..0000000 --- a/crates/owlen-cli/src/code_main.rs +++ /dev/null @@ -1,143 +0,0 @@ -//! OWLEN Code Mode - TUI client optimized for coding assistance - -use anyhow::Result; -use clap::{Arg, Command}; -use owlen_core::{session::SessionController, storage::StorageManager}; -use owlen_ollama::OllamaProvider; -use owlen_tui::{config, ui, AppState, CodeApp, Event, EventHandler, SessionEvent}; -use std::io; -use std::sync::Arc; -use tokio::sync::mpsc; -use tokio_util::sync::CancellationToken; - -use crossterm::{ - event::{DisableMouseCapture, EnableMouseCapture}, - execute, - terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, -}; -use ratatui::{backend::CrosstermBackend, Terminal}; - -#[tokio::main(flavor = "multi_thread")] -async fn main() -> Result<()> { - let matches = Command::new("owlen-code") - .about("OWLEN Code Mode - TUI optimized for programming assistance") - .version(env!("CARGO_PKG_VERSION")) - .arg( - Arg::new("model") - .short('m') - .long("model") - .value_name("MODEL") - .help("Preferred model to use for this session"), - ) - .get_matches(); - - let mut config = config::try_load_config().unwrap_or_default(); - // Disable encryption for code mode. - config.privacy.encrypt_local_data = false; - - if let Some(model) = matches.get_one::("model") { - config.general.default_model = Some(model.clone()); - } - - let provider_name = config.general.default_provider.clone(); - let provider_cfg = config::ensure_provider_config(&mut config, &provider_name).clone(); - - let provider_type = provider_cfg.provider_type.to_ascii_lowercase(); - if provider_type != "ollama" && provider_type != "ollama-cloud" { - anyhow::bail!( - "Unsupported provider type '{}' configured for provider '{}'", - provider_cfg.provider_type, - provider_name - ); - } - - let provider = Arc::new(OllamaProvider::from_config( - &provider_cfg, - Some(&config.general), - )?); - - let storage = Arc::new(StorageManager::new().await?); - // Code client - code execution tools enabled - use owlen_core::ui::NoOpUiController; - let controller = SessionController::new( - provider, - config.clone(), - storage.clone(), - Arc::new(NoOpUiController), - true, - ) - .await?; - let (mut app, mut session_rx) = CodeApp::new(controller).await?; - app.inner_mut().initialize_models().await?; - - let cancellation_token = CancellationToken::new(); - let (event_tx, event_rx) = mpsc::unbounded_channel(); - let event_handler = EventHandler::new(event_tx, cancellation_token.clone()); - let event_handle = tokio::spawn(async move { event_handler.run().await }); - - enable_raw_mode()?; - let mut stdout = io::stdout(); - execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?; - let backend = CrosstermBackend::new(stdout); - let mut terminal = Terminal::new(backend)?; - - let result = run_app(&mut terminal, &mut app, event_rx, &mut session_rx).await; - - cancellation_token.cancel(); - event_handle.await?; - - config::save_config(&app.inner().config())?; - - disable_raw_mode()?; - execute!( - terminal.backend_mut(), - LeaveAlternateScreen, - DisableMouseCapture - )?; - terminal.show_cursor()?; - - if let Err(err) = result { - println!("{err:?}"); - } - - Ok(()) -} - -async fn run_app( - terminal: &mut Terminal>, - app: &mut CodeApp, - mut event_rx: mpsc::UnboundedReceiver, - session_rx: &mut mpsc::UnboundedReceiver, -) -> Result<()> { - loop { - // Advance loading animation frame - app.inner_mut().advance_loading_animation(); - - terminal.draw(|f| ui::render_chat(f, app.inner_mut()))?; - - // Process any pending LLM requests AFTER UI has been drawn - if let Err(e) = app.inner_mut().process_pending_llm_request().await { - eprintln!("Error processing LLM request: {}", e); - } - - // Process any pending tool executions AFTER UI has been drawn - if let Err(e) = app.inner_mut().process_pending_tool_execution().await { - eprintln!("Error processing tool execution: {}", e); - } - - tokio::select! { - Some(event) = event_rx.recv() => { - if let AppState::Quit = app.handle_event(event).await? { - return Ok(()); - } - } - Some(session_event) = session_rx.recv() => { - app.handle_session_event(session_event)?; - } - // Add a timeout to keep the animation going even when there are no events - _ = tokio::time::sleep(tokio::time::Duration::from_millis(100)) => { - // This will cause the loop to continue and advance the animation - } - } - } -}