/** * MemoryExplorer — Searchable, filterable, sortable memory table */ import { useState } from 'react'; import { searchMemories, deleteMemory } from '../api/client'; import type { ScoredMemory } from '../api/client'; import MemoryCard from '../components/MemoryCard'; export default function MemoryExplorer() { const [userId, setUserId] = useState(''); const [query, setQuery] = useState(''); const [typeFilter, setTypeFilter] = useState(''); const [sortBy, setSortBy] = useState<'score' | 'importance' | 'recency'>('score'); const [results, setResults] = useState([]); const [loading, setLoading] = useState(false); const [searched, setSearched] = useState(false); const handleSearch = async () => { if (!userId || !query) return; setLoading(true); try { const data = await searchMemories(userId, query, typeFilter || undefined, 20); let sorted = [...data]; if (sortBy === 'importance') { sorted.sort((a, b) => b.memory.importance - a.memory.importance); } else if (sortBy === 'recency') { sorted.sort((a, b) => b.memory.recency_score - a.memory.recency_score); } setResults(sorted); setSearched(true); } catch { setResults([]); } finally { setLoading(false); } }; const handleForget = async (memoryId: string) => { try { await deleteMemory(memoryId); setResults((prev) => prev.filter((r) => r.memory.id !== memoryId)); } catch (e) { console.error('Failed to forget memory:', e); } }; return (

Memory Explorer

Search, filter, and manage memories

{/* Search Controls */}
setUserId(e.target.value)} style={{ flex: 1, padding: '10px 16px', borderRadius: '10px', border: '1px solid var(--color-border)', background: 'var(--color-surface)', color: 'var(--color-text-primary)', fontSize: '14px', outline: 'none', }} />
setQuery(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleSearch()} style={{ flex: 1, padding: '10px 16px', borderRadius: '10px', border: '1px solid var(--color-border)', background: 'var(--color-surface)', color: 'var(--color-text-primary)', fontSize: '14px', outline: 'none', }} />
{/* Results */} {searched && results.length === 0 && (
No memories found. Try a different query.
)}
{results.map((scored) => ( ))}
); }