@@ -69,6 +69,7 @@ import {
6969} from '@aws/language-server-runtimes/protocol'
7070import { v4 as uuidv4 } from 'uuid'
7171import * as vscode from 'vscode'
72+ import * as path from 'path'
7273import { Disposable , LanguageClient , Position , TextDocumentIdentifier } from 'vscode-languageclient'
7374import { AmazonQChatViewProvider } from './webviewProvider'
7475import {
@@ -81,22 +82,8 @@ import {
8182 SecurityIssueTreeViewProvider ,
8283 CodeWhispererConstants ,
8384} from 'aws-core-vscode/codewhisperer'
84- import {
85- amazonQDiffScheme ,
86- AmazonQPromptSettings ,
87- messages ,
88- openUrl ,
89- isTextEditor ,
90- globals ,
91- setContext ,
92- } from 'aws-core-vscode/shared'
93- import {
94- DefaultAmazonQAppInitContext ,
95- messageDispatcher ,
96- EditorContentController ,
97- ViewDiffMessage ,
98- referenceLogText ,
99- } from 'aws-core-vscode/amazonq'
85+ import { AmazonQPromptSettings , messages , openUrl , isTextEditor , globals , setContext } from 'aws-core-vscode/shared'
86+ import { DefaultAmazonQAppInitContext , messageDispatcher , referenceLogText } from 'aws-core-vscode/amazonq'
10087import { telemetry } from 'aws-core-vscode/telemetry'
10188import { isValidResponseError } from './error'
10289import { decryptResponse , encryptRequest } from '../encryption'
@@ -664,31 +651,42 @@ export function registerMessageListeners(
664651 )
665652
666653 languageClient . onNotification ( openFileDiffNotificationType . method , async ( params : OpenFileDiffParams ) => {
667- const ecc = new EditorContentController ( )
668- const uri = params . originalFileUri
669- const doc = await vscode . workspace . openTextDocument ( uri )
670- const entireDocumentSelection = new vscode . Selection (
671- new vscode . Position ( 0 , 0 ) ,
672- new vscode . Position ( doc . lineCount - 1 , doc . lineAt ( doc . lineCount - 1 ) . text . length )
673- )
674- const viewDiffMessage : ViewDiffMessage = {
675- context : {
676- activeFileContext : {
677- filePath : params . originalFileUri ,
678- fileText : params . originalFileContent ?? '' ,
679- fileLanguage : undefined ,
680- matchPolicy : undefined ,
681- } ,
682- focusAreaContext : {
683- selectionInsideExtendedCodeBlock : entireDocumentSelection ,
684- codeBlock : '' ,
685- extendedCodeBlock : '' ,
686- names : undefined ,
687- } ,
688- } ,
689- code : params . fileContent ?? '' ,
654+ const currentFileUri = vscode . Uri . parse ( params . originalFileUri )
655+ const originalContent = params . originalFileContent ?? ''
656+ const fileName = path . basename ( currentFileUri . fsPath )
657+
658+ // Use custom scheme to avoid adding to recent files
659+ const originalFileUri = vscode . Uri . parse ( `amazonq-diff:${ fileName } _original_${ Date . now ( ) } ` )
660+
661+ // Register content provider for the custom scheme
662+ const disposable = vscode . workspace . registerTextDocumentContentProvider ( 'amazonq-diff' , {
663+ provideTextDocumentContent : ( ) => originalContent ,
664+ } )
665+
666+ try {
667+ // Open diff view with custom scheme URI (left) vs current file (right)
668+ await vscode . commands . executeCommand (
669+ 'vscode.diff' ,
670+ originalFileUri ,
671+ currentFileUri ,
672+ `${ vscode . workspace . asRelativePath ( currentFileUri ) } (Original ↔ Current, Editable)` ,
673+ { preview : false }
674+ )
675+
676+ // Clean up content provider when diff view is closed
677+ const cleanupDisposable = vscode . window . onDidChangeVisibleTextEditors ( ( ) => {
678+ const isDiffViewOpen = vscode . window . visibleTextEditors . some (
679+ ( editor ) => editor . document . uri . toString ( ) === originalFileUri . toString ( )
680+ )
681+ if ( ! isDiffViewOpen ) {
682+ disposable . dispose ( )
683+ cleanupDisposable . dispose ( )
684+ }
685+ } )
686+ } catch ( error ) {
687+ disposable . dispose ( )
688+ languageClient . error ( `[VSCode Client] Failed to open diff view: ${ error } ` )
690689 }
691- await ecc . viewDiff ( viewDiffMessage , amazonQDiffScheme )
692690 } )
693691
694692 languageClient . onNotification ( chatUpdateNotificationType . method , ( params : ChatUpdateParams ) => {
0 commit comments