@@ -14,6 +14,7 @@ import { CodelensProvider } from '../codeLenses/codeLenseProvider'
1414import { PromptMessage , ReferenceLogController } from 'aws-core-vscode/codewhispererChat'
1515import { CodeWhispererSettings } from 'aws-core-vscode/codewhisperer'
1616import { UserWrittenCodeTracker } from 'aws-core-vscode/codewhisperer'
17+ import { LanguageClient } from 'vscode-languageclient'
1718import {
1819 codicon ,
1920 getIcon ,
@@ -38,8 +39,8 @@ export class InlineChatController {
3839 private userQuery : string | undefined
3940 private listeners : vscode . Disposable [ ] = [ ]
4041
41- constructor ( context : vscode . ExtensionContext ) {
42- this . inlineChatProvider = new InlineChatProvider ( )
42+ constructor ( context : vscode . ExtensionContext , client : LanguageClient , encryptionKey : Buffer ) {
43+ this . inlineChatProvider = new InlineChatProvider ( client , encryptionKey )
4344 this . inlineChatProvider . onErrorOccured ( ( ) => this . handleError ( ) )
4445 this . codeLenseProvider = new CodelensProvider ( context )
4546 this . inlineLineAnnotationController = new InlineLineAnnotationController ( context )
@@ -239,102 +240,26 @@ export class InlineChatController {
239240 tabID : uuid ,
240241 }
241242
242- const requestStart = performance . now ( )
243- let responseStartLatency : number | undefined
244-
245- const response = await this . inlineChatProvider . processPromptMessage ( message )
246- this . task . requestId = response ?. $metadata . requestId
243+ const response = await this . inlineChatProvider . processPromptMessageLSP ( message )
247244
248- // Deselect all code
249- const editor = vscode . window . activeTextEditor
250- if ( editor ) {
251- const selection = editor . selection
252- if ( ! selection . isEmpty ) {
253- const cursor = selection . active
254- const newSelection = new vscode . Selection ( cursor , cursor )
255- editor . selection = newSelection
256- }
245+ // TODO: add tests for this case.
246+ if ( ! response . body ) {
247+ getLogger ( ) . warn ( 'Empty body in inline chat response' )
248+ await this . handleError ( )
249+ return
257250 }
258251
259- if ( response ) {
260- let qSuggestedCodeResponse = ''
261- for await ( const chatEvent of response . generateAssistantResponseResponse ! ) {
262- if (
263- chatEvent . assistantResponseEvent ?. content !== undefined &&
264- chatEvent . assistantResponseEvent . content . length > 0
265- ) {
266- if ( responseStartLatency === undefined ) {
267- responseStartLatency = performance . now ( ) - requestStart
268- }
269-
270- qSuggestedCodeResponse += chatEvent . assistantResponseEvent . content
271-
272- const transformedResponse = responseTransformer ( qSuggestedCodeResponse , this . task , false )
273- if ( transformedResponse ) {
274- const textDiff = computeDiff ( transformedResponse , this . task , true )
275- const decorations = computeDecorations ( this . task )
276- this . task . decorations = decorations
277- await this . applyDiff ( this . task ! , textDiff ?? [ ] , {
278- undoStopBefore : false ,
279- undoStopAfter : false ,
280- } )
281- this . decorator . applyDecorations ( this . task )
282- this . task . previouseDiff = textDiff
283- }
284- }
285- if (
286- chatEvent . codeReferenceEvent ?. references !== undefined &&
287- chatEvent . codeReferenceEvent . references . length > 0
288- ) {
289- this . task . codeReferences = this . task . codeReferences . concat ( chatEvent . codeReferenceEvent ?. references )
290- // clear diff if user settings is off for code reference
291- if ( ! CodeWhispererSettings . instance . isSuggestionsWithCodeReferencesEnabled ( ) ) {
292- await this . rejectAllChanges ( this . task , false )
293- void vscode . window . showInformationMessage (
294- 'Your settings do not allow code generation with references.'
295- )
296- await this . updateTaskAndLenses ( this . task , TaskState . Complete )
297- return
298- }
299- }
300- if ( chatEvent . error ) {
301- getLogger ( ) . error ( 'generateAssistantResponse stream error: %s' , chatEvent . error )
302- await this . rejectAllChanges ( this . task , false )
303- void vscode . window . showErrorMessage ( `Amazon Q: ${ chatEvent . error . message } ` )
304- await this . updateTaskAndLenses ( this . task , TaskState . Complete )
305- return
306- }
307- }
308-
309- if ( this . task ) {
310- // Unclear why we need to check if task is defined, but occasionally an error occurs otherwise
311- this . task . responseStartLatency = responseStartLatency
312- this . task . responseEndLatency = performance . now ( ) - requestStart
313- }
314- getLogger ( ) . info ( `qSuggestedCodeResponse:\n${ qSuggestedCodeResponse } ` )
315- const transformedResponse = responseTransformer ( qSuggestedCodeResponse , this . task , true )
316- if ( transformedResponse ) {
317- const textDiff = computeDiff ( transformedResponse , this . task , false )
318- const decorations = computeDecorations ( this . task )
319- this . task . decorations = decorations
320- await this . applyDiff ( this . task , textDiff ?? [ ] )
321- this . decorator . applyDecorations ( this . task )
322- await this . updateTaskAndLenses ( this . task , TaskState . WaitingForDecision )
323- await setContext ( 'amazonq.inline.codelensShortcutEnabled' , true )
324- this . undoListener ( this . task )
325- } else {
326- void messages . showMessageWithCancel (
327- 'No suggestions from Q, please try different instructions.' ,
328- new Timeout ( 5000 )
329- )
330- await this . updateTaskAndLenses ( this . task , TaskState . Complete )
331- await this . inlineQuickPick ( this . userQuery )
332- await this . handleError ( )
333- }
334- }
252+ const textDiff = computeDiff ( response . body , this . task , false )
253+ const decorations = computeDecorations ( this . task )
254+ this . task . decorations = decorations
255+ await this . applyDiff ( this . task , textDiff ?? [ ] )
256+ this . decorator . applyDecorations ( this . task )
257+ await this . updateTaskAndLenses ( this . task , TaskState . WaitingForDecision )
258+ await setContext ( 'amazonq.inline.codelensShortcutEnabled' , true )
259+ this . undoListener ( this . task )
335260 }
336261
337- // TODO: remove this implementation in favor or LSP
262+ // TODO: remove this implementation in favor of LSP
338263 private async computeDiffAndRenderOnEditorLocal ( query : string ) {
339264 if ( ! this . task ) {
340265 return
0 commit comments