中文EN

dsh-session-recall

session装不上npmMIT

确定性跨会话检索:`recall` 工具带显式范围控制地搜索历史会话日志。

下载量 / Downloads
1,466
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

安装

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 | 中文

![CI](https://github.com/kittimzhe/dsh-session-recall/actions/workflows/test.yml) ![npm version](https://www.npmjs.com/package/dsh-session-recall) ![npm downloads](https://www.npmjs.com/package/dsh-session-recall) ![License: MIT](https://github.com/kittimzhe/dsh-session-recall/blob/main/LICENSE)

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

链接

GitHub · Homepage · npm

同类插件