dsh-longsession:长会话下的页面历史收敛与性能

前言

在 DeepSeek Harness(DSH)里做长对话时,页面会不断把已渲染的历史行留在 DOM 里:实时追加和多次「加载更早」会让节点数、堆内存和主线程长任务一起涨。滚动和绘制未必是瓶颈,但打开会话和拉取更早页时的渲染成本会明显上升。下面介绍社区插件 dsh-longsession(维护者 asots,分类为客户端),它通过可逆的「Collapse history」机制,在不动聊天记录与模型上下文的前提下,收缩页面已加载的历史窗口。

这是什么

dsh-longsession 是面向 DeepSeek Harness Desktop / Web 的浏览器侧插件:宿主侧仅注册一条惰性 Loader 行,行为集中在 lib/client.js。当前发布版本为 0.0.1(首个版本),仓库为 github.com/asots/dsh-longsession,许可证 MIT。插件在会话标题栏注册切换按钮,并可选择对历史请求做上限裁剪;它不移动、删除或重建 transcript 节点,标题栏切换是唯一新增的 DOM。

社区目录页:skillhub.cn/plugins/asots/dsh-longsession。目录站点与 DeepSeek / 幻方无官方从属关系,DSH 生态奉行「一切皆插件」,安装前宜自行查看源码与许可证——插件随当前 DSH 进程/浏览器上下文运行。

实测背景(README 中的测量)

作者在干净测试主机上对约 4.4 MB、11 轮会话做过测量,用以说明问题形态(非用户案例):

  • 打开会话:约 892 ms 就绪,单次批量渲染,最长任务约 808 ms;DOM 节点约 1,240 → 9,218,堆约 36.6 → 57.6 MB。
  • 每次「load earlier」:主线程任务约 300–630 ms;行数与 DOM、堆继续增长。
  • 在约 775 行稳定滚动时可达 60 fps、无长任务——瓶颈更偏向累积渲染而非滚动绘制。

核心功能

Collapse history(收起历史)

通过 sessions 客户端服务调用应用自带的 SessionFace.resync(),卸载页面已渲染的历史行,回到普通打开页(最近两轮)。不删除聊天记录、模型上下文与磁盘日志。

  • 未收起时按钮文案为「Collapse history」;收起后为「History collapsed」,再次点击可恢复收起前加载的窗口。
  • 恢复会通过 loadOlder() 向控制器请求缺失页,期间按钮显示「Restoring…」。窗口(轮次数量与滚动偏移)按会话存在 sessionStorage。
  • 显式恢复后,该会话的自动收起会关闭,避免立刻再次压扁刚恢复的内容。

会话标题栏切换

注册在 conversation.session.header.actions 行(与 agent team / mode 相邻),非浮层 overlay。

  • 已加载行数达到 trimMinRows 后出现;刚打开只有两轮时保持禁用,需先「load earlier」加载更早历史才有意义。
  • 状态点:琥珀色表示已加载更早历史可收起;绿色表示已收起;灰色表示不可操作(无更早历史、轮次运行中或恢复中)。

设置页

Settings → Long session 展示当前页面负载(行数、近似轮次、是否已收起),并可编辑按钮阈值、自动收起阈值、请求上限以及是否显示标题栏切换。

自动收起

当阅读位置在实时尾部、无轮次运行、已加载更早历史且窗口超过 autoTrimRows 行时,触发一次收起(15 秒冷却),并标记页面已收起,仍可手动恢复。

可选请求上限

在 WebSocket session/follow 打开帧与一元 /api 分页 RPC 发出前,可降低 maxMessages / turnWindow.minTurns。默认仅将 maxMessages 封顶为 200;minTurns 需单独开启。

安装与启用

先确认主机实际使用的 profile(例如 web,或桌面构建所用 profile)。安装后需重新加载页面(客户端 bundle 按页加载)。

dsh plugin --profile <profile> add github:asots/dsh-longsession

手动接入 profile 时,README 要求:以 profile 依赖形式安装(例如 link:/absolute/path/to/dsh-longsession 或写入 profile 的 package.json 后在该目录 pnpm install);将包内 cordis.patch.yml 的 Loader 行合并进 profile 的 cordis.patch.yml;再 reload(若 profile 不热更新 patch 则需重启宿主)。仅复制到 node_modules/ 不够,桌面插件管理器会在下次 install 时隔离未声明的依赖。

package.json 声明 DSH 引擎 >=0.2.0,Node >=20。

配置

本构建中 Loader 行配置不会传到浏览器端,需通过以下方式覆盖:

  • localStorage["dsh-longsession.config"](JSON)
  • window.__DSH_LONGSESSION__.setConfig({...})
  • 或 Settings → Long session
key 默认值 含义
enabled true 总开关(关闭后停止自动收起与线路上限)
trimMinRows 120 标题栏切换出现的行数阈值
autoTrimRows 600 自动收起阈值(0 关闭)
historyMaxMessages 200 历史 maxMessages 上限(0 关闭)
historyMinTurns 0 turnWindow.minTurns 上限(0 关闭;1 会使打开页减半)
historyCapsAllSessions false 是否对子 agent / 其他会话也套用请求上限
showDock true 是否显示标题栏切换

典型用法

  1. 安装插件并对正在使用的 profile reload 页面。
  2. 打开一个较长会话,使用「load earlier」加载更早历史;当行数超过 trimMinRows 且状态点为琥珀色时,点击 Collapse history 释放已渲染 DOM。
  3. 若需回到收起前的阅读窗口,点击 History collapsed 进入恢复流程,等待 Restoring… 完成。
  4. 在 Settings → Long session 调整 autoTrimRows 与 historyMaxMessages 等,平衡自动行为与首屏加载量。

本地自测(来自 README):

node test/serve.mjs 17772

浏览器打开 http://127.0.0.1:17772/harness.html,共 43 项断言,通过时输出 ALL PASS;window.__TEST_RESULTS__ 为机器可读结果。

适用场景与注意

适合:经常在单会话里反复「加载更早」、页面变卡但又要保留完整聊天与上下文的 DSH 用户;需要在浏览器侧主动收敛渲染窗口、并可选压低历史请求体积的场景。

局限与行为(摘自 Known limits):

  • 收起后打开页等价于最近两轮;若你正停在很深的历史位置,收起会丢失当前滚动位置;轮次运行中按钮禁用。
  • 「History collapsed」后的恢复不是瞬时的,需经 loadOlder() 逐页拉取;滚动像素仅尽力恢复。
  • 新开会话已在最近两轮,切换默认禁用,需先 load earlier。
  • 自动收起仅在实时尾部触发;显式恢复会关闭该会话的自动收起。
  • 收起按会话生效;无 sessions 服务时标题栏切换无效且无自动收起;无 slots 服务时不渲染切换(请求上限仍可用)。

结尾

dsh-longsession 把长会话的性能问题收敛到「页面已加载的历史窗口」:可逆收起、按会话存储的恢复、可选线路上限与设置页,在不删记录的前提下减轻 DOM 与主线程压力。进一步了解与安装可见社区目录 skillhub.cn/plugins/asots/dsh-longsession 与 GitHub github.com/asots/dsh-longsession。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye