dsh-memory-vault:DSH 外置 SQLite 长期记忆(修复分支)

前言

在 DeepSeek Harness(DSH)里跑 agent,上下文窗口再长也会遇到同一类问题:换会话、重启进程、或开多个 subagent 并行时,之前约定过的偏好、项目背景、对话结论很难稳定带过去。把整段历史塞进 prompt 成本高,也不利于检索。社区里已有外置记忆库思路;dsh-memory-vault 把记忆落到本地 SQLite,并通过工具让模型在对话里增删改查。本文介绍的是维护者 xs1023 在 GitHub 上的 修复分支(xs1023/dsh-memory-vault),在保留与原项目数据格式兼容的前提下,修掉若干会损坏数据或让长期层失效的缺陷,并增加「项目维度」检索。插件在 SkillHub 目录 归类为「记忆」;目录为独立社区站点,与 DeepSeek / 幻方无官方从属关系。

这是什么

dsh-memory-vault 是 DSH 的外置记忆库插件:数据保存在 ~/.dsh/memory/memory.db(单库、跨会话与跨 agent 共享),宿主侧注册一组 memory_* 工具,由模型在需要时调用。本仓库声明为 hjj588/dsh-memory-vault 的修复分支,已有记忆数据无需迁移,直接替换安装即可;npm 上同名包由另一位维护者维护,与本仓库是独立实现。当前 package 版本为 0.3.0,许可 MIT,要求 Node ≥ 22.18(使用内置 node:sqlite,零额外 npm 运行时依赖)。

修复分支相对原版改了什么

下面四个问题在 README 中有对应回归测试(共 21 个用例,npm test 全部通过),属于选本分支时的主要理由:

问题 实际症状 修复要点
对话记录 upsert 未按分类隔离 同会话对话行重复堆积;分层压缩写下的中期/长期行被改写成「对话记录」 findEntryBySessionId 增加 category 条件
标题取自未过滤的消息流 标题被 runtime context、预设记忆等宿主注入内容污染 用户侧消息改为真人来源白名单,注入不进正文与标题
分层压缩后两级阈值不可达 中期与短期上限同为 20,长期层几乎 never 触发 中期/长期上限与压缩条数下调(见下文默认值)
预设记忆注入无幂等 重启或恢复会话时重复注入相同预设 进程内标记 + 历史探测,同会话只注入一次

核心功能

记忆操作与对话归档

  • 新增、查看、修改、删除、搜索记忆;归档与恢复;分类、标签与统计。
  • 每次完整对话可自动保存为一条「对话记录」(仅用户与助手文本,不含工具细节),并支持专门搜索历史对话(memory_search_history、memory_list_conversations 等)。

分层记忆

短期保留最近原始消息,满额后折叠为中期摘要,再折叠为长期摘要;另有绑定当前会话的「永久」层,重要内容可提升为永久,长期层满时会先吸收重要内容再丢弃最旧条目。默认阈值(彼此关联,不宜随意把中期限额调到接近短期,否则长期层 again 不可达):

  • 短期:最近 20 条,每次折叠最早 10 条。
  • 中期:最多 4 条摘要,每次折叠 3 条。
  • 长期:最多 4 条摘要。

全局「预设 / 用户记忆」单独保存,对话开始时自动带上(同一会话只注入一次)。

项目维度(本分支新增)

写入时根据会话创建时的工作区路径(session.header.cwd)归一化后写入 entries.workspace_id。默认检索为「当前项目 + 全局」(workspace_id IS NULL 的条目为全局,含升级前全部存量)。三态 scope:

  • current(默认):当前项目 + 全局。
  • global:仅全局。
  • all:所有项目。

拿不到 cwd 时退化为全库检索;无法识别的 scope 按 current 处理。memory_add 写入时可指定 scope 为 current 或 global;列表与搜索类工具支持 current / global / all。memory_show 与列表输出会显示项目归属。

安装与启用

插件以当前 dsh 进程权限运行,安装前建议阅读仓库源码与 LICENSE。

从 GitHub 安装(推荐)

将 web 换成你实际使用的 profile(例如 web-desktop):

dsh plugin --profile web add github:xs1023/dsh-memory-vault

装完后重启 dsh 生效。可在「设置 → 插件 → 管理」中确认 dsh-memory-vault 已加载。

从本地源码安装

dsh plugin --profile web add /本仓库的绝对路径/dsh-memory-vault

开发时 link 到源码目录,改代码后重启即生效;若从 GitHub 安装,需重新执行 add 再重启才会拉到新副本。

典型用法

插件注入的工具包括:memory_add、memory_list、memory_search、memory_show、memory_update、memory_archive、memory_restore、memory_delete、memory_categories、memory_stats、memory_rename_category、memory_search_history、memory_list_conversations、memory_list_permanent、memory_promote_permanent、memory_add_preset、memory_list_preset、memory_promote_preset。

日常只需用自然语言驱动,例如「记住……」「查一下记忆……」「之前说过什么……」,由模型选择合适的 memory_* 调用。

调整分层数字

在 profile 的 cordis.patch.yml 里为 memory-vault 增加 config,例如:

- insert:
    - id: memory-vault
      name: 'dsh-memory-vault'
      config:
        shortTermLimit: 20
        shortTermCompressCount: 10
        mediumTermLimit: 4
        mediumTermCompressCount: 3
        longTermLimit: 4

只想少压缩、多留原文时,可只覆盖部分字段,例如 { mediumTermLimit: 8 }。

数据、备份与升级

  • 库文件:~/.dsh/memory/memory.db。
  • 插件不做自动备份;升级或手工清理前建议复制该文件。
  • 旧库首次打开会自动补 workspace_id 列,存量行保持 NULL(全局),默认检索仍可见,无需手工迁移。
  • 删除条目依赖 PRAGMA foreign_keys = ON;不要用外部工具直接改库,以免留下孤儿标签关联。

本地开发验证:npm test(在临时目录建库,不会改动生产库)。覆盖测试路径可用环境变量 DSH_MEMORY_DB、DSH_MEMORY_DIR 或插件 config.dataDir 指向副本。

适用场景与注意

适合:需要跨会话保留偏好与结论、按项目隔离记忆、并希望分层压缩控制上下文体积的 DSH 用户;多 agent 或 subagent 在同一工作区协作时,默认 scope=current 可减少项目间串记忆。

注意:记忆内容落在本机 SQLite,敏感信息需自行评估;插件能力与数据格式以本修复分支 README 为准;从原版或 npm 包切换时,确认你使用的是 xs1023 修复分支的安装源,以避免与「两个独立实现」混淆。

链接

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

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

Xiaoye