dsh-memory-center:DSH 本地长期记忆库

前言

DeepSeek Harness(DSH)的插件生态是「一切皆插件」。在构建长期记忆能力时,常见做法是把记忆写死在配置文件里,或者依赖外部服务,一旦出错就难以排查,也不容易在不同会话间复用。dsh-memory-center 为 DSH 提供一个本地长期记忆库:数据存在本机,你可以自己看、自己改,决定哪些记忆在每次会话时注入给模型。插件不联网,不调用外部 API,也没有 token 依赖,只依赖本地 JSON 存储。

是什么

dsh-memory-center 是 DSH 的「记忆中心」面板插件,由维护者 LornBerry 维护。它解决的问题是:为本地智能体提供一个可控、可编辑、可归档、可同步的长期记忆存储,并支持按会话选择注入哪些记忆。插件本身不依赖任何第三方库,所有功能通过 DSH 插件接口实现。

数据位置与安装

数据位置按以下顺序自动探测(可手动改):DSH_MEMORY_DIR 环境变量 → 面板里记住的选择 → 已有 store.json 的老目录 → 本机 DSH 数据根 <DSH_HOME>/memory → 各盘符 \dsh-data\memory → ~/.dsh/memory → 临时目录。面板「存储位置」里可以随时修改。代码位置在插件目录,通过 plugin_manager install_bundle 安装。

安装步骤如下:

  1. 克隆到本机任意目录:
git clone https://github.com/LornBerry/dsh-memory-center.git
  1. 打包成一份固定副本(自测 → 打 tgz):
node dev/release.mjs
  1. 用 DSH 插件管理安装这个 tgz:
plugin_manager action=install_bundle target=<tgz 绝对路径>

装完后 package.json 中会出现一条 file: 依赖,node_modules/dsh-memory-center 是一份真实目录副本。

  1. 自检:
node dev/doctor.mjs --url http://127.0.0.1:<当前端口>
  1. 刷新 Web GUI:侧栏出现「记忆」,设置里出现「记忆库」。

核心功能

会话自动归档(v0.3.0)

同一个会话里模型写到第 2 条记忆时,插件会自动创建一个与会话标题同名的文件夹,把这批候选记忆放进去。第 1 条留在「未归类」;第 2 条起自动连同前面的同会话条目一起归档。会话标题优先取宿主给的标题,没有则取本轮第一条用户消息(压空白、超 24 字截断加 …),与 GUI 侧栏标题同源。同名文件夹直接复用,手动拖过的条目不会被覆盖。

锚点:完全 / 仅权重(v0.4.0,v0.7.0 起自动初判)

每条记忆有一个「锚点」:不启用、完全锚点、仅权重。

  • 完全锚点:必须完全照此执行或表达,不得偏离,适合硬性规矩。
  • 仅权重:只作为输出倾向的权重,允许偏离,适合语气与偏好。
  • 新建时自动判断:插件会检查标题/正文/标签中的措辞。出现「必须 / 禁止 / 只写 / 切记 / 不要」等词语会被判为完全锚点;出现「喜欢 / 尽量 / 统一 / 约定 / 默认」等词语会被判为仅权重;都没有则不启用。安全类词(密码 / 凭据 / 隐私 / api key / secret / password,大小写不敏感)只要和「不要 / 禁止 / never」同现就一律判为完全锚点。描述性否定(如「不能超过 260 字符」)除非与「以后 / 每次 / 一律 / 都要 / 记住」等立规矩词同现,否则只算普通事实。
  • 手动设置后,以后改动内容不会被自动重判;插件判的那类,内容变了会自动重判。
  • 右键「更多… → 锚点」可手动三选一,或点「↻ 按内容重新判断」;批量选中后底部栏也有「重判锚点」。
  • 注入时条目行前会带 〔完全锚点〕 / 〔权重锚点〕 标记,顶部有一行规则说明;面板卡片上也有对应徽标。

检索(v0.6.0)

