Release Notes

Alle veröffentlichten Versionen des WUIC Framework, die neueste zuerst, jeweils mit den vollständigen Release Notes.

Zurück zu den Downloads

v1.7.21

Zurück zur Übersicht

Vorherige veröffentlichte Version: 1.7.20 (1. Oktober 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Ein Release für Sicherheit und Datenzugriff. Es schließt die Befunde einer vollständigen Sicherheitsprüfung des Frameworks und bringt OData auf dieselbe Berechtigungsstufe wie das CRUD. Kurz gefasst:

  • enableCookieAuthentication akzeptiert einen dritten Wert, "signed": vom Server signiertes Cookie, mehrere Sitzungen pro Benutzer, Abmeldung pro einzelner Sitzung;
  • OData wendet Routen- und Spaltenberechtigungen sowie die Zeileneinschränkungen des Benutzers an und schreibt über das CRUD des Frameworks;
  • persönliche Tokens verbinden Power BI, Excel und Skripte mit den OData-Endpunkten;
  • die Option „Secure Upload“ der Upload-Spalten schützt die Dateien der Spalte wieder;
  • Bearbeiten und Löschen beachten die Einschränkung pro Benutzer auch im CRUD der Oberfläche;
  • Fehler zeigen dem Benutzer eine übersetzte Meldung mit einem Nachverfolgungscode, technische Details nur dem Superadmin.

Änderungen am Schema der Metadaten werden beim Start automatisch angewendet. Die Funktionen wurden mit den End-to-End-Tests auf SQL Server, MySQL, PostgreSQL und Oracle in den drei Modi von enableCookieAuthentication geprüft.


🔐 Authentifizierung und Sitzungen

  • Drei Modi. enableCookieAuthentication ist false, true oder "signed". Mit false ist der Benutzer derjenige, den das Browser-Cookie angibt: nur für die Entwicklung. Beim Start meldet eine [security]-Nachricht dies, der AppSettings-Editor beschreibt es und verlangt beim Speichern eine Bestätigung. Ein unbekannter Wert gilt als "signed", mit Warnung im Log.
  • "signed". Der Server signiert das Cookie k-user (HMAC-SHA256, Ablauf innerhalb der Signatur): ein verändertes oder abgelaufenes Cookie gilt als nicht vorhanden. Derselbe Benutzer kann mehrere offene Sitzungen haben, jede mit eigener Kennung.
  • Abmeldung und Widerruf. Die Abmeldung schließt nur die Sitzung, von der sie ausgeht, Kopien des Cookies eingeschlossen. Die Abmeldung eines Benutzers durch einen Administrator, das Zurücksetzen und das Ändern des Passworts schließen alle Sitzungen dieses Benutzers in seiner Firma.
  • Maximale Dauer. Mit signedSessionMaxLifetimeHours (Standard 24, 0 = ohne Grenze) läuft eine signierte Sitzung in diesem Alter ab dem Login ab, auch bei ständiger Nutzung.
  • Signaturschlüssel. cookie-signing-key wird beim ersten Start erzeugt und in appsettings.json gespeichert. Beim Start zeigt das Log den Fingerabdruck des Schlüssels (nie den Schlüssel) und warnt, wenn der Schlüssel nicht gespeichert wurde.
  • Auf dem Server geprüfte Aufrufe. Mit false trägt das Cookie keine gefälschten Rechte mehr (Administrator, Rolle, Firma): der Benutzer wird aus der Datenbank neu gelesen.

🔗 OData

  • Berechtigungen. Jedes Entity Set verlangt die Leseberechtigung auf der Route. Eine dem Benutzer verweigerte Spalte, die in $select, $filter, $orderby oder $expand genannt wird, ergibt 403; sonst kommt sie leer zurück.
  • Zeileneinschränkungen. Die Abfrage geht vom selben SELECT wie das CRUD aus, mit der Einschränkung pro Benutzer, Rolle oder Firma, dem Standardfilter und dem logischen Löschen. $filter, $orderby, $skip, $top und $count werden außen angewendet und können nur einschränken: or 1 eq 1 erweitert das Ergebnis nicht.
  • $expand. Erlaubt zu lesbaren Routen ohne Zeileneinschränkungen und ohne logisches Löschen; sonst 403.
  • Schreibzugriffe. POST, PATCH und DELETE laufen über insertRecord, updateRecord und deleteRecord: Berechtigungen, nicht bearbeitbare Spalten, Trigger, Protokollfelder, Change Log, Workflows und logisches Löschen gelten wie in der Oberfläche. Eine für den Benutzer verborgene Zeile ergibt 404.
  • Mehrere Firmen. Die Datenverbindung ist die der Firma des Benutzers, wie im CRUD.
  • Discovery. /odata, /odata/$metadata und /odata/openapi.json verlangen eine Sitzung. Mit odataPublicMetadata=true sind sie wieder öffentlich; die Daten bleiben geschützt.
  • Persönliche Tokens. Mit apiTokensEnabled=true erstellt jeder Benutzer im Benutzermenü („API-Token“) Tokens wuic_pat_… mit Namen, Ablauf (Standard 90 Tage, höchstens apiTokenMaxLifetimeDays) und Nur-Lese- oder auch Schreibberechtigung. Sie gelten nur auf /odata, mit den Berechtigungen des Eigentümers. Power BI und Excel verwenden sie als Passwort mit „Basic“-Anmeldedaten; Skripte mit Authorization: Bearer. Das Token wird nur einmal angezeigt; der Superadmin sieht und widerruft die Tokens aller.

🛡️ Sicherheit

Best-Effort-Hardening auf der ganzen Oberfläche: Prüfungen der Werte, die in Abfragen landen (Sortierungen, Operatoren, Aggregate, Schlüssel, numerische Filter), auf den vier Providern angeglichen; Upload- und Berichtspfade auf ihre Ordner beschränkt; Verwaltungsfunktionen (Berichtsdesigner, Entfernen und Scaffolding von Berichten, Spaltenreihenfolge, Neustart, OData-Scaffold) dem in der Datenbank geprüften Superadmin vorbehalten; Workflow-E-Mails nur von Benutzern, die den Workflow ausführen dürfen; Beispieldaten der Werkzeuge für KI-Assistenten nur für den Superadmin und nie mit Spalten für Anmeldedaten; Schutzmechanismen für Benutzer und Rollen an die Tabelle gebunden, nicht an den Routennamen; öffentlicher Lizenzschlüssel im Paket eingebettet.

📎 Upload

  • „Secure Upload“ pro Spalte. Die Dateien einer Spalte mit upload_secure lassen sich nur mit gültiger Sitzung und für den Benutzer sichtbarer Spalte lesen, sowohl über /upload als auch über /api/UploadImage. Die Dateien der anderen Spalten bleiben öffentlich. Spalten, die die Datei in der Datenbank speichern, sind über /api/UploadImage geschützt.
  • Dateinamen. Namen mit inneren Punkten (rechnung-acme.com.pdf) werden akzeptiert; Namen mit vom Server ausführbaren Endungen bleiben auch in der Mitte abgelehnt (foto.aspx.png).

🚦 Fehler

Der Benutzer erhält eine übersetzte Meldung mit einem Nachverfolgungscode (Schaltfläche „Code kopieren“ im Fehlerdialog). Derselbe Code wird mit dem vollständigen Stack in _error__logs gespeichert. SQL, Stacks und interne Meldungen erreichen nur den Superadmin. Übersetzungen der neuen Fehlermeldungen werden beim Start automatisch ergänzt.

🐛 Wichtige Fehlerbehebungen

  • Einschränkung pro Benutzer beim Bearbeiten und Löschen. UPDATE und DELETE des CRUD enthielten nur den Schlüssel: wer die ID kannte, konnte die Zeile eines anderen Benutzers bearbeiten. Jetzt muss die Zeile zu denen gehören, die der Benutzer sieht, sonst 403 errors.auth.route_read_forbidden.
  • Standardfilter mit Filtern in OR. Mit dem Operator OR verschwand der Standardfilter der Route, und das Grid zeigte die Zeilen, die es verbergen sollte. Jetzt bleibt er in AND.
  • Oracle. Booleans werden auch bei Spalten mit booleschem UI-Typ, in Filtern und in Parametern gespeicherter Prozeduren als 1/0 geschrieben; Funktionen werden im richtigen Schema von Prozeduren unterschieden; OData auf dem Datenschema auch mit dem Benutzer SYSTEM (vorher sporadische ORA-00942-Fehler).
  • PostgreSQL und Oracle. Das Einfügen mit einem Identity-Schlüssel, den der Client nicht sendet, schlägt nicht mehr fehl; Berichte wenden Berechtigungen und Filter des Benutzers wie auf SQL Server und MySQL an.
  • Erster Start unter IIS. Die Erstkonfiguration liefert nach erfolgreicher Installation kein 500 mehr: die Migrationen werden beim Neustart des Workers abgeschlossen.
  • Spreadsheet und Synchronisierung. Mit aktivem Filter trafen Bearbeiten und Löschen die falsche Zeile; eine Auswahl über die Seite hinaus erreicht die Datensätze der folgenden Seiten nicht mehr; das Batch-Speichern im Kanban und die Offline-Synchronisierung wiederholen nur, was fehlgeschlagen ist.
  • Menü. Die Leiste erscheint mit bereits übersetzten Beschriftungen, ohne kurz die Schlüssel zu zeigen.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.20 1.7.21
Wuic.Webcore 1.7.20 1.7.21
WuicOData 1.7.20 1.7.21
RuntimeEfCore 1.7.20 1.7.21
Wuic.MySqlProvider 1.7.20 1.7.21
Wuic.PostgresProvider 1.7.20 1.7.21
Wuic.OracleProvider 1.7.20 1.7.21
wuic-framework-lib (npm) 1.7.20 1.7.21

🔧 Empfohlene Schritte beim Update

  1. Cookie-Modus: in der Produktion enableCookieAuthentication auf "signed" (oder true) setzen; false ist nur für die Entwicklung.
  2. Mehrere Instanzen hinter einem Load Balancer: denselben cookie-signing-key in alle Instanzen kopieren; mit unterschiedlichen Schlüsseln gilt eine Sitzung nur auf der Instanz, die sie erzeugt hat. Im Log prüfen, dass der Fingerabdruck übereinstimmt.
  3. OData-Clients: Clients, die $metadata ohne Sitzung gelesen haben, müssen sich anmelden, oder odataPublicMetadata=true setzen. OData-Schreibzugriffe führen jetzt Trigger und Protokollierung des CRUD aus und setzen auf Routen mit logischem Löschen das Kennzeichen, statt die Zeile zu löschen.
  4. md_service_apply_default_filter: veraltet. Der Standardfilter gilt immer, auch über OData.
  5. Lizenz: die Überschreibung des Maschinen-Fingerabdrucks wird nur über die Umgebungsvariable WUIC_LICENSE_MACHINE_FINGERPRINT gesetzt; die Schlüssel license-machine-fingerprint-override und license-public-key-pem in appsettings.json werden ignoriert.
  6. API-Tokens: um Power BI, Excel oder Skripte anzubinden, im AppSettings-Editor apiTokensEnabled=true (und bei Bedarf apiTokenMaxLifetimeDays) setzen.

v1.7.20

Zurück zur Übersicht

Vorherige veröffentlichte Version: 1.7.18 (1. Oktober 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Eine Wartungsversion: Sie behebt die Fehler, die bei der Entwicklung einer Anwendung mit den fünf dokumentierten Entwicklungsmustern aufgefallen sind, ausgehend vom Beispielprojekt der Quellpakete, und beschleunigt die RAG-Engine auf Rechnern ohne GPU. Sie enthält auch die Korrekturen der 1.7.19, die nur als NuGet- und npm-Pakete erschienen ist: Diese Notes decken beide ab. Kurz gefasst:

  • erneutes Scaffolding mit „Create Menu" dupliziert den Menüeintrag nicht mehr;
  • unter PostgreSQL und Oracle wird die vom Grid angeforderte serverseitige Sortierung angewendet, auch wenn die Liste einen hervorgehobenen Datensatz an den Anfang stellt;
  • mit ng serve lassen sich Exporte auch über den Dev-Server herunterladen;
  • Suchen der RAG-Engine auf der CPU sind auf Rechnern mit wenigen Kernen bis zu etwa dreimal schneller;
  • die Seiten der fünf Entwicklungsmuster enthalten in allen fünf Sprachen Codebeispiele, die kompilieren.

Keine Änderungen an Metadaten, Übersetzungen oder Datenbankschema: Das Update erfordert keine Skripte.


🗄️ PostgreSQL- und Oracle-Provider

  • Serverseitige Sortierung. Bei aktivierten serverseitigen Operationen kam die in einer Grid-Spalte gewählte Sortierung nicht in der Abfrage an: Die Datensätze wurden immer nach Primärschlüssel sortiert zurückgegeben, auch wenn eine absteigende Sortierung nach einem anderen Feld angefordert war. Das ORDER BY verwendet jetzt die angeforderten Spalten und hängt den Primärschlüssel nur als letztes Kriterium an, wie unter SQL Server und MySQL.
  • Sortierung mit hervorgehobenem Datensatz. Wenn die Liste einen bestimmten Datensatz an den Anfang stellt, wurde die angeforderte Sortierung auch in der 1.7.19 noch verworfen. Die Reihenfolge ist jetzt: hervorgehobener Datensatz, angeforderte Spalten, Primärschlüssel.

🤖 RAG-Engine

  • Schnellere Suchen auf der CPU. Ohne GPU blieben die Rechen-Threads der Modelle zwischen zwei Operationen aktiv im Wartezustand, und das Aufwärmen des Caches im Hintergrund lief parallel zur ersten Suche: Auf Rechnern mit wenigen Kernen konkurrierten sie um die CPU. Jetzt warten die Threads nicht mehr aktiv, und die Modellberechnungen laufen im Prozess nacheinander. Suchen (Chat und MCP-Tools) sind auf Rechnern mit wenigen Kernen bis zu etwa dreimal schneller, und die erste Suche wird nicht mehr durch das laufende Aufwärmen gebremst. Auf PCs mit freien Kernen ändern sich die Zeiten nicht.

🐛 Wichtige Fehlerbehebungen

  • Doppelter Menüeintrag beim Scaffolding. Wurde „Scaffold Table" oder „Scaffold View" mit „Create Menu" für eine bereits gescaffoldete Tabelle oder Sicht erneut ausgeführt, entstand ein zweiter Menüeintrag für dieselbe Route. Der Eintrag wird jetzt nur angelegt, wenn die Route noch keinen hat.
  • Exporte mit dem Dev-Server. Im Client-Projekt der Quellpakete leitete proxy.conf.js den Pfad /Tmp_export nicht an das Backend weiter: Mit ng serve lieferte der Link zur exportierten Datei (Excel, CSV, PDF) die Anwendungsseite statt der Datei. Der Pfad wird jetzt weitergeleitet, und der Download funktioniert wie in der veröffentlichten Installation.

📚 Dokumentation

Die Seiten der fünf Entwicklungsmuster wurden in allen Sprachen korrigiert:

  • Framework + manuell: Das Beispiel übergibt die Datenquelle mit [hardcodedDatasource] und setzt [autoload]="true"; ohne autoload lädt die Liste nur das Schema, nicht die Datensätze.
  • Framework-Daten + eigene Komponente: neues Beispiel für setCurrent, addNewRecord, syncData und fetchData, aufgerufen aus der eigenen Komponente.
  • Framework-Komponente + eigene Daten: Die clientseitigen Filter bauen einen Filter pro Spalte auf, so wie die List-Grid ihn liest.
  • Full custom: Die Komponente deklariert die benötigten imports (TableModule, CheckboxModule, ButtonModule, FormsModule).
  • Full autogeneration: Das Spreadsheet erfordert die lizenzierte Funktion (ohne sie öffnet sich die Route als Liste); das Dashboard ist kein Routen-Archetyp, und die Seite führt es nicht mehr unter den generierten Seiten auf.

Die Dokumentation ist in der npm-Bibliothek enthalten und auf der Website veröffentlicht.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.18 1.7.20
Wuic.Webcore 1.7.18 1.7.20
WuicOData 1.7.18 1.7.20
RuntimeEfCore 1.7.18 1.7.20
Wuic.MySqlProvider 1.7.18 1.7.20
Wuic.PostgresProvider 1.7.18 1.7.20
Wuic.OracleProvider 1.7.18 1.7.20
wuic-framework-lib (npm) 1.7.18 1.7.20

Wer die Pakete bereits auf 1.7.19 aktualisiert hat, erhält mit der 1.7.20 zusätzlich die Sortierung mit hervorgehobenem Datensatz, die schnellere RAG-Engine und die korrigierte Seite des Musters Full autogeneration.

🔧 Empfohlene Schritte beim Update

  1. Projekte aus den Quellpaketen: Die proxy.conf.js des Projekts wird beim Paket-Update nicht überschrieben. Den Eintrag '/Tmp_export' mit derselben Konfiguration wie die anderen Backend-Einträge hinzufügen (oder aus der proxy.conf.js des Pakets übernehmen) und ng serve neu starten.
  2. Doppelte Menüs: Falls erneutes Scaffolding mit einer früheren Version doppelte Menüeinträge hinterlassen hat, die überzähligen in der Menüverwaltung löschen.
  3. PostgreSQL und Oracle: Keine Aktion nötig; nach dem Update sortieren Grids mit serverseitigen Operationen wie angefordert.
  4. RAG-Engine: Keine Aktion nötig; die aktualisierte Engine liegt im Ordner rag-engine des Pakets, und die Korrektur gilt für die Ausführung auf der CPU.

v1.7.18

Zurück zur Übersicht

Vorherige veröffentlichte Version: 1.7.17 (30. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Eine Wartungsversion: Sie behebt die Fehler, die bei der Neuinstallation der 1.7.17 auf sauberen Maschinen mit allen vier unterstützten Datenbanken aufgefallen sind. Kurz gefasst:

  • die MCP-Suchwerkzeuge laufen nicht mehr in einen Timeout, während die RAG-Engine lädt;
  • unter PostgreSQL lädt die RAG-Engine nach dem Start wieder von selbst;
  • unter Oracle XE 21c schreibt das Scaffolding von Tabellen und Views die Metadaten wieder, auch beim ersten Start;
  • vom Crash Reporting gesendete Stack Traces werden vollständig rekonstruiert.

Keine Änderungen an Metadaten, Übersetzungen oder Datenbankschema: Das Update erfordert keine Skripte.


⚠️ Geändertes Verhalten

  • MCP-Werkzeuge während die Engine lädt. wuic_codebase_search und wuic_ask warten bis zu 30 Sekunden (bisher 60), bis die RAG-Engine bereit ist; ist sie es dann noch nicht, antworten sie mit einem Fehler, der bittet, es in etwa 60 Sekunden erneut zu versuchen. Das Laden läuft im Backend weiter, und der wiederholte Aufruf findet die Engine bereit vor.

🤖 RAG-Engine

  • Timeouts der MCP-Werkzeuge. Während die Engine lud, startete der MCP-Server eine Aufwärmsuche, die parallel zur eigentlichen Suche lief: Auf einer Maschine ohne GPU bremsten sich beide gegenseitig aus, und der Aufruf überschritt die 120 Sekunden Wartezeit des Clients, auch unter Windows. Jetzt startet der MCP-Server nur das Laden und wartet darauf, und die eigentliche Suche erhält die volle Zeit des Clients.
  • /api/Rag/Health startet das Laden immer. Der Endpoint startet das Laden der Engine im Hintergrund auch dann, wenn er keinen Administrator findet, der über den Fortschritt benachrichtigt werden kann: In diesem Fall lädt die Engine ohne Benachrichtigungen.
  • PostgreSQL. Die Suche nach dem Administrator schlug unter PostgreSQL fehl, wo isAdmin ein Boolean-Feld ist: Die Engine startete nie über /api/Rag/Health, und die MCP-Werkzeuge blieben bei "wird geladen". Jetzt wird der Administrator gefunden und die Engine startet wie bei den anderen Datenbanken.

🗄️ Oracle-Provider

  • Scaffolding unter Oracle XE 21c. Aktuelle Versionen des Oracle-Treibers senden true/false als Typ BOOLEAN, den Oracle vor Version 23 ablehnt (ORA-00932). Das Scaffolding von Tabellen und Views (über die Oberfläche und beim ersten Start) antwortete mit einem Fehler, und der erste Start endete ohne die Metadaten der Anwendungstabellen. Jetzt werden die Flags der Metadaten als 0/1 geschrieben, was die NUMBER-Spalten der Metadatentabellen in jeder Oracle-Version akzeptieren.

🐛 Wichtige Fehlerbehebungen

  • Crash Reporting, unlesbare Stack Traces. Mit CrashReporting:Enabled=true wurden die von den Installationen gesendeten Stack Traces auf dem Receiver nicht rekonstruiert: Die internen Namen des Frameworks blieben unlesbar, und die Analyse der Abstürze litt darunter. Ab 1.7.18 werden die Meldungen vollständig rekonstruiert. Keine Änderung an der Konfiguration oder an den gesendeten Daten.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.17 1.7.18
Wuic.Webcore 1.7.17 1.7.18
WuicOData 1.7.17 1.7.18
RuntimeEfCore 1.7.17 1.7.18
Wuic.MySqlProvider 1.7.17 1.7.18
Wuic.PostgresProvider 1.7.17 1.7.18
Wuic.OracleProvider 1.7.17 1.7.18
wuic-framework-lib (npm) 1.7.17 1.7.18

🔧 Empfohlene Schritte beim Update

  1. Coding-Assistenten mit dem WUIC-MCP-Server: In einer bestehenden Installation enthält der Workspace die vorherige Kopie von scripts/mcp/wuic-rag-mcp.mjs. Diese durch die Kopie aus dem Paket ersetzen (llm-workspace/templates/app-llm-workspace/scripts/mcp/) oder den Workspace wie in llm-workspace/README.md beschrieben neu erzeugen, dann den MCP-Client neu starten.
  2. Oracle XE 21c: Ist ein erster Start mit 1.7.17 oder früher ohne die Metadaten der Anwendungstabellen beendet worden, das Scaffolding dieser Tabellen nach dem Update über die Oberfläche wiederholen.
  3. Crash Reporting: Wer es nutzt, muss nichts tun; Meldungen früherer Versionen bleiben unverändert, neue sind vollständig lesbar.

v1.7.17

Zurück zur Übersicht

Vorherige veröffentlichte Version: 1.7.16 (29. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Eine Wartungsversion: Sie behebt die Fehler, die bei der Neuinstallation der 1.7.16 auf sauberen Windows- und Linux-Maschinen aufgefallen sind. Kurz gefasst:

  • die Karte lädt Google Maps nicht mehr mit einem falschen Schlüssel, wenn kein Schlüssel konfiguriert ist;
  • die RAG-Engine lädt bei der ersten Nutzung viel schneller und kann beim Start geladen werden;
  • die MCP-Suchwerkzeuge warten auf die Engine, statt in ein Timeout zu laufen;
  • der AppSettings Editor öffnet sich in wenigen Sekunden;
  • das Row Template der List-Grid bricht beim ersten direkten Laden einer Seite nicht mehr.

Keine Änderungen an Metadaten, Übersetzungen oder Datenbankschema: Das Update erfordert keine Skripte.


⚠️ Geändertes Verhalten

  • Google-Maps-Schlüssel nicht konfiguriert. Der Installationswert __SET_GOOGLE_MAPS_API_KEY__ gilt, wenn er nicht ersetzt wurde, jetzt als fehlender Schlüssel: Die Karte zeigt den Hinweis auf den fehlenden Schlüssel. Bisher lud der Browser Google Maps mit diesem Text als Schlüssel (InvalidKeyMapError und interne Google-Fehler in der Konsole). Das gilt für jeden Wert der Form __SET_...__ in GoogleMaps:ApiKey.
  • MCP-Werkzeuge während des Ladens der Engine. wuic_codebase_search und wuic_ask warten bis zu 60 Sekunden, bis die RAG-Engine bereit ist; ist sie es noch nicht, antworten sie mit einem Fehler, der bittet, es in etwa 60 Sekunden erneut zu versuchen, statt den Aufruf des Clients ablaufen zu lassen.

🤖 RAG-Engine

  • Schnellere erste Nutzung. Das Aufwärmen der Engine nach dem Laden führte eine vollständige Suche aus, etwa 35 Durchläufe des Rerankers: Auf einer Linux-Maschine ohne GPU waren das etwa 133 der 139 Sekunden des Kaltstarts. Jetzt läuft ein Durchlauf des Embedders und einer des Rerankers auf einem kurzen Text. Die Suchergebnisse ändern sich nicht.
  • Optionales Laden beim Start. Neuer Schlüssel AppSettings:rag-engine-eager-load (Standard false). Mit true lädt das Backend die Engine beim Start im Hintergrund, ohne Benachrichtigungen, sofern die Modelle bereits heruntergeladen sind, und die erste Suche (Chat oder MCP) zahlt nicht für den Kaltstart. Der Preis ist der RAM der Engine, 4,5-6,5 GB, belegt auch dann, wenn RAG nicht genutzt wird. Mit false lädt die Engine wie bisher bei der ersten Anfrage.
  • MCP-Server. Das Warten auf die Engine steckt im MCP-Server, den der erste Start im Workspace für Coding-Assistenten installiert (scripts/mcp/wuic-rag-mcp.mjs). Während er wartet, startet der Server selbst das Laden der Engine im Backend.

🐛 Wichtige Fehlerbehebungen

  • AppSettings Editor öffnete sich langsam. Mit vielen Schlüsseln konnte der Editor nach der Serverantwort zig Sekunden bis zur Anzeige brauchen, weil jeder Tastendruck oder jede Aktualisierung eines Textfelds den ganzen Editor erneut prüfte und alle übersetzten Beschriftungen neu berechnete. Jetzt aktualisiert sich jedes Textfeld für sich und die Beschriftungen werden einmal berechnet: Das Öffnen sinkt auf wenige Sekunden.
  • List-Grid, Row Template beim ersten Laden. Beim direkten Öffnen der URL einer Seite mit einer List-Grid, die von einer sofort antwortenden Datenquelle gespeist wird (eigener Endpoint, hardcodedDatasource), konnten die Daten eintreffen, bevor die Anwendung die Imports des Row Templates (gridRowImports) veröffentlicht hatte. Das ohne diese Pipes kompilierte Template blieb im Cache und die Zeilen wurden nicht angezeigt (in Produktion ein Fehler onDestroy auf undefined). Die Grid kompiliert das Row Template jetzt nach der Veröffentlichung der Imports; veröffentlicht die Anwendung sie nie, kompiliert sie nach 10 Sekunden ohne sie, wie bisher.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.16 1.7.17
Wuic.Webcore 1.7.16 1.7.17
WuicOData 1.7.16 1.7.17
RuntimeEfCore 1.7.16 1.7.17
Wuic.MySqlProvider 1.7.16 1.7.17
Wuic.PostgresProvider 1.7.16 1.7.17
Wuic.OracleProvider 1.7.16 1.7.17
wuic-framework-lib (npm) 1.7.16 1.7.17

🔧 Empfohlene Schritte beim Update

  1. Karten: Prüfen, dass GoogleMaps:ApiKey einen echten Schlüssel enthält. Steht dort noch __SET_GOOGLE_MAPS_API_KEY__, zeigen die Karten nach dem Update den Hinweis auf den fehlenden Schlüssel: Das ist das erwartete Verhalten, bis der Schlüssel gesetzt ist.
  2. RAG auf dedizierten Servern: Wer Chat oder MCP-Werkzeuge direkt nach jedem Neustart nutzt und genug RAM hat, kann in AppSettings "rag-engine-eager-load": "true" setzen. Auf geteilten Maschinen den Standard belassen.
  3. Coding-Assistenten mit dem WUIC-MCP-Server: Auf einer bestehenden Installation enthält der Workspace die vorherige Kopie von scripts/mcp/wuic-rag-mcp.mjs. Für das Warten auf die Engine diese durch die aus dem Paket ersetzen (llm-workspace/templates/app-llm-workspace/scripts/mcp/) oder den Workspace wie in llm-workspace/README.md beschrieben neu erzeugen. Ein Client, der die Bitte um erneuten Versuch erhält, wiederholt einfach den Aufruf.

v1.7.16

Zurück zur Übersicht

Vorherige veröffentlichte Version: 1.7.15 (28. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Diese Version behebt die Fehler aus einem Stresstest mit 100 Benutzern auf den vier unter Linux installierten Datenbanken und verringert die Arbeit, die der Server pro Anfrage leistet. Kurz gefasst:

  • geografische Spalten werden auf Oracle und PostgreSQL korrekt geschrieben, mit dokumentierten Punktformaten und einem Fehler 400 für ungültige Werte;
  • ein Text, der länger als die Spalte ist, antwortet mit 400 statt 500;
  • Oracle ist unter Last deutlich schneller;
  • das Limit der Login-Versuche pro IP ist konfigurierbar.

Wie geprüft wurde. 100 virtuelle Benutzer über 10 Minuten (Listen, Filter, Sortierung, Einfügen, Ändern, Löschen, Import, Export, Berichte) auf SQL Server, MySQL, PostgreSQL und Oracle Free, jeweils auf Ubuntu 24.04 mit nginx: zwischen 11.340 und 11.490 Operationen pro Datenbank, 0 HTTP-Fehler und keine Zeile im Fehlerlog der Anwendung. Wo ein Punkt anders geprüft wurde, steht es dabei.


⚠️ Geändertes Verhalten

  • Login-Limit pro IP standardmäßig aus. Bis zur 1.7.15 war es fest auf 30 Versuche pro Minute und IP gesetzt. Jetzt gilt loginRateLimitPerIpPerMinute, Standard 0 (aus). Das Limit pro Benutzer (5 falsche Passwörter in 5 Minuten) bleibt immer aktiv. Auf Installationen, die aus dem Internet erreichbar sind, 30 setzen.
  • Ungültige Position wird abgelehnt. Ein Wert einer point-Spalte in einem nicht erkannten Format antwortet jetzt mit HTTP 400 errors.input.geo_point.invalid, und der Datensatz wird nicht gespeichert. Vorher speicherten SQL Server und MySQL ohne Fehler NULL, Oracle und PostgreSQL antworteten mit 500. Ein leerer Wert speichert wie bisher NULL.
  • Text zu lang: 400. Ein Text, der länger als die physische Spalte ist, antwortet mit HTTP 400 errors.input.value_too_long (oder errors.input.value_too_long.column mit args.column, wenn die Datenbank die Spalte nennt) statt 500 errors.db.sql_exception.
  • Letzte Aktivität der Sitzung. LastActivityDate wird höchstens einmal pro Minute und Benutzer aktualisiert, nicht mehr bei jeder Anfrage. Der Ablauf der Sitzung kann sich um höchstens 60 Sekunden verschieben.
  • Cache von sys_info auf allen Datenbanken. Vorher hielt nur SQL Server die Zeile 5 Sekunden im Cache; jetzt auch MySQL, PostgreSQL und Oracle. Eine Änderung von außen (SQL von Hand, ein anderer Knoten) ist innerhalb von 5 Sekunden sichtbar, und eine Erhöhung von project_metadata_version durch einen anderen Knoten leert jetzt auch auf diesen drei Datenbanken die Metadaten-Caches.
  • Oracle, neue Installationen. Der Erststart legt in jedem geladenen Schema den Logon-Trigger WUIC_SESSION_CURSOR_SHARING an (siehe Abschnitt Oracle).

🛡️ Sicherheit

Best-effort hardening: konfigurierbares Limit der Login-Versuche pro IP (loginRateLimitPerIpPerMinute, Antwort HTTP 429 errors.auth.login_rate_limited mit retryAfterSeconds) mit einer Liste ausgenommener IPs (loginRateLimitExemptIps, durch Komma getrennte IPs, wie Loopback behandelt: nie begrenzt und nie gezählt), beide bei jedem Login gelesen; auf PostgreSQL und Oracle übergeben die Abfragen, die Benutzer und Rollen nach ID, Benutzername oder E-Mail lesen, die Werte als Parameter, statt sie in den SQL-Text einzusetzen.

🗺️ Geografische Spalten

  • Oracle: jedes Einfügen oder Ändern mit einer belegten point- oder geometry-Spalte schlug fehl (ORA-50028), weil der Provider die Syntax von SQL Server schrieb. Jetzt wird der Wert in WKB umgewandelt (SRID 0, dasselbe Format wie die Tutorial-Daten) und als Parameter übergeben.
  • PostgreSQL: derselbe Fehler, jedes Einfügen oder Ändern mit einer belegten Position schlug fehl. Jetzt wird der Wert mit ST_GeomFromText (SRID 0) geschrieben.
  • Akzeptierte Formate für point-Spalten: JSON {"lat": 45.4642, "lng": 9.19} (auch lon/long), Paar 45.4642, 9.19 (Breite, Länge), WKT POINT(9.19 45.4642) (Länge, Breite), Text Lat: 45.4642, Long: 9.19. Dezimaltrennzeichen ist der Punkt. Beim Lesen kommt die Position immer als JSON zurück.
  • Ungültige Werte: HTTP 400 errors.input.geo_point.invalid mit Spalte und empfangenem Wert. Auf Oracle akzeptieren geometry-Spalten zweidimensionales WKT POINT, POLYGON und MULTIPOLYGON; ein ungültiges WKT antwortet mit errors.input.geo_wkt.invalid. Meldungen in die 5 Sprachen übersetzt.

Prüfung: ein End-to-End-Test auf den vier Datenbanken fügt eine Position in jedem der vier Formate ein, ändert sie und liest sie mit den erwarteten Koordinaten zurück, prüft, dass ein ungültiger Wert mit 400 abgelehnt wird, ohne die Daten zu berühren, und dass ein leerer Wert NULL speichert.

🗄️ Oracle unter Last

  • Erststart: nach dem Laden jedes Schemas legt das Framework den Logon-Trigger WUIC_SESSION_CURSOR_SHARING an, der für die Sitzungen der Anwendung CURSOR_SHARING = FORCE setzt, und sammelt die Statistiken des Schemas (DBMS_STATS.GATHER_SCHEMA_STATS). Schlägt einer der beiden Schritte fehl, landet der Fehler im Log und der Erststart läuft weiter.
  • Authentifizierung: die Benutzer-ID wird ohne TO_CHAR mit der Spalte verglichen, daher nutzt Oracle den Index des Schlüssels, statt bei jeder Anfrage die ganze Benutzertabelle zu lesen.
  • Lesen räumlicher Spalten: der BLOB wird nach dem Lesen im Anwendungsserver in JSON oder WKT umgewandelt, nicht mehr durch eine PL/SQL-Funktion Zeile für Zeile.
  • MAX-Schlüssel: bei gleichzeitigem Einfügen in Eltern- und Kindtabellen konnte der Block, der den Schlüssel berechnet, in einem Deadlock enden (ORA-00060). Er versucht es jetzt bis zu 3 Mal erneut.

Gemessen mit derselben Last, vor und nach diesen Änderungen (einschließlich derer des nächsten Abschnitts), auf einer bestehenden Installation, auf der Trigger und Statistiken von Hand angewendet wurden: Datenbankzeit in SQL-Anweisungen von 794 auf 61 Sekunden, Hard Parses von 73.719 auf 7.379, CPU von Oracle im 95. Perzentil von 26,5 % auf 6,4 %. Im 95. Perzentil sinken Listen von 1,6 s auf 0,16 s, das Lesen eines Datensatzes von 1,28 s auf 68 ms, getTableMetadata von 1,95 s auf 0,32 s.

⚡ Weniger Arbeit pro Anfrage

  • sys_info: die Zeile wurde auf MySQL, PostgreSQL und Oracle etwa 7 Mal pro Anfrage neu gelesen (auf MySQL 23,7 % der Datenbankzeit im Stresstest). Jetzt wird sie höchstens einmal alle 5 Sekunden pro Mandant gelesen, auf allen Datenbanken.
  • LastActivityDate: das UPDATE bei jeder authentifizierten Anfrage machte auf MySQL 34,7 % der Datenbankzeit aus. Jetzt läuft es höchstens einmal pro Minute und Benutzer, auf allen Datenbanken; die Sekunden seit der letzten Aktivität berechnet die Datenbank mit ihrer eigenen Uhr.
  • PostgreSQL: beim Erststart führt das Framework nach dem Laden der Skripte ANALYZE aus, damit die ersten Abfragen nicht ohne Statistiken geplant werden. Der Linux-Installer tut dasselbe.
  • Berichte: jeder Druck schrieb eine Zeile "report call" in das Fehlerlog (_error__logs). Das geschieht nicht mehr.

🐛 Wichtige Fehlerbehebungen

  • PostgreSQL, Filter auf Boolean-Spalten: ein Filter auf eine native boolean-Spalte schlug mit 42883: operator does not exist: boolean = integer fehl.
  • PostgreSQL, SQL-Fehler in Listen: sie erreichen den Client als errors.db.sql_exception mit dem SQLSTATE-Code statt als errors.server.unhandled.
  • Change Log von Löschungen und Änderungen: auf MySQL wurde das Change Log der Löschungen nie geschrieben. Auf MySQL und SQL Server wurde das Datum als Text übergeben, und die Umwandlung hing von der Sprache des Servers ab (auf SQL Server unter Linux schlug sie bei jeder Löschung fehl). Das Datum ist jetzt ein typisierter Parameter.
  • In der Datenbank gespeicherte Uploads: das Ändern eines Datensatzes mit einer Upload-Spalte in der Datenbank, deren Name Großbuchstaben enthält, schlug auf PostgreSQL fehl (42703). Der Spaltenname wird jetzt in Anführungszeichen gesetzt, ebenso auf MySQL und SQL Server.
  • MySQL, Standardsortierung: auf einer Tabelle ohne Schlüssel in den Metadaten wurde die Liste nach der ersten Spalte sortiert, auch wenn sie räumlich oder binär war, mit Out of sort memory. Räumliche und binäre Spalten sind jetzt ausgeschlossen.
  • MySQL, Metadaten-Indizes: das Skript, das die Indizes auf Routen und Spalten der Metadaten anlegt, schlug bei jedem Start fehl, und die Indizes wurden nie angelegt. Jetzt werden sie beim Start angelegt.
  • Maximale Länge in den Metadaten: mc_max_length von nvarchar/nchar-Spalten wurde in Bytes gespeichert, also doppelt so viele wie Zeichen: in Formularen ließ sich bis zur doppelten Zeichenzahl eingeben, und das Speichern schlug dann fehl. Das Scaffolding speichert jetzt Zeichen, und in den Skripten für den ersten Start sind die Längen die physischen: 127 korrigierte Spalten im SQL-Server-Tutorial (einschließlich der Tutorial-Views und Systemtabellen wie _mail_recipients, _mailing_lists, _notifications, _wuic_workflow_instance_log und scheduler_execution), 21 im minimalen SQL-Server-Profil, 41 auf MySQL, 34 auf PostgreSQL und 34 auf Oracle. Die Prüfung der maximalen Länge in Formularen entspricht jetzt der Spalte.
  • Tutorial, Temperaturarchiv: auf SQL Server lief die erste Seite der Liste von Warehouse.ColdRoomTemperatures_Archive (3,65 Millionen Zeilen) unter Last in einen Timeout. Zwei beim Start angelegte Indizes senken sie von 5,4 s auf 6 ms (gemessen auf SQL Server unter Linux). Auf MySQL, PostgreSQL und Oracle wird beim Start ein Index auf den Schlüssel angelegt; dort wurde der Fall nicht gemessen.

🐧 Linux-Installer

  • nginx: worker_connections 4096, worker_rlimit_nofile 16384 und Keep-Alive-Verbindungen zu Kestrel statt einer neuen Verbindung pro Anfrage (WebSockets unverändert).
  • Datenbanken: MySQL und PostgreSQL mit 300 Verbindungen und Puffern bei 25 % des RAM (zwischen 128 MB und 8 GB), Oracle Free mit PROCESSES 400 (ein Neustart des Containers während der Installation). SQL Server bleibt Express.
  • Gedacht für einige hundert Benutzer: bei 100 Benutzern reichten die Standardwerte noch aus (MySQL 59 von 151 Verbindungen, Oracle 148 von 200 Prozessen). Der oben beschriebene Stresstest lief mit den bisherigen Werten; diese Installer-Schritte wurden noch nicht auf einer Neuinstallation getestet.
  • Eine bestehende Installation behält die bisherigen Werte. Die Befehle, um sie von Hand zu erhöhen, stehen im README des Linux-Tarballs, Abschnitt "Capacity for hundreds of concurrent users".

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.15 1.7.16
Wuic.Webcore 1.7.15 1.7.16
WuicOData 1.7.15 1.7.16
RuntimeEfCore 1.7.15 1.7.16
Wuic.MySqlProvider 1.7.15 1.7.16
Wuic.PostgresProvider 1.7.15 1.7.16
Wuic.OracleProvider 1.7.15 1.7.16
wuic-framework-lib (npm) 1.7.15 1.7.16

🔧 Empfohlene Schritte beim Update

  1. Aus dem Internet erreichbare Installationen: in AppSettings "loginRateLimitPerIpPerMinute": "30" setzen, den festen Wert der 1.7.15. Für Stresstests von einer einzigen IP diese IP zu loginRateLimitExemptIps hinzufügen.
  2. Clients, die Fehlercodes auswerten: ein zu langer Text und eine ungültige Position kommen jetzt als HTTP 400 mit den Codes errors.input.value_too_long, errors.input.value_too_long.column und errors.input.geo_point.invalid. Auf allen Datenbanken haben neue Installationen die Meldungen der vier neuen Codes (errors.input.geo_point.invalid, errors.input.geo_wkt.invalid, errors.input.value_too_long, errors.input.value_too_long.column) in die 5 Sprachen übersetzt; auf einer bestehenden Installation erscheint die Ersatzmeldung, bis die Übersetzungen in der Verwaltung der Oberflächenübersetzungen ergänzt werden.
  3. Oracle, bestehende Installationen: um Trigger und Statistiken der neuen Installationen zu erhalten, als Benutzer jedes Schemas (Daten und Metadaten) ausführen:
    CREATE OR REPLACE TRIGGER WUIC_SESSION_CURSOR_SHARING AFTER LOGON ON SCHEMA
    BEGIN EXECUTE IMMEDIATE 'ALTER SESSION SET CURSOR_SHARING = FORCE';
    EXCEPTION WHEN OTHERS THEN NULL; END;
    /
    BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(ownname => SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA')); END;
    /
    
    Zurück zum bisherigen Verhalten: DROP TRIGGER WUIC_SESSION_CURSOR_SHARING.
  4. Linux mit vielen gleichzeitigen Benutzern: auf einer bestehenden Installation die Limits von nginx und der Datenbank mit den Befehlen aus dem README des Linux-Tarballs erhöhen.
  5. Tutorial auf SQL Server: der erste Start nach dem Update baut zwei Indizes auf Warehouse.ColdRoomTemperatures_Archive (15-25 Sekunden pro Index, gemessen): dieser Start dauert länger, nur einmal.
  6. Mehrere Knoten auf derselben Datenbank: Änderungen an sys_info durch einen Knoten erreichen die anderen innerhalb von 5 Sekunden.
  7. Längen in den Metadaten, bestehende Installationen: vorhandene Metadaten werden nicht automatisch korrigiert. Wer sie angleichen möchte, führt das Scaffolding der Tabelle erneut aus oder setzt mc_max_length der Spalte auf die Anzahl der Zeichen.

v1.7.15

Zurück zur Übersicht

Vorherige veröffentlichte Version: 1.7.14 (25. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Diese Version behebt die Fehler aus dem Lasttest der 1.7.14 und aus einer Testkampagne auf sauberen Installationen der vier Datenbanken (SQL Server, MySQL, PostgreSQL, Oracle). Kurz gefasst:

  • das Öffnen einer Route ist unter Last etwa zehnmal schneller;
  • MAX-Schlüssel erzeugen bei gleichzeitigen Einfügungen keine Duplikate mehr, und unter SQL Server blockiert ein Export keine Schreibvorgänge mehr;
  • Import und Export sind zwischen Datenbanken portabel, mit behobenen Fehlern unter Oracle und PostgreSQL;
  • die Abmeldung unter Oracle beendet die Sitzung jetzt wirklich.

🛡️ Sicherheit

Abmeldung unter Oracle. Unter Oracle machte die Abmeldung das Sitzungstoken nicht ungültig: Nach der Abmeldung konnte dasselbe Cookie weiterhin Daten lesen. Die Abmeldung beendet die Sitzung jetzt auch unter Oracle. Wer Oracle verwendet, sollte aktualisieren.

⚡ Leistung

Metadaten beim Öffnen einer Route. Das Lesen der Metadaten einer Route (getTableMetadata) ist etwa zehnmal schneller. Berechtigungen pro Benutzer, Rolle und Firma werden ausgewertet, ohne für jede Spalte einen Ausdruck zu kompilieren, und die Serialisierung verwendet ihre Konfiguration wieder, statt sie bei jedem Aufruf neu aufzubauen. Das Ergebnis bleibt gleich: dieselben Berechtigungen, dasselbe JSON.

Auf dem Demo-Server (SQL Server, 100 gleichzeitige Benutzer) sank das 95. Perzentil des Aufrufs von 2,4-4,5 s auf 0,2-0,4 s und das 95. Perzentil der CPU des Prozesses von 54 % auf 31 %.

🔑 Primärschlüssel MAX

Auf Routen mit md_primary_key_type = "MAX" ist der Schlüssel einer neuen Zeile das Maximum + 1. Bis 1.7.14 wurde das Maximum mit einer vom Insert getrennten Abfrage gelesen: Zwei Benutzer, die im selben Moment speicherten, konnten denselben Schlüssel erhalten, und das zweite Speichern schlug mit einer Primärschlüsselverletzung fehl.

  • Das Maximum wird jetzt innerhalb des Inserts berechnet, mit einer Sperre auf der Tabelle bis zum Commit: Gleichzeitige Einfügungen erhalten aufeinanderfolgende Schlüssel.
  • Das gilt auch für den „abhängigen Schlüssel" zusammengesetzter Schlüssel (Maximum + 1 pro Wert des übergeordneten Schlüssels).
  • Das gilt für das Einfügen aus dem Formular, das Duplizieren eines Datensatzes und den Import aus Excel.
  • Der Sperrmechanismus hängt von der Datenbank ab: UPDLOCK, HOLDLOCK unter SQL Server, SELECT ... FOR UPDATE unter MySQL, ein Transaktions-Advisory-Lock unter PostgreSQL, LOCK TABLE ... IN EXCLUSIVE MODE unter Oracle.

Ein Import, der neue Zeilen in eine Tabelle mit MAX-Schlüssel einfügt, hält die Sperre bis zum Ende der Datei: Währenddessen warten andere Einfügungen in dieselbe Tabelle, unter Oracle auch Änderungen und Löschungen.

📤 Export unter SQL Server

Ein Export liest die Tabelle während der gesamten Zeit, in der er die Datei schreibt. Mit der Standardisolation von SQL Server blockierte dieses Lesen Einfügungen und Änderungen auf derselben Tabelle bis zum Ende des Exports (gemessen: ein Update wartete 5,5 s während des Exports von 70.000 Zeilen).

  • Hat die Datenbank ALLOW_SNAPSHOT_ISOLATION ON, liest der Export in Snapshot-Isolation und Schreibvorgänge warten nicht mehr (dasselbe Update: etwa 100 ms). Die Datei enthält dieselben Daten.
  • Die Option gilt nur für den Export: Andere Lesevorgänge ändern ihr Verhalten nicht. Sie ist mit READ_COMMITTED_SNAPSHOT ON vereinbar.
  • Ohne die Option funktioniert der Export wie bisher.
  • Die Datenbank des Tutorials wird mit READ_COMMITTED_SNAPSHOT ON angelegt, was dieselbe Blockierung auch beim Lesen der Grids beseitigt.

📥 Import und Export zwischen Datenbanken

  • Oracle, Lookups im Export. In Lookup-Spalten schrieb der Export den Schlüssel statt der Beschreibung (zum Beispiel 16 statt des Namens der Person). Die Datei ließ sich nicht wieder importieren: „no record of 'people' has this description". Der Export schreibt jetzt die Beschreibung, und der Ablauf Export → Bearbeitung → Import funktioniert unter Oracle wie auf den anderen Datenbanken.
  • PostgreSQL, Import. Jeder Import, der vorhandene Zeilen per Schlüssel suchte, schlug mit 42883: operator does not exist: integer = text fehl. Der aus der Datei gelesene Schlüssel wird jetzt in den Typ der Spalte umgewandelt.
  • Portable Überschriften. Die Schlüsselspalte eines Lookups (Modus Schlüssel + Beschreibung) und die Klammern, die zwei Spalten mit gleicher Beschriftung unterscheiden, verwenden jetzt den Spaltennamen aus den WUIC-Metadaten, der auf jeder Datenbank gleich ist, statt des physischen Namens (unter Oracle in Großbuchstaben, zum Beispiel CONTACTPERSONID). Eine aus einer Datenbank exportierte Datei lässt sich in eine andere importieren. Früher exportierte Dateien mit dem physischen Namen lassen sich wie bisher importieren.

🌐 Seite „Datenübersetzungen"

Die Verwaltungsseite der Datensatzübersetzungen (_record_field_translations) zeigt jetzt auf allen vier Datenbanken die gespeicherten Übersetzungen, mit Tabellen- und Benutzernamen.

  • MySQL: Die Liste antwortete mit einem Datenbankfehler.
  • Oracle: Die Liste schlug mit ORA-00942 fehl, weil die Benutzer- und Metadatentabellen in einem anderen Schema liegen. Das Framework qualifiziert jetzt das Schema und gewährt dem Datenbenutzer bei der ersten Verwendung das nötige SELECT.
  • PostgreSQL: Die Liste las die falsche Tabelle und zeigte die gespeicherten Übersetzungen nicht. Jetzt liest sie die der Anwendungsdatenbank. Da PostgreSQL keine Tabellen verschiedener Datenbanken verknüpft, werden Benutzer- und Tabellennamen mit einer separaten Abfrage gelesen. Sortieren und Gruppieren auf diesen Spalten arbeiten mit dem Schlüssel.

🗄️ Oracle

  • Neuinstallation über eine bestehende Datenbank. Beim ersten Start schlug die Bestätigung, die Datenbank neu anzulegen, mit ORA-01940 fehl, wenn der Benutzer noch offene Sitzungen hatte. Die Sitzungen werden jetzt vor dem DROP USER beendet und abgewartet.
  • Metadaten des Tutorials. Die Metadaten des Oracle-Tutorials sind an SQL Server angeglichen: Beschreibungen der Lookups und weitere Spalteneigenschaften. Das gilt für neue Installationen des Tutorials.

🐛 Wichtige Fehlerbehebungen

  • SQL-Code-Editor: Unter MySQL, PostgreSQL und Oracle kamen die Vorschläge für Schemata, Tabellen und Spalten leer an. Sie sind jetzt vollständig.
  • Datencache: Mit aktivem cacheDataMinutes lief die zwischengespeicherte Zeilenanzahl nie ab, und ein abgelaufener Eintrag wurde nicht wieder zwischengespeichert. Zeilen und Zählungen laufen jetzt nach der konfigurierten Zeit ab.
  • Pivot: Das zweite Speichern derselben Pivot-Konfiguration antwortete mit 500.
  • Gruppierung (SQL Server): Eine serverseitige Gruppierung ohne Aggregate antwortete mit 500.
  • Windows-Installer (IIS): In manchen Fällen startete die Anwendung, bevor die Site konfiguriert war, und blieb bis zum Recycling des Pools im Fehlerzustand. Der Installer recycelt den Pool jetzt vor dem Start der Site.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.14 1.7.15
Wuic.Webcore 1.7.14 1.7.15
WuicOData 1.7.14 1.7.15
RuntimeEfCore 1.7.14 1.7.15
Wuic.MySqlProvider 1.7.14 1.7.15
Wuic.PostgresProvider 1.7.14 1.7.15
Wuic.OracleProvider 1.7.14 1.7.15
wuic-framework-lib (npm) 1.7.14 1.7.15

🔧 Empfohlene Schritte beim Update

  1. SQL Server, Export ohne Blockierung: einmalig ALTER DATABASE [<Datenbank>] SET ALLOW_SNAPSHOT_ISOLATION ON ausführen. Die Option erhöht die Nutzung von tempdb, solange Transaktionen offen sind.
  2. Große Importe in stark genutzte Tabellen mit MAX-Schlüssel: den Schlüssel in die Datei aufnehmen oder die Tabelle auf IDENTITY/SEQUENCE umstellen, damit die Sperre nicht während des gesamten Imports gehalten wird.
  3. Seite „Datenübersetzungen" auf bestehenden MySQL-, PostgreSQL- und Oracle-Installationen: In den Tabellenmetadaten muss die Route _record_field_translations die Verbindung DataSQLConnection verwenden und darf keine Systemroute sein. Neue Installationen sind bereits so eingerichtet.
  4. Oracle: aktualisieren, schon allein wegen der Abmeldung.

v1.7.14

Zurück zur Übersicht

Vorherige veröffentlichte Version: 1.7.13 (24. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Diese Version entstand aus einem Lasttest mit vielen gleichzeitigen Benutzern auf einer öffentlichen Installation: Export und Import derselben Datei, Filter, Sortierungen, Berichte. Der Export ist viermal schneller und läuft über eine Warteschlange, die den Server schützt; der Import liest die vom Export erzeugten Dateien korrekt wieder ein, auch bei Lookups über eine mehrfach vorkommende Beschreibung. Außerdem sind zwei Fehler bei Grids mit Lookups und geografischen Spalten behoben.


📤 Export

  • Schneller und schlanker. Ein XLSX-Export von 230.000 Zeilen sinkt von 28,5 s auf 7,4 s und von 12,2 GB auf 2,3 GB allokierten Speicher. Der Inhalt der Datei ändert sich nicht.
  • Export-Warteschlange. Der Server führt höchstens maxConcurrentExports Exporte gleichzeitig aus (Standard: die Hälfte der Kerne, mindestens 1). Die übrigen warten in Ankunftsreihenfolge, bis zu maxQueuedExports (Standard 10). Darüber hinaus antwortet die Anfrage mit 503 errors.metaservice.export.queue_full.
  • Sichtbares Warten. Solange der Export in der Warteschlange steht, zeigen der Fortschrittsdialog und die Benachrichtigungsglocke „In der Warteschlange: Position N“. Ein wartender Export kann abgebrochen werden.
  • Einstellungen mit sofortiger Wirkung. Beide Schlüssel stehen im Einstellungseditor (Abschnitt App Runtime) und werden bei jedem Export gelesen, ohne Neustart.
  • Eindeutiger Dateiname. Zwei Exporte derselben Route, die in derselben Sekunde starten, schreiben nicht mehr dieselbe Datei (vorher antworteten alle bis auf einen mit 500).

📥 Import

Lookup-Spalten in der Datei: fkey_mode. Eine importierbare Route legt mit import.fkey_mode im Props Bag der Route fest, wie ihre Lookup-Spalten in der Datei stehen:

  • description (Standard): die Beschreibung, wie im Grid;
  • key: der Wert des Schlüssels;
  • both: beides, die Beschreibung unter dem Spaltentitel und der Schlüssel unter dem physischen Namen.

Der Importdialog zeigt die vorausgewählte Option und lässt sie für einen einzelnen Import ändern. Der Export folgt derselben Wahl, sodass eine exportierte Datei unverändert wieder importiert werden kann. use_descriptive_fkey wird von Clients, die fkey_mode nicht kennen, weiterhin akzeptiert.

Überschriften. Jede Spalte hat ihren Titel als Überschrift. Nur wenn zwei Spalten derselben Datei denselben Titel haben, erscheint der physische Spaltenname in Klammern.

Regeln für Lookups, die aus der Beschreibung gelesen werden.

  • Eindeutige Beschreibung: Ihr Schlüssel wird verwendet.
  • Beschreibung, die mehrere Datensätze teilen: Bei einer Aktualisierung behält der Datensatz seinen aktuellen Schlüssel, wenn er einer der möglichen ist; andernfalls wird die Zeile mit der Liste der Kandidatenschlüssel abgelehnt.
  • Schlüssel und Beschreibung in derselben Datei, die nicht zusammenpassen: Die Zeile wird abgelehnt.

Weitere Korrekturen.

  • Excel-Datumszellen werden als Datum gelesen: Eine exportierte und unverändert wieder importierte Datei wird nicht mehr abgelehnt.
  • Ein Primärschlüssel, der zugleich Lookup ist, wird vor der Existenzprüfung des Datensatzes aufgelöst.
  • Die Existenzprüfung verwendet SQL-Parameter, statt die Werte aus der Datei zu verketten.

🐛 Wichtige Fehlerbehebungen

  • Zwei Lookups auf dieselbe Tabelle: Die zweite Spalte zeigte eine leere Beschreibung. Jeder Fremdschlüssel hat jetzt einen eigenen Alias in der Abfrage, auf allen Datenbanken.
  • Geografische Spalten: Das Sortieren des Grids nach einer geography-Spalte schlug auf SQL Server fehl (Fehler 249). In den Erststart-Skripten haben die geografischen Spalten mc_disable_sorting aktiviert, sodass das Grid keine Sortierung anbietet.
  • Verfügbare Sprachen: GetSupportedLanguages liefert die Sprachen der Tabelle lingue.
  • Berichte: reportQueryTimeout ist optional, mit 120 Sekunden, wenn er fehlt; der Schlüssel steht in den appsettings.json der Pakete.
  • Erststart-Skripte: Sequences und Identities beginnen nach den geladenen Daten, sodass die erste Einfügung nicht mit einem vorhandenen Schlüssel kollidiert. Im Tutorial erzeugen Countries, DeliveryMethods, People, StateProvinces, Customers und Invoices den Schlüssel selbst, statt ihn im Formular abzufragen.
  • Oracle: Die Identities werden beim Start neu ausgerichtet.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.13 1.7.14
Wuic.Webcore 1.7.13 1.7.14
WuicOData 1.7.13 1.7.14
RuntimeEfCore 1.7.13 1.7.14
Wuic.MySqlProvider 1.7.13 1.7.14
Wuic.PostgresProvider 1.7.13 1.7.14
Wuic.OracleProvider 1.7.13 1.7.14
wuic-framework-lib (npm) 1.7.13 1.7.14

🔧 Empfohlene betriebliche Schritte beim Update

  1. Export-Warteschlange dimensionieren: Jeder vollständige Export einer großen Tabelle belegt beim Schreiben etwa einen Kern und 300 MB. Auf einem Server, der mit anderen Anwendungen geteilt wird, maxConcurrentExports unter den Standard setzen (zum Beispiel 2).
  2. Importierbare Routen: Wenn Ihre Dateien Schlüssel statt Beschreibungen enthalten, "import": { "fkey_mode": "key" } im Props Bag der Route setzen; mit both erzeugt der Export auch die Schlüsselspalten.
  3. Installationen mit bereits geladenem Tutorial: Die Erststart-Skripte gelten nur für neue Installationen. Um die Sortierung von den vorhandenen geografischen Spalten zu entfernen, auf der Metadatenbank UPDATE _metadati__colonne SET mcdisablesorting = 1 WHERE LOWER(mc_db_column_type) IN ('point', 'geography', 'geometry') ausführen und den Metadaten-Cache leeren.
  4. Clients, die den Fortschritt über den Benachrichtigungs-WebSocket lesen: Die Fortschrittsnachricht des Exports hat das neue Feld queuePosition, vorhanden, solange der Export in der Warteschlange wartet.

v1.7.13

Zurück zur Übersicht

Zuvor veroeffentlichte Version: 1.7.12 (20. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Diese Version ist vor allem ein Sicherheits-Release. Ein Audit der gesamten API-Oberflaeche hat Methoden und Controller gefunden, die ohne Login erreichbar sind, oder von einem Benutzer ohne Administratorrechte, sowie Sitzungsdaten, die aus der Anfrage statt vom Server genommen wurden. Alle wurden geschlossen, mit einem automatischen Test fuer jeden Fall. Dazu kommen die Korrekturen aus den Testzellen fuer PostgreSQL, MySQL und Oracle sowie der Abschluss des Multi-Tenant-Supports.

Das Update wird fuer alle Installationen empfohlen. Lesen Sie den letzten Abschnitt „Empfohlene operative Schritte": ein paar Verhaltensweisen aendern sich.


🛡️ Sicherheit

AsmxProxy-Aufrufe sind standardmaessig geschlossen. Jede ueber /api/Meta/AsmxProxy/{Dienst}.{Methode} erreichbare Methode erfordert jetzt eine gueltige Sitzung, ausser den als anonym deklarierten. Drei Attribute aus dem Namespace WEB_UI_CRAFTER.Helpers steuern den Zugriff:

  • [AsmxAnonymous]: Methode ohne Login aufrufbar (Login, me, Uebersetzungen, Registrierung, Passwort-Reset);
  • [AsmxAdmin]: nur fuer Administratoren (Rolle superadmin);
  • [AsmxFirstRun]: anonym nur waehrend des ersten Starts, danach nur fuer Administratoren.

Der Proxy ruft ausserdem nur die Serviceklassen auf (MetaService, scaffolding, die Anwendungsdienste in WEB_UI_CRAFTER.ProjectData.Servizi): ein vollqualifizierter Klassenname aus einem anderen Namespace wird abgelehnt.

Sitzung ueberall geprueft. Best-effort-Hardening der gesamten Sitzungsverwaltung:

  • das Cookie k-user wird auch bei den Providern PostgreSQL und Oracle serverseitig validiert (Token, Ablauf, durch neuen Login ersetzte Sitzung);
  • der Benutzer fuer persoenliche Einstellungen, Menue und Pivot ist der der Sitzung, nicht der in der Anfrage angegebene;
  • der Logout schliesst nur die eigene Sitzung;
  • im Multi-Tenant-Betrieb gilt das superadmin-Flag des Cookies nur, wenn die Datenbank es bestaetigt;
  • die Benutzerliste liefert keine Sitzungs-Token und -IPs mehr.

Auch die Endpunkte der Controller sind angepasst:

  • der appsettings.json-Editor, OData, Upload und Report pruefen Sitzung und Rolle serverseitig;
  • der Upload bleibt im Ordner des Datensatzes;
  • der Designer akzeptiert nur .css-Dateien des Projekts;
  • die Administrationsfunktionen fuer Webhook, Metriken und Lizenz sind Administratoren vorbehalten.

Benachrichtigungen. Die REST- und WebSocket-Endpunkte der Benachrichtigungen sind an den Benutzer der Sitzung gebunden: eine Anfrage fuer einen anderen Benutzer erhaelt 403 errors.auth.notification_forbidden. Das WebSocket funktioniert dank X-Forwarded-For auch hinter einem Reverse Proxy.

Registrierung standardmaessig aus. Sie wird nur mit registrationEnabled=true in appsettings.json eingeschaltet und weist nie die Rolle admin oder superadmin zu: default-role-id muss auf eine bestehende Rolle ohne Administratorrechte verweisen.

Erststart.

  • Das im Assistenten fuer den Administrator gewaehlte Passwort wird auch angewendet, wenn der Name mit einem bereits vorhandenen Benutzer uebereinstimmt.
  • Die Erststart-Skripte fuer MySQL und Oracle enthalten die Benutzer der automatischen Tests nicht mehr.
  • Der dedizierte Benutzer wuic_assistant (WUIC Assistant, MCP-Server) wird mit einem fuer jede Installation generierten Passwort angelegt, gespeichert in scripts/mcp/wuic-assistant.credentials.json (von git ausgeschlossen).

🤖 RAG und WUIC Assistant

  • /api/Rag/Chat erfordert Login; /api/Rag/Query bleibt ohne Login.
  • Die Details von /api/Rag/MetadataDetail, die Daten zurueckgeben (sample_records, lookup_value, db_*), sind Administratoren vorbehalten.
  • Der auf dem Server konfigurierte LLM-Schluessel wird nie an einen vom Aufrufer gewaehlten Provider oder eine Adresse gesendet.
  • Der MCP-Server wuic-rag oeffnet die Sitzung bei Bedarf selbst, mit WUIC_USER/WUIC_PASSWORD oder mit der Credentials-Datei des Benutzers wuic_assistant.

🏢 Multi-Tenant

  • Getrennte Caches pro Tenant fuer Menue, Tabellen- und Spaltenrechte, Stile, verfuegbare Routen und Datencache: ein Tenant sieht nicht mehr die Eintraege eines anderen.
  • Die Weitergabe einer Tabelle an die Tenants invalidiert den Cache jedes Ziel-Tenants, sodass der neue Eintrag sofort in den Menues erscheint.
  • Benachrichtigungen pro Tenant.
  • Unterstuetzung fuer PostgreSQL.

🗄️ Datenbank-Provider

  • PostgreSQL: Paginierung, Datencache, leere Many-to-Many-Filter, Themes, Daten mit beliebigem Host.
  • MySQL: Zaehlungen auf distinct-Selects, Systembeschraenkungen, Laden der Provider unter Linux.
  • Oracle:
    • Paginierung, geografische Filter (Flaeche und Distanz), Einschraenkung der Datensaetze nach Benutzer und Rolle, Namen der Stored Procedures, Booleans auf numerischen Spalten, Gruppierung auf langem Text, Datencache;
    • viel schnellere Uebersetzungen: von 3-4,6 s auf 0,3-0,7 s;
    • korrekte Anzahl aktualisierter und geloeschter Zeilen;
    • vollstaendige geografische Daten in den Erststart-Skripten (alle Bundesstaaten und Laender);
    • Demo des Bestellfreigabe-Workflows;
    • Namen der Timeline-Spalten an die anderen Datenbanken angeglichen.
  • Alle: typisierter Fehler fuer optimistische Nebenlaeufigkeit (409 errors.validation.optimistic_concurrency), einheitlicher Upload-Pfad, Erstellungsdatum der Benachrichtigungen in UTC (automatische Migration), korrekte Rolleneinschraenkungen fuer Benutzer mit mehreren Rollen.

🐛 Bemerkenswerte Fehlerbehebungen

  • Datensatznavigation ueber die URL: beim Wechsel von einem Datensatz zum anderen in Bearbeitung oder Detail laedt der Dialog den neuen Datensatz, statt den vorherigen zu zeigen.
  • data-record-loaded geht wieder auf false, wenn der Dialog den Datensatz neu laedt, damit automatische Tests keine alten Daten lesen.
  • Geografischer Filter wartet auf das Laden von Google Maps, bevor er zeichnet.
  • Scheduler-Liste wendet das Template an, bevor sie die Daten neu laedt.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.12 1.7.13
Wuic.Webcore 1.7.12 1.7.13
WuicOData 1.7.12 1.7.13
RuntimeEfCore 1.7.12 1.7.13
Wuic.MySqlProvider 1.7.12 1.7.13
Wuic.PostgresProvider 1.7.12 1.7.13
Wuic.OracleProvider 1.7.12 1.7.13
wuic-framework-lib (npm) 1.7.12 1.7.13

🔧 Empfohlene operative Schritte

  1. Eigene Dienste, die vor dem Login aufgerufen werden: die Methoden Ihrer Dienste in WEB_UI_CRAFTER.ProjectData.Servizi, die ohne Sitzung antworten muessen, sind mit [AsmxAnonymous] zu markieren; ohne das antworten sie mit 401 errors.auth.unauthenticated.
  2. Registrierung: wenn Sie sie nutzen, setzen Sie registrationEnabled=true und pruefen Sie, dass default-role-id auf eine Rolle ohne Administratorrechte verweist.
  3. Benutzer wuic_assistant auf bestehenden Installationen: das alte Standardpasswort wird nicht mehr akzeptiert. Setzen Sie als Administrator ein neues und tragen Sie es in scripts/mcp/wuic-assistant.credentials.json ein (oder in den Einstellungen der WUIC-Assistant-Erweiterung).
  4. Oracle- und MySQL-Installationen mit Tutorials bis 1.7.12: pruefen Sie die Benutzertabelle und entfernen Sie die Benutzer wuic_e2e_admin, wuic_e2e_admin_2, wuic_e2e_admin_3 und guest_1, falls vorhanden.
  5. Werkzeuge, die Daten von /api/Rag/MetadataDetail lasen oder /api/Rag/Chat ohne Login nutzten: sie muessen sich jetzt anmelden (fuer Daten, als Administrator).

v1.7.12

Zurück zur Übersicht

Zuvor veroeffentlichte Version: 1.7.11 (20. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Diese Version schliesst endgueltig die Reports, die auf MySQL und PostgreSQL eine leere Seite druckten. Die beiden vorigen Versionen wiesen diesen Defekt als behoben aus, indem sie an der Abfrage ansetzten: die Abfrage war nicht das Problem, und der Report kam weiterhin mit Kopfzeile und ohne eine einzige Zeile heraus. Die wirkliche Ursache fand sich im Vergleich zweier Reports auf derselben Installation — einer aus dem Paket, einer zur Laufzeit aus den Spalten genau dieser Installation gebaut: beide druckten leer, also lag es nicht an der Reportdatei.


📊 Reports drucken ihre Daten auf MySQL und PostgreSQL

Ein Stimulsoft-Report haelt in seinem Dictionary zwei verschiedene Dinge: die Verbindung zur Datenbank und den Typ der Datenquelle. Beim Oeffnen ersetzte das Framework die Verbindung durch die der laufenden Engine — StiMySqlDatabase, StiPostgreSQLDatabase — liess die Datenquelle aber in dem Typ, in dem sie erzeugt worden war: StiSqlSource, und das bedeutet fuer Stimulsoft SQL Server.

Eine SQL-Server-Quelle auf einer MySQL-Datenbank wirft keinen Fehler: sie liefert schlicht eine leere Datenmenge. Der Report wurde korrekt gezeichnet — Kopfzeile, Rahmen, „Seite 1 von 1" — und druckte keine Zeile.

Die Umwandlung der Quelle in den Typ der Engine gab es im Produkt bereits, aber nur fuer Oracle, an zwei getrennten Stellen (Viewer und Designer). Jetzt gilt sie an beiden auch fuer MySQL und PostgreSQL. Wer Reports hat, die leer druckten, muss nichts neu erzeugen: einfach erneut oeffnen.

🔑 Metadaten-Indizes unter MySQL

Auf MySQL-Installationen, die der gefuehrte Erststart angelegt hat, scheiterte die Migration, die die Indizes auf den heissen Pfaden der Metadaten erzeugt, mit Fatal error encountered during command execution.

Der Grund steht in der Verbindungszeichenfolge, die der Assistent schreibt: ohne Allow User Variables=True liest der MySQL-Treiber jedes @name in einem Skript als Parameter statt als Servervariable. Die normalen Abfragen des Frameworks verwenden tatsaechlich Parameter und liefen deshalb; jene Migration verwendet Servervariablen und starb. Der Schluessel wird nun der Metadaten-Verbindung hinzugefuegt — sowohl wenn der Assistent sie zusammensetzt als auch wenn das Backend sie neu schreibt.

🧩 Dynamische Abfrage unter PostgreSQL

Das PostgreSQL-Gateway rief die Funktion, die dynamische Abfragen baut, mit 19 Argumenten auf, waehrend der PostgreSQL-Satellit 15 annimmt: der Aufruf scheiterte immer, mit MissingMethodException. Die Argumente stimmen jetzt, und die Fehlermeldung dieses Gateways nennt zusaetzlich die Anzahl der uebergebenen Argumente und die vorhandenen Methodenvarianten — denn „Methode nicht gefunden" allein schickt einen auf die Suche nach einer Methode, die sehr wohl da ist.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.11 1.7.12
Wuic.Webcore 1.7.11 1.7.12
WuicOData 1.7.11 1.7.12
RuntimeEfCore 1.7.11 1.7.12
Wuic.MySqlProvider 1.7.11 1.7.12
Wuic.PostgresProvider 1.7.11 1.7.12
Wuic.OracleProvider 1.7.11 1.7.12
wuic-framework-lib (npm) 1.7.11 1.7.12

🔧 Empfohlene operative Schritte

  1. Keine Konfigurationsaenderung noetig: die Schluessel in appsettings.json bleiben gleich.
  2. Wenn Sie Reports haben, die leer druckten, unter MySQL oder PostgreSQL: einfach erneut oeffnen, es muss nichts neu erzeugt werden.
  3. Auf bereits produktiven MySQL-Installationen fuegen Sie Allow User Variables=True der MetaDataSQLConnection in appsettings.json hinzu, damit die Index-Migration durchlaeuft. Neue Installationen bekommen es vom gefuehrten Erststart. Unter MySQL ist die Auswirkung gering: zwei der drei Indizes werden bereits von der Eindeutigkeitsbedingung der Route und von dem Index abgedeckt, den InnoDB fuer Fremdschluessel selbst anlegt.

v1.7.11

Zurück zur Übersicht

Zuvor veroeffentlichte Version: 1.7.10 (19. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Diese Version schliesst zwei Defekte, die 1.7.10 als behoben auswies und die trotzdem weiter auftraten: gescaffoldete Reports, die eine leere Seite drucken, und das Scaffolding einer Tabelle aus der Oberflaeche, das mit einem Fehler antwortet. Gefunden hat sie dieselbe Runde von Installationen auf sauberen Maschinen, aus der die vorige Version entstand — diesmal gegen das veroeffentlichte Produkt wiederholt, um die Korrekturen zu pruefen. Sie betreffen weiterhin diejenigen, die nicht SQL Server einsetzen.


📊 Gescaffoldete Reports drucken ihre Daten wirklich auf MySQL und PostgreSQL

1.7.10 fuehrte das Neuschreiben der Abfrage von Reports ein, die das Framework erzeugt — denn die .mrt-Datei im Paket traegt die Bezeichner der Engine, auf der sie entstanden ist. Dieses Neuschreiben lief jedoch nie: es suchte die Metadatentabelle ueber den Namen der Datenbank des Dictionaries — der immer Connessione lautet — statt ueber den Namen der Datenquelle, und das ist die Route. Da es keine Tabelle dieses Namens fand, kehrte es stillschweigend zurueck, schrieb nichts um und hinterliess keine Spur; der Report druckte weiter die Seite mit Kopfzeile und keiner einzigen Zeile.

Die Route wird jetzt an der richtigen Stelle gelesen, und jeder Fall, in dem das Neuschreiben nicht stattfinden kann — keine Tabelle dieses Namens, Tabelle ohne Spalten — hinterlaesst eine Zeile im Protokoll des Backends. Ein leerer Report ohne Erklaerung ist genau das, was diesen Defekt so schwer sichtbar machte.

Wer erzeugte Reports hat, die auf MySQL oder PostgreSQL leer druckten, muss nichts neu erzeugen: einfach erneut oeffnen.

🧱 Scaffolding einer Tabelle aus der Oberflaeche auf Oracle

Auf Oracle antwortete das Erzeugen einer Tabelle aus der Oberflaeche mit HTTP 500 und ORA-00001: unique constraint ... violated auf der Menuetabelle, und die Route entstand nicht.

Es ist derselbe Defekt, der in der vorigen Version fuer PostgreSQL behoben wurde und auf Oracle offen blieb. Das Schema deklariert den Menueschluessel als GENERATED BY DEFAULT AS IDENTITY, das Framework fuegt seine eigenen Systemeintraege aber mit von Hand berechnetem Schluessel ein: der Generator wandert nicht mit, und die erste Zeile, die sich auf ihn stuetzt, fordert einen bereits vergebenen Schluessel an. Das Neuausrichten des Generators gilt nun fuer beide Engines.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.10 1.7.11
Wuic.Webcore 1.7.10 1.7.11
WuicOData 1.7.10 1.7.11
RuntimeEfCore 1.7.10 1.7.11
Wuic.MySqlProvider 1.7.10 1.7.11
Wuic.PostgresProvider 1.7.10 1.7.11
Wuic.OracleProvider 1.7.10 1.7.11
wuic-framework-lib (npm) 1.7.10 1.7.11

🔧 Empfohlene operative Schritte

  1. Keine Konfigurationsaenderung: die Schluessel in appsettings.json bleiben gleich.
  2. Wenn Sie erzeugte Reports unter MySQL oder PostgreSQL haben, die leer druckten, oeffnen Sie sie einfach erneut: die Abfrage wird beim Rendern neu geschrieben, es muss nichts neu erzeugt werden.
  3. Unter Oracle: antwortete das Scaffolding einer Tabelle aus der Oberflaeche mit einem Fehler wegen doppelten Schluessels, versuchen Sie es erneut — der Schluesselgenerator der Menuetabelle wird nach jedem Insert mit explizitem Schluessel neu ausgerichtet.

v1.7.10

Zurück zur Übersicht

Zuvor veroeffentlichte Version: 1.7.9 (18. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Diese Version entstand aus einer vollstaendigen Runde von End-to-End-Installationen auf sauberen Maschinen: sechzehn Kombinationen, die vier Distributionspakete gegen die vier unterstuetzten Engines, jedes Mal ausgehend vom veroeffentlichten Zip und der Dokumentation folgend, wie es jemand tut, der zum ersten Mal installiert. Fast alles, was dabei herauskam, betrifft diejenigen, die nicht SQL Server einsetzen: Reports, die eine leere Seite druckten, ein Scaffolding, das fehlschlug, Indizes, die nie entstanden. Alle lautlos — keine Meldung auf dem Bildschirm, nur eine Funktion, die nicht funktionierte.


📊 Reports drucken ihre Daten auf MySQL und PostgreSQL wieder

Beim Oeffnen eines Tutorial-Reports auf MySQL oder PostgreSQL zeichnete der Viewer die Seite — Kopfzeile, Rahmen, „Seite 1 von 1" — und druckte keine einzige Zeile. Derselbe Report funktionierte auf SQL Server.

Der Grund: ein vom Framework scaffoldeter Report traegt die Abfrage, die ihn fuellt, in sich, und diese Abfrage ist mit den Bezeichnern der Engine geschrieben, auf der sie erzeugt wurde. Die .mrt-Datei reist jedoch im Paket mit und ist fuer alle vier Engines dieselbe: die der Tutorials enthaelt nicht gequotete Bezeichner in Grossbuchstaben. Auf SQL Server geht das durch, weil der Vergleich dort gross-/kleinschreibungsunabhaengig ist; auf PostgreSQL wird ein nicht gequoteter Bezeichner in Kleinbuchstaben umgesetzt und findet die Spalten nicht mehr, die das Tutorial gequotet in PascalCase anlegt.

Jetzt lassen vom Framework erzeugte Reports — erkennbar an der Markierung in ihrem SELECT — ihre Abfrage vor dem Rendern aus den Metadaten fuer die Engine der aktuellen Installation neu erzeugen, mit den richtigen Quoting-Regeln. Von Hand im Designer geschriebene Reports bleiben unberuehrt: ihre Abfrage bleibt die, die Sie geschrieben haben.

🧱 Scaffolding einer Tabelle aus der Oberflaeche auf PostgreSQL

Auf PostgreSQL antwortete das Scaffolding einer Tabelle aus der Oberflaeche mit HTTP 500 und einer Fremdschluesselverletzung auf _metadati__colonne, und die erzeugte Route blieb ohne Zeilen.

Der eigentliche Defekt lag davor, und er war doppelt. Die Identity-Sequenz der Menue-Tabelle bleibt zurueck, sobald Zeilen mit explizitem Schluessel eingefuegt werden — was das Framework tut, wenn es seine eigenen Systemeintraege anlegt: ab da fordert das erste Insert, das sich auf die Sequenz stuetzt, einen bereits vergebenen Schluessel an. Und wenn das Anlegen des Menueeintrags scheiterte, loeschte der Code die gerade eingefuegte Metadatenzeile der Tabelle und liess die Spalten ohne ihren Vater zurueck: der Fehler, der beim Benutzer ankam, sprach deshalb von Fremdschluesseln und von einer Tabelle, die nichts damit zu tun hatte.

Die Sequenz wird jetzt nach jedem Insert mit explizitem Schluessel neu ausgerichtet, und ein Menue, das nicht entsteht, nimmt die Tabellen-Metadaten nicht mehr mit: schlimmstenfalls wird der Menueeintrag im Designer ergaenzt.

⚡ Die Metadaten-Indizes entstehen jetzt wirklich

Die Schema-Migrationen, die die Indizes auf den heissen Pfaden der Metadaten anlegen — Routenname, Spalten pro Tabelle, Scheduler — wurden auf einer neuen Installation nicht angewendet, aus zwei verschiedenen Gruenden.

Der erste: beim Start einer frisch installierten Anwendung gibt es die Verbindungszeichenfolgen noch nicht, also scheiterten die Migrationen; und da der Versuch als verbraucht galt, wurden sie im Prozess nicht mehr wiederholt. Auf einer neuen Installation, wo niemand den Dienst gleich danach neu startet, entstanden diese Indizes nie. Die Bedingung „Datenbank noch nicht konfiguriert" verbraucht den Versuch nicht mehr, und die Migrationen laufen, sobald der Erststart-Assistent die Verbindungszeichenfolgen geschrieben hat.

Der zweite, nur unter Oracle: das Index-Skript nannte die Spalten in Kleinbuchstaben gequotet, waehrend das Schema sie in Grossbuchstaben anlegt — also ORA-00904, und die Migration blieb dort stehen.

Spuerbar ist das auf den Seiten, die von diesen Indizes abhaengen: eine Liste aus dem Menue oeffnen, in eine bereits besuchte Liste zurueckkehren, der erste Eintrag des Administrationsmenues. Ohne Indizes erreichten diese Vorgaenge unter PostgreSQL Dutzende von Sekunden.

🤖 Der VS-Code-Assistent beantwortet Fragen, statt Code zu schreiben

Auf die Frage „welche Spalten hat die Route X?" — auch mit dem Zusatz „aendere keine Dateien" — scaffoldete der Assistent eine Komponente und antwortete mit der Beschreibung dessen, was er geschrieben hatte. Die Frage blieb unbeantwortet und das Projekt wurde entgegen der Anweisung veraendert.

Eine Anfrage, die eine Frage ist oder Aenderungen ausdruecklich untersagt, versetzt den Assistenten nun in den Nur-Lese-Modus: Werkzeuge, die das Projekt anfassen, werden abgelehnt, und die Antwort entsteht mit den Abfragewerkzeugen (Spalten und Metadaten der Route, Suche in Code und Dokumentation).

🔧 Installationen, die voruebergehende Stolpersteine aushalten

  • Windows: wenn winget meldet, dass bereits eine andere Installation laeuft — typischerweise Windows Update direkt nach dem Start — bricht der Installer nicht mehr mit „installieren Sie es von Hand" ab: er versucht es dreimal mit wachsender Wartezeit. Dieser Zustand loest sich in einigen Dutzend Sekunden von selbst.
  • Linux, Oracle: der Oracle-Container meldet den Listener als bereit, waehrend der Erststart noch das Passwort des Benutzers system setzt. Der Installer beendete sich mit ORA-01017; jetzt wartet er, bis die Anmeldedaten gueltig sind, und wenn sie es nicht werden, sagt er es deutlich, statt den Fehler spaeter verkleidet wieder auftauchen zu lassen.

📚 Dokumentation

  • Pattern „Framework component + Custom data": ein neuer Abschnitt erklaert, dass Sie unter Oracle, wenn Sie die Verbindung mit DataSQLConnection selbst oeffnen, die Session auf Ihr Schema bringen muessen (ALTER SESSION SET CURRENT_SCHEMA) oder die Tabellen qualifizieren — sonst antwortet die erste Abfrage ORA-00942, obwohl die Tabelle existiert. Die anderen Engines brauchen das nicht, weil die Datenbank in der Verbindungszeichenfolge steht.
  • Getting started: der VS-Code-Weg (Workspace-Datei, Start mit F5, Launcher Fullstack) steht jetzt im Fliesstext der Seite und nicht mehr nur in einem Codeblock.
  • FIRST_STEPS des Pakets (Englisch, Franzoesisch, Spanisch, Deutsch): der Abschnitt zum Oeffnen des Projekts in VS Code und zum npm-Skript, das das Frontend ausliefert, wurde ergaenzt. Bisher gab es ihn nur in der italienischen Fassung.
  • README des Linux-Quellkits: der Abschnitt zum Umbenennen des Projekts wurde ergaenzt, bislang nur fuer Windows dokumentiert.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.9 1.7.10
Wuic.Webcore 1.7.9 1.7.10
WuicOData 1.7.9 1.7.10
RuntimeEfCore 1.7.9 1.7.10
Wuic.MySqlProvider 1.7.9 1.7.10
Wuic.PostgresProvider 1.7.9 1.7.10
Wuic.OracleProvider 1.7.9 1.7.10
wuic-framework-lib (npm) 1.7.9 1.7.10

🔧 Empfohlene operative Schritte

  1. Keine Konfigurationsaenderung: die Schluessel in appsettings.json bleiben gleich.
  2. Auf bereits produktiven PostgreSQL- und Oracle-Installationen werden die fehlenden Indizes beim ersten Start mit 1.7.10 angelegt: dieser Start kann einmalig ein paar Sekunden laenger dauern.
  3. Wenn Sie gescaffoldete Reports unter MySQL, PostgreSQL oder Oracle haben, die leer druckten, oeffnen Sie sie einfach erneut: nichts muss neu erzeugt werden, die Abfrage wird beim Rendern neu geschrieben.
  4. Wenn einer Ihrer Controller unter Oracle eigene Verbindungen oeffnet, pruefen Sie, ob er die Session auf das Datenschema bringt oder die Tabellen qualifiziert: siehe die Notiz auf der Pattern-Seite.

v1.7.9

Zurück zur Übersicht

Zuletzt veroeffentlichte Version: 1.7.8 (18. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Eine kurze, gezielte Version: die Ladeanzeige hat gelogen. Auf einer langsamen Route blieb die Seite waehrend der gesamten Abfrage leer, und was dann erschien, hatte die Anzeige bereits auf halbem Weg ausgeschaltet. Wer das Produkt an einer grossen Tabelle ausprobierte, sah einen weissen Bildschirm und schloss daraus, dass es haengt.


⏳ Das Grid erscheint sofort, und die Wartezeit ist sichtbar

Der Fehler hatte zwei Haelften, und jede verdeckte die andere.

Das Grid existierte noch nicht. Die Tabelle — und mit ihr das Lade-Overlay, das zu ihr gehoert — wurde erst gebaut, wenn die Daten eintrafen: die Komponente bekam die Metadaten zusammen mit dem Abfrageergebnis, nicht vorher. Auf einer langsamen Route hiess das: keine Kopfzeile, keine Befehlsleiste, kein Zeichen von Aktivitaet — nur der Seitentitel, ueber alle Sekunden der Abfrage. Die Metadaten werden jetzt vor dem Start des Datenlesens veroeffentlicht: das Grid baut sich leer auf und die Anzeige dreht sich die ganze Wartezeit. Gemessen an einer Route, die in 4 Sekunden antwortet: die Tabelle steht nach 330 ms auf dem Bildschirm statt nach 4.300.

Die Anzeige ging auf halber Strecke aus. Jeder Serveraufruf schaltete den Zustand „beschaeftigt" ein und aus, ohne zu zaehlen, wie viele Operationen unterwegs waren. Beim Oeffnen einer Route mit Lookup-Spalten startet das Framework ein Dutzend Metadaten-Lesevorgaenge parallel zur Datenabfrage: der erste, der antwortete — nach einer halben Sekunde —, schaltete die Anzeige fuer alle aus, waehrend die eigentliche Abfrage noch drei Sekunden weiterlief.

Die laufenden Operationen werden jetzt gezaehlt, und der Zustand wird erst frei, wenn die letzte endet. Auf derselben Route deckt die Anzeige die gesamte Wartezeit ab statt 600 Millisekunden.

Die Korrektur wurde auf allen Archetypen geprueft — list, map, scheduler, chart, carousel, kanban, timeline, tree, spreadsheet —, indem fuer jeden gemessen wurde, wann die Anzeige angeht, wann sie ausgeht und wann die Daten erscheinen: in keinem geht sie vor den Daten aus.

Ein Effekt, den man kennen sollte: Auf Routen mit vielen Lookup-Spalten bleibt die Anzeige nun einige Sekunden an, nachdem die Zeilen lesbar sind, weil jene Metadaten-Lesevorgaenge tatsaechlich noch laufen. Frueher verschwand sie eher — aber sie log.

🧩 Der Props-Bag-Vorschlag schaltet das Flag wirklich ein

Im Bereich md_props_bag vorschlagen des Metadaten-Editors fuegte das Ankreuzen eines booleschen Eintrags — etwa archetypes.list.advancedFilter, der die Spaltenfilter durch die Filterleiste ersetzt — "advancedFilter": false in das JSON ein. Das Haekchen legte den Schluessel an, kopierte aber den Beispielwert, der fuer diese Flags false ist: man musste es bemerken und von Hand korrigieren.

Ein angekreuzter boolescher Eintrag geht jetzt mit true hinein. Wer das Flag nicht will, kreuzt es schlicht nicht an: der Laufzeit-Standard ist ohnehin false. Nicht-boolesche Eintraege tragen weiterhin den Beispielwert, der dort als auszufuellende Vorlage dient. Gilt fuer beide Vorschlagsdialoge, den der Tabelle und den der Spalte.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.8 1.7.9
Wuic.Webcore 1.7.8 1.7.9
WuicOData 1.7.8 1.7.9
RuntimeEfCore 1.7.8 1.7.9
Wuic.MySqlProvider 1.7.8 1.7.9
Wuic.PostgresProvider 1.7.8 1.7.9
Wuic.OracleProvider 1.7.8 1.7.9
wuic-framework-lib (npm) 1.7.8 1.7.9

🔧 Empfohlene operative Schritte

  1. Keine Konfigurationsaenderung: Die Schluessel in appsettings.json bleiben gleich.
  2. Nach dem Update der npm-Bibliothek das Frontend neu bauen: beide Korrekturen leben in den Komponenten, nicht in den Metadaten.
  3. Wenn Ihre Anwendung den „beschaeftigt"-Zustand des Frameworks liest, um eine eigene Oberflaeche zu steuern, pruefen Sie das: dieser Zustand bleibt jetzt aktiv, bis die letzte laufende Operation endet, dauert also laenger als zuvor. Das ist das korrekte Verhalten, aber eine beobachtbare Aenderung.
  4. Falls eigener Code den „beschaeftigt"-Zustand durch direktes Schreiben ausgeschaltet hat, wechseln Sie zu beginBusy / endBusy der Toolbox — oder zu resetBusy bei einem Fehler-Wiederherstellungspfad: ein direktes Schreiben schaltet die Anzeige auch fuer die Operationen aller anderen aus.

v1.7.8

Zurück zur Übersicht

Zuletzt veroeffentlichte Version: 1.7.7 (17. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Eine Version, die aus dem Benutzen des Produkts entstanden ist und nicht aus dem Lesen darueber: eine Geste, die in den Listen fehlte, ein Beispiel, das auf drei von vier Datenbanken existierte, Texte, die auf nicht-italienischen Installationen italienisch blieben, und Dokumentationsseiten, die andere Bildschirme beschrieben als die echten.


🖱️ Doppelklick auf eine Zeile: das Bearbeitungsformular oeffnet sich

Bis gestern liess sich das Bearbeitungsformular eines Datensatzes nur ueber den Eintrag Bearbeiten im Aktionsmenue der Zeile oeffnen. Jetzt oeffnet es auch ein Doppelklick auf die Zeile.

Das ist keine parallele Abkuerzung, die dieselbe Logik noch einmal schreibt: Das Framework geht von der getroffenen Zeile zu ihrem Aktionsmenue und fuehrt genau dessen Befehl aus. Es gelten dieselben Berechtigungen (md_editable) und dieselbe auf diesem Datensatz ausgewertete bedingte Regel (md_conditional_update_rule): Wo der Stift fehlt oder deaktiviert ist, tut der Doppelklick nichts. Das ist eine strukturelle Garantie, kein Versprechen — aendern sich morgen die Regeln, wer bearbeiten darf, aendern sie sich fuer beide zugleich.

Die Geste wird ignoriert, wenn sie etwas anderem gilt: Doppelklick auf eine Schaltflaeche, einen Link oder ein Eingabefeld (dann benutzen Sie dieses Steuerelement oder markieren Text), oder eine Zeile, die bereits inline bearbeitet wird.

Das gilt auch fuer das mobile Karten-Layout, wo die Liste zwei kurz aufeinanderfolgende Beruehrungen derselben Karte erkennt. Noetig war das, weil der Browser das Doppelklick-Ereignis nicht immer liefert, wenn die Geste von einer Beruehrung stammt: Zwei Taps bleiben zwei getrennte Klicks.

🗓️ Das SQL-Server-Tutorial hat jetzt die Seite Timeline / Gantt

Die Dokumentation beschreibt den Timeline-/Gantt-Archetyp, und die Tutorial-Datenbank bringt die Beispieldaten laengst mit — auf SQL Server fehlten aber die Route und der Menueeintrag, die sie oeffnen: Es gab sie nur auf MySQL, PostgreSQL und Oracle. Wer das Tutorial auf der Standard-Engine installierte, hatte keine Moeglichkeit, diese Ansicht zu sehen, und die Dokumentationsseite blieb unueberpruefbar.

Das SQL-Server-Tutorial hat jetzt Beispiele → Timeline (Gantt): neun Vorgaenge in zwei Projekten, mit Abhaengigkeiten zwischen Vorgaengen, Meilensteinen, Fortschritt und Gruppierung nach Projekt. Es ist ein vollstaendiges, funktionierendes Beispiel fuer md_props_bag.archetypes.timeline, aus dem sich die Konfiguration uebernehmen laesst — samt der beiden Stellen, die am haeufigsten falsch gemacht werden: Vorgaenger ueber eine Multiselect-Spalte mit selbstreferenzierender Bruecken-Tabelle, und Gruppierung ueber einen Lookup statt ueber freien Text.

🌍 Texte, die italienisch geblieben sind

  • RAG-Chatbot. Waehrend die Engine startet, antwortet der Chat, dass er noch nicht bereit ist. Diese Meldung stand als italienischer Literal im Code und erreichte englische, franzoesische, spanische und deutsche Installationen unveraendert. Jetzt ist es ein in fuenf Sprachen uebersetzter Schluessel. Er spricht auch nicht mehr vom „Herunterladen der Modelle“: Seit die Installation sie vorab holt, ist die Wartezeit das Laden in den Speicher, nicht der Download — die Meldung beschrieb etwas, das gar nicht stattfand.
  • Workflow-Designer. Sechs Menuebefehle (Erneut oeffnen, Neuer Graph, Graph speichern, Loeschen, Automatisches Re-Layout, Runner in neuem Tab oeffnen) waren italienische Literale im Code: Auf einer Installation in einer anderen Sprache kam das Menue halb uebersetzt heraus.
  • Der Kartenhinweis ohne Google-Schluessel. Er existierte in zwei Sprachen und nur in den SQL-Server-Paketen; auf den anderen Engines erschien statt der Meldung der rohe Schluessel. Jetzt sind es fuenf Sprachen auf allen vier Engines.

🧹 Ein aufgeraeumteres Tutorial

Aus dem Tutorial-Menue verschwinden die zwanzig Cline Prompt Tests-Eintraege — Reste interner Versuche, die in einer Beispieldatenbank nichts zu suchen hatten.

📚 Dokumentation

Die folgenden Seiten beschrieben das Produkt ungenau. Das sind keine kosmetischen Korrekturen: Es waren Anleitungen, die in die falsche Richtung fuehrten.

  • Erster Start. Der Wizard war ueberhaupt nicht beschrieben. Der Einstiegsleitfaden erklaert jetzt die beiden Setup-Modi (Bestehende Datenbank und Tutorial WideWorldImporters, der zweite nur vorhanden, wenn das Paket das Tutorial mitbringt), das Feld DataSQLConnection und die Test-Schaltflaeche, von der alles Weitere abhaengt — bis Sie sie druecken, bleibt die Datenbankliste deaktiviert —, den initialen Admin-Benutzer, und wie lange das Provisioning dauert: 30 s – 2 min im Tutorial-Modus, 1–4 min auf einer bestehenden Datenbank mit aktiviertem automatischem Scaffolding.
  • Es gibt kein Standardpasswort. Dieselbe Seite nannte admin / admin als Zugangsdaten nach dem ersten Start. Das ist falsch: Das Passwort ist das im Wizard gewaehlte, ein anderes gibt es nicht.
  • Lizenz. Die Prozedur verlangte, die Werte in die Konfigurationsdatei zu schreiben und das Backend neu zu starten, und erwaehnte nie, dass es die Oberflaeche gibt. Fuegt man die Lizenz unter Verwaltung → AppSettings-Editor, Abschnitt License, ein, laedt das Backend die Validierung selbst neu, und die Lizenz gilt ab der naechsten Anfrage. Ein Neustart ist nur im anderen Fall noetig, wenn die Werte von Hand in die Datei geschrieben werden.
  • Initiales Scaffolding. Es stand nicht dort, dass es in Tutorial-Paketen nichts zu scaffolden gibt: Die Metadaten-Datenbank kommt bereits befuellt, und die Checkbox, die Tabellen registriert, existiert nur im Modus Bestehende Datenbank.
  • List Grid. Ein neuer Abschnitt listet die Schaltflaechen, die die Toolbar beim Oeffnen einer Route tatsaechlich zeigt, samt der Bedingung fuer jede. Die Seite nannte nur optionale oder fluechtige Befehle — die des Import-/Export-Fortschrittsdialogs, den es nur waehrend eines laufenden Imports oder Exports gibt — und keine der Schaltflaechen, die man beim Oeffnen einer Liste sieht.
  • Designer. Die Palettenliste nannte fuenf Eintraege, davon drei unter diesem Namen nicht existent, und schwieg ueber den Rest. Jetzt stehen dort die drei echten Gruppen und die echten Komponentennamen.
  • Trial-Modus. Eine Installation ohne Lizenz begrenzt jede Abfrage auf 20 Datensaetze: Eine Liste, die bei einer Tabelle mit Tausenden Zeilen „20 von 20“ anzeigt, laeuft im Trial und ist nicht defekt. Das steht jetzt dort, wo es gebraucht wird — auf der Download-Seite und im Einstiegsleitfaden — und nicht nur auf der Preisseite.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.7 1.7.8
Wuic.Webcore 1.7.7 1.7.8
WuicOData 1.7.7 1.7.8
RuntimeEfCore 1.7.7 1.7.8
Wuic.MySqlProvider 1.7.7 1.7.8
Wuic.PostgresProvider 1.7.7 1.7.8
Wuic.OracleProvider 1.7.7 1.7.8
wuic-framework-lib (npm) 1.7.7 1.7.8

🔧 Empfohlene operative Schritte

  1. Keine Konfigurationsaenderung: Die Schluessel in appsettings.json bleiben gleich.
  2. Nach dem Update der npm-Bibliothek das Frontend neu bauen: Der Doppelklick lebt in der Listen-Komponente, nicht in den Metadaten.
  3. Falls Ihre Anwendung bereits ein Verhalten am Doppelklick auf eine Listenzeile haengen hatte, pruefen Sie es: Das Framework oeffnet nun bei derselben Geste das Bearbeitungsformular.
  4. Der Eintrag Timeline (Gantt) erscheint in neuen Tutorial-Installationen auf SQL Server. Eine bestehende Installation muss nicht neu aufgesetzt werden: Die Beispieldaten sind bereits da, es fehlen nur Route und Menueeintrag, und beide lassen sich ueber die Oberflaeche ergaenzen.

v1.7.7

Zurück zur Übersicht

Zuvor veröffentlichte Version: 1.7.6 (16. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Diese Version behebt fünf Fehler, die bei der Installation des Frameworks auf frischen Maschinen gefunden wurden — einen je Kombination aus Betriebssystem und Datenbank. Der wichtigste betrifft Oracle und PostgreSQL: Dort liess sich eine vom Framework erzeugte Seite je nach Schreibweise ihres Namens in der Adresse nicht öffnen. Die übrigen betreffen Oracle XE und das Linux-Quellpaket.


🔤 Routen öffnen sich jetzt unabhängig von der Gross- und Kleinschreibung

Der Name einer Route entsteht kleingeschrieben: Aus einer Tabelle Supplier wird die Route supplier. /Supplier/List zu öffnen — also den Namen der eigenen Tabelle zu schreiben — funktionierte auf SQL Server und MySQL, wo die Engine die Schreibweise ignoriert, nicht aber auf Oracle und PostgreSQL, die mit Route 'Supplier' in den Metadaten nicht gefunden antworteten.

Dieselbe Adresse, dasselbe Scaffolding, ein anderes Ergebnis je nach darunterliegender Datenbank. Auf Oracle vervielfachte sich der Effekt: die vom initialen Scaffolding erzeugte Liste, die über die Oberfläche angelegte Seite, die Komponenten, die ein Framework-Widget einbinden, und die Metadaten-APIs scheiterten alle aus demselben Grund und wirkten wie vier getrennte Störungen.

Die Auflösung einer Route weicht nun auf einen Vergleich ohne Beachtung der Schreibweise aus, wenn der exakte Vergleich fehlschlägt: Der normale Weg bleibt unverändert, und die physischen Namen von Tabellen und Spalten bleiben genau so, wie sie im Schema stehen.

Gäbe es in einer Installation zwei Routen, die sich nur durch die Gross- und Kleinschreibung unterscheiden, kann das Framework keine davon auswählen: Es sagt das jetzt mit einer expliziten Meldung (HTTP 409, errors.metadata.route.ambiguous_case), die die kollidierenden Routen auflistet, statt mit „nicht gefunden" zu antworten.

🗄️ Oracle XE: Scaffolding über die Oberfläche

Eine Seite aus einer Tabelle über das Administrationsmenü zu erzeugen, antwortete auf Oracle XE mit 500:

ORA-00932: inconsistent datatypes: expected NUMBER got BOOLEAN

Die Metadaten-Spalten, die einen Schalter abbilden, sind numerisch, doch der Provider schrieb einen Boolean hinein: ein Typ, den es in Oracle-SQL erst ab 23ai gibt. Auf 23ai verdeckte die implizite Konvertierung das Problem; auf XE — der am weitesten verbreiteten Edition — wies der Server das INSERT zurück und das Scaffolding brach ab. Jetzt werden 1 und 0 geschrieben, was auf jeder Version funktioniert.

🐧 Linux-Quellpaket

  • Der RAG-Chatbot war aus. Das Paket erklärte die .NET-Engine in seiner eigenen Konfiguration für aktiv, lieferte sie aber nicht mit: /api/Rag/Health antwortete dauerhaft not-initialized, mit WuicRagEngine.dll nicht gefunden. Die Engine ist nun auch hier enthalten, wie bereits im Windows-Paket.
  • Die Modelle werden während der Installation geladen. Bei der ersten Frage musste der Chatbot 4,4 GB an Modellen und Index herunterladen und antwortete minutenlang nur „Initialisierung läuft". install.sh holt sie nun während der Installation, parallel zum Rest: Die erste Frage wird sofort beantwortet. Mit --skip-prefetch wird der Download übersprungen und das bisherige Verhalten wiederhergestellt. Der Schritt bricht die Installation nie ab: Streikt das Netz, holt der Chatbot sie beim ersten Gebrauch.
  • Die Dateien für Coding-Assistenten wurden nicht erzeugt. Unter Linux schrieb der erste Start weder AGENTS.md noch CLAUDE.md, .mcp.json oder die Skills: Die erzeugende Vorlage lag nicht im Paket, und die Generierung wurde stillschweigend übersprungen. Sie sind jetzt in beiden Linux-Paketen enthalten.
  • Projekt umbenennen. rename-project.sh suchte das Projekt nur im eigenen Ordner und im übergeordneten, im Paket liegt es aber eine Ebene tiefer: Wie dokumentiert aufgerufen, endete es mit WuicTest.csproj nicht gefunden. Es sucht nun auch dort und listet, wenn es wirklich nichts findet, die geprüften Pfade auf.
  • Das Paket schleppt die Reste des alten Python-RAG-Stacks (codebase_embeddings/, rag-setup.ps1, rag-start.ps1) nicht mehr mit; er wurde im Juni durch die .NET-Engine ersetzt.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.7.6 1.7.7
Wuic.Webcore 1.7.6 1.7.7
WuicOData 1.7.6 1.7.7
RuntimeEfCore 1.7.6 1.7.7
Wuic.MySqlProvider 1.7.6 1.7.7
Wuic.PostgresProvider 1.7.6 1.7.7
Wuic.OracleProvider 1.7.6 1.7.7
wuic-framework-lib (npm) 1.7.6 1.7.7

🔧 Empfohlene operative Schritte

  1. Unter Oracle und PostgreSQL: Wenn Sie gescaffoldete Seiten als defekt notiert hatten, probieren Sie sie nach dem Update erneut — sehr wahrscheinlich lag es daran.
  2. Unter Oracle XE: Scaffolding über die Oberfläche ist ab dieser Version nutzbar; zuvor exponierte Tabellen müssen nicht neu erstellt werden.
  3. Eine Quellinstallation unter Linux bedeutet nun 4,4 GB zusätzlichen Download während der Installation — oder --skip-prefetch, um ihn auf die erste Nutzung des Chatbots zu verschieben.
  4. Es ist keine Konfigurationsänderung nötig: Die Schlüssel in appsettings.json bleiben unverändert.

v1.7.6

Zurück zur Übersicht

Zuvor veröffentlichte Version: 1.7.4 (16. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Diese Version erscheint am selben Tag wie die 1.7.4 und korrigiert drei Punkte, die beim Wiederholen der Installation auf sauberen Maschinen unmittelbar nach der Veröffentlichung auftraten. Der wichtigste betrifft Oracle: der Erststart auf einer bestehenden Datenbank lief bis zum Ende durch und meldete Erfolg, ließ die Anwendung aber ohne die Tabellen des Benutzers zurück. Die anderen beiden betreffen das Linux-Paket.


🗄️ Oracle: Erststart auf einer bestehenden Datenbank

Wer den Modus "bestehende Datenbank" wählte, sein eigenes Schema angab und das automatische Scaffolding anforderte, landete beim Login mit einem Menü ohne eine einzige der eigenen Tabellen — und ohne Fehlermeldung auf dem Bildschirm. Der Grund stand nur in firstrun-scaffold-error.log neben der Anwendung:

firstRun scaffold failed for db='MEINSCHEMA' dbms='oracle':
  ORA-01017: invalid credential or not authorized; logon denied

Unter Oracle ist die "Datendatenbank" das Schema, und das Framework baute die Verbindung mit dem gewählten Schema als Benutzer, behielt aber das im Assistenten eingegebene Kennwort, das dem Konfigurierenden gehört: eine Anmeldung, die niemand eingegeben hat und die es in aller Regel nicht gibt. Das Scaffolding, das dieselbe Verbindung weiterverwendete, konnte sich nicht anmelden; der Fehler landete in einem toleranten Block, und der Assistent meldete trotzdem Erfolg.

Die Verbindung behält jetzt den im Assistenten angegebenen Benutzer — so wie es unter PostgreSQL bereits ist, wo die Wahl der Datenbank die Identität nicht ändert — und das Arbeitsschema wird über ALTER SESSION SET CURRENT_SCHEMA auf der Sitzung gesetzt, Oracles eigenem Weg, in einem Schema zu arbeiten, ohne dessen Benutzer zu sein. Installationen, bei denen der Konfigurierende das Schema ist (darunter alle Tutorial-Installationen), verhalten sich unverändert.

Praktisch heißt das: vom Assistenten über das Scaffolding bis zum Login erscheinen die Tabellen im Menü und die Listen zeigen Daten.

🐧 Linux-Paket

  • Der RAG-Chat war auf allen vier Engines aus. Die .NET-Engine wird korrekt installiert, doch die Profile appsettings.linux.*.json enthielten keinen einzigen rag-*-Schlüssel: das Backend fiel auf einen Python-Server zurück, den das Linux-Paket nicht ausliefert, und jede Anfrage antwortete mit 503. Die Schlüssel stehen nun in allen vier Profilen.
  • Die Berichtsvorlagen wurden nicht ausgeliefert. Der Ordner Reports/ landete nie im Tarball, daher bot unter Linux keine Route den Eintrag "Report" an. Jetzt ist er enthalten.
  • Das Projekt unter Linux umbenennen. Das Quellpaket bot genau einen Weg, das Template zu eigen zu machen, und das war ein PowerShell-Skript: auf einem sauberen Ubuntu gibt es pwsh nicht, der Installer bringt es nicht mit und die Voraussetzungen verlangen es nicht. Neben rename-project.ps1 liegt jetzt rename-project.sh mit denselben Schritten — .csproj, Controller und VS-Code-Workspace umbenennen, Inhalte aktualisieren, den Namen in package.json angleichen — mit --name, --in-place und --backend-port. Standardmäßig klont es in einen neuen Ordner und lässt den ursprünglichen unangetastet.
  • Der Smoke-Test ließ gesunde Installationen durchfallen. Am Ende der Installation versuchte das Skript eine administrative Anmeldung auch dann, wenn die Anwendung im Erststart bleibt — unter Oracle seit 1.7.4 der Normalfall, weil Benutzer und Metadaten der Assistent anlegt. Die Installation endete mit "Install completed but smoke tests failed", obwohl alles in Ordnung war. Die Prüfung wird nun mit einem Hinweis übersprungen, der erklärt, wie man sie nachholt.

🔧 Empfohlene betriebliche Schritte

  1. Wer den Linux-Tarball der 1.7.4 in den ersten Stunden geladen hat: bitte erneut laden. Die zuerst veröffentlichte Kopie enthielt Assemblies unterschiedlicher Versionen und der Dienst startete nicht (Could not load file or assembly 'WuicOData'); die aktuelle Kopie ist korrekt, und diese Version ersetzt sie ohnehin.
  2. Unter Oracle repariert sich eine mit 1.7.4 abgeschlossene Installation, deren Menü ohne Tabellen blieb, nicht von selbst: den Erststart auf einer leeren Metadaten-Datenbank wiederholen.
  3. Es ist keine Konfigurationsänderung nötig: die Schlüssel in appsettings.json ändern sich nicht.

v1.7.4

Zurück zur Übersicht

Zuvor veröffentlichte Version: 1.7.3 (14. September 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Diese Version dreht sich fast vollständig um Oracle. Die Wiederholung von Installation und Erststart auf sauberen Maschinen — unter Windows mit IIS und unter Linux mit nginx — hat vier Stellen zutage gefördert, an denen der Weg abbrach, bevor eine funktionierende Anwendung erreicht war: das Laden der Tutorial-Daten, das Anlegen der Benutzer, der RAG-Chat und, unter Linux, die Erzeugung des Datenbankkennworts selbst. Keiner der vier Punkte tritt bei den anderen Engines auf.

Der Rest sind Korrekturen am Erststart, die für alle Engines gelten, sowie zwei an der Diagnose von SQL-Fehlern.


🗄️ Oracle: Tutorial-Daten und Erststart

Das Laden der Anfangsdaten unter Oracle gelang bei 472 von 18.141 Anweisungen. Die übrigen scheiterten mit ORA-01843: not a valid month, weil die Erststart-Skripte Datums- und Zahlenwerte in italienischer Konvention enthalten, während die Oracle-Sitzung die Servervorgaben verwendete. Die Skriptausführung setzt nun NLS_DATE_LANGUAGE und NLS_NUMERIC_CHARACTERS vor der ersten Anweisung: 17.889 von 17.889 Anweisungen, unter Windows wie unter Linux. Wer Oracle mit 1.7.3 ausprobiert und die Tutorial-Tabellen halb leer vorgefunden hat: das war der Grund.

Ebenfalls zu Oracle, drei Korrekturen an der Linux-Installation:

  • das für die Datenbank erzeugte Kennwort konnte das Zeichen @ enthalten, das die Easy-Connect-Zeichenkette von sqlplus zerstört: die Installation brach in etwa einem von drei Fällen mit ORA-12262 ab, und das verantwortliche Zeichen tauchte in keiner Meldung auf;
  • das Anlegen der Tutorial-Datenbanken und der Authentifizierungsbenutzer übernimmt jetzt der Erststart-Assistent, also der Weg, dem jede andere Plattform bereits folgte. Die Installationsskripte bereiteten stattdessen ein Schema vor, das der Assistent ohnehin neu erzeugt hätte;
  • appsettings.linux.oracle.json wird mit aktivem firstRun ausgeliefert, sodass das erste Browserfenster den Assistenten zeigt und nicht eine Anwendung ohne Metadaten.

💬 RAG-Chat unter Oracle

Der Chat antwortete auf die erste Frage mit 500 und ORA-00933: SQL command not properly ended. Die Abfragen des Chats enden mit einem Semikolon — in SQL*Plus und bei den anderen Engines korrekt, für den Oracle-Treiber jedoch Teil des Anweisungstexts. Das abschließende Semikolon wird nun vor der Ausführung entfernt, ausgenommen PL/SQL-Blöcke, bei denen END; legitim ist.

🚀 Erststart (alle Engines)

  • Der Assistent hält mit einer Meldung an, wenn die angegebene Datenbank nicht unter den vom Server gelesenen ist. Zuvor fuhr er fort: die Installation wurde abgeschlossen, das Menü öffnete sich, aber jedes Grid blieb leer, weil die Metadaten auf eine nicht vorhandene Datenbank zeigten. Die Meldung ist in alle 5 Sprachen übersetzt.
  • Unter Linux ist appsettings.json im Anwendungsordner ein symbolischer Link auf /etc/wuiccore/appsettings.json. Das atomare Schreiben der Konfiguration löst den Link jetzt auf, bevor geschrieben wird: andernfalls schrieb der Assistent eine neue Datei an die Stelle des Links, die Anwendung las weiterhin die alte, und der Erststart wurde nie abgeschlossen.
  • Die vom Installer geschriebenen Konfigurationsdateien bleiben vom Dienst beschreibbar (Modus 0660, Gruppe des Dienstes). Der Assistent scheiterte auf einer frisch angelegten Installation am abschließenden Speichern.

🔎 Diagnose von SQL-Fehlern

Das Fehler-Envelope, das der Dialog einem Administrator zeigt, behauptete zwei Dinge, die nicht stimmten:

  • sqlProvider meldete mssql für jeden Fehler, der nicht MySQL war — also auch für Oracle- und PostgreSQL-Ausnahmen. Der Wert leitet sich nun aus dem Ausnahmetyp ab, und nicht erkannte Provider melden unknown statt eines falschen Namens;
  • query blieb auf den Wegen leer, die ADO.NET direkt statt der Dapper-Schicht verwenden (darunter der RAG-Chat), selbst bei aktiver Diagnose. Die Erfassung des Befehls deckt jetzt beide Wege ab, mit derselben Maskierung sensibler Parameter.

🐛 Erwähnenswerte Bugfixes

  • LLM-Modellliste ohne API-Schlüssel: der Endpunkt kontaktierte den Provider auch ohne konfigurierten Schlüssel, und die Einstellungsseite wartete auf die Netzwerkantwort. Ohne Schlüssel wird nun sofort die lokal kuratierte Liste zurückgegeben.

🔧 Empfohlene betriebliche Schritte beim Aktualisieren

  1. Wer Oracle einsetzt, sollte vor einer erneuten Installation aktualisieren: die obigen Korrekturen betreffen den Erststart-Weg und wirken nicht rückwirkend auf eine bereits halb gefüllte Datenbank. Bei einer bereits beschädigten Installation empfiehlt sich ein Neuanfang mit leerer Datenbank.
  2. Unter Linux nach dem Update prüfen, ob appsettings.json im Anwendungsordner noch der Link auf /etc/wuiccore/appsettings.json ist und keine eigenständige Datei, die ein Erststart der 1.7.3 hinterlassen hat.
  3. Es ist keine Konfigurationsänderung nötig: die Schlüssel in appsettings.json ändern sich nicht.

v1.7.3

Zurück zur Übersicht

Vorherige veröffentlichte Version: 1.7.0 (14. August 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Die Neuerung ist die Installation unter Windows mit einem Befehl. Der Rest sind Korrekturen an Installation und Erststart, gefunden beim erneuten Durchlaufen der gesamten Prozedur auf sauberen Maschinen, unter Windows und Linux, mit SQL Server, MySQL und PostgreSQL. Zwei davon verhinderten, dass der Assistent überhaupt erreicht wurde: unter Linux mit MySQL brach das Laden der Datenbank bei der ersten Anweisung ab, und das automatische Scaffolding des Assistenten erzeugte die Metadaten nicht, sodass die Anwendung mit leerem Menü startete.


💾 Installation unter Windows mit einem Befehl

Aus einem PowerShell-Fenster:

irm https://wuic-framework.com/install.ps1 | iex

Das Skript erledigt selbst alles, was zuvor eine Liste manueller Schritte war: es prüft die ASP.NET Core 10 Runtime und installiert sie bei Bedarf, sucht eine erreichbare SQL-Server-Instanz und installiert, falls keine vorhanden ist, SQL Server 2022 Express, lädt das neueste veröffentlichte Paket herunter, entpackt es und öffnet den Browser auf dem Erststart-Assistenten. Es ist das Windows-Gegenstück zu install.sh und läuft mit Windows PowerShell 5.1, eine Installation von PowerShell 7 ist also nicht nötig.

Die Anwendung wird in IIS veröffentlicht: das Skript aktiviert fehlende IIS-Features, installiert das ASP.NET Core Hosting Bundle, erstellt Anwendungspool und Website auf dem gewählten Port und erteilt der Pool-Identität die Rechte auf den Ordner sowie ein Login auf SQL Server. Eine Rechteerhöhung ist erforderlich: das Skript fordert sie einmalig über die übliche Windows-Abfrage an.

Mit -Kestrel wird an IIS nichts angefasst und die Anwendung läuft in einem Konsolenfenster, neu startbar mit start-wuic.cmd. Das ist die richtige Wahl ohne Administratorrechte, wenn IIS durch Unternehmensrichtlinien deaktiviert ist, oder für einen Wegwerf-Test.

Die gebräuchlichsten Optionen: -WithTutorial lädt das Paket mit der Demo-Datenbank WideWorldImporters, -Port ändert den Port, -ListenAll lauscht auf allen Schnittstellen statt nur auf localhost, -SqlServer verweist auf eine bestehende Instanz, -Dbms mysql|postgres installiert und konfiguriert eine andere Engine als SQL Server.

Eine Voraussetzung, die vor der Paketwahl bekannt sein sollte: die Tutorial-Variante im Format .bak enthält ein natives SQL-Server-2022-Backup und erfordert daher SQL Server 2022 oder neuer, da die Wiederherstellung nicht abwärtskompatibel ist. Unter SQL Server 2019 ist die Variante mit den SQL-Skripten zu verwenden, die ab 2019 unterstützt wird; der Installer erkennt das selbst und wählt die passende Variante für die gefundene Instanz.

Gegenüber der ersten Fassung des Skripts wurden drei Dinge korrigiert, auf die man sofort stieß:

  • mit -Dbms mysql oder -Dbms postgres schrieb der Installer seine eigenen Geheimnisse in den Installationsordner und lehnte genau diesen Ordner dann als „nicht leer" ab und beendete sich mit Code 2, zwölf Sekunden nachdem er ihn selbst gefüllt hatte; das Entpacken löschte zudem das gerade erzeugte Root-Passwort. Die eigenen Dateien des Installers zählen nun nicht mehr in der Prüfung, und die Geheimnisse überstehen das Entpacken;
  • der Befehl erneut auf einer Maschine auszuführen, auf der die Installation bereits vorhanden war, endet nicht mehr in einer Sackgasse;
  • mit -Dbms postgres benötigt das Tutorial die Erweiterung PostGIS, die unter Windows nicht zusammen mit PostgreSQL installiert wird: das Laden brach auf halber Strecke mit extension "postgis" is not available ab — ein Fehler, der wie ein Defekt der SQL-Skripte aussah. Der Installer prüft nun die verfügbaren Erweiterungen und installiert bei Bedarf das Bundle für die gefundene PostgreSQL-Version.

Der Installer sagt jetzt auch während der langen Phasen, was er tut: die Installation von SQL Server Express und npm install können minutenlang keine Zeile ausgeben, und bisher wirkte das Fenster eingefroren. Nach je zehn Sekunden Stille erscheint, seit wann gearbeitet wird und was die letzte aussagekräftige Zeile war.

🐧 Installation unter Linux

Drei Korrekturen, alle auf dem Weg zum Erststart.

Das Framework startete auf obfuskierten Paketen nicht. Der beim Release angewendete Anti-Tamper-Schutz verhinderte den Start unter Linux. Er wurde entfernt: die Obfuskierung der Symbole bleibt, der Schutz, der die Ausführung blockierte, nicht.

Das Laden der MySQL-Datenbank brach bei der ersten Anweisung ab. Das Bootstrap-Skript setzte eine bereits ausgewählte Datenbank voraus, während die Dumps die USE-Direktive nicht mehr enthalten, und das Laden endete mit ERROR 1046 (3D000): No database selected. Wer mit MySQL aus dem vorherigen Paket installiert hat, trifft weiterhin auf diesen Fehler: das ist der Hauptgrund, dieses Release zu installieren.

Das Konfigurationsprofil wurde nicht in das Projekt kopiert. Die im Quellpaket mitgelieferte appsettings.json verweist auf eine benannte SQL-Server-Instanz, die es unter Linux nicht gibt: folgte man der Dokumentation, starb dotnet run nach fünfundvierzig Sekunden mit error: 26 - Error Locating Server/Instance Specified, und der Assistent erschien nie. Die engine-abhängigen Schlüssel werden nun automatisch in das Projekt kopiert.

Die tatsächlich unterstützten Ubuntu-Versionen sind jetzt dokumentiert: 22.04 und 24.04 LTS. Unter 24.04 benötigt SQL Server einen Kompatibilitätsstart; 26.04 wird von Microsoft für SQL Server nicht unterstützt.

🌍 Erststart-Assistent in fünf Sprachen

Der Erststart-Assistent sprach unabhängig vom Browser nur Italienisch. Er erscheint nun in der Browsersprache unter den fünf unterstützten (Italienisch, Englisch, Französisch, Spanisch, Deutsch), und bei Wahl der Sprache des Administrators wechselt die gesamte Seite sofort dorthin. Für eine nicht unterstützte Sprache ist Englisch der Rückfall.

Auch die Meldungen, die der Assistent während der Konfiguration erzeugt, sind übersetzt: Ergebnis des Verbindungstests, Validierungsfehler der Verbindungszeichenfolge und Bestätigung der Neuanlage der Metadaten-Datenbank.

🐛 Erwähnenswerte Fehlerbehebungen

  • Das automatische Scaffolding des Assistenten erzeugte die Metadaten nicht. Beim Erststart startete die Anwendung mit aktiviertem Kontrollkästchen „Automatisches Scaffolding der Tabellen der gewählten DB" mit leerem Menü und ohne Routen: das Scaffolding lief gegen eine andere Verbindung als die soeben im Assistenten gewählte. Die im Assistenten gewählten Verbindungen werden nun tatsächlich verwendet, und beim ersten Anmelden enthält das Menü die Tabellen des eigenen Schemas.
  • Änderung oder Löschung ohne Schlüssel: jetzt abgelehnt. Enthielt die Nutzlast einer Aktualisierung oder Löschung keine von den Metadaten erkannte Spalte, blieb die erzeugte WHERE-Klausel leer und die Anweisung traf alle Zeilen der Tabelle — und meldete obendrein Erfolg. Das passiert, wenn ein Primärschlüssel mit anderer Groß- und Kleinschreibung als im Schema gesendet wird. Die Operation wird nun mit HTTP 400 und dem Code errors.metaservice.crud.missing_key_predicate abgelehnt, und die Meldung listet die empfangenen Schlüssel auf, damit die Ursache sofort erkennbar ist.
  • Ohne Google-Maps-Schlüssel blieb die Anwendung blockiert. Ein fehlender Schlüssel in GoogleMaps:ApiKey erzeugte einen JavaScript-Fehler, der bis zum Fehlerdialog der Anwendung durchschlug und die gesamte Oberfläche unbrauchbar machte, nicht nur die Karte. Die Kartenkomponente zeigt nun einen unaufdringlichen Hinweis in ihrer eigenen Ansicht, und der Rest der Anwendung funktioniert weiter.
  • Scene 3D im Professional-Plan. Die Routen von Viewer und Designer für Scene 3D deklarieren das Feature scene3d-designer als erforderlich, doch kein Plan enthielt es: auf jeder Professional-Installation leitete die Prüfung auf die Seite „Zugriff verweigert" um. Das Feature ist nun Teil des Professional-Plans.
  • Erststart-Skripte um zwei Größenordnungen kleiner. Die Erststart-Skripte enthielten die Daten der Log-Tabellen, der Chatbot-Konversationen und der Dashboard-Inhalte: Fehlerprotokolle und Entwicklungs-Chats, die in jedem Paket mitgeliefert wurden. Diese Tabellen reisen nun nur noch mit ihrer Struktur. Das Metadaten-Skript des Erststarts geht von 468 MB auf 3,7 MB im minimalen Profil und auf 14 MB im Tutorial-Profil (die Demodaten WideWorldImporters bleiben separat und unveraendert gross).
  • Chatbot-Dokumentation an die reale Engine angeglichen. Die Installationsseiten nannten noch Python und einen separaten Dienst für den RAG-Chatbot. Die Engine ist natives .NET/ONNX und läuft seit 1.3.0 im Anwendungsprozess: kein Python, nichts separat zu installieren. Auch die Größe der beim ersten Gebrauch heruntergeladenen Modelle wurde korrigiert — etwa 4,5 GB.
  • Vier leere Dokumentationsseiten (RAG-Chatbot, Lizenzen, Verteilerlisten, Pivot-Tabellen) wurden geschrieben, in allen fünf Sprachen.

🔧 Empfohlene operative Schritte beim Aktualisieren

  1. Wer mit MySQL unter Linux aus dem vorherigen Paket installiert hat, muss mit dieser Version neu installieren: das Laden der Datenbank wurde unterbrochen und die Installation war unvollständig.
  2. Integrationen prüfen, die über die CRUD-APIs schreiben: ein Aufruf, der bisher unbemerkt die ganze Tabelle aktualisierte, erhält nun HTTP 400. Die Fehlermeldung listet die empfangenen Schlüssel auf; die Korrektur besteht fast immer darin, den Namen des Primärschlüssels an die Groß- und Kleinschreibung des Schemas anzugleichen.
  3. Wer Scene 3D mit einer vor dieser Version ausgestellten Professional-Lizenz nutzt, sollte eine aktualisierte Lizenz anfordern: das Feature scene3d-designer muss im Plan enthalten sein.
  4. Für eine Neuinstallation unter Windows den Ein-Schritt-Befehl statt der manuellen Prozedur verwenden. Auf einer SQL-Server-2019-Instanz die Tutorial-Variante mit den SQL-Skripten wählen.
  5. Bei Verwendung der Kartenkomponente GoogleMaps:ApiKey in appsettings.json konfigurieren: ohne Schlüssel zeigt die Karte einen Hinweis, der Rest der Anwendung bleibt jedoch nutzbar.

v1.7.1

Zurück zur Übersicht

Zuvor veröffentlichte Version: 1.7.0 (15. August 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Ein Konsolidierungs-Release mit einer neuen Front — der Installation unter Windows mit einem Befehl — und einer Reihe von Korrekturen, die beim Installieren des Produkts von Grund auf auf sauberen Maschinen entstanden sind, streng nach Dokumentation. Mehrere davon betreffen Linux, wo einiges überhaupt nicht funktionierte: der Chatbot fehlte im Paket, Berichte ließen sich nicht öffnen, und wer von den Quellen ausging, konnte die Anwendung nicht starten.


💾 Installation unter Windows mit einem Befehl

Aus einem PowerShell-Fenster:

irm https://wuic-framework.com/install.ps1 | iex

Das Skript erledigt selbst alles, was zuvor eine Liste manueller Schritte war: Es prüft die ASP.NET Core 10 Runtime und installiert sie bei Bedarf, sucht eine erreichbare SQL Server-Instanz und installiert, falls keine gefunden wird, SQL Server Express, lädt das zuletzt veröffentlichte Paket herunter, entpackt es und öffnet den Browser im Erstkonfigurations-Assistenten. Es ist das Windows-Gegenstück zu install.sh und mit Windows PowerShell 5.1 kompatibel, erfordert also keine Installation von PowerShell 7.

Die Anwendung wird in IIS veröffentlicht: Das Skript aktiviert fehlende IIS-Features, installiert das ASP.NET Core Hosting Bundle, legt Anwendungspool und Website auf dem gewählten Port an und erteilt der Pool-Identität die Ordnerberechtigungen sowie den SQL Server-Login. Eine Rechteerhöhung ist nötig: Das Skript fordert sie einmalig über die normale Windows-Abfrage an.

Mit -Kestrel wird an IIS nichts angerührt und die Anwendung läuft in einem Konsolenfenster, neu startbar mit start-wuic.cmd. Das ist die richtige Wahl ohne Administratorrechte, wenn IIS durch Unternehmensrichtlinien deaktiviert ist, oder für einen Wegwerf-Test.

Die gebräuchlichsten Optionen: -WithTutorial lädt das Paket mit der Demodatenbank WideWorldImporters, -Port ändert den Port, -ListenAll lauscht auf allen Schnittstellen statt nur auf localhost, -SqlServer verweist auf eine bestehende Instanz, -Dbms wählt eine andere Engine als SQL Server.

Eine Voraussetzung, die man vor der Paketwahl kennen sollte: Die Tutorial-Variante im .bak-Format enthält eine native SQL Server 2022-Sicherung und erfordert daher SQL Server 2022 oder höher, da die Wiederherstellung nicht abwärtskompatibel ist. Unter SQL Server 2019 ist die Variante mit SQL-Skripten zu verwenden, die ab 2019 unterstützt wird; der Installer erkennt das selbst und wählt die passende Variante für die gefundene Instanz.

Unter Windows Server muss die Datenbank-Engine vorher installiert werden. Der Befehl beschafft fehlende Komponenten über winget, das unter Windows Server nicht vorhanden ist: Ohne bereits erreichbare Instanz bricht die Installation ab und sagt es. Das gilt für alle Engines, nicht nur für SQL Server.

🐧 Linux: das Paket ist endlich vollständig

Wer unter Linux installierte, fand drei defekte Dinge vor, die in dieser Version alle behoben sind.

Der RAG-Chatbot fehlte. Die semantische Suchmaschine auf .NET/ONNX war nur in den Windows-Paketen enthalten: Jeder Linux-Tarball wurde ohne sie ausgeliefert, und GET /api/Rag/Health antwortete dauerhaft mit 503 rag-server-unreachable. Der Tarball enthält sie nun samt vollständiger nativer linux-x64-Bibliotheken: Auf einer Maschine mit CUDA 12 und cuDNN 9 wird ohne Zutun die GPU genutzt, andernfalls fällt sie auf die CPU zurück.

Die semantische Engine fand ihre eigenen nativen Bibliotheken nicht. Sie suchte sie in PATH, getrennt durch ;, was die Windows-Konvention ist; unter Linux verwendet der Loader LD_LIBRARY_PATH und Doppelpunkte.

Berichte ließen sich nicht öffnen. Der Cache-Pfad wurde mit Windows-Backslashes und einem führenden Schrägstrich gebildet, landete unter Linux also im Wurzelverzeichnis des Dateisystems statt im Anwendungsordner. Der Viewer lieferte einen Fehler, der wie ein Konfigurationsproblem aussah.

Und für alle, die von den Quellen ausgehen: Die Anwendung startete überhaupt nicht. Das NuGet-Paket WuicCore enthielt einen Manipulationsschutz, dessen Initialisierungscode mit der .NET-Runtime unter Linux nicht kompatibel ist und der fehlschlug, bevor eine einzige Zeile der Anwendung ausgeführt wurde. Unter Windows startete genau dieselbe Bibliothek problemlos, weshalb der Fehler so lange unsichtbar blieb. Der Schutz wurde entfernt; die übrige Obfuskierung bleibt unverändert.

📦 Quellpaket: es baut auf einer sauberen Maschine

Das Entwicklerpaket trug einige Annahmen mit sich, die nur auf der Maschine galten, auf der es gebaut wurde.

  • Der Dependency-Lock wird mitgeliefert. Ohne ihn bricht npm install mit npm 10.9.x — der mit Node.js 22 LTS ausgelieferten Version, also derjenigen, die die Dokumentation selbst verlangt — beim Auflösen der Peer-Abhängigkeiten ab. Der Lock ist jetzt enthalten, die Installation ist reproduzierbar und zwei Entwickler erhalten denselben Baum.
  • Die 3D-Bibliotheken sind deklariert. three, three-gpu-pathtracer, three-mesh-bvh und @dimforge/rapier3d-compat wurden importiert, ohne unter den Abhängigkeiten aufzutauchen: Auf der Maschine der Framework-Entwicklung waren sie auf anderen Wegen vorhanden, auf einer sauberen Maschine brach der Build an einem nicht auflösbaren Import ab. Es sind optionale Peer-Abhängigkeiten: Wer keine 3D-Szenen nutzt, schleppt sie nicht mit.
  • Die Angular-Asset-Pfade zeigten aus dem Paket hinaus, und der Build scheiterte an nicht vorhandenen Dateien.
  • Der LLM-fähige Workspace wurde ohne eigene Einstellungen erzeugt.

🌍 Erstkonfigurations-Assistent

Der Assistent sprach unabhängig vom Browser nur Italienisch. Er erscheint nun in der Browsersprache unter den fünf unterstützten (Italienisch, Englisch, Französisch, Spanisch, Deutsch), und mit der Wahl der Sprache des Administratorbenutzers wechselt die gesamte Seite sofort dorthin. Bei nicht unterstützter Sprache ist Englisch der Rückfall. Übersetzt sind auch die Meldungen während der Konfiguration: Ergebnis des Verbindungstests, Validierungsfehler der Verbindungszeichenfolge und Bestätigung der Neuerstellung der Metadaten-Datenbank.

Das Scaffolding einer bestehenden Datenbank ist jetzt standardmäßig aktiv. Wer auf die eigene Datenbank verwies und die vorgeschlagenen Werte übernahm, erhielt eine Anwendung ganz ohne Routen, mit ignorierten Tabellen. Der Tutorial-Modus ist nicht betroffen.

🐛 Bemerkenswerte Fehlerbehebungen

  • Ändern oder Löschen ohne Schlüssel: jetzt abgelehnt. Enthielt die Payload einer Aktualisierung oder Löschung keine von den Metadaten erkannte Spalte, war die erzeugte WHERE-Klausel leer und die Anweisung traf alle Zeilen der Tabelle — und meldete obendrein Erfolg. Das ist der Fall eines Primärschlüssels, der mit anderer Groß- und Kleinschreibung als im Schema gesendet wird. Die Operation wird nun mit HTTP 400 und dem Code errors.metaservice.crud.missing_key_predicate abgelehnt, und die Meldung listet die empfangenen Schlüssel auf, damit die Ursache sofort erkennbar ist.
  • Karten ohne Google-Schlüssel: Hinweis statt Blockade. Wenn die Maps JavaScript API nicht geladen ist — typischerweise weil der Schlüssel nicht konfiguriert wurde — zeigte die Komponente einen modalen Dialog, der die ganze Seite anhielt. Anstelle der Karte erscheint nun ein Feld, das erklärt, was fehlt, und der Rest der Seite bleibt nutzbar.
  • Neuinstallation auf MySQL: keine Sackgasse mehr. Das Engine-Passwort erzeugt der Installer selbst; bei erneuter Ausführung auf derselben Maschine konnte er es nicht zurücklesen, prüfte mit leerem Passwort und schloss daraus, die Datenbank antworte nicht, während sie bestens antwortete. Ebenfalls korrigiert wurde die Prüfung der Mindestversion, die nie ausgeführt wurde, weil die MySQL-Warnung über das Passwort in der Befehlszeile in der ausgewerteten Ausgabe landete.
  • Scene 3D im Professional-Plan. Die Routen von Scene 3D-Viewer und -Designer deklarieren die Funktion scene3d-designer als erforderlich, aber kein Plan enthielt sie: Auf jeder Professional-Installation leitete die Prüfung auf die Seite "Zugriff verweigert" um. Die Funktion ist nun Teil des Professional-Plans.
  • Die Beispiel-appsettings enthalten kein echtes Passwort mehr.
  • Chatbot-Dokumentation an die tatsächliche Engine angeglichen. Die Installationsseiten nannten noch Python und einen separaten Dienst für den RAG-Chatbot. Die Engine ist nativ .NET/ONNX und läuft seit 1.3.0 im Prozess der Anwendung: kein Python, nichts separat zu installieren. Korrigiert wurde auch die Größe der beim ersten Start geladenen Modelle, die bei rund 4,5 GB liegt.
  • Vier leere Dokumentationsseiten (RAG-Chatbot, Lizenzen, Verteilerlisten, Pivot-Tabellen) wurden geschrieben, in allen fünf Sprachen.

📚 Korrigierte Voraussetzungen in der Dokumentation

Die Einstiegsseiten nannten Anforderungen, die nicht dem entsprachen, was bei Installationen auf sauberen Maschinen gemessen wurde:

  • Node.js 22 LTS, nicht "20 oder höher": Es ist die Version, mit der das Paket getestet wird.
  • PowerShell 5.1 genügt. Die enthaltenen Skripte laufen auf der unter Windows vorinstallierten PowerShell; PowerShell 7 ist empfohlen, nicht erforderlich.
  • Unter Windows Server muss die Datenbank vorher installiert werden, vor dem Installationsbefehl.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore (NuGet) 1.7.0 1.7.1
wuic-framework-lib (npm) 1.7.0 1.7.1

🔧 Empfohlene betriebliche Schritte beim Update

  1. Die Integrationen prüfen, die über die CRUD-APIs schreiben: Ein Aufruf, der bisher unbemerkt die ganze Tabelle aktualisierte, erhält nun HTTP 400. Die Fehlermeldung listet die empfangenen Schlüssel auf, und die Korrektur besteht fast immer darin, den Namen des Primärschlüssels an die Schreibweise des Schemas anzugleichen.
  2. Unter Linux das Paket durch das dieser Version ersetzen, auch wenn die Anwendung zu funktionieren scheint: RAG-Chatbot und Berichts-Viewer waren in früheren Versionen nicht betriebsbereit.
  3. Wer Scene 3D mit einer vor dieser Version ausgestellten Professional-Lizenz nutzt, sollte eine aktualisierte Lizenz anfordern: Die Funktion scene3d-designer muss im Plan enthalten sein.
  4. Wer vom Quellpaket ausgeht, kann npm install ohne zusätzliche Optionen ausführen: Der enthaltene Lock macht die Installation reproduzierbar.
  5. Für eine Neuinstallation unter Windows den Ein-Schritt-Befehl statt des manuellen Verfahrens verwenden. Auf einer SQL Server 2019-Instanz die Tutorial-Variante mit SQL-Skripten wählen; unter Windows Server zuerst die Datenbank-Engine installieren.

v1.7.0

Zurück zur Übersicht

Zuvor veröffentlichte Version: 1.5.0 (21. Juli 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Pakete am 15. August 2026 ersetzt. Die zunächst veröffentlichten Archive enthielten eine appsettings.json mit autoGeneratedQueryTimeout auf 1: Mit diesem Wert endet jede Abfrage, die länger als eine Sekunde dauert, mit einem Serverfehler. Ebenso waren einige Kopfzeilen-Einstellungen (Logo, Menüausrichtung, Themenauswahl, Benachrichtigungen) aus einer Testsitzung zurückgeblieben. Die Archive wurden neu erstellt und ihre Prüfsummen aktualisiert.

Wenn Sie vor dem 15. August heruntergeladen haben: Laden Sie das Paket erneut herunter, oder öffnen Sie appsettings.json und setzen Sie autoGeneratedQueryTimeout zurück auf 30; entfernen Sie dabei die Schlüssel header-logo, header-logo-position, header-menu-orientation, header-show-theme-selector, header-menu-multicolumn-submenu und header-show-notifications, sofern Sie sie nicht selbst gesetzt haben. Keine der beiden Einstellungen berührt Ihre Daten: Datei anpassen und neu starten genügt.


Drei Wochen Arbeit an zwei Fronten. Die erste ist das Erscheinungsbild: Der neue Theme Builder ist eine Seite, auf der sich eigene Designs zusammenstellen lassen — Farben, Typografie, Hintergrund, Dichte, Darstellung der Tabelle —, die für alle Benutzer der Installation gelten; die Kopfzeile der Anwendung wurde neu gestaltet und konfigurierbar gemacht. Die zweite ist Integration und Beobachtbarkeit: Der neue Webhook Hub empfängt und sendet Ereignisse mit Signatur und Wiederholungen, und der Performance Inspector misst Fetch- und Renderzeiten pro Route. Der Chatbot lernt, auf drei weiteren Oberflächen der Anwendung zu handeln und das Datenbankschema abzufragen.


🎨 Theme Builder

Eine neue Seite unter Administration erlaubt es, eigene Designs ohne Codeänderung zusammenzustellen. Jedes gespeicherte Design erscheint im Design-Auswahlfeld aller Benutzer der Installation, neben den mitgelieferten.

Was sich einstellen lässt:

  • Hauptfarbe, aus der die vollständige Skala mit 11 Abstufungen erzeugt wird: Die Skala bleibt anklickbar, und die Wahl eines dunkleren Farbtons macht diesen zur Hauptfarbe. Ein Etikett zeigt das erreichte WCAG-Kontrastverhältnis an (AAA / AA / AA-large / fail).
  • Helle und dunkle Oberflächen, Eckenradius und Dichte (komfortabel oder kompakt).
  • Typografie: Schriftfamilie aus einem Katalog von Systemschriften oder freier Stack, dazu eine Basisgröße, die die gesamte Oberfläche skaliert.
  • Seitenhintergrund: einfarbig, Verlauf oder Bild. Der Verlauf kann eine optionale langsame Bewegung haben, die seine Neigung mit der Zeit schwenkt; das Bild wird über Anpassung, Wiederholung, Position und einen dunklen Schleier konfiguriert, damit der Text lesbar bleibt.
  • Tabelle: Wechselnde Zeilen und die ausgewählte Zeile sind keine festen Farben mehr, sondern Mischungen aus Oberfläche und einem Akzent, gesteuert über zwei Intensitätsregler und wahlweise mit einem vom Hauptton abweichenden Akzent.
  • Hell-/Dunkelmodus frei wählbar oder vom Design vorgegeben.

Die Vorschau ist live und wendet das Design beim Zusammenstellen auf die ganze Seite an, ohne die Einstellungen des Benutzers zu verändern: Beim Verlassen, Neuladen oder Schließen des Browsers kehrt das eigene Design zurück.

Der Excel-Export folgt dem Design: Eine mit aktivem eigenem Design exportierte Datei erhält dessen Farben — Kopfzeile, wechselnde Zeilen, Rahmen — statt der allgemeinen Grautöne. Für jede Preset-Familie wurden Ersatzstile ergänzt, sodass auch ein noch nicht erfasstes Design das Aussehen seiner Familie erbt.

Der Katalog der mitgelieferten Designs erhält neue Varianten, und das aktive Design wird bereits im ersten Bild nach einem Neuladen angewandt, ohne dass das vorherige aufblitzt.

🖥️ Neu gestaltete, konfigurierbare Kopfzeile

Die Kopfzeile der Anwendung ist jetzt eine Komponente des Frameworks: Installationen erben sie, statt eine Kopie zu pflegen. Der Block rechts oben wurde verdichtet — Design-Auswahl, Hell/Dunkel, Sprache, Benachrichtigungen und Benutzerbereich liegen in einer Karte, die sich beim Überfahren mit der Maus ausklappt —, und der Benutzerbereich zeigt Name, Rolle, Lizenz und Abmeldung.

Ein neuer Abschnitt Header & Menu in den Einstellungen erlaubt die Wahl der Menüausrichtung (waagerecht oben oder unten, senkrecht links oder rechts), das Hochladen und Positionieren eines Logos sowie das Ein- und Ausschalten von Sprachauswahl, Design-Auswahl und Benachrichtigungen. Ebenso lässt sich die automatische mehrspaltige Anordnung der Untermenüeinträge abschalten: Lange Untermenüs werden dann scrollbar, statt abgeschnitten zu werden.

🔗 Webhook Hub

Ein neues System zur Anbindung der Anwendung an externe Dienste, in beide Richtungen.

Ausgehend: Ereignisse werden in eine Warteschlange gestellt und asynchron zugestellt, mit HMAC-Signatur des Payloads, Wiederholungen in festem oder exponentiellem Abstand, einer Dead-Letter-Warteschlange für endgültig fehlgeschlagene Zustellungen und der Möglichkeit, eine Zustellung erneut abzuspielen. Jeder Versuch wird in den Logs festgehalten.

Eingehend: Der Endpoint POST /api/webhooks/inbound nimmt externe Aufrufe entgegen und leitet sie anhand einer Metadatenkonfiguration weiter — SQL-Ausführung, HTTP-Aufruf oder Methodenaufruf — mit Anti-Replay-Schutz.

Enthalten sind außerdem Benachrichtigungsregeln mit konfigurierbarer Ruhezeit, eine administrative API zur Verwaltung der Endpoints und ein Scheduler-Job, der die Warteschlange abarbeitet. Die gesamte Konfiguration — Endpoints, Ereignisse, Abonnements, Eingangsregeln — liegt in Metadatentabellen: Eine neue Integration erfordert weder eigenen Code noch ein neues Deployment. Die Seite „Webhook Hub" der In-App-Dokumentation beschreibt das Vorgehen vollständig in 5 Sprachen.

📈 Performance Inspector

Das Framework kann Fetch- und Render-Metriken für jede Route erfassen, aggregieren und in einem administrativen Dashboard anzeigen: Mittelwert, p95, Maximum und Anzahl, mit einer Aufbewahrung von 7 Tagen und routenweiser Erfassung.

Die Funktion ist standardmäßig ausgeschaltet und wird über AppSettings:enablePerformanceInspector im Hot-Reload aktiviert. Neben den Metriken steht ein Inspektor für die Datenqualität bereit, der pro Route über den Props Bag aktiviert wird (extraProps.qualityInspector).

🤖 Chatbot: neue Aktionen und Lesen des Schemas

Der RAG-Chatbot erhält zehn neue Aktionstypen und die Fähigkeit, die Struktur des Projekts abzufragen.

  • Drei neue kontextbezogene Oberflächen: Pivot Builder, Einstellungs-Editor und Report Designer. Der Chatbot schlägt Aktionen auf der Seite vor, auf der man sich befindet. Im Einstellungs-Editor werden Änderungen nur vorbereitet: Das Speichern bleibt eine ausdrückliche Handlung des Benutzers. Im an das Modell gesendeten Dump sind schützenswerte Werte — Verbindungszeichenfolgen, Passwörter, Schlüssel, Lizenz — maskiert, und eine Ausschlussliste verhindert deren Überschreiben. Im Report Designer wird stets eine neue Datei mit Zeitstempel erzeugt, ohne den geöffneten Bericht anzutasten.
  • Metadaten-Operationen: Anlegen einer Tabelle, Scaffolding von Tabellen, Sichten und Spalten, Verschieben von Menüeinträgen. Die beiden nicht umkehrbaren Operationen — Löschen einer Spalte und Löschen eines Menüeintrags — verlangen eine ausdrückliche Bestätigung, die auch serverseitig geprüft wird und damit selbst dann greift, wenn die Anfrage von einem Client ohne Oberfläche kommt.
  • Introspektion: Der Chatbot kann Verbindungen (nur die Namen, nie die Verbindungszeichenfolgen), Datenbanken, Tabellen, Spalten und den Menübaum auflisten. Ohne diese Lesezugriffe konnte er die tatsächlichen Bezeichner nicht kennen, auf denen er arbeiten soll.

Eine neue Dokumentationsseite listet die unterstützten Prompts auf, abgeglichen mit den automatisierten Tests.

📊 Spreadsheet: Spaltensichtbarkeit an die Tabelle angeglichen

Das Spreadsheet berücksichtigt jetzt dieselben Sichtbarkeitsflags wie die List Grid: mc_hide_in_list, mc_hide_in_edit und mc_show_in_filters. Eine in der Liste ausgeblendete Spalte erscheint nicht mehr im Blatt, und eine beim Bearbeiten ausgeblendete Spalte ist in den Zellen nicht mehr änderbar.

🛡️ Sicherheit

Best-effort Hardening beim Erzeugen von Berichten: Der angeforderte Dateiname wird nun validiert, indem absolute Pfade und unzulässige Zeichen abgelehnt werden — mit einer Prüfung, die sich unter Windows und unter Linux gleich verhält. Zuvor stützte sie sich auf eine Normalisierung, die auf beiden Systemen unterschiedlich filterte. Der zurückgegebene Fehler unterscheidet eine ungültige Konfiguration von einem Fehlschlag der Erzeugung, sodass Integratoren das Problem nicht an der falschen Stelle suchen.

🐛 Bemerkenswerte Fehlerbehebungen

  • Kalender, erstes Laden: Die Ansicht zeigte Daten, die nicht auf den dargestellten Zeitraum gefiltert waren — typischerweise keine Termine im aktuellen Monat, obwohl welche vorhanden waren. Das erste Laden lief, bevor die für den Archetyp konfigurierten Start- und Endfelder verfügbar waren, und keine spätere Anfrage korrigierte das. Die Felder werden jetzt aufgelöst, bevor der Filter zusammengesetzt wird; treffen sie später ein, werden die Daten genau einmal erneut angefordert.
  • 3D-Szenen mit professional-Lizenz: Die Seiten von Designer und 3D-Viewer leiteten auf die Seite «Zugriff verweigert» um, weil die Funktion in keinem Lizenzprofil enthalten war. Sie gehört nun zum Profil professional.
  • Berichte unter Linux: Das Erzeugen eines Berichts schlug fehl, weil Schriften über eine nur unter Windows verfügbare Grafikbibliothek behandelt wurden.
  • Performance Inspector, Aggregation: Zwei überlappende Läufe des Aggregations-Jobs — das Dashboard stößt ihn beim eigenen Neuladen an, er lässt sich zusätzlich manuell starten — endeten mit einem Fehler wegen doppelten Schlüssels. Zudem war das Fenster der Rohdaten nicht an der Grenze des Tages-Buckets ausgerichtet, sodass der älteste Bucket aus einer Teilmenge der Ereignisse neu aufgebaut wurde.
  • Linux hinter einem Reverse Proxy: Vom Backend erzeugte absolute URLs verloren den Port und verwendeten das falsche Schema, wenn die Installation auf einem nicht standardmäßigen Port oder nur über HTTP ausgeliefert wird.
  • Oracle, Speichern von 3D-Szenen: Das Speichern schlug wegen eines reservierten Parameternamens und der Umwandlung numerischer Werte fehl. Beides behoben, zusammen mit der Behandlung von in Anführungszeichen gesetzten kleingeschriebenen Spaltennamen.
  • Oracle, OData-Bereitstellung: Spalten wurden in Großbuchstaben erzwungen, statt den in den Metadaten deklarierten physischen Namen zu verwenden, wodurch Entitäten mit gemischter Schreibweise unerreichbar waren.
  • PostgreSQL und Oracle, Lookups in Diagrammen und Gruppierungen: Das beschreibende Feld eines Lookups wurde nicht vom logischen auf den physischen Namen aufgelöst, und die Gruppierung zeigte leere oder falsche Werte.
  • Chatbot, fehlende Bestätigungen: An vier Stellen erschien die Rückfrage wegen eines fehlerhaften Aufrufs nie; an zweien davon erfolgte das Löschen (Chatverlauf und Sitzungen), ohne irgendetwas zu fragen. Jede Bestätigung läuft nun über denselben Pfad, und im Fehlerfall lautet die Antwort „abbrechen".
  • Metadaten-Import: Routen, deren Datenbankfeld leer ist — also jene, die die Standarddatenbank der Anwendung verwenden —, konnten nicht importiert werden, und die Fehlermeldung ließ ein Rechteproblem oder die falsche Datenbank vermuten.
  • 3D-Viewer: Die Szene nahm einen waagerechten Streifen ein statt der vollen Seitenhöhe.
  • Oberfläche, Tabelle vor gestaltetem Hintergrund: Der Bereich unter der letzten Zeile ließ den Seitenhintergrund durchscheinen, sodass die Tabelle löchrig wirkte. Die Oberfläche der Tabelle folgt nun dem Design, hell wie dunkel.

🔧 Empfohlene Schritte beim Aktualisieren

  1. appsettings.json prüfen nach der Aktualisierung: Die neuen Schlüssel haben zurückhaltende Standardwerte und erfordern kein Eingreifen, aber es ist ein guter Zeitpunkt, sie durchzugehen.
  2. Performance Inspector: AppSettings:enablePerformanceInspector auf true setzen, um ihn zu aktivieren; ohne den Schlüssel bleibt er aus.
  3. Webhook Hub: Es ist kein Eingriff nötig, um ihn erreichbar zu machen. Tabellen, administrative Routen und Menüeinträge — gebündelt in einem Untermenü „Webhook Hub" unter Administration — werden beim ersten Laden des Menüs angelegt, sowohl bei einer Neuinstallation als auch beim Aktualisieren einer früheren Version. Zu konfigurieren bleibt die Integration: ausgehend drei Zeilen (der Endpoint mit Ziel-URL, gemeinsamem Geheimnis, Timeout und Wiederholungsregel; das Ereignis; das verbindende Abonnement), eingehend ein Endpoint mit Richtung inbound und eine Weiterleitungsregel. Die Signatur reist im Header X-Wuic-Signature; das vollständige Vorgehen steht auf der Seite „Webhook Hub" der In-App-Dokumentation.
  4. Theme Builder: Die Designtabelle wird beim ersten Speichern angelegt. Bei Verwendung eigener Designs den Excel-Export einer Tabelle prüfen, um die erwarteten Farben zu bestätigen.
  5. Chatbot: Die neuen Aktionen stehen nach einem Neustart der RAG-Engine zur Verfügung; nicht umkehrbare Operationen verlangen eine Bestätigung und lassen sich ohne diese nicht anwenden.
  6. Linux hinter einem Reverse Proxy: Antwortet die Installation auf einem nicht standardmäßigen Port oder nur über HTTP, die nginx-Konfiguration neu erzeugen oder den bestehenden vhost von Hand auf proxy_set_header Host $http_host; und proxy_set_header X-Forwarded-Proto $scheme; angleichen. Aktualisierungen überschreiben einen vorhandenen vhost nicht.

v1.5.0

Zurück zur Übersicht

Zuletzt veröffentlichte Version: 1.3.2 (18. Juni 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Ein umfangreiches Release, das Arbeiten an mehreren Fronten bündelt. Der RAG-Chatbot erhält eine vereinfachte, vereinheitlichte LLM-Konfiguration; der Betrieb eines kostenlosen lokalen Modells (Qwen via Ollama) ist nun eine erstklassige Option, und die Engine wurde gegen die Eigenheiten lokaler Modelle gehärtet. Ein neues Visual Studio Code-Plugin, WUIC Assistant, bringt denselben agentischen Ansatz in den Editor. Der neue Scene3D Designer bringt das Authoring von 3D-Szenen in die App — PBR-Materialien, Shader-Effekte, Lichter mit Baking, Physik und einen Viewer, der Objekte an Daten bindet — und das Rendering ist nun zwischen WebGL und WebGPU wählbar. Der Workflow Designer erhält ein Paket für unterstütztes Authoring (Startvorlagen, Graph-Validierung, geführte Dialoge, Inline-Hilfe), und der Dashboard-Designer eine Reihe von Editing-Verbesserungen.


🤖 RAG-Chatbot — vereinheitlichte LLM-Konfiguration

Die LLM-Provider-Konfiguration des Chatbots wurde auf einen einzigen Schlüssel und eine explizite Provider-Liste konsolidiert.

  • rag-llm-provider — anthropic / openai / openrouter / ollama, explizit zu setzen (kein Standard-Provider: wenn leer, bleibt der Chatbot im Retrieval-only-Modus und ruft kein LLM auf). ollama ist nun ein erstklassiger Wert: zeigt via rag-llm-base-url auf eine lokale Runtime im OpenAI-kompatiblen Format.
  • rag-llm-api-key — die einzige Quelle des Schlüssels, unabhängig vom gewählten Provider. Ersetzt das bisherige Paar llm-api-key / anthropic-api-key (nur noch als Migrations-Fallback akzeptiert). Der Spezialwert agent-sdk nutzt das Agent SDK (claude CLI) via Subscription statt der kostenpflichtigen API, falls installiert.
  • rag-llm-base-url — endpoint-Override; erforderlich für ollama (z. B. http://HOST:11434/v1), optional für die anderen Provider.
  • rag-llm-default-chat-model — Modell-ID für den gewählten Provider.

Alle Schlüssel werden weiterhin hot-reload aus appsettings.json gelesen: ein Wechsel von Provider oder Modell erfordert keinen Neustart.

🧠 Kostenloses lokales LLM (Qwen via Ollama), ohne API-Key

Der Chatbot kann nun vollständig auf einem kostenlosen offenen lokalen Modell laufen — z. B. Qwen (qwen2.5-coder:32b), bereitgestellt von Ollama auf der eigenen Maschine oder im LAN — ohne API-Key und ohne Kosten pro Token. Typische Konfiguration in appsettings.json -> AppSettings:

rag-llm-provider           = ollama
rag-llm-base-url           = http://HOST:11434/v1
rag-llm-api-key            = ollama
rag-llm-default-chat-model = qwen2.5-coder:32b

Eine vollständige Anleitung zum Aufsetzen des Ollama-Servers (Windows/Linux, LAN-Freigabe, Context-Tuning, persistenter Start) liegt dem Paket bei.

⚙️ Zuverlässige Chatbot-Aktionen auch mit lokalen Modellen

Die Engine wurde gegenüber den Eigenheiten lokaler Modelle tolerant gemacht, die — anders als kommerzielle Modelle — das tool-call-Format manchmal nicht strikt einhalten. Der Chatbot stellt die vorgeschlagene Aktion nun korrekt wieder her, selbst wenn das Modell sie als Text oder mit nicht standardkonformen JSON-Escapes ausgibt. In der Praxis werden die Aktionen auf dem Designer und auf Metadaten — Tabellen-Buttons (Bulk), Zeilen-Buttons, bedingte Stile, Callbacks, Komponenten-Injektion im Designer — auch mit einem lokalen LLM zuverlässig vorgeschlagen und angewendet.

🧩 Agentischer Assistent in VS Code — WUIC Assistant

Das Paket enthält nun ein Plugin für Visual Studio Code, WUIC Assistant (llm-workspace/plugin/wuic-assistant.vsix): ein Assistent, der die Framework-Konventionen bereits kennt und direkt am geöffneten Projekt arbeitet. Er erzeugt Angular-Komponenten (Cards, Dashboards mit KPI-Kacheln, List-Grids mit Navigation zum Bearbeitungsformular), Komponenten, die von einem eigenen .NET-endpoint gespeist werden, und schlägt Metadaten-Änderungen vor (bedingte Stile, Tabellen- und Zeilenaktionen, Lookups). Jeder Schreibvorgang durchläuft eine Vorschau vor der Bestätigung.

Er nutzt dasselbe lokale WUIC-RAG über den MCP-Server wuic-rag (automatisch gestartet) und das im Projekt bereits vorhandene Grounding, sodass keine manuelle MCP-Server-Konfiguration nötig ist. Das LLM-Modell ist frei wählbar — lokal via Ollama (Qwen, ohne API-Key) oder Anthropic.

Installation aus dem ZIP:

code --install-extension llm-workspace/plugin/wuic-assistant.vsix

Alternativ installiert es install-llm-workspace.ps1. Danach Ctrl+Shift+P -> WUIC Assistant: Apri Chat; den Provider in den Einstellungen wählen (wuicAssistant.provider = ollama oder anthropic).

🧊 Scene3D Designer (neu)

Ein neuer visueller 3D-Designer auf Route #/scene3d_designer, schreibgeschützt veröffentlicht über den Scene3D Viewer (#/scene3d_viewer/:scene_key). Er erlaubt es, eine dreidimensionale Szene zu komponieren und ihre Objekte an App-Daten zu binden.

  • Palette und Import: Primitive (Würfel, Kugel, Ebene, Zylinder, Kegel, Torus), Gruppen, Lichter, Kamera, 3D-Text und Mesh Repeater (aus Daten erzeugte Instanzen). Import externer Modelle als glTF/GLB, OBJ, FBX, STL und DAE. Die Palette ist über Metadaten um benutzerdefinierte Typen erweiterbar.
  • PBR-Materialien: Metalness, Roughness, Emissiv, Deckkraft, Wireframe, Flat Shading und Flächenseiten; beim physikalischen Material zusätzlich Transmission, IOR, Dicke und volumetrische Absorption (farbiges Glas).
  • Shader-Effekte: Ein in JSON beschriebener Effekt (schemagestützt, mit Vervollständigung und einer "Struktur"-Ansicht) wird für den aktiven Renderer kompiliert; alternativ handgeschriebene GLSL-Shader auf dem WebGL-Renderer.
  • Beleuchtung: Szenenlichter mit weichen Schatten, baking der statischen Beleuchtung in Vertex-Farben (unlit) und — auf dem WebGL-Renderer — ein fotorealistischer Vorschau-path tracing.
  • Animation und Physik: Transport-Steuerung für Clips importierter Assets; optionale Physik pro Objekt mit Play/Stop-Simulation im Designer und Autoplay im Viewer.
  • Datenbindung: Jedes Objekt bindet an eine WUIC-Route (mit optionalem Datensatz) und mappt visuelle Eigenschaften (Beschriftung, Farbe, Sichtbarkeit) auf Spalten; ein Doppelklick auf ein gebundenes Objekt im Viewer öffnet das CRUD des Datensatzes.
  • Automatische Vorschaubilder: Beim Speichern wird die Szene vom Canvas erfasst und als Vorschau in der Liste "Szene laden" angezeigt — ohne Konfiguration und ohne externen Prozess.

Die Routen von Designer und Viewer benötigen das Feature scene3d-designer. Die Support-Tabellen werden bei der ersten Verwendung automatisch angelegt und aktualisiert, auf allen unterstützten Datenbanken.

🖥️ WebGPU-Renderer (opt-in)

Das Rendering von Szene und Viewer ist jetzt zwischen WebGL (Standard) und WebGPU (über die Symbolleiste umschaltbar) wählbar. Ist WebGPU im Browser nicht verfügbar, bleibt der Designer automatisch bei WebGL. Der gewählte Modus wird mit der Szene gespeichert und beim Öffnen wiederhergestellt. Mit aktivem WebGPU-Renderer läuft das Licht-baking auf der GPU (inklusive Schatten), deutlich schneller bei dichten Szenen; handgeschriebene GLSL-Shader und path tracing bleiben auf dem WebGL-Renderer verfügbar.

🔀 Workflow Designer — unterstütztes Authoring

Der Workflow-Designer (#/workflow-designer) begleitet nun das Erstellen eines Prozesses von Grund auf.

  • Startvorlagen: "Neu aus Vorlage" erzeugt einen fertigen Graphen für gängige Muster (einfache Freigabe, Claim/Release-Warteschlange, Schwellenwertkette, parallele Aufgaben): Sie wählen die Hauptroute und — falls nötig — das Statusfeld, und Graph, Aktionen und Übergänge entstehen bereits verdrahtet.
  • Graph-Validierung: "Graph validieren" meldet Probleme vor dem Speichern (Start ohne Ausgänge, unerreichbare Knoten, Aktion ohne Ziel, leere Bedingung, toter Zweig, unvollständiger Timer oder Split, Berechtigung mit fehlender Rolle). Ein Klick auf einen Befund rückt den Knoten auf dem Canvas ins Bild. Das Speichern wird nie blockiert: Bei offenen Punkten erscheint eine Zusammenfassung mit "Trotzdem speichern".
  • Geführte Konfiguration: Die Dialoge für Timer und parallele Aufgaben verwenden Dropdowns und eine Route-Autovervollständigung statt aus dem Gedächtnis getippter Freitextfelder.
  • Onboarding und Hilfe: eine Erste-Schritte-Checkliste auf leerem Canvas, beschreibende Palette-Tooltips und eine "Kurzanleitung" mit einer Legende der Formen und einem Glossar der Konzepte (Übergang, Guard, Berechtigung, interne Aktion).

🎨 Dashboard-Designer — schnelleres Editing

  • Snap-to-Grid: Über das Aktionen-Menü des Designers aktivierbar; zeigt das Raster auf dem Canvas und richtet Ziehen, Größenänderung und Palette-Drops automatisch aus. Beim Aktivieren werden auch die bereits vorhandenen Elemente am Raster ausgerichtet.
  • Normaler / absoluter Fluss: Neues Flag im Aktionen-Menü (Standard: normaler Fluss, keine Änderung für bestehende Dashboards). Im absoluten Modus werden abgelegte Elemente an den Drop-Koordinaten positioniert, außerhalb des Flusses: Die Größenänderung eines Elements verschiebt die anderen nicht. Der Drop in einen Container nutzt den Container als Positionsreferenz, und die Runtime erkennt in diesem Modus gespeicherte Dashboards automatisch.
  • Tastaturkürzel: Entf/Backspace löscht das ausgewählte Element, die Pfeiltasten verschieben es, Ctrl+Z/Ctrl+Y für Undo/Redo. Durch Ziehen eines Auswahlrechtecks aus einem leeren Canvas-Bereich lassen sich mehrere Elemente auswählen: Pfeiltasten und Entf wirken auf die gesamte Auswahl.
  • JSON- und Preset-Import/-Export: Das aktuelle Dashboard lässt sich als re-importierbare JSON-Datei exportieren (identisch mit dem persistierten Inhalt) — nützlich, um Layouts zwischen Umgebungen zu übertragen. Presets speichern wiederverwendbare Layouts unter einem Namen und werden mit einem Klick angewendet.
  • Zwischen Tabs verschieben: Über das Kontextmenü eines Elements in einem Tab erstellt In neuen Tab verschieben einen neuen Tab und migriert das Element dorthin (Bindings und Zustand bleiben erhalten); In anderen Tab verschieben — verfügbar, wenn die Tabview mehrere Tabs hat — verschiebt es in einen bestehenden Tab nach Wahl. Der Ziel-Tab wird automatisch aktiviert, ebenso ein frisch abgelegter Tab.
  • Dashboard/Preset in ein Element importieren: Über das Kontextmenü eines Containers lässt sich ein gespeichertes Dashboard oder ein Preset direkt in das Element importieren; die Bezeichner der importierten Elemente werden neu generiert und interne Referenzen (einschließlich Datasources) neu zugeordnet — ohne Kollisionen mit dem bestehenden Inhalt.

🐛 Bemerkenswerte Fehlerbehebungen

  • Designer — mehrspaltiges Layout: Die Injektion eines mehrspaltigen/mehrbereichigen Layouts (z. B. "3 Spalten, jede mit einem Grid"), das der Chatbot vorschlägt, füllt nun alle Bereiche korrekt. Zuvor wurden nach der ersten Zelle die folgenden nicht aufgelöst und die Komponenten blieben leer.
  • Chatbot — Route-Whitelist: Wird darum gebeten, eine Komponente an eine Route mit ungenauem Namen zu binden (z. B. "provincie" für "stateprovinces"), führt der Chatbot nun den semantischen Match durch und schlägt die Aktion vor, statt fälschlich zu antworten, die Route-Liste lade noch.
  • 3D-Viewer — Navigation zwischen Szenen: Werden verschiedene Szenen nacheinander im selben Viewer geöffnet, lädt jetzt jede Szene korrekt. Zuvor konnte der Viewer weiterhin die zuerst geöffnete Szene anzeigen.
  • Schemagestützter JSON-Editor: Der Code-Editor im JSON-Modus bietet nun eine "Struktur"-Ansicht (per Schalter umschaltbar), um typisierte, schemageführte Eigenschaften hinzuzufügen und zu entfernen, ohne JSON von Hand zu schreiben.

🔧 Empfohlene operative Aktualisierungen für Aktualisierende

  1. Für ein kostenloses lokales LLM in appsettings.json -> AppSettings setzen: rag-llm-provider=ollama, rag-llm-base-url, rag-llm-api-key (Platzhalterwert, z. B. ollama) und rag-llm-default-chat-model.
  2. Den Chatbot-Schlüssel auf rag-llm-api-key migrieren: die bisherigen llm-api-key und anthropic-api-key funktionieren weiterhin als Fallback, doch die empfohlene Konfiguration nutzt nur rag-llm-api-key.
  3. Für den VS-Code-Assistenten das Plugin aus dem ZIP installieren: code --install-extension llm-workspace/plugin/wuic-assistant.vsix (oder von install-llm-workspace.ps1 installieren lassen).
  4. Um den Scene3D Designer zu nutzen, aktivieren Sie das Feature scene3d-designer in der aktiven Lizenz. Die Support-Tabellen werden bei der ersten Verwendung automatisch angelegt und migriert; der WebGPU-Renderer ist über die Designer-Symbolleiste optional zuschaltbar (opt-in), mit automatischem Fallback auf WebGL bei Browsern ohne Unterstützung.

v1.3.2

Zurück zur Übersicht

Vorherige veröffentlichte Version: 1.3.0 (11. Juni 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Eine Konsolidierungs-Release rund um den in 1.3.0 eingeführten RAG-Chatbot: Das Konversationsmodell ist nicht mehr an Anthropic gebunden — jeder OpenAI-kompatible Endpoint, einschließlich lokaler Runtimes wie Ollama mit offenen Modellen (Qwen), ist nun konfigurierbar und läuft ohne API-Key. Daneben eine Reihe von Fixes am First-Run-Installer, am Quellpaket und am Metadaten-Scaffolding, die bei frischen Installationen auftraten, sowie ein Workspace, der für KI-Coding-Assistenten bereit ist.


🤖 RAG-Chatbot — flexibler LLM-Provider (auch lokal und kostenlos)

Das Konversationsmodell des Chatbots ist nun providerunabhängig. Zusätzlich zu Anthropic werden OpenAI-kompatible Endpoints unterstützt, was lokale Runtimes (z. B. Ollama) einschließt: Offene, kostenlose Modelle wie Qwen lassen sich auf der eigenen Maschine betreiben, ohne API-Key und ohne Kosten pro Token.

  • rag-llm-provider — anthropic (Standard) / openai / openrouter. Wählt den Wire-Dialekt des Providers.
  • rag-llm-base-url — Endpoint-Override; mit der URL eines lokalen Servers (z. B. http://localhost:11434/v1 für Ollama) spricht der Chatbot lokal mit dem Modell.
  • rag-llm-default-chat-model — Modell-Id für den gewählten Provider (z. B. ein Qwen-Modell auf Ollama).
  • llm-api-key — Key des aktiven Providers; für lokale Runtimes, die ihn nicht prüfen, genügt ein Platzhalterwert (z. B. ollama). Der bisherige anthropic-api-key bleibt gültig, wenn rag-llm-provider=anthropic (keine Migration nötig).

Alle Keys werden per Hot-Reload aus appsettings.json gelesen: ein Wechsel von Provider oder Modell erfordert keinen Neustart.

Genaueres Retrieval — das Re-Ranking der Ergebnisse wurde verfeinert: Der Chatbot zitiert bei natürlichsprachlichen Anfragen relevantere Quellen.

Setup-Benachrichtigungen — beim ersten Einsatz lädt die .NET-Engine die ONNX-Modelle on-demand herunter. Der Administrator erhält nun Start- / Bereit- / Fehler-Benachrichtigungen des Downloads in der Glocke, über alle vier DB-Provider hinweg, auch wenn die Initialisierung durch eine Anfrage ohne angemeldeten Benutzer ausgelöst wird.

Automatische GPU-Beschleunigung — auf einer Maschine mit NVIDIA-GPU nutzt die Engine die GPU ohne CUDA-Installation: beim ersten Start lädt sie neben den ONNX-Modellen auch das benötigte CUDA-12- + cuDNN-9-Runtime on-demand herunter (~1,8 GB, einmalig, nur wenn eine GPU vorhanden ist) und bindet es selbst ein. Ohne GPU → CPU, kein zusätzlicher Download. Manueller Override mit rag-engine-cuda-path.


🧩 Workspace bereit für KI-Coding-Assistenten

Mit dem Framework generierte Anwendungen enthalten nun eine Sammlung von Markdown-Kontextdateien (Projektbeschreibung, Konventionen, Betriebsregeln) im Workspace-Root. Diese Dateien machen agentische KI-Assistenten — Continue, Cline, Cursor und ähnliche — sofort mit der WUIC-Struktur und den Konventionen vertraut, ganz ohne proprietäre Erweiterung. Jeder Client, der den Workspace-Kontext liest, verhält sich wie ein „WUIC-nativer" Assistent.


🐛 Nennenswerte Bugfixes

  • First-Run-Installer — Nicht-Tutorial-Modus auf allen DB-Providern: Die Installation mit Scaffolding einer bestehenden Datenbank (ohne die Tutorial-Beispieldaten) wurde korrigiert und über alle unterstützten Provider hinweg vereinheitlicht — SQL Server, MySQL, PostgreSQL und Oracle. Behoben wurden Fehler durch SQL-Dialekt-Unterschiede, die Auswahl der Ziel-Datenbank/des Ziel-Schemas und die Verbindungsverwaltung, die außerhalb des Tutorial-Modus auftraten.

  • First-Run-Installer — SQL-Skript-Pfad (non-BAK): Beim Provisioning der Metadaten-DB über das inkrementelle SQL-Skript (Alternative zum Restore aus einer .bak) verarbeitete der Parser für GO-getrennte Batches einige Trenner falsch, sodass die Schema-Erstellung bei frischen Installationen fehlschlug. Der Splitter wurde korrigiert, und skriptbasierte Installationen laufen nun sauber durch.

  • Quellpaket — .NET-RAG-Engine zur Laufzeit nicht gefunden: Im Quellpaket (-src-) wurde die Engine WuicRagEngine.dll im Paket-Root abgelegt, während die aus bin/ gestartete Anwendung sie neben sich suchte — der RAG-Chatbot startete nicht („WuicRagEngine.dll nicht gefunden"). Der Loader durchsucht den Ordner rag-engine/ nun an mehreren Stellen (Build-Output, Content-Root, Arbeitsverzeichnis) und findet die Engine in beiden Deploy-Layouts.

  • First-Run — Persistenz des Chatbot-API-Keys: Der im Erstinstallations-Assistenten eingegebene LLM-Key wird nun in die kanonische appsettings.json geschrieben, die zur Laufzeit tatsächlich gelesen wird. Zuvor konnte er in manchen Layouts in einer Kopie landen, die der Prozess nie liest, sodass der Chatbot direkt nach der Installation ohne Key blieb.

  • Metadaten-Scaffolding — Diagnose und Robustheit: Das Scaffolding der Metadaten bestimmter Tabellen konnte mit einer generischen Meldung („Unable to scaffold metadata table") fehlschlagen, die die eigentliche Ursache verbarg. Der tatsächliche SQL-Fehler wird nun bis zum Aufrufer propagiert, und der auslösende Fall ist behoben.

  • Quellpaket — Echtzeit-Benachrichtigungen im Dev-Modus: Im -src--Paket leitete der Proxy des Dev-Servers (ng serve) WebSocket-Verbindungen nicht an das Backend weiter; der Benachrichtigungskanal (/ws) lief in einen Timeout und Aktualisierungen erschienen erst nach einem manuellen Seiten-Reload. Der Proxy leitet nun auch WebSockets weiter: Benachrichtigungen kommen in Echtzeit an.


📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.3.0 1.3.2
Wuic.Webcore 1.3.0 1.3.2
WuicOData 1.3.0 1.3.2
RuntimeEfCore 1.3.0 1.3.2
Wuic.MySqlProvider 1.3.0 1.3.2
Wuic.PostgresProvider 1.3.0 1.3.2
Wuic.OracleProvider 1.3.0 1.3.2
wuic-framework-lib (NPM) 1.3.0 1.3.2

🔧 Empfohlene betriebliche Schritte beim Upgrade

  1. Um den Chatbot mit einem lokalen, kostenlosen Modell zu betreiben (z. B. Qwen über Ollama): rag-llm-provider=openai, rag-llm-base-url auf den lokalen Endpoint (z. B. http://localhost:11434/v1) und rag-llm-default-chat-model auf die Modell-Id setzen; llm-api-key mit einem Platzhalter (z. B. ollama) belegen, falls die Runtime ihn nicht prüft. Kein Neustart: Die Keys werden per Hot-Reload gelesen.
  2. Um bei Anthropic zu bleiben, ist nichts zu tun: anthropic-api-key funktioniert weiterhin mit rag-llm-provider=anthropic (Standard).
  3. Das Quellpaket (-src-) ist leichter: Es enthält die redundanten Framework-DLLs nicht mehr im Root; diese werden von dotnet build aus den NuGet-Paketen neu erzeugt. Der Download des neuen -src- erfordert keine Aktion.
  4. Beim ersten Chatbot-Einsatz mit der .NET-Engine sieht der Administrator den Download-Fortschritt der ONNX-Modelle in der Glocke. Vor dem ersten Ask die „bereit"-Benachrichtigung abwarten.
  5. Neue Apps des Frameworks enthalten die KI-Assistenten-Kontextdateien automatisch im Workspace-Root; für bestehende Apps lassen sie sich neu erzeugen.

v1.3.0

Zurück zur Übersicht

Vorherige veroeffentlichte Version: 1.2.1 (31. Mai 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Minor-Release mit Fokus auf die Integration des RAG-Chatbots auf Framework-Seite: persistente Konversationshistorie, automatisches Context-Management, Hot-Reload-Konfiguration aus appsettings.json und cross-DBMS-Schema, das beim ersten Start automatisch angewendet wird. Neben dem Hauptfeature einige Fixes am Metadata-Scaffolder und zur Robustheit des Chat-Repositories auf MySQL/Oracle, die in frischen DB-Provisioning-Szenarien aufgetreten sind.

Der Chatbot ist die erste WUIC-Komponente mit serverseitigem Zustand (_rag_chat_sessions + _rag_chat_messages), die sich ohne manuelle Schema-Konfiguration ueber alle vier unterstuetzten Provider erstreckt. Der erste Ask erkennt den Provider, wendet die inkrementellen SQL-Patches der Reihe nach an und startet. Mit diesem Release kann der Serving-Stack zudem nativ auf .NET laufen (in-process ONNX-Engine), wodurch das Deployment beim Kunden unabhaengig von Python wird.


🤖 RAG-Chatbot — End-to-End-Context-Management

Die Komponente <wuic-rag-chatbot> persistiert nun mehrere Sessions pro Benutzer mit vollstaendiger Konversationshistorie, automatischer Context-Summarization und Konfiguration ueber appsettings.json. Das Feature ist opt-in: ohne konfigurierten anthropic-api-key bleibt der Chatbot inaktiv.

Sessions

  • Pro Benutzer persistierte Konversationshistorie. Die Session ueberlebt Browser-Reloads und Routenwechsel.
  • Sessions-Popup absteigend nach updated_at sortiert, Titel aus dem ersten Prompt abgeleitet (auf 100 Zeichen gekuerzt + voller Tooltip).
  • Inline-Umbenennen mit sofortiger Persistenz.

Automatisches Context-Management

  • Visueller Cue-% im Chatbot-Header: ein farbiger Kreis, der die Auslastung des Modell-Context-Windows zeigt (gruen <60% / gelb 60-80% / orange 80-90% / rot >90%). Der Wert kommt aus den tatsaechlich vom Anthropic-API verbrauchten Tokens und wird pro Turn persistiert, daher ueberlebt er den Reload.
  • Auto-Compact pre-Ask: wenn die Konversation den konfigurierbaren Schwellenwert ueberschreitet (Standard 30 Turns) und mindestens 10 Turns noch nicht zusammengefasst sind, startet das Backend vor dem naechsten Ask einen Best-Effort-Compact im Hintergrund. Die aktualisierte Zusammenfassung wird fuer zukuenftige Turns in den System-Prompt eingebettet.
  • On-Demand-Compact: der Benutzer kann einen Compact ueber das Slash-Command /compact oder per Klick auf den Cue-Kreis erzwingen.
  • Memory Facts: das Modell selbst kann hochpriorisierte Fakten via Tool-Use (remember_fact/forget_fact) "anpinnen". Fakten bleiben auch nach einem Compact im System-Prompt (max. 20, FIFO-Eviction).
  • Follow-up Questions: das Modell schlaegt bis zu 3 Folgefragen vor, die als anklickbare Chips unter der Antwort dargestellt werden. Klick = befuellt das Eingabefeld vor (sendet nicht automatisch).

Konfiguration appsettings.json

  • anthropic-api-key — Anthropic-API-Key, Hot-Reload. Nicht hard-coded, niemals ins Repo committen.
  • anthropic-default-chat-model — claude-haiku-4-5-20251001 (200k, Standard) / claude-sonnet-4-5-20250929 / claude-opus-4-5. Bestimmt das Context-Window und den visuellen Cue.
  • anthropic-auto-compact-threshold — Ganzzahl >=0, Standard 30. Auf 0 setzen, um Auto-Compact zu deaktivieren (manueller /compact bleibt verfuegbar).

Cross-DBMS-Auto-Migration

Das Chat-History-Schema (5 inkrementelle Patches) wird beim ersten Ask idempotent auf den konfigurierten Provider angewendet (MSSQL / MySQL / PostgreSQL / Oracle). Auf bestehenden Installationen kein DBA-Schritt erforderlich.


🛠️ Aktionen, die der Chatbot auf das Projekt anwenden kann

Über die Beantwortung in natürlicher Sprache hinaus kann der Chatbot konkrete Änderungen am Projekt als Aktions-Chips mit einer "Anwenden"-Schaltfläche vorschlagen. Jeder Chip zeigt an, was er tun wird (Ziel-Route, generierter Code, Begründung), und der Benutzer entscheidet, ob er ihn anwenden möchte. Ohne expliziten Klick wird nichts ausgeführt.

Unterstützte Aktionstypen:

  • Toolbar- und Zeilenaktionen — fügt benutzerdefinierte Schaltflächen zur Toolbar einer <wuic-list-grid> oder zu Aktionen einzelner Zeilen hinzu, mit generierten JavaScript-Callbacks. Beispiele: "füge eine Aktion hinzu, die ausgewählte Zeilen als CSV exportiert", "Genehmigen-Schaltfläche auf jeder Zeile platzieren".
  • Bedingte Zeilen- und Spaltenstile — wendet CSS-Klassen auf eine Zeile oder eine einzelne Zelle basierend auf einer JS-Bedingung an. Beispiele: "Zeilen mit überfälliger Frist rot markieren", "grünen Hintergrund auf die status-Zelle setzen, wenn der Wert 'OK' ist".
  • Anzeigeformel für Spalten — ersetzt die Listendarstellung einer Spalte durch ein benutzerdefiniertes HTML/Angular-Template (Badge, Symbol, Link, farbiger Prozentwert). Beispiel: "priorität als grün/gelb/rotes Badge anzeigen".
  • Formel für den Formulartitel — berechnet den Titel des Bearbeitungsformulars eines Datensatzes dynamisch aus dessen Inhalt. Beispiel: "Titel soll Kunde {firmenname} sein".
  • Standardwert und benutzerdefinierte Validierung — generiert Callbacks für Standardwerte beim Öffnen des Formulars (Feld-Vorbelegung) oder für komplexe Validierung (feldübergreifend, benutzerdefinierte Regex). Beispiele: "Standard erstellt_am = heute", "validiere, dass email mit @firma.de endet".
  • Selection-changed- und Lifecycle-Callbacks — Hooks auf Formularereignisse (Datensatzauswahl-Änderung, before-save, after-save, after-delete) für benutzerdefinierte Seiteneffekte: verlinkte Datasources aktualisieren, Benachrichtigungen, Audit-Log auf Anwendungsebene.
  • Metadaten-Änderungen — wendet direkte Änderungen an Tabellen-/Spalten-Metadaten an (Caption, Sortierung, in Liste/Bearbeitung ausblenden, grundlegende Validierungen), ohne den manuellen Metadaten-Editor zu verwenden.
  • SQL-Snippets in Metadaten (Super-Admin) — schreibt rohe SQL-Fragmente in Metadaten-Felder, die zur Laufzeit in automatisch generierten Abfragen konkateniert werden: benutzerdefinierter JOIN auf der Route, benutzerdefinierte SELECT-Klausel auf einer Spalte, berechnete Spaltenformel, Lookup-Anzeigeausdruck. Beispiele: "berechne total auf orders als price × quantity", "füge Join zu payments auf invoice_id hinzu". Der Chatbot kennt den aktiven Provider-Dialekt (mssql/mysql/postgres/oracle) und generiert SQL mit dem korrekten Quoting/Syntax. Gated D3-Operation: erfordert Super-Admin-Privilegien serverseitig, mit automatischem Audit-Log in _error__logs für jede Anwendung.

🎨 Neue Aktion: Dashboard-Layout aus natürlicher Sprache

Wenn der Benutzer sich auf der Designer-Seite eines Dashboards befindet, stellt der Chatbot eine neue Familie von Aktionen bereit, die direkt auf das Designer-Canvas wirken (nicht auf persistierte Metadaten).

Unterstützte Prompt-Muster:

  • "füge eine Grid hinzu, gebunden an Route cities" → injiziert DATASOURCE + DATAREPEATER konfiguriert und gebunden;
  • "erstelle ein 2×2 Tabellen-Layout" → injiziert eine 2×2 <table> mit Zellen, die bereit sind, weitere Komponenten aufzunehmen;
  • "setze einen vertikalen Splitter mit 3 Bereichen" → injiziert einen konfigurierten SPLITTER;
  • "ändere den Hintergrund des Bereichs oben rechts auf rot" → ändert die backgroundColor-Eigenschaft der identifizierten Komponente;
  • "füge eine Spalte zur Tabelle hinzu" / "entferne Zeile 2" → ändert cols/rows der ausgewählten TABLE-Komponente;
  • "entferne den Umsatz-KPI" → löscht eine Komponente vom Canvas anhand ihres Namens.

Der Chatbot kennt den vollständigen Katalog der 31 Designer-Tools (Gruppen HTML, DATA, CONTAINER) und deren bearbeitbare Eigenschaften. Wenn der Benutzer eine Metadaten-Route mit einem ungefähren Namen erwähnt ("Provinzen" statt "stateprovinces"), führt der Chatbot einen Fuzzy-Match gegen die im Projekt verfügbaren Routen durch und zeigt den aufgelösten echten Namen in der Aktions-Begründung an.

Änderungen bleiben auf dem Designer-Canvas bis der Benutzer auf "Dashboard speichern" klickt — keine automatischen DB-Schreibvorgänge, das visuelle Ergebnis wird immer vor dem Commit überprüft. Undo/Redo des Designers deckt auch vom Chatbot injizierte Aktionen ab.


⚙️ Natives .NET-RAG-Engine (Deployment ohne Python)

Der Serving-Stack des RAG-Chatbots kann nun vollstaendig auf .NET laufen, ohne separaten Python-Server oder Virtual Environment auf der Zielmaschine. Die Retrieval-Modelle (Embeddings + Reranker) werden in-process ueber ONNX Runtime geladen, mit automatisch erkannter GPU-Beschleunigung (CUDA) und transparentem CPU-Fallback.

  • Aktivierung ueber appsettings.json: rag-use-dotnet-engine=true waehlt das .NET-Engine; der Default false behaelt das bisherige Verhalten bei.
  • rag-engine-device (auto / cpu / cuda) waehlt das Inferenz-Device; rag-engine-profile steuert den Redaktionsgrad der in den Antworten zitierten Quellen.
  • Beim ersten Start werden die benoetigten Artefakte (ONNX-Modelle + Index) on-demand heruntergeladen, sodass das Basis-Paket schlank bleibt.

Praktisches Ergebnis: das Deployment beim Kunden ist nur .NET — keine Python-Installation und keine zusaetzlichen nativen Abhaengigkeiten ausser der .NET-Runtime. Der Aufruf des Konversationsmodells und die Retrieval- und Aktions-Pipeline sind zwischen beiden Engines identisch.


🐛 Bemerkenswerte Bugfixes

  • Callback-Dokumentation am Runtime ausgerichtet: das Callback-Kochbuch beschrieb in zwei Faellen Signaturen, die nicht dem tatsaechlichen Verhalten entsprachen. Der Default-Value-Callback schreibt den Wert in das Record (record[field.mc_nome_colonna] = ...) und das return wird ignoriert; die Custom-Validation erhaelt (record, field, vr, wtoolbox) und teilt das Ergebnis mit einem booleschen return mit (false blockiert das Speichern) plus vr.message fuer den angezeigten Text. Die vorherigen Beispiele, basierend auf validateResult(...) und auf einem return fuer den Default Value, erzeugten Callbacks, die nicht angewendet wurden. Dokumentation in allen fuenf Sprachen korrigiert.

  • Zuverlaessigkeit der vom Chatbot vorgeschlagenen Aktionen: bei Aktionsanfragen emittiert der Chatbot nun deterministisch die passende Aktions-Chip und wiederholt automatisch bei einem transienten Rate-Limit des Konversationsmodells, statt still auf eine reine Textantwort zu degradieren.

  • Metadata-Scaffolder — Unterscheidung date vs datetime konsolidiert: Follow-up des in 1.2.1 eingefuehrten Fixes auf generierten temporalen Typen. Der Parser der Quelltypen deckt nun auch atypische DDL-Varianten ab (MySQL DATETIME(0) ohne Praezision, PostgreSQL nacktes timestamp ohne Time-Zone-Qualifier, Oracle TIMESTAMP(n) mit expliziter Praezision) — alle werden weiterhin korrekt auf den UI-Typ datetime gemappt und behalten die Zeitkomponente beim Speichern.

  • Suggest auf Metadata-Feldern — mc_suggest_value_callback normalisiert nun den Return-Wert: der DB-konfigurierte Callback konnte ein Promise oder einen synchronen Wert zurueckgeben, der Runtime-Parser akzeptierte aber nur den synchronen Fall. Resultat: der Suggest schlug bei async Callbacks lautlos fehl. Die Normalisierung wartet nun einheitlich Promise.resolve(callback(...)) ab.

  • Chat-Repository — cross-driver Guid: der Treiber MySQL.Data materialisiert eine CHAR(36)-Spalte als Guid, wenn das Flag OldGuids false ist (Standard ab Connector-Version 6.6), und verursacht InvalidCastException auf GetString. Gleiches Risiko auf Oracle mit RAW(16)-Storage. Das Lesen der Correlation-Id hat nun eine Fallback-Kaskade (GetGuid → GetString → GetValue mit Runtime-Type-Switch) — robust auf allen vier Providern unabhaengig von der Treiber-Konfiguration.

  • Chat-Repository — MySQL-Verbindung nicht geoeffnet: das MySQL-Gateway lieferte eine new MySqlConnection(cs) zurueck, ohne Open() aufzurufen, asymmetrisch zu den PostgreSQL- und Oracle-Gateways. Der erste ExecuteNonQueryAsync des Schema-Auto-Apply schlug mit "Connection must be valid and open" fehl. Es wurde ein symmetrisches OpenConnectionToConnectionString hinzugefuegt, angeglichen an die anderen Provider.


📦 Aktualisierte Pakete

Package Von Auf
WuicCore 1.2.1 1.3.0
Wuic.Webcore 1.2.1 1.3.0
WuicOData 1.2.1 1.3.0
RuntimeEfCore 1.2.1 1.3.0
Wuic.MySqlProvider 1.2.1 1.3.0
Wuic.PostgresProvider 1.2.1 1.3.0
Wuic.OracleProvider 1.2.1 1.3.0
wuic-framework-lib (NPM) 1.2.1 1.3.0

🔧 Empfohlene operative Aktualisierungen

  1. Um den RAG-Chatbot zu aktivieren, den Schluessel anthropic-api-key (und optional anthropic-default-chat-model und anthropic-auto-compact-threshold) zur appsettings.json hinzufuegen. Das Backend liest die Schluessel im Hot-Reload — kein Neustart noetig.
  2. Kein DBA-Schritt erforderlich auf bestehenden Installationen: beim ersten Chatbot-Ask wird das Chat-History-Schema (_rag_chat_sessions + _rag_chat_messages mit allen Spalten) idempotent auf den in MetaDataSQLConnection konfigurierten Provider angewendet. Die Auto-Migration deckt frische und teilweise migrierte Installationen ab.
  3. Falls die Installation auf MySQL / PostgreSQL / Oracle laeuft, sicherstellen, dass der Connection-String auf den korrekten Provider verweist und der Benutzer ueber ALTER TABLE-Privilegien auf dem Metadata-Schema verfuegt (einmalig, beim ersten Start noetig).
  4. Um die Context-Window-Nutzung zu ueberwachen, ist der Cue-%-Kreis im Chatbot-Header der unmittelbare visuelle Treiber. Ueber 80% lohnt sich ein manueller Compact (/compact oder Klick auf den Cue), um die Latenz nachfolgender Turns zu reduzieren.
  5. Um den RAG-Chatbot ohne Python auf der Zielmaschine zu betreiben, rag-use-dotnet-engine=true in appsettings.json setzen (optional rag-engine-device und rag-engine-profile). Beim ersten Start werden die Inferenz-Artefakte automatisch heruntergeladen.

v1.2.1

Zurück zur Übersicht

Zuvor veröffentlichte Version: 1.2.0 (27. Mai 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Wartungs-Release, fokussiert auf eine Klasse latenter Bugs, die datetime- und decimal-Felder in DBMS- und kulturübergreifenden Szenarien betrafen. Die meisten Anwender auf Workstations mit italienischer Locale waren mindestens einmal betroffen — die Zeitkomponente von Zeitstempeln wurde bei INSERT und UPDATE auf Mitternacht gekürzt, und Dezimalzahlen mit nicht-invariantem Trennzeichen erzeugten ORA-01722 auf Oracle, sobald die ODP.NET-Session die italienische Windows-Kultur erbte.

Die Fixes betreffen alle 4 unterstützten Provider (MSSQL, MySQL, PostgreSQL, Oracle) und sämtliche End-to-End-Roundtrip-Tests laufen sowohl in englischer (en-US) als auch italienischer (Italiano dmy, lc_time=Italian_Italy.1252) DB-Sitzungs-Locale grün.


🐛 Bemerkenswerte Bugfixes

  • time-Komponente bei INSERT/UPDATE von DATETIME2 / DATETIME(n) / TIMESTAMP-Feldern abgeschnitten: Der Metadaten-Scaffolder fasste alle temporalen Quell-DB-Typen unter dem einzigen UI-Typ date zusammen. Folge: Eine SQL-Server-Spalte DATETIME2(3) (oder MySQL DATETIME(3), PostgreSQL timestamp without time zone, Oracle TIMESTAMP(0)) wurde als reines Datum behandelt, und das Framework gab '20261231' statt '20261231 23:59:58' bei INSERT/UPDATE aus — die im UI eingegebene Uhrzeit ging beim Speichern verloren. Der Scaffolder unterscheidet jetzt date (reines Datum) von datetime (Datum + Uhrzeit), und das Speichern bewahrt die Zeitkomponente sekundengenau. Sub-Sekunden-Präzision (.fff) bleibt bewusst abgeschnitten, um Konsistenz mit dem UI-Datums-Zeit-Picker zu wahren, der sie nicht zugänglich macht.

  • Oracle ORA-01722: ungültige Zahl auf NUMBER(p,s)-Feldern von Workstations mit italienischer Locale: Die Provider gaben numerische Werte als String-quoted in INSERT/UPDATE aus (z. B. VALUES (..., '9876.4321', ...)). Oracle konvertierte die Zeichenkette dann in eine Zahl mit dem Sitzungs-NLS_NUMERIC_CHARACTERS, das ODP.NET aus der .NET-Thread-CurrentCulture ableitet: Unter italienischer Kultur ist das Dezimaltrennzeichen , und . wird zum Gruppen-Trennzeichen → '9876.4321' wurde als ungültiger Gruppen-Ausdruck interpretiert. Numerische Werte (decimal, float, double, numeric) werden jetzt als nicht-quoted SQL-Literale emittiert: Oracle-Numerik-Literale verwenden immer . als Dezimalpunkt, unabhängig von NLS.

  • Oracle ORA-00904: ungültiger Bezeichner auf Tabellen mit quoted-lowercase-Bezeichnern: Eine mit DDL CREATE TABLE "my_table" ("id" NUMBER, ...) erstellte Tabelle (lowercase-quoted, case-preserving) war vom Framework nicht lesbar. Die Quoting-Logik erkannte Mixed-Case und reservierte Schlüsselwörter, behandelte All-Lowercase-Bezeichner jedoch als "sicher" und gab sie unquoted aus (Oracle case-foldet bare Bezeichner zu UPPER), was zu einem Mismatch mit dem physischen "id" führte. All-Lowercase-Bezeichner werden jetzt mit explizitem Quoting bewahrt.

  • Locale-invariantes Parsing/Formatting von Daten und Zeitstempeln server-seitig: Der DateTime-Parse-/Emit-Pfad auf Oracle und PostgreSQL nutzte die Thread-CurrentCulture. Das Parsing versucht jetzt zuerst InvariantCulture und fällt nur bei Bedarf auf CurrentCulture zurück; das Formatting für SQL-Klauseln (TO_TIMESTAMP(...) / yyyy-MM-dd HH:mm:ss-Literal) verwendet immer InvariantCulture. Nutzer-sichtbarer Effekt: Der Round-trip bleibt bit-perfect, unabhängig von CultureInfo.CurrentCulture des Backend-Prozesses.

  • Oracle ORDER BY auf Lowercase-PK: Die automatisch hinzugefügte ORDER BY-Klausel auf dem Primärschlüssel emittierte den Spaltennamen, ohne die Quoting-Logik zu durchlaufen → ORA-00904 auf Tabellen mit PK "id" lowercase-quoted. Der PK folgt jetzt demselben Quoting-Pfad wie jede andere Spalte.


🗄️ Cross-Locale-DB-Kompatibilität

Die End-to-End-Roundtrip-Tests decken jetzt folgende Provider × DB-Session-Kombinationen ab:

Provider Getestete DB-Session Ergebnis
MSSQL @@LANGUAGE=Italian, date_format=dmy, Latin1_General_CI_AS OK
MySQL lc_time_names=en_US, utf8mb4_0900_ai_ci, time_zone=SYSTEM OK
PostgreSQL DateStyle=ISO,DMY, lc_time=Italian_Italy.1252 OK
Oracle NLS_LANGUAGE=AMERICAN, NLS_TERRITORY=AMERICA, NLS_NUMERIC_CHARACTERS=., OK

Datumswerte werden als invariant end-to-end abgesichert (2026-12-31T23:59:58.000 bleibt 2026-12-31T23:59:58.000, unabhängig von DB-Session und Backend-CurrentCulture), ebenso Dezimalwerte (9876.4321 bleibt 9876.4321).


📦 Aktualisierte Pakete

Package Von Auf
WuicCore 1.2.0 1.2.1
Wuic.Webcore 1.2.0 1.2.1
WuicOData 1.2.0 1.2.1
RuntimeEfCore 1.2.0 1.2.1
Wuic.MySqlProvider 1.2.0 1.2.1
Wuic.PostgresProvider 1.2.0 1.2.1
Wuic.OracleProvider 1.2.0 1.2.1
wuic-framework-lib (NPM) 1.2.0 1.2.1

v1.2.0

Zurück zur Übersicht

Vorherige veröffentlichte Version: 1.1.0 (13. Mai 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Dieses Release erweitert das Framework um zwei neue DBMS — PostgreSQL und Oracle — und behebt einen Spreadsheet-Filter-Bug, der bei Routen mit aktivierten server-side operations auftrat, wenn die Spalte eine Lookup-Spalte war.

  • PostgreSQL-Provider und Oracle-Provider: beide als Drop-in installierbar (postgresql.dll / oracle.dll neben WuicCore.dll), nutzbar als Data Store oder Metadata Store, mit Feature-Parität zu MSSQL und MySQL.
  • Spreadsheet-Filter auf Lookup-Spalten im Server-Side-Modus: das Popup zeigt nun die Lookup-Bezeichner (z. B. Woodgrove Bank Crandon Lakes) und wendet den Filter mit der Foreign-Key-ID an, wodurch der SQL-Fehler auf Providern mit strikter Typisierung entfällt.

🗄️ PostgreSQL-Provider

Drop-in-kompatibel mit PostgreSQL 14+ (getestet auf 16). Installation: postgresql.dll neben WuicCore.dll im Physical Path der IIS-Site ablegen, oder im Publish-Verzeichnis des Linux-Binärs. Der firstRun-Setup-Wizard zeigt automatisch "PostgreSQL" im DBMS-Dropdown an, sobald er die DLL erkennt.

Funktionale Abdeckung. Alle Core-Oberflächen des Frameworks laufen nativ auf PG mit derselben Semantik wie die MSSQL/MySQL-Releases: CRUD, server-side paging, sorting, grouping, Aggregationen, Lookup Autocomplete, OData, scheduled Jobs, Audit, Notifications, Retry Policy, optimistische Konkurrenz, Validations, Callbacks/Events, XLS Import/Export, PDF Export, Multi-Tenant.

PG-spezifische unterstützte Typen. boolean (automatisch von/zu internem smallint-Speicher gemappt, der für Parität mit MSSQL/MySQL verwendet wird), varchar/text, numeric, integer/bigint, timestamp, date, bytea (Binär-Upload), geometry (PostGIS — Kartenanzeige via ST_AsText).

Im Paket vorkonfigurierte Dateien.

  • appsettings.postgres.json / appsettings.linux.postgres.json / appsettings.multi-tenant.postgres.json — Self-contained-Environments einsatzbereit, aktivierbar mit ASPNETCORE_ENVIRONMENT=postgres.
  • dbms/scripts/first-run/*.postgres.sql — Metadata-Bootstrap + WideWorldImporters-Tutorial-DDL/DML.

🗄️ Oracle-Provider

Drop-in-kompatibel mit Oracle 19c / 21c / Free 23c. Installation oracle.dll analog zum PostgreSQL-Provider; "Oracle" erscheint automatisch im firstRun-Dropdown.

Funktionale Abdeckung. Identisch zu PostgreSQL — alle Core-Oberflächen mit derselben Semantik wie die MSSQL/MySQL-Releases.

Bezeichner-Länge. Oracle 11g/12.1 (max 30 Zeichen) wird noch nicht unterstützt — die vom Framework generierten Lookup-Aliase überschreiten das Limit. Oracle 12.2+ (128 Zeichen) ist die Support-Untergrenze.

Im Paket vorkonfigurierte Dateien.

  • appsettings.oracle.json / appsettings.linux.oracle.json / appsettings.multi-tenant.oracle.json.
  • dbms/scripts/first-run/*.oracle.sql — Metadata-Bootstrap + Tutorial.

🐛 Bemerkenswerte Bugfixes

  • Spreadsheet-Popup-Filter auf Lookup-Spalten bei md_server_side_operations=true: das Spalten-Funnel-Popup von <wuic-list-spreadsheet> auf einer lookupByID-Spalte zeigte nackte numerische IDs (z. B. 1, 4, 5) statt der Bezeichner (z. B. Woodgrove Bank Crandon Lakes). Auf PG/Oracle erzeugte die Filteranwendung einen SQL-Fehler (42601 ilike %% auf PostgreSQL, ORA-00904 auf Oracle), weil der Client den Bezeichner-String gegen die numerische FK-Spalte übertrug. Der Server liefert nun den gejointen Bezeichner (<entity>___<dataTextField>__<colName>) neben der FK-ID, und der Client zeigt den Bezeichner im Popup, überträgt aber die rohe ID als Filter-Value: das WHERE col = <id> bleibt numerisch und cross-DBMS-safe. Keine Aktion auf Consumer-Seite erforderlich.

📦 Aktualisierte Pakete

Package Von Auf
WuicCore 1.1.0 1.2.0
Wuic.Webcore 1.1.0 1.2.0
WuicOData 1.1.0 1.2.0
RuntimeEfCore 1.1.0 1.2.0
Wuic.MySqlProvider 1.1.0 1.2.0
Wuic.PostgresProvider — 1.2.0
Wuic.OracleProvider — 1.2.0
wuic-framework-lib (NPM) 1.1.0 1.2.0

🔧 Empfohlene operative Aktualisierungen für Upgrader

  1. Für MSSQL- oder MySQL-Nutzer: keine Aktion erforderlich. Der Spreadsheet-Filter-Fix wird auf allen Providern nach dem ersten Client-Refresh transparent angewendet.
  2. PostgreSQL aktivieren: postgresql.dll (zusammen mit Runtime-Dependencies — Npgsql.dll, Npgsql.EntityFrameworkCore.PostgreSQL.dll, Microsoft.Extensions.Logging.Abstractions.dll) in den IIS-Physical-Path oder in das Linux-Publish-Verzeichnis kopieren, Backend neu starten. PostgreSQL im firstRun-Wizard auswählen oder ASPNETCORE_ENVIRONMENT=postgres setzen, um die vorkonfigurierte appsettings.postgres.json zu verwenden.
  3. Oracle aktivieren: gleiche Prozedur — oracle.dll + Oracle.EntityFrameworkCore.dll + Oracle.ManagedDataAccess.dll. Sicherstellen, dass die Ziel-DB-Version ≥ 12.2 ist (Bezeichner-Längen-Constraint).
  4. Client-Cache: nach dem Update genügt ein Hard Refresh im Browser (Strg+F5), um den Client mit dem neuen Popup-Filter-Vertrag abzugleichen. Keine Server-seitige Metadata-Invalidierung erforderlich.

v1.1.0

Zurück zur Übersicht

Zuvor veröffentlichte Version: 1.0.20 (12. Mai 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Minor-Sprung: Dieses Release führt zwei strukturelle Funktionen ein, die das Deployment-Modell des Frameworks verändern.

  • Multi-Tenant: Eine einzelne Framework-Instanz leitet Daten und Metadaten von N Unternehmen auf N verschiedene DB-Verbindungen weiter. Per-Tenant-Konfiguration über die Spalten Aziende.Connessione_DB_Dati / Aziende.CONNESSIONE_DB_Meta; transparentes Routing auf Anwendungsebene via TenantContext (AsyncLocal, übersteht Task/Scheduler-Grenzen).
  • Sprachabhängige Menü-Lokalisierung: Menüeinträge (mm_display_string_menu) enthalten keine hartcodierten italienischen Labels mehr, sondern stabile namespaced Schlüssel menu.<scope>.<slug>, die zur Laufzeit von der Angular-translate-Pipe gegen _wuic_translations aufgelöst werden. Sprachwechsel über den Benutzer-Selector aktualisiert alle Einträge ohne F5.

🌐 Multi-Tenant-Verwaltung

Eine einzelne Framework-Installation kann jetzt mehrere Unternehmen ("Tenants") bedienen, deren Daten und Metadaten physisch auf unterschiedlichen DBs isoliert sind — ohne dass die Anwendung repliziert oder Reverse-Proxies pro Host partitioniert werden müssen.

Datenmodell. Das Tenant→Verbindungs-Routing ist auf zwei Spalten der primären Metadaten-DB definiert:

  • Aziende.Connessione_DB_Dati — Name eines Eintrags in ConnectionStrings für die Anwendungs-DB des Tenants
  • Aziende.CONNESSIONE_DB_Meta — Name eines Eintrags in ConnectionStrings für die Metadaten-DB des Tenants

Die Spalten enthalten den Namen des Eintrags, nicht den wörtlichen String. Credential-Rotation erfolgt durch Editieren von appsettings.<env>.json, ohne die DB anzufassen.

Aktivierung. Flag in appsettings.json (Abschnitt AppSettings):

"multiConnectionEnabled": "true"

Mit Flag false (Default) bleibt das Verhalten Single-Tenant, identisch zu den vorherigen Releases. Mit Flag true löst jede authentifizierte HTTP-Anfrage die AziendaId aus dem eingeloggten Benutzer auf und leitet GetOpenConnection an die Connection Strings des entsprechenden Tenants weiter.

Transparentes Routing. Alle DB-Zugriffspunkte des Frameworks (MetaService.*, Scheduler, Scaffolding, AsmxProxy CRUD, Custom Callbacks) konsultieren TenantScope.CurrentAziendaId via AsyncLocal, propagiert vom HTTP-Middleware post-authenticate. Background-Jobs und Custom Callbacks deklarieren den Tenant explizit mit using (TenantScope.Push(aziendaId)) { ... }, wenn sie außerhalb des Request-Kontexts laufen.

Tenant-bewusster Cache. Server-seitige Application[]-Keys und lokale Metadaten-Caches werden automatisch mit AziendaId suffixiert, wenn das Flag aktiv ist, um Metadaten-Bleed zwischen Tenants zu vermeiden.

Login-Routing. Die Tabelle _login_index(username_hash, id_azienda) auf der primären DB mappt Username → Tenant für den MetaService.login-Fallback: Nach der Authentifizierung trägt das Cookie k-user azienda_id als Teil des Payloads, und die Middleware erstellt bei jeder folgenden Anfrage den korrekten TenantScope.

Scaffold-Propagation. Die Aktion "Scaffold Tabelle" propagiert Tabellenmetadaten idempotent zu allen in Aziende aufgeführten Tenants. Die Propagation läuft mit explizitem TenantScope auf jedem Ziel und ist idempotent: wiederholbar, wendet nur fehlende Änderungen an.

Im Paket enthaltene Dateien:

  • appsettings.multi-tenant.mssql.json / appsettings.multi-tenant.mysql.json — self-contained Environment mit 6 Beispiel-Connection-Strings (1 Primary + 5 Tenants) und multiConnectionEnabled=true. Aktivieren mit ASPNETCORE_ENVIRONMENT=multi-tenant.mssql.
  • dbms/scripts/multi_tenant_aziende_connessioni_mssql.sql / _mysql.sql — DDL, um die beiden Spalten zu Aziende auf bestehenden DBs hinzuzufügen.

🗺️ Sprachabhängige Menü-Lokalisierung

Menüeinträge werden jetzt dynamisch nach der Benutzersprache übersetzt, ohne dass _metadati__menu-Datensätze pro Locale dupliziert werden müssen.

Architektur. Das Feld mm_display_string_menu von _metadati__menu enthält einen stabilen namespaced Schlüssel (menu.admin.roles, menu.crm.opportunities, menu.fleet.vehicles, ...). Das Template der Angular-Menükomponente wendet die translate-Pipe auf item.label an, und der Schlüssel wird zur Laufzeit aus dem nach aktueller Sprache gefilterten Dictionary _wuic_translations aufgelöst.

Schlüssel-Schema.

menu.<scope>.<slug>
   │       └── snake_case Slug (z. B. column_styles, opportunities)
   └── scope = root | admin | demo | crm | fleet | invoice
  • menu.root.* — Top-Level-Parents (Verwaltung, Anwendung, Startseite, ...)
  • menu.admin.* — 36 gemeinsame System-Einträge (Rollen, Designer, Spaltenstile, Workflow-Designer, ...)
  • menu.demo.* — WideWorldImporters-Demo-Inhalt
  • menu.crm.* / menu.fleet.* / menu.invoice.* — domänenspezifische Einträge des Tenants

Vorteil gegenüber dem vorherigen Modell.

  • Das alte Modell verwendete den italienischen Text des Labels als Übersetzungsschlüssel (Aziende, Customers, Ruoli). Dies verursachte stille Case-Mismatches (Ruoli vs ruoli, Stili Tabella vs Stili tabella), weil die translate-Pipe case-sensitive ist, während _wuic_translations eine case-insensitive Collation hat: Der erste MERGE fixierte das Casing für immer, und nachfolgende case-divergente INSERTs wurden zu stillen No-Ops.
  • Das neue stabile Schlüssel-Modell ist case-determiniert (per Konvention lowercase), per Scope namespaced, und kollidiert nicht mehr mit anderen Ressourcen, die denselben italienischen Text verwenden könnten (z. B. ein Button-Label "Ruoli" in einem Dropdown ist ein anderer Schlüssel als menu.admin.roles).

5 unterstützte Sprachen. it-IT, en-US, fr-FR, es-ES, de-DE. Übersetzungen liegen in _wuic_translations (Standardformat: language, resource, translation). Sprachwechsel über das Benutzer-Dropdown oben rechts liest das Dictionary für die neue Sprache neu und rendert das Menü ohne F5 neu.

Runtime-Fallback. Aktuelle Sprache → en-US → it-IT → Raw-Key. Wenn Sie menu.admin.roles wörtlich auf dem Bildschirm sehen, wurde der Schlüssel in keiner der 5 Sprachen geseedet.

Alte italienische Schlüssel in _wuic_translations werden vom Upgrade nicht angefasst: Sie können von anderen Stellen der App konsumiert werden (instant('Aziende') im Code-Behind, List-Grid-Header, Page-Titles) und bleiben gültig.


🐛 Bemerkenswerte Bugfixes

  • Dynamische Edit-Formulare — Tabs und Widgets in md_edit_template-Templates in Production: In Production-Builds rendeten die über md_edit_template an eine Route gebundenen benutzerdefinierten HTML-Templates die Tabs von PrimeNG 21 nicht korrekt (Labels erschienen als verketteter Klartext ohne Komponenten-Chrome) und Field-Editors zeigten statt der Eingabefelder nur <!---->-Platzhalter. Ursache: der vom Framework für dynamische Templates verwendete Runtime-Compiler benötigt eine explizite Auflistung der im Template verfügbaren Standalone-Komponenten, und MetadataProviderService.widgetDefinition.dynamicFormImports war unvollständig. Zur Baseline hinzugefügt: TabsModule + Tabs/TabList/Tab/TabPanels/TabPanel, FieldsetModule, DataRepeaterComponent, DataSourceComponent, ImageWrapperComponent. Keine Aktion auf Consumer-Apps erforderlich, sobald das Paket wuic-framework-lib aktualisiert ist.

🎁 Kostenlose Apps jetzt verfügbar

Ab dieser Version werden drei vollständige Anwendungen kostenlos auf dem Framework ausgeliefert — verfügbar im Abschnitt „Free apps" der Downloads-Seite:

  • CrmApp — Selbstgehostetes B2B-CRM: Kundenverwaltung, Opportunity-Pipeline mit Drag-and-Drop-Kanban, Aktivitäten (Anrufe / Meetings / E-Mails), rollenbasiertes Dashboard. (Artikel lesen)
  • FatturazioneElettronica — Italienische E-Rechnung: FatturaPA v1.2-Rechnungseditor, CADES-BES-Signatur, XSD-Validierung, 4 austauschbare SDI-Provider (DirectPec kostenlos via PEC, ArubaPec / FatturePec / PecIt kommerziell), gesetzliche Aufbewahrung, IVA-Register und Liquidation. (Artikel lesen)
  • FlottaMezzi — Fuhrparkverwaltung: Fahrzeug- / Fahrerverwaltung, automatische Fristen (Steuer / TÜV / Versicherung / Wartung / Führerschein), OBD/GPS-Geolokalisierungs-Feed, Live-Karte, €/km-Kostenaggregation pro Fahrzeug und Fahrer, TCO-Reporting. (Artikel lesen)

Jede App wird in drei Formaten ausgeliefert: IIS-ZIP mit Tutorial-DB (sofort wiederherstellbar), IIS-ZIP ohne DB, Quellcode-ZIP.

Lizenzmodell. Die kostenlosen Apps sind KOSTENLOS in der ausgelieferten Form — das Binary <App>.dll im ZIP trägt eine eingebettete host-binding-license-Ressource, die die Framework-Runtime ohne externe Schlüssel autorisiert. Nur wenn Sie die App aus dem Quellcode neu kompilieren (etwa um einen neuen Controller hinzuzufügen oder eine öffentliche Signatur zu ändern), benötigen Sie eine WUIC Developer- oder Professional-Lizenz: die Neukompilierung erzeugt ein Binary mit anderer Identität, verliert das Bundling, und das Framework fällt auf die Standard-Fingerprint-Lizenzprüfung zurück.

Das Erweitern der kostenlosen Apps ohne Neukompilierung des Binarys wird vom Bundling abgedeckt: Metadaten via SQL hinzufügen, Angular-Komponenten im wwwroot, Jobs in der scheduler-Tabelle, Custom Hooks via appsettings.json:customCrudHookClass.


📦 Aktualisierte Pakete

Package Von Auf
WuicCore 1.0.20 1.1.0
Wuic.Webcore 1.0.20 1.1.0
WuicOData 1.0.20 1.1.0
RuntimeEfCore 1.0.20 1.1.0
wuic-framework-lib (NPM) 1.0.20 1.1.0

🔧 Empfohlene operative Updates für Upgrader

  1. Für diejenigen, die Multi-Tenant aktivieren möchten (Opt-in): Das DDL-Skript dbms/scripts/multi_tenant_aziende_connessioni_mssql.sql (oder _mysql.sql) ausführen, um die Spalten Connessione_DB_Dati und CONNESSIONE_DB_Meta zu Aziende hinzuzufügen. Aziende-Zeilen mit den Namen der ConnectionStrings-Einträge aus appsettings.json füllen. AppSettings.multiConnectionEnabled = "true" setzen. Backend neu starten.
  2. Für diejenigen, die Single-Tenant bleiben: Keine Aktion erforderlich. Ohne multiConnectionEnabled=true ist das Tenant-Routing deaktiviert und das Verhalten ist bit-identisch zur 1.0.20.
  3. Menü-Lokalisierung — Metadata-Refresh: Nach dem Upgrade einmal POST /api/Meta/AsmxProxy/MetaService.invalidateMetadataRuntime ausführen, um das Menü-Dictionary clientseitig neu zu laden. Alternativ Benutzer aus- und einloggen.
  4. Menü-Lokalisierung — Migration eines bestehenden Projekts: Für Projekte, die von einer früheren Version mit italienischen Labels in _metadati__menu.mm_display_string_menu kommen, zwei idempotente SQL-Schritte anwenden: (a) UPDATE _metadati__menu SET mm_display_string_menu = '<menu.scope.slug>' WHERE mm_display_string_menu = '<altes Label>' für jeden Eintrag, gemäß dem oben dokumentierten Schema menu.<scope>.<slug>; (b) INSERT/MERGE INTO _wuic_translations (language, resource, translation) 5 Zeilen pro neuem Schlüssel (eine pro Sprache). Die alten Zeilen in _wuic_translations mit resource = italienischer Text bleiben in der DB und können weiterhin von anderen Callern (instant(), List-Grid-Header) konsumiert werden.
  5. Backend Hot Reload in Dev: Wenn Sie mit dotnet watch entwickeln, erfordert der Task backend: kill dll lockers jetzt pwsh 7+ (nicht mehr Windows PowerShell 5.x). Das Inline-C#-Skript für Restart Manager verwendet Dictionary<,>-Syntax, die nur in PS 7+ korrekt geparst wird.

v1.0.20

Zurück zur Übersicht

Zuvor veröffentlichte Version: 1.0.19 (4. Mai 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


Konsolidierungs-Release nach 1.0.19, mit Fokus auf Bug Fixes mit direkter Auswirkung auf Bearbeitung und Anzeige (INSERT bei INSTEAD OF-Triggern, numerische Felder, die beim Blur zurückgesetzt werden, leerer Kalender bei der ersten Navigation, Erhalt von Custom-SQL in Reports) und auf eine Anpassungsrunde der Map-Komponente an die neuen Google Maps APIs: Vervollständigung der Optionen des Archetyps map, Migration auf die Routes API für Snap-to-Roads, Entfernung der Abhängigkeit von der veralteten Drawing-Library.


🐛 Erwähnenswerte Bug Fixes

  • INSERT bei INSTEAD OF-Triggern: Tabellen mit INSTEAD OF INSERT-Triggern verloren den vom äußeren Statement zurückgegebenen PK (OUTPUT INSERTED.<pk> lieferte 0 oder NULL, weil der Trigger das INSERT übernahm). Fix: Das von _Metadati_methods erzeugte INSERT verwendet jetzt eine Tabellenvariable (@__inserted_pk mit OUTPUT ... INTO) als primären Kanal und fällt auf IDENT_CURRENT('<table>') zurück, wenn der Trigger das äußere Statement konsumiert. Behebt zugleich SQL Server msg 334 (OUTPUT INSERTED ohne INTO ist bei Tabellen mit aktivierten Triggern unzulässig).
  • field-editor number — Reset auf 0 beim Blur: Wenn die Metadaten-Spalte mc_min_value oder mc_max_value gesetzt hatte, wurde das numerische Feld beim Blur auf 0 zurückgesetzt, statt den eingegebenen Wert beizubehalten. Die Range-Prüfung griff vor dem Parsing-Roundtrip, las einen nicht-numerischen Zwischenwert und kollabierte ihn auf 0. Korrektes Verhalten: Der Wert wird bestätigt und nur dann auf die Grenzen geklemmt, wenn er tatsächlich außerhalb des Bereichs liegt, sonst bleibt er unverändert.
  • Archetyp map — vervollständigte Optionen: Der Archetyp der Map-Komponente erhält drei Properties, die häufige UX-Lücken schließen:
    • polyline — Polyline-Overlay für Routenverfolgung (historisierte GPS-Datensätze). Gruppierung per Feld (groupByField), Sortierung (orderByField), Farbe pro Datensatz/pro Gruppe, optional Snap-to-Roads, Waypoint-Dots getrennt vom interpolierten Pfad.
    • clickableIcons — Pass-Through zu google.maps.MapOptions.clickableIcons. Bei false öffnet Google Maps die eigene eingebaute Info-Window auf POIs (Geschäfte, Haltestellen, Adressen) nicht mehr — sie hätte sonst Klicks abgefangen, die an die Custom-Marker gehen sollten.
    • markerColorField — Farbe des PinElement wird aus einem Feld des Datensatzes gelesen (CSS #rrggbb). Wird ignoriert, wenn der Datensatz bereits customMarkerImageSrcField gesetzt hat (Bild/SVG hat Vorrang).
  • Google Maps Directions API — deprecated: DirectionsService ist seit 2026-02-25 deprecated. Das Snap-to-Roads der Polylines nutzt jetzt die neue Routes API (google.maps.routes.Route.computeRoutes), mit automatischem Fallback auf den legacy DirectionsService (bis 2027-02-25 funktionsfähig) für Keys, die noch nicht migriert sind. Legacy Travel Mode → Routes-Mapping unverändert (DRIVING/WALKING/BICYCLING). Automatisches Batching auf 25 Waypoints pro Aufruf.
  • Google Maps Drawing API — entfernt: Die Drawing-Library (google.maps.drawing) ist seit 2025-08 deprecated und in Maps JavaScript API-Versionen ab Mai 2026 entfernt. Die DrawingManager-Logik in MapListComponent bestand nur aus console.log-Stubs (keine echte persistierte Drawing-Funktion) und wurde entfernt. PointFilterComponent (Geo-Filter per Fläche/Kreis in List-Grids) wurde mit manuellen Click+Mousemove-Handlern neu implementiert — gleiche UX (Polygon per Mehrfach-Click, Kreis per Mittelpunkt+Radius, Doppelklick zum Schließen), unabhängig von der deprecated Library.
  • Reports — Erhalt von Custom-SQL über __autogenerated-Sentinel: Reports mit Custom-SQL, das Spalten aliassierte, die nicht in den Metadaten registriert sind, verloren Joins/Spalten, weil die auto-generierte Dynamic Query die User-Query überschrieb. Cross-DBMS-Fix (MSSQL, MySQL, PostgreSQL, Oracle): Jedes auto-generierte SELECT injiziert nun 1 AS [__autogenerated] als erste Spalte; die Metadaten-Pipeline erkennt das Token zur Laufzeit und erhält die Custom-Query, wenn der Sentinel nicht vorhanden ist. Ermöglicht Stimulsoft-Layouts, die Spalten lesen, welche nicht als Metadaten registriert sind (typisch bei Rechnungs-/PEC-Templates, wo das SQL berechnete Spalten ableitet).
  • Kalender — Events nicht sichtbar bei der ersten Navigation: <wuic-scheduler-list> zeigte einen leeren Kalender, wenn der Benutzer direkt zu #/<route>/scheduler navigierte (FullCalendar wurde mit data=[] initialisiert, bevor die async-Antwort eintraf; F5 füllte ihn, weil der Session-Cache die Daten vor dem Mount lieferte). Fix: explizite Event-Synchronisation per API (removeAllEvents() + addEvent()) nach dem Kalender-Render, unter Umgehung des unzuverlässigen [events]="data"-Bindings des FullCalendar 6.x Angular-Wrappers bei Post-Mount-Updates.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.0.19 1.0.20
Wuic.Webcore 1.0.19 1.0.20
WuicOData 1.0.19 1.0.20
RuntimeEfCore 1.0.19 1.0.20
wuic-framework-lib (NPM) 1.0.19 1.0.20

🔧 Empfohlene Upgrade-Schritte

  1. dotnet ef database update ausführen, falls EF-Migrations im Einsatz sind.
  2. Wenn Sie Snap-to-Roads auf Polylines nutzen: prüfen Sie, dass Ihr Google Maps API Key die Routes API zusätzlich zur Directions API aktiviert hat. Ohne Routes API fällt das Framework auf den legacy DirectionsService zurück — funktioniert weiter, ist aber im Deprecation-Fenster (Sunset 2027-02-25).
  3. Falls Sie auf die Standard-Drawing-Toolbar von MapListComponent angewiesen waren (keine bekannten Use Cases — die Handler waren Stubs): die Toolbar wurde entfernt. Keine Aktion erforderlich für Geo-Filter in List-Grids — PointFilterComponent behält dieselbe UX mit interner Implementierung.
  4. Um das neue Polyline-Overlay auf einer Map-Route zu verwenden: die Konfiguration { enabled: true, groupByField, orderByField, ... } zu md_props_bag.archetypes.map.polyline über den Designer oder einen Metadata-Patch hinzufügen.

v1.0.19

Zurück zur Übersicht

Vorherige veröffentlichte Version: 1.0.7 (26. April 2026)
Backend: .NET 10 + IIS / Linux nginx
Frontend: Angular 21


In sechs Tagen intensiver Entwicklung macht WUIC einen bedeutenden Schritt nach vorn: vom einzelnen Windows-IIS-Deployment zu einer Multi-Runtime-Plattform (Windows + natives Linux), mit einem einheitlichen System für typisierte Fehlerbehandlung, zentralisiertem Crash Reporting, LDAP-Authentifizierung und einer Runde Best-Effort-Hardening an der Anwendungsoberfläche.


🛡️ Sicherheit

Best-Effort-Hardening über die gesamte Anwendungsoberfläche: Authentifizierungs-Throttling, Verstärkung der Standard-HTTP-Header (HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy), umgebungsbewusste Verwaltung von CORS und Swagger, reduzierte Info-Disclosure in Fehlerantworten, granulare Absicherung administrativer Endpunkte, zusätzliche Prüfungen im Runtime-SQL-Pfad. Standard-Konfigurationen sind nun auch für Demo-/Staging-Deployments restriktiver, mit explizitem Override über AppSettings.


🚨 Crash Reporting (End-to-End)

Neues automatisch installiertes Crash-Reporting-System, das .NET- und JavaScript-Stacktraces an einen selbst gehosteten Receiver sendet.

  • Passive Erfassung: Unbehandelte Exceptions werden automatisch erfasst, per Stack-Canonicalization dedupliziert und asynchron in die Queue gestellt — keine Auswirkung auf die Request-Latency.
  • Privater Receiver: errors.wuic-framework.com akzeptiert mit RSA-Lizenzsignatur signierte Uploads (keine API-Keys zu verwalten).
  • DSGVO-Einwilligung: Explizites Opt-in in AppSettings, konfigurierbar über den Settings-Editor.
  • Aktivierung: CrashReporting:Enabled=true in appsettings.json + DSGVO-Einwilligung über die UI.

🐧 Linux-Deployment (neu)

WUIC ist jetzt vollständig automatisiert auf Ubuntu/Debian installierbar, mit dem unterstützten Stack:

  • .NET-Runtime + MSSQL Server oder MySQL/MariaDB.
  • Python 3.12 + RAG-Umgebung.
  • Secrets über systemd credentials.
  • nginx Reverse Proxy mit Let's Encrypt TLS.
  • Smoke-Test nach der Installation, der Backend, RAG und Proxy validiert.

Das Linux-Tarball enthält appsettings.linux.mssql.json und appsettings.linux.mysql.json vorkonfiguriert für die zwei unterstützten Stacks, plus eine README mit der Schritt-für-Schritt-Anleitung.


🔐 LDAP-Authentifizierung

Der WUIC-Login unterstützt jetzt LDAP-Bind als Alternative zur Datenbank:

  • Konfiguration über die Sektion Authentication:Ldap:* in appsettings.json (Server, Base DN, Bind Template).
  • Benutzer-Auto-Provisioning: Die lokale Zeile wird beim ersten Login mit Daten aus LDAP erstellt/aktualisiert.
  • DB-Fallback: Wenn LDAP nicht erreichbar ist und Authentication:Ldap:FallbackToDbOnFailure=true, fällt der Login auf die traditionelle DB zurück (admin/admin bleibt für Recovery immer erreichbar).

Kompatibel mit Active Directory, OpenLDAP und Novell-Verzeichnissen.


🗄️ MySQL-Provider (Wuic.MySqlProvider 0.8.3)

Erweiterte MySQL/MariaDB-Unterstützung auf Augenhöhe mit dem primären MSSQL:

  • Vollständige funktionale Test-Coverage (Audit, Client-Side-CRUD, Concurrency, Conditional Styling, Import-Export, OData, Retry, Stored Procedures, Übersetzungen, Validierungen).
  • Linux-spezifische Bug-Fixes: Default-Collation, JSON_TYPE-Quirks, Paging Hints.

🚦 Einheitliches Fehlersystem (typisierte Exceptions)

Vollständiges Refactoring der Anwendungsfehlerbehandlung:

  • WuicException als Basistyp für alle typisierten Anwendungs-Exceptions (Teil der öffentlichen API des Frameworks).
  • WuicErrorCodes: Katalog mit 27 stabilen Codes (errors.auth.unauthenticated, errors.metadata.props_bag.malformed, errors.db.sql_exception, errors.report.render_failed, usw.).
  • Stabiler JSON-Envelope für alle Fehlerantworten: { ok, errorCode, args, traceId, fallbackMessage }. Erlaubt dem Client, lokalisierte Nachrichten anstelle technischer Stacktraces anzuzeigen.
  • Eingebaute Übersetzungen in IT/EN/DE/ES/FR/JA für alle bekannten Codes.
  • Automatisches Mapping bekannter Runtime-Exceptions (SqlException, AuthenticationException, JsonException, usw.) auf typisierte Codes.

📊 Excel-Export

Bulk-Export im .xlsx-Format wurde auf eine Producer/Consumer-Pipeline und OpenXmlWriter Streaming umgeschrieben. Die Auswirkungen betreffen vor allem große Datasets (ab Zehntausenden Zeilen).

  • Streaming OpenXML statt inkrementellem DOM-Build: typischerweise 50× schneller bei Bulk-Exporten, Memory-Footprint bleibt auch jenseits einer Million Zeilen begrenzt.
  • Pipelined DB-Read / xlsx-Write über einen bounded Buffer: DB-Reads blockieren nicht mehr auf der Sheet-Kompressionszeit.
  • Aggregierte Progress-Notifications über einen dedizierten Channel: keine Task pro Update mehr, kein WebSocket-Storm während langer Exporte.
  • Automatischer Multi-Sheet-Split, wenn das Excel-Limit von 1.048.576 Zeilen pro Sheet überschritten wird. Die Abschluss-Meldung enthält die Anzahl der erzeugten Sheets.

Keine Aktion erforderlich: der Pfad ist standardmäßig aktiv für alle .xlsx-Exporte aus der List-Grid-Toolbar (Export XLS) und aus Server-side APIs.


🐛 Erwähnenswerte Bug-Fixes

  • isSuperAdmin-Gating: Korrigierte Berechtigungsprüfung an mehreren Endpunkten, die zuvor isAdmin (per-User-Rolle) mit isSuperAdmin (Source-of-Truth-Rolle) verwechselten.
  • OData CRUD: Korrigierte Edge-Case-Serialisierungen (Decimal→string, DateTime UTC Roundtrip, Navigation Properties).
  • First-Run-Wizard: Initial-Bootstrap konsumiert jetzt korrekt IConfiguration (keine Abhängigkeit mehr von Legacy-app.config).
  • Crash Reporting Forwarding: Bug vom 28.04.2026 behoben — behandelte MVC-Exceptions umgehen die Crash-Reporter-Middleware nicht mehr.

📦 Aktualisierte Pakete

Paket Von Auf
WuicCore 1.0.13 1.0.19
Wuic.Webcore 1.0.13 1.0.19
WuicOData 1.0.13 1.0.19
RuntimeEfCore 1.0.13 1.0.19
Wuic.MySqlProvider 0.7.x 0.8.3
wuic-framework-lib (NPM) 1.0.11 1.0.19

🔧 Empfohlene operative Schritte für Upgrader

  1. dotnet ef database update ausführen, falls EF Migrations verwendet werden.
  2. appsettings.json prüfen: Das System liest jetzt zusätzlich AppSettings:AllowedOrigins (String-Array) und AppSettings:registrationEnabled (boolescher Kill-Switch). Sichere Defaults, falls nicht angegeben.
  3. Bei LDAP-Nutzung die Sektion Authentication:Ldap:* in appsettings.json konfigurieren.
  4. Für Linux-Deployment: Das dedizierte Tarball verwenden und die enthaltene README befolgen.
  5. Zur Aktivierung des ausgehenden Crash Reporting: CrashReporting:Enabled=true in appsettings.json setzen + DSGVO-Einwilligung über die UI akzeptieren.