Skip to content

Commit 01850cd

Browse files
authored
fix(amazonq): deprecate Q inline suggestion thinking message UI (#7617)
## Problem It's confusing when Q is saying it's thinking however sometimes the model returns empty suggestion thus nothing will be displayed to users. Thus the team decides to remove the UI. ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 7c8764c commit 01850cd

File tree

6 files changed

+9
-156
lines changed

6 files changed

+9
-156
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Removal",
3+
"description": "Deprecate \"amazon q is generating...\" UI for inline suggestion"
4+
}

packages/amazonq/src/app/inline/completion.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import {
3636
noInlineSuggestionsMsg,
3737
ReferenceInlineProvider,
3838
} from 'aws-core-vscode/codewhisperer'
39-
import { InlineGeneratingMessage } from './inlineGeneratingMessage'
4039
import { LineTracker } from './stateTracker/lineTracker'
4140
import { InlineTutorialAnnotation } from './tutorials/inlineTutorialAnnotation'
4241
import { TelemetryHelper } from './telemetryHelper'
@@ -55,7 +54,7 @@ export class InlineCompletionManager implements Disposable {
5554
private sessionManager: SessionManager
5655
private recommendationService: RecommendationService
5756
private lineTracker: LineTracker
58-
private incomingGeneratingMessage: InlineGeneratingMessage
57+
5958
private inlineTutorialAnnotation: InlineTutorialAnnotation
6059
private readonly logSessionResultMessageName = 'aws/logInlineCompletionSessionResults'
6160
private documentChangeListener: Disposable
@@ -70,12 +69,7 @@ export class InlineCompletionManager implements Disposable {
7069
this.languageClient = languageClient
7170
this.sessionManager = sessionManager
7271
this.lineTracker = lineTracker
73-
this.incomingGeneratingMessage = new InlineGeneratingMessage(this.lineTracker)
74-
this.recommendationService = new RecommendationService(
75-
this.sessionManager,
76-
this.incomingGeneratingMessage,
77-
cursorUpdateRecorder
78-
)
72+
this.recommendationService = new RecommendationService(this.sessionManager, cursorUpdateRecorder)
7973
this.inlineTutorialAnnotation = inlineTutorialAnnotation
8074
this.inlineCompletionProvider = new AmazonQInlineCompletionItemProvider(
8175
languageClient,
@@ -105,7 +99,6 @@ export class InlineCompletionManager implements Disposable {
10599
public dispose(): void {
106100
if (this.disposable) {
107101
this.disposable.dispose()
108-
this.incomingGeneratingMessage.dispose()
109102
this.lineTracker.dispose()
110103
}
111104
if (this.documentChangeListener) {

packages/amazonq/src/app/inline/inlineGeneratingMessage.ts

Lines changed: 0 additions & 98 deletions
This file was deleted.

packages/amazonq/src/app/inline/recommendationService.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
import { CancellationToken, InlineCompletionContext, Position, TextDocument } from 'vscode'
1212
import { LanguageClient } from 'vscode-languageclient'
1313
import { SessionManager } from './sessionManager'
14-
import { InlineGeneratingMessage } from './inlineGeneratingMessage'
1514
import { AuthUtil, CodeWhispererStatusBarManager } from 'aws-core-vscode/codewhisperer'
1615
import { TelemetryHelper } from './telemetryHelper'
1716
import { ICursorUpdateRecorder } from './cursorUpdateManager'
@@ -26,7 +25,6 @@ export interface GetAllRecommendationsOptions {
2625
export class RecommendationService {
2726
constructor(
2827
private readonly sessionManager: SessionManager,
29-
private readonly inlineGeneratingMessage: InlineGeneratingMessage,
3028
private cursorUpdateRecorder?: ICursorUpdateRecorder
3129
) {}
3230
/**
@@ -69,7 +67,6 @@ export class RecommendationService {
6967
try {
7068
// Show UI indicators only if UI is enabled
7169
if (options.showUi) {
72-
await this.inlineGeneratingMessage.showGenerating(context.triggerKind)
7370
await statusBar.setLoading()
7471
}
7572

@@ -165,7 +162,6 @@ export class RecommendationService {
165162
} finally {
166163
// Remove all UI indicators if UI is enabled
167164
if (options.showUi) {
168-
this.inlineGeneratingMessage.hideGenerating()
169165
void statusBar.refreshStatusBar() // effectively "stop loading"
170166
}
171167
}

packages/amazonq/test/unit/amazonq/apps/inline/completion.test.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import {
2626
ReferenceLogViewProvider,
2727
vsCodeState,
2828
} from 'aws-core-vscode/codewhisperer'
29-
import { InlineGeneratingMessage } from '../../../../../src/app/inline/inlineGeneratingMessage'
3029
import { LineTracker } from '../../../../../src/app/inline/stateTracker/lineTracker'
3130
import { InlineTutorialAnnotation } from '../../../../../src/app/inline/tutorials/inlineTutorialAnnotation'
3231

@@ -247,9 +246,8 @@ describe('InlineCompletionManager', () => {
247246

248247
beforeEach(() => {
249248
const lineTracker = new LineTracker()
250-
const activeStateController = new InlineGeneratingMessage(lineTracker)
251249
inlineTutorialAnnotation = new InlineTutorialAnnotation(lineTracker, mockSessionManager)
252-
recommendationService = new RecommendationService(mockSessionManager, activeStateController)
250+
recommendationService = new RecommendationService(mockSessionManager)
253251
vsCodeState.isRecommendationsActive = false
254252
mockSessionManager = {
255253
getActiveSession: getActiveSessionStub,

packages/amazonq/test/unit/amazonq/apps/inline/recommendationService.test.ts

Lines changed: 2 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import assert from 'assert'
1010
import { RecommendationService } from '../../../../../src/app/inline/recommendationService'
1111
import { SessionManager } from '../../../../../src/app/inline/sessionManager'
1212
import { createMockDocument } from 'aws-core-vscode/test'
13-
import { LineTracker } from '../../../../../src/app/inline/stateTracker/lineTracker'
14-
import { InlineGeneratingMessage } from '../../../../../src/app/inline/inlineGeneratingMessage'
1513
// Import CursorUpdateManager directly instead of the interface
1614
import { CursorUpdateManager } from '../../../../../src/app/inline/cursorUpdateManager'
1715
import { CodeWhispererStatusBarManager } from 'aws-core-vscode/codewhisperer'
@@ -22,8 +20,6 @@ describe('RecommendationService', () => {
2220
let sendRequestStub: sinon.SinonStub
2321
let sandbox: sinon.SinonSandbox
2422
let sessionManager: SessionManager
25-
let lineTracker: LineTracker
26-
let activeStateController: InlineGeneratingMessage
2723
let service: RecommendationService
2824
let cursorUpdateManager: CursorUpdateManager
2925
let statusBarStub: any
@@ -69,8 +65,6 @@ describe('RecommendationService', () => {
6965
} as unknown as LanguageClient
7066

7167
sessionManager = new SessionManager()
72-
lineTracker = new LineTracker()
73-
activeStateController = new InlineGeneratingMessage(lineTracker)
7468

7569
// Create cursor update manager mock
7670
cursorUpdateManager = {
@@ -94,7 +88,7 @@ describe('RecommendationService', () => {
9488
sandbox.stub(CodeWhispererStatusBarManager, 'instance').get(() => statusBarStub)
9589

9690
// Create the service without cursor update recorder initially
97-
service = new RecommendationService(sessionManager, activeStateController)
91+
service = new RecommendationService(sessionManager)
9892
})
9993

10094
afterEach(() => {
@@ -104,11 +98,7 @@ describe('RecommendationService', () => {
10498

10599
describe('constructor', () => {
106100
it('should initialize with optional cursorUpdateRecorder', () => {
107-
const serviceWithRecorder = new RecommendationService(
108-
sessionManager,
109-
activeStateController,
110-
cursorUpdateManager
111-
)
101+
const serviceWithRecorder = new RecommendationService(sessionManager, cursorUpdateManager)
112102

113103
// Verify the service was created with the recorder
114104
assert.strictEqual(serviceWithRecorder['cursorUpdateRecorder'], cursorUpdateManager)
@@ -232,26 +222,7 @@ describe('RecommendationService', () => {
232222
sinon.assert.calledOnce(cursorUpdateManager.recordCompletionRequest as sinon.SinonStub)
233223
})
234224

235-
// Helper function to setup UI test
236-
function setupUITest() {
237-
const mockFirstResult = {
238-
sessionId: 'test-session',
239-
items: [mockInlineCompletionItemOne],
240-
partialResultToken: undefined,
241-
}
242-
243-
sendRequestStub.resolves(mockFirstResult)
244-
245-
// Spy on the UI methods
246-
const showGeneratingStub = sandbox.stub(activeStateController, 'showGenerating').resolves()
247-
const hideGeneratingStub = sandbox.stub(activeStateController, 'hideGenerating')
248-
249-
return { showGeneratingStub, hideGeneratingStub }
250-
}
251-
252225
it('should not show UI indicators when showUi option is false', async () => {
253-
const { showGeneratingStub, hideGeneratingStub } = setupUITest()
254-
255226
// Call with showUi: false option
256227
await service.getAllRecommendations(
257228
languageClient,
@@ -267,15 +238,11 @@ describe('RecommendationService', () => {
267238
)
268239

269240
// Verify UI methods were not called
270-
sinon.assert.notCalled(showGeneratingStub)
271-
sinon.assert.notCalled(hideGeneratingStub)
272241
sinon.assert.notCalled(statusBarStub.setLoading)
273242
sinon.assert.notCalled(statusBarStub.refreshStatusBar)
274243
})
275244

276245
it('should show UI indicators when showUi option is true (default)', async () => {
277-
const { showGeneratingStub, hideGeneratingStub } = setupUITest()
278-
279246
// Call with default options (showUi: true)
280247
await service.getAllRecommendations(
281248
languageClient,
@@ -287,8 +254,6 @@ describe('RecommendationService', () => {
287254
)
288255

289256
// Verify UI methods were called
290-
sinon.assert.calledOnce(showGeneratingStub)
291-
sinon.assert.calledOnce(hideGeneratingStub)
292257
sinon.assert.calledOnce(statusBarStub.setLoading)
293258
sinon.assert.calledOnce(statusBarStub.refreshStatusBar)
294259
})
@@ -304,10 +269,6 @@ describe('RecommendationService', () => {
304269
// Set up UI options
305270
const options = { showUi: true }
306271

307-
// Stub the UI methods to avoid errors
308-
// const showGeneratingStub = sandbox.stub(activeStateController, 'showGenerating').resolves()
309-
const hideGeneratingStub = sandbox.stub(activeStateController, 'hideGenerating')
310-
311272
// Temporarily replace console.error with a no-op function to prevent test failure
312273
const originalConsoleError = console.error
313274
console.error = () => {}
@@ -328,7 +289,6 @@ describe('RecommendationService', () => {
328289
assert.deepStrictEqual(result, [])
329290

330291
// Verify the UI indicators were hidden even when an error occurs
331-
sinon.assert.calledOnce(hideGeneratingStub)
332292
sinon.assert.calledOnce(statusBarStub.refreshStatusBar)
333293
} finally {
334294
// Restore the original console.error function

0 commit comments

Comments
 (0)