前言¶
在 DSH(DeepSeek Harness)里做长会话开发时,context 往往被三类内容占满:一次性的巨大工具输出、被 ACP 折叠后无法再搜到的历史、以及上个会话里定下的决策却进不了新会话。社区里常用的 billion-context (ACP) 侧重主动压缩旧块以省 token,但单次超长工具结果和「折叠后能否找回」仍是缺口。下面介绍维护者 yyfdfsyyf-source 发布的 dsh-context-fold(GitHub 仓库 yyfdfsyyf-source/dsh-context-fold,SkillHub 分类为「记忆」):工具结果确定性折叠落盘、compaction 账本回捞、跨会话记忆写入与注入,与 ACP 互补而非替代。
这是什么¶
dsh-context-fold 是 DSH 的 Cordis 插件(当前版本 0.1.3,MIT 许可证)。它不改请求代理路径,核心落在三类能力上——README 里分别称为 A 折叠、B 账本、C 记忆——数据统一落在 <DSH_HOME>/context-fold/(DSH_HOME 未设置时默认为 ~/.dsh)。
核心功能¶
A. 确定性工具结果折叠¶
钩子:tools/post-execute。
当工具结果文本超过 pruner.maxChars(默认 8000 字符)时:
- 完整原文写入
<DSH_HOME>/context-fold/spill/<id>.txt; - 上下文里只保留 head(默认 2000 字符)、tail(默认 2000 字符)和一行标记,提示用
context_fold recall <id>取回; - 只改写结果内容,不删除或替换事件,tool-call / tool-result 配对保持完整,会话仍可回放与审计。
已折叠内容靠标记行识别,不会二次折叠。result.isError === true 的结果不折叠。插件会累计折叠次数,并用 chars / 3.5 粗估节省 token(量级参考,非精确计费)。
B. 折叠账本与回捞¶
钩子:session/event。当事件类型为 compaction/summary 时,把被遮蔽区间追加到 ledger.jsonl。真实 payload 字段与账本行的映射在 README 中有说明(例如 blockId 来自 compactionId,startSeq / endSeq 来自 shadowedRange)。
通过工具 context_fold,action: recall,参数 query 可为折叠块 id 或关键词:先 id 精确匹配,否则对摘要做 BM25(中文按字 bigram),返回 top-k 片段及 seq 范围。recall 同时可搜账本、记忆与 spill 原文。
C. 跨会话记忆¶
写入(agent/turn-stopping):每轮最多触发一次 llm.stream(),从本轮对话抽取结构化条目(类型含 fact、decision、lesson、preference 等),写入 memory.jsonl。每轮最多 6 条,不足 2 条不落库。llm 不可用时整块静默禁用,不影响 A、B。
v0.1.2 起默认 memory.extractMode: background:监听器立即返回,抽取在后台执行,避免每轮多一次完整模型往返;过短回合由 minTranscriptChars(默认 400)直接跳过。
注入(system-prompt/assemble):用 BM25 + 时间衰减(半衰期 30 天)选出 top 条记忆注入 system prompt,并控制总长。为稳定 provider 前缀缓存,注入内容仅在「新增记忆 ≥ 2 条」或「发生过显式 recall」时刷新,其余复用上次渲染字符串。
v0.1.1 起支持 scope(v0.1.3 修正 cwd 来源为 session.header.cwd,而非 process.cwd()):记忆带 { cwd, repo, branch },注入与 recall 可按 memory.scopeMode(prefer / strict / off)处理项目亲和度。
工具与典型用法¶
插件注册工具 context_fold,常用 action 如下:
| action | 作用 |
|---|---|
status |
各能力是否就绪及计数(折叠次数、账本条数、记忆条数、估算节省 token) |
recall |
按 id 或关键词回捞账本、记忆、spill |
prune |
对当前会话手动扫描超长工具结果并落盘(不改写已 append 的历史事件) |
ledger |
列出最近 N 条账本条目 |
先看整体状态,再按需回捞,是 README 里可复现的路径。prune 的语义需单独理解:会话事件 append-only,它只能让当前会话里超阈值的工具结果落盘供之后 recall,不能修改已写入的历史事件;新工具结果仍由能力 A 自动折叠。
安装与启用¶
推荐从 GitHub 安装(资料原文命令,profile 为 desktop 示例):
dsh plugin --profile desktop add github:yyfdfsyyf-source/dsh-context-fold
装完重启 DSH。package.json 声明了 dsh.bundle.patch,插件管理器会自动应用 cordis.patch.yml,无需手工改 profile 的 cordis.yml。
运行环境要求 Node >=22.19.0(见 package.json 的 engines)。
配置写在 cordis.patch.yml 的 config 下;patch 会整体替换 config 对象,因此需要哪些键都应写全。示例结构与默认值:
mode: complement # complement | off
pruner:
enabled: true
maxChars: 8000
keepHead: 2000
keepTail: 2000
memory:
enabled: true
injectLimit: 6
maxInjectTokens: 1200
decayHalfLifeDays: 30
scopeMode: prefer
scopeWeight: 0.35
extractMode: background
minTranscriptChars: 400
ledger:
enabled: true
maxBlocks: 2000
约束:keepHead + keepTail 必须小于 maxChars,否则不会折叠;status 与校验逻辑会提示。非法配置不会让插件加载失败,未知键会 warning 并忽略。
轻量回滚:将 config.mode 设为 off 可关三块能力而保留插件;完全卸载步骤见 README「安装 / 卸载 / 回滚」。
与 billion-context (ACP) 的关系¶
| ACP (billion-context) | dsh-context-fold | |
|---|---|---|
| 目标 | 主动折叠旧内容以省 context | 折叠超长工具输出、让被折叠内容可检索、跨会话记忆 |
| 折叠粒度 | 会话块 | 单条工具结果(head+tail) |
| 折叠后找回 | 依赖 ACP 自身机制 | 账本 + recall |
| 对延迟 | 经本地代理多一跳 | 不在请求路径上做事;记忆抽取默认 background |
两者可同时启用。mode: off 只关本插件,不影响 ACP。
适用场景与注意¶
适合:长会话里频繁出现超大测试输出、git diff、读大文件结果;已装 ACP 但仍需要 compaction 摘要可搜、以及跨会话沉淀决策与踩坑记录的场景。
务必注意:
- 插件以当前 DSH 进程权限运行,会向
<DSH_HOME>/context-fold/读写 spill、账本与记忆;安装前应自行查看源码与 MIT 许可证,确认符合你的安全与合规要求。 - 记忆写入依赖
llm服务;不可用时不写记忆,但折叠与账本仍可按配置工作。 - SkillHub 目录页与 GitHub 为社区生态信息,与 DeepSeek / 幻方无官方从属关系;星标等元数据以各站点当时展示为准(仓库 README 侧可核对功能与版本)。
结尾¶
dsh-context-fold 把「占满 context 的一次性输出」「ACP 折叠后的盲区」「跨会话断层」拆成三块可配置能力,并通过 context_fold 工具统一 status / recall / prune / ledger。需要目录浏览时可打开 SkillHub 插件页;细节、测试说明与本地开发安装见 GitHub 仓库 README。