前言¶
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