Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
15efdd9
feat(amazonq): enable inline suggestions through flare by default (#7…
jpinkney-aws May 6, 2025
da499d5
fix(amazonq): respect suggestions enabled setting for auto trigger (#…
jpinkney-aws May 6, 2025
d91bbbb
Merge master into feature/flare-inline
aws-toolkit-automation May 6, 2025
f14533d
Merge master into feature/flare-inline
aws-toolkit-automation May 6, 2025
15ad617
Merge master into feature/flare-inline
aws-toolkit-automation May 6, 2025
d57cac5
refactor(amazonq): deprecate amazon q inline through vscode (#7237)
jpinkney-aws May 6, 2025
71040b4
Merge master into feature/flare-inline
aws-toolkit-automation May 6, 2025
c6fb67c
Merge master into feature/flare-inline
aws-toolkit-automation May 6, 2025
b7cab24
Merge master into feature/flare-inline
aws-toolkit-automation May 6, 2025
3e1614d
Merge master into feature/flare-inline
aws-toolkit-automation May 6, 2025
f114894
refactor(amazonq): deprecate codewhisperer context utils (#7241)
jpinkney-aws May 6, 2025
059a140
Merge master into feature/flare-inline
aws-toolkit-automation May 7, 2025
4a279d8
feat(amazonq): add experiment for basic e2e flow of inline chat throu…
Hweinstock May 7, 2025
86ceeba
feat(amazonq): add experiment for basic e2e flow of inline chat throu…
Hweinstock May 7, 2025
0b751ac
Merge master into feature/flare-inline
aws-toolkit-automation May 7, 2025
aeca817
refactor(amazonq): pull out all decryption logic to one place (#7248)
Hweinstock May 7, 2025
ddad4ec
Merge master into feature/flare-inline
aws-toolkit-automation May 7, 2025
858cad6
telemetry(amazonq): align flare/vscode codewhisperer_serviceInvocatio…
jpinkney-aws May 8, 2025
972d1af
Merge master into feature/flare-inline
aws-toolkit-automation May 8, 2025
8022cd3
Merge master into feature/flare-inline
aws-toolkit-automation May 8, 2025
1a728f1
Merge master into feature/flare-inline
aws-toolkit-automation May 8, 2025
bbf7b0e
feat(amazonq): re-add activeState/line trackers (#7257)
jpinkney-aws May 8, 2025
c77668d
refactor(amazonq): rename inline "generating" message class (#7267)
nkomonen-amazon May 8, 2025
4eac908
fix: Ensure we clear the "generating" inline message when done
nkomonen-amazon May 8, 2025
dd3b829
fix: show spinning icon on status bar when generating suggestion
nkomonen-amazon May 8, 2025
0d2c7fb
feat(amazonq): add tutorial trackers for lsp (#7264)
jpinkney-aws May 9, 2025
260fb37
Merge pull request #7272 from nkomonen-amazon/spinningStatusBar
jpinkney-aws May 9, 2025
7e65155
refactor(amazonq): remove local workspace indexing library
jpinkney-aws May 9, 2025
079bb52
refactor(amazonq): refactor base lsp config
jpinkney-aws May 9, 2025
6995107
telemetry(amazonq): implement codewhisperer_clientComponentLatency (#…
jpinkney-aws May 9, 2025
9a793ee
Merge pull request #7275 from jpinkney-aws/remove3
jpinkney-aws May 9, 2025
5f6ee4e
Merge pull request #7277 from jpinkney-aws/closingBrackets
jpinkney-aws May 9, 2025
4b52ff4
test(amazonq): update inline tests for flare (#7274)
jpinkney-aws May 9, 2025
0429352
fix(amazonq): debounce inline suggestion requests. (#7289)
Hweinstock May 12, 2025
2f7c3d9
refactor(amazonq): move debounce to top level. (#7292)
Hweinstock May 13, 2025
7bb3dac
Merge master into feature/flare-inline (#7261)
aws-toolkit-automation May 13, 2025
b649dbd
Merge master into feature/flare-inline (#7299)
aws-toolkit-automation May 14, 2025
692847a
test(amazonq): add tests for edge cases (#7305)
Hweinstock May 14, 2025
ffb6ec1
fix(amazonq): standardize reference type for reference log (#7311)
Hweinstock May 14, 2025
b5540e2
feat(amazonq): show a message when no suggestions are found on manual…
Hweinstock May 15, 2025
a814ee0
Merge master into feature/flare-inline (#7310)
aws-toolkit-automation May 15, 2025
2041fae
Merge branch 'feature/flare-inline' into feature/flare-mega
Hweinstock May 16, 2025
3bb3251
fix: move inlineTracker back to core
Hweinstock May 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
258 changes: 181 additions & 77 deletions package-lock.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"type": "Bug Fix",
"description": "Support chat in AL2 aarch64"
}
13 changes: 2 additions & 11 deletions packages/amazonq/src/app/chat/activation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,14 @@
import * as vscode from 'vscode'
import { ExtensionContext } from 'vscode'
import { telemetry } from 'aws-core-vscode/telemetry'
import { AuthUtil, CodeWhispererSettings } from 'aws-core-vscode/codewhisperer'
import { Commands, placeholder, funcUtil } from 'aws-core-vscode/shared'
import { AuthUtil } from 'aws-core-vscode/codewhisperer'
import { Commands, placeholder } from 'aws-core-vscode/shared'
import * as amazonq from 'aws-core-vscode/amazonq'

export async function activate(context: ExtensionContext) {
const appInitContext = amazonq.DefaultAmazonQAppInitContext.instance
await amazonq.TryChatCodeLensProvider.register(appInitContext.onDidChangeAmazonQVisibility.event)

const setupLsp = funcUtil.debounce(async () => {
void amazonq.LspController.instance.trySetupLsp(context, {
startUrl: AuthUtil.instance.connection?.startUrl,
maxIndexSize: CodeWhispererSettings.instance.getMaxIndexSize(),
isVectorIndexEnabled: false,
})
}, 5000)

context.subscriptions.push(
amazonq.focusAmazonQChatWalkthrough.register(),
amazonq.walkthroughInlineSuggestionsExample.register(),
Expand All @@ -37,7 +29,6 @@ export async function activate(context: ExtensionContext) {
void vscode.env.openExternal(vscode.Uri.parse(amazonq.amazonQHelpUrl))
})

void setupLsp()
void setupAuthNotification()
}

Expand Down
58 changes: 1 addition & 57 deletions packages/amazonq/src/app/inline/activation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,68 +6,26 @@
import vscode from 'vscode'
import {
AuthUtil,
CodeSuggestionsState,
CodeWhispererCodeCoverageTracker,
CodeWhispererConstants,
CodeWhispererSettings,
ConfigurationEntry,
DefaultCodeWhispererClient,
invokeRecommendation,
isInlineCompletionEnabled,
KeyStrokeHandler,
RecommendationHandler,
runtimeLanguageContext,
TelemetryHelper,
UserWrittenCodeTracker,
vsCodeState,
} from 'aws-core-vscode/codewhisperer'
import { Commands, getLogger, globals, sleep } from 'aws-core-vscode/shared'
import { globals, sleep } from 'aws-core-vscode/shared'

export async function activate() {
const codewhispererSettings = CodeWhispererSettings.instance
const client = new DefaultCodeWhispererClient()

if (isInlineCompletionEnabled()) {
await setSubscriptionsforInlineCompletion()
await AuthUtil.instance.setVscodeContextProps()
}

function getAutoTriggerStatus(): boolean {
return CodeSuggestionsState.instance.isSuggestionsEnabled()
}

async function getConfigEntry(): Promise<ConfigurationEntry> {
const isShowMethodsEnabled: boolean =
vscode.workspace.getConfiguration('editor').get('suggest.showMethods') || false
const isAutomatedTriggerEnabled: boolean = getAutoTriggerStatus()
const isManualTriggerEnabled: boolean = true
const isSuggestionsWithCodeReferencesEnabled = codewhispererSettings.isSuggestionsWithCodeReferencesEnabled()

// TODO:remove isManualTriggerEnabled
return {
isShowMethodsEnabled,
isManualTriggerEnabled,
isAutomatedTriggerEnabled,
isSuggestionsWithCodeReferencesEnabled,
}
}

async function setSubscriptionsforInlineCompletion() {
RecommendationHandler.instance.subscribeSuggestionCommands()

/**
* Automated trigger
*/
globals.context.subscriptions.push(
vscode.window.onDidChangeActiveTextEditor(async (editor) => {
await RecommendationHandler.instance.onEditorChange()
}),
vscode.window.onDidChangeWindowState(async (e) => {
await RecommendationHandler.instance.onFocusChange()
}),
vscode.window.onDidChangeTextEditorSelection(async (e) => {
await RecommendationHandler.instance.onCursorChange(e)
}),
vscode.workspace.onDidChangeTextDocument(async (e) => {
const editor = vscode.window.activeTextEditor
if (!editor) {
Expand All @@ -80,7 +38,6 @@ export async function activate() {
return
}

CodeWhispererCodeCoverageTracker.getTracker(e.document.languageId)?.countTotalTokens(e)
UserWrittenCodeTracker.instance.onTextDocumentChange(e)
/**
* Handle this keystroke event only when
Expand All @@ -105,19 +62,6 @@ export async function activate() {
* Then this event can be processed by our code.
*/
await sleep(CodeWhispererConstants.vsCodeCursorUpdateDelay)
if (!RecommendationHandler.instance.isSuggestionVisible()) {
await KeyStrokeHandler.instance.processKeyStroke(e, editor, client, await getConfigEntry())
}
}),
// manual trigger
Commands.register({ id: 'aws.amazonq.invokeInlineCompletion', autoconnect: true }, async () => {
invokeRecommendation(
vscode.window.activeTextEditor as vscode.TextEditor,
client,
await getConfigEntry()
).catch((e) => {
getLogger().error('invokeRecommendation failed: %s', (e as Error).message)
})
})
)
}
Expand Down
154 changes: 111 additions & 43 deletions packages/amazonq/src/app/inline/completion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@ import {
InlineCompletionContext,
InlineCompletionItem,
InlineCompletionItemProvider,
InlineCompletionList,
Position,
TextDocument,
commands,
languages,
Disposable,
window,
TextEditor,
InlineCompletionTriggerKind,
Range,
} from 'vscode'
import { LanguageClient } from 'vscode-languageclient'
import {
Expand All @@ -30,34 +31,60 @@ import {
ReferenceInlineProvider,
ReferenceLogViewProvider,
ImportAdderProvider,
CodeSuggestionsState,
vsCodeState,
inlineCompletionsDebounceDelay,
noInlineSuggestionsMsg,
LineTracker,
} from 'aws-core-vscode/codewhisperer'
import { InlineGeneratingMessage } from './inlineGeneratingMessage'
import { InlineTutorialAnnotation } from './tutorials/inlineTutorialAnnotation'
import { TelemetryHelper } from './telemetryHelper'
import { getLogger } from 'aws-core-vscode/shared'
import { debounce, messageUtils } from 'aws-core-vscode/utils'

export class InlineCompletionManager implements Disposable {
private disposable: Disposable
private inlineCompletionProvider: AmazonQInlineCompletionItemProvider
private languageClient: LanguageClient
private sessionManager: SessionManager
private recommendationService: RecommendationService
private lineTracker: LineTracker
private incomingGeneratingMessage: InlineGeneratingMessage
private inlineTutorialAnnotation: InlineTutorialAnnotation
private readonly logSessionResultMessageName = 'aws/logInlineCompletionSessionResults'

constructor(languageClient: LanguageClient) {
constructor(
languageClient: LanguageClient,
sessionManager: SessionManager,
lineTracker: LineTracker,
inlineTutorialAnnotation: InlineTutorialAnnotation
) {
this.languageClient = languageClient
this.sessionManager = new SessionManager()
this.recommendationService = new RecommendationService(this.sessionManager)
this.sessionManager = sessionManager
this.lineTracker = lineTracker
this.incomingGeneratingMessage = new InlineGeneratingMessage(this.lineTracker)
this.recommendationService = new RecommendationService(this.sessionManager, this.incomingGeneratingMessage)
this.inlineTutorialAnnotation = inlineTutorialAnnotation
this.inlineCompletionProvider = new AmazonQInlineCompletionItemProvider(
languageClient,
this.recommendationService,
this.sessionManager
this.sessionManager,
this.inlineTutorialAnnotation
)
this.disposable = languages.registerInlineCompletionItemProvider(
CodeWhispererConstants.platformLanguageIds,
this.inlineCompletionProvider
)

this.lineTracker.ready()
}

public dispose(): void {
if (this.disposable) {
this.disposable.dispose()
this.incomingGeneratingMessage.dispose()
this.lineTracker.dispose()
}
}

Expand Down Expand Up @@ -101,6 +128,7 @@ export class InlineCompletionManager implements Disposable {
if (item.mostRelevantMissingImports?.length) {
await ImportAdderProvider.instance.onAcceptRecommendation(editor, item, startLine)
}
this.sessionManager.incrementSuggestionCount()
}
commands.registerCommand('aws.amazonq.acceptInline', onInlineAcceptance)

Expand Down Expand Up @@ -145,6 +173,7 @@ export class InlineCompletionManager implements Disposable {
this.languageClient,
this.recommendationService,
this.sessionManager,
this.inlineTutorialAnnotation,
false
)
)
Expand All @@ -170,52 +199,91 @@ export class AmazonQInlineCompletionItemProvider implements InlineCompletionItem
private readonly languageClient: LanguageClient,
private readonly recommendationService: RecommendationService,
private readonly sessionManager: SessionManager,
private readonly inlineTutorialAnnotation: InlineTutorialAnnotation,
private readonly isNewSession: boolean = true
) {}

async provideInlineCompletionItems(
provideInlineCompletionItems = debounce(
this._provideInlineCompletionItems.bind(this),
inlineCompletionsDebounceDelay,
true
)

private async _provideInlineCompletionItems(
document: TextDocument,
position: Position,
context: InlineCompletionContext,
token: CancellationToken
): Promise<InlineCompletionItem[] | InlineCompletionList> {
if (this.isNewSession) {
// make service requests if it's a new session
await this.recommendationService.getAllRecommendations(
this.languageClient,
document,
position,
context,
token
)
}
// get active item from session for displaying
const items = this.sessionManager.getActiveRecommendation()
const session = this.sessionManager.getActiveSession()
if (!session || !items.length) {
return []
}
const editor = window.activeTextEditor
for (const item of items) {
item.command = {
command: 'aws.amazonq.acceptInline',
title: 'On acceptance',
arguments: [
session.sessionId,
item,
editor,
session.requestStartTime,
position.line,
session.firstCompletionDisplayLatency,
],
): Promise<InlineCompletionItem[]> {
try {
vsCodeState.isRecommendationsActive = true
if (this.isNewSession) {
const isAutoTrigger = context.triggerKind === InlineCompletionTriggerKind.Automatic
if (isAutoTrigger && !CodeSuggestionsState.instance.isSuggestionsEnabled()) {
// return early when suggestions are disabled with auto trigger
return []
}

// tell the tutorial that completions has been triggered
await this.inlineTutorialAnnotation.triggered(context.triggerKind)
TelemetryHelper.instance.setInvokeSuggestionStartTime()
TelemetryHelper.instance.setTriggerType(context.triggerKind)

// make service requests if it's a new session
await this.recommendationService.getAllRecommendations(
this.languageClient,
document,
position,
context,
token
)
}
ReferenceInlineProvider.instance.setInlineReference(
position.line,
item.insertText as string,
item.references
)
ImportAdderProvider.instance.onShowRecommendation(document, position.line, item)
// get active item from session for displaying
const items = this.sessionManager.getActiveRecommendation()
const session = this.sessionManager.getActiveSession()
const editor = window.activeTextEditor

// Show message to user when manual invoke fails to produce results.
if (items.length === 0 && context.triggerKind === InlineCompletionTriggerKind.Invoke) {
void messageUtils.showTimedMessage(noInlineSuggestionsMsg, 2000)
}

if (!session || !items.length || !editor) {
getLogger().debug(
`Failed to produce inline suggestion results. Received ${items.length} items from service`
)
return []
}

const cursorPosition = document.validatePosition(position)
for (const item of items) {
item.command = {
command: 'aws.amazonq.acceptInline',
title: 'On acceptance',
arguments: [
session.sessionId,
item,
editor,
session.requestStartTime,
cursorPosition.line,
session.firstCompletionDisplayLatency,
],
}
item.range = new Range(cursorPosition, cursorPosition)
item.insertText = typeof item.insertText === 'string' ? item.insertText : item.insertText.value
ReferenceInlineProvider.instance.setInlineReference(
cursorPosition.line,
item.insertText,
item.references
)
ImportAdderProvider.instance.onShowRecommendation(document, cursorPosition.line, item)
}
return items as InlineCompletionItem[]
} catch (e) {
getLogger('amazonqLsp').error('Failed to provide completion items: %O', e)
return []
} finally {
vsCodeState.isRecommendationsActive = false
}
return items as InlineCompletionItem[]
}
}
Loading
Loading