using System; namespace StellaOps.Signals.Options; public sealed class SignalsAirGapOptions { public SignalsSealedModeOptions SealedMode { get; } = new(); public void Validate() { SealedMode.Validate(); } } public sealed class SignalsSealedModeOptions { public bool EnforcementEnabled { get; set; } public string? EvidencePath { get; set; } public TimeSpan MaxEvidenceAge { get; set; } = TimeSpan.FromHours(6); public TimeSpan CacheLifetime { get; set; } = TimeSpan.FromMinutes(1); public bool RequireEvidenceHealth { get; set; } = true; public void Validate() { if (!EnforcementEnabled) { return; } if (string.IsNullOrWhiteSpace(EvidencePath)) { throw new InvalidOperationException("Signals air-gap sealed-mode evidence path must be configured when enforcement is enabled."); } if (MaxEvidenceAge <= TimeSpan.Zero) { throw new InvalidOperationException("Signals air-gap sealed-mode max evidence age must be greater than zero."); } if (CacheLifetime <= TimeSpan.Zero) { throw new InvalidOperationException("Signals air-gap sealed-mode cache lifetime must be greater than zero."); } } }