diff --git a/src/QueryEngine.ts b/src/QueryEngine.ts index 808a7e6a9..62acfbc79 100644 --- a/src/QueryEngine.ts +++ b/src/QueryEngine.ts @@ -86,9 +86,13 @@ import { // Lazy: MessageSelector.tsx pulls React/ink; only needed for message filtering at query time /* eslint-disable @typescript-eslint/no-require-imports */ -const messageSelector = - (): typeof import('src/components/MessageSelector.js') => - require('src/components/MessageSelector.js') +const messageSelector = (): typeof import('src/components/MessageSelector.js') | null => { + try { + return require('src/components/MessageSelector.js') + } catch { + return null + } +} import { localCommandOutputToSDKAssistantMessage, @@ -467,12 +471,13 @@ export class QueryEngine { } // Filter messages that should be acknowledged after transcript + const _selector = messageSelector() const replayableMessages = messagesFromUserInput.filter( msg => (msg.type === 'user' && !msg.isMeta && // Skip synthetic caveat messages !msg.toolUseResult && // Skip tool results (they'll be acked from query) - messageSelector().selectableUserMessagesFilter(msg)) || // Skip non-user-authored messages (task notifications, etc.) + (_selector?.selectableUserMessagesFilter(msg) ?? true)) || // Skip non-user-authored messages (task notifications, etc.) (msg.type === 'system' && msg.subtype === 'compact_boundary'), // Always ack compact boundaries ) const messagesToAck = replayUserMessages ? replayableMessages : [] @@ -644,8 +649,10 @@ export class QueryEngine { } if (fileHistoryEnabled() && persistSession) { + const _sel = messageSelector() + const _filter = _sel?.selectableUserMessagesFilter ?? ((_msg: unknown) => true) messagesFromUserInput - .filter(messageSelector().selectableUserMessagesFilter) + .filter(_filter) .forEach(message => { void fileHistoryMakeSnapshot( (updater: (prev: FileHistoryState) => FileHistoryState) => {