Skip to content

修复:整组子代理及主代理最终回复结束后再发送完成通知 - #1437

Open
tossp wants to merge 1 commit into
agegr:mainfrom
tossp:fix/family-completion-notifications
Open

tossp wants to merge 1 commit into
agegr:mainfrom
tossp:fix/family-completion-notifications

Conversation

@tossp

@tossp tossp commented Oct 28, 2026

Copy link
Copy Markdown

关联议题

Fixes #1434

问题与复现

在 main 的主会话中启动两个耗时不同的后台子代理,然后切换到其他标签页:主代理结束“已开始处理”等阶段性回复时,即使还有子代理运行,也可能发送完成通知;第一个子代理回报后主代理再次暂停,还可能重复宣布完成。

子代理自身已静默,但原来的后端 Push 和页面提示分别根据主代理本轮结束判断,未覆盖整组代理及结果回传。

改动

  • 独立跟踪每次子代理执行,覆盖排队、MCP 准备、执行、清理和结果回传触发的主代理回复;已完成的中间代理不会使孙代理脱离根会话。
  • 主代理自身空闲、所有后代及结果回传结束后,由后端提交一次 completionId 并发出 session_complete,服务端 Web Push 和页面完成提示共用该决定。
  • prompt_done、agent_settled 继续负责原有 UI 阶段,不再单独触发完成提示。现有 SSE、状态读取和侧栏轮询使用完成 ID 恢复及去重,初次快照不重放历史。
  • 子代理与主动停止继续静默;真正结果投递失败不冒充最终汇总完成。补齐终态写入异常的原占位清理,以及入队状态写入失败后的孤儿任务问题。
  • 仍欠完成通知的根会话在后代运行时不被普通空闲回收;项目信任刷新沿用现有 busy 拒绝路径,避免重建时丢失完成责任。

不改变主代理自身的 isRunning() 定义、正常子代理调度、结果回传协议或 SDK,不新增依赖、设置或扩展 API。每个客户端观察者按完成 ID 去重,不引入跨标签页或跨浏览器的全局通知仲裁。会话名称兜底不在本 PR 范围内。

验证

  • 全量测试:2957 通过、1 跳过、0 失败(本机以 root 运行,使用 setpriv --bounding-set=-dac_override,-dac_read_search npm test 去除 DAC 绕过能力,使权限测试按普通用户语义执行)。
  • node_modules/.bin/tsc --noEmit:通过。
  • npm run lint:通过。
  • git diff --cached --check:通过。
  • 集成测试使用真实 SDK 和合成模型,覆盖主代理先暂停、子代理继续、结果回传触发最终汇总,最终仅产生一个共享完成决定;另覆盖嵌套、resume、Stop、投递/持久化异常、空闲回收、重连与目录滞后。
  • 未调用真实模型、未执行 next build、未部署;未进行真实浏览器 Push 端到端验收。

主代理本轮结束不再等同于整组工作完成;持续跟踪排队、准备、执行及结果回传中的子代理和后代。

- 后端统一提交 session_complete 与 completionId,页面提示和 Web Push 共用完成决定
- 保持主代理自身 isRunning 语义,子代理与主动停止继续静默
- 补齐最终回传后的重查、重连去重及后台侧栏恢复
- 覆盖嵌套代理、异常清理、空闲回收和状态持久化失败场景

Refs agegr#1434
tossp pushed a commit to tossp/tsgw-agent that referenced this pull request Oct 28, 2026
对应 agegr#1437,解决 agegr#1434。保留独立上游贡献分支。

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

修复:有后台子代理未结束时,主会话不应提前发送完成通知

1 participant