vlln/dsh-autofork:Agent 忙时自动分叉会话

前言

DeepSeek Harness (DSH) 的插件化架构允许在运行时动态扩展能力。在 agent 执行耗时任务(如长文本生成、工具调用)时,传统的交互模型往往要求用户等待当前轮次结束,或者使用 steer 等待下一个 step 边界。这会导致用户在等待期间无法插入新指令,交互被割裂。

dsh-autofork 插件通过 harness 侧的被动触发机制解决了这个问题:当检测到 agent 正在忙碌且无法被打断时,用户提交的新指令会自动在一条新的会话(分叉)中执行;原会话留在后台继续运行直至完成,跑完后将结果回注到前台会话。这种机制将”必须等待”的串行交互转变为”随时可插话”的并行交互。

核心功能

  • 自动分叉:Agent 忙碌时,新指令自动触发分叉,用户立即在空闲会话中响应。
  • 后台续跑与回注:原会话不中止,跑完后将结果注入当前会话。
  • 家族血缘视图:提供”分叉”页签,展示分叉会话的血缘树。
  • 工具集:暴露 fork_list、fork_steer、fork_cancel 三个工具供前台调用。
  • 容器模式:实验性功能,尝试将消息交给绑定实例处理。

安装与启用

通过官方插件命令安装:

dsh plugin --profile web add github:vlln/dsh-autofork

安装后需重启 web 进程,bundle 会重新加载层栈。

使用方式

  • 触发条件:只有当 agent 正在运行当前轮次且来不及被打断时,新指令才会触发分叉。如果 agent 空闲,它会直接响应,不会平白多出会话。
  • 分叉行为:
  • 左侧列表会冒出新会话,命名为 ⑂n <原会话名>。
  • 焦点会自动切到新会话,用户立即与空闲 agent 交互。
  • 旧会话在后台继续运行,完成后结果回注。
  • 分叉页签:显示整个家族的血缘树,包含会话状态、触发指令和分叉时间。
  • 注入摘要:回注内容默认折叠成一行摘要,可展开查看。

工具与参数

插件向前台暴露了三个工具:

工具 说明
fork_list 列出家族会话,显示名字与实时状态(运行中 / 空闲 / 已结束)。↑ 表示接管了前台,↓ 表示被前台接管,~ 表示同族另一条分叉。
fork_steer 给家族里的一条会话发中途指令,等价于 steer,无需中止。
fork_cancel 中止家族里的一条会话。参数 keepInbox=true 只中止当前 turn 并保留待处理项。

配置参数集中在 src/params.mjs,关键参数如下:

参数 默认值 说明
enabled true 总开关。
minStepAgeMs 0 分叉门槛:step 已运行低于此时长则不分叉。
coalesceWindowMs 2000 距下一个 step 边界不足此时长时降级为 steer。
maxActiveBranches 3 同一前台下的活跃后台分叉上限。
followHead true 是否把焦点切到新分叉。
titleMark '⑂' 分叉会话命名标记,格式为 <标记><序号> <家族根名>。
noticeSummaries true 注入消息是否折叠成一行摘要。
exposeDispatchTools true 是否向前台暴露工具。
containerMode false 容器模式(实验),默认关闭。
mirrorDelivery 'safe' 实例回复投递方式,'immediate' 已知会写坏容器转写。

限制与注意事项

  • 非子代理树:分叉出来的会话是普通会话,不会出现在原生「子代理」实例树中,家族关系由「分叉」页签与 fork_list 表达。
  • 命名限制:开启分叉命名后,会话不再被自动命名,标题被钉住。
  • 文件隔离:无文件级隔离,分叉与旧会话共享同一个 cwd。并发写文件需手动协调(如使用 stale-version 守卫)。
  • 实验性开关:containerMode 会导致容器与分叉重复劳动,mirrorDelivery: 'immediate' 已知会破坏会话转写,建议保持默认。
  • 平台限制:部分客户端功能仅在 web 平台生效(dsh.client.platform = web)。

验证与自检

  • 健康检查:GET /api/dsh-autofork/health[?sessionId=<id>] 返回插件参数、已注册工具与家族状态。
  • 本地验证:运行 npm run verify 进行语法检查、静态门禁和测试。

许可证

MIT

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

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

小夜