dsh-memory-delta:跨会话长期记忆,自动注入且只推变化

前言

用 DSH 或同类 AI 编码助手开新会话时,背景、偏好和已经拍板的结论往往要重讲一遍;偶尔把要点写进一两个 Markdown,文件会越堆越长,每轮都要付上下文成本,过期结论又很难下线。

OpenSpec 一类 spec-driven 工具解决的是「代码偏离计划」,但它们是 pull:模型得被提醒去读 spec,新会话不会自动带上记忆。dsh-memory-delta 走 push 路线:会话开始时把该知道的蒸馏内容塞给模型,且尽量只推送相对上一轮的 增量;细节仍可按需检索。下面介绍它是什么、怎么装、怎么用。

这是什么

dsh-memory-delta 是 DeepSeek Harness(DSH) 插件,同时提供零依赖独立 CLI mem。维护者在 GitHub 上的仓库为 lpf20200901/dsh-memory-delta(Gitee 为只读镜像)。设计思路借用了 OpenSpec 的 spec / change / archive 纪律,方向相反:记忆 推入 会话,而不是等 agent 去 拉。

插件在 SkillHub 等社区目录中归类为「记忆」;DSH 生态是「一切皆插件」,社区站点与 DeepSeek / 幻方无官方从属关系。

存储分层与写入规则

记忆库(默认 <session cwd>/memory,可用配置或 $DSH_MEMORY_ROOT 覆盖)按 流程阶段 与 内容类型 组织:

目录 阶段 内容 谁可写 是否注入
inbox/ 候选 模型认为值得保留的结论 仅模型(memory_write) 否
facts/ 在用 踩坑与规避:环境限制、工具行为、真实失败与修复 仅人类 promote 是
decisions/ 在用 约定与选型及理由 仅人类 promote 是
archive/ 已归档 被取代或不再适用的条目 归档操作 否(可搜索、可恢复)

主流程:模型只写 inbox → 人类 promote 到 facts 或 decisions → 退役进 archive。拿不准放哪边时:若「明天世界变了就不成立」倾向 facts/;若只有你能推翻则倾向 decisions/。

mem init 会在记忆目录生成 README.md、memory.config.json、index.md、journal.md 等,并说明各层含义。条目为带 frontmatter 的 Markdown,状态含 active / superseded / expired;同一 scope+key 只允许一条 active,更新需显式 --supersedes,避免错误结论进入永久注入层。

核心能力

差分注入与字节预算

