"use client"; import { useState } from "react"; import { apiCall } from "@/lib/api"; export function Query({ apiKey }: { apiKey: string }) { const [query, setQuery] = useState(""); const [startDate, setStartDate] = useState(""); const [endDate, setEndDate] = useState(""); const [maxResults, setMaxResults] = useState(20); const [loading, setLoading] = useState(false); const [result, setResult] = useState(null); const [error, setError] = useState(""); const handleQuery = async () => { if (!apiKey) { setError("Please enter your API Key in API Keys first."); return; } if (!query.trim()) return; setLoading(true); setError(""); setResult(null); const payload: any = { query, max_results: maxResults }; if (startDate || endDate) { payload.time_range = {}; if (startDate) payload.time_range.start = new Date(startDate).toISOString(); if (endDate) payload.time_range.end = new Date(endDate).toISOString(); } try { const data = await apiCall("POST", "/query", apiKey, payload); setResult(data); } catch (e: any) { setError(e.message); } finally { setLoading(false); } }; return (
{/* Header */}

Query the Memory

Ask in natural language. Kaal searches across time and meaning.

{/* Main query input */}
setQuery(e.target.value)} placeholder="What happened with contracts this quarter?" className="w-full border border-[#eaeaea] rounded-lg px-4 py-3 text-sm text-black bg-[#fafafa] focus:outline-none focus:border-black transition-colors" onKeyDown={(e) => e.key === 'Enter' && handleQuery()} />
{/* Filters — stack on mobile, row on desktop */}
setStartDate(e.target.value)} className="w-full border border-[#eaeaea] rounded-lg px-3 py-2.5 text-sm text-black bg-[#fafafa] focus:outline-none focus:border-black transition-colors" />
setEndDate(e.target.value)} className="w-full border border-[#eaeaea] rounded-lg px-3 py-2.5 text-sm text-black bg-[#fafafa] focus:outline-none focus:border-black transition-colors" />
setMaxResults(parseInt(e.target.value))} className="w-full accent-black h-2 bg-[#eaeaea] rounded-lg appearance-none cursor-pointer mt-3" />
{error && (
⚠ {error}
)} {result && !error && (
Search Results {result.total_found} events found · {result.query_time_ms.toFixed(0)}ms
{result.results?.length === 0 ? (
No events found matching your query.
) : ( result.results?.map((item: any, idx: number) => { const event = item.event; const date = new Date(event.timestamp); const fmt = new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', year: 'numeric' }); return (
{fmt.format(date)}
{event.subject} {event.verb} {event.object}
{event.raw_text && (
{event.raw_text.slice(0, 120)}{event.raw_text.length > 120 ? '…' : ''}
)}
Relevance: {(item.relevance_score * 100).toFixed(0)}% · {item.provenance?.replace('_', ' ')}
); }) )}
)}
); }