From 27f6005682bb364e7bcbc069ac4e4589aef35313 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Mon, 3 Aug 2026 05:12:21 +0800 Subject: [PATCH] fix(openai): retain active predecessor satisfaction --- extensions/openai/realtime-transcription-provider.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/extensions/openai/realtime-transcription-provider.ts b/extensions/openai/realtime-transcription-provider.ts index 9a1638f61564..402d02a28940 100644 --- a/extensions/openai/realtime-transcription-provider.ts +++ b/extensions/openai/realtime-transcription-provider.ts @@ -250,6 +250,13 @@ function createOpenAIRealtimeTranscriptionSession( const settleItem = (itemId: string) => { trackedItemIds.delete(itemId); + // Predecessor satisfaction belongs to each active item. Recording it here + // prevents bounded tombstone eviction from invalidating admitted state. + for (const [candidateId, previousItemId] of committedItems) { + if (previousItemId === itemId) { + committedItems.set(candidateId, null); + } + } // Keep only a bounded terminal frontier so late provider events cannot // recreate released state, including when completion precedes commit. settledItemIds.add(itemId); @@ -276,7 +283,10 @@ function createOpenAIRealtimeTranscriptionSession( failTerminal(new Error(OPENAI_REALTIME_TRANSCRIPTION_IDENTITY_OVERFLOW_MESSAGE), transport); return; } - committedItems.set(itemId, previousItemId); + committedItems.set( + itemId, + previousItemId && settledItemIds.has(previousItemId) ? null : previousItemId, + ); committedItemIds.push(itemId); const arrivalOrder = committedItemIds.splice(0);