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