import type { ModuleController } from "@86d-app/core"; export type SearchIndexItem = { id: string; entityType: string; entityId: string; title: string; body?: string | undefined; tags: string[]; url: string; image?: string | undefined; metadata: Record; indexedAt: Date; }; export type SearchQuery = { id: string; term: string; normalizedTerm: string; resultCount: number; sessionId?: string | undefined; searchedAt: Date; }; export type SearchSynonym = { id: string; term: string; synonyms: string[]; createdAt: Date; }; export type SearchClick = { id: string; queryId: string; term: string; entityType: string; entityId: string; position: number; clickedAt: Date; }; export type SearchSortField = | "relevance" | "newest" | "oldest" | "title_asc" | "title_desc"; export type SearchFacets = { entityTypes: Array<{ type: string; count: number }>; tags: Array<{ tag: string; count: number }>; }; export type SearchResult = { item: SearchIndexItem; score: number; highlights?: SearchHighlight | undefined; }; export type SearchHighlight = { title?: string | undefined; body?: string | undefined; }; export type SearchAnalyticsSummary = { totalQueries: number; uniqueTerms: number; avgResultCount: number; zeroResultCount: number; zeroResultRate: number; clickThroughRate: number; avgClickPosition: number; }; export type PopularTerm = { term: string; count: number; avgResultCount: number; }; export type SearchController = ModuleController & { indexItem(params: { entityType: string; entityId: string; title: string; body?: string | undefined; tags?: string[] | undefined; url: string; image?: string | undefined; metadata?: Record | undefined; }): Promise; bulkIndex( items: Array<{ entityType: string; entityId: string; title: string; body?: string | undefined; tags?: string[] | undefined; url: string; image?: string | undefined; metadata?: Record | undefined; }>, ): Promise<{ indexed: number; errors: number }>; removeFromIndex(entityType: string, entityId: string): Promise; search( query: string, options?: { entityType?: string | undefined; tags?: string[] | undefined; sort?: SearchSortField | undefined; fuzzy?: boolean | undefined; limit?: number | undefined; skip?: number | undefined; }, ): Promise<{ results: SearchResult[]; total: number; facets: SearchFacets; didYouMean?: string | undefined; }>; suggest(prefix: string, limit?: number): Promise; recordQuery( term: string, resultCount: number, sessionId?: string | undefined, ): Promise; recordClick(params: { queryId: string; term: string; entityType: string; entityId: string; position: number; }): Promise; getRecentQueries(sessionId: string, limit?: number): Promise; getPopularTerms(limit?: number): Promise; getZeroResultQueries(limit?: number): Promise; getAnalytics(): Promise; addSynonym(term: string, synonyms: string[]): Promise; removeSynonym(id: string): Promise; listSynonyms(): Promise; getIndexCount(): Promise; };