Skip to content

Commit a1ad254

Browse files
lishuceoclaude
andcommitted
fix: 收到 result 后立即跳出消息循环,避免 idle timeout 误报
问题:SDK 返回 result 消息后,如果有 background task 仍在运行, for-await 循环不会结束,导致 idle timer 继续倒计时最终触发超时。 实际查询已经成功完成,不应该报超时。 修复:用 labeled break 在收到 result 后立即跳出循环, 并调用 q.close() 确保子进程不泄漏。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent ff2b6e3 commit a1ad254

1 file changed

Lines changed: 7 additions & 2 deletions

File tree

src/claude/executor.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -973,7 +973,8 @@ export class ClaudeExecutor {
973973

974974
try {
975975
// 遍历 SDK 流式消息
976-
for await (const message of q) {
976+
// label 用于在收到 result 后跳出循环(result 是 SDK 协议的终止消息)
977+
messageLoop: for await (const message of q) {
977978
// 每收到消息重置 idle 计时器
978979
resetIdleTimer(`msg:${message.type}${'subtype' in message ? ':' + (message as Record<string, unknown>).subtype : ''}`);
979980

@@ -1112,7 +1113,7 @@ export class ClaudeExecutor {
11121113

11131114
case 'result':
11141115
resultMessage = message;
1115-
break;
1116+
break messageLoop;
11161117

11171118
default:
11181119
// tool_progress, stream_event 等其他消息类型 — 记录以便诊断 idle timeout 间隙
@@ -1121,6 +1122,10 @@ export class ClaudeExecutor {
11211122
break;
11221123
}
11231124
}
1125+
1126+
// 提前 break(收到 result)时子进程可能仍在运行(如有 background task),
1127+
// 主动 close 确保不泄漏;正常迭代结束时 close 是幂等的 no-op
1128+
q.close();
11241129
} catch (err) {
11251130
clearTimeout(idleTimer);
11261131
if (hardTimer) clearTimeout(hardTimer);

0 commit comments

Comments
 (0)