2026-06-15 20:47:41 +02:00
|
|
|
import api from "./client";
|
|
|
|
|
|
|
|
|
|
export interface CockpitSummary {
|
|
|
|
|
basis: string;
|
|
|
|
|
north_star: string;
|
|
|
|
|
objectives: Record<string, unknown>[];
|
|
|
|
|
delivery: {
|
|
|
|
|
task_counts: Record<string, number>;
|
|
|
|
|
in_flight: number;
|
|
|
|
|
blocked: number;
|
|
|
|
|
awaiting_ceo: number;
|
2026-06-18 03:33:47 +02:00
|
|
|
completed_30d?: number;
|
2026-06-15 20:47:41 +02:00
|
|
|
};
|
|
|
|
|
spend: {
|
|
|
|
|
spend_30d_usd: number;
|
|
|
|
|
projected_monthly_usd: number | null;
|
|
|
|
|
monthly_budget_cap_usd: number | null;
|
|
|
|
|
over_budget: boolean;
|
|
|
|
|
};
|
|
|
|
|
pending_pitches: number;
|
2026-06-16 08:40:51 +02:00
|
|
|
signals: CockpitSignal[];
|
2026-06-18 03:33:47 +02:00
|
|
|
median_lead_time_hours?: number | null;
|
2026-06-16 08:40:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export interface CockpitSignal {
|
|
|
|
|
kind: string;
|
|
|
|
|
summary: string;
|
|
|
|
|
detail: string;
|
2026-06-15 20:47:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const cockpitApi = {
|
|
|
|
|
// GET /api/cockpit/summary — read-only company snapshot (CEO / Board / PM).
|
|
|
|
|
summary: async (): Promise<CockpitSummary> => {
|
|
|
|
|
const { data } = await api.get<CockpitSummary>("/cockpit/summary");
|
|
|
|
|
return data;
|
|
|
|
|
},
|
2026-06-16 08:40:51 +02:00
|
|
|
|
|
|
|
|
// GET /api/cockpit/signals — just the strategy-engine signals (Dashboard panel);
|
|
|
|
|
// lighter than /summary, which runs the full goals/usage/counts/pitches fan-out.
|
|
|
|
|
signals: async (): Promise<CockpitSignal[]> => {
|
|
|
|
|
const { data } = await api.get<{ signals: CockpitSignal[] }>(
|
|
|
|
|
"/cockpit/signals"
|
|
|
|
|
);
|
|
|
|
|
return data.signals;
|
|
|
|
|
},
|
2026-06-15 20:47:41 +02:00
|
|
|
};
|