dsh-recall-sessions:按需加载 DSH 历史会话

前言

在 DSH 里开新会话时,上下文默认是空的。若你想接着上周某次对话里的结论继续改代码,要么凭记忆复述一遍背景,要么在消息里手动引用某个会话。内置的 dsh-session-reference 可以插入历史会话快照,但需要手写 @[标题](dsh-session:<base64url 会话 id>),最多引用 3 个,且只能靠投影标题找会话,不能按正文检索。

下面介绍社区插件 dsh-recall-sessions(维护者 imtwa,分类:记忆):它直接读取 DSH 已落盘的会话日志与投影缓存,用命令或工具按序号、id 片段列出并加载历史会话,默认不往提示词里注入任何内容,单次读取在毫秒级完成。

这是什么

dsh-recall-sessions 是 DeepSeek Harness 的 Cordis 插件(MIT,版本 0.1.0)。定位是轻量级解压并读取历史会话,让新会话在需要时读取之前会话的内容。数据来自本机 <DSH_HOME> 下 DSH 自己写的文件,装完即可查询已有历史,支持 Windows / macOS / Linux。

插件以当前 dsh 进程权限访问磁盘;安装前请自行查看 GitHub 仓库 源码与许可证。

与内置 session-reference 的差异

能力 @deepseek-ai/dsh-session-reference dsh-recall-sessions
引用方式 消息里手写 session 链接 /recall、自然语言 + recall_sessions 工具
检索 靠投影标题 按清单序号或 id 片段
范围 受引用方式限制 默认当前项目;/recall all 可列全机各项目
默认行为 需主动引用才插入 autoInject: false,指定后才加载正文

两者可同时启用,不冲突。

核心功能

默认 autoInject: false 时,插件不向提示词注入内容,只提供两个入口:

  1. 斜杠命令 /recall:列出可加载的历史会话(标题、最后活动时间、轮次、首问、session id)。
  2. 工具 recall_sessions:模型可按需查询;无参数返回清单,index / sessionId 返回该会话内容,scope: "all" 跨项目。

命令用法(摘自 README):

入口 作用
/recall 列出当前项目可加载的历史会话
/recall all 列出本机所有项目的会话
/recall <序号> 加载清单里第 N 个会话的内容
/recall <id 片段> 按 id 片段加载(例如末尾 4e5c-91b4)
/recall refresh 强制重新扫描磁盘

清单只含挑选用的元数据,不带正文,体积很小;指定会话后才解压日志读取轮次全文。加载结果会标注为不可信的历史数据,仅作背景参考。

若需要「每次组装提示词时自动带上最近几个会话的摘要」,可在 profile 的 cordis.patch.yml 里将 autoInject 设为 true(见配置一节)。

安装与启用

通用步骤:把仓库放到固定目录,在 profile 的 package.json 里加依赖与 bundle,重启 dsh。

macOS / Linux(推荐)

cd ~/.dsh/profiles/web
dsh plugin --profile web add link:~/dev/dsh-recall-sessions

也可手改 ~/.dsh/profiles/web/package.json,在 dependencies 里写 link: 路径,并在 dsh.profile.bundles 中加入 dsh-recall-sessions,然后在 profile 目录执行 pnpm install 或 dsh plugin --profile web install。

Windows

dsh plugin --profile web add link:C:/Users/你的用户名/.dsh/plugins/dsh-recall-sessions

Windows 上建议插件实体放在系统盘:pnpm 的 link: 对非系统盘路径可能解析错误,导致 cannot resolve profile bundle。若在别的机器改源码,可用仓库脚本同步到 C 盘副本:

node scripts/sync.mjs

改完配置后,可用下面命令在不启动服务的情况下检查 bundle 是否挂上:

dsh --profile web --dump-config | grep -A 12 'dsh-recall-sessions'

重启 dsh 后,启动日志中应出现 [dsh-recall-sessions] 已注册 /recall 命令 与 已注册 recall_sessions 工具 等行。

兼容性(资料原文)

  • 实测 DSH:0.2.0-rc.2
  • 声明宿主:engines.dsh: >=0.1.0-rc.1
  • Node:>=20.11(依赖 node:zlib 的 zstdDecompressSync)
  • Cordis:peerDependencies: @deepseek-ai/cordis ^4.0.1

典型用法

列清单(当前项目)

在 DSH 对话里输入 /recall,输出类似:

## 本机可加载的历史会话

### C:\work\my-project
1. 帮我把登录页的表单加上校验
   2026-10-14 15:24 (17 分钟前) | 轮次 1 | session-6213d47e-2a76-4e5c-91b4-b3ccace0c21c
2. 这个报错是什么意思
   2026-10-12 19:19 (1 天前) | 轮次 3 | session-e8844e24-aeee-4e35-977f-c368137e16be

用法:说「加载第 N 个」或给出会话 id,我再去读它的内容;不会自动带进上下文。

加载指定会话

输入 /recall 2 或 /recall 4e5c-91b4,插件会读投影缓存与会话日志,渲染各轮用户提问与 AI 回复(有字符与轮次上限)。也可直接说「加载第 2 个历史会话」,让模型调用 recall_sessions。

跨项目浏览

输入 /recall all 列出全机会话;工具侧可传 scope: "all"。

配置

在 profile 的 cordis.patch.yml 中覆盖插件 config。常见项:

键 默认 说明
enabled true 总开关
autoInject false 是否自动注入历史摘要
maxListSessions 20 清单最多列几个会话
maxDetailTurns 30 详情最多渲染几轮
maxDetailChars 1200 详情单条问答字符上限
includeCurrentSession false 是否包含当前会话
includeParentCwds true 是否包含父目录下的会话

autoInject: true 时还有 maxSessions、maxTurnsPerSession、maxDigestChars 等上限,避免摘要撑爆上下文。配置类型错误只会 warn 并回退默认值,不会让 DSH 启动失败。

适用场景与注意

适合谁

  • 在同一仓库多次开新会话,需要偶尔找回某次对话里的结论或报错上下文。
  • 不想手写 dsh-session: 链接,希望用序号或 id 片段快速定位。
  • 希望默认保持 prompt 干净,只在明确 /recall 或工具调用时才载入历史正文。

实现上的边界(资料原文)

  • autoInject=false 时启动阶段不扫描磁盘,真正扫描发生在 /recall 或工具调用时,有超时与逐项降级,读不动则少一条记录,不阻塞启动。
  • 会话格式依赖 session.v4.jsonl.zstd 与投影缓存 version: 7;DSH 换代磁盘格式时,插件可能列不出或读不全,但不会导致 DSH 启动失败。
  • 历史内容一律视为不可信数据,渲染时会截断与折叠空白。

社区插件目录 SkillHub 上的 dsh-recall-sessions 页 与 GitHub 仓库相互独立,并非 DeepSeek / 幻方官方应用商店;DSH 生态强调「一切皆插件」,可按需选用。

结尾

dsh-recall-sessions 补的是「按需、可检索、可跨项目」读取本机 DSH 历史会话这一环:默认零注入,清单轻量,指定后再解压日志读全文。安装用 profile 下的 dsh plugin add link:...,日常用 /recall 与 recall_sessions 即可。

  • 目录页:https://www.skillhub.cn/plugins/imtwa/dsh-recall-sessions
  • 源码:https://github.com/imtwa/dsh-recall-sessions
羽毛球分组比赛记分
小程序二维码

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

小夜