前言¶
DeepSeek Harness(DSH)的会话是隔离的。打开一个新窗口,之前的对话就从智能体视野里消失,只剩下 DSH 自身的压缩会话文件,格式是给 DSH 自己读的,不是给人看的。长时间对话会被压缩,细节会慢慢从上下文中淡出。上周告诉智能体的事情,今天它没有可靠的方式记起来。
dsh-memory-keeper 在这个缺口上做了补全。它读取 DSH 的会话文件(只读),把每次对话转成纯文本的 Markdown,给每条消息打上来源标记,维护一个长期使用的 MEMORY.md,并在新窗口启动时生成一个精简的“唤醒摘要”。
是什么¶
dsh-memory-keeper 给智能体提供一份跨窗口的记忆。它是一个 DSH 插件,由维护者 WU079 提供,归类为“记忆”类插件。它的核心是把 DSH 的会话导出成可读的对话记录,并维护一个长期文件 MEMORY.md,让智能体在新窗口开始对话时能看到一个简短的摘要,而不是从零开始。
核心功能¶
插件做了四件主要的事:
- 会话对话导出:每次会话都会变成
<dataDir>/sessions/<workspace>/<date>_<id8>.md,只保留用户与助手文本。每条消息都携带sessionId#seq的来源标记。同时维护一个索引表sessions/INDEX.md和机器可读的sessions/index.json。子智能体的会话会被跳过,避免搜索结果里混入转发链路细节。 - 长期主文件:
MEMORY.md是一个由你与智能体共同维护的持久文件。 - 唤醒摘要:新窗口打开时,
mem_wake返回一个精简摘要,限制在wakeMaxChars字符以内。 - 可选维护:可以把过期的会话归档到
$DSH_HOME/sessions-archive,或把数据目录备份到 git 远程仓库。
安装与启用¶
从 npm 安装(发布后可用):
dsh plugin --profile <your-profile> add dsh-memory-keeper
从本地检出到安装:
dsh plugin --profile <your-profile> add link:F:\path\to\dsh-memory-keeper
插件声明了 dsh.bundle,需要在 dsh.profile.bundles 中列出该包。安装后重启或重新加载配置,mem_* 工具就会出现。
然后打开 Settings → Plugins → Cross-session memory,指定一个数据目录,或者留空使用默认路径 $DSH_HOME/memory/<workspace name>。
四个工具¶
mem_wake¶
无参数。返回“你不在时发生了什么”的摘要:数据目录、上次导出时间、读写模式、MEMORY.md 的前几条、最近三天的日记标题、最近的会话索引,所有内容被限制在 wakeMaxChars 字符以内。
mem_wake
mem_search¶
在数据目录中搜索,返回命中项的文件路径、行号和匹配文本。scope 可以是 all、memory、diary 或 sessions。
mem_search { "query": "语音克隆", "limit": 10, "scope": "all" }
mem_write¶
写入主文件或当天的日记。target 为 memory(默认)或 diary;mode 为 append(默认)或 replace-section(需要指定 section,即要替换的标题)。写入前会创建 .bak 副本,只修改目标部分或日记末尾,不会重写整个文件。返回写入前后的字节数和 sha256,便于校验。如果 writable 为 false,写入会被拒绝。note 是给插件日志的说明,不会写入主文件。withDate 控制单行条目是否带日期后缀,默认 true;day 指定日记日期,默认为今天。
mem_write { "content": "- 2026-10-24: 插件脚手架开工", "target": "memory", "mode": "append" }
mem_write { "content": "...", "target": "memory", "mode": "replace-section", "section": "事实台" }
mem_write { "content": "Finished the settings panel today.", "target": "diary" }
mem_status¶
无参数。返回当前状态:数据目录及来源、读写模式、主文件大小与修改时间、日记和会话数量、最近导出/归档/备份时间、生效的配置项。
mem_status
/mem 命令¶
| 命令 | 功能 |
|---|---|
/mem wake |
与 mem_wake 相同的摘要 |
/mem tidy |
增量导出,然后归档超过 keepDays 且不是工作区最新会话的旧会话(archive 关闭时只导出) |
/mem export |
立即导出会话(--force 会重新生成全部) |
/mem search <word> |
与 mem_search 相同的搜索 |
/mem status |
与 mem_status 相同的状态 |
配置项¶
设置面板位于 Settings → Plugins → Cross-session memory。配置文件为 $DSH_HOME/memory-keeper/config.json,也是 /api/memory-keeper/* 路由使用的文件。
| 配置项 | 默认值 | 说明 |
|---|---|---|
enabled |
true |
后台工作总开关 |
autoExport |
true |
定时器是否真正运行 |
dataDir |
"" |
数据目录;留空则使用 $DSH_HOME/memory/<workspace name> |
exportIntervalHours |
6 |
自动导出间隔(小时),限制在 1–168 |
archive |
false |
将过期会话移入 $DSH_HOME/sessions-archive |
keepDays |
14 |
归档阈值(天),限制在 1–3650 |
wakeMaxChars |
2000 |
mem_wake 摘要字符上限,限制在 200–20000 |
wakeEntries |
6 |
摘要中显示的 MEMORY.md 条目数,限制在 1–50 |
writable |
true |
是否允许 mem_write,false 为只读模式 |
userLabel |
用户 |
导出对话中用户的发言标签 |
assistantLabel |
助手 |
导出对话中助手的发言标签 |
githubRemote |
"" |
用于备份的 git 远程仓库,留空则禁用备份 |
githubPush |
false |
备份后是否推送 |
searchLimit |
20 |
mem_search 默认返回结果数,限制在 1–200 |
userLabel / assistantLabel 默认为中文 用户 / 助手,可根据需要修改。
HTTP 路由¶
面板使用以下 HTTP 路由(同源,登录机制与其他 DSH 面板一致):
| 方法 | 路径 | 用途 |
|---|---|---|
GET |
/api/memory-keeper/status |
状态视图(与 mem_status 返回内容相同) |
GET |
/api/memory-keeper/config |
当前配置 + 默认值 + 解析后的数据目录 |
POST |
/api/memory-keeper/config |
合并并保存配置补丁,返回新配置 |
POST |
/api/memory-keeper/export |
立即导出;请求体可携带 { "force": true, "limit": 10 } |
POST |
/api/memory-keeper/archive |
归档;请求体可携带 { "dryRun": true } 进行预览 |
GET |
/api/memory-keeper/search?q=word&limit=20 |
与 mem_search 相同 |
GET |
/api/memory-keeper/wake |
与 mem_wake 相同 |
适用场景与注意¶
适合需要在多次窗口之间保持上下文、希望将对话沉淀为可检索文本的开发者与研究者。它适合长期项目、需要回顾历史对话、希望给智能体提供稳定记忆的场景。
注意:插件以当前 DSH 进程的权限运行。安装前建议阅读源码与许可证,确认与你的使用方式兼容。
总结¶
dsh-memory-keeper 让 DSH 智能体拥有跨窗口的记忆:把每次会话变成可读的 Markdown 对话,维护一个长期 MEMORY.md,并在新窗口提供精简的唤醒摘要。它与 DSH 内置的 memory_* 工具分工不同,可以共存。
更多细节与源码见:
- 插件目录页:https://www.skillhub.cn/plugins/WU079/dsh-memory-keeper
- GitHub 仓库:https://github.com/WU079/dsh-memory-keeper