Skip to main content

codetether_agent/tui/app/
model_picker.rs

1use std::sync::Arc;
2
3use crate::provider::ProviderRegistry;
4use crate::session::Session;
5use crate::tui::app::session_sync::return_to_chat;
6use crate::tui::app::state::App;
7use crate::tui::models::ViewMode;
8
9pub async fn open_model_picker(
10    app: &mut App,
11    session: &Session,
12    registry: Option<&Arc<ProviderRegistry>>,
13) {
14    let _ = app.state.refresh_available_models(registry).await;
15    app.state.open_model_picker();
16    app.state.set_view_mode(ViewMode::Model);
17    if let Some(current_model) = session.metadata.model.as_deref()
18        && let Some(index) = app
19            .state
20            .filtered_models()
21            .iter()
22            .position(|model| *model == current_model)
23    {
24        app.state.selected_model_index = index;
25    }
26    app.state.status = if app.state.available_models.is_empty() {
27        "No models available".to_string()
28    } else {
29        "Model picker".to_string()
30    };
31}
32
33pub fn close_model_picker(app: &mut App) {
34    app.state.close_model_picker();
35    return_to_chat(app);
36}
37
38pub fn apply_selected_model(app: &mut App, session: &mut Session) {
39    if let Some(model) = app.state.selected_model() {
40        session.metadata.model = Some(model.to_string());
41        app.state.status = format!("Model set: {model}");
42    } else {
43        app.state.status = "No model selected".to_string();
44    }
45    app.state.close_model_picker();
46    return_to_chat(app);
47}