02-ce-que-je-construis/specs/architecture.md

Architecture Codexia

⚠️ Document partiellement remplacΓ©. Depuis le 2026-06-05, la vision d'ensemble, la taxonomie de nommage et l'architecture cible (multi-domaines, cΕ“ur tlr-symfony + bundles tlr-* + app telaria) vivent dans le doc fondateur architecture-univers-telaria.md, qui fait autoritΓ©. Ce document reste utile pour le dΓ©tail technique de l'app codexia (stack, infra serveur, sΓ©curitΓ©), mais ses sections Β« ModΓ¨le de donnΓ©es Β», Β« Flux applicatifs Β» et l'arborescence src/ dΓ©crivent une plateforme documentaire prospective non codΓ©e (entitΓ©s Document/Resource/Expertise fictives) β€” Γ  lire comme une cible historique, pas comme l'Γ©tat rΓ©el. Pour le rΓ©el, voir auth-compte.md.

Ce document dΓ©crit l'architecture technique du projet Codexia, de l'infrastructure serveur jusqu'Γ  la logique applicative.


Table des matières


Vue d'ensemble

Codexia est une plateforme de gestion documentaire permettant de composer des documentations Γ  partir de ressources rΓ©utilisables (tips, howtos, descriptions fonctionnelles).

MΓ©taphore du projet

"Assembler une documentation Γ  partir d'ingrΓ©dients (ressources)"

Cette mΓ©taphore guide toute l'architecture :

  • IngrΓ©dients = Ressources documentaires (snippets, exemples, dΓ©finitions)
  • Documentation = Documents assemblΓ©s (guides, tutoriels, spΓ©cifications)
  • Domaines d'expertise = ThΓ©matiques (Backend, Frontend, SecOps, etc.)

Stack technique

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   UTILISATEUR                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
│              COUCHE PRÉSENTATION                    │
β”‚  - Twig 3 (Templates)                               β”‚
β”‚  - Bootstrap 5 (CSS Framework)                      β”‚
β”‚  - Stimulus (JavaScript)                            β”‚
β”‚  - AssetMapper (Assets)                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              COUCHE APPLICATIVE                     β”‚
β”‚  - Symfony 7.2 (Framework)                          β”‚
β”‚  - PHP 8.5 (Langage)                                β”‚
β”‚  - Controllers, Services, Events                    β”‚
β”‚  - Voters (Autorisations)                           β”‚
β”‚  - Messenger (Async)                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              COUCHE PERSISTANCE                     β”‚
β”‚  - Doctrine ORM 3                                   β”‚
β”‚  - MySQL 8.4.7                                      β”‚
β”‚  - Repositories                                     β”‚
β”‚  - Migrations                                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              INFRASTRUCTURE                         β”‚
β”‚  - Ubuntu Server 26.04 LTS                          β”‚
β”‚  - Apache 2.4 + PHP-FPM                             β”‚
β”‚  - MySQL 8.4                                        β”‚
β”‚  - Postfix + DKIM (emails)                          β”‚
β”‚  - Let's Encrypt (SSL/TLS)                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Γ‰volution du projet

Phase 1 : OneTLD (tutoriel Grafikart)

Origine : Tutoriel Symfony 7 par Grafikart (thème recettes de cuisine)

  • Application de gestion de recettes de cuisine (terminologie du tutoriel)
  • CRUD basique (Recipes, Categories, Users)
  • Authentification, API REST, i18n
  • Base technique solide pour apprentissage

Phase 2 : Codexia (Plateforme documentaire)

Γ‰volution : Conservation de la mΓ©taphore, changement de domaine

  • Documentation structurΓ©e autour de documents/guides
  • Ressources rΓ©utilisables pour assembler les documents
  • Domaines d'expertise pour classifier les contenus

Nouvelles fonctionnalitΓ©s :

  • Gestion de ressources documentaires
  • Assemblage de documents Γ  partir de ressources
  • Export multi-formats (HTML, EPUB, PDF)
  • Recherche full-text et sΓ©mantique
  • Versionnement de la documentation
  • CMS Γ©ditorial (telaria-cms) pour pages lΓ©gales et pages de contexte
  • Backoffice global (telaria-admin) pour l'administration du site

Γ‰tat d'implΓ©mentation (actuel vs cible)

