@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.
- package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/prompt/contextProviderRegistry.d.ts.map +1 -1
- package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/prompt/contextProviderRegistry.js +1 -1
- package/dist/src/_internal/extension/completions-core/vscode-node/lib/src/prompt/contextProviderRegistry.js.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.d.ts +0 -1
- package/dist/src/_internal/extension/inlineEdits/node/nextEditCache.d.ts.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.d.ts.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.js +21 -66
- package/dist/src/_internal/extension/inlineEdits/node/nextEditProvider.js.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/node/nextEditProviderTelemetry.d.ts +1 -1
- package/dist/src/_internal/extension/inlineEdits/node/nextEditProviderTelemetry.d.ts.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/node/nextEditResult.d.ts +6 -3
- package/dist/src/_internal/extension/inlineEdits/node/nextEditResult.d.ts.map +1 -1
- package/dist/src/_internal/extension/inlineEdits/node/nextEditResult.js.map +1 -1
- package/dist/src/_internal/extension/prompt/node/chatMLFetcher.d.ts +1 -1
- package/dist/src/_internal/extension/prompt/node/chatMLFetcher.d.ts.map +1 -1
- package/dist/src/_internal/extension/prompt/node/chatMLFetcher.js +19 -19
- package/dist/src/_internal/extension/prompt/node/chatMLFetcher.js.map +1 -1
- package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.d.ts +2 -3
- package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.d.ts.map +1 -1
- package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.js +8 -4
- package/dist/src/_internal/extension/prompt/node/chatMLFetcherTelemetry.js.map +1 -1
- package/dist/src/_internal/extension/xtab/common/promptCrafting.d.ts +616 -0
- package/dist/src/_internal/extension/xtab/common/promptCrafting.d.ts.map +1 -1
- package/dist/src/_internal/extension/xtab/common/promptCrafting.js +46 -1
- package/dist/src/_internal/extension/xtab/common/promptCrafting.js.map +1 -1
- package/dist/src/_internal/extension/xtab/node/xtabNextCursorPredictor.d.ts +18 -0
- package/dist/src/_internal/extension/xtab/node/xtabNextCursorPredictor.d.ts.map +1 -0
- package/dist/src/_internal/extension/xtab/node/xtabNextCursorPredictor.js +156 -0
- package/dist/src/_internal/extension/xtab/node/xtabNextCursorPredictor.js.map +1 -0
- package/dist/src/_internal/extension/xtab/node/xtabProvider.d.ts +5 -11
- package/dist/src/_internal/extension/xtab/node/xtabProvider.d.ts.map +1 -1
- package/dist/src/_internal/extension/xtab/node/xtabProvider.js +67 -223
- package/dist/src/_internal/extension/xtab/node/xtabProvider.js.map +1 -1
- package/dist/src/_internal/extension/xtab/node/xtabUtils.d.ts +6 -0
- package/dist/src/_internal/extension/xtab/node/xtabUtils.d.ts.map +1 -1
- package/dist/src/_internal/extension/xtab/node/xtabUtils.js +20 -0
- package/dist/src/_internal/extension/xtab/node/xtabUtils.js.map +1 -1
- package/dist/src/_internal/platform/configuration/common/configurationService.d.ts +8 -7
- package/dist/src/_internal/platform/configuration/common/configurationService.d.ts.map +1 -1
- package/dist/src/_internal/platform/configuration/common/configurationService.js +11 -10
- package/dist/src/_internal/platform/configuration/common/configurationService.js.map +1 -1
- package/dist/src/_internal/platform/configuration/common/defaultsOnlyConfigurationService.d.ts.map +1 -1
- package/dist/src/_internal/platform/configuration/common/defaultsOnlyConfigurationService.js +27 -0
- package/dist/src/_internal/platform/configuration/common/defaultsOnlyConfigurationService.js.map +1 -1
- package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.js +2 -2
- package/dist/src/_internal/platform/endpoint/common/chatModelCapabilities.js.map +1 -1
- package/dist/src/_internal/platform/endpoint/node/chatEndpoint.js +1 -1
- package/dist/src/_internal/platform/endpoint/node/chatEndpoint.js.map +1 -1
- package/dist/src/_internal/platform/endpoint/node/messagesApi.d.ts.map +1 -1
- package/dist/src/_internal/platform/endpoint/node/messagesApi.js +12 -4
- package/dist/src/_internal/platform/endpoint/node/messagesApi.js.map +1 -1
- package/dist/src/_internal/platform/github/common/githubService.d.ts +28 -9
- package/dist/src/_internal/platform/github/common/githubService.d.ts.map +1 -1
- package/dist/src/_internal/platform/github/common/githubService.js.map +1 -1
- package/dist/src/_internal/platform/inlineEdits/common/inlineEditLogContext.d.ts +2 -0
- package/dist/src/_internal/platform/inlineEdits/common/inlineEditLogContext.d.ts.map +1 -1
- package/dist/src/_internal/platform/inlineEdits/common/inlineEditLogContext.js +13 -0
- package/dist/src/_internal/platform/inlineEdits/common/inlineEditLogContext.js.map +1 -1
- package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.d.ts +4 -4
- package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.d.ts.map +1 -1
- package/dist/src/_internal/platform/inlineEdits/common/statelessNextEditProvider.js.map +1 -1
- package/dist/src/_internal/platform/inlineEdits/common/utils/utils.d.ts +1 -0
- package/dist/src/_internal/platform/inlineEdits/common/utils/utils.d.ts.map +1 -1
- package/dist/src/_internal/platform/inlineEdits/common/utils/utils.js +5 -0
- package/dist/src/_internal/platform/inlineEdits/common/utils/utils.js.map +1 -1
- package/dist/src/_internal/platform/languageContextProvider/common/languageContextProviderService.d.ts +7 -3
- package/dist/src/_internal/platform/languageContextProvider/common/languageContextProviderService.d.ts.map +1 -1
- package/dist/src/_internal/platform/languageContextProvider/common/languageContextProviderService.js +6 -1
- package/dist/src/_internal/platform/languageContextProvider/common/languageContextProviderService.js.map +1 -1
- package/dist/src/_internal/platform/languageContextProvider/common/nullLanguageContextProviderService.d.ts +2 -2
- package/dist/src/_internal/platform/languageContextProvider/common/nullLanguageContextProviderService.d.ts.map +1 -1
- package/dist/src/_internal/platform/languageContextProvider/common/nullLanguageContextProviderService.js +1 -1
- package/dist/src/_internal/platform/languageContextProvider/common/nullLanguageContextProviderService.js.map +1 -1
- package/dist/src/_internal/platform/requestLogger/common/capturingToken.d.ts +31 -0
- package/dist/src/_internal/platform/requestLogger/common/capturingToken.d.ts.map +1 -0
- package/dist/src/_internal/platform/requestLogger/common/capturingToken.js +31 -0
- package/dist/src/_internal/platform/requestLogger/common/capturingToken.js.map +1 -0
- package/dist/src/_internal/platform/requestLogger/node/requestLogger.d.ts +8 -7
- 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/_internal/util/common/test/shims/chatTypes.d.ts +5 -3
- package/dist/src/_internal/util/common/test/shims/chatTypes.d.ts.map +1 -1
- package/dist/src/_internal/util/common/test/shims/chatTypes.js +2 -1
- package/dist/src/_internal/util/common/test/shims/chatTypes.js.map +1 -1
- package/dist/src/_internal/util/common/tracing.d.ts +21 -2
- package/dist/src/_internal/util/common/tracing.d.ts.map +1 -1
- package/dist/src/_internal/util/common/tracing.js +51 -29
- package/dist/src/_internal/util/common/tracing.js.map +1 -1
- package/dist/src/main.js +1 -1
- package/dist/src/main.js.map +1 -1
- package/dist/src/package.json +23 -28
- package/package.json +2 -2
- package/dist/src/_internal/extension/inlineEdits/common/jumpToCursorPosition.d.ts +0 -2
- package/dist/src/_internal/extension/inlineEdits/common/jumpToCursorPosition.d.ts.map +0 -1
- package/dist/src/_internal/extension/inlineEdits/common/jumpToCursorPosition.js +0 -9
- 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,
|
|
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.
|
|
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,
|
|
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,
|
|
199
|
-
const tracer =
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
538
|
+
tracer.trace(`pushing edit #${i}:\n${singleLineEdit.toString()}`);
|
|
597
539
|
if (!hasBeenDelayed) { // delay only the first one
|
|
598
540
|
hasBeenDelayed = true;
|
|
599
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
596
|
+
tracer.trace(`Predicted next cursor line: ${nextCursorLineZeroBased}`);
|
|
649
597
|
if (nextCursorLineZeroBased >= promptPieces.currentDocument.lines.length) { // >= because the line index is zero-based
|
|
650
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
668
|
+
tracer.trace(`Using overridden nLinesBelow: ${overriddenNLinesBelow}`);
|
|
721
669
|
nLinesBelow = overriddenNLinesBelow;
|
|
722
670
|
}
|
|
723
671
|
else {
|
|
724
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
869
|
+
tracer.trace(`Debouncing for ${debounceTime} ms`);
|
|
1006
870
|
telemetry.setDebounceTime(debounceTime);
|
|
1007
871
|
await (0, async_2.timeout)(debounceTime);
|
|
1008
872
|
}
|
|
1009
|
-
|
|
873
|
+
determineArtificialDelayMs(delaySession, tracer, telemetry) {
|
|
1010
874
|
if (this.simulationCtx.isInSimulationTests) {
|
|
1011
875
|
return;
|
|
1012
876
|
}
|
|
1013
877
|
const artificialDelay = delaySession.getArtificialDelay();
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
if (artificialDelay > 0) {
|
|
1017
|
-
await (0, async_2.timeout)(artificialDelay);
|
|
878
|
+
if (artificialDelay <= 0) {
|
|
879
|
+
return undefined;
|
|
1018
880
|
}
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
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,
|
|
1034
|
-
__param(7,
|
|
1035
|
-
__param(8,
|
|
1036
|
-
__param(9,
|
|
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
|