Merge Stufe 0 (#764): Bestandsaufnahme Desktop gegen WebUI

This commit is contained in:
Richard
2026-10-02 13:17:45 +02:00
@@ -94,6 +94,13 @@ Empfehlung (vom Menschen noch zu bestätigen, bevor du anfängst — frage im Ro
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.
### Stufe 3 — Avalonia-Fenster entfernen (Flash: mit Vorsicht)
- `Views/`, `Controls/`, `Converters/`, ViewModels der Fenster, `App.axaml` — weg.
@@ -166,6 +173,63 @@ Im Zweifel: deutsch lassen und im Code mit einem englischen Namen kapseln.
## 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 |