fix : focus after quality change
All checks were successful
release / build (push) Successful in 28s
release / verify-windows (push) Successful in 1m26s

This commit is contained in:
jeanotx32
2026-08-12 14:44:11 +02:00
parent 043823600b
commit d8846aac9a
3 changed files with 48 additions and 2 deletions

View File

@@ -247,6 +247,7 @@ La rotation des jetons se fait alors depuis le dashboard, agent par agent.
| Rappel plein écran sans effet (Linux) | Session Wayland au lieu de X11, ou `DISPLAY` inaccessible au service. Le diagnostic signale les deux | | Rappel plein écran sans effet (Linux) | Session Wayland au lieu de X11, ou `DISPLAY` inaccessible au service. Le diagnostic signale les deux |
| Rappel plein écran sans effet (Windows) | La tâche ne tourne pas dans la session interactive : vérifie que le compte de `-RunAsUser` est bien celui ouvert sur la VM | | Rappel plein écran sans effet (Windows) | La tâche ne tourne pas dans la session interactive : vérifie que le compte de `-RunAsUser` est bien celui ouvert sur la VM |
| Agent en double après réinstallation | `agent.config.json` avait été supprimé : l'agent s'est ré-enrôlé. Supprime le doublon dans le dashboard | | Agent en double après réinstallation | `agent.config.json` avait été supprimé : l'agent s'est ré-enrôlé. Supprime le doublon dans le dashboard |
| Firefox se ferme et rouvre à chaque mise à jour de l'agent (Linux) | `KillMode=process` manquant dans l'unité systemd — un agent installé avant son ajout garde l'ancienne unité. Relance `install-agent.sh` (même options, l'identité est conservée) pour la régénérer |
| Workflow : *unauthorized* au push | `REGISTERYKEY` sans la portée **package**, ou expiré | | Workflow : *unauthorized* au push | `REGISTERYKEY` sans la portée **package**, ou expiré |
### Journaux ### Journaux

View File

@@ -275,6 +275,17 @@ Environment=AGENT_CONFIG=$CONFIG_FILE
ExecStart=$(command -v node) $INSTALL_DIR/agent.cjs ExecStart=$(command -v node) $INSTALL_DIR/agent.cjs
Restart=always Restart=always
RestartSec=5 RestartSec=5
# Sans ceci, systemd tue par défaut tout le cgroup du service à chaque
# redémarrage — y compris Firefox, pourtant lancé "detached" par l'agent
# justement pour lui survivre (packages/agent/src/firefox.ts). "detached"
# côté Node ne fait que le sortir du groupe de processus ; ça ne le sort pas
# du cgroup que systemd surveille, lui. Résultat sans ce réglage : chaque
# "agent.update" (donc chaque process.exit(0) suivi du Restart=always) ferme
# la fenêtre que l'agent au redémarrage aurait dû retrouver via son
# rattachement au port de pilotage, et une nouvelle repart de zéro à la place.
# KillMode=process limite l'arrêt au seul PID suivi par systemd (celui de
# node) et laisse Firefox intact.
KillMode=process
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target

View File

@@ -261,6 +261,16 @@ export class FirefoxController {
// Referme le menu sans rien changer. // Referme le menu sans rien changer.
await this.pressEscape(); await this.pressEscape();
} }
// Le curseur reste sinon posé sur le bouton ou l'option cliquée : la barre
// de contrôles du lecteur, elle, se garde visible tant qu'une souris réelle
// la survole — un comportement voulu pour ne pas la faire disparaître sous
// le curseur d'un vrai spectateur, mais qui la laisse affichée en
// permanence ici puisque rien ne bouge plus ensuite. Un coin sûr : la barre
// du haut du site (pas celle du lecteur), toujours visible d'après le
// réglage plein écran plus haut, donc jamais partie du lecteur.
await this.moveAway();
await this.send('input.releaseActions', { context: this.context }, 5000).catch(() => undefined); await this.send('input.releaseActions', { context: this.context }, 5000).catch(() => undefined);
return { ok: true, label: best.label, already: best.active }; return { ok: true, label: best.label, already: best.active };
@@ -387,8 +397,13 @@ export class FirefoxController {
let launched = false; let launched = false;
this.starting = (async () => { this.starting = (async () => {
// Rattachement d'abord : après un redémarrage de l'agent, la fenêtre est // Rattachement d'abord : après un redémarrage de l'agent, la fenêtre est
// toujours là — et c'est celle qu'OBS capture. // toujours là — et c'est celle qu'OBS capture. Généreux à dessein : un
if (await this.attach(2000)) return; // faux négatif ici (le port répond, mais pas assez vite) déclenche
// launch(), qui tue le profil verrouillé — donc la fenêtre qu'on
// cherchait justement à retrouver. Un redémarrage de l'agent (mise à
// jour comprise) tombe souvent pendant que la VM est encore occupée à
// relancer Node ; mieux vaut patienter que rouvrir Firefox pour rien.
if (await this.attach(8000)) return;
launched = true; launched = true;
await this.launch(); await this.launch();
})(); })();
@@ -638,6 +653,25 @@ export class FirefoxController {
await delay(150); await delay(150);
} }
/** Déplace le curseur vers un coin hors du lecteur, sans cliquer. */
private async moveAway(): Promise<void> {
await this.send(
'input.performActions',
{
context: this.context,
actions: [
{
type: 'pointer',
id: 'stream-control-pointer',
parameters: { pointerType: 'mouse' },
actions: [{ type: 'pointerMove', x: 2, y: 2, origin: 'viewport' }],
},
],
},
5000,
).catch(() => undefined);
}
private async pressEscape(): Promise<void> { private async pressEscape(): Promise<void> {
await this.send( await this.send(
'input.performActions', 'input.performActions',