前言¶
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 。