stynx-code-tui 3.11.0

Terminal user interface with ratatui for interactive sessions
Documentation
use crate::state::{AppState, DialogOption, SelectKind};

struct ModelEntry {
    id: &'static str,
    name: &'static str,
    provider: &'static str,
    note: Option<&'static str>,
}

const MODELS: &[ModelEntry] = &[
    ModelEntry {
        id: "claude-opus-4-7",
        name: "Claude Opus 4.7",
        provider: "Anthropic",
        note: Some("most capable"),
    },
    ModelEntry {
        id: "claude-opus-4-6",
        name: "Claude Opus 4.6",
        provider: "Anthropic",
        note: None,
    },
    ModelEntry {
        id: "claude-sonnet-4-6",
        name: "Claude Sonnet 4.6",
        provider: "Anthropic",
        note: Some("balanced"),
    },
    ModelEntry {
        id: "claude-haiku-4-5-20251001",
        name: "Claude Haiku 4.5",
        provider: "Anthropic",
        note: Some("fast"),
    },
    ModelEntry {
        id: "claude-sonnet-4-20250514",
        name: "Claude Sonnet 4",
        provider: "Anthropic",
        note: None,
    },
    ModelEntry {
        id: "claude-3-7-sonnet-20250219",
        name: "Claude Sonnet 3.7",
        provider: "Anthropic",
        note: None,
    },
];

pub fn open_model_picker(state: &mut AppState) {
    let current = state.model_name.clone();
    let options: Vec<DialogOption> = MODELS
        .iter()
        .map(|m| {
            let mut opt = DialogOption::new(m.id, m.name).with_category(m.provider);
            if let Some(note) = m.note {
                opt = opt.with_footer(note);
            }
            opt
        })
        .collect();
    state.modal.open_select(
        SelectKind::ModelPicker,
        "Select model",
        options,
        Some(current),
        Some("• current".to_string()),
    );
}