diff --git a/src/basic/compiler/mod.rs b/src/basic/compiler/mod.rs index cab05a69..0f9ab841 100644 --- a/src/basic/compiler/mod.rs +++ b/src/basic/compiler/mod.rs @@ -143,7 +143,7 @@ impl BasicCompiler { Ok(CompilationResult { mcp_tool: mcp_json, - openai_tool: tool_json, + _openai_tool: tool_json, }) } @@ -438,5 +438,5 @@ impl BasicCompiler { #[derive(Debug)] pub struct CompilationResult { pub mcp_tool: Option, - pub openai_tool: Option, + pub _openai_tool: Option, } diff --git a/src/bootstrap/mod.rs b/src/bootstrap/mod.rs index 3c768c3b..11a2aab6 100644 --- a/src/bootstrap/mod.rs +++ b/src/bootstrap/mod.rs @@ -4,7 +4,7 @@ use crate::shared::utils::establish_pg_connection; use anyhow::Result; use diesel::{connection::SimpleConnection}; use dotenvy::dotenv; -use log::{debug, error, info, trace}; +use log::{debug, error, info, trace, warn}; use aws_sdk_s3::Client; use aws_config::BehaviorVersion; use rand::distr::Alphanumeric; @@ -26,11 +26,34 @@ pub struct BootstrapManager { } impl BootstrapManager { + fn is_postgres_running() -> bool { + match Command::new("pg_isready").arg("-q").status() { + Ok(status) => status.success(), + Err(_) => { + // fallback check using pgrep + Command::new("pgrep").arg("postgres").output().map(|o| !o.stdout.is_empty()).unwrap_or(false) + } + } + } + pub async fn new(install_mode: InstallMode, tenant: Option) -> Self { info!( "Initializing BootstrapManager with mode {:?} and tenant {:?}", install_mode, tenant ); + + if !Self::is_postgres_running() { + warn!("PostgreSQL server is not running. Attempting to start 'tables' component..."); + let pm = PackageManager::new(install_mode.clone(), tenant.clone()) + .expect("Failed to initialize PackageManager"); + if let Err(e) = pm.start("tables") { + error!("Failed to start PostgreSQL component automatically: {}", e); + panic!("Database not available and auto-start failed."); + } else { + info!("PostgreSQL component started successfully."); + } + } + let config = AppConfig::from_env().expect("Failed to load config from env"); let s3_client = futures::executor::block_on(Self::create_s3_operator(&config)); Self { diff --git a/src/session/mod.rs b/src/session/mod.rs index 93d70796..756d1c81 100644 --- a/src/session/mod.rs +++ b/src/session/mod.rs @@ -174,7 +174,7 @@ impl SessionManager { Ok(inserted) } - pub fn clear_messages(&mut self, session_id: Uuid) -> Result<(), Box> { + pub fn clear_messages(&mut self, _session_id: Uuid) -> Result<(), Box> { use crate::shared::models::message_history::dsl::*; diesel::delete(message_history.filter(session_id.eq(session_id))) diff --git a/src/shared/models.rs b/src/shared/models.rs index 25d151b7..00052bd7 100644 --- a/src/shared/models.rs +++ b/src/shared/models.rs @@ -13,7 +13,7 @@ pub enum TriggerKind { } impl TriggerKind { - pub fn from_i32(value: i32) -> Option { + pub fn _from_i32(value: i32) -> Option { match value { 0 => Some(Self::Scheduled), 1 => Some(Self::TableUpdate), diff --git a/src/ui/stream.rs b/src/ui/stream.rs new file mode 100644 index 00000000..d61ec11a --- /dev/null +++ b/src/ui/stream.rs @@ -0,0 +1,26 @@ +use ratatui::{ + style::{Color, Style}, + widgets::{Block, Borders, Gauge}, +}; + +pub struct StreamProgress { + pub progress: f64, + pub status: String, +} + +pub fn render_progress_bar(progress: &StreamProgress) -> Gauge { + let color = if progress.progress >= 1.0 { + Color::Green + } else { + Color::Blue + }; + + Gauge::default() + .block( + Block::default() + .title(format!("Stream Progress: {}", progress.status)) + .borders(Borders::ALL), + ) + .gauge_style(Style::default().fg(color)) + .percent((progress.progress * 100.0) as u16) +}