diff --git a/docs/zh/resident-subagent-design.md b/docs/zh/resident-subagent-design.md index c0da8a0..168fd6e 100644 --- a/docs/zh/resident-subagent-design.md +++ b/docs/zh/resident-subagent-design.md @@ -128,6 +128,29 @@ `ResolveOutputTarget`(未登记的通道由传输层 device 自行处理,如 qq/webui)。 这是"输出可寻址到具体 agent"的数据面;真正的跨 agent 投递在 N4。 +**已落地(N3):子的 io 通道视图 = 对父的**实时回退** + +输出通道在 io 层就是 `Device`,而它们由插件登记在**父**的 `IOManager` 上。驻留子确实该有 +自己的输入入口与 `outputCh`(所以子是 `NewIOManager()`),但**必须继承父的设备视图** —— +否则上面 §4.4 的授权集合形同虚设:`output_list_channels` 为空、`output_send__X` +连工具都不生成、按名字直调也会被判「通道不存在或不可用」。 + +落地方式:`IOManager.SetParentIO(父)`(子创建时挂上)。 + +| 方法 | 行为 | +|---|---| +| `GetDevice` / `GetChannelCapabilities` | 自己设备表没有时回退到父 | +| `ListChannels` | 自己的登记优先(可覆盖/屏蔽同名通道),其次并入父的可见通道,按**名字**去重 | +| `ExecuteTool` | 自己的设备工具没有时回退到父 | + +- **为什么是实时回退、不是创建时复制快照**:设备随资源生灭(远程设备上线/掉线以分钟计, + 现场日志 60 秒一个来回),快照转瞬即过期;回退永远与父一致(父注销后子立刻看不见)。 +- **回退只解决"看得见",不解决"能不能用"**:§4.4 的三处过滤点仍然在白名单之后, + 授权收窄不受影响(判据:白名单外的通道既不出现在工具表里,直调也被拒且不送达)。 +- 现场缺陷(2026-09-13 用户线上联调实录):**父侧通道装载完整、子侧 `childIO` 空壳**, + 子调 `output_send__cli` 被判「通道 [cli] 不存在或不可用」。修复后线上实测:子调 + `output_send__cli` → `result: ok`,并经 `notify_parent` 回报。 + ### 4.5.1 通道的一等化(后续要求) 现在 `Source` / `OutputChannel` 只是字符串标签,`IOManager.inputCh` 是**一条全局 channel**,