注入层有硬字节预算(可由 store 的 memory.config.json#injectBudget 决定,常见默认约 3072)。每条 standing 条目带 12 字符内容哈希;插件在 side-car 文件 <harness home>/storages/dsh-memory-delta/inject-state/<session-id>.json 记住上一轮状态,之后只推送新增、更新、删除;无变化时 不注入任何内容。README 中对比过:无 diff 的 instructions 类插件在多次小编辑后会重复注入整文件,浪费 token。

首轮注入全部 active 条目作为 baseline;后续轮次只推 delta。diff 状态放在 side-car,不塞进会话消息的 source,以符合 DSH session-format 白名单。

DSH 侧工具与界面

能力 说明
memory_search 对 facts / decisions / inbox / archive / journal 等做相关性排序检索;中文按 bigram 匹配;结果通过 tool 的 render 文本返回给模型
memory_write 仅写入 inbox,不能改 standing 层
蒸馏提醒 会话进行若干步且记忆已是最新时,提醒用 memory_write 记录结论;每会话一次,且不携带会污染 diff 的状态
到期复核 verify_when 到期时提醒人类复核,模型只能把新结论写 inbox
bundled skill 默认 skill: true 时注册 /dsh-memory-delta;可 skill: false 关闭
侧边栏「记忆」 需配合如 dsh-better-sidebar;提供分组、搜索、promote / 归档等(经 POST /dsh-memory-delta/action,可用 allowWrite: false 关闭写操作)

插件直接 import 与 CLI 共用的 store 模块,不在 DSH 内 spawn mem(沙箱对命名管道有限制)。

CLI mem

与插件共用同一套 store 与排序逻辑。典型命令如下(节选):

mem init --root ./memory --scope "workspace:/path/to/project"

mem new --type fact --id win-update-cache --key disk-cleanup \
        --conclusion "Cleaning the update cache reclaimed nothing measurable" \
        --reason "Directory emptied but free space did not move" --tags windows,disk

mem promote win-update-cache
mem promote win-update-cache-v2 --supersedes win-update-cache

mem recall <keywords> [--where all|facts|decisions|inbox|archive|journal|sessions|index]
mem validate [--fix]
mem inject [--json] [--budget 3072]
mem due [--within N] [--json]

全局安装 CLI:

npm i -g dsh-memory-delta

需要 Node.js >= 20。package 当前版本为 1.3.4,许可证 MIT。

安装与启用

README 强调两种常见误配会 静默失败:把包写进 package.json 的 dsh.profile.bundles(启动时会被市场 registry 覆盖);在 cordis.patch.yml 里写裸条目而不包在 - insert: 下。

从 npm / DSH 命令安装

插件已发布到 npm,DSH 可从 registry 安装:

cd ~/.dsh && dsh plugin --profile web add dsh-memory-delta

社区插件市场条目为 lpf20200901/dsh-memory-delta,从市场安装会使用包内自带的 bundle patch;该 patch 有意不设置 maxBytes,注入上限由 store 的 memory.config.json 决定。

本地开发 / 手动安装

DSH_HOME 在桌面版常见为 %APPDATA%\dsh-desktop\harness(Linux 等环境以实际 harness home 为准,解析链:config.stateDir → ctx.dshHomePath → $DSH_HOME → ~/.dsh)。

  1. 将包复制到 profile 的 node_modules,例如:
   <DSH_HOME>\profiles\web\node_modules\dsh-memory-delta\
       package.json
       bin\mem.mjs
       src\plugin.mjs  src\hook.mjs  src\planner.mjs
  1. 在 <DSH_HOME>\profiles\web\cordis.patch.yml 追加:
   - insert:
       - id: dsh-memory-delta
         name: dsh-memory-delta
         config:
           root: ''
           enabled: true
           dueWithin: 0
           panel: true
           allowWrite: true
           skill: true
  1. 保存后 patch 层会被 watch,热加载,无需重启。

卸载:删除上述 - insert: 块并删除 node_modules\dsh-memory-delta。

已知风险(2026-10-08 观测):通过市场安装或卸载 其他 插件时,profile 的 cordis.patch.yml 可能被重写,手写 - insert:(含注释)会丢失,表现为文件仍在 node_modules 但不再注入。安装后应确认文件中仍有 - id: dsh-memory-delta。

典型用法

  1. 在项目下执行 mem init,或依赖插件默认 root: ''(即会话工作目录下的 memory)。
  2. 会话中模型用 memory_write 把候选结论写入 inbox;人类确认后 mem promote 或侧边栏提升进 facts / decisions。
  3. 需要更新同一语义 key 时,用 --supersedes 显式取代旧条目,旧内容进 archive。
  4. 调试注入 payload 时用 mem inject [--json];检查 store 健康用 mem validate [--fix]。

适用场景与注意

适合:长期维护同一仓库或工作区、希望新会话自动带上精简且不过期的约定与踩坑记录,又愿意用 promote / supersede 做人工把关的开发者。

注意:

  • 插件以 当前 DSH 进程权限 读写记忆目录与 side-car;安装前应阅读 源码与许可证,确认路径与写权限符合预期。
  • 错误结论若被 promote 到 standing 层,会在每轮注入中持续存在;务必坚持「模型只写 inbox」。
  • 依赖 @deepseek-ai/cordis 等 peer 包,需与所用 DSH 内核版本兼容;README 记录了 session-format v4 等对注入消息 source.kind 的要求。
  • 侧边栏记忆 Tab、skill 注册为可选能力;无 Web 侧栏时仍可差分注入与 CLI 并用。

链接

经过上面的步骤,你可以在 DSH 里把跨会话记忆做成可审查、可 diff、可归档的 Markdown store,并在会话开始时只支付增量上下文成本。

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

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

小夜