Skip to content

Commit e4a1f1c

Browse files
committed
Update Q Chat Introduction message and disable Q Signout option for SMUS based CodeEditor App
1 parent c238710 commit e4a1f1c

File tree

10 files changed

+75
-15
lines changed

10 files changed

+75
-15
lines changed

packages/amazonq/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@
351351
},
352352
{
353353
"command": "aws.amazonq.signout",
354-
"when": "(view == aws.amazonq.AmazonQChatView) && aws.codewhisperer.connected",
354+
"when": "(view == aws.amazonq.AmazonQChatView) && aws.codewhisperer.connected && !aws.amazonq.isSagemakerStudio",
355355
"group": "2_amazonQ@4"
356356
},
357357
{
@@ -627,7 +627,7 @@
627627
"title": "%AWS.command.codewhisperer.signout%",
628628
"category": "%AWS.amazonq.title%",
629629
"icon": "$(debug-disconnect)",
630-
"enablement": "aws.codewhisperer.connected"
630+
"enablement": "aws.codewhisperer.connected && !aws.amazonq.isSagemakerStudio"
631631
},
632632
{
633633
"command": "aws.amazonq.learnMore",

packages/amazonq/src/app/chat/activation.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as vscode from 'vscode'
77
import { ExtensionContext, window } from 'vscode'
88
import { telemetry } from 'aws-core-vscode/telemetry'
99
import { AuthUtil, CodeWhispererSettings } from 'aws-core-vscode/codewhisperer'
10-
import { Commands, placeholder, funcUtil } from 'aws-core-vscode/shared'
10+
import { Commands, placeholder, funcUtil, getLogger, setContext } from 'aws-core-vscode/shared'
1111
import * as amazonq from 'aws-core-vscode/amazonq'
1212
import { scanChatAppInit } from '../amazonqScan'
1313
import { init as inlineChatInit } from '../../inlineChat/app'
@@ -16,6 +16,11 @@ export async function activate(context: ExtensionContext) {
1616
const appInitContext = amazonq.DefaultAmazonQAppInitContext.instance
1717

1818
registerApps(appInitContext, context)
19+
const serviceName = process.env.SERVICE_NAME ?? 'SageMakerUnifiedStudio' // Fallback service name to a generic name AmazonQ
20+
const amazonQState = amazonq.AmazonQState.initialize(serviceName)
21+
getLogger().info(`In Extension activation - q state is initialized ${amazonQState.serviceName}`)
22+
// Create a context key for SageMaker Studio state and set in context
23+
await setContext('aws.amazonq.isSagemakerStudio', amazonQState.isSageMakerUnifiedStudio())
1924

2025
const provider = new amazonq.AmazonQChatViewProvider(
2126
context,

packages/core/src/amazonq/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export { ChatItemType } from './commons/model'
4343
export { ExtensionMessage } from '../amazonq/webview/ui/commands'
4444
export { CodeReference } from '../codewhispererChat/view/connector/connector'
4545
export { extractAuthFollowUp } from './util/authUtils'
46+
export { AmazonQState } from './util/amazonQState'
4647
export { Messenger } from './commons/connector/baseMessenger'
4748
export * from './lsp/config'
4849
export * as WorkspaceLspInstaller from './lsp/workspaceInstaller'
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
export class AmazonQState {
2+
private static _instance: AmazonQState | undefined
3+
private readonly _serviceName: string
4+
5+
private constructor(serviceName: string) {
6+
this._serviceName = serviceName
7+
}
8+
9+
public static initialize(serviceName: string): AmazonQState {
10+
if (!this._instance) {
11+
this._instance = new AmazonQState(serviceName)
12+
}
13+
return this._instance
14+
}
15+
16+
public static get instance(): AmazonQState {
17+
if (!this._instance) {
18+
throw new Error('AmazonQState not initialized. Call initialize() first')
19+
}
20+
return this._instance
21+
}
22+
23+
public get serviceName(): string {
24+
return this._serviceName
25+
}
26+
27+
public isSageMakerUnifiedStudio(): boolean {
28+
return this._serviceName === 'SageMakerUnifiedStudio'
29+
}
30+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ export class WebViewContentGenerator {
8383
const disclaimerAcknowledged = globals.globalState.tryGet('aws.amazonq.disclaimerAcknowledged', Boolean, false)
8484

8585
const welcomeLoadCount = globals.globalState.tryGet('aws.amazonq.welcomeChatShowCount', Number, 0)
86+
const serviceName = process.env.SERVICE_NAME ?? ''
8687

8788
return `
8889
<script type="text/javascript" src="${javascriptEntrypoint.toString()}" defer onload="init()"></script>
@@ -91,7 +92,7 @@ export class WebViewContentGenerator {
9192
const init = () => {
9293
createMynahUI(acquireVsCodeApi(), ${
9394
(await AuthUtil.instance.getChatAuthState()).amazonQ === 'connected'
94-
},${featureConfigsString},${welcomeLoadCount},${disclaimerAcknowledged},${disabledCommandsString});
95+
},${featureConfigsString},${welcomeLoadCount},${disclaimerAcknowledged},${disabledCommandsString}, '${serviceName}');
9596
}
9697
</script>
9798
`

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ export const createMynahUI = (
4747
featureConfigsSerialized: [string, FeatureContext][],
4848
welcomeCount: number,
4949
disclaimerAcknowledged: boolean,
50-
disabledCommands?: string[]
50+
disabledCommands?: string[],
51+
service?: string
5152
) => {
5253
let disclaimerCardActive = !disclaimerAcknowledged
5354
// eslint-disable-next-line prefer-const
@@ -58,6 +59,7 @@ export const createMynahUI = (
5859
const responseMetadata = new Map<string, string[]>()
5960

6061
let savedContextCommands: MynahUIDataModel['contextCommands'] = []
62+
const serviceName = service ?? ''
6163

6264
window.addEventListener('error', (e) => {
6365
const { error, message } = e
@@ -624,7 +626,7 @@ export const createMynahUI = (
624626
tabsStorage.updateTabTypeFromUnknown(tabID, 'cwc')
625627
mynahUI?.updateTabDefaults({
626628
store: {
627-
...tabDataGenerator.getTabData('cwc', true),
629+
...tabDataGenerator.getTabData('cwc', true, undefined, serviceName),
628630
tabHeaderDetails: void 0,
629631
compactMode: false,
630632
tabBackground: false,
@@ -931,15 +933,15 @@ export const createMynahUI = (
931933
store: {
932934
...(showWelcomePage()
933935
? welcomeScreenTabData(tabDataGenerator).store
934-
: tabDataGenerator.getTabData('cwc', true)),
936+
: tabDataGenerator.getTabData('cwc', true, undefined, serviceName)),
935937
...(disclaimerCardActive ? { promptInputStickyCard: disclaimerCard } : {}),
936938
},
937939
},
938940
},
939941
defaults: {
940942
store: showWelcomePage()
941943
? welcomeScreenTabData(tabDataGenerator).store
942-
: tabDataGenerator.getTabData('cwc', true),
944+
: tabDataGenerator.getTabData('cwc', true, undefined, serviceName),
943945
},
944946
config: {
945947
maxTabs: 10,

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,23 @@ import { TabType } from '../storages/tabsStorage'
66
import { QuickActionCommandGroup } from '@aws/mynah-ui'
77
import { userGuideURL } from '../texts/constants'
88

9+
const qChatIntroMessage = `Hi, I'm Amazon Q. I can answer your software development questions.
10+
Ask me to explain, debug, or optimize your code.
11+
You can enter \`/\` to see a list of quick actions. Use \`@\` to add saved prompts, files, folders, or your entire workspace as context.`
12+
913
export type TabTypeData = {
1014
title: string
1115
placeholder: string
1216
welcome: string
1317
contextCommands?: QuickActionCommandGroup[]
1418
}
1519

20+
export const qChatIntroMessageForSMUS = `Hi, I'm Amazon Q. I can answer your software development questions.\n\
21+
Ask me to explain, debug, or optimize your code.\n\
22+
You can enter \`/\` to see a list of quick actions. Use \`@\` to add saved prompts, files, folders, or your entire workspace as context.
23+
You are now using Q free tier.\n\
24+
`
25+
1626
export const workspaceCommand: QuickActionCommandGroup = {
1727
groupName: 'Mention code',
1828
commands: [
@@ -26,9 +36,7 @@ export const workspaceCommand: QuickActionCommandGroup = {
2636
export const commonTabData: TabTypeData = {
2737
title: 'Chat',
2838
placeholder: 'Ask a question. Use @ to add context, / for quick actions',
29-
welcome: `Hi, I'm Amazon Q. I can answer your software development questions.
30-
Ask me to explain, debug, or optimize your code.
31-
You can enter \`/\` to see a list of quick actions. Use \`@\` to add saved prompts, files, folders, or your entire workspace as context.`,
39+
welcome: qChatIntroMessage,
3240
contextCommands: [workspaceCommand],
3341
}
3442

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { ChatItemType, MynahUIDataModel, QuickActionCommandGroup } from '@aws/my
77
import { TabType } from '../storages/tabsStorage'
88
import { FollowUpGenerator } from '../followUps/generator'
99
import { QuickActionGenerator } from '../quickActions/generator'
10-
import { TabTypeDataMap } from './constants'
10+
import { qChatIntroMessageForSMUS, TabTypeDataMap } from './constants'
1111
import { agentWalkthroughDataModel } from '../walkthrough/agent'
1212
import { FeatureContext } from '../../../../shared/featureConfig'
1313

@@ -39,7 +39,12 @@ export class TabDataGenerator {
3939
this.highlightCommand = props.commandHighlight
4040
}
4141

42-
public getTabData(tabType: TabType, needWelcomeMessages: boolean, taskName?: string): MynahUIDataModel {
42+
public getTabData(
43+
tabType: TabType,
44+
needWelcomeMessages: boolean,
45+
taskName?: string,
46+
serviceName?: string
47+
): MynahUIDataModel {
4348
if (tabType === 'agentWalkthrough') {
4449
return agentWalkthroughDataModel
4550
}
@@ -48,6 +53,8 @@ export class TabDataGenerator {
4853
return {}
4954
}
5055

56+
const isSMUSProTier = serviceName ? serviceName === 'SageMakerUnifiedStudio' : false
57+
5158
const tabData: MynahUIDataModel = {
5259
tabTitle: taskName ?? TabTypeDataMap[tabType].title,
5360
promptInputInfo:
@@ -59,7 +66,7 @@ export class TabDataGenerator {
5966
? [
6067
{
6168
type: ChatItemType.ANSWER,
62-
body: TabTypeDataMap[tabType].welcome,
69+
body: isSMUSProTier ? qChatIntroMessageForSMUS : TabTypeDataMap[tabType].welcome,
6370
},
6471
{
6572
type: ChatItemType.ANSWER,

packages/core/src/codewhisperer/ui/statusBarMenu.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { Commands } from '../../shared/vscode/commands2'
3030
import { createExitButton } from '../../shared/ui/buttons'
3131
import { telemetry } from '../../shared/telemetry/telemetry'
3232
import { getLogger } from '../../shared/logger/logger'
33+
import { AmazonQState } from '../../amazonq/util/amazonQState'
3334

3435
function getAmazonQCodeWhispererNodes() {
3536
const autoTriggerEnabled = CodeSuggestionsState.instance.isSuggestionsEnabled()
@@ -92,7 +93,11 @@ export function getQuickPickItems(): DataQuickPickItem<string>[] {
9293
// Add settings and signout
9394
createSeparator(),
9495
createSettingsNode(),
95-
...(AuthUtil.instance.isConnected() && !hasVendedIamCredentials() ? [createSignout()] : []),
96+
...(AuthUtil.instance.isConnected() &&
97+
!hasVendedIamCredentials() &&
98+
!AmazonQState.instance.isSageMakerUnifiedStudio()
99+
? [createSignout()]
100+
: []),
96101
]
97102

98103
return children

packages/core/src/shared/vscode/setContext.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export type contextKey =
3737
| 'gumby.wasQCodeTransformationUsed'
3838
| 'amazonq.inline.codelensShortcutEnabled'
3939
| 'aws.toolkit.lambda.walkthroughSelected'
40+
| 'aws.amazonq.isSagemakerStudio'
4041

4142
const contextMap: Partial<Record<contextKey, any>> = {}
4243

0 commit comments

Comments
 (0)