From 73113321a11d5a037b253ad3375ed60e3cf11eef Mon Sep 17 00:00:00 2001 From: Umut Polat <52835619+umut-polat@users.noreply.github.com> Date: Fri, 13 Mar 2026 05:57:58 +0300 Subject: [PATCH] fix: respect dateStart/dateEnd filters in Chroma search path (#1343) When a search query includes dateStart/dateEnd parameters, the Chroma semantic search path (PATH 2) ignored them entirely and only applied a hardcoded 90-day recency window. This meant date-filtered searches returned results from outside the requested range. Now the Chroma path checks for a user-provided dateRange first. If present, it filters results by the requested start/end bounds. The 90-day window is only used as the default when no date filter is specified, preserving backward compatibility. Fixes #1324 Signed-off-by: umut-polat <52835619+umut-polat@users.noreply.github.com> --- src/services/worker/SearchManager.ts | 30 ++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/services/worker/SearchManager.ts b/src/services/worker/SearchManager.ts index e4ca430e..45c7e2d7 100644 --- a/src/services/worker/SearchManager.ts +++ b/src/services/worker/SearchManager.ts @@ -180,15 +180,37 @@ export class SearchManager { logger.debug('SEARCH', 'ChromaDB returned semantic matches', { matchCount: chromaResults.ids.length }); if (chromaResults.ids.length > 0) { - // Step 2: Filter by recency (90 days) - const ninetyDaysAgo = Date.now() - SEARCH_CONSTANTS.RECENCY_WINDOW_MS; + // Step 2: Filter by date range + // Use user-provided dateRange if available, otherwise fall back to 90-day recency window + const { dateRange } = options; + let startEpoch: number | undefined; + let endEpoch: number | undefined; + + if (dateRange) { + if (dateRange.start) { + startEpoch = typeof dateRange.start === 'number' + ? dateRange.start + : new Date(dateRange.start).getTime(); + } + if (dateRange.end) { + endEpoch = typeof dateRange.end === 'number' + ? dateRange.end + : new Date(dateRange.end).getTime(); + } + } else { + // Default: 90-day recency window + startEpoch = Date.now() - SEARCH_CONSTANTS.RECENCY_WINDOW_MS; + } + const recentMetadata = chromaResults.metadatas.map((meta, idx) => ({ id: chromaResults.ids[idx], meta, - isRecent: meta && meta.created_at_epoch > ninetyDaysAgo + isRecent: meta && meta.created_at_epoch != null + && (!startEpoch || meta.created_at_epoch >= startEpoch) + && (!endEpoch || meta.created_at_epoch <= endEpoch) })).filter(item => item.isRecent); - logger.debug('SEARCH', 'Results within 90-day window', { count: recentMetadata.length }); + logger.debug('SEARCH', dateRange ? 'Results within user date range' : 'Results within 90-day window', { count: recentMetadata.length }); // Step 3: Categorize IDs by document type const obsIds: number[] = [];