dsh-session-search-pro:基於 sessionQuery 的 DSH 跨會話搜索插件

前言

用 DSH 幹活久了,會話記錄越攢越多。「上次那個報錯是怎麼解決的」「之前那版配置寫在哪」——答案多半躺在歷史會話裏,但 agent 本身看不見它們。手動翻會話文件要面對格式與壓縮細節;自己寫腳本掃文件,又碰不到當前正在進行中的這個會話。

dsh-session-search-pro 換了一條路:不直接讀會話文件,而是走 harness 內置的 sessionQuery 服務,把「搜索、列出、讀取會話」封裝成三個 agent 工具。下面介紹它的能力、安裝方式,以及在默認(stock)配置下的實際表現。

這是什麼

dsh-session-search-pro 由 LeslieWylie 維護,MIT 許可證,當前版本 0.2.0。定位一句話:面向 DeepSeek Harness 的跨會話索引搜索,可搜索過去與當前的 DSH 會話。

幾個設計點:

  • 零運行時依賴:不需要 ripgrep,不做 zstd 解析,沒有本地數據庫。
  • 只讀:從不寫入會話,自身也不維護數據庫或緩存。
  • fails closed:sessionQuery 完全不可用時只記一條警告,不註冊任何工具——避免裝上一堆一用就拋錯的工具。
  • 只覆蓋 DSH 單一運行時,不搜索 codex / claude / pi / opencode 等外部來源。需要跨運行時會話搜索的話,README 中對比了直接掃描會話文件的另一條路線(Tieboyh 的 dsh-session-search),可以按需選擇。

三個 agent 工具

跨所有 DSH 會話做全文搜索,每條命中附帶最佳匹配片段。參數:

  • query(必填):要找的文本。字面匹配——正則元字符沒有特殊含義;大小寫不敏感;空白靈活。
  • limit:最多返回的會話數,1–50。默認取插件配置的 maxResults(默認 10)。
  • maxScan:回退掃描時最多打開的會話數,1–500。默認取 maxScan(默認 200),走索引時忽略。

返回值帶 engine: "index" | "scan" 字段,標明這次查詢走了哪條路徑;掃描路徑還會附帶 scannedtruncated。當前進行中的會話也在搜索範圍內。

agent_session_list:列出會話

列出過去與當前會話。參數:

  • limit:最多返回數,1–100,默認 20。
  • cwd:對會話工作目錄做子串過濾,比如只看某個項目目錄下的會話。
  • sort"newest""oldest",默認 newest

agent_session_read:按 id 讀會話

sessionId 讀取單個會話的標題、元數據和按序事件。參數:

  • sessionId(必填):會話 id,例如 "a4d75296-fc89-44b1"
  • maxEvents:最多返回的事件數,1–200,默認 50,最新的在前。

單個事件的長文本會截斷爲 4,000 字符。

stock 配置下的兩條搜索路徑

agent_session_search 有兩條引擎路徑,調用時自動選擇。

索引路徑:stock 的 dsh-base bundle 中,sessionQuery 的具體後端是 @deepseek-ai/dsh-session-query-sqlite,基於 SQLite FTS5。索引可用時插件走它,返回 engine: "index"

但 stock 配置下這個後端默認 openAt: never,此時引擎會拋 SESSION_QUERY_SEARCH_DISABLED。本插件的做法是:準確捕獲這個錯誤,回退爲按最新優先逐個掃描會話,返回 engine: "scan";如果拋的是別的錯誤——後端真的故障了——就直接把錯誤報出來,而不是拿一次更慢的掃描去掃同一個壞掉的存儲。

性能上作者實測過:索引路徑 17ms,回退掃描 3,042ms。索引值得開,只是它不能是唯一路徑。0.1.0 及更早的版本就假定索引必然存在,stock 默認安裝下所有查詢都返回 {"error": "session search is disabled…"}——因爲不拋錯,看起來像在正常工作。當前 0.2.0 用的就是上面的回退邏輯。想打開索引,需要在部署層調整 session-query-sqlite 的 openAt 配置,具體見插件 README。

安裝與啓用

插件尚未發佈到 npm,需直接從 GitHub 安裝。環境要求:node ^22.19.0 || >=24.0.0;peerDependencies 爲 @deepseek-ai/cordis ^4.0.1@deepseek-ai/dsh-tools ^0.1.0-rc.6

標準安裝分三步:先編輯 profile 的 package.json,把插件加進 dependencies 並在 dsh.profile.bundles 註冊;然後重裝依賴;最後重啓 profile。

// ~/.dsh/profiles/<profile>/package.json
{
  "dependencies": {
    "dsh-session-search-pro": "github:LeslieWylie/dsh-session-search-pro"
  },
  "dsh": {
    "profile": {
      "bundles": ["dsh-session-search-pro"]
    }
  }
}
cd ~/.dsh/profiles/<profile> && pnpm install
dsh --profile <profile>

不想跟蹤默認分支,可以固定標籤,寫法如 github:LeslieWylie/dsh-session-search-pro#v0.1.0。注意別固定到 0.1.0——前面說過,那個版本及更早在 stock 配置下所有查詢都會返回錯誤。

想先試用、不動 profile 配置:插件自帶 cordis.patch.yml,裝進 node_modules 後用啓動器的 --patch 掛載運行一次即可。

cd ~/.dsh/profiles/<profile> && pnpm add github:LeslieWylie/dsh-session-search-pro
dsh --profile <profile> --patch ./node_modules/dsh-session-search-pro/cordis.patch.yml

插件配置寫在 cordis.patch.yml 的 bundle 行,只有兩個鍵:

  • maxResults:默認 10,agent_session_search 調用方未傳 limit 時的默認值。
  • maxScan:默認 200,回退掃描最多打開的會話數。

經過上面的步驟,重啓 profile 後工具即可使用。

典型用法

插件進 bundle 後,三個工具自動對 agent 可見,不需要手動調用。直接用自然語言說:

“Search my past sessions for anything about session search” → agent_session_search
“List my recent sessions in ~/Desktop” → agent_session_list
“Read session a4d75296-fc89-44b1 for me” → agent_session_read

模型會自己選對應的工具。

適用場景與注意

適合誰:

  • 長期使用 DSH、希望 agent 能引用過往會話上下文的開發者。
  • 沒開索引的 stock 配置也能用——回退掃描保證搜索可用,只是從毫秒級變成秒級。
  • 需要搜索當前進行中的會話。

注意:

  • 只覆蓋 DSH 單一運行時;codex / claude / pi / opencode 等外部來源的會話不在此插件範圍內。
  • 插件以當前 dsh 進程的權限運行,且安裝來源是 GitHub 倉庫而非 npm。安裝前建議先把源碼和許可證(MIT)過一遍,確認可信再掛進 profile。

小結

dsh-session-search-pro 把「翻歷史會話」變成 agent 的一個工具調用:索引在就走 SQLite FTS5,不在就退回有界掃描;stock 配置開箱即用,服務完全不可用時寧可不註冊工具也不給壞的。

  • 社區目錄頁(獨立站點,與 DeepSeek / 幻方無官方從屬關係):https://www.skillhub.cn/plugins/LeslieWylie/dsh-session-search-pro
  • 源碼倉庫:https://github.com/LeslieWylie/dsh-session-search-pro
羽毛球分组比赛记分
小程序二维码

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

小夜