让 DeepSeek Harness(dsh)Agent 自进化的 Cordis 插件。
它把 CowAgent 五层自进化机制逐层映射到 dsh 的扩展点上——让 Agent 越用越懂你、越用越少犯错。记忆在对话中自然积累,复盘在空闲时自动发生,核心记忆在夜间被蒸馏精炼,一切改动都可追溯、可回滚。
设计原则:改得克制、改得可控。每一次自主修改都隔离执行、留有备份、可被回滚。
| 层级 | 做什么 | 何时触发 | dsh 扩展点 |
|---|---|---|---|
| 1 基础记忆 | 记忆与知识维护 | 对话进行中 | systemPrompt.section() 注入 MEMORY.md;tools.register() 暴露记忆/知识工具 |
| 2 上下文总结 | 把压缩摘要落地到天级记忆 | 上下文超限时 | 监听 session/event 的 compaction/summary,写入当日记忆 |
| 3 会话复盘 | 从对话中提炼记忆、固化技能、沉淀任务 | 会话空闲后 | agent/status 空闲 + 轮次阈值 → runMaintenance() 隔离执行 → followup() 通知 |
| 4 梦境整理 | 蒸馏天级记忆为精炼核心记忆 | 每天定时(默认 23:55) | 插件内定时器 → 蒸馏 + 写梦境日记 → inject() 静默注入 |
| 5 源码自更新 | Agent 改写自身源码 | 被动/主动 | 默认关闭。rewrite_self 工具 + /self-restart 自检命令 |
npm install @deepseek-ai/dsh-evolution需同时安装下列 peer 依赖(dsh 运行时框架):
@deepseek-ai/cordis
@deepseek-ai/dsh-agent
@deepseek-ai/dsh-commands
@deepseek-ai/dsh-llm
@deepseek-ai/dsh-session
@deepseek-ai/dsh-system-prompt
@deepseek-ai/dsh-tools
在 profile 的 cordis.patch.yml 里挂载插件(完整示例见 cordis.yml.example):
- insert:
- id: evolution
name: '@deepseek-ai/dsh-evolution'
config:
enabled: true挂载后 Agent 自动获得记忆能力。对话中它会主动记录值得长期记住的内容;空闲 10 分钟后自动复盘;每晚 23:55 自动整理核心记忆。你也可以随时手动驱动:
/evolution status # 查看当前状态
/evolution reflect # 立即复盘
/evolution dream # 立即梦境整理
/evolution undo 3 # 回滚最近 3 次重写
插件向 Agent 暴露以下工具,由模型在对话中自主调用:
| 工具 | 作用 |
|---|---|
record_memory |
记录持久事实、偏好、决策或教训(core 每次注入提示词 / daily 当日日志) |
read_memory |
按关键词检索核心记忆与天级记忆 |
record_knowledge |
将可复用知识存为 Markdown 笔记 |
search_knowledge |
按关键词检索知识库 |
rewrite_self |
改写 srcDir 内的源码文件(默认关闭,路径隔离 + 自动备份) |
| 命令 | 说明 |
|---|---|
/evolution status |
展示记忆条数、各层开关与运行参数 |
/evolution reflect |
立即触发一次复盘 |
/evolution dream |
立即触发一次梦境整理 |
/evolution undo [N] |
回滚最近 N 次破坏性重写(默认 1) |
/self-restart |
轻量自检(仅在第 5 层开启时可用) |
dsh-evolution/
├── package.json # 包元信息
├── tsconfig.json # 独立 TS 配置(ESM)
├── cordis.yml.example # 挂载示例
└── src/
├── index.ts # 插件入口:Config schema + apply(),串起五层
├── memory.ts # MemoryStore:核心/天级记忆、知识库、备份、审计日志、undo
├── llm.ts # 一次性模型调用(askModel / resolveRoute)
├── tools.ts # 第 1 层:记忆/知识工具
├── reflect.ts # 第 3 层:复盘引擎(触发 + 执行 + 通知)
├── dream.ts # 第 4 层:梦境蒸馏
├── skills.ts # 技能落盘(写入 .dsh/skills)
├── selfupdate.ts # 第 5 层:源码自更新(默认关闭)
└── commands.ts # /evolution 命令注册
所有记忆落在工作空间的项目根目录(最近含 .git 的祖先,否则为 cwd)下:
<projectRoot>/
├── .dsh/
│ ├── skills/ # 技能目录(rank-100 本地发现根)
│ └── evolution/ # 记忆根(可配 memoryDir)
│ ├── MEMORY.md # 核心记忆,每次会话注入提示词(≤ maxCoreMemories 条)
│ ├── memory/ # 天级记忆 YYYY-MM-DD.md
│ ├── knowledge/ # Markdown 知识库
│ ├── dream/ # 梦境日记
│ ├── TASKS.md # 复盘沉淀的未完成任务
│ ├── change-log.md # 审计日志(每次自主改动一行)
│ └── backups/ # 改动前备份(undo 用)
{
enabled: true,
memoryDir: '.dsh/evolution', // 记忆根(相对项目根)
skillsDir: '.dsh/skills', // 技能输出目录
maxCoreMemories: 50, // 核心记忆条数上限
reflect: {
enabled: true,
idleMs: 600000, // 空闲多久后触发复盘(默认 10 分钟)
minTurns: 6, // 至少积累多少轮才复盘
maxTranscriptChars: 60000, // 复盘时发送给模型的上下文预算
},
dream: {
enabled: true,
at: '23:55', // 每天梦境整理时间(本地时区 HH:MM)
maxCoreMemories: 50,
},
sourceRewrite: {
enabled: false, // 源码自更新,默认关闭
srcDir: '.', // 允许改写的源码目录(路径隔离边界)
},
model: {
provider: '', // 可选:复盘/梦境专用 provider 覆盖
model: '', // 可选:专用 model 覆盖(留空则借用 agent 自身路由)
},
}所有自主改动遵循「隔离执行 → 备份 → 留痕 → 可回滚」的链路:
- 隔离执行:复盘跑在
agent.runMaintenance()内,不开新轮、不污染主对话;模型调用是一次性ctx.llm.stream()。 - 变更可回滚:每次破坏性重写(核心记忆、技能、知识、源码)先备份旧文件到
backups/,再写入,并记一行到change-log.md;/evolution undo [N]可回滚最近 N 次重写。 - 变更可追溯:
change-log.md记录时间戳 rewrite|append 文件路径。 - 未变更则不打扰:复盘/梦境只在确实有改动时才通知(复盘用
followup()主动推送,梦境用inject()静默注入)。 - 路径隔离:
rewrite_self只能写srcDir之内的文件,越界直接拒绝。 - 绝不空覆写:梦境在没有当天新日记、或模型返回空核心记忆时直接跳过,不会用空内容覆盖已有核心记忆。
- 第 2 层依赖部署里已挂载的
dsh-compaction-basic(ctx.compaction缝);本插件只做「总结落地到天级记忆」,不做重复压缩。 - 技能发现依赖
dsh-skill-filesystem(dsh 内置本地 provider,扫描.dsh/skills)。本插件只写文件、不直接依赖ctx.skills,因此即便技能能力未挂载,记忆/复盘/梦境仍可正常工作。 - 第 5 层源码自更新默认关闭,且只做「路径隔离 + 备份 + 留痕 + 轻量自检」;完整的运行自检(导入/类型检查)与进程接力重启属于部署层(对应 CowAgent 的
cow self-restartCLI),本插件不越权实现。 - 一次性模型调用默认借用 agent 自身的
provider/model路由;无活跃 agent 且未配置model覆盖时,复盘/梦境会静默跳过。 - 天级记忆的追加(
appendLine)不做备份(追加是低风险可加性操作),undo只回滚破坏性重写。
npm install
npm run build # tsc 编译到 lib/
npm pack # 生成可发布的 tarball
npm publish # 发布到 npm(access: public)MIT