diff --git a/src/utils/queryHelpers.ts b/src/utils/queryHelpers.ts index 94dbb7404..ae5f2fabf 100644 --- a/src/utils/queryHelpers.ts +++ b/src/utils/queryHelpers.ts @@ -26,7 +26,7 @@ import { createFileStateCacheWithSizeLimit, type FileStateCache, } from './fileStateCache.js' -import { isNotEmptyMessage, normalizeMessages } from './messages.js' +import { isNotEmptyMessage, isThinkingMessage, normalizeMessages } from './messages.js' import { expandPath } from './path.js' import type { inputSchema as permissionToolInputSchema, @@ -117,6 +117,13 @@ export function* normalizeMessage(message: Message): Generator { if (!isNotEmptyMessage(_)) { continue } + // Skip thinking-only messages: normalizeMessages splits a multi-block + // AssistantMessage (e.g. [thinking, text]) into one message per block. + // Emitting the thinking-only fragment causes serve mode to send a second + // session.message event, which cs-cloud renders as a duplicate response. + if (isThinkingMessage(_)) { + continue + } yield { type: 'assistant', message: _.message,