@@ -103,6 +103,7 @@ const TRUNCATED_REPLAY_BYTES = 128 * 1024
103103
104104type StartupProbeReplayDiscardState = {
105105 remainder : string | null
106+ buffered : string
106107}
107108
108109function resolveMinimumContrastRatio ( theme ?: { isDark ?: boolean } | null ) : number {
@@ -111,25 +112,36 @@ function resolveMinimumContrastRatio(theme?: { isDark?: boolean } | null): numbe
111112
112113function consumeStartupProbeReplayDiscard ( raw : string , state : StartupProbeReplayDiscardState ) : string {
113114 const remainder = state . remainder
114- state . remainder = null
115115 if ( ! remainder ) {
116+ state . buffered = ''
116117 return raw
117118 }
118119
119- let matched = 0
120+ let matched = state . buffered
121+ let index = 0
120122 while (
121- matched < raw . length
122- && matched < remainder . length
123- && raw [ matched ] === remainder [ matched ]
123+ index < raw . length
124+ && matched . length < remainder . length
125+ && raw [ index ] === remainder [ matched . length ]
124126 ) {
125- matched += 1
127+ matched += raw [ index ]
128+ index += 1
126129 }
127130
128- if ( matched === remainder . length ) {
129- return raw . slice ( matched )
131+ if ( matched . length === remainder . length ) {
132+ state . remainder = null
133+ state . buffered = ''
134+ return raw . slice ( index )
130135 }
131136
132- if ( matched === raw . length ) {
137+ if ( index < raw . length ) {
138+ state . remainder = null
139+ state . buffered = ''
140+ return `${ matched } ${ raw . slice ( index ) } `
141+ }
142+
143+ if ( index === raw . length ) {
144+ state . buffered = matched
133145 return ''
134146 }
135147
@@ -318,6 +330,7 @@ export default function TerminalView({ tabId, paneId, paneContent, hidden }: Ter
318330 const startupProbeStateRef = useRef ( createTerminalStartupProbeState ( ) )
319331 const startupProbeReplayDiscardStateRef = useRef < StartupProbeReplayDiscardState > ( {
320332 remainder : null ,
333+ buffered : '' ,
321334 } )
322335 const osc52ParserRef = useRef ( createOsc52ParserState ( ) )
323336 const resolvedThemeRef = useRef ( getTerminalTheme ( settings . terminal . theme , settings . theme ) )
@@ -905,9 +918,10 @@ export default function TerminalView({ tabId, paneId, paneContent, hidden }: Ter
905918 const remainder = getStartupProbeReplayRemainder ( pendingProbe )
906919 startupProbeReplayDiscardStateRef . current = {
907920 remainder,
921+ buffered : '' ,
908922 }
909923 } else {
910- startupProbeReplayDiscardStateRef . current = { remainder : null }
924+ startupProbeReplayDiscardStateRef . current = { remainder : null , buffered : '' }
911925 }
912926 startupProbeStateRef . current = createTerminalStartupProbeState ( )
913927 } , [ ] )
@@ -1855,7 +1869,11 @@ export default function TerminalView({ tabId, paneId, paneContent, hidden }: Ter
18551869 )
18561870 const enteringFreshLiveOutput = ! frameOverlapsReplay
18571871 && ( Boolean ( previousSeqState . pendingReplay ) || previousSeqState . awaitingFreshSequence )
1858- if ( enteringFreshLiveOutput ) {
1872+ if (
1873+ enteringFreshLiveOutput
1874+ && ! startupProbeReplayDiscardStateRef . current . remainder
1875+ && ! startupProbeReplayDiscardStateRef . current . buffered
1876+ ) {
18591877 resetStartupProbeParser ( { discardReplayRemainder : Boolean ( previousSeqState . pendingReplay ) } )
18601878 }
18611879 raw = consumeStartupProbeReplayDiscard ( raw , startupProbeReplayDiscardStateRef . current )
0 commit comments