aws / aws-toolkit-jetbrains

AWS Toolkit for JetBrains - a plugin for interacting with AWS from JetBrains IDEs
https://plugins.jetbrains.com/plugin/11349-aws-toolkit
Apache License 2.0
743 stars 212 forks source link

Amazon Q plugin unsupported in JetBrains Gateway + WSL #4658

Open juanito-caylent opened 1 month ago

juanito-caylent commented 1 month ago

Describe the bug

The Amazon Q plugin seems to be unsupported in JetBrains Gateway, at least in projects connected to WSL.

To reproduce

Given the environment described at the bottom, without a user logged in:

  1. Create an empty project inside WSL via JetBrains Gateway. Pick any IDE flavor.
  2. Install the Amazon Q plugin (Client).
  3. Open Amazon Q Chat without any authenticated user.
  4. Press "Use with Pro license" and fill in the SSO Start URL and region.
  5. Press Continue. The UI will say "Authenticating in Browser" and "CONFIRMATION CODE".
  6. Error: The browser doesn't open and the following error log shows in the IDE:
    
    Failed to authenticate: message: Ran into unknown error: com.intellij.diagnostic.PluginException: Cannot load class software.aws.toolkits.jetbrains.core.credentials.sso.pkce.ToolkitOAuthService (
    error: com/intellij/collaboration/auth/services/OAuthServiceBase,
    classLoader=PluginClassLoader(plugin=PluginDescriptor(name=AWS Core, id=aws.toolkit.core, descriptorPath=plugin.xml, path=~\AppData\Roaming\JetBrains\JetBrainsClient241.18034.82\plugins\plugin-core, version=3.15-241, package=null, isBundled=false), packagePrefix=null, state=active)
    ); profile: UserConfigSsoSessionProfile(configSessionName=*****, ssoRegion=*****, startUrl=*****, scopes=[codewhisperer:conversations, codewhisperer:transformations, codewhisperer:taskassist, codewhisperer:completions, codewhisperer:analysis])

