From a22bab634a0e85bf771f8da953c48345f1e04f71 Mon Sep 17 00:00:00 2001 From: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Date: Tue, 8 Oct 2024 11:58:05 -0700 Subject: [PATCH 1/2] Acceptance metrics for CWC --- package-lock.json | 4 +-- .../webview/ui/apps/cwChatConnector.ts | 21 +++++++---- .../core/src/amazonq/webview/ui/connector.ts | 19 +++++++--- packages/core/src/amazonq/webview/ui/main.ts | 35 ++++++++++++++++--- .../controllers/chat/messenger/messenger.ts | 6 ++++ .../view/connector/connector.ts | 3 ++ 6 files changed, 71 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc42d933cd4..314f132e1c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19265,7 +19265,7 @@ "devDependencies": {}, "engines": { "npm": "^10.1.0", - "vscode": "^1.68.0" + "vscode": "^1.83.0" } }, "packages/core": { @@ -19426,7 +19426,7 @@ "devDependencies": {}, "engines": { "npm": "^10.1.0", - "vscode": "^1.68.0" + "vscode": "^1.83.0" } }, "plugins/eslint-plugin-aws-toolkits": { diff --git a/packages/core/src/amazonq/webview/ui/apps/cwChatConnector.ts b/packages/core/src/amazonq/webview/ui/apps/cwChatConnector.ts index c7da7b10410..0d48a127d81 100644 --- a/packages/core/src/amazonq/webview/ui/apps/cwChatConnector.ts +++ b/packages/core/src/amazonq/webview/ui/apps/cwChatConnector.ts @@ -3,11 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { ChatItem, ChatItemAction, ChatItemType, FeedbackPayload } from '@aws/mynah-ui' +import { ChatItemAction, ChatItemType, FeedbackPayload } from '@aws/mynah-ui' import { ExtensionMessage } from '../commands' import { CodeReference } from './amazonqCommonsConnector' import { TabOpenType, TabsStorage } from '../storages/tabsStorage' import { FollowUpGenerator } from '../followUps/generator' +import { CWCChatItem } from '../connector' interface ChatPayload { chatMessage: string @@ -17,8 +18,8 @@ interface ChatPayload { export interface ConnectorProps { sendMessageToExtension: (message: ExtensionMessage) => void onMessageReceived?: (tabID: string, messageData: any, needToShowAPIDocsTab: boolean) => void - onChatAnswerReceived?: (tabID: string, message: ChatItem) => void - onCWCContextCommandMessage: (message: ChatItem, command?: string) => string | undefined + onChatAnswerReceived?: (tabID: string, message: CWCChatItem) => void + onCWCContextCommandMessage: (message: CWCChatItem, command?: string) => string | undefined onError: (tabID: string, message: string, title: string) => void onWarning: (tabID: string, message: string, title: string) => void onOpenSettingsMessage: (tabID: string) => void @@ -109,7 +110,8 @@ export class Connector { codeReference?: CodeReference[], eventId?: string, codeBlockIndex?: number, - totalCodeBlocks?: number + totalCodeBlocks?: number, + userIntent?: string ): void => { this.sendMessageToExtension({ tabID: tabID, @@ -122,6 +124,7 @@ export class Connector { eventId, codeBlockIndex, totalCodeBlocks, + userIntent, }) } @@ -133,7 +136,8 @@ export class Connector { codeReference?: CodeReference[], eventId?: string, codeBlockIndex?: number, - totalCodeBlocks?: number + totalCodeBlocks?: number, + userIntent?: string ): void => { this.sendMessageToExtension({ tabID: tabID, @@ -146,6 +150,7 @@ export class Connector { eventId, codeBlockIndex, totalCodeBlocks, + userIntent, }) } @@ -282,13 +287,14 @@ export class Connector { } : undefined - const answer: ChatItem = { + const answer: CWCChatItem = { type: messageData.messageType, messageId: messageData.messageID ?? messageData.triggerID, body: messageData.message, followUp: followUps, canBeVoted: true, codeReference: messageData.codeReference, + userIntent: messageData.userIntent, } // If it is not there we will not set it @@ -315,12 +321,13 @@ export class Connector { return } if (messageData.messageType === ChatItemType.ANSWER) { - const answer: ChatItem = { + const answer: CWCChatItem = { type: messageData.messageType, body: undefined, relatedContent: undefined, messageId: messageData.messageID, codeReference: messageData.codeReference, + userIntent: messageData.userIntent, followUp: messageData.followUps !== undefined && messageData.followUps.length > 0 ? { diff --git a/packages/core/src/amazonq/webview/ui/connector.ts b/packages/core/src/amazonq/webview/ui/connector.ts index 63504c67ceb..84efc172683 100644 --- a/packages/core/src/amazonq/webview/ui/connector.ts +++ b/packages/core/src/amazonq/webview/ui/connector.ts @@ -13,6 +13,7 @@ import { TabType, TabsStorage } from './storages/tabsStorage' import { WelcomeFollowupType } from './apps/amazonqCommonsConnector' import { AuthFollowUpType } from './followUps/generator' import { DiffTreeFileInfo } from './diffTree/types' +import { UserIntent } from '@amzn/codewhisperer-streaming' export interface CodeReference { licenseName?: string @@ -29,6 +30,12 @@ export interface ChatPayload { chatCommand?: string } +// Adding userIntent param by extending ChatItem to send userIntent as part of amazonq_interactWithMessage event +export interface CWCChatItem extends ChatItem { + traceId?: string + userIntent?: UserIntent +} + export interface ConnectorProps { sendMessageToExtension: (message: ExtensionMessage) => void onMessageReceived?: (tabID: string, messageData: any, needToShowAPIDocsTab: boolean) => void @@ -214,7 +221,8 @@ export class Connector { codeReference?: CodeReference[], eventId?: string, codeBlockIndex?: number, - totalCodeBlocks?: number + totalCodeBlocks?: number, + userIntent?: string ): void => { switch (this.tabsStorage.getTab(tabID)?.type) { case 'cwc': @@ -226,7 +234,8 @@ export class Connector { codeReference, eventId, codeBlockIndex, - totalCodeBlocks + totalCodeBlocks, + userIntent ) break case 'featuredev': @@ -243,7 +252,8 @@ export class Connector { codeReference?: CodeReference[], eventId?: string, codeBlockIndex?: number, - totalCodeBlocks?: number + totalCodeBlocks?: number, + userIntent?: string ): void => { switch (this.tabsStorage.getTab(tabID)?.type) { case 'cwc': @@ -255,7 +265,8 @@ export class Connector { codeReference, eventId, codeBlockIndex, - totalCodeBlocks + totalCodeBlocks, + userIntent ) break case 'featuredev': diff --git a/packages/core/src/amazonq/webview/ui/main.ts b/packages/core/src/amazonq/webview/ui/main.ts index 31ac4baeaec..09064d5faf8 100644 --- a/packages/core/src/amazonq/webview/ui/main.ts +++ b/packages/core/src/amazonq/webview/ui/main.ts @@ -2,7 +2,7 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ -import { Connector } from './connector' +import { Connector, CWCChatItem } from './connector' import { ChatItem, ChatItemType, MynahIcons, MynahUI, MynahUIDataModel, NotificationType } from '@aws/mynah-ui' import { ChatPrompt } from '@aws/mynah-ui/dist/static' import { TabsStorage, TabType } from './storages/tabsStorage' @@ -22,6 +22,8 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { let mynahUI: MynahUI // eslint-disable-next-line prefer-const let connector: Connector + //Store the mapping between messageId and messageUserIntent for amazonq_interactWithMessage telemetry + const messageUserIntentMap = new Map() window.addEventListener('error', (e) => { const { error, message } = e @@ -199,7 +201,7 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { } as ChatItem) } }, - onChatAnswerReceived: (tabID: string, item: ChatItem) => { + onChatAnswerReceived: (tabID: string, item: CWCChatItem) => { if (item.type === ChatItemType.ANSWER_PART || item.type === ChatItemType.CODE_RESULT) { mynahUI.updateLastChatAnswer(tabID, { ...(item.messageId !== undefined ? { messageId: item.messageId } : {}), @@ -211,6 +213,9 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { ? { type: ChatItemType.CODE_RESULT, fileList: item.fileList } : {}), }) + if (item.messageId !== undefined && item.userIntent !== undefined) { + messageUserIntentMap.set(item.messageId, item.userIntent) + } ideApi.postMessage({ command: 'update-chat-message-telemetry', tabID, @@ -429,7 +434,28 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { content: 'Thanks for your feedback.', }) }, - onCodeInsertToCursorPosition: connector.onCodeInsertToCursorPosition, + onCodeInsertToCursorPosition: ( + tabId, + messageId, + code, + type, + referenceTrackerInfo, + eventId, + codeBlockIndex, + totalCodeBlocks + ) => { + connector.onCodeInsertToCursorPosition( + tabId, + messageId, + code, + type, + referenceTrackerInfo, + eventId, + codeBlockIndex, + totalCodeBlocks, + messageUserIntentMap.get(messageId) ?? undefined + ) + }, onCopyCodeToClipboard: ( tabId, messageId, @@ -448,7 +474,8 @@ export const createMynahUI = (ideApi: any, amazonQEnabled: boolean) => { referenceTrackerInfo, eventId, codeBlockIndex, - totalCodeBlocks + totalCodeBlocks, + messageUserIntentMap.get(messageId) ?? undefined ) mynahUI.notify({ type: NotificationType.SUCCESS, diff --git a/packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts b/packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts index dad3181381d..c16bbf3c24b 100644 --- a/packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts +++ b/packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts @@ -86,6 +86,7 @@ export class Messenger { relatedSuggestions: undefined, triggerID, messageID: '', + userIntent: undefined, }, tabID ) @@ -193,6 +194,7 @@ export class Messenger { codeReference, triggerID, messageID, + userIntent: triggerPayload.userIntent, }, tabID ) @@ -269,6 +271,7 @@ export class Messenger { relatedSuggestions: undefined, triggerID, messageID, + userIntent: triggerPayload.userIntent, }, tabID ) @@ -286,6 +289,7 @@ export class Messenger { relatedSuggestions, triggerID, messageID, + userIntent: triggerPayload.userIntent, }, tabID ) @@ -302,6 +306,7 @@ export class Messenger { relatedSuggestions: undefined, triggerID, messageID, + userIntent: triggerPayload.userIntent, }, tabID ) @@ -425,6 +430,7 @@ export class Messenger { relatedSuggestions: undefined, triggerID, messageID: 'static_message_' + triggerID, + userIntent: undefined, }, tabID ) diff --git a/packages/core/src/codewhispererChat/view/connector/connector.ts b/packages/core/src/codewhispererChat/view/connector/connector.ts index 094c2b2c6d9..00a8217de49 100644 --- a/packages/core/src/codewhispererChat/view/connector/connector.ts +++ b/packages/core/src/codewhispererChat/view/connector/connector.ts @@ -141,6 +141,7 @@ export interface ChatMessageProps { readonly codeReference?: CodeReference[] readonly triggerID: string readonly messageID: string + readonly userIntent: string | undefined } export class ChatMessage extends UiMessage { @@ -153,6 +154,7 @@ export class ChatMessage extends UiMessage { readonly followUpsHeader: string | undefined readonly triggerID: string readonly messageID: string | undefined + readonly userIntent: string | undefined override type = 'chatMessage' constructor(props: ChatMessageProps, tabID: string) { @@ -165,6 +167,7 @@ export class ChatMessage extends UiMessage { this.codeReference = props.codeReference this.triggerID = props.triggerID this.messageID = props.messageID + this.userIntent = props.userIntent } } From 7ef73df3c3870975d5651c66c6743ab1cff6dc7d Mon Sep 17 00:00:00 2001 From: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Date: Tue, 8 Oct 2024 13:37:17 -0700 Subject: [PATCH 2/2] Minor changes --- package-lock.json | 4 ++-- packages/core/src/amazonq/webview/ui/connector.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 314f132e1c1..cc42d933cd4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19265,7 +19265,7 @@ "devDependencies": {}, "engines": { "npm": "^10.1.0", - "vscode": "^1.83.0" + "vscode": "^1.68.0" } }, "packages/core": { @@ -19426,7 +19426,7 @@ "devDependencies": {}, "engines": { "npm": "^10.1.0", - "vscode": "^1.83.0" + "vscode": "^1.68.0" } }, "plugins/eslint-plugin-aws-toolkits": { diff --git a/packages/core/src/amazonq/webview/ui/connector.ts b/packages/core/src/amazonq/webview/ui/connector.ts index 84efc172683..8fd883c969c 100644 --- a/packages/core/src/amazonq/webview/ui/connector.ts +++ b/packages/core/src/amazonq/webview/ui/connector.ts @@ -30,7 +30,7 @@ export interface ChatPayload { chatCommand?: string } -// Adding userIntent param by extending ChatItem to send userIntent as part of amazonq_interactWithMessage event +// Adding userIntent param by extending ChatItem to send userIntent as part of amazonq_interactWithMessage telemetry event export interface CWCChatItem extends ChatItem { traceId?: string userIntent?: UserIntent