From a1ad254a2edf308ee6984b10dbef43dd6c47530b Mon Sep 17 00:00:00 2001 From: lishuceo Date: Mon, 8 Jun 2026 17:15:49 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E6=94=B6=E5=88=B0=20result=20?= =?UTF-8?q?=E5=90=8E=E7=AB=8B=E5=8D=B3=E8=B7=B3=E5=87=BA=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=EF=BC=8C=E9=81=BF=E5=85=8D=20idle=20timeout?= =?UTF-8?q?=20=E8=AF=AF=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:SDK 返回 result 消息后,如果有 background task 仍在运行, for-await 循环不会结束,导致 idle timer 继续倒计时最终触发超时。 实际查询已经成功完成,不应该报超时。 修复:用 labeled break 在收到 result 后立即跳出循环, 并调用 q.close() 确保子进程不泄漏。 Co-Authored-By: Claude Opus 4.6 (1M context) --- src/claude/executor.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/claude/executor.ts b/src/claude/executor.ts index b544fcf..29e8e80 100644 --- a/src/claude/executor.ts +++ b/src/claude/executor.ts @@ -973,7 +973,8 @@ export class ClaudeExecutor { try { // 遍历 SDK 流式消息 - for await (const message of q) { + // label 用于在收到 result 后跳出循环(result 是 SDK 协议的终止消息) + messageLoop: for await (const message of q) { // 每收到消息重置 idle 计时器 resetIdleTimer(`msg:${message.type}${'subtype' in message ? ':' + (message as Record).subtype : ''}`); @@ -1112,7 +1113,7 @@ export class ClaudeExecutor { case 'result': resultMessage = message; - break; + break messageLoop; default: // tool_progress, stream_event 等其他消息类型 — 记录以便诊断 idle timeout 间隙 @@ -1121,6 +1122,10 @@ export class ClaudeExecutor { break; } } + + // 提前 break(收到 result)时子进程可能仍在运行(如有 background task), + // 主动 close 确保不泄漏;正常迭代结束时 close 是幂等的 no-op + q.close(); } catch (err) { clearTimeout(idleTimer); if (hardTimer) clearTimeout(hardTimer); From a4ca23cbd012128b8950260f16479dd30617f21a Mon Sep 17 00:00:00 2001 From: lishuceo Date: Mon, 8 Jun 2026 17:17:41 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20settingSources=20=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=20'local'=20=E4=BB=A5=E5=8A=A0=E8=BD=BD=20settings.local.json?= =?UTF-8?q?=20=E6=9D=83=E9=99=90=E7=99=BD=E5=90=8D=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:urhox-bench 的 .claude/settings.local.json 包含完整的 bash 命令 白名单(git/npm/npx/gh 等),但 SDK 只传了 ['user', 'project'], 'local' 未包含,导致这些权限不生效。SDK 弹窗请求授权时飞书 bot 无法交互,报 "Stream closed"。 修复:settingSources 加入 'local',优先级:user < project < local。 Co-Authored-By: Claude Opus 4.6 (1M context) --- src/claude/executor.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/claude/executor.ts b/src/claude/executor.ts index 9162d49..33dcd8a 100644 --- a/src/claude/executor.ts +++ b/src/claude/executor.ts @@ -946,7 +946,8 @@ export class ClaudeExecutor { : { type: 'preset', preset: 'claude_code', append: promptAppend }, // 加载项目设置 (CLAUDE.md 等);路由 agent 传 [] 避免加载 - settingSources: settingSourcesOverride ?? ['user', 'project'], + // 'local' 加载 .claude/settings.local.json(优先级最高,覆盖 project) + settingSources: settingSourcesOverride ?? ['user', 'project', 'local'], // MCP 服务器:工作区管理工具 + 飞书工具 (空对象等同于无 MCP 服务器) mcpServers: Object.keys(mcpServers).length > 0 ? mcpServers : undefined,