Skip to content

Commit 9bfe190

Browse files
Merge branch 'main' into samgst/dev-profile-e2e-tests
2 parents 9289e37 + 1211c41 commit 9bfe190

File tree

24 files changed

+169
-316
lines changed

24 files changed

+169
-316
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Fix UriError when project is on WSL or a UNC path"
4+
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.isQSupportedInThisVersio
3232
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
3333
import software.aws.toolkits.jetbrains.services.amazonq.lsp.artifacts.ArtifactManager
3434
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
35+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
3536
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
3637
import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage
3738
import software.aws.toolkits.jetbrains.services.amazonq.messages.MessageConnector
@@ -66,6 +67,7 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
6667
private val appConnections = mutableListOf<AppConnection>()
6768

6869
init {
70+
// will be removed in next iteration.
6971
project.messageBus.connect().subscribe(
7072
AsyncChatUiListener.TOPIC,
7173
object : AsyncChatUiListener {
@@ -135,6 +137,11 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di
135137
Browser(this@AmazonQPanel, webUri, project).also { browserInstance ->
136138
wrapper.setContent(browserInstance.component())
137139

140+
// Register direct callback instead of using message bus
141+
ChatCommunicationManager.getInstance(project).setChatUpdateCallback { message ->
142+
browserInstance.postChat(message)
143+
}
144+
138145
// Add DropTarget to the browser component
139146
// JCEF does not propagate OS-level dragenter, dragOver and drop into DOM.
140147
// As an alternative, enabling the native drag in JCEF,

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import com.intellij.openapi.util.Disposer
1111
import com.intellij.ui.jcef.JBCefJSQuery
1212
import org.cef.CefApp
1313
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
14-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider
1514
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
1615
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
1716
import software.aws.toolkits.jetbrains.services.amazonq.util.HighlightCommand
@@ -117,7 +116,7 @@ class Browser(parent: Disposable, private val webUri: URI, val project: Project)
117116
): String {
118117
val postMessageToJavaJsCode = receiveMessageQuery.inject("JSON.stringify(message)")
119118
val connectorAdapterPath = "http://mynah/js/connectorAdapter.js"
120-
generateQuickActionConfig()
119+
121120
// https://github.com/highlightjs/highlight.js/issues/1387
122121
// language=HTML
123122
val jsScripts = """
@@ -309,10 +308,6 @@ class Browser(parent: Disposable, private val webUri: URI, val project: Project)
309308
activeProfile
310309
}
311310

312-
private fun generateQuickActionConfig() = AwsServerCapabilitiesProvider.getInstance(project).getChatOptions().quickActions.quickActionsCommandGroups
313-
.let { OBJECT_MAPPER.writeValueAsString(it) }
314-
?: "[]"
315-
316311
companion object {
317312
private const val MAX_ONBOARDING_PAGE_COUNT = 3
318313
private val OBJECT_MAPPER = jacksonObjectMapper()

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import kotlinx.coroutines.coroutineScope
2121
import kotlinx.coroutines.flow.Flow
2222
import kotlinx.coroutines.flow.callbackFlow
2323
import kotlinx.coroutines.flow.distinctUntilChanged
24+
import kotlinx.coroutines.flow.first
2425
import kotlinx.coroutines.flow.launchIn
2526
import kotlinx.coroutines.flow.merge
2627
import kotlinx.coroutines.flow.onEach
@@ -42,8 +43,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.JsonRpcMethod
4243
import software.aws.toolkits.jetbrains.services.amazonq.lsp.JsonRpcNotification
4344
import software.aws.toolkits.jetbrains.services.amazonq.lsp.JsonRpcRequest
4445
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
45-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider
46-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatAsyncResultManager
4746
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
4847
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
4948
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.AUTH_FOLLOW_UP_CLICKED
@@ -123,7 +122,6 @@ class BrowserConnector(
123122
) {
124123
val uiReady = CompletableDeferred<Boolean>()
125124
private val chatCommunicationManager = ChatCommunicationManager.getInstance(project)
126-
private val chatAsyncResultManager = ChatAsyncResultManager.getInstance(project)
127125

128126
suspend fun connect(
129127
browser: Browser,
@@ -240,7 +238,6 @@ class BrowserConnector(
240238

241239
val tabId = requestFromUi.params.tabId
242240
val partialResultToken = chatCommunicationManager.addPartialChatMessage(tabId)
243-
chatCommunicationManager.registerPartialResultToken(partialResultToken)
244241

245242
var encryptionManager: JwtEncryptionManager? = null
246243
val result = AmazonQLspService.executeAsyncIfRunning(project) { server ->
@@ -261,7 +258,6 @@ class BrowserConnector(
261258
val tabId = requestFromUi.params.tabId
262259
val quickActionParams = node.params ?: error("empty payload")
263260
val partialResultToken = chatCommunicationManager.addPartialChatMessage(tabId)
264-
chatCommunicationManager.registerPartialResultToken(partialResultToken)
265261
var encryptionManager: JwtEncryptionManager? = null
266262
val result = AmazonQLspService.executeAsyncIfRunning(project) { server ->
267263
encryptionManager = this.encryptionManager
@@ -595,39 +591,26 @@ class BrowserConnector(
595591
chatCommunicationManager.removeInflightRequestForTab(tabId)
596592
} catch (e: CancellationException) {
597593
LOG.warn { "Cancelled chat generation" }
598-
try {
599-
chatAsyncResultManager.createRequestId(partialResultToken)
600-
chatAsyncResultManager.getResult(partialResultToken)
601-
handleCancellation(tabId, browser)
602-
} catch (ex: Exception) {
603-
LOG.warn(ex) { "An error occurred while processing cancellation" }
604-
} finally {
605-
chatAsyncResultManager.removeRequestId(partialResultToken)
606-
chatCommunicationManager.removePartialResultLock(partialResultToken)
607-
chatCommunicationManager.removeFinalResultProcessed(partialResultToken)
608-
}
609594
} catch (e: Exception) {
610595
LOG.warn(e) { "Failed to send chat message" }
611596
browser.postChat(chatCommunicationManager.getErrorUiMessage(tabId, e, partialResultToken))
612597
}
613598
}
614599
}
615600

616-
private fun handleCancellation(tabId: String, browser: Browser) {
617-
// Send a message to hide the stop button without showing an error
618-
val cancelMessage = chatCommunicationManager.getCancellationUiMessage(tabId)
619-
browser.postChat(cancelMessage)
620-
}
621-
622-
private fun updateQuickActionsInBrowser(browser: Browser) {
601+
private suspend fun updateQuickActionsInBrowser(browser: Browser) {
623602
val isFeatureDevAvailable = isFeatureDevAvailable(project)
624603
val isCodeTransformAvailable = isCodeTransformAvailable(project)
625604
val isDocAvailable = isDocAvailable(project)
626605
val isCodeScanAvailable = isCodeScanAvailable(project)
627606
val isCodeTestAvailable = isCodeTestAvailable(project)
628607

608+
val serverCapabilities = AmazonQLspService.getInstance(project).instanceFlow.first().initializeResult.await().awsServerCapabilities
609+
610+
// language=JavaScript
629611
val script = """
630612
try {
613+
// hack to create the list of actions across all tab types
631614
const tempConnector = connectorAdapter.initiateAdapter(
632615
false,
633616
true, // the two values are not used here, needed for constructor
@@ -640,7 +623,7 @@ class BrowserConnector(
640623
);
641624
642625
const commands = tempConnector.initialQuickActions?.slice(0, 2) || [];
643-
const options = ${Gson().toJson(AwsServerCapabilitiesProvider.getInstance(project).getChatOptions())};
626+
const options = ${Gson().toJson(serverCapabilities.chatOptions)};
644627
options.quickActions.quickActionsCommandGroups = [
645628
...commands,
646629
...options.quickActions.quickActionsCommandGroups

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import com.intellij.openapi.project.Project
88
import kotlinx.coroutines.flow.MutableSharedFlow
99
import kotlinx.coroutines.flow.asSharedFlow
1010
import kotlinx.coroutines.runBlocking
11-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
11+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
1212
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
1313
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GENERIC_COMMAND
1414
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GenericCommandParams
@@ -40,7 +40,7 @@ class ActionRegistrar {
4040
val params = SendToPromptParams(selection = codeSelection, triggerType = TriggerType.CONTEXT_MENU)
4141
uiMessage = FlareUiMessage(command = SEND_TO_PROMPT, params = params)
4242
}
43-
AsyncChatUiListener.notifyPartialMessageUpdate(project, uiMessage)
43+
ChatCommunicationManager.getInstance(project).notifyUi(uiMessage)
4444
}
4545
}
4646
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/ExplainCodeIssueAction.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import com.intellij.openapi.actionSystem.DataKey
1111
import com.intellij.openapi.application.ApplicationManager
1212
import com.intellij.openapi.project.DumbAware
1313
import kotlinx.coroutines.runBlocking
14-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
14+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
1515
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
1616
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatPrompt
1717
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SEND_TO_PROMPT
@@ -58,7 +58,8 @@ class ExplainCodeIssueAction : AnAction(), DumbAware {
5858
)
5959

6060
val uiMessage = FlareUiMessage(SEND_TO_PROMPT, params)
61-
AsyncChatUiListener.notifyPartialMessageUpdate(project, uiMessage)
61+
ChatCommunicationManager.getInstance(project).notifyUi(uiMessage)
62+
// AsyncChatUiListener.notifyPartialMessageUpdate(project, uiMessage)
6263
}
6364
}
6465
}

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,12 @@ import com.intellij.util.concurrency.EdtExecutorService
2525
import com.intellij.util.execution.ParametersListUtil
2626
import kotlinx.coroutines.launch
2727
import org.eclipse.lsp4j.DidChangeConfigurationParams
28+
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
2829
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
30+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
2931
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManagerListener
32+
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
33+
import software.aws.toolkits.jetbrains.core.credentials.sono.isInternalUser
3034
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
3135
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererLoginType
3236
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
@@ -47,6 +51,12 @@ class CodeWhispererConfigurable(private val project: Project) :
4751
private val isSso: Boolean
4852
get() = CodeWhispererExplorerActionManager.getInstance().checkActiveCodeWhispererConnectionType(project) == CodeWhispererLoginType.SSO
4953

54+
private val isInternalUser: Boolean
55+
get() {
56+
val conn = ToolkitConnectionManager.getInstance(project).activeConnectionForFeature(QConnection.getInstance()) as? AwsBearerTokenConnection
57+
return conn?.let { isInternalUser(it.startUrl) } ?: false
58+
}
59+
5060
override fun getId() = "aws.codewhisperer"
5161

5262
override fun createPanel() = panel {
@@ -123,6 +133,21 @@ class CodeWhispererConfigurable(private val project: Project) :
123133
}.enabled(false)
124134
}
125135
}
136+
137+
row {
138+
checkBox(message("aws.settings.codewhisperer.workspace_context")).apply {
139+
connect.subscribe(
140+
ToolkitConnectionManagerListener.TOPIC,
141+
object : ToolkitConnectionManagerListener {
142+
override fun activeConnectionChanged(newConnection: ToolkitConnection?) {
143+
enabled(isCodeWhispererEnabled(project))
144+
}
145+
}
146+
)
147+
enabled(invoke)
148+
bindSelected(codeWhispererSettings::isWorkspaceContextEnabled, codeWhispererSettings::toggleWorkspaceContextEnabled)
149+
}.comment(message("aws.settings.codewhisperer.workspace_context.tooltip"))
150+
}.visible(isInternalUser)
126151
}
127152

