seo-generator-server/lib/workflow-configuration/WorkflowEngine.js
StillHammer f51c4095f6 Add modular pipeline demo system with real module integration
- Add complete modular demo interface (public/modular-pipeline-demo.html)
- Add standalone demo server (simple-server.js) on port 3333
- Integrate real SelectiveCore, AdversarialCore, HumanSimulation, PatternBreaking modules
- Add configurable pipeline with step-by-step content transformation display
- Add new trend management and workflow configuration modules
- Add comprehensive test suite for full pipeline validation
- Update core modules for better modular integration and demo compatibility

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-23 16:03:20 +08:00

403 lines
13 KiB
JavaScript

// ========================================
// WORKFLOW ENGINE - SÉQUENCES MODULAIRES CONFIGURABLES
// Responsabilité: Gestion flexible de l'ordre d'exécution des phases modulaires
// ========================================
const { logSh } = require('../ErrorReporting');
const { tracer } = require('../trace');
// Import des modules disponibles
const { applySelectiveEnhancement } = require('../selective-enhancement/SelectiveCore');
const { applyAdversarialEnhancement } = require('../adversarial-generation/AdversarialCore');
const { applyHumanSimulation } = require('../human-simulation/HumanSimulationCore');
const { applyPatternBreaking } = require('../pattern-breaking/PatternBreakingCore');
/**
* WORKFLOW ENGINE
* Permet de configurer des séquences personnalisées de traitement modulaire
*/
class WorkflowEngine {
constructor() {
this.name = 'WorkflowEngine';
this.predefinedSequences = new Map();
this.customSequences = new Map();
// Initialiser les séquences prédéfinies
this.initializePredefinedSequences();
}
// ========================================
// SÉQUENCES PRÉDÉFINIES
// ========================================
initializePredefinedSequences() {
// Séquence par défaut (workflow actuel)
this.predefinedSequences.set('default', {
name: 'Default Workflow',
description: 'Séquence standard: Selective → Adversarial → Human → Pattern',
phases: [
{ type: 'selective', config: { enabled: true } },
{ type: 'adversarial', config: { enabled: true } },
{ type: 'human', config: { enabled: true } },
{ type: 'pattern', config: { enabled: true } }
]
});
// Séquence humanisée d'abord
this.predefinedSequences.set('human-first', {
name: 'Human-First Workflow',
description: 'Humanisation d\'abord: Human → Pattern → Selective → Pattern',
phases: [
{ type: 'human', config: { enabled: true } },
{ type: 'pattern', config: { enabled: true, iteration: 1 } },
{ type: 'selective', config: { enabled: true } },
{ type: 'pattern', config: { enabled: true, iteration: 2 } }
]
});
// Séquence anti-détection intensive
this.predefinedSequences.set('stealth-intensive', {
name: 'Stealth Intensive',
description: 'Anti-détection max: Pattern → Adversarial → Human → Pattern → Adversarial',
phases: [
{ type: 'pattern', config: { enabled: true, iteration: 1 } },
{ type: 'adversarial', config: { enabled: true, iteration: 1 } },
{ type: 'human', config: { enabled: true } },
{ type: 'pattern', config: { enabled: true, iteration: 2 } },
{ type: 'adversarial', config: { enabled: true, iteration: 2 } }
]
});
// Séquence qualité d'abord
this.predefinedSequences.set('quality-first', {
name: 'Quality-First Workflow',
description: 'Qualité prioritaire: Selective → Human → Selective → Pattern',
phases: [
{ type: 'selective', config: { enabled: true, iteration: 1 } },
{ type: 'human', config: { enabled: true } },
{ type: 'selective', config: { enabled: true, iteration: 2 } },
{ type: 'pattern', config: { enabled: true } }
]
});
// Séquence équilibrée
this.predefinedSequences.set('balanced', {
name: 'Balanced Workflow',
description: 'Équilibré: Selective → Human → Adversarial → Pattern → Selective',
phases: [
{ type: 'selective', config: { enabled: true, iteration: 1 } },
{ type: 'human', config: { enabled: true } },
{ type: 'adversarial', config: { enabled: true } },
{ type: 'pattern', config: { enabled: true } },
{ type: 'selective', config: { enabled: true, iteration: 2, intensity: 0.7 } }
]
});
logSh(`✅ WorkflowEngine: ${this.predefinedSequences.size} séquences prédéfinies chargées`, 'DEBUG');
}
// ========================================
// EXÉCUTION WORKFLOW CONFIGURABLE
// ========================================
/**
* Exécute un workflow selon une séquence configurée
*/
async executeConfigurableWorkflow(content, config = {}) {
return await tracer.run('WorkflowEngine.executeConfigurableWorkflow()', async () => {
const {
sequenceName = 'default',
customSequence = null,
selectiveConfig = {},
adversarialConfig = {},
humanConfig = {},
patternConfig = {},
csvData = {},
personalities = {}
} = config;
await tracer.annotate({
sequenceName: customSequence ? 'custom' : sequenceName,
isCustomSequence: !!customSequence,
elementsCount: Object.keys(content).length
});
logSh(`🔄 WORKFLOW CONFIGURABLE: ${customSequence ? 'custom' : sequenceName}`, 'INFO');
let currentContent = { ...content };
const workflowStats = {
sequenceName: customSequence ? 'custom' : sequenceName,
phases: [],
totalDuration: 0,
totalModifications: 0,
versioning: new Map()
};
try {
// Obtenir la séquence à exécuter
const sequence = customSequence || this.getSequence(sequenceName);
if (!sequence) {
throw new Error(`Séquence workflow inconnue: ${sequenceName}`);
}
logSh(` 📋 Séquence: ${sequence.name} (${sequence.phases.length} phases)`, 'INFO');
logSh(` 📝 Description: ${sequence.description}`, 'INFO');
const startTime = Date.now();
// Exécuter chaque phase de la séquence
for (let i = 0; i < sequence.phases.length; i++) {
const phase = sequence.phases[i];
const phaseNumber = i + 1;
logSh(`📊 PHASE ${phaseNumber}/${sequence.phases.length}: ${phase.type.toUpperCase()}${phase.config.iteration ? ` (${phase.config.iteration})` : ''}`, 'INFO');
const phaseStartTime = Date.now();
let phaseResult = null;
try {
switch (phase.type) {
case 'selective':
if (phase.config.enabled) {
phaseResult = await this.executeSelectivePhase(currentContent, {
...selectiveConfig,
...phase.config,
csvData,
personalities
});
}
break;
case 'adversarial':
if (phase.config.enabled) {
phaseResult = await this.executeAdversarialPhase(currentContent, {
...adversarialConfig,
...phase.config,
csvData,
personalities
});
}
break;
case 'human':
if (phase.config.enabled) {
phaseResult = await this.executeHumanPhase(currentContent, {
...humanConfig,
...phase.config,
csvData,
personalities
});
}
break;
case 'pattern':
if (phase.config.enabled) {
phaseResult = await this.executePatternPhase(currentContent, {
...patternConfig,
...phase.config,
csvData,
personalities
});
}
break;
default:
logSh(`⚠️ Type de phase inconnue: ${phase.type}`, 'WARNING');
}
// Mettre à jour le contenu et les stats
if (phaseResult) {
currentContent = phaseResult.content;
const phaseDuration = Date.now() - phaseStartTime;
const phaseStats = {
type: phase.type,
iteration: phase.config.iteration || 1,
duration: phaseDuration,
modifications: phaseResult.stats?.modifications || 0,
success: true
};
workflowStats.phases.push(phaseStats);
workflowStats.totalModifications += phaseStats.modifications;
// Versioning
const versionKey = `v1.${phaseNumber}`;
workflowStats.versioning.set(versionKey, {
phase: `${phase.type}${phase.config.iteration ? `-${phase.config.iteration}` : ''}`,
content: { ...currentContent },
timestamp: new Date().toISOString()
});
logSh(` ✅ Phase ${phaseNumber} terminée: ${phaseStats.modifications} modifications en ${phaseDuration}ms`, 'DEBUG');
} else {
logSh(` ⏭️ Phase ${phaseNumber} ignorée (désactivée)`, 'DEBUG');
}
} catch (error) {
logSh(` ❌ Erreur phase ${phaseNumber} (${phase.type}): ${error.message}`, 'ERROR');
workflowStats.phases.push({
type: phase.type,
iteration: phase.config.iteration || 1,
duration: Date.now() - phaseStartTime,
modifications: 0,
success: false,
error: error.message
});
}
}
workflowStats.totalDuration = Date.now() - startTime;
// Version finale
workflowStats.versioning.set('v2.0', {
phase: 'final',
content: { ...currentContent },
timestamp: new Date().toISOString()
});
logSh(`✅ WORKFLOW TERMINÉ: ${workflowStats.totalModifications} modifications en ${workflowStats.totalDuration}ms`, 'INFO');
return {
content: currentContent,
stats: workflowStats,
success: true
};
} catch (error) {
logSh(`❌ Erreur workflow configurable: ${error.message}`, 'ERROR');
workflowStats.totalDuration = Date.now() - startTime;
workflowStats.error = error.message;
return {
content: currentContent,
stats: workflowStats,
success: false,
error: error.message
};
}
});
}
// ========================================
// EXÉCUTION DES PHASES INDIVIDUELLES
// ========================================
async executeSelectivePhase(content, config) {
const result = await applySelectiveEnhancement(content, config);
return {
content: result.content || content,
stats: { modifications: result.stats?.selectiveEnhancements || 0 }
};
}
async executeAdversarialPhase(content, config) {
const result = await applyAdversarialEnhancement(content, config);
return {
content: result.content || content,
stats: { modifications: result.stats?.adversarialModifications || 0 }
};
}
async executeHumanPhase(content, config) {
const result = await applyHumanSimulation(content, config);
return {
content: result.content || content,
stats: { modifications: result.stats?.humanSimulationModifications || 0 }
};
}
async executePatternPhase(content, config) {
const result = await applyPatternBreaking(content, config);
return {
content: result.content || content,
stats: { modifications: result.stats?.patternBreakingModifications || 0 }
};
}
// ========================================
// GESTION DES SÉQUENCES
// ========================================
/**
* Obtenir une séquence (prédéfinie ou personnalisée)
*/
getSequence(sequenceName) {
return this.predefinedSequences.get(sequenceName) || this.customSequences.get(sequenceName);
}
/**
* Créer une séquence personnalisée
*/
createCustomSequence(name, sequence) {
this.customSequences.set(name, sequence);
logSh(`✨ Séquence personnalisée créée: ${name}`, 'INFO');
return sequence;
}
/**
* Lister toutes les séquences disponibles
*/
getAvailableSequences() {
const sequences = [];
// Séquences prédéfinies
for (const [name, sequence] of this.predefinedSequences) {
sequences.push({
name,
...sequence,
isCustom: false
});
}
// Séquences personnalisées
for (const [name, sequence] of this.customSequences) {
sequences.push({
name,
...sequence,
isCustom: true
});
}
return sequences;
}
/**
* Valider une séquence
*/
validateSequence(sequence) {
if (!sequence.name || !sequence.phases || !Array.isArray(sequence.phases)) {
return false;
}
const validTypes = ['selective', 'adversarial', 'human', 'pattern'];
for (const phase of sequence.phases) {
if (!phase.type || !validTypes.includes(phase.type)) {
return false;
}
if (!phase.config || typeof phase.config !== 'object') {
return false;
}
}
return true;
}
/**
* Obtenir le statut du moteur
*/
getEngineStatus() {
return {
predefinedSequences: Array.from(this.predefinedSequences.keys()),
customSequences: Array.from(this.customSequences.keys()),
totalSequences: this.predefinedSequences.size + this.customSequences.size,
availablePhaseTypes: ['selective', 'adversarial', 'human', 'pattern']
};
}
}
// ============= EXPORTS =============
module.exports = { WorkflowEngine };