@vscode/chat-lib 0.44.1 → 0.45.2026041733
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/_internal/extension/common/constants.d.ts +2 -1
- package/dist/src/_internal/extension/common/constants.d.ts.map +1 -1
- package/dist/src/_internal/extension/common/constants.js +3 -0
- package/dist/src/_internal/extension/common/constants.js.map +1 -1
- package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/openai/fetch.d.ts.map +1 -1
- package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/openai/fetch.js +20 -13
- package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/openai/fetch.js.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/common/editRebase.d.ts +8 -0
- package/dist/src/_internal/extension/inlineEdits/common/editRebase.d.ts.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/common/editRebase.js +56 -0
- package/dist/src/_internal/extension/inlineEdits/common/editRebase.js.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.d.ts.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.js +1 -0
- package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.js.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/node/rebaseResult.d.ts.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/node/rebaseResult.js +10 -3
- package/dist/src/_internal/extension/inlineEdits/node/rebaseResult.js.map +1 -1
- package/dist/src/_internal/extension/prompt/node/chatMLFetcher.d.ts.map +1 -1
- package/dist/src/_internal/extension/prompt/node/chatMLFetcher.js +17 -11
- package/dist/src/_internal/extension/prompt/node/chatMLFetcher.js.map +1 -1
- package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.d.ts.map +1 -1
- package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.js +2 -0
- package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.js.map +1 -1
- package/dist/src/_internal/extension/xtab/common/fetchStreamError.d.ts +10 -0
- package/dist/src/_internal/extension/xtab/common/fetchStreamError.d.ts.map +1 -0
- package/dist/src/_internal/extension/xtab/common/fetchStreamError.js +19 -0
- package/dist/src/_internal/extension/xtab/common/fetchStreamError.js.map +1 -0
- package/dist/src/_internal/extension/xtab/node/cursorLineDivergence.d.ts +12 -9
- package/dist/src/_internal/extension/xtab/node/cursorLineDivergence.d.ts.map +1 -1
- package/dist/src/_internal/extension/xtab/node/cursorLineDivergence.js +26 -26
- package/dist/src/_internal/extension/xtab/node/cursorLineDivergence.js.map +1 -1
- package/dist/src/_internal/extension/xtab/node/responseFormatHandlers.d.ts +2 -2
- package/dist/src/_internal/extension/xtab/node/responseFormatHandlers.d.ts.map +1 -1
- package/dist/src/_internal/extension/xtab/node/responseFormatHandlers.js +6 -31
- package/dist/src/_internal/extension/xtab/node/responseFormatHandlers.js.map +1 -1
- package/dist/src/_internal/extension/xtab/node/xtabCustomDiffPatchResponseHandler.d.ts +1 -1
- package/dist/src/_internal/extension/xtab/node/xtabCustomDiffPatchResponseHandler.d.ts.map +1 -1
- package/dist/src/_internal/extension/xtab/node/xtabCustomDiffPatchResponseHandler.js +5 -5
- package/dist/src/_internal/extension/xtab/node/xtabCustomDiffPatchResponseHandler.js.map +1 -1
- package/dist/src/_internal/extension/xtab/node/xtabProvider.d.ts.map +1 -1
- package/dist/src/_internal/extension/xtab/node/xtabProvider.js +157 -131
- package/dist/src/_internal/extension/xtab/node/xtabProvider.js.map +1 -1
- package/dist/src/_internal/platform/chat/common/chatMLFetcher.d.ts +1 -0
- package/dist/src/_internal/platform/chat/common/chatMLFetcher.d.ts.map +1 -1
- package/dist/src/_internal/platform/chat/common/chatMLFetcher.js +4 -0
- package/dist/src/_internal/platform/chat/common/chatMLFetcher.js.map +1 -1
- package/dist/src/_internal/platform/chat/common/chatQuotaService.d.ts +7 -1
- package/dist/src/_internal/platform/chat/common/chatQuotaService.d.ts.map +1 -1
- package/dist/src/_internal/platform/chat/common/chatQuotaService.js.map +1 -1
- package/dist/src/_internal/platform/chat/common/chatQuotaServiceImpl.d.ts +11 -1
- package/dist/src/_internal/platform/chat/common/chatQuotaServiceImpl.d.ts.map +1 -1
- package/dist/src/_internal/platform/chat/common/chatQuotaServiceImpl.js +76 -16
- package/dist/src/_internal/platform/chat/common/chatQuotaServiceImpl.js.map +1 -1
- package/dist/src/_internal/platform/chat/common/commonTypes.js +2 -2
- package/dist/src/_internal/platform/chat/common/commonTypes.js.map +1 -1
- package/dist/src/_internal/platform/configuration/common/configurationService.d.ts +15 -10
- package/dist/src/_internal/platform/configuration/common/configurationService.d.ts.map +1 -1
- package/dist/src/_internal/platform/configuration/common/configurationService.js +18 -13
- package/dist/src/_internal/platform/configuration/common/configurationService.js.map +1 -1
- package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.d.ts +3 -3
- package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.d.ts.map +1 -1
- package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.js +15 -12
- package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.js.map +1 -1
- package/dist/src/_internal/platform/endpoint/node/chatEndpoint.d.ts +11 -1
- package/dist/src/_internal/platform/endpoint/node/chatEndpoint.d.ts.map +1 -1
- package/dist/src/_internal/platform/endpoint/node/chatEndpoint.js +28 -58
- package/dist/src/_internal/platform/endpoint/node/chatEndpoint.js.map +1 -1
- package/dist/src/_internal/platform/endpoint/node/imageLimits.d.ts +14 -0
- package/dist/src/_internal/platform/endpoint/node/imageLimits.d.ts.map +1 -0
- package/dist/src/_internal/platform/endpoint/node/imageLimits.js +156 -0
- package/dist/src/_internal/platform/endpoint/node/imageLimits.js.map +1 -0
- package/dist/src/_internal/platform/endpoint/node/messagesApi.d.ts +4 -12
- package/dist/src/_internal/platform/endpoint/node/messagesApi.d.ts.map +1 -1
- package/dist/src/_internal/platform/endpoint/node/messagesApi.js +13 -152
- package/dist/src/_internal/platform/endpoint/node/messagesApi.js.map +1 -1
- package/dist/src/_internal/platform/endpoint/node/responsesApi.d.ts +4 -1
- package/dist/src/_internal/platform/endpoint/node/responsesApi.d.ts.map +1 -1
- package/dist/src/_internal/platform/endpoint/node/responsesApi.js +70 -31
- package/dist/src/_internal/platform/endpoint/node/responsesApi.js.map +1 -1
- package/dist/src/_internal/platform/git/common/gitService.d.ts +2 -9
- package/dist/src/_internal/platform/git/common/gitService.d.ts.map +1 -1
- package/dist/src/_internal/platform/git/common/gitService.js.map +1 -1
- package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.d.ts +15 -0
- package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.d.ts.map +1 -1
- package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.js +17 -1
- package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.js.map +1 -1
- package/dist/src/_internal/platform/networking/common/anthropic.d.ts +0 -42
- package/dist/src/_internal/platform/networking/common/anthropic.d.ts.map +1 -1
- package/dist/src/_internal/platform/networking/common/anthropic.js +1 -30
- package/dist/src/_internal/platform/networking/common/anthropic.js.map +1 -1
- package/dist/src/_internal/platform/networking/common/fetch.d.ts +0 -12
- package/dist/src/_internal/platform/networking/common/fetch.d.ts.map +1 -1
- package/dist/src/_internal/platform/networking/common/fetch.js +5 -1
- package/dist/src/_internal/platform/networking/common/fetch.js.map +1 -1
- package/dist/src/_internal/platform/networking/node/chatWebSocketManager.d.ts +1 -0
- package/dist/src/_internal/platform/networking/node/chatWebSocketManager.d.ts.map +1 -1
- package/dist/src/_internal/platform/networking/node/chatWebSocketManager.js +3 -3
- package/dist/src/_internal/platform/networking/node/chatWebSocketManager.js.map +1 -1
- package/dist/src/_internal/platform/otel/common/genAiEvents.d.ts.map +1 -1
- package/dist/src/_internal/platform/otel/common/genAiEvents.js +10 -2
- package/dist/src/_internal/platform/otel/common/genAiEvents.js.map +1 -1
- package/dist/src/_internal/platform/otel/common/index.d.ts +1 -1
- package/dist/src/_internal/platform/otel/common/index.d.ts.map +1 -1
- package/dist/src/_internal/platform/otel/common/index.js +2 -1
- package/dist/src/_internal/platform/otel/common/index.js.map +1 -1
- package/dist/src/_internal/platform/otel/common/messageFormatters.d.ts +13 -1
- package/dist/src/_internal/platform/otel/common/messageFormatters.d.ts.map +1 -1
- package/dist/src/_internal/platform/otel/common/messageFormatters.js +98 -0
- package/dist/src/_internal/platform/otel/common/messageFormatters.js.map +1 -1
- package/dist/src/_internal/platform/requestLogger/common/requestLogger.d.ts +0 -1
- package/dist/src/_internal/platform/requestLogger/common/requestLogger.d.ts.map +1 -1
- package/dist/src/_internal/platform/requestLogger/common/requestLogger.js.map +1 -1
- package/dist/src/_internal/platform/requestLogger/node/nullRequestLogger.d.ts +2 -3
- package/dist/src/_internal/platform/requestLogger/node/nullRequestLogger.d.ts.map +1 -1
- package/dist/src/_internal/platform/requestLogger/node/nullRequestLogger.js +1 -3
- package/dist/src/_internal/platform/requestLogger/node/nullRequestLogger.js.map +1 -1
- package/dist/src/_internal/platform/requestLogger/node/requestLogger.d.ts +0 -1
- package/dist/src/_internal/platform/requestLogger/node/requestLogger.d.ts.map +1 -1
- package/dist/src/_internal/platform/requestLogger/node/requestLogger.js.map +1 -1
- package/dist/src/package.json +6475 -6412
- package/package.json +1 -2
|
@@ -79,6 +79,7 @@ const nullExperimentationService_1 = require("../../../platform/telemetry/common
|
|
|
79
79
|
const workspaceService_1 = require("../../../platform/workspace/common/workspaceService");
|
|
80
80
|
const async_1 = require("../../../util/common/async");
|
|
81
81
|
const asyncIterableUtils_1 = require("../../../util/common/asyncIterableUtils");
|
|
82
|
+
const backwardCompatSetting_1 = require("../../../util/common/backwardCompatSetting");
|
|
82
83
|
const errors_1 = require("../../../util/common/errors");
|
|
83
84
|
const result_1 = require("../../../util/common/result");
|
|
84
85
|
const assert_1 = require("../../../util/vs/base/common/assert");
|
|
@@ -94,11 +95,13 @@ const range_1 = require("../../../util/vs/editor/common/core/range");
|
|
|
94
95
|
const lineRange_1 = require("../../../util/vs/editor/common/core/ranges/lineRange");
|
|
95
96
|
const offsetRange_1 = require("../../../util/vs/editor/common/core/ranges/offsetRange");
|
|
96
97
|
const abstractText_1 = require("../../../util/vs/editor/common/core/text/abstractText");
|
|
98
|
+
const positionToOffset_1 = require("../../../util/vs/editor/common/core/text/positionToOffset");
|
|
97
99
|
const instantiation_1 = require("../../../util/vs/platform/instantiation/common/instantiation");
|
|
98
100
|
const vscodeTypesShim_1 = require("../../../util/common/test/shims/vscodeTypesShim");
|
|
99
101
|
const nearbyCursorInlineEditProvider_1 = require("../../inlineEdits/common/nearbyCursorInlineEditProvider");
|
|
100
102
|
const userInteractionMonitor_1 = require("../../inlineEdits/common/userInteractionMonitor");
|
|
101
103
|
const importFiltering_1 = require("../../inlineEdits/node/importFiltering");
|
|
104
|
+
const fetchStreamError_1 = require("../common/fetchStreamError");
|
|
102
105
|
const inlineSuggestion_1 = require("../common/inlineSuggestion");
|
|
103
106
|
const lintErrors_1 = require("../common/lintErrors");
|
|
104
107
|
const promptCrafting_1 = require("../common/promptCrafting");
|
|
@@ -139,9 +142,8 @@ var RetryState;
|
|
|
139
142
|
var FetchResult;
|
|
140
143
|
(function (FetchResult) {
|
|
141
144
|
class Lines {
|
|
142
|
-
constructor(linesStream,
|
|
145
|
+
constructor(linesStream, getResponseSoFar, fetchRequestStopWatch) {
|
|
143
146
|
this.linesStream = linesStream;
|
|
144
|
-
this.getFetchFailure = getFetchFailure;
|
|
145
147
|
this.getResponseSoFar = getResponseSoFar;
|
|
146
148
|
this.fetchRequestStopWatch = fetchRequestStopWatch;
|
|
147
149
|
}
|
|
@@ -533,7 +535,6 @@ let XtabProvider = class XtabProvider {
|
|
|
533
535
|
const fetchStreamSource = new chatMLFetcher_1.FetchStreamSource();
|
|
534
536
|
const fetchRequestStopWatch = new stopwatch_1.StopWatch();
|
|
535
537
|
let responseSoFar = '';
|
|
536
|
-
let chatResponseFailure;
|
|
537
538
|
let ttft;
|
|
538
539
|
const firstTokenReceived = new async_2.DeferredPromise();
|
|
539
540
|
logContext.setHeaderRequestId(requestId);
|
|
@@ -577,20 +578,23 @@ let XtabProvider = class XtabProvider {
|
|
|
577
578
|
logContext.setFullResponse(fetchResultPromise.then((response) => response.type === commonTypes_1.ChatFetchResponseType.Success ? response.value : undefined));
|
|
578
579
|
fetchResultPromise
|
|
579
580
|
.then((response) => {
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
581
|
+
if (response.type !== commonTypes_1.ChatFetchResponseType.Success) {
|
|
582
|
+
fetchStreamSource.reject(new fetchStreamError_1.FetchStreamError(mapChatFetcherErrorToNoNextEditReason(response)));
|
|
583
|
+
}
|
|
584
|
+
else {
|
|
585
|
+
fetchStreamSource.resolve();
|
|
586
|
+
}
|
|
583
587
|
})
|
|
584
588
|
.catch((err) => {
|
|
585
589
|
// in principle this shouldn't happen because ChatMLFetcher's fetchOne should not throw
|
|
586
590
|
logContext.setError(errors_1.ErrorUtils.fromUnknown(err));
|
|
587
591
|
logContext.addLog(`ChatMLFetcher fetch call threw -- this's UNEXPECTED!`);
|
|
592
|
+
fetchStreamSource.reject(errors_1.ErrorUtils.fromUnknown(err));
|
|
588
593
|
}).finally(() => {
|
|
589
594
|
logContext.setFetchEndTime();
|
|
590
595
|
if (!firstTokenReceived.isSettled) {
|
|
591
596
|
firstTokenReceived.complete();
|
|
592
597
|
}
|
|
593
|
-
fetchStreamSource.resolve();
|
|
594
598
|
logContext.setResponse(responseSoFar);
|
|
595
599
|
});
|
|
596
600
|
const fetchRes = await Promise.race([firstTokenReceived.p, fetchResultPromise]);
|
|
@@ -607,7 +611,6 @@ let XtabProvider = class XtabProvider {
|
|
|
607
611
|
}
|
|
608
612
|
return new FetchResult.FetchFailure(mapChatFetcherErrorToNoNextEditReason(fetchRes));
|
|
609
613
|
}
|
|
610
|
-
const getFetchFailure = () => chatResponseFailure ? mapChatFetcherErrorToNoNextEditReason(chatResponseFailure) : undefined;
|
|
611
614
|
const llmLinesStream = asyncIterableUtils_1.AsyncIterUtilsExt.splitLines(asyncIterableUtils_1.AsyncIterUtils.map(fetchStreamSource.stream, (chunk) => chunk.delta.text));
|
|
612
615
|
// logging of times
|
|
613
616
|
// removal of cursor tag if option is set
|
|
@@ -621,7 +624,7 @@ let XtabProvider = class XtabProvider {
|
|
|
621
624
|
: v;
|
|
622
625
|
}
|
|
623
626
|
})();
|
|
624
|
-
return new FetchResult.Lines(linesStream,
|
|
627
|
+
return new FetchResult.Lines(linesStream, () => responseSoFar, fetchRequestStopWatch);
|
|
625
628
|
}
|
|
626
629
|
async *_streamEditsImpl(request, editStreamCtx, responseOpts, fetchMetadata, retryState, delaySession, tracing, cancellationToken, fetchCts, fetchCancellationToken) {
|
|
627
630
|
const { tracer, logContext, telemetry } = tracing;
|
|
@@ -636,130 +639,112 @@ let XtabProvider = class XtabProvider {
|
|
|
636
639
|
if (fetchResult instanceof FetchResult.FetchFailure) {
|
|
637
640
|
return fetchResult.reason;
|
|
638
641
|
}
|
|
639
|
-
const { linesStream,
|
|
642
|
+
const { linesStream, getResponseSoFar, fetchRequestStopWatch } = fetchResult;
|
|
640
643
|
// Phase 2: Dispatch to the appropriate response format handler
|
|
641
644
|
const isFromCursorJump = retryState instanceof RetryState.Retrying && retryState.reason === 'cursorJump';
|
|
642
645
|
let parseResult;
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
646
|
+
try {
|
|
647
|
+
switch (responseOpts.responseFormat) {
|
|
648
|
+
case xtabPromptOptions.ResponseFormat.EditWindowOnly: {
|
|
649
|
+
parseResult = (0, responseFormatHandlers_1.handleEditWindowOnly)(linesStream);
|
|
650
|
+
break;
|
|
651
|
+
}
|
|
652
|
+
case xtabPromptOptions.ResponseFormat.CodeBlock: {
|
|
653
|
+
parseResult = (0, responseFormatHandlers_1.handleCodeBlock)(linesStream);
|
|
654
|
+
break;
|
|
655
|
+
}
|
|
656
|
+
case xtabPromptOptions.ResponseFormat.EditWindowWithEditIntent:
|
|
657
|
+
case xtabPromptOptions.ResponseFormat.EditWindowWithEditIntentShort: {
|
|
658
|
+
const parseMode = responseOpts.responseFormat === xtabPromptOptions.ResponseFormat.EditWindowWithEditIntentShort
|
|
659
|
+
? editIntent_1.EditIntentParseMode.ShortName
|
|
660
|
+
: editIntent_1.EditIntentParseMode.Tags;
|
|
661
|
+
parseResult = await (0, responseFormatHandlers_1.handleEditWindowWithEditIntent)(linesStream, tracer, parseMode);
|
|
662
|
+
break;
|
|
663
|
+
}
|
|
664
|
+
case xtabPromptOptions.ResponseFormat.CustomDiffPatch: {
|
|
665
|
+
const activeDoc = request.getActiveDocument();
|
|
666
|
+
const currentDocument = promptPieces.currentDocument;
|
|
667
|
+
const lastLine = currentDocument.lines[clippedTaggedCurrentDoc.keptRange.endExclusive - 1];
|
|
668
|
+
const lastLineLength = lastLine.length;
|
|
669
|
+
const pseudoEditWindow = currentDocument.transformer.getOffsetRange(new range_1.Range(clippedTaggedCurrentDoc.keptRange.start + 1, 1, clippedTaggedCurrentDoc.keptRange.endExclusive, lastLineLength + 1));
|
|
670
|
+
parseResult = new responseFormatHandlers_1.ResponseParseResult.DirectEdits(xtabCustomDiffPatchResponseHandler_1.XtabCustomDiffPatchResponseHandler.handleResponse(linesStream, currentDocument, activeDoc.id, activeDoc.workspaceRoot, pseudoEditWindow, tracer));
|
|
671
|
+
break;
|
|
672
|
+
}
|
|
673
|
+
case xtabPromptOptions.ResponseFormat.UnifiedWithXml: {
|
|
674
|
+
parseResult = await (0, responseFormatHandlers_1.handleUnifiedWithXml)(linesStream, {
|
|
675
|
+
editWindowLines,
|
|
676
|
+
editWindowLineRange,
|
|
677
|
+
cursorOriginalLinesOffset,
|
|
678
|
+
cursorColumnZeroBased: promptPieces.currentDocument.cursorPosition.column - 1,
|
|
679
|
+
editWindow,
|
|
680
|
+
originalEditWindow,
|
|
681
|
+
targetDocument,
|
|
682
|
+
isFromCursorJump,
|
|
683
|
+
}, request.documentBeforeEdits, tracer);
|
|
684
|
+
break;
|
|
685
|
+
}
|
|
686
|
+
default:
|
|
687
|
+
(0, assert_1.assertNever)(responseOpts.responseFormat);
|
|
668
688
|
}
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
editWindowLineRange,
|
|
673
|
-
cursorOriginalLinesOffset,
|
|
674
|
-
cursorColumnZeroBased: promptPieces.currentDocument.cursorPosition.column - 1,
|
|
675
|
-
editWindow,
|
|
676
|
-
originalEditWindow,
|
|
677
|
-
targetDocument,
|
|
678
|
-
isFromCursorJump,
|
|
679
|
-
}, request.documentBeforeEdits, tracer, getFetchFailure);
|
|
680
|
-
break;
|
|
689
|
+
// Handle result uniformly
|
|
690
|
+
if (parseResult instanceof responseFormatHandlers_1.ResponseParseResult.Done) {
|
|
691
|
+
return parseResult.reason;
|
|
681
692
|
}
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
}
|
|
685
|
-
// Handle result uniformly
|
|
686
|
-
if (parseResult instanceof responseFormatHandlers_1.ResponseParseResult.Done) {
|
|
687
|
-
return parseResult.reason;
|
|
688
|
-
}
|
|
689
|
-
if (parseResult instanceof responseFormatHandlers_1.ResponseParseResult.DirectEdits) {
|
|
690
|
-
return yield* parseResult.stream;
|
|
691
|
-
}
|
|
692
|
-
// parseResult is EditWindowLines — log edit-intent telemetry and apply aggressiveness filter
|
|
693
|
-
if (parseResult.editIntentMetadata) {
|
|
694
|
-
const { intent, parseError } = parseResult.editIntentMetadata;
|
|
695
|
-
telemetry.setEditIntent(intent);
|
|
696
|
-
if (parseError) {
|
|
697
|
-
telemetry.setEditIntentParseError(parseError);
|
|
693
|
+
if (parseResult instanceof responseFormatHandlers_1.ResponseParseResult.DirectEdits) {
|
|
694
|
+
return yield* parseResult.stream;
|
|
698
695
|
}
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
696
|
+
// parseResult is EditWindowLines — log edit-intent telemetry and apply aggressiveness filter
|
|
697
|
+
if (parseResult.editIntentMetadata) {
|
|
698
|
+
const { intent, parseError } = parseResult.editIntentMetadata;
|
|
699
|
+
telemetry.setEditIntent(intent);
|
|
700
|
+
if (parseError) {
|
|
701
|
+
telemetry.setEditIntentParseError(parseError);
|
|
702
|
+
}
|
|
703
|
+
if (!xtabPromptOptions.EditIntent.shouldShowEdit(intent, promptPieces.aggressivenessLevel)) {
|
|
704
|
+
tracer.trace(`Filtered out edit due to edit intent "${intent}" with aggressiveness "${promptPieces.aggressivenessLevel}"`);
|
|
705
|
+
return new statelessNextEditProvider_1.NoNextEditReason.FilteredOut(`editIntent:${intent} aggressivenessLevel:${promptPieces.aggressivenessLevel}`);
|
|
706
|
+
}
|
|
702
707
|
}
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
const originalCursorLine = editWindowLines[cursorOriginalLinesOffset];
|
|
732
|
-
if (currentCursorLine !== originalCursorLine // user changed the cursor line
|
|
733
|
-
&& !(0, cursorLineDivergence_1.isModelCursorLineCompatible)(originalCursorLine, currentCursorLine, line) // model's cursor line isn't compatible with user's typing
|
|
734
|
-
) {
|
|
735
|
-
cursorLineDiverged = true;
|
|
736
|
-
tracer.trace(`Cursor line DIVERGED: model="${line}" current="${currentCursorLine}"`);
|
|
737
|
-
// Cancel our local fetch token so the HTTP request is
|
|
738
|
-
// aborted immediately. We own this token, so this is safe.
|
|
739
|
-
fetchCts.cancel();
|
|
740
|
-
return;
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
yield line;
|
|
746
|
-
lineIdx++;
|
|
708
|
+
const cleanedLinesStream = parseResult.lines;
|
|
709
|
+
const diffOptions = {
|
|
710
|
+
emitFastCursorLineChange: responseProcessor_1.ResponseProcessor.mapEmitFastCursorLineChange(this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabProviderEmitFastCursorLineChange, this.expService)),
|
|
711
|
+
nLinesToConverge: this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabNNonSignificantLinesToConverge, this.expService),
|
|
712
|
+
nSignificantLinesToConverge: this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabNSignificantLinesToConverge, this.expService),
|
|
713
|
+
};
|
|
714
|
+
tracer.trace(`starting to diff stream against edit window lines with latency ${fetchRequestStopWatch.elapsed()} ms`);
|
|
715
|
+
// Wrap the line stream to detect early divergence between the user's
|
|
716
|
+
// intermediate edits and the model's streamed output.
|
|
717
|
+
// In `Cursor` mode only the cursor line is checked; in `EditWindow`
|
|
718
|
+
// mode every line in the edit window is checked.
|
|
719
|
+
//
|
|
720
|
+
// We check compatibility using `isModelLineCompatible`: the user's
|
|
721
|
+
// line change must be contained within the model's line change range
|
|
722
|
+
// and match via the helper's `startsWith` / auto-close subsequence rules.
|
|
723
|
+
const earlyDivergenceMode = (0, backwardCompatSetting_1.backwardCompatSetting)(this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabEarlyCursorLineDivergenceCancellation, this.expService), (value) => {
|
|
724
|
+
switch (value) {
|
|
725
|
+
case false:
|
|
726
|
+
case undefined:
|
|
727
|
+
return xtabPromptOptions_1.EarlyDivergenceCancellationMode.Off;
|
|
728
|
+
case true:
|
|
729
|
+
return xtabPromptOptions_1.EarlyDivergenceCancellationMode.Cursor;
|
|
730
|
+
case xtabPromptOptions_1.EarlyDivergenceCancellationMode.Off:
|
|
731
|
+
case xtabPromptOptions_1.EarlyDivergenceCancellationMode.Cursor:
|
|
732
|
+
case xtabPromptOptions_1.EarlyDivergenceCancellationMode.EditWindow:
|
|
733
|
+
return value;
|
|
734
|
+
default:
|
|
735
|
+
return xtabPromptOptions_1.EarlyDivergenceCancellationMode.Off;
|
|
747
736
|
}
|
|
748
|
-
})
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
737
|
+
});
|
|
738
|
+
let lineDiverged = false;
|
|
739
|
+
const divergenceCheckedStream = earlyDivergenceMode === xtabPromptOptions_1.EarlyDivergenceCancellationMode.Off
|
|
740
|
+
? cleanedLinesStream
|
|
741
|
+
: linesWithIntermediateEditDivergenceCheck(cleanedLinesStream, cursorOriginalLinesOffset, request, editWindowLineRange, editWindowLines, fetchCts, tracing, (value) => { lineDiverged = value; }, earlyDivergenceMode);
|
|
742
|
+
let i = 0;
|
|
743
|
+
let hasBeenDelayed = false;
|
|
753
744
|
for await (const edit of responseProcessor_1.ResponseProcessor.diff(editWindowLines, divergenceCheckedStream, cursorOriginalLinesOffset, diffOptions)) {
|
|
754
|
-
if (
|
|
745
|
+
if (lineDiverged) {
|
|
755
746
|
break;
|
|
756
747
|
}
|
|
757
|
-
{
|
|
758
|
-
const fetchFailure = getFetchFailure();
|
|
759
|
-
if (fetchFailure) {
|
|
760
|
-
return fetchFailure;
|
|
761
|
-
}
|
|
762
|
-
}
|
|
763
748
|
tracer.trace(`ResponseProcessor streamed edit #${i} with latency ${fetchRequestStopWatch.elapsed()} ms`);
|
|
764
749
|
const singleLineEdits = [];
|
|
765
750
|
if (edit.lineRange.startLineNumber === edit.lineRange.endLineNumberExclusive || // we don't want to run diff on insertion
|
|
@@ -801,20 +786,16 @@ let XtabProvider = class XtabProvider {
|
|
|
801
786
|
i++;
|
|
802
787
|
}
|
|
803
788
|
}
|
|
804
|
-
if (
|
|
805
|
-
return new statelessNextEditProvider_1.NoNextEditReason.GotCancelled('cursorLineDiverged');
|
|
806
|
-
}
|
|
807
|
-
{
|
|
808
|
-
const fetchFailure = getFetchFailure();
|
|
809
|
-
if (fetchFailure) {
|
|
810
|
-
return fetchFailure;
|
|
811
|
-
}
|
|
789
|
+
if (lineDiverged) {
|
|
790
|
+
return new statelessNextEditProvider_1.NoNextEditReason.GotCancelled(earlyDivergenceMode === xtabPromptOptions_1.EarlyDivergenceCancellationMode.Cursor ? 'cursorLineDiverged' : 'editWindowLineDiverged');
|
|
812
791
|
}
|
|
813
792
|
return new statelessNextEditProvider_1.NoNextEditReason.NoSuggestions(request.documentBeforeEdits, editWindow);
|
|
814
793
|
}
|
|
815
794
|
catch (err) {
|
|
795
|
+
if (err instanceof fetchStreamError_1.FetchStreamError) {
|
|
796
|
+
return err.reason;
|
|
797
|
+
}
|
|
816
798
|
logContext.setError(err);
|
|
817
|
-
// Properly handle the error by pushing it as a result
|
|
818
799
|
return new statelessNextEditProvider_1.NoNextEditReason.Unexpected(errors_1.ErrorUtils.fromUnknown(err));
|
|
819
800
|
}
|
|
820
801
|
}
|
|
@@ -1291,4 +1272,49 @@ function getPredictionContents(doc, editWindowLines, responseFormat) {
|
|
|
1291
1272
|
(0, assert_1.assertNever)(responseFormat);
|
|
1292
1273
|
}
|
|
1293
1274
|
}
|
|
1275
|
+
async function* linesWithIntermediateEditDivergenceCheck(cleanedLinesStream, cursorOriginalLinesOffset, request, editWindowLineRange, editWindowLines, fetchCts, { tracer }, setLineDiverged, mode) {
|
|
1276
|
+
const intermediateEdit = request.intermediateUserEdit;
|
|
1277
|
+
if (!intermediateEdit || intermediateEdit.isEmpty()) {
|
|
1278
|
+
yield* cleanedLinesStream;
|
|
1279
|
+
return;
|
|
1280
|
+
}
|
|
1281
|
+
const transformer = request.documentBeforeEdits.getTransformer();
|
|
1282
|
+
// Precompute the post-edit document once to avoid O(lines * docSize) in EditWindow mode.
|
|
1283
|
+
const currentDoc = intermediateEdit.apply(transformer.text);
|
|
1284
|
+
const currentTransformer = new positionToOffset_1.PositionOffsetTransformer(currentDoc);
|
|
1285
|
+
const precomputed = { currentDoc, currentTransformer };
|
|
1286
|
+
const shouldCheckLine = (lineIdx) => {
|
|
1287
|
+
if (lineIdx >= editWindowLines.length) {
|
|
1288
|
+
return false;
|
|
1289
|
+
}
|
|
1290
|
+
switch (mode) {
|
|
1291
|
+
case xtabPromptOptions_1.EarlyDivergenceCancellationMode.Cursor:
|
|
1292
|
+
return lineIdx === cursorOriginalLinesOffset;
|
|
1293
|
+
case xtabPromptOptions_1.EarlyDivergenceCancellationMode.EditWindow:
|
|
1294
|
+
return true;
|
|
1295
|
+
}
|
|
1296
|
+
};
|
|
1297
|
+
let lineIdx = 0;
|
|
1298
|
+
for await (const line of cleanedLinesStream) {
|
|
1299
|
+
if (shouldCheckLine(lineIdx)) {
|
|
1300
|
+
const docLineIdx = editWindowLineRange.start + lineIdx;
|
|
1301
|
+
const currentLine = (0, cursorLineDivergence_1.getCurrentLine)(transformer, docLineIdx, intermediateEdit, precomputed);
|
|
1302
|
+
if (currentLine !== undefined) {
|
|
1303
|
+
const originalLine = editWindowLines[lineIdx];
|
|
1304
|
+
if (currentLine !== originalLine // user changed this line
|
|
1305
|
+
&& !(0, cursorLineDivergence_1.isModelLineCompatible)(originalLine, currentLine, line) // model's line isn't compatible with user's typing
|
|
1306
|
+
) {
|
|
1307
|
+
setLineDiverged(true);
|
|
1308
|
+
tracer.trace(`Line ${lineIdx} DIVERGED (mode=${mode}): model="${line}" current="${currentLine}"`);
|
|
1309
|
+
// Cancel our local fetch token so the HTTP request is
|
|
1310
|
+
// aborted immediately. We own this token, so this is safe.
|
|
1311
|
+
fetchCts.cancel();
|
|
1312
|
+
return;
|
|
1313
|
+
}
|
|
1314
|
+
}
|
|
1315
|
+
}
|
|
1316
|
+
yield line;
|
|
1317
|
+
lineIdx++;
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1294
1320
|
//# sourceMappingURL=xtabProvider.js.map
|