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

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

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

Xiaoye