Files
ClawdDotNet/docs/umsetzungsplaene/WebUI-Only-und-Englisch.md
T
2026-10-03 19:00:51 +02:00

293 lines
25 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WebUI als einzige Oberfläche — und Englisch komplett
Auftrag für einen eigenen Agenten. Beschlossen am 2026-10-02 (Mensch). Roadmap-Eintrag im
Deploymentcenter: **#764** (Themenbereich UI). Teil davon: #661 (Englisch als Hauptsprache).
**Lies das ganz, bevor du die erste Datei anfasst.** Die Stufen bauen aufeinander auf, und
mehrere Grenzen in Abschnitt 2 sind keine Stilfragen, sondern Datenverlust oder
Sicherheitslücken, wenn man sie übersieht.
---
## 1 — Worum es geht
1. **Eine Oberfläche statt zwei.** Gepflegt wird nur noch die WebUI
(`src/ClawdDotNet.Manager.Web/wwwroot/`), getragen vom Instanzmanager. Die Avalonia-Fenster
in `src/ClawdDotNet.Desktop/Views` verschwinden. Übrig bleibt eine **Hülle**, die den
Manager startet und die WebUI zeigt.
2. **Englisch komplett.** Seit #661 (2026-09-19) entsteht Neues auf Englisch, Texte kommen aus
Sprachpaketen (`wwwroot/i18n/en.json`, `de.json`). Der Bestand ist noch gemischt. Dieser
Auftrag räumt ihn auf: Bezeichner, Kommentare und Oberflächentexte auf Englisch, jeder
sichtbare Text über einen Sprachschlüssel, Deutsch nur noch als Sprachpaket.
**Warum:** Jede Funktion zweimal zu bauen kostet, die Desktop-Oberfläche hat keine
Testabdeckung, und der Zielbetrieb (Linux, 24/7) läuft ohnehin über Manager und WebUI. Seit
0.1.17 kennt die Desktop-Oberfläche Einheiten, Stichproben, Abstimmungen, Vorlagen, Trigger,
MCP-Server und Automatisierung nicht mehr — die Lücke ist schon da.
---
## 2 — Was nicht passieren darf
| Grenze | Warum |
|---|---|
| **Die Programmdatei `ClawdDotNet` bleibt.** `Program.cs`, `CommandLine.cs`, `HeadlessRun.cs`, `McpBridgeRun.cs` bleiben lauffähig | Sie ist der Instanzprozess (`--headless --managed --instance …`, so startet der Manager jede Instanz) und die MCP-Brücke. Fällt sie weg, startet keine Instanz mehr |
| **Gespeicherte Namen nicht umbenennen** — ohne Migration und Test mit einer alten Datei | Sonst sind Einstellungen, Rechte oder Datenbanken nach dem Update leer oder kaputt. Siehe Abschnitt 6 |
| **Begründungskommentare übersetzen, nie löschen** | Sie erklären, *warum* etwas so ist (oft ein Vorfall). Ein früherer Umbau durch ein Flash-Modell hat sie stillschweigend entfernt. Übersetzen: ja. Kürzen auf „was der Code tut“: nein |
| **Texte, die ein Modell liest, nicht nebenbei umformulieren** | Werkzeugbeschreibungen, `ToolResult`-Meldungen, Rahmen um Fremdinhalt (`UntrustedContent`), Systemhinweise — das sind Prompts. Übersetzen ändert das Verhalten der Agenten. Eigene Stufe, eigener Test auf der VM (Stufe 4d) |
| **Sicherheitsstellen nicht anfassen**, außer in Stufe 2 und nur wie dort beschrieben | `AccessToken.cs`, `TokenGate.cs`, `McpTransport.cs`, alles unter `Security/`, `ConfigSecrets`, Lizenzprüfung |
| **Kein `innerHTML`, kein Paketmanager, keine neuen CDN-Abhängigkeiten** in der WebUI | Siehe [WebUI-Leitfaden](../WebUI-Leitfaden.md) |
| **Radius 0, App-Akzent `var(--accent)`, keine zugeklappten Ebenen** | Hausstil, Entscheidung 2026-09-24 |
| **Nur pushen, wenn alle vier Suiten grün sind** — unter Windows **und** Linux | Siehe [Teststrategie](../Teststrategie.md); Linux auf der Test-VM |
---
## 3 — Die Stufen
Jede Stufe ist ein eigener Branch und ein eigener Merge. Nach jeder Stufe: Suiten grün,
Kommentar am Roadmap-Eintrag (`dc_comment`), dann die nächste.
### Stufe 0 — Bestandsaufnahme (Flash: ja)
Lege eine Tabelle an (in dieser Datei, Abschnitt 7): **jede Funktion der Desktop-Oberfläche**
und ob die WebUI sie hat. Quelle sind die Fenster in `src/ClawdDotNet.Desktop/Views`:
`AddAgentWindow`, `AddJobWindow`, `AddServiceWindow`, `AgentChatsPageView`, `AgentsPageView`,
`BackupPageView`, `ChatPageView`, `InfoPageView`, `InstancePickerWindow`, `LicenseWindow`,
`LogPageView`, `MainWindow`, `RestoreBackupWindow`, `SettingsPageView`, `TasksPageView`,
`TextEditorWindow`, `TokenUsagePageView`, `ToolSettingsView`.
Verdächtig, nur im Desktop zu stehen — besonders genau prüfen:
- Erstinstallation und **Lizenz** (`LicenseWindow`)
- **Wiederherstellungs-Passphrase** des Schlüsselbunds (im Start-Log steht die Warnung „kein
Wiederherstellungsfach“ — wo setzt man sie heute?)
- Instanz anlegen / wählen (`InstancePickerWindow`)
- Sicherung zurückspielen (`RestoreBackupWindow`)
- Dateiauswahl-Dialoge, Texteditor für Identity/Soul (`TextEditorWindow`)
Ergebnis: Liste „fehlt in der WebUI“. Nichts bauen in dieser Stufe.
### Stufe 1 — Lücken der WebUI schließen (Flash: ja für reine Ansichten, nein sobald C# nötig ist)
Für jede Zeile aus Stufe 0 mit „fehlt“: zuerst prüfen, ob die API den Endpunkt hat.
- **Hat sie ihn:** Ansicht bauen, Texte in beide Sprachpakete.
- **Hat sie ihn nicht:** Endpunkt in `src/ClawdDotNet.Web/Endpoints` (Instanz) oder
`src/ClawdDotNet.Manager.Web/Endpoints.cs` (Manager), Fachlogik in `ClawdDotNet.App`
(nie im Endpunkt), mit Test in `tests/ClawdDotNet.Web.Tests` oder `App.Tests`.
Lizenz und Schlüsselbund sind Sicherheitsstellen → starkes Modell.
**Stand 2026-10-02: erledigt** (Branch `feat/764-stufe1-webui-luecken`, Suiten grün unter
Windows und Linux). L1, L3–L11 gebaut, L2 ist #780. Was dabei entschieden wurde:
| Lücke | Weg | Bewusst so |
|---|---|---|
| L1 Lizenz | `PUT /api/verwaltung/license` → `LicenseGate.ApplyKeyAsync` | Gespeichert wird nur ein vom Server bestätigter Schlüssel; abgelehnt oder Server nicht erreichbar → der alte bleibt. Ein bestätigter hebt die Sperre ohne Neustart auf und startet die Autostart-Instanzen |
| L3 Manager | `GET/PUT /api/verwaltung/settings` | Nur Deploymentcenter-Adresse, Master-Token, Update-Kanal. Port, Bindung und Web-Token **nicht** — ein falscher Wert sperrte die Seite aus, von der er gesetzt wurde |
| L3/L4/L5 Instanz + Anwendung | `GET/PUT /api/settings` (`SettingsAdministration`) | Nur bei laufender Instanz: Die Instanzdatei gehört dem Instanzprozess. Die Antwort nennt, was erst nach einem Neustart greift |
| L6/L7 Agent | `PUT /api/agents/{id}`, `GET …/texts` | Lange Texte nicht in der Agentenliste (50–100 Agenten) |
| L8 Werkzeuge | `GET/PUT …/tools/{tool}/form` (`ToolSettingsForms`) | Formular aus den typisierten Klassen; ersetzt werden nur geänderte Schlüssel, sonst bleibt die Datei wie sie war |
| L10 Zeitplan | über `/api/settings`, in der Sicherungsansicht | wie L4 |
| L11 Import | `POST /api/verwaltung/backups/import?name=…`, Datei als Rumpf, bis 4 GB | Nie in ein bestehendes Verzeichnis; Pfade der alten Maschine zurückgesetzt; Kopie neben dem Original bekommt neue ID und neues Melde-Token; Autostart aus |
Nebenbei behoben: `Database.allowedTables` wurde beim Speichern als roher JSON-Text zerlegt;
`api.js` schickte Dateien als `"{}"`; Dialoge blieben beim Seitenwechsel offen; der Log-Hinweis
auf `--license-set-key` zeigte auf einen Schalter, den es nie gab. Die Sprachpakete prüft jetzt
`LanguagePackTests` bei jedem Lauf (gleiche Schlüssel, gleiche Platzhalter, jeder benutzte
Schlüssel vorhanden).
### Stufe 2 — Die Hülle (Flash: nein)
Empfehlung (vom Menschen noch zu bestätigen, bevor du anfängst — frage im Roadmap-Eintrag):
**Starter mit Systembrowser** statt eingebettetem Browser.
- Startet den Instanzmanager, wenn er nicht läuft (unter Linux ist das der systemd-Dienst
`clawddotnet-manager.service` — nicht doppelt starten).
- Öffnet die WebUI im Standardbrowser, angemeldet über einen **Einmal-Link**: der Manager
erzeugt auf Anfrage über seinen lokalen Socket (nicht über TCP) einen Zufallswert, gültig
einmal und höchstens 60 Sekunden; die WebUI tauscht ihn gegen das Sitzungstoken. Das Token
selbst steht nie in einer Adresse.
- Taskleistensymbol mit Zustand (läuft / gestoppt / Fehler) und „WebUI öffnen“.
- Begründung: keine neue Abhängigkeit (ein eingebetteter Browser braucht unter Linux
WebKitGTK als Systempaket), am wenigsten Code.
Der Einmal-Link ist eine neue Anmeldeart — Test für: zweimal benutzt, zu spät benutzt, über
TCP statt Socket angefordert. Alle drei müssen scheitern.
**Entscheidung des Menschen, 2026-10-02: eingebetteter Browser**, nicht Systembrowser. Die
Hülle bleibt ein eigenes Fenster. Folgen: Unter Linux wird eine Web-Engine als Systempaket
gebraucht (WebKitGTK) — das muss ins Paket bzw. in die Installationsanleitung, und die Wahl der
Einbettungsbibliothek ist vor dem Bauen mit dem Menschen abzustimmen (neue Abhängigkeit). Der
Einmal-Link über den lokalen Socket bleibt der Anmeldeweg: Auch ein eingebettetes Fenster soll
das Sitzungstoken nicht in einer Adresse tragen.
**Einbettung, Entscheidung des Menschen 2026-10-02: Avalonia + CEF (Chromium mitgeliefert).**
Probelauf am selben Tag mit `CefGlue.Next.Avalonia` 152.7977.831 (CEF 152, net10):
| Befund | Folge |
|---|---|
| Mit **Avalonia 12.1.1** (Stand des Repos) bricht es beim Anlegen des Browsers: `TypeLoadException: Avalonia.Input.GotFocusEventArgs`. Das Paket ist gegen Avalonia 11.3 gebaut | Die Hülle braucht **Avalonia 11.3.17**. Zwei Avalonia-Fassungen in einem Ausgabeordner gehen nicht |
| Mit Avalonia 11.3.17: Seite geladen, JavaScript ausgewertet — **Windows und Linux-VM (Xvfb :97)**, mit und ohne GPU | technisch tragfähig |
| Windows braucht ein App-Manifest mit `supportedOS` (sonst „Unable to create child window for native control host") | ins Projekt |
| Linux: Chromium wird nur bei `build -r linux-x64` kopiert, nicht bei `publish`; `icudtl.dat` und `.pak` müssen **neben** `libcef.so` liegen (das Paket legt sie nach `Resources/`); ohne `no-first-run` hängt Chromium an einem Nutzungsbedingungen-Dialog | Packaging-Schritt in `deploy/publish.py`, Schalter fest setzen |
| Größe: ~370 MB (linux-x64) zusätzlich | Paket wird entsprechend größer |
| Die Linux-/macOS-CEF-Pakete baut ein kleiner Fork (`Deon-Berlin/CefGlue`) selbst; Windows nutzt die offiziellen `chromiumembeddedframework.runtime` | Lieferkette: native Binärdateien von einem Einzelprojekt |
**Stand 2026-10-03: gebaut** (Branch `feat/764-stufe2-huelle`, nach Stufe 3):
| Teil | Wie |
|---|---|
| `src/ClawdDotNet.Shell` | Eigenes Programm, Avalonia 11.3.17 + CefGlue.Next 152, im Paket unter `shell/` (~378 MB unter Linux). Fenster mit der WebUI, Taskleistensymbol mit Zustand (über den Socket), Menü „öffnen" / „Fenster beenden". Der Manager läuft beim Schließen weiter. `--selftest` meldet, ob die Anmeldung trägt |
| Manager-Socket | `manager-shell.sock` neben `manager.json` (0600) bzw. Named Pipe nur für den eigenen Benutzer. Dort gibt es **nur** `/api/shell/*`, über TCP gibt es diese Pfade nicht (404 in beide Richtungen) |
| Einmal-Link | `POST /api/shell/login-code` (nur Socket) → Code mit 256 Bit, einmal, höchstens 60 s, im **Fragment** (`#code=`), erreicht also keinen Server und kein Protokoll. Die WebUI tauscht ihn über `POST /api/login/exchange` gegen das Token und entfernt ihn sofort aus der Adresse |
| Starter | `ClawdDotNet` ohne Schalter startet `shell/ClawdDotNet.Shell`, fehlt die Hülle, den Systembrowser. Manager finden oder starten (`ManagerStarter` in Core): Antwortet er, nichts tun; gibt es `clawddotnet-manager.service`, den Dienst starten; sonst das Programm |
| Packaging | `publish.py` baut die Hülle mit `dotnet build -r <rid>` (publish ließ Chromium aus) und zieht unter Linux `Resources/*` neben `libcef.so`. `OutputType` für Linux `Exe`, sonst kopiert das Laufzeitpaket nichts. `--no-shell` lässt sie weg |
| Geprüft | Tests: zweimal benutzt, zu spät, über TCP angefordert, Socket führt nur zu `/api/shell` (ShellLoginTests, 8). `--selftest` unter Windows (Hülle startet den Manager selbst) und auf der VM unter Xvfb :97: angemeldet, Code aus der Adresse, TCP 404, Socket `srw-------` |
Auf der VM stieß der Selbststart auf den echten Dienst `clawddotnet-manager.service` (Alltag) und startete — richtig — diesen statt eines zweiten Managers. Für einen Test mit eigener Konfiguration den Wegwerf-Manager deshalb vorher selbst starten.
### Stufe 3 — Avalonia-Fenster entfernen (Flash: mit Vorsicht)
**Stand 2026-10-02: erledigt, vor Stufe 2 gezogen.** Der Mensch hat so entschieden, weil CEF
Avalonia 11.3 braucht und der Instanzprozess gar kein Avalonia mehr laden soll. Vorher
nachgezogen, weil Stufe 0 sie übersehen hatte und es sie nur im Fenster gab:
Telegram-Client-Anmeldung (#794) und Update anbieten/einspielen (#795, im Manager; unter systemd
über `clawddotnet-update.service`). `ClawdDotNet` ohne Schalter startet jetzt den Manager (unter
systemd über den Dienst, nie doppelt) und öffnet die WebUI im Systembrowser, bis die Hülle aus
Stufe 2 das übernimmt. `instanceWindows` in `manager.json` wird gelesen, aber nicht mehr
ausgewertet; die Kette „Fenster nach vorn holen" ist entfernt. Das Linux-Paket hat 38,8 MB,
mit `systemd/`-Vorlagen, und ist auf der VM Ende-zu-Ende geprüft (Instanz anlegen, kopflos
starten, anhalten).
- `Views/`, `Controls/`, `Converters/`, ViewModels der Fenster, `App.axaml` — weg.
- Avalonia-Pakete aus der `.csproj`, soweit die Hülle sie nicht braucht.
- `Program.cs`: ohne `--headless`/`--managed`/MCP-Brücke startet künftig die Hülle.
- `deploy/publish.py` und das Paket prüfen: Was fällt weg, was muss dabei bleiben? Ein
Probepaket mit `--dry-run` bauen und auf der VM `--headless` starten.
- `docs/Oberflaechen-Leitfaden.md` → nach `docs/archiv/`, Verweise in `CLAUDE.md` anpassen.
### Stufe 4 — Englisch komplett
| Teil | Was | Flash? |
|---|---|---|
| **4a** | WebUI: jeder sichtbare Text über `t("…")`, Schlüssel in `en.json` **und** `de.json`. Heute stehen noch Umlaut-Texte direkt in `.js`-Dateien | ja |
| **4b** | WebUI: deutsche Bezeichner in JS (`erstelleElement`, `zeigeMeldung`, `lade` …, 28 Dateien) und CSS-Klassen (`karte`, `schaltflaeche`, `gedaempft` …, ~49) auf Englisch. Mechanisch, aber groß: **eine Umbenennung je Commit**, danach jede Ansicht im Browser öffnen | ja, in kleinen Schritten |
| **4c** | C#: Kommentare und nicht gespeicherte Bezeichner (Klassen, Methoden, Variablen) in ~167 Dateien. `StagingAktion`, `Vorgabe`, `Rahmen`, `Werkzeugrechte` … Öffentliche Namen ändern bricht Aufrufer — nach jedem Schritt bauen und testen | ja, dateiweise |
| **4d** | C#: **Texte, die Modelle lesen** — Werkzeugbeschreibungen, Fehlermeldungen an Agenten, Systemhinweise (~23 Werkzeugdateien, ~20 Meldungen). Danach eine Nacht Testinstanz auf der VM und Audit-Vergleich: arbeiten die Agenten wie vorher? | **nein** |
| **4e** | API-Pfade: `/api/verwaltung`, `/api/instanz`, `/instanzen`, `/hooks/{instanz}` → englisch. Das bricht Absender von außen (n8n, Claude Code über MCP). Alte Pfade eine Version lang als Umleitung behalten | nein |
Prüfung der Sprachpakete nach jeder Stufe:
```
python -c "import json;e=json.load(open('src/ClawdDotNet.Manager.Web/wwwroot/i18n/en.json',encoding='utf-8'));d=json.load(open('src/ClawdDotNet.Manager.Web/wwwroot/i18n/de.json',encoding='utf-8'));print(set(e)^set(d) or 'gleich')"
```
Besser: als Test in `tests/ClawdDotNet.Web.Tests` anlegen, dann prüft ihn jeder Lauf.
---
## 4 — Wer was macht
Der Mensch fragte, ob ein Gemini Flash genügt. Antwort: **für etwa zwei Drittel ja** — für
Stufe 0, 1 (reine Ansichten), 3 und 4a–4c, wenn diese Datei mitgegeben wird und jede Stufe
vor dem Merge von einem starken Modell gegengelesen wird. **Nicht** für Stufe 2 (neue
Anmeldeart), 4d (Prompts) und 4e (Pfade nach außen) und nicht für Lizenz/Schlüsselbund in
Stufe 1.
Gegenlesen heißt mindestens: `git diff --stat` auf unerwartet große Löschungen prüfen; nach
gelöschten Kommentarblöcken suchen (`git diff | grep '^-\s*//'`); Sprachpakete gleich; alle
vier Suiten grün auf Windows und Linux.
---
## 5 — Fertig ist es, wenn
- `src/ClawdDotNet.Desktop` keine Avalonia-Fenster mehr enthält und die Hülle unter Windows
und Linux die WebUI angemeldet öffnet
- jede Funktion aus der Tabelle in Abschnitt 7 in der WebUI erreichbar ist
- `grep -rn "[äöüÄÖÜß]" src --include=*.cs --include=*.js --include=*.css` nur noch
Treffer in `i18n/de.json`-Inhalten, Testdaten und Kommentaren mit Zitaten liefert
- die Testinstanz auf der VM eine Nacht mit der neuen Fassung läuft und das Audit keine
neuen Fehlerbilder zeigt
---
## 6 — Gespeicherte Namen: nicht umbenennen
Diese Namen stehen in Dateien und Datenbanken bestehender Installationen. Eine Umbenennung
braucht eine Migration (alt lesen, neu schreiben) **und** einen Test mit einer alten Datei.
Im Zweifel: deutsch lassen und im Code mit einem englischen Namen kapseln.
| Wo | Beispiele |
|---|---|
| Werkzeugeinstellungen der Agenten (`AgentSettings.json`, `Tools.<Name>`) | `erlaubt`, `verboten` (Datenbank-/Werkzeugrechte), `sharedAccessLevel`, … |
| Tabellen in `state.db` (`SqliteStorage.cs`) | `Dauerfreigaben`, Spalten aller Tabellen |
| Audit-Einträge, `Source`-Werte, `DecidedBy`-Präfixe | werden gelesen und ausgewertet |
| Aufgabendateien (Frontmatter), Taskboard-Felder | `onlyWhenMarketOpen`, `require_approval` … |
| `manager.json`, `InstanceSettings.json` (PascalCase-Altbestand) | Schlüssel exakt so lassen |
| Sprachschlüssel selbst | sind schon englisch — gut so |
---
## 7 — Bestandsaufnahme (Stufe 0 füllt das aus)
Stand 2026-10-02, erhoben gegen `main` (c03d6d0). Quelle je Zeile: die `[RelayCommand]`s und
`[ObservableProperty]`s der Ansichtsmodelle in `src/ClawdDotNet.Desktop/ViewModels`.
| Desktop-Funktion | Fenster | In der WebUI? | Endpunkt vorhanden? | Bemerkung |
|---|---|---|---|---|
| Navigation, Seitenleiste einklappen, Hell/Dunkel, Sprache | `MainWindow` | ja | — | `index.html` / `app.js` |
| Statusleiste: OpenRouter erreichbar, Guthaben, Tokens 1 h/24 h | `MainWindow` | ja | `GET /api/status` | Kopfzeile in `app.js` |
| Benachrichtigungsleiste | `MainWindow` | — | — | war im Desktop immer leer (Platzhalter), entfällt |
| Instanzordner im Dateimanager öffnen | `MainWindow`, `InfoPageView` | nein | — | **entfällt**: Browser kann keinen Ordner öffnen; Pfad steht auf der Info-Seite |
| Instanzliste, wählen, wechseln | `InstancePickerWindow` | ja | `GET /api/verwaltung/instanzen` | `views/instances.js` |
| Instanz anlegen | `InstancePickerWindow` | ja | `POST /api/verwaltung/instanzen` | |
| Instanz starten / anhalten | — (Manager) | ja | `…/start`, `…/stop` | |
| „Fenster der Instanz zeigen" | — | ja | `POST …/instanzen/{id}/fenster`, `/api/instanz/fenster` | **entfällt in Stufe 3** — es gibt dann kein Fenster mehr |
| **Lizenzschlüssel eingeben** (Erststart, Ablauf, Hardwarewechsel) | `LicenseWindow` | **nein** — nur Anzeige „verschlüsselt" | **nein** | Manager fragt nie (`NonInteractiveLicensePrompt`); heute nur über `manager.json` von der Einrichtung. Der Hinweis auf `--license-set-key` im Log verweist auf einen **Schalter, den es nicht gibt**. Sicherheitsstelle → starkes Modell |
| Lizenzschlüssel ändern | `SettingsPageView` | nein | nein | wie oben, Schreiben nur, nie zurücklesen |
| **Wiederherstellungs-Passphrase des Schlüsselbunds** | — | **nein** | **nein** | **Gibt es nirgends**, auch im Desktop nicht: `SecretKeyStore.SetRecoveryPassphrase` hat außer Tests keinen Aufrufer. Die Startwarnung ist damit heute nicht behebbar. Sicherheitsstelle |
| Anwendungseinstellungen: Instanzverzeichnis, Log-Stufe, Log-Zeilen, Log-Takt, OpenRouter-URL, Prüftakt | `SettingsPageView` | **nur Anzeige**, teils fest im JS (`dc.mhdf.de`, Port) | nein | `views/settings.js` zeigt Text, liest keine echten Werte |
| Deploymentcenter: URL, Token, Umgebung, Fehlerberichte an/aus, Updateprüfung, Kanal | `SettingsPageView` | nur Anzeige (fest im JS) | nein | Token = Geheimnis, nur schreiben |
| Instanzeinstellungen: Name, Log-Verzeichnis, Autostart durch Manager | `SettingsPageView` | nur Anzeige | nein | Autostart wird angezeigt (`autostart` in der Instanzliste), aber nicht schaltbar |
| **OpenRouter-API-Schlüssel der Instanz** | `SettingsPageView` | nein (maskiert angezeigt) | nein | ohne ihn startet keine Agent-Engine — Erstinstallation hängt daran |
| Tagesbudget der Instanz (USD, Tokens) | `SettingsPageView` | nein | nein | Agentenbudgets gehen über Einheiten (`/organisation/units/{id}/settings`), das Instanzbudget nicht |
| Agentenliste, Werkzeuge an/aus | `AgentsPageView` | ja | `GET /api/agents`, `PUT …/tools/{tool}` | |
| Agent anlegen / löschen | `AddAgentWindow`, `AgentsPageView` | ja | `POST`/`DELETE /api/agents` | |
| Agent jetzt laufen lassen | `AgentsPageView` | **nein** | ja, `POST /api/agents/{id}/run` | reine Ansicht |
| **Agent bearbeiten**: Anzeigename, Modell, Systemprompt, Beschreibung, Prompt-Caching, max. Schritte/Kontext/Werkzeugausgabe, Zeitlimit, Budget, „wenn erschöpft", aktiv | `AgentsPageView` | **nein** | **nein** (kein `PUT /api/agents/{id}`) | Modell/Budget/„wenn erschöpft" teilweise über Einheiten-Einstellungen (`PerAgent`), der Rest gar nicht |
| **Identity / Soul bearbeiten** (Texteditor) | `TextEditorWindow` | **nein** | **nein** | Dateien im Agentenordner; gehen in den Prompt → Eingabe ist Prompt-Inhalt |
| Agentenordner öffnen | `AgentsPageView` | nein | — | entfällt (Browser) |
| **Werkzeugeinstellungen** je Agent (FTP, Mail, Datenbank, Telegram, DirectAPI, WebFetch, SocialMedia, FileRW) inkl. Zugangsdaten | `ToolSettingsView` | **nur Lesen** | nur `GET …/tools/{tool}/settings`, **kein PUT** | Zugangsdaten → nur schreiben, nie zurücklesen (Muster: `PUT /organisation/units/{id}/credentials`, #692). Gespeicherte Schlüssel bleiben (Abschnitt 6) |
| Werkzeugrechte (erlaubt / Freigabe / verboten) | — | ja | `GET`/`PUT …/rights` | nur WebUI |
| Chat mit Agent, abbrechen, Verlauf löschen | `ChatPageView` | ja | `/api/agents/{id}/chat` | |
| Agentengespräche (A2A) | `AgentChatsPageView` | ja | `GET /api/agents/communications` | |
| Aufgaben / geplante Läufe („Jobs") anlegen, bearbeiten, löschen, an/aus, jetzt starten, Verlauf | `TasksPageView`, `AddJobWindow` | ja (Taskboard) | `/api/tasks` | Desktop-Reiter „Jobs" schreibt die Alt-Konfiguration, die seit #594 **wirkungslos** ist — kein Nachbau |
| Dienste anlegen, löschen, an/aus | `TasksPageView`, `AddServiceWindow` | ja | `/api/services` | |
| Tokenverbrauch | `TokenUsagePageView` | ja (mehr als Desktop) | `/api/usage…` | |
| Protokoll live, Modul-/Stufenfilter, leeren | `LogPageView` | ja | `/events/logs`, `/api/logs/modules` | |
| Protokollordner öffnen | `LogPageView` | nein | — | entfällt (Browser) |
| Sicherung anlegen, Liste, löschen | `BackupPageView` | ja | `/api/verwaltung/instanzen/{id}/backups` | Manager verschlüsselt immer mit dem Lizenzschlüssel; Desktop-Wahl „Zugangsdaten ausschließen / Passphrase" entfällt bewusst |
| Sicherung zurückspielen **in die bestehende Instanz** | `RestoreBackupWindow` | ja | `POST …/backups/{file}/restore` | inkl. fremder Lizenz |
| **Sicherung in ein neues Zielverzeichnis zurückspielen / Sicherungsdatei von außen einspielen** | `RestoreBackupWindow` | **nein** | **nein** | Umzug auf eine neue Maschine: dort gibt es noch keine Instanz und damit keine Sicherungsliste. Braucht Hochladen + „als neue Instanz anlegen" |
| **Automatische Sicherung**: an/aus, Uhrzeit, Anzahl behalten | `BackupPageView` | **nein** | **nein** | Manager führt sie aus (`ManagerBackups`, liest `autoBackupEnabled`/`autoBackupTime` aus `InstanceSettings.json`) — nur einstellen kann man sie nicht mehr |
| Sicherung im Ordner zeigen | `BackupPageView` | nein | — | entfällt (Browser) |
| FTP-Upload der Sicherungen | — | ja | `/api/verwaltung/sicherung/ftp` | nur WebUI |
| Info-Seite: Version, Pfade, Teilsysteme | `InfoPageView` | ja | `GET /api/info` | |
| Beenden | `MainWindow` | — | — | Aufgabe der Hülle (Stufe 2) |
### Fehlt in der WebUI — Eingang für Stufe 1
| # | Lücke | C# nötig? | Sicherheitsstelle? |
|---|---|---|---|
| L1 | Lizenzschlüssel eingeben / ändern (Manager) | ja, Manager-Endpunkt | **ja** |
| ~~L2~~ | Wiederherstellungs-Passphrase setzen | ja — gibt es nirgends | **ja** — vom Menschen am 2026-10-02 herausgelöst: eigenes Item **#780** |
| L3 | Anwendungs- und Deploymentcenter-Einstellungen bearbeiten (Settings-Seite liest heute nichts Echtes) | ja | DC-Token: ja |
| L4 | Instanzeinstellungen: Name, Log-Verzeichnis, Autostart, Instanzbudget | ja | nein |
| L5 | OpenRouter-API-Schlüssel der Instanz setzen | ja | **ja** (Geheimnis) |
| L6 | Agent bearbeiten (Stammdaten, Grenzen, Budget, aktiv) | ja, `PUT /api/agents/{id}` | nein |
| L7 | Identity / Soul bearbeiten | ja | Prompt-Inhalt, nicht Sicherheit |
| L8 | Werkzeugeinstellungen inkl. Zugangsdaten schreiben | ja | **ja** (Geheimnisse) |
| L9 | Agent „jetzt laufen lassen" | nein, Endpunkt da | nein |
| L10 | Automatische Sicherung einstellen | ja | nein |
| L11 | Sicherung hochladen / als neue Instanz zurückspielen — vom Menschen am 2026-10-02 für Stufe 1 bestätigt | ja | Upload → ja |
| L12 | Telegram-Client-Anmeldung (Code, 2FA) — in Stufe 0 übersehen, gefunden in Stufe 3 | ja → **#794** | ja (Zugangsdaten) |
| L13 | Update anbieten und einspielen — in Stufe 0 übersehen, gefunden in Stufe 3 | ja → **#795** | Update-Agent → ja |