前言¶
在 DeepSeek Harness(DSH)Web 裏,會話頂欄會塞進不少插件註冊的按鈕:actions、utilities、corner 三個插槽容器都是 flex:none,它們不會自己變窄;真正被裁切的是中間的標題區(.titleCluster 帶 overflow:clip,右側還有漸隱遮罩)。窄屏或窗口縮小時,按鈕可能被切一半、整塊看不見,而且沒有入口能點到被裁掉的部分。
dsh-header-dock(維護者 ymf2317-tech,分類爲客戶端插件)只做一件事:裝不下時從右側把項收進「»」抽屜,並讓你逐項決定顯示策略和順序;寬屏下不發生收納時,「»」本身不渲染。下面按定位、能力、安裝與日常用法說明。
這是什麼¶
一句話:給 DSH Web 會話頂欄做 overflow tuck-away——窄屏時多一個「»」抽屜,每項可設四態並排序,附帶左側面板逐行顯示開關。
- 倉庫:ymf2317-tech/dsh-header-dock
- 社區目錄:skillhub.cn 插件頁
- 當前包版本(資料來源
package.json):0.2.0 - 許可證:MIT
- 僅對
dsh.client.platform = web生效,不涉及宿主或 TUI
邊界要明確:本插件只改 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。
典型用法¶
打開管理面板¶
- 頂欄出現「»」時,點「»」查看被收納項。
- 列表末行點「管理頂欄…」。
- 按需設四態、調順序;左欄用逐行開關;需要時點「全部還原」。
寬屏且從未發生收納時,「»」不渲染,此時沒有管理入口——這是設計行爲,不是未安裝成功。
狀態存儲與一鍵還原¶
- 鍵名:
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 順序,卸載存儲即可回退。