From 78d46aa2339a62b6a1aad39bcd2322eeb9530b46 Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Thu, 14 May 2026 17:44:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9B=BF=E6=8D=A2=20extractMemories=20?= =?UTF-8?q?=E7=9A=84=20require()=20=E4=B8=BA=E5=8A=A8=E6=80=81=20import()?= =?UTF-8?q?=20=E4=BF=AE=E5=A4=8D=20Vite=20=E6=9E=84=E5=BB=BA=E5=B4=A9?= =?UTF-8?q?=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vite/Rollup 构建时将 require() 通过 __toCommonJS() 包装 ESM 导出, 导致命名导出被包裹在 { default: namespace } 中,访问 extractMemoriesModule.initExtractMemories 为 undefined 触发 React error boundary 崩溃。改用标准 ESM 动态 import() 绕过 CJS interop。 Co-Authored-By: glm-5-turbo --- src/cli/print.ts | 12 ++++++++---- src/query/stopHooks.ts | 19 ++++++++++--------- src/utils/backgroundHousekeeping.ts | 11 +++++++---- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/cli/print.ts b/src/cli/print.ts index 7a9ca405c..9873c7a21 100644 --- a/src/cli/print.ts +++ b/src/cli/print.ts @@ -377,9 +377,6 @@ const cronJitterConfigModule = require('../utils/cronJitterConfig.js') as typeof import('../utils/cronJitterConfig.js') const cronGate = require('@claude-code-best/builtin-tools/tools/ScheduleCronTool/prompt.js') as typeof import('@claude-code-best/builtin-tools/tools/ScheduleCronTool/prompt.js') -const extractMemoriesModule = feature('EXTRACT_MEMORIES') - ? (require('../services/extractMemories/extractMemories.js') as typeof import('../services/extractMemories/extractMemories.js')) - : null /* eslint-enable @typescript-eslint/no-require-imports */ const SHUTDOWN_TEAM_PROMPT = ` @@ -985,7 +982,14 @@ export async function runHeadless( // the forked agent mid-flight. Gated by isExtractModeActive so the // tengu_slate_thimble flag controls non-interactive extraction end-to-end. if (feature('EXTRACT_MEMORIES') && isExtractModeActive()) { - await extractMemoriesModule!.drainPendingExtraction() + try { + const { drainPendingExtraction } = await import( + '../services/extractMemories/extractMemories.js' + ) + await drainPendingExtraction() + } catch { + // Module load failure — non-critical at shutdown + } } gracefulShutdownSync( diff --git a/src/query/stopHooks.ts b/src/query/stopHooks.ts index a3b354c9a..f63f1ee0d 100644 --- a/src/query/stopHooks.ts +++ b/src/query/stopHooks.ts @@ -39,9 +39,6 @@ import { getTaskListId, listTasks } from '../utils/tasks.js' import { getAgentName, getTeamName, isTeammate } from '../utils/teammate.js' /* eslint-disable @typescript-eslint/no-require-imports */ -const extractMemoriesModule = feature('EXTRACT_MEMORIES') - ? (require('../services/extractMemories/extractMemories.js') as typeof import('../services/extractMemories/extractMemories.js')) - : null const jobClassifierModule = feature('TEMPLATES') ? (require('../jobs/classifier.js') as typeof import('../jobs/classifier.js')) : null @@ -154,12 +151,16 @@ export async function* handleStopHooks( // Fire-and-forget in both interactive and non-interactive. For -p/SDK, // print.ts drains the in-flight promise after flushing the response // but before gracefulShutdownSync (see drainPendingExtraction). - void extractMemoriesModule!.executeExtractMemories( - stopHookContext, - toolUseContext.appendSystemMessage as - | ((msg: import('../types/message.js').SystemMessage) => void) - | undefined, - ) + void import('../services/extractMemories/extractMemories.js') + .then(({ executeExtractMemories }) => + executeExtractMemories( + stopHookContext, + toolUseContext.appendSystemMessage as + | ((msg: import('../types/message.js').SystemMessage) => void) + | undefined, + ), + ) + .catch(() => {}) } if (!toolUseContext.agentId && !poorMode) { void executeAutoDream(stopHookContext, toolUseContext.appendSystemMessage) diff --git a/src/utils/backgroundHousekeeping.ts b/src/utils/backgroundHousekeeping.ts index fa5672132..6312dd62b 100644 --- a/src/utils/backgroundHousekeeping.ts +++ b/src/utils/backgroundHousekeeping.ts @@ -4,9 +4,6 @@ import { initMagicDocs } from '../services/MagicDocs/magicDocs.js' import { initSkillImprovement } from './hooks/skillImprovement.js' /* eslint-disable @typescript-eslint/no-require-imports */ -const extractMemoriesModule = feature('EXTRACT_MEMORIES') - ? (require('../services/extractMemories/extractMemories.js') as typeof import('../services/extractMemories/extractMemories.js')) - : null const registerProtocolModule = feature('LODESTONE') ? (require('./deepLink/registerProtocol.js') as typeof import('./deepLink/registerProtocol.js')) : null @@ -32,7 +29,13 @@ export function startBackgroundHousekeeping(): void { void initMagicDocs() void initSkillImprovement() if (feature('EXTRACT_MEMORIES')) { - extractMemoriesModule!.initExtractMemories() + void import('../services/extractMemories/extractMemories.js') + .then(({ initExtractMemories }) => { + initExtractMemories() + }) + .catch(() => { + // Module load failure — non-critical, memory extraction just won't run + }) } initAutoDream() void autoUpdateMarketplacesAndPluginsInBackground()