dsh-context-management:DSH 换窗压缩、会话笔记与分页历史

前言

在 DeepSeek Harness(DSH)里跑长会话时,上下文会顶满 token 预算。原生压缩会把较早对话收成摘要,细节要靠模型「记得住多少算多少」。若任务跨很多轮、工具输出很长,或需要事后核对某次 tool call 的原文,单靠一轮摘要往往不够。

下面介绍的 dsh-context-management(维护者 overact,社区目录分类为「记忆」)在 DSH 官方压缩扩展点上做换窗(windowed compaction):把对话切成多个窗口,换窗时生成长度有上限的交接文档,同时提供会话私有笔记和分页历史检索,让模型在需要时用工具拉回原始记录。思路借鉴 Codex 的多窗口,README 明确说明不是 Codex API 的 1:1 移植,也不保证无损恢复全部语义。

这是什么

dsh-context-management 是 DSH 插件,包名 @local/dsh-context-management,当前版本 0.3.6(MIT)。一句话定位:在 DSH 0.2.0 系与 Node.js ≥ 22.15 环境下,提供换窗压缩、跨换窗/重启保留的 notes,以及对本会话完整原始历史的 paged recall。

插件通过 @local/dsh-context-management/compaction 子类化 BasicCompactionEngine,重写 summarize() 与动态分派的 compactIfNeeded(),不 monkey-patch 实例、不读 Cordis 内部;自动压缩仍由 DSH 原有回调驱动,阈值与保留比例仍用 DSH 的 thresholdRatio、headroomTokens、retainRatio,插件不改这些值。

核心功能

换窗与交接(handoff)

四种入口最终走同一条换窗流程:用量达到自动压缩阈值、new_context 请求、手动 /compact、以及 provider 报告上下文 overflow。自动阈值路径会压缩旧消息并原文保留最近约 16%;显式换窗或 overflow 路径则只保留最后一条再压缩。

换窗成功后进入新窗口(如 win_N+1),系统提示词与工具列表不变。每次换窗生成有字符上限的交接(默认 handoffMaxChars: 16000,可调 8000–32000)。默认 handoffSummary: generated 时对换出区间调用一次原生摘要模型,结果包在 <generated_handoff> 中,并与 goal、todo、最近四条用户指令(带事件地址)、近期笔记预览、窗口索引等一起组成交接;失败或预算不足时退化为截取式,不阻塞换窗。只有 DSH 真正提交替换消息后,窗口编号才前进。

插件还会在每次成功换窗后写入笔记:handoff.md 替换为最新完整交接,handoff-log.md 追加一行摘要索引。

工具一览

工具 作用
new_context 在下一个安全 step 边界请求换窗(返回 requested,非立即 reset)
notes_write_file / notes_append_to_file / notes_read_file / notes_list_files_by_prefix / notes_search_contents 会话私有笔记,跨换窗与重启保留
history_list_windows / history_list_items / history_read_item / history_search_contents 分页检索本会话完整原始历史;history_read_item 可读交接里引用的窗口摘要、goal、清单等 item ID

new_context 仅在挂载了该换窗引擎的 preset 上可用;其他 preset 会明确报错,notes/history 仍可用。

命令与设置

  • /ctx:开关插件(作用于当前 DSH 实例的全部会话,非单个聊天标签)。
  • /compact:按当前模式执行压缩。
  • Web 端「上下文管理」设置页(DSH 0.2.0 configForms)与 /ctx 共用后端;改设置无需重启。

停用插件或关闭相关工具时,压缩行为回退为 DSH 原生摘要。

安装与启用

插件未发布到 npm,需在 profile 中以本地 link 引入。以下步骤摘自 GitHub README.zh-CN 安装节(获取源码后执行)。

1、在插件目录安装依赖并做安装前检查(确认 DSH 能力与 profile 无冲突):

npm install
npm run preflight -- --profile web

2、在 profile 目录($DSH_HOME/profiles/<profile>/)的 package.json 的 dependencies 中加入本地 link,并在该目录执行 pnpm install:

"@local/dsh-context-management": "link:<插件目录>"

3、在 profile 的 cordis.patch.yml 中注册插件,例如:

- insert:
    - id: context-management
      name: '@local/dsh-context-management'
      config:
        enabled: true
        overrideCompaction: true
        injectTools: true
        defaultStrategy: window
        modelPolicies: []
        handoffSummary: generated
        handoffMaxChars: 16000

4、让 Web preset 挂载换窗引擎(写入前会再次 preflight,失败则不修改 profile):

node scripts/sync-presets.mjs --profile web

5、重启 DSH 并刷新网页。升级 DSH 后需重新运行 sync-presets.mjs;改插件源码时若未把 lib 加入 DSH 的 hmr root,需重载插件或重启 DSH 后再刷新页面。

社区目录页:skillhub.cn/plugins/overact/dsh-context-management(独立站点,与 DeepSeek / 幻方无官方从属关系)。

典型用法

日常开关与压缩

在 DSH 会话中:

/ctx
/compact

模型可在合适时机调用 new_context;换窗会等到当前 step 的工具结果完整写入历史后再执行,即使 DSH 的 auto 压缩关闭,显式换窗请求仍会被处理。

用 notes 留关键状态

通过 notes_write_file 等工具把决策、待办、路径写进 self/notes/<path>。笔记落在 $DSH_HOME/context-management/notes/<sessionId>.json,按会话隔离,不支持任意跨会话读写;换窗时近期笔记可有限注入交接,完整内容仍靠 notes 工具读取。

用 history 找回原文

列表与搜索返回 has_more 与 next_cursor;读正文用 next_offset_chars。history_read_item 设 format: "json" 可分页读完整原始事件(含调用参数与元数据)。历史来自调用者自己的不可变 DSH 会话日志,item_<seq> 为稳定地址,超过 2,000 条也不会丢弃旧记录索引。

验证插件自身

在插件仓库目录:

npm run verify

测试使用本地 fixture,不调用付费模型;0.3.6 在 DSH 0.2.0-rc.2 上 README 记载为 108 项测试通过。

适用场景与注意

适合谁: 长时间 coding agent、多轮工具调用、需要在压缩后仍能通过工具查会话日志与自管笔记的 DSH 用户;希望用「多窗口 + 交接」而不是单次原生摘要扛全程的场景。

边界: 交接有硬字符上限与按优先级裁剪;历史/笔记列表与单次读取也有默认上限(见 README「效率与边界」表)。备份或迁移需包含 context-management/notes/;删除会话不会自动删对应笔记文件。

安全与权限: 插件以当前 DSH 进程的权限运行,可读写 $DSH_HOME 下笔记与会话相关数据。安装前请阅读 GitHub 源码 与 MIT 许可证,在可信环境执行 preflight 与 sync-presets.mjs,避免与 profile 里同名工具/命令或其他压缩引擎冲突。

结尾

dsh-context-management 把 DSH 原生压缩扩展成可换窗、可交接、可检索的长会话工作流:压缩省 token,notes 留状态,history 补细节。若你在 DSH 生态里做「一切皆插件」式的 agent 开发,可从社区目录或 GitHub 入手,按文档完成 link 与 preset 同步后再开长任务。

  • 目录页:https://www.skillhub.cn/plugins/overact/dsh-context-management
  • 仓库:https://github.com/overact/dsh-context-management
羽毛球分组比赛记分
小程序二维码

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

小夜