前言¶
DSH 內置的 session_search 和側邊欄搜索走的是 SQLite FTS5 的 unicode61 分詞器。這個分詞器按 Unicode 空白與標點切詞,中文整句通常不會被切成可檢索的詞元,於是「我之前哪次對話裏說過 XXX」這類問題基本搜不到。如果想按原話找歷史會話,內置搜索幫不上忙。
dsh-session-find 就是針對這個問題的插件:它繞開 FTS5 分詞,直接掃描 $DSH_HOME/sessions 下的原始 .jsonl.zstd 日誌做字面子串匹配,中文整句也能命中,並把結果定位到會話、輪次、步驟和角色。插件由 quecai-niu 維護,許可爲 MIT,屬於「記憶」分類,放在社區插件目錄,不是官方應用。
下面介紹它的能力、安裝方式和實際使用。
兩個入口¶
插件提供兩個入口,共用同一套檢索核心(lib/search.js),只有一份邏輯。
| 入口 | 用途 |
|---|---|
| 右側欄面板 | 點會話 header 右緣的放大鏡按鈕打開。搜索、按角色篩選,雙擊命中會跳轉到該會話並滾動到那句話,命中處藍色脈衝高亮 2.6 秒。 |
session_find 工具 |
模型可直接調用的工具。用戶可以說「幫我找找哪次對話裏說過 XXX」。 |
面板面向瀏覽器操作,工具面向模型調用,兩者是同一檢索能力的兩種形態。
覆蓋範圍與命中信息¶
正文按 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,宿主側工具在啓動時加載。
典型用法¶
右側欄面板:點擊右上角放大鏡按鈕,輸入要查找的字面文字,可以按角色篩選;看到命中後雙擊,插件會切到對應會話並滾動到那句話。
模型側則直接表達意圖即可,例如「幫我找找哪次對話裏說過 API Key 輪換方案」。session_find 工具的參數如下:
| 參數 | 類型 | 說明 |
|---|---|---|
query |
string 必填 | 要搜的字面文字,不區分大小寫,上限 512 字符 |
roles |
string[] | 只在這些角色裏搜 |
session |
string | 限定會話 id 的一段 |
limit |
number | 最多返回幾條,默認 20,上限 50 |
context |
number | 片段兩側各保留多少字符,默認 100,上限 2000 |
輸出有 24000 字符的總預算,超出會截斷,並說明剩餘條數和收窄建議。
HTTP 路由¶
瀏覽器面板使用以下三條只讀路由:
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
需要說明的是,面板的滾動定位依賴聊天區的 data-chat-turn 與 [data-conversation-scroll] 屬性。這些屬性不是官方公開 API,DSH 升級後可能改名。如果是想二次開發面板或寫腳本調用路由,這一點要先確認當前 DSH 版本是否仍保留。
適用場景與注意¶
適合以下情況:
- 歷史會話量大,內置搜索按中文整句檢索不到,需要字面搜索原文。
- 需要定位到具體輪次、步驟和角色,而不只是看到一條標題。
- 需要在模型側用自然語言直接發起檢索。
使用時要注意幾點:
- 插件以當前 DSH 進程的權限運行,它的能力邊界就是進程能讀到的
$DSH_HOME內容,安裝前應確認這一點符合預期。 - 安裝前應檢查插件源碼和許可證。該插件爲 MIT,倉庫地址見文末。
- 跳轉精度依賴 DOM 契約,失效時插件會退回「只切會話、不滾動」,不會報錯,所以看到只跳轉不滾動時要意識到可能是版本變更。
- 跨會話跳轉存在等待:目標會話內容掛載前用
MutationObserver等待,上限 8 秒,期間不阻塞 UI。 - 標題、待發消息這類輪次外的事件無法滾動定位,插件會明確提示。
結尾¶
dsh-session-find 的價值在於補上內置 FTS5 分詞的缺口:把跨會話檢索從「按詞」變成「按字面」,並給出可跳轉的定位信息,且保持只讀。
- 插件目錄頁:https://www.skillhub.cn/plugins/quecai-niu/dsh-session-find
- GitHub 倉庫:https://github.com/quecai-niu/dsh-session-find