dsh-session-find
DeepSeek Harness 的会话原文检索插件:绕开内置 FTS5 分词,在全部会话日志里按字面文字搜索(中文整句也能搜到),并定位到会话、轮次、步骤与角色。
内置的 session_search 和侧边栏搜索走 SQLite FTS5 unicode61 分词器,中文整句基本搜不到。本插件直接扫描 $DSH_HOME/sessions 下的原始 .jsonl.zstd 日志做字面子串匹配。
两个入口
| 入口 | 用途 |
|---|---|
| 右侧栏面板 | 会话 header 右缘的放大镜按钮打开。搜索、按角色筛选、双击命中跳转到该会话并滚动到那句话(蓝色脉冲高亮 2.6 秒)。 |
session_find 工具 |
模型可直接调用。说「帮我找找哪次对话里说过 XXX」即可。 |
两者共用同一套检索核心(lib/search.js),只有一份逻辑。
覆盖的内容
按 7 类角色分离正文:
用户 · 助手 · 思考(模型推理) · 工具调用 · 工具结果 · 标题 · 待发消息
每条命中给出:
- 会话标题与 sessionId(标题会重名,ID 才是唯一依据)
- 事件 seq(指回具体事件)
- 第几轮 / 第几步 / 角色 / ISO 8601 时间
- 命中位置两侧各 N 字符的上下文片段
关于日志格式
会话日志是 session.v<N>.jsonl.zstd,由多条 zstd frame 顺序追加而成。Node 的 zstdDecompressSync 只解第一帧,必须按帧魔数 28 B5 2F FD 切片逐帧解压。
轮次号优先取 turn/start 事件自带的 data.turn(权威值),缺失时才退回自增计数。
只读
不改会话日志、不改任何配置。
索引缓存在 $DSH_HOME/cache/dsh-session-find/index.json,按 (mtimeMs, size) 增量更新。删除该目录即强制重建。
安装
dsh plugin --profile <profile> add dsh-session-find
或在 profile 的 cordis.patch.yml 中插入:
- insert:
- id: session-find
name: dsh-session-find
安装后重启 DSH(宿主侧工具在启动时加载)。
工具参数
| 参数 | 类型 | 说明 |
|---|---|---|
query |
string 必填 | 要搜的字面文字,不区分大小写,上限 512 字符 |
roles |
string[] | 只在这些角色里搜。可选值见上 |
session |
string | 限定会话 id 的一段 |
limit |
number | 最多返回几条,默认 20,上限 50 |
context |
number | 片段两侧各保留多少字符,默认 100,上限 2000 |
输出有 24000 字符总预算,超出会截断并说明剩余条数与收窄建议。
HTTP 路由
浏览器面板使用(只读,三条 exact 路由):
GET /session-find/api/search?q=...&roles=用户,助手&limit=50&context=100&session=xxx&case=1&nocache=1
GET /session-find/api/sessions
GET /session-find/api/health
已知限制
- 跳转精度的实现依赖 DOM 契约。面板通过聊天区的
data-chat-turn与[data-conversation-scroll]属性定位,再在节点内部用TreeWalker+Range找到命中那句话。这些属性不是官方公开 API,DSH 升级后可能改名;失效时会退回「只切会话、不滚动」,不会报错。 - 跨会话跳转有等待。目标会话内容挂载前用
MutationObserver等待(上限 8 秒),期间不阻塞 UI。 - 轮次外的事件无法滚动定位(如标题、待发消息),会明确提示。
License
MIT
No comments yet. Be the first to write one.