using System.Text.Json; using System.Text.Json.Serialization; namespace Journal.WebGateway.Infrastructure; public sealed class WebUiState(string distPath) { public string DistPath { get; } = distPath; public bool Exists => Directory.Exists(DistPath) && File.Exists(Path.Combine(DistPath, "index.html")); } public sealed class SidecarRootState(string autoRoot) { private readonly object _sync = new(); private string _fallbackRoot = autoRoot; private string _currentRoot = autoRoot; private bool _isCustom; public (string Root, bool IsCustom) Get() { lock (_sync) return (_currentRoot, _isCustom); } public void SetResolved(string path, bool isCustom) { lock (_sync) { _currentRoot = Path.GetFullPath(path.Trim()); _isCustom = isCustom; if (!isCustom) _fallbackRoot = _currentRoot; } } public void ResetToFallback() { lock (_sync) { _currentRoot = _fallbackRoot; _isCustom = false; } } } public sealed class SetSidecarRootRequest { public string? Path { get; set; } } public sealed class CommandEnvelope { public string Action { get; set; } = ""; public string? CorrelationId { get; set; } public string? Id { get; set; } public string? Type { get; set; } public string? Tag { get; set; } public JsonElement? Payload { get; set; } }