summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLuke Parker <[email protected]>2026-03-30 15:42:38 +1000
committerGitHub <[email protected]>2026-03-30 15:42:38 +1000
commit186af2723d7dab64453dfd43355fff55336e48b7 (patch)
tree48dc218c55678441b432af2d52f6e2f9076e0ac2
parent6926fe1c7455f4cd075d374b188850c14cda0fb2 (diff)
downloadopencode-186af2723d7dab64453dfd43355fff55336e48b7.tar.gz
opencode-186af2723d7dab64453dfd43355fff55336e48b7.zip
make variant modal less annoying (#19998)
-rw-r--r--packages/opencode/src/cli/cmd/tui/app.tsx14
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx8
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/dialog-variant.tsx26
-rw-r--r--packages/opencode/src/cli/cmd/tui/context/local.tsx10
4 files changed, 46 insertions, 12 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx
index 3cb383be4..3e4d0b427 100644
--- a/packages/opencode/src/cli/cmd/tui/app.tsx
+++ b/packages/opencode/src/cli/cmd/tui/app.tsx
@@ -581,11 +581,23 @@ function App(props: { onSnapshot?: () => Promise<string[]> }) {
},
},
{
- title: "Switch model variant",
+ title: "Variant cycle",
value: "variant.cycle",
keybind: "variant_cycle",
category: "Agent",
onSelect: () => {
+ local.model.variant.cycle()
+ },
+ },
+ {
+ title: "Switch model variant",
+ value: "variant.list",
+ category: "Agent",
+ hidden: local.model.variant.list().length === 0,
+ slash: {
+ name: "variants",
+ },
+ onSelect: () => {
dialog.replace(() => <DialogVariant />)
},
},
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 ee9fa225e..549165f51 100644
--- a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx
@@ -136,7 +136,13 @@ export function DialogModel(props: { providerID?: string }) {
function onSelect(providerID: string, modelID: string) {
local.model.set({ providerID, modelID }, { recent: true })
- if (local.model.variant.list().length > 0) {
+ const list = local.model.variant.list()
+ const cur = local.model.variant.selected()
+ if (cur === "default" || (cur && list.includes(cur))) {
+ dialog.clear()
+ return
+ }
+ if (list.length > 0) {
dialog.replace(() => <DialogVariant />)
return
}
diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-variant.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-variant.tsx
index 872092d23..28ee1b282 100644
--- a/packages/opencode/src/cli/cmd/tui/component/dialog-variant.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/dialog-variant.tsx
@@ -8,21 +8,31 @@ export function DialogVariant() {
const dialog = useDialog()
const options = createMemo(() => {
- return local.model.variant.list().map((variant) => ({
- value: variant,
- title: variant,
- onSelect: () => {
- dialog.clear()
- local.model.variant.set(variant)
+ return [
+ {
+ value: "default",
+ title: "Default",
+ onSelect: () => {
+ dialog.clear()
+ local.model.variant.set(undefined)
+ },
},
- }))
+ ...local.model.variant.list().map((variant) => ({
+ value: variant,
+ title: variant,
+ onSelect: () => {
+ dialog.clear()
+ local.model.variant.set(variant)
+ },
+ })),
+ ]
})
return (
<DialogSelect<string>
options={options()}
title={"Select variant"}
- current={local.model.variant.current()}
+ current={local.model.variant.selected()}
flat={true}
/>
)
diff --git a/packages/opencode/src/cli/cmd/tui/context/local.tsx b/packages/opencode/src/cli/cmd/tui/context/local.tsx
index d93079f12..e131df358 100644
--- a/packages/opencode/src/cli/cmd/tui/context/local.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/local.tsx
@@ -321,12 +321,18 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
})
},
variant: {
- current() {
+ selected() {
const m = currentModel()
if (!m) return undefined
const key = `${m.providerID}/${m.modelID}`
return modelStore.variant[key]
},
+ current() {
+ const v = this.selected()
+ if (!v) return undefined
+ if (!this.list().includes(v)) return undefined
+ return v
+ },
list() {
const m = currentModel()
if (!m) return []
@@ -339,7 +345,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
const m = currentModel()
if (!m) return
const key = `${m.providerID}/${m.modelID}`
- setModelStore("variant", key, value)
+ setModelStore("variant", key, value ?? "default")
save()
},
cycle() {