@@ -547,6 +547,8 @@ final class AppModel: NSObject, ObservableObject {
547547 }
548548 }
549549 }
550+ // After switching sessions, ensure transcript starts at the top
551+ scrollToTop ( )
550552 }
551553
552554 func beginInteractivity( ) {
@@ -625,6 +627,7 @@ final class AppModel: NSObject, ObservableObject {
625627 return
626628 }
627629 isGenerating = true
630+ scrollToTop ( )
628631 updateWindowSizeForState ( animated: false )
629632 defer { isGenerating = false ; currentStreamTask = nil }
630633 // Clear any prior TTS so Play controls do not resume old audio
@@ -731,6 +734,7 @@ final class AppModel: NSObject, ObservableObject {
731734
732735 private func performImageOnlyInstruction( _ user: String ) async {
733736 isGenerating = true
737+ scrollToTop ( )
734738 updateWindowSizeForState ( animated: false )
735739 defer { isGenerating = false }
736740 clearTTSState ( )
@@ -1590,6 +1594,7 @@ table{border-collapse:collapse;width:100%;} th,td{border:1px solid rgba(127,127,
15901594 if !allTexts. isEmpty { sections. append ( " Text Snippets ( \( allTexts. count) ): \n \( tList) " ) }
15911595 let user = sections. joined ( separator: " \n \n " ) + " \n \n Provide a single consolidated response. "
15921596 isGenerating = true
1597+ scrollToTop ( )
15931598 webSearchSources = [ ]
15941599 updateWindowSizeForState ( animated: false )
15951600 defer { isGenerating = false ; currentStreamTask = nil }
@@ -1727,6 +1732,7 @@ table{border-collapse:collapse;width:100%;} th,td{border:1px solid rgba(127,127,
17271732 clearTTSState ( )
17281733 cancelDeltaTimers ( ) ; thinkingText = " " ; outputDeltaBuffer = " " ; thinkingDeltaBuffer = " " ; reasoningEncryptedItems. removeAll ( ) ; reasoningSummaryBuffer = " "
17291734 isGenerating = true
1735+ scrollToTop ( )
17301736 updateWindowSizeForState ( animated: false )
17311737 defer { isGenerating = false ; currentStreamTask = nil }
17321738
0 commit comments