← Back to home@2132774831

dsh-memory-plugin

这是我为 DSH (DeepSeek Harness) 制作的一款插件,可以进行跨对话记忆支持手动导入

Stars
0
Language
JavaScript
Created
Oct 6, 2026
Updated
Oct 6, 2026
GitHub repo

Introduction

dsh-local-memory

DSH 的纯本地长期记忆 —— 跨对话、跨项目,数据只存在你本机的一个 JSON 文件里。

不联网、不调用任何大模型、不需要 API key、不用 Docker、不用起服务。装完就能用。


它解决什么问题

AI 每次开新对话都从零开始:不记得你的偏好,不记得上个会话定下的约定,也不记得上次踩过的坑。

这个插件给 DSH 配一个记忆本:

  • 对话里确认了值得长期保留的结论 → 写进记忆本;
  • 下次新对话,相关记忆会自动出现在上下文里(或模型主动检索);
  • 你可以在设置页里直接翻看、新增、编辑、删除这些记忆。

为什么是「纯本地」

市面上更"聪明"的记忆方案(比如 Hindsight)通常是一个独立服务 + 一个大模型: 它用大模型"理解"你的话、抽取要点,再把记忆存进数据库。

代价是:你得跑一个服务、配一把 API key,而且"理解"这一步要把内容发到大模型厂商的云上。

这个插件走了另一条路:不做语义理解,只做关键词匹配。

纯本地(本插件)服务型方案(如 Hindsight)
单独跑服务不用要
大模型 key不用要
联网不用要(抽取那一步)
数据在哪你本机一个 JSON 文件服务端数据库
检索方式关键词匹配(中文按二字组合)语义检索、图谱推理
装完即用是否

够用吗? 对"记住偏好 / 约定 / 决策 / 坑"这类需求,够用。中文按二字组合切词 (「鉴权设计」→ 鉴权 / 权设 / 设计),比单字精确得多,又不需要分词器。


记忆存在哪

~/.dsh/dsh-local-memory.json

一个纯文本 JSON,可以直接用编辑器打开、改、备份、同步:

{
  "version": 1,
  "memories": [
    {
      "id": "m-abc123-xy",
      "text": "鉴权用的是轮询而不是 webhook,因为要避免公网回调",
      "tags": ["topic:auth"],
      "project": "acme-payments-api",
      "createdAt": 1767225600000,
      "updatedAt": 1767225600000,
      "hits": 3
    }
  ]
}

插件配置在 ~/.dsh/dsh-local-memory-config.json。


四个工具

工具干什么
memory_save记住一条结论(文本重复时不新增,只合并标签并刷新时间)
memory_search按关键词检索(默认搜全部记忆,不论哪个对话、哪个项目写的)
memory_list列出最近的记忆
memory_forget删除一条记忆(按 id)

自动回忆

每次模型回答前,插件拿你这一轮的输入去记忆本里做一次关键词检索,命中的条目会作为 一条附加上下文注入。纯本地、微秒级,没有超时问题。

它不会硬塞无关记忆:查询为空、太短(默认 < 8 字)、或完全没命中时,就什么都不注入。


设置页

设置 → 本地记忆,分三块:

记忆(查看 / 新增 / 编辑 / 删除)

  • 关键词筛选框
  • 「+ 新增记忆」表单
  • 每条记忆显示正文、标签、项目、时间、被用过几次、id
  • 每条都能编辑、删除(删除有二次确认)

存储

  • 记忆文件路径、配置文件路径
  • 条数 / 标签数 / 项目数 / 文件大小
  • 已用过的标签与项目一览

设置

  • 启用本地记忆(总开关)
  • 每轮自动回忆 + 最多注入几条 + 输入短于此不触发
  • 写入时自动打项目标签
  • 删除对话前提醒整理记忆(控制会话菜单里是否出现「整理记忆…」)
  • 把记忆库说明写进系统提示词
  • 记忆条数上限
  • 存储文件路径

检索权重

  • 五项权重滑杆,改了立刻生效;「权重恢复默认」一键还原(见下面的配置项)

设置保存即时生效,不用重启。


记忆导入 / 导出(Markdown)

设置页的「记忆」区有两个按钮:

  • 导出 Markdown —— 把记忆导成 dsh-local-memory-<日期>.md 下载下来;
  • 导入 Markdown —— 选一个 .md 文件导进来。

格式是「人也能读、机器也能解析」的,本插件导出的长这样:

# 本地记忆库导出

- 导出时间:2026-10-06T12:00:00.000Z
- 条数:1
- 来源:dsh-local-memory@1.1.0

