csm-duckdb 0.3.8

Optional analytics, Parquet export, and SQL inspection for chaotic_semantic_memory
use crate::Analytics;
use crate::error::Result;
use std::io::{self, Write};

pub async fn run(analytics: &mut Analytics) -> Result<()> {
    println!("CSM SQL REPL (DuckDB)");
    println!("Type '.exit' or '.quit' to leave.");

    loop {
        print!("sql> ");
        io::stdout().flush()?;

        let mut input = String::new();
        if io::stdin().read_line(&mut input)? == 0 {
            println!();
            break;
        }
        let sql = input.trim();

        if sql.is_empty() {
            continue;
        }

        if sql == ".exit" || sql == ".quit" {
            break;
        }

        match analytics.query(sql) {
            Ok(rows) => {
                if rows.is_empty() {
                    println!("No results.");
                } else {
                    crate::cli::query::print_table(&rows);
                }
            }
            Err(e) => {
                eprintln!("Error: {e}");
            }
        }
    }

    Ok(())
}