不再「包含这个字才算」,而是按 BM25 分数排序。插件会对中文二元组与拉丁词进行分词,标题命中权重更高,长文不会因为字数多就压过短标题。结果按分数排序,并给出命中的原文片段。内置常见口语组(如「存哪 / 放哪 / 路径 / 目录」「转正 / 确认 / 生效」「删了 / 回收站」)作为同义词扩展。你可以在「设置 → 记忆库 → 同义词…」里添加自己的说法:一行一组、词之间用空格或逗号隔开,存进 config.json 的 synonyms,保存后下一次搜索就生效(不用重启)。面板搜索框、memory_search 工具、写入前的重复检查都使用同一套检索,不会出现「搜不到但模型说有」的情况。

整理与安全(v0.5.0)

  • 回收站:删除只是软删除,条目从列表和注入里消失,但仍留在 store.json;左栏「回收站」里可以单条或批量恢复,也可以彻底删除或清空回收站。只有彻底删除才会写墓碑(跨设备同步时不会在另一台机器上复活)。回收站默认保留 30 天,过期的软删除条目在下次加载时自动彻底删除。回收站底栏可以直接改保留天数(不自动清理 / 7 / 30 / 90 / 180 天),写进 config.json 的 recycleDays,改完立即生效。也可以用 DSH_MEMORY_RECYCLE_DAYS 固定天数(0 = 永不自动清理,设了环境变量时面板里只读)。
  • 改小天数会立刻永久删除:前端先带 dryRun: true 问后端「按新天数会清掉几条」,有命中就弹确认框写明条数与标题,确认后才真正执行。后端在删除前会把整库复制成 <数据目录>/backups/pre-purge-<时间>.json。
  • 删除记录(墓碑)也会过期:彻底删除会留一条「这条删过」的记录,用于跨设备同步时阻止旧副本复活。这些记录默认保留 90 天,回收站底栏会显示条数,并提供两个按钮:「清理 90 天前」和「清空删除记录」(都要二次确认)。
  • 二次确认:批量删除、彻底删除、全部转正、清空回收站这类一次影响多条的动作,都会先弹窗写明「影响 N 条、能否撤销」,点错了按取消即可,不产生任何改动。
  • 底部操作条:勾选任意卡片后,屏幕底部浮出「已选 N 条 | 移动到… / 打标 / 停用 / 转正 / 加入本次会话 / 删除」。
  • 打标:批量添加标签时只往里加,不覆盖已有标签,也不会重复。
  • Markdown 预览:编辑弹窗里可在「编辑 / 预览」之间切换,列表、加粗、代码块直接看到渲染结果。
  • 排序:默认顺序 / 按首字母顺序(A→Z)/ 按修改时间顺序(新→旧)/ 按创建时间顺序(新→旧);置顶的条目恒在最前。
  • 视图:卡片视图适合读长文本,列表视图一屏能扫二十多条标题,顶部一键切换。
  • 空状态:空文件夹、没有待确认、回收站为空、搜不到结果,都会给出对应文案与下一步操作,不会是空白页。
  • 锚点颜色:〔完全锚点〕用橙红、〔权重锚点〕用蓝色。

加固(v0.2.1)

  • 库文件坏了不再让插件永久卡死:第一次请求报错并指出文件路径(文件不动),第二次把坏文件挪进 <数据目录>/backups/corrupt-<时间>.json 再重建空库;修好文件后无需重启就能读。
  • 切换数据目录落到一个已有记忆的目录时改为合并而不是覆盖,先把目标原文件备份成 <目标目录>/backups/pre-switch-<时间>.json。
  • 注入去重同时检查那条 recall 消息是否还在上下文里,被压缩裁掉后会重新注入。
  • 面板接口要求 application/json 且同源(或 Origin 缺省 / null),Sec-Fetch-Site 只认 same-origin/none,跨站页面既不能读也不能写。
  • 批量启停/移动/删除走一次 item.batch;导入条目顺序连续编号;超长注入按码点截断;Git 命令 30 秒超时、不弹交互式密码提示;会话记录按 180 天清理。
  • 自测新增 dev/resilience.test.mjs,dev/host-smoke.mjs 覆盖 415/403、无效 groupId、批量与切换合并。

备份(v0.7.7)

三类自动备份统一放在数据目录下的 backups/:

  • corrupt-<时间>.json:读 store.json 失败、自动重建空库之前,把坏文件挪过来(只挪不改)。
  • pre-switch-<时间>.json:切换数据目录、且目标目录已有记忆、准备合并之前。
  • pre-purge-<时间>.json:回收站按天自动清理、真要删条目前。

