中文EN

dsh-memvault

memory已测通过npmMIT

把 DSH 接到本机 MemVault 记忆库:核心记忆块注入系统提示词、结束的轮次经由 MemVault 自己的管线抽取,并提供浏览、追溯、复核与重抽的面板。

下载量 / Downloads
1,005
依赖体积 / node_modules
10.33 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

安装

dsh plugin --profile web add dsh-memvault

沙箱测试结果

阶段结果
1 安装✓
2 列装✓
3 挂载✓
4 启动—

四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。

README

<p align="center"><img src="docs/overview.png" alt="dsh-memvault 项目介绍" width="100%"></p>

dsh-memvault

<p align="center">

<strong>把 MemVault 的核心记忆块推进 DeepSeek Harness 的 system prompt,再把每个完成的回合送回去。</strong><br>

带一个 GUI 里的记忆面板 · 零运行时依赖 · 不需要打包器 · 不需要第二个常驻服务

</p>

<p align="center">

<a href="README.md">English</a> | <strong>中文</strong>

</p>

<p align="center">

<img alt="version" src="https://img.shields.io/badge/version-0.9.12-4a6cf7">

<img alt="npm" src="https://img.shields.io/npm/v/dsh-memvault?color=cb3837">

<img alt="license" src="https://img.shields.io/badge/license-MIT-30a46c">

<img alt="platform" src="https://img.shields.io/badge/platform-DeepSeek%20Harness-f76b15">

<img alt="runtime deps" src="https://img.shields.io/badge/runtime%20deps-zero-888">

<img alt="node" src="https://img.shields.io/badge/node-%E2%89%A522.13-339933">

<img alt="panel" src="https://img.shields.io/badge/panel-conversation%20tab%20%2B%20settings-8957e5">

<img alt="stars" src="https://img.shields.io/github/stars/zhang66633/dsh-memvault?style=flat&color=e3b341">

</p>


dsh-memvault 补齐的是一个已经存在的记忆系统缺掉的那一半。MemVault(本机长期记忆服务:SQLite 库 + FastAPI/CLI 管线 + stdio MCP server)负责存事实、做向量化、做检索——但它是 stdio MCP server,而 MCP 是 pull 协议:服务端只能被调用,它没有任何渠道往模型上下文里放东西。所以「记忆已经在上下文里了」这件事,在 MCP 这一层永远做不到,只能由客户端插件来做。

两半是刻意分开的:MemVault 单独就是一个通用 MCP 服务,任何客户端都能用(Claude Code、Cursor、Cline、脚本);本插件是 DSH 专属的那一层——提示词注入、按窗口把结束的轮次交给 MemVault 自己的管线、以及面板。装上插件,「记忆已经在上下文里」才成立,而不是靠模型记得去查。

本插件做三件事:

半边 · 做什么 · 机制

注入(读) · 核心记忆块进入 system prompt,每一步都看得到,模型不必调用任何工具 · ctx.systemPrompt.context() —— 动态 runtime 上下文贡献(与 skill-catalog 同一条通道)

抽取(写) · 完成的回合先攒进一个窗口,窗口再作为一整段对话交给 MemVault 的抽取/向量化管线 · ctx.on('session/event') → turn/end → 窗口 → python -m memvault.cli add --stdin(安静时触发)

