@@ -293,15 +293,38 @@ async function compactEventForBuffer(
293293 return event
294294 }
295295
296- const compactedData = await compactExecutionPayload ( event . data , {
296+ const baseOptions = {
297297 ...context ,
298298 executionId : context . executionId ?? event . executionId ,
299299 requireDurable : context . requireDurablePayloads ,
300- preserveUserFileBase64 : context . preserveUserFileBase64 ,
301300 preserveRoot : true ,
301+ }
302+
303+ let compactedData = await compactExecutionPayload ( event . data , {
304+ ...baseOptions ,
305+ preserveUserFileBase64 : context . preserveUserFileBase64 ,
302306 } )
303- const eventData = trimFinalBlockLogsForEventData ( compactedData )
304- const eventDataSize = getJsonSize ( eventData )
307+ let eventData = trimFinalBlockLogsForEventData ( compactedData )
308+ let eventDataSize = getJsonSize ( eventData )
309+
310+ // SSE/replay events are size-bounded by LARGE_VALUE_THRESHOLD_BYTES. When a
311+ // payload that preserved UserFile base64 (e.g., for chat/streaming) exceeds
312+ // the cap, drop the inline base64 so consumers can lazily re-hydrate via
313+ // sim.files.readBase64. This preserves the file metadata and keeps the
314+ // event flowing instead of stalling the stream.
315+ if (
316+ context . preserveUserFileBase64 &&
317+ eventDataSize !== null &&
318+ eventDataSize > LARGE_VALUE_THRESHOLD_BYTES
319+ ) {
320+ compactedData = await compactExecutionPayload ( event . data , {
321+ ...baseOptions ,
322+ preserveUserFileBase64 : false ,
323+ } )
324+ eventData = trimFinalBlockLogsForEventData ( compactedData )
325+ eventDataSize = getJsonSize ( eventData )
326+ }
327+
305328 if ( eventDataSize !== null && eventDataSize > LARGE_VALUE_THRESHOLD_BYTES ) {
306329 throw new Error (
307330 `Execution event data remains too large after compaction (${ eventDataSize } bytes)`
0 commit comments