dsh-session-search:DSH 历史会话全文搜索与消息定位

前言

在 DeepSeek Harness(DSH)里长期跑对话,会话会堆在本地。想找回某次讨论里说过的一句话,往往只能逐个打开会话、上下翻页。DSH 自带索引能力可以配合其他插件,但若你只想在 Web 或桌面端侧边栏里按关键词搜全部历史,并直接跳到那条消息所在行,就需要一个专门读本地会话文件、再在 UI 里完成跳转的插件。下面介绍社区插件 dsh-session-search(维护者 Li-0803,分类:记忆)。

这是什么

dsh-session-search 给 DSH 增加一个会话全文搜索浮窗:侧边栏有放大镜入口,按关键词搜索本机 DSH 中的全部历史会话;点击某条命中后,打开该会话并定位到对应消息行,高亮数秒(User 消息定位到用户行,DeepSeek 回复定位到助手行)。

简介原文:Full-text search for DeepSeek Harness sessions with precise message navigation.

  • 目录页:https://www.skillhub.cn/plugins/Li-0803/dsh-session-search
  • 源码:https://github.com/Li-0803/dsh-session-search
  • 许可证:MIT
  • 当前版本(package.json):0.1.1

插件以当前 DSH 进程权限运行,会读取本机会话正文;安装前建议浏览源码与许可证。

核心功能

搜索浮窗与交互

  • 侧边栏左下角(「设置」按钮附近)出现搜索入口;点击弹出浮窗,可用左上角关闭、点遮罩或 Esc 关闭。
  • 搜索框输入关键词后 300ms 防抖实时搜索。
  • 对话方筛选:全部 / DeepSeek / User。
  • 结果按时间倒序,每条带时间(MM-DD HH:mm)。
  • 无关键词时默认列出所有会话(标题 + 各一条 User / DeepSeek 消息样例)。
  • 命中内容关键词高亮,只展示命中句附近片段。
  • 点击命中 → 打开会话 → 自动加载历史分页 → 定位到消息行 → 滚动并高亮 → 浮窗关闭。

主机端与定位机制

主机端直接读取 ${DSH_HOME:-~/.dsh}/sessions/**/session.jsonl.zstd,用 Node 内置 node:zlib 解压 JSONL,做本地全文搜索;不依赖 DSH 的 session.search 索引,也无需把 session-query-sqlite 的 openAt 改成 startup。

对话分页懒加载,插件在客户端通过 sessions.binding(sessionId).session.loadOlder() 循环加载,直到目标消息进入 DOM,再用 [data-chat-anchor-key] 与文本匹配定位;高亮只对文本节点处理,不改写 innerHTML。

通过 DSH 的 ctx.webServer 暴露 GET /api/dsh-session-search(参数含 q、party 等)。接口有回环限制(Host 与 remoteAddress 均为 localhost / 127.x / ::1 才放行,否则 403);文档明确说明这不是可靠鉴权,同一机器上能访问该端口的进程或页面仍可能读到会话内容。

响应上限

  • 每条命中片段上限约 300 字符,超出以 … 包裹并标记 truncated: true。
  • 单次搜索最多 200 条命中(matchLimit)、50 个会话分组(groupLimit);无关键词列表同样限制最新 50 个会话。
  • 关键词长度上限 500 字符。

环境要求

  • Node.js ≥ 22.15.0(zstdDecompressSync 自 22.15.0 起提供,且为实验性 API)。
  • DeepSeek Harness:README 记载已在 dsh web 0.1.x(0.1.1-rc.2)、官方桌面端(DSH Desktop)与 0.2+ 的 dsh web 上人工验证。
  • 浏览器:Chrome / Edge / Safari / Firefox 最新版。

会话切换 API 随 DSH 版本变化:0.2+ / 桌面端用 uiWorkspace.openSession(sessionId);0.1.x 用 sessions.open(sessionId)。插件优先新 API、回退旧 API。

安装与启用

推荐用 dsh plugin add(仓库自带 dsh.bundle.patch,安装时可自动把插件 insert 进 profile)。资料中的步骤如下(需先把插件目录放到稳定位置;示例假设目录名为 dsh-session-search)。

mkdir -p ~/.dsh/plugins
cp -R dsh-session-search ~/.dsh/plugins/

dsh plugin --profile web add link:~/.dsh/plugins/dsh-session-search

--profile 按实际宿主填写:dsh web 用户一般为 web,官方桌面端为 desktop。安装后重启对应宿主生效。

若 pnpm install 对 link: 依赖异常(表现为 Already up to date 但 node_modules 里没有包),可补软链接:

ln -snf ~/.dsh/plugins/dsh-session-search ~/.dsh/profiles/web/node_modules/dsh-session-search

不依赖 pnpm 时可手动 symlink 进 profile 的 node_modules 并重启;若宿主不认 dsh.bundle.patch,需在 ~/.dsh/profiles/<profile>/cordis.patch.yml 末尾追加 README 中的 insert 条目。

卸载:删除 symlink、从 cordis.patch.yml 去掉对应 insert、重启;可选删除 ~/.dsh/plugins/dsh-session-search。插件不写入新数据文件。

典型用法

  1. 启动或重启 dsh web / DSH Desktop,确认侧边栏左下角出现搜索入口。
  2. 打开浮窗,输入关键词;需要时切换「全部 / DeepSeek / User」。
  3. 在分组结果中点击一条命中,等待会话打开与历史分页加载,页面应滚到对应消息并短暂高亮。
  4. 清空关键词可浏览最近会话列表(受 50 个会话上限约束)。

主机端单元测试(README):

node --test

适用场景与注意

适合:本地自用 DSH、会话多、需要跨会话全文检索并跳到原消息行的开发者。

务必注意:

  • 插件会读取并展示本机全部历史会话正文,不上传、不遥测、不发起外部网络请求,但会话内容通常高度私密。
  • 不要把 DSH Web 暴露到公网或不可信网络(例如避免 --host 0.0.0.0 对外监听);共享电脑使用前自行评估风险。
  • 搜索为同步读盘解压,会话很多或很大时可能短暂卡顿;无缓存索引,连续快速输入时旧请求可能晚于新请求返回。
  • 定位采用轮询等待 DOM,会话很长且目标很靠前时等待更久。
  • 回环限制不能替代访问控制;反向代理或端口转发可能改变请求来源表现。

常见故障(节选):无入口 → 检查 cordis.patch.yml 与 symlink 并重启;403 → 非回环访问;无法切换会话 → DSH 版本与 openSession / sessions.open 契约不匹配,见 README 故障排查表。

结尾

dsh-session-search 在 DSH 侧边栏提供跨会话全文搜索,并在点击命中后加载分页、定位到具体消息行,适合在本地 Harness 工作流里快速找回历史对话。详情与更新见 GitHub README;社区目录页:https://www.skillhub.cn/plugins/Li-0803/dsh-session-search ,源码:https://github.com/Li-0803/dsh-session-search 。

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

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

Xiaoye