From 61281d3aee708becc319b7aa222803786d829330 Mon Sep 17 00:00:00 2001 From: Jordan Ang Date: Wed, 18 Sep 2024 13:14:00 -0700 Subject: [PATCH 1/7] Send chat/ready message to lsp and fix addTab issue --- .../toolkits/eclipse/amazonq/chat/ChatMessageProvider.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java index 530104e1..7e9a1cdd 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java @@ -21,6 +21,11 @@ public ChatMessageProvider() { PluginLogger.error("Error occurred while retrieving Amazon Q LSP server. Failed to instantiate ChatMessageProvider."); } } + + public void sendChatReady() { + PluginLogger.info("Sending " + Command.CHAT_READY + " message to Amazon Q LSP server"); + amazonQLspServer.chatReady(); + } public void sendChatReady() { PluginLogger.info("Sending " + Command.CHAT_READY + " message to Amazon Q LSP server"); From c9275793aa81d6da62ee78894df3dae8b252644c Mon Sep 17 00:00:00 2001 From: Jordan Ang Date: Wed, 18 Sep 2024 14:33:36 -0700 Subject: [PATCH 2/7] Fix checkstyle errors --- .../aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java index 7e9a1cdd..48f4d8a0 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java @@ -21,7 +21,7 @@ public ChatMessageProvider() { PluginLogger.error("Error occurred while retrieving Amazon Q LSP server. Failed to instantiate ChatMessageProvider."); } } - + public void sendChatReady() { PluginLogger.info("Sending " + Command.CHAT_READY + " message to Amazon Q LSP server"); amazonQLspServer.chatReady(); From 566cbcf38e0e6202801ea2ef78f7d31b8d20a7a9 Mon Sep 17 00:00:00 2001 From: Jordan Ang Date: Wed, 18 Sep 2024 14:31:53 -0700 Subject: [PATCH 3/7] Send chat/prompt message to lsp --- .../amazonq/chat/ChatCommunicationManager.java | 9 ++++++++- .../amazonq/chat/ChatMessageProvider.java | 16 +++++++++++++++- .../eclipse/amazonq/lsp/AmazonQLspServer.java | 5 +++++ .../views/AmazonQChatViewActionHandler.java | 5 +++++ .../eclipse/amazonq/views/model/Command.java | 1 + 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatCommunicationManager.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatCommunicationManager.java index 4d3a919e..3dbbb97d 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatCommunicationManager.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatCommunicationManager.java @@ -2,6 +2,8 @@ package software.aws.toolkits.eclipse.amazonq.chat; +import software.aws.toolkits.eclipse.amazonq.chat.models.ChatRequestParams; +import software.aws.toolkits.eclipse.amazonq.chat.models.ChatResult; import software.aws.toolkits.eclipse.amazonq.chat.models.GenericTabParams; import software.aws.toolkits.eclipse.amazonq.util.JsonHandler; import software.aws.toolkits.eclipse.amazonq.util.PluginLogger; @@ -17,11 +19,15 @@ public ChatCommunicationManager() { this.chatMessageProvider = new ChatMessageProvider(); } - public void sendMessageToChatServerAsync(final Command command, final Object params) { + public ChatResult sendMessageToChatServerAsync(final Command command, final Object params) { String jsonParams = jsonHandler.serialize(params); switch (command) { + case CHAT_SEND_PROMPT: + ChatRequestParams chatRequestParams = jsonHandler.deserialize(jsonParams, ChatRequestParams.class); + ChatResult result = chatMessageProvider.sendChatPrompt(chatRequestParams); + return result; case CHAT_READY: chatMessageProvider.sendChatReady(); break; @@ -32,5 +38,6 @@ public void sendMessageToChatServerAsync(final Command command, final Object par default: PluginLogger.error("Unhandled chat command: " + command.toString()); } + return null; } } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java index 48f4d8a0..706e15e9 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java @@ -4,6 +4,8 @@ import java.util.concurrent.ExecutionException; +import software.aws.toolkits.eclipse.amazonq.chat.models.ChatRequestParams; +import software.aws.toolkits.eclipse.amazonq.chat.models.ChatResult; import software.aws.toolkits.eclipse.amazonq.chat.models.GenericTabParams; import software.aws.toolkits.eclipse.amazonq.lsp.AmazonQLspServer; import software.aws.toolkits.eclipse.amazonq.providers.LspProvider; @@ -21,7 +23,19 @@ public ChatMessageProvider() { PluginLogger.error("Error occurred while retrieving Amazon Q LSP server. Failed to instantiate ChatMessageProvider."); } } - + + public ChatResult sendChatPrompt(final ChatRequestParams chatRequestParams) { + try { + PluginLogger.info("Sending " + Command.CHAT_SEND_PROMPT + " message to Amazon Q LSP server"); + ChatResult chatResult = amazonQLspServer.sendChatPrompt(chatRequestParams).get(); + return chatResult; + } catch (InterruptedException | ExecutionException e) { + PluginLogger.error("Error occurred while sending " + Command.CHAT_SEND_PROMPT + " message to Amazon Q LSP server", e); + e.printStackTrace(); + } + return null; + } + public void sendChatReady() { PluginLogger.info("Sending " + Command.CHAT_READY + " message to Amazon Q LSP server"); amazonQLspServer.chatReady(); diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/AmazonQLspServer.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/AmazonQLspServer.java index f07f091c..24ded6bc 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/AmazonQLspServer.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/AmazonQLspServer.java @@ -9,6 +9,8 @@ import org.eclipse.lsp4j.jsonrpc.services.JsonNotification; import org.eclipse.lsp4j.services.LanguageServer; +import software.aws.toolkits.eclipse.amazonq.chat.models.ChatRequestParams; +import software.aws.toolkits.eclipse.amazonq.chat.models.ChatResult; import software.aws.toolkits.eclipse.amazonq.chat.models.GenericTabParams; import software.aws.toolkits.eclipse.amazonq.lsp.model.InlineCompletionParams; import software.aws.toolkits.eclipse.amazonq.lsp.model.InlineCompletionResponse; @@ -19,6 +21,9 @@ public interface AmazonQLspServer extends LanguageServer { @JsonRequest("aws/textDocument/inlineCompletionWithReferences") CompletableFuture inlineCompletionWithReferences(InlineCompletionParams params); + @JsonRequest("aws/chat/sendChatPrompt") + CompletableFuture sendChatPrompt(ChatRequestParams chatRequestParams); + @JsonNotification("aws/chat/tabAdd") void tabAdd(GenericTabParams params); diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatViewActionHandler.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatViewActionHandler.java index 21924486..94c7b5e1 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatViewActionHandler.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatViewActionHandler.java @@ -6,6 +6,7 @@ import org.eclipse.swt.browser.Browser; import software.aws.toolkits.eclipse.amazonq.chat.ChatCommunicationManager; +import software.aws.toolkits.eclipse.amazonq.chat.models.ChatResult; import software.aws.toolkits.eclipse.amazonq.util.PluginLogger; import software.aws.toolkits.eclipse.amazonq.views.model.Command; import software.aws.toolkits.eclipse.amazonq.views.model.ParsedCommand; @@ -25,6 +26,10 @@ public final void handleCommand(final ParsedCommand parsedCommand, final Browser PluginLogger.info(command + " being processed by ActionHandler"); switch (command) { + case CHAT_SEND_PROMPT: + ChatResult chatResult = chatCommunicationManager.sendMessageToChatServerAsync(command, params); + PluginLogger.info("Chat result: " + chatResult); + break; case CHAT_READY: chatCommunicationManager.sendMessageToChatServerAsync(command, params); break; diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Command.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Command.java index 6f0a6183..ec21b60e 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Command.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Command.java @@ -10,6 +10,7 @@ public enum Command { // QChat CHAT_READY("aws/chat/ready"), CHAT_TAB_ADD("aws/chat/tabAdd"), + CHAT_SEND_PROMPT("aws/chat/sendChatPrompt"), TELEMETRY_EVENT("telemetry/event"), // Auth From f247cf619683f2df34fce7778d60197c838afd81 Mon Sep 17 00:00:00 2001 From: Jordan Ang Date: Wed, 18 Sep 2024 14:58:24 -0700 Subject: [PATCH 4/7] Fix checkstyle errors --- .../toolkits/eclipse/amazonq/chat/ChatMessageProvider.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java index 706e15e9..9d4ad036 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java @@ -23,7 +23,7 @@ public ChatMessageProvider() { PluginLogger.error("Error occurred while retrieving Amazon Q LSP server. Failed to instantiate ChatMessageProvider."); } } - + public ChatResult sendChatPrompt(final ChatRequestParams chatRequestParams) { try { PluginLogger.info("Sending " + Command.CHAT_SEND_PROMPT + " message to Amazon Q LSP server"); @@ -35,7 +35,7 @@ public ChatResult sendChatPrompt(final ChatRequestParams chatRequestParams) { } return null; } - + public void sendChatReady() { PluginLogger.info("Sending " + Command.CHAT_READY + " message to Amazon Q LSP server"); amazonQLspServer.chatReady(); From 4ff9d0484c45a911660316c1a7392b6bcc73233d Mon Sep 17 00:00:00 2001 From: Jordan Ang Date: Thu, 19 Sep 2024 12:07:12 -0700 Subject: [PATCH 5/7] Add threading for the commands and throw AmazonQPluginException for lsp communication errors --- .../amazonq/chat/ChatMessageProvider.java | 30 +++++++++++-------- .../amazonq/views/AmazonQChatWebview.java | 14 +++++---- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java index 9d4ad036..d1184b21 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatMessageProvider.java @@ -7,6 +7,7 @@ import software.aws.toolkits.eclipse.amazonq.chat.models.ChatRequestParams; import software.aws.toolkits.eclipse.amazonq.chat.models.ChatResult; import software.aws.toolkits.eclipse.amazonq.chat.models.GenericTabParams; +import software.aws.toolkits.eclipse.amazonq.exception.AmazonQPluginException; import software.aws.toolkits.eclipse.amazonq.lsp.AmazonQLspServer; import software.aws.toolkits.eclipse.amazonq.providers.LspProvider; import software.aws.toolkits.eclipse.amazonq.util.PluginLogger; @@ -20,7 +21,8 @@ public ChatMessageProvider() { try { amazonQLspServer = LspProvider.getAmazonQServer().get(); } catch (InterruptedException | ExecutionException e) { - PluginLogger.error("Error occurred while retrieving Amazon Q LSP server. Failed to instantiate ChatMessageProvider."); + PluginLogger.error("Error occurred while retrieving Amazon Q LSP server. Failed to instantiate ChatMessageProvider.", e); + throw new AmazonQPluginException(e); } } @@ -31,23 +33,27 @@ public ChatResult sendChatPrompt(final ChatRequestParams chatRequestParams) { return chatResult; } catch (InterruptedException | ExecutionException e) { PluginLogger.error("Error occurred while sending " + Command.CHAT_SEND_PROMPT + " message to Amazon Q LSP server", e); - e.printStackTrace(); + throw new AmazonQPluginException(e); } - return null; } public void sendChatReady() { - PluginLogger.info("Sending " + Command.CHAT_READY + " message to Amazon Q LSP server"); - amazonQLspServer.chatReady(); - } - - public void sendChatReady() { - PluginLogger.info("Sending " + Command.CHAT_READY + " message to Amazon Q LSP server"); - amazonQLspServer.chatReady(); + try { + PluginLogger.info("Sending " + Command.CHAT_READY + " message to Amazon Q LSP server"); + amazonQLspServer.chatReady(); + } catch (Exception e) { + PluginLogger.error("Error occurred while sending " + Command.CHAT_READY + " message to Amazon Q LSP server", e); + throw new AmazonQPluginException(e); + } } public void sendTabAdd(final GenericTabParams tabParams) { - PluginLogger.info("Sending " + Command.CHAT_TAB_ADD + " message to Amazon Q LSP server"); - amazonQLspServer.tabAdd(tabParams); + try { + PluginLogger.info("Sending " + Command.CHAT_TAB_ADD + " message to Amazon Q LSP server"); + amazonQLspServer.tabAdd(tabParams); + } catch (Exception e) { + PluginLogger.error("Error occurred while sending " + Command.CHAT_TAB_ADD + " message to Amazon Q LSP server", e); + throw new AmazonQPluginException(e); + } } } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java index 8e9b26d6..a94f88a4 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java @@ -55,12 +55,14 @@ public final void createPartControl(final Composite parent) { new BrowserFunction(browser, "ideCommand") { @Override public Object function(final Object[] arguments) { - try { - commandParser.parseCommand(arguments) - .ifPresent(parsedCommand -> actionHandler.handleCommand(parsedCommand, browser)); - } catch (Exception e) { - PluginLogger.error("Error processing message from Browser", e); - } + ThreadingUtils.executeAsyncTask(() -> { + try { + commandParser.parseCommand(arguments) + .ifPresent(parsedCommand -> actionHandler.handleCommand(parsedCommand, browser)); + } catch (Exception e) { + PluginLogger.error("Error processing message from Browser", e); + } + }); return null; } }; From adb6fb5cb690f3dd7a3562eaabdb764ed0f8981e Mon Sep 17 00:00:00 2001 From: Jordan Ang Date: Thu, 19 Sep 2024 14:14:33 -0700 Subject: [PATCH 6/7] Throw exception for missing commands --- .../eclipse/amazonq/chat/ChatCommunicationManager.java | 8 ++++---- .../amazonq/views/AmazonQChatViewActionHandler.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatCommunicationManager.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatCommunicationManager.java index 3dbbb97d..bc9ce1a5 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatCommunicationManager.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatCommunicationManager.java @@ -5,6 +5,7 @@ import software.aws.toolkits.eclipse.amazonq.chat.models.ChatRequestParams; import software.aws.toolkits.eclipse.amazonq.chat.models.ChatResult; import software.aws.toolkits.eclipse.amazonq.chat.models.GenericTabParams; +import software.aws.toolkits.eclipse.amazonq.exception.AmazonQPluginException; import software.aws.toolkits.eclipse.amazonq.util.JsonHandler; import software.aws.toolkits.eclipse.amazonq.util.PluginLogger; import software.aws.toolkits.eclipse.amazonq.views.model.Command; @@ -30,14 +31,13 @@ public ChatResult sendMessageToChatServerAsync(final Command command, final Obje return result; case CHAT_READY: chatMessageProvider.sendChatReady(); - break; + return null; case CHAT_TAB_ADD: GenericTabParams tabParams = jsonHandler.deserialize(jsonParams, GenericTabParams.class); chatMessageProvider.sendTabAdd(tabParams); - break; + return null; default: - PluginLogger.error("Unhandled chat command: " + command.toString()); + throw new AmazonQPluginException("Unhandled command in ChatCommunicationManager: " + command.toString()); } - return null; } } diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatViewActionHandler.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatViewActionHandler.java index 94c7b5e1..eef277d9 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatViewActionHandler.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatViewActionHandler.java @@ -7,6 +7,7 @@ import software.aws.toolkits.eclipse.amazonq.chat.ChatCommunicationManager; import software.aws.toolkits.eclipse.amazonq.chat.models.ChatResult; +import software.aws.toolkits.eclipse.amazonq.exception.AmazonQPluginException; import software.aws.toolkits.eclipse.amazonq.util.PluginLogger; import software.aws.toolkits.eclipse.amazonq.views.model.Command; import software.aws.toolkits.eclipse.amazonq.views.model.ParsedCommand; @@ -39,8 +40,7 @@ public final void handleCommand(final ParsedCommand parsedCommand, final Browser case TELEMETRY_EVENT: break; default: - PluginLogger.info("Unhandled command: " + parsedCommand.getCommand()); - break; + throw new AmazonQPluginException("Unhandled command in AmazonQChatViewActionHandler: " + command.toString()); } } } From 249d088c2051f3c45fd67e1f28fb018aa8fb24a7 Mon Sep 17 00:00:00 2001 From: Jordan Ang Date: Thu, 19 Sep 2024 14:15:12 -0700 Subject: [PATCH 7/7] fix checkstyle errors --- .../toolkits/eclipse/amazonq/chat/ChatCommunicationManager.java | 1 - .../aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatCommunicationManager.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatCommunicationManager.java index bc9ce1a5..1f9b9bac 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatCommunicationManager.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/chat/ChatCommunicationManager.java @@ -7,7 +7,6 @@ import software.aws.toolkits.eclipse.amazonq.chat.models.GenericTabParams; import software.aws.toolkits.eclipse.amazonq.exception.AmazonQPluginException; import software.aws.toolkits.eclipse.amazonq.util.JsonHandler; -import software.aws.toolkits.eclipse.amazonq.util.PluginLogger; import software.aws.toolkits.eclipse.amazonq.views.model.Command; public final class ChatCommunicationManager { diff --git a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java index a94f88a4..783bc2ce 100644 --- a/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java +++ b/plugin/src/software/aws/toolkits/eclipse/amazonq/views/AmazonQChatWebview.java @@ -55,7 +55,7 @@ public final void createPartControl(final Composite parent) { new BrowserFunction(browser, "ideCommand") { @Override public Object function(final Object[] arguments) { - ThreadingUtils.executeAsyncTask(() -> { + ThreadingUtils.executeAsyncTask(() -> { try { commandParser.parseCommand(arguments) .ifPresent(parsedCommand -> actionHandler.handleCommand(parsedCommand, browser));