use ratatui::{Terminal, backend::CrosstermBackend};
pub(crate) type Term = Terminal<CrosstermBackend<std::io::Stdout>>;
pub(crate) type SlashDropdown =
crate::widgets::dropdown::DropdownState<crate::widgets::slash_menu::SlashCommand>;
pub(crate) type ModelDropdown =
crate::widgets::dropdown::DropdownState<crate::widgets::model_menu::ModelItem>;
pub(crate) type ProviderDropdown =
crate::widgets::dropdown::DropdownState<crate::widgets::provider_menu::ProviderItem>;
pub(crate) type SessionDropdown =
crate::widgets::dropdown::DropdownState<crate::widgets::session_menu::SessionItem>;
pub(crate) type FileDropdown =
crate::widgets::dropdown::DropdownState<crate::widgets::file_menu::FileItem>;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum TuiState {
Idle,
Inferring,
}
pub enum MenuContent {
None,
Slash(SlashDropdown),
Model(ModelDropdown),
Provider(ProviderDropdown),
ProviderModels(ModelDropdown, koda_core::config::ProviderType),
Key(ProviderDropdown),
Session(SessionDropdown),
File {
dropdown: FileDropdown,
prefix: String,
},
WizardTrail(Vec<(String, String)>),
Approval {
id: String,
tool_name: String,
detail: String,
},
AskUser {
id: String,
question: String,
options: Vec<String>,
},
LoopCap,
PurgeConfirm { min_age_days: u32, detail: String },
HistorySearch {
query: String,
matches: Vec<String>,
selected: usize,
},
}
impl MenuContent {
pub(crate) fn is_none(&self) -> bool {
matches!(self, MenuContent::None)
}
}
#[derive(Clone)]
pub(crate) enum PromptMode {
Chat,
WizardInput { label: String },
}
pub(crate) enum ProviderWizard {
ApiKey {
provider_type: koda_core::config::ProviderType,
base_url: String,
env_name: String,
},
ApiKeyOnly { env_name: String },
Url {
provider_type: koda_core::config::ProviderType,
},
}