From d6374f02d6fe189801b1273b78cb08e70c63efe6 Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Fri, 24 Apr 2026 09:59:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20ACP=20=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8B=20messageSelector=20require=20=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E5=AF=BC=E8=87=B4=20submitMessage=20=E5=B4=A9?= =?UTF-8?q?=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ACP 模式不加载完整的 React/Ink UI 组件,导致 require('src/components/MessageSelector.js') 返回 undefined。添加 try-catch 和 optional chaining fallback。 Co-Authored-By: Claude Opus 4.7 --- src/QueryEngine.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/QueryEngine.ts b/src/QueryEngine.ts index feeb37272..db5732489 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, @@ -466,12 +470,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 : [] @@ -643,8 +648,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) => {