前言¶
在 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