@vscode/chat-lib 0.1.1-9 → 0.1.2-0

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 (96) hide show
  1. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/prompt/contextProviderRegistry.d.ts.map +1 -1
  2. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/prompt/contextProviderRegistry.js +1 -1
  3. package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/prompt/contextProviderRegistry.js.map +1 -1
  4. package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.d.ts +0 -1
  5. package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.d.ts.map +1 -1
  6. package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.d.ts.map +1 -1
  7. package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.js +21 -66
  8. package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.js.map +1 -1
  9. package/dist/src/_internal/extension/inlineEdits/node/nextEditProviderTelemetry.d.ts +1 -1
  10. package/dist/src/_internal/extension/inlineEdits/node/nextEditProviderTelemetry.d.ts.map +1 -1
  11. package/dist/src/_internal/extension/inlineEdits/node/nextEditResult.d.ts +6 -3
  12. package/dist/src/_internal/extension/inlineEdits/node/nextEditResult.d.ts.map +1 -1
  13. package/dist/src/_internal/extension/inlineEdits/node/nextEditResult.js.map +1 -1
  14. package/dist/src/_internal/extension/prompt/node/chatMLFetcher.d.ts +1 -1
  15. package/dist/src/_internal/extension/prompt/node/chatMLFetcher.d.ts.map +1 -1
  16. package/dist/src/_internal/extension/prompt/node/chatMLFetcher.js +19 -19
  17. package/dist/src/_internal/extension/prompt/node/chatMLFetcher.js.map +1 -1
  18. package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.d.ts +2 -3
  19. package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.d.ts.map +1 -1
  20. package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.js +8 -4
  21. package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.js.map +1 -1
  22. package/dist/src/_internal/extension/xtab/common/promptCrafting.d.ts +616 -0
  23. package/dist/src/_internal/extension/xtab/common/promptCrafting.d.ts.map +1 -1
  24. package/dist/src/_internal/extension/xtab/common/promptCrafting.js +46 -1
  25. package/dist/src/_internal/extension/xtab/common/promptCrafting.js.map +1 -1
  26. package/dist/src/_internal/extension/xtab/node/xtabNextCursorPredictor.d.ts +18 -0
  27. package/dist/src/_internal/extension/xtab/node/xtabNextCursorPredictor.d.ts.map +1 -0
  28. package/dist/src/_internal/extension/xtab/node/xtabNextCursorPredictor.js +156 -0
  29. package/dist/src/_internal/extension/xtab/node/xtabNextCursorPredictor.js.map +1 -0
  30. package/dist/src/_internal/extension/xtab/node/xtabProvider.d.ts +5 -11
  31. package/dist/src/_internal/extension/xtab/node/xtabProvider.d.ts.map +1 -1
  32. package/dist/src/_internal/extension/xtab/node/xtabProvider.js +67 -223
  33. package/dist/src/_internal/extension/xtab/node/xtabProvider.js.map +1 -1
  34. package/dist/src/_internal/extension/xtab/node/xtabUtils.d.ts +6 -0
  35. package/dist/src/_internal/extension/xtab/node/xtabUtils.d.ts.map +1 -1
  36. package/dist/src/_internal/extension/xtab/node/xtabUtils.js +20 -0
  37. package/dist/src/_internal/extension/xtab/node/xtabUtils.js.map +1 -1
  38. package/dist/src/_internal/platform/configuration/common/configurationService.d.ts +8 -7
  39. package/dist/src/_internal/platform/configuration/common/configurationService.d.ts.map +1 -1
  40. package/dist/src/_internal/platform/configuration/common/configurationService.js +11 -10
  41. package/dist/src/_internal/platform/configuration/common/configurationService.js.map +1 -1
  42. package/dist/src/_internal/platform/configuration/common/defaultsOnlyConfigurationService.d.ts.map +1 -1
  43. package/dist/src/_internal/platform/configuration/common/defaultsOnlyConfigurationService.js +27 -0
  44. package/dist/src/_internal/platform/configuration/common/defaultsOnlyConfigurationService.js.map +1 -1
  45. package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.js +2 -2
  46. package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.js.map +1 -1
  47. package/dist/src/_internal/platform/endpoint/node/chatEndpoint.js +1 -1
  48. package/dist/src/_internal/platform/endpoint/node/chatEndpoint.js.map +1 -1
  49. package/dist/src/_internal/platform/endpoint/node/messagesApi.d.ts.map +1 -1
  50. package/dist/src/_internal/platform/endpoint/node/messagesApi.js +12 -4
  51. package/dist/src/_internal/platform/endpoint/node/messagesApi.js.map +1 -1
  52. package/dist/src/_internal/platform/github/common/githubService.d.ts +28 -9
  53. package/dist/src/_internal/platform/github/common/githubService.d.ts.map +1 -1
  54. package/dist/src/_internal/platform/github/common/githubService.js.map +1 -1
  55. package/dist/src/_internal/platform/inlineEdits/common/inlineEditLogContext.d.ts +2 -0
  56. package/dist/src/_internal/platform/inlineEdits/common/inlineEditLogContext.d.ts.map +1 -1
  57. package/dist/src/_internal/platform/inlineEdits/common/inlineEditLogContext.js +13 -0
  58. package/dist/src/_internal/platform/inlineEdits/common/inlineEditLogContext.js.map +1 -1
  59. package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.d.ts +4 -4
  60. package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.d.ts.map +1 -1
  61. package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.js.map +1 -1
  62. package/dist/src/_internal/platform/inlineEdits/common/utils/utils.d.ts +1 -0
  63. package/dist/src/_internal/platform/inlineEdits/common/utils/utils.d.ts.map +1 -1
  64. package/dist/src/_internal/platform/inlineEdits/common/utils/utils.js +5 -0
  65. package/dist/src/_internal/platform/inlineEdits/common/utils/utils.js.map +1 -1
  66. package/dist/src/_internal/platform/languageContextProvider/common/languageContextProviderService.d.ts +7 -3
  67. package/dist/src/_internal/platform/languageContextProvider/common/languageContextProviderService.d.ts.map +1 -1
  68. package/dist/src/_internal/platform/languageContextProvider/common/languageContextProviderService.js +6 -1
  69. package/dist/src/_internal/platform/languageContextProvider/common/languageContextProviderService.js.map +1 -1
  70. package/dist/src/_internal/platform/languageContextProvider/common/nullLanguageContextProviderService.d.ts +2 -2
  71. package/dist/src/_internal/platform/languageContextProvider/common/nullLanguageContextProviderService.d.ts.map +1 -1
  72. package/dist/src/_internal/platform/languageContextProvider/common/nullLanguageContextProviderService.js +1 -1
  73. package/dist/src/_internal/platform/languageContextProvider/common/nullLanguageContextProviderService.js.map +1 -1
  74. package/dist/src/_internal/platform/requestLogger/common/capturingToken.d.ts +31 -0
  75. package/dist/src/_internal/platform/requestLogger/common/capturingToken.d.ts.map +1 -0
  76. package/dist/src/_internal/platform/requestLogger/common/capturingToken.js +31 -0
  77. package/dist/src/_internal/platform/requestLogger/common/capturingToken.js.map +1 -0
  78. package/dist/src/_internal/platform/requestLogger/node/requestLogger.d.ts +8 -7
  79. package/dist/src/_internal/platform/requestLogger/node/requestLogger.d.ts.map +1 -1
  80. package/dist/src/_internal/platform/requestLogger/node/requestLogger.js.map +1 -1
  81. package/dist/src/_internal/util/common/test/shims/chatTypes.d.ts +5 -3
  82. package/dist/src/_internal/util/common/test/shims/chatTypes.d.ts.map +1 -1
  83. package/dist/src/_internal/util/common/test/shims/chatTypes.js +2 -1
  84. package/dist/src/_internal/util/common/test/shims/chatTypes.js.map +1 -1
  85. package/dist/src/_internal/util/common/tracing.d.ts +21 -2
  86. package/dist/src/_internal/util/common/tracing.d.ts.map +1 -1
  87. package/dist/src/_internal/util/common/tracing.js +51 -29
  88. package/dist/src/_internal/util/common/tracing.js.map +1 -1
  89. package/dist/src/main.js +1 -1
  90. package/dist/src/main.js.map +1 -1
  91. package/dist/src/package.json +23 -28
  92. package/package.json +2 -2
  93. package/dist/src/_internal/extension/inlineEdits/common/jumpToCursorPosition.d.ts +0 -2
  94. package/dist/src/_internal/extension/inlineEdits/common/jumpToCursorPosition.d.ts.map +0 -1
  95. package/dist/src/_internal/extension/inlineEdits/common/jumpToCursorPosition.js +0 -9
  96. package/dist/src/_internal/extension/inlineEdits/common/jumpToCursorPosition.js.map +0 -1
