using System; using System.Collections.Generic; namespace CodexProviderSync.Core; public sealed record CurrentProviderInfo(string Provider, bool Implicit); public sealed class ProviderCounts { public Dictionary Sessions { get; init; } = new(StringComparer.Ordinal); public Dictionary ArchivedSessions { get; init; } = new(StringComparer.Ordinal); public bool Unreadable { get; init; } public string? Error { get; init; } } public sealed class StatusSnapshot { public required string CodexHome { get; init; } public required CurrentProviderInfo CurrentProvider { get; init; } public required IReadOnlyList ConfiguredProviders { get; init; } public required ProviderCounts RolloutCounts { get; init; } public required IReadOnlyList LockedRolloutFiles { get; init; } public required IReadOnlyList UnreadableRolloutFiles { get; init; } public required ProviderCounts EncryptedContentCounts { get; init; } public string? EncryptedContentWarning { get; init; } public required ProviderCounts? SqliteCounts { get; init; } public StateDbLocation? StateDbLocation { get; init; } public SqliteRepairStats? SqliteRepairStats { get; init; } public IReadOnlyList ProjectThreadVisibility { get; init; } = []; public required string BackupRoot { get; init; } public required BackupSummary BackupSummary { get; init; } } public sealed record StateDbLocation(string Path, string RelativePath, string Source); public sealed class SqliteRepairStats { public required int UserEventRowsNeedingRepair { get; init; } public required int CwdRowsNeedingRepair { get; init; } } public sealed class ProjectThreadVisibility { public required string Root { get; init; } public required int InteractiveThreads { get; init; } public required int FirstPageThreads { get; init; } public required int ExactCwdMatches { get; init; } public required int VerbatimCwdRows { get; init; } public required IReadOnlyList Ranks { get; init; } public required string RankPreview { get; init; } public required Dictionary ProviderCounts { get; init; } } public sealed class BackupSummary { public required int Count { get; init; } public required long TotalBytes { get; init; } } public sealed class BackupPruneResult { public required string BackupRoot { get; init; } public required int DeletedCount { get; init; } public required int RemainingCount { get; init; } public required long FreedBytes { get; init; } } public sealed class SessionChange { public required string Path { get; init; } public string? ThreadId { get; init; } public required string Directory { get; init; } public required string OriginalFirstLine { get; init; } public required string OriginalSeparator { get; init; } public required int OriginalOffset { get; init; } public required long OriginalFileLength { get; init; } public required long OriginalLastWriteTimeUtcTicks { get; init; } public required string OriginalProvider { get; init; } public required string UpdatedFirstLine { get; init; } } public sealed class SessionChangeCollection { public required IReadOnlyList Changes { get; init; } public required IReadOnlyList LockedPaths { get; init; } public required IReadOnlyList UnreadablePaths { get; init; } public required ProviderCounts ProviderCounts { get; init; } public required ProviderCounts EncryptedContentCounts { get; init; } public required IReadOnlyCollection UserEventThreadIds { get; init; } public required IReadOnlyDictionary ThreadCwdsById { get; init; } } public sealed class SyncResult { public required string CodexHome { get; init; } public required string TargetProvider { get; init; } public required string PreviousProvider { get; init; } public required string BackupDir { get; init; } public required int ChangedSessionFiles { get; init; } public required IReadOnlyList SkippedLockedRolloutFiles { get; init; } public required IReadOnlyList SkippedUnreadableRolloutFiles { get; init; } public required int SqliteRowsUpdated { get; init; } public int SqliteProviderRowsUpdated { get; init; } public int SqliteUserEventRowsUpdated { get; init; } public int SqliteCwdRowsUpdated { get; init; } public int UpdatedWorkspaceRoots { get; init; } public int SavedWorkspaceRootCount { get; init; } public required bool SqlitePresent { get; init; } public required ProviderCounts RolloutCountsBefore { get; init; } public required ProviderCounts EncryptedContentCounts { get; init; } public string? EncryptedContentWarning { get; init; } public bool ConfigUpdated { get; init; } public BackupPruneResult? AutoPruneResult { get; init; } public string? AutoPruneWarning { get; init; } } public sealed class SessionApplyResult { public required int AppliedCount { get; init; } public required IReadOnlyList AppliedPaths { get; init; } public required IReadOnlyList SkippedPaths { get; init; } } public sealed class RestoreResult { public required string CodexHome { get; init; } public required string BackupDir { get; init; } public required string TargetProvider { get; init; } public DateTimeOffset? CreatedAt { get; init; } public int ChangedSessionFiles { get; init; } } public enum ProviderSource { Config, Rollout, Sqlite, Manual } public sealed class ProviderOption { public required string Id { get; init; } public required IReadOnlyList Sources { get; init; } public bool IsCurrentProvider { get; init; } public bool IsManual { get; init; } public bool IsSaved { get; init; } } public sealed class WindowBoundsState { public int X { get; init; } public int Y { get; init; } public int Width { get; init; } public int Height { get; init; } public bool Maximized { get; init; } } public sealed class AppSettings { public List RecentCodexHomes { get; init; } = []; public string? LastCodexHome { get; init; } public List SavedProviders { get; init; } = []; public List ManualProviders { get; init; } = []; public string? LastSelectedProvider { get; init; } public string? LastBackupDirectory { get; init; } public int BackupRetentionCount { get; init; } = AppConstants.DefaultBackupRetentionCount; public string UiLanguage { get; init; } = "en"; public WindowBoundsState? WindowBounds { get; init; } } public sealed class RestoreBackupOptions { public bool RestoreConfig { get; init; } = true; public bool RestoreDatabase { get; init; } = true; public bool RestoreSessions { get; init; } = true; } internal sealed class BackupMetadataFile { public int Version { get; init; } public required string Namespace { get; init; } public required string CodexHome { get; init; } public required string TargetProvider { get; init; } public required DateTimeOffset CreatedAt { get; init; } public required List DbFiles { get; init; } public int ChangedSessionFiles { get; init; } } internal sealed class SessionBackupManifest { public int Version { get; init; } public required string Namespace { get; init; } public required string CodexHome { get; init; } public required string TargetProvider { get; init; } public required DateTimeOffset CreatedAt { get; init; } public required List Files { get; init; } } internal sealed class SessionBackupManifestEntry { public required string Path { get; init; } public required string OriginalFirstLine { get; init; } public required string OriginalSeparator { get; init; } public long? OriginalLastWriteTimeUtcTicks { get; init; } } public sealed class WorkspaceRootSyncResult { public required bool Present { get; init; } public required bool Updated { get; init; } public required int UpdatedWorkspaceRoots { get; init; } public required int SavedWorkspaceRootCount { get; init; } } public sealed class ThreadCwdStat { public required string Cwd { get; init; } public required string NormalizedCwd { get; init; } public required long Count { get; init; } public required long UpdatedAtMs { get; init; } }