import axios from 'axios'; import { getApiKey, getApiUrl, getProjectId } from './config.js'; import { RoadmapChunk } from '@rigstate/shared'; import { isDaemonRunning } from './service-manager.js'; import { tailFile } from './files.js'; import path from 'path'; import os from 'os'; export interface DashboardData { roadmap: RoadmapChunk[]; activeTask: RoadmapChunk | null; daemonStatus: boolean; daemonLogs: string[]; apiUrl: string; hiveStats?: { total_antidotes: number; fortress_rules: number; pending_quarantine: number; average_trust_score: number; }; nexusAlerts?: any[]; systemInsights?: any[]; } export async function fetchDashboardData(): Promise { const apiKey = getApiKey(); const apiUrl = getApiUrl(); const projectId = getProjectId(); if (!projectId) { throw new Error('Project context missing.'); } // Parallel fetch for speed const [roadmapRes, hiveRes, alertsRes, insightsRes] = await Promise.allSettled([ axios.get(`${apiUrl}/api/v1/roadmap?project_id=${projectId}`, { headers: { Authorization: `Bearer ${apiKey}` } }), axios.get(`${apiUrl}/api/v1/antidotes/stats`, { headers: { Authorization: `Bearer ${apiKey}` } }), axios.get(`${apiUrl}/api/v1/hive/alerts`, { headers: { Authorization: `Bearer ${apiKey}` } }), axios.get(`${apiUrl}/api/v1/system/insights?project_id=${projectId}`, { headers: { Authorization: `Bearer ${apiKey}` } }) ]); if (roadmapRes.status === 'rejected' || !roadmapRes.value.data.success) { throw new Error('Failed to fetch roadmap data'); } const tasks: RoadmapChunk[] = roadmapRes.value.data.data.roadmap || []; const active = tasks.find(t => t.status === 'IN_PROGRESS') || tasks.find(t => t.status === 'ACTIVE') || null; const isRunning = await isDaemonRunning(); const logPath = path.join(os.homedir(), '.rigstate', 'logs', 'daemon.out.log'); const logs = await tailFile(logPath, 10); const hiveStats = (hiveRes.status === 'fulfilled' && hiveRes.value.data.success) ? hiveRes.value.data.data : undefined; const nexusAlerts = (alertsRes.status === 'fulfilled' && alertsRes.value.data.success) ? alertsRes.value.data.alerts : []; return { roadmap: tasks, activeTask: active, daemonStatus: isRunning, daemonLogs: logs, apiUrl, hiveStats, nexusAlerts, systemInsights: (insightsRes.status === 'fulfilled' && insightsRes.value.data.success) ? insightsRes.value.data.insights : [] }; }