diff --git a/packages/amazonq/src/lsp/chat/messages.ts b/packages/amazonq/src/lsp/chat/messages.ts index 16965e2f41f..7460e6b9fb7 100644 --- a/packages/amazonq/src/lsp/chat/messages.ts +++ b/packages/amazonq/src/lsp/chat/messages.ts @@ -69,6 +69,7 @@ import { } from '@aws/language-server-runtimes/protocol' import { v4 as uuidv4 } from 'uuid' import * as vscode from 'vscode' +import * as path from 'path' import { Disposable, LanguageClient, Position, TextDocumentIdentifier } from 'vscode-languageclient' import { AmazonQChatViewProvider } from './webviewProvider' import { @@ -81,22 +82,8 @@ import { SecurityIssueTreeViewProvider, CodeWhispererConstants, } from 'aws-core-vscode/codewhisperer' -import { - amazonQDiffScheme, - AmazonQPromptSettings, - messages, - openUrl, - isTextEditor, - globals, - setContext, -} from 'aws-core-vscode/shared' -import { - DefaultAmazonQAppInitContext, - messageDispatcher, - EditorContentController, - ViewDiffMessage, - referenceLogText, -} from 'aws-core-vscode/amazonq' +import { AmazonQPromptSettings, messages, openUrl, isTextEditor, globals, setContext } from 'aws-core-vscode/shared' +import { DefaultAmazonQAppInitContext, messageDispatcher, referenceLogText } from 'aws-core-vscode/amazonq' import { telemetry } from 'aws-core-vscode/telemetry' import { isValidResponseError } from './error' import { decryptResponse, encryptRequest } from '../encryption' @@ -664,31 +651,42 @@ export function registerMessageListeners( ) languageClient.onNotification(openFileDiffNotificationType.method, async (params: OpenFileDiffParams) => { - const ecc = new EditorContentController() - const uri = params.originalFileUri - const doc = await vscode.workspace.openTextDocument(uri) - const entireDocumentSelection = new vscode.Selection( - new vscode.Position(0, 0), - new vscode.Position(doc.lineCount - 1, doc.lineAt(doc.lineCount - 1).text.length) - ) - const viewDiffMessage: ViewDiffMessage = { - context: { - activeFileContext: { - filePath: params.originalFileUri, - fileText: params.originalFileContent ?? '', - fileLanguage: undefined, - matchPolicy: undefined, - }, - focusAreaContext: { - selectionInsideExtendedCodeBlock: entireDocumentSelection, - codeBlock: '', - extendedCodeBlock: '', - names: undefined, - }, - }, - code: params.fileContent ?? '', + const currentFileUri = vscode.Uri.parse(params.originalFileUri) + const originalContent = params.originalFileContent ?? '' + const fileName = path.basename(currentFileUri.fsPath) + + // Use custom scheme to avoid adding to recent files + const originalFileUri = vscode.Uri.parse(`amazonq-diff:${fileName}_original_${Date.now()}`) + + // Register content provider for the custom scheme + const disposable = vscode.workspace.registerTextDocumentContentProvider('amazonq-diff', { + provideTextDocumentContent: () => originalContent, + }) + + try { + // Open diff view with custom scheme URI (left) vs current file (right) + await vscode.commands.executeCommand( + 'vscode.diff', + originalFileUri, + currentFileUri, + `${vscode.workspace.asRelativePath(currentFileUri)} (Original ↔ Current, Editable)`, + { preview: false } + ) + + // Clean up content provider when diff view is closed + const cleanupDisposable = vscode.window.onDidChangeVisibleTextEditors(() => { + const isDiffViewOpen = vscode.window.visibleTextEditors.some( + (editor) => editor.document.uri.toString() === originalFileUri.toString() + ) + if (!isDiffViewOpen) { + disposable.dispose() + cleanupDisposable.dispose() + } + }) + } catch (error) { + disposable.dispose() + languageClient.error(`[VSCode Client] Failed to open diff view: ${error}`) } - await ecc.viewDiff(viewDiffMessage, amazonQDiffScheme) }) languageClient.onNotification(chatUpdateNotificationType.method, (params: ChatUpdateParams) => {