diff --git a/src/extension/inlineEdits/node/nextEditProviderTelemetry.ts b/src/extension/inlineEdits/node/nextEditProviderTelemetry.ts index 8b6c6b24f..0656effcf 100644 --- a/src/extension/inlineEdits/node/nextEditProviderTelemetry.ts +++ b/src/extension/inlineEdits/node/nextEditProviderTelemetry.ts @@ -753,6 +753,7 @@ export class TelemetrySender implements IDisposable { "providerId": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "NES provider identifier (StatelessNextEditProvider)" }, "modelName": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Name of the model used to provide the NES" }, "activeDocumentLanguageId": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "LanguageId of the active document" }, + "mergeConflictExpanded": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "If and how edit window expanded to include merge conflict lines ('normal' or 'only' or undefined if not expanded)" }, "acceptance": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "User acceptance of the edit" }, "disposalReason": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Reason for disposal of NES" }, "supersededByOpportunityId": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "UUID of the opportunity that superseded this edit" }, @@ -829,6 +830,7 @@ export class TelemetrySender implements IDisposable { providerId, modelName, activeDocumentLanguageId, + mergeConflictExpanded: telemetry.mergeConflictExpanded, acceptance, disposalReason, supersededByOpportunityId, diff --git a/src/extension/xtab/node/xtabProvider.ts b/src/extension/xtab/node/xtabProvider.ts index 0ce557203..0ca338673 100644 --- a/src/extension/xtab/node/xtabProvider.ts +++ b/src/extension/xtab/node/xtabProvider.ts @@ -247,7 +247,7 @@ export class XtabProvider implements IStatelessNextEditProvider { const maxMergeConflictLines = this.configService.getExperimentBasedConfig(ConfigKey.Internal.InlineEditsXtabMaxMergeConflictLines, this.expService); - const editWindowLinesRange = this.computeEditWindowLinesRange(currentFileContentLines, cursorLineIdx, request, maxMergeConflictLines, retryState); + const editWindowLinesRange = this.computeEditWindowLinesRange(currentFileContentLines, cursorLineIdx, request, maxMergeConflictLines, retryState, telemetryBuilder); const cursorOriginalLinesOffset = Math.max(0, cursorLineIdx - editWindowLinesRange.start); const editWindowLastLineLength = activeDocument.documentAfterEdits.getTransformer().getLineLength(editWindowLinesRange.endExclusive); @@ -786,7 +786,7 @@ export class XtabProvider implements IStatelessNextEditProvider { return new OffsetRange(areaAroundStart, areaAroundEndExcl); } - private computeEditWindowLinesRange(currentDocLines: string[], cursorLine: number, request: StatelessNextEditRequest, maxMergeConflictLines: number | undefined, retryState: RetryState): OffsetRange { + private computeEditWindowLinesRange(currentDocLines: string[], cursorLine: number, request: StatelessNextEditRequest, maxMergeConflictLines: number | undefined, retryState: RetryState, telemetry: StatelessNextEditTelemetryBuilder): OffsetRange { let nLinesAbove: number; { const useVaryingLinesAbove = this.configService.getExperimentBasedConfig(ConfigKey.Internal.InlineEditsXtabProviderUseVaryingLinesAbove, this.expService); @@ -838,6 +838,7 @@ export class XtabProvider implements IStatelessNextEditProvider { const mergeConflictRange = findMergeConflictMarkersRange(currentDocLines, tentativeEditWindow, maxMergeConflictLines); if (mergeConflictRange) { const onlyMergeConflictLines = this.configService.getExperimentBasedConfig(ConfigKey.Internal.InlineEditsXtabOnlyMergeConflictLines, this.expService); + telemetry.setMergeConflictExpanded(onlyMergeConflictLines ? 'only' : 'normal'); if (onlyMergeConflictLines) { this.tracer.trace(`Expanding edit window to include ONLY merge conflict markers: ${mergeConflictRange.toString()}`); codeToEditStart = mergeConflictRange.start; diff --git a/src/platform/inlineEdits/common/statelessNextEditProvider.ts b/src/platform/inlineEdits/common/statelessNextEditProvider.ts index 626ab6d73..7a0cfe769 100644 --- a/src/platform/inlineEdits/common/statelessNextEditProvider.ts +++ b/src/platform/inlineEdits/common/statelessNextEditProvider.ts @@ -275,6 +275,7 @@ export interface IStatelessNextEditTelemetry { readonly prompt: string | undefined; readonly promptLineCount: number | undefined; readonly promptCharCount: number | undefined; + readonly mergeConflictExpanded: 'normal' | 'only' | undefined; /* fetch request info */ @@ -353,6 +354,7 @@ export class StatelessNextEditTelemetryBuilder { statelessNextEditProviderDuration: timeSpent, logProbThreshold: this._logProbThreshold, + mergeConflictExpanded: this._mergeConflictExpanded, nLinesOfCurrentFileInPrompt: this._nLinesOfCurrentFileInPrompt, modelName: this._modelName, prompt, @@ -376,6 +378,12 @@ export class StatelessNextEditTelemetryBuilder { return this; } + private _mergeConflictExpanded: 'normal' | 'only' | undefined; + public setMergeConflictExpanded(mergeConflictExpanded: 'normal' | 'only'): this { + this._mergeConflictExpanded = mergeConflictExpanded; + return this; + } + private _hadLowLogProbSuggestion: boolean | undefined; public setHadLowLogProbSuggestion(hadLowLogProbSuggestions: boolean): this { this._hadLowLogProbSuggestion = hadLowLogProbSuggestions;