using System.Collections.Immutable; using System.Text.Json.Serialization; using StellaOps.Policy.Engine.Attestation; namespace StellaOps.Policy.Engine.ConsoleSurface; /// /// Console request for attestation report query per CONTRACT-VERIFICATION-POLICY-006. /// internal sealed record ConsoleAttestationReportRequest( [property: JsonPropertyName("artifact_digests")] IReadOnlyList? ArtifactDigests, [property: JsonPropertyName("artifact_uri_pattern")] string? ArtifactUriPattern, [property: JsonPropertyName("policy_ids")] IReadOnlyList? PolicyIds, [property: JsonPropertyName("predicate_types")] IReadOnlyList? PredicateTypes, [property: JsonPropertyName("status_filter")] IReadOnlyList? StatusFilter, [property: JsonPropertyName("from_time")] DateTimeOffset? FromTime, [property: JsonPropertyName("to_time")] DateTimeOffset? ToTime, [property: JsonPropertyName("group_by")] ConsoleReportGroupBy? GroupBy, [property: JsonPropertyName("sort_by")] ConsoleReportSortBy? SortBy, [property: JsonPropertyName("page")] int Page = 1, [property: JsonPropertyName("page_size")] int PageSize = 25); /// /// Grouping options for Console attestation reports. /// [JsonConverter(typeof(JsonStringEnumConverter))] internal enum ConsoleReportGroupBy { None, Policy, PredicateType, Status, ArtifactUri } /// /// Sorting options for Console attestation reports. /// [JsonConverter(typeof(JsonStringEnumConverter))] internal enum ConsoleReportSortBy { EvaluatedAtDesc, EvaluatedAtAsc, StatusAsc, StatusDesc, CoverageDesc, CoverageAsc } /// /// Console response for attestation reports. /// internal sealed record ConsoleAttestationReportResponse( [property: JsonPropertyName("schema_version")] string SchemaVersion, [property: JsonPropertyName("summary")] ConsoleReportSummary Summary, [property: JsonPropertyName("reports")] IReadOnlyList Reports, [property: JsonPropertyName("groups")] IReadOnlyList? Groups, [property: JsonPropertyName("pagination")] ConsolePagination Pagination, [property: JsonPropertyName("filters_applied")] ConsoleFiltersApplied FiltersApplied); /// /// Summary of attestation reports for Console. /// internal sealed record ConsoleReportSummary( [property: JsonPropertyName("total_artifacts")] int TotalArtifacts, [property: JsonPropertyName("total_attestations")] int TotalAttestations, [property: JsonPropertyName("status_breakdown")] ImmutableDictionary StatusBreakdown, [property: JsonPropertyName("coverage_rate")] double CoverageRate, [property: JsonPropertyName("compliance_rate")] double ComplianceRate, [property: JsonPropertyName("average_age_hours")] double AverageAgeHours); /// /// Console-friendly artifact attestation report. /// internal sealed record ConsoleArtifactReport( [property: JsonPropertyName("artifact_digest")] string ArtifactDigest, [property: JsonPropertyName("artifact_uri")] string? ArtifactUri, [property: JsonPropertyName("artifact_short_digest")] string ArtifactShortDigest, [property: JsonPropertyName("status")] string Status, [property: JsonPropertyName("status_label")] string StatusLabel, [property: JsonPropertyName("status_icon")] string StatusIcon, [property: JsonPropertyName("attestation_count")] int AttestationCount, [property: JsonPropertyName("coverage_percentage")] double CoveragePercentage, [property: JsonPropertyName("policies_passed")] int PoliciesPassed, [property: JsonPropertyName("policies_failed")] int PoliciesFailed, [property: JsonPropertyName("evaluated_at")] DateTimeOffset EvaluatedAt, [property: JsonPropertyName("evaluated_at_relative")] string EvaluatedAtRelative, [property: JsonPropertyName("details")] ConsoleReportDetails? Details); /// /// Detailed report information for Console. /// internal sealed record ConsoleReportDetails( [property: JsonPropertyName("predicate_types")] IReadOnlyList PredicateTypes, [property: JsonPropertyName("policies")] IReadOnlyList Policies, [property: JsonPropertyName("signers")] IReadOnlyList Signers, [property: JsonPropertyName("issues")] IReadOnlyList Issues); /// /// Predicate type status for Console. /// internal sealed record ConsolePredicateTypeStatus( [property: JsonPropertyName("type")] string Type, [property: JsonPropertyName("type_label")] string TypeLabel, [property: JsonPropertyName("status")] string Status, [property: JsonPropertyName("status_label")] string StatusLabel, [property: JsonPropertyName("freshness")] string Freshness); /// /// Policy status for Console. /// internal sealed record ConsolePolicyStatus( [property: JsonPropertyName("policy_id")] string PolicyId, [property: JsonPropertyName("policy_version")] string PolicyVersion, [property: JsonPropertyName("status")] string Status, [property: JsonPropertyName("status_label")] string StatusLabel, [property: JsonPropertyName("verdict")] string Verdict); /// /// Signer information for Console. /// internal sealed record ConsoleSignerInfo( [property: JsonPropertyName("key_fingerprint_short")] string KeyFingerprintShort, [property: JsonPropertyName("issuer")] string? Issuer, [property: JsonPropertyName("subject")] string? Subject, [property: JsonPropertyName("algorithm")] string Algorithm, [property: JsonPropertyName("verified")] bool Verified, [property: JsonPropertyName("trusted")] bool Trusted); /// /// Issue for Console display. /// internal sealed record ConsoleIssue( [property: JsonPropertyName("severity")] string Severity, [property: JsonPropertyName("message")] string Message, [property: JsonPropertyName("field")] string? Field); /// /// Report group for Console. /// internal sealed record ConsoleReportGroup( [property: JsonPropertyName("key")] string Key, [property: JsonPropertyName("label")] string Label, [property: JsonPropertyName("count")] int Count, [property: JsonPropertyName("status_breakdown")] ImmutableDictionary StatusBreakdown); /// /// Pagination information for Console. /// internal sealed record ConsolePagination( [property: JsonPropertyName("page")] int Page, [property: JsonPropertyName("page_size")] int PageSize, [property: JsonPropertyName("total_pages")] int TotalPages, [property: JsonPropertyName("total_items")] int TotalItems, [property: JsonPropertyName("has_next")] bool HasNext, [property: JsonPropertyName("has_previous")] bool HasPrevious); /// /// Applied filters information for Console. /// internal sealed record ConsoleFiltersApplied( [property: JsonPropertyName("artifact_count")] int ArtifactCount, [property: JsonPropertyName("policy_ids")] IReadOnlyList? PolicyIds, [property: JsonPropertyName("predicate_types")] IReadOnlyList? PredicateTypes, [property: JsonPropertyName("status_filter")] IReadOnlyList? StatusFilter, [property: JsonPropertyName("time_range")] ConsoleTimeRange? TimeRange); /// /// Time range for Console filters. /// internal sealed record ConsoleTimeRange( [property: JsonPropertyName("from")] DateTimeOffset? From, [property: JsonPropertyName("to")] DateTimeOffset? To); /// /// Console request for attestation statistics dashboard. /// internal sealed record ConsoleAttestationDashboardRequest( [property: JsonPropertyName("time_range")] string? TimeRange, [property: JsonPropertyName("policy_ids")] IReadOnlyList? PolicyIds, [property: JsonPropertyName("artifact_uri_pattern")] string? ArtifactUriPattern); /// /// Console response for attestation statistics dashboard. /// internal sealed record ConsoleAttestationDashboardResponse( [property: JsonPropertyName("schema_version")] string SchemaVersion, [property: JsonPropertyName("overview")] ConsoleDashboardOverview Overview, [property: JsonPropertyName("trends")] ConsoleDashboardTrends Trends, [property: JsonPropertyName("top_issues")] IReadOnlyList TopIssues, [property: JsonPropertyName("policy_compliance")] IReadOnlyList PolicyCompliance, [property: JsonPropertyName("evaluated_at")] DateTimeOffset EvaluatedAt); /// /// Dashboard overview for Console. /// internal sealed record ConsoleDashboardOverview( [property: JsonPropertyName("total_artifacts")] int TotalArtifacts, [property: JsonPropertyName("total_attestations")] int TotalAttestations, [property: JsonPropertyName("pass_rate")] double PassRate, [property: JsonPropertyName("coverage_rate")] double CoverageRate, [property: JsonPropertyName("average_freshness_hours")] double AverageFreshnessHours); /// /// Dashboard trends for Console. /// internal sealed record ConsoleDashboardTrends( [property: JsonPropertyName("pass_rate_change")] double PassRateChange, [property: JsonPropertyName("coverage_rate_change")] double CoverageRateChange, [property: JsonPropertyName("attestation_count_change")] int AttestationCountChange, [property: JsonPropertyName("trend_direction")] string TrendDirection); /// /// Dashboard issue for Console. /// internal sealed record ConsoleDashboardIssue( [property: JsonPropertyName("issue")] string Issue, [property: JsonPropertyName("count")] int Count, [property: JsonPropertyName("severity")] string Severity); /// /// Dashboard policy compliance for Console. /// internal sealed record ConsoleDashboardPolicyCompliance( [property: JsonPropertyName("policy_id")] string PolicyId, [property: JsonPropertyName("policy_version")] string PolicyVersion, [property: JsonPropertyName("compliance_rate")] double ComplianceRate, [property: JsonPropertyName("artifacts_evaluated")] int ArtifactsEvaluated);