Important : ce document décrit l'architecture cible. Une partie n'est pas encore codée — les sections ci-dessous (modèle de données, flux, structure) la décrivent comme objectif.

ImplΓ©mentΓ© aujourd'hui (squelette transverse) :

  • Authentification, 2FA e-mail, contact, profil, dashboard admin, i18n fr/en, token API β†’ voir auth-compte.md.
  • EntitΓ©s rΓ©elles : User et ResetPasswordRequest. Le dΓ©mo Β« recettes Β» (OneTLD/Grafikart) a Γ©tΓ© retirΓ©.
  • Bundles maison rΓ©els : codexia/ui-bundle et telaria/rag-bundle (cΕ“ur RAG, v0.1.x).

Cible, non encore codΓ©e :

  • Plateforme documentaire : entitΓ©s Document/Resource/Expertise, assemblage, export EPUB/PDF.
  • CMS Γ©ditorial (telaria-cms.md), recherche (telaria-search.md), doc web /docs (docs-web.md), IA (ia-vitrine.md).
  • La majoritΓ© des bundles listΓ©s ci-dessous sont prospectifs (hors codexia/ui-bundle et telaria/rag-bundle).

Architecture infrastructure

Serveur physique (VPS OVH KVM)

Le projet est hΓ©bergΓ© sur une instance VPS (KVM) chez OVHcloud, offrant les caractΓ©ristiques suivantes :

  • Processeur (vCPU) : 6 vCPU Intel Haswell (haute performance pour compilation/gΓ©nΓ©ration)
  • MΓ©moire (RAM) : 12 Go (permettant la mise en cache agressive OPcache/MySQL)
  • Stockage (SSD) : 96 Go SSD (IOPS Γ©levΓ©s pour les opΓ©rations d'assemblage documentaire)
  • RΓ©seau : 250 Mbps (IP publique fixe, IPv4 + IPv6)
  • Localisation : France (Gravelines/Strasbourg)

Description logicielle (OS & Services)

L'OS est une distribution Linux optimisΓ©e pour la stabilitΓ© et la performance.

  • SystΓ¨me d'exploitation : Ubuntu Server 26.04 LTS
  • Serveur Web : Apache 2.4 (MPM Event) + PHP-FPM
  • Base de donnΓ©es : MySQL 8.4.7 (LTS)
  • Serveur de messagerie : Postfix (SMTP transactionnel)
  • Gestionnaire de certificats : Certbot (Let's Encrypt)

Paquets et applications par thème

🌍 Infrastructure & Web

  • apache2 : Serveur HTTP haute performance
  • php8.5-fpm : Processeur PHP avec pool dΓ©diΓ©
  • mysql-server-8.4 : Moteur de base de donnΓ©es relationnelle
  • postfix : Agent de transfert de mail (MTA)
  • brotli : Compression HTTP haute performance (guide perf-http.md)

πŸ›‘οΈ SΓ©curitΓ© & Certificats

  • ufw : Uncomplicated Firewall pour le filtrage des ports (22, 80, 443)
  • fail2ban : Protection contre les attaques par force brute (SSH, Apache)
  • certbot + python3-certbot-apache : Automatisation des certificats SSL/TLS
  • opendkim : Signature des emails pour la dΓ©livrabilitΓ© (guide email.md)

πŸ› οΈ DΓ©veloppement & Automatisation

  • composer : Gestionnaire de dΓ©pendances PHP
  • git : ContrΓ΄le de version (GitFlow)
  • symfony-cli : Outils de dΓ©veloppement et serveur de test local
  • pandoc : Conversion multi-formats pour les exports (EPUB, PDF, etc.)
  • telaria-bash : Outils CLI maison pour l'automatisation (guide bash.md)

Écosystème Symfony & Bundles

L'application Codexia repose sur une architecture modulaire utilisant des bundles spΓ©cialisΓ©s pour sΓ©parer les responsabilitΓ©s.

Statut : seuls les bundles rΓ©ellement implΓ©mentΓ©s sont listΓ©s ici. Les pistes de modularisation future vivent dans pilotage/roadmap.md.

Bundles implΓ©mentΓ©s

Bundle Description Repository
codexia/ui-bundle Thèmes Bootstrap custom, composants Stimulus et presets AssetMapper. github.com/<owner>/codexia-ui
telaria/rag-bundle CΕ“ur RAG headless (ingestion β†’ embeddings β†’ sqlite-vec β†’ retrieval), consommΓ© par codexia (^0.1, tag v0.1.3) β€” L0 validΓ© en prod sur VPS le 2026-05-26 (181 docs / 2430 chunks). github.com/<owner>/telaria-rag
telaria/mcp-bundle Serveur MCP (PHP/Symfony) exposant la documentation comme outils β€” repo telaria-mcp. github.com/<owner>/telaria-mcp

Architecture applicative

Structure Symfony

⚠️ Arborescence cible : les modules documentaires (Document, Resource, Expertise, assemblage, export) ne sont pas encore codΓ©s. Le code rΓ©el se limite au squelette transverse (auth, contact, profil, admin, i18n). Voir Β§ Β« Γ‰tat d'implΓ©mentation Β».

codexia-app/
β”œβ”€β”€ bin/
β”‚   └── console                 # CLI Symfony
β”œβ”€β”€ config/
β”‚   β”œβ”€β”€ packages/               # Configuration bundles
β”‚   β”œβ”€β”€ routes/                 # Configuration routes
β”‚   β”œβ”€β”€ services.yaml           # Services
β”‚   └── security.yaml           # Firewall, voters
β”œβ”€β”€ migrations/                 # Migrations Doctrine
β”œβ”€β”€ public/
β”‚   β”œβ”€β”€ index.php               # Front controller
β”‚   β”œβ”€β”€ uploads/                # Images uploadΓ©es
β”‚   └── downloads/              # EPUB/PDF gΓ©nΓ©rΓ©s
β”œβ”€β”€ media/                       # MΓ©dias CMS (privΓ©, hors webroot)
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ Controller/
β”‚   β”‚   β”œβ”€β”€ Admin/              # Backoffice (CRUD)
β”‚   β”‚   β”œβ”€β”€ API/                # API REST
β”‚   β”‚   β”œβ”€β”€ HomeController.php
β”‚   β”‚   β”œβ”€β”€ DocumentController.php
β”‚   β”‚   β”œβ”€β”€ CmsPublicController.php
β”‚   β”‚   └── SecurityController.php
β”‚   β”œβ”€β”€ Entity/
β”‚   β”‚   β”œβ”€β”€ Document.php
β”‚   β”‚   β”œβ”€β”€ CmsContent.php
β”‚   β”‚   β”œβ”€β”€ CmsTag.php
β”‚   β”‚   β”œβ”€β”€ CmsImage.php
β”‚   β”‚   β”œβ”€β”€ Resource.php
β”‚   β”‚   β”œβ”€β”€ Expertise.php
β”‚   β”‚   └── User.php
β”‚   β”œβ”€β”€ Repository/
β”‚   β”‚   β”œβ”€β”€ DocumentRepository.php
β”‚   β”‚   β”œβ”€β”€ CmsContentRepository.php
β”‚   β”‚   β”œβ”€β”€ CmsTagRepository.php
β”‚   β”‚   β”œβ”€β”€ CmsImageRepository.php
β”‚   β”‚   β”œβ”€β”€ ResourceRepository.php
β”‚   β”‚   β”œβ”€β”€ ExpertiseRepository.php
β”‚   β”‚   └── UserRepository.php
β”‚   β”œβ”€β”€ Form/
β”‚   β”‚   β”œβ”€β”€ DocumentType.php
β”‚   β”‚   β”œβ”€β”€ CmsContentType.php
β”‚   β”‚   β”œβ”€β”€ ResourceType.php
β”‚   β”‚   └── ExpertiseType.php
β”‚   β”œβ”€β”€ Service/
β”‚   β”‚   β”œβ”€β”€ DocumentAssembler.php
β”‚   β”‚   β”œβ”€β”€ ExportService.php (EPUB, PDF)
β”‚   β”‚   β”œβ”€β”€ FileUploader.php
β”‚   β”‚   β”œβ”€β”€ SearchService.php (telaria-search)
β”‚   β”‚   └── CmsRenderer.php
β”‚   β”œβ”€β”€ Security/
β”‚   β”‚   └── Voter/
β”‚   β”‚       β”œβ”€β”€ DocumentVoter.php
β”‚   β”‚       └── ResourceVoter.php
β”‚   β”œβ”€β”€ EventSubscriber/
β”‚   β”‚   β”œβ”€β”€ LocaleSubscriber.php (i18n)
β”‚   β”‚   └── SecuritySubscriber.php
β”‚   └── Command/
β”‚       β”œβ”€β”€ UserGenerateTokenCommand.php
β”‚       └── ExportDocsCommand.php
β”œβ”€β”€ templates/
β”‚   β”œβ”€β”€ base.html.twig
β”‚   β”œβ”€β”€ home/
β”‚   β”œβ”€β”€ document/
β”‚   β”œβ”€β”€ admin/
β”‚   └── security/
β”œβ”€β”€ translations/
β”‚   β”œβ”€β”€ messages.fr.yaml
β”‚   └── messages.en.yaml
β”œβ”€β”€ var/
β”‚   β”œβ”€β”€ cache/
β”‚   β”œβ”€β”€ log/
β”‚   └── email/                  # Emails dev
└── vendor/                     # DΓ©pendances Composer

Couches architecturales

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  CONTROLLER LAYER                                   β”‚
β”‚  - Gestion requΓͺtes HTTP                            β”‚
β”‚  - Validation formulaires                           β”‚
β”‚  - DΓ©lΓ©gation aux services                          β”‚
β”‚  - Rendu templates                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  SERVICE LAYER                                      β”‚
β”‚  - Logique mΓ©tier                                   β”‚
β”‚  - DocumentAssembler (composition docs)             β”‚
β”‚  - ExportService (gΓ©nΓ©ration EPUB/PDF)              β”‚
  β”‚  - SearchService (telaria-search)                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  REPOSITORY LAYER                                   β”‚
│  - Accès données (Doctrine)                         │
β”‚  - RequΓͺtes DQL personnalisΓ©es                      β”‚
β”‚  - Pagination                                       β”‚
β”‚  - Filtres et tri                                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  ENTITY LAYER                                       β”‚
β”‚  - Document, Resource, Expertise, User              β”‚
β”‚  - Validation (Constraints)                         β”‚
β”‚  - Relations (OneToMany, ManyToMany)                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Modèle de données

⚠️ ModΓ¨le cible. Γ€ ce jour, seules les entitΓ©s User et ResetPasswordRequest existent β€” voir auth-compte.md. Les entitΓ©s Document/Resource/Expertise ci-dessous relΓ¨vent de la plateforme documentaire non encore codΓ©e.

Diagramme ER

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚      User        β”‚         β”‚    Expertise     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€         β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ id (PK)          β”‚         β”‚ id (PK)          β”‚
β”‚ email            β”‚         β”‚ name             β”‚
β”‚ password         β”‚         β”‚ slug             β”‚
β”‚ roles (JSON)     β”‚         β”‚ description      β”‚
β”‚ api_token        β”‚         β”‚ created_at       β”‚
β”‚ created_at       β”‚         β”‚ updated_at       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚                            β”‚
         β”‚ 1                          β”‚ 1
         β”‚                            β”‚
         β”‚ N                          β”‚ N
         β”‚                            β”‚
         β”‚                   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”
         β”‚                   β”‚                 β”‚
         β–Ό                   β–Ό                 β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Document                          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ id (PK)                                              β”‚
β”‚ title                                                β”‚
β”‚ slug                                                 β”‚
β”‚ description                                          β”‚
β”‚ content (Markdown)                                   β”‚
β”‚ format (markdown|html|rst)                           β”‚
β”‚ language (fr|en)                                     β”‚
β”‚ accessibility_level (A|AA|AAA)                       β”‚
β”‚ user_id (FK β†’ User)                                  β”‚
β”‚ expertise_id (FK β†’ Expertise)                        β”‚
β”‚ created_at                                           β”‚
β”‚ updated_at                                           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β”‚ N
         β”‚
         β”‚ (ManyToMany)
         β”‚
         β”‚ N
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Resource                          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ id (PK)                                              β”‚
β”‚ title                                                β”‚
β”‚ slug                                                 β”‚
β”‚ type (snippet|example|definition|howto)              β”‚
β”‚ content (Markdown)                                   β”‚
β”‚ tags (JSON)                                          β”‚
β”‚ user_id (FK β†’ User)                                  β”‚
β”‚ created_at                                           β”‚
β”‚ updated_at                                           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Relations

  • User β†’ Document : Un utilisateur peut crΓ©er plusieurs documents (1:N)
  • Expertise β†’ Document : Un domaine d'expertise contient plusieurs documents (1:N)
  • Document ↔ Resource : Un document peut utiliser plusieurs ressources, une ressource peut Γͺtre dans plusieurs documents (N:N)

Flux applicatifs

⚠️ Flux cibles de la plateforme documentaire (non encore codée). Pour l'authentification réelle, voir auth-compte.md.

1. CrΓ©ation d'un document

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  User       β”‚
β”‚  (logged)   β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  GET /admin/documents/new            β”‚
β”‚  - Affiche formulaire vide           β”‚
β”‚  - Liste des expertises disponibles  β”‚
β”‚  - Liste des ressources (sΓ©lection)  β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  POST /admin/documents/new           β”‚
β”‚  1. Validation formulaire            β”‚
β”‚  2. DocumentVoter (CREATE)           β”‚
β”‚  3. Persister Document               β”‚
β”‚  4. Lier Resources (ManyToMany)      β”‚
β”‚  5. Redirect /admin/documents/{id}   β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Affichage document créé             β”‚
β”‚  - Preview HTML                      β”‚
β”‚  - Bouton "Exporter EPUB"            β”‚
β”‚  - Bouton "Modifier"                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

2. Export EPUB

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  GET /admin/documents/{id}/export   β”‚
β”‚  ?format=epub                       β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  ExportService::exportToEpub()       β”‚
β”‚  1. RΓ©cupΓ©rer Document + Resources   β”‚
β”‚  2. Assembler contenu Markdown       β”‚
β”‚  3. Convertir Pandoc β†’ EPUB          β”‚
β”‚  4. Ajouter mΓ©tadonnΓ©es accessibilitΓ©β”‚
β”‚  5. Valider EPUBCheck                β”‚
β”‚  6. Stocker dans public/downloads/   β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Response (file download)            β”‚
β”‚  Content-Type: application/epub+zip  β”‚
β”‚  Content-Disposition: attachment     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

3. Recherche documentaire (telaria-search)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  GET /search?q=accessibilitΓ©         β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  SearchService::search()             β”‚
β”‚  1. RequΓͺte moteur (OpenSearch)      β”‚
β”‚  2. Filtres (expertise, language)    β”‚
β”‚  3. Tri par pertinence               β”‚
β”‚  4. Pagination (20 rΓ©sultats/page)   β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Affichage rΓ©sultats                 β”‚
β”‚  - Cards avec excerpt                β”‚
β”‚  - Highlighting des termes           β”‚
β”‚  - Filtres latΓ©raux                  β”‚
β”‚  - Pagination HATEOAS                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

4. API REST

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  GET /api/v1/documents               β”‚
β”‚  Authorization: Bearer {token}       β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  1. Validation token (SHA-512 hash)  β”‚
β”‚  2. VΓ©rifier rate limiting           β”‚
β”‚  3. DocumentRepository::findAll()    β”‚
β”‚  4. Serialization (JMS ou native)    β”‚
β”‚  5. Pagination + HATEOAS links       β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Response JSON                       β”‚
β”‚  {                                   β”‚
β”‚    "status": "success",              β”‚
β”‚    "data": [...],                    β”‚
β”‚    "pagination": {...}               β”‚
β”‚  }                                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Bundles et modularitΓ©

Bundles externes

Codexia adopte une approche modulaire : les fonctionnalitΓ©s rΓ©utilisables sont extraites en bundles Composer, consommΓ©s par l'application codexia.

codexia/ui-bundle
β”œβ”€β”€ ThΓ¨mes Bootstrap custom
β”œβ”€β”€ Composants Stimulus
└── AssetMapper presets

telaria/rag-bundle
β”œβ”€β”€ Ingestion .md β†’ chunks
β”œβ”€β”€ Embeddings + index sqlite-vec
└── Service de retrieval

telaria/mcp-bundle
β”œβ”€β”€ Transports stdio / Streamable HTTP
β”œβ”€β”€ Registre d'outils (tools/list, tools/call)
└── Gouvernance multi-tenant

Architecture multi-bundles

codexia-app/
β”œβ”€β”€ vendor/
β”‚   β”œβ”€β”€ codexia/ui-bundle
β”‚   β”œβ”€β”€ telaria/rag-bundle
β”‚   └── telaria/mcp-bundle
└── src/
    └── [Code applicatif spΓ©cifique]

SΓ©curitΓ©

Authentification

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Login Form                          β”‚
β”‚  - email + password                  β”‚
β”‚  - CSRF token                        β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Symfony Security                    β”‚
β”‚  1. CSRF validation                  β”‚
β”‚  2. User provider (Doctrine)         β”‚
β”‚  3. Password hasher (auto)           β”‚
β”‚  4. Session creation                 β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Session active                      β”‚
β”‚  - Cookie sΓ©curisΓ© (httponly)        β”‚
β”‚  - Timeout configurable              β”‚
β”‚  - Remember me (optionnel)           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Autorisation (Voters)

// DocumentVoter.php
class DocumentVoter extends Voter
{
    protected function supports(string $attribute, mixed $subject): bool
    {
        return in_array($attribute, ['VIEW', 'EDIT', 'DELETE'])
            && $subject instanceof Document;
    }

    protected function voteOnAttribute(
        string $attribute,
        mixed $subject,
        TokenInterface $token
    ): bool {
        $user = $token->getUser();

        if (!$user instanceof User) {
            return false;
        }

        /** @var Document $document */
        $document = $subject;

        return match($attribute) {
            'VIEW' => true, // Tous peuvent voir
            'EDIT', 'DELETE' => $document->getUser() === $user || in_array('ROLE_ADMIN', $user->getRoles()),
        };
    }
}

Rate Limiting

# config/packages/rate_limiter.yaml
framework:
    rate_limiter:
        api:
            policy: 'sliding_window'
            limit: 100
            interval: '1 hour'

        contact_form:
            policy: 'fixed_window'
            limit: 5
            interval: '15 minutes'

Performance et scalabilitΓ©

Optimisations actuelles

  1. OPcache PHP : Bytecode mis en cache
  2. Doctrine Query Cache : RequΓͺtes DQL mises en cache
  3. HTTP Cache : ETags + Cache-Control
  4. Eager Loading : Γ‰viter requΓͺtes N+1 (jointures)
  5. Assets : AssetMapper avec versioning

ScalabilitΓ© future

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Load Balancer (HAProxy/Nginx)                      β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
       β–Ό             β–Ό             β–Ό             β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ App Node 1β”‚ β”‚ App Node 2β”‚ β”‚ App Node 3β”‚ β”‚ App Node Nβ”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚             β”‚             β”‚             β”‚
       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  MySQL Master/Replica                               β”‚
β”‚  - Master : Γ©criture                                β”‚
β”‚  - Replicas : lecture                               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚
                        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Redis (Session + Cache)                            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Liens et ressources

Documentation interne

RΓ©fΓ©rences externes


ImplΓ©mentation

Aspect Localisation
Bundle principal telaria-app β€” squelette transverse (auth, contact, profil, admin, i18n)
Bundles réels codexia/ui-bundle (thèmes Bootstrap), telaria/rag-bundle (cœur RAG)
EntitΓ©s rΓ©elles src/Entity/User.php, src/Entity/ResetPasswordRequest.php
Controllers src/Controller/Admin/, src/Controller/SecurityController.php
Commandes CLI src/Command/UserGenerateTokenCommand.php
Config config/packages/, config/security.yaml
Tests Γ€ documenter
Note Les entitΓ©s Document/Resource/Expertise dΓ©crites dans ce doc sont des cibles non encore codΓ©es

Historique des dΓ©cisions

Version Date DΓ©cision
1.0 2026-06-14 Version initiale — première formalisation du versioning des specs.
— 2026-06-05 Document partiellement remplacé par architecture-univers-telaria.md pour la vision d'ensemble multi-domaines. Les sections modèle de données, flux et arborescence src/ décrivent une cible historique prospective.
β€” 2026-06-05 Statut des bundles clarifiΓ© : seuls codexia/ui-bundle et telaria/rag-bundle sont implΓ©mentΓ©s ; les autres sont prospectifs.

Assistant documentaire

Posez une question sur la documentation. Les rΓ©ponses citent leurs sources β€” un clic ouvre le document Γ  gauche.

Loading…
Loading the web debug toolbar…
Attempt #