using ClaudeDo.Data.Models; using ClaudeDo.Localization; using CommunityToolkit.Mvvm.ComponentModel; namespace ClaudeDo.Ui.ViewModels.Modals.Settings; public sealed partial class GeneralSettingsTabViewModel : ViewModelBase { private readonly ILocalizer? _localizer; private readonly Action? _persist; [ObservableProperty] private string _defaultClaudeInstructions = ""; [ObservableProperty] private string _defaultModel = ModelRegistry.DefaultAlias; [ObservableProperty] private int _defaultMaxTurns = 100; [ObservableProperty] private string _defaultPermissionMode = PermissionModeRegistry.DefaultMode; [ObservableProperty] private int _maxParallelExecutions = 1; // Newline-separated path prefixes excluded from the weekly report. [ObservableProperty] private string _reportExcludedPaths = @"C:\Private"; // 0=Sunday..6=Saturday (System.DayOfWeek); default Wednesday. [ObservableProperty] private int _standupWeekday = (int)DayOfWeek.Wednesday; public IReadOnlyList Models { get; } = ModelRegistry.Aliases; public IReadOnlyList PermissionModes { get; } = PermissionModeRegistry.Modes; public GeneralSettingsTabViewModel() { } public GeneralSettingsTabViewModel(ILocalizer localizer, Action persist) { _localizer = localizer; _persist = persist; Languages = localizer.AvailableLanguages; _selectedLanguage = Languages.FirstOrDefault(l => l.Code == localizer.CurrentCode); } public IReadOnlyList Languages { get; } = Array.Empty(); [ObservableProperty] private LanguageOption? _selectedLanguage; partial void OnSelectedLanguageChanged(LanguageOption? value) { if (value is null || _localizer is null) return; _localizer.SetLanguage(value.Value.Code); _persist?.Invoke(value.Value.Code); } public string? Validate() { if (DefaultMaxTurns < 1 || DefaultMaxTurns > 200) return "Max turns must be between 1 and 200."; if (MaxParallelExecutions < 1 || MaxParallelExecutions > 20) return "Max parallel executions must be between 1 and 20."; return null; } }