dsh-codex-memories
Verified@lushdawn/dsh-codex-memories · v0.1.1 · MIT
Codex-style file-based long-term memory for DSH: two-stage LLM extraction, consolidated MEMORY.md handbook, prompt-injected memory summary, and search/read/list/note tools.
Install
dsh plugin add @lushdawn/dsh-codex-memories Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-codex-memories
Codex 风格的长期记忆插件,为 DSH 提供跨会话的持久记忆。
它复刻了 Codex 记忆系统的完整两阶段结构:先把每个会话提取成结构化记忆,再合并成一份可检索的手册,并在每次对话前把精炼摘要注入上下文。
它解决什么问题
DSH 的会话是彼此隔离的。上一次你纠正过的偏好、踩过的坑、验证过的命令,下一次不会自动出现,除非你再说一遍。这个插件让 Agent 自己记住:
- 你说过一次的工作方式,下次默认照做
- 某个仓库里哪条命令能跑、哪里是坑
- 某个问题的症状、原因、修法
工作原理
会话结束(空闲 N 秒)
└─ Stage 1 每个会话用模型提取 → session_summaries/<slug>.md + raw_memories.md
└─ Stage 2 累积到阈值后用模型合并 → MEMORY.md + memory_summary.md
└─ 每次对话前,memory_summary.md 注入模型上下文
数据层是纯 Markdown,可以自己打开、编辑器改、git 管版本;index.json 记录提取缓存与合并水位。
安装
dsh plugin --profile web add @lushdawn/dsh-codex-memories
本地开发:
dsh plugin --profile web add link:<本目录绝对路径>
装好后重启 DSH,或让 live profile 热加载。
使用
对话里输入命令:
| 命令 | 作用 |
|---|---|
/memory status |
看记忆根目录、已提取会话数、待合并数、上次提取/合并时间 |
/memory show |
打印当前的 memory_summary.md |
/memory extract |
立即提取当前会话(不等空闲定时器) |
/memory backfill |
扫描历史会话,补齐启动前没提取过的 |
/memory consolidate |
立即把待合并记忆合并进 MEMORY.md |
/memory forget <sessionId|all> |
丢弃某个会话的提取记录(手册内容保留) |
/memory on / off |
当前进程内开关自动提取 |
模型侧工具(dedicatedTools 开启时):
| 工具 | 作用 |
|---|---|
memory_search |
按关键词在记忆文件里做行级检索,支持 any / all / on_same_line |
memory_read |
按行范围读某个记忆文件 |
memory_list |
列出记忆目录清单与待合并状态 |
memory_note |
写一条 ad-hoc 笔记(模型唯一被允许的写路径) |
模型被要求用 MEMORY.md:12-14|note=[...] 的格式标注它用到了哪段记忆。
配置
在 profile 的 patch 里覆盖,全部字段都有安全默认值:
- insert:
- id: dsh-codex-memories
name: dsh-codex-memories
config:
storageDir: '' # 默认 $DSH_HOME/memories
generate: true # 是否自动提取
use: true # 是否注入 summary
dedicatedTools: true # 是否暴露 memory_note
model: '' # 通用路由,如 deepseek-official/deepseek-flash
extractModel: '' # Stage 1 路由,留空回退 model
consolidationModel: '' # Stage 2 路由,留空回退 model
idleSeconds: 120 # 会话空闲多久后提取
maxSessionsPerRun: 3 # 单轮最多提取几个会话
maxSessionAgeDays: 30 # 超过这个天数的会话不再提取
consolidationThreshold: 2 # 攒够几个新记忆就合并
maxInjectChars: 9000 # 注入上下文的 summary 字符上限
minSessionMessages: 4 # 少于这么多条消息的会话跳过
extractMaxTokens: 8000
consolidateMaxTokens: 16000
model 留空时,插件读取当前默认模型;再取不到就退回 deepseek-official/deepseek-flash。
数据布局
$DSH_HOME/memories/
├── MEMORY.md # 持久手册:按 Task Group 组织的检索层
├── memory_summary.md # 注入上下文的精炼层,首行必须是 v1
├── raw_memories.md # Stage 1 的机械合并,按会话 id 升序
├── session_summaries/<slug>.md # 每个会话一份结构化摘要
├── extensions/ad_hoc/notes/ # 你或模型写的补充笔记
└── index.json # 提取缓存、作业记录、合并水位
这些文件都是你的。可以随时 cat、编辑、进 git、或者整个目录备份迁移。
成本与隐私
- 会花 token:Stage 1 每个会话一次模型调用,Stage 2 每次合并一次。默认只提取消息数 ≥ 4 的会话,每次最多 3 个,攒够 2 个才合并。
- 只在本地写文件:插件不联网,除了它调用的模型 API。
- 会写进模型上下文:
memory_summary.md每次对话都会被注入,所以它被刻意限制在maxInjectChars以内。 - 可审计:所有产出都是可读的 Markdown,你能看到 Agent 到底记住了什么。
- 模型不会被允许直接改手册:它只能写 ad-hoc 笔记,合并由 Stage 2 统一完成,避免记忆被单轮对话污染。
与 Codex 记忆系统的对应关系
本插件的行为规格来自对 Codex 本体的逆向分析(~/.codex/memories 的数据形态 + codex.exe 内的提示词模板)。对应表:
| Codex | dsh-codex-memories |
|---|---|
~/.codex/memories/ |
$DSH_HOME/memories/ |
MEMORY.md / memory_summary.md / raw_memories.md |
同名同格式 |
rollout_summaries/*.md |
session_summaries/*.md |
memories_1.sqlite(stage1_outputs / jobs / consolidation_progress) |
index.json |
Stage 1:Analyze this rollout and produce JSON ... |
lib/prompts.js 的 PHASE1_TEMPLATE |
Phase 2:Memory Writing Agent: Phase 2 (Consolidation) |
lib/prompts.js 的 PHASE2_TEMPLATE |
| 使用侧:决策边界 + 5 步快速检索 + 引用格式 | lib/prompts.js 的 USAGE_TEMPLATE |
extensions/ad_hoc/instructions.md |
同名同内容 |
| rollout 扫描补齐 | /memory backfill + 启动时自动扫描 |
max_rollouts_per_startup 等 12 项配置 |
见上表(命名已适配 DSH) |
详细机制与逆向证据见 docs/mechanism.md。
已知边界
- Stage 2 让模型一次产出两份完整文档。手册很大时,单次合并可能触及输出上限;此时会保留旧文件并报错,不会写坏。
- 自动提取依赖进程存活:会话空闲窗口内进程退出,则这次提取由下次启动的
backfill补齐。 - 不做语义检索,只有关键词/行级检索(与 Codex 一致)。记忆规模很大时,请靠
MEMORY.md的keywords路由。
参与
欢迎提 issue 和 PR,先看 CONTRIBUTING.md。安全问题请按 SECURITY.md 私下报告,不要开公开 issue。版本变更记录在 CHANGELOG.md。
License
MIT