fix(tui): keep command palette available in questions

This commit is contained in:
opencode-agent[bot] 2026-05-29 23:18:04 +00:00
commit 124714ca3a
2 changed files with 26 additions and 4 deletions

View file

@ -95,7 +95,6 @@ const appGlobalBindingCommands = [
] as const ] as const
const appBindingCommands = [ const appBindingCommands = [
"command.palette.show",
"model.list", "model.list",
"model.cycle_recent", "model.cycle_recent",
"model.cycle_recent_reverse", "model.cycle_recent_reverse",
@ -939,6 +938,11 @@ function App(props: { onSnapshot?: () => Promise<string[]> }) {
commands: appCommands(), commands: appCommands(),
})) }))
useBindings(() => ({
enabled: () => dialog.stack.length === 0,
bindings: tuiConfig.keybinds.get(COMMAND_PALETTE_COMMAND),
}))
useBindings(() => ({ useBindings(() => ({
mode: OPENCODE_BASE_MODE, mode: OPENCODE_BASE_MODE,
bindings: tuiConfig.keybinds.gather("app", appBindingCommands), bindings: tuiConfig.keybinds.gather("app", appBindingCommands),

View file

@ -5,6 +5,7 @@ import { expect, test } from "bun:test"
import { onCleanup } from "solid-js" import { onCleanup } from "solid-js"
import { createTuiResolvedConfig } from "../../fixture/tui-runtime" import { createTuiResolvedConfig } from "../../fixture/tui-runtime"
import { import {
COMMAND_PALETTE_COMMAND,
getOpencodeModeStack, getOpencodeModeStack,
OPENCODE_BASE_MODE, OPENCODE_BASE_MODE,
OpencodeKeymapProvider, OpencodeKeymapProvider,
@ -68,12 +69,14 @@ test("mode-less bindings stay active when opencode mode changes", async () => {
const offKeymap = registerOpencodeKeymap(keymap, renderer, config) const offKeymap = registerOpencodeKeymap(keymap, renderer, config)
const offGlobal = keymap.registerLayer({ const offGlobal = keymap.registerLayer({
commands: [ commands: [
{ name: COMMAND_PALETTE_COMMAND, run() {} },
{ name: "session.list", run() {} }, { name: "session.list", run() {} },
{ name: "session.new", run() {} }, { name: "session.new", run() {} },
{ name: "session.page.up", run() {} }, { name: "session.page.up", run() {} },
{ name: "session.first", run() {} }, { name: "session.first", run() {} },
], ],
bindings: config.keybinds.gather("test.global", [ bindings: config.keybinds.gather("test.global", [
COMMAND_PALETTE_COMMAND,
"session.list", "session.list",
"session.new", "session.new",
"session.page.up", "session.page.up",
@ -90,7 +93,7 @@ test("mode-less bindings stay active when opencode mode changes", async () => {
Array.from( Array.from(
keymap.getCommandBindings({ keymap.getCommandBindings({
visibility: "active", visibility: "active",
commands: ["session.list", "session.new", "session.page.up", "session.first", "model.list"], commands: [COMMAND_PALETTE_COMMAND, "session.list", "session.new", "session.page.up", "session.first", "model.list"],
}), }),
([command, bindings]) => [command, bindings.length], ([command, bindings]) => [command, bindings.length],
), ),
@ -120,9 +123,24 @@ test("mode-less bindings stay active when opencode mode changes", async () => {
const app = await testRender(() => <Harness />) const app = await testRender(() => <Harness />)
try { try {
expect(counts).toEqual({ expect(counts).toEqual({
base: { "session.list": 1, "session.new": 1, "session.page.up": 2, "session.first": 2, "model.list": 1 }, base: {
question: { "session.list": 1, "session.new": 1, "session.page.up": 2, "session.first": 2, "model.list": 0 }, [COMMAND_PALETTE_COMMAND]: 1,
"session.list": 1,
"session.new": 1,
"session.page.up": 2,
"session.first": 2,
"model.list": 1,
},
question: {
[COMMAND_PALETTE_COMMAND]: 1,
"session.list": 1,
"session.new": 1,
"session.page.up": 2,
"session.first": 2,
"model.list": 0,
},
autocomplete: { autocomplete: {
[COMMAND_PALETTE_COMMAND]: 1,
"session.list": 1, "session.list": 1,
"session.new": 1, "session.new": 1,
"session.page.up": 2, "session.page.up": 2,