前言¶
在 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 时,插件不向提示词注入内容,只提供两个入口:
- 斜杠命令
/recall:列出可加载的历史会话(标题、最后活动时间、轮次、首问、session id)。 - 工具
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