@aws/lsp-codewhisperer 0.0.70 → 0.0.72
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/CHANGELOG.md +52 -0
- package/out/language-server/agenticChat/agenticChatController.js +27 -8
- package/out/language-server/agenticChat/agenticChatController.js.map +1 -1
- package/out/language-server/agenticChat/constants/modelSelection.js +1 -1
- package/out/language-server/agenticChat/constants/modelSelection.js.map +1 -1
- package/out/language-server/agenticChat/tools/chatDb/chatDb.d.ts +7 -1
- package/out/language-server/agenticChat/tools/chatDb/chatDb.js +64 -17
- package/out/language-server/agenticChat/tools/chatDb/chatDb.js.map +1 -1
- package/out/language-server/agenticChat/tools/chatDb/util.d.ts +3 -2
- package/out/language-server/agenticChat/tools/chatDb/util.js.map +1 -1
- package/out/language-server/agenticChat/tools/executeBash.d.ts +4 -1
- package/out/language-server/agenticChat/tools/executeBash.js +61 -24
- package/out/language-server/agenticChat/tools/executeBash.js.map +1 -1
- package/out/language-server/agenticChat/tools/mcp/mcpEventHandler.js +279 -181
- package/out/language-server/agenticChat/tools/mcp/mcpEventHandler.js.map +1 -1
- package/out/language-server/agenticChat/tools/mcp/mcpManager.d.ts +38 -17
- package/out/language-server/agenticChat/tools/mcp/mcpManager.js +263 -110
- package/out/language-server/agenticChat/tools/mcp/mcpManager.js.map +1 -1
- package/out/language-server/agenticChat/tools/mcp/mcpTypes.d.ts +4 -1
- package/out/language-server/agenticChat/tools/mcp/mcpTypes.js.map +1 -1
- package/out/language-server/agenticChat/tools/mcp/mcpUtils.d.ts +1 -2
- package/out/language-server/agenticChat/tools/mcp/mcpUtils.js +106 -28
- package/out/language-server/agenticChat/tools/mcp/mcpUtils.js.map +1 -1
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReview.d.ts +1 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReview.js +10 -15
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReview.js.map +1 -1
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReviewConstants.d.ts +2 -1
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReviewConstants.js +3 -2
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReviewConstants.js.map +1 -1
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReviewUtils.d.ts +6 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReviewUtils.js +9 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/codeReviewUtils.js.map +1 -1
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindings.d.ts +89 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindings.js +138 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindings.js.map +1 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindingsConstants.d.ts +14 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindingsConstants.js +41 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindingsConstants.js.map +1 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindingsSchemas.d.ts +177 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindingsSchemas.js +93 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindingsSchemas.js.map +1 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindingsTypes.d.ts +27 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindingsTypes.js +12 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindingsTypes.js.map +1 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindingsUtils.d.ts +17 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindingsUtils.js +33 -0
- package/out/language-server/agenticChat/tools/qCodeAnalysis/displayFindingsUtils.js.map +1 -0
- package/out/language-server/agenticChat/tools/toolServer.js +22 -2
- package/out/language-server/agenticChat/tools/toolServer.js.map +1 -1
- package/out/language-server/agenticChat/utils/agenticChatControllerHelper.js +1 -1
- package/out/language-server/agenticChat/utils/agenticChatControllerHelper.js.map +1 -1
- package/out/language-server/agenticChat/utils/commandParser.d.ts +17 -0
- package/out/language-server/agenticChat/utils/commandParser.js +85 -0
- package/out/language-server/agenticChat/utils/commandParser.js.map +1 -0
- package/out/language-server/chat/chatController.js +77 -0
- package/out/language-server/chat/chatController.js.map +1 -1
- package/out/language-server/chat/chatSessionService.js +1 -1
- package/out/language-server/chat/chatSessionService.js.map +1 -1
- package/out/language-server/chat/constants.d.ts +1 -0
- package/out/language-server/chat/constants.js +2 -1
- package/out/language-server/chat/constants.js.map +1 -1
- package/out/language-server/chat/telemetry/chatTelemetryController.d.ts +2 -0
- package/out/language-server/chat/telemetry/chatTelemetryController.js +12 -0
- package/out/language-server/chat/telemetry/chatTelemetryController.js.map +1 -1
- package/out/language-server/chat/utils.js +6 -0
- package/out/language-server/chat/utils.js.map +1 -1
- package/out/language-server/configuration/qConfigurationServer.d.ts +1 -0
- package/out/language-server/configuration/qConfigurationServer.js.map +1 -1
- package/out/language-server/inline-completion/auto-trigger/autoTrigger.js +2 -1
- package/out/language-server/inline-completion/auto-trigger/autoTrigger.js.map +1 -1
- package/out/language-server/inline-completion/codeDiffTracker.d.ts +9 -0
- package/out/language-server/inline-completion/codeDiffTracker.js.map +1 -1
- package/out/language-server/inline-completion/codeWhispererServer.d.ts +0 -3
- package/out/language-server/inline-completion/codeWhispererServer.js +80 -201
- package/out/language-server/inline-completion/codeWhispererServer.js.map +1 -1
- package/out/language-server/inline-completion/constants.d.ts +9 -0
- package/out/language-server/inline-completion/constants.js +10 -0
- package/out/language-server/inline-completion/constants.js.map +1 -0
- package/out/language-server/inline-completion/documentChangedListener.d.ts +8 -0
- package/out/language-server/inline-completion/documentChangedListener.js +20 -0
- package/out/language-server/inline-completion/documentChangedListener.js.map +1 -0
- package/out/language-server/inline-completion/editCompletionHandler.d.ts +49 -0
- package/out/language-server/inline-completion/editCompletionHandler.js +320 -0
- package/out/language-server/inline-completion/editCompletionHandler.js.map +1 -0
- package/out/language-server/inline-completion/session/sessionManager.d.ts +10 -2
- package/out/language-server/inline-completion/session/sessionManager.js +34 -7
- package/out/language-server/inline-completion/session/sessionManager.js.map +1 -1
- package/out/language-server/inline-completion/telemetry.js +12 -2
- package/out/language-server/inline-completion/telemetry.js.map +1 -1
- package/out/language-server/inline-completion/trigger.d.ts +17 -0
- package/out/language-server/inline-completion/trigger.js +42 -0
- package/out/language-server/inline-completion/trigger.js.map +1 -0
- package/out/language-server/workspaceContext/artifactManager.js +25 -6
- package/out/language-server/workspaceContext/artifactManager.js.map +1 -1
- package/out/shared/codeWhispererService.d.ts +36 -1
- package/out/shared/codeWhispererService.js +77 -0
- package/out/shared/codeWhispererService.js.map +1 -1
- package/out/shared/constants.d.ts +1 -0
- package/out/shared/constants.js +2 -1
- package/out/shared/constants.js.map +1 -1
- package/out/shared/languageDetection.js +0 -2
- package/out/shared/languageDetection.js.map +1 -1
- package/out/shared/models/constants.js +2 -1
- package/out/shared/models/constants.js.map +1 -1
- package/out/shared/supplementalContextUtil/crossFileContextUtil.d.ts +5 -6
- package/out/shared/supplementalContextUtil/crossFileContextUtil.js +114 -10
- package/out/shared/supplementalContextUtil/crossFileContextUtil.js.map +1 -1
- package/out/shared/supplementalContextUtil/supplementalContextUtil.d.ts +1 -2
- package/out/shared/supplementalContextUtil/supplementalContextUtil.js +2 -2
- package/out/shared/supplementalContextUtil/supplementalContextUtil.js.map +1 -1
- package/out/shared/telemetry/telemetryService.js +42 -18
- package/out/shared/telemetry/telemetryService.js.map +1 -1
- package/out/shared/telemetry/types.d.ts +16 -1
- package/out/shared/telemetry/types.js +2 -0
- package/out/shared/telemetry/types.js.map +1 -1
- package/out/shared/utils.d.ts +13 -0
- package/out/shared/utils.js +60 -4
- package/out/shared/utils.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DidChangeTextDocumentParams } from '@aws/language-server-runtimes/protocol';
|
|
2
|
+
export declare class DocumentChangedListener {
|
|
3
|
+
private _lastUserModificationTime;
|
|
4
|
+
private _timeSinceLastUserModification;
|
|
5
|
+
get timeSinceLastUserModification(): number;
|
|
6
|
+
constructor();
|
|
7
|
+
onDocumentChanged(e: DidChangeTextDocumentParams): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DocumentChangedListener = void 0;
|
|
4
|
+
class DocumentChangedListener {
|
|
5
|
+
_lastUserModificationTime = 0;
|
|
6
|
+
_timeSinceLastUserModification = 0;
|
|
7
|
+
get timeSinceLastUserModification() {
|
|
8
|
+
return this._timeSinceLastUserModification;
|
|
9
|
+
}
|
|
10
|
+
constructor() { }
|
|
11
|
+
onDocumentChanged(e) {
|
|
12
|
+
// Record last user modification time for any document
|
|
13
|
+
if (this._lastUserModificationTime) {
|
|
14
|
+
this._timeSinceLastUserModification = new Date().getTime() - this._lastUserModificationTime;
|
|
15
|
+
}
|
|
16
|
+
this._lastUserModificationTime = new Date().getTime();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.DocumentChangedListener = DocumentChangedListener;
|
|
20
|
+
//# sourceMappingURL=documentChangedListener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentChangedListener.js","sourceRoot":"","sources":["../../../src/language-server/inline-completion/documentChangedListener.ts"],"names":[],"mappings":";;;AAEA,MAAa,uBAAuB;IACxB,yBAAyB,GAAW,CAAC,CAAA;IACrC,8BAA8B,GAAW,CAAC,CAAA;IAClD,IAAI,6BAA6B;QAC7B,OAAO,IAAI,CAAC,8BAA8B,CAAA;IAC9C,CAAC;IAED,gBAAe,CAAC;IAEhB,iBAAiB,CAAC,CAA8B;QAC5C,sDAAsD;QACtD,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACjC,IAAI,CAAC,8BAA8B,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAA;QAC/F,CAAC;QACD,IAAI,CAAC,yBAAyB,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;IACzD,CAAC;CACJ;AAhBD,0DAgBC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { CancellationToken, InitializeParams, InlineCompletionListWithReferences, InlineCompletionWithReferencesParams, Range, TextDocument } from '@aws/language-server-runtimes/protocol';
|
|
2
|
+
import { RecentEditTracker } from './tracker/codeEditTracker';
|
|
3
|
+
import { CredentialsProvider, Logging, Telemetry, Workspace } from '@aws/language-server-runtimes/server-interface';
|
|
4
|
+
import { GenerateSuggestionsResponse } from '../../shared/codeWhispererService';
|
|
5
|
+
import { CodeWhispererSession, SessionManager } from './session/sessionManager';
|
|
6
|
+
import { CursorTracker } from './tracker/cursorTracker';
|
|
7
|
+
import { CodewhispererLanguage } from '../../shared/languageDetection';
|
|
8
|
+
import { TelemetryService } from '../../shared/telemetry/telemetryService';
|
|
9
|
+
import { AmazonQBaseServiceManager } from '../../shared/amazonQServiceManager/BaseAmazonQServiceManager';
|
|
10
|
+
import { RejectedEditTracker } from './tracker/rejectedEditTracker';
|
|
11
|
+
import { DocumentChangedListener } from './documentChangedListener';
|
|
12
|
+
export declare class EditCompletionHandler {
|
|
13
|
+
readonly logging: Logging;
|
|
14
|
+
readonly clientMetadata: InitializeParams;
|
|
15
|
+
readonly workspace: Workspace;
|
|
16
|
+
readonly amazonQServiceManager: AmazonQBaseServiceManager;
|
|
17
|
+
readonly sessionManager: SessionManager;
|
|
18
|
+
readonly cursorTracker: CursorTracker;
|
|
19
|
+
readonly recentEditsTracker: RecentEditTracker;
|
|
20
|
+
readonly rejectedEditTracker: RejectedEditTracker;
|
|
21
|
+
readonly documentChangedListener: DocumentChangedListener;
|
|
22
|
+
readonly telemetry: Telemetry;
|
|
23
|
+
readonly telemetryService: TelemetryService;
|
|
24
|
+
readonly credentialsProvider: CredentialsProvider;
|
|
25
|
+
private readonly editsEnabled;
|
|
26
|
+
private debounceTimeout;
|
|
27
|
+
private isWaiting;
|
|
28
|
+
private hasDocumentChangedSinceInvocation;
|
|
29
|
+
constructor(logging: Logging, clientMetadata: InitializeParams, workspace: Workspace, amazonQServiceManager: AmazonQBaseServiceManager, sessionManager: SessionManager, cursorTracker: CursorTracker, recentEditsTracker: RecentEditTracker, rejectedEditTracker: RejectedEditTracker, documentChangedListener: DocumentChangedListener, telemetry: Telemetry, telemetryService: TelemetryService, credentialsProvider: CredentialsProvider);
|
|
30
|
+
get codeWhispererService(): import("../../shared/codeWhispererService").CodeWhispererServiceBase;
|
|
31
|
+
/**
|
|
32
|
+
* This is a workaround to refresh the debounce timer when user is typing quickly.
|
|
33
|
+
* Adding debounce at function call doesnt work because server won't process second request until first request is processed.
|
|
34
|
+
* Also as a followup, ideally it should be a message/event publish/subscribe pattern instead of manual invocation like this
|
|
35
|
+
*/
|
|
36
|
+
documentChanged(): void;
|
|
37
|
+
onEditCompletion(params: InlineCompletionWithReferencesParams, token: CancellationToken): Promise<InlineCompletionListWithReferences>;
|
|
38
|
+
_invoke(params: InlineCompletionWithReferencesParams, token: CancellationToken, textDocument: TextDocument, inferredLanguageId: CodewhispererLanguage, currentSession: CodeWhispererSession | undefined): Promise<InlineCompletionListWithReferences>;
|
|
39
|
+
processSuggestionResponse(suggestionResponse: GenerateSuggestionsResponse, session: CodeWhispererSession, isNewSession: boolean, selectionRange?: Range, textDocument?: TextDocument): Promise<{
|
|
40
|
+
items: {
|
|
41
|
+
insertText: string;
|
|
42
|
+
isInlineEdit: boolean;
|
|
43
|
+
itemId: string;
|
|
44
|
+
}[];
|
|
45
|
+
sessionId: string;
|
|
46
|
+
partialResultToken: string | undefined;
|
|
47
|
+
}>;
|
|
48
|
+
handleSuggestionsErrors(error: Error, session: CodeWhispererSession): InlineCompletionListWithReferences;
|
|
49
|
+
}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EditCompletionHandler = void 0;
|
|
4
|
+
const protocol_1 = require("@aws/language-server-runtimes/protocol");
|
|
5
|
+
const codeWhispererService_1 = require("../../shared/codeWhispererService");
|
|
6
|
+
const languageDetection_1 = require("../../shared/languageDetection");
|
|
7
|
+
const workspaceFolderManager_1 = require("../workspaceContext/workspaceFolderManager");
|
|
8
|
+
const trigger_1 = require("./trigger");
|
|
9
|
+
const telemetry_1 = require("./telemetry");
|
|
10
|
+
const mergeRightUtils_1 = require("./mergeRightUtils");
|
|
11
|
+
const lsp_core_1 = require("@aws/lsp-core");
|
|
12
|
+
const utils_1 = require("../../shared/utils");
|
|
13
|
+
const errors_1 = require("../../shared/amazonQServiceManager/errors");
|
|
14
|
+
const constants_1 = require("./constants");
|
|
15
|
+
class EditCompletionHandler {
|
|
16
|
+
logging;
|
|
17
|
+
clientMetadata;
|
|
18
|
+
workspace;
|
|
19
|
+
amazonQServiceManager;
|
|
20
|
+
sessionManager;
|
|
21
|
+
cursorTracker;
|
|
22
|
+
recentEditsTracker;
|
|
23
|
+
rejectedEditTracker;
|
|
24
|
+
documentChangedListener;
|
|
25
|
+
telemetry;
|
|
26
|
+
telemetryService;
|
|
27
|
+
credentialsProvider;
|
|
28
|
+
editsEnabled;
|
|
29
|
+
debounceTimeout;
|
|
30
|
+
isWaiting = false;
|
|
31
|
+
hasDocumentChangedSinceInvocation = false;
|
|
32
|
+
constructor(logging, clientMetadata, workspace, amazonQServiceManager, sessionManager, cursorTracker, recentEditsTracker, rejectedEditTracker, documentChangedListener, telemetry, telemetryService, credentialsProvider) {
|
|
33
|
+
this.logging = logging;
|
|
34
|
+
this.clientMetadata = clientMetadata;
|
|
35
|
+
this.workspace = workspace;
|
|
36
|
+
this.amazonQServiceManager = amazonQServiceManager;
|
|
37
|
+
this.sessionManager = sessionManager;
|
|
38
|
+
this.cursorTracker = cursorTracker;
|
|
39
|
+
this.recentEditsTracker = recentEditsTracker;
|
|
40
|
+
this.rejectedEditTracker = rejectedEditTracker;
|
|
41
|
+
this.documentChangedListener = documentChangedListener;
|
|
42
|
+
this.telemetry = telemetry;
|
|
43
|
+
this.telemetryService = telemetryService;
|
|
44
|
+
this.credentialsProvider = credentialsProvider;
|
|
45
|
+
this.editsEnabled =
|
|
46
|
+
this.clientMetadata.initializationOptions?.aws?.awsClientCapabilities?.textDocument
|
|
47
|
+
?.inlineCompletionWithReferences?.inlineEditSupport ?? false;
|
|
48
|
+
}
|
|
49
|
+
get codeWhispererService() {
|
|
50
|
+
return this.amazonQServiceManager.getCodewhispererService();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* This is a workaround to refresh the debounce timer when user is typing quickly.
|
|
54
|
+
* Adding debounce at function call doesnt work because server won't process second request until first request is processed.
|
|
55
|
+
* Also as a followup, ideally it should be a message/event publish/subscribe pattern instead of manual invocation like this
|
|
56
|
+
*/
|
|
57
|
+
documentChanged() {
|
|
58
|
+
if (this.debounceTimeout) {
|
|
59
|
+
this.logging.info('[NEP] refresh timeout');
|
|
60
|
+
this.debounceTimeout.refresh();
|
|
61
|
+
}
|
|
62
|
+
if (this.isWaiting) {
|
|
63
|
+
this.hasDocumentChangedSinceInvocation = true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async onEditCompletion(params, token) {
|
|
67
|
+
this.hasDocumentChangedSinceInvocation = false;
|
|
68
|
+
this.debounceTimeout = undefined;
|
|
69
|
+
// On every new completion request close current inflight session.
|
|
70
|
+
const currentSession = this.sessionManager.getCurrentSession();
|
|
71
|
+
if (currentSession && currentSession.state == 'REQUESTING' && !params.partialResultToken) {
|
|
72
|
+
// this REQUESTING state only happens when the session is initialized, which is rare
|
|
73
|
+
currentSession.discardInflightSessionOnNewInvocation = true;
|
|
74
|
+
}
|
|
75
|
+
if (this.cursorTracker) {
|
|
76
|
+
this.cursorTracker.trackPosition(params.textDocument.uri, params.position);
|
|
77
|
+
}
|
|
78
|
+
const textDocument = await this.workspace.getTextDocument(params.textDocument.uri);
|
|
79
|
+
if (!textDocument) {
|
|
80
|
+
this.logging.warn(`textDocument [${params.textDocument.uri}] not found`);
|
|
81
|
+
return constants_1.EMPTY_RESULT;
|
|
82
|
+
}
|
|
83
|
+
if (!(this.codeWhispererService instanceof codeWhispererService_1.CodeWhispererServiceToken)) {
|
|
84
|
+
return constants_1.EMPTY_RESULT;
|
|
85
|
+
}
|
|
86
|
+
// request for new session
|
|
87
|
+
const inferredLanguageId = (0, languageDetection_1.getSupportedLanguageId)(textDocument);
|
|
88
|
+
if (!inferredLanguageId) {
|
|
89
|
+
this.logging.log(`textDocument [${params.textDocument.uri}] with languageId [${textDocument.languageId}] not supported`);
|
|
90
|
+
return constants_1.EMPTY_RESULT;
|
|
91
|
+
}
|
|
92
|
+
if (params.partialResultToken && currentSession) {
|
|
93
|
+
// subsequent paginated requests for current session
|
|
94
|
+
try {
|
|
95
|
+
const suggestionResponse = await this.codeWhispererService.generateSuggestions({
|
|
96
|
+
...currentSession.requestContext,
|
|
97
|
+
nextToken: `${params.partialResultToken}`,
|
|
98
|
+
});
|
|
99
|
+
return await this.processSuggestionResponse(suggestionResponse, currentSession, false, params.context.selectedCompletionInfo?.range);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return this.handleSuggestionsErrors(error, currentSession);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// TODO: telemetry, discarded suggestions
|
|
106
|
+
// The other easy way to do this is simply not return any suggestion (which is used when retry > 3)
|
|
107
|
+
const invokeWithRetry = async (attempt = 0) => {
|
|
108
|
+
return new Promise(async (resolve) => {
|
|
109
|
+
this.debounceTimeout = setTimeout(async () => {
|
|
110
|
+
try {
|
|
111
|
+
this.isWaiting = true;
|
|
112
|
+
const result = await this._invoke(params, token, textDocument, inferredLanguageId, currentSession).finally(() => {
|
|
113
|
+
this.isWaiting = false;
|
|
114
|
+
});
|
|
115
|
+
if (this.hasDocumentChangedSinceInvocation) {
|
|
116
|
+
if (attempt < constants_1.EDIT_STALE_RETRY_COUNT) {
|
|
117
|
+
this.logging.info(`Document changed during execution, retrying (attempt ${attempt + 1})`);
|
|
118
|
+
this.hasDocumentChangedSinceInvocation = false;
|
|
119
|
+
const retryResult = await invokeWithRetry(attempt + 1);
|
|
120
|
+
resolve(retryResult);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
this.logging.info('Max retries reached, returning empty result');
|
|
124
|
+
resolve(constants_1.EMPTY_RESULT);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
this.logging.info('No document changes, resolving result');
|
|
129
|
+
resolve(result);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
this.debounceTimeout = undefined;
|
|
134
|
+
}
|
|
135
|
+
}, constants_1.EDIT_DEBOUNCE_INTERVAL_MS);
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
return invokeWithRetry();
|
|
139
|
+
}
|
|
140
|
+
async _invoke(params, token, textDocument, inferredLanguageId, currentSession) {
|
|
141
|
+
// Build request context
|
|
142
|
+
const isAutomaticLspTriggerKind = params.context.triggerKind == protocol_1.InlineCompletionTriggerKind.Automatic;
|
|
143
|
+
const maxResults = isAutomaticLspTriggerKind ? 1 : 5;
|
|
144
|
+
const fileContext = (0, codeWhispererService_1.getFileContext)({
|
|
145
|
+
textDocument,
|
|
146
|
+
inferredLanguageId,
|
|
147
|
+
position: params.position,
|
|
148
|
+
workspaceFolder: this.workspace.getWorkspaceFolder(textDocument.uri),
|
|
149
|
+
});
|
|
150
|
+
const workspaceState = workspaceFolderManager_1.WorkspaceFolderManager.getInstance()?.getWorkspaceState();
|
|
151
|
+
const workspaceId = workspaceState?.webSocketClient?.isConnected() ? workspaceState.workspaceId : undefined;
|
|
152
|
+
const qEditsTrigger = (0, trigger_1.shouldTriggerEdits)(this.codeWhispererService, fileContext, params, this.cursorTracker, this.recentEditsTracker, this.sessionManager, true);
|
|
153
|
+
if (!qEditsTrigger) {
|
|
154
|
+
return constants_1.EMPTY_RESULT;
|
|
155
|
+
}
|
|
156
|
+
const generateCompletionReq = {
|
|
157
|
+
fileContext: fileContext,
|
|
158
|
+
maxResults: maxResults,
|
|
159
|
+
predictionTypes: ['EDITS'],
|
|
160
|
+
workspaceId: workspaceId,
|
|
161
|
+
};
|
|
162
|
+
if (qEditsTrigger) {
|
|
163
|
+
generateCompletionReq.editorState = {
|
|
164
|
+
document: {
|
|
165
|
+
relativeFilePath: textDocument.uri,
|
|
166
|
+
programmingLanguage: {
|
|
167
|
+
languageName: generateCompletionReq.fileContext.programmingLanguage.languageName,
|
|
168
|
+
},
|
|
169
|
+
text: textDocument.getText(),
|
|
170
|
+
},
|
|
171
|
+
cursorState: {
|
|
172
|
+
position: {
|
|
173
|
+
line: params.position.line,
|
|
174
|
+
character: params.position.character,
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const supplementalContext = await this.codeWhispererService.constructSupplementalContext(textDocument, params.position, this.workspace, this.recentEditsTracker, this.logging, token, params.openTabFilepaths, {
|
|
180
|
+
includeRecentEdits: true,
|
|
181
|
+
});
|
|
182
|
+
if (supplementalContext) {
|
|
183
|
+
generateCompletionReq.supplementalContexts = supplementalContext.items;
|
|
184
|
+
}
|
|
185
|
+
// Close ACTIVE session and record Discard trigger decision immediately
|
|
186
|
+
if (currentSession && currentSession.state === 'ACTIVE') {
|
|
187
|
+
if (this.editsEnabled && currentSession.suggestionType === codeWhispererService_1.SuggestionType.EDIT) {
|
|
188
|
+
const mergedSuggestions = (0, mergeRightUtils_1.mergeEditSuggestionsWithFileContext)(currentSession, textDocument, fileContext);
|
|
189
|
+
if (mergedSuggestions.length > 0) {
|
|
190
|
+
return {
|
|
191
|
+
items: mergedSuggestions,
|
|
192
|
+
sessionId: currentSession.id,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Emit user trigger decision at session close time for active session
|
|
197
|
+
this.sessionManager.discardSession(currentSession);
|
|
198
|
+
const streakLength = this.editsEnabled ? this.sessionManager.getAndUpdateStreakLength(false) : 0;
|
|
199
|
+
await (0, telemetry_1.emitUserTriggerDecisionTelemetry)(this.telemetry, this.telemetryService, currentSession, this.documentChangedListener.timeSinceLastUserModification, 0, 0, [], [], streakLength);
|
|
200
|
+
}
|
|
201
|
+
const newSession = this.sessionManager.createSession({
|
|
202
|
+
document: textDocument,
|
|
203
|
+
startPosition: params.position,
|
|
204
|
+
triggerType: isAutomaticLspTriggerKind ? 'AutoTrigger' : 'OnDemand',
|
|
205
|
+
language: fileContext.programmingLanguage.languageName,
|
|
206
|
+
requestContext: generateCompletionReq,
|
|
207
|
+
autoTriggerType: undefined,
|
|
208
|
+
triggerCharacter: '',
|
|
209
|
+
classifierResult: undefined,
|
|
210
|
+
classifierThreshold: undefined,
|
|
211
|
+
credentialStartUrl: this.credentialsProvider.getConnectionMetadata?.()?.sso?.startUrl ?? undefined,
|
|
212
|
+
supplementalMetadata: supplementalContext?.supContextData,
|
|
213
|
+
customizationArn: lsp_core_1.textUtils.undefinedIfEmpty(this.codeWhispererService.customizationArn),
|
|
214
|
+
});
|
|
215
|
+
try {
|
|
216
|
+
const suggestionResponse = await this.codeWhispererService.generateSuggestions(generateCompletionReq);
|
|
217
|
+
return await this.processSuggestionResponse(suggestionResponse, newSession, true, params.context.selectedCompletionInfo?.range);
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
return this.handleSuggestionsErrors(error, newSession);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async processSuggestionResponse(suggestionResponse, session, isNewSession, selectionRange, textDocument) {
|
|
224
|
+
// TODO: we haven't decided how to do these telemetry for Edits suggestions
|
|
225
|
+
// codePercentageTracker.countInvocation(session.language)
|
|
226
|
+
// userWrittenCodeTracker?.recordUsageCount(session.language)
|
|
227
|
+
if (isNewSession) {
|
|
228
|
+
// Populate the session with information from codewhisperer response
|
|
229
|
+
session.suggestions = suggestionResponse.suggestions;
|
|
230
|
+
session.responseContext = suggestionResponse.responseContext;
|
|
231
|
+
session.codewhispererSessionId = suggestionResponse.responseContext.codewhispererSessionId;
|
|
232
|
+
session.timeToFirstRecommendation = new Date().getTime() - session.startTime;
|
|
233
|
+
session.suggestionType = suggestionResponse.suggestionType;
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
session.suggestions = [...session.suggestions, ...suggestionResponse.suggestions];
|
|
237
|
+
}
|
|
238
|
+
// Emit service invocation telemetry for every request sent to backend
|
|
239
|
+
(0, telemetry_1.emitServiceInvocationTelemetry)(this.telemetry, session, suggestionResponse.responseContext.requestId);
|
|
240
|
+
// Discard previous inflight API response due to new trigger
|
|
241
|
+
if (session.discardInflightSessionOnNewInvocation) {
|
|
242
|
+
session.discardInflightSessionOnNewInvocation = false;
|
|
243
|
+
this.sessionManager.discardSession(session);
|
|
244
|
+
const streakLength = this.editsEnabled ? this.sessionManager.getAndUpdateStreakLength(false) : 0;
|
|
245
|
+
await (0, telemetry_1.emitUserTriggerDecisionTelemetry)(this.telemetry, this.telemetryService, session, this.documentChangedListener.timeSinceLastUserModification, 0, 0, [], [], streakLength);
|
|
246
|
+
}
|
|
247
|
+
// API response was recieved, we can activate session now
|
|
248
|
+
this.sessionManager.activateSession(session);
|
|
249
|
+
// Process suggestions to apply Empty or Filter filters
|
|
250
|
+
const filteredSuggestions = suggestionResponse.suggestions
|
|
251
|
+
// Empty suggestion filter
|
|
252
|
+
.filter(suggestion => {
|
|
253
|
+
if (suggestion.content === '') {
|
|
254
|
+
session.setSuggestionState(suggestion.itemId, 'Empty');
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
return true;
|
|
258
|
+
})
|
|
259
|
+
// References setting filter
|
|
260
|
+
.filter(suggestion => {
|
|
261
|
+
// State to track whether code with references should be included in
|
|
262
|
+
// the response. No locking or concurrency controls, filtering is done
|
|
263
|
+
// right before returning and is only guaranteed to be consistent within
|
|
264
|
+
// the context of a single response.
|
|
265
|
+
const { includeSuggestionsWithCodeReferences } = this.amazonQServiceManager.getConfiguration();
|
|
266
|
+
if (includeSuggestionsWithCodeReferences) {
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
if (suggestion.references == null || suggestion.references.length === 0) {
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
// Filter out suggestions that have references when includeSuggestionsWithCodeReferences setting is true
|
|
273
|
+
session.setSuggestionState(suggestion.itemId, 'Filter');
|
|
274
|
+
return false;
|
|
275
|
+
});
|
|
276
|
+
return {
|
|
277
|
+
items: suggestionResponse.suggestions
|
|
278
|
+
.map(suggestion => {
|
|
279
|
+
// Check if this suggestion is similar to a previously rejected edit
|
|
280
|
+
const isSimilarToRejected = this.rejectedEditTracker.isSimilarToRejected(suggestion.content, textDocument?.uri || '');
|
|
281
|
+
if (isSimilarToRejected) {
|
|
282
|
+
// Mark as rejected in the session
|
|
283
|
+
session.setSuggestionState(suggestion.itemId, 'Reject');
|
|
284
|
+
this.logging.debug(`[EDIT_PREDICTION] Filtered out suggestion similar to previously rejected edit`);
|
|
285
|
+
// Return empty item that will be filtered out
|
|
286
|
+
return {
|
|
287
|
+
insertText: '',
|
|
288
|
+
isInlineEdit: true,
|
|
289
|
+
itemId: suggestion.itemId,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
insertText: suggestion.content,
|
|
294
|
+
isInlineEdit: true,
|
|
295
|
+
itemId: suggestion.itemId,
|
|
296
|
+
};
|
|
297
|
+
})
|
|
298
|
+
.filter(item => item.insertText !== ''),
|
|
299
|
+
sessionId: session.id,
|
|
300
|
+
partialResultToken: suggestionResponse.responseContext.nextToken,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
handleSuggestionsErrors(error, session) {
|
|
304
|
+
this.logging.log('Recommendation failure: ' + error);
|
|
305
|
+
(0, telemetry_1.emitServiceInvocationFailure)(this.telemetry, session, error);
|
|
306
|
+
this.sessionManager.closeSession(session);
|
|
307
|
+
let translatedError = error;
|
|
308
|
+
if ((0, utils_1.hasConnectionExpired)(error)) {
|
|
309
|
+
translatedError = new errors_1.AmazonQServiceConnectionExpiredError((0, utils_1.getErrorMessage)(error));
|
|
310
|
+
}
|
|
311
|
+
if (translatedError instanceof errors_1.AmazonQError) {
|
|
312
|
+
throw new protocol_1.ResponseError(protocol_1.LSPErrorCodes.RequestFailed, translatedError.message || 'Error processing suggestion requests', {
|
|
313
|
+
awsErrorCode: translatedError.code,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
return constants_1.EMPTY_RESULT;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
exports.EditCompletionHandler = EditCompletionHandler;
|
|
320
|
+
//# sourceMappingURL=editCompletionHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editCompletionHandler.js","sourceRoot":"","sources":["../../../src/language-server/inline-completion/editCompletionHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,6 +60,8 @@ export declare class CodeWhispererSession {
|
|
|
60
60
|
includeImportsWithSuggestions?: boolean;
|
|
61
61
|
codewhispererSuggestionImportCount: number;
|
|
62
62
|
suggestionType?: string;
|
|
63
|
+
hasEditsPending?: boolean;
|
|
64
|
+
recentItemId?: string;
|
|
63
65
|
constructor(data: SessionData);
|
|
64
66
|
generateSessionId(): string;
|
|
65
67
|
get lastSuggestionIndex(): number;
|
|
@@ -79,9 +81,15 @@ export declare class CodeWhispererSession {
|
|
|
79
81
|
* - Discard otherwise
|
|
80
82
|
*/
|
|
81
83
|
getAggregatedUserTriggerDecision(): UserTriggerDecision | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Determines trigger decision based on the most recent user action.
|
|
86
|
+
* Uses the last processed itemId to determine the overall session decision.
|
|
87
|
+
*/
|
|
88
|
+
getLatestUserTriggerDecision(): UserTriggerDecision | undefined;
|
|
82
89
|
}
|
|
83
90
|
export declare class SessionManager {
|
|
84
|
-
private static
|
|
91
|
+
private static _completionInstance?;
|
|
92
|
+
private static _editInstance?;
|
|
85
93
|
private currentSession?;
|
|
86
94
|
private sessionsLog;
|
|
87
95
|
private maxHistorySize;
|
|
@@ -90,7 +98,7 @@ export declare class SessionManager {
|
|
|
90
98
|
/**
|
|
91
99
|
* Singleton SessionManager class
|
|
92
100
|
*/
|
|
93
|
-
static getInstance(): SessionManager;
|
|
101
|
+
static getInstance(type?: 'COMPLETIONS' | 'EDITS'): SessionManager;
|
|
94
102
|
static reset(): void;
|
|
95
103
|
createSession(data: SessionData): CodeWhispererSession;
|
|
96
104
|
closeCurrentSession(): void;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SessionManager = exports.CodeWhispererSession = void 0;
|
|
4
4
|
const uuid_1 = require("uuid");
|
|
5
|
+
const codeWhispererService_1 = require("../../../shared/codeWhispererService");
|
|
5
6
|
class CodeWhispererSession {
|
|
6
7
|
id;
|
|
7
8
|
document;
|
|
@@ -41,6 +42,9 @@ class CodeWhispererSession {
|
|
|
41
42
|
includeImportsWithSuggestions;
|
|
42
43
|
codewhispererSuggestionImportCount = 0;
|
|
43
44
|
suggestionType;
|
|
45
|
+
hasEditsPending = false;
|
|
46
|
+
// Track the most recent itemId for paginated Edit suggestions
|
|
47
|
+
recentItemId;
|
|
44
48
|
constructor(data) {
|
|
45
49
|
this.id = this.generateSessionId();
|
|
46
50
|
this.document = data.document;
|
|
@@ -101,7 +105,9 @@ class CodeWhispererSession {
|
|
|
101
105
|
}
|
|
102
106
|
setClientResultData(completionSessionResult, firstCompletionDisplayLatency, totalSessionDisplayTime, typeaheadLength) {
|
|
103
107
|
// Skip if session results were already recorded for session of session is closed
|
|
104
|
-
if (this.state === 'CLOSED' ||
|
|
108
|
+
if (this.state === 'CLOSED' ||
|
|
109
|
+
this.state === 'DISCARD' ||
|
|
110
|
+
(this.completionSessionResult && this.suggestionType === codeWhispererService_1.SuggestionType.COMPLETION)) {
|
|
105
111
|
return;
|
|
106
112
|
}
|
|
107
113
|
this.completionSessionResult = completionSessionResult;
|
|
@@ -141,6 +147,7 @@ class CodeWhispererSession {
|
|
|
141
147
|
// No recommendation was accepted, but user have seen this suggestion
|
|
142
148
|
this.setSuggestionState(itemId, 'Reject');
|
|
143
149
|
}
|
|
150
|
+
this.recentItemId = itemId;
|
|
144
151
|
}
|
|
145
152
|
this.firstCompletionDisplayLatency = firstCompletionDisplayLatency;
|
|
146
153
|
this.totalSessionDisplayTime = totalSessionDisplayTime;
|
|
@@ -182,10 +189,29 @@ class CodeWhispererSession {
|
|
|
182
189
|
}
|
|
183
190
|
return isEmpty ? 'Empty' : 'Discard';
|
|
184
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Determines trigger decision based on the most recent user action.
|
|
194
|
+
* Uses the last processed itemId to determine the overall session decision.
|
|
195
|
+
*/
|
|
196
|
+
getLatestUserTriggerDecision() {
|
|
197
|
+
// Force Discard trigger decision when session was explicitly discarded by server
|
|
198
|
+
if (this.state === 'DISCARD') {
|
|
199
|
+
return 'Discard';
|
|
200
|
+
}
|
|
201
|
+
if (!this.recentItemId)
|
|
202
|
+
return;
|
|
203
|
+
const state = this.getSuggestionState(this.recentItemId);
|
|
204
|
+
if (state === 'Accept')
|
|
205
|
+
return 'Accept';
|
|
206
|
+
if (state === 'Reject')
|
|
207
|
+
return 'Reject';
|
|
208
|
+
return state === 'Empty' ? 'Empty' : 'Discard';
|
|
209
|
+
}
|
|
185
210
|
}
|
|
186
211
|
exports.CodeWhispererSession = CodeWhispererSession;
|
|
187
212
|
class SessionManager {
|
|
188
|
-
static
|
|
213
|
+
static _completionInstance;
|
|
214
|
+
static _editInstance;
|
|
189
215
|
currentSession;
|
|
190
216
|
sessionsLog = [];
|
|
191
217
|
maxHistorySize = 5;
|
|
@@ -195,15 +221,16 @@ class SessionManager {
|
|
|
195
221
|
/**
|
|
196
222
|
* Singleton SessionManager class
|
|
197
223
|
*/
|
|
198
|
-
static getInstance() {
|
|
199
|
-
if (
|
|
200
|
-
SessionManager.
|
|
224
|
+
static getInstance(type = 'COMPLETIONS') {
|
|
225
|
+
if (type === 'EDITS') {
|
|
226
|
+
return (SessionManager._editInstance ??= new SessionManager());
|
|
201
227
|
}
|
|
202
|
-
return SessionManager.
|
|
228
|
+
return (SessionManager._completionInstance ??= new SessionManager());
|
|
203
229
|
}
|
|
204
230
|
// For unit tests
|
|
205
231
|
static reset() {
|
|
206
|
-
SessionManager.
|
|
232
|
+
SessionManager._completionInstance = undefined;
|
|
233
|
+
SessionManager._editInstance = undefined;
|
|
207
234
|
}
|
|
208
235
|
createSession(data) {
|
|
209
236
|
this.closeCurrentSession();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionManager.js","sourceRoot":"","sources":["../../../../src/language-server/inline-completion/session/sessionManager.ts"],"names":[],"mappings":";;;AAMA,+BAAmC;
|
|
1
|
+
{"version":3,"file":"sessionManager.js","sourceRoot":"","sources":["../../../../src/language-server/inline-completion/session/sessionManager.ts"],"names":[],"mappings":";;;AAMA,+BAAmC;AAEnC,+EAK6C;AA4B7C,MAAa,oBAAoB;IAC7B,EAAE,CAAQ;IACV,QAAQ,CAAc;IACtB,SAAS,CAAQ;IACjB,kGAAkG;IAClG,SAAS,GAAY,CAAC,CAAA;IACtB,KAAK,CAAc;IACnB,sBAAsB,CAAS;IAC/B,aAAa,GAAa;QACtB,IAAI,EAAE,CAAC;QACP,SAAS,EAAE,CAAC;KACf,CAAA;IACD,qCAAqC,GAAY,KAAK,CAAA;IACtD,WAAW,GAAuB,EAAE,CAAA;IACpC,iCAAiC,GAAyC,EAAE,CAAA;IAC5E,iBAAiB,GAAG,IAAI,GAAG,EAAwB,CAAA;IACnD,oBAAoB,GAAY,SAAS,CAAA;IACzC,eAAe,CAAkB;IACjC,WAAW,CAA0B;IACrC,eAAe,CAAoC;IACnD,gBAAgB,CAAS;IACzB,gBAAgB,CAAS;IACzB,mBAAmB,CAAS;IAC5B,QAAQ,CAAuB;IAC/B,cAAc,CAA4B;IAC1C,oBAAoB,CAAmC;IACvD,yBAAyB,GAAW,CAAC,CAAA;IACrC,kBAAkB,CAAS;IAC3B,uBAAuB,CAEtB;IACD,6BAA6B,CAAS;IACtC,uBAAuB,CAAS;IAChC,eAAe,CAAS;IACxB,uBAAuB,CAAsB;IAC7C,2BAA2B,CAAS;IACpC,oBAAoB,GAAY,KAAK,CAAA;IACrC,gBAAgB,CAAS;IACzB,6BAA6B,CAAU;IACvC,kCAAkC,GAAW,CAAC,CAAA;IAC9C,cAAc,CAAS;IACvB,eAAe,GAAa,KAAK,CAAA;IACjC,8DAA8D;IAC9D,YAAY,CAAS;IAErB,YAAY,IAAiB;QACzB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAClC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC7B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAA;QACjD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAA;QACvC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACnC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAA;QACzC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,SAAS,CAAA;QACxD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAA;QAC7C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAA;QAC7C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAA;QACnD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAA;QAC7C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAA;QACrD,IAAI,CAAC,KAAK,GAAG,YAAY,CAAA;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;IACzC,CAAC;IAED,gEAAgE;IAChE,iBAAiB;QACb,OAAO,IAAA,SAAM,GAAE,CAAA;IACnB,CAAC;IAED,IAAI,mBAAmB;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAA;IACtC,CAAC;IAED,QAAQ;QACJ,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACtD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAA;QACzB,CAAC;IACL,CAAC;IAED,KAAK;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACtD,OAAM;QACV,CAAC;QAED,oHAAoH;QACpH,2GAA2G;QAC3G,kFAAkF;QAClF,sEAAsE;QACtE,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAChC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACxC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBACjD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;gBAC5D,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;QAErC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAA;IACzB,CAAC;IAED,OAAO;QACH,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAM;QACV,CAAC;QAED,mEAAmE;QACnE,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAC5D,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;QAErC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAA;IAC1B,CAAC;IAED,mBAAmB,CACf,uBAAqE,EACrE,6BAAsC,EACtC,uBAAgC,EAChC,eAAwB;QAExB,iFAAiF;QACjF,IACI,IAAI,CAAC,KAAK,KAAK,QAAQ;YACvB,IAAI,CAAC,KAAK,KAAK,SAAS;YACxB,CAAC,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,cAAc,KAAK,qCAAc,CAAC,UAAU,CAAC,EACrF,CAAC;YACC,OAAM;QACV,CAAC;QAED,IAAI,CAAC,uBAAuB,GAAG,uBAAuB,CAAA;QAEtD,IAAI,qBAAqB,GAAG,KAAK,CAAA;QACjC,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAA;QAC9D,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAA;gBAClC,qBAAqB,GAAG,IAAI,CAAA;gBAC5B,SAAQ;YACZ,CAAC;QACL,CAAC;QAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAE9D,KAAK,IAAI,MAAM,IAAI,uBAAuB,EAAE,CAAC;YACzC,8DAA8D;YAC9D,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvC,SAAQ;YACZ,CAAC;YAED,2CAA2C;YAC3C,sHAAsH;YACtH,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAA;YAE9C,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;YAC9C,CAAC;iBAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACtB,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;gBACzC,oBAAoB;YACxB,CAAC;iBAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACzB,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YAC7C,CAAC;iBAAM,IAAI,qBAAqB,IAAI,IAAI,CAAC,oBAAoB,KAAK,MAAM,EAAE,CAAC;gBACvE,qCAAqC;gBACrC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YAC7C,CAAC;iBAAM,CAAC;gBACJ,qEAAqE;gBACrE,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YAC7C,CAAC;YAED,IAAI,CAAC,YAAY,GAAG,MAAM,CAAA;QAC9B,CAAC;QAED,IAAI,CAAC,6BAA6B,GAAG,6BAA6B,CAAA;QAClE,IAAI,CAAC,uBAAuB,GAAG,uBAAuB,CAAA;QACtD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;IAC1C,CAAC;IAED,kBAAkB,CAAC,EAAU,EAAE,KAAmB;QAC9C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;IACzC,CAAC;IAED,kBAAkB,CAAC,EAAU;QACzB,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACzC,CAAC;IAED;;;;;;OAMG;IACH,gCAAgC;QAC5B,iFAAiF;QACjF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAA;QACpB,CAAC;QAED,kEAAkE;QAClE,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAM;QACV,CAAC;QAED,IAAI,OAAO,GAAG,IAAI,CAAA;QAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC;YAClD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrB,OAAO,QAAQ,CAAA;YACnB,CAAC;iBAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO,QAAQ,CAAA;YACnB,CAAC;iBAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBAC3B,OAAO,GAAG,KAAK,CAAA;YACnB,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IACxC,CAAC;IAED;;;OAGG;IACH,4BAA4B;QACxB,iFAAiF;QACjF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAA;QACpB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAM;QAE9B,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACxD,IAAI,KAAK,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAA;QACvC,IAAI,KAAK,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAA;QACvC,OAAO,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IAClD,CAAC;CACJ;AAzOD,oDAyOC;AAED,MAAa,cAAc;IACf,MAAM,CAAC,mBAAmB,CAAiB;IAC3C,MAAM,CAAC,aAAa,CAAiB;IACrC,cAAc,CAAuB;IACrC,WAAW,GAA2B,EAAE,CAAA;IACxC,cAAc,GAAG,CAAC,CAAA;IAC1B,YAAY,GAAW,CAAC,CAAA;IACxB,0IAA0I;IAE1I,gBAAuB,CAAC;IAExB;;OAEG;IACI,MAAM,CAAC,WAAW,CAAC,OAAgC,aAAa;QACnE,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,cAAc,CAAC,aAAa,KAAK,IAAI,cAAc,EAAE,CAAC,CAAA;QAClE,CAAC;QAED,OAAO,CAAC,cAAc,CAAC,mBAAmB,KAAK,IAAI,cAAc,EAAE,CAAC,CAAA;IACxE,CAAC;IAED,iBAAiB;IACV,MAAM,CAAC,KAAK;QACf,cAAc,CAAC,mBAAmB,GAAG,SAAS,CAAA;QAC9C,cAAc,CAAC,aAAa,GAAG,SAAS,CAAA;IAC5C,CAAC;IAEM,aAAa,CAAC,IAAiB;QAClC,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAE1B,iCAAiC;QACjC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAChD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;QAC5B,CAAC;QAED,qBAAqB;QACrB,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAE9C,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA;QACjD,IAAI,eAAe,EAAE,CAAC;YAClB,OAAO,CAAC,uBAAuB,GAAG,eAAe,CAAC,gCAAgC,EAAE,CAAA;YACpF,OAAO,CAAC,2BAA2B,GAAG,eAAe,CAAC,SAAS,CAAA;QACnE,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,OAAO,CAAA;QAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAE9B,OAAO,OAAO,CAAA;IAClB,CAAC;IAED,mBAAmB;QACf,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC1C,CAAC;IACL,CAAC;IAED,YAAY,CAAC,OAA6B;QACtC,OAAO,CAAC,KAAK,EAAE,CAAA;IACnB,CAAC;IAED,cAAc,CAAC,OAA6B;QACxC,OAAO,CAAC,OAAO,EAAE,CAAA;IACrB,CAAC;IAED,iBAAiB;QACb,OAAO,IAAI,CAAC,cAAc,CAAA;IAC9B,CAAC;IAED,gBAAgB;QACZ,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,QAAQ;YAAE,OAAO,IAAI,CAAC,cAAc,CAAA;IAChG,CAAC;IAED,kBAAkB;QACd,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACnE,CAAC;IAED,cAAc;QACV,OAAO,IAAI,CAAC,WAAW,CAAA;IAC3B,CAAC;IAED,cAAc,CAAC,EAAU;QACrB,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC,cAAc,CAAA;QAC9D,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE;gBAAE,OAAO,OAAO,CAAA;QACzC,CAAC;IACL,CAAC;IAED,qEAAqE;IACrE,eAAe,CAAC,OAA6B;QACzC,IAAI,IAAI,CAAC,cAAc,KAAK,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAA;QAClC,CAAC;IACL,CAAC;IAED,wBAAwB,CAAC,UAA+B;QACpD,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAA;YAC7C,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;YACrB,OAAO,mBAAmB,CAAA;QAC9B,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACpB,6DAA6D;YAC7D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;QAC7C,CAAC;QACD,OAAO,CAAC,CAAC,CAAA;IACb,CAAC;CACJ;AA1GD,wCA0GC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.emitAggregatedUserTriggerDecisionTelemetry = exports.emitUserTriggerDecisionTelemetry = exports.emitPerceivedLatencyTelemetry = exports.emitServiceInvocationFailure = exports.emitServiceInvocationTelemetry = void 0;
|
|
4
4
|
const utils_1 = require("../../shared/utils");
|
|
5
|
+
const codeWhispererService_1 = require("../../shared/codeWhispererService");
|
|
5
6
|
const emitServiceInvocationTelemetry = (telemetry, session, requestId) => {
|
|
6
7
|
const duration = new Date().getTime() - session.startTime;
|
|
7
8
|
const data = {
|
|
@@ -94,12 +95,21 @@ const emitUserTriggerDecisionTelemetry = async (telemetry, telemetryService, ses
|
|
|
94
95
|
if (session.reportedUserDecision) {
|
|
95
96
|
return;
|
|
96
97
|
}
|
|
98
|
+
// Edits show one suggestion sequentially (with pagination), so use latest itemId state;
|
|
99
|
+
// Completions show multiple suggestions together, so aggregate all states
|
|
100
|
+
const userTriggerDecision = session.suggestionType === codeWhispererService_1.SuggestionType.EDIT
|
|
101
|
+
? session.getLatestUserTriggerDecision()
|
|
102
|
+
: session.getAggregatedUserTriggerDecision();
|
|
97
103
|
// Can not emit previous trigger decision if it's not available on the session
|
|
98
|
-
if (!
|
|
104
|
+
if (!userTriggerDecision) {
|
|
99
105
|
return;
|
|
100
106
|
}
|
|
101
107
|
await (0, exports.emitAggregatedUserTriggerDecisionTelemetry)(telemetryService, session, timeSinceLastUserModification, addedCharsCountForEditSuggestion, deletedCharsCountForEditSuggestion, addedIdeDiagnostics, removedIdeDiagnostics, streakLength);
|
|
102
|
-
|
|
108
|
+
// Mark telemetry as complete unless Edit suggestion was accepted with more pending
|
|
109
|
+
const hasPendingEditTelemetry = session.suggestionType === codeWhispererService_1.SuggestionType.EDIT && session.acceptedSuggestionId && session.hasEditsPending;
|
|
110
|
+
if (!hasPendingEditTelemetry) {
|
|
111
|
+
session.reportedUserDecision = true;
|
|
112
|
+
}
|
|
103
113
|
};
|
|
104
114
|
exports.emitUserTriggerDecisionTelemetry = emitUserTriggerDecisionTelemetry;
|
|
105
115
|
const emitAggregatedUserTriggerDecisionTelemetry = (telemetryService, session, timeSinceLastUserModification, addedCharsCountForEditSuggestion, deletedCharsCountForEditSuggestion, addedIdeDiagnostics, removedIdeDiagnostics, streakLength) => {
|