feat: journée 17 avril — tests E2E validés, dashboard fleet+audit, VWB bridge, cleaner C2
Some checks failed
security-audit / Bandit (scan statique) (push) Successful in 14s
security-audit / pip-audit (CVE dépendances) (push) Successful in 10s
security-audit / Scan secrets (grep) (push) Successful in 8s
tests / Lint (ruff + black) (push) Successful in 13s
tests / Tests unitaires (sans GPU) (push) Failing after 14s
tests / Tests sécurité (critique) (push) Has been skipped

Pipeline E2E complet validé :
  Capture VM → streaming → serveur → cleaner → replay → audit trail
  Mode apprentissage supervisé fonctionne (Léa échoue → humain → reprise)

Dashboard :
  - Cleanup 14→10 onglets (RCE supprimée)
  - Fleet : enregistrer/révoquer agents, tokens, ZIP pré-configuré téléchargeable
  - Audit trail MVP (/audit) : filtres, tableau, export CSV, conformité AI Act/RGPD
  - Formulaire Fleet simplifié (nom + email, machine_id auto)

VWB bridge Léa→VWB :
  - Compound décomposés en N steps (saisie + raccourci visibles)
  - Layout serpentin 3 colonnes (plus colonne verticale)
  - Badge OS 🪟/🐧, filtre OS retiré (admin Linux voit Windows)
  - Fix import SQLite readonly

Cleaner intelligent :
  - Descriptions lisibles (UIA/C2) + détection doublons
  - Logique C2 : UIElement identifié = jamais parasite
  - Patterns parasites resserrés
  - Message Léa : "Je n'y arrive pas, montrez-moi comment faire"

Config agent (INC-1 à INC-7) :
  - SERVER_URL + SERVER_BASE unifiés
  - RPA_OLLAMA_HOST séparé
  - allow_redirects=False sur POST
  - Middleware réécriture URL serveur

CI Gitea : fix token + Flask-SocketIO + ruff propre
Fleet endpoints : /agents/enroll|uninstall|fleet + agent_registry SQLite
Backup : script quotidien workflows.db + audit

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-04-17 17:46:40 +02:00
parent 2fa864b5c7
commit 4f61741420
27 changed files with 5088 additions and 1543 deletions

View File

@@ -53,13 +53,15 @@ export default function WorkflowSelector({
}
}, [editingId]);
// Charger les workflows appris quand le dropdown s'ouvre (filtrés par OS)
// Charger les workflows appris quand le dropdown s'ouvre (tous OS)
// Note : pas de filtre OS — un admin Linux doit pouvoir voir et importer
// les workflows captés sur Windows (et inversement à terme avec CLIP OS)
const loadLearnedWorkflows = useCallback(async () => {
setLearnedLoading(true);
try {
const data = await api.getLearnedWorkflows(undefined, userOS);
const data = await api.getLearnedWorkflows();
// Ne garder que ceux qui ne sont pas encore importés
setLearnedWorkflows(data.workflows.filter(w => !w.already_imported));
setLearnedWorkflows(data.workflows.filter((w: LearnedWorkflow) => !w.already_imported));
} catch {
// Silencieux : le streaming server n'est peut-être pas lancé
setLearnedWorkflows([]);
@@ -80,11 +82,10 @@ export default function WorkflowSelector({
(wf.tags || []).some(tag => tag.toLowerCase().includes(search.toLowerCase()))
);
// Filtrer les workflows appris (par recherche + OS)
// Filtrer les workflows appris (par recherche uniquement, pas par OS)
const filteredLearned = learnedWorkflows.filter(wf =>
(wf.name.toLowerCase().includes(search.toLowerCase()) ||
wf.workflow_id.toLowerCase().includes(search.toLowerCase())) &&
(wf.machine_id || '').toLowerCase().includes(userOS)
wf.name.toLowerCase().includes(search.toLowerCase()) ||
wf.workflow_id.toLowerCase().includes(search.toLowerCase())
);
// Workflows récents (les 8 premiers)
@@ -257,9 +258,12 @@ export default function WorkflowSelector({
<span className="learned-badge" title={`Machine: ${wf.machine_id}`}>
appris
</span>
<span className="os-badge" title={`Capturé sur ${(wf.machine_id || '').includes('windows') ? 'Windows' : (wf.machine_id || '').includes('linux') ? 'Linux' : 'Inconnu'}`}>
{(wf.machine_id || '').includes('windows') ? '🪟' : (wf.machine_id || '').includes('linux') ? '🐧' : '❓'}
</span>
</span>
<span className="item-meta">
{wf.nodes} noeuds, {wf.edges} transitions
{wf.nodes} nœuds, {wf.edges} transitions
</span>
<button
className="import-btn"