dsh-sticky-user-bubble
Verifieddsh-sticky-user-bubble · v0.1.4 · MIT · Web UI
阅读长对话时把已滚出对话顶部的用户气泡固定在阅读区顶部。
Install
dsh plugin add dsh-sticky-user-bubble Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Tags
Readme
dsh-sticky-user-bubble
一个纯客户端 DSH Web 插件:阅读长对话时,当当前用户气泡已经完整滚出对话顶部,插件会在阅读区顶部固定显示同一条原生用户气泡,点击或键盘激活即可回到原消息。固定内容直接来自原气泡的 DOM 克隆,因此不会改写正文排版,也不会把用户发言强行称为“问题”。
功能
- 固定当前已完整滚出对话可视区顶部的用户或 durable steering 气泡;向上、向下滚动时按真实消息顺序切换。
- 原气泡仍有任何可见部分(包括底部内边距与圆角)时保持隐藏,不会出现原气泡与副本同时可见。
- 下一条用户卡片进入顶部区域时,固定气泡像列表 sticky 标题一样被它顶出去(超出对话顶边的部分被裁掉),不会盖住新卡片,并保持与对话一致的消息间距;新卡片到达阅读线时固定气泡完全消失。
- 点击固定气泡平滑滚动回对应的原始用户输入位置;键盘聚焦后按
Enter或空格键同样有效。 - 超过三行时默认只显示三行并以省略号截断,鼠标移入或键盘聚焦时恢复完整内容;展开高度同时受输入框顶部和「下一条用户卡片上方空间」限制,超出部分在气泡内部滚动,空间只剩消息间距时保持三行不展开。
- 内部滚动发生在气泡 padding 之内:滚动条不会压住圆角边框,并沿用 DSH「卡片内滚动区域」的暗色滑块。
- 会话仍在进行(思维链、工具调用、回答流式增长)时不会打断阅读:展开状态不会因会话更新而反复收起再展开。
- 保留 DSH 原生的手动历史分页:更早消息仍由「加载更早」控制;旧消息进入当前窗口后,固定气泡自动重新归组和定位。
- 固定副本位于独立的
shell.overlay层,除气泡本身外点击穿透;克隆内部节点会移除 ID、ARIA 引用、核心聊天标记和交互属性,避免引用链接或控件被二次触发。 - 找不到预期核心标记、当前快照过期、气泡不可测量、结构存在歧义或克隆几何自检失败时自动隐藏,并在 host 上保留非视觉状态码供诊断。
要求
- DeepSeek Harness Web
>=0.1.6-alpha.1 <0.1.7;0.1.6-alpha.1已逐版本验证。同线后续版本会给出警告,并继续依赖客户端结构与能力检查。 - Node.js 20 或更高版本(仅安装与发布检查需要)。
- 不需要额外的运行时 npm 依赖。
安装与卸载
dsh plugin --profile web add dsh-sticky-user-bubble # 安装
dsh plugin --profile web add [email protected] # 升级到指定版本
dsh plugin --profile web remove dsh-sticky-user-bubble # 卸载
已发布为 dsh-sticky-user-bubble。profile 依赖是 caret 范围,升级需要显式写版本号。安装会向 profile 增加 bundle,而 bundle 列表只在启动时读取,因此需要重启 dsh web 并刷新页面。
从源码运行:./install.sh 通过官方 profile manager 安装 link:<源码目录>,./uninstall.sh 移除;两者都不直接改写用户的 cordis.patch.yml。卸载只移除 profile 依赖和 bundle 层,不修改 DSH 源码、会话历史或用户配置。
已知边界
- 当前 DSH 的圆角气泡没有稳定的专用
data-*标记,因此插件在权威用户行内部用消息文本、paint、padding 和几何联合评分;候选存在歧义时 fail closed(隐藏而不是猜)。 - wrapper 无法可靠保留 flex/grid/table 根布局、垂直书写、root transform 或非 1 zoom,这些布局会隐藏固定气泡并记录
unsupported-*状态;Shadow DOM、canvas 与关键伪元素内容不在支持范围内。 - 第三方
!important规则若主动覆盖克隆的关键属性,几何自检能发现一部分但不能保证全部识别;原消息始终不受影响。 - 纯图片消息没有文本气泡时不会伪造文字副本。
- 尚未成为 durable 节点的 pending steering 行不参与切换;尚未点「加载更早」的历史消息也不在当前窗口内,插件有意不自动调用
loadOlder()。 - 展开窗口只剩消息间距级空间时 hover 不再展开(避免退化成极窄的内部滚动窗口);要读全文,向上滚一点让下一张卡片离开即可恢复。
- 这是纯客户端行为:不提供开关、不保存历史数据、也不新增 Host 路由。
License
MIT