export interface BossAdminMenuItem { key: string; label: string; children?: BossAdminMenuItem[]; } export interface BossAdminTaskSlaRow extends Record { taskId: string; riskId: string; projectId: string; deviceId: string; taskType: string; status: string; phase: string; summary: string; slaLevel: "ok" | "watch" | "breached" | "recoverable" | "terminal"; severity: "info" | "warning" | "critical"; slaDueAt: string; lastProgressAt: string; attemptLabel: string; stale: boolean; recoverable: boolean; autoRecoverable: boolean; recommendedAction: string; } export interface BossAdminTaskSlaPanel { generatedAt: string; summary: Record; rows: BossAdminTaskSlaRow[]; } export interface BossAdminBackofficePayload { ok: boolean; surface: "platform" | "enterprise"; currentCompany: Record | null; menuTree: BossAdminMenuItem[]; insights: { onboardingSteps: string[]; serviceStatuses: Array>; openingPreview: Array>; deliveryChecklist: Array>; recentCompanies: Array>; customerHealthRows: Array>; riskAggregates: Array>; customerFollowups: Array>; enterpriseGoals: Array>; organizationUnits: string[]; departmentProgress: Array>; masterAgentSummary: string[]; permissionHighlights: string[]; agentFlowSteps: string[]; skillUsageAudit: Array>; recoveryActions: string[]; backupStatus: Record; dataSafetySummary: Record; taskRiskSummary: Record; taskSlaPanel: BossAdminTaskSlaPanel; capabilitySummary: Record; surface: "platform" | "enterprise"; }; workbench: { summary: Record; companies: Array>; devices: Array>; risks: Array>; notifications: Array>; grantsSummary: Record; }; tenants: Array>; users: Array>; roles: { builtInRoles: Array>; permissionTemplates: Array>; }; resourceGroups: { devices: Array>; projects: Array>; skills: Array>; grants: Record>>; }; audit: { risks: Array>; notifications: Array>; riskTimeline: Array>; permissionLogs: Array>; }; yudaoMapping: Record; } export interface BossAdminBackupSnapshot { snapshotId: string; fileName: string; absolutePath: string; bytes: number; sha256: string; createdAt: string; actorAccount?: string; reason?: string; schemaVersion?: number; } export interface BossAdminBackupStatus { mode: "file"; backupDir: string; stateFile: string; restorePointCount: number; lastBackupAt?: string; status: "ready" | "empty" | "error"; detail?: string; } export interface BossAdminBackupsPayload { ok: boolean; status: BossAdminBackupStatus; snapshots: BossAdminBackupSnapshot[]; } export interface BossAdminSkillLifecycleRequest extends Record { requestId: string; action: string; status: string; deviceId: string; skillId?: string; sourceUrl?: string; targetVersion?: string; rollbackToVersion?: string; lockedVersion?: string; requestedAt?: string; completedAt?: string; resultSummary?: string; error?: string; } export interface BossAdminSkillLifecycleRequestsPayload { ok: boolean; requests: BossAdminSkillLifecycleRequest[]; } async function requestJson(url: string, init: RequestInit = {}): Promise { const response = await fetch(url, { credentials: "include", ...init, headers: { Accept: "application/json", ...(init.body ? { "Content-Type": "application/json" } : {}), ...(init.headers ?? {}), }, }); if (response.status === 401) { window.location.href = "/auth/login"; throw new Error("UNAUTHORIZED"); } if (!response.ok) { const payload = await response.json().catch(() => null); throw new Error(payload?.message ?? `HTTP_${response.status}`); } return response.json(); } export async function fetchBossAdminBackoffice(scope: "platform" | "enterprise" = "platform"): Promise { return requestJson(`/api/v1/admin/backoffice?scope=${scope}`); } export async function postAdminAccess(payload: Record) { return requestJson>("/api/v1/admin/access", { method: "POST", body: JSON.stringify(payload), }); } export async function postRiskAction(payload: Record) { return requestJson>("/api/v1/admin/risks/actions", { method: "POST", body: JSON.stringify(payload), }); } export async function postSkillLifecycleRequest(payload: Record) { return requestJson>("/api/v1/admin/skills/requests", { method: "POST", body: JSON.stringify(payload), }); } export async function fetchSkillLifecycleRequests(): Promise { return requestJson("/api/v1/admin/skills/requests", { method: "GET", }); } export async function postDeviceCodexRemoteControl( deviceId: string, payload: { action: "start" | "stop"; reason?: string }, ) { return requestJson>( `/api/v1/devices/${encodeURIComponent(deviceId)}/codex-remote-control`, { method: "POST", body: JSON.stringify({ ...payload, confirmed: true, }), }, ); } export async function fetchAdminBackups(): Promise { return requestJson("/api/v1/admin/backups"); } export async function createAdminBackup(reason: string) { return requestJson>("/api/v1/admin/backups", { method: "POST", body: JSON.stringify({ action: "create_snapshot", reason, }), }); } export async function restoreAdminBackup(snapshotId: string) { return requestJson>("/api/v1/admin/backups", { method: "POST", body: JSON.stringify({ action: "restore_snapshot", snapshotId, }), }); }