Skip to content

Commit 751c06b

Browse files
committed
Merge remote-tracking branch 'origin/feature/remote-chat-lsp' into rli/remote-load-msg
Conflicts: plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt
2 parents b87907a + aeb459a commit 751c06b

File tree

15 files changed

+138
-139
lines changed

15 files changed

+138
-139
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/webview/BrowserConnector.kt

Lines changed: 6 additions & 3 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,7 +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
4646
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
4747
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
4848
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.AUTH_FOLLOW_UP_CLICKED
@@ -599,16 +599,19 @@ class BrowserConnector(
599599
}
600600
}
601601

602-
private fun updateQuickActionsInBrowser(browser: Browser) {
602+
private suspend fun updateQuickActionsInBrowser(browser: Browser) {
603603
val isFeatureDevAvailable = isFeatureDevAvailable(project)
604604
val isCodeTransformAvailable = isCodeTransformAvailable(project)
605605
val isDocAvailable = isDocAvailable(project)
606606
val isCodeScanAvailable = isCodeScanAvailable(project)
607607
val isCodeTestAvailable = isCodeTestAvailable(project)
608608

609+
val serverCapabilities = AmazonQLspService.getInstance(project).instanceFlow.first().initializeResult.await().awsServerCapabilities
610+
609611
// language=JavaScript
610612
val script = """
611613
try {
614+
// hack to create the list of actions across all tab types
612615
const tempConnector = connectorAdapter.initiateAdapter(
613616
false,
614617
true, // the two values are not used here, needed for constructor
@@ -621,7 +624,7 @@ class BrowserConnector(
621624
);
622625
623626
const commands = tempConnector.initialQuickActions?.slice(0, 2) || [];
624-
const options = ${Gson().toJson(AwsServerCapabilitiesProvider.getInstance(project).getChatOptions())};
627+
const options = ${Gson().toJson(serverCapabilities.chatOptions)};
625628
options.quickActions.quickActionsCommandGroups = [
626629
...commands,
627630
...options.quickActions.quickActionsCommandGroups

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/AmazonQLspService.kt

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import kotlinx.coroutines.channels.BufferOverflow
3636
import kotlinx.coroutines.delay
3737
import kotlinx.coroutines.flow.MutableSharedFlow
3838
import kotlinx.coroutines.flow.asSharedFlow
39-
import kotlinx.coroutines.flow.map
4039
import kotlinx.coroutines.future.asCompletableFuture
4140
import kotlinx.coroutines.future.await
4241
import kotlinx.coroutines.isActive
@@ -77,7 +76,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.dependencies.Default
7776
import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager
7877
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AmazonQLspTypeAdapterFactory
7978
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsExtendedInitializeResult
80-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider
8179
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.createExtendedClientMetadata
8280
import software.aws.toolkits.jetbrains.services.amazonq.lsp.textdocument.TextDocumentServiceHandler
8381
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.WorkspaceFolderUtil.createWorkspaceFolders
@@ -156,7 +154,7 @@ class AmazonQLspService @VisibleForTesting constructor(
156154
constructor(project: Project, cs: CoroutineScope) : this(DefaultAmazonQServerInstanceStarter, project, cs)
157155

158156
private val _flowInstance = MutableSharedFlow<AmazonQServerInstanceFacade>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
159-
val instanceFlow = _flowInstance.asSharedFlow().map { it.languageServer }
157+
val instanceFlow = _flowInstance.asSharedFlow()
160158

161159
private var instance: Deferred<AmazonQServerInstanceFacade>
162160

@@ -538,11 +536,6 @@ private class AmazonQServerInstance(private val project: Project, private val cs
538536
}
539537
}
540538

541-
if (message is ResponseMessage && message.result is AwsExtendedInitializeResult) {
542-
val result = message.result as AwsExtendedInitializeResult
543-
AwsServerCapabilitiesProvider.getInstance(project).setAwsServerCapabilities(result.getAwsServerCapabilities())
544-
}
545-
546539
// required
547540
consumer?.consume(message)
548541
}

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

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.google.gson.reflect.TypeToken
1010
import com.google.gson.stream.JsonReader
1111
import com.google.gson.stream.JsonWriter
1212
import org.eclipse.lsp4j.InitializeResult
13+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.AwsServerCapabilities
1314
import java.io.IOException
1415

1516
class AmazonQLspTypeAdapterFactory : TypeAdapterFactory {
@@ -32,12 +33,4 @@ class AmazonQLspTypeAdapterFactory : TypeAdapterFactory {
3233
}
3334
}
3435

35-
class AwsExtendedInitializeResult(awsServerCapabilities: AwsServerCapabilities? = null) : InitializeResult() {
36-
private var awsServerCapabilities: AwsServerCapabilities? = null
37-
38-
fun getAwsServerCapabilities(): AwsServerCapabilities? = awsServerCapabilities
39-
40-
fun setAwsServerCapabilities(awsServerCapabilities: AwsServerCapabilities?) {
41-
this.awsServerCapabilities = awsServerCapabilities
42-
}
43-
}
36+
data class AwsExtendedInitializeResult(val awsServerCapabilities: AwsServerCapabilities) : InitializeResult()

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

Lines changed: 0 additions & 92 deletions
This file was deleted.

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ data class AwsMetadata(
1717
)
1818

1919
data class AwsClientCapabilities(
20-
val q: DeveloperProfiles,
21-
val window: WindowSettings,
20+
val q: QCapabilities,
21+
val window: WindowCapabilities,
2222
)
2323

24-
data class DeveloperProfiles(
24+
data class QCapabilities(
2525
val developerProfiles: Boolean,
2626
val mcp: Boolean,
2727
val pinnedContextEnabled: Boolean,
@@ -30,7 +30,7 @@ data class DeveloperProfiles(
3030
val workspaceFilePath: String?,
3131
)
3232

33-
data class WindowSettings(
33+
data class WindowCapabilities(
3434
val showSaveFileDialog: Boolean,
3535
val showLogs: Boolean,
3636
)
@@ -65,15 +65,15 @@ fun createExtendedClientMetadata(project: Project): ExtendedClientMetadata {
6565
name = metadata.parentProduct
6666
),
6767
awsClientCapabilities = AwsClientCapabilities(
68-
q = DeveloperProfiles(
68+
q = QCapabilities(
6969
developerProfiles = true,
7070
mcp = true,
7171
pinnedContextEnabled = true,
7272
imageContextEnabled = true,
7373
reroute = true,
7474
workspaceFilePath = project.workspaceFile?.path,
7575
),
76-
window = WindowSettings(
76+
window = WindowCapabilities(
7777
showSaveFileDialog = true,
7878
showLogs = true,
7979
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws
5+
6+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.IconType
7+
8+
data class AwsServerCapabilities(
9+
val chatOptions: ChatOptions,
10+
)
11+
12+
data class ChatOptions(
13+
val quickActions: QuickActions,
14+
val history: Boolean,
15+
val export: Boolean,
16+
val mcpServers: Boolean,
17+
val reroute: Boolean,
18+
val showLogs: Boolean,
19+
)
20+
21+
data class QuickActions(
22+
val quickActionsCommandGroups: List<QuickActionsCommandGroups>,
23+
)
24+
25+
data class QuickActionsCommandGroups(
26+
val commands: List<QuickActionCommand>,
27+
)
28+
29+
open class QuickActionCommand(
30+
open val command: String,
31+
open val description: String?,
32+
open val placeholder: String? = null,
33+
open val icon: IconType? = null,
34+
)
35+
36+
data class ContextCommand(
37+
val id: String?,
38+
val route: List<String>?,
39+
val label: String?,
40+
val children: ContextCommandGroup?,
41+
override val command: String,
42+
override val description: String?,
43+
override val placeholder: String? = null,
44+
override val icon: IconType? = null,
45+
) : QuickActionCommand(
46+
command = command,
47+
description = description,
48+
placeholder = placeholder,
49+
icon = icon
50+
)
51+
52+
data class ContextCommandGroup(
53+
val groupName: String?,
54+
val commands: List<ContextCommand>,
55+
)

0 commit comments

Comments
 (0)