Uebergabehinweise fuer den Frontend-Agenten (#531)

Der C#-Teil des Instanzmanagers ist fertig; was fehlt, ist die
Oberflaeche. Abschnitt 11 im Konzeptpapier ist die Uebergabe dafuer: der
Auftrag in einem Satz, die harte Grenze (keine .cs-Datei, git status darf
nur wwwroot zeigen), die vollstaendige API mit den Antwortcodes, die eine
eigene Behandlung verdienen, eine Reihenfolge, zwei Fallen und die drei
Punkte, die ausdruecklich liegen bleiben, weil sie C# sind.

Der WebUI-Leitfaden war an vier Stellen ueberholt und haette den naechsten
Agenten in die Irre geschickt: wwwroot liegt nicht mehr in
ClawdDotNet.Web, die Oberflaeche laeuft nicht mehr im Prozess der Instanz,
Port und Token stehen in manager.json statt in InstanceSettings.json, und
es gibt nicht mehr ein /api fuer eine Instanz. Ein Korrekturblock steht
jetzt vorweg und verweist auf Abschnitt 11; der Rest des Leitfadens - kein
innerHTML, kein Paketmanager, Token nur im sessionStorage, Farben aus
app.css - gilt unveraendert.

Die Arbeit selbst ist #531 und steht auf der Roadmap. Was nur in einer
Datei steht, ist keine eingeplante Arbeit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-09-09 00:15:20 +02:00
co-authored by Claude Opus 5
parent 7d4e8b3096
commit d44bbeac1d
2 changed files with 161 additions and 1 deletions
+140
View File
@@ -695,3 +695,143 @@ Hochfahren hinterlegte, stillschweigend ein anderer Test als beabsichtigt — de
sagt eine Antwort „diese Instanz läuft bereits", er übernimmt sie, und der Starter wird nie sagt eine Antwort „diese Instanz läuft bereits", er übernimmt sie, und der Starter wird nie
angefasst. Das ist mir dreimal passiert. Der falsche Socket hängt jetzt am falschen angefasst. Das ist mir dreimal passiert. Der falsche Socket hängt jetzt am falschen
Starter: Er antwortet nur, wenn wirklich ein Prozess läuft. Starter: Er antwortet nur, wenn wirklich ein Prozess läuft.
---
## 11 — Übergabe an den Frontend-Agenten
Stand 2026-09-09. Der C#-Teil des Instanzmanagers ist fertig; was fehlt, ist die
Oberfläche. Dieser Abschnitt ist die Übergabe dafür.
### 11.1 Der Auftrag, in einem Satz
**Bringe der Weboberfläche bei, dass es mehrere Instanzen gibt** — Vorhaben **#531**,
alles in `src/ClawdDotNet.Manager.Web/wwwroot/`.
Heute spricht sie `/api/…` an und bekommt die eine laufende Instanz. Laufen zwei,
antwortet der Manager mit **HTTP 409** und der Bitte, die Kopfzeile `X-Instanz` zu setzen.
Dann ist die Oberfläche unbedienbar — und das ist der einzige Punkt, der den
Mehrinstanzbetrieb im Browser noch aufhält.
### 11.2 Die Grenze, und sie ist hart
| Nicht anfassen | Warum |
|---|---|
| **Jede `.cs`-Datei, überall** | Dahinter stehen Prozessaufsicht, Lizenz, Token und die Weiterleitung. Ein Fehler dort beendet Instanzen oder lässt einen Absturz unbemerkt |
| `*.csproj`, `ClawdDotNet.slnx`, `deploy/`, `NuGet.Config` | Bauplan und Release-Strecke |
| `docs/Roadmap.md` zwischen den `<!-- dc:roadmap -->`-Markern | Erzeugte Kopie |
**Ein Griff nach C# ist kein Regelverstoß, sondern ein Befund:** Er heißt, dass die API
etwas nicht hergibt, was sie hergeben müsste. Dann melden (`dc_report`, Projekt
`clawddotnet`) und an der Oberfläche weiterbauen — nicht selbst in den Kern greifen.
Zur Kontrolle vor jeder Abgabe: `git status` darf **ausschließlich** Dateien unter
`src/ClawdDotNet.Manager.Web/wwwroot/` zeigen.
### 11.3 Was sich seit dem WebUI-Leitfaden geändert hat
Der [WebUI-Leitfaden](WebUI-Leitfaden.md) gilt weiter für Stil, Sicherheit und Aufbau der
Oberfläche. Vier Dinge darin sind überholt:
| Damals | Heute |
|---|---|
| `wwwroot` liegt in `src/ClawdDotNet.Web/` | **`src/ClawdDotNet.Manager.Web/`** |
| Die Oberfläche läuft im Prozess der Instanz | Sie läuft im **Instanzmanager**, einem eigenen Prozess |
| `http://127.0.0.1:7001`, Token in `InstanceSettings.json` | **`webUiPort` und `webUiToken` in `manager.json`** (Vorgabe 7000) |
| Eine Instanz, ein `/api` | **N Instanzen**, der Manager leitet weiter |
Der Rest des Leitfadens — kein `innerHTML`, kein Paketmanager, Token nur im
`sessionStorage`, Farben aus `app.css` — gilt unverändert.
### 11.4 Die API, gegen die du baust
**Was den Manager selbst angeht** (wird *nicht* weitergeleitet):
| Aufruf | Was er tut |
|---|---|
| `GET /api/verwaltung/instanzen` | Liste: `{ id, name, zustand, prozess, autostart }` |
| `POST /api/verwaltung/instanzen` `{ "name": "…" }` | Legt eine an |
| `POST /api/verwaltung/instanzen/{id}/start` | Startet sie |
| `POST /api/verwaltung/instanzen/{id}/stop` | Hält sie an |
| `POST /api/verwaltung/instanzen/{id}/fenster` | Holt ihr Desktop-Fenster nach vorn |
`id` ist der Ordnername (`Instance-Test`). `zustand` ist einer von `Unknown`, `Stopped`,
`Running`, `Silent`, `Crashed`.
**Alles andere unter `/api`** geht unverändert an eine Instanz — `/api/info`,
`/api/agents`, `/api/chat`, `/api/jobs`, `/api/tasks`, `/api/staging`, `/api/usage`,
`/api/logs/modules`. Die Übertragungstypen sind dieselben wie bisher; hier ändert sich
nichts außer der Adressierung.
**Welche Instanz gemeint ist**, sagt die Kopfzeile `X-Instanz` mit der `id`. Fehlt sie:
Läuft genau eine, ist sie gemeint. Laufen mehrere, kommt **409** mit einem erklärenden
Text — dann muss die Oberfläche eine wählen lassen. Läuft keine, ebenfalls 409.
**Der Ereignisstrom** (`/events`, `/events/logs`) führt alle laufenden Instanzen zusammen.
Jedes Ereignis hat **zusätzlich** `instanz` (die `id`) und `instanzName`. Die bisherigen
Felder bleiben unverändert — vorhandene Ansichten funktionieren weiter, sie wissen nur
noch nicht, von wem etwas kommt.
**Antwortcodes, die eine eigene Behandlung verdienen:**
| Code | Bedeutung |
|---|---|
| 401 | Token fehlt oder taugt nicht → zurück zur Anmeldung (gibt es schon) |
| **402** | Ohne gültige Lizenz startet keine Instanz |
| **409** | Unklar, welche Instanz gemeint ist — oder eine Aktion passt nicht zum Zustand |
| **502** | Die Instanz antwortet nicht. **Kein Fehler des Managers** — sag das auch so |
### 11.5 Reihenfolge
1. **`X-Instanz` mitschicken.** In `modules/api.js` gibt es genau eine Stelle, an der
`fetch` aufgerufen wird — dort die Kopfzeile aus einer gewählten Instanz setzen. Beim
Ereignisstrom geht das nicht (`EventSource` kann keine Kopfzeilen); dort ist es auch
nicht nötig, der Manager führt ohnehin alle zusammen.
2. **Instanzauswahl im Rahmen.** Eine Liste aus `/api/verwaltung/instanzen`, die gewählte
Instanz im `sessionStorage` neben dem Token. Zustand sichtbar machen — `Silent` und
`Crashed` sind keine Nebensache, sondern der Grund, warum es den Manager gibt.
3. **Verwaltungsansicht.** Anlegen, starten, anhalten, Fenster nach vorn. Die Liste nach
jeder Aktion neu holen; die Zustände ändern sich im Hintergrund.
4. **Herkunft der Ereignisse zeigen.** `instanzName` an Chat-, Schritt- und
Protokollzeilen, damit in einem Fenster mit drei Instanzen erkennbar ist, wer spricht.
### 11.6 Zwei Fallen
**Der Zustand ändert sich, ohne dass jemand klickt.** Der Manager sieht alle paar Sekunden
nach; eine Instanz kann abstürzen oder verstummen, während die Liste offen steht. Eine
Ansicht, die nur beim Öffnen lädt, zeigt dann etwas Falsches — und zwar genau in dem
Moment, für den es diese Ansicht gibt.
**Der Manager beendet beim Schließen keine Instanz.** Wer die Weboberfläche zumacht oder
den Manager beendet, beendet nichts. Was läuft, läuft weiter, und der nächste Manager
findet es wieder. Eine Oberfläche, die „Manager beenden" mit „alles beenden" beschriftet,
sagt die Unwahrheit.
### 11.7 Wie du es ausprobierst
```bash
dotnet build
```
`manager.json` liegt unter `%APPDATA%\ClawdDotNet\` (Windows) beziehungsweise
`~/.config/ClawdDotNet/`; ein anderer Ort geht über `--config <Verzeichnis>`. Nötig sind
mindestens `webUiToken` (≥ 20 Zeichen) und `instanceExecutable`, wenn Manager und Instanz
nicht im selben Ausgabeordner liegen.
```bash
dotnet run --project src/ClawdDotNet.ManagerApp
```
Der Manager schreibt seine Adresse auf die Standardausgabe und protokolliert nach
`<Datenverzeichnis>/Logs/Manager/`. Zum Prüfen mit zwei Instanzen: eine zweite über
`POST /api/verwaltung/instanzen` anlegen, beide starten — dann muss die Oberfläche eine
wählen lassen.
### 11.8 Was ausdrücklich liegen bleibt
Diese drei Punkte sind **C#** und warten auf den Kern-Agenten. Nicht anfangen:
1. **`webServerPort` aus der Instanz entfernen.** Erst sinnvoll, wenn 11.5 steht.
2. **Lizenzprüfung aus der Instanz nehmen** (E-M3 vollständig). Braucht vorher einen
Handschlag, an dem eine Instanz erkennt, ob ein Manager da ist.
3. **Verstummte Instanzen neu starten?** Nicht entschieden — siehe Abschnitt 7.
+21 -1
View File
@@ -8,7 +8,27 @@ Gegenstück zum [Oberflächen-Leitfaden](Oberflaechen-Leitfaden.md), der für
Avalonia gilt. Avalonia gilt.
Vorhaben im Deploymentcenter: Vorhaben im Deploymentcenter:
**#494** (Weboberfläche), **#493** (Fachlogik nach `App`). **#494** (Weboberfläche), **#493** (Fachlogik nach `App`), **#531** (Instanzen in der
Oberfläche).
---
## Vorweg: Vier Dinge in diesem Leitfaden sind überholt
Seit dem 2026-09-09 trägt der **Instanzmanager** die Weboberfläche (#528). Der Leitfaden
gilt weiter für Stil, Sicherheit und Aufbau — kein `innerHTML`, kein Paketmanager, Token
nur im `sessionStorage`, Farben aus `app.css`. Vier Angaben darin stimmen nicht mehr:
| Im Text | Tatsächlich |
|---|---|
| `wwwroot` liegt in `src/ClawdDotNet.Web/` | **`src/ClawdDotNet.Manager.Web/wwwroot/`** |
| Die Oberfläche läuft im Prozess der Instanz | Sie läuft im **Instanzmanager**, einem eigenen Prozess. Er spricht mit den Instanzen über einen Socket und **leitet weiter** |
| `http://127.0.0.1:7001`, Einstellungen in `InstanceSettings.json` | **`webUiPort`, `webUiBinding`, `webUiToken` in `manager.json`**, Vorgabe 7000 |
| Ein `/api` für eine Instanz | **N Instanzen.** `/api/verwaltung/…` gehört dem Manager, alles andere unter `/api` geht an die Instanz aus der Kopfzeile `X-Instanz` |
**Der aktuelle Auftrag und die vollständige API stehen in**
[Instanzmanager-Konzept.md, Abschnitt 11](Instanzmanager-Konzept.md#11--übergabe-an-den-frontend-agenten).
Lies den zuerst; dieser Leitfaden ist das Nachschlagewerk daneben.
--- ---