From 124714ca3a102817d35fb91ef5a951aba69f50ca Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Fri, 29 May 2026 23:18:04 +0000 Subject: [PATCH] fix(tui): keep command palette available in questions --- packages/opencode/src/cli/cmd/tui/app.tsx | 6 ++++- .../opencode/test/cli/tui/keymap.test.tsx | 24 ++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 68803d0d118c..0a8fb92bb61e 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -95,7 +95,6 @@ const appGlobalBindingCommands = [ ] as const const appBindingCommands = [ - "command.palette.show", "model.list", "model.cycle_recent", "model.cycle_recent_reverse", @@ -939,6 +938,11 @@ function App(props: { onSnapshot?: () => Promise }) { commands: appCommands(), })) + useBindings(() => ({ + enabled: () => dialog.stack.length === 0, + bindings: tuiConfig.keybinds.get(COMMAND_PALETTE_COMMAND), + })) + useBindings(() => ({ mode: OPENCODE_BASE_MODE, bindings: tuiConfig.keybinds.gather("app", appBindingCommands), diff --git a/packages/opencode/test/cli/tui/keymap.test.tsx b/packages/opencode/test/cli/tui/keymap.test.tsx index d1ebefb4c165..007a660e9ce2 100644 --- a/packages/opencode/test/cli/tui/keymap.test.tsx +++ b/packages/opencode/test/cli/tui/keymap.test.tsx @@ -5,6 +5,7 @@ import { expect, test } from "bun:test" import { onCleanup } from "solid-js" import { createTuiResolvedConfig } from "../../fixture/tui-runtime" import { + COMMAND_PALETTE_COMMAND, getOpencodeModeStack, OPENCODE_BASE_MODE, OpencodeKeymapProvider, @@ -68,12 +69,14 @@ test("mode-less bindings stay active when opencode mode changes", async () => { const offKeymap = registerOpencodeKeymap(keymap, renderer, config) const offGlobal = keymap.registerLayer({ commands: [ + { name: COMMAND_PALETTE_COMMAND, run() {} }, { name: "session.list", run() {} }, { name: "session.new", run() {} }, { name: "session.page.up", run() {} }, { name: "session.first", run() {} }, ], bindings: config.keybinds.gather("test.global", [ + COMMAND_PALETTE_COMMAND, "session.list", "session.new", "session.page.up", @@ -90,7 +93,7 @@ test("mode-less bindings stay active when opencode mode changes", async () => { Array.from( keymap.getCommandBindings({ 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], ), @@ -120,9 +123,24 @@ test("mode-less bindings stay active when opencode mode changes", async () => { const app = await testRender(() => ) try { expect(counts).toEqual({ - base: { "session.list": 1, "session.new": 1, "session.page.up": 2, "session.first": 2, "model.list": 1 }, - question: { "session.list": 1, "session.new": 1, "session.page.up": 2, "session.first": 2, "model.list": 0 }, + base: { + [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: { + [COMMAND_PALETTE_COMMAND]: 1, "session.list": 1, "session.new": 1, "session.page.up": 2,