Commit graph

25 commits

Author SHA1 Message Date
Ubuntu
c07ee892e7 feat(M4): Workflow itératif - batch N variantes + history + iterate
Génération unique remplacée par un cycle créatif:
- Sélecteur "1x/2x/4x" en haut du panneau actions
- Quand >1, l'app génère N variantes en parallèle avec
  variations légères du prompt (composition, lighting, colors, mood...)
- Pour 2x: prompt original + alternative composition
- Pour 4x: 4 explorations distinctes (composition, lighting, colors, mood)
- Toutes les variantes apparaissent dans la galerie M1
- La dernière devient active par défaut, user peut switcher

Prompt history:
- Endpoint frameVariants.promptHistory(frameId, type?) retourne
  les 20 derniers prompts uniques utilisés sur cette frame
- Dropdown "↺ Réutiliser un prompt..." sous chaque textarea
- Cliquer un prompt l'injecte dans la textarea

Iterate from variant:
- Bouton GitBranch (icône) au hover de chaque variante
- Click = copie le prompt de la variante dans le textarea
- Permet itération "je raffine cette idée" en un clic

Backend:
- regenerateBackgroundBatch / regenerateCharacterBatch
- Promise.allSettled pour exécution parallèle robuste (échecs partiels OK)
- Chaque résultat crée une variante (M1)
- Retourne {generated, failed, variants, errors}
- Sync legacy field avec la dernière variante générée
- Validation max 8 variantes pour éviter l'abus

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 12:09:57 +00:00
Ubuntu
d18424a416 feat(M2): Manipulation spatiale des calques personnage
L'utilisateur peut désormais déplacer, redimensionner, rotater et
flipper le personnage généré sans devoir tout régénérer.

DB:
- Nouveau champ transform JSON sur frameVariants
- Format: {x, y, scale, rotation, flipH, flipV} avec coords relatives

Backend (sharp):
- compositeLayers applique transform avant le blend:
  * scale: resize layer (peut être >100% ou <100%)
  * rotation: sharp.rotate avec fond transparent
  * flipH/flipV: flop/flip
  * x/y: offset en pourcentage de la base (centré + delta)
- Gestion intelligente des layers qui dépassent: extract crop
  (sharp interdit top/left négatifs et inputs plus grands que la base)
- compositing.composeFrame récupère le transform de la variant
  character active automatiquement
- Nouveau endpoint frameVariants.updateTransform

Frontend (LayerManipulator):
- Composant overlay avec bounding box pointillée + 8 handles
- Handles coins = scale, handle haut = rotation, area centrale = move
- CSS transform live (translate/scale/rotate/scaleX(-1) pour flip)
- Toolbar flottante: flip H/V, position/scale/rotation affichés en live
- Reset button quand transformé
- Bouton "Recomposer" déclenche composeFrame avec le nouveau transform
- Save backend automatique au release de souris

ViewportPanel:
- Bouton "Manipuler" dans toolbar (visible uniquement mode composite)
- Active LayerManipulator overlay, mutuellement exclusif avec Annoter/Loupe
- Désactivé si pas de variant character actif (toast warn)

Workflow:
1. Mode composite dans viewport
2. Click "Manipuler" → handles apparaissent
3. Drag pour déplacer / corners pour scale / handle haut pour rotation
4. Sauvegarde auto au release (en DB)
5. Click "Recomposer" → sharp regenère avec transform appliqué
6. Nouvelle variante composite créée (Module 1)
7. La galerie M1 montre l'avant/après

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 07:06:26 +00:00
Ubuntu
6a875ad0d5 feat(M3): Édition par zone - inpainting localisé via masque
L'outil d'annotation existant ne servait qu'à créer un masque global.
Maintenant chaque masque peut déclencher un inpainting IA qui
modifie UNIQUEMENT la zone sélectionnée.

Backend:
- convertMaskForOpenAI(): convertit notre format (blanc=édit/noir=préserve)
  vers format OpenAI (alpha=0=édit/opaque=préserve)
- Auto-redimensionne le mask aux dims de l'image source
- generateImage() accepte maintenant un paramètre maskUrl
- OpenAI images.edits utilise le param "mask" + champ "image" (singulier)
  pour le mode inpainting
- Nouveau endpoint generation.inpaintZone(frameId, maskUrl, prompt, sourceType)
- sourceType: original / bg (regen actif) / fg (perso actif) / composite
- Crée une nouvelle variante du type approprié (Module 1)
- Synchronise les champs legacy

Frontend (AnnotationCanvas):
- Nouveau bouton "Inpainter zone" dans la toolbar
- Form dropdown avec sélecteur de source (original/composite/bg/fg)
  et prompt textarea
- handleInpaint: upload du masque + appel inpaintZone + new variant
- Sauve masque (bouton existant renommé "Sauver masque") séparé de l'inpainting
- AnnotationCanvas reçoit projectId + frameIndex pour pouvoir appeler les routes

Workflow utilisateur:
1. Mode "Annoter" dans le viewport (sur frame originale)
2. Dessine au pinceau/rectangle/lasso la zone à modifier
3. Click "Inpainter zone"
4. Choisit source (original/composite/etc.) + écrit le prompt
5. Click "Lancer inpainting"
6. OpenAI génère uniquement la zone masquée
7. Nouvelle variante créée et visible dans la galerie M1

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 06:48:21 +00:00
Ubuntu
69b3d7c074 feat(M1): Bibliothèque de versions non-destructive
Le pipeline de génération écrasait silencieusement les versions
précédentes. Maintenant chaque génération crée une variante
sans perdre l'historique.

Backend:
- Nouvelle table frameVariants (id, frameId, type, url, prompt,
  provider, generationTimeMs, isActive, isPinned, label, metadata)
- 5 helpers DB: createFrameVariant, listFrameVariants,
  setActiveVariant, deleteFrameVariant, toggleVariantPin, renameVariant
- Routeur tRPC frameVariants: list, setActive, delete, togglePin, rename
- regenerateBackground/regenerateCharacter/composeFrame créent
  désormais une variante + désactivent les anciennes du même type
- Les champs legacy (regeneratedBgUrl, etc.) restent synchronisés
  avec la variante active pour backward-compat
- Tracking des metadata (style, characterId, sourceLayers, etc.)
- Mesure du generationTimeMs par variante

Frontend:
- Nouveau composant VersionsGallery (thumbnails horizontaux avec
  active radio, pin star, delete, tooltip prompt+meta+time)
- Intégré dans GenerationPanel sous chaque bloc (fond, perso, composite)
- Click sur une variante = la désactive les autres et l'active
- Hover = actions (épingler, supprimer)
- Tooltip détaillé (prompt, provider, durée, date)
- Pinned en premier, puis chronologique desc

Migration:
- Script migre les regen URLs existantes en variants
  (12 variantes migrées sur 8 frames du projet 90001)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 06:35:45 +00:00
Ubuntu
ac327206e2 fix: format d'image 16:9 + redirect intelligent après login
Format ratio (60):
- OpenAI gpt-image-1: choix automatique de size (1024x1024 / 1536x1024 /
  1024x1536) selon ratio cible le plus proche
- Crop sharp post-génération pour matcher EXACTEMENT le ratio source
- segmentationService passe les dimensions du projet (width/height)
  à regenerateBackground et regenerateCharacter
- Routes generation.* récupèrent project.width/height depuis DB
- Testé: frame 25 (854x480) -> bg généré en 854x480 exact

Redirect bug (61):
- DashboardLayout: navigate("/login") déplacé du render vers useEffect
  (anti-pattern React fix)
- main.tsx redirectToLoginIfUnauthorized: préserve l'URL d'origine
  dans ?return=...
- Login.tsx onSuccess: redirige vers ?return URL au lieu de "/"
- Plus de retour à l'accueil après refresh ou opération

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 06:17:47 +00:00
Ubuntu
a40690cabb feat: fallback OpenAI gpt-image-1 quand Gemini en quota dépassé
- OPENAI_API_KEY ajouté dans .env.docker
- imageGeneration.ts: tente Gemini d'abord, fallback OpenAI sur erreur
- Support images.edits (multipart avec ref image) pour gpt-image-1
- Support images.generations (text-only) si pas de ref
- Provider trace dans GenerateImageResponse pour debug
- Testé: pipeline complet frame 25
  * Fond Ghibli: 21s via OpenAI (Gemini 429) -> 1.6MB PNG
  * Personnage moderne: 26s via OpenAI -> 1.6MB PNG RGBA
  * Composite final: 1s via sharp -> 2.6MB PNG

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 05:35:20 +00:00
Ubuntu
0e964dcec2 feat: pipeline complet - annotation, compositing réel, auto-compose, drag-drop layers
Phase D - Drag-drop layers réordonnance:
- @dnd-kit/core + sortable + utilities installés
- LayersPanel réécrit avec SortableContext + useSortable
- Endpoint layers.reorder + db.reorderLayers
- Drag handle via GripVertical, optimistic UI update

