feat: auto-stop enregistrement (1h) + packaging Léa collaborateurs
- Auto-stop : notification 10 min avant, arrêt automatique après MAX_SESSION_DURATION_S (1h) - Lea.bat : kill des anciens process (python, pythonw, rpa-agent) au démarrage - LISEZMOI : simplifié pour les collaborateurs (pas de replay, juste collecte) - Chat server (5004) vérifié fonctionnel Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -16,7 +16,7 @@ import logging
|
|||||||
import threading
|
import threading
|
||||||
from .config import (
|
from .config import (
|
||||||
SESSIONS_ROOT, AGENT_VERSION, SERVER_URL, MACHINE_ID, LOG_RETENTION_DAYS,
|
SESSIONS_ROOT, AGENT_VERSION, SERVER_URL, MACHINE_ID, LOG_RETENTION_DAYS,
|
||||||
SCREEN_RESOLUTION, DPI_SCALE, OS_THEME, API_TOKEN,
|
SCREEN_RESOLUTION, DPI_SCALE, OS_THEME, API_TOKEN, MAX_SESSION_DURATION_S,
|
||||||
)
|
)
|
||||||
from .core.captor import EventCaptorV1
|
from .core.captor import EventCaptorV1
|
||||||
from .core.executor import ActionExecutorV1
|
from .core.executor import ActionExecutorV1
|
||||||
@@ -136,6 +136,58 @@ class AgentV1:
|
|||||||
time.sleep(30)
|
time.sleep(30)
|
||||||
self.storage.run_auto_cleanup()
|
self.storage.run_auto_cleanup()
|
||||||
|
|
||||||
|
def _auto_stop_loop(self):
|
||||||
|
"""Auto-stop de l'enregistrement après MAX_SESSION_DURATION_S.
|
||||||
|
|
||||||
|
L'utilisateur peut oublier d'arrêter. On notifie à 50 min,
|
||||||
|
puis on arrête automatiquement à 60 min (configurable).
|
||||||
|
"""
|
||||||
|
warn_before = 600 # Prévenir 10 min avant la fin
|
||||||
|
warned = False
|
||||||
|
|
||||||
|
while self.running and self.session_id:
|
||||||
|
elapsed = time.time() - self._session_start_time
|
||||||
|
remaining = MAX_SESSION_DURATION_S - elapsed
|
||||||
|
|
||||||
|
# Notification 10 min avant la fin
|
||||||
|
if not warned and remaining <= warn_before:
|
||||||
|
warned = True
|
||||||
|
mins = int(remaining / 60)
|
||||||
|
logger.info(f"Auto-stop dans {mins} min")
|
||||||
|
try:
|
||||||
|
from .ui.notifications import NotificationManager
|
||||||
|
NotificationManager().notify(
|
||||||
|
"Léa",
|
||||||
|
f"L'enregistrement s'arrêtera automatiquement dans {mins} minutes.",
|
||||||
|
)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Auto-stop
|
||||||
|
if remaining <= 0:
|
||||||
|
logger.info(
|
||||||
|
f"Auto-stop : session {self.session_id} après "
|
||||||
|
f"{int(elapsed)}s ({int(elapsed/60)} min)"
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
from .ui.notifications import NotificationManager
|
||||||
|
NotificationManager().notify(
|
||||||
|
"Léa",
|
||||||
|
f"Enregistrement terminé automatiquement après "
|
||||||
|
f"{int(elapsed/60)} minutes. Merci !",
|
||||||
|
)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Arrêter via l'état partagé (synchronise systray + chat)
|
||||||
|
if self._state is not None:
|
||||||
|
self._state.stop_recording()
|
||||||
|
else:
|
||||||
|
self.stop_session()
|
||||||
|
break
|
||||||
|
|
||||||
|
time.sleep(30) # Vérifier toutes les 30s
|
||||||
|
|
||||||
def start_session(self, workflow_name):
|
def start_session(self, workflow_name):
|
||||||
self.session_id = f"sess_{time.strftime('%Y%m%dT%H%M%S')}_{uuid.uuid4().hex[:6]}"
|
self.session_id = f"sess_{time.strftime('%Y%m%dT%H%M%S')}_{uuid.uuid4().hex[:6]}"
|
||||||
self.session_dir = self.storage.get_session_dir(self.session_id)
|
self.session_dir = self.storage.get_session_dir(self.session_id)
|
||||||
@@ -157,6 +209,11 @@ class AgentV1:
|
|||||||
# Heartbeat Contextuel (Toutes les 5s par defaut)
|
# Heartbeat Contextuel (Toutes les 5s par defaut)
|
||||||
threading.Thread(target=self._heartbeat_loop, daemon=True).start()
|
threading.Thread(target=self._heartbeat_loop, daemon=True).start()
|
||||||
|
|
||||||
|
# Auto-stop : arrêter l'enregistrement après MAX_SESSION_DURATION_S
|
||||||
|
# L'utilisateur peut oublier d'arrêter — on le fait automatiquement
|
||||||
|
self._session_start_time = time.time()
|
||||||
|
threading.Thread(target=self._auto_stop_loop, daemon=True).start()
|
||||||
|
|
||||||
# Watchdog de Commandes (GHOST Replay — legacy fichier)
|
# Watchdog de Commandes (GHOST Replay — legacy fichier)
|
||||||
threading.Thread(target=self._command_watchdog_loop, daemon=True).start()
|
threading.Thread(target=self._command_watchdog_loop, daemon=True).start()
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
============================================================
|
============================================================
|
||||||
|
|
||||||
Bienvenue ! Lea est une assistante qui apprend vos taches
|
Bienvenue ! Lea est une assistante qui apprend vos taches
|
||||||
repetitives sur l'ordinateur et peut les refaire a votre place.
|
repetitives sur l'ordinateur pour pouvoir vous aider.
|
||||||
|
|
||||||
|
|
||||||
PREMIERE INSTALLATION
|
PREMIERE INSTALLATION
|
||||||
@@ -29,13 +29,15 @@ des taches (petite icone ronde, a cote de l'horloge).
|
|||||||
Clic droit sur l'icone pour ouvrir le menu :
|
Clic droit sur l'icone pour ouvrir le menu :
|
||||||
|
|
||||||
- "Apprenez-moi une tache" : Lea observe ce que vous faites
|
- "Apprenez-moi une tache" : Lea observe ce que vous faites
|
||||||
et memorise les etapes.
|
et memorise les etapes. Travaillez normalement, Lea
|
||||||
|
apprend en vous regardant.
|
||||||
|
|
||||||
- "Mes taches" : Liste des taches que Lea a apprises.
|
- "C'est termine" : Arrete l'enregistrement quand vous
|
||||||
Cliquez sur une tache pour que Lea la refasse.
|
avez fini la tache. Si vous oubliez, Lea s'arrete
|
||||||
|
automatiquement apres 1 heure.
|
||||||
|
|
||||||
- "Discuter avec Lea" : Ouvre une fenetre de discussion
|
- "Discuter avec Lea" : Ouvre une fenetre de discussion
|
||||||
pour poser des questions ou donner des instructions.
|
pour poser des questions.
|
||||||
|
|
||||||
- "ARRET D'URGENCE" : Arrete immediatement tout ce que
|
- "ARRET D'URGENCE" : Arrete immediatement tout ce que
|
||||||
Lea est en train de faire.
|
Lea est en train de faire.
|
||||||
@@ -43,6 +45,22 @@ Clic droit sur l'icone pour ouvrir le menu :
|
|||||||
- "Quitter Lea" : Ferme le programme.
|
- "Quitter Lea" : Ferme le programme.
|
||||||
|
|
||||||
|
|
||||||
|
INFORMATIONS IMPORTANTES
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Quand Lea enregistre vos actions, elle capture votre ecran,
|
||||||
|
vos clics et vos frappes clavier.
|
||||||
|
|
||||||
|
- Lea vous previent AVANT chaque enregistrement
|
||||||
|
- Les donnees sensibles (mots de passe, informations
|
||||||
|
medicales) sont automatiquement floutees
|
||||||
|
- L'enregistrement s'arrete automatiquement apres 1 heure
|
||||||
|
- Vous pouvez arreter a tout moment via le menu
|
||||||
|
|
||||||
|
Lea est un systeme base sur l'intelligence artificielle
|
||||||
|
(Article 50, Reglement europeen sur l'IA).
|
||||||
|
|
||||||
|
|
||||||
CONFIGURATION
|
CONFIGURATION
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
@@ -56,30 +74,15 @@ EN CAS DE PROBLEME
|
|||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
- "Python n'est pas installe" : Demandez a votre
|
- "Python n'est pas installe" : Demandez a votre
|
||||||
service informatique d'installer Python 3.10
|
service informatique d'installer Python 3.10+
|
||||||
depuis https://python.org
|
depuis https://python.org
|
||||||
|
|
||||||
- Lea ne demarre pas : Relancez "install.bat" puis
|
- Lea ne demarre pas : Relancez "install.bat" puis
|
||||||
relancez "Lea.bat"
|
relancez "Lea.bat"
|
||||||
|
|
||||||
- Lea est deconnectee : Verifiez votre connexion
|
- Lea est deconnectee : Verifiez votre connexion
|
||||||
internet/reseau. Le serveur est peut-etre en
|
reseau. Le serveur est peut-etre en maintenance.
|
||||||
maintenance.
|
|
||||||
|
|
||||||
- En cas de doute, contactez votre administrateur.
|
- En cas de doute, contactez votre administrateur.
|
||||||
|
|
||||||
|
|
||||||
INFORMATIONS
|
|
||||||
------------
|
|
||||||
|
|
||||||
Lea est un systeme base sur l'intelligence artificielle.
|
|
||||||
|
|
||||||
Quand Lea enregistre vos actions, elle capture votre ecran,
|
|
||||||
vos clics et vos frappes clavier. Les donnees sensibles
|
|
||||||
(mots de passe, informations medicales) sont automatiquement
|
|
||||||
floutees avant envoi.
|
|
||||||
|
|
||||||
Vous pouvez arreter l'enregistrement ou le replay a tout
|
|
||||||
moment via le menu ou le bouton "ARRET D'URGENCE".
|
|
||||||
|
|
||||||
============================================================
|
============================================================
|
||||||
|
|||||||
@@ -7,6 +7,14 @@ title Lea - Assistante IA
|
|||||||
:: ---------------------------------------------------------------
|
:: ---------------------------------------------------------------
|
||||||
cd /d "%~dp0"
|
cd /d "%~dp0"
|
||||||
|
|
||||||
|
:: ---------------------------------------------------------------
|
||||||
|
:: Fermer les anciennes instances de Lea
|
||||||
|
:: ---------------------------------------------------------------
|
||||||
|
taskkill /F /IM pythonw.exe >nul 2>&1
|
||||||
|
taskkill /F /IM python.exe >nul 2>&1
|
||||||
|
taskkill /F /IM rpa-agent.exe >nul 2>&1
|
||||||
|
timeout /t 2 >nul
|
||||||
|
|
||||||
:: ---------------------------------------------------------------
|
:: ---------------------------------------------------------------
|
||||||
:: Verifier que l'installation a ete faite
|
:: Verifier que l'installation a ete faite
|
||||||
:: ---------------------------------------------------------------
|
:: ---------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user