dsh-session-toc:为 DeepSeek Harness Web UI 会话页加一个右侧目录栏

前言

长会话在 DSH Web UI 里有一个具体的不便:会话视图按需加载,早期消息默认不在内存里,想回到前面某次提问,只能反复点「加载更早」,或者一路滚动找位置。会话越长,这个动作越低效。

DeepSeek 官网网页版右侧有目录索引,点一下就能跳到对应内容。dsh-session-toc 做的事情,就是把这套体验带进 DeepSeek Harness 的 Web UI。下面介绍这个插件的功能、安装方式和使用细节。

这是什么

dsh-session-toc(仓库 notload/dsh-session-toc)由 notload 维护,当前版本 0.2.0,MIT 许可证。它为 DSH Web UI 的每个会话页添加一个右侧中间常驻、可折叠的目录栏:会话里的每个用户提问是一条目录项,点击滚动定位到对应消息,并高亮当前条目。

两个设计先说清楚:

1、目录条目来自完整会话日志。host 端通过 sessionQuery.readSession 读取整个会话日志再提取提问,不依赖浏览器已加载进内存的节点,早期未加载的消息同样会出现在目录里。

2、零侵入。插件不改动任何 @deepseek-ai/* 内置包,仅以 bundle 插件方式挂载,走的是 DSH「一切皆插件」的正常路子。

核心功能

目录栏本体

  • 挂在 shell.overlay 浮动层,垂直居中靠右,默认 click-through,条目本身可交互。
  • 可收起成右侧一个窄条按钮,再点展开。
  • 当前会话用户提问不足阈值时自动隐藏,短会话不出现噪音。

条目来源与过滤

  • 排除 session-referenceworkspace 等注入式上下文,只保留真实的用户提问。
  • 用户消息带文字说明时,目录文案直接用文字;纯图片/文件、无任何文字时,用文件名兜底。
  • 目录始终由 host 读取磁盘上的完整会话日志生成,DSH 的上下文压缩只改变主会话的「记忆」,不动日志,目录条目完整无损。

点击定位

DSH 会话视图的每个 chat 节点在 DOM 上有稳定属性 data-chat-anchor-key。点击目录项时,插件用它精确定位并滚动,图片消息同样有该属性,不依赖文本或图片匹配。

目标消息未加载进 DOM 时,插件自动逐页 loadOlder 补加载后再定位;节点始终找不到、定位不可靠时,降级为仅高亮当前条目。

性能

  • host 侧做「进程内 LRU 缓存 + 落盘索引」双层降频,切换会话不再反复触发全量 readSession;落盘索引位于 $DSH_HOME/storages/session-toc/,跨进程/重启保留,重启后切换会话也能秒开。
  • 目录超过 200 条时启用固定行高虚拟列表,只渲染可见窗口 ± 缓冲;条目数据全量保留,点击定位不受影响。
  • 监听会话快照,新提问约 1.2s 内自动进入目录,不必切换会话或手动重载。

外观

  • 明/暗皮肤三档:auto / light / dark,可切换。
  • 背景不透明度可调,只影响背景,文字始终不透明。
  • 选择持久化到 localStoragedsh-session-toc.theme / dsh-session-toc.bgAlpha),刷新、跨会话保留。

读取失败降级

host 读取失败(例如报 SessionFormatUnsupportedError)时,前端不再静默清空:降级为「浏览器已加载节点」的目录(部分可用),并显示「目录加载失败(已显示部分已加载内容)+ 重试」提示条。

安装与启用

前提:本机已安装 pnpm,且 DSH 的 web profile 存在(如 ~/.dsh/profiles/web)。

方式一,从 GitHub 克隆后以 link 方式安装(推荐):

git clone https://github.com/notload/dsh-session-toc.git
cd dsh-session-toc
dsh plugin --profile web add link:$(pwd)

如果 $(pwd) 在你的 shell 里不生效,直接写完整绝对路径,例如 Windows:

dsh plugin --profile web add link:C:\Users\<你的用户名>\dsh-session-toc

方式二,若已发布到 npm,直接装发布版:

dsh plugin --profile web add dsh-session-toc

确认插件进入层栈:

dsh plugin --profile web list

经过上面的步骤,重启 dsh web,浏览器访问同一 URL,会话页右侧就能看到目录栏。

配置

目录参数通过 cordis.patch.yml 传给 host 半侧(applyconfig)。注意:DSH 客户端配置管线当前尚未打通,浏览器半侧收到的 config 是空对象,以下参数目前以代码默认值为准、不可被用户覆盖(对照 lib/client.js):

key 默认值 说明
minEntries 1 当前会话用户提问少于该值时隐藏目录栏
maxChars 48 单条目录文案的最大字符数(超出加省略号)
collapsed false 初始是否折叠

一处需要留意的出入:README 特性一节把自动隐藏阈值写成「默认 3 条」,而配置表(对照 lib/client.js)写 minEntries 默认 1,两处不一致,实际以代码为准。

行为与安全细节

host 侧为目录数据路由做了几层防护:

  • 路由不携带 CORS 头,由浏览器同源策略拦截跨源读取。
  • 校验请求携带浏览器来源信号(sec-fetch-site 或同源 Origin),curl、脚本、局域网主机等裸请求一律 403。
  • sessionId 需属于当前 host 可见会话,否则拒绝。
  • 错误响应不回显内部错误详情。

开发与测试:仓库内 npm test 等价于 node --test --test-isolation=none --expose-gc

适用场景与注意

适合的人:

  • 经常在 DSH Web UI 里跑长会话,需要回看、定位早期提问的开发者。
  • 消息里图片/文件较多的用户:定位靠节点稳定 key 而非文本匹配,图片消息也能准确落到位置。

安装前注意:

1、插件以当前 dsh 进程的权限运行,安装前建议检查源码确认行为,许可证为 MIT。
2、当前客户端配置不可被用户覆盖,可调的只有目录栏内的主题、背景不透明度等界面项,其余参数以代码默认值生效。
3、需要本机有 pnpm,且 web profile 存在。

小结

dsh-session-toc 解决的是 DSH Web UI 长会话里「找不到早先那个问题」的具体麻烦:目录常驻右侧、覆盖整段会话日志、点击精确定位,读取失败有降级路径,且对内置包零侵入。如果你日常重度使用 DSH Web UI,可以装上试一试。

  • 插件目录页:https://www.skillhub.cn/plugins/notload/dsh-session-toc
  • GitHub 仓库:https://github.com/notload/dsh-session-toc

(社区插件目录为独立站点,与 DeepSeek、幻方无官方从属关系。)

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

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

Xiaoye