From 65a05999cbb1f4654d9e1cd2e8fc6c2ed0a9b8ca Mon Sep 17 00:00:00 2001 From: Aarush Arora Date: Tue, 22 Sep 2026 13:57:42 -0700 Subject: [PATCH 1/4] feat(amazonq): persist chat deprecation acknowledgement --- packages/amazonq/package.json | 4 ++ packages/amazonq/src/lsp/chat/messages.ts | 5 ++ .../amazonq/src/lsp/chat/webviewProvider.ts | 4 +- .../unit/amazonq/lsp/chat/messages.test.ts | 37 ++++++++++++- .../amazonq/lsp/chat/webviewProvider.test.ts | 53 +++++++++++++++++++ .../core/src/shared/settings-amazonq.gen.ts | 1 + 6 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 packages/amazonq/test/unit/amazonq/lsp/chat/webviewProvider.test.ts diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index 44f972717e..442f49a1b8 100644 --- a/packages/amazonq/package.json +++ b/packages/amazonq/package.json @@ -136,6 +136,10 @@ "type": "boolean", "default": false }, + "amazonQChatDeprecationNotice": { + "type": "boolean", + "default": false + }, "amazonQSelectDeveloperProfile": { "type": "boolean", "default": false diff --git a/packages/amazonq/src/lsp/chat/messages.ts b/packages/amazonq/src/lsp/chat/messages.ts index 8c9f3d940b..6309ffc963 100644 --- a/packages/amazonq/src/lsp/chat/messages.ts +++ b/packages/amazonq/src/lsp/chat/messages.ts @@ -255,6 +255,11 @@ export function registerMessageListeners( switch (acknowledgedMessage.params.messageId) { case 'programmerModeCardId': { void AmazonQPromptSettings.instance.disablePrompt('amazonQChatPairProgramming') + break + } + case 'client-deprecation-notice': { + void AmazonQPromptSettings.instance.disablePrompt('amazonQChatDeprecationNotice') + break } } break diff --git a/packages/amazonq/src/lsp/chat/webviewProvider.ts b/packages/amazonq/src/lsp/chat/webviewProvider.ts index 45f01dbd58..99a3029596 100644 --- a/packages/amazonq/src/lsp/chat/webviewProvider.ts +++ b/packages/amazonq/src/lsp/chat/webviewProvider.ts @@ -96,6 +96,8 @@ export class AmazonQChatViewProvider implements WebviewViewProvider { const disclaimerAcknowledged = !AmazonQPromptSettings.instance.isPromptEnabled('amazonQChatDisclaimer') const pairProgrammingAcknowledged = !AmazonQPromptSettings.instance.isPromptEnabled('amazonQChatPairProgramming') + const deprecationNoticeAcknowledged = + !AmazonQPromptSettings.instance.isPromptEnabled('amazonQChatDeprecationNotice') const welcomeCount = globals.globalState.tryGet('aws.amazonq.welcomeChatShowCount', Number, 0) const modelSelectionEnabled = this.languageClient.initializeResult?.awsServerCapabilities?.chatOptions?.modelSelection ?? false @@ -147,7 +149,7 @@ export class AmazonQChatViewProvider implements WebviewViewProvider { const vscodeApi = acquireVsCodeApi() const hybridChatConnector = new HybridChatAdapter(${(await AuthUtil.instance.getChatAuthState()).amazonQ === 'connected'},${featureConfigData},${welcomeCount},${disclaimerAcknowledged},${regionProfileString},${disabledCommands},${isSMUS},${isSM},vscodeApi.postMessage) const commands = [hybridChatConnector.initialQuickActions[0]] - qChat = amazonQChat.createChat(vscodeApi, {os: "${os.platform()}", disclaimerAcknowledged: ${disclaimerAcknowledged}, pairProgrammingAcknowledged: ${pairProgrammingAcknowledged}, agenticMode: true, quickActionCommands: commands, modelSelectionEnabled: ${modelSelectionEnabled}}, hybridChatConnector, ${JSON.stringify(featureConfigData)}); + qChat = amazonQChat.createChat(vscodeApi, {os: "${os.platform()}", disclaimerAcknowledged: ${disclaimerAcknowledged}, pairProgrammingAcknowledged: ${pairProgrammingAcknowledged}, deprecationNoticeAcknowledged: ${deprecationNoticeAcknowledged}, agenticMode: true, quickActionCommands: commands, modelSelectionEnabled: ${modelSelectionEnabled}}, hybridChatConnector, ${JSON.stringify(featureConfigData)}); } window.addEventListener('message', (event) => { /** diff --git a/packages/amazonq/test/unit/amazonq/lsp/chat/messages.test.ts b/packages/amazonq/test/unit/amazonq/lsp/chat/messages.test.ts index 4c412a1767..a48b7ff647 100644 --- a/packages/amazonq/test/unit/amazonq/lsp/chat/messages.test.ts +++ b/packages/amazonq/test/unit/amazonq/lsp/chat/messages.test.ts @@ -9,7 +9,7 @@ import { AuthUtil } from 'aws-core-vscode/codewhisperer' import { registerMessageListeners } from '../../../../../src/lsp/chat/messages' import { AmazonQChatViewProvider } from '../../../../../src/lsp/chat/webviewProvider' import { secondaryAuth, authConnection, AuthFollowUpType } from 'aws-core-vscode/amazonq' -import { messages } from 'aws-core-vscode/shared' +import { AmazonQPromptSettings, messages } from 'aws-core-vscode/shared' describe('registerMessageListeners', () => { let languageClient: BaseLanguageClient @@ -160,4 +160,39 @@ describe('registerMessageListeners', () => { sinon.assert.calledWith(errorStub, `[VSCode Client] Failed to copy to clipboard: ${errorMessage}`) }) }) + + describe('CHAT_PROMPT_OPTION_ACKNOWLEDGED', () => { + let disablePromptStub: sinon.SinonStub + + beforeEach(() => { + disablePromptStub = sandbox.stub().resolves() + sandbox.replaceGetter(AmazonQPromptSettings, 'instance', () => { + return { + disablePrompt: disablePromptStub, + } as unknown as AmazonQPromptSettings + }) + }) + + it('persists the pair programming acknowledgement', async () => { + await messageHandler({ + command: 'chatPromptOptionAcknowledged', + params: { + messageId: 'programmerModeCardId', + }, + }) + + sinon.assert.calledOnceWithExactly(disablePromptStub, 'amazonQChatPairProgramming') + }) + + it('persists the deprecation notice acknowledgement separately', async () => { + await messageHandler({ + command: 'chatPromptOptionAcknowledged', + params: { + messageId: 'client-deprecation-notice', + }, + }) + + sinon.assert.calledOnceWithExactly(disablePromptStub, 'amazonQChatDeprecationNotice') + }) + }) }) diff --git a/packages/amazonq/test/unit/amazonq/lsp/chat/webviewProvider.test.ts b/packages/amazonq/test/unit/amazonq/lsp/chat/webviewProvider.test.ts new file mode 100644 index 0000000000..0ceb3da6c1 --- /dev/null +++ b/packages/amazonq/test/unit/amazonq/lsp/chat/webviewProvider.test.ts @@ -0,0 +1,53 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as sinon from 'sinon' +import { BaseLanguageClient } from 'vscode-languageclient' +import { AuthUtil } from 'aws-core-vscode/codewhisperer' +import { featureConfig } from 'aws-core-vscode/amazonq' +import { AmazonQPromptSettings, globals } from 'aws-core-vscode/shared' +import { AmazonQChatViewProvider } from '../../../../../src/lsp/chat/webviewProvider' + +describe('AmazonQChatViewProvider', () => { + let sandbox: sinon.SinonSandbox + + beforeEach(() => { + sandbox = sinon.createSandbox() + sandbox.stub(featureConfig, 'getFeatureConfigs').resolves('{}') + sandbox.stub(globals.globalState, 'tryGet').returns(0) + sandbox.replaceGetter(AuthUtil, 'instance', () => { + return { + getChatAuthState: sandbox.stub().resolves({ amazonQ: 'connected' }), + regionProfileManager: { + activeRegionProfile: undefined, + profiles: [], + }, + } as unknown as AuthUtil + }) + }) + + afterEach(() => { + sandbox.restore() + }) + + it('forwards the old and new prompt acknowledgements independently', async () => { + const isPromptEnabled = sandbox.stub() + isPromptEnabled.withArgs('amazonQChatDisclaimer').returns(false) + isPromptEnabled.withArgs('amazonQChatPairProgramming').returns(false) + isPromptEnabled.withArgs('amazonQChatDeprecationNotice').returns(true) + sandbox.replaceGetter(AmazonQPromptSettings, 'instance', () => { + return { + isPromptEnabled, + } as unknown as AmazonQPromptSettings + }) + + const provider = new AmazonQChatViewProvider('', {} as BaseLanguageClient) + const content = await (provider as any).getWebviewContent() + + sinon.assert.match(content, 'disclaimerAcknowledged: true') + sinon.assert.match(content, 'pairProgrammingAcknowledged: true') + sinon.assert.match(content, 'deprecationNoticeAcknowledged: false') + }) +}) diff --git a/packages/core/src/shared/settings-amazonq.gen.ts b/packages/core/src/shared/settings-amazonq.gen.ts index 0bcf5e95c2..f94217367c 100644 --- a/packages/core/src/shared/settings-amazonq.gen.ts +++ b/packages/core/src/shared/settings-amazonq.gen.ts @@ -23,6 +23,7 @@ export const amazonqSettings = { "amazonQWorkspaceLspManifestMessage": {}, "amazonQChatDisclaimer": {}, "amazonQChatPairProgramming": {}, + "amazonQChatDeprecationNotice": {}, "amazonQSelectDeveloperProfile": {} }, "amazonQ.showCodeWithReferences": {}, From fd1e2b193863472017b6fa9274c33cf8258242ce Mon Sep 17 00:00:00 2001 From: Aarush Arora Date: Wed, 23 Sep 2026 11:12:39 -0700 Subject: [PATCH 2/4] test(amazonq): cover acknowledged deprecation notice --- .../amazonq/lsp/chat/webviewProvider.test.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/amazonq/test/unit/amazonq/lsp/chat/webviewProvider.test.ts b/packages/amazonq/test/unit/amazonq/lsp/chat/webviewProvider.test.ts index 0ceb3da6c1..1670805a38 100644 --- a/packages/amazonq/test/unit/amazonq/lsp/chat/webviewProvider.test.ts +++ b/packages/amazonq/test/unit/amazonq/lsp/chat/webviewProvider.test.ts @@ -50,4 +50,23 @@ describe('AmazonQChatViewProvider', () => { sinon.assert.match(content, 'pairProgrammingAcknowledged: true') sinon.assert.match(content, 'deprecationNoticeAcknowledged: false') }) + + it('forwards an acknowledged deprecation notice independently from the old feature card', async () => { + const isPromptEnabled = sandbox.stub() + isPromptEnabled.withArgs('amazonQChatDisclaimer').returns(false) + isPromptEnabled.withArgs('amazonQChatPairProgramming').returns(true) + isPromptEnabled.withArgs('amazonQChatDeprecationNotice').returns(false) + sandbox.replaceGetter(AmazonQPromptSettings, 'instance', () => { + return { + isPromptEnabled, + } as unknown as AmazonQPromptSettings + }) + + const provider = new AmazonQChatViewProvider('', {} as BaseLanguageClient) + const content = await (provider as any).getWebviewContent() + + sinon.assert.match(content, 'disclaimerAcknowledged: true') + sinon.assert.match(content, 'pairProgrammingAcknowledged: false') + sinon.assert.match(content, 'deprecationNoticeAcknowledged: true') + }) }) From c179988b061fe44913e210c76fbe12b802839d51 Mon Sep 17 00:00:00 2001 From: Aarush Arora Date: Thu, 24 Sep 2026 15:29:32 -0700 Subject: [PATCH 3/4] docs: add Amazon Q deprecation notice changelog --- .../Feature-2d22f83a-1ae2-4ac7-9881-03d78acb083d.json | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 packages/amazonq/.changes/next-release/Feature-2d22f83a-1ae2-4ac7-9881-03d78acb083d.json diff --git a/packages/amazonq/.changes/next-release/Feature-2d22f83a-1ae2-4ac7-9881-03d78acb083d.json b/packages/amazonq/.changes/next-release/Feature-2d22f83a-1ae2-4ac7-9881-03d78acb083d.json new file mode 100644 index 0000000000..e8e72537e7 --- /dev/null +++ b/packages/amazonq/.changes/next-release/Feature-2d22f83a-1ae2-4ac7-9881-03d78acb083d.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "Amazon Q: The chat end-of-support notice stays dismissed after restarting VS Code." +} From eb809be8eb9e5e51eedcab63cf51decc88e303c4 Mon Sep 17 00:00:00 2001 From: Aarush Arora Date: Tue, 29 Sep 2026 09:34:37 -0700 Subject: [PATCH 4/4] fix(amazonq): remove deprecation notice changelog --- .../Feature-2d22f83a-1ae2-4ac7-9881-03d78acb083d.json | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 packages/amazonq/.changes/next-release/Feature-2d22f83a-1ae2-4ac7-9881-03d78acb083d.json diff --git a/packages/amazonq/.changes/next-release/Feature-2d22f83a-1ae2-4ac7-9881-03d78acb083d.json b/packages/amazonq/.changes/next-release/Feature-2d22f83a-1ae2-4ac7-9881-03d78acb083d.json deleted file mode 100644 index e8e72537e7..0000000000 --- a/packages/amazonq/.changes/next-release/Feature-2d22f83a-1ae2-4ac7-9881-03d78acb083d.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "Feature", - "description": "Amazon Q: The chat end-of-support notice stays dismissed after restarting VS Code." -}