← back to Dw War Room

src/data/ApiClient.ts

79 lines

// ═══════════════════════════════════════════════
// DW War Room 3D — API Client
// Fetches from both Governance (4020) and Boardroom (4040)
// ═══════════════════════════════════════════════

import type { DecisionStats, EscalationAlert, GovernanceStatus, MeetingState } from '../types';

const GOV_URL = import.meta.env.VITE_GOVERNANCE_URL || 'http://45.61.58.125:4020';
const BR_URL = import.meta.env.VITE_BOARDROOM_URL || 'http://45.61.58.125:4040';
const AUTH = import.meta.env.VITE_AUTH || btoa('admin:DWSecure2024!');

const headers: Record<string, string> = {
  'Content-Type': 'application/json',
  'Authorization': `Basic ${AUTH}`,
};

async function fetchJson<T>(url: string): Promise<T> {
  const res = await fetch(url, { headers });
  if (!res.ok) throw new Error(`${res.status}`);
  return res.json();
}

// Governance API (port 4020)
export async function getGovernanceStatus(): Promise<GovernanceStatus> {
  return fetchJson<GovernanceStatus>(`${GOV_URL}/api/governance/status`);
}

export async function getDecisionStats(): Promise<DecisionStats> {
  return fetchJson<DecisionStats>(`${GOV_URL}/api/decisions/stats`);
}

export async function getActiveEscalations(): Promise<EscalationAlert[]> {
  return fetchJson<EscalationAlert[]>(`${GOV_URL}/api/escalations/active`);
}

export async function getPendingDecisions(): Promise<any[]> {
  return fetchJson<any[]>(`${GOV_URL}/api/decisions?status=pending`);
}

// Boardroom API (port 4040)
export async function getBoardroomStatus(): Promise<any> {
  return fetchJson<any>(`${BR_URL}/api/status`);
}

export async function getActiveMeeting(): Promise<MeetingState> {
  const data = await fetchJson<any>(`${BR_URL}/api/meetings/active`);
  return {
    active: data.active,
    id: data.meeting?.id,
    type: data.meeting?.meeting_type,
    phase: data.meeting?.phase,
    status: data.meeting?.status,
    messages: data.messages || [],
  };
}

export async function getAgents(): Promise<any> {
  return fetchJson<any>(`${BR_URL}/api/agents`);
}

export async function getTeams(): Promise<any> {
  return fetchJson<any>(`${BR_URL}/api/agents/teams`);
}

// System health from boardroom proxy
export async function getSystemHealth(): Promise<any> {
  return fetchJson<any>(`${BR_URL}/api/system-health`);
}

// Activity feed from boardroom proxy
export async function getFeed(): Promise<any[]> {
  return fetchJson<any[]>(`${BR_URL}/api/feed`);
}

// Agent schedules / activity
export async function getAgentActivity(): Promise<any[]> {
  return fetchJson<any[]>(`${BR_URL}/api/agent-activity`);
}