dsh-fast-history:面向手机与小屏的 DSH Web 历史渐进加载

前言

在 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 已描述的行为归纳,均为客户端展示层逻辑。

首屏与预取

  1. 尾部优先首屏:与官方一致,不增加额外的首屏分页请求。
  2. 后台预取:首屏绘制稳定且会话空闲后,通过 SessionFace.loadOlder() 在后台加载更早页,预取页数可在设置中选 0 / 1 / 2(默认 1)。若首屏窗口本身已很重(例如官方第一页就接近整段日志),插件会跳过预取。

提前自动加载与连续补页

  1. 提前自动加载:在 wheel / touch / 键盘滚动方向门控下,当视口距离「已加载头部」仍在 1.5 屏以内(可设为 1 / 1.5 / 2 屏,默认 1.5)即开始加载,而不是等到只能点「加载更早」。提前加载直接调用 loadOlder();官方按钮在屏外时若走 beginPaging() 可能把锚点落在最旧一行,因此提前路径避开该行为。
  2. 连续补页(chain fill):若单页内容不足以填满提前量,一次接近最多再续加载共 4 页(含第一次),直到头部离开提前区、历史结束、加载失败或切换会话。

触摸、到顶与 dsh-mobile

  1. 触摸 / 移动端:支持触摸输入(单指);忽略 pinch 与嵌套滚动区域(如代码块)。手指按下或惯性滚动未停稳前(约 140 ms 安静;手机/粗指针链式间隔 160 ms)不触发加载,且不写 scrollTop,避免滑动卡顿。
  2. 到顶锚定:真正滚到顶部(≤4 px)且手指抬起时,手机走直接加载并保持原顶部可见行位置;桌面仍走官方 pager 路径。到顶下拉只加载一页,不链式续加载。
  3. 与 dsh-mobile 共存:在 .dshm-main / [data-dsh-mobile-frame] 布局下绑定移动端会话;手机上的提前路径与 pager 点击(含 synthetic button.click() 与真实点击)统一为带锚定校正的直接 loadOlder()。

内存与边界

  1. 内存纪律:仅保留标量状态、官方对象引用与 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。

手动安装(插件管理器不可用时):

  1. 在 profile 的 package.json 的 dependencies 增加 "dsh-fast-history": "link:/absolute/path/to/dsh-fast-history"。
  2. 在 dsh.profile.bundles 末尾追加 "dsh-fast-history"。
  3. 在 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
羽毛球分组比赛记分
小程序二维码

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

小夜