Files
EVCS/tools/n8n-extract.mjs
Tallagrand Thierry 63d56bf284 Agent IA planificateur EVCS en MODE OMBRE (Advisor Shadow V1)
- Workflow n8n tdfInZns7cqo8fU2 actif (15 min): snapshot HA compact -> prompt FR
  -> LLM local Spark (modèle dynamique via /v1/models) avec fallback OpenRouter
  claude-haiku-4.5 (credential chiffré, clé hors git) -> validation stricte
  (enums, bornes, rejet total si invalide) -> helpers advisor_* + divergence
  + compteurs accord/divergence + logbook.
- GARANTIE OMBRE structurelle: écritures limitées à advisor_*/logbook,
  vérifiée par tests/advisor/run.mjs (16 tests, bloquants au push).
- Kill-switch input_boolean.evcs_advisor_enabled.
- Extension R2 multi-workflows (lib-node-map WORKFLOWS[], build/extract/push
  par fichier, n8n-create.mjs, gen-advisor-workflow.mjs).
- Helpers HA via package NFS + carte dashboard EVCS Master (backup fait).
- 1re reco réelle: auto_solar_plus, cible 35%, accord avec le réel.
- Fix sécurité n8n-push: plus de fallback d'id implicite vers le workflow EVCS.
2026-08-07 22:42:06 +02:00

28 lines
1.1 KiB
JavaScript

#!/usr/bin/env node
// R2 — EXTRACT : workflows JSON → src/ (resynchronisation après édition UI n8n — à éviter).
// Usage : node tools/n8n-extract.mjs [fichierWorkflow]
import fs from 'fs';
import path from 'path';
import { WORKFLOWS, getCode, findWorkflowByFile } from './lib-node-map.mjs';
const fileArg = process.argv.slice(2).find(a => !a.startsWith('--'));
const targets = fileArg ? [findWorkflowByFile(fileArg)].filter(Boolean) : WORKFLOWS;
for (const w of targets) {
if (!fs.existsSync(w.workflowFile)) {
console.log(`(skip ${w.id}: ${w.workflowFile} absent)`);
continue;
}
const wf = JSON.parse(fs.readFileSync(w.workflowFile, 'utf8'));
fs.mkdirSync(w.srcDir, { recursive: true });
for (const { file, node, kind } of w.nodes) {
const n = wf.nodes.find(x => x.name === node);
if (!n) throw new Error(`Node introuvable: ${node} (${w.workflowFile})`);
const code = getCode(n, kind);
fs.writeFileSync(path.join(w.srcDir, file), code);
console.log(`${w.srcDir}/${file} ← "${node}" (${code.length} chars)`);
}
}
console.log('\nExtraction OK');