dsh-session-finder: Search DSH chats across sessions and jump to matched messages

前言

在 DeepSeek Harness(DSH)里长期跑多个会话时,想找回某段对话往往只能靠左侧列表逐个点开,或依赖宿主自带的搜索。自带搜索能打开对应会话,但响应里通常只有 sessionId 与 snippet,没有消息在事件流里的坐标,界面打开后不会滚到真正命中的那条消息。维护者 Aizai9527 的客户端插件 dsh-session-finder(当前 v0.7.2)针对的是这「最后一跳」:跨会话检索可见聊天文本,选中结果后打开会话,在已渲染的 DOM 里定位到该条消息并短暂高亮。

这是什么

dsh-session-finder 是 DSH 的客户端类插件,仓库 Aizai9527/dsh-session-finder,已在社区插件清单(awesome-dsh-plugin)登记;目录页见 SkillHub 插件页。插件分宿主半与浏览器半:宿主侧提供只读搜索路由并读会话持久化日志;客户端半负责浮层、范围选择与 loadThrough(seq) 跳转。它不改写会话文件,索引与缓存只服务于搜索与定位。

与走 sessions.search 不同,本插件自带搜索通道。部分部署将会话索引配成 openAt: "never" 时,该 RPC 会返回 SESSION_QUERY_SEARCH_DISABLED;插件改为通过 ctx.sessionPersistence 直接读会话日志,避免被这条限制挡住。

核心功能

搜索与范围

  1. 多关键词:空格分隔表示 AND;完全连写的短语在同一会话内排序更靠前。
  2. 搜索范围:当前会话(默认)、全部会话,或按某个项目(cwd)过滤;切换范围会用当前关键词立即重搜。
  3. 结果按消息列出,含角色、时间与命中片段;同一会话最多展示 3 条,优先级为用户消息、助手回复、工具调用。
  4. 单次查询有界:每页最新 150 个会话、每会话 3 条、共 40 条、2.5 秒、6 个会话并发;触顶时状态行提示「已到单次上限」,可通过 nextOffset 继续。

索引与缓存

提取结果按「会话 id + revision」缓存在宿主内存(≤64 M 字符)与 ~/.dsh/cache/dsh-session-finder(gzip、≤240 个文件、按 mtime 淘汰)。启动后在空闲时预热,宽范围搜索不必每次重读大量字符。环境变量 DSH_SESSION_FINDER_NO_DISK=1 可关闭磁盘缓存。

只索引看得见的文字:user/message、assistant/message 仅取 type: "text" 块;不索引 reasoning、流式分块、system/message、developer/message。工具侧只索引名称、参数与输出文本,并剔除注入的 <system-reminder>。每个会话最多索引 8 M 字符;本页无命中时会自动读更早一页(最多 4 页 / 20 秒)。

跳转与锚点

命中未渲染时,通过 ctx.sessions.binding(id).session.loadThrough(seq) 加载直到 baseSeq <= seq。定位采用三级锚点:工具命中优先 data-chat-call-id,其次 data-chat-turn,最后才按片段文字匹配;同一查询内已用过的行不重复占用。

定位后面板可收成导航条,支持 F3 / Shift+F3、Alt+↑ / Alt+↓ 等在命中处间跳转;到本页末尾且还有更早会话时会自动续页。命中的消息块与命中文字各有描边,左侧对应会话行也会标记;折叠分组会先展开。高亮保留到下次跳转或关闭浮层。

其他界面能力

  • 查询历史:最近 10 条存于 localStorage 键 dsh-session-finder:history,仅文本不含会话 id 或命中内容。
  • 面板不透明度 45%–100%(默认 100%),右下角按钮可拖动并记住位置。
  • 状态行显示本次查询耗时(如 · 用时 0.13 s),便于区分缓存冷启动与其他问题。
  • 面板底部提供 GitHub、问题反馈、检查更新;「检查更新」只读仓库 package.json,不调用易限流的接口。

安装与启用

仓库无构建步骤,lib/*.js 即为分发产物。安装后需重启 DSH 桌面端,宿主半与客户端半在启动时加载。

# 从 npm
dsh plugin add dsh-session-finder

# 或直接从 GitHub
dsh plugin add github:Aizai9527/dsh-session-finder

运行环境要求(见 package.json):Node >=20,DSH >=0.2.0。许可为 MIT。

维护者在 README 中说明:若本机使用 link 安装,在插件市场里安装或更新其他插件可能摘掉 link 挂载,导致插件从界面消失;仓库提供 relink.ps1 做检查与修复。改 package.json 时避免写入 UTF-8 BOM(例如 PowerShell 5.1 的 Set-Content -Encoding utf8),否则市场读清单可能报「包不可用」。

典型用法

  1. 按 Ctrl+Shift+F(macOS 为 Cmd+Shift+F),或点击右下角可拖动的搜索按钮。
  2. 输入至少 2 个字符开始搜索;底部选择「搜索范围」。
  3. 在结果列表中用 ↑ / ↓ 选择,Enter 定位;Esc 先收起历史列表,再按一次关闭浮层。
  4. 定位后可用导航条或快捷键在多处命中间移动;输入框为空时可从最近 10 次查询中快速重搜。

宿主只读路由形如:GET /session-finder/search?q=&offset=[&sessionId=|&cwd=],由 lib/index.js 注册;文本提取与缓存在 lib/search.js;浮层与跳转在 lib/client.js,并通过 cordis.patch.yml 注入到 @deepseek-ai/dsh-client-ui-conversation。

开发自检(维护者文档):

npm run check   # node --check 三个入口
npm test        # 96 项检查

浏览器半人工回归可打开 test/fixture.html,不依赖真实 DSH。

适用场景与注意

适合:经常在 DSH 里开多个项目与会话、需要按内容找回某条用户提示、助手回复或工具输出,并要滚到精确消息位置的开发者。

注意:

  • 插件以当前 DSH 进程的权限读会话与写缓存目录;安装前应自行查看源码与 MIT 许可证,确认符合本机安全策略。
  • 搜索与索引有明确边界(时长、条数、字符上限、可见文本类型),极长历史或特殊消息类型可能搜不到或需分页继续。
  • 拿不到会话绑定时,会退回「滚到顶部 + 提示再点一次」的降级行为。
  • 社区目录(如 SkillHub)与 DeepSeek / 幻方无官方从属关系;插件生态遵循 DSH「一切皆插件」的思路,本文事实以仓库 README 与 package.json 为准。

结尾

dsh-session-finder 补的是 DSH 自带搜索「能开会话、难对准消息」的空档:自建只读索引通道、磁盘与内存缓存、以及 DOM 级定位与高亮导航。若你需要跨会话全文检索并一键跳到命中处,可按上文命令安装 v0.7.2 并重启桌面端。

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

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

Xiaoye