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

本地记忆库 huangbaba1992/dsh-mm

DeepSeek Harness
huangbaba19927 天前有提交已提供中文文档扫描:含敏感能力

把对话提炼成可检索的长期记忆与人格设定

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add huangbaba1992/dsh-mm
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · chat
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 7 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 107 处,展示前 58 条)
  • 写入本地文件
    index.js:41
    await writeFile(target, content, 'utf8')
  • 读取本地文件
    index.js:43
    const size = await stat(target).then((st) => st.size, () => 0)
  • 写入本地文件
    index.js:44
    await appendFile(target, size > 0 ? `\n\n${content}` : content, 'utf8')
  • 读取本地文件
    index.js:178
    const st = await stat(target).catch((error) => {
  • 读取本地文件
    index.js:194
    const exists = await stat(target).then(() => true, () => false)
  • 读取本地文件
    index.js:233
    const st = await stat(inside(root, item.path)).catch(() => undefined)
  • 读取本地文件
    index.js:241
    const st = await stat(file).catch(() => undefined)
  • 发起网络请求
    client.js:363
    const response = await fetch(API + path, init)
  • 读取本地文件
    core.js:374
    st = statSync(file)
  • 读取本地文件
    core.js:383
    text = readFileSync(file, 'utf8')
  • 读取本地文件
    core.js:426
    const st = await stat(file).catch(() => undefined)
  • 读取本地文件
    core.js:451
    ents = await readdir(dir, { withFileTypes: true })
  • 读取本地文件
    core.js:560
    if (await stat(base).then(() => false, () => true)) return base
  • 读取本地文件
    core.js:566
    if (await stat(candidate).then(() => false, () => true)) return candidate
  • 读取本地文件
    admin.js:117
    entries = await readdir(dir, { withFileTypes: true })
  • 读取本地文件
    admin.js:125
    const { data, body } = parseFrontmatter(await readFile(from, 'utf8'))
  • 写入本地文件
    admin.js:128
    await mkdir(topicsDir, { recursive: true })
  • 读取本地文件
    admin.js:130
    if (await stat(to).then(() => true, () => false)) {
  • 读取本地文件
    admin.js:134
    if (await stat(candidate).then(() => false, () => true)) {
  • 写入本地文件
    admin.js:140
    await writeFile(to, stringifyFrontmatter({ ...data, name: data.name || entry.name.replace(/ md$/i, ''), type }, body), 'utf8')
  • 删除本地文件
    admin.js:141
    await rm(from).catch(() => {})
  • 读取本地文件
    admin.js:146
    const left = await readdir(dir).catch(() => ['x'])
  • 删除本地文件
    admin.js:147
    if (left.length === 0) await rmdir(dir).catch(() => {})
  • 读取本地文件
    admin.js:153
    settings = sanitizeSettings(JSON.parse(await readFile(stateFile, 'utf8')))
  • 写入本地文件
    admin.js:165
    await mkdir(home, { recursive: true })
  • 写入本地文件
    admin.js:167
    await writeFile(tmp, JSON.stringify(settings, null, 2), 'utf8')
  • 写入本地文件
    admin.js:168
    await rename(tmp, stateFile)
  • 写入本地文件
    admin.js:234
    await appendFile(join(folder, `${localDay(now)}.md`), entry, 'utf8')
  • 写入本地文件
    storage.js:24
    await mkdir(root, { recursive: true })
  • 写入本地文件
    storage.js:25
    await mkdir(join(root, TOPIC_DIR), { recursive: true })
  • 写入本地文件
    storage.js:26
    await mkdir(join(root, INBOX_DIR), { recursive: true })
  • 读取本地文件
    storage.js:31
    const entries = await readdir(dir).catch(() => [])
  • 读取本地文件
    storage.js:39
    if (await stat(base).then(() => false, () => true)) return base
  • 读取本地文件
    storage.js:42
    if (await stat(candidate).then(() => false, () => true)) return candidate
  • 读取本地文件
    storage.js:60
    const st = await stat(file).catch(() => undefined)
  • 写入本地文件
    storage.js:64
    await mkdir(dirname(target), { recursive: true })
  • 写入本地文件
    storage.js:65
    await copyFile(file, target)
  • 写入本地文件
    storage.js:69
    await mkdir(dir, { recursive: true })
  • 读取本地文件
    storage.js:79
    entries = await readdir(join(root, BACKUP_DIR), { withFileTypes: true })
  • 读取本地文件
    storage.js:94
    for (const file of files) bytes += (await stat(file).catch(() => ({ size: 0 }))).size
  • 删除本地文件递归
    storage.js:107
    await rm(dir, { recursive: true, force: true })
  • 删除本地文件递归
    storage.js:115
    await rm(join(root, BACKUP_DIR, item.id), { recursive: true, force: true }).catch(() => {})
  • 删除本地文件
    storage.js:204
    await rm(source, { force: true })
  • 删除本地文件递归
    storage.js:211
    await rm(join(root, TRASH_DIR), { recursive: true, force: true })
  • 删除本地文件递归
    storage.js:230
    await rm(dir, { recursive: true, force: true }).catch(() => {})
  • 删除本地文件
    storage.js:242
    await rmdir(dir).catch(() => {})
  • 读取本地文件
    jobs.js:92
    entries = await readdir(folder, { withFileTypes: true })
  • 读取本地文件
    jobs.js:100
    const st = await stat(join(folder, entry.name)).catch(() => undefined)
  • 读取本地文件
    jobs.js:138
    entries = await readdir(folder, { withFileTypes: true })
  • 写入本地文件
    jobs.js:163
    await rename(file, temp)
  • 读取本地文件
    jobs.js:168
    const text = await readFile(temp, 'utf8')
  • 写入本地文件
    jobs.js:170
    await rename(temp, file).catch(() => {})
  • 写入本地文件
    jobs.js:175
    await rename(temp, file).catch(() => {})
  • 写入本地文件
    jobs.js:224
    await mkdir(dirname(memoryPath), { recursive: true })
  • 写入本地文件
    jobs.js:225
    await writeFile(memoryPath, merged.text, 'utf8')
  • 写入本地文件
    jobs.js:234
    await writeFile(memoryPath, `${compacted}\n`, 'utf8')
  • 读取本地文件
    jobs.js:262
    const prior = await readFile(target, 'utf8').catch(() => '')
  • 读取本地文件
    jobs.js:351
    const st = await stat(file).catch(() => undefined)
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 本地记忆插件:soul / MEMORY / topics / inbox,提炼、压缩去重、备份与回收站

README

由 DeepSeek 最新模型翻译生成
dsh-mm DeepSeek Harness 的纯本地长期记忆插件:一个普通文件夹,四层 Markdown,没有数据库、没有网络请求。 - soul:人格与风格,注入 system prompt 靠前(默认 ≤4 KB) - MEMORY.md:长期记忆索引,注入 system prompt 靠后(默认 ≤4 KB,超限截断) - topics/:人物、项目、决策、偏好、教训、笔记,全部按 frontmatter 的 type 分类 - inbox/:每轮对话原文,不注入、不检索,提炼后归档 功能 记忆 - 每轮对话自动追加原文到 inbox/YYYY-MM-DD.md(可关闭) - 手动或自动提炼:inbox → MEMORY.md 索引 + topics/.md - 提炼去重:同一天二次提炼追加「补充」,跨次索引行与主题正文按行去重 - 大 inbox 文件按预算分段提炼,剩余内容回写 inbox,不会卡死或丢失 - memory 工具:search / read / write / list / delete 整理 - 定时合并去重:完全相同文件进回收站、大文件交给模型压缩 - 压缩前自动备份(可关),备份保留份数可配置(默认 10) - 提炼失败不归档原文,下次重试 - 归档同名加时间戳,绝不覆盖 设置页
展开完整文档(README 剩余 1 节)
dsh-mm

DeepSeek Harness 的纯本地长期记忆插件:一个普通文件夹,四层 Markdown,没有数据库、没有网络请求。

- soul:人格与风格,注入 system prompt 靠前(默认 ≤4 KB)
- MEMORY.md:长期记忆索引,注入 system prompt 靠后(默认 ≤4 KB,超限截断)
- topics/:人物、项目、决策、偏好、教训、笔记,全部按 frontmatter 的 type 分类
- inbox/:每轮对话原文,不注入、不检索,提炼后归档

功能

记忆

- 每轮对话自动追加原文到 inbox/YYYY-MM-DD.md(可关闭)
- 手动或自动提炼:inbox → MEMORY.md 索引 + topics/.md
- 提炼去重:同一天二次提炼追加「补充」,跨次索引行与主题正文按行去重
- 大 inbox 文件按预算分段提炼,剩余内容回写 inbox,不会卡死或丢失
- memory 工具:search / read / write / list / delete

整理

- 定时合并去重:完全相同文件进回收站、大文件交给模型压缩
- 压缩前自动备份(可关),备份保留份数可配置(默认 10)
- 提炼失败不归档原文,下次重试
- 归档同名加时间戳,绝不覆盖

设置页

- 概览:主题数、待提炼积压、预算进度、上次运行、下次整理、warning
- 核心文件:直接编辑 soul.md / MEMORY.md,实时字节预算,⌘S 保存
- 主题:搜索、按类型过滤、新建、编辑、移入回收站
- 自动化:对话记录、提炼、压缩、模型等全部参数
- 备份:创建、恢复、删除、保留份数
- 回收站:恢复(绝不覆盖同名)、彻底删除、清空

界面

设置页六个页签:概览、核心文件(soul / MEMORY 编辑器)、主题(搜索/新建/编辑/回收)、自动化、备份、回收站。

概览

主题

自动化

备份

文件夹结构

<dir>/
├── soul.md
├── MEMORY.md
├── topics/<slug>.md
├── inbox/
│ ├── YYYY-MM-DD.md
│ └── archive/
├── backups/<timestamp>/...
└── .trash/<timestamp>/...

backups/ 与 .trash/ 不参与注入、检索、压缩。

主题文件格式

name: 王工 description: 后端负责人,偏好 async 写法 type: person updated: 2026-10-27

- 负责后端上线
- 偏好 async/await

type 取值:person / project / decision / preference / lesson / note。
旧版的 people/、projects/ 等目录会在启动时自动迁入 topics/,类型写进 frontmatter。

提炼触发

- 积压 ≥ 阈值(默认 16 KB)且距上次 ≥ 1 小时
- 空闲达到设定分钟数(默认 30 分钟)
- 最后一个会话关闭
- 定时整理(默认 24 小时兜底)
- 设置页「立即提炼」

安装(GitHub)

dsh plugin --profile <profile> add github:huangbaba1992/dsh-mm

桌面版的 desktop profile 由应用管理,CLI 会拒绝直接写入;可在 设置 → 插件 中安装,或使用下面的本地 link 方式。

安装(本地 link)

package.json 里:

"dependencies": { "dsh-mm": "link:/absolute/path/to/dsh-mm" }

并把 dsh-mm 加进 dsh.profile.bundles。改完 Host 代码需要重启 DSH;改前端后刷新页面(若宿主未热更新则同样重启)。

插件 Config:

- insert:
- id: local-memory
name: dsh-mm
config:
dir: "~/.dsh/memory"
soulFile: soul.md
memoryFile: MEMORY.md
maxMemoryBytes: 4096

设置页保存的目录优先于 config.dir。

HTTP API

| Method | Path | 说明 |
| GET | /api/local-memory/state | 全部状态、主题元数据、备份、回收站、warning |
| GET/POST | /api/local-memory/file | 读文件 / 写 soul、MEMORY、topics/.md |
| POST | /api/local-memory/topic | 新建主题 |
| POST | /api/local-memory/delete | 主题移入回收站 |
| GET/POST | /api/local-memory/trash | 列出 / restore / purge / empty |
| GET/POST | /api/local-memory/backup | 列出 / create / restore / delete |
| POST | /api/local-memory/settings | 合并保存设置 |
| POST | /api/local-memory/distill | 立即提炼 |
| GET/POST | /api/local-memory/compact | 立即整理 / 查询状态 |

所有路径都经过白名单:inbox/、backups/、.trash/、.. 不可通过 Web 写入。

测试

node test/host.test.mjs
node test/client.test.mjs

- Host:桩 ctx + 真实 HTTP 路由 + 桩 llm,覆盖 capture、提炼、大文件、去重、备份、回收站、失败路径
- Client:最小 React 垫片渲染真实组件,覆盖概览、编辑保存、主题增删改、回收站、设置、备份

隐私

插件不发任何网络请求;只有你配置的模型调用会离开本机。文件都是普通 Markdown,可直接用编辑器、git 或 grep 管理。

License

MIT © 2026 huangbaba1992
预览分享卡片长什么样 ↓huangbaba1992/dsh-mm
分享 · DeepSeek Harness Hub
huangbaba1992/dsh-mm

把对话提炼成可检索的长期记忆与人格设定

这是你的仓库?认领条目

回到顶部