codetether-agent 4.5.7

A2A-native AI coding agent for the CodeTether ecosystem
Documentation
use ratatui::{
    layout::Rect,
    style::{Color, Modifier, Style},
    text::{Line, Span},
    widgets::{Block, Borders, Paragraph},
};

use crate::tui::app::state::AppState;

pub fn render_metrics(f: &mut ratatui::Frame, state: &AppState, area: Rect) {
    let label = Style::default().fg(Color::DarkGray);
    let mut lines = Vec::new();
    lines.push(Line::styled(
        "Metrics",
        Style::default().add_modifier(Modifier::BOLD),
    ));

    let model = state.last_completion_model.as_deref().unwrap_or("auto");
    lines.push(metric_line("Model:", model, Color::Green, label));

    let prompt_t = fmt_opt(state.last_completion_prompt_tokens.map(|t| t.to_string()));
    lines.push(metric_line(
        "Prompt tokens:",
        &prompt_t,
        Color::White,
        label,
    ));

    let output_t = fmt_opt(state.last_completion_output_tokens.map(|t| t.to_string()));
    lines.push(metric_line(
        "Output tokens:",
        &output_t,
        Color::White,
        label,
    ));

    let latency = fmt_opt(state.last_completion_latency_ms.map(|ms| format!("{ms}ms")));
    lines.push(metric_line("Latency:", &latency, Color::Cyan, label));

    f.render_widget(
        Paragraph::new(lines).block(
            Block::default()
                .borders(Borders::ALL)
                .title(" Token & Cost "),
        ),
        area,
    );
}

fn metric_line(key: &str, val: &str, color: Color, label: Style) -> Line<'static> {
    Line::from(vec![
        Span::styled(format!("{key} "), label),
        Span::styled(val.to_string(), Style::default().fg(color)),
    ])
}

fn fmt_opt(opt: Option<String>) -> String {
    opt.unwrap_or_else(|| "".into())
}