dsh-record-search:跨会话全文检索与跳转

前言

在 DeepSeek Harness(DSH)里做智能体或长期对话时,历史会话会越积越多。要从旧对话里找回某句提法、某次工具输出或某个配置片段,常见做法是翻侧栏标题、逐个点开会话再 Ctrl+F——标题往往对不上正文,内置检索也未必覆盖你想搜的内容。

dcd887 的 dsh-record-search 在「记忆」类插件里解决的是另一件事:对所有会话做字面量子串匹配(单个汉字或任意词都可),并在 Web UI 侧栏与聊天工具两条路径上给出结果,点片段可跳到对应那句话。下文按「它是什么 → 怎么用 → 索引与限制 → 配置与结构」说明,事实均来自项目 README 与 package.json。

这是什么

  • 名称:dsh-record-search(中文元数据:会话记录搜索)
  • 维护者:dcd887
  • 仓库:github.com/dcd887/dsh-record-search
  • 版本(package.json):0.1.0,MIT 许可,Node >=18
  • 定位:Full-text search over every DeepSeek Harness session,带侧栏面板与 record_search 工具

插件以当前 DSH 进程权限读取会话、建索引并提供同源 HTTP;安装前请自行查看源码与许可证。社区目录页 skillhub.cn/plugins/dcd887/dsh-record-search 与 GitHub 为独立信息来源,并非 DeepSeek / 幻方官方应用商店。

为什么不用自带的 session.search

Harness 自带的 session.search 走 SQLite FTS5 + unicode61 分词器,中文常被切成一整段 token。README 举例:索引里有「海关稽查专业本科」时,搜「海关」「海」「海关稽查」都可能 0 命中。且该行默认 openAt: never,内容搜索未开时侧栏往往只匹配标题。

本插件改为字面量子串匹配(String.prototype.indexOf,大小写折叠),适合中文短词与单字检索。

核心功能

侧栏面板

入口在侧栏全局面板图标(放大镜,order 40)。点开输入即搜,结果按会话分组;点会话标题打开该会话,点某条片段则打开会话并定位到那条消息(滚动到视口中央并蓝色描边约 1.8 秒)。

默认展示最多 maxSessions(40)个会话,每会话最多 maxHits(3)条片段,按最近命中时间排序。底部「展开全部 N 个会话」会重新请求 limit=200&per=10,再点「收起」回到默认。来源筛选胶囊:全部 / 我的消息 / 回复 / 工具输出(对应 kinds=user|assistant|tool)。改查询词会自动收起展开态。

在聊天中说「搜 XX」等自然语言时,Harness 可调用 record_search,返回命中的会话与片段,与面板共用同一套索引与 HTTP 搜索接口。

索引收录范围

通过 ctx.sessionQuery.readSession(id) 读取(不直接读磁盘 zstd 分帧)。收录:用户消息、助手正文(不含 reasoning / tool-call 参数)、工具输出(截前 600 字,可配置)、会话标题。缓存路径默认 <DSH_HOME>/cache/record-search/index.json.gz,按会话文件 mtime+size 增量重建。README 记载首次构建实测:147 会话 / 25,852 条记录约 59 秒,之后增量通常 1 秒内;大面积读取失败时不会覆盖上一份好索引。

HTTP 路由

ctx.webServer.register 注册前缀 /record-search:

路由 说明
GET /record-search/status 索引状态
GET /record-search/search?q=&limit=&per=&kinds= 搜索;kinds 为 user,assistant,tool 逗号分隔
GET\|POST /record-search/rebuild 后台重建

安装与启用

已抓取 README 与 package.json 中未给出统一的 CLI 安装命令(勿自行拼接 dsh plugin add github:…)。一般流程是:在 DSH 插件机制中从上述仓库或 SkillHub 目录页安装/启用,确保 Web 客户端注入(package.json 中 dsh.client.platform: web、immediately: true,依赖 @deepseek-ai/dsh-client-ui-layout 与 @deepseek-ai/dsh-client-ui-sidebar)。具体命令以你使用的 DSH 版本与目录页说明为准。

启用后首次搜索或访问 status 会触发或等待索引构建;可通过 GET /record-search/rebuild 手动后台重建。

典型用法

侧栏即时搜

  1. 打开 Harness Web UI,点侧栏放大镜面板。
  2. 输入一个字或词,查看按会话分组的结果。
  3. 需要更多命中时点「展开全部 … 个会话」;用胶囊筛选「我的消息 / 回复 / 工具输出」。
  4. 点片段跳到该句;点标题仅打开会话。

聊天里搜

在对话中说明要搜的关键词,由智能体调用 record_search(与 GET /record-search/search 同源参数语义)。

调试用 HTTP

本地 DSH 同源服务上可直接请求,例如查看状态或带 q、limit、per、kinds 的搜索(路径见上表)。

配置

在 cordis.patch.yml 中可覆盖(空字符串表示用默认目录):

cacheDir: ''          # 空 = <DSH_HOME>/cache/record-search
sessionsDir: ''       # 空 = <DSH_HOME>/sessions
refreshMs: 60000      # 距上次构建超过该时间,下一次搜索可顺手后台增量
maxSessions: 40       # 结果最多显示多少个会话
maxHits: 3            # 每个会话最多几条片段
snippetChars: 110     # 片段长度
toolOutputChars: 600  # 工具输出进索引的截断长度

代码结构(便于排查)

entry.js        # 入口:宽松 Config + 按 mtime 动态 import impl.js
impl.js         # 索引、搜索、HTTP、record_search 工具
client.js       # 浏览器侧:locale、样式、侧栏、主面板
cordis.patch.yml

跳转会话在客户端与 uiWorkspace.openSession 同源;定位到具体消息时宿主无按 seq 滚动的公开 API,插件在服务端/客户端分步完成 openSession、历史 loadThrough(seq)、DOM 匹配与折叠组展开(详见 README「定位到那句话」与 /record-search/jumps 日志)。

适用场景与注意

适合:长期用 DSH、需要在多会话间按正文关键词(尤其中文单字/短语)回溯;希望侧栏与 Agent 工具共用一套索引。

限制(README 明确):

  • 字面量子串,不是语义或 FTS 分词;极长历史可能 loadThrough 超时,此时只打开会话不滚动,错误落在日志而非弹窗。
  • 目标在深层折叠(如工具卡片参数)时可能只展开外层;turn-process 等折叠需区分「在视口外」与「高度为 0 的被折叠行」。
  • 插件权限即 DSH 进程权限,索引含会话正文摘要,请注意本机数据安全。

自检可运行仓库内 node selftest.mjs(package.json 的 test 脚本)。

结尾

dsh-record-search 用自建索引补上 Harness 默认 session.search 在中文与「正文未开」场景下的缺口,并把检索接到侧栏、record_search 与可跳转片段上。查阅说明与提 issue 见 GitHub;目录摘要见 SkillHub 插件页。

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

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

Xiaoye