dsh-session-recall
确定性跨会话检索:`recall` 工具带显式范围控制地搜索历史会话日志。
安装
dsh plugin --profile web add dsh-session-recall
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✗ |
| 2 列装 | — |
| 3 挂载 | — |
| 4 启动 | — |
dsh: initialized profile web at /home/node/.dsh/profiles/web四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
dsh-session-recall
English | 中文
   
DeepSeek Harness 的确定性跨会话全文检索插件:注册模型可调用的 recall 工具,让 agent 能检索自己过往的会话原文——"上周修的那个 bug"、"简历选的什么字体"——全部通过可信的 ctx.sessionQuery 缝完成。
安装
环境要求:Node.js 20 或 22 · 挂载了 tools 与 sessionQuery 服务的 DeepSeek Harness profile(官方 web / agent profile 均满足)。
dsh plugin --profile web add dsh-session-recall
试一次
首次搜索会自动构建持久化 FTS5 索引——无需额外步骤。会话里直接问:
recall:上周给简历选的什么字体来着?
工具会按会话返回最强命中——每条带会话 id、尽力补全的标题、日期与命中摘录,在 Web UI 里渲染成原生搜索卡片。
会话工具链
插件 · 层 · 回答的问题
dsh-session-export · 证据层 · "这个会话到底发生了什么?"
dsh-session-recall · 记忆层 · "我以前做过什么,在哪?"
dsh-session-eval · 评测层 · "刚才的会话好不好?趋势在变好吗?"
三者都通过同一个受信的 ctx.sessionQuery 接缝读取。
证据联动(#8)
每条 recall 命中都携带另外两个插件需要的字段——不需要手工抄 id:
字段 · 含义
sessionId · 完整会话 id(文本投影在 session … 一行单独打印,紧挨短 id id8)。
artifactPath · dsh-session-export 已为该会话写出的最新报告路径,位于其 dsh-transcripts/ 目录下(transcript-<id8>- 报告或 bundle-<id8>-.zip,取最新)。尚无导出时为 null——绝不伪造路径。
实操示例——recall 找到会话,export 出证据,eval 打分:
recall "resume template font"
→ 1. 修复简历模板字体 (ca62e005, 2026-08-20, live)
session session-ca62e005-4274-477b-bd56-9d9508edb040
user/message #42: please fix the resume template font
/transcript --id session-ca62e005-4274-477b-bd56-9d9508edb040 ← dsh-session-export
/eval --id session-ca62e005-4274-477b-bd56-9d9508edb040 ← dsh-session-eval
贡献
- 本地开发:
npm ci && npm run typecheck && npm test && npm run bundle(Node 20 或 22)。 - 源码入口:[
src/tool.ts](src/tool.ts)(工具契约)、[src/rank.ts](src/rank.ts)(新近度重排、置顶项目)、[src/redact.ts](src/redact.ts)(脱敏规则)、[src/resilient.ts](src/resilient.ts)(降级直扫)。完整源码地图见 [CONTRIBUTING.md](CONTRIBUTING.md)。 - 当前缺口:#6(脱敏规则扩展)、#7(同分排序钉死)——或浏览
good first issue标签。
三者都通过同一个受信的 ctx.sessionQuery 接缝读取。
证据联动(#8)
每条 recall 命中都携带另外两个插件需要的字段——不需要手工抄 id:
字段 · 含义
sessionId · 完整会话 id(文本投影在 session … 一行单独打印,紧挨短 id id8)。
artifactPath · dsh-session-export 已为该会话写出的最新报告路径,位于其 dsh-transcripts/ 目录下(transcript-<id8>- 报告或 bundle-<id8>-.zip,取最新)。尚无导出时为 null——绝不伪造路径。
实操示例——recall 找到会话,export 出证据,eval 打分:
recall "resume template font"
→ 1. 修复简历模板字体 (ca62e005, 2026-08-20, live)
session session-ca62e005-4274-477b-bd56-9d9508edb040
user/message #42: please fix the resume template font
/transcript --id session-ca62e005-4274-477b-bd56-9d9508edb040 ← dsh-session-export
/eval --id session-ca62e005-4274-477b-bd56-9d9508edb040 ← dsh-session-eval
贡献- 规矩:行为变更必须带测试;文档必须 README.md 与 README.zh.md 同步改;版本发布由维护者执行。详见 [CONTRIBUTING.md](CONTRIBUTING.md)。
模型看到什么
recall({ query }) → 每个会话返回最强命中事件,默认只搜当前项目
recall({ query, all_projects: true }) → 搜索本机全部会话
recall({ query, session_id }) → 只搜指定会话内的事件
recall({ query, limit, cursor }) → 翻页
每条命中带完整会话 id、最新导出报告路径(存在时,见[证据联动](#证据联动8))、标题(尽力补全)、日期、命中摘录;结果在 Web UI 里渲染成原生搜索卡片(SearchMatchesResultView)。因为 FTS 的 unicode61 分词器会把连续中文当成一个 token,短中文短语一旦嵌在长句里就匹配不到索引——所以 CJK 查询零命中时会自动回退到对会话文本的子串扫描(走 sessionQuery.filterEvents 的字面文本子句),空格拆出的每个词都必须命中,因此 简历 模板 也能找回 简历模板;hint 会说明这条回退路径是否命中。
授权边界(官方明确留给工具层的责任)
sessionQuery 是可信基础设施——它能读所有会话。所以本工具自己约束每一次调用:
- 默认注入
sessionFilters: [{ kind: 'cwd', values: [<调用方 agent 的 cwd>] }]——只搜同一项目目录下开始的会话; all_projects: true才放宽到全机,且部署方可以用allowAllProjects: false直接禁用该参数。
项目定位
dsh-session-recall 是一个强调正确性与边界控制的会话检索层。
- 检索对象是原始会话日志,不是二次总结内容。
- 默认按 cwd 收敛权限范围,放宽范围必须显式声明。
- 追求可解释、可复现的检索行为,而不是"看起来更聪明"但有损的记忆抽取。
如果你要做长期记忆编排,请用记忆框架;如果你要做可审计、有权限边界的历史检索,请用本插件。
为什么做这个
官方 @deepseek-ai/dsh-session-query 的 README 自己列出了缺口:
No registries or model-facing tool — … a model-facing tool is absent.(没有模型可调用的工具)
No caller authorization — … a model tool or UI must constrain which sessions its caller may inspect.(调用方授权留给了未来的工具层)
而且官方 web profile 把 SQLite FTS5 后端配置成 openAt: never + 内存库——跨会话全文检索默认关闭,就算手动开启,索引也随进程退出而消失。
· 官方 web 默认 · 装本插件后
模型可调用的搜索工具 · 无 · recall
FTS 索引 · openAt: never(关闭) · 开启(懒加载 first-search)
索引存储 · :memory:(重启即失) · 持久化 <DSH_HOME>/session-recall/index.db
调用方授权 · 留给调用方 · 默认按 cwd 限定当前项目,显式放宽
记忆类插件用 LLM 提取结构化笔记(有损、费 token);recall 检索的是原始对话记录——零提取、零损失、装完当天就能搜全部历史。
竞品视角
能力重心 · 记忆框架类插件 · 通用检索类插件 · dsh-session-recall
检索对象 · 推导后的记忆结构 · 视实现而定 · 原始会话事件文本
范围控制 · 框架内约束 · 常较粗粒度 · 默认 cwd + 显式 all_projects 闸门
CJK 体验 · 视实现而定 · 常受分词限制 · FTS + CJK 零命中子串回退
输出契约 · 框架内部格式 · 不统一 · 类型化 recall 结果 + 稳定 hint
命名与边界说明(2026-09):
- 本插件与
dsh-recall-plugin无关——那是"撤回消息"插件(把工作区与对话回退到某条消息发出之前)。 - 本插件是
dsh-recall的后继者——后者是更早的会话检索插件(最后更新 2026-08-21);本插件在其方向上续写:持久 FTS5 索引、中文回退、审批闸门、谱系鉴权。 - 本插件与
dsh-mnemon等记忆框架互补:它们做写入侧的记忆编排;本插件保持只读检索层,只读原始会话日志,不写任何记忆存储。
安装(out-of-tree 插件)
从 npm:
dsh plugin --profile web add dsh-session-recall
或从 GitHub:
dsh plugin --profile web add github:kittimzhe/ …(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:20,最后更新 2026-11-05