前言¶
用 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 預設裏的壓縮實現。
- 壓縮仍走各 preset 自帶引擎。插件不替換、不重寫、不 patch DSH 的 compaction;你自建 preset 也適用,升級 DSH 通常不需要爲壓縮單獨改配置。
- 每次 DSH 壓縮真正提交後,插件在
compaction/end之後追加一條 window message(目標、todos、最近 4 條用戶指令摘要、筆記片段、窗口序號),作爲下一窗口的入口;checkpoint 摘要仍是 DSH 原生輸出,provider/model/usage 不變。 - 窗口序號只在提交替換成功後前進;失敗、取消或「無內容可壓縮」不會算作換窗成功。
- 卸載或禁用插件後,壓縮行爲與未裝插件的 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配進 DSHhmr監視目錄,需 重載插件或重啓 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 表,例如默認
handoffMaxChars6000、單會話筆記文件數與總字節上限等);超出預算的寫入會被拒絕,而非靜默丟棄舊數據。 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、筆記與歷史工具組織長任務。