fix(tui): align cli model picker behavior (#34571)

Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com>
This commit is contained in:
opencode-agent[bot] 2026-06-30 09:36:38 -05:00 committed by GitHub
commit 8f1db7d06d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 145 additions and 71 deletions

View file

@ -2,31 +2,33 @@ import { describe, expect, test } from "bun:test"
import { sortModelOptions } from "../../../../src/component/dialog-model"
describe("sortModelOptions", () => {
test("orders provider-scoped model choices by newest release first", () => {
const sorted = sortModelOptions(
[
{ title: "GPT 5.2", releaseDate: "2025-12-11" },
{ title: "GPT 5.4", releaseDate: "2026-03-05" },
{ title: "GPT 5.1", releaseDate: "2025-11-13" },
],
true,
)
test("orders opencode models before other providers", () => {
const sorted = sortModelOptions([
{ providerID: "openai", providerName: "OpenAI", releaseDate: 3, title: "GPT 5" },
{ providerID: "opencode", providerName: "OpenCode", releaseDate: 1, title: "Claude Sonnet 4" },
{ providerID: "anthropic", providerName: "Anthropic", releaseDate: 2, title: "Claude Opus 4" },
])
expect(sorted.map((model) => model.title)).toEqual(["GPT 5.4", "GPT 5.2", "GPT 5.1"])
expect(sorted.map((model) => model.title)).toEqual(["Claude Sonnet 4", "Claude Opus 4", "GPT 5"])
})
test("orders regular model choices free-first and then newest-first", () => {
const sorted = sortModelOptions(
[
{ title: "GLM 5", releaseDate: "2025-07-28" },
{ title: "GLM 5.1", releaseDate: "2025-12-09" },
{ title: "GLM 5.2", releaseDate: "2026-02-16" },
{ title: "Free old", releaseDate: "2024-01-01", footer: "Free" },
{ title: "Free new", releaseDate: "2025-01-01", footer: "Free" },
],
false,
)
test("orders provider groups by provider name and models by newest release", () => {
const sorted = sortModelOptions([
{ providerID: "google", providerName: "Google", releaseDate: 5, title: "Gemini 2.5 Pro" },
{ providerID: "anthropic", providerName: "Anthropic", releaseDate: 4, title: "Claude Sonnet 4" },
{ providerID: "anthropic", providerName: "Anthropic", releaseDate: 6, title: "Claude Opus 4" },
{ providerID: "openai", providerName: "OpenAI", releaseDate: 7, title: "GPT 5" },
])
expect(sorted.map((model) => model.title)).toEqual(["Free new", "Free old", "GLM 5.2", "GLM 5.1", "GLM 5"])
expect(sorted.map((model) => model.title)).toEqual(["Claude Opus 4", "Claude Sonnet 4", "Gemini 2.5 Pro", "GPT 5"])
})
test("falls back to title when release dates match within a provider", () => {
const sorted = sortModelOptions([
{ providerID: "anthropic", providerName: "Anthropic", releaseDate: 5, title: "Claude Sonnet 4" },
{ providerID: "anthropic", providerName: "Anthropic", releaseDate: 5, title: "Claude Opus 4" },
])
expect(sorted.map((model) => model.title)).toEqual(["Claude Opus 4", "Claude Sonnet 4"])
})
})