From 242b965fc7200a99f30cd5963440ee19dba5e96b Mon Sep 17 00:00:00 2001 From: Randall-Jiang Date: Thu, 17 Apr 2025 14:38:16 -0700 Subject: [PATCH 1/3] user wont see the programmer mode card after they close it --- packages/core/src/amazonq/index.ts | 3 +- .../webview/generators/webViewContent.ts | 4 +- .../webview/messages/messageDispatcher.ts | 8 ++++ .../core/src/amazonq/webview/ui/commands.ts | 1 + .../core/src/amazonq/webview/ui/connector.ts | 10 +++++ packages/core/src/amazonq/webview/ui/main.ts | 8 +++- .../src/amazonq/webview/ui/tabs/generator.ts | 45 +++++++++++++------ packages/core/src/shared/globalState.ts | 1 + 8 files changed, 63 insertions(+), 17 deletions(-) diff --git a/packages/core/src/amazonq/index.ts b/packages/core/src/amazonq/index.ts index 70223bf72d7..c1985c55be1 100644 --- a/packages/core/src/amazonq/index.ts +++ b/packages/core/src/amazonq/index.ts @@ -61,7 +61,8 @@ export function createMynahUI( amazonQEnabled: boolean, featureConfigsSerialized: [string, FeatureContext][], welcomeCount: number, - disabledCommands?: string[] + disabledCommands?: string[], + dismissedCards?: boolean ) { if (typeof window !== 'undefined') { const mynahUI = require('./webview/ui/main') diff --git a/packages/core/src/amazonq/webview/generators/webViewContent.ts b/packages/core/src/amazonq/webview/generators/webViewContent.ts index ef1d37a705e..82103dfa77b 100644 --- a/packages/core/src/amazonq/webview/generators/webViewContent.ts +++ b/packages/core/src/amazonq/webview/generators/webViewContent.ts @@ -86,6 +86,7 @@ export class WebViewContentGenerator { const disabledCommandsString = isSM ? `['/dev', '/transform', '/test', '/review', '/doc']` : '[]' const disclaimerAcknowledged = !AmazonQPromptSettings.instance.isPromptEnabled('amazonQChatDisclaimer') const welcomeLoadCount = globals.globalState.tryGet('aws.amazonq.welcomeChatShowCount', Number, 0) + const dismissedCards = globals.globalState.tryGet('aws.amazonq.dismissedCards', Boolean, false) // only show profile card when the two conditions // 1. profile count >= 2 @@ -112,7 +113,8 @@ export class WebViewContentGenerator { ${regionProfileString}, ${disabledCommandsString}, ${isSMUS}, - ${isSM} + ${isSM}, + ${dismissedCards} ); } diff --git a/packages/core/src/amazonq/webview/messages/messageDispatcher.ts b/packages/core/src/amazonq/webview/messages/messageDispatcher.ts index a71120b353c..b794ab65f4c 100644 --- a/packages/core/src/amazonq/webview/messages/messageDispatcher.ts +++ b/packages/core/src/amazonq/webview/messages/messageDispatcher.ts @@ -86,6 +86,14 @@ export function dispatchWebViewMessagesToApps( void globals.globalState.tryUpdate('aws.amazonq.welcomeChatShowCount', currentLoadCount + 1) return } + case 'message-dismissed': { + // eslint-disable-next-line aws-toolkits/no-console-log + console.log('message-dismissed', msg) + if (msg.messageId === 'programmerModeCardId') { + void globals.globalState.tryUpdate('aws.amazonq.dismissedCards', true) + } + return + } } if (msg.type === 'error') { diff --git a/packages/core/src/amazonq/webview/ui/commands.ts b/packages/core/src/amazonq/webview/ui/commands.ts index 4c8a3463407..3e31b3bf84a 100644 --- a/packages/core/src/amazonq/webview/ui/commands.ts +++ b/packages/core/src/amazonq/webview/ui/commands.ts @@ -52,5 +52,6 @@ type MessageCommand = | 'detailed-list-filter-change' | 'detailed-list-item-select' | 'detailed-list-action-click' + | 'message-dismissed' export type ExtensionMessage = Record & { command: MessageCommand } diff --git a/packages/core/src/amazonq/webview/ui/connector.ts b/packages/core/src/amazonq/webview/ui/connector.ts index feda513ef46..1ae5853623d 100644 --- a/packages/core/src/amazonq/webview/ui/connector.ts +++ b/packages/core/src/amazonq/webview/ui/connector.ts @@ -119,6 +119,7 @@ export interface ConnectorProps { } onSelectTab: (tabID: string, eventID: string) => void onExportChat: (tabID: string, format: 'markdown' | 'html') => string + onMessageDismiss?: (tabId: string, messageId: string) => void tabsStorage: TabsStorage } @@ -707,6 +708,15 @@ export class Connector { return false } + onMessageDismiss = (tabId: string, messageId: string): void => { + this.sendMessageToExtension({ + command: 'message-dismissed', + tabId: tabId, + messageId, + tabType: this.tabsStorage.getTab(tabId)?.type, + }) + } + onTabBarButtonClick = async (tabId: string, buttonId: string, eventId?: string) => { this.sendMessageToExtension({ command: 'tab-bar-button-clicked', diff --git a/packages/core/src/amazonq/webview/ui/main.ts b/packages/core/src/amazonq/webview/ui/main.ts index 9d0507b846e..9e76c9efe0b 100644 --- a/packages/core/src/amazonq/webview/ui/main.ts +++ b/packages/core/src/amazonq/webview/ui/main.ts @@ -52,7 +52,8 @@ export const createMynahUI = ( regionProfile: RegionProfile | undefined, disabledCommands?: string[], isSMUS?: boolean, - isSM?: boolean + isSM?: boolean, + dismissedCards?: boolean ) => { let disclaimerCardActive = !disclaimerAcknowledged // eslint-disable-next-line prefer-const @@ -166,6 +167,7 @@ export const createMynahUI = ( disabledCommands, commandHighlight: highlightCommand, regionProfile, + dismissedCards, }) // eslint-disable-next-line prefer-const @@ -263,6 +265,7 @@ export const createMynahUI = ( disabledCommands, commandHighlight: highlightCommand, regionProfile, + dismissedCards, }) featureConfigs = tryNewMap(featureConfigsSerialized) @@ -1001,6 +1004,9 @@ export const createMynahUI = ( onPromptInputOptionChange: (tabId, optionsValues) => { connector.onPromptInputOptionChange(tabId, optionsValues) }, + onMessageDismiss: (tabId, messageId) => { + connector.onMessageDismiss(tabId, messageId) + }, onFileClick: connector.onFileClick, tabs: { 'tab-1': { diff --git a/packages/core/src/amazonq/webview/ui/tabs/generator.ts b/packages/core/src/amazonq/webview/ui/tabs/generator.ts index c1e018aeeff..c4b54a4381a 100644 --- a/packages/core/src/amazonq/webview/ui/tabs/generator.ts +++ b/packages/core/src/amazonq/webview/ui/tabs/generator.ts @@ -11,13 +11,13 @@ import { qChatIntroMessageForSMUS, TabTypeDataMap } from './constants' import { agentWalkthroughDataModel } from '../walkthrough/agent' import { FeatureContext } from '../../../../shared/featureConfig' import { RegionProfile } from '../../../../codewhisperer/models/model' - export interface TabDataGeneratorProps { isFeatureDevEnabled: boolean isGumbyEnabled: boolean isScanEnabled: boolean isTestEnabled: boolean isDocEnabled: boolean + dismissedCards?: boolean disabledCommands?: string[] commandHighlight?: FeatureContext regionProfile?: RegionProfile @@ -28,6 +28,7 @@ export class TabDataGenerator { public quickActionsGenerator: QuickActionGenerator private highlightCommand?: FeatureContext private regionProfile?: RegionProfile + private dismissedCards?: boolean constructor(props: TabDataGeneratorProps) { this.followUpsGenerator = new FollowUpGenerator() @@ -41,6 +42,7 @@ export class TabDataGenerator { }) this.highlightCommand = props.commandHighlight this.regionProfile = props.regionProfile + this.dismissedCards = props.dismissedCards } public getTabData( @@ -49,6 +51,8 @@ export class TabDataGenerator { taskName?: string, isSMUS?: boolean ): MynahUIDataModel { + // eslint-disable-next-line aws-toolkits/no-console-log + console.log('tabType', tabType) if (tabType === 'agentWalkthrough') { return agentWalkthroughDataModel } @@ -56,18 +60,27 @@ export class TabDataGenerator { if (tabType === 'welcome') { return {} } - const programmerModeCard: ChatItem | undefined = { - type: ChatItemType.ANSWER, - title: 'NEW FEATURE', - header: { - icon: 'code-block', - iconStatus: 'primary', - body: '## Pair Programmer', - }, - fullWidth: true, - canBeDismissed: true, - body: 'Amazon Q Developer chat can now write code and run shell commands on your behalf. Disable Pair Programmer if you prefer a read-only experience.', - } + + const programmerModeCardId = 'programmerModeCardId' + + const isProgrammerModeCardDismissed = this.dismissedCards + // eslint-disable-next-line aws-toolkits/no-console-log + console.log('trueOrFalse', isProgrammerModeCardDismissed) + const programmerModeCard: ChatItem | undefined = !isProgrammerModeCardDismissed + ? ({ + type: ChatItemType.ANSWER, + title: 'NEW FEATURE', + messageId: programmerModeCardId, + header: { + icon: 'code-block', + iconStatus: 'primary', + body: '## Pair Programmer', + }, + fullWidth: true, + canBeDismissed: true, + body: 'Amazon Q Developer chat can now write code and run shell commands on your behalf. Disable Pair Programmer if you prefer a read-only experience.', + } as ChatItem) + : undefined const regionProfileCard: ChatItem | undefined = this.regionProfile === undefined @@ -97,7 +110,11 @@ Enter \`/\` to view quick actions. Use \`@\` to add saved prompts, files, folder contextCommands: this.getContextCommands(tabType), chatItems: needWelcomeMessages ? [ - ...(tabType === 'cwc' || tabType === 'unknown' ? [programmerModeCard] : []), + ...(tabType === 'cwc' || tabType === 'unknown' + ? programmerModeCard + ? [programmerModeCard] + : [] + : []), ...(regionProfileCard ? [regionProfileCard] : []), { type: ChatItemType.ANSWER, diff --git a/packages/core/src/shared/globalState.ts b/packages/core/src/shared/globalState.ts index 44d848ec69d..3bdb832c3b5 100644 --- a/packages/core/src/shared/globalState.ts +++ b/packages/core/src/shared/globalState.ts @@ -77,6 +77,7 @@ export type globalKey = | 'aws.toolkit.lambda.walkthroughSelected' | 'aws.toolkit.lambda.walkthroughCompleted' | 'aws.toolkit.appComposer.templateToOpenOnStart' + | 'aws.amazonq.dismissedCards' /** * Extension-local (not visible to other vscode extensions) shared state which persists after IDE From 7b24017815e1634bda71be14def6bb6183dda7d3 Mon Sep 17 00:00:00 2001 From: Randall-Jiang Date: Fri, 18 Apr 2025 16:53:40 -0700 Subject: [PATCH 2/3] fix --- .../core/src/amazonq/webview/messages/messageDispatcher.ts | 2 -- packages/core/src/amazonq/webview/ui/main.ts | 3 +++ packages/core/src/amazonq/webview/ui/tabs/generator.ts | 4 +--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/core/src/amazonq/webview/messages/messageDispatcher.ts b/packages/core/src/amazonq/webview/messages/messageDispatcher.ts index b794ab65f4c..9305afa1d20 100644 --- a/packages/core/src/amazonq/webview/messages/messageDispatcher.ts +++ b/packages/core/src/amazonq/webview/messages/messageDispatcher.ts @@ -87,8 +87,6 @@ export function dispatchWebViewMessagesToApps( return } case 'message-dismissed': { - // eslint-disable-next-line aws-toolkits/no-console-log - console.log('message-dismissed', msg) if (msg.messageId === 'programmerModeCardId') { void globals.globalState.tryUpdate('aws.amazonq.dismissedCards', true) } diff --git a/packages/core/src/amazonq/webview/ui/main.ts b/packages/core/src/amazonq/webview/ui/main.ts index 9e76c9efe0b..0aed312b95e 100644 --- a/packages/core/src/amazonq/webview/ui/main.ts +++ b/packages/core/src/amazonq/webview/ui/main.ts @@ -1005,6 +1005,9 @@ export const createMynahUI = ( connector.onPromptInputOptionChange(tabId, optionsValues) }, onMessageDismiss: (tabId, messageId) => { + if (messageId === 'programmerModeCardId') { + tabDataGenerator.dismissedCards = true + } connector.onMessageDismiss(tabId, messageId) }, onFileClick: connector.onFileClick, diff --git a/packages/core/src/amazonq/webview/ui/tabs/generator.ts b/packages/core/src/amazonq/webview/ui/tabs/generator.ts index c4b54a4381a..ebc335eb298 100644 --- a/packages/core/src/amazonq/webview/ui/tabs/generator.ts +++ b/packages/core/src/amazonq/webview/ui/tabs/generator.ts @@ -28,7 +28,7 @@ export class TabDataGenerator { public quickActionsGenerator: QuickActionGenerator private highlightCommand?: FeatureContext private regionProfile?: RegionProfile - private dismissedCards?: boolean + public dismissedCards?: boolean constructor(props: TabDataGeneratorProps) { this.followUpsGenerator = new FollowUpGenerator() @@ -64,8 +64,6 @@ export class TabDataGenerator { const programmerModeCardId = 'programmerModeCardId' const isProgrammerModeCardDismissed = this.dismissedCards - // eslint-disable-next-line aws-toolkits/no-console-log - console.log('trueOrFalse', isProgrammerModeCardDismissed) const programmerModeCard: ChatItem | undefined = !isProgrammerModeCardDismissed ? ({ type: ChatItemType.ANSWER, From 12a436e0f0d6d05a67e4d1297fa48c5a1a015cab Mon Sep 17 00:00:00 2001 From: Randall-Jiang Date: Fri, 18 Apr 2025 17:23:23 -0700 Subject: [PATCH 3/3] remove the consoleLog --- packages/core/src/amazonq/webview/ui/tabs/generator.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/core/src/amazonq/webview/ui/tabs/generator.ts b/packages/core/src/amazonq/webview/ui/tabs/generator.ts index ebc335eb298..6b74dc13b08 100644 --- a/packages/core/src/amazonq/webview/ui/tabs/generator.ts +++ b/packages/core/src/amazonq/webview/ui/tabs/generator.ts @@ -51,8 +51,6 @@ export class TabDataGenerator { taskName?: string, isSMUS?: boolean ): MynahUIDataModel { - // eslint-disable-next-line aws-toolkits/no-console-log - console.log('tabType', tabType) if (tabType === 'agentWalkthrough') { return agentWalkthroughDataModel }