Skip to content

Commit b87907a

Browse files
committed
fix: provide loading text when chat assets are slow to load
on remote, it can take 10+ seconds for chat to be visible. additionally, delete some unneeded assets to slightly reduce load time
1 parent c5b174c commit b87907a

File tree

14 files changed

+50
-382
lines changed

14 files changed

+50
-382
lines changed

buildSrc/src/main/kotlin/software/aws/toolkits/gradle/intellij/IdeVersions.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ object IdeVersions {
163163
"com.intellij.java",
164164
"com.intellij.gradle",
165165
"org.jetbrains.idea.maven",
166+
"com.jetbrains.codeWithMe",
166167
"com.intellij.properties"
167168
),
168169
marketplacePlugins = listOf(

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,12 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
133133
}
134134
}
135135

136+
/**
137+
* Only applies to local
138+
* On remote, since we are using PROJECTOR_INSTANCING, this will never run
139+
*/
136140
override fun init(toolWindow: ToolWindow) {
137-
toolWindow.stripeTitle = message("q.window.title")
141+
toolWindow.stripeTitle = message("toolwindow.stripe.amazon.q.window")
138142
toolWindow.component.addComponentListener(
139143
object : ComponentAdapter() {
140144
override fun componentResized(e: ComponentEvent) {
@@ -143,6 +147,8 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {
143147
LOG.debug {
144148
"Amazon Q Tool window stretched to a width less than the minimum allowed width, resizing to the minimum allowed width"
145149
}
150+
151+
// can't implement equivalent on remote as stretchWidth impl is noop
146152
(toolWindow as ToolWindowEx).stretchWidth(MINIMUM_TOOLWINDOW_WIDTH - newWidth)
147153
}
148154
}

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

Lines changed: 22 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ import com.intellij.ui.jcef.JBCefJSQuery
1212
import software.aws.toolkits.core.utils.inputStream
1313
import software.aws.toolkits.jetbrains.core.webview.LocalAssetJBCefRequestHandler
1414
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
15-
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider
1615
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
1716
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
1817
import software.aws.toolkits.jetbrains.services.amazonq.util.HighlightCommand
1918
import software.aws.toolkits.jetbrains.services.amazonq.util.createBrowser
19+
import software.aws.toolkits.jetbrains.services.amazonq.webview.theme.EditorThemeAdapter
20+
import software.aws.toolkits.jetbrains.services.amazonq.webview.theme.ThemeBrowserAdapter
2021
import software.aws.toolkits.jetbrains.settings.MeetQSettings
2122
import java.nio.file.Path
2223
import java.nio.file.Paths
@@ -125,30 +126,30 @@ class Browser(parent: Disposable, private val mynahAsset: Path, val project: Pro
125126
val postMessageToJavaJsCode = receiveMessageQuery.inject("JSON.stringify(message)")
126127
val connectorAdapterPath = "${LocalAssetJBCefRequestHandler.PROTOCOL}://${LocalAssetJBCefRequestHandler.AUTHORITY}/mynah/js/connectorAdapter.js"
127128
val mynahResource = assetRequestHandler.createResource(mynahAsset.fileName.toString(), mynahAsset.inputStream())
128-
generateQuickActionConfig()
129+
129130
// https://github.com/highlightjs/highlight.js/issues/1387
130131
// language=HTML
131132
val jsScripts = """
132-
<script type="text/javascript" charset="UTF-8" src="$connectorAdapterPath"></script>
133+
<script type="text/javascript" charset="UTF-8" src="$connectorAdapterPath" defer></script>
133134
<script type="text/javascript" charset="UTF-8" src="$mynahResource" defer onload="init()"></script>
134135
<script type="text/javascript">
135136
136137
const init = () => {
137138
const hybridChatConnector = connectorAdapter.initiateAdapter(
138-
${MeetQSettings.getInstance().reinvent2024OnboardingCount < MAX_ONBOARDING_PAGE_COUNT},
139-
${MeetQSettings.getInstance().disclaimerAcknowledged},
140-
$isFeatureDevAvailable,
141-
$isCodeTransformAvailable,
142-
$isDocAvailable,
143-
$isCodeScanAvailable,
144-
$isCodeTestAvailable,
145-
{
146-
postMessage: message => {
147-
$postMessageToJavaJsCode
148-
}
139+
${MeetQSettings.getInstance().reinvent2024OnboardingCount < MAX_ONBOARDING_PAGE_COUNT},
140+
${MeetQSettings.getInstance().disclaimerAcknowledged},
141+
$isFeatureDevAvailable,
142+
$isCodeTransformAvailable,
143+
$isDocAvailable,
144+
$isCodeScanAvailable,
145+
$isCodeTestAvailable,
146+
{
147+
postMessage: message => { $postMessageToJavaJsCode }
149148
},
149+
${OBJECT_MAPPER.writeValueAsString(highlightCommand)},
150+
"${activeProfile?.profileName.orEmpty()}"
151+
)
150152
151-
"${activeProfile?.profileName.orEmpty()}")
152153
const qChat = amazonQChat.createChat(
153154
{
154155
postMessage: message => {
@@ -209,15 +210,7 @@ class Browser(parent: Disposable, private val mynahAsset: Path, val project: Pro
209210
</script>
210211
""".trimIndent()
211212

212-
addQuickActionCommands(
213-
isCodeTransformAvailable,
214-
isFeatureDevAvailable,
215-
isDocAvailable,
216-
isCodeTestAvailable,
217-
isCodeScanAvailable,
218-
highlightCommand,
219-
activeProfile
220-
)
213+
// language=HTML
221214
return """
222215
<!DOCTYPE html>
223216
<style>
@@ -284,42 +277,21 @@ class Browser(parent: Disposable, private val mynahAsset: Path, val project: Pro
284277
transform: translateZ(0) !important;
285278
}
286279
</style>
287-
<html>
280+
<html lang="en">
288281
<head>
289282
<title>AWS Q</title>
290283
$jsScripts
291284
</head>
292285
<body>
286+
<div style="text-align: center;">Amazon Q is loading...</div>
287+
<script type="text/javascript">
288+
${ThemeBrowserAdapter().buildJsCodeToUpdateTheme(EditorThemeAdapter.getThemeFromIde())}
289+
</script>
293290
</body>
294291
</html>
295292
""".trimIndent()
296293
}
297294

298-
private fun addQuickActionCommands(
299-
isCodeTransformAvailable: Boolean,
300-
isFeatureDevAvailable: Boolean,
301-
isDocAvailable: Boolean,
302-
isCodeTestAvailable: Boolean,
303-
isCodeScanAvailable: Boolean,
304-
highlightCommand: HighlightCommand?,
305-
activeProfile: QRegionProfile?,
306-
) {
307-
// TODO: Remove this once chat has been integrated with agents. This is added temporarily to keep detekt happy.
308-
isCodeScanAvailable
309-
isCodeTestAvailable
310-
isDocAvailable
311-
isFeatureDevAvailable
312-
isCodeTransformAvailable
313-
MAX_ONBOARDING_PAGE_COUNT
314-
OBJECT_MAPPER
315-
highlightCommand
316-
activeProfile
317-
}
318-
319-
private fun generateQuickActionConfig() = AwsServerCapabilitiesProvider.getInstance(project).getChatOptions().quickActions.quickActionsCommandGroups
320-
.let { OBJECT_MAPPER.writeValueAsString(it) }
321-
?: "[]"
322-
323295
companion object {
324296
private const val MAX_ONBOARDING_PAGE_COUNT = 3
325297
private val OBJECT_MAPPER = jacksonObjectMapper()

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,8 @@ class BrowserConnector(
201201
themeSource
202202
.distinctUntilChanged()
203203
.onEach {
204-
themeBrowserAdapter.updateThemeInBrowser(chatBrowser, it, uiReady)
204+
uiReady.await()
205+
themeBrowserAdapter.updateThemeInBrowser(chatBrowser, it)
205206
}
206207
.launchIn(this)
207208
}
@@ -605,6 +606,7 @@ class BrowserConnector(
605606
val isCodeScanAvailable = isCodeScanAvailable(project)
606607
val isCodeTestAvailable = isCodeTestAvailable(project)
607608

609+
// language=JavaScript
608610
val script = """
609611
try {
610612
const tempConnector = connectorAdapter.initiateAdapter(
@@ -615,7 +617,7 @@ class BrowserConnector(
615617
$isDocAvailable,
616618
$isCodeScanAvailable,
617619
$isCodeTestAvailable,
618-
{ postMessage: () => {} }
620+
{ postMessage: () => {} },
619621
);
620622
621623
const commands = tempConnector.initialQuickActions?.slice(0, 2) || [];

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@ class ThemeBrowserAdapter {
1919
browser.executeJavaScript("window.changeTheme(${theme.darkMode})", browser.url, 0)
2020
}
2121

22-
suspend fun updateThemeInBrowser(browser: CefBrowser, theme: AmazonQTheme, uiReady: CompletableDeferred<Boolean>) {
23-
uiReady.await()
22+
fun updateThemeInBrowser(browser: CefBrowser, theme: AmazonQTheme) {
2423
val codeToUpdateTheme = buildJsCodeToUpdateTheme(theme)
2524
browser.executeJavaScript(codeToUpdateTheme, browser.url, 0)
2625
}
2726

28-
private fun buildJsCodeToUpdateTheme(theme: AmazonQTheme) = buildString {
27+
fun buildJsCodeToUpdateTheme(theme: AmazonQTheme) = buildString {
2928
val (bg, altBg, inputBg) = determineInputAndBgColor(theme)
3029
appendDarkMode(theme.darkMode)
3130

plugins/amazonq/mynah-ui/src/mynah-ui/connectorAdapter.ts

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,6 @@ import { isTabType } from './ui/storages/tabsStorage'
77
import { WebviewUIHandler } from './ui/main'
88
import { TabDataGenerator } from './ui/tabs/generator'
99
import { ChatClientAdapter, ChatEventHandler } from '@aws/chat-client'
10-
import { FqnExtractor } from "./fqn/extractor";
11-
12-
export * from "./ui/main";
13-
14-
declare global {
15-
interface Window { fqnExtractor: FqnExtractor; }
16-
}
17-
18-
window.fqnExtractor = new FqnExtractor();
1910

2011
export const initiateAdapter = (showWelcomePage: boolean,
2112
disclaimerAcknowledged: boolean,
@@ -25,11 +16,12 @@ export const initiateAdapter = (showWelcomePage: boolean,
2516
isCodeScanEnabled: boolean,
2617
isCodeTestEnabled: boolean,
2718
ideApiPostMessage: (message: any) => void,
28-
profileName?: string) : HybridChatAdapter => {
29-
return new HybridChatAdapter(showWelcomePage, disclaimerAcknowledged, isFeatureDevEnabled, isCodeTransformEnabled, isDocEnabled, isCodeScanEnabled, isCodeTestEnabled, ideApiPostMessage, profileName)
19+
highlightCommand?: QuickActionCommand,
20+
profileName?: string,
21+
) : HybridChatAdapter => {
22+
return new HybridChatAdapter(showWelcomePage, disclaimerAcknowledged, isFeatureDevEnabled, isCodeTransformEnabled, isDocEnabled, isCodeScanEnabled, isCodeTestEnabled, ideApiPostMessage, highlightCommand, profileName)
3023
}
3124

32-
3325
// Ref: https://github.com/aws/aws-toolkit-vscode/blob/e9ea8082ffe0b9968a873437407d0b6b31b9e1a5/packages/core/src/amazonq/webview/ui/connectorAdapter.ts#L14
3426
export class HybridChatAdapter implements ChatClientAdapter {
3527
private uiHandler?: WebviewUIHandler
@@ -46,6 +38,7 @@ export class HybridChatAdapter implements ChatClientAdapter {
4638
private isCodeScanEnabled: boolean,
4739
private isCodeTestEnabled: boolean,
4840
private ideApiPostMessage: (message: any) => void,
41+
private highlightCommand?: QuickActionCommand,
4942
private profileName?: string,
5043

5144
) {}
@@ -67,6 +60,7 @@ export class HybridChatAdapter implements ChatClientAdapter {
6760
isDocEnabled: this.isDocEnabled,
6861
isCodeScanEnabled: this.isCodeScanEnabled,
6962
isCodeTestEnabled: this.isCodeTestEnabled,
63+
highlightCommand: this.highlightCommand,
7064
profileName: this.profileName,
7165
hybridChat: true,
7266
})

plugins/amazonq/mynah-ui/src/mynah-ui/fqn/extractor.ts

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

0 commit comments

Comments
 (0)