@@ -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'
@@ -696,31 +683,42 @@ export function registerMessageListeners(
696683 )
697684
698685 languageClient . onNotification ( openFileDiffNotificationType . method , async ( params : OpenFileDiffParams ) => {
699- const ecc = new EditorContentController ( )
700- const uri = params . originalFileUri
701- const doc = await vscode . workspace . openTextDocument ( uri )
702- const entireDocumentSelection = new vscode . Selection (
703- new vscode . Position ( 0 , 0 ) ,
704- new vscode . Position ( doc . lineCount - 1 , doc . lineAt ( doc . lineCount - 1 ) . text . length )
705- )
706- const viewDiffMessage : ViewDiffMessage = {
707- context : {
708- activeFileContext : {
709- filePath : params . originalFileUri ,
710- fileText : params . originalFileContent ?? '' ,
711- fileLanguage : undefined ,
712- matchPolicy : undefined ,
713- } ,
714- focusAreaContext : {
715- selectionInsideExtendedCodeBlock : entireDocumentSelection ,
716- codeBlock : '' ,
717- extendedCodeBlock : '' ,
718- names : undefined ,
719- } ,
720- } ,
721- code : params . fileContent ?? '' ,
686+ const currentFileUri = vscode . Uri . parse ( params . originalFileUri )
687+ const originalContent = params . originalFileContent ?? ''
688+ const fileName = path . basename ( currentFileUri . fsPath )
689+
690+ // Use custom scheme to avoid adding to recent files
691+ const originalFileUri = vscode . Uri . parse ( `amazonq-diff:${ fileName } _original_${ Date . now ( ) } ` )
692+
693+ // Register content provider for the custom scheme
694+ const disposable = vscode . workspace . registerTextDocumentContentProvider ( 'amazonq-diff' , {
695+ provideTextDocumentContent : ( ) => originalContent ,
696+ } )
697+
698+ try {
699+ // Open diff view with custom scheme URI (left) vs current file (right)
700+ await vscode . commands . executeCommand (
701+ 'vscode.diff' ,
702+ originalFileUri ,
703+ currentFileUri ,
704+ `${ vscode . workspace . asRelativePath ( currentFileUri ) } (Original ↔ Current, Editable)` ,
705+ { preview : false }
706+ )
707+
708+ // Clean up content provider when diff view is closed
709+ const cleanupDisposable = vscode . window . onDidChangeVisibleTextEditors ( ( ) => {
710+ const isDiffViewOpen = vscode . window . visibleTextEditors . some (
711+ ( editor ) => editor . document . uri . toString ( ) === originalFileUri . toString ( )
712+ )
713+ if ( ! isDiffViewOpen ) {
714+ disposable . dispose ( )
715+ cleanupDisposable . dispose ( )
716+ }
717+ } )
718+ } catch ( error ) {
719+ disposable . dispose ( )
720+ languageClient . error ( `[VSCode Client] Failed to open diff view: ${ error } ` )
722721 }
723- await ecc . viewDiff ( viewDiffMessage , amazonQDiffScheme )
724722 } )
725723
726724 languageClient . onNotification ( chatUpdateNotificationType . method , async ( params : ChatUpdateParams ) => {
0 commit comments