DeepSeek Harness 插件

dsh-memory-pyramid

给 DeepSeek Harness 补上时间轴记忆:定宽只追加的事实日志 + agent 自己维护的摘要金字塔,固定阅读预算下 recall 成本不随记忆量增长。(英文原文)

跳到安装方式

来源信息

GitHub 仓库
33moren33/dsh-memory-pyramid
最近更新
2026年8月19日
分类
记忆
GitHub stars
1
载体类型
plugin
目录证据
上游声明已找到 dsh.bundle
证据路径
package.json#dsh.bundle
核对版本
0.1.0-rc.8
上游核对日期
2026-08-20

该证据由上游目录提供。本站没有安装、运行或安全审核这个插件。

安装

默认先复制一段 Prompt,让 Agent 读 GitHub 仓库和源码;需要自己装时再切到命令。

复制这段 Prompt,发给 DSH、Codex 或其他 Agent,让它先读 GitHub 仓库和源码。

请先不要安装或执行任何命令。阅读这个插件的 GitHub 仓库、README 和关键源码,然后用清楚、直接的方式回答以下问题,帮助我判断它是否适合我的需求:

1. 这个插件是什么,解决什么问题;
2. 适合哪些用户和典型使用场景;
3. 安装后如何使用,并给出一个最小使用示例;
4. 有哪些已知限制,以及隐私、安全、兼容性或维护风险;
5. 给出“推荐 / 有条件推荐 / 不推荐”的明确建议和理由。

请区分仓库明确说明、根据源码推断和未知信息。证据不足时请明确说明,不要猜测或照抄 README。

GitHub:https://github.com/33moren33/dsh-memory-pyramid
插件名:dsh-memory-pyramid
作者:33moren33

检查来源文件

安装前先看这个插件目录里的 README 和其他文件。

文件资源管理器3 个文件
README.md来源说明 · 只读预览

<div align="center">

<h1>DSH金字塔记忆</h1>

<p> <img src="https://img.shields.io/badge/%E6%97%A0%E9%99%90%E8%AE%B0%E5%BF%86-ff6b35?style=for-the-badge" alt="无限记忆" height="90" /> <img src="https://img.shields.io/badge/%E5%9B%BA%E5%AE%9A%20TOKEN-2ea44f?style=for-the-badge" alt="固定 TOKEN" height="90" /> <img src="https://img.shields.io/badge/DSH%20%E5%8E%9F%E7%94%9F-3178c6?style=for-the-badge" alt="DSH 原生" height="90" /> </p>

<p>dsh生态,零依赖,即插即用<br/>通过本地对话文件,生成记忆金字塔,自带寻址<br/>给 <a href="https://github.com/deepseek-ai/deepseek-harness">DeepSeek Harness (dsh)</a> 补上带时间轴的、无限记忆<br/>Agent自维护,一万条记忆,开局仍最多只读 96 行,固定token</p>

<p> <a href="#快速开始"><strong>快速开始</strong></a> · <a href="#金字塔记忆结构"><strong>金字塔记忆结构</strong></a> · <a href="#roadmap"><strong>Roadmap</strong></a> </p>

<p> <img src="https://img.shields.io/static/v1?label=License&message=MIT&color=blue&style=flat-square" alt="License: MIT" /> <img src="https://img.shields.io/static/v1?label=Node&message=%E2%89%A519&color=green&style=flat-square" alt="Node >= 19" /> <img src="https://img.shields.io/static/v1?label=Dependencies&message=0&color=brightgreen&style=flat-square" alt="Zero dependencies" /> </p>

<p><sub>Fable 5 辅助</sub></p>

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

</div>

---

装上之后,模型每次自动注入“金字塔”记忆;攒多之后,视图自动压成金字塔形:

### Memory view (40 facts)

#0-31   摘要:这段时间在打通插件加载链路,结论是...
#32-35  摘要:注入改走 systemPrompt 的动态上下文...
#36-37  摘要:数据目录改落工作区,避免家目录被运...
#38     2026-08-15 摘要树按块大小分层存储,待办...
#39     2026-08-15 定宽记录不存序号:位置即身份...

