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

记忆管理 sanqiuyef/dsh-memory-manager

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

让智能体跨会话记住全局与项目笔记并自动注入上下文

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

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

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

状态速览

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

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 48 处,展示前 30 条)
  • 发起网络请求
    client/client.js:514
    response = await fetch(API_BASE + path, init)
  • 读取本地文件
    lib/store.js:298
    await readFile(lockPath, 'utf8');
  • 读取本地文件
    lib/store.js:319
    return await readFile(lockPath, 'utf8');
  • 写入本地文件
    lib/store.js:330
    await writeFile(claim, `${process.pid}\n`, { mode: 0o600, flag: 'wx' });
  • 删除本地文件
    lib/store.js:338
    await rm(lockPath, { force: true });
  • 删除本地文件
    lib/store.js:344
    await rm(claim, { force: true }).catch(() => {});
  • 删除本地文件
    lib/store.js:370
    await rm(lockPath, { force: true }).catch(() => {});
  • 写入本地文件
    lib/store.js:380
    await rename(temp, target);
  • 写入本地文件
    lib/store.js:391
    await mkdir(dirname(filename), { recursive: true });
  • 写入本地文件
    lib/store.js:394
    await writeFile(temp, content, { mode: options.mode ?? 0o600, flag: 'wx' });
  • 删除本地文件
    lib/store.js:397
    await rm(temp, { force: true }).catch(() => {});
  • 读取本地文件
    lib/store.js:438
    names = await readdir(dir);
  • 读取本地文件
    lib/store.js:454
    const [text, info] = await Promise.all([readFile(path, 'utf8'), stat(path)]);
  • 读取本地文件
    lib/store.js:454
    const [text, info] = await Promise.all([readFile(path, 'utf8'), stat(path)]);
  • 读取本地文件
    lib/store.js:484
    const text = await readFile(join(dir, INDEX_NAME), 'utf8');
  • 写入本地文件
    lib/store.js:725
    await mkdir(roots.globalDir, { recursive: true });
  • 写入本地文件
    lib/store.js:726
    await mkdir(roots.projectsDir, { recursive: true });
  • 删除本地文件
    lib/store.js:945
    await unlink(removedPath);
  • 读取本地文件
    lib/routes.js:138
    return { key: projectKey, dir, name: projectName(projectKey), exists: existsSync(dir) };
  • 执行外部命令来自配置/变量
    lib/routes.js:430
    child = spawn(command, [path], { detached: true, stdio: 'ignore' });
  • 读取本地文件
    lib/routes.js:473
    if (!existsSync(dir)) throw new ApiError('not-found', `the memory directory does not exist yet: ${dir}`, 404);
  • 写入本地文件
    lib/candidates.js:76
    await mkdir(dir, { recursive: true });
  • 读取本地文件
    lib/candidates.js:97
    await stat(path);
  • 读取本地文件
    lib/candidates.js:107
    const names = (await readdir(dir)).filter((name) => name.startsWith('candidates-') && name.endsWith('.json')).sort();
  • 删除本地文件
    lib/candidates.js:109
    await rm(join(dir, name), { force: true });
  • 读取本地文件
    lib/candidates.js:120
    const text = await readFile(join(candidatesDirFor(store, { scope, projectKey }), id), 'utf8');
  • 读取本地文件
    lib/candidates.js:137
    names = (await readdir(dir)).filter((name) => name.startsWith('candidates-') && name.endsWith('.json')).sort().reverse();
  • 删除本地文件
    lib/candidates.js:160
    await rm(join(candidatesDirFor(store, { scope, projectKey }), bundle.id), { force: true });
  • 读取本地文件
    client/selfcheck.mjs:36
    const source = readFileSync(sourcePath, 'utf8')
  • 发起网络请求
    client/selfcheck.mjs:377
    fetch() {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 记忆管理器:全局与项目级 markdown 记忆,提供 memory_* 工具、系统提示词摘要注入,以及只读的设置页。 · DSH 记忆管理(全局 + 项目级)

README

由 DeepSeek 最新模型翻译生成
dsh-memory-manager DeepSeek Harness(DSH) 的原生插件,为智能体提供持久化的、基于文件的记忆。它注册五个 memory_* 工具,把最相关笔记的摘要注入系统提示词,并附带一个设置页,用来浏览、搜索和整理这些笔记。记忆是纯 Markdown 文件,带 YAML frontmatter,存放在本仓库之外的 DSH home 下,因此插件升级后依然保留,任何编辑器都能直接读取。它以 bundle(cordis.patch.yml)形式安装进 DSH,采用 MIT 许可证发布。 DSH(DeepSeek Harness)桌面端原生插件:记忆管理(全局 + 项目级)。工具、注入、UI 全在插件里,不依赖 MCP。
展开完整文档(README 剩余 1 节)
dsh-memory-manager

DeepSeek Harness(DSH) 的原生插件,为智能体提供持久化的、基于文件的记忆。它注册五个 memory_* 工具,把最相关笔记的摘要注入系统提示词,并附带一个设置页,用来浏览、搜索和整理这些笔记。记忆是纯 Markdown 文件,带 YAML frontmatter,存放在本仓库之外的 DSH home 下,因此插件升级后依然保留,任何编辑器都能直接读取。它以 bundle(cordis.patch.yml)形式安装进 DSH,采用 MIT 许可证发布。

DSH(DeepSeek Harness)桌面端原生插件:记忆管理(全局 + 项目级)。工具、注入、UI 全在插件里,不依赖 MCP。

- 目标宿主:DSH ≥ 0.2.1-rc.2(desktop profile,见 package.json 的 engines)
- 许可:MIT(见 LICENSE)

它做什么

| 能力 | 说明 |
| 5 个工具 | memory_write / memory_read / memory_search / memory_list / memory_delete |
| 记忆注入 | systemPrompt section memory:digest:全局索引整段(≤1200 token)+ 当前项目索引头部 K 条;同步缓存、事件驱动刷新 |
| 作用域 | 全局 = 跨项目事实;项目级 = 按 session cwd 推导项目键 <slug>-<sha256(路径)[0:16]>(与 ZCode 的目录命名方案一致) |
| 设置页 | 设置 → 记忆:全局/项目 tab、列表、搜索、全文、诊断、打开目录;新建 / 编辑 / 删除条目 |
| 安全 | 原子写 + 文件锁 + 写前重读;并发写不丢条目 |

安装

从本仓库构建一个可安装的 tarball,再用 DSH 的插件管理器装进去:

npm pack # 产出 dsh-memory-manager-<version>.tgz

把得到的 .tgz 交给 DSH 的插件管理器安装(plugin_manager 的 install_bundle,或在「设置 → 插件」中选择该文件)。宿主需要真实目录形态的包,不要用 link: 之类的工作区链接。
安装后重载 / 重启 DSH,设置面板左侧会出现「记忆」一节。

也可以直接从本仓库的 Releases 页面下载已打好的 dsh-memory-manager-<version>.tgz,再按上面的方式安装。

运行要求:Node.js ≥ 20。运行时依赖只有 yaml;@deepseek-ai/cordis 由宿主提供(peerDependencies)。

记忆数据不随包发布:它写在 DSH home 下的 memories/(见下一节),既不在本仓库里,也不在 tarball 里 —— 仓库与发布包都不含任何个人记忆内容。

存储

globalDir = $DSH_HOME/memories/global # 全局(跨项目)
projectsDir = $DSH_HOME/memories/projects # 项目级
<slug>-<hash16>/memory/{MEMORY.md, <name>.md}

$DSH_HOME 默认为 ~/.dsh。两个根都可以覆盖:插件 config 的 memoryRoots.{global,projects} (或 globalDir / projectsDir)、环境变量 GLOBAL_MEMORY_DIR / DSH_MEMORY_PROJECTS_DIR;优先级是 config → 环境变量 → 默认值。默认只落在 DSH 自己的目录里,不会去写别的工具的记忆目录。

笔记格式(frontmatter name / description / metadata.type + 短正文)与 ZCode、 global-memory 的 Markdown 约定一致:任何文本编辑器都能直接读写。

结构

| 路径 | 说明 |
| lib/index.js | host 入口:name/inject/apply;工具注册 + systemPrompt section + HTTP 路由 |
| lib/store.js | 存储层:解析/索引/原子写/文件锁/摘要缓存 |
| lib/tools.js | 5 个工具 |
| lib/project-key.js | 项目键推导(<slug>-<sha256(路径)[0:16]>) |
| lib/routes.js | HTTP 路由(鉴权后:只读查询 + 写条目 / 打开目录) |
| client/client.js | 设置页(settings.section,手写 CJS,无构建) |
| client/selfcheck.mjs | 设置页脚本的自检(不依赖宿主) |
| scripts/smoke.mjs | 离线断言(不依赖宿主) |
| cordis.patch.yml | bundle 补丁:只插入本插件自己的一行宿主条目 |
| LICENSE | MIT 许可证全文 |

测试

两条离线命令,不需要宿主,也不读写真实记忆目录:

node client/selfcheck.mjs # client 半侧:模块形态、导航装饰器的 DOM 行为与清理
node scripts/smoke.mjs # host 半侧:项目键、笔记格式、存储、检索、摘要、路由、并发写

设置导航图标(临时装饰,见 v0.2.1)

DSH 设置面板左侧导航的图标由外壳 @deepseek-ai/dsh-client-ui-settings-general 的 navIcon(id) 写死,只认 account / models / agent-presets / plugins / archived-sessions,未知 id 一律兜底成齿轮;而 settings.section 的注册参数只有 id / order / label,插件无法自带图标。于是本插件的「记忆」一行显示成齿轮,与「设置」入口撞脸。

client/client.js 因此在面板出现时做一次防御式装饰:只匹配 [data-shortcut-modal="settings"] 内 span.navLabel 文案恰好等于本插件 nav 文案(zh/en)的那一行,把外壳的兜底 用 display:none 隐藏,并在其前面插入本插件自己的 16×16 记录本图形(描边 1.3,与 DSH Medium 图标一致)。
DOM 结构不符预期就什么都不做(保留原齿轮、不抛错);缺 document / MutationObserver / createElementNS 时直接返回空清理函数,一行 DOM 都不碰;ctx.effect 的清理函数会移除插入的图形、恢复齿轮显示并断开 observer。
不会修改 DSH 安装目录或 app.asar。

移除条件:一旦 DSH 给 settings.section 的注册参数加上 icon,就删除 client.js 里 Settings-nav glyph 整段代码(连同 NAV_PANEL_SELECTOR / NAV_GLYPH_ATTR / NAV_GLYPH 三个常量与 apply() 里那个 settings-nav glyph effect),改为在注册参数中声明 icon。

主题 token 修正(0.2.2)

设置页原先引用了两个 DSH 主题里并不存在的变量——CSS 变量名写错不会报错,只会让 var() 在计算值阶段失效,color / font-family 静默回退成继承值(错误态只剩文案、危险按钮与普通按钮同色):

| 原引用 | 主题里的正确 token | 本页处数 |
| --dsw-alias-label-error | --dsw-alias-state-error-primary(浅色 --dsw-static-red-600 / 深色 --dsw-static-red-400;宿主设置页自用同款) | 12 |
| --dsw-font-mono | --ds-font-family-code(主题的等宽栈) | 7 |

现已全部替换为宿主 token,未引入字面量兜底。核对方式(可重复,升级 DSH 后请重跑):把设置页里每个
var(--…) 与 DSH 客户端产物中真实存在的 token 定义逐一比对,出现未定义的名字即为失败。

已知限制

- 设置页与工具都是单条目操作:新建 / 更新 / 删除;没有批量整理、重命名或跨作用域移动。
- 不做隐式自动抽取:extract.enabled 打开后每轮最多触发一次,产出只进候选区,需在 UI 采纳。
- 检索没有 embedding:当前是与 global-memory 相同的纯打分检索,可选 LLM 选择器做二次挑选。

License

MIT © 2026 sanqiuyef — 全文见 LICENSE。
预览分享卡片长什么样 ↓sanqiuyef/dsh-memory-manager
分享 · DeepSeek Harness Hub
sanqiuyef/dsh-memory-manager

让智能体跨会话记住全局与项目笔记并自动注入上下文

这是你的仓库?认领条目

回到顶部