前言¶
在 DeepSeek Harness(DSH)里跑智能体,会话一拉长,历史会反复进上下文:Token 成本随长度涨,模型对早期内容的注意力也会变弱。常见应对是手动开新会话、自己复制粘贴进度,或依赖压缩——前者费事且容易漏关键决策,后者不一定在「当前 Step 还在跑工具或终端」时安全停下。
dsh-auto-handoff 是社区维护的工作流类 DSH 插件:在安全的 Step 边界结束当前会话,把任务与进度写成结构化交接简报,在同一工作区创建新会话并尽量继承 preset、模型、权限与 Plan 模式,由新会话接着做。触发可以是手动 /handoff,也可以按会话累计 Token 阈值自动执行。迁移不会硬中断正在执行的 Step、Tool Call、文件操作或终端命令——它只会拒绝「启动下一个 Step」。
下面介绍插件定位、能力与安装用法;事实以 GitHub 仓库 README 为准。DSH 生态是「一切皆插件」;SkillHub 目录页 为独立社区站点,与 DeepSeek / 幻方无官方从属关系。
这是什么¶
- 名称:
dsh-auto-handoff(npm 包名与 Cordis 插件name一致) - 维护者:qingyou002
- 分类:工作流
- 许可:MIT
- 事实基线(README 声明):
@deepseek-ai/dsh@0.1.5-rc.3
插件把长会话里的「总体目标 / 约束 / 已完成 / 当前进度 / 已改文件 / 关键决策 / 已知问题 / 未完成 / 下一步」九个小节,连同程序直接读取的原会话配置,渲染成固定结构的交接简报;简报由当前会话自己的模型生成摘要部分。旧会话标记为 retired,不再参与后续工作。
核心功能¶
Step 边界迁移,而非硬中断¶
迁移只在 Step 边界发生:不会打断正在跑的 Step、Tool Call、文件操作或终端命令。若 Token 阈值或 /handoff 已触发,插件会等待当前 Step 结束再执行后续动作;stepWaitTimeoutMs 超时只提示,不中断。
手动与自动两种触发¶
| 方式 | 说明 |
|---|---|
/handoff |
立即请求把当前会话迁移到同工作区新会话 |
| Token 阈值 | 开启 autoHandoffEnabled 后,会话累计 Token 达到 autoHandoffThreshold 时自动迁移 |
另有可选的 Token 阈值自动压缩(autoCompactEnabled / autoCompactThreshold),与自动迁移共用阈值判定与闩锁逻辑;两个开关都开启时,压缩阈值必须小于迁移阈值,否则设置无法保存。
斜杠命令¶
命令不进入模型可见历史。
| 命令 | 行为 |
|---|---|
/handoff |
立即迁移 |
/handoff status |
显示阶段、累计 Token 与来源、阈值、自动动作次数、最近一次动作与失败记录 |
/handoff cancel |
请求取消进行中的迁移或压缩(下一安全检查点生效) |
/handoff retry |
重试最近一次失败的迁移 |
空白会话(既无人类提示也无任何 turn)会被拒绝,提示「当前没有可迁移的活动会话」,不会创建无法继续的空会话。
配置继承¶
迁移时会在新会话上尽可能继承:
- 工作区
cwd与工作区归属(按路径attachSession) - Agent preset、模型、权限预设(含
custom时的审批策略) - Plan 模式(按 agent 解析,per-agent 语义)
浏览器私有 UI 状态、未落到会话上的临时模型/权限、原会话日志与附件不继承;继承结果会逐项报告「已继承 / 回退 / 未继承(原因)」。若 sessionController 或摘要所需的 llm 不可用,迁移会失败并明确报错,不会静默吞掉。
Token 判定与自动功能¶
累计口径(会话级,compaction 不会把它归零):
cumulative = totals.uncachedInputTokens
+ totals.outputTokens
+ totals.cacheReadTokens
+ totals.cacheWriteTokens
来源优先级:tokenUsage 投影 → tokenMeter.measure() 估算 → 不可用。标注为 unavailable 时自动迁移/压缩停用,手动 /handoff 仍可用。
安装与启用¶
安装命令来自仓库 README;装完需重启 dsh 才生效。包内带预构建 lib/,从 GitHub 直装无需在 profile 里为构建脚本加 allowBuilds 白名单。
# 从 GitHub 直装(推荐)
dsh plugin --profile <profile> add github:qingyou002/dsh-auto-handoff
# 或从本地检出的源码安装
dsh plugin --profile <profile> add "file:/path/to/dsh-auto-handoff"
package.json 声明了 dsh.bundle.patch 与 dsh.client(platform: "web"),Host 与浏览器端会自动挂载;浏览器半无需额外 profile 行。
设置命名空间为 dsh-auto-handoff;有 settings 服务时写入设置文档并重启后仍生效,没有时仅本次进程内有效。设置卡 Slot 为 settings.plugin.item,key: "dsh-auto-handoff"。
主设置默认值¶
| 字段 | 默认值 | 说明 |
|---|---|---|
autoHandoffEnabled |
false |
Token 阈值自动迁移 |
autoHandoffThreshold |
2000000 |
自动迁移阈值 |
autoCompactEnabled |
false |
Token 阈值自动压缩 |
autoCompactThreshold |
1500000 |
自动压缩阈值 |
关闭全部自动功能:将上述两个 boolean 都设为 false;手动命令仍可用。
典型用法¶
- 安装插件并重启 dsh,在设置里按需打开
autoHandoffEnabled并调整阈值,或保持默认、完全用手动迁移。 - 长任务进行中,在合适时机执行
/handoff,或等待累计 Token 触达阈值;若 Agent 仍在跑 Step,等待其结束即可。 - 用
/handoff status查看 Token 来源(精确 / 估算 / 不可用)与动作状态;失败时用/handoff retry,想中止排队中的动作用/handoff cancel。 - 迁移成功后,浏览器端默认会切到新会话(
openNewSessionOnHandoff默认为true);新会话首条提示为交接简报,在同一cwd下继续改代码、跑命令。
适用场景与注意¶
适合:单工作区内需要连续数小时以上的 Agent 任务;希望在不打断当前工具/终端的前提下换「干净上下文」;需要把 preset、模型、权限、Plan 模式一并带到新会话的开发者。
务必知晓:
- 插件以当前 dsh 进程的权限运行;安装前请阅读 源码与 LICENSE,自行评估信任边界。
- 自动功能依赖 Token 计量;适配器未上报且投影不可用时,只能用手动
/handoff。 - 两个自动开关同时开启时,须保证
autoCompactThreshold < autoHandoffThreshold;阈值过小(< 50000)会收到警告但仍可保存。 - 社区目录星标等元数据会变动;以 GitHub README 与本地 dsh 行为为准。
结尾¶
dsh-auto-handoff 解决的是长会话下的结构化交接:在 Step 边界停、写简报、同工作区开新会话并继承关键配置,而不是在工具跑到一半时强行掐断。手动 /handoff 与 Token 阈值共用同一套实现,便于在成本与注意力之间做可预期的切换。