128153
group(message("aws.settings.codewhisperer.group.inline_suggestions")) {
@@ -158,20 +183,6 @@ class CodeWhispererConfigurable(private val project: Project) :
158183
}
159184

160185
group(message("aws.settings.codewhisperer.group.q_chat")) {
161-
row {
162-
checkBox(message("aws.settings.codewhisperer.workspace_context")).apply {
163-
connect.subscribe(
164-
ToolkitConnectionManagerListener.TOPIC,
165-
object : ToolkitConnectionManagerListener {
166-
override fun activeConnectionChanged(newConnection: ToolkitConnection?) {
167-
enabled(isCodeWhispererEnabled(project))
168-
}
169-
}
170-
)
171-
enabled(invoke)
172-
bindSelected(codeWhispererSettings::isWorkspaceContextEnabled, codeWhispererSettings::toggleWorkspaceContextEnabled)
173-
}.comment(message("aws.settings.codewhisperer.workspace_context.tooltip"))
174-
}.visible(false)
175186
row {
176187
checkBox(message("aws.settings.codewhisperer.project_context")).apply {
177188
connect.subscribe(

plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererConfigurableTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class CodeWhispererConfigurableTest : CodeWhispererTestBase() {
4040
message("aws.settings.codewhisperer.include_code_with_reference"),
4141
message("aws.settings.codewhisperer.configurable.opt_out.title"),
4242
message("aws.settings.codewhisperer.automatic_import_adder"),
43-
"Workspace context",
43+
"Server-side context",
4444
message("aws.settings.codewhisperer.project_context"),
4545
message("aws.settings.codewhisperer.project_context_gpu")
4646
)

plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestBase.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ open class CodeWhispererTestBase {
131131
get() = CompletableFuture()
132132

133133
override val initializeResult: Deferred<AwsExtendedInitializeResult>
134-
get() = CompletableDeferred(AwsExtendedInitializeResult())
134+
get() = CompletableDeferred(AwsExtendedInitializeResult(mockk()))
135135

136136
override val encryptionManager: JwtEncryptionManager
137137
get() = TODO("Not yet implemented")

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ import software.aws.toolkits.core.utils.info
4444
import software.aws.toolkits.core.utils.warn
4545
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
4646
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
47-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener
4847
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
4948
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
5049
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LSPAny
@@ -399,8 +398,7 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
399398
}
400399

401400
override fun sendChatUpdate(params: LSPAny) {
402-
AsyncChatUiListener.notifyPartialMessageUpdate(
403-
project,
401+
chatManager.notifyUi(
404402
FlareUiMessage(
405403
command = CHAT_SEND_UPDATE,
406404
params = params,

0 commit comments

Comments
 (0)