import type { ArtifactDetailProjection, BuildSummary, CardBusinessData, ExecutionViewV8, InspectorDetailProjection, InspectorWorkbenchProjection, PromptProjection } from "@/lib/types"; const API_BASE = (process.env.NEXT_PUBLIC_API_BASE || process.env.NEXT_PUBLIC_VISUALIZATION_API || "http://127.0.0.1:8788").replace(/\/$/, ""); export const moduleAuditUrl = (buildId: string) => `${API_BASE}/audit/${encodeURIComponent(buildId)}`; async function request(path: string, signal?: AbortSignal): Promise { const response = await fetch(`${API_BASE}${path}`, { signal, cache: "no-store", headers: { Accept: "application/json" } }); if (!response.ok) throw new Error(`API ${response.status}: ${response.statusText}`); return response.json() as Promise; } export async function listScriptBuilds(signal?: AbortSignal): Promise { const payload = await request }>("/api/script-builds?limit=30", signal); const items = Array.isArray(payload) ? payload : payload.items || []; return items.map((item) => { const raw = item as typeof item & { script_build_id?: string | number; buildId?: string | number }; return { ...item, id: String(item.id ?? raw.script_build_id ?? raw.buildId ?? "") }; }); } export const getExecutionView = (id: string, signal?: AbortSignal) => request(`/api/script-builds/${encodeURIComponent(id)}/execution-view`, signal); export const getRoundDetail = (buildId: string, roundIndex: number, signal?: AbortSignal) => request(`/api/script-builds/${encodeURIComponent(buildId)}/rounds/${roundIndex}`, signal); export const getActivityDetail = (buildId: string, detailRef: string, signal?: AbortSignal) => request(`/api/script-builds/${encodeURIComponent(buildId)}/activities/${encodeURIComponent(detailRef)}`, signal); export const getArtifactDetail = (buildId: string, snapshotRef: string, signal?: AbortSignal) => request(`/api/script-builds/${encodeURIComponent(buildId)}/artifacts/${encodeURIComponent(snapshotRef)}`, signal); export const getDecisionPrompt = (buildId: string, promptRef: string, signal?: AbortSignal) => request(`/api/script-builds/${encodeURIComponent(buildId)}/decision-prompts/${encodeURIComponent(promptRef)}`, signal); export const getCardData = (buildId: string, detailRef: string, signal?: AbortSignal) => request(`/api/script-builds/${encodeURIComponent(buildId)}/card-data/${encodeURIComponent(detailRef)}`, signal); export const getInspectorView = (buildId: string, detailRef: string, signal?: AbortSignal) => request(`/api/script-builds/${encodeURIComponent(buildId)}/inspector-view/${encodeURIComponent(detailRef)}`, signal); export const errorMessage = (error: unknown) => error instanceof Error ? error.message : String(error);