dsh-header-dock:DSH Web 會話頂欄溢出收納

前言

在 DeepSeek Harness(DSH)Web 裏,會話頂欄會塞進不少插件註冊的按鈕:actions、utilities、corner 三個插槽容器都是 flex:none,它們不會自己變窄;真正被裁切的是中間的標題區(.titleCluster 帶 overflow:clip,右側還有漸隱遮罩)。窄屏或窗口縮小時,按鈕可能被切一半、整塊看不見,而且沒有入口能點到被裁掉的部分。

dsh-header-dock(維護者 ymf2317-tech,分類爲客戶端插件)只做一件事:裝不下時從右側把項收進「»」抽屜,並讓你逐項決定顯示策略和順序;寬屏下不發生收納時,「»」本身不渲染。下面按定位、能力、安裝與日常用法說明。

這是什麼

一句話:給 DSH Web 會話頂欄做 overflow tuck-away——窄屏時多一個「»」抽屜,每項可設四態並排序,附帶左側面板逐行顯示開關。

邊界要明確:本插件只改 style.display 與 style.order,不搬動 React 渲染的 DOM,也不改第三方插件源碼;零構建、零運行時依賴。刪掉存儲鍵並刷新即可恢復原界面。

核心功能

自動收納與「»」抽屜

容器寬度不夠時,從右側逐項收進「»」抽屜;寬度足夠時自動收納邏輯不介入,且「»」按鈕不佔位。被收納的項在浮層裏點擊,等同於點原按鈕,原插件事件處理器照常執行。

逐項四態

管理面板裏每個頂欄條目可選:

狀態 含義
自動(默認) 放得下就顯示;溢出時進「更多」
常顯 自動收納不碰它
收起 強制進「更多」
隱藏 display:none,也不進「更多」

手動態始終優先於自動判斷。

同組排序與來源標識

同組內可用 ▲▼ 調整順序(通過 style.order,不動 DOM)。面板裏標出來源插件;同文案的項會標「疑似重複」。

純展示條目與 corner

沒有可點按鈕的節點(例如 MEM 膠囊)仍可參與收納,標「僅顯示」。右上角 corner(側欄展開鍵)不參與自動收納,永遠常顯。

左側面板逐行開關

管理面板下半部「左側面板(逐項顯示)」:每行一個開關;關掉的行用 display:none !important 蓋住別人重渲染。底部有「全部還原」。

自 0.2.0 起,唯一入口是頂欄「»」→ 末行「管理頂欄…」;不再往視圖頁籤 ⋯ 菜單註冊入口。

安裝與啓用

<profile> 指 ~/.dsh/profiles/<name>(Windows 爲 %USERPROFILE%\.dsh\profiles\<name>)。

從 GitHub 安裝(推薦)

dsh plugin --profile <profile> add github:ymf2317-tech/dsh-header-dock

dsh plugin 把參數轉發給該 profile 下的 pnpm,github:owner/repo 等形式均可。

裝完後在 profile 的 package.json 裏把包名加入 dsh.profile.bundles:

// <profile>/package.json
"dsh": {
  "profile": {
    "bundles": [ "……", "dsh-header-dock" ]
  }
}

本包已聲明 dsh.bundle.patch(cordis.patch.yml),DSH 讀 bundles 時會自動應用,不必手改 profile 的 cordis.patch.yml。

本地 vendor(離線或自改代碼)

將倉庫放到 <profile>/vendor/dsh-header-dock,並在 dependencies 裏寫 file:,避免被 pnpm prune 清掉,同樣要進 bundles。

裝完後的刷新

硬刷一次頁面(Ctrl+Shift+R;移動端可關站重進或清緩存)。lib/client.js 是靜態資源,普通刷新可能仍用舊副本。

運行環境要求(package.json):Node >=22.5.0,DSH >=0.2.2-rc.1 <0.3.0-0。

典型用法

打開管理面板

  1. 頂欄出現「»」時,點「»」查看被收納項。
  2. 列表末行點「管理頂欄…」。
  3. 按需設四態、調順序;左欄用逐行開關;需要時點「全部還原」。

寬屏且從未發生收納時,「»」不渲染,此時沒有管理入口——這是設計行爲,不是未安裝成功。

狀態存儲與一鍵還原

  • 鍵名:localStorage['dsh-header-dock.v1']
  • 面板底部「全部還原」,或控制台:
localStorage.removeItem('dsh-header-dock.v1'); location.reload()

結構示例(可手工改;order 可省略,state 缺省爲 auto):

{
  "version": 1,
  "items": {
    "utilities::dsh-memory-guard": { "state": "always", "order": 0 },
    "actions::dsh-mneme:pipeline": { "state": "hidden" }
  },
  "sidebar": {
    "hiddenLabels": ["插件", "任務"]
  }
}

items 鍵由插槽名、註冊 id、文案等推斷;sidebar.hiddenLabels 按行標題文字記錄。

cordis 配置(cordis.patch.yml 的 config)

鍵 默認 說明
overflow true 自動收納總開關
reportEnabled true 是否向宿主上報佈局快照(僅內存)
debug false 控制台 [header-dock] 打點
sidebarFold false 已廢棄,僅兼容
sidebarLimit 6 已廢棄,僅兼容

關掉自動收納仍可用手動態四態:overflow: false。

可選:佈局上報排查

開啓 reportEnabled 時,客戶端會向 POST /header-dock/report 提交快照(宿主只留內存,不落盤):

curl -s http://127.0.0.1:<port>/header-dock/report | jq
curl -s http://127.0.0.1:<port>/header-dock/report -X DELETE

不需要時可設 reportEnabled: false。

適用場景與注意

適合誰:經常在瀏覽器裏用 DSH Web、頂欄插件多、窗口寬度有限,需要可恢復的收納與逐項策略,而不是接受按鈕被裁切或消失。

安裝前:插件以當前 DSH 進程權限在客戶端運行;安裝前宜瀏覽倉庫源碼與 MIT 許可證,確認與你的工作方式一致。DSH 生態是「一切皆插件」;skillhub.cn 上的社區目錄獨立於 DeepSeek / 幻方,並非官方應用商店。

已知限制(摘自 README):

  • 頂欄條目無穩定 DOM id,身份靠插槽 + 註冊 id + 文案推斷;插件改了按鈕文案會使舊設置失效(回到自動)。
  • 「隱藏」後按鈕及其浮層入口都沒了。
  • overflow:clip 下用 getBoundingClientRect() 實測,不用不可靠的 scrollWidth。
  • 左欄兩行都叫「插件」時:第一行常爲 dsh-sidebar-entries 的摺疊開關,第三行纔是插件面板——不是本插件造成的重複面板。

實現細節見倉庫內 docs/IMPLEMENTATION.md、docs/SPEC.md。

結尾

dsh-header-dock 把 DSH Web 頂欄溢出從「裁切且不可達」變成「收進抽屜 + 可配置四態與順序」,並附帶左欄逐行顯示控制;改動限於可見性與 flex 順序,卸載存儲即可回退。

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

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

小夜