@@ -49,15 +49,10 @@ var XtabProvider_1;
49
49
  Object.defineProperty(exports, "__esModule", { value: true });
50
50
  exports.XtabProvider = void 0;
51
51
  exports.findMergeConflictMarkersRange = findMergeConflictMarkersRange;
52
- const copilot_api_1 = require("@vscode/copilot-api");
53
- const prompt_tsx_1 = require("@vscode/prompt-tsx");
54
- const rawTypes_1 = require("@vscode/prompt-tsx/dist/base/output/rawTypes");
55
52
  const chatMLFetcher_1 = require("../../../platform/chat/common/chatMLFetcher");
56
53
  const commonTypes_1 = require("../../../platform/chat/common/commonTypes");
57
- const globalStringUtils_1 = require("../../../platform/chat/common/globalStringUtils");
58
54
  const configurationService_1 = require("../../../platform/configuration/common/configurationService");
59
55
  const diffService_1 = require("../../../platform/diff/common/diffService");
60
- const chatEndpoint_1 = require("../../../platform/endpoint/node/chatEndpoint");
61
56
  const proxyXtabEndpoint_1 = require("../../../platform/endpoint/node/proxyXtabEndpoint");
62
57
  const ignoreService_1 = require("../../../platform/ignore/common/ignoreService");
63
58
  const nextCursorLinePrediction_1 = require("../../../platform/inlineEdits/common/dataTypes/nextCursorLinePrediction");
