From bf7fd366940541a5b246742cc1b33ff5911d4544 Mon Sep 17 00:00:00 2001 From: moehaje Date: Wed, 14 Jan 2026 21:30:23 +0100 Subject: [PATCH] feat: filter @ suggestions for mentioned files Filter @ suggestions to exclude files already mentioned in the prompt text. --- src/hooks/useComposerAutocompleteState.ts | 27 ++++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/hooks/useComposerAutocompleteState.ts b/src/hooks/useComposerAutocompleteState.ts index 8aa8a3444..a43a51d55 100644 --- a/src/hooks/useComposerAutocompleteState.ts +++ b/src/hooks/useComposerAutocompleteState.ts @@ -22,6 +22,19 @@ type UseComposerAutocompleteStateArgs = { setSelectionStart: (next: number | null) => void; }; +function textIncludesFile(text: string, path: string) { + if (!text || !path) { + return false; + } + const escaped = path.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const pattern = new RegExp( + "(^|[\\s\"'`(\\[\\{]|@)" + + escaped + + "(?=$|[\\s\"'`\\)\\]\\}\\.,:;!?])", + ); + return pattern.test(text); +} + export function useComposerAutocompleteState({ text, selectionStart, @@ -46,12 +59,14 @@ export function useComposerAutocompleteState({ const fileItems = useMemo( () => - files.map((path) => ({ - id: path, - label: path, - insertText: path, - })), - [files], + files + .filter((path) => !textIncludesFile(text, path)) + .map((path) => ({ + id: path, + label: path, + insertText: path, + })), + [files, text], ); const promptItems = useMemo(