Skip to content

Commit f186b3c

Browse files
committed
fix: make variant modal less annoying
1 parent b234370 commit f186b3c

5 files changed

Lines changed: 50 additions & 16 deletions

File tree

packages/opencode/src/cli/cmd/tui/app.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,10 +581,22 @@ function App(props: { onSnapshot?: () => Promise<string[]> }) {
581581
},
582582
},
583583
{
584-
title: "Switch model variant",
584+
title: "Variant cycle",
585585
value: "variant.cycle",
586586
keybind: "variant_cycle",
587587
category: "Agent",
588+
onSelect: () => {
589+
local.model.variant.cycle()
590+
},
591+
},
592+
{
593+
title: "Switch model variant",
594+
value: "variant.list",
595+
category: "Agent",
596+
hidden: local.model.variant.list().length === 0,
597+
slash: {
598+
name: "variants",
599+
},
588600
onSelect: () => {
589601
dialog.replace(() => <DialogVariant />)
590602
},

packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,13 @@ export function DialogModel(props: { providerID?: string }) {
136136

137137
function onSelect(providerID: string, modelID: string) {
138138
local.model.set({ providerID, modelID }, { recent: true })
139-
if (local.model.variant.list().length > 0) {
139+
const list = local.model.variant.list()
140+
const cur = local.model.variant.selected()
141+
if (cur === "default" || (cur && list.includes(cur))) {
142+
dialog.clear()
143+
return
144+
}
145+
if (list.length > 0) {
140146
dialog.replace(() => <DialogVariant />)
141147
return
142148
}

packages/opencode/src/cli/cmd/tui/component/dialog-variant.tsx

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,31 @@ export function DialogVariant() {
88
const dialog = useDialog()
99

1010
const options = createMemo(() => {
11-
return local.model.variant.list().map((variant) => ({
12-
value: variant,
13-
title: variant,
14-
onSelect: () => {
15-
dialog.clear()
16-
local.model.variant.set(variant)
11+
return [
12+
{
13+
value: "default",
14+
title: "Default",
15+
onSelect: () => {
16+
dialog.clear()
17+
local.model.variant.set(undefined)
18+
},
1719
},
18-
}))
20+
...local.model.variant.list().map((variant) => ({
21+
value: variant,
22+
title: variant,
23+
onSelect: () => {
24+
dialog.clear()
25+
local.model.variant.set(variant)
26+
},
27+
})),
28+
]
1929
})
2030

2131
return (
2232
<DialogSelect<string>
2333
options={options()}
2434
title={"Select variant"}
25-
current={local.model.variant.current()}
35+
current={local.model.variant.selected()}
2636
flat={true}
2737
/>
2838
)

packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,7 @@ export function Prompt(props: PromptProps) {
632632

633633
// Capture mode before it gets reset
634634
const currentMode = store.mode
635-
const variant = local.model.variant.current()
635+
const variant = local.model.variant.selected()
636636

637637
if (store.mode === "shell") {
638638
sdk.client.session.shell({

packages/opencode/src/cli/cmd/tui/context/local.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -321,12 +321,18 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
321321
})
322322
},
323323
variant: {
324-
current() {
324+
selected() {
325325
const m = currentModel()
326326
if (!m) return undefined
327327
const key = `${m.providerID}/${m.modelID}`
328328
return modelStore.variant[key]
329329
},
330+
current() {
331+
const v = this.selected()
332+
if (!v) return undefined
333+
if (!this.list().includes(v)) return undefined
334+
return v
335+
},
330336
list() {
331337
const m = currentModel()
332338
if (!m) return []
@@ -339,18 +345,18 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
339345
const m = currentModel()
340346
if (!m) return
341347
const key = `${m.providerID}/${m.modelID}`
342-
setModelStore("variant", key, value)
348+
setModelStore("variant", key, value ?? "default")
343349
save()
344350
},
345351
cycle() {
346352
const variants = this.list()
347353
if (variants.length === 0) return
348-
const current = this.current()
349-
if (!current) {
354+
const cur = this.current()
355+
if (!cur) {
350356
this.set(variants[0])
351357
return
352358
}
353-
const index = variants.indexOf(current)
359+
const index = variants.indexOf(cur)
354360
if (index === -1 || index === variants.length - 1) {
355361
this.set(undefined)
356362
return

0 commit comments

Comments
 (0)