// ======================================== // MAIN MODULAIRE - PIPELINE ARCHITECTURALE MODERNE // Responsabilité: Orchestration workflow avec architecture modulaire complète // Usage: node main_modulaire.js [rowNumber] [stackType] // ======================================== const { logSh } = require('./ErrorReporting'); const { tracer } = require('./trace'); // Imports pipeline de base const { readInstructionsData, selectPersonalityWithAI, getPersonalities } = require('./BrainConfig'); const { extractElements, buildSmartHierarchy } = require('./ElementExtraction'); const { generateMissingKeywords } = require('./MissingKeywords'); // ContentGeneration.js supprimé - Utiliser generateSimple depuis selective-enhancement const { generateSimple } = require('./selective-enhancement/SelectiveUtils'); const { injectGeneratedContent } = require('./ContentAssembly'); const { saveGeneratedArticleOrganic } = require('./ArticleStorage'); // Imports modules modulaires const { applySelectiveLayer } = require('./selective-enhancement/SelectiveCore'); const { applyPredefinedStack, applyAdaptiveLayers, getAvailableStacks } = require('./selective-enhancement/SelectiveLayers'); const { applyAdversarialLayer } = require('./adversarial-generation/AdversarialCore'); const { applyPredefinedStack: applyAdversarialStack } = require('./adversarial-generation/AdversarialLayers'); const { applyHumanSimulationLayer } = require('./human-simulation/HumanSimulationCore'); const { applyPredefinedSimulation, getAvailableSimulationStacks, recommendSimulationStack } = require('./human-simulation/HumanSimulationLayers'); const { applyPatternBreakingLayer } = require('./pattern-breaking/PatternBreakingCore'); const { applyPatternBreakingStack, recommendPatternBreakingStack, listAvailableStacks: listPatternBreakingStacks } = require('./pattern-breaking/PatternBreakingLayers'); /** * WORKFLOW MODULAIRE AVEC DONNÉES FOURNIES (COMPATIBILITÉ MAKE.COM/DIGITAL OCEAN) */ async function handleModularWorkflowWithData(data, config = {}) { return await tracer.run('Main.handleModularWorkflowWithData()', async () => { const { selectiveStack = 'standardEnhancement', adversarialMode = 'light', humanSimulationMode = 'none', patternBreakingMode = 'none', saveIntermediateSteps = false, source = 'compatibility_mode' } = config; await tracer.annotate({ modularWorkflow: true, compatibilityMode: true, selectiveStack, adversarialMode, humanSimulationMode, patternBreakingMode, source }); const startTime = Date.now(); logSh(`🚀 WORKFLOW MODULAIRE COMPATIBILITÉ DÉMARRÉ`, 'INFO'); logSh(` 📊 Source: ${source} | Selective: ${selectiveStack} | Adversarial: ${adversarialMode}`, 'INFO'); try { // Utiliser les données fournies directement (skippping phases 1-4) const csvData = data.csvData; const xmlTemplate = data.xmlTemplate; // Décoder XML si nécessaire let xmlString = xmlTemplate; if (xmlTemplate && !xmlTemplate.startsWith(' { const { rowNumber = 2, selectiveStack = 'standardEnhancement', // lightEnhancement, standardEnhancement, fullEnhancement, personalityFocus, fluidityFocus, adaptive adversarialMode = 'light', // none, light, standard, heavy, adaptive humanSimulationMode = 'none', // none, lightSimulation, standardSimulation, heavySimulation, adaptiveSimulation, personalityFocus, temporalFocus patternBreakingMode = 'none', // none, lightPatternBreaking, standardPatternBreaking, heavyPatternBreaking, adaptivePatternBreaking, syntaxFocus, connectorsFocus saveIntermediateSteps = true, // 🆕 NOUVELLE OPTION: Sauvegarder chaque étape source = 'main_modulaire' } = config; await tracer.annotate({ modularWorkflow: true, rowNumber, selectiveStack, adversarialMode, humanSimulationMode, patternBreakingMode, source }); const startTime = Date.now(); logSh(`🚀 WORKFLOW MODULAIRE DÉMARRÉ`, 'INFO'); logSh(` 📊 Ligne: ${rowNumber} | Selective: ${selectiveStack} | Adversarial: ${adversarialMode} | Human: ${humanSimulationMode} | Pattern: ${patternBreakingMode}`, 'INFO'); try { // ======================================== // PHASE 1: PRÉPARATION DONNÉES // ======================================== logSh(`📋 PHASE 1: Préparation données`, 'INFO'); const csvData = await readInstructionsData(rowNumber); if (!csvData) { throw new Error(`Impossible de lire les données ligne ${rowNumber}`); } const personalities = await getPersonalities(); const selectedPersonality = await selectPersonalityWithAI( csvData.mc0, csvData.t0, personalities ); csvData.personality = selectedPersonality; logSh(` ✅ Données: ${csvData.mc0} | Personnalité: ${selectedPersonality.nom}`, 'DEBUG'); // ======================================== // PHASE 2: EXTRACTION ÉLÉMENTS // ======================================== logSh(`📝 PHASE 2: Extraction éléments XML`, 'INFO'); const elements = await extractElements(csvData.xmlTemplate, csvData); logSh(` ✅ ${elements.length} éléments extraits`, 'DEBUG'); // ======================================== // PHASE 3: GÉNÉRATION MOTS-CLÉS MANQUANTS // ======================================== logSh(`🔍 PHASE 3: Génération mots-clés manquants`, 'INFO'); const finalElements = await generateMissingKeywords(elements, csvData); logSh(` ✅ Mots-clés complétés`, 'DEBUG'); // ======================================== // PHASE 4: CONSTRUCTION HIÉRARCHIE // ======================================== logSh(`🏗️ PHASE 4: Construction hiérarchie`, 'INFO'); const hierarchy = await buildSmartHierarchy(finalElements); logSh(` ✅ ${Object.keys(hierarchy).length} sections hiérarchisées`, 'DEBUG'); // ======================================== // PHASE 5: GÉNÉRATION CONTENU DE BASE // ======================================== logSh(`💫 PHASE 5: Génération contenu de base`, 'INFO'); const generatedContent = await generateSimple(hierarchy, csvData); logSh(` ✅ ${Object.keys(generatedContent).length} éléments générés`, 'DEBUG'); // 🆕 SAUVEGARDE ÉTAPE 1: Génération initiale let parentArticleId = null; let versionHistory = []; if (saveIntermediateSteps) { logSh(`💾 SAUVEGARDE v1.0: Génération initiale`, 'INFO'); const xmlString = csvData.xmlTemplate.startsWith(' r.success); if (successful.length > 0) { const avgDuration = successful.reduce((sum, r) => sum + r.duration, 0) / successful.length; const bestPerf = successful.reduce((best, r) => r.duration < best.duration ? r : best); const mostEnhancements = successful.reduce((best, r) => { const rTotal = r.selectiveEnhancements + r.adversarialModifications + (r.humanSimulationModifications || 0) + (r.patternBreakingModifications || 0); const bestTotal = best.selectiveEnhancements + best.adversarialModifications + (best.humanSimulationModifications || 0) + (best.patternBreakingModifications || 0); return rTotal > bestTotal ? r : best; }); console.log(` ⚡ Durée moyenne: ${avgDuration.toFixed(0)}ms`); console.log(` 🏆 Meilleure perf: ${bestPerf.stack} + ${bestPerf.adversarial} + ${bestPerf.humanSimulation} + ${bestPerf.patternBreaking} (${bestPerf.duration}ms)`); console.log(` 🔥 Plus d'améliorations: ${mostEnhancements.stack} + ${mostEnhancements.adversarial} + ${mostEnhancements.humanSimulation} + ${mostEnhancements.patternBreaking} (${mostEnhancements.selectiveEnhancements + mostEnhancements.adversarialModifications + (mostEnhancements.humanSimulationModifications || 0) + (mostEnhancements.patternBreakingModifications || 0)})`); } return results; } /** * INTERFACE LIGNE DE COMMANDE */ async function main() { const args = process.argv.slice(2); const command = args[0] || 'workflow'; try { switch (command) { case 'workflow': const rowNumber = parseInt(args[1]) || 2; const selectiveStack = args[2] || 'standardEnhancement'; const adversarialMode = args[3] || 'light'; const humanSimulationMode = args[4] || 'none'; const patternBreakingMode = args[5] || 'none'; console.log(`\n🚀 Exécution workflow modulaire:`); console.log(` 📊 Ligne: ${rowNumber}`); console.log(` 🔧 Stack selective: ${selectiveStack}`); console.log(` 🎯 Mode adversarial: ${adversarialMode}`); console.log(` 🧠 Mode human simulation: ${humanSimulationMode}`); console.log(` 🔧 Mode pattern breaking: ${patternBreakingMode}`); const result = await handleModularWorkflow({ rowNumber, selectiveStack, adversarialMode, humanSimulationMode, patternBreakingMode, source: 'cli' }); console.log('\n✅ WORKFLOW MODULAIRE RÉUSSI'); console.log(`📈 Stats: ${JSON.stringify(result.stats, null, 2)}`); break; case 'benchmark': const benchRowNumber = parseInt(args[1]) || 2; console.log(`\n⚡ Benchmark stacks (ligne ${benchRowNumber})`); const benchResults = await benchmarkStacks(benchRowNumber); console.log('\n📊 Résultats complets:'); console.table(benchResults); break; case 'stacks': console.log('\n📦 STACKS SELECTIVE DISPONIBLES:'); const availableStacks = getAvailableStacks(); availableStacks.forEach(stack => { console.log(`\n 🔧 ${stack.name}:`); console.log(` 📝 ${stack.description}`); console.log(` 📊 ${stack.layersCount} couches`); console.log(` 🎯 Couches: ${stack.layers ? stack.layers.map(l => `${l.type}(${l.llm})`).join(' → ') : 'N/A'}`); }); console.log('\n🎯 MODES ADVERSARIAL DISPONIBLES:'); console.log(' - none: Pas d\'adversarial'); console.log(' - light: Défense légère'); console.log(' - standard: Défense standard'); console.log(' - heavy: Défense intensive'); console.log(' - adaptive: Adaptatif intelligent'); console.log('\n🧠 MODES HUMAN SIMULATION DISPONIBLES:'); const humanStacks = getAvailableSimulationStacks(); humanStacks.forEach(stack => { console.log(`\n 🎭 ${stack.name}:`); console.log(` 📝 ${stack.description}`); console.log(` 📊 ${stack.layersCount} couches`); console.log(` ⚡ ${stack.expectedImpact.modificationsPerElement} modifs | ${stack.expectedImpact.detectionReduction} anti-détection`); }); break; case 'help': default: console.log('\n🔧 === MAIN MODULAIRE - USAGE ==='); console.log('\nCommandes disponibles:'); console.log(' workflow [ligne] [stack] [adversarial] [human] - Exécuter workflow complet'); console.log(' benchmark [ligne] - Benchmark stacks'); console.log(' stacks - Lister stacks disponibles'); console.log(' help - Afficher cette aide'); console.log('\nExemples:'); console.log(' node main_modulaire.js workflow 2 standardEnhancement light standardSimulation'); console.log(' node main_modulaire.js workflow 3 adaptive standard heavySimulation'); console.log(' node main_modulaire.js workflow 2 fullEnhancement none personalityFocus'); console.log(' node main_modulaire.js benchmark 2'); console.log(' node main_modulaire.js stacks'); break; } } catch (error) { console.error('\n❌ ERREUR MAIN MODULAIRE:', error.message); console.error(error.stack); process.exit(1); } } // Export pour usage programmatique (compatibilité avec l'ancien Main.js) module.exports = { // ✨ NOUVEAU: Interface modulaire principale handleModularWorkflow, benchmarkStacks, // 🔄 COMPATIBILITÉ: Alias pour l'ancien handleFullWorkflow handleFullWorkflow: (data) => { // Mapper l'ancien format vers le nouveau format modulaire const config = { rowNumber: data.rowNumber, source: data.source || 'compatibility_mode', selectiveStack: 'standardEnhancement', // Configuration par défaut adversarialMode: 'light', humanSimulationMode: 'none', patternBreakingMode: 'none', saveIntermediateSteps: false }; // Si des données CSV sont fournies directement (Make.com style) if (data.csvData && data.xmlTemplate) { return handleModularWorkflowWithData(data, config); } // Sinon utiliser le workflow normal return handleModularWorkflow(config); }, // 🔄 COMPATIBILITÉ: Autres exports utilisés par l'ancien système testMainWorkflow: () => { return handleModularWorkflow({ rowNumber: 2, selectiveStack: 'standardEnhancement', source: 'test_main_nodejs' }); }, launchLogViewer: () => { // La fonction launchLogViewer est maintenant intégrée dans handleModularWorkflow console.log('✅ Log viewer sera lancé automatiquement avec le workflow'); } }; // Exécution CLI si appelé directement if (require.main === module) { main().catch(error => { console.error('❌ ERREUR FATALE:', error.message); process.exit(1); }); }