using System.ComponentModel; using ClawdDotNet.Core.Config; namespace ClawdDotNet.Models; /// /// PropertyGrid-freundlicher Wrapper um InstanceConfig. /// Änderungen werden direkt im zugrunde liegenden InstanceConfig-Objekt gespeichert. /// [TypeConverter(typeof(ExpandableObjectConverter))] public sealed class InstanceSettingsViewModel { private readonly InstanceConfig _config; public InstanceSettingsViewModel(InstanceConfig config) { _config = config; } [Category("Instanz")] [DisplayName("Instanz-ID")] [Description("Eindeutige ID dieser laufenden Instanz.")] public string InstanceId { get => _config.InstanceId; set => _config.InstanceId = value; } [Category("Instanz")] [DisplayName("Instanzname")] [Description("Anzeigename dieser Instanz (z.B. 'Aktien-Team').")] public string InstanceName { get => _config.InstanceName; set => _config.InstanceName = value; } [Category("API")] [DisplayName("OpenRouter API-Key")] [Description("API-Schlüssel für OpenRouter. Wird für alle Agenten dieser Instanz verwendet.")] [PasswordPropertyText(true)] public string OpenRouterApiKey { get => _config.OpenRouterApiKey; set => _config.OpenRouterApiKey = value; } [Category("Verzeichnisse")] [DisplayName("Arbeitsverzeichnis")] [Description("Basis-Arbeitsverzeichnis für diese Instanz.")] public string WorkingDirectory { get => _config.WorkingDirectory; set => _config.WorkingDirectory = value; } [Category("Verzeichnisse")] [DisplayName("Log-Verzeichnis")] [Description("Verzeichnis für Log-Dateien dieser Instanz.")] public string LogDirectory { get => _config.LogDirectory; set => _config.LogDirectory = value; } [Category("Netzwerk")] [DisplayName("Webserver-Port")] [Description("Port für den integrierten Webserver (0 = deaktiviert).")] public int WebServerPort { get => _config.WebServerPort; set => _config.WebServerPort = value; } [Category("Agenten")] [DisplayName("Anzahl Agenten")] [Description("Anzahl der konfigurierten Agenten in dieser Instanz.")] [ReadOnly(true)] public int AgentCount => _config.Agents.Count; // ─── WatchDog (Instanz-Heartbeat) ─── // Server-URL und Master-Token stehen app-weit in den Anwendungseinstellungen. Die // Instanz registriert sich damit selbst; hier stehen nur Source/Gruppe/Intervall. // Ein/Aus läuft über den Service „Instanz-Watchdog" im Worker-Tab. Änderungen greifen // beim nächsten Start der Instanz. [Category("WatchDog")] [DisplayName("Source")] [Description("Dienst-Kennung im WatchDog. Alle Instanzen teilen sich dieselbe Source.")] public string WatchdogSource { get => _config.Watchdog.Source; set => _config.Watchdog.Source = value; } [Category("WatchDog")] [DisplayName("Gruppe")] [Description("Gruppierung im WatchDog-Dashboard.")] public string WatchdogGroup { get => _config.Watchdog.Group; set => _config.Watchdog.Group = value; } [Category("WatchDog")] [DisplayName("Intervall (Sek)")] [Description("Sende-Takt der Heartbeats in Sekunden (mindestens 5).")] public int WatchdogIntervalSeconds { get => _config.Watchdog.IntervalSeconds; set => _config.Watchdog.IntervalSeconds = value; } [Category("WatchDog")] [DisplayName("Token registriert")] [Description("Ob diese Instanz bereits einen eigenen Agent-Token vom WatchDog erhalten hat.")] [ReadOnly(true)] public bool WatchdogTokenRegistered => _config.Watchdog.HasToken; [Browsable(false)] public InstanceConfig UnderlyingConfig => _config; public override string ToString() => _config.InstanceName; }