| 1 | import type { |
| 2 | ScaOverviewQuery, |
| 3 | ScaOverviewResponse, |
| 4 | ScaPackageAgentsResponse, |
| 5 | ScaPackageRegistryResponse, |
| 6 | ScaPoliciesIndexResponse, |
| 7 | ScaPolicyContentResponse, |
| 8 | SCAReportDeleteResponse, |
| 9 | SCAReportGenerateRequest, |
| 10 | SCAReportGenerateResponse, |
| 11 | SCAReportListResponse, |
| 12 | ScaStatsResponse |
| 13 | } from "@/types/sca.d" |
| 14 | import { HttpClient } from "../httpClient" |
| 15 | import { createSSEStream } from "../sseClient" |
| 16 | |
| 17 | export default { |
| 18 | /** |
| 19 | * Search SCA results across all agents with filtering and pagination |
| 20 | */ |
| 21 | searchScaOverview(query?: ScaOverviewQuery, signal?: AbortSignal) { |
| 22 | return HttpClient.get<ScaOverviewResponse>(`/sca/overview`, { |
| 23 | params: { |
| 24 | customer_code: query?.customer_code, |
| 25 | agent_name: query?.agent_name, |
| 26 | policy_id: query?.policy_id, |
| 27 | policy_name: query?.policy_name, |
| 28 | min_score: query?.min_score, |
| 29 | max_score: query?.max_score, |
| 30 | page: query?.page || 1, |
| 31 | page_size: query?.page_size || 50 |
| 32 | }, |
| 33 | signal |
| 34 | }) |
| 35 | }, |
| 36 | |
| 37 | /** |
| 38 | * Stream SCA results using SSE client (token + params gestiti automaticamente) |
| 39 | */ |
| 40 | async streamScaOverview( |
| 41 | query: ScaOverviewQuery | undefined, |
| 42 | handlers: { |
| 43 | onStart?: (data: any) => void |
| 44 | onAgentResult?: (data: any) => void |
| 45 | onAgentEmpty?: (data: any) => void |
| 46 | onProgress?: (data: any) => void |
| 47 | onComplete?: (data: any) => void |
| 48 | onError?: (error: any) => void |
| 49 | }, |
| 50 | abortController?: AbortController |
| 51 | ): Promise<void> { |
| 52 | await createSSEStream({ |
| 53 | path: "/sca/overview/stream", |
| 54 | params: query |
| 55 | ? { |
| 56 | customer_code: query.customer_code, |
| 57 | agent_name: query.agent_name, |
| 58 | policy_id: query.policy_id, |
| 59 | policy_name: query.policy_name, |
| 60 | min_score: query.min_score, |
| 61 | max_score: query.max_score |
| 62 | } |
| 63 | : undefined, |
| 64 | signal: abortController?.signal, |
| 65 | handlers: { |
| 66 | start: data => handlers.onStart?.(data), |
| 67 | agent_result: data => handlers.onAgentResult?.(data), |
| 68 | agent_empty: data => handlers.onAgentEmpty?.(data), |
| 69 | progress: data => handlers.onProgress?.(data), |
| 70 | complete: data => handlers.onComplete?.(data), |
| 71 | error: data => handlers.onError?.(data), |
| 72 | agent_error: data => handlers.onError?.(data), |
| 73 | onError: err => handlers.onError?.(err) |
| 74 | } |
| 75 | }) |
| 76 | }, |
| 77 | |
| 78 | /** |
| 79 | * Get SCA statistics |
| 80 | */ |
| 81 | getScaStats(customer_code?: string) { |
| 82 | return HttpClient.get<ScaStatsResponse>(`/sca/stats`, { |
| 83 | params: customer_code ? { customer_code } : undefined |
| 84 | }) |
| 85 | }, |
| 86 | |
| 87 | /** |
| 88 | * Generate an SCA report (synchronous) |
| 89 | */ |
| 90 | generateReport(request: SCAReportGenerateRequest) { |
| 91 | return HttpClient.post<SCAReportGenerateResponse>(`/sca/reports/generate`, request) |
| 92 | }, |
| 93 | |
| 94 | /** |
| 95 | * List all SCA reports |
| 96 | */ |
| 97 | listReports(customer_code?: string) { |
| 98 | return HttpClient.get<SCAReportListResponse>(`/sca/reports`, { |
| 99 | params: customer_code ? { customer_code } : undefined |
| 100 | }) |
| 101 | }, |
| 102 | |
| 103 | /** |
| 104 | * Download an SCA report |
| 105 | */ |
| 106 | downloadReport(reportId: number) { |
| 107 | return HttpClient.get<Blob>(`/sca/reports/${reportId}/download`, { |
| 108 | responseType: "blob" |
| 109 | }) |
| 110 | }, |
| 111 | |
| 112 | /** |
| 113 | * Delete an SCA report |
| 114 | */ |
| 115 | deleteReport(reportId: number) { |
| 116 | return HttpClient.delete<SCAReportDeleteResponse>(`/sca/reports/${reportId}`) |
| 117 | }, |
| 118 | |
| 119 | /** |
| 120 | * List all available SCA policies from the CoPilot-SCA repository |
| 121 | */ |
| 122 | getPolicies() { |
| 123 | return HttpClient.get<ScaPoliciesIndexResponse>(`/sca/policies`) |
| 124 | }, |
| 125 | |
| 126 | /** |
| 127 | * Fetch the YAML content of a specific SCA policy |
| 128 | */ |
| 129 | getPolicyContent(policyId: string) { |
| 130 | return HttpClient.get<ScaPolicyContentResponse>(`/sca/policies/${policyId}`) |
| 131 | }, |
| 132 | |
| 133 | /** |
| 134 | * List all tracked SCA-relevant package categories |
| 135 | */ |
| 136 | getPackageRegistry() { |
| 137 | return HttpClient.get<ScaPackageRegistryResponse>(`/sca/packages/registry`) |
| 138 | }, |
| 139 | |
| 140 | /** |
| 141 | * Detect agents running a tracked SCA-relevant package |
| 142 | */ |
| 143 | getAgentsForPackage(registryKey: string) { |
| 144 | return HttpClient.get<ScaPackageAgentsResponse>(`/sca/packages/registry/${registryKey}/agents`) |
| 145 | } |
| 146 | } |