Skip to content

feat(subagents): 支持从卡片直接停止子智能体 - #1423

Open
zszz3 wants to merge 7 commits into
vastsa:mainfrom
zszz3:codex/feat-subagent-stop-controls
Open

zszz3 wants to merge 7 commits into
vastsa:mainfrom
zszz3:codex/feat-subagent-stop-controls

Conversation

@zszz3

@zszz3 zszz3 commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

功能说明

运行时已有 TaskStop,可以由主模型调用来停止子智能体。本次为用户增加直接点击的入口:在子智能体卡片或详情面板点击「停止」,或在分组标题处点击「停止全部」。按钮与 TaskStop 共用同一套停止逻辑,无需再请求主模型调用工具。

例如 A、B 同时运行时,停止 A,B 和主智能体继续工作;A 已输出的内容仍可查看。

关联 #1417。此 PR 属于 feat;仓库当前限制外部贡献以 fix/perf 合入,本次提交供维护者评估,不代表已获得例外许可。

具体实现

  • 界面入口:运行中的子智能体卡片右下角常驻「停止」,详情面板提供同样的操作,分组标题提供「停止全部」。结束后隐藏停止按钮,无障碍名称包含目标子智能体。文案和更新说明覆盖九种语言。
  • 模型信息:保留卡片第一行的模型信息,将模型名与思考强度分开显示。长模型名可以省略,medium 等思考强度保持完整。
  • 复用停止逻辑:将原 TaskStop 内的取消代码抽成共享方法,桌面通过 IPC 调用当前会话的运行时。没有新增模型请求,也不向模型历史伪造工具调用。沿用原有的五秒等待上限;尚未确认结束的任务保持「正在停止…」,避免误报已停止和重复提交。
  • 限制操作范围:只操作当前会话的指定子智能体;不传 ID 时选择该会话全部运行中的子智能体,显式空列表则拒绝。IPC 和 sidecar 都校验参数。父级停止按钮的行为保持不变,新入口仅用于本地托管会话。
  • 补齐终态落盘路径:fix(subagents): 子代理完成后立即更新并持久化 Task 状态 #283 已提供终态事件与 outbox 处理。本次补的是 Host 遇到已有 running Task 记录时的重复写入路径:只有会话、消息、工具调用和委派 ID 均匹配,才允许用终态替换运行中结果。保留原参数、元数据和顺序,拒绝旧 running 消息及无关结果覆盖终态。没有数据库迁移或转录格式变更。

验证结果

测试提交:17459704c;基于上游 main 1f5302335810ac722c7bf97d4f21f1961d59b524。创建 PR 后已核对,GitHub 合并候选与本地测试提交的代码树一致。CI 状态以 PR 检查结果为准。

  • Desktop 类型检查、Electron 构建、样式 token 检查、git diff --check 通过。
  • 转录与拓扑测试 37 项通过;Host 终态持久化回归通过,覆盖跨会话 ID 冲突、委派 ID 不匹配、原参数保留和旧状态重放。
  • scripts/e2e-subagent-stop.mjs:使用真实 Electron Main、sidecar、Host,配合隔离配置和本地流式模拟服务,验证详情面板停止、兄弟与父级任务不受影响、停止全部、部分输出保留、终态落盘、空列表拒绝、deepseek-flash medium 完整显示及按钮右下角位置。
  • scripts/e2e-subagent-parent-error.mjs:直接停止、父级报错、abort、TaskStop 四种场景通过。
  • 实现阶段已通过运行时测试 283 项、host-core 测试 756 项,以及 Cargo 格式检查和 Clippy;这些是本地结果,不等同于 PR CI。
  • 经授权使用真实 DeepSeek 跑过桌面代码阅读任务:停止一个子智能体后,另一个继续并完成。可重复的自动化验证使用本地模拟服务。
  • Claude Code review 完成,复核后无确认的问题。

自动化桌面测试未覆盖原生/远程会话控制,也不声称完成了穷尽的键盘操作和浅色主题验证。

Let users cancel individual delegates or all delegates in a session through the existing TaskStop cancellation path without a model round trip. Preserve parent execution, partial output, and pending cancellation state.

Persist matching terminal Task snapshots when an indexed running result already exists, so explicit cancellation survives transcript reload.

Refs vastsa#1417
@zszz3 zszz3 changed the title feat(subagents): add direct stop controls to delegation cards feat(subagents): 支持从卡片直接停止子智能体 Oct 5, 2026
Preserve the indexed streaming-state fast path alongside terminal Task snapshot updates. Resolve IPC imports and retain both sets of E2E scenarios without rewriting the shared branch history.
@Tioit-Wang

Copy link
Copy Markdown
Collaborator

涉及ui的pr,需要ui截图,可让 agent 对关键操作进行截图补充回复

