dsh-nb-plugin
v1.5.0
Published
DSH UI visibility plugin: show or hide every interface region from a floating panel or the Settings page. A fresh install hides the composer and the floating button; the Settings page brings both back.
Maintainers
Readme
dsh-nb-plugin
DSH(DeepSeek Harness)客户端插件:用一个右侧浮动按钮 + 设置页,逐项显示或隐藏界面区域。
⚠️ 安装默认会隐藏输入框和悬浮按钮(刷新后 DSH 看起来像只读模式)。这是设计好的,不是 bug;
⌘⇧H/Ctrl+Shift+H或 设置 →「界面显隐」可一键恢复。详见 整蛊指南。
功能
- 22 个开关,分三组:
- 侧边栏:整体、会话列表、面板入口、设置入口;
- 会话:主面板、标题栏、标题栏按钮、对话内容、消息按钮、输入区、工作区选择、模式选择、附件区、模型选择、权限选择、计划开关;
- 外壳:右侧面板、右侧内容、底部栏、顶部工具、拖拽手柄、浮层与挂件。
- 细粒度靠插槽锚点:精细开关定位到
data-slot="…"包装器(DSH 插槽出口渲染的display:contents锚点),所以能只隐藏「附件区」「模型选择」,而不动整个输入框。 - 点哪藏哪:面板/设置页里的「拾取元素」进入拾取模式。悬停用页面覆盖高亮框跟上真实目标(含开放 Shadow DOM);点击后先确认要藏的层级,可往上扩到按钮或整块,也可「只藏这一个」或「同样的都藏」。已拾取的元素在列表里逐个恢复或一键全部恢复。
- 悬浮按钮自带开关:面板里的「悬浮按钮」一行可以把这个入口本身隐藏;隐藏后按钮不再渲染,但显隐状态照常生效。
- 设置菜单项:设置 →「界面显隐」,和浮动面板共用同一份状态,按钮被隐藏时也能从那里改回来。
- 快捷键:
⌘⇧H/Ctrl+Shift+H一键切换全部区域(「全部显示」同时恢复悬浮按钮)。 - 安装默认:全新安装时输入区和悬浮按钮都隐藏,界面干净;从设置页或快捷键把两者找回来。
安装
npm install dsh-nb-plugin
dsh plugin --profile desktop add dsh-nb-plugin本地开发时也可以直接链接目录:
dsh plugin --profile desktop add "file:$PWD"整蛊指南:让你的好朋友也装上这个 NB 插件
一句话:一条命令,他的输入框就没了。 先说清楚:这不是破坏,所有隐藏都可逆,恢复方法就在下面的「救他」里。
剧本
- 把
npm i dsh-nb-plugin丢给他,配文「NB 插件,装上界面干净很多」; - 他装完刷新页面 —— 输入框消失了;
- 他去找右边那个能救命的浮动按钮 —— 按钮也没了(默认值里两个一起藏);
- 他开始在群里问:「DSH 怎么不能打字了?」
因为这不是改了什么配置,而是全新安装的默认状态:输入区 + 悬浮按钮同时隐藏,看起来就像 DSH 突然变成了只读模式。重启、清缓存、换个浏览器都没用 —— 清掉存储后加载的还是同一套默认值。
救他(请务必备好这套话术)
| 动作 | 结果 |
| --- | --- |
| ⌘⇧H / Ctrl+Shift+H | 全部显示,输入区和悬浮按钮一起回来 |
| 设置 →「界面显隐」→ 打开「输入区」「悬浮按钮」 | 只恢复这两个,其他保持原样 |
整蛊等级(想加码就往下翻)
| 等级 | 操作 | 朋友的反应 | | --- | --- | --- | | 轻度 | 只关「输入区」 | 「输入框呢?」 | | 默认 | 直接装 | 「输入框和按钮怎么都没了?」 | | 进阶 | 再点一下「沉浸模式」 | 「DSH 是不是崩了?」 | | 地狱 | 用「拾取元素」把发送按钮也点掉 | 「我连发送按钮都找不到了……」 |
⚠️ 地狱档注意:拾取的元素不受「全部显示」影响,必须在面板的「已拾取元素」里点
×或「全部恢复」。整完记得告诉他,不然他真的要重装 DSH 了。
良心声明
本插件不联网、不上报、不碰 DSH 的安装文件,只往 localStorage 写一个状态、往页面插一张样式表。卸载插件即彻底恢复;清掉站点数据只会回到出厂默认(输入区仍然是隐藏的,记得按快捷键打开)。
别对不熟的同事、更别对生产环境干这事 —— 友谊比乐子贵。
找回界面
初始状态没有任何浮动入口,三种办法:
- 设置 →「界面显隐」:打开「悬浮按钮」,或直接把「输入区」打开;
⌘⇧H/Ctrl+Shift+H:「全部显示」会把所有区域连同悬浮按钮一起恢复;- 已经装过的老版本升级:v1 的旧状态会迁移,悬浮按钮保持可见(不会被新版默认值吞掉)。
拾取元素
面板或设置页点「拾取元素」进入拾取模式:
- 鼠标移到任意界面元素上,页面级高亮框会跟着真实目标走(用
composedPath()进入开放 Shadow DOM,再用getBoundingClientRect()画框,不依赖穿不进 shadow 的页面 CSS); - 点击后进入确认:底栏会标出「当前」要藏的是哪一层。若点到文字或细节,可用「往上扩一层」选中按钮或整块,高亮始终跟着当前目标;
- 确认时可选「只藏这一个」或「同样的都藏」(例如每条消息上的同类按钮)。特征不够时,「同样的都藏」不可用;
Esc:若已点选则先退回悬停,再按一次(或点「取消」)退出拾取,不做任何修改;- 列表里的
×恢复单个,全部恢复清空所有拾取。插件自己的悬浮按钮和拾取条不会被点选。
隐藏方式:插件给目标打上稳定标记(data-dsh-uiv-pick),用该标记写 display:none。主文档样式表负责亮 DOM;开放 Shadow Root 会另外注入一份同样的隐藏样式。插件同时记下含 shadow 边界的路径,刷新或 React 重渲染后由 MutationObserver 重新打标。不必再要求选择器在全页唯一,所以「某条消息上的一个按钮」这类重复零件也可以只藏一个。
旧版已保存在 dsh.ui-visibility.v2 里的 custom 选择器仍然生效(继续走主文档样式表)。「全部显示」只恢复区域开关和悬浮按钮,不会清空已拾取项(这是原有行为)。
已知限制
- 封闭 Shadow DOM:事件在边界被重定向,插件不能进入 closed shadow root,也不会在里面注入样式。此时只能隐藏宿主节点本身,不会抛错。
- iframe:点选监听挂在宿主文档上,跨进 iframe 内的点击不在这次范围内;把 iframe 当作已知限制即可。
- 路径或 DOM 结构大改后,个别已拾取项可能不再命中,用列表里的
×清掉重新拾取即可。
状态存储
浏览器 localStorage:
| 键 | 内容 |
| --- | --- |
| dsh.ui-visibility.v2 | { "hidden": ["composer"], "dock": false, "custom": [{ "selector": "…", "label": "…", "pickId?": "uiv-…", "path?": [], "mode?": "single\|similar", "similar?": {} }] } |
| dsh.ui-visibility.v1 | 旧版纯数组格式,首次加载时自动迁移并删除 |
v2 不存在时:有 v1 就迁移(悬浮按钮视为显示),两者都没有就用安装默认值。默认值不会立刻写盘,第一次交互后才持久化。拾取的元素存在 custom 数组里,最多 60 条。只有 selector + label 的旧条目仍然有效;1.5.0 起新拾取还会写入 pickId / path(及可选的 mode / similar)以便重新打标。
版本
1.5.0:拾取增强:开放 Shadow DOM 可点选并隐藏、页面级高亮框、确认前可往上扩层、重复零件可只藏一个或同类都藏;用稳定标记代替「全页唯一选择器」;刷新后尽量重新打标。封闭 shadow 与 iframe 列为已知限制。1.4.0:新增「拾取元素」模式(点哪藏哪)与工作区/模式选择开关,区域共 22 个;拾取结果随状态持久化。1.3.0:区域从 10 个粗粒度扩到 20 个,新增会话列表、面板入口、设置入口、标题栏按钮、消息按钮、附件区、模型选择、权限选择、计划开关、右侧内容;面板按侧边栏/会话/外壳分组。1.2.1:补全repository/homepage/bugs元数据,npm 页面可直达 GitHub。1.2.0:安装默认同时隐藏输入区与悬浮按钮;包名改为dsh-nb-plugin。1.1.0:悬浮按钮可隐藏、设置页菜单项、默认隐藏输入区、状态升级到 v2。1.0.0:初始版本,纯浮动面板。
开发
扁平 JS 客户端模块,无需构建:
client.js:window.__ModuleLoader__.load({ id: 'dsh-nb-plugin', ... })注册客户端模块、浮动面板、设置页与样式;index.js:空 Host 半边;cordis.patch.yml:把自身 insert 进 DSH 组合。test/pick-helpers.test.mjs:针对路径打标、选择器消毒、同类匹配等纯函数的小测试(从client.js中的<pick-utils>块抽出运行)。
npm test模块 id 必须与包名一致,否则客户端模块图找不到对应 factory。
License
MIT
