dsh-context-fold:DSH 上下文折叠与跨会话记忆

前言

在 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 字符)时:

  1. 完整原文写入 <DSH_HOME>/context-fold/spill/<id>.txt;
  2. 上下文里只保留 head(默认 2000 字符)、tail(默认 2000 字符)和一行标记,提示用 context_fold recall <id> 取回;
  3. 只改写结果内容,不删除或替换事件,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 摘要可搜、以及跨会话沉淀决策与踩坑记录的场景。

务必注意:

  1. 插件以当前 DSH 进程权限运行,会向 <DSH_HOME>/context-fold/ 读写 spill、账本与记忆;安装前应自行查看源码与 MIT 许可证,确认符合你的安全与合规要求。
  2. 记忆写入依赖 llm 服务;不可用时不写记忆,但折叠与账本仍可按配置工作。
  3. SkillHub 目录页与 GitHub 为社区生态信息,与 DeepSeek / 幻方无官方从属关系;星标等元数据以各站点当时展示为准(仓库 README 侧可核对功能与版本)。

结尾

dsh-context-fold 把「占满 context 的一次性输出」「ACP 折叠后的盲区」「跨会话断层」拆成三块可配置能力,并通过 context_fold 工具统一 status / recall / prune / ledger。需要目录浏览时可打开 SkillHub 插件页;细节、测试说明与本地开发安装见 GitHub 仓库 README。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye