diff --git a/crates/ui/src/pickers.rs b/crates/ui/src/pickers.rs
index ff7e800f6a..989d662104 100644
--- a/crates/ui/src/pickers.rs
+++ b/crates/ui/src/pickers.rs
@@ -408,6 +408,34 @@ fn mark_ambiguous(rows: &mut [ModelRowData]) {
}
}
+#[derive(Debug, Clone, PartialEq, Eq)]
+struct ProviderHeader {
+ harness: HarnessId,
+ id: String,
+ name: SharedString,
+ count: usize,
+ collapsed: bool,
+}
+
+#[derive(Debug, Clone)]
+enum ModelListRow {
+ Provider(ProviderHeader),
+ Model {
+ row: ModelRowData,
+ ordinal: usize,
+ under_header: bool,
+ },
+}
+
+impl ModelListRow {
+ fn model_row(&self) -> Option<&ModelRowData> {
+ match self {
+ ModelListRow::Model { row, .. } => Some(row),
+ ModelListRow::Provider(_) => None,
+ }
+ }
+}
+
/// Which picker popover is open.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum PickerKind {
@@ -563,7 +591,7 @@ pub struct Pickers {
/// Flattened rows the list/keyboard/⌘N all walk, cached per
/// [`ModelRowsKey`]: a 7k-model catalog rebuilt+ranked on every
/// keystroke, arrow press AND render was the picker's open/scroll lag.
- model_rows_cache: std::cell::RefCell