0x7A7A6572/dsh-forge-studio--packages-plugin-memory ↗★ 1

@zzerx/dsh-plugin-memory

dsh 记忆与进化插件:跨会话记住你的偏好与项目习惯(全局 / 项目双作用域),自动注入、自动整理,设置面板一级「记忆」分区可视化管理。 适合需要AI跨会话记住个人偏好、身份及项目决策的用户。

패키지
@zzerx/dsh-plugin-memory
호환성
미검증
Harness peer 범위
0.1.5-rc.2
Cordis peer 범위
4.0.2
버전
0.1.0
최근 업데이트
2026. 9. 15.

설치

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:0x7A7A6572/dsh-forge-studio#3176e0b6a5b9469523d8ab727e2c1fe0db8a71a7&path:packages/plugin-memory

@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 也看不到。
  • 项目维度的键是工作区目录路径:同一目录换盘符大小写、斜杠方向会归一化为同一个项目;改目录名等于换项目。