Skip to main content

opi_coding_agent/
picker.rs

1//! Picker integration: bridges provider registry and session listing to
2//! SelectItem for the SelectList widget (task 3.11).
3
4use std::path::Path;
5
6use opi_tui::select_list::SelectItem;
7
8/// Collect SelectItem entries from all registered providers' model lists.
9///
10/// Each entry's `id` is the fully-qualified `provider:model` spec, `display`
11/// is the model's display name, and `metadata` is the provider id.
12pub 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
23/// Collect SelectItem entries from one provider's advertised model list.
24pub 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
39/// Collect SelectItem entries from session listing in the given directory.
40///
41/// Each entry's `id` is the session id, `display` is the cwd (truncated if
42/// needed), and `metadata` is the timestamp.
43pub 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}