import type { AgentState, ParsedPrompt, RankedNeighborhood } from "./scoring"; export interface AgentBackendRun { ok: boolean; mode: "hf" | "nvidia" | "ollama" | "llamacpp" | "local-fallback"; provider?: "nvidia" | "hf" | "ollama" | "llamacpp" | "auto"; model: string | null; prompt: string; parsed: ParsedPrompt; ranked: RankedNeighborhood[]; selectedId: string; agents: Array; recommendation?: { summary: string; selectedId: string; rankedIds: string[]; why: string[]; cautions: string[]; nextQuestions: string[]; citations?: Array<{ sourceId: string; note: string; }>; }; webResearch?: { enabled: boolean; provider: string; generatedAt: string; targetNeighborhoods: string[]; queries: Array<{ id?: string; agentId?: string; category: string; sourceType: string; neighborhood: string; query: string; domains?: string[]; resultCount?: number; rawResultCount?: number; error?: string | null; }>; sources: Array<{ id: string; title: string; url: string; domain: string; snippet: string; category: string; neighborhood: string; sourceType: string; agentId?: string; reliability: string; sourceName?: string; }>; facts?: Array<{ id: string; sourceId: string; sourceName?: string; category: string; neighborhood: string; label: string; value: number | string; unit: string; detail: string; reliability: string; generatedFrom?: string[]; }>; limitations: string[]; }; trace?: Array<{ id: string; tool: string; status: "done" | "skipped" | "error"; input?: unknown; output?: unknown; }>; fallbackReason?: string; } export async function runAgentBackend(prompt: string): Promise { const controller = new AbortController(); // Backend budget: research (~40s) + model synthesis + open-data fetch. Keep headroom. const timeout = window.setTimeout(() => controller.abort(), 85000); try { const response = await fetch("/api/agent/run", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ prompt }), signal: controller.signal, }); if (!response.ok) return null; const data = (await response.json()) as AgentBackendRun; if (!data?.ok || !Array.isArray(data.ranked) || !Array.isArray(data.agents)) return null; return data; } catch { return null; } finally { window.clearTimeout(timeout); } }