dsh-session-find:跨会话原文检索插件

前言

DSH 内置的 session_search 和侧边栏搜索走的是 SQLite FTS5 的 unicode61 分词器。这个分词器按 Unicode 空白与标点切词,中文整句通常不会被切成可检索的词元,于是「我之前哪次对话里说过 XXX」这类问题基本搜不到。如果想按原话找历史会话,内置搜索帮不上忙。

dsh-session-find 就是针对这个问题的插件:它绕开 FTS5 分词,直接扫描 $DSH_HOME/sessions 下的原始 .jsonl.zstd 日志做字面子串匹配,中文整句也能命中,并把结果定位到会话、轮次、步骤和角色。插件由 quecai-niu 维护,许可为 MIT,属于「记忆」分类,放在社区插件目录,不是官方应用。

下面介绍它的能力、安装方式和实际使用。

两个入口

插件提供两个入口,共用同一套检索核心(lib/search.js),只有一份逻辑。

入口 用途
右侧栏面板 点会话 header 右缘的放大镜按钮打开。搜索、按角色筛选,双击命中会跳转到该会话并滚动到那句话,命中处蓝色脉冲高亮 2.6 秒。
session_find 工具 模型可直接调用的工具。用户可以说「帮我找找哪次对话里说过 XXX」。

面板面向浏览器操作,工具面向模型调用,两者是同一检索能力的两种形态。

覆盖范围与命中信息

正文按 7 类角色分离:

用户 · 助手 · 思考(模型推理) · 工具调用 · 工具结果 · 标题 · 待发消息

每条命中给出以下信息:

  • 会话标题与 sessionId。标题可能重名,ID 才是唯一依据。
  • 事件 seq,指回具体事件。
  • 第几轮、第几步、角色、ISO 8601 时间。
  • 命中位置两侧各 N 字符的上下文片段。

日志格式与实现要点

会话日志的文件名形如 session.v<N>.jsonl.zstd,内容由多条 zstd frame 顺序追加而成。Node 的 zstdDecompressSync 只解第一帧,所以插件必须按帧魔数 28 B5 2F FD 切片后逐帧解压,否则会漏掉后续帧的内容。

轮次号优先取 turn/start 事件自带的 data.turn(权威值),只有该值缺失时才退回自增计数。

只读设计

插件不修改会话日志,也不修改任何配置。它维护一份索引缓存,路径为 $DSH_HOME/cache/dsh-session-find/index.json,按 (mtimeMs, size) 增量更新。删掉这个目录即强制重建索引。

安装与启用

用官方命令安装:

dsh plugin --profile <profile> add dsh-session-find

或者在 profile 的 cordis.patch.yml 中插入:

- insert:
    - id: session-find
      name: dsh-session-find

安装后需要重启 DSH,宿主侧工具在启动时加载。

典型用法

右侧栏面板:点击右上角放大镜按钮,输入要查找的字面文字,可以按角色筛选;看到命中后双击,插件会切到对应会话并滚动到那句话。

模型侧则直接表达意图即可,例如「帮我找找哪次对话里说过 API Key 轮换方案」。session_find 工具的参数如下:

参数 类型 说明
query string 必填 要搜的字面文字,不区分大小写,上限 512 字符
roles string[] 只在这些角色里搜
session string 限定会话 id 的一段
limit number 最多返回几条,默认 20,上限 50
context number 片段两侧各保留多少字符,默认 100,上限 2000

输出有 24000 字符的总预算,超出会截断,并说明剩余条数和收窄建议。

HTTP 路由

浏览器面板使用以下三条只读路由:

GET /session-find/api/search?q=...&roles=用户,助手&limit=50&context=100&session=xxx&case=1&nocache=1
GET /session-find/api/sessions
GET /session-find/api/health

需要说明的是,面板的滚动定位依赖聊天区的 data-chat-turn 与 [data-conversation-scroll] 属性。这些属性不是官方公开 API,DSH 升级后可能改名。如果是想二次开发面板或写脚本调用路由,这一点要先确认当前 DSH 版本是否仍保留。

适用场景与注意

适合以下情况:

  • 历史会话量大,内置搜索按中文整句检索不到,需要字面搜索原文。
  • 需要定位到具体轮次、步骤和角色,而不只是看到一条标题。
  • 需要在模型侧用自然语言直接发起检索。

使用时要注意几点:

  • 插件以当前 DSH 进程的权限运行,它的能力边界就是进程能读到的 $DSH_HOME 内容,安装前应确认这一点符合预期。
  • 安装前应检查插件源码和许可证。该插件为 MIT,仓库地址见文末。
  • 跳转精度依赖 DOM 契约,失效时插件会退回「只切会话、不滚动」,不会报错,所以看到只跳转不滚动时要意识到可能是版本变更。
  • 跨会话跳转存在等待:目标会话内容挂载前用 MutationObserver 等待,上限 8 秒,期间不阻塞 UI。
  • 标题、待发消息这类轮次外的事件无法滚动定位,插件会明确提示。

结尾

dsh-session-find 的价值在于补上内置 FTS5 分词的缺口:把跨会话检索从「按词」变成「按字面」,并给出可跳转的定位信息,且保持只读。

  • 插件目录页:https://www.skillhub.cn/plugins/quecai-niu/dsh-session-find
  • GitHub 仓库:https://github.com/quecai-niu/dsh-session-find
羽毛球分组比赛记分
小程序二维码

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

小夜