dsh-memory 是 DeepSeek Harness DSH 的本地长期记忆插件,用 Git 做后端。
61.6/100
综合分
180
GitHub 星标
281
npm 周下载
—/5
用户评分
数据截至 2026/10/12 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-git-memorynpm 源 · dsh-git-memory 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · chat
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 23 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-git-memory @ 0.8.1
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 15:37:54
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件
查看扫描证据(共 59 处,展示前 47 条)
- 读取本地文件packages/dsh-git-memory/lib/index.js:59
summary = await readFile(join(DEFAULT_MEMORY_ROOT, "summary.md"), "utf8"); - 读取本地文件packages/dsh-git-memory/lib/index.js:83
return await readFile(path, encoding); - 写入本地文件packages/dsh-git-memory/lib/index.js:86
return await writeFile(path, data, options); - 写入本地文件packages/dsh-git-memory/lib/index.js:89
return await mkdir(path, { recursive: true }); - 读取本地文件packages/dsh-git-memory/lib/index.js:143
async function statOrUndefined(path) { try { return await lstat(path); } catch (error) { if (error?.code === "ENOENT") return undefined; throw error; - 写入本地文件packages/dsh-git-memory/lib/index.js:227
if (indexStat !== undefined) await copyFile(indexPath, backupPath); - 删除本地文件packages/dsh-git-memory/lib/index.js:230
if (indexStat === undefined) await unlink(indexPath).catch(() => {}); - 写入本地文件packages/dsh-git-memory/lib/index.js:231
else await copyFile(backupPath, indexPath); - 删除本地文件packages/dsh-git-memory/lib/index.js:234
await unlink(backupPath).catch(() => {}); - 删除本地文件packages/dsh-git-memory/lib/index.js:235
await rmdir(backupDirectory).catch(() => {}); - 删除本地文件packages/dsh-git-memory/lib/index.js:239
await unlink(backupPath).catch(() => {}); - 删除本地文件packages/dsh-git-memory/lib/index.js:240
await rmdir(backupDirectory).catch(() => {}); - 读取本地文件packages/dsh-git-memory/lib/index.js:246
const stat = await lstat(this.root); - 读取本地文件packages/dsh-git-memory/lib/index.js:248
const actual = await realpath(this.root); - 删除本地文件packages/dsh-git-memory/lib/index.js:267
await unlink(indexPath).catch(() => {}); - 写入本地文件packages/dsh-git-memory/lib/index.js:529
await writeFile(join(staging, record.path), migratedContent(record), { mode: 0o600 }); - 读取本地文件packages/dsh-git-memory/lib/operation-lock.js:16
const stat = await lstat(directory); - 写入本地文件packages/dsh-git-memory/lib/operation-lock.js:20
await mkdir(directory, { recursive: true, mode: 0o700 }); - 读取本地文件packages/dsh-git-memory/lib/operation-lock.js:26
try { return JSON.parse(await readFile(path, "utf8")); } - 写入本地文件packages/dsh-git-memory/lib/operation-lock.js:38
await writeFile(temporary, JSON.stringify(value, null, 2) + "\n", { mode: 0o600, flag: "wx" }); - 写入本地文件packages/dsh-git-memory/lib/operation-lock.js:39
try { await rename(temporary, path); } - 删除本地文件packages/dsh-git-memory/lib/operation-lock.js:41
await unlink(temporary).catch(() => {}); - 删除本地文件packages/dsh-git-memory/lib/operation-lock.js:67
await unlink(path).catch((unlinkError) => { - 删除本地文件packages/dsh-git-memory/lib/operation-lock.js:82
await unlink(path).catch((error) => { - 删除本地文件packages/dsh-git-memory/lib/operation-lock.js:106
await unlink(path).catch((error) => { - 读取本地文件packages/dsh-git-memory/lib/operation-lock.js:115
const stat = await lstat(directory); - 读取本地文件packages/dsh-git-memory/lib/operation-lock.js:121
const entries = await readdir(directory, { withFileTypes: true }); - 读取本地文件packages/dsh-git-memory/lib/legacy-migration.js:40
const entries = await readdir(directory, { withFileTypes: true }); - 读取本地文件packages/dsh-git-memory/lib/legacy-migration.js:68
const content = await readFile(file, "utf8"); - 读取本地文件packages/dsh-git-memory/lib/legacy-migration.js:73
mtime: (await stat(file)).mtime, - 读取本地文件packages/dsh-git-memory/lib/memory-usage.js:80
const stat = await lstat(path).catch((error) => { - 写入本地文件packages/dsh-git-memory/lib/memory-usage.js:85
if (stat === null) await mkdir(path, { recursive: true, mode: 0o700 }); - 写入本地文件packages/dsh-git-memory/lib/memory-usage.js:86
await chmod(path, 0o700); - 读取本地文件packages/dsh-git-memory/lib/memory-usage.js:91
const gitStat = await lstat(gitRoot).catch(() => null); - 读取本地文件packages/dsh-git-memory/lib/memory-usage.js:96
const excludeStat = await lstat(exclude).catch((error) => { - 读取本地文件packages/dsh-git-memory/lib/memory-usage.js:101
const current = await readFile(exclude, "utf8").catch((error) => { - 写入本地文件packages/dsh-git-memory/lib/memory-usage.js:109
await writeFile(exclude, `${current}${suffix}${missing.join("\n")}\n`, { mode: 0o600 }); - 写入本地文件packages/dsh-git-memory/lib/memory-usage.js:110
await chmod(exclude, 0o600); - 写入本地文件packages/dsh-git-memory/lib/memory-usage.js:117
await mkdir(lockPath, { mode: 0o700 }); - 写入本地文件packages/dsh-git-memory/lib/memory-usage.js:118
await writeFile(join(lockPath, "owner.json"), JSON.stringify({ pid: process.pid, started_at: new Date().toISOString() }) + "\n", { mode: 0o600 }); - 读取本地文件packages/dsh-git-memory/lib/memory-usage.js:122
const lockStat = await lstat(lockPath).catch(() => null); - 读取本地文件packages/dsh-git-memory/lib/memory-usage.js:124
const owner = await readFile(join(lockPath, "owner.json"), "utf8").then((raw) => JSON.parse(raw)).catch(() => null); - 删除本地文件递归packages/dsh-git-memory/lib/memory-usage.js:136
await rm(lockPath, { recursive: true, force: true }); - 删除本地文件递归packages/dsh-git-memory/lib/memory-usage.js:149
await rm(join(syncRoot, entry.name), { recursive: true, force: true }).catch(() => {}); - 删除本地文件递归packages/dsh-git-memory/lib/memory-usage.js:167
if (lockPath !== undefined) await rm(lockPath, { recursive: true, force: true }).catch(() => {}); - 读取本地文件packages/dsh-git-memory/lib/sync-transaction.js:154
return JSON.parse(await readFile(join(root, ".sync", "last-run.json"), "utf8")); - 读取本地文件packages/dsh-git-memory/lib/sync-transaction.js:162
const entries = await readdir(join(root, ".sync", "runs"));
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-settings@deepseek-ai/dsh-typert-protocol@deepseek-ai/schemastery@deepseek-ai/dsh-tools@deepseek-ai/dsh-client-ui-slots给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 本地长期记忆
- Git作后端
最近更新
在 GitHub 查看全部 →v0.10.02026-10-10
· dsh-memory v0.10.0
发布提交:f7b03757f8bf546d3c007f8e9a074a847b681d3d(合并 #42)。
· DSH desktop 0.2
· 导出一个易变的 Config,让 desktop SettingsForms 能读取 memory.enabled;从加载器持有的配置里读它,通过 loader/volatile-update 实时应用修改,再经 SettingsForms.update() 写回。0.1.x web 运行时保留旧的 settings.register() 作用域。
· 可选设置服务一出现就绑定,不再在启动时只采样一次;没有设置后端时写入会以 settings-unavailable 失败,不再报成功,设置读不出来时按失败处理。
· 把 peer 范围放宽到 >=0.2.0-rc.2,.json、.sync/last-run.json 和 .last-sync 不碰运行时状态,比如操作锁。
· 修复
· clearActiveRun 拿驼峰式 runId 去比主机写入的下划线式 run_id,导致 UI 迁移/回滚/清除后 active-run.json 残留,之后每次同步都被 operation-in-progress 挡住。
· 混合搜索按文件名顺序给原始词法分量排名;现在按词法得分排名。
· 带查询的 memory_context 保持相关性顺序,不再按使用次数重排;不带查询时,默认活跃范围也排除被取代/归档的记录。
· 回滚拒绝脏的 payload 工作树(rollback-dirty-worktree),移动 HEAD 后失败会恢复 HEAD、索引和 payload。
· memory 提示词段落不做模板展开(interpolate: false,花括号中和),刷新按代次排序(不重复、不复活段落),提示词里不再出现 memory 绝对路径。summary.md 为空时给一条简短提示,不再给空快照。
· memory 关闭时 memory_search/memory_context 返回 memory-disabled,limit 用整数 schema 限定在 1–20,scope 限定为枚举,面向模型的输出里去掉排名内部细节和哈希。
· 测试与工具
· run-memory-tests.sh 跑全部套件并报告所有失败;运行时测试检查模块行为,不再比对源码文本。
· 新增:主机契约、排名、代次发现、desktop 命令行解析。
· test:desktop-compat 用真实 desktop 依赖图加载插件(DSH_DESKTOP_NODE_MODULES);CI 对 0.1.5-rc.1 和 0.2.0-rc.2 跑运行时契约,cordis/schemastery 取自该版本的元数据。
· npm test 在 marketplace 包漂移时失败。
· 更早的未发布兼容工作
· 对照 DSH desktop 0.1.7-rc.1 验证 Host 和客户端入口;从 memory UI 移除旧的 client-runtime 注入。
· 让 Host 入口和 peer 范围适配 DSH 0.1.5-rc.1。
· 增加真实运行时导入覆盖,同时保留旧测试。
· 扫描 V3 会话时不重复处理 V2;给待处理的代次变更加围栏。
· 安装
· DSH desktop 应用 0.2.x
"/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh" \
plugin --profile desktop add github:seriousz158/dsh-memory#v0.10.0
· DSH web 运行时 0.1.x
dsh plugin --profile web add github:seriousz158/dsh-memory#v0.10.0
Desktop 配置档:只装聚合包 dsh-git-memory(不要和 dsh-memory-ui 一起装)。见 docs/installation.md。
v0.9.32026-09-20
· dsh-memory v0.9.3
发布提交:3719832d5c8ef20fefedc50c3395f614d1b29d53(合并 #35)。
· 修复
· 检索未分词的中文查询。每个中日韩字符都匹配 \p{L},查询分词器会把整句中文压成一个 token;rawLexicalScore 按子串匹配,retrieve 又会丢弃得分为零的记录,所以不带空格的中文查询什么都返回不了(实测:记忆系统的已知缺陷与优化路线 返回 0 条,而 记忆 系统 缺陷 返回 74 条)。现在查询 token 还会展开成相互重叠的中日韩双字组,长中文查询靠相邻字对重叠来匹配,按命中数排序。非中文查询不受影响。
· 接受记录 front matter 中不缩进的块状列表。暂存校验器(sync-apply.py)和插件校验器(memory-metadata.js)都要求列表项缩进,把合法 YAML 判成 invalid-metadata 拒掉,而元数据约定只禁止流式集合。现在两者都接受两种块状写法,仍然拒绝 [a, b] 和块标量。
· front matter 被拒时指出出错的路径、字段和行号,失败的运行能定位到文件,而不是只报一个错误码。
· 调高 public-tree 守卫里 Git 索引快照的 maxBuffer。execFileSync 默认 1 MiB,树一旦超过这个大小,守卫就报 cannot construct Git index snapshot。
· E2E 验收测试前先探测 Playwright 浏览器二进制。守卫只检查 python3 是否存在,Playwright 升级后没装配套浏览器就会让 npm test 失败,而不是按文档说的跳过。
· 新增
· integrations/dsh/dsh-memory-housekeeping.py:一个确定、幂等的主机侧处理流程,给旧记录补上最小的 schema v1 front matter(沿用插件 legacy-migration.js 的 id 推导方式),并把被取代或长期无人引用的记录就地归档,标为 status: archived。记录从不移动:source_rollouts 必须以 rollouts/ 开头,挪进 archive/ 会让所有指向它的引用失效。
· 变更
· integrations/dsh/dsh-memory-sync 现在写明 front matter 允许的取值(type/status/confidence 枚举)和 summary.md 的写入预算:软上限 6 KiB,recent-terminal-state 一节每个项目一行;超出硬预算时只丢弃 summary 改动,而不是拒掉整个 diff。操作锁绑定到同步进程,而不是短命的辅助进程,中断的运行不会再堵住下一次运行六个小时。
· 验证
· npm test 通过:密钥扫描、public-tree 守卫、memory 测试套件(含 52 例检索评测)、发布守卫、运行时导入契约。
· 在真实 DSH 主机上做零服务商验收:dsh-memory-sync --scan-only --json 报告 ok:true、scanOnly:true,且未改动 .last-sync。
· 检索冒烟:记忆系统的已知缺陷与优化路线 返回 86 条(此前 0 条)。
· CI:PR #35 上 test 和 dsh-current-imports 均通过。
归档时记录从不移动;source_rollouts 必须以 rollouts/ 开头,把记录挪进 archive/ 会让所有引用失效。
v0.9.22026-09-01
· dsh-memory v0.9.2
· 修复
· 给 FTS5 MATCH 词加引号,让 pending-candidates 这类带连字符的标识符仍走混合检索路径。
· 在检索评测里加一个回归用例,并保持公开 marketplace 包同步。
· 分发与安全
· 通过 GitHub 源码安装和 GitHub Releases 分发,未发布到 npm。
· 本版本不发起任何服务商/模型请求,也不改动记忆同步暂存策略(v0.9.1)。
· 已知限制:单个候选超过 MAX_CANDIDATE_BYTES 仍会导致整批被拒;跳过并记日志留到后续 issue 处理。
SHA256: 7d2754346dfa06bd9b1258fb611f131825da3090ec7cb9802d6cc957d914663d
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成dsh-memory
dsh-memory 是 DeepSeek Harness (DSH) 的本地长期记忆插件,用 Git 做后端。
它新增一项持久化设置、一套安全的设置页工作流用来清空记忆,还有一个可选的空闲会话同步器。只有当 memory.enabled 为 true 时,宿主插件才会注入记忆指引;UI 插件让你查看仓库状态、切换这项设置,并通过刻意的两步确认清空已学习的记忆。
它能做什么
- 把持久记忆存进本地 Git 仓库,而不是这个源码仓库,也不是托管服务。
- 立即注册 memory 设置命名空间,所以 memory.enabled 对下一次模型调用就生效,不用重启 DSH。
- 在 DSH 设置里显示一行长期记忆,带仓库状态,以及需要双重确认的 Delete memory 操作。
- 清空 summary.md、handbook/、rollouts/ 和 archive/ 之前保留一个 Git 恢复点:干净的仓库复用现有 HEAD,脏的目标路径会拿到一个专门的检查点提交;下一次提交记录清空后的状态。
- 拒绝不安全的仓库布局、符号链接逃逸、非仓库根目录,以及清空操作期间的路径竞争。
- 可以通过可选的无头同步器,只处理空闲的本地会话日志。同步器默认使用 workspace-write,绝不静默安装 DSH,只转发白名单内的环境变量。
展开完整文档(README 剩余 1 节)
dsh-memory
dsh-memory 是 DeepSeek Harness (DSH) 的本地长期记忆插件,用 Git 做后端。
它新增一项持久化设置、一套安全的设置页工作流用来清空记忆,还有一个可选的空闲会话同步器。只有当 memory.enabled 为 true 时,宿主插件才会注入记忆指引;UI 插件让你查看仓库状态、切换这项设置,并通过刻意的两步确认清空已学习的记忆。
它能做什么
- 把持久记忆存进本地 Git 仓库,而不是这个源码仓库,也不是托管服务。
- 立即注册 memory 设置命名空间,所以 memory.enabled 对下一次模型调用就生效,不用重启 DSH。
- 在 DSH 设置里显示一行长期记忆,带仓库状态,以及需要双重确认的 Delete memory 操作。
- 清空 summary.md、handbook/、rollouts/ 和 archive/ 之前保留一个 Git 恢复点:干净的仓库复用现有 HEAD,脏的目标路径会拿到一个专门的检查点提交;下一次提交记录清空后的状态。
- 拒绝不安全的仓库布局、符号链接逃逸、非仓库根目录,以及清空操作期间的路径竞争。
- 可以通过可选的无头同步器,只处理空闲的本地会话日志。同步器默认使用 workspace-write,绝不静默安装 DSH,只转发白名单内的环境变量。
能力
这份 README 描述稳定的面向用户行为。逐版本的实现细节有意不放在这一页;历史变更见 CHANGELOG.md 和 GitHub releases。
本地 Git 后端记忆
- 记忆留在本地 Git 仓库里。没有托管记忆服务,也没有云端向量数据库。
- Markdown 记录支持 front matter、带命名空间的 id、来源信息、过期投影、确定性冲突处理,以及旧版兼容。
- summary.md 是简短的导航快照;详细知识放在 handbook/、rollouts/ 和 archive/。
安全同步与恢复
- 可选的空闲会话同步在每次运行私有的工作区里跑。模型只能编辑隔离的副本;宿主负责校验并写入实时的 Git 仓库。
- 宿主提供 dry-run/preview/apply 流程、操作锁、健康检查、有界批次、重试退避、重复 id 诊断,以及只含元数据的日志。
- 恢复/应用提交、回滚、备份导出/导入,以及旧版迁移,让变更可审计、可回退。迁移通过 CLI/宿主 API 提供,不在设置 UI 里。
读取路径
- 启用后,模型可以拿到一份有界且明确不可信的 summary.md 快照(最大 12 KiB)。
- memory.search() 和 memory.context() 提供本地、有界的检索带来源引用和基于使用情况的确定性排序。检索是混合式的:一个派生的 SQLite 索引(FTS5 trigram + CJK 二元组/词项,存放在 .sync/search-index.sqlite,权限受限)与词法评分、精确子串优先融合,当索引缺失、过期或损坏时,会透明地回退到纯扫描。
- 读取使用情况作为私有元数据存放在 .sync/usage.json;转录、提示词、凭据和记忆内容不会写入日志。
DSH 设置集成
设置界面提供记忆开关、仓库状态、最近同步状态、预览操作、回滚,以及需要明确确认的清除操作。它不暴露文件系统根目录,也不直接执行 Git。
兼容性
v0.10.0 面向 DSH 桌面应用 0.2.x,并保留 0.1.x Web 运行时的 peer 范围:
| 组件 | 支持的版本 |
| DSH 桌面应用 | 0.2.0-rc.2(peer 范围 >=0.2.0-rc.2 <0.3.0) |
| DSH Web 运行时 peer 范围 | ^0.1.0-rc.6 \|\| 0.1.5-rc.1 \|\| 0.1.7-rc.1 |
| 净室开发测试依赖图 | DSH 客户端包 0.1.0-rc.7 |
| Node.js | 22.x |
| Python | 3.11.x |
| Git | PATH 上可用的本地可执行文件 |
| 操作系统 | macOS 是受支持/已测试的集成目标 |
本包使用 DSH 的 Cordis 加载器接口。rc.7 依赖图是可复现的开发和集成基线,因为注册表的 rc.6 传递 peer 依赖图无法用普通的 npm ci 安装;这不改变宿主/UI 包声明的 rc.6 运行时 peer 范围。DSH rc.8 及之后的版本在通过本仓库的测试套件之前均未经验证。
安装
DSH 插件包(推荐)
仓库根目录同时也是一个名为 dsh-git-memory 的公开 DSH 包。它包含宿主插件、设置页客户端包,以及对应的 dsh.bundle 补丁,因此一次安装即可激活两部分:
GitHub 源码安装(在 npm 发布之前或没有 npm 发布时也可用)
dsh plugin --profile web add github:seriousz158/dsh-memory
DSH 桌面应用 0.2.x:使用应用自带的 CLI 和 desktop 配置档
"/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh" \
plugin --profile desktop add github:seriousz158/dsh-memory
桌面配置档规则(仅限聚合包、默认记忆根目录)见 docs/installation.md。
本项目通过 GitHub 源码安装和 GitHub Releases 分发,未发布到 npm。
安装后重启选定的 DSH 配置档。包中不包含任何记忆数据、会话日志、凭据或本地 .dsh 目录。
源码检出(开发 / 本地集成)
克隆仓库并安装可复现的开发/运行时依赖:
git clone https://github.com/seriousz158/dsh-memory.git
cd dsh-memory
使用本次 v0.8.4 集成测试所用的固定运行时。
npm install --global @deepseek-ai/dsh@0.1.0-rc.7
dsh --version
npm ci --ignore-scripts
两个 workspace 实现包保持私有,只有根目录的 dsh-git-memory bundle 可以发布。这样内部 host/UI 包名保持稳定,同时避开已被占用的无 scope 的 dsh-memory npm 名称。
把这两个本地包安装到你的 DSH 配置档。安装器默认使用 ~/.dsh。如果你用了非默认的 DSH 或 memory 路径,请在安装、启动、校验、同步 DSH 的环境里保持同一组值:
./integrations/dsh/install.sh
Example for a non-default DSH home and memory repository:
export DSH_HOME="$HOME/.config/dsh"
export DSH_MEMORY_ROOT="$HOME/Documents/dsh-memory-data"
./integrations/dsh/install.sh
Start DSH from this configured environment as well.
安装器只创建这些 DSH 配置档链接和两个必需的 Cordis 条目:
<DSH_HOME>/profiles/node_modules/dsh-memory
<DSH_HOME>/profiles/node_modules/dsh-memory-ui
它还会把缺失的 memory root 初始化为私有本地 Git 仓库。如果 memory 仓库已经完整存在,它会校验目录结构并恢复仅属主可访问的权限;它不会删除或改写已学习的记忆、会话历史、凭据、其他插件,或无关的 cordis.patch.yml 条目。使用自定义 memory root 之前,请先看安装细节。
安装完成后重启 DSH host。在 DSH Settings 里找到 长期记忆,保持开关打开,下一次模型调用即可启用回忆。
存储布局
默认情况下,host 使用:
<DSH_HOME>/storages/memory
DSH_HOME 默认为 ~/.dsh。运维人员可以把 DSH_MEMORY_ROOT 设为其他本地绝对路径。安装器、每次启动 DSH host、显式运行 initializer、以及可选的 synchronizer 运行时,它都必须存在;一次性安装时赋值不会配置后续的 LaunchAgent 任务。Web UI 无法提交或修改文件系统路径。
初始化后的仓库包含:
summary.md short, stable navigation and preferences
handbook/ reusable knowledge
rollouts/ per-session extraction results
archive/ superseded entries
scripts/ transcript filter helper
.last-sync optional synchronizer watermark
设置与 API
唯一持久化的设置是:
memory:
enabled: true
本地 UI 只与固定的 memory 远程服务通信:
memory.getSettings()
memory.setEnabled({ enabled: boolean })
memory.status()
memory.legacyRecords()
memory.migrateLegacy({ dryRun: boolean })
memory.clear({ confirmation: "DELETE_MEMORY" })
status() 返回 empty、dataFileCount、targetDirty、recoverable 等元数据;它从不返回记忆正文。完整的请求/响应契约和稳定错误码见 docs/api.md。
安全清空记忆
设置 UI 有意要求两次确认:
1. 点击 删除记忆,查看受影响的路径,然后点击 继续。
2. 原样输入 删除记忆,然后点击最终确认。
清除操作用于日常可恢复的重置,并不保证彻底抹除隐私。在改动任何目标记忆路径之前,它会先保留一个恢复点:对于干净的仓库,恢复点就是现有的清除前 HEAD;而对于有未提交改动的目标路径,则会记录在一个专门的检查点提交里。随后,清除提交直接创建在这个恢复点之上。该操作会保留 .git、README.md、辅助脚本、目录结构和 .last-sync,这样后续会话仍能重新学习,无需重新处理历史日志。
在本地记忆仓库里使用 Git 历史来恢复检查点。如果有隐私敏感的删除要求,请移除相关本地备份,并遵循你所在组织的保留策略;仅靠 Git 历史并不是安全的抹除机制。
可选的空闲会话同步
可选的同步器独立于设置界面:
./integrations/dsh/dsh-memory-sync
当 memory.enabled 为 false 时它会跳过工作,也会跳过活跃会话。它需要用户自行安装的 dsh 可执行文件(或显式指定的 DSH_BIN),而不是调用 npx --yes。它默认使用 workspace-write;更宽的权限绝不会成为仓库默认值。LaunchAgent 模板显式设置了默认的 DSH 和记忆路径;如果你的安装是自定义的,加载前请先修改这两处赋值。
在转录内容送达记忆提取模型之前,会话过滤器会抹掉常见凭据格式和主目录前缀。这是纵深防御,并不承诺能检测出所有密钥格式。启用无人值守同步前,请先阅读隐私与恢复。
开发
运行完整的本地测试套件:
npm ci --ignore-scripts
npm test
测试使用临时 Git 仓库和合成夹具。它们不得要求 DSH 账号、启动 Chrome、加载 LaunchAgent、读取当前用户的记忆/会话文件夹,或发起付费模型请求。
在提交 issue 或 pull request 之前,请运行:
npm test
zsh tools/secret-scan.sh
参见 CONTRIBUTING.md、SECURITY.md 和发布检查清单。
隐私承诺
本仓库只包含代码、测试、模板和示例。它绝不能包含任何真实的 DSH 记忆、会话日志、凭据文件、浏览器配置档或用户特定的 DSH 配置。如果你认为敏感数据已被提交,请视其为已泄露,轮换受影响的凭据,并遵循 SECURITY.md。
许可证
MIT © 2026 seriousz158。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
seriousz158/dsh-memory
dsh-memory 是 DeepSeek Harness DSH 的本地长期记忆插件,用 Git 做后端。
相关插件 · 对话 / 记忆
上下文中枢oceanbase/powercontext
上下文跟着工作走 —— 跨会话、跨智能体、跨人。
★ 1,487已汉化DSH
73
智能体记忆库plastic-labs/honcho
Honcho 是记忆基础设施,用来构建有状态的智能体。这些智能体能理解不断变化的人、智能体、群组、项目和想法。
★ 7,894已汉化DSH
71.7
长程智能体控制面loopx-project/loopx
给 Agent 一个目标,让工作持续向前。
★ 6,358已汉化DSH
71.3
智能体上下文数据库volcengine/OpenViking
给 AI 智能体用的上下文数据库
★ 41,379已汉化DSH
71.3
长效机器人团队Fei2411/DS-Bot
DS Bot 是一个基于 DeepSeek Harness简称 dsh的 bot 插件,插件将 dsh 改造为 bot…
★ 5,084已汉化DSH
71.1
可携带记忆层EverMind-AI/EverOS
为什么选择 EverOS
★ 13,778已汉化DSH
71.1