为 DeepSeek Harness 提供分层的全局与工作区记忆:Web 面板中查看、控制条目并调整记忆整理与整合设置;索引常驻上下文、详情按需加载,每个对话手动选择要加载的记忆层。
安装
# npm 包(预构建)
dsh plugin --profile web add dsh-snail-memory
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:snaiheihei/dsh-snail-memory
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
DeepSeek Harness(dsh)插件:单用户、全局 / workspace 分层的记忆。在 Web 面板里查看、控制记忆条目,调整对话记忆的整理与整合;启用后索引常驻上下文、详情按需加载,每个对话手动选择要加载的记忆层。
Layered single-user global and workspace memory for DeepSeek Harness, with a web panel to browse entries and tune distillation and consolidation, an index kept in context with records loaded on demand, and a per-session choice of layer.
- npm 包名:
dsh-snail-memory - 源码:https://github.com/snaiheihei/dsh-snail-memory
- 兼容:dsh
>=0.2.1-rc.3 <0.3.0-0,Node>=22.19.0 - 协议:MIT
功能
- 两级记忆:
global(跨工作区)与workspace(绑定单个工作区)相互独立,各自有 revision。 - 显式开关:记忆不会自动进入上下文。每个 Session 里手动启用某一层,用
refresh生成新快照,disable关闭。 - 只追加注入:快照通过
agent.inject()作为一条user消息追加(source.kind = "snail-memory"),插件从不改写、替换或删除既有会话消息。 - 可对账的注入:每次注入带稳定
injectionId,区分desired → queued → committed;只有观察到会话里真正落盘的user/message才算 committed,重启后按会话日志对账,不会重复注入。 - 生命周期维护:统计完成的真实用户轮次,按空闲时间蒸馏记忆,分别调度 workspace 与 global 的 consolidation,并按分类执行 retention 清理。会话活动只推进内存中的空闲期限,最近一次 transcript 不可用的 Session 会退避重试并在有限次数后放弃。
- 模型工具:
snail_memory_read(按 id 读取,大对象先返回分片清单)、snail_memory_feedback(对已 committed 快照里的记忆打 helpful / unhelpful / incorrect)。 - 斜杠命令:
/memory status、/memory remember workspace <text>、/memory correct workspace <id> <text>、/memory forget workspace <id>。 - Web UI:输入框左侧记忆按钮,侧栏
Memory面板(全局 / 工作区 / 设置三个标签),可查看条目、引用、最近一次已提交快照与 token 估算。 - 单写者:同一数据根目录下允许多个 Host 启动,但只有一个持有写锁,其余自动只读;锁有心跳与 stale 回收,写操作带 fencing 校验。
安装
任选一种,然后重启 Host 并刷新页面。
# 1) 从 npm 安装
dsh plugin --profile web add dsh-snail-memory
# 2) 从 tarball 安装
dsh plugin --profile web add .\dsh-snail-memory-0.1.0.tgz
# 3) 从解压后的目录安装
dsh plugin --profile web add .\dsh-snail-memory
# 4) 从 Git 安装(需要该 tag/commit 带上构建产物)
dsh plugin --profile web add github:snaiheihei/dsh-snail-memory#v0.1.0
装完先确认组合层生效,再启动:
dsh --profile web --dump-config # 应出现 "# == dsh-snail-memory"
卸载:dsh plugin --profile web remove dsh-snail-memory。
使用
- 打开一个 Session,点击输入框左侧的记忆按钮,选择 global 或 workspace 启用。
- 启用后当前记忆索引会作为一条快照注入;之后对话中可随时
refresh生成新快照。 - 侧栏
Memory面板可浏览条目、查看详情、删除、promote 到 global,以及调整全局设置。 - 需要沉淀新记忆时用
/memory remember workspace <text>,或让模型在对话中写入;读取与反馈由两个工具完成。
快照里的 token 数字是估算值,用于控制上下文预算,不代表 provider 的精确 usage。
配置
配置写在 profile 的 cordis.patch.yml 中,按行 id snail-memory 覆盖。patch 会整体替换该行的 config,所以需要把想保留的键一起写全:
- id: snail-memory
config:
provider: deepseek
model: deepseek-chat
reviewEveryUserTurns: 15
idleDelayMinutes: 60
consolidationCooldownHours: 20
globalConsolidationCooldownDays: 7
retentionSweepHours: 24
| 键 | 默认值 | 说明 |
|---|---|---|
dshHome |
宿主解析值 | 数据根目录;默认跟随 DSH_HOME |
provider / model |
未设置 | 辅助模型路由。留空时从当前 agent 列表中选择可用模型 |
reviewEveryUserTurns |
15 |
每累计多少个完成的用户轮次触发一次记忆蒸馏 |
idleDelayMinutes |
60 |
会话空闲多久后触发蒸馏 |
consolidationCooldownHours |
20 |
workspace consolidation 冷却时间;一次 dirty 窗口只在首次需要排期时定时,后续写入不再推迟 |
globalConsolidationCooldownDays |
7 |
global consolidation 冷却时间,语义同上 |
retentionSweepHours |
24 |
retention 清理的间隔 |
数据位置
默认在 $DSH_HOME/snail_memory/(设置了 config.dshHome 时随之变化):
snail_memory/
├── state.v2.json # 唯一权威状态(原子发布)
├── details/ # 可重建的 Markdown 投影
├── detail-data/ # 详情记录(按 revision)
├── global/
├── workspaces/
├── settings.v1.json
├── audit.v1.jsonl # 只记 operation / revision / 时间
├── projection-pending.v1.json
└── lock.json # 单写者锁(心跳 + fencing)
Markdown 投影可以从 state.v2.json 重建,两者不是双事实源。审计日志只记录操作元数据,不记录提示词、记忆正文或路径。
隐私与安全
- 记忆数据只落在本地
$DSH_HOME下,不采集遥测、不上传到第三方。 - 蒸馏/合并需要调用模型时,走宿主注入的
ctx.llm,即你自己配置的 provider 与凭据;插件不自行发起网络请求。 - 写入与蒸馏前会做秘密扫描与长度限制,模型输出一律按不可信数据处理。
- 插件的 RPC 挂在宿主
webServer的同源路由上(/snail-memory/rpc/*)。请勿把 dsh Web 服务绑定到不受信任的网络(--host默认只监听本机)。
开发
npm install
npm run build # tsc + esbuild,产出 dist/ 与 dist/client.js
npm run typecheck
npm test # vitest
npm run lint
npm pack # prepack 会自动构建
目录:
src/index.ts # Cordis 入口:inject / Config / apply
src/contract.ts # Host ↔ Client RPC 类型
src/api/ # 同源路由、命令、校验
src/context/ # 快照生成、注入对账、工具
src/lifecycle/ # 轮次统计、蒸馏、consolidation、retention、调度
src/store/ # 权威状态、写队列、锁、投影
client/src/ # slots、面板、locale、RPC 客户端
scripts/ # 构建脚本(Client handoff)
tests/ # 单元 / 集成 / 客户端测试
Client 侧通过 window.__ModuleLoader__.load({ id, factory }) 的 CJS closure-factory 装载,react / react/jsx-runtime 由宿主平台表提供,不打第二份 React。
License
MIT © 2026 snaiheihei
链接
同类插件
vectorize-io/hindsight#coding-agents★ 57722
Hindsight:会学习的 Agent 长期记忆系统,自动召回/保存、知识页、深度反思与按仓库隔离的记忆银行。
volcengine/OpenViking#examples/dsh-memory-plugin★ 41317
面向 DeepSeek Harness 的 OpenViking 记忆与上下文插件:pre-step 自动召回与画像注入、会话捕获、`viking://` URI 防护,以及对接 OpenViking 服务端的 recall/write 记忆工具。
MemTensor/MemOS#memos-local-plugin★ 12224
DeepSeek Harness 本地记忆插件:分层 L1/L2/L3 记忆,自动沉淀与手动 memos_* 检索工具并存,内置记忆浏览器。
agentscope-ai/ReMe#dsh★ 3735
将 DeepSeek Harness 接入 ReMe 本地优先、自进化的个人知识库:自动把已完成的主 Agent 对话沉淀为用户掌控的 Markdown 记忆,通过 reme_search 结合 BM25、可选向量检索和 wikilink 展开搜索对话与资料,并按日整理长期记忆。
zilliztech/memsearch#MemSearch★ 2815
供 DSH 与其他编程 Agent 共享的 Markdown 记忆,支持自动捕获、步骤前上下文注入、搜索召回,以及通过审阅面板实现 memory-to-skill 自进化。
vshulcz/deja-vu#extensions/dsh★ 1352
读取本机上其他四十二个编程智能体已经写下的会话文件(Claude Code、Codex、Cursor、VS Code Copilot Chat、opencode、OpenClaw、Hermes、Kimi、Cline、Zed 等),包括安装之前的历史:提供 deja_recall、deja_session、deja_blame、deja_fix、deja_how、deja_remember 六个工具与 /deja 命令,并可选地把召回结果加入运行时上下文。本地 BM25 索引,不用大模型,不用向量嵌入,不联网(dsh plugin --profile web add dsh-deja)。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。