From 510f595e25ae4a1d9873bca73fddfd45e0337002 Mon Sep 17 00:00:00 2001 From: Idris Gadi <85882535+IdrisGit@users.noreply.github.com> Date: Fri, 23 Jan 2026 03:45:11 +0530 Subject: [PATCH] fix(tui): add weight to fuzzy search to maintain title priority (#10106) --- .../src/cli/cmd/tui/ui/dialog-select.tsx | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) 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 618bf3b3c..173572233 100644 --- a/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx +++ b/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx @@ -72,15 +72,23 @@ export function DialogSelect(props: DialogSelectProps) { let input: InputRenderable const filtered = createMemo(() => { - if (props.skipFilter) { - return props.options.filter((x) => x.disabled !== true) - } + if (props.skipFilter) return props.options.filter((x) => x.disabled !== true) const needle = store.filter.toLowerCase() - const result = pipe( + const options = pipe( props.options, filter((x) => x.disabled !== true), - (x) => (!needle ? x : fuzzysort.go(needle, x, { keys: ["title", "category"] }).map((x) => x.obj)), ) + if (!needle) return options + + // prioritize title matches (weight: 2) over category matches (weight: 1). + // users typically search by the item name, and not its category. + const result = fuzzysort + .go(needle, options, { + keys: ["title", "category"], + scoreFn: (r) => r[0].score * 2 + r[1].score, + }) + .map((x) => x.obj) + return result })