dsh-memory-delta:跨會話長期記憶,自動注入且只推變化

前言

用 DSH 或同類 AI 編碼助手開新會話時,背景、偏好和已經拍板的結論往往要重講一遍;偶爾把要點寫進一兩個 Markdown,文件會越堆越長,每輪都要付上下文成本,過期結論又很難下線。

OpenSpec 一類 spec-driven 工具解決的是「代碼偏離計劃」,但它們是 pull:模型得被提醒去讀 spec,新會話不會自動帶上記憶。dsh-memory-delta 走 push 路線:會話開始時把該知道的蒸餾內容塞給模型,且儘量只推送相對上一輪的 增量;細節仍可按需檢索。下面介紹它是什麼、怎麼裝、怎麼用。

這是什麼

dsh-memory-delta 是 DeepSeek Harness(DSH) 插件,同時提供零依賴獨立 CLI mem。維護者在 GitHub 上的倉庫爲 lpf20200901/dsh-memory-delta(Gitee 爲只讀鏡像)。設計思路借用了 OpenSpec 的 spec / change / archive 紀律,方向相反:記憶 推入 會話,而不是等 agent 去 拉。

插件在 SkillHub 等社區目錄中歸類爲「記憶」;DSH 生態是「一切皆插件」,社區站點與 DeepSeek / 幻方無官方從屬關係。

存儲分層與寫入規則

記憶庫(默認 <session cwd>/memory,可用配置或 $DSH_MEMORY_ROOT 覆蓋)按 流程階段 與 內容類型 組織:

目錄 階段 內容 誰可寫 是否注入
inbox/ 候選 模型認爲值得保留的結論 僅模型(memory_write) 否
facts/ 在用 踩坑與規避:環境限制、工具行爲、真實失敗與修復 僅人類 promote 是
decisions/ 在用 約定與選型及理由 僅人類 promote 是
archive/ 已歸檔 被取代或不再適用的條目 歸檔操作 否(可搜索、可恢復)

主流程:模型只寫 inbox → 人類 promote 到 facts 或 decisions → 退役進 archive。拿不準放哪邊時:若「明天世界變了就不成立」傾向 facts/;若只有你能推翻則傾向 decisions/。

mem init 會在記憶目錄生成 README.md、memory.config.json、index.md、journal.md 等,並說明各層含義。條目爲帶 frontmatter 的 Markdown,狀態含 active / superseded / expired;同一 scope+key 只允許一條 active,更新需顯式 --supersedes,避免錯誤結論進入永久注入層。

核心能力

差分注入與字節預算

