diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt index 904db25ee7f..5ad9b623d21 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/Browser.kt @@ -123,11 +123,8 @@ class Browser(parent: Disposable, private val mynahAsset: Path, val project: Pro const hybridChatConnector = connectorAdapter.initiateAdapter( ${MeetQSettings.getInstance().reinvent2024OnboardingCount < MAX_ONBOARDING_PAGE_COUNT}, ${MeetQSettings.getInstance().disclaimerAcknowledged}, - true, $isCodeTransformAvailable, - true, $isCodeScanAvailable, - true, { postMessage: message => { $postMessageToJavaJsCode } }, diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt index 54ccf726f3a..19d1dbaba0b 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt @@ -703,11 +703,8 @@ class BrowserConnector( const tempConnector = connectorAdapter.initiateAdapter( false, true, // the two values are not used here, needed for constructor - true, $isCodeTransformAvailable, - true, $isCodeScanAvailable, - true, { postMessage: () => {} }, ); diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/connectorAdapter.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/connectorAdapter.ts index c89f92d0a01..01f092c50e7 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/connectorAdapter.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/connectorAdapter.ts @@ -10,16 +10,13 @@ import { ChatClientAdapter, ChatEventHandler } from '@aws/chat-client' export const initiateAdapter = (showWelcomePage: boolean, disclaimerAcknowledged: boolean, - isFeatureDevEnabled: boolean, isCodeTransformEnabled: boolean, - isDocEnabled: boolean, isCodeScanEnabled: boolean, - isCodeTestEnabled: boolean, ideApiPostMessage: (message: any) => void, highlightCommand?: QuickActionCommand, profileName?: string, ) : HybridChatAdapter => { - return new HybridChatAdapter(showWelcomePage, disclaimerAcknowledged, isFeatureDevEnabled, isCodeTransformEnabled, isDocEnabled, isCodeScanEnabled, isCodeTestEnabled, ideApiPostMessage, highlightCommand, profileName) + return new HybridChatAdapter(showWelcomePage, disclaimerAcknowledged, isCodeTransformEnabled, isCodeScanEnabled, ideApiPostMessage, highlightCommand, profileName) } // Ref: https://github.com/aws/aws-toolkit-vscode/blob/e9ea8082ffe0b9968a873437407d0b6b31b9e1a5/packages/core/src/amazonq/webview/ui/connectorAdapter.ts#L14 @@ -32,11 +29,8 @@ export class HybridChatAdapter implements ChatClientAdapter { private showWelcomePage: boolean, private disclaimerAcknowledged: boolean, - private isFeatureDevEnabled: boolean, private isCodeTransformEnabled: boolean, - private isDocEnabled: boolean, private isCodeScanEnabled: boolean, - private isCodeTestEnabled: boolean, private ideApiPostMessage: (message: any) => void, private highlightCommand?: QuickActionCommand, private profileName?: string, @@ -55,11 +49,8 @@ export class HybridChatAdapter implements ChatClientAdapter { mynahUIRef: this.mynahUIRef, showWelcomePage: this.showWelcomePage, disclaimerAcknowledged: this.disclaimerAcknowledged, - isFeatureDevEnabled: this.isFeatureDevEnabled, isCodeTransformEnabled: this.isCodeTransformEnabled, - isDocEnabled: this.isDocEnabled, isCodeScanEnabled: this.isCodeScanEnabled, - isCodeTestEnabled: this.isCodeTestEnabled, highlightCommand: this.highlightCommand, profileName: this.profileName, hybridChat: true, @@ -86,10 +77,6 @@ export class HybridChatAdapter implements ChatClientAdapter { isSupportedQuickAction(command: string): boolean { return ( - command === '/dev' || - command === '/test' || - command === '/review' || - command === '/doc' || command === '/transform' ) } @@ -100,11 +87,8 @@ export class HybridChatAdapter implements ChatClientAdapter { get initialQuickActions(): QuickActionCommandGroup[] { const tabDataGenerator = new TabDataGenerator({ - isFeatureDevEnabled: this.isFeatureDevEnabled, isCodeTransformEnabled: this.isCodeTransformEnabled, - isDocEnabled: this.isDocEnabled, isCodeScanEnabled: this.isCodeScanEnabled, - isCodeTestEnabled: this.isCodeTestEnabled, profileName: this.profileName }) return tabDataGenerator.quickActionsGenerator.generateForTab('cwc') ?? [] diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/amazonqCommonsConnector.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/amazonqCommonsConnector.ts index a22424baef1..f49ecaa3cef 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/amazonqCommonsConnector.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/amazonqCommonsConnector.ts @@ -7,7 +7,7 @@ import { ChatItemAction, ChatPrompt } from '@aws/mynah-ui-chat' import { AuthFollowUpType } from '../followUps/generator' import { ExtensionMessage } from '../commands' import {getTabCommandFromTabType, isTabType, TabType } from '../storages/tabsStorage' -import {codeScanUserGuide, codeTestUserGuide, codeTransformUserGuide, docUserGuide, featureDevUserGuide} from "../texts/constants"; +import {codeScanUserGuide, codeTransformUserGuide} from "../texts/constants"; import {createClickTelemetry, createOpenAgentTelemetry, Trigger} from "../telemetry/actions"; export type WelcomeFollowupType = 'continue-to-chat' diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/codeTestChatConnector.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/codeTestChatConnector.ts deleted file mode 100644 index 7fcbdcc541a..00000000000 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/codeTestChatConnector.ts +++ /dev/null @@ -1,615 +0,0 @@ -/*! - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -import {ExtensionMessage} from "../commands"; -import {ChatPayload, ConnectorProps} from "../connector"; -import {FormButtonIds} from "../forms/constants"; -import {ChatItem, ChatItemAction, ChatItemType, FeedbackPayload, MynahIcons, MynahUIDataModel} from '@aws/mynah-ui-chat' -import {CodeReference} from "./amazonqCommonsConnector"; - -export interface ICodeTestChatConnectorProps { - sendMessageToExtension: (message: ExtensionMessage) => void - onChatAnswerReceived?: (tabID: string, message: ChatItem) => void - sendFeedback?: (tabId: string, feedbackPayload: FeedbackPayload) => void | undefined - onUpdateAuthentication: ( - featureDevEnabled: boolean, - codeTransformEnabled: boolean, - docEnabled: boolean, - codeScanEnabled: boolean, - codeTestEnabled: boolean, - authenticatingTabIDs: string[] - ) => void - onRunTestMessageReceived?: (tabID: string, showRunTestMessage: boolean) => void - onChatAnswerUpdated?: (tabID: string, message: ChatItem) => void - onChatInputEnabled: (tabID: string, enabled: boolean) => void - onUpdatePlaceholder: (tabID: string, newPlaceholder: string) => void - onError: (tabID: string, message: string, title: string) => void -} - -interface IntroductionCardContentType { - title: string - description: string - icon: MynahIcons - content: { - body: string - } -} - -interface MessageData { - message?: string - messageType: ChatItemType - messageId?: string - triggerID?: string - informationCard?: boolean - canBeVoted: boolean - filePath?: string - tabID: string -} - -function getIntroductionCardContent(): IntroductionCardContentType { - const introductionBody = [ - "I can generate unit tests for the active file or open project in your IDE.", - "\n\n", - "I can do things like:\n", - "- Add unit tests for highlighted functions\n", - "- Generate tests for null and empty inputs\n", - "\n\n", - "To learn more, visit the [Amazon Q Developer User Guide](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/test-generation.html)." - ].join(""); - - return { - title: "/test - Unit test generation", - description: "Generate unit tests for selected code", - icon: MynahIcons.CHECK_LIST, - content: { - body: introductionBody - } - } -} - -export class CodeTestChatConnector { - private readonly sendMessageToExtension - private readonly onChatAnswerReceived - private readonly onChatAnswerUpdated - private readonly onMessageReceived - private readonly onUpdateAuthentication - private readonly chatInputEnabled - private readonly updatePlaceholder - private readonly updatePromptProgress - private readonly onError - private readonly runTestMessageReceived - - constructor(props: ConnectorProps) { - this.sendMessageToExtension = props.sendMessageToExtension - this.onChatAnswerReceived = props.onChatAnswerReceived - this.onChatAnswerUpdated = props.onChatAnswerUpdated - this.runTestMessageReceived = props.onRunTestMessageReceived - this.onMessageReceived = props.onMessageReceived - this.onUpdateAuthentication = props.onUpdateAuthentication - this.chatInputEnabled = props.onChatInputEnabled - this.updatePlaceholder = props.onUpdatePlaceholder - this.updatePromptProgress = props.onUpdatePromptProgress - this.onError = props.onError - } - - private addAnswer = (messageData: any): void => { - console.log("message data in addAnswer:") - console.log(messageData) - if (this.onChatAnswerReceived === undefined) { - return - } - if (messageData.command === 'test' && this.runTestMessageReceived) { - this.runTestMessageReceived(messageData.tabID, true) - return - } - const answer: ChatItem = { - type: messageData.messageType, - messageId: messageData.messageId ?? messageData.triggerID, - body: messageData.message, - relatedContent: undefined, - snapToTop: messageData.snapToTop, - canBeVoted: messageData.canBeVoted ?? false, - followUp: messageData.followUps ? { - text: '', - options: messageData.followUps, - } : undefined, - buttons: messageData.buttons ?? undefined, - fileList: messageData.fileList ? { - rootFolderTitle: messageData.projectRootName, - fileTreeTitle: 'READY FOR REVIEW', - filePaths: messageData.fileList, - details: { - [messageData.filePaths]: { - icon: MynahIcons.FILE, - }, - }, - } : undefined, - codeBlockActions: { - 'insert-to-cursor': undefined - }, - codeReference: messageData.codeReference?.length ? messageData.codeReference : undefined - } - - this.onChatAnswerReceived(messageData.tabID, answer) - } - - private updateAnswer = (messageData: any): void => { - console.log("message data in updateAnswer:") - console.log(messageData) - if (this.onChatAnswerUpdated == undefined) { - return - } - const answer: ChatItem = { - type: messageData.messageType, - messageId: messageData.messageId ?? messageData.triggerID, - body: messageData.message, - buttons: messageData.buttons ?? undefined, - followUp: messageData.followUps ? { - text: '', - options: messageData.followUps, - } : undefined, - canBeVoted: messageData.canBeVoted ?? false, - fileList: messageData.fileList ? { - rootFolderTitle: messageData.projectRootName, - fileTreeTitle: 'READY FOR REVIEW', - filePaths: messageData.fileList, - details: { - [messageData.fileList]: { - icon: MynahIcons.FILE, - }, - }, - } : undefined, - footer: messageData.footer ? { - fileList: { - rootFolderTitle: undefined, - fileTreeTitle: '', - filePaths: messageData.footer, - details: { - [messageData.footer]: { - icon: MynahIcons.FILE, - }, - }, - }, - } : undefined, - codeReference: messageData.codeReference?.length ? messageData.codeReference : undefined - } - this.onChatAnswerUpdated(messageData.tabID, answer) - } - - private updateUI = (messageData: any): void => { - if (!this.onMessageReceived) { - return - } - - const settings: MynahUIDataModel = { - ...(messageData.loadingChat !== undefined ? { loadingChat: messageData.loadingChat } : {}), - ...(messageData.cancelButtonWhenLoading !== undefined ? { cancelButtonWhenLoading: messageData.cancelButtonWhenLoading } : {}), - ...(messageData.promptInputPlaceholder !== undefined ? { promptInputPlaceholder: messageData.promptInputPlaceholder } : {}), - ...(messageData.promptInputProgress !== undefined ? { promptInputProgress: messageData.promptInputProgress } : {}), - // ...(messageData.promptInputDisabledState !== undefined ? { promptInputDisabledState: messageData.promptInputDisabledState } : {}), - } - - console.log("UI settings to be updated") - console.log(settings) - this.onMessageReceived(messageData.tabID, settings, false) - this.chatInputEnabled(messageData.tabID, !messageData.promptInputDisabledState) - } - - private processChatMessage = async (messageData: any): Promise => { - if (!this.onChatAnswerReceived) { - return - } - if (messageData.message === undefined && !messageData.informationCard) { - return - } - const answer: ChatItem = { - type: messageData.messageType, - messageId: messageData.messageId || messageData.triggerID, - body: messageData.informationCard ? "" : messageData.message, - canBeVoted: messageData.canBeVoted, - informationCard: messageData.informationCard ? getIntroductionCardContent() : undefined, - footer: messageData.filePath - ? { - fileList: { - rootFolderTitle: undefined, - fileTreeTitle: '', - filePaths: [messageData.filePaths], - }, - } - : undefined, - } - this.onChatAnswerReceived(messageData.tabID, answer) - } - - private processAuthNeededException = async (messageData: any): Promise => { - if (this.onChatAnswerReceived === undefined) { - return - } - this.onChatAnswerReceived( - messageData.tabID, - { - type: ChatItemType.SYSTEM_PROMPT, - body: messageData.message, - } - ) - } - - private processCodeResultMessage = async (messageData: any): Promise => { - if (this.onChatAnswerReceived !== undefined) { - const answer: ChatItem = { - type: ChatItemType.ANSWER, - canBeVoted: true, - messageId: messageData.uploadId, - followUp: { - text: '', - options: messageData.followUps, - }, - fileList: { - fileTreeTitle: 'READY FOR REVIEW', - rootFolderTitle: messageData.projectName, - filePaths: messageData.filePaths, - }, - body: messageData.message, - } - this.onChatAnswerReceived(messageData.tabID, answer) - } - } - - - private processChatAIPromptMessage = async (messageData: any): Promise => { - if (this.onChatAnswerReceived === undefined) { - return - } - - if (messageData.message !== undefined) { - const answer: ChatItem = { - type: messageData.messageType, - messageId: messageData.messageId ?? messageData.triggerID, - body: messageData.message, - relatedContent: undefined, - snapToTop: messageData.snapToTop, - canBeVoted: false, - } - - this.onChatAnswerReceived(messageData.tabID, answer) - } - } - - private processChatSummaryMessage = async (messageData: any): Promise => { - if (this.onChatAnswerUpdated === undefined) { - return - } - if (messageData.message !== undefined) { - const answer: ChatItem = { - type: messageData.messageType, - messageId: messageData.messageId ?? messageData.triggerID, - body: messageData.message, - buttons: messageData.buttons ?? [], - canBeVoted: true, - footer: { - fileList: { - rootFolderTitle: undefined, - fileTreeTitle: '', - filePaths: [messageData.filePath], - }, - }, - } - this.onChatAnswerUpdated(messageData.tabID, answer) - } - } - - handleMessageReceive = async (messageData: any): Promise => { - // TODO: Implement the logic to handle received messages for Unit Test generator chat - switch(messageData.type){ - case 'authNeededException': - await this.processAuthNeededException(messageData) - break - case 'authenticationUpdateMessage': - this.onUpdateAuthentication( - messageData.featureDevEnabled, - messageData.codeTransformEnabled, - messageData.docEnabled, - messageData.codeScanEnabled, - messageData.codeTestEnabled, - messageData.authenticatingTabIDs - ) - break - case 'chatInputEnabledMessage': - this.chatInputEnabled(messageData.tabID, messageData.enabled) - break - case 'updatePromptProgress': - this.updatePromptProgress(messageData.tabID, messageData.progressField) - break - case 'chatMessage': - await this.processChatMessage(messageData) - break - case 'addAnswer': - this.addAnswer(messageData) - break - case 'updateAnswer': - this.updateAnswer(messageData) - break - case 'chatAIPromptMessage': - await this.processChatAIPromptMessage(messageData) - break - case 'chatSummaryMessage': - await this.processChatSummaryMessage(messageData) - break - case 'updatePlaceholderMessage': - this.updatePlaceholder(messageData.tabID, messageData.newPlaceholder) - break - case 'codeResultMessage': - await this.processCodeResultMessage(messageData) - break - case 'errorMessage': - this.onError(messageData.tabID, messageData.message, messageData.title) - break - case 'updateUI': - this.updateUI(messageData) - break - } - } - - onFormButtonClick = ( - tabID: string, - messageId: string, - action: { - id: string - text?: string - formItemValues?: Record - } - ) => { - if (action === undefined) { - return - } - - this.sendMessageToExtension({ - command: 'button-click', - actionID: action.id, - formSelectedValues: action.formItemValues, - tabType: 'codetest', - tabID: tabID, - }) - - if (this.onChatAnswerUpdated === undefined) { - return - } - - const answer: ChatItem = { - type: ChatItemType.ANSWER, - messageId: messageId, - buttons: [] - }; - - switch (action.id) { - case FormButtonIds.CodeTestViewDiff: - // does nothing - break - case FormButtonIds.CodeTestAccept: - answer.buttons = [ - { - keepCardAfterClick: true, - text: 'Accepted', - id: 'utg_accepted', - status: 'success', - position: 'outside', - disabled: true - } - ]; - break; - case FormButtonIds.CodeTestReject: - answer.buttons = [ - { - keepCardAfterClick: true, - text: 'Rejected', - id: 'utg_rejected', - status: 'error', - position: 'outside', - disabled: true - } - ]; - break; - case FormButtonIds.CodeTestBuildAndExecute: - answer.buttons = [ - { - keepCardAfterClick: true, - text: 'Build and execute', - id: 'utg_build_and_execute', - status: 'primary', - position: 'outside', - disabled: true - } - ] - break; - case FormButtonIds.CodeTestSkipAndFinish: - answer.buttons = [ - { - keepCardAfterClick: true, - text: 'Skip and finish', - id: 'utg_skip_and_finish', - status: 'primary', - position: 'outside', - disabled: true - } - ] - break; - /* - //TODO: generate button - case FormButtonIds.CodeTestRegenerate: - answer.buttons = [ - { - keepCardAfterClick: true, - text: 'Regenerate', - id: 'utg_regenerate', - status: 'info', - position: 'outside', - disabled: true - } - ] - break; - */ - case FormButtonIds.CodeTestRejectAndRevert: - // TODO: what behavior should this be? - break; - case FormButtonIds.CodeTestProceed: - answer.buttons = [ - { - keepCardAfterClick: true, - text: 'Proceeded', - id: 'utg_proceeded', - status: 'primary', - position: 'outside', - disabled: true - } - ] - break; - case FormButtonIds.CodeTestModifyCommand: - answer.buttons = [ - { - keepCardAfterClick: true, - text: 'Modify command', - id: 'utg_modify_command', - status: 'primary', - position: 'outside', - disabled: true - } - ] - break - - case FormButtonIds.CodeTestProvideFeedback: - answer.buttons = [ - { - keepCardAfterClick: true, - text: 'Thanks for providing feedback.', - id: 'utg_provided_feedback', - status: 'success', - position: 'outside', - disabled: true - } - ] - break - default: - console.warn(`Unhandled action ID: ${action.id}`); - break; - } - - this.onChatAnswerUpdated(tabID, answer); - } - - clearChat = (tabID: string): void => { - this.sendMessageToExtension({ - tabID: tabID, - command: 'clear', - chatMessage: '', - tabType: 'codetest', - }) - } - - help = (tabID: string): void => { - this.sendMessageToExtension({ - tabID: tabID, - command: 'help', - chatMessage: '', - tabType: 'codetest', - }) - } - - onTabOpen = (tabID: string) => { - this.sendMessageToExtension({ - tabID, - command: 'new-tab-was-created', - tabType: 'codetest' - }) - } - - /** - * Ignore for this pr, this request Answer function is used to in the future to receive users' input - */ - requestAnswer = (tabID: string, payload: ChatPayload) => { - this.sendMessageToExtension({ - tabID, - command: 'chat-prompt', - chatMessage: payload.chatMessage, - tabType: 'codetest' - }) - } - - onTabRemove = (tabID: string) => { - this.sendMessageToExtension({ - tabID, - command: 'tab-was-removed', - tabType: 'codetest' - }) - } - - startTestGen = (tabID: string, prompt: string): void => { - console.log("calling generate-test here") - this.sendMessageToExtension({ - tabID: tabID, - command: 'start-test-gen', - prompt, - tabType: 'codetest' - }) - } - - onCodeInsertToCursorPosition = (tabID: string, code?: string, type?: 'selection' | 'block', codeReference?: CodeReference[]): void => { - this.sendMessageToExtension({ - tabID: tabID, - code, - command: 'insert_code_at_cursor_position', - codeReference, - tabType: 'codetest' - }) - } - - onFileClick = (tabID: string, filePath: string, deleted: boolean, messageId?: string): void => { - this.sendMessageToExtension({ - command: 'open-diff', - tabID, - filePath, - deleted, - messageId, - tabType: 'codetest', - }) - } - - followUpClicked = (tabID: string, followUp: ChatItemAction): void => { - this.sendMessageToExtension({ - command: 'follow-up-was-clicked', - followUp, - tabID, - tabType: 'codetest', - }) - } - - onChatItemVoted = (tabId: string, messageId: string, vote: string): void | undefined => { - this.sendMessageToExtension({ - tabID: tabId, - vote: vote, - command: 'chat-item-voted', - tabType: 'codetest', - }) - } - - sendFeedback = (tabId: string, feedbackPayload: FeedbackPayload): void | undefined => { - this.sendMessageToExtension({ - command: 'chat-item-feedback', - ...feedbackPayload, - tabType: 'codetest', - tabID: tabId, - }) - } - - onResponseBodyLinkClick = (tabID: string, messageId: string, link: string): void => { - this.sendMessageToExtension({ - command: 'response-body-link-click', - tabID, - messageId, - link, - tabType: 'codetest', - }) - } - -} diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/codeTransformChatConnector.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/codeTransformChatConnector.ts index 8494d37d104..94c8fe09fea 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/codeTransformChatConnector.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/codeTransformChatConnector.ts @@ -21,11 +21,8 @@ export interface ICodeTransformChatConnectorProps { onNotification: (props: {content: string; title?: string; type: NotificationType}) => void onStartNewTransform: (tabID: string) => void onUpdateAuthentication: ( - featureDevEnabled: boolean, codeTransformEnabled: boolean, - docEnabled: boolean, codeScanEnabled: boolean, - codeTestEnabled: boolean, authenticatingTabIDs: string[] ) => void tabsStorage: TabsStorage @@ -209,11 +206,8 @@ export class CodeTransformChatConnector { if (messageData.type === 'authenticationUpdateMessage') { this.onUpdateAuthentication( - messageData.featureDevEnabled, messageData.codeTransformEnabled, - messageData.docEnabled, messageData.codeScanEnabled, - messageData.codeTestEnabled, messageData.authenticatingTabIDs ) return diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/docChatConnector.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/docChatConnector.ts deleted file mode 100644 index ab469017424..00000000000 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/docChatConnector.ts +++ /dev/null @@ -1,397 +0,0 @@ -/*! - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -import { ChatItem, ChatItemAction, ChatItemType, FeedbackPayload, MynahIcons, ProgressField } from '@aws/mynah-ui-chat' -import { ExtensionMessage } from '../commands' -import { TabType, TabsStorage } from '../storages/tabsStorage' -import { CodeReference } from './amazonqCommonsConnector' -import { FollowUpGenerator } from '../followUps/generator' -import { getActions } from '../diffTree/actions' -import { DiffTreeFileInfo } from '../diffTree/types' - -interface ChatPayload { - chatMessage: string -} - -export interface ConnectorProps { - sendMessageToExtension: (message: ExtensionMessage) => void - onMessageReceived?: (tabID: string, messageData: any, needToShowAPIDocsTab: boolean) => void - onUpdatePromptProgress: (tabID: string, progressField: ProgressField) => void - onAsyncEventProgress: (tabID: string, inProgress: boolean, message: string, cancelButtonWhenLoading?: boolean) => void - onChatAnswerReceived?: (tabID: string, message: ChatItem) => void - sendFeedback?: (tabId: string, feedbackPayload: FeedbackPayload) => void | undefined - onError: (tabID: string, message: string, title: string) => void - onWarning: (tabID: string, message: string, title: string) => void - onUpdatePlaceholder: (tabID: string, newPlaceholder: string) => void - onChatInputEnabled: (tabID: string, enabled: boolean) => void - onUpdateAuthentication: ( - featureDevEnabled: boolean, - codeTransformEnabled: boolean, - docEnabled: boolean, - codeScanEnabled: boolean, - codeTestEnabled: boolean, - authenticatingTabIDs: string[] - ) => void - onNewTab: (tabType: TabType) => void - tabsStorage: TabsStorage - onFileComponentUpdate: ( - tabID: string, - filePaths: DiffTreeFileInfo[], - deletedFiles: DiffTreeFileInfo[], - messageId: string - ) => void -} - -export class Connector { - private readonly sendMessageToExtension - private readonly onError - private readonly onWarning - private readonly onChatAnswerReceived - private readonly onUpdatePromptProgress - private readonly onAsyncEventProgress - private readonly updatePlaceholder - private readonly chatInputEnabled - private readonly onUpdateAuthentication - private readonly followUpGenerator: FollowUpGenerator - private readonly onNewTab - private readonly onFileComponentUpdate - - constructor(props: ConnectorProps) { - this.sendMessageToExtension = props.sendMessageToExtension - this.onChatAnswerReceived = props.onChatAnswerReceived - this.onWarning = props.onWarning - this.onError = props.onError - this.onUpdatePromptProgress = props.onUpdatePromptProgress - this.onAsyncEventProgress = props.onAsyncEventProgress - this.updatePlaceholder = props.onUpdatePlaceholder - this.chatInputEnabled = props.onChatInputEnabled - this.onUpdateAuthentication = props.onUpdateAuthentication - this.followUpGenerator = new FollowUpGenerator() - this.onNewTab = props.onNewTab - this.onFileComponentUpdate = props.onFileComponentUpdate - } - - onCodeInsertToCursorPosition = ( - tabID: string, - code?: string, - type?: 'selection' | 'block', - codeReference?: CodeReference[] - ): void => { - this.sendMessageToExtension({ - tabID: tabID, - code, - command: 'insert_code_at_cursor_position', - codeReference, - tabType: 'doc', - }) - } - - onCopyCodeToClipboard = ( - tabID: string, - code?: string, - type?: 'selection' | 'block', - codeReference?: CodeReference[] - ): void => { - this.sendMessageToExtension({ - tabID: tabID, - code, - command: 'code_was_copied_to_clipboard', - codeReference, - tabType: 'doc', - }) - } - - onOpenDiff = (tabID: string, filePath: string, deleted: boolean): void => { - this.sendMessageToExtension({ - command: 'open-diff', - tabID, - filePath, - deleted, - tabType: 'doc', - }) - } - - followUpClicked = (tabID: string, followUp: ChatItemAction): void => { - this.sendMessageToExtension({ - command: 'follow-up-was-clicked', - followUp, - tabID, - tabType: 'doc', - }) - } - - requestGenerativeAIAnswer = (tabID: string, payload: ChatPayload): Promise => - new Promise((resolve, reject) => { - const message: ExtensionMessage = { - tabID: tabID, - command: 'chat-prompt', - chatMessage: payload.chatMessage, - tabType: 'doc', - } - this.sendMessageToExtension(message) - }) - - onFileActionClick = (tabID: string, messageId: string, filePath: string, actionName: string): void => { - this.sendMessageToExtension({ - command: 'file-click', - tabID, - messageId, - filePath, - actionName, - tabType: 'doc', - }) - } - - private processFolderConfirmationMessage = async (messageData: any, folderPath: string): Promise => { - if (this.onChatAnswerReceived !== undefined) { - const answer: ChatItem = { - type: ChatItemType.ANSWER, - body: messageData.message ?? undefined, - messageId: messageData.messageID ?? messageData.triggerID ?? '', - fileList: { - rootFolderTitle: undefined, - fileTreeTitle: '', - filePaths: [folderPath], - details: { - [folderPath]: { - icon: MynahIcons.FOLDER, - clickable: false, - }, - }, - }, - followUp: { - text: '', - options: messageData.followUps, - }, - } - this.onChatAnswerReceived(messageData.tabID, answer) - } - } - - private processRetryChangeFolderMessage = async (messageData: any): Promise => { - if (this.onChatAnswerReceived !== undefined) { - const answer: ChatItem = { - type: ChatItemType.ANSWER, - body: messageData.message ?? undefined, - messageId: messageData.messageID ?? messageData.triggerID ?? '', - followUp: { - text: '', - options: messageData.followUps, - }, - } - this.onChatAnswerReceived(messageData.tabID, answer) - } - } - - private processChatMessage = async (messageData: any): Promise => { - if (this.onChatAnswerReceived !== undefined) { - const answer: ChatItem = { - type: messageData.messageType, - body: messageData.message ?? undefined, - messageId: messageData.messageID ?? messageData.triggerID ?? '', - relatedContent: undefined, - canBeVoted: messageData.canBeVoted, - snapToTop: messageData.snapToTop, - followUp: - messageData.followUps !== undefined && messageData.followUps.length > 0 - ? { - text: - messageData.messageType === ChatItemType.SYSTEM_PROMPT - ? '' - : 'Please follow up with one of these', - options: messageData.followUps, - } - : undefined, - } - this.onChatAnswerReceived(messageData.tabID, answer) - } - } - - private processCodeResultMessage = async (messageData: any): Promise => { - if (this.onChatAnswerReceived !== undefined) { - const answer: ChatItem = { - type: ChatItemType.ANSWER, - relatedContent: undefined, - followUp: undefined, - canBeVoted: false, - codeReference: messageData.references, - // TODO get the backend to store a message id in addition to conversationID - messageId: messageData.messageID ?? messageData.triggerID ?? messageData.conversationID, - fileList: { - fileTreeTitle: 'Documents ready', - rootFolderTitle: 'Generated documentation', - filePaths: (messageData.filePaths as DiffTreeFileInfo[]).map(path => path.zipFilePath), - deletedFiles: (messageData.deletedFiles as DiffTreeFileInfo[]).map(path => path.zipFilePath) - }, - body: '', - } - this.onChatAnswerReceived(messageData.tabID, answer) - } - } - - private processAuthNeededException = async (messageData: any): Promise => { - if (this.onChatAnswerReceived === undefined) { - return - } - - this.onChatAnswerReceived(messageData.tabID, { - type: ChatItemType.ANSWER, - body: messageData.message, - followUp: undefined, - canBeVoted: false, - }) - - return - } - - handleMessageReceive = async (messageData: any): Promise => { - if (messageData.type === 'updateFileComponent') { - this.onFileComponentUpdate( - messageData.tabID, - messageData.filePaths, - messageData.deletedFiles, - messageData.messageId - ) - return - } - if (messageData.type === 'errorMessage') { - this.onError(messageData.tabID, messageData.message, messageData.title) - return - } - - if (messageData.type === 'showInvalidTokenNotification') { - this.onWarning(messageData.tabID, messageData.message, messageData.title) - return - } - - if (messageData.type === 'folderConfirmationMessage') { - await this.processFolderConfirmationMessage(messageData, messageData.folderPath) - return - } - - if (messageData.type === 'retryChangeFolderMessage') { - await this.processRetryChangeFolderMessage(messageData) - return - } - - if (messageData.type === 'chatMessage') { - await this.processChatMessage(messageData) - return - } - - if (messageData.type === 'codeResultMessage') { - await this.processCodeResultMessage(messageData) - return - } - - if (messageData.type === 'asyncEventProgressMessage') { - this.onAsyncEventProgress(messageData.tabID, messageData.inProgress, messageData.message ?? undefined) - return - } - - if (messageData.type === 'updatePlaceholderMessage') { - this.updatePlaceholder(messageData.tabID, messageData.newPlaceholder) - return - } - - if (messageData.type === 'chatInputEnabledMessage') { - this.chatInputEnabled(messageData.tabID, messageData.enabled) - return - } - - if (messageData.type === 'authenticationUpdateMessage') { - this.onUpdateAuthentication( - messageData.featureDevEnabled, - messageData.codeTransformEnabled, - messageData.docEnabled, - messageData.codeScanEnabled, - messageData.codeTestEnabled, - messageData.authenticatingTabIDs - ) - return - } - if (messageData.type === 'updatePromptProgress') { - this.onUpdatePromptProgress(messageData.tabId, messageData.progressField) - } - } - - onStopChatResponse = (tabID: string): void => { - this.sendMessageToExtension({ - tabID: tabID, - command: 'stop-response', - }) - } - - onTabOpen = (tabID: string): void => { - this.sendMessageToExtension({ - tabID, - command: 'new-tab-was-created', - tabType: 'doc', - }) - } - - onTabRemove = (tabID: string): void => { - this.sendMessageToExtension({ - tabID: tabID, - command: 'tab-was-removed', - tabType: 'doc', - }) - } - - sendFeedback = (tabId: string, feedbackPayload: FeedbackPayload): void | undefined => { - this.sendMessageToExtension({ - command: 'chat-item-feedback', - ...feedbackPayload, - tabType: 'doc', - tabID: tabId, - }) - } - - onChatItemVoted = (tabId: string, messageId: string, vote: string): void | undefined => { - this.sendMessageToExtension({ - tabID: tabId, - messageId: messageId, - vote: vote, - command: 'chat-item-voted', - tabType: 'doc', - }) - } - - onResponseBodyLinkClick = (tabID: string, messageId: string, link: string): void => { - this.sendMessageToExtension({ - command: 'response-body-link-click', - tabID, - messageId, - link, - tabType: 'doc', - }) - } - - sendFolderConfirmationMessage = (tabID: string, messageId: string): void => { - this.sendMessageToExtension({ - command: 'folderConfirmationMessage', - tabID, - messageId, - tabType: 'doc', - }) - } - - onFormButtonClick = ( - tabID: string, - action: { - id: string - text?: string - formItemValues?: Record - } - ) => { - if (action.id === "doc_stop_generate") { - this.sendMessageToExtension({ - command: 'doc_stop_generate', - tabID, - tabType: 'doc', - }) - } - } -} diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/featureDevChatConnector.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/featureDevChatConnector.ts deleted file mode 100644 index b1000d56217..00000000000 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/apps/featureDevChatConnector.ts +++ /dev/null @@ -1,308 +0,0 @@ -/*! - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -import { ChatItem, ChatItemAction, ChatItemType, FeedbackPayload } from '@aws/mynah-ui-chat' -import { ExtensionMessage } from '../commands' -import { TabType, TabsStorage } from '../storages/tabsStorage' -import { CodeReference } from './amazonqCommonsConnector' -import { FollowUpGenerator } from '../followUps/generator' -import { getActions } from '../diffTree/actions' -import { DiffTreeFileInfo } from '../diffTree/types' - -interface ChatPayload { - chatMessage: string -} - -export interface ConnectorProps { - sendMessageToExtension: (message: ExtensionMessage) => void - onMessageReceived?: (tabID: string, messageData: any, needToShowAPIDocsTab: boolean) => void - onAsyncEventProgress: (tabID: string, inProgress: boolean, message: string, cancelButtonWhenLoading?: boolean) => void - onChatAnswerReceived?: (tabID: string, message: ChatItem) => void - onChatAnswerUpdated?: (tabID: string, message: ChatItem) => void - sendFeedback?: (tabId: string, feedbackPayload: FeedbackPayload) => void | undefined - onError: (tabID: string, message: string, title: string) => void - onWarning: (tabID: string, message: string, title: string) => void - onUpdatePlaceholder: (tabID: string, newPlaceholder: string) => void - onChatInputEnabled: (tabID: string, enabled: boolean) => void - onUpdateAuthentication: ( - featureDevEnabled: boolean, - codeTransformEnabled: boolean, - docEnabled: boolean, - codeScanEnabled: boolean, - codeTestEnabled: boolean, - authenticatingTabIDs: string[] - ) => void - onNewTab: (tabType: TabType) => void - tabsStorage: TabsStorage - onFileComponentUpdate: (tabID: string, filePaths: DiffTreeFileInfo[], deletedFiles: DiffTreeFileInfo[], messageId: string, disableFileActions: boolean) => void -} - -export class Connector { - private readonly sendMessageToExtension - private readonly onError - private readonly onWarning - private readonly onChatAnswerReceived - private readonly onChatAnswerUpdated - private readonly onAsyncEventProgress - private readonly updatePlaceholder - private readonly chatInputEnabled - private readonly onUpdateAuthentication - private readonly followUpGenerator: FollowUpGenerator - private readonly onFileComponentUpdate - - constructor(props: ConnectorProps) { - this.sendMessageToExtension = props.sendMessageToExtension - this.onChatAnswerReceived = props.onChatAnswerReceived - this.onChatAnswerUpdated = props.onChatAnswerUpdated - this.onWarning = props.onWarning - this.onError = props.onError - this.onAsyncEventProgress = props.onAsyncEventProgress - this.updatePlaceholder = props.onUpdatePlaceholder - this.chatInputEnabled = props.onChatInputEnabled - this.onUpdateAuthentication = props.onUpdateAuthentication - this.followUpGenerator = new FollowUpGenerator() - this.onFileComponentUpdate = props.onFileComponentUpdate - } - - onCodeInsertToCursorPosition = ( - tabID: string, - code?: string, - type?: 'selection' | 'block', - codeReference?: CodeReference[] - ): void => { - this.sendMessageToExtension({ - tabID: tabID, - code, - command: 'insert_code_at_cursor_position', - codeReference, - tabType: 'featuredev', - }) - } - - onCopyCodeToClipboard = ( - tabID: string, - code?: string, - type?: 'selection' | 'block', - codeReference?: CodeReference[] - ): void => { - this.sendMessageToExtension({ - tabID: tabID, - code, - command: 'code_was_copied_to_clipboard', - codeReference, - tabType: 'featuredev', - }) - } - - onOpenDiff = (tabID: string, filePath: string, deleted: boolean): void => { - this.sendMessageToExtension({ - command: 'open-diff', - tabID, - filePath, - deleted, - tabType: 'featuredev', - }) - } - - followUpClicked = (tabID: string, followUp: ChatItemAction): void => { - this.sendMessageToExtension({ - command: 'follow-up-was-clicked', - followUp, - tabID, - tabType: 'featuredev', - }) - } - - requestGenerativeAIAnswer = (tabID: string, payload: ChatPayload): Promise => - new Promise((resolve, reject) => { - this.sendMessageToExtension({ - tabID: tabID, - command: 'chat-prompt', - chatMessage: payload.chatMessage, - tabType: 'featuredev', - }) - }) - - onFileActionClick = (tabID: string, messageId: string, filePath: string, actionName: string): void => { - this.sendMessageToExtension({ - command: 'file-click', - tabID, - messageId, - filePath, - actionName, - tabType: 'featuredev', - }) - } - - private processChatMessage = async (messageData: any): Promise => { - if (this.onChatAnswerReceived !== undefined) { - const answer: ChatItem = this.createAnswer(messageData) - this.onChatAnswerReceived(messageData.tabID, answer) - } - } - - private processCodeResultMessage = async (messageData: any): Promise => { - if (this.onChatAnswerReceived !== undefined) { - const messageId = messageData.messageId ?? messageData.messageID ?? messageData.triggerID ?? messageData.conversationID ?? messageData.codeGenerationId - this.sendMessageToExtension({ command: 'store-code-result-message-id', tabID: messageData.tabID, messageId, tabType: 'featuredev' }) - const actions = getActions([ - ...messageData.filePaths, - ...messageData.deletedFiles, - ]) - const answer: ChatItem = { - type: ChatItemType.ANSWER, - relatedContent: undefined, - followUp: undefined, - canBeVoted: true, - codeReference: messageData.references, - // TODO get the backend to store a message id in addition to conversationID - messageId, - fileList: { - rootFolderTitle: 'Changes', - filePaths: (messageData.filePaths as DiffTreeFileInfo[]).map(path => path.zipFilePath), - deletedFiles: (messageData.deletedFiles as DiffTreeFileInfo[]).map(path => path.zipFilePath), - actions, - }, - body: '', - } - this.onChatAnswerReceived(messageData.tabID, answer) - } - } - - - private createAnswer = (messageData: any): ChatItem => { - return { - type: messageData.messageType, - body: messageData.message ?? undefined, - messageId: messageData.messageId ?? messageData.messageID ?? messageData.triggerID ?? '', - relatedContent: undefined, - canBeVoted: messageData.canBeVoted ?? undefined, - snapToTop: messageData.snapToTop ?? undefined, - informationCard: messageData.informationCard ?? undefined, - followUp: - messageData.followUps !== undefined && Array.isArray(messageData.followUps) - ? { - text: - messageData.messageType === ChatItemType.SYSTEM_PROMPT || - messageData.followUps.length === 0 - ? '' - : 'Please follow up with one of these', - options: messageData.followUps, - } - : undefined, - } - } - - handleMessageReceive = async (messageData: any): Promise => { - if (messageData.type === 'updateFileComponent') { - this.onFileComponentUpdate(messageData.tabID, messageData.filePaths, messageData.deletedFiles, messageData.messageId, messageData.disableFileActions) - return - } - if (messageData.type === 'updateChatAnswer') { - const answer = this.createAnswer(messageData) - this.onChatAnswerUpdated?.(messageData.tabID, answer) - return - } - if (messageData.type === 'errorMessage') { - this.onError(messageData.tabID, messageData.message, messageData.title) - return - } - - if (messageData.type === 'showInvalidTokenNotification') { - this.onWarning(messageData.tabID, messageData.message, messageData.title) - return - } - - if (messageData.type === 'chatMessage') { - await this.processChatMessage(messageData) - return - } - - if (messageData.type === 'codeResultMessage') { - await this.processCodeResultMessage(messageData) - return - } - - if (messageData.type === 'asyncEventProgressMessage') { - this.onAsyncEventProgress(messageData.tabID, messageData.inProgress, messageData.message ?? undefined, true) - return - } - - if (messageData.type === 'updatePlaceholderMessage') { - this.updatePlaceholder(messageData.tabID, messageData.newPlaceholder) - return - } - - if (messageData.type === 'chatInputEnabledMessage') { - this.chatInputEnabled(messageData.tabID, messageData.enabled) - return - } - - if (messageData.type === 'authenticationUpdateMessage') { - this.onUpdateAuthentication( - messageData.featureDevEnabled, - messageData.codeTransformEnabled, - messageData.docEnabled, - messageData.codeScanEnabled, - messageData.codeTestEnabled, - messageData.authenticatingTabIDs - ) - return - } - } - - onStopChatResponse = (tabID: string): void => { - this.sendMessageToExtension({ - tabID: tabID, - command: 'stop-response', - tabType: 'featuredev', - }) - } - - onTabOpen = (tabID: string): void => { - this.sendMessageToExtension({ - tabID, - command: 'new-tab-was-created', - tabType: 'featuredev', - }) - } - - onTabRemove = (tabID: string): void => { - this.sendMessageToExtension({ - tabID: tabID, - command: 'tab-was-removed', - tabType: 'featuredev', - }) - } - - sendFeedback = (tabId: string, feedbackPayload: FeedbackPayload): void | undefined => { - this.sendMessageToExtension({ - command: 'chat-item-feedback', - ...feedbackPayload, - tabType: 'featuredev', - tabID: tabId, - }) - } - - onChatItemVoted = (tabId: string, messageId: string, vote: string): void | undefined => { - this.sendMessageToExtension({ - tabID: tabId, - messageId: messageId, - vote: vote, - command: 'chat-item-voted', - tabType: 'featuredev', - }) - } - - onResponseBodyLinkClick = (tabID: string, messageId: string, link: string): void => { - this.sendMessageToExtension({ - command: 'response-body-link-click', - tabID, - messageId, - link, - tabType: 'featuredev', - }) - } -} diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/commands.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/commands.ts index 8cf9e1c8363..5d58f3512d0 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/commands.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/commands.ts @@ -59,11 +59,8 @@ type MessageCommand = | 'codescan_stop_project_scan' | 'codescan_stop_file_scan' | 'codescan_open_issues' - | 'generate-test' - | 'start-test-gen' | 'open-user-guide' | 'send-telemetry' - | 'doc_stop_generate' | 'updatePromptProgress' export type ExtensionMessage = Record & { command: MessageCommand } diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/connector.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/connector.ts index 381efe0854c..7666d8fbe82 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/connector.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/connector.ts @@ -54,7 +54,6 @@ export interface ConnectorProps { clearPreviousItemButtons?: boolean ) => void onCodeTransformMessageUpdate: (tabID: string, messageId: string, chatItem: Partial) => void - onRunTestMessageReceived?: (tabID: string, showRunTestMessage: boolean) => void onWelcomeFollowUpClicked: (tabID: string, welcomeFollowUpType: WelcomeFollowupType) => void onAsyncEventProgress: (tabID: string, inProgress: boolean, message: string | undefined, cancelButtonWhenLoading?: boolean) => void onCWCContextCommandMessage: (message: ChatItem, command?: string) => string | undefined @@ -72,11 +71,8 @@ export interface ConnectorProps { onUpdatePromptProgress: (tabID: string, progressField: ProgressField | null | undefined) => void onChatInputEnabled: (tabID: string, enabled: boolean) => void onUpdateAuthentication: ( - featureDevEnabled: boolean, codeTransformEnabled: boolean, - docEnabled: boolean, codeScanEnabled: boolean, - codeTestEnabled: boolean, authenticatingTabIDs: string[] ) => void onFeatureConfigsAvailable: ( diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/followUps/constants.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/followUps/constants.ts deleted file mode 100644 index af2f108b339..00000000000 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/followUps/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/forms/constants.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/forms/constants.ts index 3991f14c5dd..d2270a166e0 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/forms/constants.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/forms/constants.ts @@ -25,19 +25,6 @@ export const enum FormButtonIds { CodeScanStopProjectScan = "codescan_stop_project_scan", CodeScanStopFileScan = "codescan_stop_file_scan", CodeScanOpenIssues = "codescan_open_issues", - CodeTestStartGeneration = "code_test_start_generation", - CodeTestViewDiff = "utg_view_diff", - CodeTestAccept = "utg_accept", - CodeTestProvideFeedback = "utg_feedback", - CodeTestRegenerate = "utg_regenerate", - CodeTestReject = "utg_reject", - CodeTestBuildAndExecute = "utg_build_and_execute", - CodeTestModifyCommand = "utg_modify_command", - CodeTestSkipAndFinish = "utg_skip_and_finish", - CodeTestInstallAndContinue = "utg_install_and_continue", - CodeTestRejectAndRevert = "utg_reject_and_revert", - CodeTestProceed = "utg_proceed", - } export const isFormButtonCodeTransform = (id: string): boolean => { @@ -61,12 +48,6 @@ export const isFormButtonCodeTransform = (id: string): boolean => { ) } -export const isFormButtonCodeTest = (id: string): boolean => { - return ( - id === FormButtonIds.CodeTestStartGeneration || id.startsWith("utg") - ) -} - export const isFormButtonCodeScan = (id: string): boolean => { return ( id === FormButtonIds.CodeScanStartProjectScan || diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/main.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/main.ts index 9786d3848a4..1a057c62803 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/main.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/main.ts @@ -38,11 +38,8 @@ export const createMynahUI = ( ideApi: any, showWelcomePage: boolean, disclaimerAcknowledged: boolean, - isFeatureDevEnabled: boolean, isCodeTransformEnabled: boolean, - isDocEnabled: boolean, isCodeScanEnabled: boolean, - isCodeTestEnabled: boolean, highlightCommand?: QuickActionCommand, profileName?: string, @@ -52,11 +49,8 @@ export const createMynahUI = ( mynahUIRef: { mynahUI: undefined }, showWelcomePage, disclaimerAcknowledged, - isFeatureDevEnabled, isCodeTransformEnabled, - isDocEnabled, isCodeScanEnabled, - isCodeTestEnabled, highlightCommand, profileName, hybridChat: false, @@ -72,11 +66,8 @@ export class WebviewUIHandler { postMessage: any showWelcomePage: boolean disclaimerAcknowledged: boolean - isFeatureDevEnabled: boolean isCodeTransformEnabled: boolean - isDocEnabled: boolean isCodeScanEnabled: boolean - isCodeTestEnabled: boolean highlightCommand?: QuickActionCommand profileName?: string responseMetadata: Map @@ -100,11 +91,8 @@ export class WebviewUIHandler { mynahUIRef, showWelcomePage, disclaimerAcknowledged, - isFeatureDevEnabled, isCodeTransformEnabled, - isDocEnabled, isCodeScanEnabled, - isCodeTestEnabled, highlightCommand, profileName, hybridChat, @@ -114,11 +102,8 @@ export class WebviewUIHandler { mynahUIRef: { mynahUI: MynahUI | undefined } showWelcomePage: boolean, disclaimerAcknowledged: boolean, - isFeatureDevEnabled: boolean isCodeTransformEnabled: boolean - isDocEnabled: boolean isCodeScanEnabled: boolean - isCodeTestEnabled: boolean highlightCommand?: QuickActionCommand, profileName?: string, hybridChat?: boolean @@ -129,11 +114,8 @@ export class WebviewUIHandler { this.mynahUIRef = mynahUIRef this.showWelcomePage = showWelcomePage; this.disclaimerAcknowledged = disclaimerAcknowledged - this.isFeatureDevEnabled = isFeatureDevEnabled this.isCodeTransformEnabled = isCodeTransformEnabled - this.isDocEnabled = isDocEnabled this.isCodeScanEnabled = isCodeScanEnabled - this.isCodeTestEnabled = isCodeTestEnabled this.profileName = profileName this.responseMetadata = new Map() this.disclaimerCardActive = !disclaimerAcknowledged @@ -153,11 +135,8 @@ export class WebviewUIHandler { }) this.tabDataGenerator = new TabDataGenerator({ - isFeatureDevEnabled, isCodeTransformEnabled, - isDocEnabled, isCodeScanEnabled, - isCodeTestEnabled, highlightCommand, profileName }) @@ -171,42 +150,30 @@ export class WebviewUIHandler { this.quickActionHandler?.handleCommand(chatPrompt, tabId) }, onUpdateAuthentication: ( - featureDevEnabled: boolean, codeTransformEnabled: boolean, - docEnabled: boolean, codeScanEnabled: boolean, - codeTestEnabled: boolean, authenticatingTabIDs: string[] ): void => { - isFeatureDevEnabled = featureDevEnabled isCodeTransformEnabled = codeTransformEnabled - isDocEnabled = docEnabled isCodeScanEnabled = codeScanEnabled - isCodeTestEnabled = codeTestEnabled this.quickActionHandler = new QuickActionHandler({ mynahUIRef: this.mynahUIRef, connector: this.connector!, tabsStorage: this.tabsStorage, - isFeatureDevEnabled: this.isFeatureDevEnabled, isCodeTransformEnabled: this.isCodeTransformEnabled, - isDocEnabled: this.isDocEnabled, isCodeScanEnabled: this.isCodeScanEnabled, - isCodeTestEnabled: this.isCodeTestEnabled, hybridChat }) this.tabDataGenerator = new TabDataGenerator({ - isFeatureDevEnabled, isCodeTransformEnabled, - isDocEnabled, isCodeScanEnabled, - isCodeTestEnabled, highlightCommand, profileName }) - // Set the new defaults for the quick action commands in all tabs now that isFeatureDevEnabled and isCodeTransformEnabled were enabled/disabled + // Set the new defaults for the quick action commands in all tabs now that isCodeTransformEnabled was enabled/disabled for (const tab of this.tabsStorage.getTabs()) { this.mynahUI?.updateStore(tab.id, { quickActionCommands: this.tabDataGenerator.quickActionsGenerator.generateForTab(tab.type), @@ -440,11 +407,6 @@ export class WebviewUIHandler { this.tabsStorage.updateTabStatus(tabID, 'free') } }, - onRunTestMessageReceived: (tabID: string, shouldRunTestMessage: boolean) => { - if (shouldRunTestMessage) { - this.quickActionHandler?.handleCommand({ command: '/test' }, tabID) - } - }, onMessageReceived: (tabID: string, messageData: MynahUIDataModel) => { this.mynahUI?.updateStore(tabID, messageData) }, @@ -861,21 +823,15 @@ export class WebviewUIHandler { mynahUIRef: this.mynahUIRef, connector: this.connector, tabsStorage: this.tabsStorage, - isFeatureDevEnabled, isCodeTransformEnabled, - isDocEnabled, isCodeScanEnabled, - isCodeTestEnabled, }) this.quickActionHandler = new QuickActionHandler({ mynahUIRef: this.mynahUIRef, connector: this.connector!, tabsStorage: this.tabsStorage, - isFeatureDevEnabled: this.isFeatureDevEnabled, isCodeTransformEnabled: this.isCodeTransformEnabled, - isDocEnabled: this.isDocEnabled, isCodeScanEnabled: this.isCodeScanEnabled, - isCodeTestEnabled: this.isCodeTestEnabled, hybridChat }) diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/messages/constants.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/messages/constants.ts deleted file mode 100644 index af2f108b339..00000000000 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/messages/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/messages/controller.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/messages/controller.ts index 9a1f3bd3cc0..3c5d796b7a3 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/messages/controller.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/messages/controller.ts @@ -14,11 +14,8 @@ export interface MessageControllerProps { mynahUIRef: MynahUIRef connector: Connector tabsStorage: TabsStorage - isFeatureDevEnabled: boolean isCodeTransformEnabled: boolean - isDocEnabled: boolean isCodeScanEnabled: boolean - isCodeTestEnabled: boolean } export class MessageController { @@ -32,11 +29,8 @@ export class MessageController { this.connector = props.connector this.tabsStorage = props.tabsStorage this.tabDataGenerator = new TabDataGenerator({ - isFeatureDevEnabled: props.isFeatureDevEnabled, isCodeTransformEnabled: props.isCodeTransformEnabled, - isDocEnabled: props.isDocEnabled, isCodeScanEnabled: props.isCodeScanEnabled, - isCodeTestEnabled: props.isCodeTestEnabled, }) } diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/generator.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/generator.ts index 423857de2f8..eab471077ab 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/generator.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/quickActions/generator.ts @@ -7,28 +7,18 @@ import { QuickActionCommand, QuickActionCommandGroup } from '@aws/mynah-ui-chat/ import { TabType } from '../storages/tabsStorage' import {MynahIcons} from "@aws/mynah-ui-chat"; -// TODO: Need to remove legacy code of isCodeScanEnabled, isCodeTestEnabled, isDocEnabled and isFeatureDevEnabled in followup PR export interface QuickActionGeneratorProps { - isFeatureDevEnabled: boolean isCodeTransformEnabled: boolean - isDocEnabled: boolean isCodeScanEnabled: boolean - isCodeTestEnabled: boolean } export class QuickActionGenerator { - public isFeatureDevEnabled: boolean public isCodeTransformEnabled: boolean - public isDocEnabled: boolean public isCodeScanEnabled: boolean - public isCodeTestEnabled: boolean constructor(props: QuickActionGeneratorProps) { - this.isFeatureDevEnabled = props.isFeatureDevEnabled this.isCodeTransformEnabled = props.isCodeTransformEnabled - this.isDocEnabled = props.isDocEnabled this.isCodeScanEnabled = props.isCodeScanEnabled - this.isCodeTestEnabled = props.isCodeTestEnabled } public generateForTab(tabType: TabType): QuickActionCommandGroup[] { 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 42026b832a8..a816b45e058 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 @@ -14,11 +14,8 @@ export interface QuickActionsHandlerProps { mynahUIRef: MynahUIRef connector: Connector tabsStorage: TabsStorage - isFeatureDevEnabled: boolean isCodeTransformEnabled: boolean - isDocEnabled: boolean isCodeScanEnabled: boolean - isCodeTestEnabled: boolean hybridChat?: boolean } @@ -27,11 +24,8 @@ export class QuickActionHandler { private connector: Connector private tabsStorage: TabsStorage private tabDataGenerator: TabDataGenerator - public isFeatureDevEnabled: boolean public isCodeTransformEnabled: boolean - public isDocEnabled: boolean public isCodeScanEnabled: boolean - public isCodeTestEnabled: boolean private isHybridChatEnabled: boolean constructor(props: QuickActionsHandlerProps) { @@ -39,17 +33,11 @@ export class QuickActionHandler { this.connector = props.connector this.tabsStorage = props.tabsStorage this.tabDataGenerator = new TabDataGenerator({ - isFeatureDevEnabled: props.isFeatureDevEnabled, isCodeTransformEnabled: props.isCodeTransformEnabled, - isDocEnabled: props.isDocEnabled, isCodeScanEnabled: props.isCodeScanEnabled, - isCodeTestEnabled: props.isCodeTestEnabled, }) - this.isFeatureDevEnabled = props.isFeatureDevEnabled this.isCodeTransformEnabled = props.isCodeTransformEnabled - this.isDocEnabled = props.isDocEnabled this.isCodeScanEnabled = props.isCodeScanEnabled - this.isCodeTestEnabled = props.isCodeTestEnabled this.isHybridChatEnabled = props.hybridChat ?? false } diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/tabs/generator.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/tabs/generator.ts index c55a5bac400..11c3c2ab792 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/tabs/generator.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/tabs/generator.ts @@ -10,11 +10,8 @@ import { QuickActionGenerator } from '../quickActions/generator' import { workspaceCommand } from '../commands' export interface TabDataGeneratorProps { - isFeatureDevEnabled: boolean isCodeTransformEnabled: boolean - isDocEnabled: boolean isCodeScanEnabled: boolean - isCodeTestEnabled: boolean highlightCommand?: QuickActionCommand profileName?: string } @@ -62,11 +59,8 @@ export class TabDataGenerator { constructor(props: TabDataGeneratorProps) { this.followUpsGenerator = new FollowUpGenerator() this.quickActionsGenerator = new QuickActionGenerator({ - isFeatureDevEnabled: props.isFeatureDevEnabled, isCodeTransformEnabled: props.isCodeTransformEnabled, - isDocEnabled: props.isDocEnabled, isCodeScanEnabled: props.isCodeScanEnabled, - isCodeTestEnabled: props.isCodeTestEnabled, }) this.highlightCommand = props.highlightCommand this.profileName = props.profileName diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/texts/constants.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/texts/constants.ts index 9c6c6dbc9a9..cea855b608b 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/texts/constants.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/texts/constants.ts @@ -26,9 +26,5 @@ export const uiComponentsTexts = { spinnerText: 'Generating your answer...', pleaseSelect: 'Please select', } - -export const docUserGuide = 'https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/doc-generation.html' -export const featureDevUserGuide = 'https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/software-dev.html' export const codeTransformUserGuide = 'https://docs.aws.amazon.com/amazonq/latest/aws-builder-use-ug/code-transformation.html' -export const codeTestUserGuide = 'https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/test-generation.html' export const codeScanUserGuide = 'https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/code-reviews.html' diff --git a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/walkthrough/agent.ts b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/walkthrough/agent.ts index 02b2818a2fb..5d431b331cf 100644 --- a/plugins/amazonq/mynah-ui/src/mynah-ui/ui/walkthrough/agent.ts +++ b/plugins/amazonq/mynah-ui/src/mynah-ui/ui/walkthrough/agent.ts @@ -29,143 +29,6 @@ export const agentWalkthroughDataModel: MynahUIDataModel = { description: '', }, chatItems: [ - { - type: ChatItemType.ANSWER, - snapToTop: true, - hoverEffect: true, - body: `### Feature development -Implement features or make changes across your workspace, all from a single prompt. -`, - icon: MynahIcons.CODE_BLOCK, - footer: { - tabbedContent: createdTabbedData( - [ - '/dev update app.py to add a new api', - '/dev fix the error', - '/dev add a new button to sort by ', - ], - '/dev' - ), - }, - buttons: [ - { - status: 'clear', - id: 'user-guide-featuredev', - disabled: false, - text: 'Read user guide', - }, - { - status: 'main', - disabled: false, - flash: 'once', - fillState: 'hover', - icon: MynahIcons.RIGHT_OPEN, - id: 'quick-start-featuredev', - text: `Quick start with **/dev**`, - }, - ], - }, - { - type: ChatItemType.ANSWER, - hoverEffect: true, - body: `### Unit test generation -Automatically generate unit tests for your active file. -`, - icon: MynahIcons.BUG, - footer: { - tabbedContent: createdTabbedData( - ['Generate tests for specific functions', 'Generate tests for null and empty inputs'], - '/test' - ), - }, - buttons: [ - { - status: 'clear', - id: 'user-guide-codetest', - disabled: false, - text: 'Read user guide', - }, - { - status: 'main', - disabled: false, - flash: 'once', - fillState: 'hover', - icon: MynahIcons.RIGHT_OPEN, - id: 'quick-start-codetest', - text: `Quick start with **/test**`, - }, - ], - }, - { - type: ChatItemType.ANSWER, - hoverEffect: true, - body: `### Documentation generation -Create and update READMEs for better documented code. -`, - icon: MynahIcons.CHECK_LIST, - footer: { - tabbedContent: createdTabbedData( - [ - 'Generate new READMEs for your project', - 'Update existing READMEs with recent code changes', - 'Request specific changes to a README', - ], - '/doc' - ), - }, - buttons: [ - { - status: 'clear', - id: 'user-guide-doc', - disabled: false, - text: 'Read user guide', - }, - { - status: 'main', - disabled: false, - flash: 'once', - fillState: 'hover', - icon: MynahIcons.RIGHT_OPEN, - id: 'quick-start-doc', - text: `Quick start with **/doc**`, - }, - ], - }, - { - type: ChatItemType.ANSWER, - hoverEffect: true, - body: `### Code reviews -Review code for issues, then get suggestions to fix your code instantaneously. -`, - icon: MynahIcons.TRANSFORM, - footer: { - tabbedContent: createdTabbedData( - [ - 'Review code for security vulnerabilities and code quality issues', - 'Get detailed explanations about code issues', - 'Apply automatic code fixes to your files', - ], - '/review' - ), - }, - buttons: [ - { - status: 'clear', - id: 'user-guide-codescan', - disabled: false, - text: 'Read user guide', - }, - { - status: 'main', - disabled: false, - flash: 'once', - fillState: 'hover', - icon: MynahIcons.RIGHT_OPEN, - id: 'quick-start-codescan', - text: `Quick start with **/review**`, - }, - ], - }, { type: ChatItemType.ANSWER, hoverEffect: true, diff --git a/settings.gradle.kts b/settings.gradle.kts index fb12737451f..3c13798d46c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -134,9 +134,6 @@ plugins/ codemodernizer/ ... community/ ... ultimate/ - featuredev/ - community/ - ultimate/ mynah-ui/ :plugin-amazonq:mynah-ui */ file("plugins").listFiles()?.forEach root@ {