Skip to content
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
3096613
fix(amazonq): add back inline completion code files - part 1 (#7974)
leigaol Sep 2, 2025
ab57461
add telemetryHelper back
leigaol Sep 2, 2025
1f691a8
fix(amazonq): add telemetryHelper back (#7975)
leigaol Sep 3, 2025
fe9b128
setup activation separation
leigaol Sep 3, 2025
2663d8c
Merge branch 'feature/inline-rollback' into feature/inline-rollback
leigaol Sep 3, 2025
0102385
feat(amazonq): Add separate activation code path (#7980)
leigaol Sep 3, 2025
44c7da2
fix(amazonq): removing duplicate refreshStatusBar declare method (#7981)
atonaamz Sep 3, 2025
2887458
Merge branch 'feature/inline-rollback' into feature/inline-rollback
leigaol Sep 4, 2025
4742872
feat(amazonq): Get repomap from Flare directly (#7985)
leigaol Sep 5, 2025
9b9c384
Merge master into feature/inline-rollback
aws-toolkit-automation Sep 5, 2025
e45f2c7
fix(amazonq): Wrap repomap LSP call with try catch (#7992)
leigaol Sep 6, 2025
bf50433
fix(amazonq): fix the status bar duplication (#7995)
leigaol Sep 8, 2025
e7c4ae3
Merge master into feature/inline-rollback
aws-toolkit-automation Sep 8, 2025
604bea5
Merge master into feature/inline-rollback
aws-toolkit-automation Sep 9, 2025
77676b3
feat(amazonq): enable pre flare experiment (#7999)
andrewyuq Sep 9, 2025
038dd0c
telemetry: register onacceptance command (#8010)
Will-ShaoHua Sep 10, 2025
4537a07
test(amazonq): add back test file for telemetryHelper.ts (#8009)
atonaamz Sep 10, 2025
d973fb7
Merge master into feature/inline-rollback
aws-toolkit-automation Sep 10, 2025
8db9cf5
Merge master into feature/inline-rollback
aws-toolkit-automation Sep 10, 2025
70b6101
perf: add inline debug logs (#8017)
Will-ShaoHua Sep 10, 2025
39b60a8
Merge master into feature/inline-rollback
aws-toolkit-automation Sep 10, 2025
d39245a
test(amazonq): add back test files for inline completion codes - part…
atonaamz Sep 10, 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
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
"webpack-merge": "^5.10.0"
},
"dependencies": {
"@aws/language-server-runtimes": "^0.2.125",
"@aws/language-server-runtimes": "^0.2.128",
"@types/node": "^22.7.5",
"jaro-winkler": "^0.2.8",
"vscode-nls": "^5.2.0",
Expand Down
73 changes: 68 additions & 5 deletions packages/amazonq/src/app/inline/activation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,73 @@

import vscode from 'vscode'
import {
acceptSuggestion,
AuthUtil,
CodeSuggestionsState,
CodeWhispererCodeCoverageTracker,
CodeWhispererConstants,
CodeWhispererSettings,
ConfigurationEntry,
DefaultCodeWhispererClient,
invokeRecommendation,
isInlineCompletionEnabled,
KeyStrokeHandler,
RecommendationHandler,
runtimeLanguageContext,
TelemetryHelper,
UserWrittenCodeTracker,
vsCodeState,
} from 'aws-core-vscode/codewhisperer'
import { globals, sleep } from 'aws-core-vscode/shared'
import { Commands, getLogger, globals, sleep } from 'aws-core-vscode/shared'
import { LanguageClient } from 'vscode-languageclient'

export async function activate() {
if (isInlineCompletionEnabled()) {
// Debugging purpose: only initialize NextEditPredictionPanel when development
// NextEditPredictionPanel.getInstance()
export async function activate(languageClient: LanguageClient) {
const codewhispererSettings = CodeWhispererSettings.instance
const client = new DefaultCodeWhispererClient()

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

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(
acceptSuggestion.register(globals.context),
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 @@ -40,6 +84,7 @@ export async function activate() {
return
}

CodeWhispererCodeCoverageTracker.getTracker(e.document.languageId)?.countTotalTokens(e)
UserWrittenCodeTracker.instance.onTextDocumentChange(e)
/**
* Handle this keystroke event only when
Expand All @@ -51,6 +96,11 @@ export async function activate() {
return
}

if (vsCodeState.lastUserModificationTime) {
TelemetryHelper.instance.setTimeSinceLastModification(
performance.now() - vsCodeState.lastUserModificationTime
)
}
vsCodeState.lastUserModificationTime = performance.now()
/**
* Important: Doing this sleep(10) is to make sure
Expand All @@ -59,6 +109,19 @@ 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: Error) => {
getLogger().error('invokeRecommendation failed: %s', (e as Error).message)
})
})
)
}
Expand Down
62 changes: 38 additions & 24 deletions packages/amazonq/src/lsp/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {
import {
AuthUtil,
CodeWhispererSettings,
FeatureConfigProvider,
getSelectedCustomization,
TelemetryHelper,
vsCodeState,
Expand All @@ -45,6 +46,7 @@ import {
} from 'aws-core-vscode/shared'
import { processUtils } from 'aws-core-vscode/shared'
import { activate } from './chat/activation'
import { activate as activateInline } from '../app/inline/activation'
import { AmazonQResourcePaths } from './lspInstaller'
import { ConfigSection, isValidConfigSection, pushConfigUpdate, toAmazonQLSPLogLevel } from './config'
import { activate as activateInlineChat } from '../inlineChat/activation'
Expand Down Expand Up @@ -338,8 +340,42 @@ async function onLanguageServerReady(
// tutorial for inline chat
const inlineChatTutorialAnnotation = new InlineChatTutorialAnnotation(inlineTutorialAnnotation)

const inlineManager = new InlineCompletionManager(client, sessionManager, lineTracker, inlineTutorialAnnotation)
inlineManager.registerInlineCompletion()
const enableInlineRollback = FeatureConfigProvider.instance.getPreFlareRollbackGroup() === 'treatment'
if (enableInlineRollback) {
// use VSC inline
getLogger().info('Entering preflare logic')
await activateInline(client)
} else {
// use language server for inline completion
getLogger().info('Entering postflare logic')
const inlineManager = new InlineCompletionManager(client, sessionManager, lineTracker, inlineTutorialAnnotation)
inlineManager.registerInlineCompletion()
toDispose.push(
inlineManager,
Commands.register('aws.amazonq.showPrev', async () => {
await sessionManager.maybeRefreshSessionUx()
await vscode.commands.executeCommand('editor.action.inlineSuggest.showPrevious')
sessionManager.onPrevSuggestion()
}),
Commands.register('aws.amazonq.showNext', async () => {
await sessionManager.maybeRefreshSessionUx()
await vscode.commands.executeCommand('editor.action.inlineSuggest.showNext')
sessionManager.onNextSuggestion()
}),
// this is a workaround since handleDidShowCompletionItem is not public API
Commands.register('aws.amazonq.checkInlineSuggestionVisibility', async () => {
sessionManager.checkInlineSuggestionVisibility()
}),
Commands.register({ id: 'aws.amazonq.invokeInlineCompletion', autoconnect: true }, async () => {
vsCodeState.lastManualTriggerTime = performance.now()
await vscode.commands.executeCommand('editor.action.inlineSuggest.trigger')
}),
vscode.workspace.onDidCloseTextDocument(async () => {
await vscode.commands.executeCommand('aws.amazonq.rejectCodeSuggestion')
})
)
}

activateInlineChat(extensionContext, client, encryptionKey, inlineChatTutorialAnnotation)

if (Experiments.instance.get('amazonqChatLSP', true)) {
Expand All @@ -354,25 +390,6 @@ async function onLanguageServerReady(
await initializeLanguageServerConfiguration(client, 'startup')

toDispose.push(
inlineManager,
Commands.register('aws.amazonq.showPrev', async () => {
await sessionManager.maybeRefreshSessionUx()
await vscode.commands.executeCommand('editor.action.inlineSuggest.showPrevious')
sessionManager.onPrevSuggestion()
}),
Commands.register('aws.amazonq.showNext', async () => {
await sessionManager.maybeRefreshSessionUx()
await vscode.commands.executeCommand('editor.action.inlineSuggest.showNext')
sessionManager.onNextSuggestion()
}),
// this is a workaround since handleDidShowCompletionItem is not public API
Commands.register('aws.amazonq.checkInlineSuggestionVisibility', async () => {
sessionManager.checkInlineSuggestionVisibility()
}),
Commands.register({ id: 'aws.amazonq.invokeInlineCompletion', autoconnect: true }, async () => {
vsCodeState.lastManualTriggerTime = performance.now()
await vscode.commands.executeCommand('editor.action.inlineSuggest.trigger')
}),
Commands.register('aws.amazonq.refreshAnnotation', async (forceProceed: boolean) => {
telemetry.record({
traceId: TelemetryHelper.instance.traceId,
Expand All @@ -398,9 +415,6 @@ async function onLanguageServerReady(
getLogger().debug(`codewhisperer: user dismiss tutorial.`)
}
}),
vscode.workspace.onDidCloseTextDocument(async () => {
await vscode.commands.executeCommand('aws.amazonq.rejectCodeSuggestion')
}),
AuthUtil.instance.auth.onDidChangeActiveConnection(async () => {
await auth.refreshConnection()
}),
Expand Down
Loading
Loading