diff --git a/packages/tui/src/app.tsx b/packages/tui/src/app.tsx index 57f372ef70..7988d1f52d 100644 --- a/packages/tui/src/app.tsx +++ b/packages/tui/src/app.tsx @@ -104,7 +104,6 @@ const appGlobalBindingCommands = [ ] as const const appBindingCommands = [ - "command.palette.show", "model.list", "model.cycle_recent", "model.cycle_recent_reverse", @@ -963,6 +962,11 @@ function App(props: { onSnapshot?: () => Promise; pluginHost: TuiPlugi 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/tui/test/keymap.test.tsx b/packages/tui/test/keymap.test.tsx index b0eed30812..5fff1fb4d2 100644 --- a/packages/tui/test/keymap.test.tsx +++ b/packages/tui/test/keymap.test.tsx @@ -5,7 +5,13 @@ import { testRender, useRenderer } from "@opentui/solid" import { expect, test } from "bun:test" import { onCleanup } from "solid-js" import { TuiKeybind } from "../src/config/keybind" -import { getOpencodeModeStack, OPENCODE_BASE_MODE, OpencodeKeymapProvider, registerOpencodeKeymap } from "../src/keymap" +import { + COMMAND_PALETTE_COMMAND, + getOpencodeModeStack, + OPENCODE_BASE_MODE, + OpencodeKeymapProvider, + registerOpencodeKeymap, +} from "../src/keymap" function createResolvedKeymapConfig(input: TuiKeybind.KeybindOverrides = {}) { const keybinds = TuiKeybind.parse(input) @@ -73,12 +79,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", @@ -95,7 +103,14 @@ 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], ), @@ -125,9 +140,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,