From 1f128ebe95211b47104f141f0c4bc873db60a782 Mon Sep 17 00:00:00 2001 From: Ariane Emory Date: Sun, 14 Dec 2025 16:04:12 -0500 Subject: [PATCH] feat: add configurable recent models count Add tui.recent_models_count setting to allow users to configure how many recent models are stored and displayed in the model selection dialog. - Add recent_models_count field to TUI config schema (1-50, default 10) - Update storage logic in local.tsx to use configurable limit - Update display logic in dialog-model.tsx to use same limit - Regenerate TypeScript SDK to include new field Fixes #5533 --- .../opencode/src/cli/cmd/tui/component/dialog-model.tsx | 3 ++- packages/opencode/src/cli/cmd/tui/context/local.tsx | 6 ++++-- packages/opencode/src/config/config.ts | 9 +++++++++ packages/sdk/js/src/v2/gen/types.gen.ts | 4 ++++ 4 files changed, 19 insertions(+), 3 deletions(-) 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 38fd5745858..c0ec9c908e7 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx @@ -34,12 +34,13 @@ export function DialogModel(props: { providerID?: string }) { const favorites = showExtra() ? local.model.favorite() : [] const recents = local.model.recent() + const limit = sync.data.config.tui?.recent_models_count ?? 10 const recentList = showExtra() ? recents .filter( (item) => !favorites.some((fav) => fav.providerID === item.providerID && fav.modelID === item.modelID), ) - .slice(0, 5) + .slice(0, limit) : [] const favoriteOptions = !query diff --git a/packages/opencode/src/cli/cmd/tui/context/local.tsx b/packages/opencode/src/cli/cmd/tui/context/local.tsx index 6cc97e04167..130f6264590 100644 --- a/packages/opencode/src/cli/cmd/tui/context/local.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/local.tsx @@ -266,7 +266,8 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ if (!next) return setModelStore("model", agent.current().name, { ...next }) const uniq = uniqueBy([next, ...modelStore.recent], (x) => x.providerID + x.modelID) - if (uniq.length > 10) uniq.pop() + const limit = sync.data.config.tui?.recent_models_count ?? 10 + if (uniq.length > limit) uniq.pop() setModelStore("recent", uniq) save() }, @@ -283,7 +284,8 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({ setModelStore("model", agent.current().name, model) if (options?.recent) { const uniq = uniqueBy([model, ...modelStore.recent], (x) => x.providerID + x.modelID) - if (uniq.length > 10) uniq.pop() + const limit = sync.data.config.tui?.recent_models_count ?? 10 + if (uniq.length > limit) uniq.pop() setModelStore("recent", uniq) save() } diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 42f6b11e9f5..348fa2b97e9 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -568,7 +568,16 @@ export namespace Config { .enum(["auto", "stacked"]) .optional() .describe("Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column"), + recent_models_count: z + .number() + .int() + .min(1) + .max(50) + .optional() + .default(10) + .describe("Number of recent models to store and display in model selection"), }) + export type TUI = z.infer export const Layout = z.enum(["auto", "stretch"]).meta({ ref: "LayoutConfig", diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 9d0bbcc92cd..105fd7c7a8d 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1346,6 +1346,10 @@ export type Config = { * Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column */ diff_style?: "auto" | "stacked" + /** + * Number of recent models to store and display in model selection + */ + recent_models_count?: number } /** * Command configuration, see https://opencode.ai/docs/commands