refactor(tools): static import → require() 迁移 + 兜底修复

Codex 完成:
- tools.ts: 7 个 static import (指向空壳 stub) → require("@claude-code-best/builtin-tools/...")
  涉及: SleepTool, CronTools, RemoteTriggerTool, MonitorTool, SendUserFileTool,
  PushNotificationTool, TeamCreateTool, TeamDeleteTool, SendMessageTool, WorkflowTool
- PermissionRequest.tsx: MonitorTool require() 指向 builtin-tools
- TeamCreateTool/DeleteTool/SendMessageTool 用 lazy require() 打破循环依赖

兜底修复:
- defines.ts: 保持 MONITOR_TOOL + WORKFLOW_SCRIPTS 禁用
  原因: builtin-tools 里的真工具 import "src/..." 产生跨包循环引用
  在 splitting:true 下触发 chunk 间死锁,在 splitting:false 下触发 ESM 初始化死锁
  这是逆向工程的结构性限制,非简单修复能解决

验证: --version / -p / --print / 源码模式 全部通过
This commit is contained in:
James Feng 2026-06-02 13:41:47 +08:00
parent 0e9d6955f0
commit 98bb25636b
3 changed files with 38 additions and 27 deletions

View File

@ -59,10 +59,10 @@ export const DEFAULT_BUILD_FEATURES = [
'PROACTIVE', // 主动自主代理模式SleepTool 控制 tick 节奏,省 token
'DAEMON', // 守护进程模式,长驻 supervisor 管理后台 worker非 GB 级主因)
'ACP', // ACP 代理协议,支持外部 agent 接入
// 'WORKFLOW_SCRIPTS', // 已禁用stub 空壳,启用后 __esm() 循环初始化导致构建产物 hang
// 'WORKFLOW_SCRIPTS', // 已禁用stub 空壳 + builtin-tools 跨包 import 'src/...' → __esm() 循环初始化死锁
// 'HISTORY_SNIP', // 已禁用snip 功能暂时关闭
// 'CONTEXT_COLLAPSE', // 已禁用:实现是空壳 stub启用后会抑制 auto compact 导致上下文管理完全失效
// 'MONITOR_TOOL', // 已禁用stub 空壳,启用后 __esm() 循环初始化导致构建产物 hang
// 'MONITOR_TOOL', // 已禁用stub 空壳 + builtin-tools 跨包 import 'src/...' → __esm() 循环初始化死锁
// 'FORK_SUBAGENT', // 已禁用:通过 Agent tool 的特殊方式实现了等效功能,无需再开
'KAIROS', // Kairos 定时任务系统核心
'COORDINATOR_MODE', // 多 worker 编排模式AgentSummary 泄露已在 52b61c2c 修复)

View File

@ -58,7 +58,7 @@ const WorkflowPermissionRequest = feature('WORKFLOW_SCRIPTS')
const MonitorTool = feature('MONITOR_TOOL')
? (
require('../../tools/MonitorTool/MonitorTool.js') as typeof import('../../tools/MonitorTool/MonitorTool.js')
require('@claude-code-best/builtin-tools/tools/MonitorTool/MonitorTool.js') as typeof import('@claude-code-best/builtin-tools/tools/MonitorTool/MonitorTool.js')
).MonitorTool
: null

View File

@ -11,19 +11,6 @@ import { NotebookEditTool } from './tools/NotebookEditTool/NotebookEditTool.js'
import { WebFetchTool } from './tools/WebFetchTool/WebFetchTool.js'
import { TaskStopTool } from './tools/TaskStopTool/TaskStopTool.js'
import { BriefTool } from './tools/BriefTool/BriefTool.js'
import { SleepTool as SleepToolValue } from './tools/SleepTool/SleepTool.js'
import { CronCreateTool } from './tools/ScheduleCronTool/CronCreateTool.js'
import { CronDeleteTool } from './tools/ScheduleCronTool/CronDeleteTool.js'
import { CronListTool } from './tools/ScheduleCronTool/CronListTool.js'
import { RemoteTriggerTool as RemoteTriggerToolValue } from './tools/RemoteTriggerTool/RemoteTriggerTool.js'
import { MonitorTool as MonitorToolValue } from './tools/MonitorTool/MonitorTool.js'
import { SendUserFileTool as SendUserFileToolValue } from './tools/SendUserFileTool/SendUserFileTool.js'
import { PushNotificationTool as PushNotificationToolValue } from './tools/PushNotificationTool/PushNotificationTool.js'
import { TeamCreateTool as TeamCreateToolValue } from './tools/TeamCreateTool/TeamCreateTool.js'
import { TeamDeleteTool as TeamDeleteToolValue } from './tools/TeamDeleteTool/TeamDeleteTool.js'
import { SendMessageTool as SendMessageToolValue } from './tools/SendMessageTool/SendMessageTool.js'
import { initBundledWorkflows } from './tools/WorkflowTool/bundled/index.js'
import { WorkflowTool as WorkflowToolValue } from './tools/WorkflowTool/WorkflowTool.js'
import * as coordinatorModeModuleValue from './coordinator/coordinatorMode.js'
// Dead code elimination: conditional import for ant-only tools
/* eslint-disable custom-rules/no-process-env-top-level, @typescript-eslint/no-require-imports */
@ -37,20 +24,34 @@ const SuggestBackgroundPRTool =
.SuggestBackgroundPRTool
: null
const SleepTool =
feature('PROACTIVE') || feature('KAIROS') ? SleepToolValue : null
const cronTools = [CronCreateTool, CronDeleteTool, CronListTool]
feature('PROACTIVE') || feature('KAIROS')
? require('@claude-code-best/builtin-tools/tools/SleepTool/SleepTool.js')
.SleepTool
: null
const cronTools = [
require('@claude-code-best/builtin-tools/tools/ScheduleCronTool/CronCreateTool.js')
.CronCreateTool,
require('@claude-code-best/builtin-tools/tools/ScheduleCronTool/CronDeleteTool.js')
.CronDeleteTool,
require('@claude-code-best/builtin-tools/tools/ScheduleCronTool/CronListTool.js')
.CronListTool,
]
const RemoteTriggerTool = feature('AGENT_TRIGGERS_REMOTE')
? RemoteTriggerToolValue
? require('@claude-code-best/builtin-tools/tools/RemoteTriggerTool/RemoteTriggerTool.js')
.RemoteTriggerTool
: null
const MonitorTool = feature('MONITOR_TOOL')
? MonitorToolValue
? require('@claude-code-best/builtin-tools/tools/MonitorTool/MonitorTool.js')
.MonitorTool
: null
const SendUserFileTool = feature('KAIROS')
? SendUserFileToolValue
? require('@claude-code-best/builtin-tools/tools/SendUserFileTool/SendUserFileTool.js')
.SendUserFileTool
: null
const PushNotificationTool =
feature('KAIROS') || feature('KAIROS_PUSH_NOTIFICATION')
? PushNotificationToolValue
? require('@claude-code-best/builtin-tools/tools/PushNotificationTool/PushNotificationTool.js')
.PushNotificationTool
: null
const SubscribePRTool = feature('KAIROS_GITHUB_WEBHOOKS')
? require('./tools/SubscribePRTool/SubscribePRTool.js').SubscribePRTool
@ -63,9 +64,18 @@ import { ExitPlanModeV2Tool } from './tools/ExitPlanModeTool/ExitPlanModeV2Tool.
import { TestingPermissionTool } from './tools/testing/TestingPermissionTool.js'
import { GrepTool } from './tools/GrepTool/GrepTool.js'
import { TungstenTool } from './tools/TungstenTool/TungstenTool.js'
const getTeamCreateTool = () => TeamCreateToolValue
const getTeamDeleteTool = () => TeamDeleteToolValue
const getSendMessageTool = () => SendMessageToolValue
// Lazy require to break circular dependency: tools.ts -> TeamCreateTool/TeamDeleteTool -> ... -> tools.ts
/* eslint-disable @typescript-eslint/no-require-imports */
const getTeamCreateTool = () =>
require('@claude-code-best/builtin-tools/tools/TeamCreateTool/TeamCreateTool.js')
.TeamCreateTool as typeof import('@claude-code-best/builtin-tools/tools/TeamCreateTool/TeamCreateTool.js').TeamCreateTool
const getTeamDeleteTool = () =>
require('@claude-code-best/builtin-tools/tools/TeamDeleteTool/TeamDeleteTool.js')
.TeamDeleteTool as typeof import('@claude-code-best/builtin-tools/tools/TeamDeleteTool/TeamDeleteTool.js').TeamDeleteTool
const getSendMessageTool = () =>
require('@claude-code-best/builtin-tools/tools/SendMessageTool/SendMessageTool.js')
.SendMessageTool as typeof import('@claude-code-best/builtin-tools/tools/SendMessageTool/SendMessageTool.js').SendMessageTool
/* eslint-enable @typescript-eslint/no-require-imports */
import { AskUserQuestionTool } from './tools/AskUserQuestionTool/AskUserQuestionTool.js'
import { LSPTool } from './tools/LSPTool/LSPTool.js'
import { ListMcpResourcesTool } from './tools/ListMcpResourcesTool/ListMcpResourcesTool.js'
@ -124,8 +134,9 @@ const ListPeersTool = feature('UDS_INBOX')
: null
const WorkflowTool = feature('WORKFLOW_SCRIPTS')
? (() => {
initBundledWorkflows()
return WorkflowToolValue
require('@claude-code-best/builtin-tools/tools/WorkflowTool/bundled/index.js').initBundledWorkflows()
return 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 */