{
"event": "PreToolUse",
"tool_name": "mcp__mcp-tasks__tasks_create",
"tool_input": {
"title": "Fix: ModelRegistry nicht initialisiert (Chat-Seite Fatal Error)",
"description": "## Symptom\n```\nFatal error: Uncaught RuntimeException: ModelRegistry not initialized. \nUse DI container or call setInstance() first.\nin \/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/AI\/ModelRegistry.php:30\n```\n\nURL: https:\/\/dev.campus.systemische-tools.de\/chat\/{uuid}\n\n---\n\n## Root Cause Analyse\n\n### Stacktrace\n```\nModelRegistry::getInstance() ← Singleton nicht initialisiert\n↑ ModelConfig::getAll() ← Statische Facade\n↑ ChatController::show() Zeile 64 ← Ruft ModelConfig::getAll() auf\n↑ Router->handle()\n↑ App->run()\n```\n\n### Problem\n1. `ModelRegistry` verwendet Singleton-Pattern mit `setInstance()`\n2. `setInstance()` wird in `services.php` innerhalb der Factory-Funktion aufgerufen\n3. Container ist **lazy** - Factory wird erst bei `$container->get(ModelRegistry::class)` ausgeführt\n4. `ChatController` verwendet `ModelConfig::getAll()` **statisch** (Zeile 64)\n5. Niemand ruft vorher `$container->get(ModelRegistry::class)` auf\n6. → Singleton ist NULL → Exception\n\n### Warum jetzt?\nVermutlich hat das vorher funktioniert weil ein anderer Code-Pfad die Registry initialisiert hat.\nNach Refactoring (#333-336) wurde dieser Pfad möglicherweise geändert.\n\n---\n\n## Impact-Analyse\n\n### Betroffene Dateien\n| Datei | Problem |\n|-------|---------|\n| `ChatController.php:64` | `ModelConfig::getAll()` |\n| `ChatController.php:65` | `ModelConfig::getDefaultModel()` |\n| `ContentController.php` | Prüfen |\n| Weitere Controller | Prüfen auf ModelConfig-Nutzung |\n\n### Abhängigkeiten\n```\nModelConfig (static facade)\n └── ModelRegistry::getInstance() (singleton)\n └── services.php Factory (lazy init)\n```\n\n---\n\n## Lösungsoptionen\n\n### Option A: Eager-Loading (Quick Fix)\nIn `App.php` nach `registerServices()`:\n```php\n$this->container->get(ModelRegistry::class);\n```\n**Pro:** Minimal-invasiv, 1 Zeile\n**Contra:** Versteckt das eigentliche Problem (Static Facade Anti-Pattern)\n\n### Option B: DI in Controller (Clean Fix)\n`ChatController` erhält `ModelRegistry` per Constructor Injection:\n```php\npublic function __construct(\n ...,\n private ModelRegistry $registry\n) {}\n\n\/\/ Dann:\n'models' => $this->registry->getChatModels(),\n```\n**Pro:** Sauberes DI, testbar, kein Singleton\n**Contra:** Alle Controller mit ModelConfig ändern\n\n### Option C: Hybrid\n1. Kurzfristig: Option A (Eager-Loading)\n2. Langfristig: Option B (DI) + ModelConfig deprecated\n\n---\n\n## Empfehlung\n**Option A** als sofortiger Fix, dann Task für Option B erstellen.\n\n---\n\n## Implementierung (nach Freigabe)\n\n### Schritt 1: App.php anpassen\n```php\nprotected function registerServices(): void\n{\n \/\/ ... existing code ...\n \n \/\/ Eager-load für Static Facades\n $this->container->get(\\Infrastructure\\AI\\ModelRegistry::class);\n}\n```\n\n### Schritt 2: Testen\n```bash\nREQUEST_URI=\"\/chat\/test-uuid\" REQUEST_METHOD=\"GET\" php public\/index.php\n```\n\n### Schritt 3: Quality-Check\n```bash\n\/var\/www\/scripts\/php-check.sh\n```\n\n---\n\n## Folge-Task\nNach Fix: Task erstellen für \"ModelConfig Static Facade durch DI ersetzen\"",
"type": "ai_task"
}
}
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"task\": {\n \"id\": 338,\n \"uuid\": \"818a192d-c83e-4b22-a504-57585ff73381\",\n \"title\": \"Fix: ModelRegistry nicht initialisiert (Chat-Seite Fatal Error)\",\n \"description\": \"## Symptom\\n```\\nFatal error: Uncaught RuntimeException: ModelRegistry not initialized. \\nUse DI container or call setInstance() first.\\nin \/var\/www\/dev.campus.systemische-tools.de\/src\/Infrastructure\/AI\/ModelRegistry.php:30\\n```\\n\\nURL: https:\/\/dev.campus.systemische-tools.de\/chat\/{uuid}\\n\\n---\\n\\n## Root Cause Analyse\\n\\n### Stacktrace\\n```\\nModelRegistry::getInstance() ← Singleton nicht initialisiert\\n↑ ModelConfig::getAll() ← Statische Facade\\n↑ ChatController::show() Zeile 64 ← Ruft ModelConfig::getAll() auf\\n↑ Router->handle()\\n↑ App->run()\\n```\\n\\n### Problem\\n1. `ModelRegistry` verwendet Singleton-Pattern mit `setInstance()`\\n2. `setInstance()` wird in `services.php` innerhalb der Factory-Funktion aufgerufen\\n3. Container ist **lazy** - Factory wird erst bei `$container->get(ModelRegistry::class)` ausgeführt\\n4. `ChatController` verwendet `ModelConfig::getAll()` **statisch** (Zeile 64)\\n5. Niemand ruft vorher `$container->get(ModelRegistry::class)` auf\\n6. → Singleton ist NULL → Exception\\n\\n### Warum jetzt?\\nVermutlich hat das vorher funktioniert weil ein anderer Code-Pfad die Registry initialisiert hat.\\nNach Refactoring (#333-336) wurde dieser Pfad möglicherweise geändert.\\n\\n---\\n\\n## Impact-Analyse\\n\\n### Betroffene Dateien\\n| Datei | Problem |\\n|-------|---------|\\n| `ChatController.php:64` | `ModelConfig::getAll()` |\\n| `ChatController.php:65` | `ModelConfig::getDefaultModel()` |\\n| `ContentController.php` | Prüfen |\\n| Weitere Controller | Prüfen auf ModelConfig-Nutzung |\\n\\n### Abhängigkeiten\\n```\\nModelConfig (static facade)\\n └── ModelRegistry::getInstance() (singleton)\\n └── services.php Factory (lazy init)\\n```\\n\\n---\\n\\n## Lösungsoptionen\\n\\n### Option A: Eager-Loading (Quick Fix)\\nIn `App.php` nach `registerServices()`:\\n```php\\n$this->container->get(ModelRegistry::class);\\n```\\n**Pro:** Minimal-invasiv, 1 Zeile\\n**Contra:** Versteckt das eigentliche Problem (Static Facade Anti-Pattern)\\n\\n### Option B: DI in Controller (Clean Fix)\\n`ChatController` erhält `ModelRegistry` per Constructor Injection:\\n```php\\npublic function __construct(\\n ...,\\n private ModelRegistry $registry\\n) {}\\n\\n\/\/ Dann:\\n'models' => $this->registry->getChatModels(),\\n```\\n**Pro:** Sauberes DI, testbar, kein Singleton\\n**Contra:** Alle Controller mit ModelConfig ändern\\n\\n### Option C: Hybrid\\n1. Kurzfristig: Option A (Eager-Loading)\\n2. Langfristig: Option B (DI) + ModelConfig deprecated\\n\\n---\\n\\n## Empfehlung\\n**Option A** als sofortiger Fix, dann Task für Option B erstellen.\\n\\n---\\n\\n## Implementierung (nach Freigabe)\\n\\n### Schritt 1: App.php anpassen\\n```php\\nprotected function registerServices(): void\\n{\\n \/\/ ... existing code ...\\n \\n \/\/ Eager-load für Static Facades\\n $this->container->get(\\\\Infrastructure\\\\AI\\\\ModelRegistry::class);\\n}\\n```\\n\\n### Schritt 2: Testen\\n```bash\\nREQUEST_URI=\\\"\/chat\/test-uuid\\\" REQUEST_METHOD=\\\"GET\\\" php public\/index.php\\n```\\n\\n### Schritt 3: Quality-Check\\n```bash\\n\/var\/www\/scripts\/php-check.sh\\n```\\n\\n---\\n\\n## Folge-Task\\nNach Fix: Task erstellen für \\\"ModelConfig Static Facade durch DI ersetzen\\\"\",\n \"type\": \"ai_task\",\n \"status\": \"pending\",\n \"created_by\": \"mcp-tasks\",\n \"created_by_type\": \"ai\",\n \"parent_task_id\": null,\n \"due_date\": null,\n \"created_at\": \"2025-12-25T13:18:06.915873\",\n \"updated_at\": \"2025-12-25T13:18:06.915876\",\n \"completed_at\": null,\n \"metadata\": {}\n },\n \"message\": \"Task #338 created\"\n}"
}
]
}