dsh-full-life-memory
Manifest valid★ 1A biomimetic memory plugin for DeepSeek Harness. Folds context into token clues and reconstructs memories, enabling infinite conversations without overflow. (一个 DSH 的仿生记忆插件,将上下文折叠为 Token 线索并重建记忆,告别上下文溢出,给所有模型完整的一生。)
Full-Life Memory
不存原文,只存线索。
像人一样遗忘,也像人一样回忆。
@tuhengyu/dsh-full-life-memory
一个给 DeepSeek Harness 用的「仿生终身记忆」插件:
上下文快满时,它把旧对话蒸馏成几个关键词,从历史里物理删除;
当你再提起那件事,它顺着线索把记忆重新长出来。
上下文不是硬盘。 人不会记住三个月前的每一句话,只留下几个名字、半句原话、一种「我们好像聊过」的感觉。 需要的时候,再顺着这些线索,把当时的场景重新拼出来。
✨ 三个核心卖点
| 🧠 仿生记忆 不存原文,只存 Token 线索 | 落盘的只有 keywords、seed_tokens、一句摘要——没有 message 正文,没有向量,没有 embedding。回忆时用线索组装一段"想起"的提示交给模型,而不是把数据摊开给它看。 |
| ⚡ 零 Token 成本 正则蒸馏,不调模型 | 遗忘不经过任何 LLM:引号里的原话、文件路径、标识符、中文短语,用规则抽出来就完事。一次折叠 0 次模型调用、0 token 计费、0 延迟。 |
| ✂️ 真正释放上下文 物理切除,不是"请忽略" | 走 DSH 的 surface 节点替换,被切掉的 6 个节点直接从下一轮请求里消失。不是 system prompt 里那句"请忽略更早的内容",是真的不发了——KV cache / 显存跟着一起降。 |
🔁 它是怎么运转的
agent/pre-step
│
▼
tokenMeter.measure(session)
│
< 8000 ───┴─── ≥ 8000
│ │
keep going ▼
keep the last 4 turns, fold the oldest 2
│
▼
regex distill → keywords + seed_tokens (0 LLM calls)
│
┌─────────┴─────────┐
▼ ▼
SQLite memory_clues surface replace
(only file on disk) 6 nodes → 1 checkpoint
│ │
│ ▼
│ 【🧠 记忆已折叠】…
▼ │
recall_from_clues ◄───────┘
rebuilds the scene
🆚 和别的做法比
| 方案 | 每轮额外成本 | 上下文占用 | 旧事怎么找回来 | 真的移除了吗 |
|---|---|---|---|---|
| 全量保留 | 0 | 线性增长,迟早爆窗 | 原文还在 | ❌ |
| LLM 摘要压缩 | 每次压缩 1 次模型调用 | 压缩后仍占位 | 读那段摘要 | ✅(摘要节点) |
| 向量 RAG | 嵌入调用 + 每次检索 | 检索片段临时塞入 | 召回原文分块 | ❌ 原文还在库里 |
| Full-Life Memory | 0 | 只留一行提示 | 线索 → 模型自己重建 | ✅(surface 替换) |
一句话区别:向量库是「查」,线索是「想」。 检索把原文递给你,回忆让模型自己长出来——后者更像人,也更省。
🚀 安装
plugin_manager { action: "install_bundle", target: "<本目录的绝对路径>" }
装完重启一次 DSH。之后每个新会话都会带上:
recall_from_clues工具(Phase 1)- 自动遗忘钩子(Phase 2,默认开启)
本插件是 link 安装:改完代码不用重装,但要重启 Host 才会重新加载模块。
⚙️ 配置
- insert:
- id: full-life-memory
name: '@tuhengyu/dsh-full-life-memory'
config:
dbPath: '~/.dsh/full-life-memory/memory.db' # 线索库
limit: 5 # 一次回忆取回几条线索
maxPromptChars: 1800 # 回忆提示的字符上限
autoForget: true # Phase 2 总开关
forgetThresholdTokens: 8000 # 超过多少 token 开始遗忘
forgetTurns: 2 # 每次切掉几轮已完成对话
keepCompletedTurns: 4 # 最近这么多轮永远保留
| 字段 | 默认 | 说明 |
|---|---|---|
dbPath | ~/.dsh/full-life-memory/memory.db | 目录自动创建,WAL 模式 |
limit | 5 | 单次回忆最多带几条线索(上限 20) |
maxPromptChars | 1800 | 超出截断并标注"更早的线索已淡忘" |
autoForget | true | 关掉后只剩手动回忆,历史不再被切 |
forgetThresholdTokens | 8000 | 用 ctx.tokenMeter 的口径;没有该服务时按字符粗估 |
forgetTurns | 2 | 一次折叠几轮 |
keepCompletedTurns | 4 | 保护最近对话:已完成轮数 ≥ forgetTurns + keepCompletedTurns 才动手 |
阈值比系统提示本身还低也没关系:保护规则会把会话稳稳停在「最近 5~6 轮」的滑动窗口,不会把上下文掏空。
👀 你会看到什么
对话流里多一行系统提示:
【🧠 记忆已折叠】为了腾出空间,我已淡忘更早的 2 轮对话,
留下的线索:E:/Fishwork/app.ts、recall_from_clues、node:sqlite。
需要时我会用 recall_from_clues 自己回忆。
日志里多一行账:
full-life-memory: folded 2 turn(s) (~9123 tokens) from surface seq 2..9
as compaction 6f1c…; clues: E:/Fishwork/app.ts, recall_from_clues, node:sqlite
然后你随口问一句「我们之前那个 sqlite 的事呢?」——模型会自己调 recall_from_clues,把线索接成回忆。
🧩 工作原理(30 秒版)
- 测压:
agent/pre-step(waterfall)里用ctx.tokenMeter.measure(session)读当前请求压力。 - 选段:只挑已完成轮次(
turn/end之后),天然避开半个 tool-call;surface第 0 个 system 节点永不参与。 - 蒸馏:正则抽
keywords与seed_tokens,连同session_id写进memory_clues表。 - 切除:
session.append('user/message', checkpoint, { surfaceOp: { op:'replace', startSeq, endSeq } })——和 DSH 自己的dsh-compaction-basic逐字同一条路径。 - 留痕:外面套
compaction/start → summary → replace → end,Chat 因此把它渲染成原生的「记忆折叠」行,而不是一条用户消息。
安全边界都是显式校验过的:区间必须工具配对平衡、没有未闭合的 compaction/start、同一轮最多切一次、最近轮次受保护。任何一步失败都只是"这次不遗忘",绝不留半截事务。
❓ 常见问题
忘掉的东西还能找回来吗? 能找回"上下文",找不回"原文"——这正是设计目标。线索足够模型重建当时在聊什么、做到哪一步;逐字复述不重要。
真的不花 token 吗? 遗忘过程 0 token(纯正则)。只有你主动回忆时才会花几百 token——这笔钱花在真正需要的那一刻,而不是每一轮都替全部历史付费。
中文能匹配吗?
能。线索库用 LIKE 模糊匹配而不用 FTS5:中文不分词,线索本来就短,LIKE 反而更稳;% 和 _ 已转义。
会不会和 DSH 自带的自动压缩打架?
不会。检测到未闭合的 compaction/start 就跳过;自己开事务时严格成对闭合,不会把锁留给别人。
会不会把系统提示或工具配对切坏?
不会。system 头永不切;只切 turn/end 之后的范围;区间前后都做 tool-call/result 平衡校验。
数据在哪?会不会上传?
只有一个本地 SQLite 文件,默认 ~/.dsh/full-life-memory/memory.db。没有网络请求,没有遥测。
能只用手动回忆吗?
autoForget: false。历史不再被切,recall_from_clues 照常可用。
🗂 项目结构
dsh-full-life-memory/
├── package.json # bundle 清单 + dsh.bundle.patch
├── cordis.patch.yml # 插入 Host 插件行 + 默认 config
├── index.ts # 源码(类型完整,改这里)
├── index.js # 运行时孪生版 = index.ts 去掉类型注解,Loader 加载它
├── locale/{en,zh}.json # 插件管理器里的标题与描述
├── icon.svg
└── test/
├── smoke.mjs # Phase 1:命中 / 未命中 / 截断 / 转义 / 连接回收
└── auto-forget.mjs # Phase 2:阈值 / 切除区间 / 配对校验 / 落库 / 每轮一次
🧪 测试
node test/smoke.mjs
node test/auto-forget.mjs
auto-forget.mjs 用一个仿 Session 契约的假会话跑完整链路,并额外做一次 index.ts 与 index.js 的行为对拍:同一个场景分别执行,逐字段比较追加事件、被切的 surface 区间、落库的线索行,确保"编译产物"和源码不漂移。
覆盖:阈值以下不动、到阈值切最旧两轮、replace 区间精确、system 头保留、后续轮次完好、线索落库、同轮不重复切、最近轮次受保护、工具配对不平衡拒绝、未闭合 compaction 拒绝、落库失败不留半截事务。
🧭 设计取舍
规则蒸馏不如语义摘要细腻——它抓的是"名字、路径、术语、原话",不是"结论"。这是刻意的:遗忘不该再花钱,也不该再等一次模型响应。真想要语义摘要,只需替换 extractClue() 一个函数,返回结构不变,其余逻辑(选段、切除、落库)完全复用。
🛣 Roadmap
-
extractClue的可选 LLM 后端(默认仍是正则) - 遗忘曲线权重:越久远的线索越淡,命中时排在后面
- 按项目 / workspace 分区的线索库
-
/forget手动命令与「回忆命中率」统计 - 线索之间的弱关联图,支持"顺着一条线索想起另一条"
📄 License
MIT © tuhengyu
Comments
Loading…
From the same category
by ranxianglei
基本稳定可用 100K tokens is enough. Universal context-compression proxy for ALL AI coding agents,10w上下文足矣
★ 2.4k
↓ 650.1k/wk
MIT
TypeScript
Oct 23, 2026
dsh plugin --profile web add billion-contextA DeepSeek coding agent harness: persistent shell, Ultra subagents, auto approval, Chrome MCP and session telemetry
★ 1k
MIT
JavaScript
by Han-1413141
DeepSeek Harness session cost meter plugin: session/daily cost, budget, history, OpenCode Go quota, official & custom-provider balance, Codex-like token heatmap, peak/off-peak pricing with pre-switch
★ 499
↓ 26k/wk
MIT
JavaScript
Oct 23, 2026
dsh plugin --profile web add dsh-cost-meterby Nwflower
Import 14+ external agent chat histories (Claude Code, Codex, ChatGPT, Cursor, Gemini, Reasonix, opencode, ZCode, Grok Build, OpenClaw, Pi, Hermes, Kimi CLI, DSH) into DeepSeek Harness as resumable se
★ 249
MIT
JavaScript
Oct 21, 2026
dsh plugin --profile web add dsh-chat-importby MichengAI
DSH Archive Manager — 在 DeepSeek Harness 中安全查看、恢复和管理已归档会话 · Safely view, restore, and manage archived sessions in DSH
★ 208
↓ 17.2k/wk
Apache-2.0
JavaScript
Oct 23, 2026
dsh plugin --profile web add @michengai/dsh-archive-managerby SiriLee
DSH 插件:真正便捷无感的同窗口内对话回退,从不新建分支;自带轻量工作区备份,可一并还原文件(完整 Claude Code /rewind 语义)。 · DSH plugin: genuinely effortless in-window conversation rewind — never forking a new session; ships a lightweight workspac
★ 175
↓ 5.6k/wk
MIT
TypeScript
Oct 21, 2026
dsh plugin --profile web add dsh-rewind-plugin