diff --git a/packages/opencode/src/cli/cmd/run/footer.command.tsx b/packages/opencode/src/cli/cmd/run/footer.command.tsx index c97af0ce09..3176c1724f 100644 --- a/packages/opencode/src/cli/cmd/run/footer.command.tsx +++ b/packages/opencode/src/cli/cmd/run/footer.command.tsx @@ -633,6 +633,12 @@ export function RunSubagentSelectBody(props: { return } + if (event.name.toLowerCase() === "up" && menu.selected() === 0) { + event.preventDefault() + props.onClose() + return + } + handleKey({ event, menu, field: () => field, setQuery, select, close: props.onClose }) }) diff --git a/packages/opencode/test/cli/run/footer.view.test.tsx b/packages/opencode/test/cli/run/footer.view.test.tsx index 2e9fd8ef17..d54e2e3fd6 100644 --- a/packages/opencode/test/cli/run/footer.view.test.tsx +++ b/packages/opencode/test/cli/run/footer.view.test.tsx @@ -642,6 +642,42 @@ test("direct subagent panel renders active subagents", async () => { } }) +test("direct subagent panel closes when moving up from the first item", async () => { + const [tabs] = createSignal([ + subagent({ sessionID: "s-1", label: "Explore", description: "Inspect auth flow" }), + subagent({ sessionID: "s-2", label: "General", description: "Write migration plan" }), + ]) + const [current] = createSignal() + let closed = 0 + + const app = await testRender( + () => ( + + RUN_THEME_FALLBACK.footer} + tabs={tabs} + current={current} + onClose={() => closed++} + onSelect={() => {}} + /> + + ), + { width: 100, height: RUN_SUBAGENT_PANEL_ROWS }, + ) + + try { + await app.renderOnce() + app.mockInput.pressKey("ARROW_DOWN") + app.mockInput.pressKey("ARROW_UP") + expect(closed).toBe(0) + + app.mockInput.pressKey("ARROW_UP") + expect(closed).toBe(1) + } finally { + app.renderer.destroy() + } +}) + test("direct queued prompt panel renders pending prompt actions", async () => { const [prompts] = createSignal([ { messageID: "m-1", partID: "p-1", prompt: { text: "fix the auth test", parts: [] } },