diff --git a/package-lock.json b/package-lock.json index 7ad26d71ac9..ef7e8c05e28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22795,31 +22795,6 @@ "version": "1.0.0", "license": "MIT" }, - "node_modules/@aws/language-server-runtimes/node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/vscode-languageserver": { - "version": "9.0.1", - "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/@aws/language-server-runtimes/node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, "node_modules/@aws/language-server-runtimes/node_modules/vscode-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", @@ -26350,31 +26325,6 @@ "yaml-language-server": "0.15.0" } }, - "node_modules/amazon-states-language-service/node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/amazon-states-language-service/node_modules/vscode-languageserver": { - "version": "9.0.1", - "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/amazon-states-language-service/node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, "node_modules/ansi-colors": { "version": "4.1.1", "license": "MIT", @@ -26794,6 +26744,18 @@ "node": ">=8.0.0 || >=10.0.0" } }, + "node_modules/aws-ssm-document-language-service/node_modules/vscode-languageserver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz", + "integrity": "sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "^3.15.3" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, "node_modules/aws-ssm-document-language-service/node_modules/vscode-languageserver-protocol": { "version": "3.14.1", "license": "MIT", @@ -26806,6 +26768,25 @@ "version": "3.14.0", "license": "MIT" }, + "node_modules/aws-ssm-document-language-service/node_modules/vscode-languageserver/node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/aws-ssm-document-language-service/node_modules/vscode-languageserver/node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, "node_modules/aws-ssm-document-language-service/node_modules/vscode-nls": { "version": "4.1.2", "license": "MIT" @@ -36377,52 +36358,71 @@ "license": "MIT" }, "node_modules/vscode-jsonrpc": { - "version": "5.0.1", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", "license": "MIT", "engines": { - "node": ">=8.0.0 || >=10.0.0" + "node": ">=14.0.0" } }, "node_modules/vscode-languageclient": { - "version": "6.1.4", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz", + "integrity": "sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==", "license": "MIT", "dependencies": { - "semver": "^6.3.0", - "vscode-languageserver-protocol": "3.15.3" + "minimatch": "^5.1.0", + "semver": "^7.3.7", + "vscode-languageserver-protocol": "3.17.5" }, "engines": { - "vscode": "^1.41.0" + "vscode": "^1.82.0" + } + }, + "node_modules/vscode-languageclient/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/vscode-languageclient/node_modules/semver": { - "version": "6.3.1", + "node_modules/vscode-languageclient/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/vscode-languageserver": { - "version": "6.1.1", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", "license": "MIT", "dependencies": { - "vscode-languageserver-protocol": "^3.15.3" + "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.15.3", + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", "license": "MIT", "dependencies": { - "vscode-jsonrpc": "^5.0.1", - "vscode-languageserver-types": "3.15.1" + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" } }, - "node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { - "version": "3.15.1", - "license": "MIT" - }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.12", "license": "MIT" @@ -37709,8 +37709,8 @@ "strip-ansi": "^5.2.0", "svgdom": "^0.1.0", "tcp-port-used": "^1.0.1", - "vscode-languageclient": "^6.1.4", - "vscode-languageserver": "^6.1.1", + "vscode-languageclient": "^9.0.1", + "vscode-languageserver": "^9.0.1", "vscode-languageserver-protocol": "^3.15.3", "vscode-languageserver-textdocument": "^1.0.8", "vue": "^3.3.4", diff --git a/packages/amazonq/src/app/inline/EditRendering/displayImage.ts b/packages/amazonq/src/app/inline/EditRendering/displayImage.ts index 7ccedc3489b..035621f0ba4 100644 --- a/packages/amazonq/src/app/inline/EditRendering/displayImage.ts +++ b/packages/amazonq/src/app/inline/EditRendering/displayImage.ts @@ -6,7 +6,7 @@ import { getContext, getLogger, setContext } from 'aws-core-vscode/shared' import * as vscode from 'vscode' import { applyPatch, diffLines } from 'diff' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { CodeWhispererSession } from '../sessionManager' import { LogInlineCompletionSessionResultsParams } from '@aws/language-server-runtimes/protocol' import { InlineCompletionItemWithReferences } from '@aws/language-server-runtimes/protocol' @@ -309,7 +309,7 @@ export async function displaySvgDecoration( newCode: string, originalCodeHighlightRanges: Array<{ line: number; start: number; end: number }>, session: CodeWhispererSession, - languageClient: LanguageClient, + languageClient: BaseLanguageClient, item: InlineCompletionItemWithReferences, inlineCompletionProvider?: AmazonQInlineCompletionItemProvider ) { @@ -323,7 +323,7 @@ export async function displaySvgDecoration( if (Math.abs(startLine - currentCursorLine) >= autoDiscardEditCursorDistance) { // Emit DISCARD telemetry for edit suggestion that can't be shown because the suggestion is too far away const params = createDiscardTelemetryParams(session, item) - languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) + void languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) logSuggestionFailure('DISCARD', 'cursor is too far away', item.insertText as string) return } @@ -342,7 +342,7 @@ export async function displaySvgDecoration( // Emit DISCARD telemetry for edit suggestion that can't be shown due to active completion const params = createDiscardTelemetryParams(session, item) - languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) + void languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) logSuggestionFailure('DISCARD', 'Conflicting active inline completion', item.insertText as string) return } @@ -355,7 +355,7 @@ export async function displaySvgDecoration( const params = createDiscardTelemetryParams(session, item) // TODO: this session is closed on flare side hence discarded is not emitted in flare - languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) + void languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) logSuggestionFailure('DISCARD', 'Invalid patch', item.insertText as string) return } @@ -433,7 +433,7 @@ export async function displaySvgDecoration( firstCompletionDisplayLatency: session.firstCompletionDisplayLatency, isInlineEdit: true, } - languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) + void languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) session.triggerOnAcceptance = true }, async (isDiscard: boolean) => { @@ -466,7 +466,7 @@ export async function displaySvgDecoration( firstCompletionDisplayLatency: session.firstCompletionDisplayLatency, isInlineEdit: true, } - languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) + void languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) }, originalCode, newCode, diff --git a/packages/amazonq/src/app/inline/EditRendering/imageRenderer.ts b/packages/amazonq/src/app/inline/EditRendering/imageRenderer.ts index 6c52dc2d6a0..497239a6c96 100644 --- a/packages/amazonq/src/app/inline/EditRendering/imageRenderer.ts +++ b/packages/amazonq/src/app/inline/EditRendering/imageRenderer.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode' import { displaySvgDecoration } from './displayImage' import { SvgGenerationService } from './svgGenerator' import { getLogger } from 'aws-core-vscode/shared' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { InlineCompletionItemWithReferences } from '@aws/language-server-runtimes/protocol' import { CodeWhispererSession } from '../sessionManager' import type { AmazonQInlineCompletionItemProvider } from '../completion' @@ -16,7 +16,7 @@ export async function showEdits( item: InlineCompletionItemWithReferences, editor: vscode.TextEditor | undefined, session: CodeWhispererSession, - languageClient: LanguageClient, + languageClient: BaseLanguageClient, inlineCompletionProvider?: AmazonQInlineCompletionItemProvider ) { if (!editor) { diff --git a/packages/amazonq/src/app/inline/activation.ts b/packages/amazonq/src/app/inline/activation.ts index 12deb2310fa..5a86d340c00 100644 --- a/packages/amazonq/src/app/inline/activation.ts +++ b/packages/amazonq/src/app/inline/activation.ts @@ -23,9 +23,9 @@ import { vsCodeState, } from 'aws-core-vscode/codewhisperer' import { Commands, getLogger, globals, sleep } from 'aws-core-vscode/shared' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' -export async function activate(languageClient: LanguageClient) { +export async function activate(languageClient: BaseLanguageClient) { const codewhispererSettings = CodeWhispererSettings.instance const client = new DefaultCodeWhispererClient() diff --git a/packages/amazonq/src/app/inline/completion.ts b/packages/amazonq/src/app/inline/completion.ts index c113d3cd2fb..2e5d25be165 100644 --- a/packages/amazonq/src/app/inline/completion.ts +++ b/packages/amazonq/src/app/inline/completion.ts @@ -18,7 +18,7 @@ import { InlineCompletionTriggerKind, Range, } from 'vscode' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { InlineCompletionItemWithReferences, LogInlineCompletionSessionResultsParams, @@ -50,7 +50,7 @@ import { DocumentEventListener } from './documentEventListener' export class InlineCompletionManager implements Disposable { private disposable: Disposable private inlineCompletionProvider: AmazonQInlineCompletionItemProvider - private languageClient: LanguageClient + private languageClient: BaseLanguageClient private sessionManager: SessionManager private recommendationService: RecommendationService private lineTracker: LineTracker @@ -60,7 +60,7 @@ export class InlineCompletionManager implements Disposable { private documentEventListener: DocumentEventListener constructor( - languageClient: LanguageClient, + languageClient: BaseLanguageClient, sessionManager: SessionManager, lineTracker: LineTracker, inlineTutorialAnnotation: InlineTutorialAnnotation, @@ -140,7 +140,7 @@ export class InlineCompletionManager implements Disposable { addedDiagnostics: diagnosticDiff.added.map((it) => toIdeDiagnostics(it)), removedDiagnostics: diagnosticDiff.removed.map((it) => toIdeDiagnostics(it)), } - this.languageClient.sendNotification(this.logSessionResultMessageName, params) + void this.languageClient.sendNotification(this.logSessionResultMessageName, params) this.disposable.dispose() this.disposable = languages.registerInlineCompletionItemProvider( CodeWhispererConstants.platformLanguageIds, @@ -200,7 +200,7 @@ export class InlineCompletionManager implements Disposable { firstCompletionDisplayLatency: session.firstCompletionDisplayLatency, totalSessionDisplayTime: totalSessionDisplayTime, } - this.languageClient.sendNotification(this.logSessionResultMessageName, params) + void this.languageClient.sendNotification(this.logSessionResultMessageName, params) // clear session manager states once rejected this.sessionManager.clear() } finally { @@ -216,7 +216,7 @@ export class AmazonQInlineCompletionItemProvider implements InlineCompletionItem private pendingRequest: Promise | undefined constructor( - private readonly languageClient: LanguageClient, + private readonly languageClient: BaseLanguageClient, private readonly recommendationService: RecommendationService, private readonly sessionManager: SessionManager, private readonly inlineTutorialAnnotation: InlineTutorialAnnotation, @@ -282,7 +282,7 @@ export class AmazonQInlineCompletionItemProvider implements InlineCompletionItem firstCompletionDisplayLatency: session.firstCompletionDisplayLatency, totalSessionDisplayTime: Date.now() - session.requestStartTime, } - this.languageClient.sendNotification(this.logSessionResultMessageName, params) + void this.languageClient.sendNotification(this.logSessionResultMessageName, params) } } @@ -427,7 +427,7 @@ export class AmazonQInlineCompletionItemProvider implements InlineCompletionItem firstCompletionDisplayLatency: prevSession.firstCompletionDisplayLatency, totalSessionDisplayTime: Date.now() - prevSession.requestStartTime, } - this.languageClient.sendNotification(this.logSessionResultMessageName, params) + void this.languageClient.sendNotification(this.logSessionResultMessageName, params) this.sessionManager.clear() // Do not make auto trigger if user rejects a suggestion // by typing characters that does not match @@ -499,7 +499,7 @@ ${itemLog} }, }, } - this.languageClient.sendNotification(this.logSessionResultMessageName, params) + void this.languageClient.sendNotification(this.logSessionResultMessageName, params) this.sessionManager.clear() logstr += `- cursor moved behind trigger position. Discarding completion suggestion...` return [] @@ -566,7 +566,7 @@ ${itemLog} }, }, } - this.languageClient.sendNotification(this.logSessionResultMessageName, params) + void this.languageClient.sendNotification(this.logSessionResultMessageName, params) this.sessionManager.clear() logstr += `- suggestion does not match user typeahead from insertion position. Discarding suggestion...` return [] diff --git a/packages/amazonq/src/app/inline/cursorUpdateManager.ts b/packages/amazonq/src/app/inline/cursorUpdateManager.ts index 3c0ad6f6add..e06285d1f32 100644 --- a/packages/amazonq/src/app/inline/cursorUpdateManager.ts +++ b/packages/amazonq/src/app/inline/cursorUpdateManager.ts @@ -4,7 +4,7 @@ */ import * as vscode from 'vscode' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { getLogger } from 'aws-core-vscode/shared' import { globals } from 'aws-core-vscode/shared' import { AmazonQInlineCompletionItemProvider } from './completion' @@ -36,7 +36,7 @@ export class CursorUpdateManager implements vscode.Disposable, ICursorUpdateReco private autotriggerStateDisposable?: vscode.Disposable constructor( - private readonly languageClient: LanguageClient, + private readonly languageClient: BaseLanguageClient, private readonly inlineCompletionProvider?: AmazonQInlineCompletionItemProvider ) { // Listen for autotrigger state changes to enable/disable the timer diff --git a/packages/amazonq/src/app/inline/recommendationService.ts b/packages/amazonq/src/app/inline/recommendationService.ts index bc9f8052695..b601b2d90da 100644 --- a/packages/amazonq/src/app/inline/recommendationService.ts +++ b/packages/amazonq/src/app/inline/recommendationService.ts @@ -11,7 +11,7 @@ import { LogInlineCompletionSessionResultsParams, } from '@aws/language-server-runtimes/protocol' import { CancellationToken, InlineCompletionContext, Position, TextDocument, commands } from 'vscode' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { SessionManager } from './sessionManager' import { AuthUtil, @@ -49,7 +49,7 @@ export class RecommendationService { } async getRecommendationsWithTimeout( - languageClient: LanguageClient, + languageClient: BaseLanguageClient, request: InlineCompletionWithReferencesParams, token: CancellationToken ) { @@ -66,7 +66,7 @@ export class RecommendationService { } async getAllRecommendations( - languageClient: LanguageClient, + languageClient: BaseLanguageClient, document: TextDocument, position: Position, context: InlineCompletionContext, @@ -215,7 +215,7 @@ export class RecommendationService { ]) ), } - languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) + void languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) this.sessionManager.clear() this.logger.info( 'Suggetions were discarded; reason: active edit suggestion displayed longer than 1 second' @@ -289,7 +289,7 @@ export class RecommendationService { } private async processRemainingRequests( - languageClient: LanguageClient, + languageClient: BaseLanguageClient, initialRequest: InlineCompletionWithReferencesParams, firstResult: InlineCompletionListWithReferences, token: CancellationToken diff --git a/packages/amazonq/src/inlineChat/activation.ts b/packages/amazonq/src/inlineChat/activation.ts index 9f196f31ba3..52c826abb61 100644 --- a/packages/amazonq/src/inlineChat/activation.ts +++ b/packages/amazonq/src/inlineChat/activation.ts @@ -5,12 +5,12 @@ import * as vscode from 'vscode' import { InlineChatController } from './controller/inlineChatController' import { registerInlineCommands } from './command/registerInlineCommands' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { InlineChatTutorialAnnotation } from '../app/inline/tutorials/inlineChatTutorialAnnotation' export function activate( context: vscode.ExtensionContext, - client: LanguageClient, + client: BaseLanguageClient, encryptionKey: Buffer, inlineChatTutorialAnnotation: InlineChatTutorialAnnotation ) { diff --git a/packages/amazonq/src/inlineChat/controller/inlineChatController.ts b/packages/amazonq/src/inlineChat/controller/inlineChatController.ts index 7151a8f9723..472591039f3 100644 --- a/packages/amazonq/src/inlineChat/controller/inlineChatController.ts +++ b/packages/amazonq/src/inlineChat/controller/inlineChatController.ts @@ -14,7 +14,7 @@ import { CodelensProvider } from '../codeLenses/codeLenseProvider' import { PromptMessage, ReferenceLogController } from 'aws-core-vscode/codewhispererChat' import { CodeWhispererSettings } from 'aws-core-vscode/codewhisperer' import { UserWrittenCodeTracker } from 'aws-core-vscode/codewhisperer' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { codicon, getIcon, @@ -41,7 +41,7 @@ export class InlineChatController { constructor( context: vscode.ExtensionContext, - client: LanguageClient, + client: BaseLanguageClient, encryptionKey: Buffer, inlineChatTutorialAnnotation: InlineChatTutorialAnnotation ) { diff --git a/packages/amazonq/src/inlineChat/provider/inlineChatProvider.ts b/packages/amazonq/src/inlineChat/provider/inlineChatProvider.ts index cfa3798945c..c2dc94de36f 100644 --- a/packages/amazonq/src/inlineChat/provider/inlineChatProvider.ts +++ b/packages/amazonq/src/inlineChat/provider/inlineChatProvider.ts @@ -8,7 +8,7 @@ import { CodeWhispererStreamingServiceException, GenerateAssistantResponseCommandOutput, } from '@amzn/codewhisperer-streaming' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { inlineChatRequestType } from '@aws/language-server-runtimes/protocol' import { AuthUtil, getSelectedCustomization } from 'aws-core-vscode/codewhisperer' import { @@ -40,7 +40,7 @@ export class InlineChatProvider { public onErrorOccured = this.errorEmitter.event public constructor( - private readonly client: LanguageClient, + private readonly client: BaseLanguageClient, private readonly encryptionKey: Buffer ) { this.editorContextExtractor = new EditorContextExtractor() diff --git a/packages/amazonq/src/lsp/auth.ts b/packages/amazonq/src/lsp/auth.ts index f23183d25d7..b4093362004 100644 --- a/packages/amazonq/src/lsp/auth.ts +++ b/packages/amazonq/src/lsp/auth.ts @@ -14,7 +14,7 @@ import { } from '@aws/language-server-runtimes/protocol' import * as jose from 'jose' import * as crypto from 'crypto' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { AuthUtil } from 'aws-core-vscode/codewhisperer' import { Writable } from 'stream' import { onceChanged, onceChangedWithComparator } from 'aws-core-vscode/utils' @@ -70,7 +70,7 @@ export const notificationTypes = { export class AmazonQLspAuth { #logErrorIfChanged = onceChanged((s) => getLogger('amazonqLsp').error(s)) constructor( - private readonly client: LanguageClient, + private readonly client: BaseLanguageClient, private readonly authUtil: AuthUtil = AuthUtil.instance ) {} diff --git a/packages/amazonq/src/lsp/chat/activation.ts b/packages/amazonq/src/lsp/chat/activation.ts index 1f443bed875..93f4d68cf2a 100644 --- a/packages/amazonq/src/lsp/chat/activation.ts +++ b/packages/amazonq/src/lsp/chat/activation.ts @@ -4,7 +4,7 @@ */ import { window } from 'vscode' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { AmazonQChatViewProvider } from './webviewProvider' import { focusAmazonQPanel, registerCommands } from './commands' import { @@ -19,7 +19,7 @@ import { AuthUtil, getSelectedCustomization } from 'aws-core-vscode/codewhispere import { pushConfigUpdate } from '../config' import { AutoDebugLspClient } from './autoDebug/lsp/autoDebugLspClient' -export async function activate(languageClient: LanguageClient, encryptionKey: Buffer, mynahUIPath: string) { +export async function activate(languageClient: BaseLanguageClient, encryptionKey: Buffer, mynahUIPath: string) { const disposables = globals.context.subscriptions const provider = new AmazonQChatViewProvider(mynahUIPath, languageClient) @@ -83,14 +83,14 @@ export async function activate(languageClient: LanguageClient, encryptionKey: Bu }) }), Commands.register('aws.amazonq.manageSubscription', () => { - focusAmazonQPanel().catch((e) => languageClient.error(`[VSCode Client] focusAmazonQPanel() failed`)) + focusAmazonQPanel().catch((e: Error) => languageClient.error(`[VSCode Client] focusAmazonQPanel() failed`)) languageClient .sendRequest('workspace/executeCommand', { command: 'aws/chat/manageSubscription', // arguments: [], }) - .catch((e) => { + .catch((e: Error) => { getLogger('amazonqLsp').error('failed request: aws/chat/manageSubscription: %O', e) }) }), diff --git a/packages/amazonq/src/lsp/chat/messages.ts b/packages/amazonq/src/lsp/chat/messages.ts index e607643d561..1541e60b9c5 100644 --- a/packages/amazonq/src/lsp/chat/messages.ts +++ b/packages/amazonq/src/lsp/chat/messages.ts @@ -70,7 +70,7 @@ import { import { v4 as uuidv4 } from 'uuid' import * as vscode from 'vscode' import * as path from 'path' -import { Disposable, LanguageClient, Position, TextDocumentIdentifier } from 'vscode-languageclient' +import { Disposable, BaseLanguageClient, Position, TextDocumentIdentifier } from 'vscode-languageclient' import { AmazonQChatViewProvider } from './webviewProvider' import { AggregatedCodeScanIssue, @@ -92,7 +92,7 @@ import { focusAmazonQPanel } from './commands' import { ChatMessage } from '@aws/language-server-runtimes/server-interface' import { CommentUtils } from 'aws-core-vscode/utils' -export function registerActiveEditorChangeListener(languageClient: LanguageClient) { +export function registerActiveEditorChangeListener(languageClient: BaseLanguageClient) { let debounceTimer: NodeJS.Timeout | undefined vscode.window.onDidChangeActiveTextEditor((editor) => { if (debounceTimer) { @@ -107,7 +107,7 @@ export function registerActiveEditorChangeListener(languageClient: LanguageClien } cursorState = getCursorState(editor.selections) } - languageClient.sendNotification(activeEditorChangedNotificationType.method, { + void languageClient.sendNotification(activeEditorChangedNotificationType.method, { textDocument, cursorState, }) @@ -115,7 +115,10 @@ export function registerActiveEditorChangeListener(languageClient: LanguageClien }) } -export function registerLanguageServerEventListener(languageClient: LanguageClient, provider: AmazonQChatViewProvider) { +export function registerLanguageServerEventListener( + languageClient: BaseLanguageClient, + provider: AmazonQChatViewProvider +) { languageClient.info( 'Language client received initializeResult from server:', JSON.stringify(languageClient.initializeResult) @@ -129,7 +132,7 @@ export function registerLanguageServerEventListener(languageClient: LanguageClie } // This passes through metric data from LSP events to Toolkit telemetry with all fields from the LSP server - languageClient.onTelemetry((e) => { + languageClient.onTelemetry((e: any) => { const telemetryName: string = e.name languageClient.info(`[VSCode Telemetry] Emitting ${telemetryName} telemetry: ${JSON.stringify(e.data)}`) try { @@ -143,7 +146,7 @@ export function registerLanguageServerEventListener(languageClient: LanguageClie } export function registerMessageListeners( - languageClient: LanguageClient, + languageClient: BaseLanguageClient, provider: AmazonQChatViewProvider, encryptionKey: Buffer ) { @@ -184,7 +187,7 @@ export function registerMessageListeners( languageClient.info( `[VSCode Client] Chat options flags: mcpServers=${pendingChatOptions?.mcpServers}, history=${pendingChatOptions?.history}, export=${pendingChatOptions?.export}, quickActions=[${quickActionsDisplay}]` ) - languageClient.sendNotification(message.command, message.params) + void languageClient.sendNotification(message.command, message.params) } catch (err) { languageClient.error( `[VSCode Client] Failed to send CHAT_OPTIONS after "aws/chat/ready" event: ${(err as Error).message}` @@ -196,7 +199,7 @@ export function registerMessageListeners( languageClient.info('[VSCode Client] Copy to clipboard event received') try { await messages.copyToClipboard(message.params.code) - } catch (e) { + } catch (e: unknown) { languageClient.error(`[VSCode Client] Failed to copy to clipboard: ${(e as Error).message}`) } break @@ -209,7 +212,7 @@ export function registerMessageListeners( textDocument = { uri: editor.document.uri.toString() } } - languageClient.sendNotification(insertToCursorPositionNotificationType.method, { + void languageClient.sendNotification(insertToCursorPositionNotificationType.method, { ...message.params, cursorPosition, textDocument, @@ -277,12 +280,15 @@ export function registerMessageListeners( const cancellationToken = new CancellationTokenSource() chatStreamTokens.set(chatParams.tabId, cancellationToken) - const chatDisposable = languageClient.onProgress(chatRequestType, partialResultToken, (partialResult) => - handlePartialResult(partialResult, encryptionKey, provider, chatParams.tabId).then( - (result) => { - lastPartialResult = result - } - ) + const chatDisposable = languageClient.onProgress( + chatRequestType, + partialResultToken, + (partialResult: any) => + handlePartialResult(partialResult, encryptionKey, provider, chatParams.tabId).then( + (result) => { + lastPartialResult = result + } + ) ) const editor = @@ -396,7 +402,7 @@ export function registerMessageListeners( const quickActionDisposable = languageClient.onProgress( quickActionRequestType, quickActionPartialResultToken, - (partialResult) => + (partialResult: any) => handlePartialResult( partialResult, encryptionKey, @@ -466,7 +472,7 @@ export function registerMessageListeners( break case followUpClickNotificationType.method: if (!isValidAuthFollowUpType(message.params.followUp.type)) { - languageClient.sendNotification(followUpClickNotificationType.method, message.params) + void languageClient.sendNotification(followUpClickNotificationType.method, message.params) } break case buttonClickRequestType.method: { @@ -488,7 +494,7 @@ export function registerMessageListeners( } else if (exitFocus(message.params)) { await setContext('aws.amazonq.amazonqChatLSP.isFocus', false) } - languageClient.sendNotification(message.command, message.params) + void languageClient.sendNotification(message.command, message.params) } break } @@ -598,7 +604,7 @@ export function registerMessageListeners( languageClient.onRequest( ShowDocumentRequest.method, async (params: ShowDocumentParams): Promise> => { - focusAmazonQPanel().catch((e) => languageClient.error(`[VSCode Client] focusAmazonQPanel() failed`)) + focusAmazonQPanel().catch((e: Error) => languageClient.error(`[VSCode Client] focusAmazonQPanel() failed`)) try { const uri = vscode.Uri.parse(params.uri) @@ -769,7 +775,7 @@ async function handleCompleteResult( provider: AmazonQChatViewProvider, tabId: string, disposable: Disposable, - languageClient: LanguageClient + languageClient: BaseLanguageClient ) { const decryptedMessage = await decryptResponse(result, encryptionKey) @@ -790,7 +796,7 @@ async function handleCompleteResult( async function handleSecurityFindings( decryptedMessage: { additionalMessages?: ChatMessage[] }, - languageClient: LanguageClient + languageClient: BaseLanguageClient ): Promise { if (decryptedMessage.additionalMessages === undefined || decryptedMessage.additionalMessages.length === 0) { return @@ -839,7 +845,7 @@ async function handleSecurityFindings( async function resolveChatResponse( requestMethod: string, params: any, - languageClient: LanguageClient, + languageClient: BaseLanguageClient, webview: vscode.Webview | undefined ) { const result = await languageClient.sendRequest(requestMethod, params) diff --git a/packages/amazonq/src/lsp/chat/webviewProvider.ts b/packages/amazonq/src/lsp/chat/webviewProvider.ts index 109a6afd10f..b0e0bddc195 100644 --- a/packages/amazonq/src/lsp/chat/webviewProvider.ts +++ b/packages/amazonq/src/lsp/chat/webviewProvider.ts @@ -25,7 +25,7 @@ import { import { AuthUtil, RegionProfile } from 'aws-core-vscode/codewhisperer' import { featureConfig } from 'aws-core-vscode/amazonq' import { getAmazonQLspConfig } from '../config' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' export class AmazonQChatViewProvider implements WebviewViewProvider { public static readonly viewType = 'aws.amazonq.AmazonQChatView' @@ -40,7 +40,7 @@ export class AmazonQChatViewProvider implements WebviewViewProvider { constructor( private readonly mynahUIPath: string, - private readonly languageClient: LanguageClient + private readonly languageClient: BaseLanguageClient ) {} public async resolveWebviewView( diff --git a/packages/amazonq/src/lsp/client.ts b/packages/amazonq/src/lsp/client.ts index 654b68fb914..2255fb80fee 100644 --- a/packages/amazonq/src/lsp/client.ts +++ b/packages/amazonq/src/lsp/client.ts @@ -5,7 +5,8 @@ import vscode, { version } from 'vscode' import * as nls from 'vscode-nls' -import { LanguageClient, LanguageClientOptions, RequestType, State } from 'vscode-languageclient' +import { BaseLanguageClient, LanguageClientOptions, RequestType, State } from 'vscode-languageclient' +import { LanguageClient } from 'vscode-languageclient/node' import { InlineCompletionManager } from '../app/inline/completion' import { AmazonQLspAuth, encryptionKey, notificationTypes } from './auth' import { @@ -226,9 +227,7 @@ export async function startLanguageServer( clientOptions ) - const disposable = client.start() - toDispose.push(disposable) - await client.onReady() + await client.start() // Set up connection metadata handler client.onRequest(notificationTypes.getConnectionMetadata.method, () => { @@ -263,14 +262,14 @@ export async function startLanguageServer( return client } -async function initializeAuth(client: LanguageClient): Promise { +async function initializeAuth(client: BaseLanguageClient): Promise { const auth = new AmazonQLspAuth(client) await auth.refreshConnection(true) return auth } // jscpd:ignore-start -async function initializeLanguageServerConfiguration(client: LanguageClient, context: string = 'startup') { +async function initializeLanguageServerConfiguration(client: BaseLanguageClient, context: string = 'startup') { const logger = getLogger('amazonqLsp') if (AuthUtil.instance.isConnectionValid()) { @@ -308,7 +307,7 @@ async function initializeLanguageServerConfiguration(client: LanguageClient, con } } -async function sendProfileToLsp(client: LanguageClient) { +async function sendProfileToLsp(client: BaseLanguageClient) { const logger = getLogger('amazonqLsp') const profileArn = AuthUtil.instance.regionProfileManager.activeRegionProfile?.arn @@ -325,7 +324,7 @@ async function sendProfileToLsp(client: LanguageClient) { async function onLanguageServerReady( extensionContext: vscode.ExtensionContext, auth: AmazonQLspAuth, - client: LanguageClient, + client: BaseLanguageClient, resourcePaths: AmazonQResourcePaths, toDispose: vscode.Disposable[] ) { @@ -419,7 +418,7 @@ async function onLanguageServerReady( await auth.refreshConnection() }), AuthUtil.instance.auth.onDidDeleteConnection(async () => { - client.sendNotification(notificationTypes.deleteBearerToken.method) + void client.sendNotification(notificationTypes.deleteBearerToken.method) }), AuthUtil.instance.regionProfileManager.onDidChangeRegionProfile(() => sendProfileToLsp(client)), vscode.commands.registerCommand('aws.amazonq.getWorkspaceId', async () => { @@ -432,28 +431,28 @@ async function onLanguageServerReady( return workspaceIdResp }), vscode.workspace.onDidCreateFiles((e) => { - client.sendNotification('workspace/didCreateFiles', { + void client.sendNotification('workspace/didCreateFiles', { files: e.files.map((it) => { return { uri: it.fsPath } }), } as CreateFilesParams) }), vscode.workspace.onDidDeleteFiles((e) => { - client.sendNotification('workspace/didDeleteFiles', { + void client.sendNotification('workspace/didDeleteFiles', { files: e.files.map((it) => { return { uri: it.fsPath } }), } as DeleteFilesParams) }), vscode.workspace.onDidRenameFiles((e) => { - client.sendNotification('workspace/didRenameFiles', { + void client.sendNotification('workspace/didRenameFiles', { files: e.files.map((it) => { return { oldUri: it.oldUri.fsPath, newUri: it.newUri.fsPath } }), } as RenameFilesParams) }), vscode.workspace.onDidChangeWorkspaceFolders((e) => { - client.sendNotification('workspace/didChangeWorkspaceFolder', { + void client.sendNotification('workspace/didChangeWorkspaceFolder', { event: { added: e.added.map((it) => { return { @@ -480,7 +479,7 @@ async function onLanguageServerReady( * When the server restarts (likely due to a crash, then the LanguageClient automatically starts it again) * we need to run some server intialization again. */ -function onServerRestartHandler(client: LanguageClient, auth: AmazonQLspAuth) { +function onServerRestartHandler(client: BaseLanguageClient, auth: AmazonQLspAuth) { return client.onDidChangeState(async (e) => { // Ensure we are in a "restart" state if (!(e.oldState === State.Starting && e.newState === State.Running)) { diff --git a/packages/amazonq/src/lsp/config.ts b/packages/amazonq/src/lsp/config.ts index 6b88eb98d21..d33f58d6988 100644 --- a/packages/amazonq/src/lsp/config.ts +++ b/packages/amazonq/src/lsp/config.ts @@ -4,7 +4,7 @@ */ import * as vscode from 'vscode' import { DevSettings, getServiceEnvVarConfig, BaseLspInstaller, getLogger } from 'aws-core-vscode/shared' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { DidChangeConfigurationNotification, updateConfigurationRequestType, @@ -67,7 +67,7 @@ export function toAmazonQLSPLogLevel(logLevel: vscode.LogLevel): LspLogLevel { * different handlers for specific configs. So this determines the correct place to * push the given config. */ -export async function pushConfigUpdate(client: LanguageClient, config: QConfigs) { +export async function pushConfigUpdate(client: BaseLanguageClient, config: QConfigs) { const logger = getLogger('amazonqLsp') switch (config.type) { @@ -81,7 +81,7 @@ export async function pushConfigUpdate(client: LanguageClient, config: QConfigs) break case 'customization': logger.debug(`Pushing customization configuration: ${config.customization || 'undefined'}`) - client.sendNotification(DidChangeConfigurationNotification.type.method, { + void client.sendNotification(DidChangeConfigurationNotification.type.method, { section: 'aws.q', settings: { customization: config.customization }, }) @@ -89,7 +89,7 @@ export async function pushConfigUpdate(client: LanguageClient, config: QConfigs) break case 'logLevel': logger.debug(`Pushing log level configuration`) - client.sendNotification(DidChangeConfigurationNotification.type.method, { + void client.sendNotification(DidChangeConfigurationNotification.type.method, { section: 'aws.logLevel', }) logger.debug(`Log level configuration pushed successfully`) diff --git a/packages/amazonq/test/unit/amazonq/apps/inline/completion.test.ts b/packages/amazonq/test/unit/amazonq/apps/inline/completion.test.ts index 417c8be1426..8e0d2719428 100644 --- a/packages/amazonq/test/unit/amazonq/apps/inline/completion.test.ts +++ b/packages/amazonq/test/unit/amazonq/apps/inline/completion.test.ts @@ -14,7 +14,7 @@ import { InlineCompletionTriggerKind, } from 'vscode' import assert from 'assert' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { StringValue } from 'vscode-languageserver-types' import { AmazonQInlineCompletionItemProvider, InlineCompletionManager } from '../../../../../src/app/inline/completion' import { RecommendationService } from '../../../../../src/app/inline/recommendationService' @@ -32,7 +32,7 @@ import { DocumentEventListener } from '../../../../../src/app/inline/documentEve describe('InlineCompletionManager', () => { let manager: InlineCompletionManager - let languageClient: LanguageClient + let languageClient: BaseLanguageClient let sendNotificationStub: sinon.SinonStub let registerProviderStub: sinon.SinonStub let registerCommandStub: sinon.SinonStub @@ -89,7 +89,7 @@ describe('InlineCompletionManager', () => { languageClient = { sendNotification: sendNotificationStub, - } as unknown as LanguageClient + } as unknown as BaseLanguageClient const sessionManager = new SessionManager() const lineTracker = new LineTracker() diff --git a/packages/amazonq/test/unit/amazonq/apps/inline/recommendationService.test.ts b/packages/amazonq/test/unit/amazonq/apps/inline/recommendationService.test.ts index a051ef94abb..c8473022118 100644 --- a/packages/amazonq/test/unit/amazonq/apps/inline/recommendationService.test.ts +++ b/packages/amazonq/test/unit/amazonq/apps/inline/recommendationService.test.ts @@ -4,7 +4,7 @@ */ import sinon from 'sinon' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { Position, CancellationToken, InlineCompletionItem, InlineCompletionTriggerKind } from 'vscode' import assert from 'assert' import { RecommendationService } from '../../../../../src/app/inline/recommendationService' @@ -21,7 +21,7 @@ const completionApi = 'aws/textDocument/inlineCompletionWithReferences' const editApi = 'aws/textDocument/editCompletion' describe('RecommendationService', () => { - let languageClient: LanguageClient + let languageClient: BaseLanguageClient let sendRequestStub: sinon.SinonStub let sandbox: sinon.SinonSandbox let sessionManager: SessionManager @@ -71,7 +71,7 @@ describe('RecommendationService', () => { languageClient = { sendRequest: sendRequestStub, warn: sandbox.stub(), - } as unknown as LanguageClient + } as unknown as BaseLanguageClient sessionManager = new SessionManager() diff --git a/packages/amazonq/test/unit/amazonq/lsp/auth.test.ts b/packages/amazonq/test/unit/amazonq/lsp/auth.test.ts index d55fef85f39..835a19b65f1 100644 --- a/packages/amazonq/test/unit/amazonq/lsp/auth.test.ts +++ b/packages/amazonq/test/unit/amazonq/lsp/auth.test.ts @@ -4,7 +4,7 @@ */ import assert from 'assert' import { AmazonQLspAuth } from '../../../../src/lsp/auth' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' describe('AmazonQLspAuth', function () { describe('updateBearerToken', function () { @@ -16,7 +16,7 @@ describe('AmazonQLspAuth', function () { lastSentToken = param }, info: (_message: string, _data: any) => {}, - } as LanguageClient) + } as BaseLanguageClient) await auth.updateBearerToken('firstToken') assert.notDeepStrictEqual(lastSentToken, {}) diff --git a/packages/amazonq/test/unit/amazonq/lsp/chat/messages.test.ts b/packages/amazonq/test/unit/amazonq/lsp/chat/messages.test.ts index b2f5958f52b..4c412a17676 100644 --- a/packages/amazonq/test/unit/amazonq/lsp/chat/messages.test.ts +++ b/packages/amazonq/test/unit/amazonq/lsp/chat/messages.test.ts @@ -4,7 +4,7 @@ */ import * as sinon from 'sinon' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { AuthUtil } from 'aws-core-vscode/codewhisperer' import { registerMessageListeners } from '../../../../../src/lsp/chat/messages' import { AmazonQChatViewProvider } from '../../../../../src/lsp/chat/webviewProvider' @@ -12,7 +12,7 @@ import { secondaryAuth, authConnection, AuthFollowUpType } from 'aws-core-vscode import { messages } from 'aws-core-vscode/shared' describe('registerMessageListeners', () => { - let languageClient: LanguageClient + let languageClient: BaseLanguageClient let provider: AmazonQChatViewProvider let sandbox: sinon.SinonSandbox let messageHandler: (message: any) => void | Promise @@ -28,7 +28,7 @@ describe('registerMessageListeners', () => { sendNotification: sandbox.stub(), onRequest: sandbox.stub(), onNotification: sandbox.stub(), - } as unknown as LanguageClient + } as unknown as BaseLanguageClient provider = { webview: { diff --git a/packages/amazonq/test/unit/amazonq/lsp/client.test.ts b/packages/amazonq/test/unit/amazonq/lsp/client.test.ts index 7c99c47e0ea..8f11c8eaa35 100644 --- a/packages/amazonq/test/unit/amazonq/lsp/client.test.ts +++ b/packages/amazonq/test/unit/amazonq/lsp/client.test.ts @@ -5,7 +5,7 @@ import assert from 'assert' import sinon from 'sinon' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { AuthUtil } from 'aws-core-vscode/codewhisperer' import { AmazonQLspAuth } from '../../../../src/lsp/auth' @@ -108,7 +108,7 @@ describe('Language Server Client Authentication', function () { describe('initializeLanguageServerConfiguration behavior', function () { it('should initialize configuration when connection is valid', async function () { // Test the expected behavior of the function - const mockInitializeFunction = async (client: LanguageClient, context: string) => { + const mockInitializeFunction = async (client: BaseLanguageClient, context: string) => { const { getLogger } = require('aws-core-vscode/shared') const { pushConfigUpdate } = require('../../../../src/lsp/config') const logger = getLogger('amazonqLsp') @@ -178,7 +178,7 @@ describe('Language Server Client Authentication', function () { }, })) - const mockInitializeFunction = async (client: LanguageClient, context: string) => { + const mockInitializeFunction = async (client: BaseLanguageClient, context: string) => { const { getLogger } = require('aws-core-vscode/shared') const logger = getLogger('amazonqLsp') @@ -215,7 +215,7 @@ describe('Language Server Client Authentication', function () { describe('crash recovery handler behavior', function () { it('should reinitialize authentication after crash', async function () { - const mockCrashHandler = async (client: LanguageClient, auth: AmazonQLspAuth) => { + const mockCrashHandler = async (client: BaseLanguageClient, auth: AmazonQLspAuth) => { const { getLogger } = require('aws-core-vscode/shared') const { pushConfigUpdate } = require('../../../../src/lsp/config') const logger = getLogger('amazonqLsp') diff --git a/packages/amazonq/test/unit/app/inline/cursorUpdateManager.test.ts b/packages/amazonq/test/unit/app/inline/cursorUpdateManager.test.ts index 2412e8b3308..aec2c1c7ddf 100644 --- a/packages/amazonq/test/unit/app/inline/cursorUpdateManager.test.ts +++ b/packages/amazonq/test/unit/app/inline/cursorUpdateManager.test.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode' import * as sinon from 'sinon' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' import { CursorUpdateManager } from '../../../../src/app/inline/cursorUpdateManager' import { globals } from 'aws-core-vscode/shared' import assert from 'assert' @@ -14,7 +14,7 @@ import { CodeSuggestionsState } from 'aws-core-vscode/codewhisperer' describe('CursorUpdateManager', () => { let cursorUpdateManager: CursorUpdateManager - let languageClient: LanguageClient + let languageClient: BaseLanguageClient let clock: sinon.SinonFakeTimers let sendRequestStub: sinon.SinonStub let setIntervalStub: sinon.SinonStub @@ -28,7 +28,7 @@ describe('CursorUpdateManager', () => { languageClient = { sendRequest: sendRequestStub, - } as unknown as LanguageClient + } as unknown as BaseLanguageClient // Setup clock stubs clock = sinon.useFakeTimers() diff --git a/packages/core/package.json b/packages/core/package.json index 7b2545ebf26..eb487618a09 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -667,8 +667,8 @@ "strip-ansi": "^5.2.0", "svgdom": "^0.1.0", "tcp-port-used": "^1.0.1", - "vscode-languageclient": "^6.1.4", - "vscode-languageserver": "^6.1.1", + "vscode-languageclient": "^9.0.1", + "vscode-languageserver": "^9.0.1", "vscode-languageserver-protocol": "^3.15.3", "vscode-languageserver-textdocument": "^1.0.8", "vue": "^3.3.4", diff --git a/packages/core/src/codewhisperer/service/recommendationHandler.ts b/packages/core/src/codewhisperer/service/recommendationHandler.ts index 42f5ceb9b21..1cd64ccbe4b 100644 --- a/packages/core/src/codewhisperer/service/recommendationHandler.ts +++ b/packages/core/src/codewhisperer/service/recommendationHandler.ts @@ -44,7 +44,7 @@ import { indent } from '../../shared/utilities/textUtilities' import path from 'path' import { isIamConnection } from '../../auth/connection' import { UserWrittenCodeTracker } from '../tracker/userWrittenCodeTracker' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' /** * This class is for getRecommendation/listRecommendation API calls and its states @@ -100,7 +100,7 @@ export class RecommendationHandler { private next: vscode.Disposable private prev: vscode.Disposable private _timer?: NodeJS.Timer - private languageClient?: LanguageClient + private languageClient?: BaseLanguageClient documentUri: vscode.Uri | undefined = undefined constructor() { @@ -123,7 +123,7 @@ export class RecommendationHandler { return session.recommendations.some((r) => r.content.trim() !== '') } - setLanguageClient(languageClient: LanguageClient) { + setLanguageClient(languageClient: BaseLanguageClient) { this.languageClient = languageClient } diff --git a/packages/core/src/codewhisperer/util/editorContext.ts b/packages/core/src/codewhisperer/util/editorContext.ts index dacf3b326a1..9ea3020dba4 100644 --- a/packages/core/src/codewhisperer/util/editorContext.ts +++ b/packages/core/src/codewhisperer/util/editorContext.ts @@ -22,7 +22,7 @@ import { indent } from '../../shared/utilities/textUtilities' import { isInDirectory } from '../../shared/filesystemUtilities' import { AuthUtil } from './authUtil' import { predictionTracker } from '../nextEditPrediction/activation' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' let tabSize: number = getTabSizeSetting() @@ -226,7 +226,7 @@ export async function buildListRecommendationRequest( editor: vscode.TextEditor, nextToken: string, allowCodeWithReference: boolean, - languageClient?: LanguageClient + languageClient?: BaseLanguageClient ): Promise<{ request: codewhispererClient.ListRecommendationsRequest supplementalMetadata: CodeWhispererSupplementalContext | undefined diff --git a/packages/core/src/codewhisperer/util/supplementalContext/crossFileContextUtil.ts b/packages/core/src/codewhisperer/util/supplementalContext/crossFileContextUtil.ts index 17dc594cde9..aa732a5d70a 100644 --- a/packages/core/src/codewhisperer/util/supplementalContext/crossFileContextUtil.ts +++ b/packages/core/src/codewhisperer/util/supplementalContext/crossFileContextUtil.ts @@ -23,13 +23,9 @@ import { import { waitUntil } from '../../../shared/utilities/timeoutUtils' import { FeatureConfigProvider } from '../../../shared/featureConfig' import fs from '../../../shared/fs/fs' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' -import { - GetSupplementalContextParams, - getSupplementalContextRequestType, - SupplementalContextItem, -} from '@aws/language-server-runtimes/protocol' +import { GetSupplementalContextParams, getSupplementalContextRequestType } from '@aws/language-server-runtimes/protocol' type CrossFileSupportedLanguage = | 'java' | 'python' @@ -73,7 +69,7 @@ type SupplementalContextConfig = 'none' | 'opentabs' | 'codemap' | 'bm25' | 'def export async function fetchSupplementalContextForSrc( editor: vscode.TextEditor, cancellationToken: vscode.CancellationToken, - languageClient?: LanguageClient + languageClient?: BaseLanguageClient ): Promise | undefined> { const supplementalContextConfig = getSupplementalContextConfig(editor.document.languageId) @@ -200,17 +196,14 @@ export async function fetchSupplementalContextForSrc( export async function fetchProjectContext( editor: vscode.TextEditor, target: 'default' | 'codemap' | 'bm25', - languageclient?: LanguageClient + languageclient?: BaseLanguageClient ): Promise { try { if (languageclient) { const request: GetSupplementalContextParams = { filePath: editor.document.uri.fsPath, } - const response = await languageclient.sendRequest( - getSupplementalContextRequestType.method, - request - ) + const response = await languageclient.sendRequest(getSupplementalContextRequestType.method, request) return response as CodeWhispererSupplementalContextItem[] } } catch (error) { diff --git a/packages/core/src/codewhisperer/util/supplementalContext/supplementalContextUtil.ts b/packages/core/src/codewhisperer/util/supplementalContext/supplementalContextUtil.ts index edda43ddcf6..3a8d66b8b42 100644 --- a/packages/core/src/codewhisperer/util/supplementalContext/supplementalContextUtil.ts +++ b/packages/core/src/codewhisperer/util/supplementalContext/supplementalContextUtil.ts @@ -13,12 +13,12 @@ import { getLogger } from '../../../shared/logger/logger' import { CodeWhispererSupplementalContext } from '../../models/model' import * as os from 'os' import { crossFileContextConfig } from '../../models/constants' -import { LanguageClient } from 'vscode-languageclient' +import { BaseLanguageClient } from 'vscode-languageclient' export async function fetchSupplementalContext( editor: vscode.TextEditor, cancellationToken: vscode.CancellationToken, - languageClient?: LanguageClient + languageClient?: BaseLanguageClient ): Promise { const timesBeforeFetching = Date.now() diff --git a/packages/core/src/shared/lsp/utils/runner.ts b/packages/core/src/shared/lsp/utils/runner.ts index 8116f4dee1b..690ef879480 100644 --- a/packages/core/src/shared/lsp/utils/runner.ts +++ b/packages/core/src/shared/lsp/utils/runner.ts @@ -11,7 +11,7 @@ // Disable because this is a language server. /* eslint-disable aws-toolkits/no-console-log */ -import { CancellationToken, ErrorCodes, ResponseError } from 'vscode-languageserver' +import { CancellationToken, LSPErrorCodes, ResponseError } from 'vscode-languageserver' export function formatError(message: string, err: any): string { if (err instanceof Error) { @@ -90,5 +90,5 @@ export function runSafe( function cancelValue() { console.log('cancelled') - return new ResponseError(ErrorCodes.RequestCancelled, 'Request cancelled') + return new ResponseError(LSPErrorCodes.RequestCancelled, 'Request cancelled') } diff --git a/packages/core/src/ssmDocument/ssm/ssmClient.ts b/packages/core/src/ssmDocument/ssm/ssmClient.ts index 2e9c0c19b30..1fce41b2cea 100644 --- a/packages/core/src/ssmDocument/ssm/ssmClient.ts +++ b/packages/core/src/ssmDocument/ssm/ssmClient.ts @@ -13,16 +13,10 @@ const localize = nls.loadMessageBundle() import { ExtensionContext, LanguageConfiguration, languages, window, workspace } from 'vscode' -import { - DidChangeConfigurationNotification, - LanguageClient, - LanguageClientOptions, - NotificationType, - ServerOptions, - TransportKind, -} from 'vscode-languageclient' +import { DidChangeConfigurationNotification, LanguageClientOptions, NotificationType } from 'vscode-languageclient' +import { ServerOptions, TransportKind, LanguageClient } from 'vscode-languageclient/node' -export const ResultLimitReached: NotificationType = new NotificationType('ssm/resultLimitReached') +export const ResultLimitReached: NotificationType = new NotificationType('ssm/resultLimitReached') const jsonLanguageConfiguration: LanguageConfiguration = { wordPattern: /("(?:[^\\\"]*(?:\\.)?)*"?)|[^\s{}\[\],:]+/, @@ -108,14 +102,14 @@ export async function activate(extensionContext: ExtensionContext) { ) client.registerProposedFeatures() - const disposable = client.start() - toDispose.push(disposable) + void client.start() + toDispose.push(client) languages.setLanguageConfiguration('ssm-json', jsonLanguageConfiguration) languages.setLanguageConfiguration('ssm-yaml', yamlLanguageConfiguration) - return client.onReady().then(() => { - client.onNotification(ResultLimitReached, (message) => { + return client.start().then(() => { + client.onNotification(ResultLimitReached, (message: any) => { void window.showInformationMessage( `${message}\nUse setting 'aws.ssmDocument.ssm.maxItemsComputed' to configure the limit.` ) diff --git a/packages/core/src/stepFunctions/asl/aslServer.ts b/packages/core/src/stepFunctions/asl/aslServer.ts index 2d4c4fadde3..7a55cfa5ed5 100644 --- a/packages/core/src/stepFunctions/asl/aslServer.ts +++ b/packages/core/src/stepFunctions/asl/aslServer.ts @@ -25,7 +25,7 @@ import { Diagnostic, Disposable, DocumentRangeFormattingRequest, - IConnection, + Connection, InitializeParams, InitializeResult, NotificationType, @@ -33,6 +33,7 @@ import { ServerCapabilities, TextDocuments, TextDocumentSyncKind, + DidChangeWatchedFilesParams, } from 'vscode-languageserver' import { posix } from 'path' @@ -41,12 +42,12 @@ import { getLanguageModelCache } from '../../shared/lsp/languageModelCache' import { formatError, runSafe, runSafeAsync } from '../../shared/lsp/utils/runner' import { YAML_ASL, JSON_ASL } from '../constants/aslFormats' -export const ResultLimitReached: NotificationType = new NotificationType('asl/resultLimitReached') +export const ResultLimitReached: NotificationType = new NotificationType('asl/resultLimitReached') -export const ForceValidateRequest: RequestType = new RequestType('asl/validate') +export const ForceValidateRequest: RequestType = new RequestType('asl/validate') // Create a connection for the server -const connection: IConnection = createConnection() +const connection: Connection = (createConnection as any)() process.on('unhandledRejection', (e: any) => { console.error(formatError('Unhandled exception', e)) @@ -179,7 +180,7 @@ class LimitExceededWarnings { } else { warning = { features: { [name]: name } } warning.timeout = setTimeout(() => { - connection.sendNotification( + void connection.sendNotification( ResultLimitReached, `${posix.basename(uri)}: For performance reasons, ${Object.keys(warning.features).join( ' and ' @@ -195,7 +196,7 @@ class LimitExceededWarnings { let formatterRegistration: Thenable | undefined -connection.onDidChangeConfiguration((change) => { +connection.onDidChangeConfiguration((change: any) => { const settings = change.settings foldingRangeLimit = Math.trunc( @@ -225,7 +226,7 @@ connection.onDidChangeConfiguration((change) => { }) // Retry schema validation on all open documents -connection.onRequest(ForceValidateRequest, async (uri) => { +connection.onRequest(ForceValidateRequest, async (uri: any) => { return new Promise((resolve) => { const document = documents.get(uri) if (document) { @@ -241,7 +242,7 @@ connection.onRequest(ForceValidateRequest, async (uri) => { // The content of a text document has changed. This event is emitted // when the text document first opened or when its content has changed. -documents.onDidChangeContent((change) => { +documents.onDidChangeContent((change: any) => { LimitExceededWarnings.cancel(change.document.uri) triggerValidation(change.document) }) @@ -250,7 +251,7 @@ documents.onDidChangeContent((change) => { documents.onDidClose((event) => { LimitExceededWarnings.cancel(event.document.uri) cleanPendingValidation(event.document) - connection.sendDiagnostics({ uri: event.document.uri, diagnostics: [] }) + void connection.sendDiagnostics({ uri: event.document.uri, diagnostics: [] }) }) const pendingValidationRequests: { [uri: string]: NodeJS.Timer } = {} @@ -283,7 +284,7 @@ function getLanguageService(langId: string): LanguageService { function validateTextDocument(textDocument: TextDocument, callback?: (diagnostics: Diagnostic[]) => void): void { const respond = (diagnostics: Diagnostic[]) => { - connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }) + void connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }) if (callback) { callback(diagnostics) } @@ -314,7 +315,7 @@ function validateTextDocument(textDocument: TextDocument, callback?: (diagnostic ) } -connection.onDidChangeWatchedFiles((change) => { +connection.onDidChangeWatchedFiles((change: DidChangeWatchedFilesParams) => { // Monitored files have changed in VSCode let hasChanges = false for (const c of change.changes) { diff --git a/packages/core/src/stepFunctions/asl/client.ts b/packages/core/src/stepFunctions/asl/client.ts index ce16850d5d6..fff743252ad 100644 --- a/packages/core/src/stepFunctions/asl/client.ts +++ b/packages/core/src/stepFunctions/asl/client.ts @@ -32,17 +32,15 @@ import { DidChangeConfigurationNotification, DocumentRangeFormattingParams, DocumentRangeFormattingRequest, - LanguageClient, LanguageClientOptions, NotificationType, - ServerOptions, - TransportKind, } from 'vscode-languageclient' +import { ServerOptions, TransportKind, LanguageClient } from 'vscode-languageclient/node' import { YAML_ASL, JSON_ASL, ASL_FORMATS } from '../constants/aslFormats' import { StepFunctionsSettings } from '../utils' -export const ResultLimitReached: NotificationType = new NotificationType('asl/resultLimitReached') +export const ResultLimitReached: NotificationType = new NotificationType('asl/resultLimitReached') interface Settings { asl?: { @@ -116,8 +114,8 @@ export class ASLLanguageClient { ) client.registerProposedFeatures() - const disposable = client.start() - toDispose.push(disposable) + void client.start() + toDispose.push(client) const languageConfiguration: LanguageConfiguration = { wordPattern: /("(?:[^\\\"]*(?:\\.)?)*"?)|[^\s{}\[\],:]+/, @@ -144,29 +142,35 @@ export class ASLLanguageClient { const params: DocumentRangeFormattingParams = { textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document), range: client.code2ProtocolConverter.asRange(range), - options: client.code2ProtocolConverter.asFormattingOptions(options), + options: (client.code2ProtocolConverter as any).asFormattingOptions(options, {}), } - return client.sendRequest(DocumentRangeFormattingRequest.type, params, token).then( - (response) => client.protocol2CodeConverter.asTextEdits(response), - async (error) => { - client.logFailedRequest(DocumentRangeFormattingRequest.type, error) - - return Promise.resolve([]) - } - ) + return (client as any) + .sendRequest(DocumentRangeFormattingRequest.method, params, undefined) + .then( + (response: any) => client.protocol2CodeConverter.asTextEdits(response), + async () => { + return Promise.resolve([]) + } + ) }, }) } } - return client.onReady().then(() => { + return client.start().then(() => { updateFormatterRegistration() const disposableFunc = { dispose: () => rangeFormatting?.dispose() as void } toDispose.push(disposableFunc) - toDispose.push(config.onDidChange(({ key }) => key === 'format.enable' && updateFormatterRegistration())) + toDispose.push( + config.onDidChange(({ key }) => { + if (key === 'format.enable') { + updateFormatterRegistration() + } + }) + ) - client.onNotification(ResultLimitReached, (message) => { + client.onNotification(ResultLimitReached, (message: any) => { void window.showInformationMessage( `${message}\nUse setting 'aws.stepfunctions.asl.maxItemsComputed' to configure the limit.` )