@@ -26,6 +26,7 @@ export interface LastSettledObservation {
2626/** A post-action observation that has been queued but not yet written down. */
2727interface PendingSettle {
2828 draftIndex : number ;
29+ tabId : number ;
2930 /** Set when a newer action has already decided where this step landed. */
3031 cancelled : boolean ;
3132}
@@ -40,6 +41,7 @@ export interface PendingRedirectLanding {
4041export interface RecordingObservationState {
4142 stateRegistry : Map < string , StateRegistryEntry > ;
4243 lastSettled : LastSettledObservation | null ;
44+ settledByTab : Map < number , LastSettledObservation > ;
4345 maxPageTokens : number ;
4446 redactValues : boolean ;
4547 lastCaptureAtMs : number ;
@@ -67,6 +69,7 @@ export function createObservationState(options?: {
6769 return {
6870 stateRegistry : new Map ( ) ,
6971 lastSettled : null ,
72+ settledByTab : new Map ( ) ,
7073 maxPageTokens : options ?. maxPageTokens ?? DEFAULT_MAX_PAGE_TOKENS ,
7174 redactValues : options ?. redactValues ?? false ,
7275 lastCaptureAtMs : 0 ,
@@ -134,6 +137,7 @@ export async function captureAndRegisterObservation(
134137 vomText : rendered . text ,
135138 } ;
136139 obs . lastSettled = settled ;
140+ obs . settledByTab . set ( tabId , settled ) ;
137141 return settled ;
138142}
139143
@@ -499,11 +503,13 @@ export async function settleUnsettledDrafts(
499503function supersedeEarlierSettles (
500504 obs : RecordingObservationState ,
501505 draftIndex : number ,
506+ tabId : number ,
502507 steps : DraftTraceStep [ ] ,
503508) : void {
504509 const landing = steps [ draftIndex ] ?. preStateId ;
505510 for ( const [ index , pending ] of obs . settles ) {
506511 if ( index >= draftIndex ) continue ;
512+ if ( pending . tabId !== tabId ) continue ;
507513 pending . cancelled = true ;
508514 obs . settles . delete ( index ) ;
509515
@@ -527,14 +533,14 @@ export function scheduleDraftSettle(
527533 tabsApi : ChromeTabsApi ,
528534 steps : DraftTraceStep [ ] ,
529535) : void {
530- supersedeEarlierSettles ( obs , draftIndex , steps ) ;
536+ supersedeEarlierSettles ( obs , draftIndex , tabId , steps ) ;
531537
532538 // Rescheduling the same step (a navigation showed up after the action)
533539 // replaces the pending observation rather than racing it.
534540 const superseded = obs . settles . get ( draftIndex ) ;
535541 if ( superseded ) superseded . cancelled = true ;
536542
537- const pending : PendingSettle = { draftIndex, cancelled : false } ;
543+ const pending : PendingSettle = { draftIndex, tabId , cancelled : false } ;
538544 obs . settles . set ( draftIndex , pending ) ;
539545
540546 enqueueSettle ( obs , async ( ) => {
0 commit comments