Skip to content

[Feature] 记忆落盘形态与目录归属:镜像、导出、工作区投影的统一与迁出 ~/.dsh #278

Description

@heptaspirit

@modusensus

使用场景

顺着之前的提案顺下来,当我们能让 mneme 能导出记忆为 markdown 后,我认为这意味着用户可以将 mneme 的导出当「能长期维护的笔记」用:一个记忆库导出成一批 markdown,交给编辑器或别的工具索引、浏览、跨机器带走。但这会引入新的问题,用久了自然会串成一条链:整理记忆 → 落盘文件变多 → 需要一个统一的落点来管它们 → 这个落点该不该继续待在 ~/.dsh 下 → 将来要不要把每个工作区的记忆也投影一份到仓库里

这条链的第一环已经在做了(#231 的整理接口),后面几环到现在没有落点。它们不是四个独立功能:共用同一套渲染逻辑,只差落在哪、以及能不能改回来。所以想一次把形态与归属议清楚,而不是一个 PR 改一处、每个落点各自发明一套。

已查现状

现在有三个落点,行为各不相同:

  • ~/.dsh/memory/*.md——磁盘镜像,按 type 分五个文件;有回流/import 与磁盘镜像的合并走 mirror-digest更新时间 的三方合并,只吃 titlecontent
  • /api/dsh-mneme/export——只读导出,format=json 给整表 JSON,format=markdown 按类型分节拼成一个文件,与镜像共用同一条渲染路径。
  • <workspace>/.mneme/——工作区投影,还不存在。

工作区投影这件事,是回调一条更早的设计#17 的 §五「workspace 投影(备份性质,可选)」写过它的一份完整草稿——定位是单向投影、不是权威源;可选、默认关;把 workspace_scope = 当前 workspace 的记忆渲染到 <workspace>/.mneme/,按 type 分文件,frontmatter 带 memory id / WorkspaceId / 导出时间;agent 维度写进 frontmatter 而不建子目录(避免笛卡尔积);价值是「编辑器里直接读项目记忆」与「DB 损坏时的明文兜底」,恢复走显式命令、靠 (type, title, scope) 去重保幂等。

但那是一版随 issue 搁置的草稿,不是生效中的设计:它没有随那一批落地,也没有排期。你关闭 #17 时列的偏差里就有它——「mirror 分域路径(第 6 条)……未随本批,作为已知边界跟踪(见 #168 的 PR 描述边界节)」,同一个 issue 的 M3 清单也列了它。也就是说它现在只存在于一个已关闭的 issue 和一个 PR 的描述里;代码里没有任何实现(src/ 下写记忆文件的只有 mirror.js 一处)。

所以下面拿它当回调看:它的价值在于「当时有人把该带哪些 frontmatter 字段列出来了」,而不在于「它已经定了」。

另外两条现状,都影响怎么选:

  • 目录:记忆库现在是 ~/.dsh/memorymemoryDir 的默认值,放 memory.db 与那五个镜像文件),运行时重载荷在 ~/.dsh/mneme/。而 src/runtime/layout.js 里有一句注释写着这些「都挂在 ~/.dsh/mneme/ 下,便于用户整个删掉重来」——所以迁出这件事与你当初的意图是冲突的,要先对口径。
  • 硬约束:同一个 scope 设计里,sensitivity=1 的记忆「不参与跨库检索、不进 mirror 导出、不入跨项目 dream 提炼」。任何新落点都必须继承这条。

期望的行为变化

同一份记忆,无论落在哪个位置,读到的形态是同一套;并且哪个落点允许改回库、哪个只读是明确定义的,不靠使用者的印象。

具体到四件事:

  1. 格式:落盘文件带 frontmatter,字段能直接当查询信号(来源、生成者、时间、状态)。我这边看的是 Open Knowledge Format v0.2——一个 concept 一个文件、type 必填,sources / generated / status 可选。它与我们已有的列重叠度不低,但要不要采用、还是只借它的键名,我不预设。
  2. 回流:现在只有全局镜像能改回库,而且只吃 title 与 content——标签、重要性、来源、状态从文件改不回来。要不要扩到元数据,得先定义字段的权威归属(比如 type 算不算身份锚、status: deprecated 对应归档时是不是单向的)。
  3. 目录:记忆库是否从 ~/.dsh 迁到 ~/.mneme 这类用户目录下、按用途分子目录。理由不是整洁:落盘文件一旦是给人读、给人改的,它放在宿主的私有目录里就等于在暗示用户别碰。
  4. 投影:工作区投影要不要重新排期。它跟第 3 条互相牵制——投影目录本身就长在用户仓库里,先把库的位置定下来,投影的位置才有意义。

想先确认的

  • [Feature Request] 按 agent 与 workspace 隔离记忆:专属记忆 + 全局共享记忆并存 #17 §五 那版草稿只当参考,不当依据。 里面「单向、无回流」这条尤其想重看:当时给的理由是双向同步要解决 git checkout 冲突、双写向量、digest 冲突;但今天全局镜像已经是双向的(/import + mirror-digest 三方合并),而 <workspace>/.mneme/ 在用户的 git 仓库里,读回会跟 git checkout 打架。两个落点的策略本来就可以不同、不必统一——这一条想听你怎么看。
  • 迁出 ~/.dsh 与「便于用户整个删掉重来」怎么取舍;存量安装要不要迁移(memoryDir 是用户可配置键)。
  • 这一串拆成几个 PR、按什么顺序落。

可能的做法(仅供讨论,不是方案)

摆在桌上的只有这几条,我不预设:只给 /export 加一个新出口;镜像文件本身加 frontmatter;彻底改成一条记忆一个文件。粒度的代价可以量化,顺带一提:现在 5 个文件,一条记忆一个文件就是数千个,Windows 上的写入与扫描代价需要实测一次再决定——这条数据可能比格式本身更能定方向。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions