feat: SnippetStore + ConversationExporter + DeepLEngine + TranslationCache (#63, #65, #59) #158

Closed
charles wants to merge 6 commits from feat/65-63-59-m5-extras into main
Owner

Résumé

Trois features M5 réparties sur fractal-ext et fractal-ai :

#63 — Bibliothèque de snippets/templates

  • Snippet : nom, description, body avec {{variables}}, tags
  • Snippet::expand(vars) : substitution des variables ({{nom}}, {{date}}, {{heure}}, {{salon}})
  • Snippet::variables() : extrait les variables référencées
  • builtin_vars(room_name) : map des variables système (date, heure, salon)
  • SnippetStore : add/remove/get/search — stockage TOML prévu
  • 5 tests unitaires

#65 — Export de conversation

  • ExportFormat : Markdown, Html, Pdf (+ extension/MIME)
  • ExportFilters : filtre par sender, plage de dates
  • ConversationExporter::export() : Markdown avec métadonnées / HTML autonome avec échappement XSS
  • 4 tests unitaires (contenu, échappement, filtrage)

#59 — Traduction à la volée (complétion)

  • DeepLEngine : implémente TranslationEngine, health_check sur clé API
  • TranslationCache : cache in-memory (SQLite en production), clé (event_id, target_lang)
  • TranslationPrefs : moteur préféré, langue cible, auto-translate, show_original
  • 4 tests unitaires async

Closes #59, #63, #65

Plan de test

  • cargo test -p fractal-ext passe
  • cargo test -p fractal-ai passe
  • Snippet::expand() remplace {{nom}} par la valeur fournie
  • ConversationExporter échappe <script> en &lt;script&gt; dans l'export HTML
  • TranslationCache::get() retourne None pour un event_id inconnu
## Résumé Trois features M5 réparties sur `fractal-ext` et `fractal-ai` : **#63 — Bibliothèque de snippets/templates** - `Snippet` : nom, description, body avec `{{variables}}`, tags - `Snippet::expand(vars)` : substitution des variables (`{{nom}}`, `{{date}}`, `{{heure}}`, `{{salon}}`) - `Snippet::variables()` : extrait les variables référencées - `builtin_vars(room_name)` : map des variables système (date, heure, salon) - `SnippetStore` : add/remove/get/search — stockage TOML prévu - 5 tests unitaires **#65 — Export de conversation** - `ExportFormat` : `Markdown`, `Html`, `Pdf` (+ extension/MIME) - `ExportFilters` : filtre par sender, plage de dates - `ConversationExporter::export()` : Markdown avec métadonnées / HTML autonome avec échappement XSS - 4 tests unitaires (contenu, échappement, filtrage) **#59 — Traduction à la volée (complétion)** - `DeepLEngine` : implémente `TranslationEngine`, health_check sur clé API - `TranslationCache` : cache in-memory (SQLite en production), clé `(event_id, target_lang)` - `TranslationPrefs` : moteur préféré, langue cible, auto-translate, show_original - 4 tests unitaires async Closes #59, #63, #65 ## Plan de test - [ ] `cargo test -p fractal-ext` passe - [ ] `cargo test -p fractal-ai` passe - [ ] `Snippet::expand()` remplace `{{nom}}` par la valeur fournie - [ ] `ConversationExporter` échappe `<script>` en `&lt;script&gt;` dans l'export HTML - [ ] `TranslationCache::get()` retourne `None` pour un event_id inconnu
charles closed this pull request 2026-04-06 02:33:09 +00:00
Some checks are pending
CI / cargo check (pull_request) Has been cancelled
CI / cargo test (pull_request) Has been cancelled
CI / clippy + rustfmt (pull_request) Has been cancelled
qa
Required

Pull request closed

Sign in to join this conversation.
No description provided.