注入層有硬字節預算(可由 store 的 memory.config.json#injectBudget 決定,常見默認約 3072)。每條 standing 條目帶 12 字符內容哈希;插件在 side-car 文件 <harness home>/storages/dsh-memory-delta/inject-state/<session-id>.json 記住上一輪狀態,之後只推送新增、更新、刪除;無變化時 不注入任何內容。README 中對比過:無 diff 的 instructions 類插件在多次小編輯後會重複注入整文件,浪費 token。

首輪注入全部 active 條目作爲 baseline;後續輪次只推 delta。diff 狀態放在 side-car,不塞進會話消息的 source,以符合 DSH session-format 白名單。

DSH 側工具與界面

能力 說明
memory_search 對 facts / decisions / inbox / archive / journal 等做相關性排序檢索;中文按 bigram 匹配;結果通過 tool 的 render 文本返回給模型
memory_write 僅寫入 inbox,不能改 standing 層
蒸餾提醒 會話進行若干步且記憶已是最新時,提醒用 memory_write 記錄結論;每會話一次,且不攜帶會污染 diff 的狀態
到期複覈 verify_when 到期時提醒人類複覈,模型只能把新結論寫 inbox
bundled skill 默認 skill: true 時註冊 /dsh-memory-delta;可 skill: false 關閉
側邊欄「記憶」 需配合如 dsh-better-sidebar;提供分組、搜索、promote / 歸檔等(經 POST /dsh-memory-delta/action,可用 allowWrite: false 關閉寫操作)

插件直接 import 與 CLI 共用的 store 模塊,不在 DSH 內 spawn mem(沙箱對命名管道有限制)。

CLI mem

與插件共用同一套 store 與排序邏輯。典型命令如下(節選):

mem init --root ./memory --scope "workspace:/path/to/project"

mem new --type fact --id win-update-cache --key disk-cleanup \
        --conclusion "Cleaning the update cache reclaimed nothing measurable" \
        --reason "Directory emptied but free space did not move" --tags windows,disk

mem promote win-update-cache
mem promote win-update-cache-v2 --supersedes win-update-cache

mem recall <keywords> [--where all|facts|decisions|inbox|archive|journal|sessions|index]
mem validate [--fix]
mem inject [--json] [--budget 3072]
mem due [--within N] [--json]

全局安裝 CLI:

npm i -g dsh-memory-delta

需要 Node.js >= 20。package 當前版本爲 1.3.4,許可證 MIT。

安裝與啓用

README 強調兩種常見誤配會 靜默失敗:把包寫進 package.json 的 dsh.profile.bundles(啓動時會被市場 registry 覆蓋);在 cordis.patch.yml 裏寫裸條目而不包在 - insert: 下。

從 npm / DSH 命令安裝

插件已發佈到 npm,DSH 可從 registry 安裝:

cd ~/.dsh && dsh plugin --profile web add dsh-memory-delta

社區插件市場條目爲 lpf20200901/dsh-memory-delta,從市場安裝會使用包內自帶的 bundle patch;該 patch 有意不設置 maxBytes,注入上限由 store 的 memory.config.json 決定。

本地開發 / 手動安裝

DSH_HOME 在桌面版常見爲 %APPDATA%\dsh-desktop\harness(Linux 等環境以實際 harness home 爲準,解析鏈:config.stateDir → ctx.dshHomePath → $DSH_HOME → ~/.dsh)。

  1. 將包複製到 profile 的 node_modules,例如:
   <DSH_HOME>\profiles\web\node_modules\dsh-memory-delta\
       package.json
       bin\mem.mjs
       src\plugin.mjs  src\hook.mjs  src\planner.mjs
  1. 在 <DSH_HOME>\profiles\web\cordis.patch.yml 追加:
   - insert:
       - id: dsh-memory-delta
         name: dsh-memory-delta
         config:
           root: ''
           enabled: true
           dueWithin: 0
           panel: true
           allowWrite: true
           skill: true
  1. 保存後 patch 層會被 watch,熱加載,無需重啓。

卸載:刪除上述 - insert: 塊並刪除 node_modules\dsh-memory-delta。

已知風險(2026-10-08 觀測):通過市場安裝或卸載 其他 插件時,profile 的 cordis.patch.yml 可能被重寫,手寫 - insert:(含註釋)會丟失,表現爲文件仍在 node_modules 但不再注入。安裝後應確認文件中仍有 - id: dsh-memory-delta。

典型用法

  1. 在項目下執行 mem init,或依賴插件默認 root: ''(即會話工作目錄下的 memory)。
  2. 會話中模型用 memory_write 把候選結論寫入 inbox;人類確認後 mem promote 或側邊欄提升進 facts / decisions。
  3. 需要更新同一語義 key 時,用 --supersedes 顯式取代舊條目,舊內容進 archive。
  4. 調試注入 payload 時用 mem inject [--json];檢查 store 健康用 mem validate [--fix]。

適用場景與注意

適合:長期維護同一倉庫或工作區、希望新會話自動帶上精簡且不過期的約定與踩坑記錄,又願意用 promote / supersede 做人工把關的開發者。

注意:

  • 插件以 當前 DSH 進程權限 讀寫記憶目錄與 side-car;安裝前應閱讀 源碼與許可證,確認路徑與寫權限符合預期。
  • 錯誤結論若被 promote 到 standing 層,會在每輪注入中持續存在;務必堅持「模型只寫 inbox」。
  • 依賴 @deepseek-ai/cordis 等 peer 包,需與所用 DSH 內核版本兼容;README 記錄了 session-format v4 等對注入消息 source.kind 的要求。
  • 側邊欄記憶 Tab、skill 註冊爲可選能力;無 Web 側欄時仍可差分注入與 CLI 並用。

鏈接

經過上面的步驟,你可以在 DSH 裏把跨會話記憶做成可審查、可 diff、可歸檔的 Markdown store,並在會話開始時只支付增量上下文成本。

羽毛球分组比赛记分
小程序二维码

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

小夜