Skip to content

Commit 00fe281

Browse files
authored
Merge branch 'feature/q-lsp-chat' into manodnyb/handleCodeScanContextCommand
2 parents 7a4507e + 67bd41c commit 00fe281

File tree

10 files changed

+115
-41
lines changed

10 files changed

+115
-41
lines changed

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ data class AmazonQTheme(
3737
val warning: Color,
3838
val error: Color,
3939

40-
val cardBackground: Color,
41-
4240
val editorFont: Font,
4341
val editorBackground: Color,
4442
val editorForeground: Color,
@@ -49,5 +47,5 @@ data class AmazonQTheme(
4947
val editorKeyword: Color,
5048
val editorString: Color,
5149
val editorProperty: Color,
52-
50+
val editorClassName: Color,
5351
)

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ enum class CssVariable(
1313
FontFamily("--mynah-font-family"),
1414

1515
TextColorDefault("--mynah-color-text-default"),
16+
TextColorAlt("--mynah-color-text-alternate"),
1617
TextColorStrong("--mynah-color-text-strong"),
1718
TextColorWeak("--mynah-color-text-weak"),
1819
TextColorLink("--mynah-color-text-link"),
@@ -25,7 +26,7 @@ enum class CssVariable(
2526
ColorDeep("--mynah-color-deep"),
2627
ColorDeepReverse("--mynah-color-deep-reverse"),
2728
BorderDefault("--mynah-color-border-default"),
28-
InputBackground("--mynah-color-input-bg"),
29+
InputBackground("--mynah-input-bg"),
2930

3031
SyntaxBackground("--mynah-color-syntax-bg"),
3132
SyntaxVariable("--mynah-color-syntax-variable"),
@@ -36,6 +37,9 @@ enum class CssVariable(
3637
SyntaxProperty("--mynah-color-syntax-property"),
3738
SyntaxComment("--mynah-color-syntax-comment"),
3839
SyntaxCode("--mynah-color-syntax-code"),
40+
SyntaxKeyword("--mynah-color-syntax-keyword"),
41+
SyntaxString("--mynah-color-syntax-string"),
42+
SyntaxClassName("--mynah-color-syntax-class-name"),
3943
SyntaxCodeFontFamily("--mynah-syntax-code-font-family"),
4044
SyntaxCodeFontSize("--mynah-syntax-code-font-size"),
4145

@@ -50,10 +54,9 @@ enum class CssVariable(
5054
SecondaryButtonBackground("--mynah-color-alternate"),
5155
SecondaryButtonForeground("--mynah-color-alternate-reverse"),
5256

53-
CodeText("--mynah-color-code-text"),
54-
5557
MainBackground("--mynah-color-main"),
5658
MainForeground("--mynah-color-main-reverse"),
5759

5860
CardBackground("--mynah-card-bg"),
61+
CardBackgroundAlt("--mynah-card-bg-alternate"),
5962
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,18 +113,17 @@ class EditorThemeAdapter {
113113
warning = themeColor("Component.warningFocusColor", default = 0xE2A53A),
114114
error = themeColor("ProgressBar.failedColor", default = 0xD64F4F, darkDefault = 0xE74848),
115115

116-
cardBackground = cardBackground,
117-
118116
editorFont = currentScheme.getFont(EditorFontType.PLAIN),
119-
editorBackground = chatBackground,
120-
editorForeground = text,
117+
editorBackground = currentScheme.defaultBackground,
118+
editorForeground = currentScheme.defaultForeground,
121119
editorVariable = currentScheme.foregroundColor(DefaultLanguageHighlighterColors.LOCAL_VARIABLE),
122120
editorOperator = currentScheme.foregroundColor(DefaultLanguageHighlighterColors.OPERATION_SIGN),
123121
editorFunction = currentScheme.foregroundColor(DefaultLanguageHighlighterColors.FUNCTION_DECLARATION),
124122
editorComment = currentScheme.foregroundColor(DefaultLanguageHighlighterColors.LINE_COMMENT),
125123
editorKeyword = currentScheme.foregroundColor(DefaultLanguageHighlighterColors.KEYWORD),
126124
editorString = currentScheme.foregroundColor(DefaultLanguageHighlighterColors.STRING),
127125
editorProperty = currentScheme.foregroundColor(DefaultLanguageHighlighterColors.INSTANCE_FIELD),
126+
editorClassName = currentScheme.foregroundColor(DefaultLanguageHighlighterColors.CLASS_NAME),
128127
)
129128
}
130129

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,16 @@ class ThemeBrowserAdapter {
3535
append(CssVariable.FontFamily, theme.font.toCssFontFamily())
3636

3737
append(CssVariable.TextColorDefault, theme.defaultText)
38+
append(CssVariable.TextColorAlt, theme.defaultText)
3839
append(CssVariable.TextColorStrong, theme.textFieldForeground)
3940
append(CssVariable.TextColorInput, theme.textFieldForeground)
4041
append(CssVariable.TextColorLink, theme.linkText)
4142
append(CssVariable.TextColorWeak, theme.inactiveText)
4243

4344
append(CssVariable.Background, theme.background)
4445
append(CssVariable.BackgroundAlt, theme.background)
45-
append(CssVariable.CardBackground, theme.cardBackground)
46+
append(CssVariable.CardBackground, theme.editorBackground)
47+
append(CssVariable.CardBackgroundAlt, theme.editorBackground)
4648
append(CssVariable.BorderDefault, theme.border)
4749
append(CssVariable.TabActive, theme.activeTab)
4850

@@ -63,6 +65,7 @@ class ThemeBrowserAdapter {
6365

6466
append(CssVariable.SyntaxCodeFontFamily, theme.editorFont.toCssFontFamily("monospace"))
6567
append(CssVariable.SyntaxCodeFontSize, theme.editorFont.toCssSize())
68+
append(CssVariable.SyntaxCode, theme.editorForeground)
6669
append(CssVariable.SyntaxBackground, theme.editorBackground)
6770
append(CssVariable.SyntaxVariable, theme.editorVariable)
6871
append(CssVariable.SyntaxOperator, theme.editorOperator)
@@ -71,7 +74,9 @@ class ThemeBrowserAdapter {
7174
append(CssVariable.SyntaxAttributeValue, theme.editorKeyword)
7275
append(CssVariable.SyntaxAttribute, theme.editorString)
7376
append(CssVariable.SyntaxProperty, theme.editorProperty)
74-
append(CssVariable.SyntaxCode, theme.editorForeground)
77+
append(CssVariable.SyntaxKeyword, theme.editorKeyword)
78+
append(CssVariable.SyntaxString, theme.editorString)
79+
append(CssVariable.SyntaxClassName, theme.editorClassName)
7580

7681
append(CssVariable.MainBackground, theme.buttonBackground)
7782
append(CssVariable.MainForeground, theme.buttonForeground)

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitConte
5656
import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController
5757
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionReference
5858
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionReferencePosition
59+
import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage
5960
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
6061
import software.aws.toolkits.jetbrains.services.amazonq.project.RelevantDocument
6162
import software.aws.toolkits.jetbrains.services.amazonqCodeTest.CodeWhispererUTGChatManager
@@ -110,6 +111,12 @@ import java.util.UUID
110111
import software.amazon.awssdk.services.codewhispererstreaming.model.Position as StreamingPosition
111112
import software.amazon.awssdk.services.codewhispererstreaming.model.Range as StreamingRange
112113

114+
data class TestCommandMessage(
115+
val sender: String = "codetest",
116+
val command: String = "test",
117+
val type: String = "addAnswer",
118+
) : AmazonQMessage
119+
113120
class CodeTestChatController(
114121
private val context: AmazonQAppInitContext,
115122
private val chatSessionStorage: ChatSessionStorage,

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
// Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3-
3+
@file:Suppress("BannedImports")
44
package software.aws.toolkits.jetbrains.services.cwc.commands
55

6+
import com.google.gson.Gson
67
import com.intellij.openapi.application.ApplicationManager
78
import com.intellij.openapi.project.Project
89
import kotlinx.coroutines.flow.MutableSharedFlow
@@ -15,6 +16,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.Gener
1516
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendToPromptParams
1617
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType
1718
import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage
19+
import software.aws.toolkits.jetbrains.services.amazonqCodeTest.controller.TestCommandMessage
1820
import software.aws.toolkits.jetbrains.services.cwc.editor.context.ActiveFileContextExtractor
1921
import software.aws.toolkits.jetbrains.services.cwc.editor.context.ExtractionTriggerType
2022

@@ -26,8 +28,7 @@ class ActionRegistrar {
2628

2729
fun reportMessageClick(command: EditorContextCommand, project: Project) {
2830
if (command == EditorContextCommand.GenerateUnitTests) {
29-
// pre-existing old chat code path
30-
_messages.tryEmit(ContextMenuActionMessage(command, project))
31+
AsyncChatUiListener.notifyPartialMessageUpdate(Gson().toJson(TestCommandMessage()))
3132
} else {
3233
// new agentic chat route
3334
ApplicationManager.getApplication().executeOnPooledThread {

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import software.aws.toolkits.jetbrains.core.coroutines.EDT
3838
import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext
3939
import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController
4040
import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthNeededState
41-
import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage
4241
import software.aws.toolkits.jetbrains.services.amazonq.messages.MessagePublisher
4342
import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteraction
4443
import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteractionType
@@ -52,7 +51,6 @@ import software.aws.toolkits.jetbrains.services.cwc.clients.chat.model.TriggerTy
5251
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.v1.ChatSessionFactoryV1
5352
import software.aws.toolkits.jetbrains.services.cwc.commands.CodeScanIssueActionMessage
5453
import software.aws.toolkits.jetbrains.services.cwc.commands.ContextMenuActionMessage
55-
import software.aws.toolkits.jetbrains.services.cwc.commands.EditorContextCommand
5654
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.StaticPrompt
5755
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.StaticTextResponse
5856
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.messenger.ChatPromptHandler
@@ -76,12 +74,6 @@ import software.aws.toolkits.jetbrains.services.cwc.storage.ChatSessionStorage
7674
import software.aws.toolkits.telemetry.CwsprChatCommandType
7775
import java.util.UUID
7876

79-
data class TestCommandMessage(
80-
val sender: String = "codetest",
81-
val command: String = "test",
82-
val type: String = "addAnswer",
83-
) : AmazonQMessage
84-
8577
class ChatController private constructor(
8678
private val context: AmazonQAppInitContext,
8779
private val chatSessionStorage: ChatSessionStorage,
@@ -285,16 +277,7 @@ class ChatController private constructor(
285277

286278
// JB specific (not in vscode)
287279
override suspend fun processContextMenuCommand(message: ContextMenuActionMessage) {
288-
// Extract context
289-
if (message.project != context.project) {
290-
return
291-
}
292-
293-
if (message.command == EditorContextCommand.GenerateUnitTests) {
294-
// Publish an event to "codetest" tab with command as "test" and type as "addAnswer"
295-
val messageToPublish = TestCommandMessage()
296-
context.messagesFromAppToUi.publish(messageToPublish)
297-
}
280+
// No-op since context commands are handled elsewhere. This function will be deprecated once we remove this class
298281
}
299282

300283
private suspend fun processPromptActions(

plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/handler.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ private handleDocCommand(chatPrompt: ChatPrompt, tabID: string, taskName: string
331331
this.showScanInTab(affectedTabId)
332332
}
333333

334-
private handleCodeTestCommand(chatPrompt: ChatPrompt, tabID: string, eventId: string | undefined) {
334+
private handleCodeTestCommand(chatPrompt: ChatPrompt, tabID: string | undefined, eventId: string | undefined) {
335335
if (!this.isCodeTestEnabled) {
336336
return
337337
}
@@ -343,10 +343,17 @@ private handleDocCommand(chatPrompt: ChatPrompt, tabID: string, taskName: string
343343
this.connector.startTestGen(testTabId, realPromptText)
344344
return
345345
}
346+
/**
347+
* right click -> generate test has no tab id
348+
* we have to manually create one if a testgen tab
349+
* wasn't previously created
350+
*/
351+
if (!tabID) {
352+
tabID = this.mynahUI?.updateStore('', {})
353+
}
346354
const affectedTabId: string | undefined = this.addTab(tabID)
347355

348356
// if there is no test tab, open a new one
349-
350357
if (affectedTabId === undefined) {
351358
this.mynahUI?.notify({
352359
content: uiComponentsTexts.noMoreTabsTooltip,

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

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import com.intellij.diff.DiffContentFactory
77
import com.intellij.diff.DiffManager
88
import com.intellij.diff.DiffManagerEx
99
import com.intellij.diff.requests.SimpleDiffRequest
10-
import com.intellij.notification.NotificationType
1110
import com.intellij.openapi.application.ApplicationManager
1211
import com.intellij.openapi.fileChooser.FileChooserFactory
1312
import com.intellij.openapi.fileChooser.FileSaverDescriptor
@@ -25,8 +24,10 @@ import org.eclipse.lsp4j.PublishDiagnosticsParams
2524
import org.eclipse.lsp4j.ShowDocumentParams
2625
import org.eclipse.lsp4j.ShowDocumentResult
2726
import org.eclipse.lsp4j.ShowMessageRequestParams
27+
import org.slf4j.event.Level
2828
import software.aws.toolkits.core.utils.error
2929
import software.aws.toolkits.core.utils.getLogger
30+
import software.aws.toolkits.core.utils.info
3031
import software.aws.toolkits.core.utils.warn
3132
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
3233
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
@@ -70,11 +71,19 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
7071

7172
override fun showMessage(messageParams: MessageParams) {
7273
val type = when (messageParams.type) {
73-
MessageType.Error -> NotificationType.ERROR
74-
MessageType.Warning -> NotificationType.WARNING
75-
MessageType.Info, MessageType.Log -> NotificationType.INFORMATION
74+
MessageType.Error -> Level.ERROR
75+
MessageType.Warning -> Level.WARN
76+
MessageType.Info, MessageType.Log -> Level.INFO
7677
}
77-
println("$type: ${messageParams.message}")
78+
79+
if (type == Level.ERROR &&
80+
messageParams.message.lineSequence().firstOrNull()?.contains("NOTE: The AWS SDK for JavaScript (v2) is in maintenance mode.") == true
81+
) {
82+
LOG.info { "Suppressed Flare AWS JS SDK v2 EoL error message" }
83+
return
84+
}
85+
86+
LOG.atLevel(type).log(messageParams.message)
7887
}
7988

8089
override fun showMessageRequest(requestParams: ShowMessageRequestParams): CompletableFuture<MessageActionItem?>? {

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

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.auth
55

66
import com.intellij.openapi.Disposable
77
import com.intellij.openapi.project.Project
8+
import com.intellij.util.concurrency.AppExecutorUtil
89
import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage
910
import software.aws.toolkits.core.TokenConnectionSettings
11+
import software.aws.toolkits.core.utils.getLogger
12+
import software.aws.toolkits.core.utils.warn
1013
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
1114
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
1215
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManagerListener
1316
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
17+
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAuthState
1418
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProvider
1519
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
1620
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
@@ -26,6 +30,9 @@ import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSe
2630
import software.aws.toolkits.jetbrains.utils.isQConnected
2731
import software.aws.toolkits.jetbrains.utils.isQExpired
2832
import java.util.concurrent.CompletableFuture
33+
import java.util.concurrent.ScheduledExecutorService
34+
import java.util.concurrent.ScheduledFuture
35+
import java.util.concurrent.TimeUnit
2936

3037
class DefaultAuthCredentialsService(
3138
private val project: Project,
@@ -34,7 +41,12 @@ class DefaultAuthCredentialsService(
3441
) : AuthCredentialsService,
3542
BearerTokenProviderListener,
3643
ToolkitConnectionManagerListener,
37-
QRegionProfileSelectedListener {
44+
QRegionProfileSelectedListener,
45+
Disposable {
46+
47+
private val scheduler: ScheduledExecutorService = AppExecutorUtil.getAppScheduledExecutorService()
48+
private var tokenSyncTask: ScheduledFuture<*>? = null
49+
private val tokenSyncIntervalSeconds = 10L
3850

3951
init {
4052
project.messageBus.connect(serverInstance).apply {
@@ -49,6 +61,47 @@ class DefaultAuthCredentialsService(
4961
updateConfiguration()
5062
}
5163
}
64+
65+
// Start periodic token sync
66+
startPeriodicTokenSync()
67+
}
68+
69+
private fun startPeriodicTokenSync() {
70+
tokenSyncTask = scheduler.scheduleWithFixedDelay(
71+
{
72+
try {
73+
if (isQConnected(project)) {
74+
if (isQExpired(project)) {
75+
val manager = ToolkitConnectionManager.getInstance(project)
76+
val connection = manager.activeConnectionForFeature(QConnection.getInstance()) ?: return@scheduleWithFixedDelay
77+
78+
// Try to refresh the token if it's in NEEDS_REFRESH state
79+
val tokenProvider = (connection.getConnectionSettings() as? TokenConnectionSettings)
80+
?.tokenProvider
81+
?.delegate
82+
?.let { it as? BearerTokenProvider } ?: return@scheduleWithFixedDelay
83+
84+
if (tokenProvider.state() == BearerTokenAuthState.NEEDS_REFRESH) {
85+
try {
86+
tokenProvider.resolveToken()
87+
// Now that the token is refreshed, update it in Flare
88+
updateTokenFromActiveConnection()
89+
} catch (e: Exception) {
90+
LOG.warn(e) { "Failed to refresh bearer token" }
91+
}
92+
}
93+
} else {
94+
updateTokenFromActiveConnection()
95+
}
96+
}
97+
} catch (e: Exception) {
98+
LOG.warn(e) { "Failed to sync bearer token to Flare" }
99+
}
100+
},
101+
tokenSyncIntervalSeconds,
102+
tokenSyncIntervalSeconds,
103+
TimeUnit.SECONDS
104+
)
52105
}
53106

54107
override fun updateTokenCredentials(accessToken: String, encrypted: Boolean): CompletableFuture<ResponseMessage> {
@@ -134,4 +187,13 @@ class DefaultAuthCredentialsService(
134187
server.updateConfiguration(payload)
135188
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))
136189
}
190+
191+
override fun dispose() {
192+
tokenSyncTask?.cancel(false)
193+
tokenSyncTask = null
194+
}
195+
196+
companion object {
197+
private val LOG = getLogger<DefaultAuthCredentialsService>()
198+
}
137199
}

0 commit comments

Comments
 (0)