"use client"; import { useAuth } from "@/components/AuthProvider"; import { c2api } from "@/lib/c2api"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; interface FeatureFlags { stt_enabled: boolean; correlation_enabled: boolean; summaries_enabled: boolean; vocabulary_learning_enabled: boolean; } const FLAG_META: { key: keyof FeatureFlags; label: string; description: string }[] = [ { key: "stt_enabled", label: "Speech-to-Text (Whisper)", description: "Transcribe call audio via OpenAI Whisper. When off, calls are recorded and stored but no transcript is generated.", }, { key: "correlation_enabled", label: "Incident Correlation", description: "Run scene extraction and incident correlation on each call. When off, calls are logged but not linked to incidents.", }, { key: "summaries_enabled", label: "Incident Summaries", description: "Generate AI summaries for active incidents on each summarizer pass. Auto-resolve sweep is also paused when off.", }, { key: "vocabulary_learning_enabled", label: "Vocabulary Learning", description: "Run the background vocabulary induction loop that proposes new STT terms from recent transcripts.", }, ]; function Toggle({ enabled, onChange, disabled, }: { enabled: boolean; onChange: (val: boolean) => void; disabled: boolean; }) { return ( ); } export default function AdminPage() { const { isAdmin } = useAuth(); const router = useRouter(); const [flags, setFlags] = useState(null); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(null); const [error, setError] = useState(null); useEffect(() => { if (!isAdmin) { router.replace("/dashboard"); return; } c2api.getFeatureFlags() .then((f) => setFlags(f as unknown as FeatureFlags)) .catch((e) => setError(String(e))) .finally(() => setLoading(false)); }, [isAdmin, router]); async function handleToggle(key: keyof FeatureFlags, value: boolean) { if (!flags) return; setSaving(key); setError(null); try { const updated = await c2api.setFeatureFlags({ [key]: value }); setFlags(updated as unknown as FeatureFlags); } catch (e) { setError(String(e)); } finally { setSaving(null); } } if (!isAdmin) return null; return (

Admin

AI Features

{error && (

{error}

)} {loading ? (

Loading…

) : (
{FLAG_META.map(({ key, label, description }) => (

{label}

{description}

handleToggle(key, val)} disabled={saving === key} />
))}
)}
); }