每种只留最近 5 份(按文件修改时间),超出自动删掉。老版本留在数据目录根上的 store.json.corrupt-* 会在下次加载时自动挪进 backups/。面板「存储位置」/回收站区域可看备份数量与占用体积,并提供「清理旧备份」。接口 backups.prune(可指定 keep)与 backups.clear 只删这三类文件,store.json / sessions.json / config.json 一个都不碰。

跨设备(可选,默认关闭)

记忆本体永远在本机的数据目录里,云端只是「多设备共用同一份」。

  • 不绑定(默认):只在一台机器用,或者接受手动导出导入。换设备看不到;一个字节都不外发。
  • Git 仓库:有 GitHub / Gitee / 自建 git 的人。需要建一个私有仓库、配一次凭据。换来完整历史、可回滚、冲突按条目合并。
  • WebDAV 网盘:坚果云 / Nextcloud / 群晖用户。没有历史版本,只有一个 store.json;撞车时后写的赢。

开启后:打开面板时自动拉取(可关),改动后 12 秒自动上传(可关,防抖:连续改只推最后一次;一直在改也会最多攒 60 秒必推一次)。冲突规则按条目合并——同一条记忆两边都改,updatedAt 新的赢;删除会记墓碑,不会在另一台设备上「复活」。输掉的那一版不会凭空消失:每次自动拉取把本地覆盖掉之前,都会把本机的 store.json 复制成 <数据目录>/backups/conflict-<时间>-git.json(Git)或 conflict-<时间>-webdav.json(WebDAV),只保留最近 5 份。同步状态里会显示「已保留本机改动 N 次」。大小:一条记忆几百字节,一万条也就几 MB;Git 侧只存增量,不会越存越满。Git 侧的实现细节:数据目录下会多出 .git-sync/repo(影子仓库),config.json 和 sessions.json 不入库(前者含本机凭据,后者只对本机会话有意义)。WebDAV 的账号密码存在本机 config.json 里(明文);.gitignore 已经把 config.json 排除在 Git 之外,但走 WebDAV 时它就在本机文件里。面板不会把密码原文回传到前端(只显示「已保存,留空则不修改」)。新装第一次打开时,「待确认」里会有一条「跨设备记忆需要开同步」的提醒,说明去哪绑、不绑也能用;它不参与注入,删掉也不会补回,绑定入口一直在面板工具栏和设置页里。

典型用法

  1. 打开面板:侧栏点击「记忆」,或从设置 → 记忆库 进入。
  2. 创建记忆:点击「新建」,输入标题与正文,可切换「编辑 / 预览」查看 Markdown 渲染效果。保存后卡片里也会按 Markdown 渲染。
  3. 设置锚点:右键记忆 → 更多… → 锚点,或悬停徽标查看「插件按内容初判」的理由。批量选中后底部栏有「重判锚点」。
  4. 整理记忆:拖拽卡片到文件夹即移动;勾选多选后从底部浮出操作条,可批量移动、打标、停用、转正、加入本会话、删除。
  5. 搜索记忆:在面板搜索框输入关键词,结果按 BM25 分数排序并高亮命中片段。支持同义词扩展,可在「同义词…」中添加自己的说法。
  6. 启用同步:从面板工具栏或设置页进入「云端同步」,选择 Git 仓库或 WebDAV 网盘,输入凭据后即可按规则自动拉取与上传。

适用场景与注意

  • 适合需要长期记忆、希望完全掌控记忆内容与注入策略的本地智能体项目。
  • 插件以当前 DSH 进程权限运行,安装前应检查源码与许可证。
  • 配置项 recycleDays 与 DSH_MEMORY_RECYCLE_DAYS 控制回收站保留天数;DSH_MEMORY_TOMBSTONE_DAYS 控制墓碑保留天数;config.json 中的 synonyms 用于自定义同义词扩展。
  • 回收站与墓碑清理有二次确认与备份保护,改小天数会立刻永久删除,请谨慎操作。

结尾

dsh-memory-center 为 DSH 提供了一个完全本地化、可编辑、可归档、可同步的长期记忆库,适合需要在多会话之间复用记忆、同时希望完全掌控记忆内容与注入策略的场景。更多细节与源码见:https://github.com/LornBerry/dsh-memory-center

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

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

Xiaoye