fix: prevent null reference reading 'error' in MessagesBoundary

normalizeMessages and toSDKMessages access message.error in flatMap
callbacks executed during React render (via useMemo). When a null
element is present in the messages array at runtime (e.g., from
corrupted JSONL deserialization or streaming race conditions),
null.error throws "Cannot read properties of null (reading 'error')".

Add null guards to flatMap/forEach callbacks and optional chaining
on message.error access points in normalizeMessages and
toSDKMessages.

Fixes: React Rendering Error in MessagesBoundary

Co-Authored-By: deepseek-v4-pro[1m] <deepseek-ai@claude-code-best.win>
This commit is contained in:
wsolarq11
2026-06-24 13:06:40 +08:00
parent d3121f0dfb
commit 2c801502dc
2 changed files with 6 additions and 2 deletions

View File

@@ -753,6 +753,7 @@ export function normalizeMessages(messages: Message[]): NormalizedMessage[] {
// and remains true for all subsequent messages in the normalization process.
let isNewChain = false
return messages.flatMap(message => {
if (!message) return [];
switch (message.type) {
case 'assistant': {
const aMsg = message as AssistantMessage
@@ -776,7 +777,7 @@ export function normalizeMessages(messages: Message[]): NormalizedMessage[] {
isVirtual: message.isVirtual,
requestId: message.requestId,
uuid,
error: message.error,
error: message?.error,
isApiErrorMessage: message.isApiErrorMessage,
advisorModel: message.advisorModel,
} as NormalizedAssistantMessage
@@ -2376,6 +2377,7 @@ export function normalizeMessagesForAPI(
},
)
.forEach(message => {
if (!message) return [];
switch (message.type) {
case 'system': {
// local_command system messages need to be included as user messages

View File

@@ -29,6 +29,7 @@ export function toInternalMessages(
messages: readonly DeepImmutable<SDKMessage>[],
): Message[] {
return messages.flatMap(message => {
if (!message) return [];
switch (message.type) {
case 'assistant':
return [
@@ -127,6 +128,7 @@ export function fromSDKCompactMetadata(
export function toSDKMessages(messages: Message[]): SDKMessage[] {
return messages.flatMap((message): SDKMessage[] => {
if (!message) return [];
switch (message.type) {
case 'assistant':
return [
@@ -138,7 +140,7 @@ export function toSDKMessages(messages: Message[]): SDKMessage[] {
session_id: getSessionId(),
parent_tool_use_id: null,
uuid: message.uuid,
error: message.error,
error: message?.error,
},
]
case 'user':