前言¶
在 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 |
是否显示标题栏切换 |
典型用法¶
- 安装插件并对正在使用的 profile reload 页面。
- 打开一个较长会话,使用「load earlier」加载更早历史;当行数超过
trimMinRows且状态点为琥珀色时,点击 Collapse history 释放已渲染 DOM。 - 若需回到收起前的阅读窗口,点击 History collapsed 进入恢复流程,等待 Restoring… 完成。
- 在 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。