前言¶
在 DeepSeek Harness(DSH)里跑 agent,常见需求是跨会话记住偏好、项目约定和稳定事实。把内容写进系统提示或每次手工粘贴,难维护;把「记什么」交给黑盒插件,又很难确认它是否读了对话、是否联网、写错能否撤回。下面介绍社区插件 dsh-memory-file(维护者 wojiao42),分类为「记忆」:用本机 Markdown 文件承载长期记忆,每个会话首次 step 前注入内容,并提供读写与撤销工具;默认不读对话、不联网,可选地只读本地会话日志里你自己的发言,供 agent 归档。
这是什么¶
dsh-memory-file 是 DSH 的 host 侧插件(当前版本 1.2.2,MIT 许可证)。定位是「文件型长期记忆」:记忆落在 $DSH_HOME/memory/MEMORY.md(全局)或 <工作区>/.dsh/memory/MEMORY.md(工作区,默认写入目标),格式就是普通 Markdown,无私有语法,可随时手改。
插件不做模型调用、不总结、不推断「什么值得记」;它负责注入已有记忆、写前整份备份、待审队列、撤销,以及(可选)从 $DSH_HOME/sessions/ 增量读出你本人发言片段。README 强调可核实性:单文件 index.js、无构建、无第三方网络依赖,仓库内 smoke.mjs 对「不读 messages、默认不扫日志、敏感 IO 须登记」等主张做静态与行为断言。
核心功能¶
会话注入¶
每个会话的第一次 agent/pre-step,插件读取记忆文件并注入(同一会话只注入一次)。超出配置 maxBytes(默认 16384 字节)会截断;注入块可配 header 引导语。待审队列有未处理条目时,注入末尾会附待审提醒(v1.2.1)。
Agent 工具¶
| 工具 | 作用 |
|---|---|
memory_add |
写入一条事实;可带 source、date;pending: true 只进待审队列。写前整份备份。 |
memory_recall |
记忆文件内纯文本关键词搜索(多词为「与」)。 |
memory_list |
列出记忆路径、大小、修改时间、备份份数、待审条数。 |
memory_undo |
撤回最近一次写入,恢复写入前整份内容;list: true 只列备份。 |
memory_pending |
待审队列:list / accept / drop(丢弃只改标记,不删文件)。 |
memory_scan |
新对话待合并:status / preview / scan / ack。 |
memory_status |
报告当前 DSH_HOME、会话数、是否存在其它 home、两个记忆文件是否就位(用于发现安装目录变更后「历史会话列表消失」类问题)。 |
设计约束(README 可对照源码)¶
- 默认不读 Harness 传入的
messages;唯一订阅为agent/pre-step,回调不解构messages。 - 默认不读会话日志:
autoScan默认为false;开启后也只读$DSH_HOME/sessions/**下日志,提取带source.clientTimeZone的 user 发言,不写会话文件。 - 不联网:无
fetch/http等;依赖仅为 Node 内置模块与@deepseek-ai/dsh-llm、@deepseek-ai/dsh-tools。 - 不执行命令;不删、不改名会话日志;路径由插件内部推导,不接受外部传入路径。
- v1.1.0 起:
readdirSync/copyFileSync/ 读会话等敏感操作须在调用处[audit:...]登记,smoke.mjs核对登记数与调用数。
autoScan(可选,默认关闭)¶
配置 autoScan: true 后,每个会话首次 pre-step 会增量扫描会话日志(大小变过的文件才解码),把未合并的发言(默认最多 30 条、≤4000 字符)附在注入之后,提示 agent 用 memory_add 或 memory_add(pending: true) 处理,完成后 memory_scan(action: 'ack') 推进游标。单文件 >8MB 跳过,单轮读取总量 >32MB 收工;失败时整段包在 try/catch,不影响正常注入。
安装与启用¶
DSH 桌面端的 profile 由应用托管,不要用 dsh plugin --profile desktop add ...(会被拒绝)。官方通道是 GUI 插件市场:
设置(Ctrl+,)→ 插件市场 → 自定义安装 → 填 github:wojiao42/dsh-memory-file
本地开发时可填本机绝对路径安装。安装源支持 npm / github / 本地路径;插件无客户端 UI,无需 dsh.client 声明。
在 profile 中启用并配置(字段以 README 为准):
- id: memory-file
name: 'dsh-memory-file'
config:
maxBytes: 16384
dshHome: null
header: '以下是用户长期记忆文件的内容。'
autoScan: false
autoScanMaxTurns: 30
autoScanMaxChars: 4000
典型用法¶
1、记忆文件示例(工作区或全局目录下的 MEMORY.md):
# 记忆
- [2026-10-02] 喜欢简洁的回答,不要导语(来源:用户原话)
- 每周三晚上有固定安排
2、让对话里的 agent 顺手记(零额外进程):在工作区约定文件(如 AGENTS.md)中写明:发现持久事实时,有把握则 memory_add(带 source),拿不准则 memory_add(pending: true),不必反复问用户「要不要记住」。
3、与 autoScan 搭配:autoScan: true 时,新会话开头会把近期你自己的发言片段交给 agent;与上一条约定一起用,是 README 推荐的「全自动素材 + 有完整上下文下的判断」组合。不想读会话日志则保持 autoScan: false,必要时可手动 memory_scan(action: 'scan')。
4、核对与回滚:用 memory_list 看路径与待审条数;写错用 memory_undo;待审用 memory_pending 的 list / accept / drop。Harness 换安装目录后若会话列表异常,可让 agent 调 memory_status 查 DSH_HOME 与会话数。
仓库内可本地跑核实脚本(不联网):
node smoke.mjs
node tools/publish-test.mjs
适用场景与注意¶
适合:希望长期记忆落在明文 Markdown、要能备份与撤销;希望默认不读对话、不联网,读会话日志需显式打开 autoScan;需要在 agent 侧做关键词回忆或排查 DSH_HOME 漂移的开发者。
注意:
- 插件以当前 DSH 进程权限运行,安装前应阅读 GitHub 源码 与 MIT 许可证,自行判断是否满足安全要求。
- 注入只在会话首次 pre-step 生效;中途手改记忆文件,本会话不会重新注入。
memory_recall是字面匹配,不是语义检索。- 社区目录 SkillHub 插件页 与 GitHub 为独立信息源,与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」,本文事实以仓库 README 与
package.json为准。
结尾¶
dsh-memory-file 把长期记忆做成单文件、可手改、写前有备份、写错可撤的 Markdown,并把「读不读会话日志」交给 autoScan 开关;判断记什么仍由对话中的 agent 或你自己的脚本完成,插件只提供素材与护栏。进一步了解可访问目录页与仓库:
- 目录页:https://www.skillhub.cn/plugins/wojiao42/dsh-memory-file
- GitHub:https://github.com/wojiao42/dsh-memory-file