越靠近现在越是原文,越老越粗——但原文一条都没丢,随时可以下钻回去。

这是人这边看到的同一份东西:

<img src="assets/panel-full.png" alt="记忆看板" width="900" />

金字塔记忆结构

每记满两条事实,agent 就继续往上层进行摘要总结一次;两行这样的话再凑满一对,就写一行更粗的。每往上一层块数减半,形状就是一座塔:

                  [ #0-127 ]                      ← 1 行 · 代表全部 128 条
            [ #0-63 ]    [ #64-127 ]              ← 每行代表 64 条
      [#0-31] [#32-63] [#64-95] [#96-127]         ← 每行代表 32 条
   ········································
  #0 #1 #2 #3 ··················· #126 #127       ← 塔基:128 条逐字原文

开局那份视图,就是沿着塔斜着下楼梯:去年的事读塔尖一行,上个月的隔一块中层砖,昨天的直接站在塔基逐字读。塔基永远不动——粗砖只是地图,memory_zoom 两行就下到原文。所以记忆涨十倍,开局要读的行数一行不多。

形状来源:金字塔形状参考自 Victor Taelin 的 OptMem极简记忆理念。真正实现在 dsh 里自己探索、摩擦出来的,目前在致力于更加完善的记忆机制-(记忆与对话事实链接、面板、后台并行)——见后续路线图。

常见记忆机制比较

切哪根轴记的是
agent-instructions(AGENTS.md 门规链)空间在哪个目录下该守什么规矩
检索式记忆(RAG 一类)相关性跟当前问题像的东西
dsh-memory-pyramid时间先后发生过什么、当时为什么那么定

三轴正交、可以叠着用。官方目前只占了空间轴,时间轴整根空着——这就是本插件的落点。

目前仅串行,agent自主决定工具调用,没有任何后台进程

记忆看板(金字塔式的直观可视化,人也看得见自己的记忆)与回溯(点一条记忆跳回产生它的那段对话,看到记忆的全生命周期)已经做完。下一步是并行后台结算:写记忆交给专职分身,主线一个字的注意力都不付。

特性

金字塔机制

  • 事实一行 ≤280 字节,只追加、永不修改;摘要由 agent 记录时顺带维护——无后台进程、无定时器
  • 固定阅读预算:装得下就一点不压缩,装不下越老越粗、从不截断
  • 摘要写坏有正式重画通道(memory_forget),并连坐丢弃由它推出的更粗摘要

🔧 dsh 原生适配

  • 原生 dsh 插件积木,不是外部命令行,脚本——不需要 shell 权限
  • 注入通道是拿真实账单选出来的:视图放系统提示词会打爆 prompt cache,改走官方动态上下文通道后整场命中率 40%→91%(下文有对账表)
  • 会话区间锚点:每条事实记下它蒸馏自哪段对话(sessionId + seq 区间)——dsh 有全量会话流水这份原料,这是 OptMem 的运行环境里不存在的能力
  • 官方AGENTS.md的机制依旧生效
  • 数据目录认领 / 自动搬迁 / 拒绝拼接——宁可不工作,也不在别人的目录上写字

工程性质

  • 零 npm 依赖、零原生模块,Node ≥ 19
  • Windows / Linux / macOS / ARM64
  • 多进程共写同一份记忆无锁且正确——靠减掉一个字段,不是加一把锁
  • 数据落工作区、纯文本、对 diff 友好,可建 git 进一步管理

快速开始

系统要求

  • 已安装 DeepSeek Harness,dsh web 可正常启动。
  • 已安装 pnpm(dsh 用它装插件,Windows / Linux / macOS 同要求):npm install -g pnpm
  • 从仓库安装另需 git;插件本体零依赖、无构建步骤,Node.js ≥ 19。

三步上手

1. 安装:dsh plugin --profile web add dsh-memory-pyramid 2. 重启 dsh web(profile 启用了 HMR 时会直接热生效,这步可省;没见到再重启) 3. 新建会话——开局即见 Memory view,模型开始自动记忆

从 npm 安装(推荐)

一条命令,装完即激活——包自带 dsh.bundle 声明,dsh 自动把它加入 profile 层栈,一个配置文件都不用改

dsh plugin --profile web add dsh-memory-pyramid

也可以把这条命令直接交给 dsh agent 替你执行。

从 GitHub 仓库安装(开发调试)

零依赖、纯 ESM、无构建步骤;link: 装的是引用,之后 git pull 即更新:

git clone https://github.com/33moren33/dsh-memory-pyramid.git
dsh plugin --profile web add "link:/绝对路径/dsh-memory-pyramid"

验证与卸载

装好重启 dsh web,新建会话开局出现 ### Memory view 段就是生效了;也可以用 dsh --profile web --dump-config 确认 dsh-memory-pyramid 已进合成树。启动日志里还会打印一行数据目录认领信息。

卸载:dsh plugin --profile web remove dsh-memory-pyramid,然后重启 dsh web

想改配置(如 wakeLines):在 profile 的 cordis.patch.yml 里对同一个 id 覆盖,热生效:

- id: memory
  config:
    wakeLines: 192

实际注入(真实会话实拍,模型不用任何工具,直接凭注入的视图作答):

<img src="assets/memory-view.png" alt="实际注入" width="640" />

常见问题

装插件时报 pnpm not found / 装 pnpm 时报目录没有写权限? dsh 靠 pnpm 管理插件,先 npm install -g pnpm。写权限报错常见于 Linux 用系统包管理器装的 Node——装到用户目录即可:npm install -g pnpm --prefix ~/.local,并把 ~/.local/bin 加进 PATH。

记忆到底落在哪? 落在你在 dsh 里打开的那个工作区下的 dsh_memory/。在界面里换一个工作区,记忆也跟着换——一个工作区一个库,跟 dsh 按工作区分会话是同一个道理。

换了工作区,记忆怎么空了? 多半没丢,是另一个项目的库。每个工作区各记各的,这是设计不是故障:A 项目的经历不该出现在 B 项目的上下文里。想让某个工作区读固定那一份,在配置里把 dataDir 填成绝对路径——它压过一切。

peer 警告 @deepseek-ai/cordis missing 要紧吗? 不要紧。cordis 只被类型注释引用、没有运行时 import,dsh 自己带着 cordis。v0.1.1 起已去掉这条声明;旧版本看到可直接忽略。

会话开到一半新记的东西,视图里怎么没有? 默认就是这样:视图只在会话开局注入一次(省注入 token),会话内新写的记忆在工具回执里、模型看得见,新开会话即见全部。想要实时更新,配置里把 liveView 设为 true

配置

默认说明
namespace公共区名字。填了就落在 <工作区>/<名字>/dsh_memory。只收单层目录名。
dataDir完全自定义路径(绝对,或相对工作区根)。填了就压过 namespace。给绝对路径时还会压过工作区——所有工作区读同一份库,想要「一个大脑」时用它。
migratetrue换落点时,自动把工作区里找到的旧记忆整体搬过来。
wakeLines96记忆视图的行数预算。这是阅读预算不是存储预算——随时改,一块摘要都不用重算。
injectWaketrue是否把记忆视图注进开局上下文。关掉后工具照常可用,只是不再自动出现。
packs再多挂几个别的记忆库到看板上当参照,形如 [{name: "示例", dir: "路径"}]一个字节都不写:不记它的用量、不补它的摘要、不给它渲染注入视图。插件已自带四个示例库(见上文),这一项是给你挂自己的。
liveViewfalse会话中途记忆变化时是否实时更新视图。默认关:视图只在会话开局注入一次,会话内新写的记忆走工具回执、新会话开局可见全部。开了之后每次记忆变化都会给会话追加一份最新视图(多花注入 token)。改配置热生效,当前对话下一条消息起按新开关走。

默认落在 <当前工作区>/dsh_memory(不写家目录)。LOG.txt 纯文本只追加——进 git 团队可共享一份经历;TREE/ 是纯缓存,删了不丢事实。目录已存在时:标记对得上就认领(一条不动),对不上就拒绝启动并说明原因。两份记忆绝不会被拼接(记录靠位置寻址,拼接会让所有摘要整体指错),找到多份旧记忆时拒绝启动、交给人裁决。

工具面

工具干什么
memory_note记一条事实。一行,≤280 字节,只追加,永不修改。
memory_summarize交摘要树的维护费:某一块凑满时,写下将来代表它的那一行。
memory_zoom把任意 #a-b 节点打开成它的两个半块——下钻的便宜路子。
memory_recall用正则扫全部事实(from/to 可夹住范围),或读某段原文。命中被截断时如实报出总数。每条都带会话区间锚点。
memory_open顺着一条事实的锚,交回它蒸馏自的那份原文全文。
memory_forget丢掉一块写坏的摘要,排队重写。只动地图,不动领土。

记忆看板

装上之后界面右下角多一个悬浮球,点开是占右半屏的看板——记忆第一次成了人看得见的东西

一座真的塔:一块砖就是一块摘要,最底下一排是逐条事实。亮着的那些正在注入给模型,与模型此刻收到的视图同一份数据、同一套算法,不存在第二个真相。颜色只编码一件事——热度,也就是这条记忆被用到的频次。

<img src="assets/panel-tower.png" alt="塔的全貌:越往上越粗,橘环是此刻正注入的那些" width="740" />

越往上砖越少、每块管的事越多,塔尖一行代表全部。橘色描边的那几块就是此刻进了上下文的——一眼看得出模型开局到底读了哪些。

拉近看,每块砖上写着它代表的那段:

<img src="assets/panel-zoom.png" alt="拉近之后砖上带着摘要文字" width="740" />

底下一条时间轴标出这些记忆横跨的时间,拖得动、缩得放;塔太高时纵向也拖得动。

右下角是当场生效的旋钮:注入行数、每条字节、冻结/实时。

看板走官方给第三方留的正门挂载;没有 web 界面的场景(如 headless)自动缺席,记忆本体照常工作。

点一条记忆,回到它的出处

点一块砖读它的正文。点最底排的一条事实,可以顺着它的出处走回去:

  • 出自对话的,跳回那段对话——每条事实落盘时记着 sessionId 加一段序号区间,所以框住的是完整的一整轮,不是一个点。
  • 出自导入文本的,直接打开那份原文全文。

没有出处的按钮是灰的,不会假装有。

自带四个示例库,装完就有得看

塔在几十条和几千条上完全是两回事——几十条时整库原文全进上下文、摘要层一个块都用不上;上千条时才看得见那座分层的塔。可是刚装上插件的人手里一条记忆都没有。

所以插件随包带了四个现成的库,50 / 100 / 500 / 1000 条各一个,装完打开看板就能在左上角切着看,不用配置、不用下载、不用往你的工作区里拷任何文件。换工作区也照样在。

切过去看到的东西和看自己的库完全一样:同一座塔、同一套卡片、同一份算法算出来的记忆视图。差别自己会跳出来——50 条那个库,视图是 51 行逐字原文,摘要层一块都用不上;1000 条那个,视图 97 行、开头就是 #0-63 这样的粗砖。两边都卡在 96 行预算里,「记忆涨 20 倍、开局要读的行数一行不多」这句话到这里就不用再解释了。

它们全部标着 ⚗ 合成示例:里面的正文是《西游记》,时间戳与热度是算法生成的,不是谁的真实使用记录。这个标记写在库自己身上,拷到哪里都跟着,不会被当成真账读

示例库只读——看板读它们的时候一个字节都不写。也正因为它们住在插件的安装目录里而不是你的工作区里,面板上没有卸载按钮。在示例库上「回到出处」还不通:它们的对话原文虽然就在包里,但没有登记进 dsh,点了不会有反应;在你自己的库上是正常的。

还有一档一万条的,体积太大不随包发,后续放进 Releases 按需下载。想挂任何别的库都是同一个办法:扔进 <你的工作区>/dsh_memory/packs/ 就行,看板会自动认出来,或者在看板上直接填路径。

把已有文本导进记忆

塔有三层:基底是原料,事实是从原料里蒸出来的那一行(≤280 字节),摘要是事实合并而成的粗砖。基底不限字数——一段对话是基底,你手上任何一份文本也可以是。

记忆目录下有个 memory_handoff/ 文件夹,把文件放进去就算上架——没有写入工具,文件夹本身就是入口。md 只是最顺手的格式,纯文本都行。

上架不等于入库:文件放进去只是成了原料,要有人读它、写下一条事实,它才真正进塔。一份原料对一条事实,严格一对一,所以顺着任何一条事实都能唯一地回到它的出处。

写下的每条事实都带着「出自哪一份」的锚,memory_open 顺着锚交回原文全文:一行事实说不清的细节,随时回得去。

上架时记下字节数与指纹。文件事后被改过,打开时会当场点破,而不是照吐给你。

它怎么做到不随记忆量变慢

1. 定宽记录 ⇒ 位置即身份。 第 N 条永远住在第 N×384 字节,读一条是一次 pread。记录里不存序号——顺带让多进程并发追加天然正确。 2. 摘要树也定宽,每层一个稠密前缀文件。 「这层做到哪了」=文件长度 ÷ 288,一次 stat。待办是推导出来的,没有可以失同步的队列。 3. 压缩工作量恒定。 小块(≤16 条)读原文压;大块只读两个半块的摘要。写第 10 层和写第 1 层一样便宜,旧摘要永不返工。 4. 阅读预算固定,从不截断。 二分搜索找到恰好塞进预算的粗细;装得下时一点不压。改预算不重算任何摘要。

不打断 prompt cache

纪律段(静态)住在系统提示词里;记忆视图(写一条就变)住在动态上下文里。 分界只有一条:保证上下文缓存命中。

摘要会错,这是设计的一部分

塔尖是多代传话游戏,语义会漂移。所以原文永存(地图坏了不等于领土沉了)、memory_forget 是正式重画通道、摘要缺失时视图就地拆细直到落回原文——绝不显示一块不存在的摘要。

Roadmap

  • [x] v0.1 串行版:五件工具、区间锚点、缓存安全注入、OptMem TREE/ 字节级兼容
  • [x] v0.1.1 注入开关:视图默认只在会话开局注入一次(liveView 可换回实时更新,热生效)
  • [x] 记忆看板:金字塔层级视图 + 时间轴,点一条记忆跳回产生它的那段会话,自带四个示例库可对照
  • [x] 文本入塔:把已有 md 等任意文本放进 memory_handoff/ 当基底,事实带锚、随时回得去原文
  • [ ] 注入通道完善:增量动态注入——按每个会话已见过的水位,只注入它没见过的部分
  • [ ] 跨工作区统一大脑:多个工作区的库合并成一个视图看
  • [ ] 金字塔教程:配流程图与截图,讲清楚这座塔怎么建、怎么读、怎么错、怎么修
  • [ ] 并行结算:写记忆交给专职分身,主线零打扰;空闲时扫未认领的对话流水补漏
  • [ ] OptMem LOG.txt 迁移转换器(TREE/ 可原样搬)

已知边界

  • 多进程共写支持且无锁;但子 agent 不该写记忆(它看不见已记了什么),目前靠提示词约定,未在代码强制。
  • 一个工作区一个库,多个库还不能合成一个视图看。 想跨项目共用一份记忆,目前只能把 dataDir 填成同一个绝对路径。
  • 早期版本,注入形态还在演进(见 Roadmap 第一条)。完整的可靠性结论,留给后续实际测试与 issues 反馈来检验——发现问题请开 issue。

License

本项目基于 [MIT 许可证](./LICENSE)开源。