"use client"; import { useCallback, useEffect, useState } from "react"; import { Save, CheckCircle2 } from "lucide-react"; import { PageHeader } from "@/components/common/page-header"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import type { ReflexioConfig, ReflexioRetrievalFloorConfig } from "@/lib/types"; type ExtractorField = | "profile_extractor_configs" | "user_playbook_extractor_configs"; const DEFAULT_RETRIEVAL_FLOOR: Required< Pick< ReflexioRetrievalFloorConfig, | "enabled" | "pool_size" | "profile_floor" | "user_playbook_floor" | "agent_playbook_floor" > > = { enabled: false, pool_size: 30, profile_floor: -3, user_playbook_floor: -3, agent_playbook_floor: -3, }; export default function ConfigureServerPage() { const [srvConfig, setSrvConfig] = useState(null); const [srvError, setSrvError] = useState(null); const [srvSaved, setSrvSaved] = useState(false); const [srvSaving, setSrvSaving] = useState(false); const [srvLoading, setSrvLoading] = useState(true); const fetchSrvConfig = useCallback(async (): Promise => { const res = await fetch("/api/reflexio/api/get_config", { cache: "no-store", }); if (!res.ok) { const body = await res.json().catch(() => null); const detail = body?.error ? `${body.error}${body.detail ? `: ${body.detail}` : ""}` : `HTTP ${res.status}`; throw new Error(detail); } return (await res.json()) as ReflexioConfig; }, []); useEffect(() => { let alive = true; async function load() { setSrvLoading(true); setSrvError(null); try { const data = await fetchSrvConfig(); if (alive) setSrvConfig(data); } catch (e) { if (alive) setSrvError(e instanceof Error ? e.message : String(e)); } finally { if (alive) setSrvLoading(false); } } void load(); return () => { alive = false; }; }, [fetchSrvConfig]); const updateSrv = ( key: K, value: ReflexioConfig[K], ) => { setSrvConfig((prev) => (prev ? { ...prev, [key]: value } : prev)); setSrvSaved(false); }; const updateExtractorPrompt = (field: ExtractorField, v: string) => { setSrvConfig((prev) => { if (!prev) return prev; const list = prev[field]; if (!list || list.length === 0) return prev; const next = [...list]; next[0] = { ...next[0], extraction_definition_prompt: v }; return { ...prev, [field]: next }; }); setSrvSaved(false); }; const updateReranker = (enabled: boolean) => { setSrvConfig((prev) => prev ? { ...prev, retrieval_floor: { ...DEFAULT_RETRIEVAL_FLOOR, ...(prev.retrieval_floor ?? {}), enabled, }, } : prev, ); setSrvSaved(false); }; const saveSrv = async () => { if (!srvConfig) return; setSrvSaving(true); setSrvError(null); try { const headers: HeadersInit = { "content-type": "application/json" }; const res = await fetch("/api/reflexio/api/set_config", { method: "POST", headers, body: JSON.stringify(srvConfig), }); if (!res.ok) { const body = await res.json().catch(() => null); const detail = body?.error ? `${body.error}${body.detail ? `: ${body.detail}` : ""}` : `HTTP ${res.status}`; throw new Error(detail); } const fresh = await fetchSrvConfig(); setSrvConfig(fresh); setSrvSaved(true); } catch (e) { setSrvError(e instanceof Error ? e.message : String(e)); } finally { setSrvSaving(false); } }; return ( <> {srvSaving ? "Saving…" : "Save"} } />
{srvError && (
{srvError}
)} {srvSaved && (
Saved to reflexio
)} {srvLoading ? (
Loading…
) : srvConfig ? (

Free-form context about the agent's working environment. Prepended to extractor prompts.