feat: add search filtering for SurfSense docs mentions and handle zero-width spaces in citations

This commit is contained in:
CREDO23 2026-01-13 09:41:25 +02:00
parent 982dac47ec
commit c579d773a9
3 changed files with 12 additions and 6 deletions

View file

@ -16,8 +16,8 @@ import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
// Citation pattern: [citation:CHUNK_ID] or [citation:doc-CHUNK_ID] // Citation pattern: [citation:CHUNK_ID] or [citation:doc-CHUNK_ID]
// Also matches Chinese brackets 【】 as LLM sometimes uses them // Also matches Chinese brackets 【】 and handles zero-width spaces that LLM sometimes inserts
const CITATION_REGEX = /[\[【]citation:(doc-)?(\d+)[\]】]/g; const CITATION_REGEX = /[\[【]\u200B?citation:(doc-)?(\d+)\u200B?[\]】]/g;
// Track chunk IDs to citation numbers mapping for consistent numbering // Track chunk IDs to citation numbers mapping for consistent numbering
// This map is reset when a new message starts rendering // This map is reset when a new message starts rendering

View file

@ -91,11 +91,15 @@ export const DocumentMentionPicker = forwardRef<
}, [debouncedSearch, searchSpaceId]); }, [debouncedSearch, searchSpaceId]);
const surfsenseDocsQueryParams = useMemo(() => { const surfsenseDocsQueryParams = useMemo(() => {
return { const params: { page: number; page_size: number; title?: string } = {
page: 0, page: 0,
page_size: PAGE_SIZE, page_size: PAGE_SIZE,
}; };
}, []); if (debouncedSearch.trim()) {
params.title = debouncedSearch;
}
return params;
}, [debouncedSearch]);
// Use query for fetching first page of documents // Use query for fetching first page of documents
const { data: documents, isLoading: isDocumentsLoading } = useQuery({ const { data: documents, isLoading: isDocumentsLoading } = useQuery({
@ -115,7 +119,7 @@ export const DocumentMentionPicker = forwardRef<
// Use query for fetching first page of SurfSense docs // Use query for fetching first page of SurfSense docs
const { data: surfsenseDocs, isLoading: isSurfsenseDocsLoading } = useQuery({ const { data: surfsenseDocs, isLoading: isSurfsenseDocsLoading } = useQuery({
queryKey: ["surfsense-docs-mention", surfsenseDocsQueryParams], queryKey: ["surfsense-docs-mention", debouncedSearch],
queryFn: () => documentsApiService.getSurfsenseDocs({ queryParams: surfsenseDocsQueryParams }), queryFn: () => documentsApiService.getSurfsenseDocs({ queryParams: surfsenseDocsQueryParams }),
staleTime: 3 * 60 * 1000, staleTime: 3 * 60 * 1000,
}); });

View file

@ -188,7 +188,9 @@ export const getSurfsenseDocsByChunkResponse = surfsenseDocsDocumentWithChunks;
* List Surfsense docs * List Surfsense docs
*/ */
export const getSurfsenseDocsRequest = z.object({ export const getSurfsenseDocsRequest = z.object({
queryParams: paginationQueryParams queryParams: paginationQueryParams.extend({
title: z.string().optional(),
}),
}); });
export const getSurfsenseDocsResponse = z.object({ export const getSurfsenseDocsResponse = z.object({