前言¶
DSH 的文件沙箱只有 read-only / workspace-write / danger-full-access 三檔,不支持再加一個”可寫根”;審批策略也只有 ask / never,沒有 allow-always。於是”只讓記憶歸檔免審批、其他操作照舊彈審批”這件事,用現有配置表達不了。
dsh-memory-archiver 就是爲這個缺口寫的插件。下面介紹它的定位、工具、安裝與配置。
這是什麼¶
imaused/dsh-memory-archiver 由 imaused 維護,給 DSH 增加四個記憶歸檔工具:memory_archive、memory_index、memory_patch、memory_supersede。
它的做法與常規配置方案不同:插件用自己的代碼寫文件(走 node:fs,不經過 ctx.fs),因此不進文件沙箱、也不觸發審批;同時把可寫範圍校驗在 allowedRoots 內,超出範圍的請求一律拒絕。除這四個工具之外的操作,仍然走 workspace-write + ask,照舊彈審批。
四個工具¶
| 工具 | 作用 |
|---|---|
memory_archive |
寫一個記憶文件(dir + file + content,默認拒絕覆蓋;覆蓋前自動備份;UTF-8 無 BOM) |
memory_index |
往索引文件追加一行,或按錨點插入(保持原 BOM 與換行;重複行跳過) |
memory_patch |
就地替換一段文本(替換前自動備份;要求唯一匹配,或顯式 replaceAll) |
memory_supersede |
一次完成”寫新文件 + 舊文件標 status: superseded + 備份”,不刪除任何文件 |
需要留意的是,這個插件沒有刪除工具,清理只發生在 .backup/ 內的舊備份上。
安裝¶
安裝命令來自項目 README,插件需要從源碼打包或直接指向目錄:
npm pack
dsh plugin --profile <profile> add file:<tgz 的絕對路徑>
也可以直接指向源碼目錄:
dsh plugin --profile <profile> add file:<repo 目錄>
裝完重啓 DSH,並新開一個會話,因爲工具在會話創建時綁定。卸載:
dsh plugin --profile <profile> remove dsh-memory-archiver
默認根與配置¶
默認只允許一個根:~/.dsh/memory(~ 解析爲 USERPROFILE / HOME)。要加更多根,有兩種方式。
環境變量方式,用系統路徑分隔符分隔(Windows 用 ;,類 Unix 用 :):
DSH_MEMORY_ROOTS=C:/work/memory;D:/notes/memory
或者在 profile 的 cordis.patch.yml 裏按 id 覆蓋:
- id: memory-archiver
name: dsh-memory-archiver
config:
allowedRoots:
- 'C:/Users/you/.dsh/memory'
- 'D:/work/memory'
優先級是配置高於環境變量,環境變量高於默認值。
備份與保留策略¶
覆蓋或就地更正前,舊文件會自動備份到 <記憶目錄>/.backup/<原名>.<時間戳>.md,返回值會多出 backup 字段。備份寫完後會自動清理舊的:
| 配置鍵 | 默認 | 作用 |
|---|---|---|
backupRetentionDays |
30 |
刪除超過 N 天的舊備份;<= 0 關閉時間清理 |
backupMaxBytes |
0 |
備份目錄總大小上限(字節);0 表示不設上限,超限從最舊刪 |
- id: memory-archiver
name: dsh-memory-archiver
config:
backupRetentionDays: 30
backupMaxBytes: 52428800
清理只針對 .backup/ 裏的 .md 備份,不碰記憶正文。
典型用法¶
寫一個新記憶文件:
memory_archive(dir: ".dsh/memory", file: "projects/foo.md", content: "...")
文件已存在時默認拒絕,需要覆蓋就顯式傳 overwrite。更正原文裏的一段文本時用 memory_patch,目標文本必須在文件中唯一匹配,否則拒絕;確要全部替換時顯式傳 replaceAll。
當同一主題有了新的結論,用 memory_supersede 一次寫完新文件、把舊文件標成 status: superseded 並備份,不需要先刪舊文件。舊文件標記會配合配套插件 dsh-kb-lite 在檢索中降權。
本插件負責”寫”,dsh-kb-lite 負責”讀”:kb-lite 把同一批記憶根索引起來、帶引用地檢索。兩個插件可以單獨用,一起裝則”寫入 + 檢索”完整。
項目源碼自帶驗證腳本:
npm test # node --test test/core.test.mjs,16 項
node test/smoke.mjs
適用場景與注意¶
適合已經在用 DSH,且希望把記憶歸檔從”模型走沙箱”換成”插件直寫”的開發者:需要免審批地維護記憶文件,同時把可寫範圍嚴格限制在記憶目錄。
兩點需要明確。第一,插件運行在 DSH 主進程內,不受文件沙箱約束——這是 DSH 的設計,沙箱防的是模型而不是插件;本插件把該能力收窄爲只能寫 allowedRoots 內的 .md,越界(含 ..、junction、symlink 逃逸)一律拒絕,不寫憑據、不聯網、不 spawn 子進程。第二,安裝前應先檢查源碼與許可證(項目聲明 MIT)。
小結與鏈接¶
dsh-memory-archiver 的價值在於把一個原本無法用配置表達的訴求——“記憶歸檔免審批、其餘照舊”——實現成四個有邊界、有備份、無刪除能力的工具。目錄頁:https://www.skillhub.cn/plugins/imaused/dsh-memory-archiver ,源碼:https://github.com/imaused/dsh-memory-archiver 。