# dsh-auto-memory

> 为 DSH Web GUI 提供三层自动记忆引擎：每轮对话自动沉淀、关键词检索与跨工具记忆继承，含可视化面板与日历视图。

## Metadata

- Author: [@Aik358](https://github.com/Aik358)
- Repo: <https://github.com/Aik358/dsh-auto-memory.git>
- GitHub: [Aik358/dsh-auto-memory](https://github.com/Aik358/dsh-auto-memory)
- Stars: 23
- Language: JavaScript
- License: [BSD-3-Clause](https://spdx.org/licenses/BSD-3-Clause.html)
- Homepage: <https://www.npmjs.com/package/@a9i5k4/dsh-auto-memory>
- Topics: `deepseek-harness`, `dsh`, `dsh-plugin`, `dsh-plugins`, `memory`, `npm`, `plugin`
- Forks: 1
- Open Issues: 2
- Last push: 2026-08-21T07:04:12.000Z
- Added: 2026-08-20T00:00:00.000Z

## Install

```bash
dsh plugin --profile web add @a9i5k4/dsh-auto-memory
```

## Wiki

## 一句话定位
为 DeepSeek Harness (DSH) Web GUI 提供集中式三层自动记忆：用户级规则、项目笔记与每日日志都由插件自动写入、自动注入、自动检索，并能继承 CodeBuddy / Claude Code / Codex 等其他 AI 工具留下的记忆。

## 核心能力
- 自动注入记忆上下文：每次组装系统提示词时，把用户规则、项目笔记、最近一天日志、反思精华与未完成日历事项按需拼到末尾，让模型在回复前最后读到记忆纪律
- 每轮对话自动沉淀：每轮对话结束后由子代理判断本轮价值，写入今日日志（标记 `[自动沉淀]`），长期决策升格到项目笔记、跨项目规则升格到用户级记忆，寒暄轮自动跳过
- 主动日历与提醒：AI 从对话中自动提取 deadline、约定、任务节点写入日历，区分重要/紧急四象限颜色，并在之后会话中赶在时间到达前提醒
- 跨工具记忆继承：自动检测并接入 WorkBuddy / CodeBuddy / Claude Code / Codex 等其他 AI 工具的记忆（只记路径不复制内容，按需读取）
- 可视化与设置：侧边栏「记忆」入口提供 Overview / Logs / Notes / Reflections / Connect / Calendar / Search 七个面板，AI 写时段问候、三级抽屉总结、液态玻璃视觉、记忆地图（v0.1.24）
- 卫生闸门与一键升级：写入端拦截乱码/复读/外部 AI profile 原始 JSON 污染；设置页提供版本检查、npm registry 对比、一键升级命令

## 技术实现
- **语言**: JavaScript（ESM，`type: module`，源码是 `lib/index.js` 与 `lib/client.js` 编译产物，未提供 `.ts` 源）
- **关键依赖**: 零运行时第三方依赖（仅 Node 内置 `node:fs/promises`、`node:fs`、`node:child_process`、`node:zlib`、`node:os`、`node:path`、`node:url`）；宿主 peer 依赖 `@deepseek-ai/cordis ^4.0.1`；前端通过 `require('react')` 与 DSH 客户端运行时共用 React
- **架构模式**: 双面（dual-face）cordis 插件——`lib/index.js`（host 半）注册路由、工具、系统提示词注入、生命周期钩子；`lib/client.js`（browser 半）通过 `cordis.patch.yml` 与 `package.json#dsh.client.inject` 注入到 DSH Web GUI；平台固定为 `web`
- **入口文件**: `lib/index.js`（导出 `apply(ctx, config)` 在宿主进程挂载；导出 `name = 'auto-memory'` 作为稳定 cordis 插件标识），对应 `lib/client.js` 注入浏览器侧边栏面板

## 适用场景
日常在 DSH 里持续做项目、跨工作区切换、跨会话回访的开发者。痛点是 DSH 默认不持久化项目记忆、模型每次都从零开始、之前做的决策要靠用户主动复述——这个插件让模型自己记得之前做过什么，并把 deadline、约定、用户偏好沉淀为可检索的本地笔记。还适合同时用 CodeBuddy / Claude Code / Codex 的用户，跨工具复用历史记忆而无需手动搬运。

## 前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DeepSeek Harness (DSH) | 未声明 | 插件市场收录，未声明最低 DSH 版本；要求 DSH web GUI 可启动（web profile 存在） |
| Node.js | >= 22.19.0（建议） | zstd 解压需要 `node:zlib.zstdDecompressSync`；Node <22 时会话索引回退明文读，仍可运行但工作区总览可能漏掉压缩会话帧 |
| `@deepseek-ai/cordis` | ^4.0.1 | peer 依赖，由宿主 DSH 提供 |
| 平台 | 跨平台 | 宿主为 Node.js 进程，仅在 DSH web profile 下运行；客户端面板为浏览器端 React |
| 原生模块 | 无第三方原生依赖 | 全部使用 Node 内置模块（fs/child_process/zlib/os/path/url），无 node-gyp 编译产物 |
| pnpm | v9 或 v10（v11 需额外配置） | pnpm v11 默认限制安装发布不足 1 天的版本，同日发版需要在 pnpm-workspace.yaml 加 `minimumReleaseAge: 0` 或指定显式版本号 |

## 安装方式
```bash
dsh plugin --profile web add @a9i5k4/dsh-auto-memory
```

> 实际等价步骤：在 DSH 的 web profile 目录 `~/.dsh/profiles/web` 下安装包，并把 `@a9i5k4/dsh-auto-memory` 追加到该目录 `package.json` 的 `dsh.profile.bundles` 数组，最后重启 `dsh web` 才会出现侧边栏「记忆」入口。

## 配置项
配置文件位于 `~/.dsh/dsh-auto-memory.json`（首次启动自动创建），完整默认值由源码 `lib/index.js` 的 `DEFAULT_CONFIG` 决定：

| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| `userMemoryDir` | 路径 | 用户级记忆目录（绝对路径或 ~ 开头） | `~/.dsh/memory` |
| `projectMemoryDir` | 字符串 | 项目级记忆目录名（相对工作区） | `.dsh-memory` |
| `memoryRoot` | 路径 | 集中式记忆根目录，每工作区一个子目录 | `~/.dsh/memory/workspaces` |
| `injectEnabled` | 布尔 | 是否向系统提示词注入记忆上下文 | `true` |
| `injectBudgetChars` | 数字 | 注入的总字符预算（动态部分上限） | `2400` |
| `recentDaysInjected` | 数字 | 注入的最近日志天数 | `1` |
| `autoConsolidate` | 布尔 | 每轮对话结束是否自动评估并写入今日日志 | `true` |
| `autoConsolidateMinChars` | 数字 | 触发自动沉淀的本轮最小字符数（低于则视为寒暄跳过） | `240` |
| `autoConsolidateCooldownMinutes` | 数字 | 自动沉淀的冷却分钟数（非工作时间 22:00–08:00 自动翻倍） | `30` |
| `autoConsolidateDailyMax` | 数字 | 自动沉淀每日最大调用次数（限频） | `8` |
| `awayMinutes` | 数字 | 离开多久算「暂离」，回归时弹记忆窗口并问候 | `60` |
| `autoPopupEnabled` | 布尔 | 暂离回来是否自动弹出记忆窗口 | `true` |
| `autoSummaryTimes` | 字符串数组 | 自动生成时段总结的时刻表（24h `HH:MM`），空数组=关闭 | `[]` |
| `dayBoundaryMinutes` | 数字 | 日界（分钟，0 点起算），此前的工作归到前一天日志 | `450`（早上 7:30） |
| `reflectEnabled` | 布尔 | 是否启用每日反思 | `true` |
| `reflectStyle` | 枚举 | 反思风格：`auto` / `life` / `professional` | `auto` |
| `locale` | 枚举 | 界面语言：`system`（跟随 DSH 系统语言） / `zh` / `en` | `system` |
| `externalInjectionChars` | 数字 | 外部记忆注入预算（字符） | `1400` |
| `externalSources` | 对象 | 外部记忆源开关（WorkBuddy/CodeBuddy/Claude Code/Codex/项目约定） | 全部 `true` |

修改后无需重启 dsh：设置 → 自动记忆 页面保存即生效；面板字体大小（小/正常/大/特大）实时切换不需保存。

## 常见问题

**Q: 安装后没看到「记忆」侧边栏入口怎么办?**

A: 必须三步齐全：在 `~/.dsh/profiles/web` 下安装包、把 `@a9i5k4/dsh-auto-memory` 追加到该目录 `package.json` 的 `dsh.profile.bundles` 数组、然后重启 `dsh web`。只装包不重启或没追加 bundle 行都不显示。

**Q: 记忆文件存在哪里？重装 DSH 会丢吗?**

A: 记忆以纯文本 Markdown 集中在用户主目录，与 DSH 安装目录隔离：用户级在 `~/.dsh/memory/MEMORY.md`，项目记忆统一在 `~/.dsh/memory/workspaces/{workspace}/`。重装 DSH 不影响；旧版分散在工作区里的 `.dsh-memory` 在首次运行时会自动迁移到集中根目录，旧文件保留不删。

**Q: 自动沉淀会不会消耗很多 token?**

A: 默认开启且每天最多调用 8 次、冷却默认 30 分钟（非工作时间自动翻倍），可在设置页调整。静态规则挂在系统提示词里保持字节级稳定，动态记忆走运行时快照，让 DeepSeek 前缀缓存全程命中以减少重复编码开销。

**Q: 能继承 CodeBuddy / Claude Code / Codex 的记忆吗?**

A: 能。插件会扫描 `~/.workbuddy`、`~/.codebuddy`、`~/.claude`、`~/.codex` 等目录。`memory_external` 的 import 动作以「纯链接模式」接入，只在本地记忆里记录源文件路径指针，不复制内容，需要时按需读取——这样既能用上外部历史，又不会被其他 AI 工具 profile 的原始 JSON / 乱码污染本地记忆。

**Q: 记忆里会泄露密钥吗?**

A: 注入到 prompt 的内容会过滤掉疑似令牌 / 密钥 / 凭据的段落，文件本身完整保留；外部会话检索为关键词级（非语义）。但密钥本身仍属敏感信息，建议不要主动写入或粘贴到对话里。

**Q: 怎么升级这个插件?**

A: 在 `~/.dsh/profiles/web` 目录执行 `pnpm up @a9i5k4/dsh-auto-memory`（或 `npm install @a9i5k4/dsh-auto-memory@latest`），然后重启 `dsh web`；设置 → 自动记忆 页面提供「检查更新」按钮，会对比你当前版本与 npm registry 最新版并显示更新命令。注意 pnpm v11 默认限制安装发布不足 1 天的版本，当天发版需要在 `pnpm-workspace.yaml` 加 `minimumReleaseAge: 0` 或指定显式版本号。

**Q: 卸载后记忆还在吗?**

A: 记忆文件保存在用户主目录（`~/.dsh/memory/`），不在 DSH 安装目录；从 web profile 移除 bundle 并卸载包不会删除这些 Markdown 文件，下次再装可继续使用。

## 上手难度
入门 — 安装后无需任何配置即可获得默认三层记忆 + 自动沉淀 + 主动日历能力；所有偏好都能在 GUI 的设置 → 自动记忆 页面调整并实时生效，不需要碰 JSON。

## 已知问题与限制
- 记忆检索是关键词级（非语义）：`memory_recall` 按空白/中文标点分词后做 OR 匹配，按命中词数排序，源码未提供向量检索或语义匹配
- `memory_recall` 跨历史 DSH 会话检索依赖宿主部署的 session-query 索引；未启用该索引时只能搜本地记忆文件（README 原文限制）
- 插件增删需要重启 `dsh web` 才会生效（README 原文限制）
- Node.js < 22.19.0 缺少 `zstdDecompressSync`，DSH 新版会话持久化的 `session.jsonl.zstd` 压缩帧无法解压，工作区总览会扫不到压缩会话（v0.1.16 已修复读取逻辑，但旧 Node 仍只能回退明文读）
- pnpm v11 默认不允许安装发布不足 1 天的版本：同一天发布想立刻装新版，需要在 `pnpm-workspace.yaml` 加 `minimumReleaseAge: 0` 或使用 `pnpm add @a9i5k4/dsh-auto-memory@<version>` 显式版本号
- 系统文件夹选择器依赖 DSH 主机的 directory-picker-auto 原生后端；不可用时设置页自动回退到内嵌文件夹浏览
- 0.1.14 及以下版本会击穿 DeepSeek 前缀缓存（旧版把秒级时间戳注入系统提示词），大量消耗 token；如仍在运行老版本，建议升级到 0.1.16+ 解决
- 外部记忆接入（`memory_external` import）只记录路径指针，不复制内容：好处是抗污染，代价是其他 AI 工具里的内容需要时按需读取，导入后不立即可全文搜索

---

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