/// Gateway API client — used when running in gateway mode. /// /// The gateway mode is detected by checking `GET /gateway/mode`. If it returns /// `{ "mode": "gateway" }` the frontend switches to the gateway UI. export interface JoinedAgent { id: string; label: string; address: string; registered_at: number; } export interface GenerateTokenResponse { token: string; } export interface ServerMode { mode: "gateway" | "standard"; } async function gatewayRequest( path: string, options: RequestInit = {}, ): Promise { const res = await fetch(path, { headers: { "Content-Type": "application/json", ...(options.headers ?? {}) }, ...options, }); if (!res.ok) { const text = await res.text(); throw new Error(text || `Request failed (${res.status})`); } // DELETE /gateway/agents/:id returns 204 No Content. if (res.status === 204) { return undefined as unknown as T; } return res.json() as Promise; } export const gatewayApi = { /// Returns `{ mode: "gateway" }` if this server is a gateway, otherwise rejects. getServerMode(): Promise { return gatewayRequest("/gateway/mode"); }, /// Generate a one-time join token for a new build agent. generateToken(): Promise { return gatewayRequest("/gateway/tokens", { method: "POST", }); }, /// List all build agents that have registered with this gateway. listAgents(): Promise { return gatewayRequest("/gateway/agents"); }, /// Remove a registered build agent by its ID. removeAgent(id: string): Promise { return gatewayRequest(`/gateway/agents/${id}`, { method: "DELETE", }); }, };