import { useState } from "react"; import { Link } from "react-router-dom"; import { fetchMemories } from "../api/client.ts"; import type { QueryMemoriesResult } from "@fixonce/shared"; export function MemoryQuery() { const [query, setQuery] = useState(""); const [searchType, setSearchType] = useState("hybrid"); const [memoryType, setMemoryType] = useState(""); const [language, setLanguage] = useState(""); const [verbosity, setVerbosity] = useState("medium"); const [maxResults, setMaxResults] = useState("10"); const [results, setResults] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); async function handleSearch(e: React.FormEvent) { e.preventDefault(); if (!query.trim()) return; setLoading(true); setError(null); try { const params: Record = { query, type: searchType, verbosity, max_results: maxResults, }; if (memoryType) params.memory_type = memoryType; if (language) params.language = language; const data = await fetchMemories(params); setResults(data); } catch (err) { setError(err instanceof Error ? err.message : "Search failed"); } finally { setLoading(false); } } return (

Search Memories

setQuery(e.target.value)} placeholder="Search for memories..." style={inputStyle} />
setLanguage(e.target.value)} placeholder="e.g. typescript" style={inputStyle} />
setMaxResults(e.target.value)} min="1" max="50" style={inputStyle} />
{error &&

{error}

} {results && (

Found {results.total_found} total | Showing {results.results.length} {" | "}Search: {results.pipeline.search_type} {results.pipeline.rewrite_used && " | Rewritten"} {results.pipeline.rerank_used && " | Reranked"}

{results.results.map((memory) => (
{memory.title} {memory.relevancy_score.toFixed(2)}

{memory.summary}

{memory.memory_type} {"tags" in memory && memory.tags.length > 0 && ` | ${memory.tags.join(", ")}`}
))} {results.overflow.length > 0 && (

Overflow ({results.overflow.length})

{results.overflow.map((entry) => (
{entry.title} ({entry.relevancy_score.toFixed(2)})
))}
)}
)}
); } const fieldRow: React.CSSProperties = { display: "flex", flexDirection: "column", gap: "0.25rem", marginBottom: "0.75rem", }; const inputStyle: React.CSSProperties = { padding: "0.4rem 0.5rem", border: "1px solid #ccc", borderRadius: "3px", fontSize: "0.9rem", }; const submitBtn: React.CSSProperties = { padding: "0.5rem 1.5rem", background: "#333", color: "#fff", border: "none", borderRadius: "3px", cursor: "pointer", fontSize: "0.9rem", }; const cardStyle: React.CSSProperties = { border: "1px solid #ddd", borderRadius: "4px", padding: "1rem", marginBottom: "0.75rem", }; const scoreBadge: React.CSSProperties = { background: "#eee", padding: "0.15rem 0.5rem", borderRadius: "3px", fontSize: "0.8rem", fontWeight: 600, };