BrainZombie/dsh-session-find:给 DeepSeek Harness 加一条落盘的跨会话全文索引

前言

DSH 自带一个 session_search 工具,用来在会话历史里找内容。会话数量少的时候够用;本机会话历史变大之后,它建不完索引,调用只会超时或者报 storage unavailable。会话越多,这个问题出现得越频繁。下面介绍的这个插件就是专门为这件事做的:把「建索引」和「查」拆开,索引落盘成 SQLite,查询走 FTS5。

这是什么

dsh-session-find 由 BrainZombie 维护,MIT 协议,是 DeepSeek Harness(DSH)的插件。它在本地建一个持久化的 SQLite FTS5 索引,覆盖全部会话转写文本,支持增量同步和打码。插件目录页(skillhub.cn)把它归到「记忆」分类,其 GitHub 仓库描述为 Fast local cross-session search for DeepSeek Harness: persistent SQLite FTS5 index over session transcripts, incremental sync, redaction.

本质上它替代的是大体量会话历史下那个不可用的 session_search:索引是派生数据,落盘之后查询不再依赖每次全量建索引。

环境要求

README 列出的前置条件如下:

需要什么 版本 原因
DeepSeek Harness >= 0.2.0 提供工具注册与插件挂载点
Node.js >= 20 主机侧代码全是 ESM
node:sqlite(可选) Node >= 22.5 有它才建 FTS5 索引;没有则自动退回直读扫描,功能不变、速度变慢

node:sqlite 是可选的:Node 版本够就有 FTS5 索引,不够插件会退化成直接读会话文件扫描,功能一样,只是慢。

安装与启用

安装命令来自 README 原文:

dsh plugin add dsh-session-find

装完重启宿主,工具就会出现。插件代码里声明的 dsh.compatibility.dsh 是 >=0.2.0-rc.1 <0.3.0-0,安装前可以留意一下自己的 DSH 版本是否落在这个区间。

首次调用工具时会建索引。README 给了本机实测数据:479 个会话、32015 条事件。

配置

插件在 DSH 配置里挂成一个 id 为 session-find 的配置块:

- id: session-find
  name: dsh-session-find
  config:
    indexPath: ''            # 留空 = <DSH_HOME>/storages/session-find/index.db
    redact: false            # true = 默认打码(也可每次调用传 redact: true)
    extraRedactPatterns: []  # 追加的打码正则
    includeArchived: true
    maxResults: 40
    snippetChars: 240
    autoSync: true           # 每次调用前只对 mtime/size 变过的会话做增量

逐个说明:

  • indexPath 留空时索引库放在 <DSH_HOME>/storages/session-find/index.db。
  • redact 控制默认是否打码。打码也可以只在单次调用时传 redact: true,不改全局。
  • extraRedactPatterns 是追加的自定义打码正则。
  • autoSync 打开后,每次调用前只对 mtime 或 size 变过的会话做增量同步。

三个工具

插件注册三个工具:

工具 作用
session_find 跨会话全文检索,返回会话 id / 标题 / cwd / 命中片段
session_show 按 id 读原文,可按 seqFrom / seqTo 取区间
session_index status 看索引状态,sync 只处理变化的会话,rebuild 全量重建

session_find 的参数:query(必填)、cwd、since / until、types(user / reply / tool)、limit、perSession、redact、titleMode(只按标题找)、sortBy(score / time)。

典型用法是三步:先查,再选中的会话读原文。

1、session_find 传 query 找回的会话 id。
2、session_show 按 id 读原文,需要细看某段时用 seqFrom / seqTo 取区间。
3、索引状态不对或换过表结构时,session_index status 看状态,session_index sync 增量处理,session_index rebuild 全量重建。

索引怎么工作

索引库的表结构:

  • sessions:id / workspace / cwd / title / created_at / mtime / size / events
  • events:FTS5 虚表,承载全文检索
  • state:记录 lastSync

增量策略:只有会话文件的 mtime 或 size 变了,才重灌该会话的 events。rebuild 则清表重来。

一致性方面:单个会话的写入放在一个 BEGIN / COMMIT / ROLLBACK 事务里;库上开 PRAGMA journal_mode = WAL、synchronous = NORMAL。

有个实现细节值得知道:FTS5 的 MATCH 不参与 join,否则会产生歧义,所以排序分走 rank 列。另外插件版本升级若换过表结构,会自动 DROP 重建,不迁移旧数据——索引本来就是派生物,丢了重建即可。

隐私与安全注意

索引是原文派生的:库文件里存着会话片段,默认不打码,理由是「原文即检索能力」。库文件在 <DSH_HOME>/storages/ 下,不进仓库、不外发。

几点要注意:

1、需要打码时,把 config.redact 设成 true,或者单次调用传 redact: true。
2、extraRedactPatterns 用来追加自己的正则,覆盖默认规则之外的敏感串。
3、插件以当前 DSH 进程的权限运行,能读到会话目录、能写索引库。安装前建议先读一遍源码,确认许可证(MIT)和行为再启用。
4、索引库是本地文件,不会自动同步到别处;搬家或清理磁盘时知道它的存在即可。

测试与开发

仓库自带的自测脚本:

npm test            # node test/selftest.mjs(自建 fixture 会话 + 临时库:检索/增量/打码/工具面)
npm run doctor      # 发布前的清单检查
dsh-plugin verify . # 真打包、真安装、挂载检查(需要装好 DSH 的机器)

npm test 自己造 fixture 会话(临时 DSH home + zstd 转写),不读你的 ~/.dsh,所以在 CI 和干净机器上同样是绿的。verify 需要真实宿主,只在本地跑。

包信息:dsh-session-find,版本 0.1.0,MIT。

结尾

dsh-session-find 解决的是一个很具体的痛点:DSH 会话历史变大之后,跨会话检索不可用。它把索引落盘成 SQLite FTS5,做增量同步,换来的改动很小,换来的收益是毫秒级返回。如果会话数量已经让 session_search 超时,值得试一下。

目录页:https://www.skillhub.cn/plugins/BrainZombie/dsh-session-find
源码:https://github.com/BrainZombie/dsh-session-find

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

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

小夜