前言¶
DeepSeek Harness(DSH)的 Web GUI 在开发智能体时非常实用,但官方的 Trajectory 视图虽然能搜到内容,却没有锚点跳转能力;社区现有的 dsh-session-search-toggle / dsh-history 又依赖已被移除的运行时模块,无法安装。dsh-conversation-find 是一个客户端插件,补上了这个空白:在当前会话内按关键词搜索,并把命中项滚动定位到对话视图中的对应位置。
是什么¶
这是一个为 DSH Web GUI 开发的客户端插件,由 vagur1689 维护。它不依赖任何 @deepseek-ai/* 运行时模块,直接在浏览器端运行。插件会在会话头部增加一个放大镜按钮,通过叠加层高亮命中项,并支持快捷键唤起。
核心功能¶
-
搜索覆盖整段会话历史:打开面板后先把会话历史翻到最早一页(面板显示「加载历史 N」进度),再在全文范围内搜索。
-
快捷唤起与交互:会话头部(header utilities 座位)新增一个放大镜按钮,
⌘/Ctrl + Shift + F也能唤起面板。输入即搜(160ms 防抖),命中数显示为当前/总数。Enter下一个、Shift+Enter上一个、Esc关闭。 -
高亮与滚动定位:命中项用叠加层高亮(当前项为橙色),不修改 React 拥有的 DOM,因此流式输出和重渲染都不会留下脏标记。跳转按 Range 的真实 client rect 把命中项滚到视口中间。
-
流式输出适配:流式输出时自动重算(400ms 防抖);切换会话自动关闭面板。
为什么需要先「加载历史」¶
会话视图不是把整段对话一次性放进 DOM 的:它维护一个窗口,hasMore 为真时列表顶部有「加载更早」。所以只搜 DOM 的话,结论会是「没找到」,而那句话其实只是还没加载。本插件因此先调用会话 store 的 loadOlder() 把窗口翻到起点(hasMore === false)再搜索;视图自己会监听 loadingOlder 并保持阅读位置,所以翻页不会把视口拽走。
翻页上限 400 页:真的撞到上限时,命中计数会带「历史未加载完」提示,明确告诉你结果只覆盖已加载部分,不会假装搜全了。关闭面板会立即中止正在进行的翻页。
安装¶
直接从 GitHub 装:
dsh plugin --profile web add github:vagur1689/dsh-conversation-find
然后重启 dsh web,再强刷页面(Cmd + Shift + R)。
本插件没有 prepare/postinstall 构建步骤(源码就是可直接加载的 JS),所以不需要在 pnpm-workspace.yaml 里加 allowBuilds 白名单。
要改源码就改用 link: 指到克隆目录——link: 的好处是改完只需强刷页面,宿主按请求读取 bundle,不必重装:
git clone https://github.com/vagur1689/dsh-conversation-find.git ~/dsh-conversation-find
dsh plugin --profile web add link:~/dsh-conversation-find
使用¶
-
打开任意会话,点右上角的放大镜(或按
⌘/Ctrl + Shift + F) -
输入关键词,回车在命中项之间循环
边界与限制¶
-
只在当前会话内搜索,不跨会话;跨会话需要另做检索层(读
$DSH_HOME/sessions或用session-query-sqlite)。 -
搜索前会翻页到会话起点,因此第一次搜索需要等历史加载(面板有进度),超长会话耗时更明显;上限 400 页,撞上限会提示「历史未加载完」。
-
不搜输入框草稿(
data-composer-seat),也不搜<script>/<style>和插件自己的面板。 -
单次结果上限 2000 条命中、单帧最多绘制 400 个高亮框,避免一次按键把长会话卡住。
实现要点¶
-
纯客户端插件:
index.js是空宿主半部,只用于让 Loader 挂载一个声明了dsh.client的包。 -
运行时只
require("react"),不引入任何@deepseek-ai/*运行时模块,这正是它能在 0.2.0-rc.2 上跑的原因。 -
历史翻页走会话 store 的公开面:
ctx.get('sessions').binding(id).session.getSnapshot().hasMore+loadOlder()。 -
通过
ctx.slots.inject('conversation.session.header.utilities', …)注册入口;ctx.effect负责卸载。 -
重复挂载用引用计数 +
window.__dshConversationFind单例收敛,不会出现两个面板或两套监听。 -
DOM 锚点只用官方稳定的数据属性:
[data-conversation-scroll]、[data-conversation-session]、[data-composer-seat]。
适用场景与注意¶
适合需要在当前会话内快速查找特定关键词、了解流式输出中某句话位置的 DSH 用户。插件以当前 dsh 进程权限运行,安装前应检查源码与许可证(MIT)。测试用 jsdom 跑在真实 DOM 之上,不需要 DSH 运行。
总结¶
dsh-conversation-find 解决了 DSH Web GUI 在当前会话内全文搜索和定位的问题,通过先翻页到起点再搜索,避免了因历史未加载导致的漏搜问题。它轻量、无构建依赖,适合作为开发智能体时的辅助工具。