Phase B - Compositing dual (sharp serveur + Canvas client):
- sharp 0.34.5 + vips-dev + libvips installés dans Dockerfile
- compositeLayers() réécrit: téléchargement frames, blend pixel par pixel,
  masques avec feathering, opacity, blend modes (over/multiply/screen/overlay)
- Endpoints compositing.composeFrame + compositing.composeSequence
- Composant CompositePreview: rendu client temps réel via <img> + mix-blend-mode
- Mode composite du ViewportPanel utilise CompositePreview pour preview live

Phase A - Outil d'annotation viewport:
- Composant AnnotationCanvas: brush/rectangle/lasso/eraser
- Taille pinceau ajustable, undo stack, clear all, save vers S3
- Raccourcis clavier B/R/Y/E + Ctrl+Z
- Bouton "Annoter" dans toolbar ViewportPanel
- Endpoint frames.saveMask, intégration mode original

Phase C - Pipeline auto-compose réel:
- inpaintBackgrounds: appelle vraiment segmentationService.inpaintBackground
- regenerateBackgrounds: vraie regen + propagation aux frames de la séquence
- regenerateCharacters: utilise character sheets + masks
- compositeAll: compose toutes les frames avec bg+fg via sharp
- fullAutoCompose chaîne tout: detect → analyze → segment → inpaint → regen → composite
- Tracking via generationJobs (progress %)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 05:19:07 +00:00
Ubuntu
fe62b8506e fix: utiliser gemini-2.5-flash-image pour la génération d'images
- Modèle corrigé: gemini-2.0-flash-exp (supprimé) -> gemini-2.5-flash-image
- Pipeline de génération testé et fonctionnel
  (bloqué temporairement par quota API gratuit)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 04:53:39 +00:00
Ubuntu
c1606ad4c9 feat: migration complète Manus -> auto-hébergé (MinIO + Gemini)
Infrastructure:
- MinIO déployé en local pour le stockage S3 (docker-compose)
- Storage proxy réécrit: sert les fichiers depuis MinIO en streaming
  (plus de 307 redirect vers CDN externe)
- Legacy /manus-storage/ redirige vers /storage/

LLM & Image Generation:
- LLM: Gemini uniquement (suppression du fallback Forge)
- Image generation: Gemini Imagen direct (suppression Forge GenerateImage)
- llmConfig simplifié, un seul provider

Nettoyage Manus:
- Modules Forge stubbés (dataApi, heartbeat, map, notification, voiceTranscription)
- ENV simplifié (suppression forgeApiUrl, forgeApiKey)
- Analytics Manus supprimées du HTML
- systemRouter simplifié

Migration données:
- 750 fichiers migrés de Forge S3 vers MinIO (69.8 MB)
- URLs DB mises à jour: /manus-storage/ -> /storage/
- Script de migration inclus (scripts/migrate-to-minio.mjs)

Performance:
- Frame load: 500ms -> 62ms (8x plus rapide)
- Plus aucune dépendance réseau transatlantique pour le stockage

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 04:27:48 +00:00
Ubuntu
03a924490c feat: améliorations UX/UI workspace
Chat IA:
- Scroll natif avec auto-scroll vers le dernier message
- Input toujours visible en bas du panneau
- Remplace ScrollArea (ref cassé) par div overflow-y-auto

Panneaux redimensionnables:
- Bottom panel (timeline): drag vertical pour ajuster la hauteur (120-600px)
- Right panel (assistant): drag horizontal pour ajuster la largeur (280-700px)
- Handles visuels avec feedback hover

Timeline:
- Molette = zoom (sans Ctrl), Shift+molette = scroll horizontal
- Zoom max augmenté à 20x
- Clic droit = menu contextuel (aller à frame, set IN/OUT, effacer)
- data-seq-id sur les blocs de séquence pour identification

Génération IA:
- Meilleur error handling avec message dans le toast (8s durée)
- Console.error pour debug navigateur

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 03:13:34 +00:00
Ubuntu
bf689e5911 perf: réduction drastique des temps de chargement
- Cache utilisateur en mémoire (60s TTL) : élimine la query
  getUserByOpenId (~300ms) de chaque requête authentifiée
