@@ -448,9 +448,7 @@ describe('App', () => {
448448 await vi . advanceTimersByTimeAsync ( COMPACT_EXPORT_HISTORY_VISIBILITY_ANIMATION_MS ) ;
449449 } ) ;
450450
451- expect ( container . querySelector ( '.compact-export-history-anchor' ) ) . not . toBeNull ( ) ;
452- expect ( container . querySelector ( '.compact-export-history-anchor' ) ) . toHaveAttribute ( 'data-compact-export-history-visibility' , 'closing' ) ;
453- expect ( container . querySelector ( '.compact-export-history-anchor' ) ) . toHaveAttribute ( 'data-compact-export-history-open' , 'false' ) ;
451+ expect ( container . querySelector ( '.compact-export-history-anchor' ) ) . toBeNull ( ) ;
454452 expect ( container . querySelectorAll ( '#music-player-mount' ) ) . toHaveLength ( 1 ) ;
455453 expect ( container . querySelector ( '.composer-panel #music-player-mount' ) ) . not . toBeNull ( ) ;
456454 expect ( container . querySelector ( '.compact-export-history-panel #music-player-mount' ) ) . toBeNull ( ) ;
@@ -475,6 +473,70 @@ describe('App', () => {
475473 expect ( exportButton ) . toHaveAttribute ( 'aria-pressed' , 'false' ) ;
476474 } ) ;
477475
476+ it ( 'keeps compact history hidden for new conversation messages after the user closes it' , async ( ) => {
477+ const initialMessage = parseChatMessage ( {
478+ id : 'assistant-history-before-close' ,
479+ role : 'assistant' ,
480+ author : 'Neko' ,
481+ time : '10:00' ,
482+ createdAt : 1 ,
483+ blocks : [ { type : 'text' , text : 'I am visible before closing.' } ] ,
484+ status : 'sent' ,
485+ } ) ;
486+ const userMessage = parseChatMessage ( {
487+ id : 'user-history-after-close' ,
488+ role : 'user' ,
489+ author : 'You' ,
490+ time : '10:01' ,
491+ createdAt : 2 ,
492+ blocks : [ { type : 'text' , text : 'This should not flash while history is closed.' } ] ,
493+ status : 'sent' ,
494+ } ) ;
495+ const assistantMessage = parseChatMessage ( {
496+ id : 'assistant-history-after-close' ,
497+ role : 'assistant' ,
498+ author : 'Neko' ,
499+ time : '10:02' ,
500+ createdAt : 3 ,
501+ blocks : [ { type : 'text' , text : 'But it should appear after reopening history.' } ] ,
502+ status : 'sent' ,
503+ } ) ;
504+
505+ vi . useFakeTimers ( ) ;
506+ try {
507+ const { container, rerender } = render (
508+ < App chatSurfaceMode = "compact" compactChatState = "input" messages = { [ initialMessage ] } /> ,
509+ ) ;
510+ expect ( container . querySelector ( '[data-compact-export-history-message-id="assistant-history-before-close"]' ) ) . not . toBeNull ( ) ;
511+
512+ fireEvent . click ( container . querySelector < HTMLButtonElement > ( '.compact-history-visibility-handle' ) ! ) ;
513+ expect ( container . querySelector ( '.compact-export-history-anchor' ) ) . toHaveAttribute ( 'data-compact-export-history-visibility' , 'closing' ) ;
514+
515+ await act ( async ( ) => {
516+ await vi . advanceTimersByTimeAsync ( COMPACT_EXPORT_HISTORY_VISIBILITY_ANIMATION_MS ) ;
517+ } ) ;
518+ expect ( container . querySelector ( '.compact-export-history-anchor' ) ) . toBeNull ( ) ;
519+
520+ rerender (
521+ < App
522+ chatSurfaceMode = "compact"
523+ compactChatState = "input"
524+ messages = { [ initialMessage , userMessage , assistantMessage ] }
525+ /> ,
526+ ) ;
527+ expect ( container . querySelector ( '.compact-export-history-anchor' ) ) . toBeNull ( ) ;
528+ expect ( container . querySelector ( '[data-compact-export-history-message-id="user-history-after-close"]' ) ) . toBeNull ( ) ;
529+ expect ( container . querySelector ( '[data-compact-export-history-message-id="assistant-history-after-close"]' ) ) . toBeNull ( ) ;
530+
531+ fireEvent . click ( container . querySelector < HTMLButtonElement > ( '.compact-history-visibility-handle' ) ! ) ;
532+ expect ( container . querySelector ( '.compact-export-history-anchor' ) ) . toHaveAttribute ( 'data-compact-export-history-visibility' , 'open' ) ;
533+ expect ( container . querySelector ( '[data-compact-export-history-message-id="user-history-after-close"]' ) ) . not . toBeNull ( ) ;
534+ expect ( container . querySelector ( '[data-compact-export-history-message-id="assistant-history-after-close"]' ) ) . not . toBeNull ( ) ;
535+ } finally {
536+ vi . useRealTimers ( ) ;
537+ }
538+ } ) ;
539+
478540 it ( 'restores compact inline history from persisted open state after remount' , ( ) => {
479541 const message = parseChatMessage ( {
480542 id : 'assistant-history-persisted' ,
0 commit comments