@@ -68,7 +63,6 @@ const statelessNextEditProviders_1 = require("../../../platform/inlineEdits/comm
68
63
  const languageContextProviderService_1 = require("../../../platform/languageContextProvider/common/languageContextProviderService");
69
64
  const languageDiagnosticsService_1 = require("../../../platform/languages/common/languageDiagnosticsService");
70
65
  const languageContextService_1 = require("../../../platform/languageServer/common/languageContextService");
71
- const logService_1 = require("../../../platform/log/common/logService");
72
66
  const simulationTestContext_1 = require("../../../platform/simulationTestContext/common/simulationTestContext");
73
67
  const nullExperimentationService_1 = require("../../../platform/telemetry/common/nullExperimentationService");
74
68
  const telemetry_1 = require("../../../platform/telemetry/common/telemetry");
@@ -76,14 +70,10 @@ const workspaceService_1 = require("../../../platform/workspace/common/workspace
76
70
  const async_1 = require("../../../util/common/async");
77
71
  const errors = __importStar(require("../../../util/common/errors"));
78
72
  const result_1 = require("../../../util/common/result");
79
- const tokenizer_1 = require("../../../util/common/tokenizer");
80
- const tracing_1 = require("../../../util/common/tracing");
81
73
  const assert_1 = require("../../../util/vs/base/common/assert");
82
74
  const async_2 = require("../../../util/vs/base/common/async");
83
- const cancellation_1 = require("../../../util/vs/base/common/cancellation");
84
75
  const stopwatch_1 = require("../../../util/vs/base/common/stopwatch");
85
76
  const lineEdit_1 = require("../../../util/vs/editor/common/core/edits/lineEdit");
86
- const stringEdit_1 = require("../../../util/vs/editor/common/core/edits/stringEdit");
87
77
  const position_1 = require("../../../util/vs/editor/common/core/position");
88
78
  const range_1 = require("../../../util/vs/editor/common/core/range");
89
79
  const lineRange_1 = require("../../../util/vs/editor/common/core/ranges/lineRange");
@@ -98,19 +88,19 @@ const systemMessages_1 = require("../common/systemMessages");
98
88
  const tags_1 = require("../common/tags");
99
89
  const xtabCurrentDocument_1 = require("../common/xtabCurrentDocument");
100
90
  const xtabEndpoint_1 = require("./xtabEndpoint");
91
+ const xtabNextCursorPredictor_1 = require("./xtabNextCursorPredictor");
101
92
  const xtabUtils_1 = require("./xtabUtils");
102
93
  let XtabProvider = class XtabProvider {
103
94
  static { XtabProvider_1 = this; }
104
95
  static { this.ID = configurationService_1.XTabProviderId; }
105
96
  static { this.computeTokens = (s) => Math.floor(s.length / 4); }
106
- constructor(simulationCtx, instaService, workspaceService, diffService, configService, expService, logService, langCtxService, langDiagService, ignoreService, telemetryService) {
97
+ constructor(simulationCtx, instaService, workspaceService, diffService, configService, expService, langCtxService, langDiagService, ignoreService, telemetryService) {
107
98
  this.simulationCtx = simulationCtx;
108
99
  this.instaService = instaService;
109
100
  this.workspaceService = workspaceService;
110
101
  this.diffService = diffService;
111
102
  this.configService = configService;
112
103
  this.expService = expService;
113
- this.logService = logService;
114
104
  this.langCtxService = langCtxService;
115
105
  this.langDiagService = langDiagService;
116
106
  this.ignoreService = ignoreService;
@@ -120,7 +110,7 @@ let XtabProvider = class XtabProvider {
120
110
  this.showNextEditPreference = "always" /* ShowNextEditPreference.Always */;
121
111
  this.forceUseDefaultModel = false;
122
112
  this.delayer = new delayer_1.Delayer(this.configService, this.expService);
123
- this.tracer = (0, tracing_1.createTracer)(['NES', 'XtabProvider'], (s) => this.logService.trace(s));
113
+ this.nextCursorPredictor = this.instaService.createInstance(xtabNextCursorPredictor_1.XtabNextCursorPredictor, XtabProvider_1.computeTokens);
124
114
  }
125
115
  handleAcceptance() {
126
116
  this.delayer.handleAcceptance();
@@ -128,7 +118,7 @@ let XtabProvider = class XtabProvider {
128
118
  handleRejection() {
129
119
  this.delayer.handleRejection();
130
120
  }
131
- provideNextEdit(request, pushEdit, logContext, cancellationToken) {
121
+ provideNextEdit(request, pushEdit, tracer, logContext, cancellationToken) {
132
122
  const filteringPushEdit = (result) => {
133
123
  if (result.isError()) {
134
124
  pushEdit(result);
@@ -141,7 +131,7 @@ let XtabProvider = class XtabProvider {
141
131
  }
142
132
  pushEdit(result);
143
133
  };
144
- return this._provideNextEdit(request, filteringPushEdit, logContext, cancellationToken);
134
+ return this._provideNextEdit(request, filteringPushEdit, tracer, logContext, cancellationToken);
145
135
  }
146
136
  filterEdit(activeDoc, edits) {
147
137
  const filters = [
@@ -168,7 +158,7 @@ let XtabProvider = class XtabProvider {
168
158
  }
169
159
  return filters.reduce((acc, filter) => filter(acc), edits);
170
160
  }
171
- async _provideNextEdit(request, pushEdit, logContext, cancellationToken) {
161
+ async _provideNextEdit(request, pushEdit, tracer, logContext, cancellationToken) {
172
162
  const telemetry = new statelessNextEditProvider_1.StatelessNextEditTelemetryBuilder(request);
173
163
  logContext.setProviderStartTime();
174
164
  try {
@@ -176,13 +166,10 @@ let XtabProvider = class XtabProvider {
176
166
  return statelessNextEditProvider_1.StatelessNextEditResult.noEdit(new statelessNextEditProvider_1.NoNextEditReason.ActiveDocumentHasNoEdits(), telemetry);
177
167
  }
178
168
  const delaySession = this.delayer.createDelaySession(request.providerRequestStartDateTime);
179
- const nextEditResult = await this.doGetNextEdit(request, pushEdit, delaySession, logContext, cancellationToken, telemetry, 0 /* RetryState.NotRetrying */);
169
+ const nextEditResult = await this.doGetNextEdit(request, pushEdit, delaySession, tracer, logContext, cancellationToken, telemetry, 0 /* RetryState.NotRetrying */);
180
170
  if (nextEditResult.isError() && nextEditResult.err instanceof statelessNextEditProvider_1.NoNextEditReason.GotCancelled) {
181
171
  logContext.setIsSkipped();
182
172
  }
183
- if (nextEditResult.isOk()) {
184
- await this.enforceArtificialDelay(delaySession, telemetry);
185
- }
186
173
  return new statelessNextEditProvider_1.StatelessNextEditResult(nextEditResult, telemetry.build(nextEditResult));
187
174
  }
188
175
  catch (err) {
@@ -192,11 +179,11 @@ let XtabProvider = class XtabProvider {
192
179
  logContext.setProviderEndTime();
193
180
  }
194
181
  }
195
- async doGetNextEdit(request, pushEdit, delaySession, logContext, cancellationToken, telemetryBuilder, retryState) {
196
- return this.doGetNextEditWithSelection(request, (0, nearbyCursorInlineEditProvider_1.getOrDeduceSelectionFromLastEdit)(request.getActiveDocument()), pushEdit, delaySession, { showLabel: false }, logContext, cancellationToken, telemetryBuilder, retryState);
182
+ async doGetNextEdit(request, pushEdit, delaySession, tracer, logContext, cancellationToken, telemetryBuilder, retryState) {
183
+ return this.doGetNextEditWithSelection(request, (0, nearbyCursorInlineEditProvider_1.getOrDeduceSelectionFromLastEdit)(request.getActiveDocument()), pushEdit, delaySession, tracer, logContext, cancellationToken, telemetryBuilder, retryState);
197
184
  }
198
- async doGetNextEditWithSelection(request, selection, pushEdit, delaySession, opts, logContext, cancellationToken, telemetryBuilder, retryState) {
199
- const tracer = this.tracer.sub('doGetNextEditWithSelection');
185
+ async doGetNextEditWithSelection(request, selection, pushEdit, delaySession, parentTracer, logContext, cancellationToken, telemetryBuilder, retryState) {
186
+ const tracer = parentTracer.sub(['XtabProvider', 'doGetNextEditWithSelection']);
200
187
  const activeDocument = request.getActiveDocument();
201
188
  if (selection === null) {
202
189
  return result_1.Result.error(new statelessNextEditProvider_1.NoNextEditReason.Uncategorized(new Error('NoSelection')));
@@ -219,7 +206,7 @@ let XtabProvider = class XtabProvider {
219
206
  }
220
207
  telemetryBuilder.setIsCursorAtLineEnd(isCursorAtEndOfLine);
221
208
  const areaAroundEditWindowLinesRange = this.computeAreaAroundEditWindowLinesRange(currentDocument);
222
- const editWindowLinesRange = this.computeEditWindowLinesRange(currentDocument, request, retryState, telemetryBuilder);
209
+ const editWindowLinesRange = this.computeEditWindowLinesRange(currentDocument, request, retryState, tracer, telemetryBuilder);
223
210
  const cursorOriginalLinesOffset = Math.max(0, currentDocument.cursorLineOffset - editWindowLinesRange.start);
224
211
  const editWindowLastLineLength = currentDocument.transformer.getLineLength(editWindowLinesRange.endExclusive);
225
212
  const editWindow = currentDocument.transformer.getOffsetRange(new range_1.Range(editWindowLinesRange.start + 1, 1, editWindowLinesRange.endExclusive, editWindowLastLineLength + 1));
@@ -231,13 +218,13 @@ let XtabProvider = class XtabProvider {
231
218
  // Expected: editWindow.substring(activeDocument.documentAfterEdits.value) === editWindowLines.join('\n')
232
219
  const doesIncludeCursorTag = editWindowLines.some(line => line.includes(tags_1.PromptTags.CURSOR));
233
220
  const shouldRemoveCursorTagFromResponse = !doesIncludeCursorTag; // we'd like to remove the tag only if the original edit-window didn't include the tag
234
- const taggedCurrentFileContentResult = this.constructTaggedFile(currentDocument, editWindowLinesRange, areaAroundEditWindowLinesRange, promptOptions, XtabProvider_1.computeTokens, { includeLineNumbers: { areaAroundCodeToEdit: false, currentFileContent: false } });
221
+ const taggedCurrentFileContentResult = (0, promptCrafting_1.constructTaggedFile)(currentDocument, editWindowLinesRange, areaAroundEditWindowLinesRange, promptOptions, XtabProvider_1.computeTokens, { includeLineNumbers: { areaAroundCodeToEdit: false, currentFileContent: false } });
235
222
  if (taggedCurrentFileContentResult.isError()) {
236
223
  return result_1.Result.error(new statelessNextEditProvider_1.NoNextEditReason.PromptTooLarge('currentFile'));
237
224
  }
238
225
  const { taggedCurrentDocLines, areaAroundCodeToEdit } = taggedCurrentFileContentResult.val;
239
226
  telemetryBuilder.setNLinesOfCurrentFileInPrompt(taggedCurrentDocLines.length);
240
- const langCtx = await this.getAndProcessLanguageContext(request, delaySession, activeDocument, cursorPosition, promptOptions, logContext, cancellationToken);
227
+ const langCtx = await this.getAndProcessLanguageContext(request, delaySession, activeDocument, cursorPosition, promptOptions, tracer, logContext, cancellationToken);
241
228
  if (cancellationToken.isCancellationRequested) {
242
229
  return result_1.Result.error(new statelessNextEditProvider_1.NoNextEditReason.GotCancelled('afterLanguageContextAwait'));
243
230
  }
@@ -245,82 +232,37 @@ let XtabProvider = class XtabProvider {
245
232
  const userPrompt = (0, promptCrafting_1.getUserPrompt)(promptPieces);
246
233
  const responseFormat = xtabPromptOptions.ResponseFormat.fromPromptingStrategy(promptOptions.promptingStrategy);
247
234
  const prediction = this.getPredictedOutput(editWindowLines, responseFormat);
248
- const messages = constructMessages({
235
+ const messages = (0, xtabUtils_1.constructMessages)({
249
236
  systemMsg: this.pickSystemPrompt(promptOptions.promptingStrategy),
250
237
  userMsg: userPrompt,
251
238
  });
252
239
  logContext.setPrompt(messages);
253
240
  telemetryBuilder.setPrompt(messages);
254
241
  const HARD_CHAR_LIMIT = 30000 * 4; // 30K tokens, assuming 4 chars per token -- we use approximation here because counting tokens exactly is time-consuming
255
- const promptCharCount = charCount(messages);
242
+ const promptCharCount = (0, xtabUtils_1.charCount)(messages);
256
243
  if (promptCharCount > HARD_CHAR_LIMIT) {
257
244
  return result_1.Result.error(new statelessNextEditProvider_1.NoNextEditReason.PromptTooLarge('final'));
258
245
  }
259
- await this.debounce(delaySession, telemetryBuilder);
246
+ await this.debounce(delaySession, tracer, telemetryBuilder);
260
247
  if (cancellationToken.isCancellationRequested) {
261
248
  return result_1.Result.error(new statelessNextEditProvider_1.NoNextEditReason.GotCancelled('afterDebounce'));
262
249
  }
263
250
  request.fetchIssued = true;
264
251
  const cursorLineOffset = cursorPosition.column;
265
252
  this.streamEdits(request, pushEdit, endpoint, messages, editWindow, editWindowLines, cursorOriginalLinesOffset, cursorLineOffset, editWindowLinesRange, promptPieces, prediction, {
266
- showLabel: opts.showLabel,
267
253
  shouldRemoveCursorTagFromResponse,
268
254
  responseFormat,
269
255
  retryState,
270
256
  }, delaySession, tracer, telemetryBuilder, logContext, cancellationToken);
271
257
  return result_1.Result.ok(undefined);
272
258
  }
273
- constructTaggedFile(currentDocument, editWindowLinesRange, areaAroundEditWindowLinesRange, promptOptions, computeTokens, opts) {
274
- const contentWithCursorAsLinesOriginal = (() => {
275
- const addCursorTagEdit = stringEdit_1.StringEdit.single(stringEdit_1.StringReplacement.insert(currentDocument.cursorOffset, tags_1.PromptTags.CURSOR));
276
- const contentWithCursor = addCursorTagEdit.applyOnText(currentDocument.content);
277
- return contentWithCursor.getLines();
278
- })();
279
- const addLineNumbers = (lines) => lines.map((line, idx) => `${idx}| ${line}`);
280
- const contentWithCursorAsLines = opts.includeLineNumbers.areaAroundCodeToEdit
281
- ? addLineNumbers(contentWithCursorAsLinesOriginal)
282
- : contentWithCursorAsLinesOriginal;
283
- const editWindowWithCursorAsLines = contentWithCursorAsLines.slice(editWindowLinesRange.start, editWindowLinesRange.endExclusive);
284
- const areaAroundCodeToEdit = [
285
- tags_1.PromptTags.AREA_AROUND.start,
286
- ...contentWithCursorAsLines.slice(areaAroundEditWindowLinesRange.start, editWindowLinesRange.start),
287
- tags_1.PromptTags.EDIT_WINDOW.start,
288
- ...editWindowWithCursorAsLines,
289
- tags_1.PromptTags.EDIT_WINDOW.end,
290
- ...contentWithCursorAsLines.slice(editWindowLinesRange.endExclusive, areaAroundEditWindowLinesRange.endExclusive),
291
- tags_1.PromptTags.AREA_AROUND.end
292
- ].join('\n');
293
- const currentFileContentWithCursorLines = opts.includeLineNumbers.currentFileContent
294
- ? addLineNumbers(contentWithCursorAsLinesOriginal)
295
- : contentWithCursorAsLinesOriginal;
296
- const currentFileContentLines = opts.includeLineNumbers.currentFileContent
297
- ? addLineNumbers(currentDocument.lines)
298
- : currentDocument.lines;
299
- let areaAroundCodeToEditForCurrentFile;
300
- if (promptOptions.currentFile.includeTags && opts.includeLineNumbers.currentFileContent === opts.includeLineNumbers.areaAroundCodeToEdit) {
301
- areaAroundCodeToEditForCurrentFile = areaAroundCodeToEdit;
302
- }
303
- else {
304
- const editWindowLines = currentFileContentLines.slice(editWindowLinesRange.start, editWindowLinesRange.endExclusive);
305
- areaAroundCodeToEditForCurrentFile = [
306
- ...currentFileContentWithCursorLines.slice(areaAroundEditWindowLinesRange.start, editWindowLinesRange.start),
307
- ...editWindowLines,
308
- ...currentFileContentWithCursorLines.slice(editWindowLinesRange.endExclusive, areaAroundEditWindowLinesRange.endExclusive),
309
- ].join('\n');
310
- }
311
- const taggedCurrentFileContentResult = (0, promptCrafting_1.createTaggedCurrentFileContentUsingPagedClipping)(currentFileContentLines, areaAroundCodeToEditForCurrentFile, areaAroundEditWindowLinesRange, computeTokens, promptOptions.pagedClipping.pageSize, promptOptions.currentFile);
312
- return taggedCurrentFileContentResult.map(taggedCurrentDocLines => ({
313
- taggedCurrentDocLines,
314
- areaAroundCodeToEdit,
315
- }));
316
- }
317
- getAndProcessLanguageContext(request, delaySession, activeDocument, cursorPosition, promptOptions, logContext, cancellationToken) {
259
+ getAndProcessLanguageContext(request, delaySession, activeDocument, cursorPosition, promptOptions, tracer, logContext, cancellationToken) {
318
260
  const recordingEnabled = this.configService.getConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsLogContextRecorderEnabled);
319
261
  const diagnosticsContextProviderEnabled = this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.Advanced.DiagnosticsContextProvider, this.expService);
320
262
  if (!promptOptions.languageContext.enabled && !recordingEnabled && !diagnosticsContextProviderEnabled) {
321
263
  return Promise.resolve(undefined);
322
264
  }
323
- const langCtxPromise = this.getLanguageContext(request, delaySession, activeDocument, cursorPosition, logContext, cancellationToken);
265
+ const langCtxPromise = this.getLanguageContext(request, delaySession, activeDocument, cursorPosition, tracer, logContext, cancellationToken);
324
266
  // if recording, add diagnostics for the file to the recording and hook up the language context promise to write to the recording
325
267
  if (recordingEnabled) {
326
268
  logContext.setFileDiagnostics(this.langDiagService.getAllDiagnostics());
@@ -334,13 +276,13 @@ let XtabProvider = class XtabProvider {
334
276
  ? langCtxPromise
335
277
  : Promise.resolve(undefined);
336
278
  }
337
- async getLanguageContext(request, delaySession, activeDocument, cursorPosition, logContext, cancellationToken) {
279
+ async getLanguageContext(request, delaySession, activeDocument, cursorPosition, tracer, logContext, cancellationToken) {
338
280
  try {
339
281
  const textDoc = this.workspaceService.textDocuments.find(doc => doc.uri.toString() === activeDocument.id.uri);
340
282
  if (textDoc === undefined) {
341
283
  return undefined;
342
284
  }
343
- const providers = this.langCtxService.getContextProviders(textDoc);
285
+ const providers = this.langCtxService.getContextProviders(textDoc, languageContextProviderService_1.ProviderTarget.NES);
344
286
  if (providers.length < 1) {
345
287
  return undefined;
346
288
  }
@@ -392,7 +334,7 @@ let XtabProvider = class XtabProvider {
392
334
  }
393
335
  catch (error) {
394
336
  logContext.setError(errors.fromUnknown(error));
395
- this.tracer.trace(`Failed to fetch language context: ${error}`);
337
+ tracer.trace(`Failed to fetch language context: ${error}`);
396
338
  return undefined;
397
339
  }
398
340
  }
@@ -446,7 +388,7 @@ let XtabProvider = class XtabProvider {
446
388
  !this.forceUseDefaultModel // if we haven't already forced using the default model; otherwise, this could cause an infinite loop
447
389
  ) {
448
390
  this.forceUseDefaultModel = true;
449
- return this.doGetNextEdit(request, pushEdit, delaySession, logContext, cancellationToken, telemetryBuilder, opts.retryState); // use the same retry state
391
+ return this.doGetNextEdit(request, pushEdit, delaySession, tracer, logContext, cancellationToken, telemetryBuilder, opts.retryState); // use the same retry state
450
392
  }
451
393
  pushEdit(result_1.Result.error(XtabProvider_1.mapChatFetcherErrorToNoNextEditReason(fetchRes)));
452
394
  return;
@@ -478,7 +420,6 @@ let XtabProvider = class XtabProvider {
478
420
  let i = 0;
479
421
  return llmLinesStream.map((v) => {
480
422
  const trace = `Line ${i++} emitted with latency ${fetchRequestStopWatch.elapsed()} ms`;
481
- logContext.addLog(trace);
482
423
  tracer.trace(trace);
483
424
  return opts.shouldRemoveCursorTagFromResponse
484
425
  ? v.replaceAll(tags_1.PromptTags.CURSOR, '')
@@ -502,7 +443,7 @@ let XtabProvider = class XtabProvider {
502
443
  }
503
444
  const trimmedLines = firstLine.value.trim();
504
445
  if (trimmedLines === tags_1.ResponseTags.NO_CHANGE.start) {
505
- await this.pushNoSuggestionsOrRetry(request, editWindow, promptPieces, pushEdit, delaySession, logContext, cancellationToken, telemetryBuilder, opts.retryState);
446
+ await this.pushNoSuggestionsOrRetry(request, editWindow, promptPieces, pushEdit, delaySession, tracer, logContext, cancellationToken, telemetryBuilder, opts.retryState);
506
447
  return;
507
448
  }
508
449
  if (trimmedLines === tags_1.ResponseTags.INSERT.start) {
@@ -556,17 +497,17 @@ let XtabProvider = class XtabProvider {
556
497
  (0, assert_1.assertNever)(opts.responseFormat);
557
498
  }
558
499
  const diffOptions = {
559
- emitFastCursorLineChange: opts.showLabel
560
- ? false
561
- : this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabProviderEmitFastCursorLineChange, this.expService),
500
+ emitFastCursorLineChange: this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabProviderEmitFastCursorLineChange, this.expService),
562
501
  nLinesToConverge: this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabNNonSignificantLinesToConverge, this.expService),
563
502
  nSignificantLinesToConverge: this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabNSignificantLinesToConverge, this.expService),
564
503
  };
504
+ tracer.trace(`starting to diff stream against edit window lines with latency ${fetchRequestStopWatch.elapsed()} ms`);
565
505
  (async () => {
566
506
  let i = 0;
567
507
  let hasBeenDelayed = false;
568
508
  try {
569
509
  for await (const edit of responseProcessor_1.ResponseProcessor.diff(editWindowLines, cleanedLinesStream, cursorOriginalLinesOffset, diffOptions)) {
510
+ tracer.trace(`ResponseProcessor streamed edit #${i} with latency ${fetchRequestStopWatch.elapsed()} ms`);
570
511
  const singleLineEdits = [];
571
512
  if (edit.lineRange.startLineNumber === edit.lineRange.endLineNumberExclusive || // we don't want to run diff on insertion
572
513
  edit.newLines.length === 0 || // we don't want to run diff on deletion
@@ -582,6 +523,7 @@ let XtabProvider = class XtabProvider {
582
523
  maxComputationTimeMs: 0,
583
524
  computeMoves: false
584
525
  });
526
+ tracer.trace(`Ran diff for #${i} with latency ${fetchRequestStopWatch.elapsed()} ms`);
585
527
  const translateByNLines = editWindowLineRange.start + edit.lineRange.startLineNumber;
586
528
  for (const change of diffResult.changes) {
587
529
  const singleLineEdit = new lineEdit_1.LineReplacement(new lineRange_1.LineRange(translateByNLines + change.original.startLineNumber - 1, translateByNLines + change.original.endLineNumberExclusive - 1), edit.newLines.slice(change.modified.startLineNumber - 1, change.modified.endLineNumberExclusive - 1));
@@ -593,12 +535,20 @@ let XtabProvider = class XtabProvider {
593
535
  }
594
536
  logContext.setResponse(responseSoFar);
595
537
  for (const singleLineEdit of singleLineEdits) {
596
- this.trace(`pushing edit #${i}:\n${singleLineEdit.toString()}`, logContext, tracer);
538
+ tracer.trace(`pushing edit #${i}:\n${singleLineEdit.toString()}`);
597
539
  if (!hasBeenDelayed) { // delay only the first one
598
540
  hasBeenDelayed = true;
599
- await this.enforceArtificialDelay(delaySession, telemetryBuilder);
541
+ const artificialDelay = this.determineArtificialDelayMs(delaySession, tracer, telemetryBuilder);
542
+ if (artificialDelay) {
543
+ await (0, async_2.timeout)(artificialDelay);
544
+ tracer.trace(`Artificial delay of ${artificialDelay} ms completed`);
545
+ if (cancellationToken.isCancellationRequested) {
546
+ pushEdit(result_1.Result.error(new statelessNextEditProvider_1.NoNextEditReason.GotCancelled('afterArtificialDelay')));
547
+ return;
548
+ }
549
+ }
600
550
  }
601
- pushEdit(result_1.Result.ok({ edit: singleLineEdit, window: editWindow, showLabel: opts.showLabel }));
551
+ pushEdit(result_1.Result.ok({ edit: singleLineEdit, window: editWindow }));
602
552
  i++;
603
553
  }
604
554
  }
@@ -611,7 +561,7 @@ let XtabProvider = class XtabProvider {
611
561
  pushEdit(result_1.Result.error(new statelessNextEditProvider_1.NoNextEditReason.NoSuggestions(request.documentBeforeEdits, editWindow)));
612
562
  }
613
563
  else {
614
- await this.pushNoSuggestionsOrRetry(request, editWindow, promptPieces, pushEdit, delaySession, logContext, cancellationToken, telemetryBuilder, opts.retryState);
564
+ await this.pushNoSuggestionsOrRetry(request, editWindow, promptPieces, pushEdit, delaySession, tracer, logContext, cancellationToken, telemetryBuilder, opts.retryState);
615
565
  }
616
566
  }
617
567
  catch (err) {
@@ -621,37 +571,35 @@ let XtabProvider = class XtabProvider {
621
571
  }
622
572
  })();
623
573
  }
624
- async pushNoSuggestionsOrRetry(request, editWindow, promptPieces, pushEdit, delaySession, logContext, cancellationToken, telemetryBuilder, retryState) {
574
+ async pushNoSuggestionsOrRetry(request, editWindow, promptPieces, pushEdit, delaySession, tracer, logContext, cancellationToken, telemetryBuilder, retryState) {
625
575
  const allowRetryWithExpandedWindow = this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabProviderRetryWithNMoreLinesBelow, this.expService);
626
576
  // if allowed to retry and not retrying already, flip the retry state and try again
627
577
  if (allowRetryWithExpandedWindow && retryState === 0 /* RetryState.NotRetrying */ && request.expandedEditWindowNLines === undefined) {
628
- this.doGetNextEdit(request, pushEdit, delaySession, logContext, cancellationToken, telemetryBuilder, 1 /* RetryState.Retrying */);
578
+ this.doGetNextEdit(request, pushEdit, delaySession, tracer, logContext, cancellationToken, telemetryBuilder, 1 /* RetryState.Retrying */);
629
579
  return;
630
580
  }
631
- let nextCursorLinePrediction = this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsNextCursorPredictionEnabled, this.expService);
632
- nextCursorLinePrediction = (nextCursorLinePrediction === true ? nextCursorLinePrediction_1.NextCursorLinePrediction.OnlyWithEdit :
633
- (nextCursorLinePrediction === false ? undefined : nextCursorLinePrediction));
581
+ const nextCursorLinePrediction = this.nextCursorPredictor.determineEnablement();
634
582
  if (nextCursorLinePrediction !== undefined && retryState === 0 /* RetryState.NotRetrying */) {
635
- const nextCursorLineR = await this.predictNextCursorPosition(promptPieces);
583
+ const nextCursorLineR = await this.nextCursorPredictor.predictNextCursorPosition(promptPieces, tracer);
636
584
  if (cancellationToken.isCancellationRequested) {
637
585
  pushEdit(result_1.Result.error(new statelessNextEditProvider_1.NoNextEditReason.NoSuggestions(request.documentBeforeEdits, editWindow)));
638
586
  return;
639
587
  }
640
588
  if (nextCursorLineR.isError()) {
641
- this.tracer.trace(`Predicted next cursor line error: ${nextCursorLineR.err.message}`);
589
+ tracer.trace(`Predicted next cursor line error: ${nextCursorLineR.err.message}`);
642
590
  telemetryBuilder.setNextCursorLineError(nextCursorLineR.err.message);
643
591
  }
644
592
  else {
645
593
  const nextCursorLineZeroBased = nextCursorLineR.val;
646
594
  const lineDistanceFromCursorLine = nextCursorLineZeroBased - promptPieces.currentDocument.cursorLineOffset;
647
595
  telemetryBuilder.setNextCursorLineDistance(lineDistanceFromCursorLine);
648
- this.tracer.trace(`Predicted next cursor line: ${nextCursorLineZeroBased}`);
596
+ tracer.trace(`Predicted next cursor line: ${nextCursorLineZeroBased}`);
649
597
  if (nextCursorLineZeroBased >= promptPieces.currentDocument.lines.length) { // >= because the line index is zero-based
650
- this.tracer.trace(`Predicted next cursor line error: exceedsDocumentLines`);
598
+ tracer.trace(`Predicted next cursor line error: exceedsDocumentLines`);
651
599
  telemetryBuilder.setNextCursorLineError('exceedsDocumentLines');
652
600
  }
653
601
  else if (promptPieces.editWindowLinesRange.contains(nextCursorLineZeroBased)) {
654
- this.tracer.trace(`Predicted next cursor line error: withinEditWindow`);
602
+ tracer.trace(`Predicted next cursor line error: withinEditWindow`);
655
603
  telemetryBuilder.setNextCursorLineError('withinEditWindow');
656
604
  }
657
605
  else {
@@ -666,7 +614,7 @@ let XtabProvider = class XtabProvider {
666
614
  }
667
615
  case nextCursorLinePrediction_1.NextCursorLinePrediction.OnlyWithEdit:
668
616
  case nextCursorLinePrediction_1.NextCursorLinePrediction.LabelOnlyWithEdit: {
669
- this.doGetNextEditWithSelection(request, new range_1.Range(nextCursorLineOneBased, nextCursorColumn, nextCursorLineOneBased, nextCursorColumn), pushEdit, delaySession, { showLabel: nextCursorLinePrediction === nextCursorLinePrediction_1.NextCursorLinePrediction.LabelOnlyWithEdit }, logContext, cancellationToken, telemetryBuilder, 1 /* RetryState.Retrying */);
617
+ this.doGetNextEditWithSelection(request, new range_1.Range(nextCursorLineOneBased, nextCursorColumn, nextCursorLineOneBased, nextCursorColumn), pushEdit, delaySession, tracer, logContext, cancellationToken, telemetryBuilder, 1 /* RetryState.Retrying */);
670
618
  return;
671
619
  }
672
620
  default: {
@@ -685,7 +633,7 @@ let XtabProvider = class XtabProvider {
685
633
  const areaAroundEndExcl = Math.min(currentDocument.lines.length, cursorLine + promptCrafting_1.N_LINES_AS_CONTEXT + 1);
686
634
  return new offsetRange_1.OffsetRange(areaAroundStart, areaAroundEndExcl);
687
635
  }
688
- computeEditWindowLinesRange(currentDocument, request, retryState, telemetry) {
636
+ computeEditWindowLinesRange(currentDocument, request, retryState, tracer, telemetry) {
689
637
  const currentDocLines = currentDocument.lines;
690
638
  const cursorLineOffset = currentDocument.cursorLineOffset;
691
639
  let nLinesAbove;
@@ -711,17 +659,17 @@ let XtabProvider = class XtabProvider {
711
659
  }
712
660
  let nLinesBelow;
713
661
  if (request.expandedEditWindowNLines !== undefined) {
714
- this.tracer.trace(`Using expanded nLinesBelow: ${request.expandedEditWindowNLines}`);
662
+ tracer.trace(`Using expanded nLinesBelow: ${request.expandedEditWindowNLines}`);
715
663
  nLinesBelow = request.expandedEditWindowNLines;
716
664
  }
717
665
  else {
718
666
  const overriddenNLinesBelow = this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabProviderNLinesBelow, this.expService);
719
667
  if (overriddenNLinesBelow !== undefined) {
720
- this.tracer.trace(`Using overridden nLinesBelow: ${overriddenNLinesBelow}`);
668
+ tracer.trace(`Using overridden nLinesBelow: ${overriddenNLinesBelow}`);
721
669
  nLinesBelow = overriddenNLinesBelow;
722
670
  }
723
671
  else {
724
- this.tracer.trace(`Using default nLinesBelow: ${promptCrafting_1.N_LINES_BELOW}`);
672
+ tracer.trace(`Using default nLinesBelow: ${promptCrafting_1.N_LINES_BELOW}`);
725
673
  nLinesBelow = promptCrafting_1.N_LINES_BELOW; // default
726
674
  }
727
675
  }
@@ -738,12 +686,12 @@ let XtabProvider = class XtabProvider {
738
686
  const onlyMergeConflictLines = this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsXtabOnlyMergeConflictLines, this.expService);
739
687
  telemetry.setMergeConflictExpanded(onlyMergeConflictLines ? 'only' : 'normal');
740
688
  if (onlyMergeConflictLines) {
741
- this.tracer.trace(`Expanding edit window to include ONLY merge conflict markers: ${mergeConflictRange.toString()}`);
689
+ tracer.trace(`Expanding edit window to include ONLY merge conflict markers: ${mergeConflictRange.toString()}`);
742
690
  codeToEditStart = mergeConflictRange.start;
743
691
  codeToEditEndExcl = mergeConflictRange.endExclusive;
744
692
  }
745
693
  else {
746
- this.tracer.trace(`Expanding edit window to include merge conflict markers: ${mergeConflictRange.toString()}; edit window range [${codeToEditStart}, ${codeToEditEndExcl})`);
694
+ tracer.trace(`Expanding edit window to include merge conflict markers: ${mergeConflictRange.toString()}; edit window range [${codeToEditStart}, ${codeToEditEndExcl})`);
747
695
  codeToEditEndExcl = Math.max(codeToEditEndExcl, mergeConflictRange.endExclusive);
748
696
  }
749
697
  }
@@ -860,90 +808,6 @@ let XtabProvider = class XtabProvider {
860
808
  },
861
809
  };
862
810
  }
863
- async predictNextCursorPosition(promptPieces) {
864
- const tracer = this.tracer.sub('predictNextCursorPosition');
865
- const systemMessage = `Your task is to predict the next line number in the current file where the developer is most likely to make their next edit, using the provided context. If you don't think anywhere is a good next line jump target, just output the current line number of the cursor. Make sure to just output the line number and nothing else (no explanation, reasoning, etc.).`;
866
- const maxTokens = this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.Advanced.InlineEditsNextCursorPredictionCurrentFileMaxTokens, this.expService);
867
- const currentFileContentR = this.constructTaggedFile(promptPieces.currentDocument, promptPieces.editWindowLinesRange, promptPieces.areaAroundEditWindowLinesRange, {
868
- ...promptPieces.opts,
869
- currentFile: {
870
- ...promptPieces.opts.currentFile,
871
- maxTokens,
872
- includeTags: false,
873
- }
874
- }, XtabProvider_1.computeTokens, { includeLineNumbers: { areaAroundCodeToEdit: false, currentFileContent: true } });
875
- if (currentFileContentR.isError()) {
876
- tracer.trace(`Failed to construct tagged file: ${currentFileContentR.err}`);
877
- return result_1.Result.fromString(currentFileContentR.err);
878
- }
879
- const { taggedCurrentDocLines, areaAroundCodeToEdit } = currentFileContentR.val;
880
- const newPromptPieces = new promptCrafting_1.PromptPieces(promptPieces.currentDocument, promptPieces.editWindowLinesRange, promptPieces.areaAroundEditWindowLinesRange, promptPieces.activeDoc, promptPieces.xtabHistory, taggedCurrentDocLines, areaAroundCodeToEdit, promptPieces.langCtx, XtabProvider_1.computeTokens, {
881
- ...promptPieces.opts,
882
- includePostScript: false,
883
- });
884
- const userMessage = (0, promptCrafting_1.getUserPrompt)(newPromptPieces);
885
- const messages = constructMessages({
886
- systemMsg: systemMessage,
887
- userMsg: userMessage
888
- });
889
- const modelName = this.configService.getExperimentBasedConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsNextCursorPredictionModelName, this.expService);
890
- if (modelName === undefined) {
891
- tracer.trace('Model name for cursor prediction is not defined; skipping prediction');
892
- return result_1.Result.fromString('modelNameNotDefined');
893
- }
894
- const url = this.configService.getConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsNextCursorPredictionUrl);
895
- const secretKey = this.configService.getConfig(configurationService_1.ConfigKey.TeamInternal.InlineEditsNextCursorPredictionApiKey);
896
- const endpoint = this.instaService.createInstance(chatEndpoint_1.ChatEndpoint, {
897
- id: modelName,
898
- name: 'nes.nextCursorPosition',
899
- urlOrRequestMetadata: url ? url : { type: copilot_api_1.RequestType.ProxyChatCompletions },
900
- model_picker_enabled: false,
901
- is_chat_default: false,
902
- is_chat_fallback: false,
903
- version: '',
904
- capabilities: {
905
- type: 'chat',
906
- family: '',
907
- tokenizer: tokenizer_1.TokenizerType.CL100K,
908
- limits: undefined,
909
- supports: {
910
- parallel_tool_calls: false,
911
- tool_calls: false,
912
- streaming: true,
913
- vision: false,
914
- prediction: false,
915
- thinking: false
916
- }
917
- },
918
- });
919
- const response = await endpoint.makeChatRequest2({
920
- messages,
921
- debugName: 'nes.nextCursorPosition',
922
- finishedCb: undefined,
923
- location: commonTypes_1.ChatLocation.Other,
924
- requestOptions: secretKey ? {
925
- secretKey,
926
- } : undefined,
927
- }, cancellation_1.CancellationToken.None);
928
- if (response.type !== commonTypes_1.ChatFetchResponseType.Success) {
929
- return result_1.Result.fromString(`fetchError:${response.type}`);
930
- }
931
- try {
932
- const trimmed = response.value.trim();
933
- const lineNumber = parseInt(trimmed, 10);
934
- if (isNaN(lineNumber)) {
935
- return result_1.Result.fromString(`gotNaN`);
936
- }
937
- if (lineNumber < 0) {
938
- return result_1.Result.fromString(`negativeLineNumber`);
939
- }
940
- return result_1.Result.ok(lineNumber);
941
- }
942
- catch (err) {
943
- tracer.trace(`Failed to parse predicted line number from response '${response.value}': ${err}`);
944
- return result_1.Result.fromString(`failedToParseLine:"${response.value}". Error ${errors.fromUnknown(err).message}`);
945
- }
946
- }
947
811
  pickSystemPrompt(promptingStrategy) {
948
812
  switch (promptingStrategy) {
949
813
  case xtabPromptOptions.PromptingStrategy.UnifiedModel:
@@ -997,29 +861,26 @@ let XtabProvider = class XtabProvider {
997
861
  (0, assert_1.assertNever)(responseFormat);
998
862
  }
999
863
  }
1000
- async debounce(delaySession, telemetry) {
864
+ async debounce(delaySession, tracer, telemetry) {
1001
865
  if (this.simulationCtx.isInSimulationTests) {
1002
866
  return;
1003
867
  }
1004
868
  const debounceTime = delaySession.getDebounceTime();
1005
- this.tracer.trace(`Debouncing for ${debounceTime} ms`);
869
+ tracer.trace(`Debouncing for ${debounceTime} ms`);
1006
870
  telemetry.setDebounceTime(debounceTime);
1007
871
  await (0, async_2.timeout)(debounceTime);
1008
872
  }
1009
- async enforceArtificialDelay(delaySession, telemetry) {
873
+ determineArtificialDelayMs(delaySession, tracer, telemetry) {
1010
874
  if (this.simulationCtx.isInSimulationTests) {
1011
875
  return;
1012
876
  }
1013
877
  const artificialDelay = delaySession.getArtificialDelay();
1014
- this.tracer.trace(`Enforcing artificial delay of ${artificialDelay} ms`);
1015
- telemetry.setArtificialDelay(artificialDelay);
1016
- if (artificialDelay > 0) {
1017
- await (0, async_2.timeout)(artificialDelay);
878
+ if (artificialDelay <= 0) {
879
+ return undefined;
1018
880
  }
1019
- }
1020
- trace(msg, logContext, tracer) {
1021
- tracer.trace(msg);
1022
- logContext.addLog(msg);
881
+ tracer.trace(`Enforcing artificial delay of ${artificialDelay} ms`);
882
+ telemetry.setArtificialDelay(artificialDelay);
883
+ return artificialDelay;
1023
884
  }
1024
885
  };
1025
886
  exports.XtabProvider = XtabProvider;
@@ -1030,11 +891,10 @@ exports.XtabProvider = XtabProvider = XtabProvider_1 = __decorate([
1030
891
  __param(3, diffService_1.IDiffService),
1031
892
  __param(4, configurationService_1.IConfigurationService),
1032
893
  __param(5, nullExperimentationService_1.IExperimentationService),
1033
- __param(6, logService_1.ILogService),
1034
- __param(7, languageContextProviderService_1.ILanguageContextProviderService),
1035
- __param(8, languageDiagnosticsService_1.ILanguageDiagnosticsService),
1036
- __param(9, ignoreService_1.IIgnoreService),
1037
- __param(10, telemetry_1.ITelemetryService)
894
+ __param(6, languageContextProviderService_1.ILanguageContextProviderService),
895
+ __param(7, languageDiagnosticsService_1.ILanguageDiagnosticsService),
896
+ __param(8, ignoreService_1.IIgnoreService),
897
+ __param(9, telemetry_1.ITelemetryService)
1038
898
  ], XtabProvider);
1039
899
  /**
1040
900
  * Finds the range of lines containing merge conflict markers within a specified edit window.
@@ -1058,20 +918,4 @@ function findMergeConflictMarkersRange(lines, editWindowRange, maxMergeConflictL
1058
918
  }
1059
919
  return undefined;
1060
920
  }
1061
- function constructMessages({ systemMsg, userMsg }) {
1062
- return [
1063
- {
1064
- role: prompt_tsx_1.Raw.ChatRole.System,
1065
- content: (0, globalStringUtils_1.toTextParts)(systemMsg)
1066
- },
1067
- {
1068
- role: prompt_tsx_1.Raw.ChatRole.User,
1069
- content: (0, globalStringUtils_1.toTextParts)(userMsg)
1070
- }
1071
- ];
1072
- }
1073
- function charCount(messages) {
1074
- const promptCharCount = messages.reduce((total, msg) => total + msg.content.reduce((subtotal, part) => subtotal + (part.type === rawTypes_1.ChatCompletionContentPartKind.Text ? part.text.length : 0), 0), 0);
1075
- return promptCharCount;
1076
- }
1077
921
  //# sourceMappingURL=xtabProvider.js.map