293 lines
25 KiB
Markdown
293 lines
25 KiB
Markdown
# 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 |
|