Replies: 7 comments 3 replies
|
Good gap. The composer today routes to the main agent; subagents are queue-only by design (they run in their own loop). A steer channel is feasible without touching the scheduler:
The risk to design around: interleaving steer messages with an in-flight subagent turn must be explicit (queue vs immediate), and the parent session needs a read-only view of child progress so steer targets exist before the child finishes. Happy to write this up as an RFC draft in the community docs if useful. |
|
Thanks @zoahdev — both ideas (a What works today
Layer 1:
|
|
Composer 只能 queue 子代理会话,不能 steer——子代理控制通道缺失(能排队不能指挥),和 #1442/#2006(子代理模型选择/继承)一起看,子代理交互体系还在补。 第 9 章子代理章节有相关记录:https://github.com/Electricitysheep/dsh-handbook/blob/main/docs/09-mcp-subagent-workflow.md |
|
这个实现很实用——Ctrl+Enter 劫持 + 底层插件 API 跨会话消息打断发送,正好补上「Composer 只能 queue 不能 steer」的缺口(社区方案先行,官方 #1517 的 managed jobs 也在这方向)。 已收录进手册生态章节(子代理交互家族):https://github.com/Electricitysheep/dsh-handbook/blob/main/docs/07-ecosystem.md |
|
EMERGENCE.md 这个研究有意思——多 agent 协作自动涌现出阶段效果和合作效果,这正是第 9 章"Agent 系统化"的进阶命题(单 agent → +MCP → +子代理 → +工作流 之后,多 agent 涌现是下一步)。 如果方便,可以把涌现观察整理成可复现实验(几个 agent/什么任务/观察到的阶段),我们手册第 9 章 + 第 15 章生态报告可以作为"多 agent 协作"案例收录,社区也能复现验证。 |
|
@alex04130 实现得利落——"API 层不拒绝子代理 steering、只是 InputBar 门禁挡住"这个结论很有价值,说明缺口在 UI 门禁和事件通道,不在调度器。 如果走官方通道,建议把这条整理成 RFC: 我可以按官方 RFC 格式起草一版(事件 schema + UI 行为 + 兼容性说明),需要的话说一声,我们来来回回把细节磨干净再挂 RFC 编号。 |
|
RFC 草稿来了,兑现承诺:https://github.com/zoahdev/dsh-docs/blob/main/docs/rfc/subagent-steer-channel.md 核心三点:
兼容性:不改 session-log 格式,老客户端忽略未知事件;你那个 client plugin 已经证明消息路径在现有 API 上存在——这个 RFC 只是把它标准化。验证计划写了三级(e2e 注入落位 / API 级 typed error / UI picker),open questions 也列了(是否持久化、工具调用中的 budget 语义、要不要 ack 事件)。 有问题直接在这个 thread 拍,我们磨到能挂 RFC 编号为止。 |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Problem
Opening a subagent session in the Web GUI, the composer can only QUEUE input — there is no way to steer (interrupt the running turn with fresh input). For a long-running child, a human must wait for the current turn to finish before their message is even seen.
Root cause (source-verified)
dsh-client-ui-conversationlib/client.js(line ~3503):keyboard.submit(resolveSubmitMode(running, gesture, subagent === null))—steeringAvailableis hard-coded tosubagent === null, so every subagent session resolves to queue-only.prompt->turnAgentFor->agentForcarries no subagent-ownership check (that check lives inensureSession, which other endpoints use). Soagent.steeron a live child is reachable through the API — only the UI entry is closed.Evidence that the agent loop itself supports it
A host-side plugin CAN steer a live subagent: calling
agent.steer(message)on a running child works (we use it from a cross-session messaging plugin today, and the child observes it mid-turn). The blocking point is purely the composer UI gate.Suggestion
Drop the
subagent === nullgate (or expose an explicit steer option) so the composer can steer when the target child is live, falling back to queue when it is not running. This matters for interactive supervision: humans opening a child session mid-run should be able to redirect it immediately, the same way they can for top-level sessions.All reactions