diff --git a/packages/tui/src/routes/session/composer/shell-tab.tsx b/packages/tui/src/routes/session/composer/shell-tab.tsx index 9a5092399f..b4edfd6d10 100644 --- a/packages/tui/src/routes/session/composer/shell-tab.tsx +++ b/packages/tui/src/routes/session/composer/shell-tab.tsx @@ -23,6 +23,19 @@ 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)) }) diff --git a/packages/tui/test/cli/tui/composer-keymap.test.tsx b/packages/tui/test/cli/tui/composer-keymap.test.tsx index fbccd5b3f2..534db4d70f 100644 --- a/packages/tui/test/cli/tui/composer-keymap.test.tsx +++ b/packages/tui/test/cli/tui/composer-keymap.test.tsx @@ -23,7 +23,11 @@ const sessions = { const shells = [shell("sh-a", "bun test"), shell("sh-b", "bun dev")] -async function renderComposer(defaultTab: "subagents" | "shell", keybinds: Partial) { +async function renderComposer( + defaultTab: "subagents" | "shell", + keybinds: Partial, + focusedTextarea = false, +) { const events = createEventStream() const interrupted: string[] = [] const removed: string[] = [] @@ -69,7 +73,21 @@ async function renderComposer(defaultTab: "subagents" | "shell", keybinds: Parti .then(() => wait(() => data.session.status("child-a") === "running")) .then(() => ready.resolve(), ready.reject) }) - return closed++} /> + return ( + <> + {focusedTextarea &&