- Suppression du upsertUser(lastSignedIn) à chaque requête
- staleTime sur toutes les queries (auth.me: 60s, workspace: 30s,
  frames: 120s, home: 15s)
- refetchOnWindowFocus: false partout

Résultat: auth.me 300ms -> 70ms, workspace load 2.5s -> 0.8s

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 02:53:22 +00:00
Ubuntu
cee95145e5 fix: auth ne fait plus d'appel OAuth quand l'utilisateur existe en DB
L'authenticateRequest appelait getUserInfoWithJwt sur l'API Manus
à chaque requête, même pour les utilisateurs déjà en base.
Maintenant: si l'utilisateur existe en DB, on le retourne directement
sans appel réseau externe. L'appel OAuth ne se fait que pour les
nouveaux utilisateurs non-locaux.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 02:34:20 +00:00
Ubuntu
2b64dc25fb fix: admin voit tous les projets, pas seulement les siens
- listAllProjects() pour les admins (sans filtre userId)
- Les users normaux voient toujours uniquement leurs projets

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 02:27:57 +00:00
Ubuntu
51bb69eb88 feat: panneau Génération IA avec regénération fond/personnage
- Nouvel onglet "Génération IA" dans le workspace avec 2 boutons:
  * Regénérer l'arrière-plan (prompt + style)
  * Redessiner le personnage (prompt + sélecteur de character sheet)
- 3 endpoints tRPC: generation.regenerateBackground,
  generation.regenerateCharacter, generation.inpaintBackground
- Fix URLs relatives -> signed URLs S3 absolues pour l'API Forge
- Résultat affiché en preview dans le panneau
- Testé: génération cyberpunk sur frame 200 -> PNG 1344x768 OK

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 02:17:12 +00:00
Ubuntu
0c41340b25 perf: optimisation lecture temps réel et cache images
- Chargement bulk des URLs de frames (1 query au lieu de 1/frame)
- Preload des 30 prochaines frames pendant la lecture
- Cache navigateur activé sur le proxy S3 (max-age=3600, immutable)
- Fallback query tRPC uniquement si la map n'a pas la frame

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 01:49:45 +00:00
Ubuntu
20a643c4ce fix: audit complet et pipeline fonctionnel RetroToon Studio
Corrections critiques:
- Fix titre HTML {{project_title}} -> %VITE_APP_TITLE%
- Suppression vitePluginManusRuntime (360KB -> 4KB index.html)
- Upload vidéo: multer au lieu du parsing binary maison (anti-corruption)
- Extraction audio ffmpeg + sauvegarde sourceAudioUrl en DB
- Page /login dédiée + correction redirect auth
- Test moteurs IA: vrai HEAD request avec latence
- Suppression spam logs [Auth] Missing session cookie
- Fix fuite passwordHash dans auth.me
- Cookie sameSite: none -> lax (CSRF)

Sécurité:
- Endpoints admin protégés par adminProcedure (role=admin requis)
- Sidebar admin masquée pour non-admins
- AdminPanel: page accès refusé pour non-admins
- Bootstrap admin optimisé (skip rehash si identique)

Fonctionnalités:
- Export vidéo MP4 réel via ffmpeg local (H.264 + AAC audio)
- Download parallèle par batch de 20 (export 10x plus rapide)
- Détection de scènes réelle via ffmpeg scene detect
- Analyse arrière-plans via Gemini Vision (remplace Math.random)
- Gemini: conservation du role system + support image_url
- Suppression thinking.budget_tokens:128 (LLM config)
- Thumbnails de frames dans la timeline
- Toast export avec bouton télécharger
- Endpoint extraction audio à la demande

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-21 01:37:08 +00:00
Manus
e72537b20b feat: Import vidéo robuste + Multi-LLM Gemini + NLE Workspace complet
🎬 RetroToon Studio - Pipeline IA de recomposition de dessins animés

 Fonctionnalités:
- Import vidéo avec 3 modes (Rapide/Qualité/Personnalisé)
- Extraction frames robuste avec tolérance aux erreurs réseau
- Détection de plans par histogramme chi-squared
- Workspace NLE avec 6 modes de viewport
- Timeline avec séquences, marqueurs et audio synchronisé
- Loupe duale (zoom 2-8×, grille pixel)
- Assistant IA en langage naturel
- Segmentation par calques (SAM 2 architecture)
- Administration des moteurs IA

