dsh-multi-window-context-management:在 DSH 原生压缩之上的多窗口上下文

前言

用 DeepSeek Harness(DSH)做长会话智能体时,上下文会顶到 token 上限。DSH 自带压缩(compaction)能把旧消息收成 checkpoint,但长任务里「当前目标、待办、最近指令」容易和细节一起被卷进摘要,模型要查某次工具输出或某条用户原话时,往往只能依赖摘要里的模糊回忆。

社区插件 dsh-multi-window-context-management(维护者 overact)在 不替换 DSH 压缩引擎的前提下,把每次已提交的压缩当成一次「换窗」:保留原生 summary,再追加一条窗口交接消息,并提供会话内笔记与分页历史查询。多窗口思路借鉴 Codex,README 明确说明 并非 Codex API 的一比一移植,也不承诺无损恢复每一个细节。

这是什么

  • 定位:基于 DSH 原生 compaction 的窗口化上下文交接,附带会话私有笔记与分页历史召回。
  • 分类:SkillHub 目录归类为「记忆」;GitHub 仓库当前约 2 stars(以仓库页面为准)。
  • 版本与环境:插件 0.7.0,README 记载在 DSH 0.2.2-rc.1、Node.js ≥ 22.15 上做过验证;package.json 中 engines.node 为 >=22.15,peer 范围允许 DSH >=0.1.7-alpha.1 || >=0.2.0-0 等组合,并依赖 preflight check 按能力而非单纯版本号判断兼容性。
  • 许可证:MIT(见仓库 package.json)。

核心机制(与原生压缩的关系)

下面介绍插件如何「叠」在 DSH 之上,而不是改掉 DSH 预设里的压缩实现。

  1. 压缩仍走各 preset 自带引擎。插件不替换、不重写、不 patch DSH 的 compaction;你自建 preset 也适用,升级 DSH 通常不需要为压缩单独改配置。
  2. 每次 DSH 压缩真正提交后,插件在 compaction/end 之后追加一条 window message(目标、todos、最近 4 条用户指令摘要、笔记片段、窗口序号),作为下一窗口的入口;checkpoint 摘要仍是 DSH 原生输出,provider/model/usage 不变。
  3. 窗口序号只在提交替换成功后前进;失败、取消或「无内容可压缩」不会算作换窗成功。
  4. 卸载或禁用插件后,压缩行为与未装插件的 DSH 一致。

触发压缩的路径包括:DSH 压力阈值、/compact、provider 报 context overflow,以及工具 new_context(在下一步安全边界通过 preset 的 compaction 引擎请求一次强制压缩)。thresholdRatio、headroomTokens、retainRatio 等仍为 DSH 自身配置,插件不改这些项。

提供的工具

插件向当前会话注册以下工具(名称与 README 一致):

工具 作用
new_context 在下一步安全边界请求换窗(返回 requested,而非立即清空上下文)
notes_read 按 path 读笔记;query 搜索;两者都省略则列文件;prefix 可过滤列表/搜索
notes_write 写入笔记,必须指定 mode: "replace" 或 "append"
history_search 浏览或搜索消息;scope: "windows" 可分页查看窗口目录
history_read 按 item_id 读取条目(含窗口消息里出现的 summary、goal、checklist 等 ID)

默认开启 lazyTools:会话在 第一次窗口轮转之前 只暴露 new_context;轮转之后才提供笔记与历史工具。所有工具绑定调用方会话,不提供跨会话选择器。

安装与启用

插件发布到 npm,包名为 dsh-multi-window-context-management。以 web profile 为例,官方安装命令如下:

dsh plugin --profile web add dsh-multi-window-context-management

安装前建议在 GitHub 仓库 阅读源码与 MIT 许可证;插件以 当前 DSH 进程权限 运行,会读写 $DSH_HOME 下插件自有目录(例如笔记存储路径 README 所述为 $DSH_HOME/context-management/notes/<sessionId>.json)。

在 profile 中还需按 README 的 Configuration 节,在 cordis.patch.yml 注册插件(示例字段包括 enabled、overrideCompaction、lazyTools、handoffMaxChars 等)。装好后可在目标 profile 目录执行:

npm run preflight -- --profile web

(在插件目录内,用于确认当前 DSH 与 profile 是否具备插件依赖的能力且无命名冲突。)

启用方式:

  • 命令 /ctx:开关插件;作用于 整个运行中的 DSH 实例的所有会话,不是单个浏览器标签。
  • Web 端「Context management」设置页与 /ctx 共用同一后端开关;改设置无需重启 DSH。
  • 升级插件代码后,若未把插件 lib 配进 DSH hmr 监视目录,需 重载插件或重启 DSH 并刷新页面(README Usage 节)。

典型用法

手动压缩并开新窗口

在 DSH 里执行 /compact,走原生压缩;提交成功后插件追加窗口消息并进入下一窗口。

模型侧请求换窗

调用 new_context 会在当前步工具结果写完历史后、下一步边界执行强制压缩;即使 DSH 的 auto compaction 关闭,显式请求仍会被处理(无 compaction 引擎的 preset 会报错,但笔记/历史工具仍可用)。

笔记与历史(README 示例)

notes_write({path: "progress.md", text: "Tests passed", mode: "replace"})
notes_read({query: "Tests"})
history_search({scope: "windows", limit: 10})
history_read({item_id: "item_42"})

历史从调用方会话的 不可变 DSH session log 读取,item_<seq> 为稳定事件地址;history_read 可使用 format: "json" 分页拉取完整原始事件。每次成功换窗后插件还会维护笔记 handoff.md(最新摘要副本)与 handoff-log.md(按行记录窗口与时间);完整原始内容仍可通过 history_read 获取。

适用场景与注意

更适合

  • 长链路 coding / 运维类 agent:需要周期性「收口上下文」又要在新窗口里保留目标、待办和最近指令。
  • 希望在 同一会话内 用笔记沉淀进度,并用 history_* 按需捞细节,而不是把所有原文一直留在上下文里。

需要接受的限制

  • 窗口交接消息与注入笔记有字符与条数上限(README Limits 表,例如默认 handoffMaxChars 6000、单会话笔记文件数与总字节上限等);超出预算的写入会被拒绝,而非静默丢弃旧数据。
  • injectTools: false 会拿掉工具,压缩纯粹原生,历史被裁切时没有插件提供的召回手段;overrideCompaction: false 则保留笔记/历史工具但不发窗口消息,且会拒绝 new_context。
  • 从 0.4.x / 0.3.x 升级涉及工具面与 patch 块清理,需按 README Upgrading 小节操作。

生态说明:DSH 奉行「一切皆插件」;SkillHub 上的目录页由社区维护,与 DeepSeek / 幻方无官方从属关系。安装插件前请自行审阅代码与权限边界。

结尾

dsh-multi-window-context-management 把 DSH 原生压缩当作唯一「裁切引擎」,在其上增加窗口交接、会话笔记与分页历史,适合需要长时间跑、又要可控召回细节的智能体会话。若你要在 web profile 试用,可从 npm 包名安装,用 /ctx 或设置页开关,并结合 new_context、笔记与历史工具组织长任务。

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

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

小夜