backup: snapshot post-démo GHT 2026-05-19
Backup état complet après enregistrement vidéo démo de bout en bout. À utiliser comme point de référence pour la consolidation post-démo. Changements majeurs de la session 18-19 mai : - AIVA-URGENCE : page autonome avec preset URL + auto-focus chain - Workflow Demo_urgence_3_db : merge linux_db + steps AIVA + pause humaine NoMachine - Bypass LLM (static_result / static_text) dans replay_engine pour démos déterministes sans appel Ollama - Fix api_stream:3013 — replay_paused au premier polling /next - dag_execute : lift duration_ms vers top-level pour wait runtime - NPM bypass auth /aiva-urgence/ via location ^~ (proxy_host/10.conf hors git) - scripts/cancel-replays.sh — workaround Stop VWB qui ne purge pas la queue Anchors visuels (468) forcés dans le commit pour garantir restorabilité. DB workflows actuelle + ~12 .bak DB de la journée incluses. Sujets identifiés pour consolidation post-démo (TODO) : 1. Bug VWB recapture anchor ne régénère pas le PNG 2. Léa client accumule état mémoire (restart périodique requis) 3. Stop VWB ne purge pas la queue serveur (lien manquant vers /replay/cancel) 4. Bug coord client mss tronqué 2560x60 → mapping Y cassé 5. delay_before/delay_after ignorés au runtime (fix partiel duration_ms) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
169
docs/handoffs/2026-05-16_handoff_ydotool_clipboard.md
Normal file
169
docs/handoffs/2026-05-16_handoff_ydotool_clipboard.md
Normal file
@@ -0,0 +1,169 @@
|
||||
# Handoff session 2026-05-16 matinée — Contournement Ctrl+V NoMachine via ydotool
|
||||
|
||||
**Auteur** : Claude (session 10:00 → 15:10 CEST)
|
||||
**Suite de** : `2026-05-16_handoff_demo3_workflow.md` (handoff du 16 mai 02:04, session 15→16 mai)
|
||||
**Objectif** : démo vidéo "demo 95" jeudi 21 mai 2026 (J-5)
|
||||
|
||||
---
|
||||
|
||||
## 1. Problème résolu
|
||||
|
||||
Bloqueur n°1 du handoff précédent (« clics ne traversent pas NoMachine ») : partiellement résolu.
|
||||
- **Clics Léa via NoMachine** : OK (traversent normalement, propagation pynput → SendInput Windows → NoMachine → VM)
|
||||
- **Key combos avec Ctrl (Ctrl+V, Ctrl+Enter)** : **bloqués par NoMachine en mode "passive grab" par défaut**
|
||||
|
||||
Cause root identifiée (agent de recherche web) : NoMachine Player Windows en passive grab intercepte/avale la touche Ctrl quand "Grab the keyboard input" n'est pas explicitement activé. Source : [KB NoMachine AR01P00959](https://kb.nomachine.com/AR01P00959), [TR08R09811](https://www.nomachine.com/TR08R09811).
|
||||
|
||||
Solution 1 testée (chercher l'option dans le menu NoMachine 9.5.7) : **option introuvable dans l'UI**.
|
||||
|
||||
Solution 2 retenue : **bypasser entièrement NoMachine pour le paste/execute** en injectant les touches *directement dans la VM* via `ydotool` (compatible Wayland natif Ubuntu 26.04).
|
||||
|
||||
---
|
||||
|
||||
## 2. Architecture finale
|
||||
|
||||
```
|
||||
[Léa Windows] --pynput--> [clics Windows] --NoMachine--> [VM Ubuntu DBeaver]
|
||||
(clics OK) (focus zone éditeur SQL)
|
||||
|
||||
[hôte Linux] --SSH--> [VM Ubuntu]
|
||||
prepare_clipboard.sh wl-copy + xsel (gardien boucle) → clipboards Wayland + X11 remplis
|
||||
paste_and_execute.sh ydotool key 29:1 47:1 47:0 29:0 → Ctrl+V dans VM (bypasse NoMachine)
|
||||
ydotool key 29:1 28:1 28:0 29:0 → Ctrl+Enter dans VM
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Livrables créés
|
||||
|
||||
### Scripts (`~/ai/rpa_vision_v3/scripts/`)
|
||||
|
||||
| Fichier | Rôle |
|
||||
|---|---|
|
||||
| `payload_insert_morel.sql` | Payload INSERT SQL (1632 bytes, source de vérité) extrait du backup DB |
|
||||
| `prepare_clipboard_linuxdb.sh` | Pousse payload sur VM, lance gardien boucle qui re-pousse clipboard Wayland + X11 toutes les 0.5s (sinon écrasé par sélection terminal/etc.) |
|
||||
| `paste_and_execute_linuxdb.sh` | Vérifie ydotoold + gardien, déclenche Ctrl+V puis Ctrl+Enter via ydotool dans la VM |
|
||||
|
||||
### Modifications workflows.db (3 backups successifs)
|
||||
|
||||
```
|
||||
workflows.db.backup_2026-05-16_102755_avant_clipboard_relay (avant 1er UPDATE)
|
||||
workflows.db.backup_2026-05-16_111541_avant_rawkeys (tentative raw_keys, abandonnée)
|
||||
workflows.db.backup_2026-05-16_150853_avant_suppr_steps_8_9 (avant suppression key_combos)
|
||||
```
|
||||
|
||||
État final workflow `linux_db` (`wf_0786343fb2b7_1778879244`) : **7 steps**, tous des clics
|
||||
```
|
||||
0 double_click_anchor LINUX_demo
|
||||
1 click_anchor
|
||||
2 click_anchor
|
||||
3 wait_for_anchor
|
||||
4 click_anchor
|
||||
5 click_anchor
|
||||
6 click_anchor
|
||||
```
|
||||
|
||||
Les ex-steps 7 (Ctrl+V) et 8 (Ctrl+Enter) ont été **supprimés** car remplacés par `paste_and_execute_linuxdb.sh` lancé à la main.
|
||||
|
||||
### DB demo_95 (VM)
|
||||
|
||||
Nettoyée : 3 rows propres (DURAND, MARTIN, PETIT), AUTOINCREMENT reset à 3. Prochain INSERT MOREL aura id=4.
|
||||
|
||||
---
|
||||
|
||||
## 4. Dépendances installées dans la VM (Ubuntu 26.04 Wayland)
|
||||
|
||||
```
|
||||
wl-clipboard (wl-copy/wl-paste — clipboard Wayland)
|
||||
openssh-server (SSH depuis Linux hôte)
|
||||
xsel (xsel — clipboard X11/XWayland)
|
||||
x11-xserver-utils (xhost — autoriser connexions X11 locales)
|
||||
ydotool (1.0.4-3 — injection clavier uinput, Wayland-compatible)
|
||||
```
|
||||
|
||||
Démarrage `ydotoold` daemon (pas de service systemd fourni par le paquet Ubuntu) :
|
||||
```bash
|
||||
echo 'loli' | sudo -S sh -c 'nohup setsid ydotoold --socket-path=/tmp/.ydotool_socket --socket-perm=0666 >/var/log/ydotoold.log 2>&1 </dev/null &'
|
||||
```
|
||||
(Inclus dans `paste_and_execute_linuxdb.sh` qui le relance si absent.)
|
||||
|
||||
---
|
||||
|
||||
## 5. À refaire après chaque reboot VM
|
||||
|
||||
1. **xhost** (autorise SSH non-interactif à utiliser xsel sur XWayland) :
|
||||
```bash
|
||||
sshpass -p loli ssh dom@192.168.122.132 \
|
||||
"XAUTH=\$(ls /run/user/1000/.mutter-Xwaylandauth.* 2>/dev/null | head -1); \
|
||||
DISPLAY=:0 XAUTHORITY=\$XAUTH xhost +local:"
|
||||
```
|
||||
2. **prepare_clipboard_linuxdb.sh** (relance gardien clipboard + daemon ydotoold via paste_and_execute si nécessaire)
|
||||
|
||||
---
|
||||
|
||||
## 6. Procédure démo finale
|
||||
|
||||
```bash
|
||||
# AVANT la démo (1 fois, à froid après reboot) :
|
||||
~/ai/rpa_vision_v3/scripts/prepare_clipboard_linuxdb.sh
|
||||
|
||||
# Pour chaque take de la démo :
|
||||
# 1. Lancer workflow linux_db dans VWB (bouton bleu "→ Windows")
|
||||
# 2. Attendre que Léa termine les 7 steps (clics visibles dans la VM via NoMachine)
|
||||
# 3. Dans un terminal Linux hôte :
|
||||
~/ai/rpa_vision_v3/scripts/paste_and_execute_linuxdb.sh
|
||||
# → INSERT collé + exécuté instantanément dans DBeaver (visible à l'écran)
|
||||
```
|
||||
|
||||
Vérif post-démo (compter rows) :
|
||||
```bash
|
||||
sshpass -p loli ssh dom@192.168.122.132 \
|
||||
'python3 -c "import sqlite3; c=sqlite3.connect(\"/home/dom/demo_95\"); print(list(c.execute(\"SELECT id,nom_patient,date_creation FROM requalifications_t2a ORDER BY id DESC LIMIT 2\")))"'
|
||||
```
|
||||
|
||||
Reset pour nouveau take :
|
||||
```bash
|
||||
sshpass -p loli ssh dom@192.168.122.132 \
|
||||
'python3 -c "
|
||||
import sqlite3
|
||||
c = sqlite3.connect(\"/home/dom/demo_95\")
|
||||
c.execute(\"DELETE FROM requalifications_t2a WHERE id > 3\")
|
||||
c.execute(\"UPDATE sqlite_sequence SET seq = 3 WHERE name = '\''requalifications_t2a'\''\")
|
||||
c.commit()"'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. Dette technique créée par cette session
|
||||
|
||||
1. **Couplage hôte ↔ VM dur** : password `loli` en clair dans les scripts (`SSH_PASS`, `SUDO_PASS`). À remplacer par clé SSH + sudoers NOPASSWD pour ydotoold. Hors scope J-5.
|
||||
2. **Gardien clipboard boucle 0.5s** : consomme CPU négligeable mais pas propre. À remplacer post-démo par un mécanisme dbus signal ou systemd path unit qui re-pousse seulement sur événement "clipboard cleared".
|
||||
3. **paste_and_execute lancé à la main** : pas intégré au workflow VWB. Pour intégration auto post-démo, deux options :
|
||||
- **A** : ajouter à Léa un nouveau action_type `shell_remote` (modif executor.py côté Windows + déploiement SCP)
|
||||
- **B** : modifier `replay_engine.py` côté serveur pour exécuter localement (Linux hôte) certains step types au lieu de dispatcher à Léa
|
||||
4. **xhost +local:** : large. À remplacer par xhost SI:localuser:dom post-démo.
|
||||
5. **AUTOINCREMENT id=9** déjà consommé par les tests : reset à 3 pour la démo, mais à vérifier après chaque take.
|
||||
|
||||
---
|
||||
|
||||
## 8. État infra runtime
|
||||
|
||||
- Serveur `rpa-streaming` : actif (PID 308418 mentionné dans handoff précédent)
|
||||
- ydotoold daemon : actif côté VM, socket `/tmp/.ydotool_socket` (0666)
|
||||
- Gardien clipboard : actif côté VM (PID dans `/tmp/clipboard_guard.pid`)
|
||||
- 3 clipboards remplis :
|
||||
- Wayland VM (1633 bytes via wl-copy)
|
||||
- X11 VM (1632 bytes via xsel)
|
||||
- Windows (1632 bytes via Set-Clipboard — peut nécessiter re-push manuel si vidé)
|
||||
|
||||
---
|
||||
|
||||
## 9. Sessions du jour (16 mai)
|
||||
|
||||
- 06:52 → 07:55 : session reprise courte (fermée par Dom par erreur), test workflow → blocage Ctrl+V
|
||||
- 10:00 → 15:10 : session diagnostic+fix complet
|
||||
- Diagnostic clipboard Wayland ≠ X11 (XWayland ne synchronise pas)
|
||||
- Fix : gardien double-write wl-copy + xsel + xhost +local:
|
||||
- Diagnostic NoMachine passive grab mange Ctrl
|
||||
- Fix : bypass via ydotool en SSH dans la VM
|
||||
- Workflow linux_db simplifié (suppression key_combos)
|
||||
Reference in New Issue
Block a user