@vscode/chat-lib 0.44.1 → 0.45.2026041705

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.
Files changed (121) hide show
  1. package/dist/src/_internal/extension/common/constants.d.ts +2 -1
  2. package/dist/src/_internal/extension/common/constants.d.ts.map +1 -1
  3. package/dist/src/_internal/extension/common/constants.js +3 -0
  4. package/dist/src/_internal/extension/common/constants.js.map +1 -1
  5. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/openai/fetch.d.ts.map +1 -1
  6. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/openai/fetch.js +20 -13
  7. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/openai/fetch.js.map +1 -1
  8. package/dist/src/_internal/extension/inlineEdits/common/editRebase.d.ts +8 -0
  9. package/dist/src/_internal/extension/inlineEdits/common/editRebase.d.ts.map +1 -1
  10. package/dist/src/_internal/extension/inlineEdits/common/editRebase.js +56 -0
  11. package/dist/src/_internal/extension/inlineEdits/common/editRebase.js.map +1 -1
  12. package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.d.ts.map +1 -1
  13. package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.js +1 -0
  14. package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.js.map +1 -1
  15. package/dist/src/_internal/extension/inlineEdits/node/rebaseResult.d.ts.map +1 -1
  16. package/dist/src/_internal/extension/inlineEdits/node/rebaseResult.js +10 -3
  17. package/dist/src/_internal/extension/inlineEdits/node/rebaseResult.js.map +1 -1
  18. package/dist/src/_internal/extension/prompt/node/chatMLFetcher.d.ts.map +1 -1
  19. package/dist/src/_internal/extension/prompt/node/chatMLFetcher.js +17 -11
  20. package/dist/src/_internal/extension/prompt/node/chatMLFetcher.js.map +1 -1
  21. package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.d.ts.map +1 -1
  22. package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.js +2 -0
  23. package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.js.map +1 -1
  24. package/dist/src/_internal/extension/xtab/common/fetchStreamError.d.ts +10 -0
  25. package/dist/src/_internal/extension/xtab/common/fetchStreamError.d.ts.map +1 -0
  26. package/dist/src/_internal/extension/xtab/common/fetchStreamError.js +19 -0
  27. package/dist/src/_internal/extension/xtab/common/fetchStreamError.js.map +1 -0
  28. package/dist/src/_internal/extension/xtab/node/cursorLineDivergence.d.ts +12 -9
  29. package/dist/src/_internal/extension/xtab/node/cursorLineDivergence.d.ts.map +1 -1
  30. package/dist/src/_internal/extension/xtab/node/cursorLineDivergence.js +26 -26
  31. package/dist/src/_internal/extension/xtab/node/cursorLineDivergence.js.map +1 -1
  32. package/dist/src/_internal/extension/xtab/node/responseFormatHandlers.d.ts +2 -2
  33. package/dist/src/_internal/extension/xtab/node/responseFormatHandlers.d.ts.map +1 -1
  34. package/dist/src/_internal/extension/xtab/node/responseFormatHandlers.js +6 -31
  35. package/dist/src/_internal/extension/xtab/node/responseFormatHandlers.js.map +1 -1
  36. package/dist/src/_internal/extension/xtab/node/xtabCustomDiffPatchResponseHandler.d.ts +1 -1
  37. package/dist/src/_internal/extension/xtab/node/xtabCustomDiffPatchResponseHandler.d.ts.map +1 -1
  38. package/dist/src/_internal/extension/xtab/node/xtabCustomDiffPatchResponseHandler.js +5 -5
  39. package/dist/src/_internal/extension/xtab/node/xtabCustomDiffPatchResponseHandler.js.map +1 -1
  40. package/dist/src/_internal/extension/xtab/node/xtabProvider.d.ts.map +1 -1
  41. package/dist/src/_internal/extension/xtab/node/xtabProvider.js +157 -131
  42. package/dist/src/_internal/extension/xtab/node/xtabProvider.js.map +1 -1
  43. package/dist/src/_internal/platform/chat/common/chatMLFetcher.d.ts +1 -0
  44. package/dist/src/_internal/platform/chat/common/chatMLFetcher.d.ts.map +1 -1
  45. package/dist/src/_internal/platform/chat/common/chatMLFetcher.js +4 -0
  46. package/dist/src/_internal/platform/chat/common/chatMLFetcher.js.map +1 -1
  47. package/dist/src/_internal/platform/chat/common/chatQuotaService.d.ts +7 -1
  48. package/dist/src/_internal/platform/chat/common/chatQuotaService.d.ts.map +1 -1
  49. package/dist/src/_internal/platform/chat/common/chatQuotaService.js.map +1 -1
  50. package/dist/src/_internal/platform/chat/common/chatQuotaServiceImpl.d.ts +11 -1
  51. package/dist/src/_internal/platform/chat/common/chatQuotaServiceImpl.d.ts.map +1 -1
  52. package/dist/src/_internal/platform/chat/common/chatQuotaServiceImpl.js +76 -16
  53. package/dist/src/_internal/platform/chat/common/chatQuotaServiceImpl.js.map +1 -1
  54. package/dist/src/_internal/platform/chat/common/commonTypes.js +2 -2
  55. package/dist/src/_internal/platform/chat/common/commonTypes.js.map +1 -1
  56. package/dist/src/_internal/platform/configuration/common/configurationService.d.ts +15 -10
  57. package/dist/src/_internal/platform/configuration/common/configurationService.d.ts.map +1 -1
  58. package/dist/src/_internal/platform/configuration/common/configurationService.js +18 -13
  59. package/dist/src/_internal/platform/configuration/common/configurationService.js.map +1 -1
  60. package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.d.ts +3 -3
  61. package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.d.ts.map +1 -1
  62. package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.js +15 -12
  63. package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.js.map +1 -1
  64. package/dist/src/_internal/platform/endpoint/node/chatEndpoint.d.ts +11 -1
  65. package/dist/src/_internal/platform/endpoint/node/chatEndpoint.d.ts.map +1 -1
  66. package/dist/src/_internal/platform/endpoint/node/chatEndpoint.js +28 -58
  67. package/dist/src/_internal/platform/endpoint/node/chatEndpoint.js.map +1 -1
  68. package/dist/src/_internal/platform/endpoint/node/imageLimits.d.ts +14 -0
  69. package/dist/src/_internal/platform/endpoint/node/imageLimits.d.ts.map +1 -0
  70. package/dist/src/_internal/platform/endpoint/node/imageLimits.js +156 -0
  71. package/dist/src/_internal/platform/endpoint/node/imageLimits.js.map +1 -0
  72. package/dist/src/_internal/platform/endpoint/node/messagesApi.d.ts +4 -12
  73. package/dist/src/_internal/platform/endpoint/node/messagesApi.d.ts.map +1 -1
  74. package/dist/src/_internal/platform/endpoint/node/messagesApi.js +13 -152
  75. package/dist/src/_internal/platform/endpoint/node/messagesApi.js.map +1 -1
  76. package/dist/src/_internal/platform/endpoint/node/responsesApi.d.ts +4 -1
  77. package/dist/src/_internal/platform/endpoint/node/responsesApi.d.ts.map +1 -1
  78. package/dist/src/_internal/platform/endpoint/node/responsesApi.js +70 -31
  79. package/dist/src/_internal/platform/endpoint/node/responsesApi.js.map +1 -1
  80. package/dist/src/_internal/platform/git/common/gitService.d.ts +2 -9
  81. package/dist/src/_internal/platform/git/common/gitService.d.ts.map +1 -1
  82. package/dist/src/_internal/platform/git/common/gitService.js.map +1 -1
  83. package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.d.ts +15 -0
  84. package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.d.ts.map +1 -1
  85. package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.js +17 -1
  86. package/dist/src/_internal/platform/inlineEdits/common/dataTypes/xtabPromptOptions.js.map +1 -1
  87. package/dist/src/_internal/platform/networking/common/anthropic.d.ts +0 -42
  88. package/dist/src/_internal/platform/networking/common/anthropic.d.ts.map +1 -1
  89. package/dist/src/_internal/platform/networking/common/anthropic.js +1 -30
  90. package/dist/src/_internal/platform/networking/common/anthropic.js.map +1 -1
  91. package/dist/src/_internal/platform/networking/common/fetch.d.ts +0 -12
  92. package/dist/src/_internal/platform/networking/common/fetch.d.ts.map +1 -1
  93. package/dist/src/_internal/platform/networking/common/fetch.js +5 -1
  94. package/dist/src/_internal/platform/networking/common/fetch.js.map +1 -1
  95. package/dist/src/_internal/platform/networking/node/chatWebSocketManager.d.ts +1 -0
  96. package/dist/src/_internal/platform/networking/node/chatWebSocketManager.d.ts.map +1 -1
  97. package/dist/src/_internal/platform/networking/node/chatWebSocketManager.js +3 -3
  98. package/dist/src/_internal/platform/networking/node/chatWebSocketManager.js.map +1 -1
  99. package/dist/src/_internal/platform/otel/common/genAiEvents.d.ts.map +1 -1
  100. package/dist/src/_internal/platform/otel/common/genAiEvents.js +10 -2
  101. package/dist/src/_internal/platform/otel/common/genAiEvents.js.map +1 -1
  102. package/dist/src/_internal/platform/otel/common/index.d.ts +1 -1
  103. package/dist/src/_internal/platform/otel/common/index.d.ts.map +1 -1
  104. package/dist/src/_internal/platform/otel/common/index.js +2 -1
  105. package/dist/src/_internal/platform/otel/common/index.js.map +1 -1
  106. package/dist/src/_internal/platform/otel/common/messageFormatters.d.ts +13 -1
  107. package/dist/src/_internal/platform/otel/common/messageFormatters.d.ts.map +1 -1
  108. package/dist/src/_internal/platform/otel/common/messageFormatters.js +98 -0
  109. package/dist/src/_internal/platform/otel/common/messageFormatters.js.map +1 -1
  110. package/dist/src/_internal/platform/requestLogger/common/requestLogger.d.ts +0 -1
  111. package/dist/src/_internal/platform/requestLogger/common/requestLogger.d.ts.map +1 -1
  112. package/dist/src/_internal/platform/requestLogger/common/requestLogger.js.map +1 -1
  113. package/dist/src/_internal/platform/requestLogger/node/nullRequestLogger.d.ts +2 -3
  114. package/dist/src/_internal/platform/requestLogger/node/nullRequestLogger.d.ts.map +1 -1
  115. package/dist/src/_internal/platform/requestLogger/node/nullRequestLogger.js +1 -3
  116. package/dist/src/_internal/platform/requestLogger/node/nullRequestLogger.js.map +1 -1
  117. package/dist/src/_internal/platform/requestLogger/node/requestLogger.d.ts +0 -1
  118. package/dist/src/_internal/platform/requestLogger/node/requestLogger.d.ts.map +1 -1
  119. package/dist/src/_internal/platform/requestLogger/node/requestLogger.js.map +1 -1
  120. package/dist/src/package.json +6475 -6412
  121. 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, getFetchFailure, getResponseSoFar, fetchRequestStopWatch) {
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
- // this's a way to signal the edit-pushing code to know if the request failed and
581
- // it shouldn't push edits constructed from an erroneous response
582
- chatResponseFailure = response.type !== commonTypes_1.ChatFetchResponseType.Success ? response : undefined;
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, getFetchFailure, () => responseSoFar, fetchRequestStopWatch);
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, getFetchFailure, getResponseSoFar, fetchRequestStopWatch } = fetchResult;
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
- switch (responseOpts.responseFormat) {
644
- case xtabPromptOptions.ResponseFormat.EditWindowOnly: {
645
- parseResult = (0, responseFormatHandlers_1.handleEditWindowOnly)(linesStream);
646
- break;
647
- }
648
- case xtabPromptOptions.ResponseFormat.CodeBlock: {
649
- parseResult = (0, responseFormatHandlers_1.handleCodeBlock)(linesStream);
650
- break;
651
- }
652
- case xtabPromptOptions.ResponseFormat.EditWindowWithEditIntent:
653
- case xtabPromptOptions.ResponseFormat.EditWindowWithEditIntentShort: {
654
- const parseMode = responseOpts.responseFormat === xtabPromptOptions.ResponseFormat.EditWindowWithEditIntentShort
655
- ? editIntent_1.EditIntentParseMode.ShortName
656
- : editIntent_1.EditIntentParseMode.Tags;
657
- parseResult = await (0, responseFormatHandlers_1.handleEditWindowWithEditIntent)(linesStream, tracer, parseMode, getFetchFailure);
658
- break;
659
- }
660
- case xtabPromptOptions.ResponseFormat.CustomDiffPatch: {
661
- const activeDoc = request.getActiveDocument();
662
- const currentDocument = promptPieces.currentDocument;
663
- const lastLine = currentDocument.lines[clippedTaggedCurrentDoc.keptRange.endExclusive - 1];
664
- const lastLineLength = lastLine.length;
665
- const pseudoEditWindow = currentDocument.transformer.getOffsetRange(new range_1.Range(clippedTaggedCurrentDoc.keptRange.start + 1, 1, clippedTaggedCurrentDoc.keptRange.endExclusive, lastLineLength + 1));
666
- parseResult = new responseFormatHandlers_1.ResponseParseResult.DirectEdits(xtabCustomDiffPatchResponseHandler_1.XtabCustomDiffPatchResponseHandler.handleResponse(linesStream, currentDocument, activeDoc.id, activeDoc.workspaceRoot, pseudoEditWindow, tracer, getFetchFailure));
667
- break;
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
- case xtabPromptOptions.ResponseFormat.UnifiedWithXml: {
670
- parseResult = await (0, responseFormatHandlers_1.handleUnifiedWithXml)(linesStream, {
671
- editWindowLines,
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
- default:
683
- (0, assert_1.assertNever)(responseOpts.responseFormat);
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
- if (!xtabPromptOptions.EditIntent.shouldShowEdit(intent, promptPieces.aggressivenessLevel)) {
700
- tracer.trace(`Filtered out edit due to edit intent "${intent}" with aggressiveness "${promptPieces.aggressivenessLevel}"`);
701
- return new statelessNextEditProvider_1.NoNextEditReason.FilteredOut(`editIntent:${intent} aggressivenessLevel:${promptPieces.aggressivenessLevel}`);
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
- const cleanedLinesStream = parseResult.lines;
705
- const diffOptions = {
706
- emitFastCursorLineChange: responseProcessor_1.ResponseProcessor.mapEmitFastCursorLineChange(this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabProviderEmitFastCursorLineChange, this.expService)),
707
- nLinesToConverge: this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabNNonSignificantLinesToConverge, this.expService),
708
- nSignificantLinesToConverge: this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabNSignificantLinesToConverge, this.expService),
709
- };
710
- tracer.trace(`starting to diff stream against edit window lines with latency ${fetchRequestStopWatch.elapsed()} ms`);
711
- // Wrap the line stream to detect early cursor-line divergence.
712
- // If the user has typed at the cursor since the request started and the cursor line
713
- // in the model's response doesn't match what the user currently has, the response
714
- // is stale and we can cancel early instead of waiting for the full response.
715
- //
716
- // We check compatibility using `isModelCursorLineCompatible`: the user's
717
- // cursor-line change must be contained within the model's cursor-line change range
718
- // and match via the helper's `startsWith` / auto-close subsequence rules.
719
- const earlyCursorLineDivergenceCancellation = this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabEarlyCursorLineDivergenceCancellation, this.expService);
720
- let cursorLineDiverged = false;
721
- const divergenceCheckedStream = earlyCursorLineDivergenceCancellation
722
- ? (async function* () {
723
- let lineIdx = 0;
724
- for await (const line of cleanedLinesStream) {
725
- if (lineIdx === cursorOriginalLinesOffset) {
726
- const intermediateEdit = request.intermediateUserEdit;
727
- if (intermediateEdit && !intermediateEdit.isEmpty()) {
728
- const cursorDocLineIdx = editWindowLineRange.start + cursorOriginalLinesOffset;
729
- const currentCursorLine = (0, cursorLineDivergence_1.getCurrentCursorLine)(request.documentBeforeEdits.getTransformer(), cursorDocLineIdx, intermediateEdit);
730
- if (currentCursorLine !== undefined) {
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
- : cleanedLinesStream;
750
- let i = 0;
751
- let hasBeenDelayed = false;
752
- try {
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 (cursorLineDiverged) {
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 (cursorLineDiverged) {
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