# dsh-memory-evolve

> Injects five-track layered memory into DSH (global/user/project/project-key+git-branch/daily), self-evolving backend review, todo/skills/prompt/canvas management, COI external AI agent scheduling, and cross-device memory sync.

## Metadata

- Author: [@csyangwen](https://github.com/csyangwen)
- Repo: <https://github.com/csyangwen/dsh-memory-evolve.git>
- GitHub: [csyangwen/dsh-memory-evolve](https://github.com/csyangwen/dsh-memory-evolve)
- Stars: 205
- Language: JavaScript
- License: [MIT](https://spdx.org/licenses/MIT.html)
- Topics: `deepseek-harness`, `dsh`, `dsh-plugin`
- Forks: 14
- Open Issues: 2
- Last push: 2026-08-19T15:34:39.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add github:csyangwen/dsh-memory-evolve
```

## Wiki

## 一句话定位
为 DeepSeek Harness 注入一套「越用越懂你」的 AI 长期记忆与协作扩展：让 AI 跨会话、跨项目、跨设备记住你是谁和项目里定下的事，附带待办/技能/提示词/画板管理、外部 AI 代理调度、会话广播与房间协作等十几个可选子模块，覆盖 WebUI 管理面板。

## 核心能力
- 五轨分层记忆自动注入（用户档案 / 全局事实 / 项目关键记忆+git 分支过滤 / 项目日志 / 每日日志），写入与读取均通过 `memory` 工具
- AI 提议-用户确认双轨写入：key/user/memory 自动进待确认队列，由记忆 Tab「待确认」中采纳或拒绝
- 四轨待办管理（生活 / 工作 / 项目 / 每日），支持到期提醒、状态筛选与四象限，按当前工作目录自动隔离项目待办
- 技能自我进化：后台审查可自动把反复踩坑的方法论固化为技能，由 `skill_manage` 工具创建/编辑/禁用
- 外部 AI 代理调度（COI）：把重活派给 kimi/codex/grok/hermes 等 CLI 代理，后台异步执行、结果自动沉淀回记忆
- 多会话广播房间 + 工作区冲突协调：让一组并行会话拥有房间消息、文件占用锁与冲突告警
- 提示词库、无限画板（素材收集）、会话书签与任意轮分支、记忆跨设备同步（git 仓库级别）、会话评审员（独立模型 per-session 持续评审）

## 技术实现
- **语言**: JavaScript（Node.js ESM；`src/client/` 为 TypeScript/TSX，`src/` 通过 `scripts/build.mjs` 编译到 `lib/`）
- **关键依赖**: 零运行时依赖（仅使用 Node 内置 `node:fs` / `node:path` / `node:child_process` / `node:crypto` / `node:os` / `node:url`）；客户端通过 `dsh.client.inject` 注入 `@deepseek-ai/dsh-client-runtime`
- **架构模式**: 标准 Cordis 插件（`export function apply(ctx, rawConfig)` + `inject` 列表），宿主端通过 `cordis.patch.yml` 的 bundle patch 自动注册 `dsh-memory-evolve` 一行；每个可选子模块都遵循「独立开关 + 独立存储 + 运行时同步装配/卸载」纪律
- **入口文件**: `lib/index.js`（host 端插件入口，541 行配置 + 678 行 apply 装配）；`lib/client.js`（浏览器端，含 41 个 React 组件）

## 适用场景
日常和 DSH 协作但希望 AI 跨会话记住项目约定的开发者：今天定下的架构决策、踩过的坑、用户偏好，下次开新会话直接问 AI 就能衔接；同时希望把多会话协作、外部 AI 派单、跨设备项目记忆这类「操作复杂但常规」的扩展能力收在一个插件里用 WebUI 集中管理，而不用单独装十几个小插件。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DeepSeek Harness | 未声明 | package.json 无 engines/peerDependencies；包内自带 cordis.patch.yml 自动注册；部分能力（会话图片附件/图片查询）描述中要求 260810+ 快照 |
| Node.js | 未声明 | 仅使用 Node 内置模块，无 perf_hooks / 实验性 API；ESM + `node:` 前缀 import 建议 Node 22+ |
| 平台 | 跨平台 | 本地文件搜索走 macOS `mdfind` / Windows `es.exe` / Linux `rg` 或 Node 遍历兜底；`toWindowsPath` 用 WSL `wslpath` 转换 |
| 原生模块 | 无 | 纯 Node 内置，无 node-gyp / native binding |
| 可选：DShell 之外的能力 | 视子模块而定 | COI 需本机已装对应 CLI（kimi/codex/grok/hermes）；通知/渠道直发需对应渠道插件（dsh-feishu 等）已安装并启用 |

## 安装方式
```bash
dsh plugin --profile web add github:csyangwen/dsh-memory-evolve
```

## 配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| `memoryDir` | 路径 | 记忆与待办存储根目录 | `<DSH_HOME>/memories`（DSH_HOME 默认 `~/.dsh`） |
| `skillDir` | 路径 | 技能库目录 | `~/.agents/skills` |
| `reviewEnabled` | 布尔 | 开启回合内记忆审查（每 N 轮自动提炼记忆/技能） | `false` |
| `reviewInterval` | 整数 | 审查触发间隔（用户回合数） | `5` |
| `reviewMode` | 字符串 | 审查产出模式：`suggest`（进待确认）/ `auto`（直接写入） | `suggest` |
| `searchDocsMode` | 枚举 | 本地文件搜索四档：`all` / `filename` / `content` / `off` | `null`（运行时推断） |
| `coiEnabled` | 布尔 | 开启外部 AI 代理调度（kimi/codex/grok/hermes） | `false` |
| `broadcastEnabled` | 布尔 | 开启会话广播房间 | `false` |
| `sessionEnabled` | 布尔 | 开启会话编排（程序化创建/唤醒 DSH 会话） | `false` |
| `sessionSearchEnabled` | 布尔 | 开启跨工具历史会话搜索（当前支持 Codex） | `false` |
| `promptsEnabled` | 布尔 | 开启提示词库 | `false` |
| `modelsEnabled` | 布尔 | 开启插件侧模型配置 Tab | `false` |
| `uiSettingsEnabled` | 布尔 | 开启 DSH UI 小功能（会话列表筛选等） | `false` |
| `bookmarkEnabled` | 布尔 | 开启会话书签与任意轮分支 | `false` |
| `advisorEnabled` | 布尔 | 开启会话评审员（独立模型持续评审） | `false` |
| `syncEnabled` | 布尔 | 开启项目记忆跨设备同步 | `false` |
| `canvasEnabled` | 布尔 | 开启无限画板 | `false` |
| `notifyEnabled` | 布尔 | 开启 IM 渠道通知（飞书/QQ/微信/企微） | `false` |
| `channelSendEnabled` | 布尔 | 开启 IM 渠道直发 | `true` |
| `sessionImageQueryEnabled` | 布尔 | 开启本会话图片查询工具 | `false` |
| `keyProgressiveDisclosure` | 枚举 | 项目关键记忆注入模式：`auto` / `off` / `on` | `off` |
| `keyFullInjectThreshold` | 整数 | `auto` 模式下条目数 ≤ 此值触发全量注入 | `3` |
| `keyFullInjectCharLimit` | 整数 | `auto` 模式下总字符数 ≤ 此值触发全量注入 | `1500` |
| `keyBranchFilter` | 布尔 | 按 git 分支过滤注入的项目关键记忆 | `true` |
| `coiRetentionDays` | 整数 | COI 任务留档保留天数 | `90` |
| `coiTaskTimeoutMs` | 整数 | COI 任务默认超时（毫秒） | `43200000`（12 小时） |
| `advisorProvider` | 字符串/null | 评审模型供应商（null=继承当前会话） | `null` |
| `advisorModel` | 字符串/null | 评审模型 id（null=继承当前会话） | `null` |
| `advisorCallTimeoutMs` | 整数 | 单次评审调用超时（毫秒） | `60000` |
| `advisorMaxMessages` | 整数 | 评审输入上下文窗口上限（0=无上限） | `60` |
| `advisorSteerSeverities` | 字符串数组 | 触发实时提醒的严重度（`nit` / `concern` / `blocker`） | 全量 |

> 上表为常用项的子集，完整配置见 `lib/index.js:69-245` 的 `DEFAULTS` 对象；所有运行时可改项（`RUNTIME_KEYS`）既可在 `cordis.patch.yml` 静态配置，也可在 Web 设置面板即时切换。

## 常见问题

**Q: 装上后什么都没发生是正常的吗？**

A: 正常。本插件核心能力（五轨记忆 / 待办 / 技能管理 / 记忆同步补丁）默认就生效；其他十几个子模块（外部 AI 调度、会话广播、画板、评审员等）默认关闭，需要到「Memory Evolve 设置 → 配置」打开对应开关才会出现 Tab 和工具。

**Q: 提示「duplicate loader entry id」启动失败怎么办？**

A: 你的 profile patch 里还残留旧版本的手动 `insert` 行。包内 `cordis.patch.yml` 已经把 `dsh-memory-evolve` 写入 bundle patch 自动注册，重复 insert 同 id 会让加载器报错。删除 `~/.dsh/profiles/<name>/cordis.patch.yml` 里这一行即可。

**Q: 五轨记忆会塞爆上下文吗？**

A: 不会。注入策略是「只注入低频稳定轨」——用户档案 / 全局事实 / 项目关键记忆（按 git 分支过滤）实时读取并以 user-role 尾部消息注入；项目日志与每日日志不注入（每回合增长会破坏前缀缓存），改为按需读取 + 快照中固定提示要求模型每轮收尾调用 `memory` 工具写入。`keyProgressiveDisclosure` 开启摘要模式后，关键记忆也按需 `expand` 加载全文。

**Q: 记忆同步会不会把代码也同步过去？**

A: 不会。同步只覆盖 `memoryDir` 下的项目记忆与全局记忆（按轨分别开关），代码文件不会被读取或写入；项目轨默认把同步数据放到项目代码仓库的专属分支（不污染任何代码分支），全局轨需要单独配置一个共享记忆仓库。

**Q: 用了一段时间后发现记忆变得很乱，怎么整理？**

A: 记忆 Tab 提供「归档」入口——把暂时不用的全局记忆 / 用户档案 / 项目关键记忆条目移到 `*-archive.md`（不注入、可一键转回主轨）。删除失败时会先归档再删除，宁可重复不可丢失；批量归档/采纳/拒绝都有按钮，不需要逐条手动操作。

**Q: 跟官方插件冲突怎么办？**

A: 本插件已合并原独立插件 `dsh-skills-manager` / `dsh-skill-browser` 的功能。从旧版本升级前必须先卸载旧插件（删除 profile patch 里的 insert 行 + 删除 `~/node_modules/@dsh-local/skills-manager` 软链），否则旧插件客户端调用 DSH 已移除的 `ui-slots.deferRegistration` 会让 Web 整页不可用。

**Q: 会话评审员（advisor）会干扰主 AI 吗？**

A: 默认完全沉默（`advisorEnabled=false`）。开启后评审员只观察你界面上看到的对话文本（不含思考/工具调用），记入面板日志；仅当严重度达到 `nit` / `concern` / `blocker` 阈值、且配置允许时，才会以用户指令形式注入主会话触发即时纠偏——你可以在评审面板里即时打断或调整它。

## 上手难度
进阶 — 核心五轨记忆零配置即可生效，但插件聚合了十几个独立子模块并提供数十项配置项，想把「外部 AI 调度 / 跨设备同步 / 评审员 / 广播房间」这些高阶能力串成完整流水线需要读懂模块边界与开关依赖（参见 README 场景章节）。

## 已知问题与限制
- spawn 出来的子会话在新会话无历史 header 时仅继承发起会话的 `provider/model` 配置；GUI 改模型等主动切换机制在 `lib/session-orch.js:549` 标注为后续再完善
- 会话评审（advisor）通过 `sessionTitle.get(session)` 读取会话名称；离线/已归档会话 `session.events` 不存在时必须先做 `agent?.session` 存在性检查（`lib/index.js:2104-2106`），否则会因传 undefined 抛出 TypeError 导致评审流静默失败
- 画板（canvas）遍历节点时同样依赖 `sessionTitle.get`；曾因缺失判空导致整个 GET 500、前端刷新后空板，已在 `lib/index.js:2027-2042` 加固
- 会话搜索（`sessionSearchEnabled`）当前只支持 Codex 源（`~/.codex/sessions` + `archived_sessions` 明文 JSONL）；DSH 会话（zstd 拼接帧）暂不实现
- 仅同进程内的会话可被 `de_session` 程序化唤醒；跨实例 / 跨机器无法程序化唤醒（`README-详细说明.md:52`）
- dat 同步走的 git 仓库地址若使用公开项目仓库，记忆默认存到代码仓库的专属分支；需要把记忆与代码彻底隔离时，必须显式配置一个独立的共享记忆仓库

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [dsh-memory-evolve](https://deepseek-plugin.org/plugins/csyangwen/dsh-memory-evolve)
Wiki generated by AI (model: `MiniMax-M3`)
