前言¶
在 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 安装目录。
典型用法¶
- 安装并重启 DSH,在任意对话页头点击 搜索。
- 输入要找的片段(例如 README 中的例子:
搜索输出、插件)。 - 用方向键浏览结果,
Enter跳转到对应消息。 - 若还要搜工具调用或推理正文,打开 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