com.intellij.diagnostic.PluginException: Cannot load class software.aws.toolkits.jetbrains.core.credentials.sso.pkce.ToolkitOAuthService ( error: com/intellij/collaboration/auth/services/OAuthServiceBase, classLoader=PluginClassLoader(plugin=PluginDescriptor(name=AWS Core, id=aws.toolkit.core, descriptorPath=plugin.xml, path=~\AppData\Roaming\JetBrains\JetBrainsClient241.18034.82\plugins\plugin-core, version=3.15-241, package=null, isBundled=false), packagePrefix=null, state=active) ) at com.intellij.ide.plugins.cl.PluginClassLoader.loadClassInsideSelf(PluginClassLoader.kt:331) at com.intellij.ide.plugins.cl.PluginClassLoader.tryLoadingClass(PluginClassLoader.kt:178) at com.intellij.ide.plugins.cl.PluginClassLoader.loadClass(PluginClassLoader.kt:151) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) at software.aws.toolkits.jetbrains.core.credentials.sso.SsoAccessTokenProvider.pollForPkceToken(SsoAccessTokenProvider.kt:319) at software.aws.toolkits.jetbrains.core.credentials.sso.SsoAccessTokenProvider.accessToken(SsoAccessTokenProvider.kt:164) at software.aws.toolkits.jetbrains.core.credentials.sso.bearer.InteractiveBearerTokenProvider.reauthenticate(BearerTokenProvider.kt:185) at software.aws.toolkits.jetbrains.core.credentials.ToolkitAuthManagerKt$reauthProviderIfNeeded$1$1.invoke(ToolkitAuthManager.kt:241) at software.aws.toolkits.jetbrains.core.credentials.ToolkitAuthManagerKt$reauthProviderIfNeeded$1$1.invoke(ToolkitAuthManager.kt:239) at software.aws.toolkits.jetbrains.utils.ThreadingUtilsKt.runUnderProgressIfNeeded(ThreadingUtils.kt:32) at software.aws.toolkits.jetbrains.core.credentials.ToolkitAuthManagerKt$reauthProviderIfNeeded$1.invoke(ToolkitAuthManager.kt:239) at software.aws.toolkits.jetbrains.core.credentials.ToolkitAuthManagerKt$reauthProviderIfNeeded$1.invoke(ToolkitAuthManager.kt:238) at software.aws.toolkits.jetbrains.core.credentials.ToolkitAuthManagerKt.maybeReauthProviderIfNeeded(ToolkitAuthManager.kt:297) at software.aws.toolkits.jetbrains.core.credentials.ToolkitAuthManagerKt.reauthProviderIfNeeded(ToolkitAuthManager.kt:238) at software.aws.toolkits.jetbrains.core.credentials.ToolkitAuthManagerKt.reauthConnectionIfNeeded(ToolkitAuthManager.kt:230) at software.aws.toolkits.jetbrains.core.credentials.LoginUtilsKt$authAndUpdateConfig$connection$1.invoke(LoginUtils.kt:181) at software.aws.toolkits.jetbrains.core.credentials.LoginUtilsKt$authAndUpdateConfig$connection$1.invoke(LoginUtils.kt:180) at software.aws.toolkits.jetbrains.core.credentials.DefaultToolkitAuthManager.tryCreateTransientSsoConnection(DefaultToolkitAuthManager.kt:90) at software.aws.toolkits.jetbrains.core.credentials.LoginUtilsKt.authAndUpdateConfig(LoginUtils.kt:180) at software.aws.toolkits.jetbrains.core.credentials.Login$IdC.loginIdc(LoginUtils.kt:77) at software.aws.toolkits.jetbrains.core.webview.LoginBrowser$loginIdC$1.invoke(LoginBrowser.kt:162) at software.aws.toolkits.jetbrains.core.webview.LoginBrowser$loginIdC$1.invoke(LoginBrowser.kt:161) at software.aws.toolkits.jetbrains.core.webview.LoginBrowser$loginWithBackgroundContext$1$1$1$1.invoke(LoginBrowser.kt:218) at com.intellij.openapi.progress.CoroutinesKt.blockingContextInner(coroutines.kt:320) at com.intellij.openapi.progress.CoroutinesKt.access$blockingContextInner(coroutines.kt:1) at com.intellij.openapi.progress.CoroutinesKt$blockingContext$2.invokeSuspend(coroutines.kt:197) at com.intellij.openapi.progress.CoroutinesKt$blockingContext$2.invoke(coroutines.kt) at com.intellij.openapi.progress.CoroutinesKt$blockingContext$2.invoke(coroutines.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78) at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:264) at com.intellij.openapi.progress.CoroutinesKt.blockingContext(coroutines.kt:196) at software.aws.toolkits.jetbrains.core.webview.LoginBrowser$loginWithBackgroundContext$1$1$1.invokeSuspend(LoginBrowser.kt:217) at software.aws.toolkits.jetbrains.core.webview.LoginBrowser$loginWithBackgroundContext$1$1$1.invoke(LoginBrowser.kt) at software.aws.toolkits.jetbrains.core.webview.LoginBrowser$loginWithBackgroundContext$1$1$1.invoke(LoginBrowser.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78) at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:167) at kotlinx.coroutines.BuildersKt.withContext(Unknown Source) at com.intellij.platform.util.progress.ProgressPipeImpl.collectProgressUpdates(ProgressPipe.kt:41) at com.intellij.openapi.progress.impl.PlatformTaskSupport$withBackgroundProgressInternal$2.invokeSuspend(PlatformTaskSupport.kt:85) at com.intellij.openapi.progress.impl.PlatformTaskSupport$withBackgroundProgressInternal$2.invoke(PlatformTaskSupport.kt) at com.intellij.openapi.progress.impl.PlatformTaskSupport$withBackgroundProgressInternal$2.invoke(PlatformTaskSupport.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78) at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:264) at com.intellij.openapi.progress.impl.PlatformTaskSupport.withBackgroundProgressInternal(PlatformTaskSupport.kt:79) at com.intellij.platform.ide.progress.TasksKt.withBackgroundProgress(tasks.kt:56) at com.intellij.platform.ide.progress.TasksKt.withBackgroundProgress(tasks.kt:21) at software.aws.toolkits.jetbrains.core.webview.LoginBrowser$loginWithBackgroundContext$1$1.invokeSuspend(LoginBrowser.kt:216) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108) at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:280) at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85) at kotlinx.coroutines.BuildersKtBuildersKt.runBlocking(Builders.kt:59) at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source) at kotlinx.coroutines.BuildersKtBuildersKt.runBlocking$default(Builders.kt:38) at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source) at software.aws.toolkits.jetbrains.core.webview.LoginBrowser$loginWithBackgroundContext$1.invoke(LoginBrowser.kt:215) at software.aws.toolkits.jetbrains.utils.ThreadingUtilsKt.pluginAwareExecuteOnPooledThread$lambda$3(ThreadingUtils.kt:86) at com.intellij.codeWithMe.ClientId$Companion.decorateCallable$lambda$6(ClientId.kt:377) at com.intellij.openapi.application.impl.RwLockHolder$executeOnPooledThread$2.call(RwLockHolder.kt:182) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702) at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699) at java.base/java.lang.Thread.run(Thread.java:840) Caused by: java.lang.NoClassDefFoundError: com/intellij/collaboration/auth/services/OAuthServiceBase at java.base/java.lang.ClassLoader.defineClass2(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1108) at com.intellij.util.lang.UrlClassLoader.consumeClassData(UrlClassLoader.java:291) at com.intellij.util.lang.ZipResourceFile.findClass(ZipResourceFile.java:116) at com.intellij.util.lang.JarLoader.findClass(JarLoader.java:58) at com.intellij.util.lang.ClassPath.findClassInLoader(ClassPath.java:240) at com.intellij.util.lang.ClassPath.findClass(ClassPath.java:190) at com.intellij.ide.plugins.cl.PluginClassLoader.loadClassInsideSelf(PluginClassLoader.kt:326) ... 66 more Caused by: java.lang.ClassNotFoundException: com.intellij.collaboration.auth.services.OAuthServiceBase PluginClassLoader(plugin=PluginDescriptor(name=AWS Core, id=aws.toolkit.core, descriptorPath=plugin.xml, path=~\AppData\Roaming\JetBrains\JetBrainsClient241.18034.82\plugins\plugin-core, version=3.15-241, package=null, isBundled=false), packagePrefix=null, state=active) at com.intellij.ide.plugins.cl.PluginClassLoader.loadClass(PluginClassLoader.kt:156) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ... 74 more



