缺陷 / 严重 / Agent 引擎
electron/harness/orchestration/orchestrator.ts
TaskOrchestrator 委派子任务时,SubEngine 通过 mainEngine.getAdapter() 复用主 Engine 的 adapter 实例。 但 adapter 内部维护 currentAbortSignal,SubEngine 与主 Engine 都会调用 adapter.setAbortSignal():
mainEngine.getAdapter()
currentAbortSignal
adapter.setAbortSignal()
两种方案:
方案 A(推荐):为 SubEngine 创建独立的 adapter 实例(深拷贝配置)
const subAdapter = cloneAdapter(mainEngine.getAdapter()); const subEngine = new AgentLoopEngine(config, subAdapter, ...);
方案 B:adapter 改为 signal map(按 runId 索引),允许多个 signal 共存
方案 A 更简单且符合 isolation 原则。
文件: electron/harness/agent-loop/engine.ts + electron/harness/orchestration/orchestrator.ts
electron/harness/agent-loop/engine.ts
问题: SubEngine 通过 mainEngine.getAdapter() 共享主 Engine 的 adapter 实例,SubEngine 调用 setAbortSignal() 会覆盖主 Engine 的 signal,SubEngine 完成后清除 signal,导致主 Engine 后续 fetch 无法被用户中断。
setAbortSignal()
修复方案(选择风险最低的方案,而非 clone adapter):
restoreAbortSignal()
abortController.signal
delegate()
finally
mainEngine.restoreAbortSignal()
设计决策: 相比工单建议的"为 SubEngine 创建独立 adapter 实例"(需要给所有 adapter 实现 clone,改动大且风险高),此方案改动最小,且由于 SubEngine 是 await 的(主 Engine 不会同时发 fetch),恢复 signal 即可解决问题。
验证: tsc --noEmit 类型检查通过。
tsc --noEmit
No dependencies set.
The note is not visible to the blocked user.
问题类型
缺陷 / 严重 / Agent 引擎
文件位置
electron/harness/orchestration/orchestrator.ts问题描述
TaskOrchestrator 委派子任务时,SubEngine 通过
mainEngine.getAdapter()复用主 Engine 的 adapter 实例。但 adapter 内部维护
currentAbortSignal,SubEngine 与主 Engine 都会调用adapter.setAbortSignal():影响
建议修复
两种方案:
方案 A(推荐):为 SubEngine 创建独立的 adapter 实例(深拷贝配置)
方案 B:adapter 改为 signal map(按 runId 索引),允许多个 signal 共存
方案 A 更简单且符合 isolation 原则。
修复说明
文件:
electron/harness/agent-loop/engine.ts+electron/harness/orchestration/orchestrator.ts问题: SubEngine 通过
mainEngine.getAdapter()共享主 Engine 的 adapter 实例,SubEngine 调用setAbortSignal()会覆盖主 Engine 的 signal,SubEngine 完成后清除 signal,导致主 Engine 后续 fetch 无法被用户中断。修复方案(选择风险最低的方案,而非 clone adapter):
restoreAbortSignal()方法:将当前abortController.signal重新设置给 adapterdelegate()方法在finally块中调用mainEngine.restoreAbortSignal(),确保 SubEngine 完成后(无论正常/异常/abort)恢复主 Engine 的 abort signal设计决策: 相比工单建议的"为 SubEngine 创建独立 adapter 实例"(需要给所有 adapter 实现 clone,改动大且风险高),此方案改动最小,且由于 SubEngine 是 await 的(主 Engine 不会同时发 fetch),恢复 signal 即可解决问题。
验证:
tsc --noEmit类型检查通过。