From 7b56a1cea38545dd38ac3d50425c0700ba9e1f07 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Thu, 28 May 2026 16:37:32 -0500 Subject: [PATCH] fix(tui): order connected provider models by release date (#29798) --- .../cli/cmd/tui/component/dialog-model.tsx | 18 ++++++++--- .../test/cli/cmd/tui/model-options.test.ts | 30 +++++++++++++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 packages/opencode/test/cli/cmd/tui/model-options.test.ts diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx index 09c2d64b00..4b4484b798 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx @@ -73,6 +73,7 @@ export function DialogModel(props: { providerID?: string }) { map(([model, info]) => ({ value: { providerID: provider.id, modelID: model }, title: info.name ?? model, + releaseDate: info.release_date, description: favorites.some((item) => item.providerID === provider.id && item.modelID === model) ? "(Favorite)" : undefined, @@ -91,10 +92,7 @@ export function DialogModel(props: { providerID?: string }) { return false return true }), - sortBy( - (x) => x.footer !== "Free", - (x) => x.title, - ), + (options) => sortModelOptions(options, props.providerID !== undefined), ), ), ) @@ -173,3 +171,15 @@ export function DialogModel(props: { providerID?: string }) { /> ) } + +export function sortModelOptions( + options: T[], + newestFirst: boolean, +) { + if (newestFirst) return sortBy(options, [(option) => option.releaseDate, "desc"], (option) => option.title) + return sortBy( + options, + (option) => option.footer !== "Free", + (option) => option.title, + ) +} diff --git a/packages/opencode/test/cli/cmd/tui/model-options.test.ts b/packages/opencode/test/cli/cmd/tui/model-options.test.ts new file mode 100644 index 0000000000..195078ebd6 --- /dev/null +++ b/packages/opencode/test/cli/cmd/tui/model-options.test.ts @@ -0,0 +1,30 @@ +import { describe, expect, test } from "bun:test" +import { sortModelOptions } from "../../../../src/cli/cmd/tui/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, + ) + + expect(sorted.map((model) => model.title)).toEqual(["GPT 5.4", "GPT 5.2", "GPT 5.1"]) + }) + + test("preserves free-first alphabetical ordering for the regular picker", () => { + const sorted = sortModelOptions( + [ + { title: "Beta", releaseDate: "2026-01-01" }, + { title: "Alpha", releaseDate: "2025-01-01", footer: "Free" }, + { title: "Gamma", releaseDate: "2024-01-01", footer: "Free" }, + ], + false, + ) + + expect(sorted.map((model) => model.title)).toEqual(["Alpha", "Gamma", "Beta"]) + }) +})