前言¶
DeepSeek Harness 的网页聊天默认采用“跟随底部”策略:每次提交消息后,回复每长一点,整页就往下滚一点。长回复看到一半,自己刚问的那句话早就滚出视野了,只能手动往上拉——而下一条消息又会重置。这种体验在长对话中会变得非常割裂。
dsh-chat-anchor 把交互反过来:发送瞬间,你的消息就落到顶部;回复在下面生长,视口保持不动;需要看历史时正常往上滚,不会被抢回去。
它是什么¶
dsh-chat-anchor 是一个 DeepSeek Harness 客户端插件,由 tooeast 维护。它通过 DOM 契约修改聊天视图的滚动行为,让最新提问固定在聊天区顶部,回复向下生长,页面不再跟随滚动。插件为纯客户端实现,没有构建步骤,也没有运行时依赖。
核心功能¶
- 发送即锚定:不等服务端回显。在发送的同一帧里,本地回声气泡就被放到顶部,不会出现“先掉到底部再跳上来”的闪动。
- 短回复也能顶住:回复比屏幕短时,消息列会补出“刚好够”的底部空白,并随着回复变长按 1:1 收缩——没有多余空白可以滚进去,回复填满屏幕后留白自然归零。
- 不打扰阅读:滚轮、触摸、点击或翻页键一碰就交还控制权;往上滚再滚回底部,布局不会塌、也不会跳。「回到底部」按钮照常可用。
- 干净收尾:加载历史、切换会话不会误触发;切视图或禁用插件时,留白和监听都会释放。
安装与启用¶
命令行:
dsh plugin add dsh-chat-anchor
或者网页端:插件 → 添加,搜索 dsh-chat-anchor。
非默认 profile 需要加 --profile <名称>,例如:
dsh plugin --profile web add dsh-chat-anchor
安装后刷新页面,浏览器才会加载新的客户端模块。不想用了,在同一个插件页禁用或卸载即可,不会改动 profile 里的其他配置。
工作原理¶
插件利用 @deepseek-ai/dsh-client-ui-chat 已公开的 DOM 契约来工作:
[data-chat-flow]:滚动容器里的消息列[data-chat-flow-kind="user"]:一条用户消息行[data-chat-turn]:这条消息所属的轮次[data-submission-echo]:发送时先渲染的本地回声[data-chat-following-tail]:跟随底部时,聊天框架上会有这个属性
插件把消息行滚到滚动区顶部(留 16px),Chat 会把这次位移判定为“读者移动”,从而释放跟随意图。短回复所需的底部留白由消息列上的 ::after 规则(--chat-anchor-space 变量)提供,位置在 sticky 输入框之前,所以输入框始终停在窗口底部。
已知限制¶
这是一个客户端适配,不是官方扩展点。它依赖上面这些 data-chat-* 属性——它们属于 ui-chat 内部实现,任何版本都可能改动。改动后插件会静默失效,不会让页面崩溃。如果某次 dsh 升级后锚定失灵,请带上 dsh 版本提 issue。
排障¶
- 安装后没变化:刷新页面,客户端模块是启动时加载的。
- dsh 升级后失效:多半是 DOM 契约变了。在浏览器控制台查看
window.__dshChatAnchor,它记录了版本、观察到的列、批次、回声、锚定次数和最近事件。 - 想关掉:在插件页禁用或卸载
dsh-chat-anchor。
生态背景¶
DeepSeek Harness 的理念是「一切皆插件」。dsh-chat-anchor 作为社区插件,通过 DOM 契约实现客户端行为调整,不依赖官方扩展点,未来可能因上游实现变化而失效。
适合谁¶
适合需要在长对话中保持当前问题可见、频繁查看上下文的开发者与智能体使用者。如果你习惯“Codex 风格”的阅读节奏,这个插件能显著提升连续对话的流畅度。
注意事项¶
- 插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。
- 依赖
data-chat-*属性,属于ui-chat内部实现,任何版本都可能改动。 - 长期的正解在上游:给
ui-chat加一个跟随模式偏好。
短结尾¶
dsh-chat-anchor 通过客户端锚定,把最新提问固定在聊天区顶部,让回复向下生长,页面不再跟随滚动。适合需要在长对话中保持问题可见的开发者。访问 目录页 了解更多,或访问 GitHub 仓库 查看源码与文档。