"use client"; import { useEffect, useRef, useState } from "react"; import { RAGStrategyInfo, fetchRAGStrategies } from "@/lib/api"; const LATENCY_CLS: Record = { fast: "text-ok", medium: "text-warn", slow: "text-bad", }; const STRATEGY_LS_KEY = "auralynq.rag_strategy.v1"; export function loadStoredStrategy(): string { try { return localStorage.getItem(STRATEGY_LS_KEY) || "auralynq_rag"; } catch { return "auralynq_rag"; } } export function saveStoredStrategy(id: string) { try { localStorage.setItem(STRATEGY_LS_KEY, id); } catch { /* ignore */ } } type StatusGroup = "available" | "experimental" | "planned"; const GROUP_CONFIG: Record = { available: { label: "Available now", dot: "bg-ok", selectable: true }, experimental: { label: "Experimental", dot: "bg-warn", selectable: true }, planned: { label: "Planned / requires setup", dot: "bg-fg3", selectable: false }, }; function StrategyRow({ s, selected, defaultId, onSelect, }: { s: RAGStrategyInfo; selected: boolean; defaultId: string; onSelect: (id: string) => void; }) { const isDefault = s.id === defaultId || s.id === "auralynq_rag"; const selectable = s.status !== "planned" && s.available; const dimmed = !selectable; return ( ); } export function AlgorithmSelector({ value, onChange, }: { value: string; onChange: (id: string) => void; }) { const [open, setOpen] = useState(false); const [strategies, setStrategies] = useState([]); const [defaultId, setDefaultId] = useState("auralynq_rag"); const ref = useRef(null); useEffect(() => { fetchRAGStrategies() .then(({ strategies, default_strategy }) => { setStrategies(strategies); setDefaultId(default_strategy); }) .catch(() => {}); }, []); useEffect(() => { function handler(e: MouseEvent) { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); } if (open) document.addEventListener("mousedown", handler); return () => document.removeEventListener("mousedown", handler); }, [open]); const current = strategies.find(s => s.id === value); const displayName = current?.name || value.replace(/_/g, " "); const isDefault = value === defaultId || value === "auralynq_rag"; // Group strategies by status const groups: Record = { available: strategies.filter(s => s.status === "available"), experimental: strategies.filter(s => s.status === "experimental"), planned: strategies.filter(s => s.status === "planned"), }; function select(id: string) { onChange(id); saveStoredStrategy(id); setOpen(false); } return (
{open && (

RAG Algorithm

Choose how Auralynq retrieves and answers

{(Object.keys(GROUP_CONFIG) as StatusGroup[]).map(group => { const items = groups[group]; if (items.length === 0) return null; const cfg = GROUP_CONFIG[group]; return (
{/* Group header */}
{cfg.label} {items.length}
{items.map(s => ( ))}
); })}
)}
); }