@@ -167,6 +167,9 @@ const messagesAreStale = (incoming: Partial<ExtensionState>, currentSequence: nu
167167 currentSequence !== undefined &&
168168 incoming . clineMessagesSeq <= currentSequence
169169
170+ const snapshotIsStale = ( incoming : Partial < ExtensionState > , currentSequence : number | undefined ) : boolean =>
171+ incoming . stateSeq !== undefined && currentSequence !== undefined && incoming . stateSeq <= currentSequence
172+
170173function internMessages ( messages : ClineMessage [ ] , previousMessages : ClineMessage [ ] , cache : StringCache ) : void {
171174 const previousByTimestamp = new Map ( previousMessages . map ( ( item ) => [ item . ts , item ] ) )
172175 for ( const message of messages ) {
@@ -222,6 +225,13 @@ export const mergeExtensionState = (prevState: ExtensionState, newState: Partial
222225 rest . currentTaskId = newState . currentTaskId
223226 }
224227
228+ // Snapshots are read asynchronously, so an older one can arrive after a newer one. Keep the
229+ // language from the newest snapshot instead of reverting to the one the stale snapshot read.
230+ if ( snapshotIsStale ( newState , prevState . stateSeq ) ) {
231+ rest . language = prevState . language
232+ rest . stateSeq = prevState . stateSeq
233+ }
234+
225235 // Note that we completely replace the previous apiConfiguration and customSupportPrompts objects
226236 // with new ones since the state that is broadcast is the entire objects so merging is not necessary.
227237 return {
@@ -328,6 +338,7 @@ export const ExtensionStateContextProvider: React.FC<{
328338 const messagesRef = useRef ( initialState ?. clineMessages ?? [ ] )
329339 const currentTaskIdRef = useRef ( initialState ?. currentTaskId )
330340 const clineMessagesSeqRef = useRef ( initialState ?. clineMessagesSeq )
341+ const stateSeqRef = useRef ( initialState ?. stateSeq )
331342
332343 const [ state , setState ] = useState < ExtensionState > ( ( ) => {
333344 const mergedState = mergeExtensionState ( createInitialExtensionState ( ) , initialState ?? { } )
@@ -424,7 +435,10 @@ export const ExtensionStateContextProvider: React.FC<{
424435 if ( newState . currentTaskItem ) {
425436 historyCache . intern ( newState . currentTaskItem )
426437 }
427- applyLanguage ( i18next , newState . language )
438+ if ( ! snapshotIsStale ( newState , stateSeqRef . current ) ) {
439+ applyLanguage ( i18next , newState . language )
440+ stateSeqRef . current = newState . stateSeq ?? stateSeqRef . current
441+ }
428442 setState ( ( prevState ) => mergeExtensionState ( prevState , newState ) )
429443 setShowWelcome ( ! checkExistKey ( newState . apiConfiguration , newState . zooCodeIsAuthenticated ) )
430444 setDidHydrateState ( true )
0 commit comments