Match model description in combobox search
Search now matches across model label, id, provider, and description with multi-token fuzzy matching, so "kimi zen" finds the OpenCode Zen Kimi model.
This commit is contained in:
@@ -67,6 +67,22 @@ describe("combined model selector helpers", () => {
|
|||||||
expect(matchesSearch(rows[1], "gpt-5.4")).toBe(true);
|
expect(matchesSearch(rows[1], "gpt-5.4")).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("matches across label, provider, and description with multi-token fuzzy search", () => {
|
||||||
|
const row = {
|
||||||
|
favoriteKey: "opencode:opencode-zen/kimi-k2.5",
|
||||||
|
provider: "opencode",
|
||||||
|
providerLabel: "OpenCode",
|
||||||
|
modelId: "opencode-zen/kimi-k2.5",
|
||||||
|
modelLabel: "Kimi K2.5",
|
||||||
|
description: "OpenCode Zen - kimi",
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(matchesSearch(row, "kimi zen")).toBe(true);
|
||||||
|
expect(matchesSearch(row, "zen kimi")).toBe(true);
|
||||||
|
expect(matchesSearch(row, "k2.5 zen")).toBe(true);
|
||||||
|
expect(matchesSearch(row, "kimi gemini")).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
it("keeps the selected trigger label model-only", () => {
|
it("keeps the selected trigger label model-only", () => {
|
||||||
expect(resolveProviderLabel(providerDefinitions, "codex")).toBe("Codex");
|
expect(resolveProviderLabel(providerDefinitions, "codex")).toBe("Codex");
|
||||||
expect(buildSelectedTriggerLabel("GPT-5.4")).toBe("GPT-5.4");
|
expect(buildSelectedTriggerLabel("GPT-5.4")).toBe("GPT-5.4");
|
||||||
|
|||||||
@@ -48,7 +48,10 @@ export function matchesSearch(row: SelectorModelRow, normalizedQuery: string): b
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return [row.modelLabel, row.modelId, row.providerLabel].some((value) =>
|
const haystack = [row.modelLabel, row.modelId, row.providerLabel, row.description ?? ""]
|
||||||
value.toLowerCase().includes(normalizedQuery),
|
.join(" ")
|
||||||
);
|
.toLowerCase();
|
||||||
|
|
||||||
|
const tokens = normalizedQuery.split(/\s+/).filter((token) => token.length > 0);
|
||||||
|
return tokens.every((token) => haystack.includes(token));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user