dsh-kymemory
Verifieddsh-kymemory · v0.2.0 · MIT
Layered local memory for DeepSeek Harness: a Markdown index auto-injected into the system prompt, a route layer read on demand, and evidence files for detail. Pure files, zero runtime dependencies.
Install
dsh plugin add dsh-kymemory Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-kymemory
给 DeepSeek Harness 的三层本地记忆:索引常驻系统提示、路由层按需读取、证据层兜底检索。纯 Markdown 文件,零运行时依赖,数据可读可改可版本控制。
English | 中文
为什么
DSH 的会话之间默认没有记忆:每次开新会话,agent 都从零开始。写进 AGENTS.md 的内容虽然每次都注入,但它是静态的、越长越贵,而且不会自己积累。
本插件把记忆拆成三层,按「先便宜地看一眼,需要再往下翻」的顺序加载——和翻书先看目录、再看章节、最后查脚注一个道理:
┌─ memory_summary.md ──────┐ 索引层:有哪些主题 ← 自动注入系统提示(≤4KB)
│ ## What's in Memory │
└──────────────────────────┘
↓ memory_recall
┌─ MEMORY.md ──────────────┐ 路由层:一条条事实 ← 按任务族读取
│ ## infra │
│ - 2026-10-18 Tailscale… │
└──────────────────────────┘
↓ memory_search
┌─ summaries/*.md ─────────┐ 证据层:命令、输出、复现 ← 全文检索
└──────────────────────────┘
索引层由插件自动注入系统提示,不需要 agent 记得去读文件;索引内容每次组装 prompt 时实时重读,用编辑器改完下一轮就生效。
安装
dsh plugin --profile web add dsh-kymemory
装完重启 dsh web 生效。插件自带 cordis.patch.yml,会自动挂载自己。
快速开始
装完重启 DSH,然后开一个新会话说:
记住:这个项目用 pnpm,不用 npm
agent 会调用 memory_save 把这条写进记忆。下次新开会话直接问:
我们这个项目用什么包管理器?
它会先读系统提示里自动注入的索引,命中 #env,再用 memory_recall env 取到细节——不需要你提醒它去查。
想检查记忆有没有被养坏:
给我的记忆做个体检
会调用 memory_doctor,报出重复任务族、孤儿证据文件、索引超限、缺日期条目等结构问题。
配置
在 profile 的 cordis.patch.yml 里追加配置块(全部可省略,默认值即 ~/.dsh/memory 布局):
- id: dsh-kymemory
name: dsh-kymemory
config:
root: '~/.dsh/memory' # 记忆根目录,支持 ~
injectIndex: true # 是否自动注入索引
order: 150 # 注入段落的排序权重
enqueueOnDispose: true # 会话关闭时登记到 pending.jsonl
maxIndexBytes: 4096 # 索引注入的硬上限(字节,超出截断)
summaryFile: 'memory_summary.md'
routeFile: 'MEMORY.md'
evidenceDir: 'summaries'
# 自动捕获(0.2.0)
autoCapture: 'inbox' # 'inbox' 收集候选;'off' 关闭
captureFrames: 300 # 从尾部解压多少帧
captureMaxChars: 4000 # 单个候选的正文上限
captureMinMessages: 2 # 少于这么多条用户消息的会话直接跳过
captureThrottleMs: 60000 # turn/end 增量捕获的节流窗口
sessionsRoot: '~/.dsh/sessions'
工具
装好后 agent 多出五个原生工具:
| 工具 | 作用 |
|---|---|
memory_search |
跨路由层与证据层检索关键词,返回文件名、行号与命中行 |
memory_recall |
取某个任务族的全部条目 |
memory_save |
追加一条带日期的记忆到指定任务族 |
memory_groups |
列出所有任务族及条目数 |
memory_stats |
规模自检:索引行数/字节(含上限判定)、路由层统计、证据文件数 |
memory_doctor |
记忆体检:重复任务族、索引超限、孤儿证据、缺日期条目、失效路由、重复条目 |
memory_forget |
删除一条记忆(内容片段或行号,只在本任务族内生效) |
memory_archive |
把一条记忆移进 archive/,保留可回溯性 |
memory_pending |
查看待整理的会话队列(pending.jsonl) |
memory_curate |
归档并清空待整理队列,给下一批让路 |
memory_inbox |
查看自动捕获的候选素材;传 file 读取内容 |
memory_promote |
把已提炼入库的候选文件移进 inbox/archive/ |
目录布局
~/.dsh/memory/
├── memory_summary.md 索引层(建议 ≤80 行 / 4KB)
├── MEMORY.md 路由层,按 `## <任务族>` 组织,条目以日期开头
├── summaries/ 证据层,单条细节超过 5 行时单独成文
├── archive/ 过时内容归档,不直接删
└── pending.jsonl 会话关闭时自动登记的待整理队列(插件与整理脚本共用)
条目约定:- YYYY-MM-DD 内容,一行一条,可独立读懂。
与手工方案的关系
这套布局和「自己建目录 + 在 AGENTS.md 里写读取规则」完全兼容——数据格式一样,装上插件只是把三件事接管了:
- 索引不用再靠协议提醒 agent 去读,改成注入;
- 读写不用再
bash调脚本,改成原生工具; - 会话关闭不用再外挂 hook 配置,改成内置事件监听。
已有记忆目录可以直接指过去,无需迁移。
和别的记忆插件的区别
- 不做向量检索:靠 Markdown 的目录 + 关键词,结果可解释、可
git diff。 - 不做后台自动抽取:写入由 agent 在会话中主动发起,或由你自己的定时任务驱动。
- 不绑定模型:记忆是文件,换个 agent 也能读。
开发
node --test test/store.test.mjs test/plugin.test.mjs
测试覆盖存储层与插件装配(用 mock ctx 验证工具契约、注入段落、事件处理)。
License
MIT