opi_coding_agent/
picker.rs1use std::path::Path;
5
6use opi_tui::select_list::SelectItem;
7
8pub fn model_picker_items(registry: &opi_ai::registry::ProviderRegistry) -> Vec<SelectItem> {
13 let mut items = Vec::new();
14 for provider_id in registry.provider_ids() {
15 let Some(provider) = registry.get_provider(provider_id) else {
16 continue;
17 };
18 items.extend(model_picker_items_from_provider(provider));
19 }
20 items
21}
22
23pub fn model_picker_items_from_provider(
25 provider: &dyn opi_ai::provider::Provider,
26) -> Vec<SelectItem> {
27 let provider_id = provider.id();
28 provider
29 .models()
30 .iter()
31 .map(|model| SelectItem {
32 id: format!("{provider_id}:{}", model.id),
33 display: model.display_name.clone(),
34 metadata: provider_id.to_string(),
35 })
36 .collect()
37}
38
39pub fn session_picker_items(dir: &Path) -> Result<Vec<SelectItem>, std::io::Error> {
44 let sessions = crate::session_cli::list_sessions(dir).unwrap_or_default();
45 Ok(sessions
46 .into_iter()
47 .map(|s| {
48 let cwd_short = if s.cwd.len() > 40 {
49 let start = s.cwd.floor_char_boundary(s.cwd.len() - 37);
50 format!("...{}", &s.cwd[start..])
51 } else {
52 s.cwd
53 };
54 SelectItem {
55 id: s.id,
56 display: cwd_short,
57 metadata: s.timestamp,
58 }
59 })
60 .collect())
61}