import { useState } from "react"; import { useMutation } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Checkbox } from "@/components/ui/checkbox"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Textarea } from "@/components/ui/textarea"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { Search, Loader2, Brain, Sparkles, Target, FileText, Lightbulb, ChevronDown, ChevronUp, Wand2, AlertCircle } from "lucide-react"; import { type SearchRequest } from "@shared/schema"; interface SearchInterfaceProps { onSearch: (request: SearchRequest) => void; onAISearch?: (query: string) => void; isLoading?: boolean; onDocumentSelect?: (documentId: number) => void; } interface EnhancedSearchResult { results: any[]; enhancedQuery?: { enhancedQuery: string; intent: string; keywords: string[]; suggestions: string[]; }; searchInsights?: { totalResults: number; avgRelevanceScore: number; modalResultsCount: number; localResultsCount: number; }; } export default function EnhancedSearchInterface({ onSearch, onAISearch, isLoading, onDocumentSelect }: SearchInterfaceProps) { const [query, setQuery] = useState(""); const [searchType, setSearchType] = useState<"semantic" | "keyword" | "hybrid">("semantic"); const [sourceTypes, setSourceTypes] = useState(["pdf", "web", "academic", "code"]); const [showAITools, setShowAITools] = useState(false); const [analysisText, setAnalysisText] = useState(""); const [selectedDocuments, setSelectedDocuments] = useState([]); const [useMarkdown, setUseMarkdown] = useState(true); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!query.trim()) return; onSearch({ query: query.trim(), searchType, filters: { sourceTypes: sourceTypes.length > 0 ? sourceTypes : undefined, }, limit: 10, offset: 0, }); }; const handleSourceTypeChange = (sourceType: string, checked: boolean) => { setSourceTypes(prev => checked ? [...prev, sourceType] : prev.filter(type => type !== sourceType) ); }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); handleSubmit(e); } else if (e.key === "Escape") { setQuery(""); } }; // Enhanced AI Search const aiSearchMutation = useMutation({ mutationFn: async (searchQuery: string): Promise => { const response = await fetch("/api/ai-search", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ query: searchQuery, maxResults: 10, useQueryEnhancement: true }), }); if (!response.ok) throw new Error("Enhanced search failed"); return response.json(); }, }); // Query Enhancement const queryEnhancementMutation = useMutation({ mutationFn: async (originalQuery: string) => { const response = await fetch("/api/enhance-query", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ query: originalQuery }), }); if (!response.ok) throw new Error("Query enhancement failed"); return response.json(); }, }); // Document Analysis const documentAnalysisMutation = useMutation({ mutationFn: async ({ content, analysisType, useMarkdown }: { content: string; analysisType: string; useMarkdown?: boolean }) => { const response = await fetch("/api/analyze-document", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ content, analysisType, useMarkdown }), }); if (!response.ok) throw new Error("Document analysis failed"); return response.json(); }, }); // Generate Embeddings const embeddingsMutation = useMutation({ mutationFn: async (input: string) => { const response = await fetch("/api/embeddings", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ input }), }); if (!response.ok) throw new Error("Embedding generation failed"); return response.json(); }, }); const handleEnhancedSearch = () => { if (!query.trim()) return; aiSearchMutation.mutate(query); if (onAISearch) onAISearch(query); }; const handleQueryEnhancement = () => { if (!query.trim()) return; queryEnhancementMutation.mutate(query); }; const handleDocumentAnalysis = (analysisType: string) => { if (!analysisText.trim()) return; documentAnalysisMutation.mutate({ content: analysisText, analysisType, useMarkdown }); }; const handleGenerateEmbeddings = () => { if (!query.trim()) return; embeddingsMutation.mutate(query); }; const applyEnhancedQuery = (enhancedQuery: string) => { setQuery(enhancedQuery); onSearch({ query: enhancedQuery, searchType, filters: { sourceTypes: sourceTypes.length > 0 ? sourceTypes : undefined, }, limit: 10, offset: 0, }); }; return (

AI-Enhanced Search

Powered by Nebius & Modal
setQuery(e.target.value)} onKeyDown={handleKeyDown} className="pl-11 pr-12 focus:ring-2 focus:ring-blue-500 focus:border-blue-500" disabled={isLoading} aria-label="Search knowledge base" /> {query && ( )}
{/* Search Filters */}
{[ { id: "pdf", label: "PDFs" }, { id: "web", label: "Web Pages" }, { id: "academic", label: "Academic Papers" }, { id: "code", label: "Code Repositories" } ].map(({ id, label }) => (
handleSourceTypeChange(id, !!checked)} />
))}
{/* Query Enhancement Results */} {queryEnhancementMutation.data && (

Enhanced Query Suggestion

{queryEnhancementMutation.data.enhancedQuery}

Intent: {queryEnhancementMutation.data.intent}
Keywords:
{queryEnhancementMutation.data.keywords.map((keyword: string, i: number) => ( {keyword} ))}
)} {/* AI Enhanced Search Results */} {aiSearchMutation.data && (
AI-Enhanced Results {aiSearchMutation.data.searchInsights && ( {aiSearchMutation.data.searchInsights.totalResults} results )} {aiSearchMutation.data.searchInsights && (
Avg Relevance: {(aiSearchMutation.data.searchInsights.avgRelevanceScore * 100).toFixed(1)}%
Modal Results: {aiSearchMutation.data.searchInsights.modalResultsCount}
Local Results: {aiSearchMutation.data.searchInsights.localResultsCount}
Total: {aiSearchMutation.data.searchInsights.totalResults}
)}
✨ AI-enhanced search completed. Results are ranked by semantic relevance and include additional context.
)} {/* Collapsible AI Tools */} Analysis Embeddings External Tools {/* Document Analysis Tab */}