Skip to content

Commit f601d89

Browse files
authored
feat(amazonq): Add acknowledgement button for disclaimer (aws#6151)
## Problem - disclaimer is too wordy ## Solution - go back to the old disclaimer and add an ackowledgement button
1 parent 016e478 commit f601d89

File tree

8 files changed

+99
-37
lines changed

8 files changed

+99
-37
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Feature",
3+
"description": "Add acknowledgement button for amazon q chat disclaimer"
4+
}

packages/core/src/amazonq/webview/generators/webViewContent.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ export class WebViewContentGenerator {
7878
const featureConfigsString = await this.generateFeatureConfigsData()
7979

8080
const disabledCommandsString = isSageMaker() ? `['/dev', '/transform']` : '[]'
81+
const disclaimerAcknowledged = globals.globalState.tryGet('aws.amazonq.disclaimerAcknowledged', Boolean, false)
8182

8283
return `
8384
<script type="text/javascript" src="${javascriptEntrypoint.toString()}" defer onload="init()"></script>
@@ -86,7 +87,7 @@ export class WebViewContentGenerator {
8687
const init = () => {
8788
createMynahUI(acquireVsCodeApi(), ${
8889
(await AuthUtil.instance.getChatAuthState()).amazonQ === 'connected'
89-
},${featureConfigsString},${showWelcomePage},${disabledCommandsString});
90+
},${featureConfigsString},${showWelcomePage},${disclaimerAcknowledged},${disabledCommandsString});
9091
}
9192
</script>
9293
`

packages/core/src/amazonq/webview/messages/messageDispatcher.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { getLogger } from '../../../shared/logger'
1111
import { amazonqMark } from '../../../shared/performance/marks'
1212
import { telemetry } from '../../../shared/telemetry'
1313
import { AmazonQChatMessageDuration } from '../../messages/chatMessageDuration'
14-
import { openUrl } from '../../../shared'
14+
import { globals, openUrl } from '../../../shared'
1515
import { isClickTelemetry, isOpenAgentTelemetry } from '../ui/telemetry/actions'
1616

1717
export function dispatchWebViewMessagesToApps(
@@ -60,12 +60,19 @@ export function dispatchWebViewMessagesToApps(
6060
source: msg.trigger,
6161
result: 'Succeeded',
6262
})
63+
return
6364
} else if (isClickTelemetry(msg)) {
6465
telemetry.ui_click.emit({
6566
elementId: msg.source,
6667
result: 'Succeeded',
6768
})
69+
return
6870
}
71+
return
72+
}
73+
case 'disclaimer-acknowledged': {
74+
globals.globalState.tryUpdate('aws.amazonq.disclaimerAcknowledged', true)
75+
return
6976
}
7077
}
7178

packages/core/src/amazonq/webview/ui/commands.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ type MessageCommand =
1010
| 'tab-was-removed'
1111
| 'tab-was-changed'
1212
| 'ui-is-ready'
13+
| 'disclaimer-acknowledged'
1314
| 'ui-focus'
1415
| 'follow-up-was-clicked'
1516
| 'auth-follow-up-was-clicked'

packages/core/src/amazonq/webview/ui/main.ts

Lines changed: 62 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,17 @@ import { tryNewMap } from '../../util/functionUtils'
3131
import { welcomeScreenTabData } from './walkthrough/welcome'
3232
import { agentWalkthroughDataModel } from './walkthrough/agent'
3333
import { createClickTelemetry, createOpenAgentTelemetry } from './telemetry/actions'
34+
import { disclaimerAcknowledgeButtonId, disclaimerCard } from './texts/disclaimer'
3435

3536
export const createMynahUI = (
3637
ideApi: any,
3738
amazonQEnabled: boolean,
3839
featureConfigsSerialized: [string, FeatureContext][],
3940
showWelcomePage: boolean,
41+
disclaimerAcknowledged: boolean,
4042
disabledCommands?: string[]
4143
) => {
44+
let disclaimerCardActive = !disclaimerAcknowledged
4245
// eslint-disable-next-line prefer-const
4346
let mynahUI: MynahUI
4447
// eslint-disable-next-line prefer-const
@@ -542,6 +545,7 @@ export const createMynahUI = (
542545
// make sure to show/hide it accordingly
543546
mynahUI.updateStore(tabID, {
544547
quickActionCommands: tabDataGenerator.quickActionsGenerator.generateForTab('unknown'),
548+
...(disclaimerCardActive ? { promptInputStickyCard: disclaimerCard } : {}),
545549
})
546550
connector.onTabAdd(tabID)
547551
},
@@ -609,43 +613,64 @@ export const createMynahUI = (
609613
},
610614
onVote: connector.onChatItemVoted,
611615
onInBodyButtonClicked: (tabId, messageId, action, eventId) => {
612-
if (action.id === 'quick-start') {
613-
/**
614-
* quick start is the action on the welcome page. When its
615-
* clicked it collapses the view and puts it into regular
616-
* "chat" which is cwc
617-
*/
618-
tabsStorage.updateTabTypeFromUnknown(tabId, 'cwc')
619-
620-
// show quick start in the current tab instead of a new one
621-
mynahUI.updateStore(tabId, {
622-
tabHeaderDetails: undefined,
623-
compactMode: false,
624-
tabBackground: false,
625-
promptInputText: '/',
626-
promptInputLabel: undefined,
627-
chatItems: [],
628-
})
616+
switch (action.id) {
617+
case disclaimerAcknowledgeButtonId: {
618+
disclaimerCardActive = false
629619

630-
ideApi.postMessage(createClickTelemetry('amazonq-welcome-quick-start-button'))
631-
return
632-
}
620+
// post message to tell VSCode that disclaimer is acknowledged
621+
ideApi.postMessage({
622+
command: 'disclaimer-acknowledged',
623+
})
633624

634-
if (action.id === 'explore') {
635-
const newTabId = mynahUI.updateStore('', agentWalkthroughDataModel)
636-
if (newTabId === undefined) {
637-
mynahUI.notify({
638-
content: uiComponentsTexts.noMoreTabsTooltip,
639-
type: NotificationType.WARNING,
625+
// create telemetry
626+
ideApi.postMessage(createClickTelemetry('amazonq-disclaimer-acknowledge-button'))
627+
628+
// remove all disclaimer cards from all tabs
629+
Object.keys(mynahUI.getAllTabs()).forEach((storeTabKey) => {
630+
// eslint-disable-next-line unicorn/no-null
631+
mynahUI.updateStore(storeTabKey, { promptInputStickyCard: null })
640632
})
641633
return
642634
}
643-
tabsStorage.updateTabTypeFromUnknown(newTabId, 'agentWalkthrough')
644-
ideApi.postMessage(createClickTelemetry('amazonq-welcome-explore-button'))
645-
return
646-
}
635+
case 'quick-start': {
636+
/**
637+
* quick start is the action on the welcome page. When its
638+
* clicked it collapses the view and puts it into regular
639+
* "chat" which is cwc
640+
*/
641+
tabsStorage.updateTabTypeFromUnknown(tabId, 'cwc')
642+
643+
// show quick start in the current tab instead of a new one
644+
mynahUI.updateStore(tabId, {
645+
tabHeaderDetails: undefined,
646+
compactMode: false,
647+
tabBackground: false,
648+
promptInputText: '/',
649+
promptInputLabel: undefined,
650+
chatItems: [],
651+
})
647652

648-
connector.onCustomFormAction(tabId, messageId, action, eventId)
653+
ideApi.postMessage(createClickTelemetry('amazonq-welcome-quick-start-button'))
654+
return
655+
}
656+
case 'explore': {
657+
const newTabId = mynahUI.updateStore('', agentWalkthroughDataModel)
658+
if (newTabId === undefined) {
659+
mynahUI.notify({
660+
content: uiComponentsTexts.noMoreTabsTooltip,
661+
type: NotificationType.WARNING,
662+
})
663+
return
664+
}
665+
tabsStorage.updateTabTypeFromUnknown(newTabId, 'agentWalkthrough')
666+
ideApi.postMessage(createClickTelemetry('amazonq-welcome-explore-button'))
667+
return
668+
}
669+
default: {
670+
connector.onCustomFormAction(tabId, messageId, action, eventId)
671+
return
672+
}
673+
}
649674
},
650675
onCustomFormAction: (tabId, action, eventId) => {
651676
connector.onCustomFormAction(tabId, undefined, action, eventId)
@@ -786,9 +811,12 @@ export const createMynahUI = (
786811
tabs: {
787812
'tab-1': {
788813
isSelected: true,
789-
store: showWelcomePage
790-
? welcomeScreenTabData(tabDataGenerator).store
791-
: tabDataGenerator.getTabData('cwc', true),
814+
store: {
815+
...(showWelcomePage
816+
? welcomeScreenTabData(tabDataGenerator).store
817+
: tabDataGenerator.getTabData('cwc', true)),
818+
...(disclaimerCardActive ? { promptInputStickyCard: disclaimerCard } : {}),
819+
},
792820
},
793821
},
794822
defaults: {

packages/core/src/amazonq/webview/ui/tabs/generator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export class TabDataGenerator {
4747
const tabData: MynahUIDataModel = {
4848
tabTitle: taskName ?? TabTypeDataMap[tabType].title,
4949
promptInputInfo:
50-
'Amazon Q Developer uses generative AI. You may need to verify responses. See the [AWS Responsible AI Policy](https://aws.amazon.com/machine-learning/responsible-ai/policy/). Amazon Q Developer processes data across all US Regions. See [here](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/cross-region-inference.html) for more info. Amazon Q may retain chats to provide and maintain the service.',
50+
'Amazon Q Developer uses generative AI. You may need to verify responses. See the [AWS Responsible AI Policy](https://aws.amazon.com/machine-learning/responsible-ai/policy/).',
5151
quickActionCommands: this.quickActionsGenerator.generateForTab(tabType),
5252
promptInputPlaceholder: TabTypeDataMap[tabType].placeholder,
5353
contextCommands: TabTypeDataMap[tabType].contextCommands,
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*!
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import { ChatItem, MynahIcons } from '@aws/mynah-ui'
7+
8+
export const disclaimerAcknowledgeButtonId = 'amazonq-disclaimer-acknowledge-button-id'
9+
export const disclaimerCard: Partial<ChatItem> = {
10+
messageId: 'amazonq-disclaimer-card',
11+
body: 'Amazon Q Developer uses generative AI. You may need to verify responses. See the [AWS Responsible AI Policy](https://aws.amazon.com/machine-learning/responsible-ai/policy/). Amazon Q Developer processes data across all US Regions. See [here](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/cross-region-inference.html) for more info. Amazon Q may retain chats to provide and maintain the service.',
12+
buttons: [
13+
{
14+
text: 'Acknowledge',
15+
id: disclaimerAcknowledgeButtonId,
16+
status: 'info',
17+
icon: MynahIcons.OK,
18+
},
19+
],
20+
}

packages/core/src/shared/globalState.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export type globalKey =
3434
| 'aws.amazonq.securityIssueFilters'
3535
| 'aws.amazonq.notifications'
3636
| 'aws.amazonq.welcomeChatShowCount'
37+
| 'aws.amazonq.disclaimerAcknowledged'
3738
| 'aws.notifications'
3839
| 'aws.notifications.dev' // keys to store notifications for testing
3940
| 'aws.downloadPath'

0 commit comments

Comments
 (0)