DeepSeek Harness 08:Inbox 控制——用户插话的一等事件语义

在真实的软件工程交互中,Agent 执行一个复杂的跨文件重构任务可能需要 2 到 3 分钟。在这漫长的执行期内,用户绝不是坐在屏幕前干等的旁观者:

  • 用户可能发现 Agent 误读了需求,想要立即喊停:“停下!不要改这个配置文件!”;
  • 用户可能想追加提示:“对了,刚才那个函数记得加上单元测试”;
  • 外部 CI/CD 系统可能会通过 Webhook 异步推送一条测试构建失败的系统通知。

如果把这些输入统统打成一个扁平的字符串追加到消息数组尾部,系统就会彻底失去时序因果。

DeepSeek Harness 将外部输入上升为一等公民的控制事件通道(Inbox Control Channels)。


一、控制输入是一等事件

在 DSH 中,Inbox 绝不是一个暂存字符串的简单先进先出(FIFO)队列,而是一个具备严格来源、介入时机与状态机因果的控制总线。

系统严格区分了三种不同意图的输入通道:

这三种通道的差异,体现了对人机协作边界的深刻理解:

通道类型 核心语义 执行时机 典型业务场景
followup 任务排队 等待当前 Turn 所有的工具调用与总结输出彻底平稳收敛后处理 用户追加非紧急的下阶段任务:“重构完后顺便帮我更新 README”
steer 实时纠偏与打断 立即介入! 触发当前 Step 的协作式取消检查,中断后续高危操作 用户紧急刹车:“不要动生产环境数据库!只修改本地 Mock”
inject 后台系统事实注入 随时写入,作为一个只读事实沉淀在 Session Log 中 外部 Webhook 推送告警、定时巡检心跳、自动化测试结果回传

二、取消不是删除:保留失败事实

当用户通过 steer 发送了打断指令后,最容易犯的低级错误是把刚刚已经启动但被杀掉的步骤从记录中直接抹掉。

DSH 的架构铁律指出:已经发生的物理副作用绝对无法通过删除记录来假装未发生!

  1. 控制内核通过标准 AbortSignal 向当前正在执行的工具或模型流广播取消信号。
  2. 工具必须主动捕获取消信号,尽可能安全地关闭网络套接字或子进程,并返回一个标明为 aborted 的标准结果块。
  3. Session Log 如实落盘 step/aborted 事实,清晰记录:该步骤执行到哪一步、被哪个用户的哪条指令在何时打断。
  4. 下一步的 Agent Loop 在派生上下文时,会把这次打断作为一个明确的历史证据呈现给模型,让模型能够主动向用户汇报:“我已停止修改文件 X,请确认接下来的新方案”。

三、Inbox 状态机生命周期

一条外部消息从进入系统到被彻底消费,必须经历一套严格可溯源的状态机迁移:

  1. inserted:消息入库,打上时间戳、来源签名与渠道类型;
  2. claimed:当前执行上下文(Turn)正式认领该消息,锁定所有权,防止被多个并发 Worker 重复消费;
  3. executed 或 discarded:如果消息被成功处理,沉淀为对应的事实;如果因为上下文切换或前序任务失败而不再适用,系统会显式发布 discarded 事件并记录丢弃理由,而非神秘失踪。

通过这种将输入与控制深度绑定的机制,DSH 彻底摆脱了单向执行脚本的局限,让 Agent 真正具备了与人类高频、双向、安全协作的工程底座。