---

- 标签:topic:auth, pref
- 项目:acme-payments-api
- 创建:2026-10-05T20:12:33.368Z
- 更新:2026-10-05T20:12:33.368Z

鉴权用的是轮询而不是 webhook,因为要避免公网回调

导入是宽容的,所以能接住别的来源:

来源能否导入
本插件在另一台电脑上的导出✅ 原样往返
别的 Agent / 笔记工具导出的 Markdown(## 分节)✅ 每节当一条记忆
一堆 --- 分隔的纯文本✅
没有任何结构的一整篇✅ 整篇当一条

导入是幂等的:正文归一化后相同的视为同一条 —— 已存在就合并标签、补项目、刷新时间, 不会产生重复。所以同一个文件导两次不会翻倍。


删除对话前整理记忆

设置里打开「删除对话前提醒整理记忆」后,会话(对话)的「...」菜单里会多出一行 「整理记忆…」,点开是一个弹窗:把这段对话里值得长期保留的结论写下来、存进记忆库, 然后再去归档/删除这个对话,就不会把有价值的东西一起丢掉了。

一个诚实的限制:插件槽位是「追加」语义,拦不住系统原生的删除动作, 也没法自动读整段对话去总结(那需要调用大模型,而这个插件的卖点恰恰是不调模型)。 所以这里做成「会话菜单里的顺手入口 + 弹窗快记」,而不是自动拦截删除。 想让它更自动,只能引入大模型,那就不是纯本地插件了。


项目标签是怎么来的

写入记忆时,插件按会话工作目录认一下项目名,作为标签存下来(方便按项目筛选, 不影响默认检索范围——默认始终搜全部记忆):

  • 逐级向上找有可读 config 的 .git(worktree 的 .git 文件指针也认; 空 .git 目录不算);
  • 家目录是硬边界,绝不越过;
  • 有 remote 就用 owner/repo(跨 clone 稳定),否则用目录名。

配置项

~/.dsh/dsh-local-memory-config.json

字段默认说明
enabledtrue总开关
storeFile~/.dsh/dsh-local-memory.json记忆文件路径
maxMemories5000条数上限,超出丢最旧的(10–100000)
autoRecalltrue每轮自动回忆
autoRecallMaxItems5最多注入几条(1–20)
autoRecallMinChars8输入短于此不触发(0–500)
autoTagProjecttrue写入时自动打项目标签
organizeBeforeDeletefalse会话菜单里是否出现「整理记忆…」入口
weights见下检索评分权重
injectBrieftrue是否把记忆库说明写进系统提示词

weights(检索权重) —— 关键词打分的各项分值,设置页有滑杆,也能直接改文件:

字段默认含义
textMatch2正文命中一个查询词项的基准分
tagMatch1只在标签里命中的基准分
wholeQuery5整条查询原样出现在正文里的额外分
exactTag3标签与整条查询完全相同时的额外分
longTermBonus1.5长度 ≥3 的词项的权重倍率

调大某一项 = 这类命中更有分量。改完点「保存设置」立即生效。


安装

从 GitHub 直接装(推荐,不用手动下载):

dsh plugin --profile desktop add github:2132774831/dsh-memory-plugin

把 desktop 换成你自己的 profile 名(用 dsh plugin list 看)。

或者用本地路径装(已经克隆/解压到本地时):

dsh plugin --profile desktop add /绝对路径/dsh-local-memory

⚠️ 路径必须用绝对路径。用相对路径(如 ./dsh-local-memory)会被解析成相对 profile 目录,装出来是个指不到东西的死链接。

装完 重启 dsh web,设置页会出现「本地记忆」。更多细节见 INSTALL.md(含验证与排错)。


开发与测试

node test/smoke-store.mjs      # 存储与检索:切词、判重、CRUD、容错
node test/smoke-store.mjs      # 存储与检索:切词、判重、CRUD、权重、导入导出
node test/smoke-projects.mjs   # 项目识别:.git 查找、remote 归一化、边界
node test/smoke-host.mjs       # Host 半侧:工具、自动回忆、路由(含 /export /import)
node test/smoke-client.mjs     # 设置页 bundle 契约(三个槽位)

npm test                       # 全部(77 项断言)

测试全部离线:临时目录 + 假 ctx + 假 DOM,不碰真实记忆文件。


环境要求

项要求
Node>= 20
平台DSH web profile
运行时依赖零
外部服务无

卸载

dsh plugin --profile desktop remove dsh-local-memory

记忆文件不会被删 —— 想清掉就自己删 ~/.dsh/dsh-local-memory.json。


许可

MIT