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()