125 lines
3.8 KiB
C#
125 lines
3.8 KiB
C#
using System.ComponentModel;
|
|
using ClawdDotNet.Core.Config;
|
|
|
|
namespace ClawdDotNet.Models;
|
|
|
|
/// <summary>
|
|
/// PropertyGrid-freundlicher Wrapper um InstanceConfig.
|
|
/// Änderungen werden direkt im zugrunde liegenden InstanceConfig-Objekt gespeichert.
|
|
/// </summary>
|
|
[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;
|
|
}
|