wuic-framework-lib 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@ import { SplitterModule } from 'primeng/splitter';
5
5
  import * as i11 from 'primeng/dragdrop';
6
6
  import { DragDropModule } from 'primeng/dragdrop';
7
7
  import { NgClass, NgStyle, NgTemplateOutlet, AsyncPipe, JsonPipe, NgFor, NgIf, NgComponentOutlet } from '@angular/common';
8
- import { W as WtoolboxService, D as DynamicGenericTemplateComponent, a as DataSourceComponent, b as DataRepeaterComponent, F as FilterBarComponent, L as LazyParametricDialogComponent, P as PagerComponent, M as MetadataProviderService, c as ParametricDialogComponent, d as MetadatiColonna, e as DataProviderService, U as UserInfoService, T as TranslationManagerService, f as MetadataEditorService, g as WorkflowRuntimeMetadataService, h as FieldEditorComponent, i as MetadataEditorComponent, A as ArchetypeConfiguratorComponent } from './wuic-framework-lib-wuic-framework-lib-CpocrbwM.mjs';
8
+ import { W as WtoolboxService, D as DynamicGenericTemplateComponent, a as DataSourceComponent, b as DataRepeaterComponent, F as FilterBarComponent, L as LazyParametricDialogComponent, P as PagerComponent, M as MetadataProviderService, c as ParametricDialogComponent, d as MetadatiColonna, e as DataProviderService, U as UserInfoService, T as TranslationManagerService, f as MetadataEditorService, g as WorkflowRuntimeMetadataService, h as FieldEditorComponent, i as MetadataEditorComponent, A as ArchetypeConfiguratorComponent } from './wuic-framework-lib-wuic-framework-lib-BINzgaz1.mjs';
9
9
  import { fromEvent, BehaviorSubject, merge, filter, Observable, switchMap, take, map, takeUntil, tap, timeInterval, scan, mergeMap, of, delay, repeat, Subject, startWith, pairwise, skipWhile, combineLatest } from 'rxjs';
10
10
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
11
11
  import { CdkAccordionModule, CdkAccordion, CdkAccordionItem } from '@angular/cdk/accordion';
@@ -10505,4 +10505,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
10505
10505
  }] } });
10506
10506
 
10507
10507
  export { DesignerComponent };
10508
- //# sourceMappingURL=wuic-framework-lib-designer.component-BnGD84I-.mjs.map
10508
+ //# sourceMappingURL=wuic-framework-lib-designer.component-DT3raIYd.mjs.map
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { EventEmitter, Output, Input, Component } from '@angular/core';
3
3
  import * as i2 from 'primeng/dialog';
4
4
  import { DialogModule } from 'primeng/dialog';
5
- import { c as ParametricDialogComponent } from './wuic-framework-lib-wuic-framework-lib-CpocrbwM.mjs';
5
+ import { c as ParametricDialogComponent } from './wuic-framework-lib-wuic-framework-lib-BINzgaz1.mjs';
6
6
 
7
7
  class PromptDialogFallbackHostComponent {
8
8
  datasource;
@@ -96,4 +96,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
96
96
  }] } });
97
97
 
98
98
  export { PromptDialogFallbackHostComponent };
