import { createFileRoute } from "@tanstack/react-router"; import { useState } from "react"; import { api, type Chunk } from "@/lib/api"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { Search as SearchIcon, ChevronDown } from "lucide-react"; export const Route = createFileRoute("/search")({ component: SearchPage }); function esc(s: string) { return s.replace(/&/g, "&").replace(//g, ">"); } function SearchPage() { const [query, setQuery] = useState(""); const [results, setResults] = useState(null); const [loading, setLoading] = useState(false); const doSearch = async () => { if (!query.trim()) return; setLoading(true); try { setResults(await api.search(query.trim())); } finally { setLoading(false); } }; return (

Search All Memory

setQuery(e.target.value)} onKeyDown={e => e.key === "Enter" && doSearch()} placeholder='Search across all knowledge bases (full words or partial text)...' className="font-mono text-sm" />
{loading &&

Searching...

} {results && results.length === 0 && (

No results for “{query}”

Try different terms, FTS5 syntax (word1 OR word2), or paste partial text

)} {results && results.length > 0 && (

{results.length} results

{results.map((r, i) => ( {r.title || "(untitled)"}
{r.dbHash && {r.dbHash.slice(0, 8)}} {r.content_type}
')
                            .replace(/»/g, ""),
                        }}
                      />
                    
                  
                
              
            
          ))}
        
)}
); }