前言¶
在 DSH Web 里打开一个长会话时,界面默认只呈现最近一段历史:官方客户端尾部优先加载一页,更早的内容要靠顶部的「加载更早 / Load earlier」手动追加。在手机上向上翻看时,这种「滑到顶再点按钮、再等一页」的节奏很容易打断阅读;小屏上按钮还可能短暂成为唯一继续手段。DSH 生态里插件可以只改客户端展示而不动 Host 组装的模型上下文——dsh-fast-history 就是在官方分页能力之上,为有界预取、提前补页和触摸/惯性滚动做了适配的 Web 端插件。
这是什么¶
dsh-fast-history(npm 包名 dsh-fast-history,当前 README 注明尚未发布到 npm)由 OranImp(Zichen Wu)维护,MIT 许可证,仓库见 GitHub。社区目录归类为联网工具,SkillHub 条目:oranimp/dsh-fast-history。
插件定位是 Mobile-first 的 DSH Web 历史会话渐进加载:首屏仍是官方「最近消息优先」;首屏稳定后在后台预读少量更早页;当你接近已加载内容的头部时提前自动补页;并针对触摸屏与快速滑动做了加载时机控制。只影响显示:不发送 prompt、不追加会话事件、不改变 Host 为模型组装的上下文。
README 中对照的官方便利行为(以当时核对的 DSH 0.2.1-rc.2 / rc.3 为准,换版本需自行再验证)包括:打开会话只加载尾部一页(至少 50 条消息 / 2 个 Turn 起点,最多 500 条或历史耗尽);顶部手动分页;无滚动触发自动加载、无后台预取、已加载窗口不会被回收;页大小与初始窗口在客户端写死且无配置项。本插件在这些接口之上补齐预取与提前加载,不修改 Host 或上下文。
核心功能¶
下面按 README 已描述的行为归纳,均为客户端展示层逻辑。
首屏与预取¶
- 尾部优先首屏:与官方一致,不增加额外的首屏分页请求。
- 后台预取:首屏绘制稳定且会话空闲后,通过
SessionFace.loadOlder()在后台加载更早页,预取页数可在设置中选 0 / 1 / 2(默认 1)。若首屏窗口本身已很重(例如官方第一页就接近整段日志),插件会跳过预取。
提前自动加载与连续补页¶
- 提前自动加载:在 wheel / touch / 键盘滚动方向门控下,当视口距离「已加载头部」仍在 1.5 屏以内(可设为 1 / 1.5 / 2 屏,默认 1.5)即开始加载,而不是等到只能点「加载更早」。提前加载直接调用
loadOlder();官方按钮在屏外时若走beginPaging()可能把锚点落在最旧一行,因此提前路径避开该行为。 - 连续补页(chain fill):若单页内容不足以填满提前量,一次接近最多再续加载共 4 页(含第一次),直到头部离开提前区、历史结束、加载失败或切换会话。
触摸、到顶与 dsh-mobile¶
- 触摸 / 移动端:支持触摸输入(单指);忽略 pinch 与嵌套滚动区域(如代码块)。手指按下或惯性滚动未停稳前(约 140 ms 安静;手机/粗指针链式间隔 160 ms)不触发加载,且不写
scrollTop,避免滑动卡顿。 - 到顶锚定:真正滚到顶部(≤4 px)且手指抬起时,手机走直接加载并保持原顶部可见行位置;桌面仍走官方 pager 路径。到顶下拉只加载一页,不链式续加载。
- 与 dsh-mobile 共存:在
.dshm-main/[data-dsh-mobile-frame]布局下绑定移动端会话;手机上的提前路径与 pager 点击(含 syntheticbutton.click()与真实点击)统一为带锚定校正的直接loadOlder()。
内存与边界¶
- 内存纪律:仅保留标量状态、官方对象引用与 DOM 引用;不复制历史条目;预取与链式加载有页数上限;未实现整段历史预加载或硬 eviction(公开
SessionFace无 trim API,插件不篡改私有字段或eventSource.replace)。增长由用户浏览 + 默认最多 1 页预取 + 单次接近最多 4 页链式加载共同约束。
关闭插件设置中的自动加载与预取后,官方手动「加载更早」仍可用。
安装与启用¶
插件以 web profile 的 client bundle 形式安装(package.json 中 dsh.client.platform 为 web,immediately: true)。安装前请自行阅读仓库源码与 MIT 许可证;插件在当前 DSH 进程权限下运行,与任何社区插件一样需要信任维护者。
在本地已有插件目录(绝对路径)时,执行:
dsh plugin --profile web add /absolute/path/to/dsh-fast-history
在 DSH Agent 会话中等价于:
plugin_manager action=install_bundle target="/absolute/path/to/dsh-fast-history"
README 说明 npm 正式发布后也可:
dsh plugin --profile web add dsh-fast-history
(截至仓库说明,dsh-fast-history 尚未发布到 npm。)
安装后需刷新 Web GUI;未运行 pnpm run dev:web 时,Client bundle 变更不会 HMR。
手动安装(插件管理器不可用时):
- 在 profile 的
package.json的dependencies增加"dsh-fast-history": "link:/absolute/path/to/dsh-fast-history"。 - 在
dsh.profile.bundles末尾追加"dsh-fast-history"。 - 在 profile 目录执行
pnpm install,再刷新 Web 界面。
若手机端连接的是另一套 DSH profile,需在该 profile 同样安装 bundle。
卸载:
dsh plugin --profile web remove dsh-fast-history
或 Agent:plugin_manager action=remove_bundle target="dsh-fast-history",然后刷新。
设置与调试¶
设置入口:Settings → General → History loading(存于浏览器 localStorage 键 dsh-fast-history.settings.v1,按浏览器隔离,非 Host 配置)。
| 项 | 含义 |
|---|---|
| 总开关 | 启用/关闭自动加载与预取;关闭后官方按钮仍可用 |
| Lead | 提前加载触发距离:1 / 1.5 / 2 屏,默认 1.5 |
| Prefetch pages | 后台预取页数:0 / 1 / 2,默认 1 |
调试示例(README):
localStorage.setItem('dsh-fast-history.debug', '1'); // 然后刷新
window.__DSH_FAST_HISTORY__.stats();
window.__DSH_FAST_HISTORY__.diagnostics();
window.__DSH_FAST_HISTORY__.setSettings({ prefetchPages: 0, preloadScreens: 2 });
典型用法与行为注意¶
典型用法即正常在 DSH Web(或 dsh-mobile 布局)中打开会话并向上浏览历史:无需额外 API;在设置里按网络与流量调整 Lead 与预取页数即可。
使用时需了解 README 中的限制与取舍:
- 纯展示:不影响模型上下文;快速甩动到顶部时,可能在自动加载开始前短暂看到「Load earlier」,这是为避免惯性期间插入 DOM 与改滚动位置造成 jank 的有意设计。
- 锚定:手机/粗指针场景插件不写
scrollTop;桌面在滚动停稳后对大于 2 px 的漂移用顶部可见行校正。 - 分页文案:插件识别
加载更早 / 加载更多 / Load earlier / Load more,否则走结构回退再直接loadOlder()。 - 测试(需在仓库 checkout 中,npm 包不含测试文件):
node --test test/*.test.mjs;可选 Playwright 的python3 test/browser_test.py。
适用场景¶
适合经常在 手机或小屏 上通过 DSH Web 回看长对话、希望减少「到顶再点加载更早」次数的开发者与用户。不适合期待插件改变会话存储、裁剪 Host 上下文或替代服务端分页策略的场景——它只补全 Web 客户端的加载体验。
DeepSeek Harness 的理念是「一切皆插件」;SkillHub 等社区目录独立于 DeepSeek / 幻方,并非官方应用商店。选用第三方 bundle 前请核对版本(package.json 当前为 0.2.5)与自身 DSH 版本是否匹配 README 中的行为说明。
结尾¶
dsh-fast-history 在保留官方尾部首屏的前提下,用有界预取、提前自动加载和移动端手势门控,让 DSH Web 历史浏览更接近常见聊天应用的渐进加载体验,且明确不触碰模型上下文。
- 目录页:https://www.skillhub.cn/plugins/OranImp/dsh-fast-history
- 源码与完整说明:https://github.com/OranImp/dsh-fast-history