dsh-sidebar-flex:給 DSH 側欄的會話列表找回垂直空間

前言

DSH 的客戶端 GUI 裏,左側同一列塞了兩個部分:一是全局面板列表(Plugins、Plugin market、Automation、MCP connectors、Learn、Remotion、More),它不滾動,在 1234 px 高的窗口裏喫掉約 396 px;二是下面的 workspace / session 區域,只剩約 120–140 px,也就是兩行會話的高度。

外殼沒有提供把上下兩部分高度互相讓出來的辦法,所以會話列表長一點就會被裁掉,想點的那條根本點不到。這篇介紹的插件就是把這種取捨做成一個拖拽把手。

這個插件是什麼

dsh-sidebar-flex,倉庫 yuyu121704/dsh-sidebar-flex,維護者 yuyu121704,分類「客戶端」。它是一個 client bundle 插件,做的事只有一件:在全局面板列表下方加一條 10 px 的分割條,讓你能把面板列表的高度壓下去,把騰出來的垂直空間留給真正要讀的會話列表。

它只改高度,不改側欄寬度。

核心功能

拖拽分割條。 上下拖動,面板列表隨之收縮或增長,騰出的高度給 workspace + session 區域。

雙擊或右鍵分割條。 面板列表回到它自己的自然高度。

鍵盤微調。 分割條獲得焦點後按 ↑ / ↓,每次調整 24 px。

高度記憶。 重載、重啓、下次啓動都會從 localStorage["dsh-sidebar-flex:nav-height"] 恢復。

有下限,不丟內容。 面板列表最低 54 px(一行)。低於自然高度時列表自己變成可滾動,內容不是被裁掉,只是重新分配了空間。

不動寬度。 側欄寬度由外殼自己管,維持 264–420 px 的 clamp 和外殼自帶的邊緣把手。早先試過接管寬度,如今留在 lib/client.js 裏由 ENABLE_WIDTH 控制,默認 false,處於關閉狀態。

改動作用範圍。 插件只改面板列表的高度,不碰會話內容列。

安裝與啓用

安裝不走包管理器,需要手工把包放進 profile。profile 位於 <DSH data dir>/profiles/<profile>,例如 C:\Users\<you>\.dsh\profiles\desktop;client bundle 必須是該 profile 的 node_modules 裏的一個包,並登記在 profile manifest 裏。

Windows 下從本倉庫 checkout 建立 junction:

# Windows, from a checkout of this repo
New-Item -ItemType Junction `
  -Path  "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-sidebar-flex" `
  -Target (Resolve-Path .)

然後把包名加進該 profile 的 package.json 裏 dsh.profile.bundles:

{
  "dsh": {
    "profile": {
      "bundles": ["...", "dsh-sidebar-flex"]
    }
  }
}

保存文件即可。@deepseek-ai/dsh-hmr 會監視 profile manifest,重新組合 profile 並通過 SSE 推送新的 client graph,分割條無需重啓應用就會出現;如果沒有,重載一次窗口。

這裏刻意不把包登記進 dependencies:插件管理器的 reconcile() 會丟棄「曾經是 dependencies、現在不是了」的 bundle,所以讓 bundle 處於 unmanaged 狀態反而更穩。

典型用法

裝好之後不需要額外配置,分割條就在面板列表正下方。

1、面板列表太高、會話只剩兩行時,按住分割條往下拖,直到會話列表出現足夠多可見行。
2、拖多了想回到原樣,雙擊或右鍵點分割條。
3、只想微調 24 px,Tab 到分割條後按方向鍵。
4、關掉窗口再打開,高度還是上次拖到的位置。

適用場景與注意

適合會話列表較長、想直接在側欄裏翻會話的人,以及希望每個會話行都可見、不必反覆滾動的人。

幾點需要知道的:

  • 這是客戶端插件,以當前 DSH 進程的權限運行。安裝前先讀一遍源碼和許可證(MIT © 2026 yuyu121704),確認來源可信再放進 profile 的 node_modules。
  • client 端的實現方式是輪詢側欄列,找到裏面的全局面板列表,寫入 inline height 並加上一個讓它可滾動的 class。React 每次渲染都會重寫 inline style,所以用 MutationObserver 在重渲染後重新應用高度;外殼若替換了列表節點,把手會被重新掛回父節點。沒有 client service、沒有 React state,啓動階段不容易出問題。
  • 選擇器用 [class*='panelList'] / [class*='sidebarCol'] 這類子串匹配,因爲 DSH 會 hash 自己的 CSS-module 類名。
  • host 端(lib/index.js)被刻意留成惰性,佈局完全在瀏覽器裏渲染,所以沒有 host service,也沒有重啓開銷。
  • 兼容性邊界:peerDependencies: @deepseek-ai/dsh >=0.2.0-rc.2 <0.3.0-0。作者用 @deepseek-ai/dsh-client-ui-layout、-ui-sidebar、-ui-workspace 的 0.2.2 client bundles 構建並驗證過。
  • 版本 0.2.2,社區目錄頁顯示星標爲 0,屬於起步階段的小工具,用前自己驗證一遍。
  • 卸載:從 dsh.profile.bundles 移除 "dsh-sidebar-flex",刪掉 node_modules/dsh-sidebar-flex(junction 或拷貝),可選清除 localStorage["dsh-sidebar-flex:nav-height"]。
  • 目錄頁是獨立的社區站點,與 DeepSeek / 幻方沒有官方從屬關係,別當成官方應用商店。

結尾

dsh-sidebar-flex 做的事很窄:給 DSH 側欄的全局面板列表加一條可拖拽、可記憶的分割條,把垂直空間從面板列表讓給會話列表,寬度和會話內容都不動。DSH 的理念是「一切皆插件」,這類只在客戶端改佈局的小插件正好落在這個模型裏。目錄頁與源碼分別在 https://www.skillhub.cn/plugins/yuyu121704/dsh-sidebar-flex 和 https://github.com/yuyu121704/dsh-sidebar-flex。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