READMESource: main@762be727
dsh-memory
给本机所有 DeepSeek Harness 对话共用的一个持久记忆池。相关话题被提及时自动召回,侧边栏底部提供可视化面板;记忆的存储与召回都在本地完成。



特点
- 一个本机共享池:所有会话、所有工作区共用
$DSH_HOME/storages/dsh-memory/memories.json。 - 零 token 自动压缩摘要:用户真正输入的 prompt 和助手最终回复只在本地抽取式压缩后入库(单条 ≤240 字),不保存完整对话,也不调用模型;插件注入的 runtime context、技能目录、时间快照、工具调用中间步骤不会被误存。
- 密钥/隐私过滤:入库前自动遮蔽私钥、API key、GitHub token、JWT、Bearer、密码等敏感片段,并把代码块、长链接替换为占位符。
- 加密落盘:记忆池用 AES-256-GCM 加密后写入
memories.json,密钥保存在同目录key.bin(32 字节,仅当前用户可读);旧版明文数据在首次加载时自动迁移为密文。 - 克制的自动召回:用本地 BM25 风格关键词匹配,只有相关度足够高时才注入;最多 2 条、总长不超过 760 字符,只在该轮第一步出现一次,且同一会话不会重复注入同一条记忆。
- 质量反馈与自动整理:列表里每条记忆都可以点 👍 / 👎。反馈会调整重要度和召回排序;连续 3 次“没用”且没有“有用”反馈的记忆会停止自动召回,再点一次 👍 即可恢复。新记忆入库时会自动合并高度相似的近重复项(同类型、同分类、Jaccard ≥ 0.78),减少重复记录。
- 模型可主动维护:
memory工具支持search/save/forget/feedback,适合保存稳定的偏好、环境事实和长期项目约定。 - 自动分类:每条记忆按标签和本地关键词自动归入
偏好 / 项目 / 环境 / 事实 / 计划 / 人物 / 对话七类,不调用模型,也不额外消耗 token;列表和图谱都可按分类筛选。 - 侧边栏可视化:侧边栏底部「记忆」按钮打开面板,含列表、图谱两个页签。图谱以分类为星团中心、标签为外圈枢纽,展示记忆之间的关系;支持滚轮缩放、节点悬停、分类筛选和记忆详情。记录是默认行为,面板里没有“添加”按钮。
- 纯本地:不使用嵌入 API,不联网,不上传任何内容。
安装
把仓库克隆到本机后,在仓库根目录运行:
git clone https://github.com/Alive-Kenan/dsh-memory.git
cd dsh-memory
node scripts/install.mjs desktop
安装脚本会把插件复制为 <DSH_HOME>/profiles/desktop/node_modules/dsh-memory 真实目录,并把 dsh-memory 追加到该 profile 的 dsh.profile.bundles;完成后重启 DeepSeek Harness 即可。
注意:不要用
link:或目录联接安装。DSH 的 ESM 拦截只对 profile 内的真实路径生效,符号链接会导致启动时报ERR_MODULE_NOT_FOUND: @deepseek-ai/dsh-llm。
使用
- 侧边栏底部点击「记忆」打开面板。
- 顶部分类胶囊按
偏好 / 项目 / 环境 / 事实 / 计划 / 人物 / 对话筛选;搜索框同时匹配正文、标签和分类名。 - 「列表」查看、搜索、删除记忆;每行右侧的 👍 / 👎 用来反馈召回质量,顶部会显示召回次数、有用率、合并重复数和抑制数。「图谱」以分类星团和标签枢纽展示关联。点击分类节点/图例筛选,点击记忆节点查看详情,滚轮或右上角
+ / − / ⟲缩放。对话内容默认自动进入池子,不需要手动添加。 - 也可以直接对模型说“记住……”;模型会调用
memory工具保存。 - 删除单条记忆:面板中点击该条右侧的
×;清空全部:面板右下角「清空」。
数据结构
memories.json 是加密信封,不再包含可读对话:
{
"format": "dsh-memory",
"version": 2,
"encrypted": true,
"alg": "aes-256-gcm",
"iv": "base64…",
"tag": "base64…",
"data": "base64…",
"updatedAt": "2026-11-04T..."
}
解密后的 payload:
{
"version": 2,
"memories": [
{
"id": "a0d80e9b",
"text": "用户:我更喜欢深色主题,界面要简洁克制。",
"tags": ["偏好", "界面"],
"kind": "dialogue",
"category": "preference",
"importance": 0.4,
"compressed": true,
"originalLength": 320,
"hash": "…",
"createdAt": "…",
"updatedAt": "…",
"source": { "sessionId": "…", "cwd": "…" },
"hits": 1,
"lastHitAt": "…",
"feedbackUseful": 1,
"feedbackUseless": 0,
"lastFeedbackAt": "…",
"mergedCount": 2
}
]
}
kind: "note"是模型保存的长期记忆;kind: "dialogue"是本地自动压缩后的对话摘要。compressed/originalLength记录是否压缩以及压缩前长度。category是本地规则算出的分类;旧数据在加载时自动补分类。hits是自动召回次数;feedbackUseful/feedbackUseless是质量反馈计数;mergedCount是入库时被合并的近重复条数。- 上限 2500 条,超出时按重要度、时效、类型和反馈质量淘汰;排序也会使用反馈比例和 120 天半衰的时效权重。
- 密钥:
$DSH_HOME/storages/dsh-memory/key.bin。如需备份或迁移,必须同时保留memories.json和key.bin;丢失密钥后旧记忆无法恢复。
开发
node --check lib/index.js
node --check lib/client.js
node scripts/install.mjs desktop
Host 半在 lib/index.js,客户端半在 lib/client.js(手写的 __ModuleLoader__ bundle,无需打包)。接口为同源 POST /dsh-memory/api/{list|add|feedback|delete|clear}。
已知边界
- 自动召回按关键词匹配,不做语义向量检索;同义改写可能召回不到。
- 自动记录保存压缩后的用户输入和助手最终回复摘要,跳过带工具调用的中间步骤;助手回复在产生时就会入库。
- 加密用于静态落盘保护;
key.bin与密文同目录,能读取当前用户文件的人仍可解密。不要把key.bin上传到仓库或云端。 - 摘要为本地抽取式,不保证覆盖全部细节;需要长期精确保留的内容请用
memory工具保存。 - 质量反馈是本地启发式:连续 3 次“没用”会抑制自动召回,但不是永久删除;仍可在列表中查看、点 👍 恢复或手动删除。近重复合并只处理同类型、同分类且相似度很高的记录,不会合并语义相近但表述不同的记忆。
No comments yet. Be the first to write one.