From 39566101345c592f03c84d341d9cf542ef37da5a Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Sun, 13 Sep 2026 08:40:04 +0800 Subject: [PATCH] =?UTF-8?q?docs(resident-subagent):=20inputch=20=E6=98=AF?= =?UTF-8?q?=E6=9C=80=E5=9F=BA=E6=9C=AC=E7=9A=84=E8=BE=93=E5=85=A5=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E5=8D=95=E4=BD=8D=EF=BC=88=E6=8F=92=E4=BB=B6=E5=8F=AF?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E5=A4=9A=E4=B8=AA=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按用户补充收窄定义: - inputch 是**最基本的输入路由单位** —— 路由粒度到此为止(比「插件」细、比「通道名字符串」实) - **由插件注册,且一个插件可注册多个**(登记接口即现有 RegisterInputChannel, 调 N 次就是 N 个 inputch;同一插件的多个 inputch 彼此独立,可绑给不同 agent、可分别限额) - 「划入输入通道」的单位 = **inputch**(不是插件、不是通道组) - 通道注册层以 inputch 为键(一个插件 → N 个 inputch),每个 inputch 带 归属/被划给的 agent · 容量 · 可接收类别 · 输出目标解析 新增测试点 S21(同一插件两个 inputch 分别划给父与子,互不串台)。 --- docs/zh/resident-subagent-design.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/docs/zh/resident-subagent-design.md b/docs/zh/resident-subagent-design.md index f35312a..7ff552c 100644 --- a/docs/zh/resident-subagent-design.md +++ b/docs/zh/resident-subagent-design.md @@ -36,7 +36,7 @@ | **根 agent** | 进程级主 agent,拥有**完整内核**(含记忆读写、全部通道) | | **驻留子** | 父创建、长期驻留的子 agent,拥有**轻量内核**与**临时记忆空间** | | **工作式轻量子** | 现状 `spawn_child` 的一次性子任务(**不是内核实例**) | -| **inputch** | 对"中断输入 / 排队输入"两者的高层抽象,是**路由与分配**的单位 | +| **inputch** | **最基本的输入路由单位**:对"中断输入 / 排队输入"两者的高层抽象,是**路由与分配**的单位;**由插件注册,一个插件可注册多个** | | **outputch** | 输出通道;输出是 agent 的**主动调用**,并**可寻址到具体 agent** | | **main 空间** | 主记忆空间:父读写、所有子只读、全部子共享 | | **temp 空间** | 子临时记忆空间:该子读写、子之间互不可见 | @@ -71,8 +71,12 @@ `inputch` **不是**通道名标签,也**不是**与 outputch 配对的东西。它是: -1. **对"中断输入"与"排队输入"两者的高层抽象** —— 两类输入都从 inputch 进出; -2. **路由与分配的单位**: +1. **最基本的输入路由单位** —— 路由粒度到此为止:比"插件"细、比"通道名字符串"实; +2. **由插件注册,且一个插件可注册多个** —— 同一个插件的多个 inputch 是**彼此独立**的 + 路由单位(可以绑给不同 agent、可以分别授权)。登记接口即现有的 + `RegisterInputChannel(name, def)`,调 N 次就是 N 个 inputch; +3. **对"中断输入"与"排队输入"两者的高层抽象** —— 两类输入都从 inputch 进出; +4. **路由与分配的单位**: - **路由**:一条输入投给哪个 inputch,就是"该由谁处理"的**既定事实** ⇒ **路由发生在进内核之前**; - **分配**:inputch 是**可分配资源**(父把输入通道划给子)。 @@ -102,7 +106,8 @@ ### 4.4 通道分配:不对称 [已定] -- **不按对划分**。父为子:**划入若干输入通道** + 授权**一组可用输出通道**(授权集合,不是一对一)。 +- **不按对划分**。父为子:**划入若干 inputch**(单位是 inputch,可以来自同一个插件的不同 inputch) + + 授权**一组可用输出通道**(授权集合,不是一对一)。 - **输出通道可寻址到具体 agent**: - **子 → 主**:子直接打到主(经输出通道投进主的 inputch); - **主 → 指定某个子**:父经输出通道投进**指定子**的 inputch。 @@ -113,7 +118,10 @@ `inputChannels` 只是策略表(`ChannelDef`:NoMemory / Cleaner / ContextPolicy), **没有归属、没有绑定、没有容量**。要实现 §4.4 需要新增: -- **通道注册层**:`inputch` 成为一等对象(归属 agent / 容量 / 可接收类别 / 输出目标解析); +- **通道注册层**:`inputch` 成为一等对象。它已经是**最基本的输入路由单位**, + 所以注册表以 **inputch 为键**(一个插件 → N 个 inputch),并给每个 inputch 带上: + **归属/被划给的 agent · 容量 · 可接收类别 · 输出目标解析**; + ⇒ 同一个插件的两个 inputch 可以**分别划给不同 agent**、**分别限额**; - **输出通道 → 目标 agent 的 inputch** 的解析; - **授权过滤**:`output_list_channels` 只列该 agent 被授权的通道。 @@ -366,6 +374,7 @@ | S15 | 子之间 temp 隔离 | 两个子各写 temp,互相查 | 查不到对方的 temp | | S16 | 父退出清理 | 父 `Stop()`(多个子、有子在工作中) | 全部子被销毁;登记表空;**无孤儿 goroutine / 无悬空通道 / 无残留 temp** | | S17 | L4 独占 | 子内部(子自己的输入/工具/定时器)试图产生 L4 | 被夹到 **≤L3**;只有父的消息是 L4 | +| S21 | 一个插件多个 inputch 可分别路由 | 同一插件注册 2 个 inputch,分别划给父与子后各投一条输入 | 各自只到被划给的 agent,互不串台 | | S19 | 父消息必能打断子 | 子在长任务中(LLM 流式段)时父发送消息 | 子按 L4 被打断;若子在不可抢占临界区,则在安全点生效 | | S20 | 子的内核级事件上报 | 子 panic / 子 contextfull | 在**父的阶梯上以 L4(带子标识)**出现;子侧不自己产生 L4 | | S18 | 内核不持有"当前通道" | 抢占/中断后被打断任务恢复并发响应 | 提示词与事件标签都**只来自输入事件**(不再有被覆盖的字段) | @@ -383,7 +392,7 @@ | **R12** | 子的内核级事件(panic / contextfull)上报级别 | **[默认/推论]在父的阶梯上以 L4(带子标识)上报** | | **R4** | 父→子消息落地 | **[默认]挂起/恢复**(现场不丢);一处开关可改"直接丢弃" | | **R5** | "主动写入处理表"的形态 | **[默认]子调用 `inputch_note` 类工具**;未调用则轮末自动写 | -| **R6** | 输入通道"划入"的语义与容量 | **[默认]读写授权(不转移所有权)+ 创建时给定容量** | +| **R6** | 输入通道"划入"的语义与容量 | **[默认]读写授权(不转移所有权)+ 创建时给定容量**;**划入单位 = inputch**(不是插件、不是通道组) | | **R7** | 压缩由谁执行 | **[默认]子的轻量内核自己压**(它有自己的上下文与 LLM),压缩后清表 | | **R8** | 压缩前父是否"查看后决定" | **[默认]纯机械压缩**(父只在选"压缩 vs 回收"时决策) | | **R9** | 回收时处理表 | **[默认]不必清**(子都没了);若日后要留作审计需单独策略 |