dsh-at-handoff:盯住上下文,把這一輪換成交接文檔

前言

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。

羽毛球分组比赛记分
小程序二维码

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

小夜