diff --git a/extensions/copilot/src/extension/inlineEdits/node/nextEditProvider.ts b/extensions/copilot/src/extension/inlineEdits/node/nextEditProvider.ts index 820a23eab04d9..2023827c04719 100644 --- a/extensions/copilot/src/extension/inlineEdits/node/nextEditProvider.ts +++ b/extensions/copilot/src/extension/inlineEdits/node/nextEditProvider.ts @@ -111,6 +111,8 @@ interface DocState { /** Arguments for {@link NextEditProvider._rebaseAndCacheStreamedEdit}. */ interface RebaseAndCacheStreamedEditArgs { readonly statePerDoc: CachedFunction; + /** Predicate identifying documents `statePerDoc` can resolve without throwing. */ + readonly isKnownDocument: (id: DocumentId) => boolean; readonly streamedEdit: StreamedEdit; /** Zero-based index of this edit within the stream. */ readonly ithEdit: number; @@ -127,7 +129,14 @@ interface RebaseAndCacheStreamedEditArgs { readonly logger: ILogger; } -function createDocStateLookupMap(projectedDocuments: readonly ProcessedDoc[], xtabEditHistory: readonly IXtabHistoryEntry[]): CachedFunction { +function createDocStateLookupMap(projectedDocuments: readonly ProcessedDoc[], xtabEditHistory: readonly IXtabHistoryEntry[]): { statePerDoc: CachedFunction; isKnownDocument: (id: DocumentId) => boolean } { + const isKnownDocument = (id: DocumentId): boolean => { + if (projectedDocuments.some(d => d.nextEditDoc.id === id)) { + return true; + } + return xtabEditHistory.some(entry => entry.docId === id && entry.kind === 'edit'); + }; + const statePerDoc = new CachedFunction((id: DocumentId) => { const doc = projectedDocuments.find(d => d.nextEditDoc.id === id); if (!doc) { @@ -158,7 +167,7 @@ function createDocStateLookupMap(projectedDocuments: readonly ProcessedDoc[], xt }); - return statePerDoc; + return { statePerDoc, isKnownDocument }; } /** @@ -771,7 +780,16 @@ export class NextEditProvider extends Disposable implements INextEditProvider