可视化(面板) · 此刻注入了什么、抽取最近干了什么、直接改核心块,以及浏览库里到底存了什么 · 五条 exact host 路由(/memvault/api/*)+ 一个浏览器半边,落在会话页签环与 Plugins 设置页

✨ 特性

🧠 不靠工具调用的注入 · 核心块落在一个动态 runtime 上下文里,每次 assemble() 都会求值——模型是「本来就有」,不是「去拿」

🗄️ 直读 SQLite(只读) · 用 Node 内置的 node:sqlite 只读打开 memvault.db:不过 HTTP、不起子进程、无第三方依赖,也不需要任何服务在跑

💾 渲染结果按 TTL 缓存 · system prompt 就是 KV cache 的前缀:每步重读重渲染是白费,而任何一个字节变化都会让缓存从该点起失效。所以渲染被缓存(refreshMs,默认 30 秒)

🧩 按回合边界切片 · 写半边从自己那份有界事件日志里按 turn/end 边界切回合:幂等、跨重启稳定、没有会过期失准的水位算术

⏱️ 把成本做成旋钮 · 窗口本身是一组旋钮:everyNTurns 决定什么时候值得抽,idleMs 等一个停顿,windowTurns 封顶,minTranscriptChars 跳过琐碎回合,endReasons 决定哪些结束方式算数,timeoutMs 杀掉卡住的子进程

🌙 后台跑,不在关键路径上 · 抽取发生在会话安静下来的时候——你读答案的时候,而不是你等答案的时候;而且一次调用覆盖最多 windowTurns 轮,不再一轮一次

💾 窗口跨重启不丢 · 等着的窗口(渲染后的转写文本,有界)每来一轮就写进状态文件,所以轮与轮之间重启不会静默丢记忆;挂载时仍在等待的窗口会被抽取,并在诊断里标成 recovered

🎭 角色过滤 · 默认不送助手台词与工具流量——送它们曾把模型自己的话存成「关于用户的事实」

🪶 零运行时依赖 · 就是 harness 插件协议上的裸 ESM:node:sqlite、node:child_process、node:fs。没有要装的东西;浏览器半边是照着 ModuleLoader 封装手写的,不引入打包器

🧾 每个旋钮只描述一次 · 一份 spec(lib/config.js)同时产出代码默认值、DSH 用来校验的 Config schema、以及 Plugins 页渲染的设置项——默认值之间不可能互相漂移,patch 里写错的键/值也会出现在面板上而不是只进 host 日志

🎛️ 一个真面板 · 会话页签环里的 记忆 页签 + Settings → Plugins 里的一页:当前注入的块(label、作用域、字符数与它的存储上限、原文)、读预算与缓存年龄、抽取旋钮、有水位线的会话数、最近 5 次抽取结果,外加一个跳过 30 秒 TTL 的 立即重读 按钮

✏️ 核心块可编辑 · 每个块都有 编辑 / 删除,另有一个新增表单。写入是按 (scope_type, scope_id, label) 的 upsert,写完立刻让渲染缓存失效,所以下一步就已经看得到;panel.writes: false 可以把整个面板变回只读

🧭 初始化时就知道路径 · 面板显示当前生效的库文件、插件状态文件、Python 与项目目录,库文件是否存在(及大小、最后修改),以及「读的作用域」与「写的作用域」分别是什么——并写明唯一两个改动入口:DSH 插件配置与 MemVault 的 .env。库文件不存在时会明说“首次写入时创建”,因为路径写错与库是空的在一行计数里长得一模一样 随包发布的 cordis.patch.yml 里的路径是作者本机示例,不是通用默认值——要么改成你自己的,要么什么都别改,交给自动发现

🔭 看清记忆结构 · 第三个视图回答列表回答不了的问题:各个作用域维度里各有什么(而且同一行会同时计入 user 与 agent——作用域是维度、不是分区)、哪些核心块真的在注入(对比只是存在库里)、关系图长什么样——节点大小随度数、连线粗细随权重,还会告诉你多少条记忆完全没有边。点节点直接展开它的完整审计链

🔎 浏览库里存了什么 · 第二个视图对 memories 表做子串检索,带类型/作用域过滤与翻页,并显示类型、作用域、时间与 id(一键复制,方便交给工具调用处理)。被库自身自动改型过的行会带一个徽标,还可以勾选「只看自动改型」把它们挑出来——启发式判定不该静默生效,判错了你就在那里标为待复核。它是浏览不是召回——语义召回仍然交给模型的 memory_search——而且从不 SELECT embedding blob

🧾 可追溯、可复核 · 每次抽取都记录它产出了哪些记忆,所以一个窗口能直接跳到它的行(「看这 2 条产出」)。每条可以展开来源:MemVault 自己的审计(history:ADD/UPDATE/DELETE 连同新旧文本)与它参与的矛盾关系(relations),还可以标为待复核。标记是本插件状态,库完全不动

♻️ 能动手的复核闭环 · 复核队列会把每条标记连同它的窗口与留存原文列出来,并且可以就地取消标记。两个动作:复制修正请求把 id、原文、来源交给模型(模型提议,DSH 的批准是那道门),以及重抽——把那个窗口的文本重新交给 MemVault 自己的管线,可以先把文本改对,也可以换抽取器。重抽是面板唯一会写库的动作,而且它走的是 add(),不绕过去

🖥️ host 半边不需要浏览器 · 面板是可选的:webServer 用 ctx.inject 取,所以无头组合照样注入记忆,只是永远不会注册那两条路由

🛟 设计上软失败 · 库读不了就继续供上一次的好文本并只告警一次;抽取失败绝不让一轮对话失败,也不会污染下一轮

🔍 可在进程外观测 · 水位与最近 5 次抽取诊断原子写入一个 JSON 文件,于是「钩子没触发」「回合太短」「跑了但没抽到」三者可区分

🧭 兼容性

问题 · 结论

DSH 桌面端 · ✅ 已在 0.2.1-rc.5 的保留 desktop profile 上实测:bundle(dsh.bundle.patch)加载成功,插件行状态 active,/memvault/api/status 回 200,注入的块出现在 runtime 上下文快照里。

DSH 版本区间 · 支持 0.1.x 与 0.2.x 两条线,含 0.2.1 的预发布。engines.dsh 与两条 DSH peer 声明写的是同一个区间;其中 >=0.2.1-0 <0.3.0-0 这一段专给不带 includePrerelease 的严格判定器(npm/pnpm 的 peer 解析、市场的发现前检),否则 0.2.1-rc.5 会被它们判成不满足。

需要客户端半边吗? · 只有面板需要。dsh.client.platform: 'web' 负责把浏览器半边提供出去;记忆桥本身完全跑在 host 侧,所以关掉客户端半边损失的是可见性,绝不是注入。

Web / 无头 / SDK profile · ✅ 只要 host 在跑,同一个 bundle 就能用。无头组合没有 webServer,面板那条子 fiber 会等着它而不是失败。唯一必需的服务是 systemPrompt。

面板可见吗? · ✅ 两个位置:会话页签环里 聊天 / 轨迹 旁边的 记忆 页签,以及 Settings → Plugins 里的 MemVault 记忆桥 页。两者都是只读视图,数据来自注入的块与抽取状态。

Windows / macOS / Linux · ✅ Windows 用作者本机布局即可开箱;其它平台把 MEMVAULT_DIR / MEMVAULT_PYTHON 指向你的 checkout(POSIX 的 venv 是 .venv/bin/python),或在 cordis.patch.yml 里写死那三个路径。

Node · >= 22.13(node:sqlite 无需标志)。DSH 自带 Node,所以这条只是本插件的 API 下限声明。

其它 harness(Claude Code、Codex…) · ❌ 不是这个插件的事。它是照着 cordis/DSH 的接口写的(ctx.systemPrompt.context、session/event)。那些 harness 访问同一个库,走 MemVault 自己的 MCP 工具、CLI 或 API。

🚀 快速开始

前置条件:一份能跑的 MemVault checkout——它的 virtualenv 与 memvault.db(该库与 MemVault 服务、MCP

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:4,最后更新 2026-11-01

链接

GitHub · Homepage · npm

同类插件