dsh-recall:爲 DSH 項目保存可檢索的對話摘錄

前言

在 DSH 裏跑智能體時,很多結論只出現在某次對話裏:技術選型、約定好的路徑、臨時拍板的規則。重啓會話或換 agent 後,這些內容不會自動變成項目裏的可查資料。有人靠 Markdown 筆記或全局記憶插件,但要麼要手動整理,要麼和「當前倉庫、當前工作目錄」綁得不緊。

dsh-recall 是 LIghtJUNction 維護的 DSH 插件(社區分類:記憶),定位是 Searchable project conversation excerpts for DSH:由調用方顯式寫入摘錄,再在項目本地做字面檢索。它不接管 DSH 會話日誌,也不自動把歷史對話灌進上下文。

這是什麼

  • 名稱:dsh-recall(npm 包名 @lightjunction/dsh-recall,版本 0.1.0)
  • 依賴環境:DSH 0.2.1-rc.2,Node >=24(README 寫明本地在 Node 26 / TypeScript 5.9.3 開發與測試)
  • 解決的問題:在當前項目工作區裏,保存少量對話摘錄並支持搜索、按 revision 刪除,供後續 agent 或 host 調用工具查詢

存儲與讀寫發生在 DSH 宿主機上的本地目錄,不是 remote world 適配器,也不是安全沙箱。

核心功能

插件通過 Cordis 暴露三個工具(行爲以 README 爲準):

  1. recall_save:只保存調用方傳入的 role、text;可選 sessionId(默認當前 agent ID,host 直調時爲 manual)。相同 role/text/session 重複寫入會返回已有記錄。
  2. recall_search:對已保存文本做大小寫不敏感的字面 AND 匹配,按時間從新到舊;省略 query 則列出摘錄。結果含 id、revision、role、text、sessionId、savedAt。
  3. recall_delete:僅當 id 存在且 expectedRevision 與當前一致時刪除一條;未知 ID 或 revision 過期會明確失敗。

README 強調:摘錄是不可信引用數據,不是指令;不會自動搜索、複製或摘要會話日誌;role / sessionId 由調用方提供,插件不做獨立鑑權。

安裝與啓用

Release 發佈後,從 GitHub Release 安裝構建好的 tgz(README 給出的 v0.1.0 資源 URL 爲預期位置,是否已發佈需以 Release 頁爲準;安裝時使用同 Release 附帶的歸檔與 SHA256SUMS):

dsh plugin --profile headless add https://github.com/LIghtJUNction/dsh-recall/releases/download/v0.1.0/lightjunction-dsh-recall-0.1.0.tgz
dsh headless --dump-config

安裝後需重啓 DSH。若你用的不是 headless profile,把命令裏的 profile 換成自己的即可。包內帶 DSH bundle patch 與編譯後的 JavaScript,不需要 Pi 依賴。

默認 bundle 配置爲 {}:各工具使用 invoking agent 的工作目錄。無 agent 的 host 調用必須顯式配置 root。要在宿主機固定某個本地倉庫,可在 profile 的 cordis.patch.yml 裏覆蓋:

- id: dsh-recall
  config:
    root: /absolute/local/project

root 必須已存在,由 DSH 宿主機上的 Node 文件系統 API 解析;遠程 DSH world 或 sandbox 不會重定向這些操作——僅建議在宿主機本地項目上啓用。

典型用法

README 給出的自然語言示例:

  • 讓 DSH 執行:「Explicitly save this decision in recall: we chose SQLite for the local cache.」
  • 之後:「Search recall for sqlite cache.」

對應的工具調用形態如下。

保存:

recall_save({role:"user",text:"We chose SQLite for the local cache",sessionId:"optional-source-id"})

搜索:

recall_search({query:"sqlite cache",limit:10})

刪除(需使用搜索結果中的 id 與 revision):

recall_delete({id:"<result id>",expectedRevision:"<result revision>"})

存儲、限額與併發

數據文件路徑:<workspace>/.dsh-recall/records.json。目錄創建爲 0700,替換文件爲 0600(具體以文件系統爲準)。內容是明文,無加密——只存適合留在項目裏的內容,勿存密鑰;README 建議把 .dsh-recall/ 排除出版本控制,且插件不會改你的 .gitignore。

限額(README 原文):最多 200 條記錄 / 合計 4 MiB;單條摘錄最多 50,000 UTF-8 字節;sessionId 最多 200 字符;搜索 query 最多 500 字符;limit 爲 1–50。拒絕遍歷、符號鏈接存儲路徑與非 regular 文件;存儲損壞時fail closed,不會靜默重置;搜索不會創建存儲。同一 root 下多 agent 共享記錄,重啓 DSH/插件後仍保留。

寫路徑使用 .dsh-recall/write.lock 獨佔;併發寫失敗報 “store busy” 可重試;成功寫入通過 fsync 臨時文件再原子 rename。崩潰可能留下 lock/temp,需停掉所有寫者、檢查存儲後手動清理;無自動搶鎖。插件不提供 Pi picker/menu、全局 Pi 遷移、Markdown 模板、自動會話採集、替代 DSH session-search 或自動 prompt 注入。

適用場景與注意

適合:需要在單個本地項目裏沉澱少量、可檢索的決策或對話片段,並由 agent 通過工具顯式寫入/查詢的場景。

不適合或需知:指望自動同步完整會話、遠程 world 內存儲、或把 recall 內容當權威指令執行——這些都不在插件設計範圍內。

安裝前請自行查看 GitHub 倉庫 源碼與 MIT 許可證(NOTICE 含上游歸屬說明)。插件以當前 DSH 進程權限訪問本地文件;路徑檢查針對常規 symlink 等與 bounded read,不能抵禦惡意進程併發替換祖先目錄——應在可信本地工作區使用。Linux/macOS 爲預期目標平臺,Windows 未在 README 中驗證。

DSH 生態強調「一切皆插件」;SkillHub 目錄頁 爲社區站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-recall 把「項目內可搜的對話摘錄」收成三個明確工具:顯式保存、字面搜索、帶 revision 的刪除,數據落在 .dsh-recall/records.json。若你的 workflow 需要輕量、本地、可審計的片段記憶而非全量會話鏡像,可按 Release 安裝並在本地 profile 中配置 root 後試用。

  • 目錄頁:https://www.skillhub.cn/plugins/LIghtJUNction/dsh-recall
  • GitHub:https://github.com/LIghtJUNction/dsh-recall
羽毛球分组比赛记分
小程序二维码

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

小夜