@@ -809,6 +809,8 @@ export class EventRepository {
809809 }
810810 }
811811
812+ logger . debug ( "[getTraceDetailedSummary] preparedEvents before merge" , { preparedEvents } ) ;
813+
812814 for ( const event of preparedEvents ) {
813815 const existingEvent = eventsBySpanId . get ( event . spanId ) ;
814816
@@ -817,13 +819,36 @@ export class EventRepository {
817819 continue ;
818820 }
819821
822+ // This is an invisible event, and we just want to keep the original event but concat together
823+ // the event.events with the existingEvent.events
824+ if ( event . kind === "UNSPECIFIED" ) {
825+ eventsBySpanId . set ( event . spanId , {
826+ ...existingEvent ,
827+ events : [ ...( existingEvent . events ?? [ ] ) , ...( event . events ?? [ ] ) ] ,
828+ } ) ;
829+ continue ;
830+ }
831+
820832 if ( event . isCancelled || ! event . isPartial ) {
821- eventsBySpanId . set ( event . spanId , event ) ;
833+ // If we have a cancelled event and an existing partial event,
834+ // merge them: use cancelled event data but preserve style from the partial event
835+ if ( event . isCancelled && existingEvent . isPartial && ! existingEvent . isCancelled ) {
836+ const mergedEvent : PreparedDetailedEvent = {
837+ ...event , // Use cancelled event as base (has correct timing, status, events)
838+ // Preserve style from the original partial event
839+ style : existingEvent . style ,
840+ events : [ ...( existingEvent . events ?? [ ] ) , ...( event . events ?? [ ] ) ] ,
841+ } ;
842+ eventsBySpanId . set ( event . spanId , mergedEvent ) ;
843+ continue ;
844+ }
822845 }
823846 }
824847
825848 preparedEvents = Array . from ( eventsBySpanId . values ( ) ) ;
826849
850+ logger . debug ( "[getTraceDetailedSummary] preparedEvents after merge" , { preparedEvents } ) ;
851+
827852 if ( ! rootSpanId ) {
828853 return ;
829854 }
@@ -833,12 +858,27 @@ export class EventRepository {
833858
834859 // First pass: create all span detailed summaries
835860 for ( const event of preparedEvents ) {
836- const ancestorCancelled = isAncestorCancelled ( eventsBySpanId , event . spanId ) ;
837- const duration = calculateDurationIfAncestorIsCancelled (
838- eventsBySpanId ,
839- event . spanId ,
840- event . duration
841- ) ;
861+ const overrides = getAncestorOverrides ( {
862+ spansById : eventsBySpanId ,
863+ span : event ,
864+ } ) ;
865+
866+ if ( overrides ) {
867+ logger . debug ( "[getTraceDetailedSummary] overrides" , { overrides, event } ) ;
868+ }
869+
870+ const ancestorCancelled = overrides ?. isCancelled ?? false ;
871+ const ancestorIsError = overrides ?. isError ?? false ;
872+ const duration = overrides ?. duration ?? event . duration ;
873+ const events = [ ...( overrides ?. events ?? [ ] ) , ...( event . events ?? [ ] ) ] ;
874+ const isPartial = ancestorCancelled || ancestorIsError ? false : event . isPartial ;
875+ const isCancelled =
876+ event . isCancelled === true ? true : event . isPartial && ancestorCancelled ;
877+ const isError = isCancelled
878+ ? false
879+ : typeof overrides ?. isError === "boolean"
880+ ? overrides . isError
881+ : event . isError ;
842882
843883 const output = event . output ? ( event . output as Attributes ) : undefined ;
844884 const properties = event . properties
@@ -853,12 +893,12 @@ export class EventRepository {
853893 runId : event . runId ,
854894 taskSlug : event . taskSlug ?? undefined ,
855895 taskPath : event . taskPath ?? undefined ,
856- events : event . events ?. filter ( ( e ) => ! e . name . startsWith ( "trigger.dev" ) ) ,
896+ events : events ?. filter ( ( e ) => ! e . name . startsWith ( "trigger.dev" ) ) ,
857897 startTime : getDateFromNanoseconds ( event . startTime ) ,
858898 duration : nanosecondsToMilliseconds ( duration ) ,
859- isError : event . isError ,
860- isPartial : ancestorCancelled ? false : event . isPartial ,
861- isCancelled : event . isCancelled === true ? true : event . isPartial && ancestorCancelled ,
899+ isError,
900+ isPartial,
901+ isCancelled,
862902 level : event . level ,
863903 environmentType : event . environmentType ,
864904 workerVersion : event . workerVersion ?? undefined ,
@@ -889,6 +929,8 @@ export class EventRepository {
889929 return ;
890930 }
891931
932+ logger . debug ( "[getTraceDetailedSummary] result" , { traceId, rootSpan } ) ;
933+
892934 return {
893935 traceId,
894936 rootSpan,
0 commit comments