dsh-memory-panel
> DeepSeek Harness 的持久记忆插件:面向模型的 memory_* 工具、自动 memory:recall 提示注入、/memory/api JSON 路由,以及「设置 → 记忆」管理面板。
  
English · [设计文档](./docs/design.md) · [常见问题](./docs/FAQ.md)
---
功能
dsh-memory-panel 为所有 agent 会话提供持久、可检索的记忆,进程重启后依然保留:
| 能力 | 位置 | 说明 |
|---|---|---|
memory_save | 模型工具 | 新建或更新一条记忆(标题 + 内容 + 标签 + 重要度) |
memory_search | 模型工具 | 排序检索——英文整词 + 中文 bigram 双重评分 |
memory_list | 模型工具 | 按更新时间倒序列出,可按标签过滤,附标签/重要度统计 |
memory_get | 模型工具 | 按 id 读取单条完整记忆 |
memory_delete | 模型工具 | 按 id 删除记忆 |
memory:recall | 系统提示 | 组装提示时自动注入前 6 条记忆(高重要度优先) |
/memory/api/* | 宿主路由 | 供设置面板调用的 JSON API |
| 设置 → 记忆 | Web 面板 | 在 GUI 中浏览、搜索、新建、编辑、删除记忆 |
插件挂在 DSH profile 组合的用户层,因此无论当前启用哪个 agent 预设,其工具对所有会话可见。
工作原理
┌────────────────────────── DSH 宿主进程 ───────────────────────────────┐
│ │
│ tools 注册表 ◄── memory_save/search/list/get/delete(面向模型) │
│ ▲ │
│ │ createMemoryStore (src/store.js) │
│ │ ┌──────────────────────────────────┐ │
│ │ │ 纯逻辑:评分、回忆渲染、 │ │
│ └──── 执行 ──────────│ 串行化写入链 │ │
│ └───────────────┬──────────────────┘ │
│ │ load / persist(注入) │
│ /memory/api/* 路由 ◄── POST ──┐ ▼ │
│ ▲ │ fs 服务 │
│ │ │ │ │
│ systemPrompt.memory:recall ◄─┘ ▼ │
│ ▲ <用户主目录>/.dsh-memory/memories.json │
│ │ (30 秒兜底刷新 + 每次保存/删除后即时刷新) │
└────────┴──────────────────────────────────────────────────────────────────┘
┌──────────────────────────── 浏览器(Web 客户端) ────────────────────────┐
│ 设置 → 记忆 面板 ── fetch('/memory/api/<method>', { method: 'POST' }) │
└────────────────────────────────────────────────────────────────────────────┘- 存储位置:
<用户主目录>/.dsh-memory/memories.json——根据宿主的
sandboxPolicy.workspaceRoot 解析为用户主目录,而非会话工作区; 首次保存时创建,重启后保留。
- 并发安全:所有写操作经过串行化写入链,并发的保存/删除不会在文件上交错。
- 自动回忆:
memory:recall系统提示段在每次提示组装时同步读取纯字符串缓存
(段 text 钩子是同步的,而 ctx.fs 是异步的);缓存会在每次保存/删除后 重建,并有 30 秒定时器兜底(应对手工编辑文件)。
- 评分规则:标题(×3)> 标签(×2)> 内容(×1);中文查询额外按重叠 bigram
计分,短查询也能命中长条目;高重要度条目获得 +2 固定加成(因此即使查询无 命中也会出现在结果中)。
安装
方式 A —— 官方 CLI(bundle 通道,推荐)
dsh plugin --profile <profile-name> add dsh-memory-panel包内声明了 dsh.bundle.patch: ./cordis.patch.yml;CLI 会将其合并进 profile 的 bundle 栈,补丁自动插入插件行,无需手工编辑 profile 文件。
方式 B —— 手工补丁
把包放到 DSH 能解析的位置,然后在 profile 的 cordis.patch.yml 追加:
- insert:
- id: tool-memory
name: 'dsh-memory-panel'重启 DSH。注意新增条目必须用 insert(不带 id 的覆盖会被补丁加载器忽略)。
> 从旧版手工挂载升级:如果你的 profile 里已有该插件行,切到 bundle 通道前 > 请先删掉旧行,避免重复挂载(两份宿主逻辑、工具和路由都会翻倍)。
使用
作为模型
直接自然对话即可——也可以显式调用工具:
memory_save(title="用户偏好:思考使用中文", content="……", tags=["preference"], importance="high")
memory_search(query="思考使用中文")
memory_list(tag="preference")
memory_get(id="m...")
memory_delete(id="m...")每个 agent 都会通过 memory:recall 段自动看到顶部记忆(高重要度标记 [重要]),并被提示需要完整信息时调用 memory_search。
在 GUI 中
打开 设置 → 记忆:浏览全部条目(含统计)、搜索、新建/编辑/删除。 面板通过 POST /memory/api/* JSON 路由与宿主通信。
开发
npm test # node:test — 纯逻辑 + 插件级集成测试src/
index.js 宿主端:工具、路由、回忆注入(Cordis 插件)
client.js 客户端:设置 → 记忆 面板(module-loader 包格式)
store.js 纯逻辑:评分、回忆渲染、可注入的 store 工厂
test/
store.test.js src/store.js 的单元测试
index.test.js 使用 mock Cordis ctx + 内存 fs 的集成测试
docs/
design.md 架构与数据流深入解析
FAQ.md 常见问题许可证
[MIT](./LICENSE) © 2026 dsh-memory-panel contributors