diff --git a/packages/amazonq/src/lsp/chat/messages.ts b/packages/amazonq/src/lsp/chat/messages.ts index e7943dd5418..444555e9950 100644 --- a/packages/amazonq/src/lsp/chat/messages.ts +++ b/packages/amazonq/src/lsp/chat/messages.ts @@ -23,12 +23,12 @@ import { insertToCursorPositionNotificationType, } from '@aws/language-server-runtimes/protocol' import { v4 as uuidv4 } from 'uuid' -import { window } from 'vscode' +import * as vscode from 'vscode' import { Disposable, LanguageClient, Position, State, TextDocumentIdentifier } from 'vscode-languageclient' import * as jose from 'jose' import { AmazonQChatViewProvider } from './webviewProvider' import { AuthUtil } from 'aws-core-vscode/codewhisperer' -import { AmazonQPromptSettings } from 'aws-core-vscode/shared' +import { AmazonQPromptSettings, messages } from 'aws-core-vscode/shared' export function registerLanguageServerEventListener(languageClient: LanguageClient, provider: AmazonQChatViewProvider) { languageClient.onDidChangeState(({ oldState, newState }) => { @@ -62,11 +62,15 @@ export function registerMessageListeners( switch (message.command) { case COPY_TO_CLIPBOARD: - // TODO see what we need to hook this up languageClient.info('[VSCode Client] Copy to clipboard event received') + try { + await messages.copyToClipboard(message.params.code) + } catch (e) { + languageClient.error(`[VSCode Client] Failed to copy to clipboard: ${(e as Error).message}`) + } break case INSERT_TO_CURSOR_POSITION: { - const editor = window.activeTextEditor + const editor = vscode.window.activeTextEditor let textDocument: TextDocumentIdentifier | undefined = undefined let cursorPosition: Position | undefined = undefined if (editor) { @@ -119,8 +123,8 @@ export function registerMessageListeners( ) const editor = - window.activeTextEditor || - window.visibleTextEditors.find((editor) => editor.document.languageId !== 'Log') + vscode.window.activeTextEditor || + vscode.window.visibleTextEditors.find((editor) => editor.document.languageId !== 'Log') if (editor) { message.params.cursorPosition = [editor.selection.active] message.params.textDocument = { uri: editor.document.uri.toString() } 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 06459cd8932..e6f51a1db34 100644 --- a/packages/amazonq/test/unit/amazonq/lsp/chat/messages.test.ts +++ b/packages/amazonq/test/unit/amazonq/lsp/chat/messages.test.ts @@ -9,6 +9,7 @@ import { AuthUtil } from 'aws-core-vscode/codewhisperer' import { registerMessageListeners } from '../../../../../src/lsp/chat/messages' import { AmazonQChatViewProvider } from '../../../../../src/lsp/chat/webviewProvider' import { secondaryAuth, authConnection, AuthFollowUpType } from 'aws-core-vscode/amazonq' +import { messages } from 'aws-core-vscode/shared' describe('registerMessageListeners', () => { let languageClient: LanguageClient @@ -126,4 +127,35 @@ describe('registerMessageListeners', () => { }) }) }) + + describe('COPY_TO_CLIPBOARD', () => { + let copyToClipboardStub: sinon.SinonStub + const testCode = 'test' + const copyMessage = { + command: 'copyToClipboard', + params: { + code: testCode, + }, + } + + beforeEach(() => { + copyToClipboardStub = sandbox.stub().resolves() + sandbox.stub(messages, 'copyToClipboard').get(() => copyToClipboardStub) + }) + + it('successfully copies code to clipboard', async () => { + await messageHandler(copyMessage) + + sinon.assert.calledWith(copyToClipboardStub, testCode) + }) + + it('handles clipboard copy failure', async () => { + const errorMessage = 'Failed to copy' + copyToClipboardStub.rejects(new Error(errorMessage)) + + await messageHandler(copyMessage) + + sinon.assert.calledWith(errorStub, `[VSCode Client] Failed to copy to clipboard: ${errorMessage}`) + }) + }) })