diff --git a/LehrerApp.Desktop/AppBootstrapper.cs b/LehrerApp.Desktop/AppBootstrapper.cs index 66dc4e0..d2de507 100644 --- a/LehrerApp.Desktop/AppBootstrapper.cs +++ b/LehrerApp.Desktop/AppBootstrapper.cs @@ -32,7 +32,7 @@ public static class AppBootstrapper /// editierbar, siehe Planungsdokument. Vor dem ersten produktiven Einsatz durch die tatsächlich /// deployte Domain ersetzen. /// - public const string AiBackendUrl = "https://REPLACE_ME.example.com/"; + public const string AiBackendUrl = "https://backapi.science-teaching.de/"; /// /// Vor gesetzt, wenn die Datenbank passwortgeschützt ist diff --git a/TODO.md b/TODO.md index 41f4b50..d4834d9 100644 --- a/TODO.md +++ b/TODO.md @@ -698,8 +698,26 @@ folgenden Punkte gehören direkt in `LehrerApp.Desktop`: nicht-Desktop-Client (siehe `PlainEventStore`, `MapPlainSyncEndpoints`) — ein "Umplanung nötig"-Flag käme darüber rein und würde nach dem Sync als Hinweis/Badge an der betroffenen Stunde bzw. im Dashboard erscheinen, bis es am Desktop bearbeitet oder bewusst abgehakt wird. - ---- +- [ ] **4.5.11** KI-Unterstützung (4.5.9) auch für die Stundenplanung (Kapitel 4.3, `TimetableSlot`) + anbieten, nicht nur für Einheiten/Stunden im Verlaufsplan — z.B. Vorschläge beim Aufbau eines + neuen Stundenplans oder beim Ausgleich nach Änderungen. Gleiches Backend/gleiche Abrechnung + wie 4.5.9, aber eigenes Export/Import-Schema für die Stundenplan-Daten. +- [ ] **4.5.12** Offene Frage: Kann ein Agent/Project bei console.claude.ai eingerichtet werden, + um Standardinformationen (JSON-Schema, grundlegender Auftragskontext) dort dauerhaft zu + hinterlegen, statt sie bei jeder Anfrage über das eigene PHP-Backend mitschicken zu müssen? + Würde die Nutzer-Anweisung auf das eigentlich Fachliche reduzieren. +- [ ] **4.5.13** Alternative zu 4.5.12: statt eines extern gepflegten Agents ein app-interner + Standard-Prompt neben dem freien Nutzer-Prompt, der den grundlegenden Kontext (Schema, + Auftragsbeschreibung) automatisch mitliefert — der Nutzer muss ihn dann nicht jedes Mal + selbst formulieren. Ansatzweise bereits vorhanden (`ai-backend/plan.php`, `$systemPrompt`), + hier ginge es um eine bewusstere/erweiterte Ausgestaltung statt der aktuell schlanken Variante. +- [ ] **4.5.14** Planungsdiff: KI-Vorschläge (4.5.9) mit dem bereits Geplanten auf Feldebene + vergleichbar machen, nicht nur pauschal als "Neu"/"Geändert" markieren wie aktuell im + `AiAssistDialog`. Bei geänderten Stunden sollte sichtbar sein, was sich konkret unterscheidet + (Thema, einzelne Verlaufsplan-Phasen, Hausaufgabe, ...), und die Übernahme sollte sich sinnvoll + zusammenführen lassen — z.B. nur einzelne Phasen einer Stunde übernehmen statt zwingend die + ganze Stunde, oder eigene zwischenzeitliche Änderungen nicht versehentlich überschreiben, + falls sich die Einheit seit dem Absenden der Anfrage schon geändert hat. ## 5. Schülerdokumentation diff --git a/ai-backend/.htaccess b/ai-backend/.htaccess index 42bfd7a..a08ad61 100644 --- a/ai-backend/.htaccess +++ b/ai-backend/.htaccess @@ -17,3 +17,11 @@ RewriteEngine On RewriteRule ^providers/ - [F,L] RewriteRule ^scripts/ - [F,L] + +# Viele Apache/PHP-FPM-Setups reichen den Authorization-Header standardmäßig NICHT an PHP durch +# (login.php funktioniert dann, aber jede Anfrage mit Bearer-Token danach schlägt fehl, weil der +# Header bei PHP leer ankommt). Diese Zeile erzwingt die Weiterleitung — zusammen mit dem +# Mehrquellen-Fallback in db.php (ai_backend_authorization_header) deckt das die gängigen +# Hosting-Varianten ab. +RewriteCond %{HTTP:Authorization} ^(.+)$ +RewriteRule .* - [E=HTTP_AUTHORIZATION:%1] diff --git a/ai-backend/README.md b/ai-backend/README.md index 5d81960..ee5d9ae 100644 --- a/ai-backend/README.md +++ b/ai-backend/README.md @@ -78,6 +78,22 @@ curl http://localhost:8000/status.php -H "Authorization: Bearer $value) { + if (strcasecmp($name, 'Authorization') === 0) { + return $value; + } + } + } + return ''; +} + /** * Bearer-Token aus dem Authorization-Header lesen, gegen tokens.token_hash prüfen * (SHA-256, der Klartext wird nie gespeichert) und den zugehörigen aktiven User zurückgeben. @@ -20,7 +45,7 @@ function ai_backend_db(array $config): PDO */ function ai_backend_authenticate(PDO $pdo): array { - $header = $_SERVER['HTTP_AUTHORIZATION'] ?? ''; + $header = ai_backend_authorization_header(); if (!preg_match('/^Bearer\s+(.+)$/i', $header, $m)) { ai_backend_fail(401, 'Kein gültiges Token übermittelt.'); }