From 85fe41bad0f6e3ab83de6b83f9635482daee79c4 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sun, 15 Feb 2026 00:07:10 -0800 Subject: [PATCH] Fix terminal close behavior without toggling drawer Co-authored-by: codex --- apps/web/src/store.test.ts | 12 ++++++------ apps/web/src/store.ts | 20 ++++++++++++++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/apps/web/src/store.test.ts b/apps/web/src/store.test.ts index 176a6a73fc0d93a11d81b8586c58abe5750291b0..eb8662dd97a4b034c6989397a176ca382649164c 100644 --- a/apps/web/src/store.test.ts +++ b/apps/web/src/store.test.ts @@ -287,7 +287,7 @@ describe("store reducer thread continuity", () => { ]); }); - it("closes the final terminal and hides the drawer", () => { + it("closes the final terminal and keeps the drawer visibility unchanged", () => { const state = makeState( makeThread({ terminalOpen: true, @@ -300,14 +300,14 @@ describe("store reducer thread continuity", () => { terminalId: DEFAULT_THREAD_TERMINAL_ID, }); - expect(next.threads[0]?.terminalOpen).toBe(false); - expect(next.threads[0]?.terminalIds).toEqual([DEFAULT_THREAD_TERMINAL_ID]); + expect(next.threads[0]?.terminalOpen).toBe(true); + expect(next.threads[0]?.terminalIds).toEqual([`${DEFAULT_THREAD_TERMINAL_ID}-next`]); expect(next.threads[0]?.runningTerminalIds).toEqual([]); - expect(next.threads[0]?.activeTerminalId).toBe(DEFAULT_THREAD_TERMINAL_ID); + expect(next.threads[0]?.activeTerminalId).toBe(`${DEFAULT_THREAD_TERMINAL_ID}-next`); expect(next.threads[0]?.terminalGroups).toEqual([ { - id: `group-${DEFAULT_THREAD_TERMINAL_ID}`, - terminalIds: [DEFAULT_THREAD_TERMINAL_ID], + id: `group-${DEFAULT_THREAD_TERMINAL_ID}-next`, + terminalIds: [`${DEFAULT_THREAD_TERMINAL_ID}-next`], }, ]); }); diff --git a/apps/web/src/store.ts b/apps/web/src/store.ts index eb21350551b692d9f6fa21eca2c2106c012cd7ef..ad5564979925498869039e3f3aec325f5e1f856b 100644 --- a/apps/web/src/store.ts +++ b/apps/web/src/store.ts @@ -164,6 +164,13 @@ function fallbackGroupId(terminalId: string): string { return `group-${terminalId}`; } +function replacementTerminalId(closedTerminalId: string): string { + const normalizedId = closedTerminalId.trim(); + return normalizedId === DEFAULT_THREAD_TERMINAL_ID + ? `${DEFAULT_THREAD_TERMINAL_ID}-next` + : DEFAULT_THREAD_TERMINAL_ID; +} + function assignUniqueGroupId(groupId: string, usedGroupIds: Set): string { if (!usedGroupIds.has(groupId)) { usedGroupIds.add(groupId); @@ -269,19 +276,20 @@ function closeThreadTerminal(thread: Thread, terminalId: string): Thread { const remainingTerminalIds = thread.terminalIds.filter((id) => id !== terminalId); if (remainingTerminalIds.length === 0) { + const nextTerminalId = replacementTerminalId(terminalId); + const nextTerminalGroupId = fallbackGroupId(nextTerminalId); return normalizeThreadTerminals({ ...thread, - terminalOpen: false, - terminalIds: [DEFAULT_THREAD_TERMINAL_ID], + terminalIds: [nextTerminalId], runningTerminalIds: [], - activeTerminalId: DEFAULT_THREAD_TERMINAL_ID, + activeTerminalId: nextTerminalId, terminalGroups: [ { - id: fallbackGroupId(DEFAULT_THREAD_TERMINAL_ID), - terminalIds: [DEFAULT_THREAD_TERMINAL_ID], + id: nextTerminalGroupId, + terminalIds: [nextTerminalId], }, ], - activeTerminalGroupId: fallbackGroupId(DEFAULT_THREAD_TERMINAL_ID), + activeTerminalGroupId: nextTerminalGroupId, }); } -- 2.54.0