AutomationSequence
V8.0
Phases 7→14 + V8 : Architecture Plugin · Réseau/Serveur · IA/LLM · GUI V8 · Multi-machine · Sécurité avancée · Engine V2 · Tests/Deploy
Introduction V8.0
AutomationSequence est une plateforme d'automatisation de bureau Python, développée par Tristan Ruard. Elle permet de créer, éditer et exécuter des séquences d'actions automatisées — clics, saisies, lectures de fichiers, requêtes réseau, OCR, IA — sans écrire de code.
La V8 est une évolution de la V7.0, ajoutant nettoyage complet + nouvelles fonctionnalités (éditeur visuel, marketplace plugins, multi-séquence). 100% rétrocompatible avec toutes les séquences JSON V5, V6 et V7.
Phase 7 — Architecture Plugin : extensibilité sans modifier le code source
Phase 8 — Réseau : SFTP, SSH, LDAP/AD, IMAP, HL7, TCP (20 actions)
Phase 9 — IA/LLM : Ollama local, OpenAI, classification, OCR++, vision
Phase 10 — GUI V7 : Command Palette, SmartForm, Bibliothèque, Débogueur V2
Phase 11 — Multi-machine : agents distants, variables partagées réseau
Phase 12 — Sécurité avancée : vault AES-256, audit HMAC immuable
Phase 13 — Engine V2 : checkpoint/resume, profiler, async/await
Phase 14 — Tests & Deploy : pytest, PyInstaller, build.bat
Une séquence est un tableau JSON d'actions. Chaque action est un objet avec un champ type et des paramètres spécifiques. Le moteur les exécute séquentiellement dans un thread séparé.
Les variables ($VAR{NOM}) permettent de passer des données entre actions. Elles sont typées (string, int, float, bool, list, dict) et résolubles dans tous les paramètres.
Les séquences JSON sont sauvegardées et rechargées à volonté. Format identique V5/V6/V7/V8.
main.py — Interface tkinter V8 (GUI, Command Palette, Bibliothèque, Canvas Editor)
engine.py — Moteur V8 (checkpoint, profiler, async, 32 workers)
actions.py — 101 actions V6 (Phases 1-6)
network_actions.py — Actions réseau Phase 8
ai_actions.py — Actions IA/LLM Phase 9
agent_client.py — Actions multi-machine Phase 11
plugin_api.py — Système de plugins Phase 7
vault_v2.py + audit.py — Sécurité Phase 12
Installation
Python 3.10+ (recommandé : 3.11 ou 3.12) — Windows 10/11 64-bit
Tesseract OCR (optionnel, pour les actions OCR) : https://github.com/UB-Mannheim/tesseract/wiki
Ollama (optionnel, pour les actions IA en mode offline) : https://ollama.ai
pip install Pillow pynput psutil openpyxl
pip install cryptography schedule pystray
pip install pytesseract pyttsx3
pip install paramiko # Phase 8 — SSH/SFTP
pip install ldap3 # Phase 8 — LDAP/AD
pip install pytest # Phase 14 — Tests
C:\Program Files\Tesseract-OCR\tesseract.exe. Cocher les langues "fra" et "eng" lors de l'installation.ollama pull llama3 (texte) et ollama pull llava (vision). Aucune donnée ne quitte le réseau local.Interface V8
Topbar — Logo, version, fichier courant, statut d'exécution
Toolbar — Boutons Play/Stop/Step/Record, paramètres d'exécution
Log — Journal en temps réel (vert = OK, rouge = KO)
Panneaux latéraux — Bibliothèque (gauche) et Débogueur (droite)
Notebook central — Onglets : Séquence, Variables, Vault, Dashboard, Historique, Paramètres, À Propos, Plugins
Liste des actions avec indentation visuelle (If/ForEach/Macro).
Barre de recherche filtrante, multi-sélection Ctrl/Shift, Drag & Drop.
Menu contextuel clic droit : Éditer, Dupliquer, Monter/Descendre, Supprimer.
Bouton ➕ Ajouter → ouvre la Command Palette.
Liste Treeview de tous les plugins installés avec statut, version, auteur, actions déclarées.
Actions : Activer, Désactiver, Hot-reload (sans redémarrer), Installer depuis ZIP, Ouvrir dossier plugins.
Double-clic → détail complet du plugin.
Raccourcis Clavier
| Raccourci | Action | Nouveauté |
|---|---|---|
| Ctrl+P | Command Palette — recherche parmi toutes les actions | V8 ★ |
| Ctrl+B | Afficher/masquer la Bibliothèque de séquences | V8 ★ |
| F5 | Jouer la séquence (= bouton ▶ JOUER) | V8 ★ |
| F6 | Arrêter l'exécution (= bouton ⏹ STOP) | V8 ★ |
| Ctrl+S | Sauvegarder la séquence (JSON) | V6 |
| Ctrl+O | Charger une séquence (JSON) | V6 |
| Ctrl+Z | Undo (pile de 50 états) | V6 |
| Ctrl+Y | Redo | V6 |
| Ctrl+D | Dupliquer la sélection | V6 |
| Ctrl+A | Sélectionner toutes les actions | V6 |
| Del | Supprimer les actions sélectionnées | V6 |
| Ctrl+C | Copier les actions sélectionnées (presse-papier interne) | V8 ★ |
| Ctrl+V | Coller après la sélection | V8 ★ |
| Ctrl+T | Ouvrir un fichier dans un nouvel onglet | V8 ★ |
| Ctrl+W | Fermer l'onglet courant | V8 ★ |
| F2 / Double-clic | Ouvrir SmartFormDialog (éditeur) | V8 ★ |
| Bouton ▶⤵ Depuis N | Démarrer depuis l'action sélectionnée (ignorer 1→N-1) | V8 ★ |
Command Palette V8
La Command Palette (Ctrl+P) est une fenêtre de recherche rapide à la VS Code. Elle permet d'ajouter n'importe quelle action à la séquence en 2 frappes de touches sans parcourir de menus.
Tapez quelques lettres pour filtrer en temps réel parmi les 145+ types d'actions. Naviguez avec ↑↓, validez avec Entrée.
L'action sélectionnée ouvre automatiquement le SmartFormDialog pré-rempli avec les valeurs par défaut.
Résultats filtrés :
📂 SFTP Envoyer fichier (SFTPPut)
📂 SFTP Télécharger fichier (SFTPGet)
📂 SFTP Lister répertoire (SFTPList)
📂 SFTP Supprimer fichier (SFTPDelete)
📂 SFTP Créer répertoire (SFTPMkdir)
↵ Entrée → SmartFormDialog SFTPPut
SmartFormDialog V8
En V7, chaque type d'action a son propre formulaire de saisie avec des champs typés (entry, int, bool, combo, text, file, password). Fini l'édition JSON brute pour les utilisateurs non-techniques.
Le SmartFormDialog s'ouvre via F2, double-clic sur une action, ou depuis la Command Palette. Il montre les paramètres pertinents pour chaque type avec des libellés clairs en français.
La case "Vue JSON" en haut du formulaire permet de basculer vers l'éditeur JSON brut à tout moment. Le JSON est synchronisé avec le formulaire à la bascule.
Les utilisateurs avancés peuvent éditer directement en JSON ; les débutants utilisent uniquement les champs visuels. Les deux modes produisent le même résultat.
La validation s'effectue au clic "✅ Appliquer" — un message d'erreur s'affiche si le JSON est malformé.
Bibliothèque de Séquences V8
Le panneau gauche masquable (Ctrl+B) liste tous les fichiers JSON du dossier courant. Cliquer "📂 Dossier" pour naviguer vers n'importe quel répertoire. Double-clic = charger la séquence immédiatement.
Clic droit → "⭐ Ajouter aux favoris" pour épingler une séquence. Les favoris sont persistants (seq_favorites.json). Cliquer "⭐ Favoris" pour n'afficher que les favoris.
Survoler une entrée 600ms affiche un tooltip avec les 15 premières actions de la séquence (type + description). Idéal pour retrouver rapidement la bonne séquence sans l'ouvrir.
Débogueur V2 V8
Le panneau droit (bouton 🔬 dans la toolbar) affiche en temps réel toutes les variables avec leur type Python et leur valeur actuelle. Les variables dont la valeur vient de changer s'affichent en orange. Double-clic sur une variable → l'ajoute à la Watch list.
Listez les variables critiques à surveiller. Chaque variable surveille ses changements indépendamment. Del pour retirer une variable de la liste. Les valeurs changées s'affichent en orange.
L'onglet "⚡ Eval" permet d'évaluer n'importe quelle expression $VAR{} pendant l'exécution en pause (mode Step). Pratique pour vérifier les calculs ou explorer les variables complexes (listes, dicts).
$VAR{NOM}_$VAR{PRENOM} → DUPONT_Jean
résultat : $VAR{RESULT} → résultat : OK
12 Thèmes
Original V6 — bleu nuit profond
Violet/rose, fond sombre classique
Jaune/orange, fond prune
Bleu arctique, palette douce
Palette Solarized officielle
Thème clair, bleu glacier
Thème bleu institutionnel
Noir total, accessibilité maximale
Bleu/cyan, fonds sombres profonds
Mauve pastel, tons froids
Jaune warm, tons boisés
Standard Atom/VS Code
prefs.json. Recherchez un thème par son nom dans la barre de filtrage.Variables $VAR{}
Toute valeur de paramètre peut contenir $VAR{NOM} qui sera résolu avant exécution. Les variables sont typées :
| Type | Exemples | Action SetVariable |
|---|---|---|
| string | "Bonjour", "" | varType: "string" |
| int | 42, -5 | varType: "int" |
| float | 3.14, -0.5 | varType: "float" |
| bool | true, false | varType: "bool" |
| list | ["a","b","c"] | varType: "list" |
| dict | {"k":"v"} | varType: "dict" |
Liste : ListAppend (ajouter), ListGet (lire par index), ListLength (longueur)
Dict : DictSet (écrire clé), DictGet (lire clé)
→ "Dossier 20260402_654321"
Une liste en JSON string :
$VAR{MA_LISTE} → ["a","b","c"]
Un dict en JSON string :
$VAR{MON_DICT} → {"nom":""}
If / Else / EndIf — 13 opérateurs
| Opérateur | Description | Exemple | Version |
|---|---|---|---|
| == | Égalité stricte | ifVar=STATUS, ifValue=OK | V5 |
| != | Différence | ifVar=CODE, ifValue=0 | V5 |
| contient | Sous-chaîne | ifVar=MSG, ifValue=ERREUR | V5 |
| est vide | Valeur vide ou espaces | ifVar=RESULTAT | V5 |
| > < >= <= | Comparaison numérique | ifVar=SCORE, ifOp=">", ifValue=80 | V6 |
| regex | Expression régulière | ifVar=ID_DOSSIER, ifValue="^\d{6}$" | V6 |
| expr | Expression arithmétique sécurisée | ifValue="$VAR{A}*2 > 100" | V6 |
| startswith | Commence par | ifVar=NOM, ifValue="Dr." | V8 ★ |
| endswith | Termine par | ifVar=FICHIER, ifValue=".pdf" | V8 ★ |
Boucles & ForEach
Boucle tant que la condition est vraie. La condition est réévaluée à chaque passage.
...actions...
{"type":"DecrementVar","varName":"N","step":1}
{"type":"EndWhile"}
⚠️ Toujours prévoir une sortie (DecrementVar, Break ou Stop) pour éviter les boucles infinies. Utilisez Break pour sortir prématurément, Continue pour passer à l'itération suivante.
Répète un bloc N fois. repeatCount peut contenir $VAR{}.
...actions...
{"type":"EndRepeat"}
list : variable liste Python
csv : fichier CSV → dict par ligne
range : entiers de/à/pas
"forSource":"range",
"forFrom":1,"forTo":10,"forStep":1}
Sauts conditionnels avec Label + GotoLabel. Utile pour les boucles conditionnelles complexes ou les retries manuels.
...actions...
{"type":"GotoLabel","labelName":"RETRY"}
Macros & CallSequence
Une macro est un bloc d'actions réutilisable avec paramètres. Définie dans la même séquence, appelable plusieurs fois avec des paramètres différents.
{"type":"FocusWindow","windowTitle":"$VAR{APP}"},
{"type":"TypeTextClipboard","text":"$VAR{LOGIN}"},
{"type":"EndMacro"},
{"type":"CallMacro","macroName":"CONNEXION",
"macroParams":{"APP":"MonApp","LOGIN":"user"}}
En V8, CallSequence supporte scope=local pour isoler les variables de la sous-séquence. Le returnVar permet de récupérer un résultat dans le scope parent.
"seqPath":"sous-seq.json",
"scope":"local",
"returnVar":"SOUS_RESULT",
"inputVars":{"PARAM":"valeur"}}
scope="shared" (défaut) = comportement V6. scope="local" = variables isolées, idéal pour les sous-séquences réutilisables.Parallélisme — 32 workers
En V8, maxWorkers peut aller jusqu'à 32 (V6 : 4). Chaque worker est tracé individuellement dans le log avec son index [W1], [W2]... et sa durée. Le profiler mesure chaque worker séparément si activé.
{"type":"SFTPPut","host":"srv1",...},
{"type":"SFTPPut","host":"srv2",...},
{"type":"SSHCommand","host":"srv3",...}
{"type":"EndParallel"}
Les actions dans un ParallelBlock partagent le même VariableStore. Éviter d'écrire dans la même variable depuis plusieurs workers simultanément.
Pour des opérations indépendantes (envoyer des fichiers vers plusieurs serveurs, pinger plusieurs hôtes), le parallélisme est idéal.
Le ParallelBlock est synchrone : la séquence attend que tous les workers soient terminés avant de passer à l'action suivante.
AsyncAction / AwaitAsync V8
AsyncAction démarre une action dans un thread séparé et ne bloque pas la séquence. La séquence continue immédiatement à l'action suivante. L'action est identifiée par un asyncId unique.
{"type":"AsyncAction","asyncId":"SSH1",
"action":{"type":"SSHCommand","host":"srv",
"command":"backup.sh","varStdout":"SSH_OUT"}},
// ... d'autres actions pendant ce temps ...
{"type":"Delay","duration":2000},
// Récupérer le résultat quand nécessaire
{"type":"AwaitAsync","asyncId":"SSH1",
"varOk":"SSH_OK","varMsg":"SSH_MSG","timeout":120}
AwaitAsync bloque jusqu'à ce que l'action async identifiée par asyncId soit terminée, ou jusqu'au timeout (secondes).
varOk reçoit "true" ou "false". varMsg reçoit le message de résultat.
Si le timeout est atteint, varOk="false" et varMsg="timeout_Ns". L'action async est annulée.
asyncId et des noms de variables distincts pour chaque action async simultanée.Checkpoint / Resume V8
Le moteur V8 peut sauvegarder périodiquement son état (action courante + toutes les variables) dans checkpoint.json. En cas de crash, coupure de courant ou fermeture accidentelle, il est possible de reprendre exactement là où la séquence s'était arrêtée.
Idéal pour les séquences longues nocturnes traitant des centaines de dossiers.
engine.checkpoint_enabled = True
engine.checkpoint_interval = 10
# Reprendre après un crash
if engine.has_checkpoint():
info = engine.get_checkpoint_info()
print(f"Reprendre depuis l'action {info['idx']+1}")
engine.resume_from_checkpoint()
checkpoint.json est supprimé automatiquement à la fin normale d'une séquence. Il ne persiste qu'en cas d'interruption anormale.Profiler Intégré V8
Le profiler mesure la durée d'exécution de chaque action. À la fin, un rapport s'affiche dans le log avec le Top 10 des actions les plus lentes.
Utile pour identifier les bottlenecks OCR, les WaitForImage trop longs, les requêtes réseau lentes, etc.
engine.profiler_enabled = True
# Après exécution — rapport dans le log :
# ==========================================
# PROFILER — 42 actions — total : 8420ms
# Top 10 actions les plus lentes :
# WaitForImage 2340ms (27.8%)
# ReadTextOnScreen 1180ms (14.0%)
# ==========================================
# Export CSV
engine.export_profiler_report("perf.csv")
Souris, Clavier & Fenêtres
| Type | Description | Paramètres clés |
|---|---|---|
| LeftClick / RightClick / DoubleClick / MiddleClick | Clic à une position | x, y |
| MoveMouse / MouseSmooth | Déplacer le curseur | x, y (smooth: steps) |
| ClickAndDrag | Cliquer-glisser | x, y → x2, y2 |
| ScrollWheel | Molette | x, y, amount |
| MouseHover | Survol (sans clic) | x, y, duration |
| ClickRegion | Clic centre d'une région | x, y, w, h |
| KeyPress | Touche simple | key (VK_CODE) |
| KeyCombo | Combinaison Ctrl/Shift/Alt/Win | key, ctrl, shift, alt, win |
| TypeText | Saisie rapide | text ($VAR{} ok) |
| TypeTextClipboard | Saisie via presse-papiers | text ($VAR{} ok) |
| FocusWindow / CloseWindow / MaximizeWindow / MinimizeWindow | Gestion fenêtres | windowTitle (partiel) |
| WaitForWindow | Attendre l'ouverture d'une fenêtre | windowTitle, timeout |
| LaunchApp | Lancer une application | appPath, args |
| KillProcess | Tuer un processus | processName |
Données, Fichiers & Web
| Catégorie | Actions |
|---|---|
| Chaînes | StringReplace, StringSplit, StringJoin, StringFormat, RegexExtract, HashString, Base64Encode/Decode |
| Fichiers texte | ReadTextFile, WriteTextFile (append), FileCopy, FileMove, FileDelete, FileExists, ListFiles |
| CSV / Excel | ReadCSV, WriteCSV, AppendCSV, ReadExcel, WriteExcel |
| JSON / SQLite | ParseJSON, SQLiteQuery (SELECT→var), SQLiteExecute (INSERT/UPDATE) |
| Variables | SetVariable (6 types), ListAppend/Get/Length, DictSet/Get, CounterIncrement/Reset |
| Web | WebNavigate, HttpRequest (GET/POST/PUT/DELETE, auth Bearer/Basic/ApiKey, body JSON) |
| Système | RunShell (stdout→var), GetEnvVar, SetEnvVar, RunPython (ctx inline) |
| Notifications | SendMail (SMTP TLS), ToastNotification, LogMessage, PlaySound, TextToSpeech |
| Moteur | Delay, SleepUntil, PauseHuman, Assert, SetBreakpoint, Comment |
OCR & Vision (Phase 6)
| Action | Description | Paramètres clés |
|---|---|---|
| ReadTextOnScreen | OCR d'une région d'écran → variable | x, y, w, h, lang, varName, preprocess |
| ClickOnText | OCR + clic au centre du texte détecté | text, x, y, w, h, lang, ignoreCase |
| WaitForTextOnScreen | Polling OCR jusqu'à détection du texte | text, timeout, lang, varName |
| ExtractTextFromImage | OCR sur fichier image/PDF → variable | path, lang, varName, extractRegex |
| WaitForImage | Attendre l'apparition d'une image template | imagePath, confidence, timeout |
| ClickOnImage | Clic sur une image template détectée | imagePath, confidence |
| Screenshot | Capture écran → fichier | path, x, y, w, h |
| AssertPixelColor | Vérifier la couleur d'un pixel | x, y, color (RRGGBB), varName |
lang="fra" pour le français, lang="fra+eng" pour les deux. Le prétraitement PIL (niveaux de gris + contraste) est activé par défaut (preprocess=true).Actions Réseau Phase 8 V8
| Action | Description |
|---|---|
| SFTPPut | Envoyer un fichier local vers serveur SFTP |
| SFTPGet | Télécharger un fichier depuis serveur SFTP |
| SFTPList | Lister un répertoire distant → variable liste |
| SFTPDelete | Supprimer un fichier distant |
| SFTPMkdir | Créer un répertoire distant |
| SSHCommand | Exécuter une commande → stdout/stderr/RC |
| SSHUpload / SSHDownload | Alias SFTP via SSH |
keyPath). Les mots de passe sont résolubles via $VAR{} ou Vault.| Action | Description |
|---|---|
| HL7Send | Envoyer message HL7 v2 via MLLP → ACK |
| HL7ParseMessage | Parser HL7 → dict de segments |
| TCPSend | Envoyer données TCP brut → réponse |
| PingHost | Vérifier l'accessibilité d'un hôte (TCP) |
| Action | Description |
|---|---|
| LDAPSearch | Recherche LDAP → liste de dicts |
| LDAPModify | Modifier un attribut LDAP |
| ADCheckGroup | Vérifier appartenance à un groupe AD |
| ADGetUserInfo | Récupérer infos complètes d'un user AD |
| Action | Description |
|---|---|
| IMAPSearch | Chercher emails → liste d'IDs |
| IMAPReadLast | Lire le dernier email → sujet/corps/from |
| IMAPGetAttachment | Télécharger une pièce jointe |
| IMAPMarkRead | Marquer des emails comme lus |
Actions IA / LLM Phase 9 V8
Ollama local (recommandé) — 100% offline, offline sécurisé :
ollama pull llama3 (texte) · ollama pull llava (vision)
Aucune donnée ne quitte le réseau.
OpenAI API — GPT-4o-mini (texte), GPT-4o (vision)
Requiert une clé API. Déconseillé pour les données personnelles.
Azure OpenAI — Déploiement privé Azure hébergé en France.
Configuration dans prefs.json section "ai" ou paramètre provider par action. La détection auto choisit Ollama si disponible, sinon OpenAI.
| Action | Description |
|---|---|
| LLMPrompt | Prompt libre → variable réponse |
| LLMClassify | Classer un texte parmi N catégories |
| LLMSummarize | Résumé (ton : neutre/technique/administratif) |
| LLMExtractFields | Extraction JSON structurée (ID_DOSSIER, NomContact...) |
| LLMOCRCorrect | Correction post-OCR par LLM |
| ImageAnalyze | Vision IA (screenshot/fichier) → description |
| LLMSelfHeal | Auto-correction d'action échouée → suggestion JSON |
Multi-machine Phase 11 V8
Déployer agent_server.py sur chaque poste distant (avec Python + dépendances). L'agent expose une API REST locale.
python agent_server.py --port 9876 --token SECRET
# Options :
# --readonly → lecture seule (pas d'exécution)
# --host 0.0.0.0 → toutes interfaces
# --port 9876 → port HTTP
| Action | Description |
|---|---|
| RemoteRunAction | Exécuter une action sur un agent |
| RemoteRunSequence | Envoyer + exécuter une séquence |
| RemoteStop | Arrêter la séquence d'un agent |
| AgentStatus | État, uptime, stats d'un agent |
| AgentGetVar / AgentSetVar | Lire/écrire une variable distante |
Les actions SharedVar* utilisent un fichier JSON sur un partage réseau (lecteur mappé, UNC) pour synchroniser des données entre plusieurs instances AutomationSequence.
Le verrou fichier (cross-process) garantit la cohérence en cas d'accès simultané depuis plusieurs postes.
| Action | Description |
|---|---|
| SharedVarGet | Lire une variable partagée |
| SharedVarSet | Écrire avec lock fichier |
| SharedVarLock | Acquérir/libérer un verrou nommé |
"lockName":"COMPTEUR","action":"acquire"},
{"type":"SharedVarGet","sharedFile":"Z:/shared.json",
"key":"COMPTEUR","varName":"C","default":"0"},
{"type":"CounterIncrement","varName":"C","step":1},
{"type":"SharedVarSet","sharedFile":"Z:/shared.json",
"key":"COMPTEUR","value":"$VAR{C}"},
{"type":"SharedVarLock","sharedFile":"Z:/shared.json",
"lockName":"COMPTEUR","action":"release"}
Vault — Secrets chiffrés
Les actions VaultStore et VaultGet fonctionnent de façon identique à la V6 (Fernet AES-128). Le vault est stocké dans .vault.enc avec la clé dans .vault.key.
Ces actions sont recommandées pour les mots de passe SMTP, LDAP, tokens API dans les séquences JSON. Les valeurs ne sont jamais stockées en clair.
Ne JAMAIS versionner (Git) les fichiers :
.vault.key · .vault.enc · .vault_v2.key · .vault_v2.enc · .audit.key
Si .vault.key est perdu, les secrets sont irrécupérables. Sauvegarder la clé dans un gestionnaire de secrets externe (ex : KeePass).
Vault V2 — AES-256-GCM V8
Le vault V2 (vault_v2.py) remplace Fernet AES-128 par AES-256-GCM avec dérivation de clé PBKDF2-SHA256 (100 000 itérations).
Chaque secret est chiffré avec un sel aléatoire de 16 bytes et un nonce GCM de 12 bytes — impossible de déduire une clé à partir des données chiffrées même avec deux secrets identiques.
Le tag GCM 128 bits détecte toute altération du vault (intégrité authentifiée).
from vault_v2 import migrate_vault_v6_to_v7
migre, erreurs = migrate_vault_v6_to_v7()
print(f"{migre} secrets migrés, {erreurs} erreurs")
# Les anciens .vault.key et .vault.enc sont conservés
# Les actions VaultGet/VaultStore V6 restent compatibles
vault = get_vault_v2()
vault.rotate_key() # Re-chiffre tous les secrets
# Ancienne clé sauvée en .vault_v2.key.bak.YYYYMMDDHHMMSS
Journal d'Audit HMAC V8
Chaque entrée de audit.log signe l'entrée précédente via HMAC-SHA256. Toute modification (suppression, altération) rompt la chaîne et est détectable via audit.verify().
Catégories : SEQUENCE, ACTION, VAULT, PLUGIN, NETWORK, AUTH, SECURITY, SYSTEM.
Rotation automatique au-delà de 1MB → archive .gz horodatée.
Masquage automatique des données sensibles (password, token, key, secret) — conformité RGPD Art. 32.
audit = get_audit()
ok, msg, nb = audit.verify()
print(f"Intégrité : {'✓' if ok else '✗'}")
print(f"{nb} entrées vérifiées")
print(msg)
# Export rapport texte
audit.export_report("rapport_audit_2026.txt", last=500)
.audit.key. Sans cette clé, il est impossible de vérifier l'intégrité des anciens logs. Sauvegarder avec les clés vault.Architecture Plugin V8
mon_plugin/
__init__.py ← vide
plugin.py ← classe BasePlugin
manifest.json ← métadonnées
"name": "Mon Plugin",
"version": "1.0.0",
"author": "Tristan Ruard",
"description": "Description courte",
"actions": ["MonAction1", "MonAction2"]
}
class MonPlugin(BasePlugin):
@property
def manifest(self):
return PluginManifest(
name="Mon Plugin",version="1.0",
author="",description="...",
actions=["MonAction"])
def run_action(self, action, runner):
if action["type"]=="MonAction":
val = runner.vars.get("MA_VAR")
self.log(f"Exécuté avec val={val}")
return True, "MonAction OK"
return False, "Action inconnue"
plugins/mon_plugin_exemple/ avec trois actions exemple : Plugin_LogID, Plugin_FormatDossier, Plugin_GetService.WebhookListen V8
WebhookListen démarre un mini-serveur HTTP sur un port local et attend qu'un appel POST /run arrive. Le payload JSON est injecté dans les variables de la séquence.
Idéal pour déclencher AutomationSequence depuis GLPI, Nagios, un script batch, ou tout autre outil capable d'envoyer une requête HTTP.
"seq_path_var":"WH_SEQ","vars_prefix":"WH_"}
vars=@{CONTACT="DUPONT Jean"}} | ConvertTo-Json
Invoke-RestMethod -Uri "http://localhost:8765/run" `
-Method POST -Body $body -ContentType "application/json"
Scheduler CRON
| Type déclencheur | Champ run_at / interval | Exemple |
|---|---|---|
| once | run_at = "YYYY-MM-DD HH:MM" | Exécution unique le 2026-04-15 à 08:30 |
| daily | run_at = "HH:MM" | Tous les jours à 07:00 |
| hourly | interval = N (heures) | Toutes les 2 heures |
| minutes | interval = N (minutes) | Toutes les 30 minutes |
| weekday | weekday = 0-6, run_at = "HH:MM" | Chaque lundi (0) à 07:00 |
once sont désactivées automatiquement après exécution. Le thread de surveillance vérifie toutes les 10 secondes. La config est persistée dans scheduler.json et rechargée au démarrage.Alertes SMTP & Toast
Onglet Paramètres → Alertes. Configurer le serveur SMTP, les identifiants, le destinataire. Activer "Envoyer à la fin" et/ou "Envoyer en cas d'erreur".
Les notifications desktop (Toast) via plyer s'affichent en bas à droite de Windows.
L'action SendMail permet d'envoyer un mail depuis la séquence avec un sujet et corps personnalisés via $VAR{}. Indépendante du système d'alertes automatiques.
Dashboard & Historique
Onglet 📊 Dashboard. Compteurs OK/KO/Retry en temps réel, barre de progression, ETA, graphique de durée par action (vert=OK, rouge=KO). Rafraîchi à chaque action.
Onglet 📁 Historique. Toutes les sessions sont enregistrées dans history.db (SQLite). Filtre par statut, tri par colonne, suppression. Rétention configurable (défaut 30 jours).
Bouton ⏺ RECORD (pynput). Enregistre clics gauche + pressions de touches. Clic droit ou F9 = stop. Les Delay entre actions sont capturés automatiquement.
Tests Unitaires Phase 14 V8
# Ou via le script Windows :
run_tests.bat
# Tests ciblés :
run_tests.bat variables # VariableStore
run_tests.bat engine # Engine
run_tests.bat actions # ActionRunner
run_tests.bat -v # Verbose complet
test_variables.py (~50 tests) — VariableStore : set/get, types, résolution $VAR{}, list/dict, export/import
test_engine.py (~70 tests) — Engine : SetVariable, If/Else/Endif, ForEach, Repeat, Macro, CallSequence, RunPython, hash, fichiers, SQLite, dry-run
test_actions.py (~80 tests) — ActionRunner avec mocks : strings, regex, hash, base64, fichiers, CSV, SQLite, HTTP (mock requests), Shell, Env, List/Dict, JSON
Build EXE Phase 14 V8
build.bat --no-tests # EXE sans lancer les tests
build.bat --tests # Tests uniquement
build.bat --clean # Nettoyer dist\ et build_temp\
build.bat --help # Afficher l'aide
# EXE généré dans :
dist\AutomationSequence\AutomationSequence.exe
L'EXE PyInstaller est un dossier autonome (--onedir). Copier le dossier dist\AutomationSequence\ sur le poste cible. Python n'est pas requis sur le poste de destination.
Créer un raccourci pointant vers AutomationSequence.exe. Les fichiers de données (prefs.json, manuels HTML) sont copiés dans le même dossier.
FAQ V8
Oui, 100% rétrocompatible. Tous les fichiers JSON V5, V6 et V7 s'ouvrent et s'exécutent sans modification. Les champs V7/V8 (scope, returnVar, asyncId) sont optionnels.
1. Télécharger Ollama : https://ollama.ai
2. ollama pull llama3 (LLM texte, ~4GB) · ollama pull llava (vision, ~4GB)
3. Vérifier : curl http://localhost:11434/api/tags
4. Dans les actions LLM : "provider":"ollama" ou laisser vide (auto-detect)
Installer avec : pip install paramiko. Les actions SFTP et SSH nécessitent paramiko. Les autres actions réseau (IMAP, HL7, TCP) utilisent des modules Python natifs.
Copier le dossier plugins/mon_plugin_exemple/, renommer-le, modifier manifest.json (name, actions), modifier plugin.py (class, run_action). Cliquer "🔄 Hot-reload" dans l'onglet Plugins — le plugin est disponible immédiatement sans redémarrage.
Le checkpoint n'est pas activé par défaut (pour ne pas ralentir les séquences courtes). Pour les séquences longues : engine.checkpoint_enabled = True dans le code, ou via un futur paramètre dans l'onglet Paramètres → Avancé. L'intervalle par défaut est de 10 actions.
Le token dans l'action (agentToken) ne correspond pas au token de l'agent (--token). Vérifier la casse — le token est sensible à la casse. Utiliser $VAR{AGENT_TOKEN} résolu depuis un VaultGet pour éviter le token en clair dans le JSON.
Les modules paramiko (SSH), ldap3, et requests génèrent du trafic réseau que Cortex peut analyser. Si bloqué, contacter votre administrateur système pour ajouter une exception sur python.exe dans le contexte AutomationSequence. Ces modules ne contournent pas la sécurité Windows — ils sont des clients réseau légitimes.
Exécuter une seule fois : python -c "from vault_v2 import migrate_vault_v6_to_v7; print(migrate_vault_v6_to_v7())". Les anciens fichiers .vault.key et .vault.enc sont conservés. Les actions VaultGet/VaultStore dans les séquences JSON restent inchangées et utilisent toujours le vault V6. Utiliser vault_v2.py directement pour les nouveaux secrets.
Editeur Visuel Canvas Flowchart P2-A
Le bouton Map Canvas bascule entre la liste classique et l editeur visuel. Les actions deviennent des noeuds colores relies par des fleches. Chaque noeud affiche le type et la description courte.
Les blocs If/Else, ForEach, Repeat sont representes avec des couleurs specifiques pour visualiser la structure de flux.
Double-clic noeud = ouvrir SmartForm.
Selection = synchronise la Listbox.
Surlignage = action en cours d execution.
Clic droit = menu contextuel Supprimer.
Bleu = Controle flux (If, ForEach)
Vert = Variables
Jaune = Fichiers / CSV / Excel
Orange = Reseau / HTTP / SSH
Violet = IA / LLM
Rouge = Erreur / Breakpoint
Blanc = Systeme / Delay / Log
Utilisez la Liste pour ceer et editer rapidement. Utilisez le Canvas pour visualiser la logique d une sequence complexe ou la documenter. Les deux vues sont synchronisees en temps reel.
Marketplace de Plugins P2-B
Entrer l URL du fichier catalogue.json. Cliquer Actualiser pour charger la liste. Le catalogue peut etre local (file://) ou distant (https://).
1. Selectionner un plugin
2. Cliquer Installer
3. Telechargement + verification SHA-256
4. Extraction dans plugins/ + chargement a chaud
python publish_plugin.py cree un ZIP signe et met a jour le catalogue.json avec le SHA-256 et la version.
Canvas — Éditeur Visuel & Export P2-A
Bouton 🗺 Canvas dans la barre de la séquence. Bascule entre la vue liste (par défaut) et la vue canvas. Le scroll et le zoom sont mémorisés lors du basculement.
La vue canvas affiche chaque action comme un nœud coloré selon sa catégorie. Les flèches montrent le flux d'exécution avec des coudes en L pour les structures imbriquées.
Chaque catégorie d'action a sa couleur :
🟡 Or — Contrôle de flux (If, While, ForEach…)
🔵 Bleu — Variables
🟢 Vert — Souris/clics
🟣 Lavande — Clavier
🔴 Rouge — Fenêtres
🟠 Orange — OCR/écran
⚪ Gris — Système/Delay
3 boutons d'export dans la toolbar du canvas :
• 🖼 Export PNG — capture le canvas en image PNG (nécessite Pillow)
• 📄 Export PDF — exporte en PDF A4 (nécessite Pillow)
• 📋 Export Listing — exporte la séquence en fichier texte indenté (.txt ou .md)
Avant l'export, la vue est automatiquement ajustée pour inclure tous les nœuds.
PIL.ImageGrab — aucun Ghostscript requis.Multi-séquences & Persistance P2-C
Une barre d'onglets se trouve juste sous la toolbar (au-dessus de la zone Bibliothèque/Séquence). Chaque onglet est une séquence indépendante avec son propre état. Le nombre d'actions est affiché entre parenthèses : seq1.json (42).
Bouton + = ouvrir un fichier dans un nouvel onglet • Bouton 🆕 Vide = onglet vierge • Bouton × = fermer • Clic onglet = basculer
Quand l'onglet actif contient déjà des actions, Ctrl+O affiche une fenêtre de choix :
• 🔄 Remplacer l'onglet actif — écrase la séquence courante
• ➕ Ouvrir dans un nouvel onglet — ouvre le fichier à côté
Si l'onglet est vide, le fichier est chargé directement sans demande.
Méthode 1 — Tout copier : Clic droit sur onglet source → Copier toutes les actions vers l'onglet actif. Les actions sont ajoutées à la fin.
Méthode 2 — Sélection fine :
1. Aller dans l'onglet source
2. Sélectionner les actions souhaitées
3. Ctrl+C pour copier
4. Cliquer sur l'onglet cible
5. Ctrl+V pour coller
• 📂 Charger un fichier dans CET onglet
• ➕ Ouvrir dans un NOUVEL onglet
• 🆕 Nouvel onglet vide
• 💾 Sauvegarder
• 📋 Copier toutes les actions → onglet actif
• 📋 Copier les actions vers… (sous-menu)
• ✕ Fermer / Fermer les autres
Ctrl+T = ouvrir fichier dans un nouvel onglet
Ctrl+W = fermer l'onglet courant
Ctrl+C = copier la sélection (presse-papier interne)
Ctrl+V = coller après la sélection
Debuggeur V3 Breakpoints P2-D
La bande grise à gauche de la liste est la gouttière. Clic gauche = poser/retirer un breakpoint (indicateur rouge ●). Clic droit = définir une condition ($VAR{X} == "valeur").
L'exécution s'arrête automatiquement sur chaque breakpoint. En mode STEP, avancez action par action avec le bouton ▶| STEP.
Un breakpoint conditionnel ne suspend l'exécution que si la condition est vraie. Exemples :
$VAR{STATUT} == "ko"
$VAR{N} > 10
$VAR{RESULT} == ""
Clic droit sur la gouttière → saisir la condition.
Bouton 📊 Inspecteur dans la toolbar = panneau latéral droit avec 3 onglets :
• 📦 Vars — toutes les variables, valeur en temps réel, surligné si changée
• 👁 Watch — variables surveillées (watchpoints), valeur et changements
• ⚡ Eval — évaluer une expression $VAR{} à la demande
Bouton 🔴 Débogueur dans Paramètres → Débogueur. Fenêtre dédiée avec 3 onglets :
• 🔴 Breakpoints — liste tous les breakpoints posés avec leurs conditions
• 👁 Watchpoints — ajouter/retirer des variables à surveiller
• 📦 Variables — même vue que le panneau Inspecteur
Bouton ▶⤵ Depuis N dans la toolbar. Sélectionnez d'abord une action dans la liste, puis cliquez ce bouton. L'exécution commence à partir de cette action en ignorant toutes les actions précédentes. Utile pour reprendre après un crash ou déboguer une partie spécifique.
Également disponible via clic droit → ▶⤵ Démarrer ici.
Export EXE Standalone P3-A
python build.py remplace build.bat avec plus de fonctionnalites : detection modules, selecteur plugins, generation version_info.txt, smoke tests post-build, rapport HTML.
installer.nsi genere AutomationSequence-V8-Setup.exe avec raccourcis bureau/menu, association .asq, desinstallateur propre et mode silencieux /S pour SCCM/Intune.
En mode EXE, prefs.json, history.db et scheduler.json sont stockes dans %APPDATA%\AutomationSequence\ pour permettre l installation dans C:\Program Files\ (lecture seule).
Web Dashboard Local P3-B
Serveur HTTP embarque exposant AutomationSequence via navigateur sur http://localhost:7890.
Onglet WEB, cocher Activer, choisir le port, sauvegarder. Ouvrir http://localhost:7890 dans le navigateur.
Play/Stop/Step, compteurs OK/KO, graphe Chart.js, log SSE temps reel, variables (setter), sequence surlignee, historique sessions.
GET /status /vars /log /sequence /history /metrics /events (SSE) /health
POST /play /stop /step /vars/set /sequence/load
ThreadingHTTPServer remplace HTTPServer → Play/Stop/Step depuis le navigateur fonctionnels sans "Déconnecté". Connexions 127.0.0.1 : aucun token requis. Accès réseau distant : token Bearer obligatoire.Assistant IA P3-C
L onglet ASSISTANT genere des sequences JSON a partir de descriptions en francais. Backend : Ollama local (offline) ou OpenAI/Azure.
Cliquer Config IA dans l onglet Assistant.
Ollama (recommande) : provider=ollama, url=http://localhost:11434, model=llama3
OpenAI : provider=openai, cle=sk-..., model=gpt-4o-mini
Sauvegarde dans ai_assistant_history.json. 100 derniers echanges conserves. Bouton Effacer pour reinitialiser le contexte.
Vous ecrivez : Lis le CSV C:/data.csv et envoie chaque ligne par HTTP POST
Cliquer Inserer la sequence generee pour l ajouter a l editeur.
1. https://ollama.ai
2. ollama pull llama3 (4 Go RAM)
3. Ollama sur http://localhost:11434
4. Config IA dans AutomationSequence
llama3 = equilibre qualite/vitesse (7B)
mistral = rapide (7B)
gemma2 = bon francais (9B)
llava = vision + texte
gpt-4o-mini = cloud OpenAI economique
Compatibilité V6 / Migration
Format JSON séquences · Actions Phases 1→6 · Vault Fernet V6 · history.db · scheduler.json · prefs.json (thèmes V6) · alert_config.json · recorder.py · variables.py · dashboard.py · scheduler.py
engine.py (+ checkpoint, profiler, async) · themes.py (+4 thèmes) · main.py (Command Palette, SmartForm, Bibliothèque, onglet Plugins) · CallSequence (+ scope, returnVar) · If (+ startswith, endswith)
plugin_api.py · network_actions.py · ai_actions.py · agent_server.py · agent_client.py · audit.py · vault_v2.py · tests/ · build.bat · AutomationSequence.spec
Correctifs & Améliorations V8 FINAL V8 FINAL
Durée ⏱ en temps réel : nouveau callback on_action_done(idx, ok, dur_ms) dans engine.py → durée et résultat de chaque action remontés au dashboard instantanément.
Dernières actions : tableau Type / ms / Statut alimenté en direct pendant l'exécution.
on_start() / on_stop() : remise à zéro du dashboard à chaque nouvelle exécution.
Statuts désormais cohérents : ✅ TERMINÉ → vert, ⛔ ARRÊTÉ → orange, erreurs → rouge.
Compatibilité statuts anglais legacy (finished, stopped) gérée automatiquement.
ThreadingHTTPServer remplace HTTPServer : la connexion SSE tourne dans son propre thread. Plus de "Déconnecté". Log streaming, events action_ok/ko, sequence_end en temps réel.
Connexions 127.0.0.1 : aucun token requis. Token automatiquement injecté dans le HTML servi → boutons Play/Stop/Step fonctionnels.
Barre d'onglets horizontale au-dessus de la zone principale. Bouton + pour nouvelle séquence, clic pour basculer, × pour fermer. Chaque onglet conserve son état en mémoire.
Ctrl+T ouvre un fichier JSON dans un nouvel onglet.
Plugins chargés après _build_ui() (fix crash au démarrage). Binding <<NotebookTabChanged>> → onglet Plugin se rafraîchit automatiquement à la sélection.
AlertConfig.load() retourne un dict. Fix : alert_cfg.on_error → alert_cfg.get("triggerOnError"). Les alertes SMTP fonctionnent désormais correctement.
plyer>=2.1.0 (notifications desktop) et pytest-json-report>=1.5.0 (rapports build.py) ajoutés. pip install -r requirements.txt installe tout sans erreur.