dsh-mind
v0.2.2
会话与记忆
写入文件发起网络请求
这是一个 DSH bundle,能为任意 DSH agent profile 加上**跨会话记忆**和 **Skill 生命周期管理**。所有数据都留在本地;唯一可选的外部服务是**用于语义搜索的免费额度云端向量库**(SiliconFlow + Qdrant),而且**默认关闭**。
作者原文(英文)
Give your DSH agent a mind: persistent memory + self-curating skills
中文简介由 DeepSeek 模型翻译,仅供参考。
检测报告
有一定能力。命中了若干能力模式,大多是插件正常工作时会用到的。
2需留意4一般18未命中
高关注需留意一般
能力清单
- 写入文件
writes-files需留意62 处命中lib/memory/archive.js:116writeFileSync(file, `${existing.trimEnd()}\n\n${section}`, 'utf8');lib/memory/archive.js:121mkdirSync(dir, { recursive: true });lib/memory/archive.js:122writeFileSync(file, `# ${topic}\n\n${section}`, 'utf8');lib/memory/auto.js:54mkdirSync(dir, { recursive: true });- 看写入位置。写自己的配置目录是正常的,写系统目录不是。
- 发起网络请求
network需留意40 处命中client/client.js:118const res = await fetch("/dsh-mind/memory");client/client.js:138const res = await fetch("/dsh-mind/memory", {client/client.js:154const res = await fetch(`/dsh-mind/memory/${idx}`, { method: "DELETE" });client/client.js:166const res = await fetch(`/dsh-mind/memory/${idx}/pin`, { method: "POST" });- 看请求发往哪些域名。发往作者自己的后端是常见做法。
- 读取文件
reads-files一般120 处命中lib/memory/archive.js:85if (!existsSync(dir))lib/memory/archive.js:87return new Set(readdirSync(dir).filter((f) => f.endsWith('.md') && f !== 'MEMORY.md').map((f) => f.slice(0, -3)));lib/memory/archive.js:113if (!existsSync(file))lib/memory/archive.js:115const existing = readFileSync(file, 'utf8');- 读文件是绝大多数插件的正常工作方式,本身不构成顾虑。
- 接触凭据或密钥
credentials一般32 处命中lib/memory/auto.js:8* bullets out of the recent transcript. Output is filtered for secrets,lib/memory/auto.js:37/** Lines that look like secrets — never persist them. */lib/memory/auto.js:38const SENSITIVE = /(sk-[a-zA-Z0-9_\-]{16,}|Bearer\s+\S+|api[_-]?key|access[_-]?token|password|secret|token)\s*[:=]\s*\S+…lib/search/config.js:4* Semantic search needs two cloud credentials (embedding API + vector store).- 看它读取哪些凭据、发往哪里。用于登录自己的服务是正常的。
- 读取环境变量
reads-env一般3 处命中lib/cli/bin.js:17const home = process.env['DSH_HOME'] ?? join(homedir(), '.dsh');lib/search/config.js:48const env = process.env;lib/routes.js:25const DSH_HOME = process.env.DSH_HOME ?? join(homedir(), '.dsh');- 环境变量里常混有密钥。看它是否把整个 env 都读走。
- 动态加载模块
dynamic-import一般1 处命中lib/routes.js:424const { unlink } = await import('node:fs/promises');- 动态导入本身无害,但会让依赖关系难以静态审阅。
逐条扫描明细
| 能力 | 标识 | 关注度 | 命中次数 |
|---|---|---|---|
| 写入文件 | writes-files | 需留意 | 62 |
| 发起网络请求 | network | 需留意 | 40 |
| 读取文件 | reads-files | 一般 | 120 |
| 接触凭据或密钥 | credentials | 一般 | 32 |
| 读取环境变量 | reads-env | 一般 | 3 |
| 动态加载模块 | dynamic-import | 一般 | 1 |
这份报告的口径
扫描读的是包里的源码,全程不执行第三方代码。 本次读了 63 个文件,扫描于 2026-10-14。 命中次数只说明源码里出现过这类调用,不说明行为好坏——一个插件读写文件 500 次和 1 次 都会被记为「读取文件」。这是能力清单,不是信任评分,也不是安全结论: 没扫出来的能力可能只是写法没被规则覆盖。
依赖安全公告
这个插件声明的依赖中,有 2 条已公开的安全公告 (最高等级:中):
| 等级 | 依赖包 | 编号 | 摘要 |
|---|---|---|---|
| 中 | yaml | CVE-2023-2251 | Uncaught Exception in yaml 修复版本:2.2.2 详情 → |
| 低 | yaml | CVE-2026-33532 | yaml is vulnerable to Stack Overflow via deeply nested YAML collections 修复版本:1.10.3, 2.8.3 详情 → |
查询的是依赖声明范围的下界(如 ^4.2.0 查 4.2.0),
不是实际安装到的版本。真正装的时候如果解析到了修复版本,就不受影响——
所以这是「可能受影响」,不是「这个插件有漏洞」。数据来自
OSV.dev。