🧠 memory-eternal — 给 AI 装「第二大脑」
对话结束自动沉淀,跨会话不失忆;召回只取相关小块,省 token 少噪音。 全自研、零第三方记忆框架、不改 DSH 源码、一个记忆库所有 Agent 共享,SQLite 持久存储,零外部依赖。
⭐ 觉得好用就点个 Star!
DSH 一条命令:dsh plugin --profile web add memory-eternal
🚀 五分钟上手
🟦 DeepSeek Harness(DSH)—— 重点
装(官方桌面版走插件市场,dsh web 用一条 CLI):
# ① 官方 DeepSeek Harness 桌面版(推荐):设置 → 插件 → 搜 memory-eternal 安装
# 等价 CLI(该壳的 profile 名就是 desktop):
dsh plugin --profile desktop add memory-eternal
# ② dsh web(浏览器端):
dsh plugin --profile web add memory-eternal
# 或在 profile(pnpm workspace)里直接更新。注意用 pnpm,npm install 会报 EUNSUPPORTEDPROTOCOL
cd ~/.dsh/profiles/web && pnpm add memory-eternal@latest
# 刚发新版时 @latest 可能被 pnpm 的最小发布年龄门槛/元数据缓存挡住(静默停在旧版):
# 直接指定版本号最快,pnpm 会自动把它加进 workspace 的 minimumReleaseAgeExclude
cd ~/.dsh/profiles/web && pnpm add memory-eternal@0.9.6
# 验版本(应等于上面装的号),然后重启对应宿主生效
node -e "console.log(require('memory-eternal/package.json').version)"
🖥️ 桌面版支持策略(先看这条)
- 优先、且只保证支持官方 DeepSeek Harness 桌面版(官方 Electron 发行版,profile 名
desktop)。v0.9.4 → v0.9.6 三轮修复全部围绕它:0.1.7 设置服务换血、schemastery 3.18.4的 volatile 活引用、以及窗口标题栏避让(data-windows-titlebar,避免全屏浮层压住最小化/最大化/关闭)。 - 作者自研的
dsh-desktop(dsh-desktop-shell/dsh-ui-*/dsh-plugin-marketplace那一套)已停止维护,不再作为支持目标 —— 官方桌面版已覆盖同样能力,继续维护两条壳只会分裂兼容性。注意它的 profile 依赖里还钉着已从 npm 撤下的dsh-desktop-shell@0.3.0,会让pnpm install直接失败;建议迁到官方桌面版,并从 profile 里删掉这套依赖。 - 兼容矩阵(均已实测):官方桌面版
desktopprofile(schemastery 3.18.4)+dsh web的webprofile(schemastery 3.18.1),两条路径共用同一份代码。
重启宿主后,三样东西立即生效:
| 效果 | 在哪看 |
|---|---|
| 自动沉淀知识卡 | 每轮对话结束自动发生,无需操作 |
memory_recall 工具 |
Agent 需要历史时自动调用 |
| 图形化界面 | 侧边栏底部「记忆」按钮 / 设置 → 记忆 |
入口:侧边栏底部「记忆」按钮 → 记忆库(左栏含 知识卡 / 知识图谱 / 用量 / 审核中心 / 回收中心 / 记忆配置);「DSH 设置 → 记忆」= 纯配置页。
界面语言:全套 UI 中英双语,跟随 DSH 设置 → 语言 实时切换(含知识卡 / 知识图谱 / 审核中心 / 新建卡模板);浏览器直接访问 web 时跟随浏览器语言。
改配置:记忆库左栏「记忆配置」(或 DSH 设置 → 记忆)→ DSH 记忆配置 / 成本控制 / 自动审核配置 / 服务自管理,点「保存配置」即写入。autoWebMode/watchdogAutoSpawn 的改动需重启 DSH 生效。
🟨 Claude Code
npm i -g memory-eternal # 装 CLI + MCP(写 ~/.claude.json mcpServers.memory)
dsh-memory connect claude # 写 ~/.claude/settings.json 的 SessionEnd hook → 会话结束自动沉淀
装完即用:会话里说「recall 一下数据库选型」→ 自动检索记忆;会话结束 → 自动沉淀进统一 ~/.dsh/memory-vault(新卡 pending 待审核)。
🟧 Codex CLI / Cursor
npm i -g memory-eternal # 装完自动写 Codex config.toml / Cursor mcp.json 的 mcpServers.memory
dsh-memory connect codex # 写用户级 ~/.codex/hooks.json 的 Stop hook → 会话结束自动沉淀(含 Codex Desktop)
dsh-memory connect cursor # 写 ~/.cursor/hooks.json 的 stop/sessionEnd hook → 自动沉淀
重启工具 → MCP 已在列表,会话里直接:用 memory_recall 查一下项目历史决策;会话结束自动沉淀进统一 ~/.dsh/memory-vault(新卡 pending 待审核)。
三种 agent 同一套库:全部写入
~/.dsh/memory-vault,每卡submittedBy区分作者(DeepSeek Harness / claude-code / codex / cursor),主库只显已审核、审核中心管新卡。
原生插件(可选,平台 Marketplace):仓库含
.claude-plugin/.codex-plugin/.cursor-plugin清单,可claude /plugin marketplace add EternalNight996/memory-eternal+/plugin install、codex plugin marketplace add EternalNight996/memory-eternal+codex plugin add、Cursor Settings→Plugins。connect走用户级 hooks.json(更稳,不依赖 Marketplace 审核;Codex Desktop 也走这条)。
只保留本插件(卸载其它记忆插件,如 agentmemory):
dsh-memory只写自己的键(mcpServers.memory/ 含capture.mjs的 hooks),不依赖、也不冲突任何其它记忆插件。卸载其它插件需在其自身配置层删除对应条目(如 Codex 的[marketplaces.*]与hooks.state.*、其hooks.json事件、~/.agentmemory数据目录)。
🟩 浏览器(不依赖任何 Agent)
dsh-memory open # 起 web + 开浏览器(默认 http://127.0.0.1:7999)
统计 / 搜索 / 知识卡(增删改合并导入导出)/ 知识图谱,全在此。与 DSH 内嵌页同一份 UI,数据同步。
zcode(智谱):暂无原生 MCP,经社区 zcode-open-bridge 转 MCP 或用 CLI。
📖 命令速查
dsh-memory recall "数据库选型" # 检索
dsh-memory capture "重要结论..." # 手动沉淀(- 读 stdin)
dsh-memory sweep ~/.claude/projects # 挖掘已有会话记录
dsh-memory setup [--dry-run] # 重跑/预览自动挂载(幂等)
dsh-memory connect <claude|codex|cursor> # 写会话结束自动沉淀 hook(用户级 hooks.json,含 Codex Desktop)
dsh-memory mcp # MCP stdio(挂任意 MCP 客户端)
dsh-memory serve [--port 7999] # 前台跑 web
dsh-memory open # ensure web 存活 + 开浏览器
dsh-memory watchdog [--port 7799] # 看门狗保活 web(独立进程)
单独装(不发 DSH)时 dsh-memory 命令来自 npm i -g。
⚙️ 服务自管理(白话)
三个概念,别搞混:
- web server 怎么保活(
autoWebMode)→init=DSH 启动时拉一次(默认);interval=DSH 进程内定时探活自动拉起(0 额外内存);manual=全手动只从dsh-memory open起。 - 看门狗进程(
watchdogAutoSpawn,默认开)→ 一个独立 node 进程,DSH 退出了它也能拉起 web(约 +47 MB 内存)。只在要 7×24 保活时开。 - 自动挂载 MCP(
autoMcpSetup,默认关)→ 是否自动把 MCP 写进 Claude Code/Codex/Cursor 配置。关 = 不碰你本机配置文件,需要时手动dsh-memory setup。
改这些:记忆库左栏「记忆配置」(或 DSH 设置 → 记忆)→ 表格里改,点「保存配置」;autoWebMode/watchdogAutoSpawn 需重启 DSH 生效。
MCP 是协议不是常驻服务:agent 开会话才 spawn,用完即退,没有「开机自启」一说。
三种部署强度
| 场景 | 配置 | 内存 |
|---|---|---|
| 个人开发(默认) | autoWebMode=init + watchdogAutoSpawn=off |
web 47 MB |
| 常驻 7×24 | watchdogAutoSpawn=on |
web + watchdog 47+47 MB |
| 真正开机自启(无 DSH) | Windows 计划任务跑 dsh-memory watchdog --port 7799 --interval 5000 --max-restart 10 |
同上 |
⚙️ 记忆配置(大白话)
所有配置都在 记忆库左栏「记忆配置」(或 DSH 设置 → 记忆)里改,点「保存配置」生效。下图就是配置页全貌(含插件信息 / Agent MCP 挂载状态 / 自动审核配置):
一、最常用
| 配置项 | 默认 | 大白话说明 |
|---|---|---|
| 自动沉淀 | 开 | 每轮聊完自动把有用的内容存成知识卡 |
| 自动召回 | 开 | AI 需要历史时自动帮你查记忆 |
| 记忆库目录 | ~/.dsh/memory-vault |
记忆存哪,纯 Markdown 可 git 管理 |
多库(按项目隔离记忆)
配置里还有两个字段(写在 memory-eternal-config.json,或设置面板同步过来的共享配置):
{
"vaultProfiles": [{ "name": "work", "path": "D:/vaults/work" }],
"activeVault": "work"
}
解析顺序:MEMORY_VAULT_DIR 环境变量 → activeVault 命中 vaultProfiles[].name 的 path → vaultDir → 默认 ~/.dsh/memory-vault。
v0.9.8 起,CLI / MCP / hooks / 独立 web / sweep 与 DSH 宿主共用同一套顺序:以前只有宿主认 activeVault,切库后终端与 hooks 仍往默认库写,记忆会被劈成两份。
说明:配置页目前还没有
vaultProfiles/activeVault的可视化表单(要手工写配置文件),按 workspace 自动选库也还没做。
二、省钱包(重要)
| 配置项 | 默认 | 大白话说明 |
|---|---|---|
| 蒸馏知识卡 | 开 | 把对话压缩成精炼知识卡(要调 AI,花钱)。关掉 = 存原文,一分钱不花 |
| 语义去重喂 AI | 开 | 判断新内容是不是重复(要调 AI)。关掉 = 用简单去重,省一次 AI 调用 |
| 蒸馏输出上限 | 900 | 压缩一次最多写多少字,越大越准越费钱 |
| 召回相关性阈值 | 2 | 检索要「多像」才返回,越大越准但漏得越多(越省) |
| 捕获最小长度 | 200 | 对话太短不存,避免闲聊浪费 |
| 日配额 | 60 | 一天最多存几张,防 AI 烧钱 |
三、服务怎么跑
| 配置项 | 默认 | 大白话说明 |
|---|---|---|
保活模式 autoWebMode |
init | init=DSH 启动时开一次 web;interval=定时检查挂了自动重启;manual=全靠手动 |
看门狗 watchdogAutoSpawn |
开 | 后台一个独立进程保证 web 不死(+47 MB 内存)。个人用可关 |
自动挂载 MCP autoMcpSetup |
关 | 让 Claude Code / Codex / Cursor 也能用你的记忆库。开=自动配好它们;关=不碰你电脑配置,手动跑 dsh-memory setup |
💰 想省钱:把「蒸馏知识卡」关掉、调低「蒸馏输出上限」、调高「召回相关性阈值」。
🎯 一键推荐配置(按场景点一下)
配置页顶部有 🟢 A 轻量省心 / 💰 B 极致省钱 / ⭐ C 高质量 三个按钮,点一下自动填好对应值,再点保存即可:
| 方案 | 场景 | 保活 | 看门狗 | 蒸馏 | 蒸馏上限 | 召回阈值 | 内存 | LLM 成本 |
|---|---|---|---|---|---|---|---|---|
| 🟢 A 轻量省心 | 个人开发(默认) | init | 关 | 开 | 900 | 2 | ~47 MB | 正常 |
| 💰 B 极致省钱 | 预算敏感/多 Agent | init | 关 | 关 | 500 | 3 | ~47 MB | 近 0 |
| ⭐ C 高质量 | 长项目/团队 | interval | 开 | 开 | 1200 | 1 | ~94 MB | 高 |
🔔 自动沉淀日志 & 异常提示
自动沉淀是后台静默管线:一旦坏了,以前只能表现为「卡不再增加」,看不出原因。v0.9.0 起它会自己说话。
- 自动沉淀日志:设置 → 记忆 → 用量/今日,最近 100 条运行轨迹:
🚀 启动/👂 会话接入(用的事件接口 + 事件数)/✅ 新建卡/➕ 追加更新/⏭ 跳过(原因)/❌ 失败(原因)。 - 异常主动提示:出现失败即亮红——记忆库页面顶部红条,同时把「自动沉淀异常 + 原因」注入 Agent 上下文,Agent 会在回复第一句提醒你,不需要你自己去翻日志。
- 停滞兜底:有轮次开始、15 分钟收不到收尾事件(例如 DSH 改了事件名),10 分钟巡检直接报出来。
- 接口自适应:自动识别 DSH 会话事件接口(
ownEvents()→snapshotEvents()→events),DSH 升级换 API 不会再静默断掉。
🛡️ 审核中心 & 回收中心
新卡默认进审核中心(pending),由你确认后才入主库;驳回的进「已驳回」,可恢复或删除进回收站。命中免审条件(审核模式=全部免审 / 免审智能体 / 免审类型)的新卡直接入库;回收站软删卡 30 天内可恢复,超期自动永久删除。
v0.3.0 起:审核守卫下沉到数据库层。 所有写入路径(自动沉淀 / MCP / UI 新建 / 导入)强制经过
enforceAudit(),调用方无法绕过。setCardStatus()是唯一审核操作入口,每次变更写入audit_log审计日志(who/what/when/why),不可篡改。
v0.10.0 起:升级为「两套存储」——未审核内容物理隔离。
cards(主库 / 正常区)物理上只存 approved;quarantine(隔离区 / 异常区)存pending/rejected/deleted。 意义:召回、检索、知识图谱、去重池、导出这些读路径查主库即安全——不再依赖「每处 SQL 都记得写WHERE status='approved'」。 (v0.9 审计实测漏过三处:去重池会把新知识追加进待审卡、readCard可按 path 直读未审核正文、/card接口无状态校验。) 审核流转 = 跨表搬家:批准 → 搬进主库,驳回/软删 → 搬进隔离区;搬家在一个事务里完成,更新记录与审计日志跟着走。 升级说明:首次启动会自动把存量非 approved 卡搬进隔离区(不删除任何内容,都在同一个.db文件里)。 若回滚到旧版本,审核队列会显示为空(旧代码看不到隔离区表),升级回来即恢复。
- 待审核 / 已驳回 双页签,按类型 / 日期 / 智能体筛选,全选后一键「批准 / 驳回 / 删除进回收站」。
- 审核规则在「记忆配置 → 自动审核配置」:
审核模式(全部要审 / 全部免审)+免审智能体+免审类型+回收保留天数。 - Agent 不能代你审批(v0.9.1 起):只要审核生效,插件就往 Agent 的上下文里注入红线——新卡只能停在「待审核」,并明确禁止调用
approve/reject接口或任何等价方式绕过;判断权始终在你手里。
🥇 为什么审核系统更靠谱(对比其它记忆产品)
多数记忆产品(mem0 / Zep / agentmemory…)对话一结束就自动全量入库,好坏不论——噪音、错误事实、敏感内容一起进库,之后又被召回,污染上下文、放大幻觉。
memory-eternal 走人机协同审核,只让可信内容进主库:
| 维度 | 其它记忆产品 | memory-eternal 审核系统 |
|---|---|---|
| 入库 | 自动全量,无把关 | 新卡先进审核中心(pending),人工批准才入主库 |
| 质量 | 未过滤噪音/错误 | 只保留你确认过的卡 → 召回更准、噪声更低 |
| 可信 | 无来源/审核追溯 | 每卡带 submittedBy 作者 + pending/approved/rejected 审核状态 |
| 免打扰 | — | 免审智能体 / 免审类型命中 → 可信卡直接入库,零等待 |
| 容错 | 删了就没 | 回收站软删,30 天内可恢复 |
🧬 为什么全自研
市面上记忆方案多,但大多依赖第三方框架 / 动不动起 MCP 服务 / 记忆锁私有库。本插件把骨架自己搭,零第三方运行时依赖,逻辑逐行可读:
| 模块 | 自研实现 | 替代什么 |
|---|---|---|
| 去重 | 词法 Jaccard bigram(0.62)+ 语义去重 | 防重复卡 |
| 检索 | CJK 感知:中文整词 + 字符 bigram | 无需全文搜索引擎 |
| 图谱 | 力导向 + [[wikilink]]/共享标签连边 |
知识关联一眼看清 |
| 存储 | SQLite(node:sqlite 内置,零依赖) |
不锁库、分表存储、SQL 查询 |
| 审核 | 数据库层审核守卫 + 审计日志 | 杜绝越权,所有写入强制走审核 |
与热门项目同向(总结→存储→按需召回),但定位不同:本地、自研、零依赖、可读可控。如果你已在用 mem0/Zep 等,也能把它当「本地持久记忆底座」叠加使用。
🛠 开发 / 测试
npm i
npm test # 单元测试:vault 去重/检索/图谱 + capture 管线 + API 形状
npm run build # 构建 lib/client.js(DSH 内嵌)+ web/app.js(独立 web bundle)
🐞 反馈问题
插件左栏有 🐞 反馈异常 入口:填完问题描述后可以
- 在 GitHub 提交(已预填) —— 标题 / 正文 / 诊断信息 /
bug标签都填好,再点一次 Submit 即提交; - 复制给 AI 的提示词 —— 粘进 AI 对话框,让它用
gh查重后建 issue 并回报链接。
为什么不能「点一下自动提交」:GitHub 不允许匿名创建 issue;插件里内置 token 会被反编译提取;OAuth / 自建中转需要服务器。所以实现为「预填 + 一次点击」。 诊断信息会自动脱敏(home 目录 →
~,sk-/ghp_/github_pat_/api_key:等 →***),但公开提交前仍建议自己扫一眼。
如果你拿不到插件界面,也可以直接把下面这段贴给 AI(把「我的问题描述」换成你的问题即可):
我在使用 memory-eternal(DeepSeek Harness 的记忆插件)时遇到了问题,请你帮我把这个问题提交到 GitHub。
仓库:https://github.com/EternalNight996/memory-eternal
请按这个流程做:
1. 先跑 `gh issue list --repo EternalNight996/memory-eternal --state open --limit 50`,看是否已有相同问题:
- 已有 → 用 `gh issue comment <编号> --body-file <文件>` 补充现象,不要重复开新 issue;
- 没有 → 继续第 2 步。
2. 把正文写成文件,然后 `gh issue create --repo EternalNight996/memory-eternal --title "[Bug] <一句话概括>" --body-file <文件>`;正文用这个结构:
现象 / 复现步骤 / 期望行为 / 实际行为 / 环境(插件版本 / DSH 版本 / 操作系统 / Node)/ 诊断信息。
3. 如果 `gh` 没登录或不可用,不要尝试提交,改为输出一条「标题与正文都已预填」的 GitHub 新建 issue 链接给我,我自己点提交。
4. 提交成功后,把 issue 链接发给我。
注意:我的问题描述请原样照录,不要替我美化或省略细节;诊断信息原样放进「诊断信息」一节。
我的问题描述:
<在这里写你的问题>
诊断信息:
<把「反馈异常」弹窗里复制的诊断信息粘到这里>
环境自检(贴问题时附上更快定位)
dsh plugin list # 插件版本
node -v # Node 版本
curl http://127.0.0.1:7999/memory-eternal/api/web-info # 独立 web 是否活着
📋 更新日志
发布规则(2026-09-30 起):正式版一律三端同步发布 ——
npm publish+ GitHub Release + Gitee Release,并保证vX.Y.Ztag 在三端一致。桌面版 profile 依赖github:EternalNight996/memory-eternal、dsh web走 npm 版本号,少任何一端都会出现「npm 上是新版、桌面版还是旧的」。统一入口:npm run release:dry(预演)→npm run release(正式)。详见 PUBLISH.md。版本撤回说明:v0.9.16 – v0.9.22 已全部撤回(问题期间版本:git tag 已删除、npm 已标记 deprecated,请使用 v0.9.23)。v0.9.14 已 deprecated(客户端渲染改动降低手感,已回退;其服务器侧算法优化并入 v0.9.15,渲染与 v0.9.13 完全一致)。v0.9.0 – v0.9.5 均已在 npm 标记 deprecated;v0.9.1 / v0.9.2 / v0.9.3 / v0.9.4 的 release tag 已从 git 移除(v0.9.5 只是被取代、tag 保留)—— v0.9.1/v0.9.2 带记忆页白屏缺陷,v0.9.0 沉淀告警误报刷屏,v0.9.3 不支持 DSH v0.1.7-rc.2(升级后插件整体挂不上:设置服务换血 + 客户端
settingsScope消失),v0.9.4 在官方桌面版(schemastery 3.18.4 的 volatile 活引用)下抛cfg.vaultDir.trim is not a function、插件整体挂不上,v0.9.5 的全屏浮层会盖住桌面版的窗口控制面板(右上角「×」压在窗口「关闭」上,点一下会退出整个桌面壳)。请一律使用 v0.9.6+(npm i memory-eternal@latest)。 DSH 兼容性:>=0.1.5-alpha.2 <0.2.0。v0.9.4 起适配 DSH v0.1.7-rc.2(该版本把设置服务换成纯表单 API,并移除了@deepseek-ai/dsh-client-runtime与settingsScope);v0.9.5 起兼容 schemastery ≥3.18.4 的 volatile 活引用(官方桌面版 profile 即此形态,web profile 仍是 3.18.1,两者都支持);v0.9.6 起全屏浮层自动让开桌面壳的窗口标题栏(不再压住最小化/最大化/关闭)。0.1.5 系列仍走旧的settings.register路径,两条路径都保留。
| 版本 | 日期 | 关键改动 |
|---|---|---|
| v0.10.0 | 2026-09-30 | 两套存储:未审核内容物理隔离。① cards(主库)只存 approved,新增 quarantine(隔离区,含 quarantined_at / quarantine_reason)存 pending/rejected/deleted;② 召回/检索/图谱/去重/导出等读路径不再需要状态条件(查主库即安全),根治 v0.9 审计出的三处绕过审核漏洞(去重池把新知识写进待审卡、readCard 直读未审核正文、/card 无状态校验);③ 审核流转改为跨表搬家(事务内完成,id 由新增的 card_sequence 单一发号器分配,card_updates 随卡改绑);④ 首次启动自动迁移存量非 approved 卡(不删内容,幂等);⑤ 新增 checkMainStoreInvariant() 不变量体检与 tests/two-store.test.mjs(15 条);⑥ 入料噪声闸门:剥离 DSH 运行时注入(环境快照 / team 广播 / teammate 原文 / 工具说明),挡住碎片卡与糊标题;⑦ 修 settings-compat 在 Windows 上的原生崩溃(fs.watch 父目录 → 改监听文件) |
| v0.9.23 | 2026-09-30 | 保存不再闪烁。保存成功后客户端会立刻重拉 /config,而宿主 volatile 回流是滞后的 → 输入框会「先退回原配置、再跳回修改后的值」。现在客户端把「已保存但宿主未回显」的字段做本地叠加(新增 src/client/config-merge.js 纯函数 + 4 项单测),宿主回显一致后自动摘除,之后仍跟随宿主权威值;重置表单会清空叠加层。npm test 共 139 项 |
📜 历史版本(点击展开)
| 版本 | 日期 | 关键改动 |
|---|---|---|
| v0.9.22 | 2026-09-30 | 配置准即时同步(SSE 推送 + 文件监听)。① 新增 SSE 推送中心 lib/sse.js:DSH 内嵌宿主与独立 Web 宿主都暴露 /memory-eternal/api/events,配置一变更就推给所有已打开的页面,客户端订阅后自动重载 —— 正在编辑时不覆盖你的输入(dirty 标记)。② 独立页保存 → DSH 应用:从 5 秒轮询升级为 fs.watch 毫秒级触发(5 秒轮询保留为兜底)。③ 独立页监听共享配置文件:DSH 端一保存,独立页立刻同步。新增 tests/sse.test.mjs(5 项),npm test 共 135 项 |
| v0.9.21 | 2026-09-30 | 保存成功不再被误读为失败 + 配置页排版修复。① 保存成功一律用成功样式提示(原来「已写入;宿主尚未回流」被弹成红色失败样式,用户以为保存失败),措辞改为「已写入配置文件;宿主仍是旧版,重启 DSH 后即以新值为准」;② 配置页字段网格列宽 150/160px → 200/220px、间距加大、长中文标签允许换行,勾选框与说明文字顶端对齐,字段不再互相挤压。 |
| v0.9.20 | 2026-09-30 | 独立 Web 页补取值范围校验:/config 镜像 Config schema 的 min/max(如 recycleRetentionDays 1–3650、webPort 1–65535),越界直接 400 并说明「需要 1–3650,当前 0」。至此「数字框清空 / 越界」这条最常见的保存失败链路在客户端 + 独立页 + 宿主三层都被拦住并给出字段级原因。 |
| v0.9.19 | 2026-09-30 | 「保存失败」不再无信息量(根因:数字框清空=0 被 schema 拒绝,宿主回空 500)。复现与实测:越界值 / 清空数字框 / 类型错误 → DSH 宿主返回 HTTP 500 + 空响应体 → 客户端 r.json() 抛错 → 只能显示通用「保存失败」。修复:① 数字输入框清空不再静默变成 0(JS 里空串转数字得 0,而 recycleRetentionDays 的 schema 是 min(1),直接失败);② 保存前按 schema 范围逐字段自检,指名报错(例如「recycleRetentionDays」需要 1–3650 之间的数字,当前 0);③ 响应体兜底解析:非 JSON / 空响应体时显示 HTTP 状态码与原始片段,而不是「保存失败」;④ 宿主 POST 外层兜底,绝不返回空响应体,并对空字符串数值字段前置返回 400 + 字段名;⑤ 独立页 /config 增加类型与范围校验(拒绝空数值、类型不符),避免写入非法「待应用」值;⑥ drainPendingConfig 增加失败计数,连续 5 次失败后放弃并删除(不再每 5 秒无限重试)。npm test 共 130 项 |
| v0.9.18 | 2026-09-30 | 独立 Web 页终于能保存配置 + 只读状态不再「毫无反应」。根因(issue #12 的另一半):独立 web server 进程没有 DSH 的 settings 服务,它的 /config 过去固定返回 writable:false,客户端 save() 第一行就 if (readonly) return,按钮还是 disabled —— 所以点保存一点反应都没有,与插件版本无关。修复:① 新增共享文件协议 lib/config-sync.js:独立页保存 → 原子写 memory-eternal-config.pending.json → DSH 端激活时与每 5 秒轮询应用(settings.update(patch, undefined) 跳过乐观并发校验),成功后删除,失败保留重试;DSH 没运行时改动留在文件里,下次启动生效。② 独立页 /config 返回 writable:true, viaPending:true,页面顶部显示蓝色说明「保存会写入待应用文件,由 DSH 自动同步」。③ 只读时按钮不再禁用:点击必弹出明确原因(🔒 只读 + 指引「桌面版 → 设置 → 记忆」),彻底消灭「按了没反应」。新增 tests/config-sync.test.mjs(4 项:读写往返、损坏内容容错、drain 成功即删/失败保留、clear 幂等)。npm test 共 125 项 |
| v0.9.17 | 2026-09-30 | 「更新了却还是旧界面」根治。① 构建期把插件版本注入客户端 bundle,配置页新增「页面脚本 vX」徽标;② 当页面脚本版本 ≠ 磁盘版本时醒目提示「⚠ 当前页面仍在运行旧版脚本(页面 v{page} / 磁盘 v{disk}):按 Ctrl+F5 刷新页面即生效」;当「运行中(宿主加载)」落后于磁盘时,提示语也改为「先刷新页面,宿主半未更新才需重启桌面版 / DSH」。起因:issue #12「保存配置没有任何反馈」的真实原因之一,就是页面里跑的还是更新前加载的旧 JS —— 宿主已设 Cache-Control: no-store,但已打开的页面不会自动重新加载脚本,不刷新永远是旧的。另:独立 web 服务(:7999,9/29 启动的旧进程)已重启到新版并验证 loaded=onDisk=latest |
| v0.9.16 | 2026-09-30 | 修复配置保存不生效(issue #12)+ 配置项全覆盖。① 保存链路:宿主 dsh-settings.write() 要求「面板持有的 revision 与 describe 完全一致」,revision 一过期就抛 SettingsConflictError 导致保存失败 —— 现在遇到冲突会自动取最新 revision 重试一次(提示里标 ♻)。② 宿主 volatile 回流滞后:写成功后把改动叠加在本地视图(面板重开立刻是新值),等宿主快照追上再自动摘除;宿主 POST 新增写入回读校验,未回流时返回 pending 并提示「已写入,重启 DSH 后以配置文件为准」。③ 保存即时反馈(你此前反馈过):保存按钮旁直接显示 ⏳ 保存中 / ✅ 已保存 / ⚠ 错误,并标明是否重试/是否回流;按钮文案修正(原来误显示「导出中…」)。④ 配置全覆盖:补齐 7 个以前只能手改配置文件的字段 —— 总开关 enabled、单库目录 vaultDir、蒸馏路由 captureProvider / captureModel、沉淀冷却 captureCooldownMs、语义召回 recallEmbedding、会话预算 sessionBudgetChars;宿主 /config 补 6 项、独立 web /config 补 9 项。⑤ 新增永久守卫测试:tests/config-coverage.test.mjs 保证每个 Config 字段都被「宿主 API / 独立 web API / 配置页」三处覆盖(漏一个就红),tests/settings-save.test.mjs(5 项)钉死 revision 重试、回流兜底与「错误不吞」。npm test 共 121 项 |
| v0.9.15 | 2026-09-29 | 只带服务器侧图谱提速(渲染与 v0.9.13 完全一致)。① 建图落盘缓存:按指纹缓存 nodes+edges 到 <vault>/memory-eternal-graph-cache.json(原子写、指纹失效、超 8MB 不缓存、写失败只影响下次重建),596 卡实测冷启动 422ms → 11ms;② bigram 哈希化 + 稀有 gram 计数排序:bigramHashSet() 把 bigram 压成 32 位整数入 Set<number>(写卡去重仍用字符串版,判定语义不变),稀有倒排改按 df 计数排序(202 → 54ms);③ MinHash + LSH 候选生成(48 维签名 / 24 band,与稀有倒排取并集后精确校验):jaccard 调用 15,148 → 6,797,相似度段 210 → 130ms。全量冷建图 600 → 422ms,边数与 v0.9.13 一致(tag 2777 / similar 4)。客户端零改动:不做精灵/静态层/骨架降级(v0.9.14 那三项因影响手感已回退并 deprecated)。新增 lib/minhash.js + tests/minhash.test.mjs(4 项),npm test 共 108 项 |
| v0.9.13 | 2026-09-28 | 按用户反馈修 7 项。① 版本跟踪:配置页「插件信息」同时显示运行中(宿主加载)/ 磁盘安装 / npm 最新三个版本;磁盘比运行中新时给橙色警告(「磁盘已安装 X,但当前进程仍加载 Y —— 重启后才生效」),并新增「🔄 检查更新」(服务端查 npm,10 分钟缓存 + 4s 超时)。② 复制失败:记忆弹窗在 iframe 里、默认没有 clipboard-write 权限,navigator.clipboard.writeText 必然被拒 —— 现在先试 Clipboard API,失败退 document.execCommand('copy'),再失败就把内容摊进只读文本框并给「全选」;iframe 加 allow="clipboard-write; clipboard-read"。③ 保存没有提示:保存结果显示在保存按钮旁(⏳ 保存中… / ✅ 已保存 / ⚠ 错误),文案从错误的「导出中…」改为「保存中…」。④ 回收中心:恢复 / 彻底删除 / 清空都有成功与失败提示,空库给说明与禁用态。⑤ 通用按键反馈:审核中心的批准 / 驳回 / 删除原先 catch{} 吞掉一切,现逐条统计成功失败并提示;未选卡片也提示。⑥ 图谱缩放卡顿:新增 src/client/graph-lod.js —— 视口剔除(屏幕外节点/边不画)+ 标签预算(≤120 全画 / ≤300 画 160 / ≤600 画 90 / 更多画 60,优先焦点、悬停、搜索命中、高度数)+ 文本宽度缓存 + 大图关阴影。⑦ 新增 tests/graph-lod.test.mjs(5 项),npm test 共 108 项 |
| v0.9.12 | 2026-09-28 | 新增「反馈异常」入口(左栏 🐞):弹窗里填完问题描述后可 ① 一键打开 GitHub 预填 issue(标题 / 正文 / 诊断信息 / bug 标签都已填好,再点一次 Submit 即提交),或 ② 复制一段给 AI 的提示词(贴进对话框,让 AI 先用 gh issue list 查重、再建 issue 并回报链接)。为什么不做「点一下直接提交」:GitHub 不允许匿名创建 issue;插件内置 token 会被反编译提取;OAuth / 中转需要自建服务 —— 所以走「预填 + 一次点击」。诊断信息由新接口 /memory-eternal/api/diagnostics 生成并自动脱敏(home 目录 → ~,sk- / ghp_ / github_pat_ / api_key: 等 → ***,截断到 2400 字符),issue 链接用二分截断保证不超长(URLSearchParams 会把中文膨胀约 9 倍)。新增 lib/feedback.js(纯函数层)与 tests/feedback.test.mjs(4 项:脱敏 / 诊断字段与限长 / 预填链接编码与截断 / 中英双语提示词),npm test 共 103 项 |
| v0.9.11 | 2026-09-28 | 修复 watchdog --reap 把自己杀掉:直接运行 node lib/watchdog.js --reap 时,调用者自己的命令行同样含 watchdog.js + 同端口、且不在锁里 —— reap 于是把自己 SIGTERM 了,表现为「一条输出都没有 + 退出码 1」(走 dsh-memory watchdog --reap 时因命令行不含 watchdog.js 而侥幸没事,所以只在直跑时暴露)。现在保护集合固定包含 keepPid / 当前 pid / 父进程 pid,并跳过命令行带 --reap 的其它进程;输出改成 fs.writeSync(2, …) 同步写,不再被 process.exit 截断。回归测试补「自己与父进程都不得被杀」(用真实空转子进程当靶子,不再用假 pid)。npm test 98 项 |
| v0.9.10 | 2026-09-28 | 多库与看门狗收尾 + 图谱帧优化。① 多库(#10):vaultProfiles / activeVault 终于有了配置页表单(增删库、填目录、选激活库,并显示当前生效目录 / 来源 / workspace);vault 解析抽成 lib/vault-resolve.js,宿主与 CLI / MCP / hooks / 独立 web / sweep 共用同一份,新增 vaultProfiles[].match.workspace 按项目目录自动选库(最长前缀优先、opt-in,默认仍是单库);memory_recall 增加 scope 参数(库名 / 路径前缀 / all 跨库聚合),跨库结果标注来源库。② watchdog(#11):锁改为按端口分槽(多端口 / 多 vault 并存不再互相覆盖),新增 dsh-memory watchdog --reap 回收升级前遗留的孤儿进程(只清同端口、且不在锁里的;锁中活跃实例与用户手动起的都不动)。③ 图谱帧时间:边改为按「颜色 + 透明度 + 线宽」分桶后用 Path2D 一次描边(2.7k 条边从 2.7k 次绘制调用降到几个桶),节点径向渐变改为按 颜色|半径 缓存 + translate 复用(593 次/帧 → 首帧之后基本不再创建)。④ 新增 tests/vault-resolve.test.mjs(7 项)、看门狗测试扩到 7 项;npm test 共 98 项 |
| v0.9.9 | 2026-09-28 | 修复侧边栏「记忆」入口被挤出可视区(issue #2):槽位宿主有两种形态 —— 壳自己的横向行容器 .footerActions,以及被其他插件(dsh-diff-approval / dsh-footer-order 等)改成 flex-direction: column 的 div[data-slot="sidebar.footer.action"]。旧 CSS 对两者都套了 flex-wrap: wrap + .me-footer { flex: 1 1 100% }:纵向容器里 wrap 的语义是「换列」、basis: 100% 指的是高度 100%,叠加后按钮被挤进右侧溢出列、裁切到只剩右边缘一条缝。现在 flex-wrap 只留给横向 .footerActions,.me-footer 改用方向无关的 flex: 0 0 auto,并新增 SSR 回归断言。另:README 双语新增「交流群 & 打赏」(群二维码 + 微信收款码 / 赞赏码),新增 SPONSOR.md 与 .github/FUNDING.yml(FUNDING 只支持文字链接,故 custom 第一项指向 SPONSOR.md 页面直接展示二维码) |
| v0.9.8 | 2026-09-28 | 集中解决存量问题。① 采集可信性(issue #3 / #4):蒸馏路由不再写死 providers[0] —— 新增 captureProvider / captureModel 配置,并按注册顺序依次重试;流末尾 finish 块里的适配器错误(缺凭证 MISSING_CREDENTIAL、限流等)现在成为可见失败(沉淀日志写明 code/message + 健康态亮红 + 兜底原文卡注明原因),不再笼统记成「蒸馏无输出」;停滞探测从「累积计数差额」改为滑动窗口(20 分钟内持续开始且零收尾才告警),误报与漏报一并修掉。② 独立进程 vault 一致性(dsh-memory-eternal#5):CLI / MCP / hooks / 独立 web / sweep 与宿主共用同一套优先级(MEMORY_VAULT_DIR → activeVault → vaultDir → 默认库),切库后不再数据分裂。③ 看门狗单例锁(dsh-memory-eternal#6):同端口已有活着的 watchdog 时新进程直接退出并清理陈旧 pid 记录,止住「每次重启多一个孤儿进程」。④ 图谱性能:标签边改「共享标签数 Top-K」(593 卡实测 24,193 → 2,763 条边)、相似度改稀有 bigram 倒排候选(冷启动 948 → ~520ms,warm 2-4ms)、payload 3,531KB → 579KB;客户端 dim 判定改邻接 Set(每帧 52ms → <1ms)。⑤ 新增 5 个测试文件(路由/finish、停滞窗口、vault 解析、看门狗锁、图谱性能基线),npm test 85 项 |
| v0.9.7 | 2026-09-28 | 打开卡片默认全部展开(可收起)+ 正文排版重做:卡片阅读器不再默认折成 300px,而是打开即读全文,长卡可一键收起(折叠后底部给「展开 ⌄」提示)。frontmatter 从正文里抽出来,改成 kind / 审核状态 / 标签 / 时间 / 来源的彩色 chips(kind 沿用图谱配色),不再把一段 YAML 当正文露出来。正文排版换成新方案(src/client/markdown.js,宿主与独立 web 共用同一套):小标题按语义自动配 emoji + 颜色分组(结论 ✅绿 / 风险 ⚠️琥珀 / 根因 🔍蓝 / 方案 🛠️紫 / 示例 💡粉),连续 - 合成真正的 <ul>、1. 合成带圆形序号的 <ol>、- [x] 变复选框、> 引用升级成带 emoji 的 callout、--- 变分隔线、行首「短键:值」渲染成对齐样式、**加粗** 加荧光笔下划线;围栏代码整段保护,内部 # / - 不再被误排版。新增 7 项排版单测(含 XSS 转义、链接协议白名单、散文冒号不得误判成 key/value)。另含 PR #8 移植:Electron 宿主下的子进程 node 解析(lib/node-bin.js,修「独立 web server 拉不起来 → 侧边栏弹窗白屏」)与 webServer 就绪后再注册 API 路由(修「设置页永远加载中」) |
| v0.9.6 | 2026-09-28 | 修复官方桌面版全屏浮层挡住窗口控制面板(点「关闭」会退出整个桌面壳):桌面壳把「最小化 / 最大化 / 关闭」画在页面顶部,并按 DSH 约定在 <html> 上打 data-windows-titlebar + 给出 --dsh-windows-titlebar-height(已在官方桌面版 app.asar 里确认这两个标记确实存在);记忆库全屏浮层原本是 inset:0 + 内联 100vh,整条盖住标题栏,而我们右上角的「×」恰好压在窗口「关闭」上 —— 用户一点就直接退出整个桌面壳。现全屏态改用 .me-modal-full 类(不再写死内联 100vh:内联样式无法被 CSS 覆盖),并在 [data-windows-titlebar] 下把 .me-overlay-top / .me-overlay / .me-modal-full 一律下移 --dsh-windows-titlebar-height、高度改为 calc(100vh - 该高度);浏览器里没有该属性时偏移 0px,行为与之前完全一致。导出图谱的全屏预览同步从 100vh 改为 100%,避免在缩短后的浮层里溢出。新增 1 项渲染回归断言(三处让位规则必须出现在打包产物中) |
| v0.9.5 | 2026-09-28 | 修复官方桌面版(schemastery 3.18.4)下插件整体挂不上:桌面版 profile 解析到的是 schemastery 3.18.4,它会把标了 volatile 的 Config 字段解析成 cosmokit 的活引用({ get(): snapshot },品牌 Symbol.for('cosmokit.volatile.write')),而 0.9.4 的业务代码把字段当普通值用 —— cfg.vaultDir.trim() 当场抛 TypeError: cfg.vaultDir.trim is not a function,插件在 apply 里就崩(桌面版实测报错原文)。现按 cosmokit 协议统一深解引用(引用取快照、数组/对象递归展开),settings.get() 对外只给普通值;每次读取都重新解,loader 原地提交的 volatile 热更新照样立刻可见,JSON.stringify 写共享配置也不再变成 {}。新增 2 项回归(3.18.4 真实引用形态 + 嵌套数组/对象),并用桌面版真实模块解析布局(schemastery 3.18.4 + 真 cosmokit)跑通 apply 验证 |
| v0.9.4 | 2026-09-28 | 适配 DSH v0.1.7-rc.2(修复「升级后插件整体失联」):① 设置服务换血 —— 0.1.7 的 ctx.settings 只剩表单 API(describe/update/replace/mutate/configure),不再有 register();旧代码 ctx.settings.register(...) 直接抛 TypeError,插件根本挂不上(记忆页消失、自动沉淀停摆)。现改为跨版本兼容层:旧版仍走 register,新版读 loader 传进来的活配置引用、订阅 loader/volatile-update 做热更新、写回走 settings.update(条目 id, patch, revision)(revision 冲突映射 HTTP 409),并注册 configure({ auto:false }) 免得宿主再生成一张重复的表单页。② 字段 volatile 标记改为构造后统一打:不再链式写 .volatile() —— 该方法 schemastery ≥3.18.4 才有,而插件在 profile 层实际解析到的是 3.18.1,链式调用会在 import 期抛 volatile is not a function,把插件整个打挂。③ 客户端去死引用:inject 移除已随 @deepseek-ai/dsh-client-runtime 一起消失的 settingsScope(0.1.7 客户端服务表里已无此服务,插件会永远等待服务而永不激活 → 记忆页与侧边栏按钮全部不见);dsh.client.inject 同步去掉不存在的包名。④ 新增 tests/settings-compat.test.mjs(8 项:0.1.7 形状挂载 / 活引用读值 / volatile 热更新 / 写回与 revision 冲突 / 老版本 register 路径 / 字段 volatile 标记),已并入 npm test。已在真实 DSH v0.1.7-rc.2 上启动验证:宿主插件正常挂载(配置落盘 memory-eternal-config.json)、客户端 bundle 正常进入 boot graph(plugins/??memory-eternal/client.js) |
| v0.9.3 | 2026-09-12 | 修复记忆页白屏("没画面"):v0.9.1 把「滚动续拉」的 useEffect 写在了 loadCards 定义之前——React 在渲染期求值依赖数组,触发 TDZ(Cannot access 'loadCards' before initialization),整个记忆页一渲染就崩;现已移到定义之后。新增渲染冒烟测试(tests/ssr.test.mjs:真跑打包产物、把卡片/设置/用量/图谱四个入口各渲染一遍,已并入 npm test)——「构建全绿、页面白屏」这类 bug 以后发不出去 |
| v0.9.2 | 2026-09-12 | 日志可见性 + 误报修复:自动沉淀日志落盘持久化(~/.dsh/memory-eternal-capture.jsonl,最多 500 条)——独立 Web 页不再显示「日志仅在 DSH 宿主内可用」而是直接能看到记录,宿主重启后历史也不丢(启动时读回);修复停滞探测误报刷屏(轮次计数对不上其实是常态:子代理轮次、被取消的轮次都不发 turn-stopping;现在要求「有轮次在跑 且 15 分钟无任何沉淀活动」才报一次,活动恢复即自动撤销,不再每 10 分钟刷一条把面板挤满、健康状态永久亮红);蒸馏无输出/JSON 解析失败时改为原文卡兜底,内容不再白丢 |
| v0.9.1 | 2026-09-12 | 性能与体验批次:记忆页按视图懒加载(打开「设置」不再顺带拉 250KB 卡片 + 890KB 图谱,首屏只需约 0.5KB);知识图谱生成 3232ms → 43ms(bigram 集合只算一次 + 数学上界剪枝无损跳过 + 标签倒排),并加指纹精确失效的服务端缓存(写卡/审核/删卡立即重建,无脏读);全站 brotli q5(图谱 877KB → 54KB,比 gzip 再小 34%;卡片 246KB → 83KB → br 20KB),大响应体同时压 br + gzip 取更小者,保证任何响应都不比 gzip 差;/cards 支持真分页(offset/limit/total + 服务端标题排序,跨页全局有序),首屏只拉 100 条、滚到底续拉;「用量/今日」的 Agent 卡清单改为服务端署名过滤(30 条);审核红线:插件在 Agent 上下文注入「禁止调用 approve/reject 代用户审批」;watchdog 回收备用端口的多余实例(实测清掉一个常驻 76MB 的重复 web 进程) |
| v0.9.0 | 2026-09-12 | 修复自动沉淀静默失效(一连 6 天不写卡):DSH 升级后会话事件接口由 events 改为 ownEvents()/snapshotEvents(),监听器读不到事件后静默返回、不留任何痕迹 —— 现改为三级自适应取法(ownEvents() → snapshotEvents() → events)+ 每会话接入留痕;日配额改为只统计真实写卡(此前「不值得保存」的判定也照样扣配额,40 次即耗尽 24h 配额)、captureCooldownMs 冷却真正生效、单次沉淀输入截尾 20000 字;新增自动沉淀日志面板与异常主动提示(页面红条 + 注入 Agent 上下文 + 轮次收尾停滞巡检);移除「每日回顾」自动简报(定时器 / /todayBrief 接口 / UI 按钮) |
| v0.8.0 | 2026-09-06 | 全套 UI i18n:跟随 DSH 系统语言实时切换(中/英),覆盖知识卡 / 知识图谱 / 审核中心 / 配置面板 / 新建卡模板;Windows 测试收尾 SQLite 连接 EBUSY 修复 |
| v0.3.1 | 2026-09-03 | 知识图谱按需加载(点击时 fetch,关闭时注销) |
| v0.3.0 | 2026-09-03 | SQLite 化存储层(node:sqlite 零依赖)+ 数据库层审核守卫 enforceAudit() + audit_log 审计日志 + 自动从 .md 迁移 |
| v0.2.0 | 2026-09-03 | recall 含正文修复(search() 返回 excerpt 字段) |
| v0.1.2 | 2026-09-03 | 审核守卫加固(writeCard 默认 pending,mergeCards 走审核) |
| v0.1.1 | 2026-09-03 | recall 含正文修复(excerpt 字段 + body 逻辑修正) |
| v0.1.0 | 2026-08-31 | 首发:自动沉淀 + 自动召回 + 图形化知识库 + 知识图谱 + 审核中心 + 回收中心 |
💬 交流群 & 打赏
遇到问题、想提需求、或者想聊聊 DSH 插件开发 —— 欢迎进群:

如果这个插件帮你省了时间,可以请作者喝杯咖啡(两个码任选其一):
| 微信收款码 | 微信赞赏码 |
|---|---|
![]() |
![]() |
打赏完全自愿,不影响任何功能;插件本体始终开源免费(MIT)。 仓库页的 Sponsor 按钮下拉里选 custom 第一项,会落到 SPONSOR.md(同样是这一页的码)。
📄 License
MIT
让 AI 真正记住你:对话自动沉淀,知识随手可查。 ⭐ 觉得有用就点个 Star,Let's make AI not forget.
English README: README.en.md

