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:
co-authored by
Claude Opus 5.5
parent
a9ce72abe2
commit
8552755bb6
@@ -74,6 +74,20 @@ public sealed record FtpSettingsUpdateDto(
|
||||
bool Enabled, string Host, int Port, string Username, string? Password,
|
||||
string RemoteDirectory, bool RequireTls, int KeepCount);
|
||||
|
||||
/// <summary>#764: The license as the web interface sees it — never the key, only whether one is set.</summary>
|
||||
public sealed record LicenseStatusDto(bool Enforced, bool Holds, bool KeySet, string? HardwareId);
|
||||
|
||||
/// <summary>#764: A license key entered in the web interface.</summary>
|
||||
public sealed record LicenseKeyDto(string Key);
|
||||
|
||||
/// <summary>#764: The manager's own settings — without the master token, only whether one is set.</summary>
|
||||
public sealed record ManagerSettingsDto(
|
||||
string ConfigFile, string InstancesDirectory, int WebUiPort, string WebUiBinding,
|
||||
string DeploymentcenterUrl, bool MasterTokenSet, string UpdateChannel);
|
||||
|
||||
/// <summary>#764: A change to the manager's settings. <c>null</c> keeps a value, an empty token too.</summary>
|
||||
public sealed record ManagerSettingsUpdateDto(string? DeploymentcenterUrl, string? MasterToken, string? UpdateChannel);
|
||||
|
||||
/// <summary>
|
||||
/// Die HTTP-Fläche des Managers.
|
||||
///
|
||||
@@ -368,6 +382,37 @@ internal static class ManagerEndpoints
|
||||
}
|
||||
});
|
||||
|
||||
// ─── License and manager settings (#764) ───
|
||||
|
||||
verwaltung.MapGet("/license", (ManagerCore manager) =>
|
||||
Results.Ok(new LicenseStatusDto(
|
||||
manager.LicenseEnforced, manager.LicenseHolds,
|
||||
!string.IsNullOrWhiteSpace(manager.Settings.LicenseKey), manager.LicenseHardwareId)));
|
||||
|
||||
// The key goes to the license server before it is stored; a refused key leaves the
|
||||
// current one in place (LicenseGate.ApplyKeyAsync).
|
||||
verwaltung.MapPut("/license", async (LicenseKeyDto input, ManagerCore manager, CancellationToken ct) =>
|
||||
{
|
||||
var result = await manager.ApplyLicenseKeyAsync(input.Key ?? "", ct);
|
||||
return result.Applied
|
||||
? Results.Ok(new OutcomeDto(true, result.Message))
|
||||
: Results.BadRequest(new OutcomeDto(false, result.Message));
|
||||
});
|
||||
|
||||
verwaltung.MapGet("/settings", (ManagerCore manager) =>
|
||||
{
|
||||
var s = manager.Settings;
|
||||
return Results.Ok(new ManagerSettingsDto(
|
||||
manager.SettingsPath, s.InstancesDirectory, s.WebUiPort, s.WebUiBinding,
|
||||
s.DeploymentcenterUrl, !string.IsNullOrWhiteSpace(s.DeploymentcenterMasterToken), s.UpdateChannel));
|
||||
});
|
||||
|
||||
verwaltung.MapPut("/settings", (ManagerSettingsUpdateDto input, ManagerCore manager) =>
|
||||
{
|
||||
var (ok, message) = manager.UpdateSettings(input.DeploymentcenterUrl, input.MasterToken, input.UpdateChannel);
|
||||
return ok ? Results.Ok(new OutcomeDto(true, message)) : Results.BadRequest(new OutcomeDto(false, message));
|
||||
});
|
||||
|
||||
// ─── FTP-Upload der Sicherungen ───
|
||||
|
||||
verwaltung.MapGet("/sicherung/ftp", (ManagerBackups backups) =>
|
||||
|
||||
Reference in New Issue
Block a user