Stufe 3 (#764): Avalonia-Fenster entfernt

- Views, ViewModels, Controls, Converters, Styles, Services, Desktop-i18n,
  Schriften und App.axaml raus; Avalonia- und Mvvm-Pakete raus
- ClawdDotNet ohne Schalter: Manager starten (unter systemd ueber den Dienst,
  nie doppelt) und WebUI oeffnen (LauncherRun) - bis die Huelle kommt
- Instanzen laufen immer kopflos; instanceWindows wird gelesen, nicht mehr
  ausgewertet; die Kette 'Fenster nach vorn holen' ist entfernt
- Telegram-Anmeldung nur noch ueber die WebUI (tote Dialog-Rueckrufe raus)
- systemd-Vorlagen im Linux-Paket; Oberflaechen-Leitfaden ins Archiv

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-10-02 20:23:12 +02:00
co-authored by Claude Opus 5.5
parent 8ec7896417
commit 6d81693041
104 changed files with 266 additions and 10262 deletions
-19
View File
@@ -164,25 +164,6 @@ internal static class ManagerEndpoints
};
});
// Der Wechsel, wie E-M2 ihn meint: Alle laufen, eine kommt nach vorn. Frueher
// hiess "Instanz wechseln", dass sich der laufende Prozess herunterfaehrt und mit
// einer anderen Instanz neu startet - wer wechselte, beendete zwangslaeufig die
// Instanz, aus der heraus er es tat.
verwaltung.MapPost("/instanzen/{id}/fenster", async (
string id, ManagerCore manager, InstanceRegistry registry, CancellationToken ct) =>
{
if (Find(registry, id) is not { } instanz)
return Results.NotFound(new OutcomeDto(false, $"Es gibt keine Instanz '{id}'."));
return await manager.FocusInstanceAsync(instanz.Directory, ct)
? Results.Ok(new OutcomeDto(true, $"Fenster von '{instanz.Name}' nach vorn geholt."))
: Results.Json(
new OutcomeDto(false,
$"Instanz '{instanz.Name}' hat kein Fenster nach vorn zu holen — "
+ "sie läuft nicht oder läuft kopflos."),
statusCode: StatusCodes.Status409Conflict);
});
verwaltung.MapPost("/instanzen/{id}/stop", async (
string id, ManagerCore manager, InstanceRegistry registry, CancellationToken ct) =>
{
@@ -781,7 +781,6 @@
"instances.selectActive": "Als aktiv wählen",
"instances.start": "Starten",
"instances.stop": "Beenden",
"instances.bringToFront": "Fenster nach vorn",
"instances.createTitle": "Neue Instanz anlegen",
"instances.instanceOfflineError": "Die Instanz ist nicht erreichbar.",
"instances.noInstanceActiveError": "Keine Instanz aktiv. Unter 'Instanzen' starten oder auswählen.",
@@ -781,7 +781,6 @@
"instances.selectActive": "Select as active",
"instances.start": "Start",
"instances.stop": "Stop",
"instances.bringToFront": "Bring window to front",
"instances.createTitle": "Create New Instance",
"instances.instanceOfflineError": "The instance is not reachable.",
"instances.noInstanceActiveError": "No instance is active. Start or select one under 'Instances'.",
@@ -176,19 +176,7 @@ async function ladeInstanzen(istHintergrund = false) {
erstelleElement("span", { text: " " + t("instances.stop") })
);
const fensterBtn = erstelleElement(
"button",
{
klasse: "schaltflaeche flach klein",
disabled: !istLaufend,
title: t("instances.bringToFront"),
onclick: () => holeFensterNachVorn(instanz)
},
erstelleIcon(PFADE.fenster, 14),
erstelleElement("span", { text: " " + t("instances.bringToFront") })
);
fussAktionen.append(waehlenBtn, startenBtn, anhaltenBtn, fensterBtn);
fussAktionen.append(waehlenBtn, startenBtn, anhaltenBtn);
const karte = erstelleKarte(instanz.name, [dl, fussAktionen], {
aktionen: karteKopfAktionen,
@@ -336,17 +324,6 @@ function oeffneSicherheitsStoppDialog(instanz) {
modal.oeffnen();
}
async function holeFensterNachVorn(instanz) {
try {
const antwort = await api(`/verwaltung/instanzen/${encodeURIComponent(instanz.id)}/fenster`, {
method: "POST"
});
zeigeMeldung(antwort?.meldung || `Brought '${instanz.name}' to front.`, "info");
} catch (err) {
zeigeMeldung(`Window focus failed: ${err.message}`, "warnung");
}
}
function oeffneNeueInstanzDialog() {
const formular = erstelleElement("form", {
klasse: "formular-raster",