dsh-session-grep:在工作区会话里做真正的子串搜索

前言

在 DeepSeek Harness(DSH)里长期跑一个 workspace,会话会不断累积。侧边栏的 Ctrl+K 会话搜索依赖 SQLite FTS5,tokenizer 为 unicode61,匹配的是整词和短语,而不是任意子串。中文连续书写时往往整句是一个 token,因此像 搜索输出 这种片段嵌在 只能搜索输出 里时,内置搜索可能完全命不中。上游在 @deepseek-ai/dsh-session-query-sqlite 的 README 里也写明了这一点。

若你需要在任意对话正文里按片段检索——包括中文子串——社区插件 dsh-session-grep(维护者 chenshanhan0711)提供的是另一条路径:自建字面量索引,对解压后的会话日志做大小写不敏感的 indexOf。

这是什么

dsh-session-grep 是 DSH 插件,npm 包名 dsh-session-grep,当前版本 1.0.1(MIT 许可证,Node.js >=20)。它只在当前 workspace 目录下的会话文件中扫描,不发起外网请求;Host 读本地 session.v4.jsonl.zstd,客户端通过本机 loopback API 取结果。

核心功能

与内置搜索的差异

内置搜索:FTS5 + unicode61,整词/短语匹配。
本插件:逐条消息文本做子串匹配,任意片段均可命中(含中文)。

界面与交互

  • 对话标题旁出现 搜索 / Search 胶囊按钮(conversation.header.leading 插槽)。
  • 输入关键字后,每条命中一行:角色、标题、会话后缀、带高亮的片段。
  • 结果按会话轮询合并,避免单条超长对话占满列表;最多 40 行,范围仅限当前 workspace。
  • ↑ / ↓ 移动,Enter 打开,Esc 关闭。
  • 选中某行会打开对应对话,匹配处高亮约 2.6 秒;若已在当前对话中则只滚动与高亮。
  • 可切换 工具输出 / Tool output,把 tool call、tool result、reasoning 一并纳入搜索(默认关闭)。

实现要点(便于排障)

Host(index.js)从 $DSH_HOME/sessions/<cwd-key>/<session-id>/session.v4.jsonl.zstd 读日志;按 zstd magic 切帧解压,解析 JSONL,按事件类型取文本;解析结果按 mtime + size 缓存(最多 64 个会话)。对外只读路由:/dsh-session-grep/api 下的 search、sessions、health。

Client(client.js)请求 200 ms 防抖、同一时刻仅保留一个进行中的请求;结果面板相对输入框定位,避免被页头裁切。打开侧线程会话时会走 snapshot 里的 subagent.address 等逻辑,并在 DOM 中用 <mark> 包裹命中文本。

安装与启用

插件以当前 DSH 进程权限运行,安装前建议在 GitHub 上浏览源码与 LICENSE。社区目录站 SkillHub 插件页 与仓库相互独立,并非 DeepSeek / 幻方官方应用商店。

从 npm 安装:

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

从本地目录安装(README 给出的 clone 路径示例):

git clone https://github.com/chenshanhan0711/dsh-session-grep
dsh plugin --profile <profile> add ./dsh-session-grep

或在应用内:Plugins → Add plugin,指向该文件夹。Bundle 会注册一个 Host 服务与一个 client 插槽,重启应用 后胶囊按钮才会出现。卸载方式与其他插件相同,不修改 DSH 安装目录。

典型用法

  1. 安装并重启 DSH,在任意对话页头点击 搜索。
  2. 输入要找的片段(例如 README 中的例子:搜索输出、插件)。
  3. 用方向键浏览结果,Enter 跳转到对应消息。
  4. 若还要搜工具调用或推理正文,打开 Tool output 后再搜。

全程无网络请求;Host 只读本地会话文件,客户端只访问本机 API。

适用场景与限制

适合: 需要在同一 workspace 多会话里按任意子串(尤其中文片段)回溯内容;不信任 FTS 整词行为、希望行为与 grep 式子串一致的场景。

应注意:

  • 匹配的是纯文本,不是渲染后的 Markdown;跨 **bold** 边界的命中可能能搜到但高亮不完整。
  • 无持久化磁盘索引,大历史每次查询全量扫描,因此结果上限为 40。
  • 仅扫描当前 workspace 目录下的会话;live 会话在文件变更时重新解析,暂无增量 tail。
  • 修改 Host 端需重启应用;只改 client.js 时刷新页面即可(Host 会热加载 client bundle)。
  • 归档会话仍可被搜到,但应用拒绝打开它们。

结尾

dsh-session-grep 用本地字面量子串搜索补上了内置 FTS 在中文片段场景下的空隙,交互集中在页头搜索胶囊,隐私上零外连、零遥测。进一步了解可从社区目录与仓库对照阅读:

  • 目录页:https://www.skillhub.cn/plugins/chenshanhan0711/dsh-session-grep
  • GitHub:https://github.com/chenshanhan0711/dsh-session-grep
羽毛球分组比赛记分
小程序二维码

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

Xiaoye