99
- //# sourceMappingURL=wuic-framework-lib-prompt-dialog-fallback-host.component-sX90o2X8.mjs.map
99
+ //# sourceMappingURL=wuic-framework-lib-prompt-dialog-fallback-host.component-B_8W1yHW.mjs.map
@@ -2152,7 +2152,7 @@ class WtoolboxService {
2152
2152
  const appRef = resolvedInjector.get(ApplicationRef);
2153
2153
  const environmentInjector = resolvedInjector.get(EnvironmentInjector);
2154
2154
  const close$ = new Subject();
2155
- const { PromptDialogFallbackHostComponent } = await import('./wuic-framework-lib-prompt-dialog-fallback-host.component-sX90o2X8.mjs');
2155
+ const { PromptDialogFallbackHostComponent } = await import('./wuic-framework-lib-prompt-dialog-fallback-host.component-B_8W1yHW.mjs');
2156
2156
  const hostRef = createComponent(PromptDialogFallbackHostComponent, { environmentInjector });
2157
2157
  hostRef.instance.datasource = dialogConfig?.data?.datasource;
2158
2158
  hostRef.instance.header = String(dialogConfig?.header || '');
@@ -62732,7 +62732,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
62732
62732
 
62733
62733
  const frameworkDocsContent = {
62734
62734
  "version": "1.0.0",
62735
- "generatedAt": "2026-04-11T20:38:13.967Z",
62735
+ "generatedAt": "2026-04-12T09:40:17.561Z",
62736
62736
  "groups": [
62737
62737
  {
62738
62738
  "id": "primi-passi",
@@ -63529,18 +63529,44 @@ const frameworkDocsContent = {
63529
63529
  },
63530
63530
  {
63531
63531
  "id": "sec_2",
63532
- "title": "Quick Start"
63532
+ "title": "First Steps — Avvio ambiente dev"
63533
+ },
63534
+ {
63535
+ "id": "sec_3",
63536
+ "title": "Riepilogo servizi"
63537
+ },
63538
+ {
63539
+ "id": "sec_4",
63540
+ "title": "Quick Start — primo componente"
63533
63541
  }
63534
63542
  ],
63535
63543
  "sections": [
63536
63544
  {
63537
63545
  "id": "overview",
63538
63546
  "title": "Overview",
63539
- "html": "<h1>Panoramica Framework</h1><p>WUIC Framework è una piattaforma metadata-driven per creare interfacce business in modo rapido e coerente.</p><h2>Cosa include</h2><ul><li>DataSource e DataRepeater per orchestrare dati e rendering.</li><li>Archetypes visuali (list, map, scheduler, chart, carousel).</li><li>Designer runtime per dashboard e template dinamici.</li><li>Workflow designer/runner per processi operativi.</li></ul><h2>Quick Start</h2><p>1. Configura endpoint AsmxProxy.</p><p>2. Definisci route metadata e colonne.</p><p>3. Monta <code>wuic-data-source</code> + <code>wuic-data-repeater</code>.</p><p>Snippet 1:</p>",
63547
+ "html": "<h1>Panoramica Framework</h1><p>WUIC Framework e&#39; una piattaforma metadata-driven per creare interfacce business in modo rapido e coerente.</p><h2>Cosa include</h2><ul><li>DataSource e DataRepeater per orchestrare dati e rendering.</li><li>Archetypes visuali (list, map, scheduler, chart, carousel).</li><li>Designer runtime per dashboard e template dinamici.</li><li>Workflow designer/runner per processi operativi.</li><li>RAG Chatbot per interrogare il codebase in linguaggio naturale.</li></ul><h2>First Steps — Avvio ambiente dev</h2><p>Lo stack WUIC e&#39; composto da piu&#39; servizi. Avviali nell&#39;ordine indicato.</p><h3>Prerequisiti</h3><p>| Cosa | Verifica | Note |</p><p>|---|---|---|</p><p>| .NET 10 SDK | <code>dotnet --version</code> | Hosting Bundle per IIS in produzione |</p><p>| Node.js 20+ | <code>node --version</code> | |</p><p>| SQL Server (Express) | <code>sqlcmd -S localhost\\sqlexpress -E -C -Q &quot;SELECT 1&quot;</code> | Istanza <code>sqlexpress</code> di default |</p><p>| Python 3.12 | <code>python --version</code> | Solo per il RAG Chatbot (opzionale) |</p><h3>1. Database</h3><p>I database devono essere gia&#39; presenti e popolati. Connessioni in <code>appsettings.json</code>:</p><ul><li><code>MetaDataSQLConnection</code> — DB metadata (menu, tabelle, colonne, board, utenti)</li><li><code>DataSQLConnection</code> — DB dati applicativi</li></ul><p>Se e&#39; la prima installazione, impostare <code>AppSettings.firstRun = true</code> in</p><p><code>appsettings.json</code> e seguire la procedura guidata di scaffolding (vedi pagina</p><p>*Scaffolding iniziale*).</p><h3>2. Backend (.NET)</h3><p>Snippet 1:</p><p>Il backend espone le API su <code>http://localhost:5000</code>.</p><p>Verifica: <code>curl http://localhost:5000/api/Meta/AsmxProxy/MetaService.getProjectMetadataVersion</code></p><h3>3. Frontend (Angular)</h3><p>Snippet 2:</p><p>Il frontend e&#39; disponibile su <code>http://localhost:4200</code>.</p><p>Login di default: <code>admin</code> / <code>admin</code>.</p><h3>4. RAG Chatbot (opzionale)</h3><p>Il RAG Chatbot (<code>Amministrazione &gt; RAG Chat</code>) richiede un server Python</p><p>FastAPI su <code>127.0.0.1:8765</code>. Senza di esso il componente mostra il banner</p><p>**&quot;Server RAG non raggiungibile&quot;** e lo stato **RAG offline** — il resto</p><p>dell&#39;applicazione funziona normalmente.</p><p>**Prerequisiti:** Python 3.12 (<code>winget install Python.Python.3.12</code>)</p><p>Snippet 3:</p><p>Per GPU CUDA: <code>pwsh scripts/rag-setup.ps1 -CudaVersion 12.1</code>.</p><p>Per la chat con LLM: <code>pwsh scripts/rag-setup.ps1 -Start -AnthropicApiKey &quot;sk-ant-...&quot;</code>.</p><p>Senza API key funziona solo la modalita&#39; retrieval (ricerca snippet).</p><p>Cold start ~13 secondi. Una volta che il log mostra</p><p><code>Uvicorn running on http://127.0.0.1:8765</code>, ricarica la pagina nel browser.</p><p>Per produzione (Windows service NSSM) vedi la skill</p><p><code>skills/rag-chatbot-deploy/SKILL.md</code>.</p><h2>Riepilogo servizi</h2><p>| Servizio | Porta | Obbligatorio | Comando rapido |</p><p>|---|---|---|---|</p><p>| SQL Server | 1433 | si | (servizio Windows) |</p><p>| Backend .NET | 5000 | si | <code>dotnet watch ... run</code> |</p><p>| Frontend Angular | 4200 | si | <code>npm run serve:dev</code> |</p><p>| RAG Server Python | 8765 | no | <code>uvicorn rag_server:app ...</code> |</p><h2>Quick Start — primo componente</h2><p>1. Configura endpoint AsmxProxy.</p><p>2. Definisci route metadata e colonne.</p><p>3. Monta <code>wuic-data-source</code> + <code>wuic-data-repeater</code>.</p><p>Snippet 4:</p>",
63540
63548
  "codeSamples": [
63541
63549
  {
63542
63550
  "id": "code_1",
63543
63551
  "title": "Snippet 1",
63552
+ "language": "powershell",
63553
+ "code": "cd c:\\src\\Wuic\\KonvergenceCore\n\n# Opzione A — Hot reload (consigliato per sviluppo)\npwsh -ExecutionPolicy Bypass -File scripts\\rider\\prep-konvergencecore-watch.ps1\n$env:ASPNETCORE_ENVIRONMENT = 'Development'\ndotnet watch --no-restore --project KonvergenceCore.csproj run --no-launch-profile -p:StaticWebAssetsEnabled=false\n\n# Opzione B — Debug (build + run classico)\npwsh -ExecutionPolicy Bypass -File scripts\\rider\\prep-konvergencecore-debug.ps1\ndotnet run --project KonvergenceCore.csproj --no-launch-profile"
63554
+ },
63555
+ {
63556
+ "id": "code_2",
63557
+ "title": "Snippet 2",
63558
+ "language": "powershell",
63559
+ "code": "# Orchestratore completo (stop vecchi processi → serve → apre browser)\ncd c:\\src\\Wuic\\KonvergenceCore\npwsh -ExecutionPolicy Bypass -File scripts\\rider-frontend-run.ps1 -App WuicTest\n\n# Oppure manualmente\ncd c:\\src\\Wuic\\WuicTest\\wwwroot\nnpm run serve:dev"
63560
+ },
63561
+ {
63562
+ "id": "code_3",
63563
+ "title": "Snippet 3",
63564
+ "language": "powershell",
63565
+ "code": "# Setup (una sola volta) — crea venv e installa dipendenze\npwsh scripts/rag-setup.ps1\n\n# Avvio server\npwsh scripts/rag-setup.ps1 -Start"
63566
+ },
63567
+ {
63568
+ "id": "code_4",
63569
+ "title": "Snippet 4",
63544
63570
  "language": "html",
63545
63571
  "code": "<wuic-data-source [hardcodedRoute]=\"'cities'\"></wuic-data-source>\n<wuic-data-repeater [hardcodedAction]=\"'list'\"></wuic-data-repeater>"
63546
63572
  }
@@ -67614,14 +67640,18 @@ const frameworkDocsContent = {
67614
67640
  },
67615
67641
  {
67616
67642
  "id": "sec_11",
67617
- "title": "Hot-reload post rebuild RAG"
67643
+ "title": "Avvio (primo utilizzo)"
67618
67644
  },
67619
67645
  {
67620
67646
  "id": "sec_12",
67621
- "title": "Test"
67647
+ "title": "Hot-reload post rebuild RAG"
67622
67648
  },
67623
67649
  {
67624
67650
  "id": "sec_13",
67651
+ "title": "Test"
67652
+ },
67653
+ {
67654
+ "id": "sec_14",
67625
67655
  "title": "Riferimenti"
67626
67656
  }
67627
67657
  ],
@@ -67629,8 +67659,15 @@ const frameworkDocsContent = {
67629
67659
  {
67630
67660
  "id": "overview",
67631
67661
  "title": "Overview",
67632
- "html": "<h1>RAG Chatbot</h1><p>Componente Angular <code>&lt;wuic-rag-chatbot&gt;</code> che permette di interrogare il codebase</p><p>WUIC in linguaggio naturale, con due modalita&#39; operative: **retrieval pure**</p><p>(top-K snippet del codice) e **RAG + LLM** (risposta generata da Claude usando</p><p>i top-K come contesto). Degrada automaticamente in retrieval-only se la API</p><p>key Claude non e&#39; configurata sul server.</p><h2>Architettura</h2><p>Stack a 3 layer, tutti gia&#39; deployati nel progetto:</p><ul><li>**Layer 1** — Server Python FastAPI <code>rag_server.py</code> su <code>127.0.0.1:8765</code>,</li></ul><p> carica al boot l&#39;indice ibrido BM25 + bge-m3 + LoRA cross-encoder Phase C</p><p> da <code>c:/src/Wuic/codebase_embeddings/</code>.</p><ul><li>**Layer 2** — Bridge C# <code>RagController</code> in KonvergenceCore (<code>/api/Rag/Query</code>,</li></ul><p> <code>/api/Rag/Chat</code>, <code>/api/Rag/Health</code>, <code>/api/Rag/Reload</code>), proxy autenticato</p><p> via cookie <code>k-user</code>.</p><ul><li>**Layer 3** — Componente Angular standalone <code>&lt;wuic-rag-chatbot&gt;</code> esportato</li></ul><p> da <code>wuic-framework-lib</code>.</p><p>Vedi anche la skill operativa <code>skills/rag-chatbot-creation/SKILL.md</code> per il</p><p>playbook end-to-end di creazione/manutenzione del componente, e</p><p><code>skills/rag-rebuild-pipeline/SKILL.md</code> per il rebuild dell&#39;indice/LoRA.</p><h2>Modalita&#39;</h2><p>| <code>mode</code> input | Comportamento |</p><p>|---|---|</p><p>| <code>auto</code> (default) | Usa <code>chat</code> se il backend espone Claude API key, altrimenti <code>retrieval</code> |</p><p>| <code>chat</code> | Forza RAG + LLM. Se la API key manca, il backend ritorna <code>mode=retrieval-only</code> con warning visibile |</p><p>| <code>retrieval</code> | Forza retrieval-only, salta la chiamata LLM (utile per ridurre costi) |</p><h2>Inputs</h2><p>| Input | Tipo | Default | Descrizione |</p><p>|---|---|---|---|</p><p>| <code>title</code> | string | <code>&#39;Assistente codebase WUIC&#39;</code> | Etichetta header |</p><p>| <code>mode</code> | <code>&#39;auto&#39; \\| &#39;chat&#39; \\| &#39;retrieval&#39;</code> | <code>&#39;auto&#39;</code> | Modalita&#39; operativa |</p><p>| <code>topK</code> | number | <code>5</code> | Numero di chunk da retrieve dal RAG |</p><p>| <code>showSources</code> | boolean | <code>true</code> | Mostra/nasconde i source chip nei messaggi assistant |</p><p>| <code>maxHistory</code> | number | <code>20</code> | Numero massimo di turn mantenuti in memoria |</p><p>| <code>placeholder</code> | string | <code>&#39;Chiedi qualcosa...&#39;</code> | Placeholder dell&#39;input |</p><p>| <code>model</code> | string | <code>&#39;claude-haiku-4-5-20251001&#39;</code> | Modello Claude per la modalita&#39; chat |</p><p>| <code>chatHeight</code> | string | <code>&#39;420px&#39;</code> | Altezza fissa area chat |</p><p>| <code>showClearButton</code> | boolean | <code>true</code> | Mostra bottone &quot;Svuota cronologia&quot; |</p><h2>Outputs</h2><p>| Output | Payload | Descrizione |</p><p>|---|---|---|</p><p>| <code>resultSelected</code> | <code>RagSource</code> | Click su un source chip; il componente tenta anche un deep-link <code>vscode://file/...</code> |</p><p>| <code>errorOccurred</code> | <code>{message, details?}</code> | Errori HTTP non recuperabili |</p><p>| <code>turnAdded</code> | <code>RagChatbotTurn</code> | Emette dopo ogni turn (user o assistant) aggiunto alla history |</p><h2>Esempio d&#39;uso</h2><p>Standalone import nel componente parent:</p><ul><li>selector HTML: <code>&lt;wuic-rag-chatbot mode=&quot;auto&quot; [topK]=&quot;5&quot; (resultSelected)=&quot;onSrc($event)&quot;&gt;&lt;/wuic-rag-chatbot&gt;</code></li><li>import TypeScript: <code>import { WuicRagChatbotComponent, RagSource } from &#39;wuic-framework-lib&#39;;</code></li><li>aggiungere <code>WuicRagChatbotComponent</code> agli <code>imports</code> del componente standalone parent.</li></ul><p>Per una pagina demo completa con aside debug e gestione eventi, vedi</p><p><code>WuicTest/wwwroot/src/app/component/rag-chatbot-demo-page/</code>.</p><h2>Auth</h2><p>Tutte le chiamate HTTP partono con <code>withCredentials: true</code> e il bridge C#</p><p>applica gli stessi check di autenticazione degli altri controller WUIC</p><p>(cookie di sessione <code>k-user</code>, regola 10 di AGENTS). Mai esporre il server</p><p>Python <code>127.0.0.1:8765</code> direttamente al browser: deve sempre essere proxiato</p><p>dal C#.</p><h2>Service <code>WuicRagService</code></h2><p>API tipizzata sopra <code>RagController</code>, esportata da <code>wuic-framework-lib</code>.</p><p>Tre metodi principali:</p><ul><li><code>query(text, {topK, useLora}) -&gt; Observable&lt;RagQueryResponse&gt;</code></li><li><code>chat(text, history, {topK, model}) -&gt; Observable&lt;RagChatResponse&gt;</code></li><li><code>health() -&gt; Observable&lt;RagHealthResponse&gt;</code></li><li><code>reload() -&gt; Observable&lt;{status, ...}&gt;</code> (post rebuild RAG)</li></ul><p>Varianti <code>*Async</code> ritornano <code>Promise</code> via <code>firstValueFrom()</code>.</p><p>Tutte le interfacce <code>RagSource</code>, <code>RagQueryResponse</code>, <code>RagChatResponse</code>,</p><p><code>RagHealthResponse</code>, <code>RagChatTurn</code> sono esportate.</p><h2>Modello Claude</h2><p>Default: <code>claude-haiku-4-5-20251001</code> (veloce, italiano nativo, ~$0.001 per</p><p>query da 5 chunk). Override possibile via input <code>[model]</code> del componente</p><p>oppure passando <code>options.model</code> al metodo <code>chat()</code> del service.</p><p>System prompt usato server-side:</p><p>&gt; Sei un assistente esperto del codebase WUIC. Rispondi alla domanda dell&#39;utente</p><p>&gt; usando ESCLUSIVAMENTE il contesto fornito. Se la risposta non e&#39; nel contesto,</p><p>&gt; rispondi &#39;Non ho trovato informazioni sufficienti nel codebase per rispondere.&#39;</p><p>&gt; Cita sempre i file rilevanti tra parentesi quadre nel formato</p><p>&gt; <code>[file.ext::SimboloOpzionale]</code>. Rispondi in italiano salvo richiesta esplicita</p><p>&gt; di un&#39;altra lingua. Non inventare API o nomi di metodi: se non sono nel</p><p>&gt; contesto, dillo esplicitamente.</p><h2>Fallback automatico</h2><p>Quando il backend rileva una di queste condizioni, il response include</p><p><code>mode: &#39;retrieval-only&#39;</code> + <code>warning</code> + <code>sources</code>:</p><ul><li><code>ANTHROPIC_API_KEY</code> non settata sul server Python</li><li>chiamata Claude fallita (errore HTTP, rate limit, modello sconosciuto, ecc.)</li></ul><p>Il componente Angular interpreta <code>response.mode === &#39;retrieval-only&#39;</code> e mostra</p><p>nel turn assistant un summary testuale dei top-K chunk + il banner warning,</p><p>cosi&#39; l&#39;utente vede comunque dei risultati utili.</p><h2>Prerequisiti runtime</h2><ul><li>Server Python <code>rag_server.py</code> attivo su <code>127.0.0.1:8765</code> (vedi skill</li></ul><p> <code>rag-chatbot-creation</code> per il setup NSSM in produzione)</p><ul><li>KonvergenceCore in esecuzione (espone <code>/api/Rag/...</code>)</li><li>Login con cookie <code>k-user</code> di sessione valido</li><li>(Opzionale) <code>ANTHROPIC_API_KEY</code> env var sul server Python per modalita&#39; chat</li></ul><h2>Hot-reload post rebuild RAG</h2><p>Dopo aver rigenerato l&#39;indice/LoRA con la skill <code>rag-rebuild-pipeline</code>, basta</p><p>chiamare:</p><ul><li><code>POST /api/Rag/Reload</code> (via WuicRagService.reload())</li><li>oppure restartare il servizio Python</li></ul><p>per ricaricare il nuovo indice senza downtime applicativo.</p><h2>Test</h2><p>I test del service e del componente sono in:</p><ul><li><code>projects/wuic-framework-lib/src/lib/service/wuic-rag.service.spec.ts</code> (14 test)</li><li><code>projects/wuic-framework-lib/src/lib/component/rag-chatbot/rag-chatbot.component.spec.ts</code> (18 test)</li></ul><p>Eseguibili con <code>npm run test:unit:wuic-lib</code> (vitest, runner di default del lib</p><p>post-migrazione karma-&gt;vitest).</p><h2>Riferimenti</h2><ul><li>Skill creazione: <code>skills/rag-chatbot-creation/SKILL.md</code></li><li>Skill rebuild RAG: <code>skills/rag-rebuild-pipeline/SKILL.md</code></li><li>Server Python: <code>c:/src/Wuic/codebase_embeddings/rag_server.py</code></li><li>Bridge C#: <code>c:/src/Wuic/KonvergenceCore/Controllers/RagController.cs</code></li><li>Service Angular: <code>projects/wuic-framework-lib/src/lib/service/wuic-rag.service.ts</code></li><li>Componente: <code>projects/wuic-framework-lib/src/lib/component/rag-chatbot/rag-chatbot.component.ts</code></li><li>Demo page: <code>c:/src/Wuic/WuicTest/wwwroot/src/app/component/rag-chatbot-demo-page/</code></li></ul>",
67633
- "codeSamples": []
67662
+ "html": "<h1>RAG Chatbot</h1><p>Componente Angular <code>&lt;wuic-rag-chatbot&gt;</code> che permette di interrogare il codebase</p><p>WUIC in linguaggio naturale, con due modalita&#39; operative: **retrieval pure**</p><p>(top-K snippet del codice) e **RAG + LLM** (risposta generata da Claude usando</p><p>i top-K come contesto). Degrada automaticamente in retrieval-only se la API</p><p>key Claude non e&#39; configurata sul server.</p><h2>Architettura</h2><p>Stack a 3 layer, tutti gia&#39; deployati nel progetto:</p><ul><li>**Layer 1** — Server Python FastAPI <code>rag_server.py</code> su <code>127.0.0.1:8765</code>,</li></ul><p> carica al boot l&#39;indice ibrido BM25 + bge-m3 + LoRA cross-encoder Phase C</p><p> da <code>c:/src/Wuic/codebase_embeddings/</code>.</p><ul><li>**Layer 2** — Bridge C# <code>RagController</code> in KonvergenceCore (<code>/api/Rag/Query</code>,</li></ul><p> <code>/api/Rag/Chat</code>, <code>/api/Rag/Health</code>, <code>/api/Rag/Reload</code>), proxy autenticato</p><p> via cookie <code>k-user</code>.</p><ul><li>**Layer 3** — Componente Angular standalone <code>&lt;wuic-rag-chatbot&gt;</code> esportato</li></ul><p> da <code>wuic-framework-lib</code>.</p><p>Vedi anche la skill operativa <code>skills/rag-chatbot-creation/SKILL.md</code> per il</p><p>playbook end-to-end di creazione/manutenzione del componente, e</p><p><code>skills/rag-rebuild-pipeline/SKILL.md</code> per il rebuild dell&#39;indice/LoRA.</p><h2>Modalita&#39;</h2><p>| <code>mode</code> input | Comportamento |</p><p>|---|---|</p><p>| <code>auto</code> (default) | Usa <code>chat</code> se il backend espone Claude API key, altrimenti <code>retrieval</code> |</p><p>| <code>chat</code> | Forza RAG + LLM. Se la API key manca, il backend ritorna <code>mode=retrieval-only</code> con warning visibile |</p><p>| <code>retrieval</code> | Forza retrieval-only, salta la chiamata LLM (utile per ridurre costi) |</p><h2>Inputs</h2><p>| Input | Tipo | Default | Descrizione |</p><p>|---|---|---|---|</p><p>| <code>title</code> | string | <code>&#39;Assistente codebase WUIC&#39;</code> | Etichetta header |</p><p>| <code>mode</code> | <code>&#39;auto&#39; \\| &#39;chat&#39; \\| &#39;retrieval&#39;</code> | <code>&#39;auto&#39;</code> | Modalita&#39; operativa |</p><p>| <code>topK</code> | number | <code>5</code> | Numero di chunk da retrieve dal RAG |</p><p>| <code>showSources</code> | boolean | <code>true</code> | Mostra/nasconde i source chip nei messaggi assistant |</p><p>| <code>maxHistory</code> | number | <code>20</code> | Numero massimo di turn mantenuti in memoria |</p><p>| <code>placeholder</code> | string | <code>&#39;Chiedi qualcosa...&#39;</code> | Placeholder dell&#39;input |</p><p>| <code>model</code> | string | <code>&#39;claude-haiku-4-5-20251001&#39;</code> | Modello Claude per la modalita&#39; chat |</p><p>| <code>chatHeight</code> | string | <code>&#39;420px&#39;</code> | Altezza fissa area chat |</p><p>| <code>showClearButton</code> | boolean | <code>true</code> | Mostra bottone &quot;Svuota cronologia&quot; |</p><h2>Outputs</h2><p>| Output | Payload | Descrizione |</p><p>|---|---|---|</p><p>| <code>resultSelected</code> | <code>RagSource</code> | Click su un source chip; il componente tenta anche un deep-link <code>vscode://file/...</code> |</p><p>| <code>errorOccurred</code> | <code>{message, details?}</code> | Errori HTTP non recuperabili |</p><p>| <code>turnAdded</code> | <code>RagChatbotTurn</code> | Emette dopo ogni turn (user o assistant) aggiunto alla history |</p><h2>Esempio d&#39;uso</h2><p>Standalone import nel componente parent:</p><ul><li>selector HTML: <code>&lt;wuic-rag-chatbot mode=&quot;auto&quot; [topK]=&quot;5&quot; (resultSelected)=&quot;onSrc($event)&quot;&gt;&lt;/wuic-rag-chatbot&gt;</code></li><li>import TypeScript: <code>import { WuicRagChatbotComponent, RagSource } from &#39;wuic-framework-lib&#39;;</code></li><li>aggiungere <code>WuicRagChatbotComponent</code> agli <code>imports</code> del componente standalone parent.</li></ul><p>Per una pagina demo completa con aside debug e gestione eventi, vedi</p><p><code>WuicTest/wwwroot/src/app/component/rag-chatbot-demo-page/</code>.</p><h2>Auth</h2><p>Tutte le chiamate HTTP partono con <code>withCredentials: true</code> e il bridge C#</p><p>applica gli stessi check di autenticazione degli altri controller WUIC</p><p>(cookie di sessione <code>k-user</code>, regola 10 di AGENTS). Mai esporre il server</p><p>Python <code>127.0.0.1:8765</code> direttamente al browser: deve sempre essere proxiato</p><p>dal C#.</p><h2>Service <code>WuicRagService</code></h2><p>API tipizzata sopra <code>RagController</code>, esportata da <code>wuic-framework-lib</code>.</p><p>Tre metodi principali:</p><ul><li><code>query(text, {topK, useLora}) -&gt; Observable&lt;RagQueryResponse&gt;</code></li><li><code>chat(text, history, {topK, model}) -&gt; Observable&lt;RagChatResponse&gt;</code></li><li><code>health() -&gt; Observable&lt;RagHealthResponse&gt;</code></li><li><code>reload() -&gt; Observable&lt;{status, ...}&gt;</code> (post rebuild RAG)</li></ul><p>Varianti <code>*Async</code> ritornano <code>Promise</code> via <code>firstValueFrom()</code>.</p><p>Tutte le interfacce <code>RagSource</code>, <code>RagQueryResponse</code>, <code>RagChatResponse</code>,</p><p><code>RagHealthResponse</code>, <code>RagChatTurn</code> sono esportate.</p><h2>Modello Claude</h2><p>Default: <code>claude-haiku-4-5-20251001</code> (veloce, italiano nativo, ~$0.001 per</p><p>query da 5 chunk). Override possibile via input <code>[model]</code> del componente</p><p>oppure passando <code>options.model</code> al metodo <code>chat()</code> del service.</p><p>System prompt usato server-side:</p><p>&gt; Sei un assistente esperto del codebase WUIC. Rispondi alla domanda dell&#39;utente</p><p>&gt; usando ESCLUSIVAMENTE il contesto fornito. Se la risposta non e&#39; nel contesto,</p><p>&gt; rispondi &#39;Non ho trovato informazioni sufficienti nel codebase per rispondere.&#39;</p><p>&gt; Cita sempre i file rilevanti tra parentesi quadre nel formato</p><p>&gt; <code>[file.ext::SimboloOpzionale]</code>. Rispondi in italiano salvo richiesta esplicita</p><p>&gt; di un&#39;altra lingua. Non inventare API o nomi di metodi: se non sono nel</p><p>&gt; contesto, dillo esplicitamente.</p><h2>Fallback automatico</h2><p>Quando il backend rileva una di queste condizioni, il response include</p><p><code>mode: &#39;retrieval-only&#39;</code> + <code>warning</code> + <code>sources</code>:</p><ul><li><code>ANTHROPIC_API_KEY</code> non settata sul server Python</li><li>chiamata Claude fallita (errore HTTP, rate limit, modello sconosciuto, ecc.)</li></ul><p>Il componente Angular interpreta <code>response.mode === &#39;retrieval-only&#39;</code> e mostra</p><p>nel turn assistant un summary testuale dei top-K chunk + il banner warning,</p><p>cosi&#39; l&#39;utente vede comunque dei risultati utili.</p><h2>Prerequisiti runtime</h2><ul><li>Server Python <code>rag_server.py</code> attivo su <code>127.0.0.1:8765</code> (vedi skill</li></ul><p> <code>rag-chatbot-creation</code> per il setup NSSM in produzione)</p><ul><li>KonvergenceCore in esecuzione (espone <code>/api/Rag/...</code>)</li><li>Login con cookie <code>k-user</code> di sessione valido</li><li>(Opzionale) <code>ANTHROPIC_API_KEY</code> env var sul server Python per modalita&#39; chat</li></ul><h2>Avvio (primo utilizzo)</h2><p>Se accedendo alla route <code>rag-chatbot</code> dal menu vedi il banner</p><p>**&quot;Server RAG non raggiungibile&quot;** con stato **RAG offline**, significa che il</p><p>server Python non e&#39; in ascolto.</p><p>**Prerequisiti:** Python 3.12 (<code>winget install Python.Python.3.12</code>)</p><h3>Setup e avvio con <code>rag-setup.ps1</code></h3><p>Lo script <code>rag-setup.ps1</code> automatizza la creazione del venv e l&#39;installazione</p><p>delle dipendenze. Funziona sia dal repository sorgente che da un pacchetto</p><p>ZIP di deploy (i file RAG sono inclusi in entrambi).</p><p>Snippet 1:</p><p>Il cold start richiede ~13 secondi (caricamento indice + LoRA). Una volta</p><p>che il log mostra <code>Uvicorn running on http://127.0.0.1:8765</code>, ricarica la</p><p>pagina nel browser: il banner scompare e il chatbot passa in modalita&#39;</p><p>operativa.</p><p>Per produzione (Windows service persistente) vedi la skill</p><p><code>skills/rag-chatbot-deploy/SKILL.md</code>.</p><h2>Hot-reload post rebuild RAG</h2><p>Dopo aver rigenerato l&#39;indice/LoRA con la skill <code>rag-rebuild-pipeline</code>, basta</p><p>chiamare:</p><ul><li><code>POST /api/Rag/Reload</code> (via WuicRagService.reload())</li><li>oppure restartare il servizio Python</li></ul><p>per ricaricare il nuovo indice senza downtime applicativo.</p><h2>Test</h2><p>I test del service e del componente sono in:</p><ul><li><code>projects/wuic-framework-lib/src/lib/service/wuic-rag.service.spec.ts</code> (14 test)</li><li><code>projects/wuic-framework-lib/src/lib/component/rag-chatbot/rag-chatbot.component.spec.ts</code> (18 test)</li></ul><p>Eseguibili con <code>npm run test:unit:wuic-lib</code> (vitest, runner di default del lib</p><p>post-migrazione karma-&gt;vitest).</p><h2>Riferimenti</h2><ul><li>Skill creazione: <code>skills/rag-chatbot-creation/SKILL.md</code></li><li>Skill rebuild RAG: <code>skills/rag-rebuild-pipeline/SKILL.md</code></li><li>Server Python: <code>c:/src/Wuic/codebase_embeddings/rag_server.py</code></li><li>Bridge C#: <code>c:/src/Wuic/KonvergenceCore/Controllers/RagController.cs</code></li><li>Service Angular: <code>projects/wuic-framework-lib/src/lib/service/wuic-rag.service.ts</code></li><li>Componente: <code>projects/wuic-framework-lib/src/lib/component/rag-chatbot/rag-chatbot.component.ts</code></li><li>Demo page: <code>c:/src/Wuic/WuicTest/wwwroot/src/app/component/rag-chatbot-demo-page/</code></li></ul>",
67663
+ "codeSamples": [
67664
+ {
67665
+ "id": "code_1",
67666
+ "title": "Snippet 1",
67667
+ "language": "powershell",
67668
+ "code": "# Setup (una sola volta) — crea venv, installa torch + dipendenze\npwsh scripts/rag-setup.ps1\n\n# Per GPU CUDA (opzionale, piu' veloce)\npwsh scripts/rag-setup.ps1 -CudaVersion 12.1\n\n# Avvio server\npwsh scripts/rag-setup.ps1 -Start\n\n# Avvio con API key Anthropic (abilita chat LLM)\npwsh scripts/rag-setup.ps1 -Start -AnthropicApiKey \"sk-ant-...\""
67669
+ }
67670
+ ]
67634
67671
  }
67635
67672
  ],
67636
67673
  "images": []
@@ -72032,7 +72069,7 @@ const frameworkDocsContent = {
72032
72069
  {
72033
72070
  "id": "overview",
72034
72071
  "title": "Overview",
72035
- "html": "<h1>Scheduler</h1><p>Vue calendrier pour la planification d&#39;activites et la timeline avec binding pilote par les metadata.</p><h2>Cas d&#39;utilisation</h2><ul><li>Planification de tours de service.</li><li>Agenda d&#39;interventions.</li><li>Timeline d&#39;evenements metier.</li></ul><h2>Dependances</h2><ul><li>Champs date/heure corrects dans les metadata.</li><li>Configurations de l&#39;archetype scheduler.</li></ul><h2>md_props_bag: archetypes.scheduler</h2><p>Snippet 1:</p><ul><li><code>advancedFilter</code> : lorsque <code>true</code>, affiche la <code>wuic-filter-bar</code> pour l&#39;archetype <code>scheduler</code> (au niveau data-repeater).</li><li><code>fromField</code> : champ date/heure de debut de l&#39;evenement.</li><li><code>toField</code> : champ date/heure de fin de l&#39;evenement.</li><li><code>titleField</code> : champ texte du titre de l&#39;evenement.</li><li><code>itemTemplateString</code> : template personnalise du bloc evenement.</li><li><code>titleFunction</code> : callback JS pour composer le titre dynamique.</li></ul><h3>Contexte du template (<code>itemTemplateString</code>)</h3><p>Les inputs suivants sont disponibles dans le template personnalise :</p><ul><li><code>record</code> : alias de l&#39;enregistrement de l&#39;evenement courant.</li><li><code>rowData</code> : alias de l&#39;enregistrement de l&#39;evenement courant.</li><li><code>metaInfo</code> : metadonnees table/colonnes de la datasource.</li><li><code>datasource</code> : reference au composant datasource associe.</li></ul><p>Contexte runtime utilise par le framework :</p><p>Snippet 2:</p><h2>Evenements et subscriptions (host)</h2><p>Evenements disponibles sur <code>wuic-scheduler-list</code> :</p><ul><li><code>onSchedulerDateClick</code> : relay <code>full-calendar dateClick</code>.</li><li><code>onSchedulerEventClick</code> : relay <code>full-calendar eventClick</code>.</li><li><code>onSchedulerEventDrop</code> : relay <code>full-calendar eventDrop</code>.</li><li><code>onSchedulerEventResize</code> : relay <code>full-calendar eventResize</code>.</li><li><code>onSchedulerDatesSet</code> : relay <code>full-calendar datesSet</code>.</li><li><code>onSchedulerDataBound</code> : emis lorsque le wrapper termine le binding des evenements depuis la datasource.</li><li><code>onSchedulerEventSync</code> : emis apres une synchronisation reussie suite a un drag/drop/resize d&#39;evenement.</li></ul><p>Exemple template :</p><p>Snippet 3:</p><p>Exemple subscribe (ViewChild) :</p><p>Snippet 4:</p>",
72072
+ "html": "<h1>Scheduler</h1><p>Vue calendrier pour la planification d&#39;activites et timeline avec binding metadata-driven.</p><h2>Cas d&#39;utilisation</h2><ul><li>Planification de tours.</li><li>Agenda d&#39;interventions.</li><li>Timeline d&#39;evenements metier.</li></ul><h2>Dependances</h2><ul><li>Champs date/heure corrects dans les metadata.</li><li>Configurations archetype scheduler.</li></ul><h2>md_props_bag: archetypes.scheduler</h2><p>Snippet 1:</p><ul><li><code>advancedFilter</code> : lorsque <code>true</code>, affiche la <code>wuic-filter-bar</code> pour l&#39;archetype <code>scheduler</code> (au niveau data-repeater).</li><li><code>fromField</code> : champ date/heure de debut de l&#39;evenement.</li><li><code>toField</code> : champ date/heure de fin de l&#39;evenement.</li><li><code>titleField</code> : champ texte du titre de l&#39;evenement.</li><li><code>itemTemplateString</code> : template personnalise du bloc evenement.</li><li><code>titleFunction</code> : callback JS pour composer un titre dynamique.</li></ul><h3>Contexte du template (<code>itemTemplateString</code>)</h3><p>Les inputs suivants sont disponibles dans le template personnalise :</p><ul><li><code>record</code> : alias de l&#39;enregistrement evenement courant.</li><li><code>rowData</code> : alias de l&#39;enregistrement evenement courant.</li><li><code>metaInfo</code> : metadonnees table/colonnes de la datasource.</li><li><code>datasource</code> : reference au composant datasource associe.</li></ul><p>Contexte runtime utilise par le framework :</p><p>Snippet 2:</p><h2>Evenements et subscriptions (host)</h2><p>Evenements disponibles sur <code>wuic-scheduler-list</code> :</p><ul><li><code>onSchedulerDateClick</code> : relay <code>full-calendar dateClick</code>.</li><li><code>onSchedulerEventClick</code> : relay <code>full-calendar eventClick</code>.</li><li><code>onSchedulerEventDrop</code> : relay <code>full-calendar eventDrop</code>.</li><li><code>onSchedulerEventResize</code> : relay <code>full-calendar eventResize</code>.</li><li><code>onSchedulerDatesSet</code> : relay <code>full-calendar datesSet</code>.</li><li><code>onSchedulerDataBound</code> : emis lorsque le wrapper termine le binding des evenements depuis la datasource.</li><li><code>onSchedulerEventSync</code> : emis apres une synchronisation reussie lors d&#39;un drag/drop/redimensionnement d&#39;evenement.</li></ul><p>Exemple template :</p><p>Snippet 3:</p><p>Exemple subscribe (ViewChild) :</p><p>Snippet 4:</p>",
72036
72073
  "codeSamples": [
72037
72074
  {
72038
72075
  "id": "code_1",
@@ -72050,7 +72087,7 @@ const frameworkDocsContent = {
72050
72087
  "id": "code_3",
72051
72088
  "title": "Snippet 3",
72052
72089
  "language": "html",
72053
- "code": "<wuic-scheduler-list\n [hardcodedDatasource]=\"citiesDs\"\n (onSchedulerDateClick)=\"handleDateClick($event)\"\n (onSchedulerEventClick)=\"handleEventClick($event)\"\n (onSchedulerEventDrop)=\"handleEventDrop($event)\"\n (onSchedulerEventResize)=\"handleEventResize($event)\"\n (onSchedulerDatesSet)=\"handleDatesSet($event)\"\n (onSchedulerDataBound)=\"handleSchedulerDataBound($event)\"\n (onSchedulerEventSync)=\"handleSchedulerEventSync($event)\">\n</wuic-scheduler-list>"
72090
+ "code": "<wuic-scheduler-list\n [hardcodedDatasource]=\"citiesDs\"\n (onSchedulerDateClick)=\"handleDateClick()\"\n (onSchedulerEventClick)=\"handleEventClick()\"\n (onSchedulerEventDrop)=\"handleEventDrop()\"\n (onSchedulerEventResize)=\"handleEventResize()\"\n (onSchedulerDatesSet)=\"handleDatesSet()\"\n (onSchedulerDataBound)=\"handleSchedulerDataBound()\"\n (onSchedulerEventSync)=\"handleSchedulerEventSync()\">\n</wuic-scheduler-list>"
72054
72091
  },
72055
72092
  {
72056
72093
  "id": "code_4",
@@ -72149,7 +72186,7 @@ const frameworkDocsContent = {
72149
72186
  "toc": [
72150
72187
  {
72151
72188
  "id": "sec_1",
72152
- "title": "Reference de capture d'ecran (manuel utilisateur)"
72189
+ "title": "Screenshot reference (manuel utilisateur)"
72153
72190
  },
72154
72191
  {
72155
72192
  "id": "sec_2",
@@ -72172,7 +72209,7 @@ const frameworkDocsContent = {
72172
72209
  {
72173
72210
  "id": "overview",
72174
72211
  "title": "Overview",
72175
- "html": "<h1>Tree</h1><p>Archetype pour les representations hierarchiques de donnees.</p><h2>Reference de capture d&#39;ecran (manuel utilisateur)</h2><ul><li><code>manual__tree__01.png</code> : exemple de rendu d&#39;une route tree avec des noeuds parent/enfant depliables.</li></ul><h2>Quand l&#39;utiliser</h2><ul><li>Classifications arborescentes</li><li>Structures parent/enfant</li><li>Navigation par noeuds depliables</li></ul><h2>Notes operationnelles</h2><ul><li>Configuration via <code>archetypes.tree</code></li><li>Supporte les champs parent/label/icone/feuille</li></ul><h2>md_props_bag: archetypes.tree</h2><p>Snippet 1:</p><ul><li><code>advancedFilter</code> : lorsque <code>true</code>, affiche la <code>wuic-filter-bar</code> pour l&#39;archetype <code>tree</code> (au niveau data-repeater).</li><li><code>parentField</code> : champ de relation parent/enfant.</li><li><code>labelField</code> : champ texte du libelle du noeud.</li><li><code>iconField</code> : champ icone du noeud.</li><li><code>leafField</code> : champ booleen indiquant un noeud feuille.</li><li><code>labelFunction</code> : callback JS pour un libelle dynamique.</li><li><code>itemTemplateString</code> : template personnalise du rendu du noeud.</li></ul><h3>Contexte du template (<code>itemTemplateString</code>)</h3><p>Les inputs suivants sont disponibles dans le template personnalise :</p><ul><li><code>record</code> : alias de l&#39;enregistrement du noeud courant.</li><li><code>rowData</code> : alias de l&#39;enregistrement du noeud courant.</li><li><code>metaInfo</code> : metadonnees table/colonnes de la datasource.</li><li><code>datasource</code> : reference au composant datasource associe.</li></ul><p>Contexte runtime utilise par le framework :</p><p>Snippet 2:</p><h2>Evenements et subscriptions (host)</h2><p>Evenements disponibles sur <code>wuic-tree-list</code> :</p><ul><li><code>onTreeDataBound</code> : emis lorsque l&#39;arbre est peuple depuis la datasource.</li><li><code>onTreeNodeExpand</code> : emis avant le chargement lazy des enfants.</li><li><code>onTreeNodeExpanded</code> : emis apres le chargement lazy des enfants.</li><li><code>onTreeNodeSelect</code> : relay <code>p-tree onNodeSelect</code>.</li><li><code>onTreeNodeUnselect</code> : relay <code>p-tree onNodeUnselect</code>.</li><li><code>onTreeNodeCollapse</code> : relay <code>p-tree onNodeCollapse</code>.</li></ul><p>Exemple subscribe :</p><p>Snippet 3:</p>",
72212
+ "html": "<h1>Tree</h1><p>Archetype pour les representations hierarchiques de donnees.</p><h2>Screenshot reference (manuel utilisateur)</h2><ul><li><code>manual__tree__01.png</code> : exemple de rendu d&#39;une route tree avec noeuds parent/enfant depliables.</li></ul><h2>Quand l&#39;utiliser</h2><ul><li>Classifications en arborescence</li><li>Structures parent/enfant</li><li>Navigation par noeuds depliables</li></ul><h2>Notes operationnelles</h2><ul><li>Configuration via <code>archetypes.tree</code></li><li>Supporte les champs parent/label/icon/leaf</li></ul><h2>md_props_bag: archetypes.tree</h2><p>Snippet 1:</p><ul><li><code>advancedFilter</code> : lorsque <code>true</code>, affiche la <code>wuic-filter-bar</code> pour l&#39;archetype <code>tree</code> (au niveau data-repeater).</li><li><code>parentField</code> : champ de relation parent/enfant.</li><li><code>labelField</code> : champ texte du libelle du noeud.</li><li><code>iconField</code> : champ icone du noeud.</li><li><code>leafField</code> : champ booleen indiquant une feuille.</li><li><code>labelFunction</code> : callback JS pour un libelle dynamique.</li><li><code>itemTemplateString</code> : template personnalise de rendu du noeud.</li></ul><h3>Contexte du template (<code>itemTemplateString</code>)</h3><p>Les inputs suivants sont disponibles dans le template personnalise :</p><ul><li><code>record</code> : alias de l&#39;enregistrement du noeud courant.</li><li><code>rowData</code> : alias de l&#39;enregistrement du noeud courant.</li><li><code>metaInfo</code> : metadonnees table/colonnes de la datasource.</li><li><code>datasource</code> : reference au composant datasource associe.</li></ul><p>Contexte runtime utilise par le framework :</p><p>Snippet 2:</p><h2>Evenements et subscriptions (host)</h2><p>Evenements disponibles sur <code>wuic-tree-list</code> :</p><ul><li><code>onTreeDataBound</code> : emis lorsque l&#39;arbre est peuple depuis la datasource.</li><li><code>onTreeNodeExpand</code> : emis avant le chargement lazy des enfants.</li><li><code>onTreeNodeExpanded</code> : emis apres le chargement lazy des enfants.</li><li><code>onTreeNodeSelect</code> : relay <code>p-tree onNodeSelect</code>.</li><li><code>onTreeNodeUnselect</code> : relay <code>p-tree onNodeUnselect</code>.</li><li><code>onTreeNodeCollapse</code> : relay <code>p-tree onNodeCollapse</code>.</li></ul><p>Exemple subscribe :</p><p>Snippet 3:</p>",
72176
72213
  "codeSamples": [
72177
72214
  {
72178
72215
  "id": "code_1",
@@ -73275,11 +73312,11 @@ const frameworkDocsContent = {
73275
73312
  "toc": [
73276
73313
  {
73277
73314
  "id": "sec_1",
73278
- "title": "Perimetre"
73315
+ "title": "Scope"
73279
73316
  },
73280
73317
  {
73281
73318
  "id": "sec_2",
73282
- "title": "Reference de capture d'ecran (Metadata Editor)"
73319
+ "title": "Screenshot Reference (Metadata Editor)"
73283
73320
  },
73284
73321
  {
73285
73322
  "id": "sec_3",
@@ -73287,70 +73324,70 @@ const frameworkDocsContent = {
73287
73324
  },
73288
73325
  {
73289
73326
  "id": "sec_4",
73290
- "title": "Metadata-editor contextuel"
73327
+ "title": "Metadata-editor Contextuel"
73291
73328
  },
73292
73329
  {
73293
73330
  "id": "sec_5",
73294
- "title": "Metadonnees de table (`_metadati__tabelle`)"
73331
+ "title": "Metadonnees Table (`_metadati__tabelle`)"
73295
73332
  },
73296
73333
  {
73297
73334
  "id": "sec_6",
73298
- "title": "Clonage profond avec relatedRoutes (cloneDefinition)"
73335
+ "title": "Clone Profond Avec relatedRoutes (cloneDefinition)"
73299
73336
  },
73300
73337
  {
73301
73338
  "id": "sec_7",
73302
- "title": "Parametres dynamiques de route (parameters + customizationCallback)"
73339
+ "title": "Parametres Dynamiques de Route (parameters + customizationCallback)"
73303
73340
  },
73304
73341
  {
73305
73342
  "id": "sec_8",
73306
- "title": "Lookup assiste dans le metadata-editor"
73343
+ "title": "Lookup Assiste dans le Metadata-editor"
73307
73344
  },
73308
73345
  {
73309
73346
  "id": "sec_9",
73310
- "title": "Metadonnees de colonne (`_metadati__colonne`)"
73347
+ "title": "Metadonnees Colonne (`_metadati__colonne`)"
73311
73348
  },
73312
73349
  {
73313
73350
  "id": "sec_10",
73314
- "title": "Menu Metadata (`_metadati__menu`)"
73351
+ "title": "Metadonnees Menu (`_metadati__menu`)"
73315
73352
  },
73316
73353
  {
73317
73354
  "id": "sec_11",
73318
- "title": "Actions personnalisees de table (`_Metadati_Custom_Actions_Tabelle`)"
73355
+ "title": "Actions Personnalisees Table (`_Metadati_Custom_Actions_Tabelle`)"
73319
73356
  },
73320
73357
  {
73321
73358
  "id": "sec_12",
73322
- "title": "Autorisations de table (`_Metadati_Utenti_Autorizzazioni_Tabelle`)"
73359
+ "title": "Autorisations Table (`_Metadati_Utenti_Autorizzazioni_Tabelle`)"
73323
73360
  },
73324
73361
  {
73325
73362
  "id": "sec_13",
73326
- "title": "Autorisations de colonne (`_Metadati_Utenti_Autorizzazioni_Colonne`)"
73363
+ "title": "Autorisations Colonne (`_Metadati_Utenti_Autorizzazioni_Colonne`)"
73327
73364
  },
73328
73365
  {
73329
73366
  "id": "sec_14",
73330
- "title": "Styles de table (`_Metadati_UI_Stili_Tabelle`)"
73367
+ "title": "Styles Table (`_Metadati_UI_Stili_Tabelle`)"
73331
73368
  },
73332
73369
  {
73333
73370
  "id": "sec_15",
73334
- "title": "Styles de colonne (`_Metadati_UI_Stili_Colonne`)"
73371
+ "title": "Styles Colonne (`_Metadati_UI_Stili_Colonne`)"
73335
73372
  },
73336
73373
  {
73337
73374
  "id": "sec_16",
73338
- "title": "Groupes de conditions / Elements / Actions"
73375
+ "title": "Condition Groups / Items / Actions"
73339
73376
  },
73340
73377
  {
73341
73378
  "id": "sec_17",
73342
- "title": "Effets transversaux Client/Serveur"
73379
+ "title": "Effets Transversaux Client/Serveur"
73343
73380
  },
73344
73381
  {
73345
73382
  "id": "sec_18",
73346
- "title": "Checklist de modification manuelle des metadata en DB"
73383
+ "title": "Checklist de Modification Manuelle des Metadata sur la DB"
73347
73384
  }
73348
73385
  ],
73349
73386
  "sections": [
73350
73387
  {
73351
73388
  "id": "overview",
73352
73389
  "title": "Overview",
73353
- "html": "<h1>Metadata</h1><p>Guide operationnel des metadonnees du framework avec focus sur les effets applicatifs cote client et cote serveur.</p><h2>Perimetre</h2><ul><li>Types couverts : table, colonne, menu, actions personnalisees, autorisations table/colonne, styles table/colonne, groupes de conditions.</li><li>Origine UI : formulaires ouverts depuis le <code>metadata-editor</code> (menu <code>Metadonnees</code> et <code>Metadonnees correlees</code>).</li><li>Transport runtime : endpoint <code>MetaService.*</code> via AsmxProxy.</li></ul><h2>Reference de capture d&#39;ecran (Metadata Editor)</h2><ul><li><code>metadata-editor-table</code> : formulaire metadata de table.</li><li><code>metadata-editor-columns</code> : formulaire metadata de colonne (insertion/edition).</li><li><code>metadata-editor-custom-actions</code> : formulaire des actions personnalisees de table.</li><li><code>metadata-editor-auth-table</code> : formulaire des autorisations de table.</li><li><code>metadata-editor-auth-column</code> : formulaire des autorisations de colonne.</li><li><code>metadata-editor-styles-table</code> : formulaire des styles de table.</li><li><code>metadata-editor-styles-column</code> : formulaire des styles de colonne.</li><li><code>metadata-editor-condition-groups</code> : formulaire des groupes de conditions.</li><li><code>metadata-menu-management</code> : liste de gestion du menu metadata.</li></ul><h2>Flux Runtime</h2><ul><li><code>MetaService.getTableMetadata</code> : charge la table + colonnes + relations metadata.</li><li><code>MetaService.getFlatRecordData</code> : utilise les metadata pour composer requete, filtres, tri et pagination.</li><li><code>MetaService.invalidateMetadataRuntime</code> : invalide le cache metadata apres des modifications structurelles.</li></ul><h2>Metadata-editor contextuel</h2><p>Le metadata-editor contextuel permet d&#39;ouvrir et de modifier rapidement les metadonnees directement depuis le contexte operationnel (grille/formulaire/action en cours), sans avoir a naviguer manuellement entre toutes les routes techniques du menu metadata.</p><ul><li>Objectif : reduire les etapes pour les interventions ciblees sur table, colonne et configurations associees.</li><li>Avantage pratique : le focus reste sur l&#39;entite en cours d&#39;utilisation, avec un acces rapide aux options les plus frequentes.</li><li>Utilisation conseillee : maintenance incrementale pendant les tests fonctionnels et le tuning UI/runtime.</li></ul><h3>Ecran de reference</h3><ul><li><code>manual__metadata_context_editor__01.png</code> : ouverture de l&#39;editeur contextuel et acces rapide aux sections metadata.</li><li><code>manual__metadata_context_editor__02.png</code> : detail operationnel du flux contextuel avec modification guidee.</li></ul><h2>Metadonnees de table (<code>_metadati__tabelle</code>)</h2><h3>Routage et stockage</h3><ul><li><code>md_route_name</code> : route logique de la datasource. Client : construit l&#39;URL/hash route et le binding datasource. Serveur : lookup metadata/table et generation de requetes.</li><li><code>md_nome_tabella</code> : nom de la table/vue physique. Client : transparent dans l&#39;UI. Serveur : cible SQL principale.</li><li><code>md_schema_name</code> : schema DB. Client : aucun impact direct. Serveur : qualifie l&#39;objet SQL.</li><li><code>md_conn_name</code> : nom de connexion metadata. Client : aucun impact direct. Serveur : selection de la connexion (ex. DataSQLConnection).</li><li><code>md_db_name</code> : base de donnees cible. Client : aucun impact direct. Serveur : routage requete/scaffolding.</li></ul><h3>Operativite CRUD et UI</h3><ul><li><code>md_editable</code> : active l&#39;edition des enregistrements. Client : boutons/modale d&#39;edition. Serveur : gate logique update.</li><li><code>md_insertable</code> : active l&#39;insertion d&#39;enregistrements. Client : bouton ajouter/formulaire d&#39;insertion. Serveur : gate logique insert.</li><li><code>md_deletable</code> : active la suppression d&#39;enregistrements. Client : commande supprimer visible/utilisable. Serveur : gate logique delete.</li><li><code>md_detail_action</code> : active la vue detail. Client : action detail dans la grille. Serveur : aucun effet SQL direct.</li><li><code>md_clonable</code> : active le clonage. Client : bouton clone. Serveur : logique de clonage + eventuelle cloneDefinition.</li><li><code>md_inline_edit</code> : edition inline dans la grille. Client : editeur dans la cellule/ligne. Serveur : meme pipeline sync/update.</li><li><code>md_edit_popup</code> : edition en popup. Client : choix UX modal vs inline. Serveur : inchange.</li></ul><h3>Requete, filtres, pagination</h3><ul><li><code>md_server_side_operations</code> : delegue tri/filtre/pagination au serveur. Client : envoie <code>FilterInfo</code>, <code>SortInfo</code>, <code>PageInfo</code>. Serveur : compose la requete dynamique.</li><li><code>md_pageable</code> : active la pagination. Client : paginateur actif. Serveur : applique limit/offset ou politique cursor.</li><li><code>md_pagesize</code> : taille de page par defaut. Client : valeur initiale du paginateur. Serveur : <code>TOP/OFFSET</code> ou batch cursor.</li><li><code>md_sortable</code> : active le tri dans l&#39;UI. Client : en-tetes triables. Serveur : ORDER BY uniquement si demande/autorise.</li><li><code>md_default_filter</code> : filtre initial. Client : pre-charge le filtre. Serveur : fusionne dans le WHERE.</li><li><code>md_disabilita_filtri</code> : desactive le panneau de filtres. Client : masque la barre de filtres. Serveur : reduit les filtres runtime disponibles.</li><li><code>md_show_record_count</code> : demande le total d&#39;enregistrements. Client : page X sur Y. Serveur : COUNT(*) (ou politique alternative via props bag).</li></ul><h3>Template et rendu</h3><ul><li><code>md_gridview_template</code> : template de rendu de la liste. Client : surcharge la mise en page de la grille. Serveur : inchange.</li><li><code>md_rowTemplate</code> : template de ligne. Client : rendu de ligne personnalise. Serveur : inchange.</li><li><code>md_filter_template</code> : template de la zone de filtres. Client : UX de filtres personnalisee. Serveur : inchange.</li><li><code>md_detail_template</code> : template de detail. Client : rendu du detail. Serveur : inchange.</li><li><code>md_edit_template</code> : template d&#39;edition. Client : rendu du formulaire d&#39;edition. Serveur : inchange.</li><li><code>md_ui_grid_conditional_template_condition</code> : condition de template alternatif. Client : classe/template conditionnel. Serveur : inchange.</li></ul><h3>Securite et audit</h3><ul><li><code>md_grant_by_default</code> : visibilite par defaut de la route. Client : influence l&#39;acces UI combine avec l&#39;auth. Serveur : fallback d&#39;autorisation.</li><li><code>md_record_restriction_key_user_field_list</code> : champ(s) pour la restriction d&#39;enregistrements. Client : donnees utilisateur dans le payload de filtre. Serveur : applique les restrictions par utilisateur/role.</li><li><code>md_user_id_field_name</code> : champ utilisateur proprietaire. Client : aucun effet direct. Serveur : filtre de propriete.</li><li><code>md_logging_enable</code> : logging actif. Client : inchange. Serveur : remplit les champs d&#39;audit.</li><li><code>md_logging_*_field_name</code> : mapping des champs d&#39;audit. Client : invisible sauf colonnes exposees. Serveur : valorisation automatique.</li><li><code>md_has_logic_delete</code> : suppression logique. Client : meme UX de suppression. Serveur : update du flag au lieu de suppression physique.</li></ul><h3><code>md_props_bag</code> (JSON supplementaire)</h3><ul><li><code>endpoint</code> : surcharge de la source (odata/webservice/meta). Client : le data-provider utilise un endpoint custom. Serveur : change le chemin I/O.</li><li><code>parameters</code> : parametres dynamiques de requete. Client : mapping depuis filtres/route/contexte utilisateur. Serveur : recoit les parametres resolus.</li><li><code>archetypes.*</code> : options specifiques a l&#39;archetype (<code>list</code>, <code>map</code>, <code>scheduler</code>, <code>tree</code>, <code>spreadsheet</code>, <code>carousel</code>, <code>chart</code>, <code>form</code>). Client : rendu/comportement specifiques. Serveur : inchange.</li><li><code>groupInfo</code> : regroupement client/serveur. Client : UI de groupes et en-tetes agreges. Serveur : requete group by si demande.</li><li><code>aggregates</code> : definitions d&#39;agregats. Client : pied de page/KPI. Serveur : select agregee.</li><li><code>changeTracking</code> : active le suivi des modifications client. Client : etat dirty/indices de pending. Serveur : inchange.</li><li><code>client_side_crud</code> : force le CRUD cote client. Client : buffering/modele local. Serveur : sync batch ou differee.</li><li><code>queryOptimization.enabled</code> : active la politique d&#39;optimisation de requete. Client : adapte le paginateur/gestion du total. Serveur : branche requete optimisee.</li><li><code>queryOptimization.countPolicy</code> : <code>exact | skipWhenPaged | never | cursor</code>. Client : gestion du total de pages/precedent-suivant. Serveur : strategie count/cursor.</li><li><code>queryOptimization.sqlServerHint</code> : <code>none | recompile</code>. Client : aucun impact. Serveur : hint SQL (<code>OPTION (RECOMPILE)</code> lorsque demande).</li></ul><h2>Clonage profond avec relatedRoutes (cloneDefinition)</h2><ul><li>Extrait inline : <code>md_props_bag.cloneDefinition.relatedRoutes: [{&quot;relatedRoute&quot;:&quot;orders_rows&quot;,&quot;relatedIdField&quot;:&quot;order_id&quot;}]</code>.</li><li>Runtime client : lorsque <code>md_clonable = true</code>, le clonage passe egalement les routes correlees a <code>dataSrv.clone(...)</code>.</li><li>Runtime serveur : <code>MetaService.CloneRecord</code> recoit <code>relatedRouteToClone</code> et peut cloner le parent + les enfants en un seul flux.</li><li>Utilisation typique : commandes + lignes de commande, en-tetes + details, wizard master/detail.</li></ul><h2>Parametres dynamiques de route (parameters + customizationCallback)</h2><ul><li>Extrait inline : <code>md_props_bag.parameters: [{&quot;Name&quot;:&quot;lang&quot;,&quot;Type&quot;:&quot;string&quot;,&quot;enabled&quot;:true,&quot;value&quot;:&quot;{{currentUser.lingua.id}}&quot;,&quot;customizationCallback&quot;:&quot;param.mc_show_in_filters=true;&quot;}]</code>.</li><li>Runtime client : les <code>parameters</code> sont convertis en <code>parameterInfo</code> (champs de filtre runtime) avec visibilite/editabilite guidee par le parametre.</li><li>Runtime serveur : les valeurs resolues entrent dans le pipeline de route (<code>getFlatRecordData</code>) avec <code>filterInfo/sortInfo/pageInfo</code>.</li><li>Note pratique : <code>customizationCallback</code> permet d&#39;adapter le comportement du champ parametre sans hardcode frontend.</li></ul><h2>Lookup assiste dans le metadata-editor</h2><ul><li>Flux inline conseille : <code>suggestLookup2 -&gt; suggestLookupDefaultFilter -&gt; getLookupListByRoute/getSeletClauseByLookupHierarchy</code>.</li><li>Runtime client : l&#39;editeur contextuel remplit automatiquement les principaux <code>mc_ui_lookup_*</code> et propose des filtres/coherence hierarchique.</li><li>Runtime serveur : les suggestions s&#39;appuient sur les endpoints <code>MetaService.*</code> pour les routes lookup et les clauses select.</li><li>Pour le detail du widget lookup, voir <a href=\"#/framework-docs/field-widget-lookup\">Widget Lookup</a> ; pour le code contextuel lookup/TS, voir <a href=\"#/framework-docs/field-widget-code-editor\">Widget Code Editor</a>.</li><li>Pour le scenario de notifications pilotees par les metadata, voir egalement <a href=\"#/framework-docs/notifications\">Notifications</a> (noeud <code>md_props_bag.notifications.triggerRules</code>).</li></ul><h2>Metadonnees de colonne (<code>_metadati__colonne</code>)</h2><h3>Identite et presentation</h3><ul><li><code>mc_nome_colonna</code> : nom logique du champ. Client : binding du champ dans l&#39;editeur/grille/filtre. Serveur : mapping select/update du champ.</li><li><code>mc_real_column_name</code> : nom physique DB. Client : normalement transparent. Serveur : mapping SQL reel.</li><li><code>mc_display_string_in_view</code> : libelle en liste. Client : en-tete de colonne. Serveur : aucun impact direct.</li><li><code>mc_display_string_in_edit</code> : libelle en formulaire. Client : label de l&#39;editeur. Serveur : aucun impact direct.</li><li><code>mc_ordine</code> : ordre d&#39;affichage. Client : ordre des champs/colonnes. Serveur : tri des metadata.</li><li><code>mc_ui_column_type</code> : type d&#39;editeur (<code>text</code>, <code>number_*</code>, <code>date</code>, <code>datetime</code>, <code>lookupByID</code>, <code>upload</code>, <code>button</code>, etc.). Client : selection du widget editeur/vue. Serveur : semantique de parsing/filtres.</li></ul><h3>Visibilite et comportement</h3><ul><li><code>mc_hide_in_list</code> : masque dans la grille. Client : colonne non rendue. Serveur : peut rester dans la requete si necessaire.</li><li><code>mc_hide_in_edit</code> : masque dans le formulaire d&#39;edition. Client : champ non editable via le formulaire. Serveur : update possible via callback.</li><li><code>mc_hide_in_detail</code> : masque dans le detail. Client : invisible dans le detail. Serveur : inchange.</li><li><code>mc_hide_in_export</code> : exclut de l&#39;export. Client : export sans le champ. Serveur : select d&#39;export filtree.</li><li><code>mc_hide_in_service</code> : exclut des services exposes. Client : inchange. Serveur : serialisation API reduite.</li><li><code>mc_show_in_filters</code> : affiche le filtre UI. Client : le champ apparait dans la barre de filtres. Serveur : active les criteres sur la colonne.</li><li><code>mc_disable_sorting</code> : desactive le tri de la colonne. Client : en-tete non triable. Serveur : blocage ORDER BY sur le champ.</li></ul><h3>Validation et valeurs par defaut</h3><ul><li><code>mc_default_value</code> : valeur par defaut statique. Client : pre-remplissage a l&#39;insertion. Serveur : fallback en l&#39;absence de valeur.</li><li><code>mc_default_value_callback</code> : valeur par defaut dynamique. Client : execute le callback a runtime. Serveur : aucun effet direct.</li><li><code>mc_validation_required</code> : obligatoire. Client : erreur avant la sauvegarde. Serveur : validation supplementaire si prevue.</li><li><code>mc_validation_type</code> : type de validation (<code>email</code>, <code>url</code>, ...). Client : regles standard de validation. Serveur : non obligatoire, depend de l&#39;endpoint.</li><li><code>mc_validation_pattern</code> : regex personnalisee. Client : controle de pattern. Serveur : optionnel.</li><li><code>mc_validation_custom_callback</code> : callback personnalise. Client : logique de validation custom. Serveur : inchange.</li></ul><h3>Lookup et relations</h3><ul><li><code>mc_ui_lookup_entity_name</code> : route metadata lookup. Client : datasource du lookup. Serveur : join/expand du lookup lorsque demande.</li><li><code>mc_ui_lookup_dataValueField</code> : champ id du lookup. Client : binding de la valeur. Serveur : filtre/relation id.</li><li><code>mc_ui_lookup_dataTextField</code> : champ description du lookup. Client : texte de la combo/grille. Serveur : select du texte lookup.</li><li><code>mc_ui_lookup_filter</code> : filtre lookup de base. Client : restreint les options de la combo. Serveur : WHERE sur la route lookup.</li><li><code>mc_serverside_operations</code> : operations lookup cote serveur. Client : recherche paginee. Serveur : pagination/filtre a la demande du lookup.</li><li><code>mc_ui_pagesize</code> : taille de page du lookup. Client : taille de page de la combo lookup. Serveur : limite de la requete lookup.</li><li><code>mc_logic_allow_navigation</code> : active le lien depuis la cellule vers la route associee. Client : ancre cliquable. Serveur : inchange.</li></ul><h3>Logique personnalisee et performance</h3><ul><li><code>mc_suggest_value_callback</code> : callback de suggestion. Client : alimentation de la suggestion/aide a la saisie. Serveur : execute dans le pipeline de callbacks runtime.</li><li><code>mc_selection_changing_custom_function</code> : hook pre-changement. Client : intercepte le changement de valeur avant le commit. Serveur : inchange.</li><li><code>mc_selection_changed_custom_function</code> : hook post-changement. Client : reactions en cascade cote formulaire. Serveur : inchange.</li><li><code>mc_logic_converter_read_callback</code> : convertisseur en lecture. Client : formatage/normalisation de la valeur. Serveur : inchange.</li><li><code>mc_logic_converter_write_callback</code> : convertisseur en ecriture. Client : transformation avant la sauvegarde. Serveur : payload normalise.</li><li><code>mc_custom_select_clause</code> : clause select personnalisee. Client : necessite une gestion de rendu coherente. Serveur : modifie la select SQL.</li><li><code>mc_custom_join</code> : jointure personnalisee. Client : etend les donnees disponibles. Serveur : modifie le FROM/JOIN de la requete.</li><li><code>mc_props_bag</code> : configuration supplementaire du champ. Client : editeurs avances/schema json/suggestion. Serveur : support de regles custom.</li></ul><h3>Upload et bouton</h3><ul><li><code>isImageUpload</code>, <code>isDBUpload</code>, <code>isMultipleUpload</code> : strategie d&#39;upload. Client : widget d&#39;upload avec apercu/multi-fichiers. Serveur : persistance blob/chemin.</li><li><code>allowed_file_types</code>, <code>max_file_size</code> : limites d&#39;upload. Client : validation du fichier avant l&#39;upload. Serveur : validation finale.</li><li><code>customUploadHandlerPath</code> : handler d&#39;upload personnalise. Client : endpoint personnalise. Serveur : pipeline d&#39;upload dediee.</li><li><code>mc_button_caption</code> : libelle du bouton de type colonne personnalisee. Client : libelle du bouton d&#39;action. Serveur : inchange.</li><li><code>mc_button_action</code> : callback d&#39;action du bouton. Client : execution de l&#39;action au clic. Serveur : eventuel appel API personnalise.</li><li><code>mc_button_visibility_condition</code> : visibilite conditionnelle du bouton. Client : afficher/masquer l&#39;action par enregistrement. Serveur : inchange.</li></ul><h2>Menu Metadata (<code>_metadati__menu</code>)</h2><h3>Proprietes principales</h3><ul><li><code>mm_id</code> : id de la voix de menu. Client : identite tree/menu et ordonnancement DnD. Serveur : PK update/reorder/nest/remove.</li><li><code>mm_parent_id</code> : menu parent. Client : structure hierarchique. Serveur : imbrication persistee.</li><li><code>mm_ordine</code> : ordre visuel. Client : ordre de menu deterministe. Serveur : update de reordonnancement.</li><li><code>mm_display_string_menu</code> : libelle UI. Client : texte de la voix de menu. Serveur : metadonnee de presentation.</li><li><code>mm_uri_menu</code> : route/url associee. Client : navigation hash route. Serveur : aucun SQL direct.</li><li><code>md_id</code> : lien vers la route metadata. Client : relation menu-&gt;fonctionnalite. Serveur : utilise aussi dans les controles d&#39;autorisation de route.</li><li><code>mm_is_visible_by_default</code> : visibilite par defaut. Client : voix visible sauf restrictions. Serveur : fallback si aucune regle specifique.</li><li><code>mm_icon</code> : icone du menu. Client : rendu de l&#39;icone. Serveur : metadonnee de presentation.</li><li><code>mm_props_bag</code> : extensions JSON du menu. Client : comportement custom du menu. Serveur : optionnel.</li></ul><h2>Actions personnalisees de table (<code>_Metadati_Custom_Actions_Tabelle</code>)</h2><ul><li><code>Id</code> : id de l&#39;action. Client : cle du menu/liste d&#39;actions. Serveur : PK.</li><li><code>md_id</code> : table cible. Client : actions liees a la route courante. Serveur : filtre par route metadata.</li><li><code>button_caption</code> : texte du bouton. Client : libelle de l&#39;action dans la barre d&#39;outils/ligne. Serveur : metadonnee de presentation.</li><li><code>button_template</code> : template du bouton. Client : rendu d&#39;action personnalise. Serveur : inchange.</li><li><code>button_image</code> : icone/image du bouton. Client : iconographie UI. Serveur : inchange.</li><li><code>tooltip</code> : indication de l&#39;action. Client : aide au survol. Serveur : inchange.</li><li><code>action_callback</code> : callback d&#39;execution. Client : invoque au clic. Serveur : peut declencher des appels endpoint.</li><li><code>disable_callback</code> : callback d&#39;activation. Client : activation/desactivation dynamique. Serveur : inchange.</li><li><code>md_action_type</code> : type d&#39;action (barre d&#39;outils/ligne/contexte). Client : positionnement de l&#39;action. Serveur : mapping fonctionnel.</li><li><code>ordine</code> : priorite visuelle. Client : ordonnancement des actions. Serveur : persistance de l&#39;ordre.</li></ul><h2>Autorisations de table (<code>_Metadati_Utenti_Autorizzazioni_Tabelle</code>)</h2><ul><li><code>muat_id</code> : id de la regle. Client : selection/edition de la regle. Serveur : PK.</li><li><code>md_id</code> : table cible. Client : perimetre de la route courante. Serveur : filtre des regles.</li><li><code>ruolo_id</code> : role cible. Client : regle par role. Serveur : application par role.</li><li><code>utente_id</code> : utilisateur cible. Client : surcharge par utilisateur. Serveur : application par utilisateur.</li><li><code>muat_view</code> : permission de visualisation. Client : route/menu masques si refuse. Serveur : blocage de l&#39;acces aux donnees.</li><li><code>muat_edit</code> : permission de modification. Client : boutons d&#39;edition desactives/masques. Serveur : blocage update.</li><li><code>muat_insert</code> : permission d&#39;insertion. Client : masquage ajout/nouveau. Serveur : blocage insert.</li><li><code>muat_delete</code> : permission de suppression. Client : masquage suppression. Serveur : blocage delete.</li><li><code>muat_override_record_restriction</code> : surcharge de la restriction d&#39;enregistrements. Client : peut modifier la visibilite du jeu de donnees. Serveur : contournement des restrictions au niveau enregistrement.</li></ul><h2>Autorisations de colonne (<code>_Metadati_Utenti_Autorizzazioni_Colonne</code>)</h2><ul><li><code>muac_id</code> : id de la regle. Client : selection/edition de la regle. Serveur : PK.</li><li><code>mc_id</code> : colonne cible. Client : perimetre au niveau champ. Serveur : filtre des permissions du champ.</li><li><code>ruolo_id</code> : role cible. Client : politique par role. Serveur : application au niveau champ.</li><li><code>utente_id</code> : utilisateur cible. Client : surcharge utilisateur. Serveur : application utilisateur.</li><li><code>muac_editable</code> : editabilite du champ. Client : champ en lecture seule/desactive. Serveur : renforcement de l&#39;update du champ.</li><li><code>muac_validation_required</code> : surcharge d&#39;obligatoire. Client : validation contextuelle du champ. Serveur : coherence semantique des donnees.</li></ul><h2>Styles de table (<code>_Metadati_UI_Stili_Tabelle</code>)</h2><ul><li><code>must_id</code> : id de la regle de style. Client : suivi de la regle. Serveur : PK.</li><li><code>md_id</code> : table cible. Client : perimetre de la grille de la route. Serveur : filtre des regles par route.</li><li><code>must_attribute_name</code> : classe CSS a appliquer. Client : classe ajoutee a la ligne. Serveur : metadonnee.</li><li><code>must_attribute_value</code> : callback/condition JS retournant un booleen. Client : decide si la classe doit etre appliquee. Serveur : metadonnee (pas d&#39;evaluation SQL).</li></ul><h2>Styles de colonne (<code>_Metadati_UI_Stili_Colonne</code>)</h2><ul><li><code>musc_id</code> : id de la regle de style de colonne. Client : suivi de la regle. Serveur : PK.</li><li><code>musc_attribute_name</code> : classe/attribut de style. Client : style de cellule/colonne. Serveur : metadonnee.</li><li><code>musc_attribute_value</code> : valeur statique. Client : application directe du style/attribut. Serveur : metadonnee.</li><li><code>musc_attribute_value_callback</code> : callback dynamique. Client : style conditionnel par enregistrement/cellule. Serveur : metadonnee.</li></ul><h2>Groupes de conditions / Elements / Actions</h2><ul><li><code>CG_Id</code> : groupe de conditions. Client : cluster logique de regles. Serveur : structure de metadonnees conditionnelles.</li><li><code>CI_Id</code> : condition individuelle. Client : evaluation runtime de la formule/operateur. Serveur : utilisee dans les politiques metier.</li><li><code>CAG_Id</code> : groupe d&#39;actions conditionnelles. Client : lot d&#39;actions liees a des conditions. Serveur : orchestration de l&#39;execution.</li><li><code>CAI_Id</code> : element d&#39;action. Client : declencheur d&#39;actions runtime. Serveur : peut influencer l&#39;update/le flux cote API.</li><li><code>FK_*</code> : cles de relation entre group/item/action. Client : navigation coherente dans l&#39;editeur. Serveur : integrite relationnelle des metadata.</li></ul><h2>Effets transversaux Client/Serveur</h2><ul><li>Client :</li><li>rendu dynamique des composants (<code>list</code>, <code>form</code>, <code>map</code>, <code>chart</code>, etc.) depuis les metadata.</li><li>activations/desactivations UI coherentes avec les autorisations.</li><li>validations et callbacks personnalises en edition/filtre/grille.</li></ul><ul><li>Serveur :</li><li>composition de requetes dynamiques (<code>SELECT</code>, <code>WHERE</code>, <code>ORDER</code>, pagination/cursor).</li><li>application des permissions route/table/colonne.</li><li>audit et restrictions au niveau enregistrement.</li></ul><h2>Checklist de modification manuelle des metadata en DB</h2><ul><li>mettre a jour l&#39;enregistrement metadata souhaite (table/colonne/relations).</li><li>invalider le runtime metadata (<code>MetaService.invalidateMetadataRuntime</code>).</li><li>verifier la nouvelle <code>projectMetadataVersion</code>.</li><li>recharger la route et verifier les effets sur l&#39;UI + les requetes backend.</li></ul>",
73390
+ "html": "<h1>Metadata</h1><p>Guide operationnel des metadonnees du framework avec focus sur les effets applicatifs cote client et cote serveur.</p><h2>Scope</h2><ul><li>Types couverts : table, colonne, menu, actions personnalisees, autorisations table/colonne, styles table/colonne, condition groups.</li><li>Origine UI : formulaires ouverts depuis le <code>metadata-editor</code> (menus <code>Metadati</code> et <code>Metadati correlati</code>).</li><li>Transport runtime : endpoints <code>MetaService.*</code> via AsmxProxy.</li></ul><h2>Screenshot Reference (Metadata Editor)</h2><ul><li><code>metadata-editor-table</code> : formulaire metadata table.</li><li><code>metadata-editor-columns</code> : formulaire metadata colonne (insert/edit).</li><li><code>metadata-editor-custom-actions</code> : formulaire actions personnalisees table.</li><li><code>metadata-editor-auth-table</code> : formulaire autorisations table.</li><li><code>metadata-editor-auth-column</code> : formulaire autorisations colonne.</li><li><code>metadata-editor-styles-table</code> : formulaire styles table.</li><li><code>metadata-editor-styles-column</code> : formulaire styles colonne.</li><li><code>metadata-editor-condition-groups</code> : formulaire condition groups.</li><li><code>metadata-menu-management</code> : liste de gestion du menu metadata.</li></ul><h2>Flux Runtime</h2><ul><li><code>MetaService.getTableMetadata</code> : charge table + colonnes + relations metadata.</li><li><code>MetaService.getFlatRecordData</code> : utilise les metadata pour composer les requetes, filtres, tri et pagination.</li><li><code>MetaService.invalidateMetadataRuntime</code> : invalide le cache metadata apres des modifications structurelles.</li></ul><h2>Metadata-editor Contextuel</h2><p>Le metadata-editor contextuel permet d&#39;ouvrir et de modifier rapidement les metadonnees directement depuis le contexte operationnel (grille/formulaire/action en cours), sans devoir naviguer manuellement entre toutes les routes techniques du menu metadonnees.</p><ul><li>Objectif : reduire les etapes pour des interventions ciblees sur table, colonne et configurations associees.</li><li>Avantage pratique : le focus reste sur l&#39;entite en cours d&#39;utilisation, avec acces rapide aux options les plus frequentes.</li><li>Usage recommande : maintenance incrementale pendant les tests fonctionnels et le tuning UI/runtime.</li></ul><h3>Ecrans de reference</h3><ul><li><code>manual__metadata_context_editor__01.png</code> : ouverture de l&#39;editeur contextuel et acces rapide aux sections metadata.</li><li><code>manual__metadata_context_editor__02.png</code> : detail operationnel du flux contextuel avec modification guidee.</li></ul><h2>Metadonnees Table (<code>_metadati__tabelle</code>)</h2><h3>Routage et stockage</h3><ul><li><code>md_route_name</code> : route logique de la datasource. Client : construit l&#39;URL/hash route et le binding datasource. Serveur : lookup metadata/table et generation de requetes.</li><li><code>md_nome_tabella</code> : nom physique de la table/vue. Client : transparent dans l&#39;UI. Serveur : cible SQL principale.</li><li><code>md_schema_name</code> : schema DB. Client : aucun impact direct. Serveur : qualifie l&#39;objet SQL.</li><li><code>md_conn_name</code> : nom de connexion metadata. Client : aucun impact direct. Serveur : selection de la connexion (ex. DataSQLConnection).</li><li><code>md_db_name</code> : base de donnees cible. Client : aucun impact direct. Serveur : routage requetes/scaffolding.</li></ul><h3>Operativite CRUD et UI</h3><ul><li><code>md_editable</code> : active l&#39;edition d&#39;enregistrement. Client : boutons/modale d&#39;edition. Serveur : porte logique update.</li><li><code>md_insertable</code> : active l&#39;insertion d&#39;enregistrement. Client : bouton ajouter/formulaire insert. Serveur : porte logique insert.</li><li><code>md_deletable</code> : active la suppression d&#39;enregistrement. Client : commande supprimer visible/utilisable. Serveur : porte logique delete.</li><li><code>md_detail_action</code> : active la vue detail. Client : action detail dans la grille. Serveur : aucun effet SQL direct.</li><li><code>md_clonable</code> : active le clonage. Client : bouton clone. Serveur : logique de clonage + eventuelle cloneDefinition.</li><li><code>md_inline_edit</code> : edition inline dans la grille. Client : editeur cellule/ligne. Serveur : meme pipeline sync/update.</li><li><code>md_edit_popup</code> : edition en popup. Client : choix UX modale vs inline. Serveur : inchange.</li></ul><h3>Requetes, filtres, pagination</h3><ul><li><code>md_server_side_operations</code> : delegue le tri/filtre/pagination au serveur. Client : envoie <code>FilterInfo</code>, <code>SortInfo</code>, <code>PageInfo</code>. Serveur : compose la requete dynamique.</li><li><code>md_pageable</code> : active la pagination. Client : pager actif. Serveur : applique limit/offset ou politique de curseur.</li><li><code>md_pagesize</code> : taille de page par defaut. Client : valeur initiale du pager. Serveur : <code>TOP/OFFSET</code> ou curseur batch.</li><li><code>md_sortable</code> : active le tri dans l&#39;UI. Client : en-tetes triables. Serveur : ORDER BY uniquement si demande/autorise.</li><li><code>md_default_filter</code> : filtre initial. Client : pre-charge le filtre. Serveur : fusionne dans le WHERE.</li><li><code>md_disabilita_filtri</code> : desactive le panneau de filtres. Client : masque la barre de filtres. Serveur : reduit les filtres runtime disponibles.</li><li><code>md_show_record_count</code> : demande le total d&#39;enregistrements. Client : page X sur Y. Serveur : COUNT(*) (ou politique alternative via props bag).</li></ul><h3>Templates et rendu</h3><ul><li><code>md_gridview_template</code> : template de rendu liste. Client : surcharge du layout de la grille. Serveur : inchange.</li><li><code>md_rowTemplate</code> : template de ligne. Client : rendu de ligne personnalise. Serveur : inchange.</li><li><code>md_filter_template</code> : template de la zone de filtres. Client : UX de filtres personnalisee. Serveur : inchange.</li><li><code>md_detail_template</code> : template de detail. Client : rendu du detail. Serveur : inchange.</li><li><code>md_edit_template</code> : template d&#39;edition. Client : rendu du formulaire d&#39;edition. Serveur : inchange.</li><li><code>md_ui_grid_conditional_template_condition</code> : condition de template alternatif. Client : classe/template conditionnel. Serveur : inchange.</li></ul><h3>Securite et audit</h3><ul><li><code>md_grant_by_default</code> : visibilite par defaut de la route. Client : influence l&#39;acces UI combine avec les autorisations. Serveur : fallback d&#39;autorisation.</li><li><code>md_record_restriction_key_user_field_list</code> : champ(s) pour la restriction d&#39;enregistrement. Client : donnees utilisateur dans le payload de filtre. Serveur : applique les restrictions par utilisateur/role.</li><li><code>md_user_id_field_name</code> : champ utilisateur proprietaire. Client : aucun effet direct. Serveur : filtre de propriete.</li><li><code>md_logging_enable</code> : logging actif. Client : inchange. Serveur : remplit les champs d&#39;audit.</li><li><code>md_logging_*_field_name</code> : mapping des champs d&#39;audit. Client : invisible sauf colonnes exposees. Serveur : valorisation automatique.</li><li><code>md_has_logic_delete</code> : suppression logique. Client : meme UX de suppression. Serveur : mise a jour du flag au lieu de suppression physique.</li></ul><h3><code>md_props_bag</code> (JSON supplementaire)</h3><ul><li><code>endpoint</code> : surcharge de la source (odata/webservice/meta). Client : le data-provider utilise un endpoint personnalise. Serveur : modifie le chemin I/O.</li><li><code>parameters</code> : parametres dynamiques de la requete. Client : mapping depuis les filtres/route/contexte utilisateur. Serveur : recoit les parametres resolus.</li><li><code>archetypes.*</code> : options specifiques a l&#39;archetype (<code>list</code>, <code>map</code>, <code>scheduler</code>, <code>tree</code>, <code>spreadsheet</code>, <code>carousel</code>, <code>chart</code>, <code>form</code>). Client : rendu/comportement specifiques. Serveur : inchange.</li><li><code>groupInfo</code> : groupement client/serveur. Client : UI de groupes et en-tetes agreges. Serveur : requete GROUP BY si demande.</li><li><code>aggregates</code> : definitions d&#39;agregats. Client : pied de page/KPI. Serveur : select agregee.</li><li><code>changeTracking</code> : active le suivi des modifications cote client. Client : etat dirty/en attente. Serveur : inchange.</li><li><code>client_side_crud</code> : force le CRUD cote client. Client : mise en tampon/modele local. Serveur : sync batch ou differee.</li><li><code>queryOptimization.enabled</code> : active la politique d&#39;optimisation des requetes. Client : adapte le pager/gestion des totaux. Serveur : branche requete optimisee.</li><li><code>queryOptimization.countPolicy</code> : <code>exact | skipWhenPaged | never | cursor</code>. Client : gestion total pages/precedent-suivant. Serveur : strategie de comptage/curseur.</li><li><code>queryOptimization.sqlServerHint</code> : <code>none | recompile</code>. Client : aucun impact. Serveur : hint SQL (<code>OPTION (RECOMPILE)</code> quand demande).</li></ul><h2>Clone Profond Avec relatedRoutes (cloneDefinition)</h2><ul><li>Snippet inline : <code>md_props_bag.cloneDefinition.relatedRoutes: [{&quot;relatedRoute&quot;:&quot;orders_rows&quot;,&quot;relatedIdField&quot;:&quot;order_id&quot;}]</code>.</li><li>Runtime client : lorsque <code>md_clonable = true</code>, le clone transmet egalement les routes associees a <code>dataSrv.clone(...)</code>.</li><li>Runtime serveur : <code>MetaService.CloneRecord</code> recoit <code>relatedRouteToClone</code> et peut cloner parent + enfants en un seul flux.</li><li>Usage typique : commandes + lignes de commande, en-tetes + details, wizard master/detail.</li></ul><h2>Parametres Dynamiques de Route (parameters + customizationCallback)</h2><ul><li>Snippet inline : <code>md_props_bag.parameters: [{&quot;Name&quot;:&quot;lang&quot;,&quot;Type&quot;:&quot;string&quot;,&quot;enabled&quot;:true,&quot;value&quot;:&quot;{{currentUser.lingua.id}}&quot;,&quot;customizationCallback&quot;:&quot;param.mc_show_in_filters=true;&quot;}]</code>.</li><li>Runtime client : les <code>parameters</code> sont convertis en <code>parameterInfo</code> (champs de filtre runtime) avec visibilite/editabilite guidees par le parametre.</li><li>Runtime serveur : les valeurs resolues entrent dans le pipeline de la route (<code>getFlatRecordData</code>) avec <code>filterInfo/sortInfo/pageInfo</code>.</li><li>Note pratique : <code>customizationCallback</code> permet d&#39;adapter le comportement du champ parametre sans hardcoding frontend.</li></ul><h2>Lookup Assiste dans le Metadata-editor</h2><ul><li>Flux inline recommande : <code>suggestLookup2 -&gt; suggestLookupDefaultFilter -&gt; getLookupListByRoute/getSeletClauseByLookupHierarchy</code>.</li><li>Runtime client : l&#39;editeur contextuel remplit automatiquement les principaux <code>mc_ui_lookup_*</code> et propose des filtres/coherence hierarchique.</li><li>Runtime serveur : les suggestions s&#39;appuient sur les endpoints <code>MetaService.*</code> pour les routes lookup et les clauses select.</li><li>Pour le detail du widget lookup, voir <a href=\"#/framework-docs/field-widget-lookup\">Widget Lookup</a> ; pour le code contextuel lookup/TS, voir <a href=\"#/framework-docs/field-widget-code-editor\">Widget Code Editor</a>.</li><li>Pour le scenario de notifications metadata-driven, voir aussi <a href=\"#/framework-docs/notifications\">Notifications</a> (noeud <code>md_props_bag.notifications.triggerRules</code>).</li></ul><h2>Metadonnees Colonne (<code>_metadati__colonne</code>)</h2><h3>Identite et presentation</h3><ul><li><code>mc_nome_colonna</code> : nom logique du champ. Client : binding du champ dans editeur/grille/filtre. Serveur : mapping champ select/update.</li><li><code>mc_real_column_name</code> : nom physique DB. Client : normalement transparent. Serveur : mapping SQL reel.</li><li><code>mc_display_string_in_view</code> : libelle en liste. Client : en-tete de colonne. Serveur : aucun impact direct.</li><li><code>mc_display_string_in_edit</code> : libelle en formulaire. Client : label de l&#39;editeur. Serveur : aucun impact direct.</li><li><code>mc_ordine</code> : ordre d&#39;affichage. Client : ordre des champs/colonnes. Serveur : tri des metadonnees.</li><li><code>mc_ui_column_type</code> : type d&#39;editeur (<code>text</code>, <code>number_*</code>, <code>date</code>, <code>datetime</code>, <code>lookupByID</code>, <code>upload</code>, <code>button</code>, etc.). Client : selection du widget editeur/vue. Serveur : semantique parsing/filtres.</li></ul><h3>Visibilite et comportement</h3><ul><li><code>mc_hide_in_list</code> : masque dans la grille. Client : colonne non rendue. Serveur : peut rester dans la requete si necessaire.</li><li><code>mc_hide_in_edit</code> : masque dans le formulaire d&#39;edition. Client : champ non editable via formulaire. Serveur : mise a jour possible via callback.</li><li><code>mc_hide_in_detail</code> : masque dans le detail. Client : invisible dans le detail. Serveur : inchange.</li><li><code>mc_hide_in_export</code> : exclut de l&#39;export. Client : export sans le champ. Serveur : select d&#39;export filtree.</li><li><code>mc_hide_in_service</code> : exclut des services exposes. Client : inchange. Serveur : serialisation API reduite.</li><li><code>mc_show_in_filters</code> : affiche le filtre UI. Client : le champ apparait dans la barre de filtres. Serveur : active les criteres sur la colonne.</li><li><code>mc_disable_sorting</code> : desactive le tri de la colonne. Client : en-tete non triable. Serveur : bloque ORDER BY sur le champ.</li></ul><h3>Validation et valeurs par defaut</h3><ul><li><code>mc_default_value</code> : valeur par defaut statique. Client : pre-remplissage a l&#39;insertion. Serveur : fallback en l&#39;absence de valeur.</li><li><code>mc_default_value_callback</code> : valeur par defaut dynamique. Client : execute le callback au runtime. Serveur : aucun effet direct.</li><li><code>mc_validation_required</code> : caractere obligatoire. Client : erreur avant sauvegarde. Serveur : validation supplementaire si prevue.</li><li><code>mc_validation_type</code> : type de validation (<code>email</code>, <code>url</code>, ...). Client : regles de validation standard. Serveur : non obligatoire, depend de l&#39;endpoint.</li><li><code>mc_validation_pattern</code> : regex personnalisee. Client : controle de pattern. Serveur : optionnel.</li><li><code>mc_validation_custom_callback</code> : callback personnalise. Client : logique de validation personnalisee. Serveur : inchange.</li></ul><h3>Lookup et relations</h3><ul><li><code>mc_ui_lookup_entity_name</code> : route metadata du lookup. Client : datasource du lookup. Serveur : join/expand lookup quand demande.</li><li><code>mc_ui_lookup_dataValueField</code> : champ id du lookup. Client : binding de la valeur. Serveur : filtre/relation id.</li><li><code>mc_ui_lookup_dataTextField</code> : champ description du lookup. Client : texte combo/grille. Serveur : select texte du lookup.</li><li><code>mc_ui_lookup_filter</code> : filtre de base du lookup. Client : restreint les options de la combo. Serveur : WHERE sur la route lookup.</li><li><code>mc_serverside_operations</code> : operations lookup cote serveur. Client : recherche paginee. Serveur : pagination/filtre a la demande du lookup.</li><li><code>mc_ui_pagesize</code> : taille de page du lookup. Client : taille de page de la combo lookup. Serveur : limite de requete du lookup.</li><li><code>mc_logic_allow_navigation</code> : active le lien depuis la cellule vers la route associee. Client : ancre cliquable. Serveur : inchange.</li></ul><h3>Logique personnalisee et performance</h3><ul><li><code>mc_suggest_value_callback</code> : callback de suggestion. Client : remplissage suggest/aide a la saisie. Serveur : execute dans le pipeline de callback runtime.</li><li><code>mc_selection_changing_custom_function</code> : hook pre-changement. Client : intercepte le changement de valeur avant commit. Serveur : inchange.</li><li><code>mc_selection_changed_custom_function</code> : hook post-changement. Client : reactions en cascade cote formulaire. Serveur : inchange.</li><li><code>mc_logic_converter_read_callback</code> : convertisseur en lecture. Client : formatage/normalisation de la valeur. Serveur : inchange.</li><li><code>mc_logic_converter_write_callback</code> : convertisseur en ecriture. Client : transformation avant sauvegarde. Serveur : payload normalise.</li><li><code>mc_custom_select_clause</code> : select personnalise. Client : necessite une gestion de rendu coherente. Serveur : modifie le select SQL.</li><li><code>mc_custom_join</code> : join personnalise. Client : etend les donnees disponibles. Serveur : modifie le FROM/JOIN de la requete.</li><li><code>mc_props_bag</code> : configuration supplementaire du champ. Client : editeurs avances/schema JSON/suggest. Serveur : support de regles personnalisees.</li></ul><h3>Upload et bouton</h3><ul><li><code>isImageUpload</code>, <code>isDBUpload</code>, <code>isMultipleUpload</code> : strategie d&#39;upload. Client : widget upload apercu/multi-fichiers. Serveur : persistance blob/chemin.</li><li><code>allowed_file_types</code>, <code>max_file_size</code> : limites d&#39;upload. Client : validation du fichier avant upload. Serveur : validation finale.</li><li><code>customUploadHandlerPath</code> : handler d&#39;upload personnalise. Client : endpoint personnalise. Serveur : pipeline d&#39;upload dediee.</li><li><code>mc_button_caption</code> : libelle du bouton de type colonne personnalise. Client : libelle du bouton d&#39;action. Serveur : inchange.</li><li><code>mc_button_action</code> : callback d&#39;action du bouton. Client : execution de l&#39;action au clic. Serveur : eventuel appel API personnalise.</li><li><code>mc_button_visibility_condition</code> : visibilite conditionnelle du bouton. Client : afficher/masquer l&#39;action par enregistrement. Serveur : inchange.</li></ul><h2>Metadonnees Menu (<code>_metadati__menu</code>)</h2><h3>Proprietes principales</h3><ul><li><code>mm_id</code> : id de l&#39;element de menu. Client : identite tree/menu et ordonnancement DnD. Serveur : PK update/reorder/nest/remove.</li><li><code>mm_parent_id</code> : menu parent. Client : structure hierarchique. Serveur : imbrication persistee.</li><li><code>mm_ordine</code> : ordre visuel. Client : ordre du menu deterministe. Serveur : mise a jour de l&#39;ordonnancement.</li><li><code>mm_display_string_menu</code> : libelle UI. Client : texte de l&#39;element de menu. Serveur : metadonnee de presentation.</li><li><code>mm_uri_menu</code> : route/url associee. Client : navigation hash route. Serveur : aucun SQL direct.</li><li><code>md_id</code> : lien vers la route metadata. Client : relation menu-&gt;fonctionnalite. Serveur : egalement utilise dans les controles d&#39;autorisation de la route.</li><li><code>mm_is_visible_by_default</code> : visibilite par defaut. Client : element visible sauf restrictions. Serveur : fallback en l&#39;absence de regle specifique.</li><li><code>mm_icon</code> : icone du menu. Client : rendu de l&#39;icone. Serveur : metadonnee de presentation.</li><li><code>mm_props_bag</code> : extensions JSON du menu. Client : comportement personnalise du menu. Serveur : optionnel.</li></ul><h2>Actions Personnalisees Table (<code>_Metadati_Custom_Actions_Tabelle</code>)</h2><ul><li><code>Id</code> : id de l&#39;action. Client : cle menu/liste d&#39;actions. Serveur : PK.</li><li><code>md_id</code> : table cible. Client : actions liees a la route courante. Serveur : filtre par route metadata.</li><li><code>button_caption</code> : texte du bouton. Client : libelle action toolbar/ligne. Serveur : metadonnee de presentation.</li><li><code>button_template</code> : template du bouton. Client : rendu d&#39;action personnalise. Serveur : inchange.</li><li><code>button_image</code> : icone/image du bouton. Client : iconographie UI. Serveur : inchange.</li><li><code>tooltip</code> : indication de l&#39;action. Client : aide au survol. Serveur : inchange.</li><li><code>action_callback</code> : callback d&#39;execution. Client : invoque au clic. Serveur : peut declencher des appels endpoint.</li><li><code>disable_callback</code> : callback d&#39;activation. Client : activation/desactivation dynamique. Serveur : inchange.</li><li><code>md_action_type</code> : type d&#39;action (toolbar/ligne/contexte). Client : positionnement de l&#39;action. Serveur : mapping fonctionnel.</li><li><code>ordine</code> : priorite visuelle. Client : ordonnancement des actions. Serveur : persistance de l&#39;ordre.</li></ul><h2>Autorisations Table (<code>_Metadati_Utenti_Autorizzazioni_Tabelle</code>)</h2><ul><li><code>muat_id</code> : id de la regle. Client : selection/edition de la regle. Serveur : PK.</li><li><code>md_id</code> : table cible. Client : perimetre de la route courante. Serveur : filtre des regles.</li><li><code>ruolo_id</code> : role cible. Client : regle par role. Serveur : application par role.</li><li><code>utente_id</code> : utilisateur cible. Client : surcharge par utilisateur. Serveur : application par utilisateur.</li><li><code>muat_view</code> : permission de visualisation. Client : route/menu masques si refuse. Serveur : blocage d&#39;acces aux donnees.</li><li><code>muat_edit</code> : permission de modification. Client : boutons d&#39;edition desactives/masques. Serveur : blocage update.</li><li><code>muat_insert</code> : permission d&#39;insertion. Client : masquer ajouter/nouveau. Serveur : blocage insert.</li><li><code>muat_delete</code> : permission de suppression. Client : masquer supprimer. Serveur : blocage delete.</li><li><code>muat_override_record_restriction</code> : surcharge de restriction d&#39;enregistrement. Client : peut modifier la visibilite du dataset. Serveur : contourne les restrictions au niveau enregistrement.</li></ul><h2>Autorisations Colonne (<code>_Metadati_Utenti_Autorizzazioni_Colonne</code>)</h2><ul><li><code>muac_id</code> : id de la regle. Client : selection/edition de la regle. Serveur : PK.</li><li><code>mc_id</code> : colonne cible. Client : perimetre au niveau champ. Serveur : filtre des permissions du champ.</li><li><code>ruolo_id</code> : role cible. Client : politique par role. Serveur : application sur le champ.</li><li><code>utente_id</code> : utilisateur cible. Client : surcharge utilisateur. Serveur : application utilisateur.</li><li><code>muac_editable</code> : editabilite du champ. Client : champ en lecture seule/desactive. Serveur : renforcement de la mise a jour du champ.</li><li><code>muac_validation_required</code> : surcharge du caractere obligatoire. Client : validation contextuelle du champ. Serveur : coherence semantique des donnees.</li></ul><h2>Styles Table (<code>_Metadati_UI_Stili_Tabelle</code>)</h2><ul><li><code>must_id</code> : id de la regle de style. Client : suivi de la regle. Serveur : PK.</li><li><code>md_id</code> : table cible. Client : perimetre de la route de la grille. Serveur : filtre des regles de la route.</li><li><code>must_attribute_name</code> : classe CSS a appliquer. Client : classe ajoutee a la ligne. Serveur : metadonnee.</li><li><code>must_attribute_value</code> : callback/condition JS retournant un booleen. Client : decide si appliquer la classe. Serveur : metadonnee (pas d&#39;evaluation SQL).</li></ul><h2>Styles Colonne (<code>_Metadati_UI_Stili_Colonne</code>)</h2><ul><li><code>musc_id</code> : id de la regle de style colonne. Client : suivi de la regle. Serveur : PK.</li><li><code>musc_attribute_name</code> : classe/attribut de style. Client : style cellule/colonne. Serveur : metadonnee.</li><li><code>musc_attribute_value</code> : valeur statique. Client : application directe du style/attribut. Serveur : metadonnee.</li><li><code>musc_attribute_value_callback</code> : callback dynamique. Client : style conditionnel par enregistrement/cellule. Serveur : metadonnee.</li></ul><h2>Condition Groups / Items / Actions</h2><ul><li><code>CG_Id</code> : groupe de conditions. Client : cluster logique de regles. Serveur : structure de metadonnees conditionnelles.</li><li><code>CI_Id</code> : condition individuelle. Client : evaluation runtime formule/operateur. Serveur : utilisee dans les politiques metier.</li><li><code>CAG_Id</code> : groupe d&#39;actions conditionnelles. Client : regroupement d&#39;actions liees aux conditions. Serveur : orchestration d&#39;execution.</li><li><code>CAI_Id</code> : element d&#39;action. Client : declenchement d&#39;actions runtime. Serveur : peut influencer la mise a jour/le flux cote API.</li><li><code>FK_*</code> : cles de relation entre groupe/element/action. Client : navigation coherente dans l&#39;editeur. Serveur : integrite relationnelle des metadonnees.</li></ul><h2>Effets Transversaux Client/Serveur</h2><ul><li>Client :</li><li>rendu dynamique des composants (<code>list</code>, <code>form</code>, <code>map</code>, <code>chart</code>, etc.) depuis les metadonnees.</li><li>activations/desactivations UI coherentes avec les autorisations.</li><li>validations et callbacks personnalises en edition/filtre/grille.</li></ul><ul><li>Serveur :</li><li>composition dynamique des requetes (<code>SELECT</code>, <code>WHERE</code>, <code>ORDER</code>, pagination/curseur).</li><li>application des permissions route/table/colonne.</li><li>audit et restrictions au niveau enregistrement.</li></ul><h2>Checklist de Modification Manuelle des Metadata sur la DB</h2><ul><li>Mettre a jour l&#39;enregistrement metadata souhaite (table/colonne/relations).</li><li>Invalider les metadata runtime (<code>MetaService.invalidateMetadataRuntime</code>).</li><li>Verifier la nouvelle <code>projectMetadataVersion</code>.</li><li>Recharger la route et verifier les effets sur l&#39;UI + les requetes backend.</li></ul>",
73354
73391
  "codeSamples": []
73355
73392
  }
73356
73393
  ],
@@ -74944,7 +74981,7 @@ const frameworkDocsContent = {
74944
74981
  },
74945
74982
  {
74946
74983
  "id": "sec_11",
74947
- "title": "Rechargement a chaud apres reconstruction du RAG"
74984
+ "title": "Hot-reload apres rebuild RAG"
74948
74985
  },
74949
74986
  {
74950
74987
  "id": "sec_12",
@@ -74959,7 +74996,7 @@ const frameworkDocsContent = {
74959
74996
  {
74960
74997
  "id": "overview",
74961
74998
  "title": "Overview",
74962
- "html": "<h1>RAG Chatbot</h1><p>Composant Angular <code>&lt;wuic-rag-chatbot&gt;</code> permettant d&#39;interroger le codebase</p><p>WUIC en langage naturel, avec deux modes operationnels : **retrieval pur**</p><p>(top-K extraits du code) et **RAG + LLM** (reponse generee par Claude en utilisant</p><p>les top-K comme contexte). Se degrade automatiquement en retrieval-only si la cle</p><p>API Claude n&#39;est pas configuree sur le serveur.</p><h2>Architecture</h2><p>Stack a 3 couches, toutes deja deployees dans le projet :</p><ul><li>**Couche 1** Serveur Python FastAPI <code>rag_server.py</code> sur <code>127.0.0.1:8765</code>,</li></ul><p> charge au demarrage l&#39;index hybride BM25 + bge-m3 + LoRA cross-encoder Phase C</p><p> depuis <code>c:/src/Wuic/codebase_embeddings/</code>.</p><ul><li>**Couche 2** Bridge C# <code>RagController</code> dans KonvergenceCore (<code>/api/Rag/Query</code>,</li></ul><p> <code>/api/Rag/Chat</code>, <code>/api/Rag/Health</code>, <code>/api/Rag/Reload</code>), proxy authentifie</p><p> via cookie <code>k-user</code>.</p><ul><li>**Couche 3** Composant Angular standalone <code>&lt;wuic-rag-chatbot&gt;</code> exporte</li></ul><p> depuis <code>wuic-framework-lib</code>.</p><p>Voir egalement la skill operationnelle <code>skills/rag-chatbot-creation/SKILL.md</code> pour le</p><p>playbook end-to-end de creation/maintenance du composant, et</p><p><code>skills/rag-rebuild-pipeline/SKILL.md</code> pour la reconstruction de l&#39;index/LoRA.</p><h2>Modes</h2><p>| Input <code>mode</code> | Comportement |</p><p>|---|---|</p><p>| <code>auto</code> (par defaut) | Utilise <code>chat</code> si le backend expose la cle API Claude, sinon <code>retrieval</code> |</p><p>| <code>chat</code> | Force RAG + LLM. Si la cle API est absente, le backend renvoie <code>mode=retrieval-only</code> avec un avertissement visible |</p><p>| <code>retrieval</code> | Force le retrieval-only, saute l&#39;appel LLM (utile pour reduire les couts) |</p><h2>Inputs</h2><p>| Input | Type | Defaut | Description |</p><p>|---|---|---|---|</p><p>| <code>title</code> | string | <code>&#39;Assistente codebase WUIC&#39;</code> | Libelle de l&#39;en-tete |</p><p>| <code>mode</code> | <code>&#39;auto&#39; \\| &#39;chat&#39; \\| &#39;retrieval&#39;</code> | <code>&#39;auto&#39;</code> | Mode operationnel |</p><p>| <code>topK</code> | number | <code>5</code> | Nombre de chunks a recuperer depuis le RAG |</p><p>| <code>showSources</code> | boolean | <code>true</code> | Affiche/masque les chips de sources dans les messages assistant |</p><p>| <code>maxHistory</code> | number | <code>20</code> | Nombre maximum de tours conserves en memoire |</p><p>| <code>placeholder</code> | string | <code>&#39;Chiedi qualcosa...&#39;</code> | Placeholder de l&#39;input |</p><p>| <code>model</code> | string | <code>&#39;claude-haiku-4-5-20251001&#39;</code> | Modele Claude pour le mode chat |</p><p>| <code>chatHeight</code> | string | <code>&#39;420px&#39;</code> | Hauteur fixe de la zone de chat |</p><p>| <code>showClearButton</code> | boolean | <code>true</code> | Affiche le bouton &quot;Effacer l&#39;historique&quot; |</p><h2>Outputs</h2><p>| Output | Payload | Description |</p><p>|---|---|---|</p><p>| <code>resultSelected</code> | <code>RagSource</code> | Clic sur un chip de source ; le composant tente egalement un deep-link <code>vscode://file/...</code> |</p><p>| <code>errorOccurred</code> | <code>{message, details?}</code> | Erreurs HTTP non recuperables |</p><p>| <code>turnAdded</code> | <code>RagChatbotTurn</code> | Emis apres chaque tour (utilisateur ou assistant) ajoute a l&#39;historique |</p><h2>Exemple d&#39;utilisation</h2><p>Import standalone dans le composant parent :</p><ul><li>selecteur HTML : <code>&lt;wuic-rag-chatbot mode=&quot;auto&quot; [topK]=&quot;5&quot; (resultSelected)=&quot;onSrc($event)&quot;&gt;&lt;/wuic-rag-chatbot&gt;</code></li><li>import TypeScript : <code>import { WuicRagChatbotComponent, RagSource } from &#39;wuic-framework-lib&#39;;</code></li><li>ajouter <code>WuicRagChatbotComponent</code> aux <code>imports</code> du composant standalone parent.</li></ul><p>Pour une page de demonstration complete avec panneau lateral de debug et gestion des evenements, voir</p><p><code>WuicTest/wwwroot/src/app/component/rag-chatbot-demo-page/</code>.</p><h2>Auth</h2><p>Tous les appels HTTP partent avec <code>withCredentials: true</code> et le bridge C#</p><p>applique les memes controles d&#39;authentification que les autres controllers WUIC</p><p>(cookie de session <code>k-user</code>, regle 10 d&#39;AGENTS). Ne jamais exposer le serveur</p><p>Python <code>127.0.0.1:8765</code> directement au navigateur : il doit toujours etre proxifie</p><p>par le C#.</p><h2>Service <code>WuicRagService</code></h2><p>API typee au-dessus de <code>RagController</code>, exportee depuis <code>wuic-framework-lib</code>.</p><p>Trois methodes principales :</p><ul><li><code>query(text, {topK, useLora}) -&gt; Observable&lt;RagQueryResponse&gt;</code></li><li><code>chat(text, history, {topK, model}) -&gt; Observable&lt;RagChatResponse&gt;</code></li><li><code>health() -&gt; Observable&lt;RagHealthResponse&gt;</code></li><li><code>reload() -&gt; Observable&lt;{status, ...}&gt;</code> (apres reconstruction du RAG)</li></ul><p>Les variantes <code>*Async</code> retournent des <code>Promise</code> via <code>firstValueFrom()</code>.</p><p>Toutes les interfaces <code>RagSource</code>, <code>RagQueryResponse</code>, <code>RagChatResponse</code>,</p><p><code>RagHealthResponse</code>, <code>RagChatTurn</code> sont exportees.</p><h2>Modele Claude</h2><p>Par defaut : <code>claude-haiku-4-5-20251001</code> (rapide, italien natif, ~$0.001 par</p><p>requete de 5 chunks). Surcharge possible via l&#39;input <code>[model]</code> du composant</p><p>ou en passant <code>options.model</code> a la methode <code>chat()</code> du service.</p><p>System prompt utilise cote serveur :</p><p>&gt; Sei un assistente esperto del codebase WUIC. Rispondi alla domanda dell&#39;utente</p><p>&gt; usando ESCLUSIVAMENTE il contesto fornito. Se la risposta non e&#39; nel contesto,</p><p>&gt; rispondi &#39;Non ho trovato informazioni sufficienti nel codebase per rispondere.&#39;</p><p>&gt; Cita sempre i file rilevanti tra parentesi quadre nel formato</p><p>&gt; <code>[file.ext::SimboloOpzionale]</code>. Rispondi in italiano salvo richiesta esplicita</p><p>&gt; di un&#39;altra lingua. Non inventare API o nomi di metodi: se non sono nel</p><p>&gt; contesto, dillo esplicitamente.</p><h2>Fallback automatique</h2><p>Lorsque le backend detecte l&#39;une de ces conditions, la reponse inclut</p><p><code>mode: &#39;retrieval-only&#39;</code> + <code>warning</code> + <code>sources</code> :</p><ul><li><code>ANTHROPIC_API_KEY</code> non definie sur le serveur Python</li><li>appel Claude echoue (erreur HTTP, rate limit, modele inconnu, etc.)</li></ul><p>Le composant Angular interprete <code>response.mode === &#39;retrieval-only&#39;</code> et affiche</p><p>dans le tour assistant un resume textuel des top-K chunks + la banniere d&#39;avertissement,</p><p>afin que l&#39;utilisateur voie quand meme des resultats utiles.</p><h2>Prerequis runtime</h2><ul><li>Serveur Python <code>rag_server.py</code> actif sur <code>127.0.0.1:8765</code> (voir la skill</li></ul><p> <code>rag-chatbot-creation</code> pour le setup NSSM en production)</p><ul><li>KonvergenceCore en execution (expose <code>/api/Rag/...</code>)</li><li>Login avec cookie de session <code>k-user</code> valide</li><li>(Optionnel) Variable d&#39;environnement <code>ANTHROPIC_API_KEY</code> sur le serveur Python pour le mode chat</li></ul><h2>Rechargement a chaud apres reconstruction du RAG</h2><p>Apres avoir regenere l&#39;index/LoRA avec la skill <code>rag-rebuild-pipeline</code>, il suffit</p><p>d&#39;appeler :</p><ul><li><code>POST /api/Rag/Reload</code> (via WuicRagService.reload())</li><li>ou redemarrer le service Python</li></ul><p>pour recharger le nouvel index sans interruption de service applicative.</p><h2>Tests</h2><p>Les tests du service et du composant se trouvent dans :</p><ul><li><code>projects/wuic-framework-lib/src/lib/service/wuic-rag.service.spec.ts</code> (14 tests)</li><li><code>projects/wuic-framework-lib/src/lib/component/rag-chatbot/rag-chatbot.component.spec.ts</code> (18 tests)</li></ul><p>Executables avec <code>npm run test:unit:wuic-lib</code> (vitest, runner par defaut de la lib</p><p>apres la migration karma-&gt;vitest).</p><h2>References</h2><ul><li>Skill de creation : <code>skills/rag-chatbot-creation/SKILL.md</code></li><li>Skill de reconstruction du RAG : <code>skills/rag-rebuild-pipeline/SKILL.md</code></li><li>Serveur Python : <code>c:/src/Wuic/codebase_embeddings/rag_server.py</code></li><li>Bridge C# : <code>c:/src/Wuic/KonvergenceCore/Controllers/RagController.cs</code></li><li>Service Angular : <code>projects/wuic-framework-lib/src/lib/service/wuic-rag.service.ts</code></li><li>Composant : <code>projects/wuic-framework-lib/src/lib/component/rag-chatbot/rag-chatbot.component.ts</code></li><li>Page de demonstration : <code>c:/src/Wuic/WuicTest/wwwroot/src/app/component/rag-chatbot-demo-page/</code></li></ul>",
74999
+ "html": "<h1>RAG Chatbot</h1><p>Composant Angular <code>&lt;wuic-rag-chatbot&gt;</code> permettant d&#39;interroger le codebase</p><p>WUIC en langage naturel, avec deux modes operatoires : **retrieval pur**</p><p>(top-K extraits du code) et **RAG + LLM** (reponse generee par Claude utilisant</p><p>les top-K comme contexte). Degrade automatiquement en retrieval-only si la cle</p><p>API Claude n&#39;est pas configuree sur le serveur.</p><h2>Architecture</h2><p>Stack a 3 couches, toutes deja deployees dans le projet :</p><ul><li>**Couche 1** -- Serveur Python FastAPI <code>rag_server.py</code> sur <code>127.0.0.1:8765</code>,</li></ul><p> charge au demarrage l&#39;index hybride BM25 + bge-m3 + LoRA cross-encoder Phase C</p><p> depuis <code>c:/src/Wuic/codebase_embeddings/</code>.</p><ul><li>**Couche 2** -- Bridge C# <code>RagController</code> dans KonvergenceCore (<code>/api/Rag/Query</code>,</li></ul><p> <code>/api/Rag/Chat</code>, <code>/api/Rag/Health</code>, <code>/api/Rag/Reload</code>), proxy authentifie</p><p> via cookie <code>k-user</code>.</p><ul><li>**Couche 3** -- Composant Angular standalone <code>&lt;wuic-rag-chatbot&gt;</code> exporte</li></ul><p> depuis <code>wuic-framework-lib</code>.</p><p>Voir aussi la skill operationnelle <code>skills/rag-chatbot-creation/SKILL.md</code> pour le</p><p>playbook end-to-end de creation/maintenance du composant, et</p><p><code>skills/rag-rebuild-pipeline/SKILL.md</code> pour le rebuild de l&#39;index/LoRA.</p><h2>Modes</h2><p>| Input <code>mode</code> | Comportement |</p><p>|---|---|</p><p>| <code>auto</code> (defaut) | Utilise <code>chat</code> si le backend expose une cle API Claude, sinon <code>retrieval</code> |</p><p>| <code>chat</code> | Force RAG + LLM. Si la cle API est absente, le backend retourne <code>mode=retrieval-only</code> avec un avertissement visible |</p><p>| <code>retrieval</code> | Force retrieval-only, ignore l&#39;appel LLM (utile pour reduire les couts) |</p><h2>Inputs</h2><p>| Input | Type | Defaut | Description |</p><p>|---|---|---|---|</p><p>| <code>title</code> | string | <code>&#39;Assistente codebase WUIC&#39;</code> | Libelle de l&#39;en-tete |</p><p>| <code>mode</code> | <code>&#39;auto&#39; \\| &#39;chat&#39; \\| &#39;retrieval&#39;</code> | <code>&#39;auto&#39;</code> | Mode operatoire |</p><p>| <code>topK</code> | number | <code>5</code> | Nombre de chunks a recuperer depuis le RAG |</p><p>| <code>showSources</code> | boolean | <code>true</code> | Affiche/masque les puces source dans les messages assistant |</p><p>| <code>maxHistory</code> | number | <code>20</code> | Nombre maximum de tours conserves en memoire |</p><p>| <code>placeholder</code> | string | <code>&#39;Chiedi qualcosa...&#39;</code> | Placeholder de l&#39;input |</p><p>| <code>model</code> | string | <code>&#39;claude-haiku-4-5-20251001&#39;</code> | Modele Claude pour le mode chat |</p><p>| <code>chatHeight</code> | string | <code>&#39;420px&#39;</code> | Hauteur fixe de la zone de chat |</p><p>| <code>showClearButton</code> | boolean | <code>true</code> | Affiche le bouton &quot;Vider l&#39;historique&quot; |</p><h2>Outputs</h2><p>| Output | Payload | Description |</p><p>|---|---|---|</p><p>| <code>resultSelected</code> | <code>RagSource</code> | Clic sur une puce source ; le composant tente aussi un deep-link <code>vscode://file/...</code> |</p><p>| <code>errorOccurred</code> | <code>{message, details?}</code> | Erreurs HTTP non recuperables |</p><p>| <code>turnAdded</code> | <code>RagChatbotTurn</code> | Emis apres chaque tour (user ou assistant) ajoute a l&#39;historique |</p><h2>Exemple d&#39;utilisation</h2><p>Import standalone dans le composant parent :</p><ul><li>Selecteur HTML : <code>&lt;wuic-rag-chatbot mode=&quot;auto&quot; [topK]=&quot;5&quot; (resultSelected)=&quot;onSrc($event)&quot;&gt;&lt;/wuic-rag-chatbot&gt;</code></li><li>Import TypeScript : <code>import { WuicRagChatbotComponent, RagSource } from &#39;wuic-framework-lib&#39;;</code></li><li>Ajouter <code>WuicRagChatbotComponent</code> aux <code>imports</code> du composant standalone parent.</li></ul><p>Pour une page de demo complete avec aside de debogage et gestion des evenements, voir</p><p><code>WuicTest/wwwroot/src/app/component/rag-chatbot-demo-page/</code>.</p><h2>Auth</h2><p>Tous les appels HTTP partent avec <code>withCredentials: true</code> et le bridge C#</p><p>applique les memes controles d&#39;authentification que les autres controleurs WUIC</p><p>(cookie de session <code>k-user</code>, regle 10 de AGENTS). Ne jamais exposer le serveur</p><p>Python <code>127.0.0.1:8765</code> directement au navigateur : il doit toujours etre</p><p>proxie par le C#.</p><h2>Service <code>WuicRagService</code></h2><p>API typee au-dessus de <code>RagController</code>, exportee depuis <code>wuic-framework-lib</code>.</p><p>Trois methodes principales :</p><ul><li><code>query(text, {topK, useLora}) -&gt; Observable&lt;RagQueryResponse&gt;</code></li><li><code>chat(text, history, {topK, model}) -&gt; Observable&lt;RagChatResponse&gt;</code></li><li><code>health() -&gt; Observable&lt;RagHealthResponse&gt;</code></li><li><code>reload() -&gt; Observable&lt;{status, ...}&gt;</code> (apres rebuild RAG)</li></ul><p>Les variantes <code>*Async</code> retournent des <code>Promise</code> via <code>firstValueFrom()</code>.</p><p>Toutes les interfaces <code>RagSource</code>, <code>RagQueryResponse</code>, <code>RagChatResponse</code>,</p><p><code>RagHealthResponse</code>, <code>RagChatTurn</code> sont exportees.</p><h2>Modele Claude</h2><p>Defaut : <code>claude-haiku-4-5-20251001</code> (rapide, italien natif, ~$0.001 par</p><p>requete de 5 chunks). Surcharge possible via l&#39;input <code>[model]</code> du composant</p><p>ou en passant <code>options.model</code> a la methode <code>chat()</code> du service.</p><p>Prompt systeme utilise cote serveur :</p><p>&gt; Vous etes un assistant expert du codebase WUIC. Repondez a la question de</p><p>&gt; l&#39;utilisateur en utilisant EXCLUSIVEMENT le contexte fourni. Si la reponse</p><p>&gt; n&#39;est pas dans le contexte, repondez &#39;Je n&#39;ai pas trouve suffisamment</p><p>&gt; d&#39;informations dans le codebase pour repondre.&#39; Citez toujours les fichiers</p><p>&gt; pertinents entre crochets au format <code>[file.ext::SymboleOptional]</code>. Repondez</p><p>&gt; en italien sauf demande explicite d&#39;une autre langue. N&#39;inventez pas d&#39;API</p><p>&gt; ni de noms de methodes : s&#39;ils ne sont pas dans le contexte, dites-le</p><p>&gt; explicitement.</p><h2>Fallback automatique</h2><p>Lorsque le backend detecte l&#39;une de ces conditions, la reponse inclut</p><p><code>mode: &#39;retrieval-only&#39;</code> + <code>warning</code> + <code>sources</code> :</p><ul><li><code>ANTHROPIC_API_KEY</code> non definie sur le serveur Python</li><li>Appel Claude echoue (erreur HTTP, rate limit, modele inconnu, etc.)</li></ul><p>Le composant Angular interprete <code>response.mode === &#39;retrieval-only&#39;</code> et affiche</p><p>dans le tour assistant un resume textuel des top-K chunks + la banniere</p><p>d&#39;avertissement, afin que l&#39;utilisateur voie quand meme des resultats utiles.</p><h2>Prerequis runtime</h2><ul><li>Serveur Python <code>rag_server.py</code> actif sur <code>127.0.0.1:8765</code> (voir skill</li></ul><p> <code>rag-chatbot-creation</code> pour le setup NSSM en production)</p><ul><li>KonvergenceCore en cours d&#39;execution (expose <code>/api/Rag/...</code>)</li><li>Login avec un cookie de session <code>k-user</code> valide</li><li>(Optionnel) Variable d&#39;environnement <code>ANTHROPIC_API_KEY</code> sur le serveur Python pour le mode chat</li></ul><h2>Hot-reload apres rebuild RAG</h2><p>Apres avoir regenere l&#39;index/LoRA avec la skill <code>rag-rebuild-pipeline</code>, il suffit</p><p>d&#39;appeler :</p><ul><li><code>POST /api/Rag/Reload</code> (via WuicRagService.reload())</li><li>ou redemarrer le service Python</li></ul><p>pour recharger le nouvel index sans interruption applicative.</p><h2>Tests</h2><p>Les tests du service et du composant se trouvent dans :</p><ul><li><code>projects/wuic-framework-lib/src/lib/service/wuic-rag.service.spec.ts</code> (14 tests)</li><li><code>projects/wuic-framework-lib/src/lib/component/rag-chatbot/rag-chatbot.component.spec.ts</code> (18 tests)</li></ul><p>Executables avec <code>npm run test:unit:wuic-lib</code> (vitest, runner par defaut de la lib</p><p>apres la migration karma-&gt;vitest).</p><h2>References</h2><ul><li>Skill de creation : <code>skills/rag-chatbot-creation/SKILL.md</code></li><li>Skill rebuild RAG : <code>skills/rag-rebuild-pipeline/SKILL.md</code></li><li>Serveur Python : <code>c:/src/Wuic/codebase_embeddings/rag_server.py</code></li><li>Bridge C# : <code>c:/src/Wuic/KonvergenceCore/Controllers/RagController.cs</code></li><li>Service Angular : <code>projects/wuic-framework-lib/src/lib/service/wuic-rag.service.ts</code></li><li>Composant : <code>projects/wuic-framework-lib/src/lib/component/rag-chatbot/rag-chatbot.component.ts</code></li><li>Page demo : <code>c:/src/Wuic/WuicTest/wwwroot/src/app/component/rag-chatbot-demo-page/</code></li></ul>",
74963
75000
  "codeSamples": []
74964
75001
  }
74965
75002
  ],
@@ -78303,7 +78340,7 @@ const frameworkDocsContent = {
78303
78340
  {
78304
78341
  "id": "overview",
78305
78342
  "title": "Overview",
78306
- "html": "<h1>Notifications</h1><p>Gestion de notificaciones aplicativas, eventos y feedback al usuario.</p><h2>Screenshot reference (manual de usuario)</h2><ul><li>: estado UI de notificaciones en la subseccion .</li></ul><h2>Arquitectura funcional</h2><p>Descripcion:</p><p>la funcionalidad recopila eventos aplicativos, los persiste en y los propaga en tiempo real a la UI.</p><ul><li>Storage: tabla metadata DB .</li><li>Write path: endpoint que usa .</li><li>Read path: endpoint .</li><li>Realtime path: WebSocket con snapshot push.</li><li>UI: componente (popover con lista de notificaciones, badge de no leidos, marcar como leido y limpiar leidos).</li></ul><h2>Tabla</h2><p>Campos principales gestionados por el framework:</p><ul><li>uid=197609(lollo) gid=197121 groups=197121: identificador de la notificacion.</li><li>: usuario destinatario.</li><li>: tipo (ej. , , , ...).</li><li>: texto mostrado en la UI.</li><li>: destino al hacer clic (route/path de navegacion).</li><li>: payload libre para detalle aplicativo.</li><li>, : estado de lectura.</li><li>, : timeline y soft-delete.</li><li>, : trazabilidad del origen.</li></ul><h2>Trigger / automatizaciones que rellenan</h2><p>Descripcion:</p><p>el patron recomendado es centralizar la insercion en , invocada desde triggers o jobs.</p><ul><li>El framework proporciona la stored procedure (script: ).</li><li>Los triggers SQL aplicativos o jobs de backend pueden rellenar de dos formas:</li><li>invocando (enfoque recomendado);</li><li>insertando directamente en la tabla respetando los campos minimos (, , ).</li><li>Patron tipico: trigger sobre tabla de negocio () que, al verificarse una condicion, crea una notificacion para uno o mas usuarios.</li></ul><p>Snippet (ejemplo de payload enqueue):</p><p>-</p><p>-</p><p>-</p><p>-</p><p>-</p><p>-</p><h2>Trigger Metadata-Driven desde md_props_bag.notifications.triggerRules</h2><p>Las reglas pueden centralizarse en el metadata de tabla () y traducirse en triggers SQL en runtime.</p><ul><li>Estructura de regla: , , , , , , , , .</li><li>Pipeline: metadata route -&gt; generacion de trigger SQL en servidor -&gt; -&gt; websocket bell ().</li><li>Snippet inline (insert): .</li><li>Snippet inline (update): .</li><li>Snippet inline (delete): .</li><li>Resultado: reglas de notificaciones versionadas en metadata, sin duplicacion de logica en triggers manuales individuales.</li><li>Referencia de contexto metadata: ver <a href=\"#/framework-docs/metadata-integration\">Metadata</a> (seccion y nodos avanzados).</li></ul><h2>SqlDependency / Polling</h2><ul><li>Backend watcher: registrado como hosted service.</li><li>Modalidades configurables:</li><li>(por defecto): registra dependency sobre la query de no leidos de y envia snapshot cuando cambia el resultado.</li><li>: fallback con polling periodico cada .</li><li>Push service: envia snapshot solo a los usuarios con socket conectados.</li></ul><h2>UI y comportamiento del usuario</h2><ul><li>muestra un badge con el conteo de no leidos.</li><li>Apertura del panel: listado de notificaciones con fecha/hora y tipo.</li><li>Clic en notificacion:</li><li>marcar como leida via ;</li><li>navegacion a la route leida desde .</li><li>Accion : (soft-delete de las leidas).</li></ul><h2>Progreso de export/import</h2><ul><li>Las notificaciones de progreso contienen y route de referencia en el .</li><li>Clic en notificacion de progreso:</li></ul><p> - reabre el dialogo de progreso vinculado al mismo ;</p><p> - no fuerza redireccion si ya se esta en la route actual.</p><ul><li>Las notificaciones resumidas (fin de import/export) usan para navegar a la route de la grilla.</li></ul><h2>AppSettings relevantes</h2><p>Descripcion:</p><p>estas claves habilitan el subsistema de notificaciones y la modalidad de escucha de cambios en la tabla.</p><p>Snippet:</p><p>-</p><ul><li>o</li></ul><p>-</p><ul><li>: habilita/deshabilita el subsistema completo de notificaciones.</li><li>: o .</li><li>: intervalo en segundos cuando .</li></ul><p>Soporte del lado del frontend:</p><ul><li>(y alias compatibles) puede ocultar la campana y detener la conexion en tiempo real del lado del cliente.</li></ul><p>Resultado:</p><ul><li>backend y frontend permanecen alineados respecto al estado de notificaciones;</li><li>en la UI recibe actualizaciones push, en usa refresh periodico.</li></ul>",
78343
+ "html": "<h1>Notifications</h1><p>Gestión de notificaciones aplicativas, eventos y feedback al usuario.</p><h2>Screenshot reference (manual de usuario)</h2><ul><li>: estado UI de notificaciones en la subsección .</li></ul><h2>Arquitectura funcional</h2><p>Descripción:</p><p>la funcionalidad recopila eventos aplicativos, los persiste en y los propaga en tiempo real a la UI.</p><ul><li>Storage: tabla metadata DB .</li><li>Write path: endpoint que usa .</li><li>Read path: endpoint .</li><li>Realtime path: WebSocket con snapshot push.</li><li>UI: componente (popover con lista de notificaciones, badge de no leídos, marcar como leído y limpiar leídos).</li></ul><h2>Tabla</h2><p>Campos principales gestionados por el framework:</p><ul><li>uid=197609(lollo) gid=197121 groups=197121: identificador de la notificación.</li><li>: usuario destinatario.</li><li>: tipo (ej. , , , ...).</li><li>: texto mostrado en la UI.</li><li>: destino al hacer clic (route/path de navegación).</li><li>: payload libre para detalle aplicativo.</li><li>, : estado de lectura.</li><li>, : timeline y soft-delete.</li><li>, : trazabilidad del origen.</li></ul><h2>Trigger / automatizaciones que rellenan</h2><p>Descripción:</p><p>el patrón recomendado es centralizar la inserción en , invocada desde triggers o jobs.</p><ul><li>El framework proporciona la stored procedure (script: ).</li><li>Los triggers SQL aplicativos o jobs de backend pueden rellenar de dos formas:</li><li>invocando (enfoque recomendado);</li><li>insertando directamente en la tabla respetando los campos mínimos (, , ).</li><li>Patrón típico: trigger sobre tabla de negocio () que, al verificarse una condición, crea una notificación para uno o más usuarios.</li></ul><p>Snippet (ejemplo de payload enqueue):</p><p>-</p><p>-</p><p>-</p><p>-</p><p>-</p><p>-</p><h2>Trigger Metadata-Driven desde md_props_bag.notifications.triggerRules</h2><p>Las reglas pueden centralizarse en el metadata de tabla () y traducirse en triggers SQL en runtime.</p><ul><li>Estructura de regla: , , , , , , , , .</li><li>Pipeline: metadata route -&gt; generación de trigger SQL en servidor -&gt; -&gt; websocket bell ().</li><li>Snippet inline (insert): .</li><li>Snippet inline (update): .</li><li>Snippet inline (delete): .</li><li>Resultado: reglas de notificaciones versionadas en metadata, sin duplicación de lógica en triggers manuales individuales.</li><li>Referencia de contexto metadata: ver <a href=\"#/framework-docs/metadata-integration\">Metadata</a> (sección y nodos avanzados).</li></ul><h2>SqlDependency / Polling</h2><ul><li>Backend watcher: registrado como hosted service.</li><li>Modalidades configurables:</li><li>(por defecto): registra dependency sobre la query de no leídos de y envía snapshot cuando cambia el resultado.</li><li>: fallback con polling periódico cada .</li><li>Push service: envía snapshot solo a los usuarios con socket conectados.</li></ul><h2>UI y comportamiento del usuario</h2><ul><li>muestra un badge con el conteo de no leídos.</li><li>Apertura del panel: listado de notificaciones con fecha/hora y tipo.</li><li>Clic en notificación:</li><li>marcar como leída vía ;</li><li>navegación a la route leída desde .</li><li>Acción : (soft-delete de las leídas).</li></ul><h2>Progreso de export/import</h2><ul><li>Las notificaciones de progreso contienen y route de referencia en el .</li><li>Clic en notificación de progreso:</li></ul><p> - reabre el diálogo de progreso vinculado al mismo ;</p><p> - no fuerza redirección si ya se está en la route actual.</p><ul><li>Las notificaciones resumidas (fin de import/export) usan para navegar a la route de la grilla.</li></ul><h2>AppSettings relevantes</h2><p>Descripción:</p><p>estas claves habilitan el subsistema de notificaciones y la modalidad de escucha de cambios en la tabla.</p><p>Snippet:</p><p>-</p><ul><li>o</li></ul><p>-</p><ul><li>: habilita/deshabilita el subsistema completo de notificaciones.</li><li>: o .</li><li>: intervalo en segundos cuando .</li></ul><p>Soporte del lado del frontend:</p><ul><li>(y alias compatibles) puede ocultar la campana y detener la conexión en tiempo real del lado del cliente.</li></ul><p>Resultado:</p><ul><li>backend y frontend permanecen alineados respecto al estado de notificaciones;</li><li>en la UI recibe actualizaciones push, en usa refresh periódico.</li></ul>",
78307
78344
  "codeSamples": []
78308
78345
  }
78309
78346
  ],
@@ -82887,7 +82924,7 @@ class DesignerRouteComponent {
82887
82924
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
82888
82925
  */
82889
82926
  async ngOnInit() {
82890
- this.loadedComponent = await import('./wuic-framework-lib-designer.component-BnGD84I-.mjs').then((m) => m.DesignerComponent);
82927
+ this.loadedComponent = await import('./wuic-framework-lib-designer.component-DT3raIYd.mjs').then((m) => m.DesignerComponent);
82891
82928
  }
82892
82929
  /**
82893
82930
  * Delega al componente designer runtime la conferma navigazione con pending changes.
@@ -87987,4 +88024,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
87987
88024
  */
87988
88025
 
87989
88026
  export { LazyKanbanListComponent as $, ArchetypeConfiguratorComponent as A, BooleanEditorComponent as B, CallbackPipe as C, DynamicGenericTemplateComponent as D, EditorOptions as E, FilterBarComponent as F, FormatGridViewValuePipe as G, FrameworkDocsComponent as H, GetSrcUploadPreviewPipe as I, GlobalHandler as J, HtmlEditorComponent as K, LazyParametricDialogComponent as L, MetadataProviderService as M, ImageWrapperComponent as N, ImportExportButtonComponent as O, PagerComponent as P, IsSelectedRowPipe as Q, KanbanListComponent as R, KanbanOptions as S, TranslationManagerService as T, UserInfoService as U, KanbanStatusColumnItem as V, WtoolboxService as W, LazyDataActionButtonComponent as X, LazyDataSourceComponent as Y, LazyFieldEditorComponent as Z, LazyImageWrapperComponent as _, DataSourceComponent as a, LazyMetaMenuComponent as a0, ListGridComponent as a1, LookupEditorComponent as a2, MapListComponent as a3, MetaInfo as a4, MetaMenuComponent as a5, NotificationBellComponent as a6, NotificationRealtimeService as a7, NumberEditorComponent as a8, PRIMARY_PALETTES as a9, loadBooleanEditorComponent as aA, loadButtonEditorComponent as aB, loadCodeAreaEditorComponent as aC, loadColorEditorComponent as aD, loadDateEditorComponent as aE, loadDictionaryEditorComponent as aF, loadHtmlEditorComponent as aG, loadLookupEditorComponent as aH, loadNumberEditorComponent as aI, loadPropertyArrayEditorComponent as aJ, loadPropertyObjectEditorComponent as aK, loadTextAreaEditorComponent as aL, loadTextEditorComponent as aM, loadTreeViewSelectorComponent as aN, loadUploadEditorComponent as aO, menuRouteAccessCanActivateGuard as aP, menuRouteAccessCanMatchGuard as aQ, routes as aR, PivotBuilderComponent as aa, PropertyArrayEditorComponent as ab, PropertyObjectEditorComponent as ac, ReportDesignerComponent as ad, ReportViewerComponent as ae, SchedulerListComponent as af, SpreadsheetListComponent as ag, THEME_OPTIONS as ah, TextAreaEditorComponent as ai, TextEditorComponent as aj, TreeListComponent as ak, TreeViewSelectorComponent as al, UploadEditorComponent as am, ValidationRule as an, ValueChangedPayload as ao, VisibleFieldListPipe as ap, WidgetDefinition as aq, WorkflowDesignerComponent as ar, WorkflowDesignerRouteComponent as as, WorkflowRunnerComponent as at, WuicRagChatbotComponent as au, WuicRagService as av, authExpiredInterceptor as aw, boundedRepeaterPendingChangesGuard as ax, getThemeOptions as ay, getThemePrimaryHex as az, DataRepeaterComponent as b, ParametricDialogComponent as c, MetadatiColonna as d, DataProviderService as e, MetadataEditorService as f, WorkflowRuntimeMetadataService as g, FieldEditorComponent as h, MetadataEditorComponent as i, AUTH_REDIRECT_REASON_KEY as j, AppSettingsEditorComponent as k, AuthSessionService as l, BoundedRepeaterComponent as m, ButtonEditorComponent as n, CallbackPipe2 as o, CarouselListComponent as p, ChartListComponent as q, CodeAreaEditorComponent as r, CodeEditorComponent as s, ColorEditorComponent as t, CustomException as u, DataActionButtonComponent as v, DateEditorComponent as w, DesignerRouteComponent as x, DictionaryEditorComponent as y, DynamicRowTemplateComponent as z };
87990
- //# sourceMappingURL=wuic-framework-lib-wuic-framework-lib-CpocrbwM.mjs.map
88027
+ //# sourceMappingURL=wuic-framework-lib-wuic-framework-lib-BINzgaz1.mjs.map
@@ -1,2 +1,2 @@
1
- export { j as AUTH_REDIRECT_REASON_KEY, k as AppSettingsEditorComponent, l as AuthSessionService, B as BooleanEditorComponent, m as BoundedRepeaterComponent, n as ButtonEditorComponent, C as CallbackPipe, o as CallbackPipe2, p as CarouselListComponent, q as ChartListComponent, r as CodeAreaEditorComponent, s as CodeEditorComponent, t as ColorEditorComponent, u as CustomException, v as DataActionButtonComponent, b as DataRepeaterComponent, a as DataSourceComponent, w as DateEditorComponent, x as DesignerRouteComponent, y as DictionaryEditorComponent, z as DynamicRowTemplateComponent, E as EditorOptions, h as FieldEditorComponent, F as FilterBarComponent, G as FormatGridViewValuePipe, H as FrameworkDocsComponent, I as GetSrcUploadPreviewPipe, J as GlobalHandler, K as HtmlEditorComponent, N as ImageWrapperComponent, O as ImportExportButtonComponent, Q as IsSelectedRowPipe, R as KanbanListComponent, S as KanbanOptions, V as KanbanStatusColumnItem, X as LazyDataActionButtonComponent, Y as LazyDataSourceComponent, Z as LazyFieldEditorComponent, _ as LazyImageWrapperComponent, $ as LazyKanbanListComponent, a0 as LazyMetaMenuComponent, a1 as ListGridComponent, a2 as LookupEditorComponent, a3 as MapListComponent, a4 as MetaInfo, a5 as MetaMenuComponent, f as MetadataEditorService, M as MetadataProviderService, d as MetadatiColonna, a6 as NotificationBellComponent, a7 as NotificationRealtimeService, a8 as NumberEditorComponent, a9 as PRIMARY_PALETTES, P as PagerComponent, c as ParametricDialogComponent, aa as PivotBuilderComponent, ab as PropertyArrayEditorComponent, ac as PropertyObjectEditorComponent, ad as ReportDesignerComponent, ae as ReportViewerComponent, af as SchedulerListComponent, ag as SpreadsheetListComponent, ah as THEME_OPTIONS, ai as TextAreaEditorComponent, aj as TextEditorComponent, T as TranslationManagerService, ak as TreeListComponent, al as TreeViewSelectorComponent, am as UploadEditorComponent, U as UserInfoService, an as ValidationRule, ao as ValueChangedPayload, ap as VisibleFieldListPipe, aq as WidgetDefinition, ar as WorkflowDesignerComponent, as as WorkflowDesignerRouteComponent, at as WorkflowRunnerComponent, g as WorkflowRuntimeMetadataService, W as WtoolboxService, au as WuicRagChatbotComponent, av as WuicRagService, aw as authExpiredInterceptor, ax as boundedRepeaterPendingChangesGuard, ay as getThemeOptions, az as getThemePrimaryHex, aA as loadBooleanEditorComponent, aB as loadButtonEditorComponent, aC as loadCodeAreaEditorComponent, aD as loadColorEditorComponent, aE as loadDateEditorComponent, aF as loadDictionaryEditorComponent, aG as loadHtmlEditorComponent, aH as loadLookupEditorComponent, aI as loadNumberEditorComponent, aJ as loadPropertyArrayEditorComponent, aK as loadPropertyObjectEditorComponent, aL as loadTextAreaEditorComponent, aM as loadTextEditorComponent, aN as loadTreeViewSelectorComponent, aO as loadUploadEditorComponent, aP as menuRouteAccessCanActivateGuard, aQ as menuRouteAccessCanMatchGuard, aR as routes } from './wuic-framework-lib-wuic-framework-lib-CpocrbwM.mjs';
1
+ export { j as AUTH_REDIRECT_REASON_KEY, k as AppSettingsEditorComponent, l as AuthSessionService, B as BooleanEditorComponent, m as BoundedRepeaterComponent, n as ButtonEditorComponent, C as CallbackPipe, o as CallbackPipe2, p as CarouselListComponent, q as ChartListComponent, r as CodeAreaEditorComponent, s as CodeEditorComponent, t as ColorEditorComponent, u as CustomException, v as DataActionButtonComponent, b as DataRepeaterComponent, a as DataSourceComponent, w as DateEditorComponent, x as DesignerRouteComponent, y as DictionaryEditorComponent, z as DynamicRowTemplateComponent, E as EditorOptions, h as FieldEditorComponent, F as FilterBarComponent, G as FormatGridViewValuePipe, H as FrameworkDocsComponent, I as GetSrcUploadPreviewPipe, J as GlobalHandler, K as HtmlEditorComponent, N as ImageWrapperComponent, O as ImportExportButtonComponent, Q as IsSelectedRowPipe, R as KanbanListComponent, S as KanbanOptions, V as KanbanStatusColumnItem, X as LazyDataActionButtonComponent, Y as LazyDataSourceComponent, Z as LazyFieldEditorComponent, _ as LazyImageWrapperComponent, $ as LazyKanbanListComponent, a0 as LazyMetaMenuComponent, a1 as ListGridComponent, a2 as LookupEditorComponent, a3 as MapListComponent, a4 as MetaInfo, a5 as MetaMenuComponent, f as MetadataEditorService, M as MetadataProviderService, d as MetadatiColonna, a6 as NotificationBellComponent, a7 as NotificationRealtimeService, a8 as NumberEditorComponent, a9 as PRIMARY_PALETTES, P as PagerComponent, c as ParametricDialogComponent, aa as PivotBuilderComponent, ab as PropertyArrayEditorComponent, ac as PropertyObjectEditorComponent, ad as ReportDesignerComponent, ae as ReportViewerComponent, af as SchedulerListComponent, ag as SpreadsheetListComponent, ah as THEME_OPTIONS, ai as TextAreaEditorComponent, aj as TextEditorComponent, T as TranslationManagerService, ak as TreeListComponent, al as TreeViewSelectorComponent, am as UploadEditorComponent, U as UserInfoService, an as ValidationRule, ao as ValueChangedPayload, ap as VisibleFieldListPipe, aq as WidgetDefinition, ar as WorkflowDesignerComponent, as as WorkflowDesignerRouteComponent, at as WorkflowRunnerComponent, g as WorkflowRuntimeMetadataService, W as WtoolboxService, au as WuicRagChatbotComponent, av as WuicRagService, aw as authExpiredInterceptor, ax as boundedRepeaterPendingChangesGuard, ay as getThemeOptions, az as getThemePrimaryHex, aA as loadBooleanEditorComponent, aB as loadButtonEditorComponent, aC as loadCodeAreaEditorComponent, aD as loadColorEditorComponent, aE as loadDateEditorComponent, aF as loadDictionaryEditorComponent, aG as loadHtmlEditorComponent, aH as loadLookupEditorComponent, aI as loadNumberEditorComponent, aJ as loadPropertyArrayEditorComponent, aK as loadPropertyObjectEditorComponent, aL as loadTextAreaEditorComponent, aM as loadTextEditorComponent, aN as loadTreeViewSelectorComponent, aO as loadUploadEditorComponent, aP as menuRouteAccessCanActivateGuard, aQ as menuRouteAccessCanMatchGuard, aR as routes } from './wuic-framework-lib-wuic-framework-lib-BINzgaz1.mjs';
2
2
  //# sourceMappingURL=wuic-framework-lib.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wuic-framework-lib",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "Wuic Angular Framework Library",
5
5
  "author": "Wuic",
6
6
  "license": "MIT",