前言¶
DSH 自帶一個 session_search 工具,用來在會話歷史裏找內容。會話數量少的時候夠用;本機會話歷史變大之後,它建不完索引,調用只會超時或者報 storage unavailable。會話越多,這個問題出現得越頻繁。下面介紹的這個插件就是專門爲這件事做的:把「建索引」和「查」拆開,索引落盤成 SQLite,查詢走 FTS5。
這是什麼¶
dsh-session-find 由 BrainZombie 維護,MIT 協議,是 DeepSeek Harness(DSH)的插件。它在本地建一個持久化的 SQLite FTS5 索引,覆蓋全部會話轉寫文本,支持增量同步和打碼。插件目錄頁(skillhub.cn)把它歸到「記憶」分類,其 GitHub 倉庫描述爲 Fast local cross-session search for DeepSeek Harness: persistent SQLite FTS5 index over session transcripts, incremental sync, redaction.
本質上它替代的是大體量會話歷史下那個不可用的 session_search:索引是派生數據,落盤之後查詢不再依賴每次全量建索引。
環境要求¶
README 列出的前置條件如下:
| 需要什麼 | 版本 | 原因 |
|---|---|---|
| DeepSeek Harness | >= 0.2.0 | 提供工具註冊與插件掛載點 |
| Node.js | >= 20 | 主機側代碼全是 ESM |
node:sqlite(可選) |
Node >= 22.5 | 有它才建 FTS5 索引;沒有則自動退回直讀掃描,功能不變、速度變慢 |
node:sqlite 是可選的:Node 版本夠就有 FTS5 索引,不夠插件會退化成直接讀會話文件掃描,功能一樣,只是慢。
安裝與啓用¶
安裝命令來自 README 原文:
dsh plugin add dsh-session-find
裝完重啓宿主,工具就會出現。插件代碼裏聲明的 dsh.compatibility.dsh 是 >=0.2.0-rc.1 <0.3.0-0,安裝前可以留意一下自己的 DSH 版本是否落在這個區間。
首次調用工具時會建索引。README 給了本機實測數據:479 個會話、32015 條事件。
配置¶
插件在 DSH 配置裏掛成一個 id 爲 session-find 的配置塊:
- id: session-find
name: dsh-session-find
config:
indexPath: '' # 留空 = <DSH_HOME>/storages/session-find/index.db
redact: false # true = 默認打碼(也可每次調用傳 redact: true)
extraRedactPatterns: [] # 追加的打碼正則
includeArchived: true
maxResults: 40
snippetChars: 240
autoSync: true # 每次調用前只對 mtime/size 變過的會話做增量
逐個說明:
indexPath留空時索引庫放在<DSH_HOME>/storages/session-find/index.db。redact控制默認是否打碼。打碼也可以只在單次調用時傳redact: true,不改全局。extraRedactPatterns是追加的自定義打碼正則。autoSync打開後,每次調用前只對mtime或size變過的會話做增量同步。
三個工具¶
插件註冊三個工具:
| 工具 | 作用 |
|---|---|
session_find |
跨會話全文檢索,返回會話 id / 標題 / cwd / 命中片段 |
session_show |
按 id 讀原文,可按 seqFrom / seqTo 取區間 |
session_index |
status 看索引狀態,sync 只處理變化的會話,rebuild 全量重建 |
session_find 的參數:query(必填)、cwd、since / until、types(user / reply / tool)、limit、perSession、redact、titleMode(只按標題找)、sortBy(score / time)。
典型用法是三步:先查,再選中的會話讀原文。
1、session_find 傳 query 找回的會話 id。
2、session_show 按 id 讀原文,需要細看某段時用 seqFrom / seqTo 取區間。
3、索引狀態不對或換過表結構時,session_index status 看狀態,session_index sync 增量處理,session_index rebuild 全量重建。
索引怎麼工作¶
索引庫的表結構:
sessions:id/workspace/cwd/title/created_at/mtime/size/eventsevents:FTS5 虛表,承載全文檢索state:記錄lastSync
增量策略:只有會話文件的 mtime 或 size 變了,才重灌該會話的 events。rebuild 則清表重來。
一致性方面:單個會話的寫入放在一個 BEGIN / COMMIT / ROLLBACK 事務裏;庫上開 PRAGMA journal_mode = WAL、synchronous = NORMAL。
有個實現細節值得知道:FTS5 的 MATCH 不參與 join,否則會產生歧義,所以排序分走 rank 列。另外插件版本升級若換過表結構,會自動 DROP 重建,不遷移舊數據——索引本來就是派生物,丟了重建即可。
隱私與安全注意¶
索引是原文派生的:庫文件裏存着會話片段,默認不打碼,理由是「原文即檢索能力」。庫文件在 <DSH_HOME>/storages/ 下,不進倉庫、不外發。
幾點要注意:
1、需要打碼時,把 config.redact 設成 true,或者單次調用傳 redact: true。
2、extraRedactPatterns 用來追加自己的正則,覆蓋默認規則之外的敏感串。
3、插件以當前 DSH 進程的權限運行,能讀到會話目錄、能寫索引庫。安裝前建議先讀一遍源碼,確認許可證(MIT)和行爲再啓用。
4、索引庫是本地文件,不會自動同步到別處;搬家或清理磁盤時知道它的存在即可。
測試與開發¶
倉庫自帶的自測腳本:
npm test # node test/selftest.mjs(自建 fixture 會話 + 臨時庫:檢索/增量/打碼/工具面)
npm run doctor # 發佈前的清單檢查
dsh-plugin verify . # 真打包、真安裝、掛載檢查(需要裝好 DSH 的機器)
npm test 自己造 fixture 會話(臨時 DSH home + zstd 轉寫),不讀你的 ~/.dsh,所以在 CI 和乾淨機器上同樣是綠的。verify 需要真實宿主,只在本地跑。
包信息:dsh-session-find,版本 0.1.0,MIT。
結尾¶
dsh-session-find 解決的是一個很具體的痛點:DSH 會話歷史變大之後,跨會話檢索不可用。它把索引落盤成 SQLite FTS5,做增量同步,換來的改動很小,換來的收益是毫秒級返回。如果會話數量已經讓 session_search 超時,值得試一下。
目錄頁:https://www.skillhub.cn/plugins/BrainZombie/dsh-session-find
源碼:https://github.com/BrainZombie/dsh-session-find