diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt index e1d917f98a3..fc88293038e 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt @@ -139,7 +139,6 @@ class Browser(parent: Disposable, private val webUri: URI, val project: Project) }, "${activeProfile?.profileName.orEmpty()}") - const commands = [hybridChatConnector.initialQuickActions[0], hybridChatConnector.initialQuickActions[1]] amazonQChat.createChat( { postMessage: message => { @@ -148,7 +147,7 @@ class Browser(parent: Disposable, private val webUri: URI, val project: Project) }, { agenticMode: true, - quickActionCommands: commands, + quickActionCommands: [], disclaimerAcknowledged: ${MeetQSettings.getInstance().disclaimerAcknowledged}, pairProgrammingAcknowledged: ${MeetQSettings.getInstance().pairProgrammingAcknowledged} }, diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt index d0aba570e6b..f030d69aa3d 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt @@ -94,6 +94,11 @@ import software.aws.toolkits.jetbrains.services.amazonq.util.command import software.aws.toolkits.jetbrains.services.amazonq.util.tabType import software.aws.toolkits.jetbrains.services.amazonq.webview.theme.AmazonQTheme import software.aws.toolkits.jetbrains.services.amazonq.webview.theme.ThemeBrowserAdapter +import software.aws.toolkits.jetbrains.services.amazonqCodeScan.auth.isCodeScanAvailable +import software.aws.toolkits.jetbrains.services.amazonqCodeTest.auth.isCodeTestAvailable +import software.aws.toolkits.jetbrains.services.amazonqDoc.auth.isDocAvailable +import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.auth.isFeatureDevAvailable +import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isCodeTransformAvailable import software.aws.toolkits.jetbrains.services.codewhisperer.settings.CodeWhispererConfigurable import software.aws.toolkits.jetbrains.settings.MeetQSettings import software.aws.toolkits.telemetry.MetricResult @@ -173,12 +178,7 @@ class BrowserConnector( uiReady.await() // Chat options including history and quick actions need to be sent in once UI is ready - val showChatOptions = """{ - "command": "chatOptions", - "params": ${Gson().toJson(AwsServerCapabilitiesProvider.getInstance(project).getChatOptions())} - } - """.trimIndent() - browser.postChat(showChatOptions) + updateQuickActionsInBrowser(browser) // Send inbound messages to the browser val inboundMessages = connections.map { it.messagesFromAppToUi.flow }.merge() @@ -535,6 +535,45 @@ class BrowserConnector( browser.postChat(cancelMessage) } + private fun updateQuickActionsInBrowser(browser: Browser) { + val isFeatureDevAvailable = isFeatureDevAvailable(project) + val isCodeTransformAvailable = isCodeTransformAvailable(project) + val isDocAvailable = isDocAvailable(project) + val isCodeScanAvailable = isCodeScanAvailable(project) + val isCodeTestAvailable = isCodeTestAvailable(project) + + val script = """ + try { + const tempConnector = connectorAdapter.initiateAdapter( + false, + true, // the two values are not used here, needed for constructor + $isFeatureDevAvailable, + $isCodeTransformAvailable, + $isDocAvailable, + $isCodeScanAvailable, + $isCodeTestAvailable, + { postMessage: () => {} } + ); + + const commands = tempConnector.initialQuickActions?.slice(0, 2) || []; + const options = ${Gson().toJson(AwsServerCapabilitiesProvider.getInstance(project).getChatOptions())}; + options.quickActions.quickActionsCommandGroups = [ + ...commands, + ...options.quickActions.quickActionsCommandGroups + ]; + + window.postMessage({ + command: "chatOptions", + params: options + }); + } catch (e) { + console.error("Error updating quick actions:", e); + } + """.trimIndent() + + browser.jcefBrowser.cefBrowser.executeJavaScript(script, browser.jcefBrowser.cefBrowser.url, 0) + } + private fun cancelInflightRequests(tabId: String) { chatCommunicationManager.getInflightRequestForTab(tabId)?.let { request -> request.cancel(true) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/auth/DefaultAuthCredentialsService.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/auth/DefaultAuthCredentialsService.kt index 873d329600b..57054467b9d 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/auth/DefaultAuthCredentialsService.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/auth/DefaultAuthCredentialsService.kt @@ -111,9 +111,14 @@ class DefaultAuthCredentialsService( return CompletableFuture.failedFuture(e) } - return AmazonQLspService.executeIfRunning(project) { server -> + val future = AmazonQLspService.executeIfRunning(project) { server -> server.updateTokenCredentials(payload) - } ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running"))) + } ?: CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")) + + return future.thenApply { response -> + updateConfiguration() + response + } } override fun deleteTokenCredentials(): CompletableFuture =