**Expected behavior**
<!-- A clear and concise description of what you expected to happen. -->
A browser being opened when requested, and being able to successfully log into the plugin.

**Screenshots**
<!-- If applicable, add screenshots to help explain your problem. -->
N/A

**Your Environment**
- OS: Windows 10, with a WSL connection to Arch Linux
- JetBrains product: JetBrains Gateway (connected to a WSL project)
- JetBrains product version: JetBrains Gateway 2024.1.2
Build #GW-241.17011.87, built on May 23, 2024
Runtime version: 17.0.11+1-b1207.24 amd64
- AWS Toolkit version: Amazon Q 3.15-241
- SAM CLI version: None
- JVM/Python version: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
GC: G1 Young Generation, G1 Old Generation
Registry:
  ide.experimental.ui=true

**Additional context**
<!-- Add any other context about the problem here. -->
I haven't tested this behavior on projects connected via other means, such as SSH, so I cannot tell whether this only happens with WSL or if it applies to JetBrains Gateway in general.
rli commented 1 month ago

The Q plugin meant to be installed on the host, not the thin client

juanito-caylent commented 1 month ago

I haven't seen Amazon Q Chat available in the host-based plugin. How can I enable* it?

By the way, thanks for the quick reply and subsequent PR!

*EDIT: By enabling, I'm asking about the chat, not about the code suggestions (which I can enable successfully).

nicusorflorin commented 1 month ago

I have the same issue on Webstorm, the only difference is that the browser does open on the first attempt, i enter the credentials but the authenticating in browser... window remains, (subsequent attempts do not open the browser anymore)

5herlocked commented 3 weeks ago

Please +1 this request -- https://github.com/aws/aws-toolkit-jetbrains/issues/4539