using StellaOps.AuditPack.Models; namespace StellaOps.AuditPack.Services; public sealed partial class IsolatedReplayContext { /// /// Initializes the replay context from a bundle read result. /// public async Task InitializeAsync( AuditBundleReadResult bundleResult, CancellationToken cancellationToken = default) { if (_disposed) { throw new ObjectDisposedException(nameof(IsolatedReplayContext)); } if (!bundleResult.Success || bundleResult.ReplayInputs is null) { return ReplayContextInitResult.Failed("Bundle read result is invalid or has no replay inputs"); } try { var inputs = bundleResult.ReplayInputs; if (inputs.Sbom is null) { return ReplayContextInitResult.Failed("SBOM is required for replay"); } Sbom = inputs.Sbom; SbomDigest = ComputeDigest(Sbom); if (inputs.FeedsSnapshot is null) { return ReplayContextInitResult.Failed("Feeds snapshot is required for replay"); } FeedsSnapshot = inputs.FeedsSnapshot; FeedsDigest = ComputeDigest(FeedsSnapshot); if (inputs.PolicyBundle is null) { return ReplayContextInitResult.Failed("Policy bundle is required for replay"); } PolicyBundle = inputs.PolicyBundle; PolicyDigest = ComputeDigest(PolicyBundle); if (inputs.VexStatements is not null) { VexStatements = inputs.VexStatements; VexDigest = ComputeDigest(VexStatements); } if (inputs.Verdict is not null) { OriginalVerdict = inputs.Verdict; } if (bundleResult.Manifest?.TimeAnchor?.Timestamp is DateTimeOffset anchorTime) { EvaluationTime = anchorTime; } await ExtractInputsAsync(cancellationToken).ConfigureAwait(false); IsInitialized = true; return new ReplayContextInitResult { Success = true, SbomDigest = SbomDigest, FeedsDigest = FeedsDigest, PolicyDigest = PolicyDigest, VexDigest = VexDigest, EvaluationTime = EvaluationTime }; } catch (Exception ex) { return ReplayContextInitResult.Failed($"Failed to initialize replay context: {ex.Message}"); } } }