using System.Text.Json.Serialization; namespace ClawdDotNet.Core.Config; /// /// Pro-Instanz-Teil der Watchdog-Anbindung ans Deploymentcenter. /// /// Ein Monitor je Instanz. Der Monitor wird serverseitig über das Paar /// source + instance geführt. Alle Instanzen melden unter derselben /// und tragen ihre eigene — damit hat jede /// laufende Instanz einen eigenen Zustand, ein eigenes Intervall und einen eigenen /// Metrik-Verlauf. Fällt eine von dreien aus, fällt genau deren Monitor. /// /// Server-URL und das anwendungsweite Token liegen in den Anwendungseinstellungen. /// Beim ersten Start tauscht die Instanz das Token gegen ein eigenes, eingeschränktes /// Sub-Token (/api/tokens/v1/provision) und legt es hier verschlüsselt ab — /// danach liegt auf der Instanz nicht mehr das Master-Token. /// /// Ein/Aus läuft über den eingebauten Dienst InstanceWatchdog. /// public sealed class WatchdogConfig { /// Dienst-Kennung im Deploymentcenter. Alle Instanzen teilen sich dieselbe Source. [JsonPropertyName("source")] public string Source { get; set; } = "clawddotnet"; /// /// Name dieser Instanz im Monitor. Leer bedeutet: die InstanceId wird /// verwendet — stabil, aber im Dashboard nichtssagend. Wer lesbare Namen möchte, /// trägt hier einen ein; ein späterer Wechsel legt allerdings einen neuen Monitor an. /// [JsonPropertyName("instance")] public string Instance { get; set; } = ""; /// Gruppierung im Dashboard (reine Anzeige, keine Hierarchie). [JsonPropertyName("group")] public string Group { get; set; } = "ClawdDotNet"; /// /// Sende-Takt in Sekunden. Daraus leitet der Evaluator die Schwellen ab: /// nach dem Doppelten warning, nach dem Vierfachen down. /// [JsonPropertyName("intervalSeconds")] public int IntervalSeconds { get; set; } = 60; /// /// Das für diese Instanz ausgestellte Sub-Token. Wird automatisch gesetzt und /// verschlüsselt gespeichert. /// [JsonPropertyName("agentToken")] public string AgentToken { get; set; } = ""; /// True, sobald ein eigenes Token vorliegt. [JsonIgnore] public bool HasToken => !string.IsNullOrWhiteSpace(AgentToken); /// Der Wert, der als instance gemeldet wird. public string ResolveInstance(string instanceId) => string.IsNullOrWhiteSpace(Instance) ? instanceId : Instance.Trim(); }