0x7A7A6572/dsh-forge-studio--packages-plugin-memory ↗★ 1
@zzerx/dsh-plugin-memory
跨会话记住用户偏好与项目习惯 适合需要AI跨会话记住个人偏好、身份及项目决策的用户。
安装
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:0x7A7A6572/dsh-forge-studio#3176e0b6a5b9469523d8ab727e2c1fe0db8a71a7&path:packages/plugin-memory说明文档
阅读完整 README ↗@zzerx/dsh-plugin-memory
dsh 的记忆与进化插件:跨会话记住你的偏好和习惯,对话越多,它就越懂你。 记忆内容本地保存,仅你本人可见。
入口是 设置面板里的一级「记忆」分区(settings.section,order 20)。
它做什么
| 能力 | 说明 |
|---|---|
| 生成对话记忆 | 开关打开后,每个 turn/end 用会话自己的模型从对话里提炼值得长期记住的内容(偏好、身份、项目决策、经验),自动入库。 |
| 全局 / 项目双作用域 | 普适的东西(语气、格式、身份、职业、广泛偏好)进全局记忆;只对某一个工作区成立的习惯与决策进项目记忆。项目以工作区目录路径为键。 |
| 开场自动注入 | 新会话开局把「全局 + 当前工作区」的高重要性记忆注入系统提示,不必等用户再提醒。 |
| 管理记忆 | 面板里可直接查看、编辑正文、新增、置顶、归档、删除、移动作用域、复制导出、导入、整理、重置;每条记忆可开详情(分类 / 重要性 / 来源 / 创建 / 更新 / 标签 / 会话 + 全文 + 复制 / 归档 / 编辑 / 删除)。 |
| 原文留档 | 摄取管线的第一段:原始文本先落盘,再抽条目。导入的画像、turn/end 的对话转录都留一份原文;模型抽不出、调用失败、JSON 非法都不丢原文,之后可以用当前解析器对同一份原文重抽。会话转录按会话归并成一份(后一轮覆盖前一轮),留档上限 200 条、按最新优先清理。 |
| 后台调用审计 | 每次后台模型调用记一条:用途 / provider+model / 耗时 / 入出字符数 / 抽出的条目数 / 失败原因;上游报了 token 用量就一起记,读不到就缺省,不估。上限 500 条。面板「沉淀」里与原文留档一起看。 |
| 导入其他记忆 | 内置提示词(复制到别的 AI 里整理出个人画像)→ 把结果粘贴回来,按分类与 [日期] - 内容 格式自动拆条入库。 |
| 面板交互 | 「新增 / 编辑记忆」走弹窗(标题 + 三组分段组按钮 + 正文),短枚举(作用域 / 分类 / 重要性 / 导入方式)一律用组按钮而不是下拉 —— 少一次点击、也不用展开面板;锁定(打架)时组按钮与保存一起置灰。 |
| 侧边栏图标 | 设置面板侧边栏默认给所有分区一个通用齿轮(外壳的图标是硬编码 id 映射,槽位没有图标入口),本插件用一层作用域 DOM 补丁换成自己的图标,做法同 dsh-skill-hub;补丁失败只退回齿轮,不影响功能。 |
| 打架即锁定 | 注册工具前先探测有没有别的记忆插件已占用 memory_* 名字(与 dsh-mneme 直接撞名)。撞上就硬锁本插件:一个工具都不注册、不注入记忆、不自动提炼,面板顶部给红色警告、所有开关置为不可操作,setConfig 在 host 侧直接拒绝。两个记忆插件同时跑属于不受支持的组合,不做「部分可用」那种半吊子状态。停用另一个插件并重启即自动解锁。 |
| 整理(进化) | 同作用域 + 同分类 + 同标题的重复条目合并成一条,正文与标签求并集,保留信息最完整者。 |
| 7 个模型工具 | memory_save / memory_search / memory_list / memory_update / memory_delete / memory_archive / memory_move。作用域由模型判定(参数必填),判错可在面板或 memory_move 改。 |
数据放在哪
- 持久化只走
ctx.storage(storage-json)之上的 storage-domain,三张表,per-record 布局:memories(记忆条目)、raw_documents(原文留档)、audits(后台调用审计)。 表名必须匹配^[a-z][a-z0-9_]*$(storage-domain 的硬校验),所以是下划线而不是 camelCase。 后两张表是后加的,不需要迁移:同一 domain 内新增表不影响已存文档,旧的memories记录照常读入。 - 开关存在设置命名空间
forge-studio-memory(applies: 'live',改完即时生效),与插件设置卡片同源。 - 记录带
kind / scope / projectPath / importance / tags / pinned / archived / source / sessionId。 归档是软隐藏(不参与注入与列表,可恢复),删除才是真的删。
结构
src/
types.ts 领域类型、分类定义、导入提示词、设置默认值(host/client 共享)
domain.ts storage domain 声明(三张表 + zod schema,旧记录缺省字段自动补齐)
settings.ts 设置命名空间注册 + 稳定读写句柄
service.ts MemoryService(ctx.memory):CRUD / 作用域路由 / 去重合并 / 导入导出 / 注入候选
+ 摄取管线(ingest / reingest / 原文留档 / 重抽)与后台调用审计
agent/
tools.ts memory_* 七个工具(作用域判定、会话 cwd 兜底)
prompt.ts 使用引导(静态)+ 自动注入(动态,含花括号转义,防提示词变量崩溃)
capture.ts 「生成对话记忆」:turn/end 提炼(留档转录 → 模型抽取 → 写条目 → 记审计),全程 fail-safe
client/
index.ts settings.section 注册
core/remote.ts Typert 远程通道(ctx.remote.memory.*)
views/section.tsx 设置分区视图
views/ui-css.ts 样式(--dsw-* 令牌)
开发
pnpm --filter @zzerx/dsh-plugin-memory build # lib/index.js + lib/client.js + lib/types
pnpm --filter @zzerx/dsh-plugin-memory typecheck
pnpm --filter @zzerx/dsh-plugin-memory test # 72 tests
装进某个 profile 后重启即可:
dsh plugin --profile add @zzerx/dsh-plugin-memory
边界与已知取舍
- 不替代会话日志:它只存「值得跨会话记住的」精炼知识。
- 不做向量检索:v0.1 用子串搜索;语义召回是后续增强,不是当前承诺。
- 自动提炼是一次额外的模型调用:拿不到模型路由、流失败、JSON 非法都只降级为「这次没记」,绝不影响对话;转录本身已经留档,之后可以重抽。
- 导入是确定性的行式解析(不调模型):分类标题 +
[日期] - 内容列表项 → 条目;认不出的章节标题跳过、裸行按当前分类收。原文同时留档,所以换更强的抽取器后可以对同一份原文重跑,不会因为「当时没抽好」而丢内容。 - 冲突探测只认「重名工具」(探测在跨插件层面实测有效;注册刻意延后一个 macrotask,让同样在等
tools的插件先落地,结果与加载顺序无关):这是两个记忆插件唯一会真正打架的地方,也是 100% 可靠的信号(探测在跨插件层面实测有效)。只往提示词里塞内容、不注册工具的记忆插件探测不到;别人的面板分区(settings.section是纯 client 注册)host 也看不到。 - 项目维度的键是工作区目录路径:同一目录换盘符大小写、斜杠方向会归一化为同一个项目;改目录名等于换项目。