前言¶
長會話在 DSH 中容易退化,作者自測約 70% 上下文後會出現“只思考不輸出”的情況。DSH 原生的 compaction 是“就地壓縮”,用摘要替換原文,歷史會被改寫。本插件提供另一種方案:當上下文壓力達到閾值或會話被壓縮次數過多時,開一個新會話,保留一份可審閱的原文交接包,舊會話原樣保留。
簡介¶
dsh-session-shift 是一個 DSH 插件,所有者爲 easerlee。它的核心功能是在上下文壓力觸達閾值時,將當前工作交接給一個新會話。它不依賴模型總結,而是機械提取會話自身的狀態(改動過的文件、用過的工具、最近的消息、停在哪兒),生成交接包落盤。所有操作僅在本地進行,不聯網、不外發數據。
安裝¶
安裝命令根據宿主環境(桌面端或 Web 端)不同而有所區別。
桌面端(profile desktop):
"<DSH 安裝目錄>\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add dsh-session-shift
注意:需先打開過一次桌面端使 profile 初始化,且執行前完全退出應用(profile 有寫鎖)。
Web 端(profile web):
dsh plugin --profile web add dsh-session-shift
注意:首次使用時 profile 會自動初始化。
安裝後需重啓對應端,bundle 列表僅在啓動時讀取。
配置¶
插件的核心配置位於 profile 的 cordis.patch.yml 中。該文件是 DSH profile 的配置清單,聲明本插件作爲一個 bundle 掛載,並非修改運行時代碼。
配置項示例:
- id: dsh-session-shift
config:
enabled: true
thresholdRatio: 0.6 # 上下文壓力到多少比例觸發交接
maxCompactions: 2 # 本會話被壓縮幾次後觸發交接(0 = 只看壓力)
cooldownMs: 300000 # 同一會話兩次交接的最小間隔
handoffDir: .dsh/handoff
recentMessages: 14
maxChars: 24000
renameOldSuffix: " [已交接]"
dryRun: false
stopOldSession: true # 交接完成後是否停掉老會話當前那一輪
用法¶
插件提供了工具調用和 HTTP 接口兩種觸發方式。
桌面端試跑(不實際建會話):
handoff_now(dryRun: true)
Web 端或命令行手動觸發:
curl -X POST http://127.0.0.1:<端口>/api/handoff/run \
-H "content-type: application/json" \
-d '{"reason":"手動換會話"}'
查看狀態:
curl http://127.0.0.1:<端口>/api/handoff/status
交接機制¶
自動交接滿足以下任一條件且距上次交接超過 cooldownMs 時觸發:
1. 上下文壓力達到 thresholdRatio。
2. 本會話已被壓縮 maxCompactions 次(默認爲 2)。
交接發生時按順序執行三件事:
1. 先將交接包落盤到 .dsh/handoff/。
2. 新建會話,標題格式爲 原標題(接 N),N 爲舊標題最後編號 + 1。
3. 將舊會話標題加上 [已交接],並根據 stopOldSession 配置決定是否停止老會話當前運行的那一輪。
交接包內容¶
交接包是 Markdown 格式,全部機械提取,不經過模型:
* 改動過的文件:本會話動過的路徑(最多 120 條)。
* 用過的工具:按調用次數排序的前 12 個工具。
* 最近幾輪消息:用戶消息段 + 助手消息段,按預算從新往舊填充。
* 停在哪兒:最後一條助手消息。
已知限制¶
- 兼容性:自動切會話依賴 harness 的
uiWorkspace.openSession接口。如果 harness 較老沒有該接口,插件不會報錯,也不會自動切換會話,原因會記錄在$DSH_HOME/handoff-client-report.json中。 - 舊會話處理:舊會話只改名不歸檔(有意爲之)。
- HTTP 接口:僅作用於該宿主進程裏活躍的會話。
許可證¶
MIT