From e94681aa7da84224bcb8d271a7d47292cb8b2198 Mon Sep 17 00:00:00 2001 From: Manodnya Bhoite Date: Fri, 9 May 2025 11:47:32 -0700 Subject: [PATCH 1/2] initial changes --- .../amazonq/apps/AmazonQAppInitContext.kt | 5 ++++ .../amazonq/toolwindow/AmazonQPanel.kt | 11 +++++++++ .../amazonq/toolwindow/AmazonQToolWindow.kt | 10 ++++++++ .../services/cwc/commands/ActionRegistrar.kt | 24 ++++++++++++++++++- .../services/cwc/controller/ChatController.kt | 4 ++-- 5 files changed, 51 insertions(+), 3 deletions(-) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/apps/AmazonQAppInitContext.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/apps/AmazonQAppInitContext.kt index ec9405cab18..ca485b2177e 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/apps/AmazonQAppInitContext.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/apps/AmazonQAppInitContext.kt @@ -5,6 +5,7 @@ package software.aws.toolkits.jetbrains.services.amazonq.apps import com.intellij.openapi.project.Project import software.aws.toolkits.jetbrains.services.amazonq.commands.MessageTypeRegistry +import software.aws.toolkits.jetbrains.services.amazonq.messages.MessageConnector import software.aws.toolkits.jetbrains.services.amazonq.messages.MessageListener import software.aws.toolkits.jetbrains.services.amazonq.messages.MessagePublisher import software.aws.toolkits.jetbrains.services.amazonq.webview.FqnWebviewAdapter @@ -19,3 +20,7 @@ data class AmazonQAppInitContext( val messageTypeRegistry: MessageTypeRegistry, val fqnWebviewAdapter: FqnWebviewAdapter, ) + + + + diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt index 92e81d376b1..c197a785383 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt @@ -201,6 +201,17 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di } } + fun getDefaultAppInitContext() : AmazonQAppInitContext { + + return AmazonQAppInitContext( + project = project, + messagesFromAppToUi = MessageConnector(), + messagesFromUiToApp = MessageConnector(), + messageTypeRegistry = MessageTypeRegistry(), + fqnWebviewAdapter = FqnWebviewAdapter(jcefBrowser = browser.get().jcefBrowser, browserConnector), + ) + } + override fun dispose() { } } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt index 7e0cc266c11..22c9806dec7 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt @@ -11,9 +11,11 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import com.intellij.openapi.wm.ToolWindowManager import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.runBlocking import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteraction import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteractionType import software.aws.toolkits.jetbrains.services.amazonqCodeScan.runCodeScanMessage +import software.aws.toolkits.jetbrains.services.cwc.controller.TestCommandMessage @Service(Service.Level.PROJECT) class AmazonQToolWindow private constructor( @@ -52,6 +54,14 @@ class AmazonQToolWindow private constructor( val window = getInstance(project) window.chatPanel.sendMessageAppToUi(runCodeScanMessage, tabType = "codescan") } + + fun sendTestMessage(project: Project) { + runBlocking { + val a = getInstance(project).chatPanel.getDefaultAppInitContext() + val b = a.messagesFromAppToUi.publish(TestCommandMessage()) + } + + } } override fun dispose() { diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt index 71110cba420..8b190b39203 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt @@ -6,7 +6,15 @@ package software.aws.toolkits.jetbrains.services.cwc.commands import com.intellij.openapi.project.Project import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.runBlocking +import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext +import software.aws.toolkits.jetbrains.services.amazonq.commands.MessageTypeRegistry +import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage +import software.aws.toolkits.jetbrains.services.amazonq.messages.MessageConnector +import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow +import software.aws.toolkits.jetbrains.services.amazonq.webview.FqnWebviewAdapter +import software.aws.toolkits.jetbrains.services.cwc.controller.TestCommandMessage // Register Editor Actions in the Editor Context Menu class ActionRegistrar { @@ -15,7 +23,14 @@ class ActionRegistrar { val flow = _messages.asSharedFlow() fun reportMessageClick(command: EditorContextCommand, project: Project) { - _messages.tryEmit(ContextMenuActionMessage(command, project)) + // language=JSON + AmazonQToolWindow.sendTestMessage(project) + //AsyncChatUiListener.notifyPartialMessageUpdate(a) + // _messages.tryEmit(ContextMenuActionMessage(command, project)) +// runBlocking { +// MessageConnector().publish(messageToPublish) +// } + } fun reportMessageClick(command: EditorContextCommand, issue: MutableMap, project: Project) { @@ -27,3 +42,10 @@ class ActionRegistrar { val instance = ActionRegistrar() } } +//fun getContext(project: Project) = AmazonQAppInitContext( +// project, +// MessageConnector(), +// MessageConnector(), +// MessageTypeRegistry(), +// FqnWebviewAdapter(project) +//) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt index c061f8be1c3..ee0636fb627 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt @@ -77,9 +77,9 @@ import software.aws.toolkits.telemetry.CwsprChatCommandType import java.util.UUID data class TestCommandMessage( - val sender: String = "codetest", + val sender: String = "testChat", val command: String = "test", - val type: String = "addAnswer", + val type: String = "chatMessage", ) : AmazonQMessage class ChatController private constructor( From 47bcef1df84e9989e8bd100e6a9a522dbc984850 Mon Sep 17 00:00:00 2001 From: Manodnya Bhoite Date: Sat, 10 May 2025 22:25:32 -0700 Subject: [PATCH 2/2] fix gen unit tests --- .../amazonq/apps/AmazonQAppInitContext.kt | 5 --- .../amazonq/toolwindow/AmazonQPanel.kt | 11 ------ .../amazonq/toolwindow/AmazonQToolWindow.kt | 10 ------ .../controller/CodeTestChatController.kt | 7 ++++ .../services/cwc/commands/ActionRegistrar.kt | 34 +++---------------- .../services/cwc/controller/ChatController.kt | 19 +---------- .../src/mynah-ui/ui/quickActions/handler.ts | 11 ++++-- 7 files changed, 21 insertions(+), 76 deletions(-) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/apps/AmazonQAppInitContext.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/apps/AmazonQAppInitContext.kt index ca485b2177e..ec9405cab18 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/apps/AmazonQAppInitContext.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/apps/AmazonQAppInitContext.kt @@ -5,7 +5,6 @@ package software.aws.toolkits.jetbrains.services.amazonq.apps import com.intellij.openapi.project.Project import software.aws.toolkits.jetbrains.services.amazonq.commands.MessageTypeRegistry -import software.aws.toolkits.jetbrains.services.amazonq.messages.MessageConnector import software.aws.toolkits.jetbrains.services.amazonq.messages.MessageListener import software.aws.toolkits.jetbrains.services.amazonq.messages.MessagePublisher import software.aws.toolkits.jetbrains.services.amazonq.webview.FqnWebviewAdapter @@ -20,7 +19,3 @@ data class AmazonQAppInitContext( val messageTypeRegistry: MessageTypeRegistry, val fqnWebviewAdapter: FqnWebviewAdapter, ) - - - - diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt index 4c8c8091397..2ff79e68005 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt @@ -206,17 +206,6 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di } } - fun getDefaultAppInitContext() : AmazonQAppInitContext { - - return AmazonQAppInitContext( - project = project, - messagesFromAppToUi = MessageConnector(), - messagesFromUiToApp = MessageConnector(), - messageTypeRegistry = MessageTypeRegistry(), - fqnWebviewAdapter = FqnWebviewAdapter(jcefBrowser = browser.get().jcefBrowser, browserConnector), - ) - } - override fun dispose() { } } diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt index 22c9806dec7..7e0cc266c11 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindow.kt @@ -11,11 +11,9 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import com.intellij.openapi.wm.ToolWindowManager import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.runBlocking import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteraction import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteractionType import software.aws.toolkits.jetbrains.services.amazonqCodeScan.runCodeScanMessage -import software.aws.toolkits.jetbrains.services.cwc.controller.TestCommandMessage @Service(Service.Level.PROJECT) class AmazonQToolWindow private constructor( @@ -54,14 +52,6 @@ class AmazonQToolWindow private constructor( val window = getInstance(project) window.chatPanel.sendMessageAppToUi(runCodeScanMessage, tabType = "codescan") } - - fun sendTestMessage(project: Project) { - runBlocking { - val a = getInstance(project).chatPanel.getDefaultAppInitContext() - val b = a.messagesFromAppToUi.publish(TestCommandMessage()) - } - - } } override fun dispose() { diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt index 71932b5d21b..71e495e7c6d 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt @@ -56,6 +56,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitConte import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionReference import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionReferencePosition +import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager import software.aws.toolkits.jetbrains.services.amazonq.project.RelevantDocument import software.aws.toolkits.jetbrains.services.amazonqCodeTest.CodeWhispererUTGChatManager @@ -110,6 +111,12 @@ import java.util.UUID import software.amazon.awssdk.services.codewhispererstreaming.model.Position as StreamingPosition import software.amazon.awssdk.services.codewhispererstreaming.model.Range as StreamingRange +data class TestCommandMessage( + val sender: String = "codetest", + val command: String = "test", + val type: String = "addAnswer", +) : AmazonQMessage + class CodeTestChatController( private val context: AmazonQAppInitContext, private val chatSessionStorage: ChatSessionStorage, diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt index c3ee871105f..d84ef7b3abf 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/ActionRegistrar.kt @@ -1,31 +1,24 @@ // Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 - +@file:Suppress("BannedImports") package software.aws.toolkits.jetbrains.services.cwc.commands +import com.google.gson.Gson import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.project.Project import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.runBlocking - -import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext -import software.aws.toolkits.jetbrains.services.amazonq.commands.MessageTypeRegistry -import software.aws.toolkits.jetbrains.services.amazonq.messages.MessageConnector -import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow -import software.aws.toolkits.jetbrains.services.amazonq.webview.FqnWebviewAdapter -import software.aws.toolkits.jetbrains.services.cwc.controller.TestCommandMessage - import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AsyncChatUiListener import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GenericCommandParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SendToPromptParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TriggerType import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage +import software.aws.toolkits.jetbrains.services.amazonqCodeTest.controller.TestCommandMessage import software.aws.toolkits.jetbrains.services.cwc.editor.context.ActiveFileContextExtractor import software.aws.toolkits.jetbrains.services.cwc.editor.context.ExtractionTriggerType - // Register Editor Actions in the Editor Context Menu class ActionRegistrar { @@ -33,19 +26,8 @@ class ActionRegistrar { val flow = _messages.asSharedFlow() fun reportMessageClick(command: EditorContextCommand, project: Project) { - - // language=JSON - // AmazonQToolWindow.sendTestMessage(project) - //AsyncChatUiListener.notifyPartialMessageUpdate(a) - // _messages.tryEmit(ContextMenuActionMessage(command, project)) -// runBlocking { -// MessageConnector().publish(messageToPublish) -// } - - if (command == EditorContextCommand.GenerateUnitTests) { - // pre-existing old chat code path - _messages.tryEmit(ContextMenuActionMessage(command, project)) + AsyncChatUiListener.notifyPartialMessageUpdate(Gson().toJson(TestCommandMessage())) } else { // new agentic chat route ApplicationManager.getApplication().executeOnPooledThread { @@ -65,7 +47,6 @@ class ActionRegistrar { } } } - } fun reportMessageClick(command: EditorContextCommand, issue: MutableMap, project: Project) { @@ -77,10 +58,3 @@ class ActionRegistrar { val instance = ActionRegistrar() } } -//fun getContext(project: Project) = AmazonQAppInitContext( -// project, -// MessageConnector(), -// MessageConnector(), -// MessageTypeRegistry(), -// FqnWebviewAdapter(project) -//) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt index 91426a3ae4f..a47329ed567 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt @@ -38,7 +38,6 @@ import software.aws.toolkits.jetbrains.core.coroutines.EDT import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitContext import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthNeededState -import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage import software.aws.toolkits.jetbrains.services.amazonq.messages.MessagePublisher import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteraction import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteractionType @@ -52,7 +51,6 @@ import software.aws.toolkits.jetbrains.services.cwc.clients.chat.model.TriggerTy import software.aws.toolkits.jetbrains.services.cwc.clients.chat.v1.ChatSessionFactoryV1 import software.aws.toolkits.jetbrains.services.cwc.commands.CodeScanIssueActionMessage import software.aws.toolkits.jetbrains.services.cwc.commands.ContextMenuActionMessage -import software.aws.toolkits.jetbrains.services.cwc.commands.EditorContextCommand import software.aws.toolkits.jetbrains.services.cwc.controller.chat.StaticPrompt import software.aws.toolkits.jetbrains.services.cwc.controller.chat.StaticTextResponse import software.aws.toolkits.jetbrains.services.cwc.controller.chat.messenger.ChatPromptHandler @@ -76,12 +74,6 @@ import software.aws.toolkits.jetbrains.services.cwc.storage.ChatSessionStorage import software.aws.toolkits.telemetry.CwsprChatCommandType import java.util.UUID -data class TestCommandMessage( - val sender: String = "testChat", - val command: String = "test", - val type: String = "chatMessage", -) : AmazonQMessage - class ChatController private constructor( private val context: AmazonQAppInitContext, private val chatSessionStorage: ChatSessionStorage, @@ -285,16 +277,7 @@ class ChatController private constructor( // JB specific (not in vscode) override suspend fun processContextMenuCommand(message: ContextMenuActionMessage) { - // Extract context - if (message.project != context.project) { - return - } - - if (message.command == EditorContextCommand.GenerateUnitTests) { - // Publish an event to "codetest" tab with command as "test" and type as "addAnswer" - val messageToPublish = TestCommandMessage() - context.messagesFromAppToUi.publish(messageToPublish) - } + // No-op since context commands are handled elsewhere. This function will be deprecated once we remove this class } private suspend fun processPromptActions( diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/handler.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/handler.ts index 6a7f74f2d23..a0ad5e40e8a 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/handler.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/handler.ts @@ -331,7 +331,7 @@ private handleDocCommand(chatPrompt: ChatPrompt, tabID: string, taskName: string this.showScanInTab(affectedTabId) } - private handleCodeTestCommand(chatPrompt: ChatPrompt, tabID: string, eventId: string | undefined) { + private handleCodeTestCommand(chatPrompt: ChatPrompt, tabID: string | undefined, eventId: string | undefined) { if (!this.isCodeTestEnabled) { return } @@ -343,10 +343,17 @@ private handleDocCommand(chatPrompt: ChatPrompt, tabID: string, taskName: string this.connector.startTestGen(testTabId, realPromptText) return } + /** + * right click -> generate test has no tab id + * we have to manually create one if a testgen tab + * wasn't previously created + */ + if (!tabID) { + tabID = this.mynahUI?.updateStore('', {}) + } const affectedTabId: string | undefined = this.addTab(tabID) // if there is no test tab, open a new one - if (affectedTabId === undefined) { this.mynahUI?.notify({ content: uiComponentsTexts.noMoreTabsTooltip,