Stufe 1 (#764): Agent bearbeiten, Lizenz und Einstellungen in der WebUI

- PUT /api/agents/{id} und /texts: Stammdaten, Grenzen, Budget, Identity/Soul/
  Systemprompt (L6/L7); "Jetzt ausfuehren" in der Agentenansicht (L9)
- Lizenzschluessel ueber die Weboberflaeche (L1): erst vom Lizenzserver
  bestaetigt, dann gespeichert; hebt die Sperre ohne Neustart auf
- GET/PUT /api/settings: Instanz- und Anwendungseinstellungen inkl.
  OpenRouter-Key (L3/L4/L5), Geheimnisse nur schreibend
- GET/PUT /api/verwaltung/settings: Deploymentcenter und Update-Kanal des Managers
- Einstellungsseite zeigt echte Werte statt fester Texte
- NonInteractiveLicensePrompt verwies auf --license-set-key, den es nie gab
- Sprachpakete werden bei jedem Lauf geprueft (LanguagePackTests)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-10-02 13:30:20 +02:00
co-authored by Claude Opus 5.5
parent a9ce72abe2
commit 8552755bb6
20 changed files with 1677 additions and 322 deletions
+8 -3
View File
@@ -37,8 +37,13 @@ public interface ILicensePrompt
/// Für den kopflosen Betrieb: fragt nicht, sondern lehnt ab.
///
/// Ein Dienst ohne Sitzung kann keinen Schlüssel entgegennehmen. Statt zu blockieren
/// meldet er, was zu tun ist — der Schlüssel wird vorab über die Kommandozeile
/// hinterlegt (<c>--license-set-key</c>).
/// meldet er, was zu tun ist.
///
/// <para>#764: Here stood that the key is set beforehand on the command line
/// (<c>--license-set-key</c>). That switch was planned and never built — the log pointed
/// everyone who needed it at something that does not exist. The way in is the web
/// interface (<see cref="LicenseGate.ApplyKeyAsync"/>) or <c>licenseKey</c> in
/// <c>manager.json</c>, written by the installer.</para>
/// </summary>
public sealed class NonInteractiveLicensePrompt(Action<string> log) : ILicensePrompt
{
@@ -46,7 +51,7 @@ public sealed class NonInteractiveLicensePrompt(Action<string> log) : ILicensePr
{
log($"Lizenz erforderlich, aber kein Eingabeweg vorhanden. Hardware-ID: {hardwareId}. "
+ (problem is null ? "" : $"Grund: {problem}. ")
+ "Schlüssel mit '--license-set-key <SCHLÜSSEL>' hinterlegen.");
+ "Enter the key in the web interface (Settings > License) or as licenseKey in manager.json.");
return Task.FromResult<string?>(null);
}