Quellcode durchsuchen

fix(tui): prioritize composer keybinds (#42384)

Kit Langton vor 3 Tagen
Ursprung
Commit
9fff6e2b4f

+ 1 - 0
packages/tui/src/routes/session/composer/index.tsx

@@ -94,6 +94,7 @@ export function Composer(props: ComposerProps) {
   Keymap.createLayer(() => ({
     mode: "composer",
     enabled: () => props.open,
+    priority: 1,
     commands: [
       { bind: "left", title: "Previous tab", group: "Composer", run: () => switchTab(-1) },
       { bind: "right", title: "Next tab", group: "Composer", run: () => switchTab(1) },

+ 1 - 13
packages/tui/src/routes/session/composer/shell-tab.tsx

@@ -23,19 +23,6 @@ export function ShellTab(props: { sessionID: string }) {
 
   const selectedEntry = createMemo(() => entries()[store.selected])
 
-  const keymap = Keymap.use()
-  createEffect(() => {
-    if (!composer.active("shell")) return
-    const cleanup = keymap.intercept("key", ({ event, consume }) => {
-      if (event.name !== "d" || !event.ctrl) return
-      if (!shortcuts.list("composer.shell.kill").includes("ctrl+d")) return
-      if (!selectedEntry()) return
-      consume()
-      keymap.dispatch("composer.shell.kill")
-    })
-    onCleanup(cleanup)
-  })
-
   createEffect(() => {
     if (store.selected >= entries().length) setStore("selected", Math.max(0, entries().length - 1))
   })
@@ -63,6 +50,7 @@ export function ShellTab(props: { sessionID: string }) {
   Keymap.createLayer(() => ({
     mode: "composer",
     enabled: () => composer.active("shell"),
+    priority: 1,
     commands: [
       {
         id: "composer.shell.up",

+ 1 - 0
packages/tui/src/routes/session/composer/subagents-tab.tsx

@@ -164,6 +164,7 @@ export function SubagentsTab(props: { sessionID: string }) {
   Keymap.createLayer(() => ({
     mode: "composer",
     enabled: () => composer.active("subagents"),
+    priority: 1,
     commands: [
       {
         id: "composer.subagent.up",

+ 6 - 4
packages/tui/test/cli/tui/composer-keymap.test.tsx

@@ -95,7 +95,6 @@ async function renderComposer(
       <TestTuiContexts directory={directory}>
         <ConfigProvider config={createTuiResolvedConfig({ keybinds })}>
           <Keymap.Provider>
-            <AppExit />
             <ClientProvider api={createApi(calls.fetch)}>
               <DataProvider>
                 <LocationProvider>
@@ -107,6 +106,7 @@ async function renderComposer(
                 </LocationProvider>
               </DataProvider>
             </ClientProvider>
+            <AppExit />
           </Keymap.Provider>
         </ConfigProvider>
       </TestTuiContexts>
@@ -173,11 +173,13 @@ test("disabled shell bindings have no component fallbacks", async () => {
   }
 })
 
-test("shell kill binding overrides app exit", async () => {
-  const composer = await renderComposer("shell", {}, true)
+test("configured composer bindings work with a focused textarea", async () => {
+  const composer = await renderComposer("subagents", { "composer.shell.kill": "ctrl+u" }, true)
   try {
+    composer.app.mockInput.pressArrow("right")
+    await composer.app.renderOnce()
     expect(composer.app.captureCharFrame()).toContain("bun test")
-    composer.app.mockInput.pressKey("d", { ctrl: true })
+    composer.app.mockInput.pressKey("u", { ctrl: true })
     await wait(() => composer.removed.length === 1)
     expect(composer.removed).toEqual(["sh-a"])
   } finally {