diff --git a/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx b/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx index ec4cc750c6d3..07299c958be2 100644 --- a/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx +++ b/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx @@ -193,6 +193,23 @@ export function DialogSelect(props: DialogSelectProps) { }), ) + // Preserve highlighted selection when options reorder (e.g., favorite/unfavorite) + createEffect( + on( + () => flat(), + (newFlat, prevFlat) => { + if (store.filter.length > 0) return + if (!prevFlat) return + const prevSelected = prevFlat[store.selected] + if (!prevSelected) return + const newIndex = newFlat.findIndex((opt) => isDeepEqual(opt.value, prevSelected.value)) + if (newIndex >= 0 && newIndex !== store.selected) { + moveTo(newIndex, false) + } + }, + ), + ) + function move(direction: number) { if (flat().length === 0) return let next = store.selected + direction