中文EN

dsh-engramory

memory已测通过npmMIT

给 DeepSeek Harness 的长期记忆,以纯 markdown 保存,一条事实一个文件。每一步都把索引 `MEMORY.md`(有项目库时含项目库,另加 `$DSH_HOME` 下的全局库)放进运行时上下文,召回不用等模型去读文件。索引有硬上限,默认 200 行 / 25KB,由 `ctx.tools.guard()` 强制执行:让已超限的索引变大的写入被拒绝,缩小它的重写一律放行。左侧栏有只读的「记忆」页,按类型列出笔记。插件不会自行写入记忆。实验性的大肥鱼模式为人设角色加了记录它自己人生的笔记类型。同一个记忆库也可供 Claude Code、Codex、Kiro、OpenClaw

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

安装

dsh plugin --profile web add dsh-engramory

沙箱测试结果

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

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

README

简体中文 | [English](README.en.md)

dsh-engramory

![dsh-xray](https://unstone.github.io/dsh-xray/registry.html#tinqiao-oss__engramory)

给 DeepSeek Harness(dsh)用的长期记忆插件。AI 记住的东西存成一个个普通 markdown 文件,你随时能打开看、能改。它是 Engramory 的 dsh 专用版:Engramory 本身是通用的 AI agent 记忆,Claude Code、Codex 等也能用同一个库。

它做什么

  • 自动带上记忆索引。 索引 MEMORY.md 只列笔记名字,插件把它作为一条消息带进对话,AI 不用先读文件就知道自己记过什么,要细节再打开那条笔记。索引变了才再带一次(写入了、换到别的项目、对话被压缩过):写入后下一步就能看到,长对话里也不会堆出一份份重复的索引([社交模式](#社交模式)照旧放在 dsh 的运行时上下文里)。超出上限的部分不带上,并提醒 AI 压缩。
  • 索引有硬上限。 默认 200 行 / 25 KB。AI 用 dsh 的文件工具写索引时,只要插件算得出写完的样子,会超上限就在写入前拒绝,让它先压缩;压缩照样放行。细节见[上限怎么判](#上限怎么判)。
  • 自带记忆规则。 记什么、怎么记、什么时候清理,这套规则(skill)随插件注册,不用另外装文件。
  • 快压缩时提醒 AI 存记忆。 dsh 会在对话太长时把前面压缩成摘要,摘要不一定留得下以后还用得着的东西。对话快到 dsh 要压缩的地方时,插件提醒 AI 把值得长期记住的先存进记忆;提醒的是 AI,不打扰你。
  • 侧栏多一个「记忆」页。 只读,列出笔记名字,点名字用电脑上的默认程序打开;顺带体检,标出索引里的坏链接和没进索引的笔记。

安装

需要 Node.js 22.12+(dsh 本身的要求),PATH 里要有 pnpm(dsh 的插件命令要用)。dsh 桌面版也可以在插件页搜 dsh-engramory 安装。

dsh plugin --profile <名字> add dsh-engramory

卸载把 add 换成 remove。

升级要写上版本号,比如 dsh plugin --profile <名字> add dsh-engramory@1.5.2:只写名字时,pnpm 11(桌面版自带的也是)默认只装发布满 24 小时的版本。桌面版的插件页对第三方插件没有「更新」按钮:先卸载,再搜 dsh-engramory@<版本> 安装,装完从托盘退出 dsh 再打开。记忆库和设置都会保留。记忆页底部的「检查更新」能查到最新版本号,并列出这几步。

兼容的 dsh 版本见 package.json 里的 dsh.compatibility.dshReleases,没列出的版本未经验证。

记忆存在哪:

  • 全局库 默认在 ~/.dsh/.engramory-memory/(设了 $DSH_HOME 就在它下面),可以在记忆页换到别的文件夹,见[更换存储地址](#更换存储地址)。只装插件就用这一个,AI 第一次保存时自己建。
  • 项目库(可选)是项目根目录下的 .engramory-memory/,只能由你来建:在 Engramory 仓库里运行 python tools/engramory_init.py dsh --project-root <项目>,它会顺手加进 .gitignore。有项目库时,只在这个项目成立的事记在那里,其余仍记全局库。

一个库只能有一个 AI 写,同时写会互相覆盖;想让别的 AI 也用,让它只读,见单写者、多读者。记忆是明文,带着本机细节。放在项目的 git 仓库里必须 git-ignore;给记忆库单独开一个私有仓没问题。

不装插件也能用: python tools/engramory_init.py dsh --install-skill 把记忆规则写进 $DSH_HOME/AGENTS.md、把 skill 装进 $DSH_HOME/skills/engramory/($DSH_HOME 默认 ~/.dsh),并建好全局库。AI 照样会记,但索引要它自己去读,上限只靠它写完后自觉运行 engramory_check.py。

大肥鱼模式

给陪你聊天的角色用(社区里的大肥鱼,或任何人设)。在设置页打开「大肥鱼模式」,或在配置里写 companion: true。

  • 多记三类角色自己的事(SKILL.md §2.2):moment(经历)是和你一起经历的事,带日期,索引满了按月归档;upcoming(约定)是你将要发生的事,日子过了会问起结果,问到了再改写成经历;self(我自己)是角色自己的变化,比如外号。经历和我自己只有你说忘掉才删。
  • 用角色口吻回忆。 打招呼也可能让它想起点什么;记住了、没记上,都用角色的话说,不提文件和工具。
  • 人设预设要留着文件工具。 记忆总会送到,哪怕预设关掉了可选上下文(比如 dsh 的 minimal;dsh 0.2 起,0.1 这时什么上下文都不带)。但角色要保存记忆,预设得带上 dsh 的文件工具和 skill 工具;只给了 shell 的预设读得到记忆,写入却绕过上限。

社交模式

大肥鱼模式里的一个选项,给别人也能聊的角色用,比如通过接入插件接到 QQ、微信、抖音、B 站的角色。在设置页「记忆权限」选「社交」,或写 audience: social。只有你自己跟这个 dsh 聊,就保持默认的「专属」。

打开后,只有你本人的会话拿得到记忆:你在 dsh 自己的窗口(桌面版或 dsh web)里亲手发过消息、且没有别人说过话的会话才算你的。子 agent 跟着它的父会话算。接入插件转来的消息(标明是主人的除外,见下文)、dsh headless、外部程序、终端和编辑器客户端发的都算别人的;一个会话只要有别人说过话,就一直算别人的,之前已经带进去的记忆仍留在对话记录里。

别人的会话拿不到索引,也不知道记忆库在哪;dsh 的文件工具只能指名文件(任何目录都不让列),指向记忆库的路径不管怎么写都拒绝;dsh 的会话搜索(可选的实验功能,能读同一目录下其他会话的记录)在别人的会话里一律不能用。这不是安全边界:shell 工具照样能读任何文件,同一账户下的另一个 profile 也读得到。要真正隔离,得靠文件权限或沙箱。自定义的 skill(见[配置](#配置))会原样给所有会话,别人的也一样,里面写了库在哪,别人也看得到。

给接入插件作者

社交模式下,接入插件转进来的消息默认都算别人的。来自主人自己账号的消息(比如主人和角色的 QQ 私聊),在来源章上标 speaker:

agent.followup(createUserMessage({
  content: [{ type: 'text', text }],
  source: { kind: 'plugin:your-bridge', speaker: { role: 'owner' } },
}))

speaker.role · 含义

owner · 主人发的:来自用户在你插件里设为"自己"的那个账号。

guest · 别人发的,和不写 speaker 一样。

none · 不是人发的:你插件自己的汇报、提醒或通知,不会让主人的会话变成别人的。

群聊里的消息再加上 chat: 'group'(如 { role: 'owner', chat: 'group' }):回复全群都看得到,所以就算群里只有主人开过口,这个会话也算别人的;私聊写 chat: 'private' 或不写,chat 是别的值都按群聊算。群聊里只要有别人说话,那个会话就一直算别人的。只通过 dsh web 接口发消息的程序设不了来源章,消息都算别人的;它若带上 clientTimeZone,会被当成主人,所以替别人转发消息的程序不要带。

设置页与记忆页

  • 设置页:dsh 的「插件」页里点开「Engramory 记忆」,能改大肥鱼模式、记忆权限和索引上限。保存走 dsh 自己的配置服务,写进你 profile 的 cordis.patch.yml 并重新加载插件。这个接口只有登录了的你能调,AI 没法调用它关掉社交模式。
  • 记忆页:左侧栏「记忆」。最上面一条横幅:标题旁是插件版本;列出了多少笔记、几个记忆库、多少归档,什么时候读的,还有两个开关(大肥鱼模式,打开后还有记忆权限),拨了就保存。下面按笔记类型分标签、可按名字筛选,列出全局库和各工作区的项目库(设了绝对路径的 indexPath 时只列那一个,相对路径则列不出)。每条笔记一行:类型图标、名字、类型和大小;约定那一行标出日期和还有几天(日期已过的写「待确认」,只是提醒,不会自动归档),超过 12 KB 的标「偏大,建议拆分」,不在索引里的也会标出。每个库名旁边是索引用量(进度条按两项上限里离得近的那个画)和「打开文件夹」,全局库还有「更换存储地址」(见[更换存储地址](#更换存储地址))。体检发现的问题集中列在库下面:索引里指向不存在的文件、不在索引里的笔记(AI 回忆从索引开始,除非别的笔记链到它们,否则通常找不到)、没写类型的笔记、超过 12 KB 的笔记、索引超上限;旁边的「复制整理指令」复制一段给 AI 的整理要求,粘贴进对话即可,插件本身不改任何文件。体检只按文件名和索引里的链接判断,不顺着符号链接走;索引超上限、要核对的太多或有文件读不了时不做,完整检查仍用 engramory_doctor.py。列表被截断或有库读不了时会注明,不把没列到的算成零。只读,不显示正文;点名字、「打开文件夹」都在运行 dsh 的那台机器上打开;没有桌面的机器(无界面服务器、SSH 连过去的)不显示这些按钮。下面有一段「怎么用」,还没有记忆时自动展开。页底是插件版本和「检查更新」:点了才向 npm(连不上再试 npmmirror)查最新版本号,请求里不带记忆内容;有新版就列出写上版本号的升级步骤。插件别的时候不访问外网。再下面是反馈入口:到 GitHub 提 issue(正文预先写好插件版本和系统类型,不带路径和笔记),或发邮件,地址可以一键复制。

更换存储地址

记忆页「全局记忆」右上角的「更换存储地址」能把全局库换到别的文件夹,比如网盘里,或者一个私有的 git 仓库(还没有记忆时,按钮在「还没有记忆」那行旁边)。点「选文件夹…」用系统自带的窗口选,或者直接填路径,再点「搬过去」:

  • 选文件夹用的是 dsh 自己的选择窗口,弹在 dsh 运行的那台电脑的屏幕上。dsh 认为你不在那台电脑前时(比如它跑在远程服务器上)没有这个按钮,填路径即可;在本机启动 dsh、再经 ssh 端口转发从别的电脑打开时,dsh 仍当你在本机,窗口会弹在本机屏幕上。选的文件夹里已经有东西时(比如直接选了网盘根目录),会在里面新建一个 Engramory 文件夹放记忆。选完只是填进路径,点「搬过去」才搬。
  • 整个搬过去,旧位置自动清理。 先复制到新位置、逐个文件核对,没问题才切换;再把旧位置改名挪开,和新位置逐个比对后删掉。搬的那几秒里后写进旧位置的,会补进新位置;同一个文件两边都改过的,旧位置那份存成新位置里名字带 .old-<编号> 的文件,索引末尾加一行指向它,不会覆盖新位置的内容。
  • 中途被打断也不丢。 每一步都先记下来:还没切换时 dsh 被关了,下次打开就撤销,记忆还在原处;切换之后被打断,下次打开接着做完。
  • 这台电脑上的 dsh 一起换。 位置记在 dsh 主目录的 .engramory-memory.json 里,桌面版

…(truncated)

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

版本

npm 上共发布:28,最后更新 2026-11-06

链接

GitHub · Homepage · npm

同类插件