Skip to content

[Priority: Med] [Feature] 支持向下游显式广播 interrupt resolved 信号 #159

@liujuanjuan1984

Description

@liujuanjuan1984

🔍 发现的问题 / 原始需求描述

  • 当前 interrupt resolved(如 permission.replied / question.replied / question.rejected)只会清理服务端内部 pending 状态,不会向下游显式外发一个 resolved 事件。
  • 这在当前实现上是清晰且可控的,但如果下游产品需要明确向用户展示“中断已结束 / 已恢复执行”,仅靠内部清理状态不足以支撑稳定的 UI/状态机。
  • 相关背景:[Priority: Med] [Architecture] 明确 interrupt 控制流契约并评估 resolved 事件外显策略 #158 已明确当前实现策略,但本 issue 关注的是“新增对下游显式广播 interrupt resolved 信号”的需求评估与实现。
  • 当前 HEAD:4db00106a819e909275c9a0a655bace89ff2e88c
  • 复现场景:下游消费方收到 permission.askedquestion.asked 后展示中断 UI;当上游后续产生 permission.replied / question.replied / question.rejected 时,当前协议层不会给下游一个明确的“resolved”输出事件。
  • 期望行为:当 interrupt 被回复或关闭后,下游可以从 A2A 输出中明确感知该 interrupt 已 resolved,并据此关闭 UI 或推进状态机。
  • 实际行为:当前仅清理内部 pending 状态,不对外显式广播 resolved。
  • 验收标准:
  • 明确约定 interrupt resolved 是否需要外发,以及外发时使用的事件类型、字段位置和去重语义。
  • 若决定支持外发,新增实现、测试与文档;若决定不支持,也需要给出正式设计结论并写入文档。

🛠️ 详细实施方案 (必须包含涉及的文件路径和核心逻辑/伪代码)

  • 涉及文件:/home/juanjuan/opencode-a2a-serve/src/opencode_a2a_serve/agent.py
  • 涉及文件:/home/juanjuan/opencode-a2a-serve/tests/test_streaming_output_contract.py
  • 涉及文件:/home/juanjuan/opencode-a2a-serve/docs/guide.md
  • 方向一:设计 resolved 外发契约。优先评估是否继续使用 TaskStatusUpdateEvent(final=false),并在 metadata.shared.interrupt 中增加例如 phase=resolved / state=resolved 一类的稳定字段。
  • 方向二:定义与 asked 事件的对应关系,确保 request_id 可关联到同一次 interrupt。
  • 方向三:定义重复 resolved、乱序事件、以及任务已完成后的处理策略。
  • 伪代码:
    on permission.asked/question.asked:
        emit interrupt asked status
    on permission.replied/question.replied/question.rejected:
        clear internal pending request
        if contract_enabled:
            emit interrupt resolved status {
                request_id: ..., 
                type: permission|question,
                phase: resolved,
                resolution: replied|rejected|approved|denied (as designed)
            }
    
  • 若最终选择不新增 resolved 外发事件,应评估是否至少提供一个可供下游轮询/推断的稳定信号,否则交互一致性仍然依赖消费方自行猜测。

🧪 回归测试建议

  • 新增测试:收到 asked + resolved 事件后,会产生一对可关联的 interrupt 状态输出。
  • 新增测试:重复 resolved 不会重复外发,或按协议定义保持幂等。
  • 新增测试:resolved 在任务完成前后到达时,行为符合协议预期。
  • 新增文档断言:明确 resolved 外发事件的字段、时机与兼容性说明。

Metadata

Metadata

Assignees

No one assigned

    Labels

    status:todoPlanned but not started

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions