Skip to content

Commit 80afc25

Browse files
committed
feat(amazonq): Add acknowledgement button for disclaimer
1 parent d74f96c commit 80afc25

File tree

7 files changed

+61
-6
lines changed

7 files changed

+61
-6
lines changed

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+
void 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'
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/amazonq/webview/ui/main.ts

Lines changed: 28 additions & 3 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 './disclaimer/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,6 +613,24 @@ export const createMynahUI = (
609613
},
610614
onVote: connector.onChatItemVoted,
611615
onInBodyButtonClicked: (tabId, messageId, action, eventId) => {
616+
if (action.id === disclaimerAcknowledgeButtonId) {
617+
disclaimerCardActive = false
618+
619+
// post message to tell VSCode that disclaimer is acknowledged
620+
ideApi.postMessage({
621+
command: 'disclaimer-acknowledged',
622+
})
623+
624+
// create telemetry
625+
ideApi.postMessage(createClickTelemetry('amazonq-disclaimer-acknowledge-button'))
626+
627+
// remove all disclaimer cards from all tabs
628+
Object.keys(mynahUI.getAllTabs()).forEach((storeTabKey) => {
629+
// eslint-disable-next-line unicorn/no-null
630+
mynahUI.updateStore(storeTabKey, { promptInputStickyCard: null })
631+
})
632+
}
633+
612634
if (action.id === 'quick-start') {
613635
/**
614636
* quick start is the action on the welcome page. When its
@@ -786,9 +808,12 @@ export const createMynahUI = (
786808
tabs: {
787809
'tab-1': {
788810
isSelected: true,
789-
store: showWelcomePage
790-
? welcomeScreenTabData(tabDataGenerator).store
791-
: tabDataGenerator.getTabData('cwc', true),
811+
store: {
812+
...(showWelcomePage
813+
? welcomeScreenTabData(tabDataGenerator).store
814+
: tabDataGenerator.getTabData('cwc', true)),
815+
...(disclaimerCardActive ? { promptInputStickyCard: disclaimerCard } : {}),
816+
},
792817
},
793818
},
794819
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,

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)