🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

记忆星云 ZILCHW/dsh-memory-nebula

DeepSeek 客户端
ZILCHW8 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

自动记下要点,按话题找回相关记忆

30.1/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/6 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/ZILCHW/dsh-memory-nebula.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/06·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 8 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 16 处,展示前 16 条)
  • 写入本地文件
    lib/index.js:28
    appendFileSync(JUDGE_LOG, `${new Date().toISOString()} ${message}\n`)
  • 发起网络请求
    lib/client.js:92
    const response = await fetch(`${API_BASE}${path}`, {
  • 发起网络请求
    lib/client.js:2383
    const response = await fetch('/api/dsh-memory-nebula/action', {
  • 发起网络请求
    lib/client.js:2408
    const response = await fetch('/api/dsh-memory-nebula/action', {
  • 写入剪贴板
    lib/client.js:2973
    navigator.clipboard.writeText(text).catch(() => {})
  • 读取本地文件
    lib/store.js:299
    const info = statSync(this.file)
  • 读取本地文件
    lib/store.js:311
    if (existsSync(this.file)) raw = JSON.parse(readFileSync(this.file, 'utf8'))
  • 读取本地文件
    lib/store.js:311
    if (existsSync(this.file)) raw = JSON.parse(readFileSync(this.file, 'utf8'))
  • 写入本地文件
    lib/store.js:341
    mkdirSync(this.dataDir, { recursive: true })
  • 写入本地文件
    lib/store.js:343
    writeFileSync(tmp, JSON.stringify(graph, null, 1), 'utf8')
  • 写入本地文件
    lib/store.js:344
    renameSync(tmp, this.file)
  • 读取本地文件
    lib/store.js:940
    if (existsSync(file)) {
  • 读取本地文件
    lib/store.js:941
    const raw = JSON.parse(readFileSync(file, 'utf8'))
  • 写入本地文件
    lib/store.js:959
    mkdirSync(this.dataDir, { recursive: true })
  • 写入本地文件
    lib/store.js:962
    writeFileSync(tmp, JSON.stringify(this.tip), 'utf8')
  • 写入本地文件
    lib/store.js:963
    renameSync(tmp, file)
扫描于 2026/11/6(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

为 DSH 提供神经记忆:笔记自动写入,按主题召回,渲染成可交互的星云图。零依赖,不用模型,不用 API。

README

由 DeepSeek 最新模型翻译生成
记忆星云 · dsh-memory-nebula 给 DeepSeek Harness 桌面端用的长期记忆插件。 English — A self-writing memory plugin for DeepSeek Harness: it decides what to remember on its own, then recalls by topic before each turn. Pure local, zero dependency, no model, no API. Retrieval is lexical (2-gram + IDF + inverted index + co-occurrence learning), deterministic and explainable — every hit tells you which words matched and in which field. Ten tools plus an interactive star-nebula canvas in the sidebar. v0.2.6 · MIT · 零依赖 · 纯本地 · 不调模型 · 不联网 记忆星云 真实界面截图。标签密度关到「无」,所以只看得到节点和分类,看不到具体记忆内容。 聊到第五十轮,模型只看得见最近几屏。
展开完整文档(README 剩余 1 节)
记忆星云 · dsh-memory-nebula

给 DeepSeek Harness 桌面端用的长期记忆插件。

English — A self-writing memory plugin for DeepSeek Harness: it decides what to remember on its own, then recalls by topic before each turn. Pure local, zero dependency, no model, no API. Retrieval is lexical (2-gram + IDF + inverted index + co-occurrence learning), deterministic and explainable — every hit tells you which words matched and in which field. Ten tools plus an interactive star-nebula canvas in the sidebar.

v0.2.6 · MIT · 零依赖 · 纯本地 · 不调模型 · 不联网

记忆星云

真实界面截图。标签密度关到「无」,所以只看得到节点和分类,看不到具体记忆内容。

聊到第五十轮,模型只看得见最近几屏。

上周三你随口说的那个口味、那台机器上踩过的坑、那个你不想再提的名字——它还记着。

不是记事本。它会自己记事、自己按话题想起来——每轮对话前,拿你刚说的那句话去记忆库里翻,只把真正相关的那几条送回上下文。

- 平时它不说话。翻不到相关的,它就只回一句「这一刻没有相关的」,不占思考
- 记忆像人一样会淡:45 天半衰期,常被想起来的更牢,钉住的不衰减
- 侧栏一张能转、能点、能钻进去的星云图,五种看法
- 整个插件只有一个 graph.json,没有服务、没有网络、没有模型

为什么需要它

上下文窗口是有限的。聊得越久,模型越只看得见最近几屏,人会「忘事」。

把值得长期记住的东西(偏好、决定、教训、人物、待办)抽成独立节点存下来,每轮只挑跟当前话题相关的几条送回去——等于给模型装了一层可检索的长期记忆,而不是把所有历史堆进 prompt。

实测:一百多条记忆,每轮只注入 5 条、约 500 字,上下文占用恒定,跟库多大无关。

检索是怎么工作的

这是整个插件最要紧的部分。一次 memory_search 走七步:

1. 归一化 — 全角转半角、统一大小写和空白。B站 / B 站 / b站 落到同一个词上。

2. 粗分词 — 中文没有天然词界,用 2-gram(相邻两字),再做两轮清洗:丢掉停用词,丢掉含虚词的 2-gram(人的、是的)。英文和数字按完整词切。

3. IDF 加权 — 越罕见的词越说明问题。插件 几十条里都有,权重低;pnpm 只两条有,权重高。字段也有层级:标题 ×6、标签 ×4、正文 ×1.5。

4. 倒排索引 — 词 → 出现在哪些记忆里。查询先收窄候选,不做全表扫,库大了也不卡。

5. 共现学习 — 从已有记忆里学:哪些词总出现在同一条的标题或标签里(b站 和 bilibili、桌面端 和 启动),查询时按 0.45 权重补进来。库越大越准,纯统计。

6. 顺着连线联想 — 字面命中之后,沿记忆之间的连线扩一跳。这是「想起 A 顺带想起 B」。

7. 相对门槛 — 不凑数:比第一名低 58% 以上的直接丢掉。宁可只回 2 条,也不拿不相干的填。

最终打分:

score = 字面(归一化) × 1.0
+ 联想 × 0.5
+ 可及性 × 0.22 ← 权重 × 活跃度 × 钉住,只做微调
+ 新鲜度 × 0.1

为什么不用 embedding

因为一个插件不该要求你配模型、配 key、联网、按量计费。

上面这套做法在「记忆以百计、查询是你自己的日常问法」这个规模上足够好,而且确定:同样的库、同样的查询,结果永远一样,每一步都能指着具体词解释。

记忆是怎么活的

每条记忆有四个数:

| 字段 | 含义 |
| weight | 重要程度,0~1,写下时给定 |
| act | 激活强度,被想起来就上升,按小时级半衰期衰减 |
| strength | 记忆强度,每想起一次涨一点,衰减更慢 |
| hits | 被想起过多少次 |

很久没被想起来的会自己沉下去(不删,还在图上);钉住的(pinned)不吃衰减。

这层是照人脑的样子做的:常用路径越走越宽,冷门路径慢慢长草。

十个工具

| 工具 | 干什么 |
| memory_save | 记一条。自动去重、自动和相似记忆连线;closes 顺手收掉一条待办 |
| memory_search | 检索。返回 belongsTo(属于哪层哪类)和 links(连着的几条);before 可以只看某个日期之前的记忆 |
| memory_get | 按 id 取全文,连带邻居 |
| memory_link | 手动连两条 |
| memory_forget | 删掉一条(连同连线) |
| memory_pin | 钉住 / 取消钉住 |
| memory_stats | 总量、连线、孤立、各层各类分布 |
| memory_merge | 同一件事记了两遍,合成一条:正文去重拼接、标签并集、连线重定向 |
| memory_export | 导出成可迁移的 JSON(可只导某一层或某一类) |
| memory_import | 导入导出的 JSON,已存在就更新,不存在就新建 |

自动连线只在标题语义或标签重合时才连,并且按 IDF 加权——越是大众词越不算数。这样连出来的都是真亲戚。

界面

侧栏一张可交互的星云,五种看法:

星云视图

- 小银河 — 中心核 + 星系臂,六个大类各是一颗行星,自己转
- 星云 — 3D 力导向。层级按内容自动递归:某一团太大且还能分类,就自己再往下分一层,不固定层数
- 聚类 — 同类型抱团
- 时间轴 — 一行一层,从左往右是时间
- 列表 — 分组、折叠、按层按类看

交互:点类别自动聚焦,以那个点为新核心重排;点具体记忆就飞到中心并放大,相关记忆环绕周围。拖拽旋转带惯性,悬停出卡片。

左栏:分层开关、类型开关、状态与排序、节点大小与标签密度、概览统计、分层占比。
右栏:详情(权重 / 活力 / 想起次数 / 连线 / 记于改于)+ 同层与同标签的邻居 + 统计 + 最近更新。

检索的可解释性

搜索框里的词不是简单过滤,走的是完整检索,而且把理由写在每一条上:

- 列表里每条显示「命中 桌面端插件 · 安装 · plugin」,告诉你被哪几个词、打在标题还是标签上命中
- 星云里命中的节点描一圈亮边、半径放大,其余淡下去,一眼看出这次搜到了哪一簇
- 排序用真实相关度,不是过滤后凑数

这就是不用 embedding 也能「说得清为什么」的方案:每一步都能指着具体词解释。

安装

要求 DSH 桌面端。

dsh plugin --profile desktop add link:/path/to/dsh-memory-net

或放进 ~/.dsh/plugins/,用插件管理器安装。装完重启 DSH,协议、面板、工具都会自动注册。

装好之后是空的。 仓库里只有代码,没有一条记忆——第一句值得记的话进来,它才创建 ~/.dsh/memory-net/graph.json,从 0 条开始长。上面截图里那 116 条是作者自己用了几天攒的,不会跟着插件走。

想搬走或者搬过来,用 memory_export / memory_import;想换存放位置,设环境变量 DSH_MEMORY_NET_DIR。

数据

全部在 ~/.dsh/memory-net/graph.json:

{
"version": 1,
"nodes": [{ "id": "m_xxx", "title": "...", "body": "...", "layer": "core", "kind": "rule",
"tags": ["坑"], "weight": 0.8, "pinned": true, "status": "",
"createdAt": 0, "updatedAt": 0, "hits": 0, "act": 0, "strength": 1 }],
"edges": [{ "from": "m_a", "to": "m_b", "kind": "related", "weight": 0.6 }]
}

写入是原子的(tmp → rename),写失败不脏盘。删掉这个文件等于清空记忆。

结构

lib/index.js host:7 个工具、每轮注入、/api/dsh-memory-nebula 路由 lib/store.js 存储、检索打分、连线、衰减、注入文本 lib/client.js 侧栏面板与画布(React + Canvas 2D,无第三方依赖) cordis.patch.yml 挂载点

零运行时依赖。

测试

npm test

四套纯 Node 测试:边界与异常 52 项、五种视图 × 四种聚焦的布局矩阵、组件渲染冒烟(专门抓 node --check 查不出、只在真机白屏的那类错)、数据进出是否原样(500 条批量导入后逐条核对字段、导出再导入等价)。CI 在 Node 20 / 22 上自动跑。

License

MIT
预览分享卡片长什么样 ↓ZILCHW/dsh-memory-nebula
分享 · DeepSeek Harness Hub
ZILCHW/dsh-memory-nebula

自动记下要点,按话题找回相关记忆

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部