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。

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

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

小夜