From de92b8fef4340182418d445c3e164e63d7004e7e Mon Sep 17 00:00:00 2001 From: Ibrahim Khan <2005ibrahimkhan@gmail.com> Date: Fri, 10 Jul 2026 06:39:55 -0700 Subject: [PATCH] fix(vscode): keep relative path in selection attachment filename (#1923) The "Add to Context" command and the active-editor pin-selection suggestion both create selection attachments but used the basename only (e.g. assist.ts:47). OpenCode synthesizes its Read call from that filename, so the directory was lost and the model could read or edit the wrong file when names collide. Use the workspace-relative path (asRelativePath(uri, false)) in both paths so the filename carries the directory and the two paths produce identical filenames, restoring attachment dedup. Fixes #1914 --- packages/ui/src/components/chat/FileAttachment.tsx | 2 +- packages/vscode/src/extension.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/ui/src/components/chat/FileAttachment.tsx b/packages/ui/src/components/chat/FileAttachment.tsx index 5949164f..158a78f8 100644 --- a/packages/ui/src/components/chat/FileAttachment.tsx +++ b/packages/ui/src/components/chat/FileAttachment.tsx @@ -471,7 +471,7 @@ export const ActiveEditorFileSuggestion = memo(() => { ? `${selection.startLine}` : `${selection.startLine}-${selection.endLine}` } - const selectionLabel = selection ? `${fileName}:${selectionRange}` : '' + const selectionLabel = selection ? `${relativePath}:${selectionRange}` : '' const isSelectionAttached = !!selectionLabel && attachedFiles.some( (f) => f.source === 'vscode' && f.vscodeSource === 'selection' && f.filename === selectionLabel && f.vscodePath === filePath ) diff --git a/packages/vscode/src/extension.ts b/packages/vscode/src/extension.ts index 1fd80b94..8fbdec8c 100644 --- a/packages/vscode/src/extension.ts +++ b/packages/vscode/src/extension.ts @@ -297,13 +297,14 @@ export async function activate(context: vscode.ExtensionContext) { } // Get file info for context - const filePath = vscode.workspace.asRelativePath(editor.document.uri); + // false matches the relativePath broadcast for the active editor, so this attachment dedupes against the pin-selection suggestion. + const filePath = vscode.workspace.asRelativePath(editor.document.uri, false); // Get line numbers (1-based for display) const startLine = selection.start.line + 1; const endLine = selection.end.line + 1; const lineRange = startLine === endLine ? `${startLine}` : `${startLine}-${endLine}`; - const filename = `${editor.document.fileName.split(/[\\/]/).pop() || filePath}:${lineRange}`; + const filename = `${filePath}:${lineRange}`; const contextSelection = { filePath: editor.document.uri.fsPath, filename,