dsh-memory-file:用 Markdown 文件做可核实的长期记忆

前言

在 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 漂移的开发者。

注意:

  1. 插件以当前 DSH 进程权限运行,安装前应阅读 GitHub 源码 与 MIT 许可证,自行判断是否满足安全要求。
  2. 注入只在会话首次 pre-step 生效;中途手改记忆文件,本会话不会重新注入。
  3. memory_recall 是字面匹配,不是语义检索。
  4. 社区目录 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
羽毛球分组比赛记分
小程序二维码

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

小夜