From 6290c11d3ead376f37f399e5fa0bef0bd3fdd2ba Mon Sep 17 00:00:00 2001 From: Thomas Brugman Date: Tue, 14 Apr 2026 15:52:24 +0200 Subject: [PATCH] feat(agent-manager): jump to changed line when clicking line number in diff (#8866) * feat(agent-manager): jump to changed line when clicking line number in diff When clicking a line number in the diff review panel (DiffPanel or FullScreenDiffView), open the file in the editor at that exact line instead of always landing on line 1. Closes #6076 Co-Authored-By: Claude Sonnet 4.6 * style: fix prettier formatting in AgentManagerApp Co-Authored-By: Claude Sonnet 4.6 --------- Co-authored-by: Claude Sonnet 4.6 --- .../webview-ui/agent-manager/AgentManagerApp.tsx | 13 +++++++------ .../webview-ui/agent-manager/DiffPanel.tsx | 6 +++++- .../webview-ui/agent-manager/FullScreenDiffView.tsx | 6 +++++- packages/ui/src/pierre/index.ts | 2 +- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx index 12477b8ca69..3d9088a1e2f 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx @@ -3016,10 +3016,11 @@ const AgentManagerContent: Component = () => { onClose={() => setSidePanel(null)} onExpand={selection() !== null ? openReviewTab : undefined} onRequestDiff={requestDiffFile} - onOpenFile={(file) => { + onOpenFile={(file, line) => { const id = currentDiffSessionId() - if (id) vscode.postMessage({ type: "agentManager.openFile", sessionId: id, filePath: file }) - else if (selection() === LOCAL) vscode.postMessage({ type: "openFile", filePath: file }) + if (id) + vscode.postMessage({ type: "agentManager.openFile", sessionId: id, filePath: file, line }) + else if (selection() === LOCAL) vscode.postMessage({ type: "openFile", filePath: file, line }) }} onRevertFile={revertCtl.revert} revertingFiles={revertCtl.reverting()} @@ -3044,10 +3045,10 @@ const AgentManagerContent: Component = () => { diffStyle={reviewDiffStyle()} onDiffStyleChange={setSharedDiffStyle} onRequestDiff={requestDiffFile} - onOpenFile={(file) => { + onOpenFile={(file, line) => { const id = currentDiffSessionId() - if (id) vscode.postMessage({ type: "agentManager.openFile", sessionId: id, filePath: file }) - else if (selection() === LOCAL) vscode.postMessage({ type: "openFile", filePath: file }) + if (id) vscode.postMessage({ type: "agentManager.openFile", sessionId: id, filePath: file, line }) + else if (selection() === LOCAL) vscode.postMessage({ type: "openFile", filePath: file, line }) }} onRevertFile={revertCtl.revert} revertingFiles={revertCtl.reverting()} diff --git a/packages/kilo-vscode/webview-ui/agent-manager/DiffPanel.tsx b/packages/kilo-vscode/webview-ui/agent-manager/DiffPanel.tsx index 7096adabb51..9588831f47a 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/DiffPanel.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/DiffPanel.tsx @@ -40,7 +40,7 @@ interface DiffPanelProps { onClose: () => void onExpand?: () => void onRequestDiff?: (file: string) => void - onOpenFile?: (relativePath: string) => void + onOpenFile?: (relativePath: string, line?: number) => void onRevertFile?: (file: string) => void revertingFiles?: Set } @@ -520,6 +520,10 @@ export const DiffPanel: Component = (props) => { renderAnnotation={buildAnnotation} enableGutterUtility={true} onGutterUtilityClick={(result) => handleGutterClick(diff.file, result)} + onLineNumberClick={(event) => { + if (event.annotationSide === "deletions") return + props.onOpenFile?.(diff.file, event.lineNumber) + }} /> diff --git a/packages/kilo-vscode/webview-ui/agent-manager/FullScreenDiffView.tsx b/packages/kilo-vscode/webview-ui/agent-manager/FullScreenDiffView.tsx index f00410e0905..d43797d2ef9 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/FullScreenDiffView.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/FullScreenDiffView.tsx @@ -40,7 +40,7 @@ interface FullScreenDiffViewProps { diffStyle: DiffStyle onDiffStyleChange: (style: DiffStyle) => void onRequestDiff?: (file: string) => void - onOpenFile?: (relativePath: string) => void + onOpenFile?: (relativePath: string, line?: number) => void onRevertFile?: (file: string) => void revertingFiles?: Set onClose: () => void @@ -596,6 +596,10 @@ export const FullScreenDiffView: Component = (props) => renderAnnotation={buildAnnotation} enableGutterUtility={true} onGutterUtilityClick={(result) => handleGutterClick(diff.file, result)} + onLineNumberClick={(event) => { + if (event.annotationSide === "deletions") return + props.onOpenFile?.(diff.file, event.lineNumber) + }} /> diff --git a/packages/ui/src/pierre/index.ts b/packages/ui/src/pierre/index.ts index 1977f23f59f..9caee11a415 100644 --- a/packages/ui/src/pierre/index.ts +++ b/packages/ui/src/pierre/index.ts @@ -143,7 +143,7 @@ const unsafeCSS = ` } &[data-interactive-line-numbers] [data-column-number] { - cursor: default !important; + cursor: pointer !important; } &[data-interactive-lines] [data-line] {