READMESource: main@8dd71e22
dsh-memory
为 DeepSeek Harness agent 装上分层长期记忆:五路 RRF 融合召回 · 确认制写入 · Fernet 加密库 · 会话自动转录
Layered long-term memory for DSH agents: five-lane RRF recall, confirm-before-write, encrypted vault, automatic session harvest.
为什么需要它
Agent 默认没有跨会话记忆:每次对话都是一张白纸。直接把所有历史塞进上下文又贵又噪声大。本插件用分层记忆 + 按需召回解决这个矛盾:
- 默认零注入——只有命中实体/主题关键词时,才在当轮注入一小段证据(primer 门控)
- 手术级预算——按任务类型自动切换 400 / 1200 / 2000 字符注入档位,不多花一个 token
- 确认制写入——agent 只能提交「记忆提案」,人确认后才落盘,杜绝记忆污染
- 敏感内容强制加密——guard 钩子在写入前扫描密钥/口令,命中即拦截并引导进 Fernet 加密库
架构
┌─────────────────────────────────────┐
用户消息 ──────────▶ │ primer 门控(agent/pre-step) │
│ 命中关键词才召回,预算 400/1200/2000 │
└──────────────┬──────────────────────┘
▼
┌──────────────────────────────────────────────────────────┐
│ RRF 五路融合召回(rrf_recall.py) │
├───────┬───────┬───────┬───────┬──────────────────────────┤
│ L1 │ L2 │ L3 │ L4 │ L5 │
│ 规则层 │ 会话层 │ 语义层 │ wiki │ 时间窗 │
│MEMORY │SQLite │Honcho │活指针 │ daily 日志 │
│/USER │FTS5 │MCP可选│目录 │ YYYY-MM-DD 溯源 │
└───────┴───────┴───────┴───────┴──────────────────────────┘
▼
带来源标记 + 可信度分级的「证据账本」
写入路径(确认制):
agent: memory_suggest ──▶ SUGGESTIONS.jsonl(待确认队列)
│ memory_confirm ✅ / memory_reject ❌
▼
memory → MEMORY.md | user → USER.md | skill → ~/.dsh/skills/<name>/SKILL.md
(读-改-原子写 + pre-image 哈希记录进 DREAMS.md 审计日志)
工具(10 个)
| 工具 | 作用 |
|---|---|
memory_recall |
五路 RRF 召回。query + 可选 date(L5 时间窗:today/yesterday/-N/YYYY-MM-DD)、deep(深度召回 topk=8/预算=2000)、topk、budget |
memory_suggest |
提交写入提案(不直接写)。track: memory 全局规则 / user 用户档案 / skill 技能草案。自带敏感模式扫描与预算检查 |
memory_confirm / memory_reject |
采纳 / 拒绝提案。采纳走原子写 + 并发冲突检测 |
memory_vault_set / memory_vault_get |
Fernet 加密库读写。写入后明文只允许出现 → vault:<ref> 引用 |
memory_harvest |
会话日志(JSONL.zstd)增量转录 → L2 FTS5 索引 + 纠正信号提取 |
memory_health |
各层健康检查:L1 预算占用 / 文件完整性 / vault 可解密 / L2 索引 / git 状态 |
memory_backup |
记忆目录 git 备份并推送远端(.vault-key/scratch 自动忽略) |
memory_notify |
飞书消息推送(周报/告警/提醒),未配置凭据时返回提示不报错 |
钩子(3 个)
| 钩子 | 时机 | 行为 |
|---|---|---|
| primer | agent/pre-step |
关键词门控召回注入;默认零注入 |
| harvest | turn/end |
每轮结束自动转录会话到 L2 |
| guard | tools/pre-execute |
写类工具敏感扫描(密钥/Cookie/口令),命中拦截并引导 vault |
安装
dsh plugin --profile web add github:boomzikazita/dsh-memory
配置
cordis.patch.yml:
- insert:
- id: dsh-memory
name: 'dsh-memory'
config:
memoryDir: '~/.dsh/memories' # 记忆根目录
budgetMemory: 4400 # MEMORY.md 字符预算
budgetUser: 2750 # USER.md 字符预算
guardBlock: false # true = guard 命中硬拦截;false = 警告
primerBudget: 800 # primer 注入字符预算
primerTopK: 3 # primer 注入条数
环境变量
| 变量 | 用途 |
|---|---|
DSH_HONCHO_MCP_URL / DSH_HONCHO_MCP_TOKEN |
L3 语义层(Honcho MCP 桥)。不配置则 L3 静默跳过,不影响其他四层 |
DSH_WIKI_ROOT |
L4 wiki 目录路径 |
LARK_APP_ID / LARK_APP_SECRET / LARK_CHAT_ID |
memory_notify 飞书推送 |
记忆文件布局
~/.dsh/memories/
├── MEMORY.md # L1 全局规则(§ 分隔条目)
├── USER.md # L1 用户档案
├── SUGGESTIONS.jsonl # 待确认提案队列
├── VAULT.md.enc # Fernet 加密库(密文,可随 git 同步)
├── DREAMS.md # 采纳审计日志(pre-image 哈希)
├── index.sqlite # L2 FTS5 会话索引
└── daily/ # L5 时间窗日志
依赖
- Python 3(召回/加密/转录脚本由插件 host 侧调用)
- Python 包:
cryptography(vault 必需);zstandard(读取压缩会话日志,可选)
No comments yet. Be the first to write one.