🧠 Intelligence Artificielle:
- Support multi-fournisseur LLM (Gemini 2.5 Flash + Built-in)
- Configuration dynamique depuis l'admin panel
- Fallback automatique entre fournisseurs
- Analyse de frames par vision multimodale

🐛 Corrections:
- Fix projects.get retournant undefined (tRPC interdit)
- Fix frames.getByIndex même problème
- Fix flux d'extraction interrompu par erreurs réseau isolées
- Les frames sont maintenant enregistrées même si l'extraction est partielle

📦 Stack: React 19 + tRPC 11 + Tailwind 4 + Drizzle ORM + MySQL
2026-05-20 01:51:58 +00:00
Manus
2f0fbc0c02 Checkpoint: Refactoring complet du système de raccourcis clavier : remplacement du hook useKeyboardShortcuts par un ShortcutsContext React partagé. Le ViewportPanel et le ShortcutSettings partagent désormais le même état via un Provider unique. Les listeners sont automatiquement désactivés pendant l'enregistrement d'un nouveau raccourci pour éviter les conflits. Les modifications sont immédiatement reflétées dans les tooltips et le listener actif. 47 tests passants, zéro erreur TypeScript. 2026-05-20 00:37:46 +00:00
Manus
6b95c1a362 Checkpoint: Ajout de la fonctionnalité de prévisualisation côte à côte dans le ViewportPanel avec 6 modes de comparaison : Composite, Original, Side-by-Side, Split (curseur glissant), Overlay (opacité variable), Onion Skin. Le composant est branché sur les vraies données de frames via trpc.frames.getByIndex (nouvelle procédure tRPC ajoutée). Gestion d'erreurs robuste avec fallback visuel et indicateur d'état DB. 41 tests passants. 2026-05-20 00:27:25 +00:00
Manus
20e034cd7c Checkpoint: Intégration complète du module servicesConfig : les pipelines FFmpeg (extraction, audio, export) et SAM 2 (segmentation, propagation) lisent la configuration admin et basculent entre mode simulé et service externe. Stratégie de génération LoRA/IP-Adapter avec sélection automatique basée sur modelType du personnage. Contraintes ControlNet/pose intégrées dans le prompt engineering. Cache invalidé automatiquement après sauvegarde admin. 41 tests passants. 2026-05-20 00:15:37 +00:00
Manus
87f507802a Checkpoint: RetroToon Studio v4 - Ajout de l'algorithme de détection de cuts basé sur chi-squared histogramme (hard cuts + dissolves), export vidéo avec bouton fonctionnel dans le workspace, suppression de projet avec cascade complète, compositing amélioré avec alpha blending et propagation temporelle des masques avec drift detection, utilisation effective du maskUrl dans l'inpainting. 34 tests vitest passants, 0 erreur TypeScript. 2026-05-20 00:04:26 +00:00
Manus
fe8e01e948 Checkpoint: RetroToon Studio v3 - Pipeline assistant IA connecté au service réel (assistantOperator), CharactersPanel complet avec aperçu miniature + modal plein écran, suppression avec confirmation, validation type/taille (PNG/JPEG/WebP max 10Mo), toasts d'erreur/succès, endpoint /api/upload/asset dédié aux images de référence. 2026-05-19 23:58:37 +00:00
Manus
09db2c65f9 Checkpoint: RetroToon Studio v2 - Améliorations majeures : Timeline avec édition In/Out par drag (handles visuels + persistance), AdminPanel avec chargement automatique de la config LLM sauvegardée, Mode test fonctionnel avec appel réel à generateImage et affichage de l'image générée, Viewport avec mode Split interactif, LayersPanel avec expansion et slider d'opacité. 25 tests passants, 0 erreur TypeScript. 2026-05-19 23:50:27 +00:00
Manus
60d7d01c4e Checkpoint: RetroToon Studio v1.0 - Application professionnelle de recomposition d'animation. Inclut : thème blueprint architectural, schéma DB complet (8 tables), timeline NLE multipistes, segmentation IA (SAM 2), assistant opérateur autonome avec LLM, moteur de regénération IA, système Character Sheet, administration IA modulaire, mode test/simulation, 22 tests passants, 0 erreur TypeScript. 2026-05-19 23:38:28 +00:00
Manus
ac5969fbe8 Initial project bootstrap 2026-05-19 23:15:42 +00:00