diff --git a/packages/tui/src/app.tsx b/packages/tui/src/app.tsx index 17a9a554c2e..0bca57d343a 100644 --- a/packages/tui/src/app.tsx +++ b/packages/tui/src/app.tsx @@ -98,7 +98,6 @@ const appGlobalBindingCommands = [ ] as const const appBindingCommands = [ - "command.palette.show", "model.list", "model.cycle_recent", "model.cycle_recent_reverse", @@ -930,6 +929,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 b0eed308124..1b1afd9b4f3 100644 --- a/packages/tui/test/keymap.test.tsx +++ b/packages/tui/test/keymap.test.tsx @@ -1,22 +1,16 @@ /** @jsxImportSource @opentui/solid */ import { createDefaultOpenTuiKeymap } from "@opentui/keymap/opentui" -import { createBindingLookup } from "@opentui/keymap/extras" 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" - -function createResolvedKeymapConfig(input: TuiKeybind.KeybindOverrides = {}) { - const keybinds = TuiKeybind.parse(input) - return { - keybinds: createBindingLookup(TuiKeybind.toBindingConfig(keybinds), { - commandMap: TuiKeybind.CommandMap, - bindingDefaults: TuiKeybind.bindingDefaults(), - }), - leader_timeout: 2000, - } -} +import { createTuiResolvedConfig } from "./fixture/tui-runtime" +import { + COMMAND_PALETTE_COMMAND, + getOpencodeModeStack, + OPENCODE_BASE_MODE, + OpencodeKeymapProvider, + registerOpencodeKeymap, +} from "../src/keymap" test("legacy page key aliases compile as page keys", async () => { const sequences: Record = {} @@ -24,10 +18,7 @@ test("legacy page key aliases compile as page keys", async () => { function Harness() { const renderer = useRenderer() const keymap = createDefaultOpenTuiKeymap(renderer) - const config = createResolvedKeymapConfig({ - messages_page_up: "pgup", - messages_page_down: "pgdown", - }) + const config = createTuiResolvedConfig({ keybinds: { messages_page_up: "pgup", messages_page_down: "pgdown" } }) const offKeymap = registerOpencodeKeymap(keymap, renderer, config) const offLayer = keymap.registerLayer({ bindings: config.keybinds.gather("session", ["session.page.up", "session.page.down"]), @@ -69,16 +60,18 @@ test("mode-less bindings stay active when opencode mode changes", async () => { function Harness() { const renderer = useRenderer() const keymap = createDefaultOpenTuiKeymap(renderer) - const config = createResolvedKeymapConfig() + const config = createTuiResolvedConfig() 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 +88,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], ), @@ -125,9 +118,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,