前言¶
DSH 的會話越跑越長,上下文逼近上限時,模型開始丟早期信息。常規做法是手動開新會話、把關鍵結論複製粘貼過去,容易漏項;或者開多個窗口碎片地接,舊上下文到底折到哪一輪說不清。
xiacqi1/dsh-at-handoff 就是衝着這個問題做的。它是一個「工作流」類插件,盯住當前會話的上下文大小,越過設定的「智能線」後用一個膠囊提示,點一下讓模型把這一輪寫成交接文檔,再點一下在同項目裏開新會話、把文檔當作未發送的開場話送過去,舊會話留在側欄。
這是什麼¶
一句話定位:給 DSH 加一層上下文交接入口,讓長會話的切換有據可依。
- 名稱:
dsh-at-handoff(npm 包名,版本0.1.0) - 維護者:Xiacqi1
- GitHub 地址:https://github.com/Xiacqi1/dsh-at-handoff
- 目錄頁:https://www.skillhub.cn/plugins/Xiacqi1/dsh-at-handoff
- 分類:工作流
- 星標:1
- 許可證:MIT
它的思路是「監測—交接—續接」三步:不搶會話控制權,只在上下文越過閾值時給一個可點的入口,是否發起交接由你按回車決定。
核心功能¶
上下文監測¶
插件讀宿主半折出來的上下文數值,即 tokenMeter.measure(session).totalTokens,與界面顯示同源。它不是供應商賬單裏的 usage,也不是按字符估算的第三方數字,並且只對根會話計數,帶 parent id 的子會話會跳過。
智能線與步進¶
默認智能線是 120k。未越線時,輸入框上方居中顯示一枚膠囊,內容形如 121k / 智能線 120k,配一條細進度條,寬度貼合內容,不佔整行。越過智能線後膠囊變琥珀色,進度條被一行提示取代,右側始終有一枚按鈕。越線只變顏色,不加呼吸、彈跳之類的動畫。
步進規則:每多 30k 提醒升一級(120k / 150k / 180k…),文案隨之加重;回落到閾值 92% 以下才重新計步。
交接動作¶
膠囊右側按鈕有兩個狀態:
- 還沒寫交接文檔時是「去交接」,點擊後交接指令作爲草稿填進輸入框,由你自己按回車發出,插件不替你提交。
- 寫完後按鈕變成「去新會話」,點擊後在同一項目裏開一個新會話,交接文檔作爲它的未發送開場話。
交接指令是一個請求,不是命令:技能不在命令註冊表裏。模型會加載內置的 at-handoff 技能,把這一輪寫成一份文檔,調用 write_handoff 落盤到 <項目>/.scratch/handoff/,然後停手。舊文檔歸檔到 .scratch/handoff/archive/。
文件命名¶
交接文檔命名爲:
<YYYYMMDD>-<HHmm>-<會話 id 後 8 位>-<slug>-<N>.md
N 是該會話自己的第幾份交接,所以連點兩次也不會互相覆蓋。
安裝與啓用¶
插件已發佈到 npm:dsh-at-handoff@0.1.0。裝好之後要重啓一次宿主(Web 端 dsh web,桌面端用官方插件管理頁),客戶端膠囊纔會出現。
市場裏裝(推薦)
在市場面板搜 at-handoff 或 上下文交接,點安裝。
命令行裝
dsh plugin --profile web add dsh-at-handoff
桌面端
插件管理頁 → 安裝 → 填 dsh-at-handoff。
從源碼開發
plugin_manager install_bundle({ target: "<本倉庫路徑>" })
當 dsh-at-handoff 作爲依賴指向本倉庫時,改宿主半需要關開一次插件(plugin_manager set_plugin),改客戶端半刷新頁面即可。
典型用法¶
1、正常跑會話,留意輸入框上方的膠囊。上下文沒越線時,它只顯示當前數值和進度條,可以忽略。
2、上下文越過智能線,膠囊變琥珀色、右側出現「去交接」按鈕。點它,交接指令會作爲草稿填入輸入框。
3、確認草稿內容與你的預期一致,按回車發出。模型調用內置 at-handoff 技能,把這一輪寫成文檔並寫入 <項目>/.scratch/handoff/,然後停手。
4、膠囊按鈕變成「去新會話」。點它,插件在同一項目裏開新會話,交接文檔作爲未發送的開場話放在輸入框裏,舊文檔歸檔到 .scratch/handoff/archive/。
5、需要回顧舊會話時,它在側欄仍然留着。
配置¶
插件目前通過環境變量配置:
| 變量 | 默認 | 含義 |
|---|---|---|
AT_HANDOFF_THRESHOLD |
120000 |
智能線 |
AT_HANDOFF_STEP_TOKENS |
30000 |
每多多少 token 升一級 |
AT_HANDOFF_HYSTERESIS_RATIO |
0.92 |
回落到閾值的多少比例以下才重新計步 |
宿主半的接口¶
插件暴露了三個 HTTP 接口,便於外部查看和推進交接狀態:
GET /at-handoff/state?op=state[&session=<id>] 當前測量、分級與是否已有交接文檔
POST /at-handoff/state?op=take 把文檔標記爲待取走
POST /at-handoff/state?op=consume 取走並歸檔
代碼結構¶
lib/index.js— 宿主半:測量、分級狀態機、write_handoff工具、HTTP 路由。lib/client.js— 客戶端半:conversation.input.dock上的膠囊,以及conversation.composer.dock上只跑狀態機、不渲染像素的組件(只有它拿得到inputActions.setDraft與uiWorkspace)。lib/handoff.js— 交接文檔的命名、寫入與歸檔。lib/skill.js— 把skills/at-handoff/SKILL.md註冊成內置技能,每次讀取都重新讀盤。cordis.patch.yml— 把宿主半掛進 profile 的宿主平面。
適用場景與注意¶
適合誰:長會話容易被上下文截斷、需要頻繁把工作從一個會話接到另一個會話的 DSH 用戶,尤其是已經在用 DSH 做持續開發、且習慣用 .scratch 目錄存過程產物的人。它不替你決定何時交接,只是在閾值處給一個入口,因此對「交接時機要可控」的場景友好。
需要留意的幾點:
- 插件以當前 dsh 進程的權限運行,安裝前應檢查源碼與許可證(MIT),確認信任後再裝。
- 客戶端半報錯會讓整塊界面消失且出現白屏,桌面端尤其拿不到 console 原因;設計文檔
at-handoff-DESIGN.md末尾記了重建錯誤上報通道的做法,尚未實施。 conversation.composer.bar不是客戶端註冊的槽位,掛上去什麼都不會顯示;目前只有conversation.input.dock與conversation.composer.dock可用。- 卸載不會刪掉項目裏的
.scratch/handoff/,已寫好的交接文檔仍在。
dsh plugin --profile web remove dsh-at-handoff
結尾¶
dsh-at-handoff 的價值不在替換你現有的交接方式,而是在界面裏給出一個不打斷節奏的上下文監測和接續入口:監測數值與界面同源,交接文檔落盤在項目裏、命名不覆蓋,舊會話留在側欄。目錄頁見 https://www.skillhub.cn/plugins/Xiacqi1/dsh-at-handoff,源碼見 https://github.com/Xiacqi1/dsh-at-handoff。