@@ -179,6 +179,55 @@ describe('devframeTerminalHost stream lifecycle', () => {
179179 expect ( session . buffer ! . includes ( 'line-0' ) ) . toBe ( false )
180180 } )
181181
182+ it ( 'evicts one scrollback chunk without producing discarded splice results' , async ( ) => {
183+ const { host, sinks } = createTerminalHost ( )
184+ const buffer : string [ ] = [ ]
185+ const splice = vi . spyOn ( buffer , 'splice' )
186+ const chunks = Array . from ( { length : 1200 } , ( _ , i ) => `line-${ i } ` )
187+ const stream = new ReadableStream < string > ( {
188+ start ( controller ) {
189+ for ( const chunk of chunks )
190+ controller . enqueue ( chunk )
191+ controller . close ( )
192+ } ,
193+ } )
194+ const session : DevframeTerminalSession = { id : 't' , title : 'T' , status : 'running' , stream, buffer }
195+ host . register ( session )
196+ try {
197+ await waitUntil ( ( ) => expect ( sinks . get ( 't' ) ?. closed ) . toBe ( true ) )
198+ expect ( session . buffer ) . toBe ( buffer )
199+ expect ( [ ...buffer ] ) . toEqual ( chunks . slice ( - 1000 ) )
200+ expect ( sinks . get ( 't' ) ?. write . mock . calls ) . toEqual ( chunks . map ( chunk => [ chunk ] ) )
201+ expect ( splice ) . not . toHaveBeenCalled ( )
202+ }
203+ finally {
204+ splice . mockRestore ( )
205+ host . remove ( session )
206+ }
207+ } )
208+
209+ it ( 'trims an oversized supplied scrollback buffer on the next chunk' , async ( ) => {
210+ const { host, sinks } = createTerminalHost ( )
211+ const buffer = Array . from ( { length : 1500 } , ( _ , i ) => `line-${ i } ` )
212+ const expected = [ ...buffer , 'latest' ] . slice ( - 1000 )
213+ const stream = new ReadableStream < string > ( {
214+ start ( controller ) {
215+ controller . enqueue ( 'latest' )
216+ controller . close ( )
217+ } ,
218+ } )
219+ const session : DevframeTerminalSession = { id : 't' , title : 'T' , status : 'running' , stream, buffer }
220+ host . register ( session )
221+ try {
222+ await waitUntil ( ( ) => expect ( sinks . get ( 't' ) ?. closed ) . toBe ( true ) )
223+ expect ( session . buffer ) . toBe ( buffer )
224+ expect ( buffer ) . toEqual ( expected )
225+ }
226+ finally {
227+ host . remove ( session )
228+ }
229+ } )
230+
182231 it ( 'rejects restarting a terminated child-process session' , async ( ) => {
183232 const { host, sinks } = createTerminalHost ( )
184233 const session = await host . startChildProcess (
0 commit comments