stynx-code 3.3.1

stynx-code — interactive AI coding assistant
use stynx_code_types::{ContentBlock, Message, Role};

use super::terminal::{BOLD, CYAN, DIM, RESET};

pub fn print_session_history(messages: &[Message]) {
    let mut pairs: Vec<(&Message, Option<&Message>)> = Vec::new();
    let mut i = 0;
    while i < messages.len() {
        let msg = &messages[i];
        if matches!(msg.role, Role::User) {
            let next = messages.get(i + 1).filter(|m| matches!(m.role, Role::Assistant));
            pairs.push((msg, next));
            i += if next.is_some() { 2 } else { 1 };
        } else { i += 1; }
    }
    let start = pairs.len().saturating_sub(5);
    let pairs = &pairs[start..];
    if pairs.is_empty() { return; }
    let sep = format!("  {DIM}{}{RESET}", "".repeat(60));
    for (user_msg, asst_msg) in pairs {
        println!("{sep}");
        let user_text: String = user_msg.content.iter().filter_map(|b| {
            if let ContentBlock::Text { text } = b { Some(text.as_str()) } else { None }
        }).collect::<Vec<_>>().join(" ");
        let first_line = user_text.lines().next().unwrap_or("").trim();
        let display = if first_line.len() > 80 { format!("{}", &first_line[..79]) } else { first_line.to_string() };
        println!("  {BOLD}{CYAN}{RESET}  {DIM}{display}{RESET}");
        if let Some(asst) = asst_msg {
            let text: String = asst.content.iter().filter_map(|b| {
                if let ContentBlock::Text { text } = b { Some(text.as_str()) } else { None }
            }).collect::<Vec<_>>().join("\n");
            let lines: Vec<&str> = text.lines().filter(|l| !l.trim().is_empty()).take(3).collect();
            for line in &lines {
                let trimmed = line.trim();
                let d = if trimmed.len() > 100 { format!("{}", &trimmed[..99]) } else { trimmed.to_string() };
                println!("  {DIM}{d}{RESET}");
            }
            if text.lines().filter(|l| !l.trim().is_empty()).count() > 3 {
                println!("  {DIM}{RESET}");
            }
        }
    }
    println!("{sep}");
    println!();
}