dsh-memory-plugin
这是我为 DSH (DeepSeek Harness) 制作的一款插件,可以进行跨对话记忆支持手动导入
- Stars
- 0
- Language
- JavaScript
- Created
- Oct 6, 2026
- Updated
- Oct 6, 2026
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
| 字段 | 默认 | 说明 |
|---|---|---|
enabled | true | 总开关 |
storeFile | ~/.dsh/dsh-local-memory.json | 记忆文件路径 |
maxMemories | 5000 | 条数上限,超出丢最旧的(10–100000) |
autoRecall | true | 每轮自动回忆 |
autoRecallMaxItems | 5 | 最多注入几条(1–20) |
autoRecallMinChars | 8 | 输入短于此不触发(0–500) |
autoTagProject | true | 写入时自动打项目标签 |
organizeBeforeDelete | false | 会话菜单里是否出现「整理记忆…」入口 |
weights | 见下 | 检索评分权重 |
injectBrief | true | 是否把记忆库说明写进系统提示词 |
weights(检索权重) —— 关键词打分的各项分值,设置页有滑杆,也能直接改文件:
| 字段 | 默认 | 含义 |
|---|---|---|
textMatch | 2 | 正文命中一个查询词项的基准分 |
tagMatch | 1 | 只在标签里命中的基准分 |
wholeQuery | 5 | 整条查询原样出现在正文里的额外分 |
exactTag | 3 | 标签与整条查询完全相同时的额外分 |
longTermBonus | 1.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