dsh-memory-keeper:跨窗口记忆插件

前言

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

在数据目录中搜索,返回命中项的文件路径、行号和匹配文本。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

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

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

小夜