From d0997f6279d92b69198ae807ea2ecf5e90a8da11 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Sun, 13 Sep 2026 15:16:58 +0800 Subject: [PATCH] =?UTF-8?q?docs(resident):=20=E8=A1=A5=E5=86=99=E3=80=8C?= =?UTF-8?q?=E5=AD=90=E7=9A=84=20io=20=E9=80=9A=E9=81=93=E8=A7=86=E5=9B=BE?= =?UTF-8?q?=20=3D=20=E5=AF=B9=E7=88=B6=E7=9A=84=E5=AE=9E=E6=97=B6=E5=9B=9E?= =?UTF-8?q?=E9=80=80=E3=80=8D=EF=BC=88N3=20=E8=90=BD=E5=9C=B0=E5=8F=A3?= =?UTF-8?q?=E5=BE=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 输出通道在 io 层就是 Device,由插件登记在父的 IOManager 上;驻留子只共享了 inputch 登记表 ⇒ 子侧 childIO 空壳(现场:子调 output_send__cli 被判「通道不存在或不可用」)。 文档写清:继承方式(SetParentIO)、四个受影响的方法、为什么是实时回退而非快照、 以及回退只解决看得见、授权仍在白名单之后。附线上实测结果(result: ok)。 --- docs/zh/resident-subagent-design.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) 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**,