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