前言¶
在 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 顺序,卸载存储即可回退。