diff --git a/README.md b/README.md
index ddba404..f714779 100644
--- a/README.md
+++ b/README.md
@@ -61,6 +61,8 @@ pnpm watch # tsdown --watch(client bundle 热重建)
## 依赖说明
- `node-pty` / `ws` / `xterm` / `@xterm/addon-fit` / `clsx`:npm 常规依赖(node-pty 使用随包预编译二进制,无源码编译)。
+- pnpm 会剥离 node-pty 预编译 `spawn-helper` 的可执行位(`posix_spawnp failed`);插件启动时自动恢复(
+ `ensureSpawnHelper`,与 `@deepseek-ai/dsh-pty-local` 的 postinstall 同思路,对 link 安装也生效)。
- `@deepseek-ai/*` 包仅以 `link:` 指向 `~/.dsh/source/current`(DSH 源码 checkout,构建产物已存在),仅用于类型;运行时只经模块表消费 `dsh-client-ui-primitives`。
## 安全边界
diff --git a/src/client/Sidebar.tsx b/src/client/Sidebar.tsx
index 2a9c3eb..a2449c2 100644
--- a/src/client/Sidebar.tsx
+++ b/src/client/Sidebar.tsx
@@ -12,7 +12,7 @@
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useSyncExternalStore } from 'react'
import clsx from 'clsx'
-import { IconChevronRightOutline14, IconPanelLeftOutline16, Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'
+import { IconChevronRightOutline14, IconFullscreenOutline16, IconPanelLeftOutline16, Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'
import type { Context } from '../context-types.ts'
import {
allLeaves, closeTab, leafWithTab, mapLeaf, moveTab, moveTabToEdge, openTab,
@@ -101,6 +101,9 @@ export function Sidebar(props: { ctx: Context }) {
const widthDrag = useRef({ startX: 0, startWidth: 0 })
const [draggingWidth, setDraggingWidth] = useState(false)
+ // Whether the panel currently fills the viewport (fullscreen expansion).
+ const fullscreen = state !== undefined && window.innerWidth - state.width < 8
+
const actions: WorkbenchActions = useMemo(() => ({
closeTab: (paneId, tabId) => { sidebarStore.reduce(s => closeTab(s, paneId, tabId)) },
activateTab: (paneId, tabId) => {
@@ -215,6 +218,18 @@ export function Sidebar(props: { ctx: Context }) {
}}
/>
+
{t('explorer')}
{cwd !== undefined ? ` · ${cwd.split(/[\\/]/).filter(Boolean).pop() ?? cwd}` : ''}
diff --git a/src/client/TabBar.tsx b/src/client/TabBar.tsx
index a5c52b6..0e3ae80 100644
--- a/src/client/TabBar.tsx
+++ b/src/client/TabBar.tsx
@@ -96,6 +96,13 @@ export function TabBar(props: {
if (payload !== null) onDropTab(payload, tab.id)
}}
onClick={() => { onActivate(tab.id) }}
+ onAuxClick={(event) => {
+ // Middle-click closes the tab (and suppresses autoscroll).
+ if (event.button === 1) {
+ event.preventDefault()
+ onClose(tab.id)
+ }
+ }}
>
{tab.title}