Skip to content

Commit 38a318e

Browse files
authored
Merge pull request #7500 from aws/autoMerge/feature/flare-inline
Merge master into feature/flare-inline
2 parents 76649f7 + dbb0d38 commit 38a318e

File tree

9 files changed

+469
-60
lines changed

9 files changed

+469
-60
lines changed

package-lock.json

Lines changed: 398 additions & 41 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
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 model selection feature"
4+
}

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import { window } from 'vscode'
77
import { LanguageClient } from 'vscode-languageclient'
88
import { AmazonQChatViewProvider } from './webviewProvider'
99
import { focusAmazonQPanel, registerCommands } from './commands'
10-
import { registerLanguageServerEventListener, registerMessageListeners } from './messages'
10+
import {
11+
registerActiveEditorChangeListener,
12+
registerLanguageServerEventListener,
13+
registerMessageListeners,
14+
} from './messages'
1115
import { Commands, getLogger, globals, undefinedIfEmpty } from 'aws-core-vscode/shared'
1216
import { activate as registerLegacyChatListeners } from '../../app/chat/activation'
1317
import { DefaultAmazonQAppInitContext } from 'aws-core-vscode/amazonq'
@@ -17,7 +21,7 @@ import { pushConfigUpdate } from '../config'
1721
export async function activate(languageClient: LanguageClient, encryptionKey: Buffer, mynahUIPath: string) {
1822
const disposables = globals.context.subscriptions
1923

20-
const provider = new AmazonQChatViewProvider(mynahUIPath)
24+
const provider = new AmazonQChatViewProvider(mynahUIPath, languageClient)
2125

2226
disposables.push(
2327
window.registerWebviewViewProvider(AmazonQChatViewProvider.viewType, provider, {
@@ -33,6 +37,7 @@ export async function activate(languageClient: LanguageClient, encryptionKey: Bu
3337
**/
3438
registerCommands(provider)
3539
registerLanguageServerEventListener(languageClient, provider)
40+
registerActiveEditorChangeListener(languageClient)
3641

3742
provider.onDidResolveWebview(() => {
3843
const disposable = DefaultAmazonQAppInitContext.instance.getAppsToWebViewMessageListener().onMessage((msg) => {

packages/amazonq/src/lsp/chat/messages.ts

Lines changed: 45 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,17 @@ import {
5555
ChatUpdateParams,
5656
chatOptionsUpdateType,
5757
ChatOptionsUpdateParams,
58+
listRulesRequestType,
59+
ruleClickRequestType,
60+
pinnedContextNotificationType,
61+
activeEditorChangedNotificationType,
5862
} from '@aws/language-server-runtimes/protocol'
5963
import { v4 as uuidv4 } from 'uuid'
6064
import * as vscode from 'vscode'
6165
import { Disposable, LanguageClient, Position, TextDocumentIdentifier } from 'vscode-languageclient'
6266
import { AmazonQChatViewProvider } from './webviewProvider'
63-
import { AuthUtil, CodeWhispererSettings, ReferenceLogViewProvider } from 'aws-core-vscode/codewhisperer'
64-
import { amazonQDiffScheme, AmazonQPromptSettings, messages, openUrl } from 'aws-core-vscode/shared'
67+
import { AuthUtil, ReferenceLogViewProvider } from 'aws-core-vscode/codewhisperer'
68+
import { amazonQDiffScheme, AmazonQPromptSettings, messages, openUrl, isTextEditor } from 'aws-core-vscode/shared'
6569
import {
6670
DefaultAmazonQAppInitContext,
6771
messageDispatcher,
@@ -75,6 +79,29 @@ import { decryptResponse, encryptRequest } from '../encryption'
7579
import { getCursorState } from '../utils'
7680
import { focusAmazonQPanel } from './commands'
7781

82+
export function registerActiveEditorChangeListener(languageClient: LanguageClient) {
83+
let debounceTimer: NodeJS.Timeout | undefined
84+
vscode.window.onDidChangeActiveTextEditor((editor) => {
85+
if (debounceTimer) {
86+
clearTimeout(debounceTimer)
87+
}
88+
debounceTimer = setTimeout(() => {
89+
let textDocument = undefined
90+
let cursorState = undefined
91+
if (editor) {
92+
textDocument = {
93+
uri: editor.document.uri.toString(),
94+
}
95+
cursorState = getCursorState(editor.selections)
96+
}
97+
languageClient.sendNotification(activeEditorChangedNotificationType.method, {
98+
textDocument,
99+
cursorState,
100+
})
101+
}, 100)
102+
})
103+
}
104+
78105
export function registerLanguageServerEventListener(languageClient: LanguageClient, provider: AmazonQChatViewProvider) {
79106
languageClient.info(
80107
'Language client received initializeResult from server:',
@@ -100,14 +127,6 @@ export function registerLanguageServerEventListener(languageClient: LanguageClie
100127
const telemetryName: string = e.name
101128

102129
if (telemetryName in telemetry) {
103-
switch (telemetryName) {
104-
case 'codewhisperer_serviceInvocation': {
105-
// this feature is entirely client side right now
106-
e.data.codewhispererImportRecommendationEnabled =
107-
CodeWhispererSettings.instance.isImportRecommendationEnabled()
108-
break
109-
}
110-
}
111130
languageClient.info(`[Telemetry] Emitting ${telemetryName} telemetry: ${JSON.stringify(e.data)}`)
112131
telemetry[telemetryName as keyof TelemetryBase].emit(e.data)
113132
}
@@ -301,6 +320,8 @@ export function registerMessageListeners(
301320
)
302321
break
303322
}
323+
case listRulesRequestType.method:
324+
case ruleClickRequestType.method:
304325
case listConversationsRequestType.method:
305326
case conversationClickRequestType.method:
306327
case listMcpServersRequestType.method:
@@ -456,6 +477,20 @@ export function registerMessageListeners(
456477
params: params,
457478
})
458479
})
480+
languageClient.onNotification(
481+
pinnedContextNotificationType.method,
482+
(params: ContextCommandParams & { tabId: string; textDocument?: TextDocumentIdentifier }) => {
483+
const editor = vscode.window.activeTextEditor
484+
let textDocument = undefined
485+
if (editor && isTextEditor(editor)) {
486+
textDocument = { uri: vscode.workspace.asRelativePath(editor.document.uri) }
487+
}
488+
void provider.webview?.postMessage({
489+
command: pinnedContextNotificationType.method,
490+
params: { ...params, textDocument },
491+
})
492+
}
493+
)
459494

460495
languageClient.onNotification(openFileDiffNotificationType.method, async (params: OpenFileDiffParams) => {
461496
const ecc = new EditorContentController()

packages/amazonq/src/lsp/chat/webviewProvider.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
import { AuthUtil, RegionProfile } from 'aws-core-vscode/codewhisperer'
2525
import { featureConfig } from 'aws-core-vscode/amazonq'
2626
import { getAmazonQLspConfig } from '../config'
27+
import { LanguageClient } from 'vscode-languageclient'
2728

2829
export class AmazonQChatViewProvider implements WebviewViewProvider {
2930
public static readonly viewType = 'aws.amazonq.AmazonQChatView'
@@ -36,7 +37,10 @@ export class AmazonQChatViewProvider implements WebviewViewProvider {
3637
connectorAdapterPath?: string
3738
uiPath?: string
3839

39-
constructor(private readonly mynahUIPath: string) {}
40+
constructor(
41+
private readonly mynahUIPath: string,
42+
private readonly languageClient: LanguageClient
43+
) {}
4044

4145
public async resolveWebviewView(
4246
webviewView: WebviewView,
@@ -95,6 +99,8 @@ export class AmazonQChatViewProvider implements WebviewViewProvider {
9599
const pairProgrammingAcknowledged =
96100
!AmazonQPromptSettings.instance.isPromptEnabled('amazonQChatPairProgramming')
97101
const welcomeCount = globals.globalState.tryGet('aws.amazonq.welcomeChatShowCount', Number, 0)
102+
const modelSelectionEnabled =
103+
this.languageClient.initializeResult?.awsServerCapabilities?.chatOptions?.modelSelection ?? false
98104

99105
// only show profile card when the two conditions
100106
// 1. profile count >= 2
@@ -143,14 +149,14 @@ export class AmazonQChatViewProvider implements WebviewViewProvider {
143149
const vscodeApi = acquireVsCodeApi()
144150
const hybridChatConnector = new HybridChatAdapter(${(await AuthUtil.instance.getChatAuthState()).amazonQ === 'connected'},${featureConfigData},${welcomeCount},${disclaimerAcknowledged},${regionProfileString},${disabledCommands},${isSMUS},${isSM},vscodeApi.postMessage)
145151
const commands = [hybridChatConnector.initialQuickActions[0]]
146-
qChat = amazonQChat.createChat(vscodeApi, {disclaimerAcknowledged: ${disclaimerAcknowledged}, pairProgrammingAcknowledged: ${pairProgrammingAcknowledged}, agenticMode: true, quickActionCommands: commands}, hybridChatConnector, ${JSON.stringify(featureConfigData)});
152+
qChat = amazonQChat.createChat(vscodeApi, {disclaimerAcknowledged: ${disclaimerAcknowledged}, pairProgrammingAcknowledged: ${pairProgrammingAcknowledged}, agenticMode: true, quickActionCommands: commands, modelSelectionEnabled: ${modelSelectionEnabled}}, hybridChatConnector, ${JSON.stringify(featureConfigData)});
147153
}
148154
window.addEventListener('message', (event) => {
149155
/**
150156
* special handler that "simulates" reloading the webview when a profile changes.
151157
* required because chat-client relies on initializedResult from the lsp that
152158
* are only sent once
153-
*
159+
*
154160
* References:
155161
* closing tabs: https://github.com/aws/mynah-ui/blob/de736b52f369ba885cd19f33ac86c6f57b4a3134/docs/USAGE.md#removing-a-tab-programmatically-
156162
* opening tabs: https://github.com/aws/aws-toolkit-vscode/blob/c22efa03e73b241564c8051c35761eb8620edb83/packages/amazonq/test/e2e/amazonq/framework/framework.ts#L98

packages/amazonq/src/lsp/client.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ export async function startLanguageServer(
133133
awsClientCapabilities: {
134134
q: {
135135
developerProfiles: true,
136+
pinnedContextEnabled: true,
136137
mcp: true,
137138
},
138139
window: {

packages/core/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -443,8 +443,8 @@
443443
"@aws-sdk/types": "^3.13.1",
444444
"@aws/chat-client": "^0.1.4",
445445
"@aws/chat-client-ui-types": "^0.1.24",
446-
"@aws/language-server-runtimes": "^0.2.81",
447-
"@aws/language-server-runtimes-types": "^0.1.28",
446+
"@aws/language-server-runtimes": "^0.2.97",
447+
"@aws/language-server-runtimes-types": "^0.1.39",
448448
"@cspotcode/source-map-support": "^0.8.1",
449449
"@sinonjs/fake-timers": "^10.0.2",
450450
"@types/adm-zip": "^0.4.34",
@@ -526,7 +526,7 @@
526526
"@aws-sdk/s3-request-presigner": "<3.731.0",
527527
"@aws-sdk/smithy-client": "<3.731.0",
528528
"@aws-sdk/util-arn-parser": "<3.731.0",
529-
"@aws/mynah-ui": "^4.34.1",
529+
"@aws/mynah-ui": "^4.35.4",
530530
"@gerhobbelt/gitignore-parser": "^0.2.0-9",
531531
"@iarna/toml": "^2.2.5",
532532
"@smithy/fetch-http-handler": "^5.0.1",

packages/core/src/amazonq/webview/ui/quickActions/handler.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ export class QuickActionHandler {
362362
cancelButtonWhenLoading: false,
363363
})
364364
} else {
365-
this.mynahUI.updateStore(affectedTabId, { promptInputOptions: [] })
365+
this.mynahUI.updateStore(affectedTabId, { promptInputOptions: [], promptTopBarTitle: '' })
366366
}
367367

368368
if (affectedTabId && this.isHybridChatEnabled) {

packages/core/src/shared/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export * as editorUtilities from './utilities/editorUtilities'
5454
export * as functionUtilities from './utilities/functionUtils'
5555
export * as vscodeUtilities from './utilities/vsCodeUtils'
5656
export * from './errors'
57+
export { isTextEditor } from './utilities/editorUtilities'
5758
export * as messages from './utilities/messages'
5859
export * as errors from './errors'
5960
export * as funcUtil from './utilities/functionUtils'

0 commit comments

Comments
 (0)