From 8463abc59d4e2ef141ee8969f0dbb661e62a1b14 Mon Sep 17 00:00:00 2001 From: imccyu <276526105+imccyu@users.noreply.github.com> Date: Wed, 30 Sep 2026 20:45:40 +0800 Subject: [PATCH] fix(sidebar): preserve Session Tab lifetimes and pane-local pages --- .../ui-sidebar-right/src/client/service.ts | 9 +- .../src/client/shell/SidebarRight.tsx | 10 +- .../tests/seat.client.spec.tsx | 98 +++++++++++++++++++ 3 files changed, 108 insertions(+), 9 deletions(-) diff --git a/packages/client/ui-sidebar-right/src/client/service.ts b/packages/client/ui-sidebar-right/src/client/service.ts index c4bfc1252b..f3d90e7584 100644 --- a/packages/client/ui-sidebar-right/src/client/service.ts +++ b/packages/client/ui-sidebar-right/src/client/service.ts @@ -37,7 +37,7 @@ import { sidebarTargetFromElement, type SidebarRightTarget } from './focus.ts' import { randomUUID } from '@deepseek-ai/dsh-util-crypto' import { createSnapshotStore, type ObservableSnapshot } from '@deepseek-ai/dsh-client-store' import type { FloatRect, PaneId, TabId, TabRecord } from '@deepseek-ai/dsh-client-ui-dockkit' -import { activeDockPaneId, canSplit, findContentTab, dockPaneIds, findTabPane, getPane } from '@deepseek-ai/dsh-client-ui-dockkit' +import { activeDockPaneId, canSplit, findContentTab, findPaneContentTab, dockPaneIds, findTabPane, getPane } from '@deepseek-ai/dsh-client-ui-dockkit' import type { BoundActions } from '@deepseek-ai/dsh-client-ui-slots' import type { SessionId } from '@deepseek-ai/dsh-session/types' import type { SidebarRightNavigationParams, SidebarRightResourceParams, SidebarRightTabParamsFor } from './contract/params.ts' @@ -440,8 +440,11 @@ export class SidebarRightController implements ISidebarRight { }, (tabId) => { this.tabDomain.navigate(sessionId, tabId, { address, params }) }) } const layout = surface?.layout const replaced = placement.replaceTab === undefined ? undefined : layout?.tabs[placement.replaceTab] - const revealed = layout === undefined || placement.revealIfOpened === false - ? undefined : findContentTab(layout, claim.contentId, claim.kind) + const replacementPane = replaced === undefined || layout === undefined ? undefined : findTabPane(layout, replaced.id) + const revealed = layout === undefined ? undefined + : claim.contentId === pageAddress(claim.kind) + ? findPaneContentTab(layout, replacementPane?.host === 'dock' ? replacementPane.id : placement.paneId ?? activeDockPaneId(layout), claim.contentId, claim.kind) + : placement.revealIfOpened === false ? undefined : findContentTab(layout, claim.contentId, claim.kind) if (replaced === undefined || replaced.id === revealed) { commit(); return } this.removeAfterCleanup(sessionId, replaced, commit) } diff --git a/packages/client/ui-sidebar-right/src/client/shell/SidebarRight.tsx b/packages/client/ui-sidebar-right/src/client/shell/SidebarRight.tsx index 39fc5f6778..484dfe458b 100644 --- a/packages/client/ui-sidebar-right/src/client/shell/SidebarRight.tsx +++ b/packages/client/ui-sidebar-right/src/client/shell/SidebarRight.tsx @@ -210,8 +210,8 @@ function TabSlot({ }), [tab.id, seat, fullscreen, active, signal, tabActions, useStore, useTabNavigation, shortcuts]) const content = renderSlot(seat, {}, { entryKey: definition?.id ?? tab.kind, fallback, hookContext }) return seat === 'sidebar.right.pane.tab.title' - ? {content} - :
{content}
+ ? {content} + :
{content}
} /** @@ -312,10 +312,8 @@ function SidebarPanel(panel: PanelProps & { width: number; panelRef: RefObject