docs(resident): 补写「子的 io 通道视图 = 对父的实时回退」(N3 落地口径)

输出通道在 io 层就是 Device,由插件登记在父的 IOManager 上;驻留子只共享了 inputch
登记表 ⇒ 子侧 childIO 空壳(现场:子调 output_send__cli 被判「通道不存在或不可用」)。
文档写清:继承方式(SetParentIO)、四个受影响的方法、为什么是实时回退而非快照、
以及回退只解决看得见、授权仍在白名单之后。附线上实测结果(result: ok)。
This commit is contained in:
JianFeeeee
2026-09-13 15:16:58 +08:00
parent 91c4bc01f1
commit d0997f6279

View File

@ -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**