@zszz3

zszz3 commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor Author

补充两个关键 UI 截图:

六个子智能体并行下发

六个子智能体并行下发

部分子智能体已停止、其余仍在运行

部分子智能体已停止、其余仍在运行

@Tioit-Wang

Copy link
Copy Markdown
Collaborator

ok, 检查完成后我会合并

@Tioit-Wang

Copy link
Copy Markdown
Collaborator

您好,关于界面优化,我想提出一个建议:能否在子代理侧边栏底部输入框的右下角,增设一枚与主代理暂停按钮样式相同的暂停按钮?并新增模型选择下拉框且置于不可选固定现在子代理的模型与强度,为将来实现侧边栏的附属对话功能预留发展空间。

@zszz3

zszz3 commented Oct 9, 2026

Copy link
Copy Markdown
Contributor Author

您好,关于界面优化,我想提出一个建议:能否在子代理侧边栏底部输入框的右下角,增设一枚与主代理暂停按钮样式相同的暂停按钮?并新增模型选择下拉框且置于不可选固定现在子代理的模型与强度,为将来实现侧边栏的附属对话功能预留发展空间。

我这边会实现一版本,在这个pr下面回复对应的截图

zszz3 added 3 commits October 9, 2026 16:47
Place the subagent detail stop action beside the read-only composer and show the effective model and thinking level as disabled controls. Keep the existing card actions unchanged while reserving the composer area for future sidebar interactions.
Reuse the main composer chip and circular stop control in the read-only subagent footer. Update the panel contract and Electron fixture flow to cover the new control location.
Show the detail panel with the composer-matched model chip and stop control for the pull request review.
@zszz3

zszz3 commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor Author

已按建议补充子代理侧边栏底部控件,并统一参考主会话输入区样式:

  • 只读输入框底部左侧显示当前子代理实际使用的模型与 thinking level,控件保持不可选。
  • 底部右侧使用与主会话一致的圆形停止按钮,停止当前子代理。
  • 主会话卡片上的停止按钮保持不变。

真实 Electron 回归已覆盖单个停止、停止全部、主代理隔离、部分输出保留、持久化和空选择校验。

子代理侧边栏底部控件

@Tioit-Wang

Copy link
Copy Markdown
Collaborator

已按建议补充子代理侧边栏底部控件,并统一参考主会话输入区样式:

  • 只读输入框底部左侧显示当前子代理实际使用的模型与 thinking level,控件保持不可选。
  • 底部右侧使用与主会话一致的圆形停止按钮,停止当前子代理。
  • 主会话卡片上的停止按钮保持不变。

真实 Electron 回归已覆盖单个停止、停止全部、主代理隔离、部分输出保留、持久化和空选择校验。

子代理侧边栏底部控件

image 404

@zszz3

zszz3 commented Oct 9, 2026

Copy link
Copy Markdown
Contributor Author

已按建议补充子代理侧边栏底部控件,并统一参考主会话输入区样式:

  • 只读输入框底部左侧显示当前子代理实际使用的模型与 thinking level,控件保持不可选。
  • 底部右侧使用与主会话一致的圆形停止按钮,停止当前子代理。
  • 主会话卡片上的停止按钮保持不变。

真实 Electron 回归已覆盖单个停止、停止全部、主代理隔离、部分输出保留、持久化和空选择校验。
子代理侧边栏底部控件

image 404

稍等,agent失控了,codex发癫了

zszz3 added 2 commits October 9, 2026 21:36
Keep the detail-panel stop control aligned with the read-only model chip and update the Electron E2E selectors for the compact tooltip button.
@zszz3

zszz3 commented Oct 9, 2026

Copy link
Copy Markdown
Contributor Author

已按建议补充子代理侧边栏底部控件,并统一参考主会话输入区样式:

  • 只读输入框底部左侧显示当前子代理实际使用的模型与 thinking level,控件保持不可选。
  • 底部右侧使用与主会话一致的圆形停止按钮,停止当前子代理。
  • 主会话卡片上的停止按钮保持不变。

真实 Electron 回归已覆盖单个停止、停止全部、主代理隔离、部分输出保留、持久化和空选择校验。
子代理侧边栏底部控件

image 404

已按建议补充子代理侧边栏底部控件,并统一参考主会话输入区样式:

  • 只读输入框底部左侧显示当前子代理实际使用的模型与 thinking level,控件保持不可选。
  • 底部右侧使用与主会话一致的圆形停止按钮,停止当前子代理。
  • 主会话卡片上的停止按钮保持不变。

真实 Electron 回归已覆盖单个停止、停止全部、主代理隔离、部分输出保留、持久化和空选择校验。
子代理侧边栏底部控件

image 404

大致效果如下图
image

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.

2 participants