缺陷 / 高 / IPC 通信
electron/harness/hooks/confirmation-hook.ts
waitForConfirmation 使用 Promise + setTimeout 实现超时控制。 当超时与用户确认同时发生时(race condition):
project_memory.md 要求:
Tool confirmation timeout is configurable via agent.confirmationTimeoutMs (30s~600s, default 120s)
agent.confirmationTimeoutMs
async waitForConfirmation(requestId: string): Promise<boolean> { // 使用 AbortController 统一清理 const controller = new AbortController(); const timer = setTimeout(() => { controller.abort(); }, this.timeoutMs); try { const result = await new Promise<boolean>((resolve, reject) => { const onConfirm = (id: string, approved: boolean) => { if (id === requestId) { this.off('confirmation', onConfirm); resolve(approved); } }; this.on('confirmation', onConfirm); controller.signal.addEventListener('abort', () => { this.off('confirmation', onConfirm); resolve(false); // 超时视为拒绝 }); }); return result; } finally { clearTimeout(timer); } }
确保监听器与定时器都被清理。
文件: electron/harness/hooks/confirmation-hook.ts
修复: 采用 settled 标志 + safeResolve 包装:超时分支与确认分支互斥,先到者赢,另一分支直接 return。解决超时回调已入队时 clearTimeout 无法取消导致的竞态条件。
settled
safeResolve
clearTimeout
验证: tsc --noEmit 类型检查通过。
tsc --noEmit
No dependencies set.
The note is not visible to the blocked user.
问题类型
缺陷 / 高 / IPC 通信
文件位置
electron/harness/hooks/confirmation-hook.ts问题描述
waitForConfirmation 使用 Promise + setTimeout 实现超时控制。
当超时与用户确认同时发生时(race condition):
project_memory.md 要求:
影响
建议修复
确保监听器与定时器都被清理。
修复说明
文件:
electron/harness/hooks/confirmation-hook.ts修复: 采用
settled标志 +safeResolve包装:超时分支与确认分支互斥,先到者赢,另一分支直接 return。解决超时回调已入队时clearTimeout无法取消导致的竞态条件。验证:
tsc --noEmit类型检查通过。