Weboberflaeche hinzugefuegt und Fachlogik nach App herausgeloest (#493, #494)

- ClawdDotNet.Web: Kestrel im Prozess der Anwendung, Token-Absicherung (TokenGate mit FixedTimeEquals), Endpunkte unter /api, Ereignisstrom unter /events (Server-Sent Events) und fortlaufendes Log-Streaming.

- Weboberflaeche (wwwroot/): Vollstaendiges Single-Page-Frontend mit nativem HTML5, CSS3 und ES-Modulen ohne Buildschritt (strikt textContent, #-Routing, sofortiger Login-Sprung bei fehlendem Token, Light/Dark-Theme, lokale Barlow-Schriften).

- ClawdDotNet.App: Fachlogik aus den Avalonia-ViewModels in Dienste herausgeloest (AgentAdministration, JobAdministration, ServiceAdministration, RunCoordinator) und ueber InstanceChange synchronisiert.

- Tests: ClawdDotNet.Web.Tests und ClawdDotNet.App.Tests hinzugefuegt, alle 684 Tests erfolgreich.
This commit is contained in:
Richard
2026-09-07 21:56:02 +02:00
parent cffd6f4b77
commit 1e9cb789c8
64 changed files with 10543 additions and 554 deletions
@@ -0,0 +1,30 @@
namespace ClawdDotNet.App;
/// <summary>Welcher Teil der Instanzkonfiguration sich geändert hat.</summary>
public enum InstanceChangeKind
{
/// <summary>Ein Agent kam dazu, fiel weg oder wurde bearbeitet.</summary>
Agents,
/// <summary>Ein Dienst kam dazu, fiel weg oder wurde umgeschaltet.</summary>
Services,
/// <summary>Ein geplanter Lauf (Agent-Wakeup oder Tool-Job) hat sich geändert.</summary>
Jobs,
/// <summary>Etwas an der Instanz selbst — Budget, Grenzen, Weboberfläche.</summary>
Settings
}
/// <summary>
/// Eine Änderung an der Instanzkonfiguration, so grob, wie eine Oberfläche sie braucht,
/// um den richtigen Bereich neu zu laden.
///
/// <para>Bewusst ohne die geänderten Werte: Beide Oberflächen lesen ohnehin aus
/// <c>AppHost.Instance</c>, und ein zweiter Übertragungsweg für dieselben Daten wäre
/// eine zweite Wahrheit. <see cref="Id"/> ist ein Hinweis, keine Zusage — wer ihn nicht
/// auswerten will, lädt den ganzen Bereich neu.</para>
/// </summary>
/// <param name="Kind">Welcher Bereich betroffen ist.</param>
/// <param name="Id">Agent-, Dienst- oder Job-Kennung, sofern es genau eine gibt.</param>
public readonly record struct InstanceChange(InstanceChangeKind Kind, string? Id = null);