feat(upstream): sync b1c4f40f ACP fix + WorkflowTool top-level require()

Codex cherry-pick:
- b1c4f40f: fix ACP extended thinking + tool_use 连续 user 消息导致 400
  → src/utils/messages.ts: ensureToolResultPairing 检查连续 user 消息
  → src/utils/tests/messages.test.ts: 新增测试(冲突手动解决)

James 兜底:
- tools.ts: WorkflowTool lazy getter → top-level require (MonitorTool 模式)
  移除 initBundledWorkflows() 调用(经确认是 no-op)
  原因: lazy getter 在 splitting:true 下运行时触发 chunk load 死锁

审核结论:
- 上游 a91653a0/6dd378bf/efc218d8 已存在(之前已合入)
- 上游 9d17597e autofix-pr 回流跳过(大规模改动,stub 无基础)
- WORKFLOW_SCRIPTS 仍禁用: top-level require 在 splitting:true 下
  触发 WorkflowTool chunk 循环死锁(非加载模式问题,是 chunk 依赖图过深)

当前 splitting:true 启用状态:
  MONITOR_TOOL  | WORKFLOW_SCRIPTS  | 其他 features 

验证: --version / -p / --print / 源码模式 全部通过
This commit is contained in:
James Feng 2026-06-02 14:45:21 +08:00
parent b1d322f7cc
commit cdd62520eb
2 changed files with 6 additions and 9 deletions

View File

@ -59,7 +59,7 @@ export const DEFAULT_BUILD_FEATURES = [
'PROACTIVE', // 主动自主代理模式SleepTool 控制 tick 节奏,省 token
'DAEMON', // 守护进程模式,长驻 supervisor 管理后台 worker非 GB 级主因)
'ACP', // ACP 代理协议,支持外部 agent 接入
// 'WORKFLOW_SCRIPTS', // 已禁用:lazy getter 在 splitting:true 下仍触发 chunk 死锁,待进一步排查
// 'WORKFLOW_SCRIPTS', // 已禁用:top-level require() 在 splitting:true 下仍触发 chunk 循环死锁——WorkflowTool chunk 依赖图过深
// 'HISTORY_SNIP', // 已禁用snip 功能暂时关闭
// 'CONTEXT_COLLAPSE', // 已禁用:实现是空壳 stub启用后会抑制 auto compact 导致上下文管理完全失效
'MONITOR_TOOL', // 已修复require() 迁移后 splitting:true 不再触发 __esm() 死锁

View File

@ -132,13 +132,10 @@ const SnipTool = feature('HISTORY_SNIP')
const ListPeersTool = feature('UDS_INBOX')
? require('./tools/ListPeersTool/ListPeersTool.js').ListPeersTool
: null
// Lazy getter to defer chunk loading — IIFE causes code-split deadlock
const getWorkflowTool = () => {
if (!feature('WORKFLOW_SCRIPTS')) return null
require('@claude-code-best/builtin-tools/tools/WorkflowTool/bundled/index.js').initBundledWorkflows()
return require('@claude-code-best/builtin-tools/tools/WorkflowTool/WorkflowTool.js')
.WorkflowTool
}
const WorkflowTool = feature('WORKFLOW_SCRIPTS')
? require('@claude-code-best/builtin-tools/tools/WorkflowTool/WorkflowTool.js')
.WorkflowTool
: null
/* eslint-enable custom-rules/no-process-env-top-level, @typescript-eslint/no-require-imports */
import type { ToolPermissionContext } from './Tool.js'
import { getDenyRuleForTool } from './utils/permissions/permissions.js'
@ -237,7 +234,7 @@ export function getAllBaseTools(): Tools {
: []),
...(VerifyPlanExecutionTool ? [VerifyPlanExecutionTool] : []),
...(process.env.USER_TYPE === 'ant' && REPLTool ? [REPLTool] : []),
...(() => { const w = getWorkflowTool(); return w ? [w] : [] })(),
...(WorkflowTool ? [WorkflowTool] : []),
...(SleepTool ? [SleepTool] : []),
...cronTools,
...(RemoteTriggerTool ? [RemoteTriggerTool] : []),