import type { Device, RegisterDevicePayload, RuntimeConfig, TaskRecord, TimelineRecord, } from "./types"; const configuredBaseUrl = import.meta.env.VITE_API_BASE_URL as string | undefined; export const API_BASE_URL = ( configuredBaseUrl !== undefined ? configuredBaseUrl : "http://127.0.0.1:8000" ).replace(/\/$/, ""); async function request(path: string, init: RequestInit = {}): Promise { const response = await fetch(`${API_BASE_URL}${path}`, { ...init, headers: { Accept: "application/json", ...(init.body ? { "Content-Type": "application/json" } : {}), ...init.headers, }, }); if (!response.ok) { let message = `${response.status} ${response.statusText}`; try { const payload = (await response.json()) as { detail?: unknown }; if (typeof payload.detail === "string") { message = payload.detail; } else if (payload.detail) { message = JSON.stringify(payload.detail); } } catch { message = await response.text(); } throw new Error(message); } if (response.status === 204) { return undefined as T; } return (await response.json()) as T; } export function listDevices(): Promise { return request("/console/devices"); } export function registerDevice(payload: RegisterDevicePayload): Promise { return request("/console/devices", { method: "POST", body: JSON.stringify(payload), }); } export function unregisterDevice(deviceId: string): Promise { return request(`/console/devices/${encodeURIComponent(deviceId)}`, { method: "DELETE", }); } export function listTasks(filters: { deviceId?: string; status?: string; }): Promise { const params = new URLSearchParams(); if (filters.deviceId) { params.set("device_id", filters.deviceId); } if (filters.status) { params.set("status", filters.status); } const query = params.toString(); return request(`/console/tasks${query ? `?${query}` : ""}`); } export function getTask(taskId: string): Promise { return request(`/console/tasks/${encodeURIComponent(taskId)}`); } export function getTimeline(taskId: string): Promise { return request( `/console/tasks/${encodeURIComponent(taskId)}/timeline`, ); } export function getConfig(): Promise { return request("/console/config"); } export function updateConfig(payload: RuntimeConfig): Promise { return request("/console/config", { method: "PUT", body: JSON.stringify(payload), }); }