dsh-memory-nebula: Unfolding DSH Memory into a Nebula Map

前言

DSH 的记忆默认堆在 ~/.dsh/memory/ 下,一堆 markdown。能用,但你看不见:不知道写了哪些记忆、它们之间有什么关系、人格藏在哪个文件里、上个会话说到哪儿断了。插件 zyu-23/dsh-memory-nebula 想做的就是把这个目录摊开——记忆可视化成力导向星云图,并且把记忆、人格、状态三类数据的读写统一接管下来。

维护者是 Zyu-23,分类属于「记忆」,GitHub 星标为 0,版本 0.1.0,MIT 许可。属于个人探索性质的插件,下面介绍的能力都来自其 README,不代表已大规模验证。

这是什么

一句话:一个 DSH 插件,做四件事:把记忆画成力导向星云图;提供 memory_write / memory_read / memory_list / memory_delete / memory_search 五个记忆工具;把人格存成 persona.json 每轮注入;记录「此刻正在做什么」的状态,换会话不丢。

它兼容 dsh-auto-memory 的 markdown 格式,思路借鉴了 peterpoal134/memory-brain(AGPL-3.0)的「存 / 喂 / 查」设计,本实现为独立编写,采用 MIT 许可。

核心功能

星云图

  • 双星云:自动扫描 ~/.dsh/memory/<slug>/ 发现多个工作区,每个工作区一个「阵营」;只有一个工作区就是单星云,不硬编码路径。
  • 力导向布局:Canvas 2D 手写物理引擎,参数为斥力 2600 / 弹簧 0.045 / 阻尼 0.86;节点按类型着色(人 / 物 / 话题 / 地点 / 技能 / 人格)。
  • 点节点看详情:关联记忆列表 + 每条记忆的正本路径。
  • 人格簇:图中间一簇金色节点,对应「她是谁」。
  • 三种入口:侧栏 Tab(小窗)/ 侧栏图标(全屏)/ 主面板。

记忆与检索

memory_search 是四路打分合并:分词(中文 bigram)→ IDF 加权 → 字段加权(名字 > 描述 > 正文)→ 关键词、图谱、重要性、新鲜度合并。没有 embedding,同义不同词可能查不到。

人格与状态

人格数据在 ~/.dsh/memory-nebula/persona.json,每轮注入 <memory_nebula_persona>;状态在 ~/.dsh/memory-nebula/state.json,每轮注入 <memory_nebula_state>。

状态更新有两条路:主力是手动调 nebula_state 工具,记录准确;兜底是新会话开始时如果状态超过 30 分钟没更新,插件用当前用户消息自动记一笔,前缀「(自动)」,可被手动更新覆盖。

注入与存储

注入走 systemPrompt.section,order 4300 人格 / 4400 状态 / 4500 记忆召回,注入文本按检索结果签名去抖,目的是减少 KV 缓存失效。记忆正本仍是 markdown + YAML frontmatter,写入是原子的(tmp → rename)。

安装与启用

官方 README 只给了「手动安装(推荐)」,这条路径可用;npm 渠道暂未发布,所以没有可执行的一键命令。坚持不要凭插件名拼 dsh plugin add github:owner/repo,那个包名和命令不能保证可用。

1、把本仓库整个目录放进你 DSH profile 的 node_modules/:

<你的 DSH 目录>/profiles/<profile>/node_modules/dsh-memory-nebula/

这一步是下载源码后手工放置,README 未提供 dsh plugin 形式的快捷安装。

2、编辑该 profile 的 package.json:

{
  "dependencies": {
    "dsh-memory-nebula": "0.1.0"
  },
  "dsh": {
    "profile": {
      "bundles": [
        "...",
        "dsh-memory-nebula"
      ]
    }
  }
}

3、重启 DSH,然后验证:打开侧栏看到「记忆星云」图标即成功,点开是一张空白星云图 + 引导提示。

首次启动插件会自动初始化两个空白数据文件:~/.dsh/memory-nebula/entities.json(默认 entities: [])和 ~/.dsh/memory-nebula/persona.json(默认 directives: [] / sections: [])。这是设计如此,星云图开箱即空,内容要自己写;已有数据不会被覆盖,所以升级安全。

