Skip to content
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
ba96d02
Add streaming diff animation features from bugbash branch
MarcoWang3 Jul 14, 2025
dd5e4c8
feat: streaming diff animation improvements
MarcoWang3 Jul 14, 2025
56234ce
Fix code duplication issues in streaming diff animation
MarcoWang3 Jul 14, 2025
2b5fe21
Add unit tests for diffAnimation system
MarcoWang3 Jul 14, 2025
51fddf5
feat: improve diff animation streaming functionality
MarcoWang3 Jul 21, 2025
c6f0fa4
clean redundant codes for static diff view
MarcoWang3 Aug 4, 2025
531584f
clean logs and redundant codes
MarcoWang3 Aug 4, 2025
3c4a09b
remove unnecessary changes
MarcoWang3 Aug 4, 2025
d906edf
Merge upstream/feature/code-diff into streaming diff animation branch
MarcoWang3 Aug 4, 2025
a2ced9f
remove unused types
MarcoWang3 Aug 4, 2025
1a75593
add feature flag for diffAnimation
MarcoWang3 Aug 4, 2025
2aa51a4
fix type issue and revert unnecessary file changes
MarcoWang3 Aug 4, 2025
ddacc2e
add early returns
MarcoWang3 Aug 4, 2025
62e9817
address pr comments
MarcoWang3 Aug 4, 2025
10541ca
edit the comments
MarcoWang3 Aug 4, 2025
7783a7e
fix the error handling issue
MarcoWang3 Aug 4, 2025
88bde6f
rename the temp file for animations
MarcoWang3 Aug 4, 2025
120aba1
simplify the code base
MarcoWang3 Aug 6, 2025
e389d92
Merge branch 'feature/code-diff' into feature/StreamingDiffAnimation
laileni-aws Aug 7, 2025
65fd3f8
Merge branch 'feature/code-diff' of https://github.com/aws/aws-toolki…
MarcoWang3 Aug 7, 2025
75dde78
Merge branch 'feature/StreamingDiffAnimation' of https://github.com/M…
MarcoWang3 Aug 7, 2025
a170402
address PR comments and add change logs
MarcoWang3 Aug 7, 2025
6cd3f62
fix(amazonq): refactor the code base
MarcoWang3 Aug 11, 2025
f8ece81
fix(amazonq): refactor codes
MarcoWang3 Aug 11, 2025
3301909
Merge branch 'feature/code-diff' into feature/StreamingDiffAnimation
MarcoWang3 Aug 11, 2025
4ccdc5e
Merge branch 'feature/code-diff' into feature/StreamingDiffAnimation
ashishrp-aws Aug 13, 2025
8f709cc
Merge branch 'feature/code-diff' into feature/StreamingDiffAnimation
ashishrp-aws Aug 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions packages/amazonq/src/lsp/chat/diffAnimation/diffAnimationHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/*!
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
import * as vscode from 'vscode'
import { getLogger } from 'aws-core-vscode/shared'
import { StreamingDiffController } from './streamingDiffController'

export class DiffAnimationHandler implements vscode.Disposable {
private streamingDiffController: StreamingDiffController
private streamingSessions = new Map<
string,
{ toolUseId: string; filePath: string; originalContent: string; startTime: number }
>()

constructor() {
this.streamingDiffController = new StreamingDiffController()
}

public async startStreamingDiffSession(
toolUseId: string,
filePath: string,
providedOriginalContent?: string
): Promise<void> {
try {
let originalContent = providedOriginalContent || ''

if (!providedOriginalContent) {
try {
const document = await vscode.workspace.openTextDocument(vscode.Uri.file(filePath))
originalContent = document.getText()
} catch {
originalContent = ''
}
}

this.streamingSessions.set(toolUseId, {
toolUseId,
filePath,
originalContent,
startTime: Date.now(),
})

await this.streamingDiffController.openStreamingDiffView(toolUseId, filePath, originalContent)
} catch (error) {
getLogger().error(`Failed to start streaming session for ${toolUseId}: ${error}`)
}
}

public async startStreamingWithOriginalContent(
toolUseId: string,
filePath: string,
originalContent: string
): Promise<void> {
return this.startStreamingDiffSession(toolUseId, filePath, originalContent)
}

public async streamContentUpdate(
toolUseId: string,
partialContent: string,
isFinal: boolean = false
): Promise<void> {
const session = this.streamingSessions.get(toolUseId)
if (!session) {
return
}

if (!isFinal && partialContent.trim() === '') {
return
}

try {
await this.streamingDiffController.streamContentUpdate(toolUseId, partialContent, isFinal)

if (isFinal) {
this.streamingSessions.delete(toolUseId)
}
} catch (error) {
getLogger().error(`Failed to stream content for ${toolUseId}: ${error}`)
this.streamingSessions.delete(toolUseId)
}
}

public isStreamingActive(toolUseId: string): boolean {
return this.streamingSessions.has(toolUseId) && this.streamingDiffController.isStreamingActive(toolUseId)
}

public getStreamingStats(toolUseId: string): any {
const session = this.streamingSessions.get(toolUseId)
const streamingStats = this.streamingDiffController.getStreamingStats(toolUseId)
return {
sessionExists: !!session,
sessionDuration: session ? Date.now() - session.startTime : 0,
filePath: session?.filePath,
...streamingStats,
}
}

public async dispose(): Promise<void> {
this.streamingSessions.clear()
this.streamingDiffController.dispose()
}
}
Loading
Loading