import type { ConfigFileResponse, ContentItemsResponse, DashboardResponse, PlatformCatalogResponse, QueryListResponse, RunListResponse, RuntimeFileResponse, RuntimeFilesResponse, TimelineResponse } from "./types"; const DEFAULT_API_BASE_URL = "http://127.0.0.1:8000"; export class ApiError extends Error { status: number; detail: unknown; constructor(message: string, status: number, detail: unknown) { super(message); this.name = "ApiError"; this.status = status; this.detail = detail; } } export function apiBaseUrl() { return ( process.env.NEXT_PUBLIC_CONTENTFIND_API_BASE_URL || process.env.VITE_CONTENTFIND_API_BASE_URL || DEFAULT_API_BASE_URL ).replace(/\/$/, ""); } async function request(path: string): Promise { const response = await fetch(`${apiBaseUrl()}${path}`, { headers: { Accept: "application/json" }, cache: "no-store" }); if (!response.ok) { let detail: unknown = null; try { detail = await response.json(); } catch { detail = await response.text(); } throw new ApiError(`request failed: ${path}`, response.status, detail); } return response.json() as Promise; } export function listRuns(params: URLSearchParams) { const query = params.toString(); return request(`/runs${query ? `?${query}` : ""}`); } export function getDashboard(runId: string) { return request(`/runs/${encodeURIComponent(runId)}/dashboard`); } export function getQueries(runId: string) { return request(`/runs/${encodeURIComponent(runId)}/queries`); } export function getTimeline(runId: string) { return request(`/runs/${encodeURIComponent(runId)}/timeline`); } export function getContentItems(runId: string) { return request(`/runs/${encodeURIComponent(runId)}/content-items`); } export function getRuntimeFiles(runId: string) { return request(`/runs/${encodeURIComponent(runId)}/runtime-files`); } export function getRuntimeFile(runId: string, filename: string, limit = 100) { const safeFilename = encodeURIComponent(filename); return request( `/runs/${encodeURIComponent(runId)}/runtime-files/${safeFilename}?limit=${limit}` ); } export function getConfigRulePacks() { return request("/config/rule-packs"); } export function getConfigWalkStrategy() { return request("/config/walk-strategy"); } export function getConfigQueryPrompts() { return request("/config/query-prompts"); } export function getConfigWalkPolicy() { return request("/config/walk-policy"); } export function getConfigPlatforms() { return request("/config/platforms"); }