还要注意 peerDependencies 的版本区间:@deepseek-ai/cordis >=4.0.2 <5.0.0,@deepseek-ai/dsh-home-paths / dsh-llm / dsh-tools 都是 >=0.1.5-rc.2 <0.3.0,node 要求 ^22.19.0 || >=24.0.0。

典型用法

下面四步来自 README 的「使用(从零开始)」,是一个可复现的最小闭环。

第 1 步,看图。打开侧栏「记忆星云」,刚装好时图是空白的,中间显示提示:星云还是空的 → memory_write 写记忆 → nebula_extract 抽实体 → 刷新。

第 2 步,写第一条记忆:

{
  "name": "my-first-memory",
  "description": "一句话摘要",
  "type": "project",
  "body": "记忆正文……"
}

第 3 步,抽实体,让这条记忆进图:

{ "memoryName": "my-first-memory", "side": "host" }

它会读这条记忆,用 LLM 判断涉及哪些实体、要不要新建,然后更新 entities.json。

第 4 步,刷新星云图,节点就长出来了。之后每条记忆重复「写 → 抽」,图会越来越丰富。

交互上:拖拽节点、滚轮缩放、拖空白平移;点节点看关联记忆和正本路径;金色人格节点点开看人格条目内容。注意图是静态快照,改了记忆要刷新页面,抽实体也要手动调 nebula_extract。

想自定义人格,默认是空的,编辑 ~/.dsh/memory-nebula/persona.json:

{
  "directives": ["LANG_ZH_CN_ONLY", "ADDRESS_AS_USER"],
  "sections": [
    { "id": "identity", "title": "身份", "category": "身份", "content": "你是……" }
  ]
}

directives 是压缩指令(给模型解析用),sections 是自然语言描述,每条在图上对应一个金色节点。填好后每轮自动注入。

想手工加实体,也可以直接编辑 ~/.dsh/memory-nebula/entities.json:

{
  "entities": [
    { "id": 1, "name": "我的项目", "type": "topic", "side": "host" }
  ],
  "edges": [],
  "memoryEntities": { "host": {}, "qq": {} }
}

实体 id 不要重复,图布局依赖 id 做确定性定位。

数据位置

数据 位置
记忆正本 ~/.dsh/memory/<slug>/*.md(markdown + frontmatter)
实体关系 ~/.dsh/memory-nebula/entities.json
人格 ~/.dsh/memory-nebula/persona.json
状态 ~/.dsh/memory-nebula/state.json(多工作区时按工作区拆成 state-<key>.json)
节点目录 ~/.dsh/memory-nebula/contexts/
注入调试 ~/.dsh/memory-nebula/last-inject.json

排障时先看 last-inject.json,能直接看到这轮注入的内容。

适用场景与注意

适合这几类人:想看到记忆之间关系的 DSH 用户;想把人格从 AGENTS.md 挪到结构化文件、要求每轮注入的人;在多个工作区之间切换、希望「正在做什么」跨会话保留的人。

注意几点:

  • 插件以当前 dsh 进程的权限运行,能读写你 profile 下的文件和 ~/.dsh/ 数据。安装前请检查源码,确认 entities.json / persona.json / state.json 的写入内容符合预期。
  • 许可证是 MIT,但 persona.json 里写的是自定义人格指令,属于你自己的配置。
  • README 明确写了本插件不提供备份功能,要备份请自行向 DSH 提要求写备份脚本,或用 git / 云盘同步 ~/.dsh/memory/。
  • 已知限制:检索无 embedding,同义不同词可能查不到;图是静态快照;抽实体是手动的。
  • 若要改客户端渲染代码:修改 lib/client.template.js 后复制为 client.js,lib/*.js 是宿主模块。

结尾

这款插件的价值在把记忆从一堆 markdown 变成看得见的星云,并顺手统一了记忆 / 人格 / 状态的管理。它当前还是早期版本(0.1.0,星标 0),收益取决于你是否有真的需要可视化记忆、需要跨会话状态的场景;纯文本记忆工具的用户不必急着换。

目录页:https://www.skillhub.cn/plugins/Zyu-23/dsh-memory-nebula

GitHub:https://github.com/Zyu-23/dsh-memory-nebula

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye