dsh-blackhole:长会话压缩时原文逐字落盘可检索

前言

在 DeepSeek Harness(DSH)里跑长任务时,上下文迟早会触顶,宿主或插件会对历史做压缩,只留摘要。摘要能撑住后续对话,但被压掉的那一段原文往往就此不可见:谁说了什么、工具回了什么、当时的取舍依据,后面要查就只能靠记忆或重跑。常见做法只保证「最近还在、摘要还在」,不保证「被压掉的那段原文还在」。

下面介绍维护者 wx-holmes 在 SkillHub 记忆分类下的插件 dsh-blackhole(目录页称「黑洞:压缩即归档」):在上下文涨到可配置的「事件视界」时触发压缩,同时把被压掉的正文逐字写入本地归档目录,并维护人读与机器读索引,需要时按会话或日期找回原文。当前 GitHub 星标为 0,版本 0.3.0,README 标明主要在 Windows 自用,其他平台未验证。

这是什么

dsh-blackhole 是给 DSH 会话做的「压缩即归档」插件:压缩发生时归档,不是事后扫描整库历史。它要解决的点很明确——压缩不可避免会丢上下文里的细节,本插件在丢摘要侧的同时,把原文落到 archiveRoot,用 index.md / index.jsonl 做检索入口。

归属与入口:

  • 社区目录:https://www.skillhub.cn/plugins/wx-holmes/dsh-blackhole
  • 源码与说明:https://github.com/wx-holmes/dsh-blackhole

DSH 生态强调「一切皆插件」;SkillHub 为社区独立站点,与 DeepSeek / 幻方无官方从属关系。

核心机制:阈值、归档与索引

三段阈值与窄段门槛

插件用上下文占比控制压缩节奏(默认值均来自 README 配置示例):

  1. eventHorizon(默认 0.6):占比到此开始压缩并归档。
  2. solidifyLine(默认 0.75):固化线,过了不再指望还能压回去。
  3. hardCap(默认 0.9):硬上限。

另有 minCompactEvents / minCompactTokens(默认 2 条事件或 2000 token):前缀太窄时摘要压不下去,会白烧一次调用还留下无用归档,因此先跳过,等段变宽再压。

归档与索引

被压掉的原文按会话、日期分段写入 archiveRoot,文件名带段号与摘要,正文是逐字原文,不是二次压缩版。同目录下:

  • index.md:人读索引
  • index.jsonl:机器读,一行一段,记录会话、日期、压了哪几段、原文文件路径

找回路径:查索引 → 读 originals/ 下对应文件。

archiveRoot 下典型结构:

archiveRoot/
├── 索引.md
├── index.jsonl
├── README.md
└── originals/

事件流与其它插件

压缩生命周期会追加 compact.archived、compact.skipped、archive.failed 等事件;其它插件可按 offset 增量读取,接入自己的账本逻辑。

0.3.0 扩展能力

README 在 0.3.0 中补充的能力如下(仅列资料已写明的项):

  • 冷库读端 bh_restore_span:按「会话 + seq 区间」从原文库取回,返回 digest(逐字校验)与 latencyMs;每次取回写 recall.hit 事件。
  • 块仓 bh_compress / bh_restore / bh_search:任意文本可逆存取,带 source / tags,不依赖模型;适合作业中间产物、日志片段。
  • 按天轮换视界 dailyHorizon:{start, ratios} 按天数取档位,跨零点自动切换。
  • 按会话覆盖 sessionRatios:为单会话单独设线,其余仍用全局档。
  • 折叠冷却 foldCooldownMs / foldCooldownMax:同会话在窗口内限制折叠次数,计数落盘;连续被拦 8 次或 tokens 到硬顶 95% 时放行,避免会话憋爆。
  • 采样 sampleFile:记录表面大小、折叠耗时、剪枝收益。
  • 索引卡片:除起点/收尾/工具外,增加从原文抽出的 rationale 与回取指针 pointer,避免压缩后只剩骨架、决策依据丢失。

安装与启用

资料中的安装方式不是一条 dsh plugin add github:... 命令,而是把插件放到 profile 能加载的位置,再在层配置里 insert。按 README 顺序做即可。

  1. 将本仓库目录放到 DSH profile 可加载位置(例如 node_modules/dsh-blackhole,或在插件目录后于 cordis 层引用)。
  2. 在 profile 的层配置中加入 insert 段(见下节配置示例)。
  3. 重启 DSH,日志中应出现插件激活。

package.json 标明通过 cordis.patch.yml 做 bundle patch;private: true,发布形态仍在探索中。

配置示例

下列字段摘自 README;路径请改为你本机目录。archiveRoot 建议放在不宜丢失的盘上;stateRoot 丢失可重建。

- insert:
    - id: blackhole
      name: dsh-blackhole
      config:
        eventHorizon: 0.6        # 事件视界
        solidifyLine: 0.75       # 固化线
        hardCap: 0.9             # 硬上限
        thresholdRatio: 0.6
        retainRatio: 0.16        # 保留近期内容不压
        archiveRoot: "D:\\archive\\context"   # 原文真源(改成你自己的目录)
        stateRoot: "D:\\archive\\state"       # 插件状态/缓存(可重建)
        pendingTtlMs: 600000
        minCompactEvents: 2
        minCompactTokens: 2000

典型用法思路

资料未给出独立的 CLI 演示脚本,但工作流可从机制直接复现:

  1. 启用插件并保持 archiveRoot 可写。
  2. 长会话运行直至触发压缩;在日志或事件流中确认 compact.archived(若因窄段跳过则为 compact.skipped;写盘失败则为 archive.failed)。
  3. 打开 archiveRoot/index.md 或解析 index.jsonl,按会话 ID、日期、段号定位 originals/ 下的原文文件。
  4. 若使用 0.3.0 工具面:用 bh_restore_span 按区间取回并校验 digest;块级内容用 bh_compress / bh_restore / bh_search。

写盘为同步策略:README 写明宁可慢一点,也不接受「摘要写了、原文没写」。

适用场景与注意

更适合谁:长时间、多轮工具调用的 DSH 会话;需要在压缩后仍能审计原文、对齐决策依据(rationale)或对接下游账本的开发者。

边界(README 自述):

  • 只在「压缩」发生时归档,不主动扫描历史会话。
  • 0.3.0 自用中;Windows 上使用最多,其它平台未验证。
  • 检索目前以文件索引为主,维护者在 README「想找人帮忙」中提及跨平台路径、发布流程与更省事的检索方式仍待讨论。

安全与权限:插件随当前 DSH 进程权限读写 archiveRoot、stateRoot 及事件流;安装前请阅读源码与仓库许可证(资料未单独列出 license 文件名,以仓库为准),并自行评估归档目录是否含敏感内容。

测试方面,README 写明 npm test 覆盖 archive、blocks、cards、coldstore、events 等共 16 组用例。

结尾

dsh-blackhole 把「压缩」和「归档」绑在同一条路径上:上下文越过事件视界时摘要继续服务对话,原文逐字进本地仓,索引负责找回。若你正在 DSH 上养长会话、又担心压完再也对不上原话,可按上文安装与配置试跑,并对照 GitHub README 中的 0.3.0 工具与冷却、按天/按会话档位是否需要打开。

  • 目录页:https://www.skillhub.cn/plugins/wx-holmes/dsh-blackhole
  • GitHub:https://github.com/wx-holmes/dsh-blackhole
羽毛球分组比赛记分
小程序二维码

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

Xiaoye