// SPDX-License-Identifier: BUSL-1.1 // Sprint: SPRINT_4100_0004_0001 - Security State Delta & Verdict // Task: T6 - Add Delta API endpoints using StellaOps.Policy.Deltas; using StellaOps.Policy.Snapshots; namespace StellaOps.Policy.Gateway.Services; /// /// Adapter that bridges between the KnowledgeSnapshotManifest-based snapshot store /// and the SnapshotData interface required by the DeltaComputer. /// public sealed class DeltaSnapshotServiceAdapter : StellaOps.Policy.Deltas.ISnapshotService { private readonly ISnapshotStore _snapshotStore; private readonly ILogger _logger; public DeltaSnapshotServiceAdapter( ISnapshotStore snapshotStore, ILogger logger) { _snapshotStore = snapshotStore ?? throw new ArgumentNullException(nameof(snapshotStore)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } /// /// Gets snapshot data by ID, converting from KnowledgeSnapshotManifest. /// public async Task GetSnapshotAsync(string snapshotId, CancellationToken ct = default) { if (string.IsNullOrWhiteSpace(snapshotId)) { return null; } var manifest = await _snapshotStore.GetAsync(snapshotId, ct).ConfigureAwait(false); if (manifest is null) { _logger.LogDebug("Snapshot {SnapshotId} not found in store", snapshotId); return null; } return ConvertToSnapshotData(manifest); } private static SnapshotData ConvertToSnapshotData(KnowledgeSnapshotManifest manifest) { // Get policy version from manifest sources var policySource = manifest.Sources.FirstOrDefault(s => s.Type == KnowledgeSourceTypes.Policy); var policyVersion = policySource?.Digest; // Note: In a full implementation, we would fetch and parse the bundled content // from each source to extract packages, reachability, VEX statements, etc. // For now, we return the manifest metadata only. return new SnapshotData { SnapshotId = manifest.SnapshotId, Packages = [], Reachability = [], VexStatements = [], PolicyViolations = [], Unknowns = [], PolicyVersion = policyVersion }; } }