feat(switcher): auto-resume dedicated sessions after a swap

When a legitimate quota hit triggered a swap, killAllPoolSessions tore
down the dedicated interactive sessions (ccl-1-conformvault, ccl-2-scanyze)
along with the pool, then recreatePoolSessions re-opened them at a bare
bash prompt. The operator had to manually re-run
  CLAUDE_CONFIG_DIR=<target> claude --dangerously-skip-permissions --resume <uuid>
after every swap, losing whatever conversation was mid-flight.

saveAllSessions only iterates sessions tracked as "working" in state;
user-driven dedicated sessions are rarely in that state so their resume
UUIDs were never saved.

- saveDedicatedUUIDs: capture resume UUID for every configured dedicated
  session regardless of tracked state, before kill.
- relaunchDedicatedSessions(targetHome): after recreate, send a resume
  command on each dedicated session pointing CLAUDE_CONFIG_DIR at the
  target account's home. Missing UUID → leave at shell, no blind launch.
- isValidResumeUUID hardens against a corrupted resume-id.txt.

New TestDedicatedRelaunchAfterSwap verifies end-to-end: pane capture →
UUID persisted → resume command sent with the correct CLAUDE_CONFIG_DIR.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ubuntu 2026-04-15 20:24:38 +00:00
parent 5cad53ac7a
commit 8fdb1937fc
4 changed files with 169 additions and 14 deletions

View file

@ -1,4 +1,37 @@
# Version actuelle : 0.2.3
# Version actuelle : 0.3.0
## [0.3.0] - 2026-04-15
**Type:** Minor — Auto-resume des sessions dédiées après un swap légitime
### Corrigé
- **Les sessions dédiées (ccl-1-conformvault, ccl-2-scanyze) étaient tuées puis
recréées au bash prompt lors d'un swap légitime** (vrai 429 quota hit),
interrompant le travail interactif en cours. L'opérateur devait relancer
manuellement `claude --resume <uuid>` avec le bon `CLAUDE_CONFIG_DIR` après
chaque swap.
- La couverture de `saveAllSessions()` ne captait que les sessions tracked en
`state="working"`. Les sessions dédiées user-driven étaient ignorées, donc
leur UUID de resume était perdu au kill.
### Ajouté
- `switcher.saveDedicatedUUIDs()` : capture le UUID de chaque session dédiée
configurée, peu importe son tracked state. Appelé juste avant `killAll`.
- `switcher.relaunchDedicatedSessions(targetHome)` : après recréation,
envoie `CLAUDE_CONFIG_DIR=<targetHome> claude --dangerously-skip-permissions
--resume <uuid>` dans chaque session dédiée. Si l'UUID manque, la session
reste au shell (pas de tentative aveugle).
- `isValidResumeUUID()` défense contre un fichier resume-id corrompu (check
longueur 36 + regex hex/dash).
### Tests
- ✅ `TestDedicatedRelaunchAfterSwap` vérifie : capture UUID → write file →
relaunch avec la bonne commande → `CLAUDE_CONFIG_DIR` pointant sur le home
du compte cible.
- ✅ `go test ./...` full suite
### Fichiers modifiés
- `internal/switcher/account_switcher.go`
- `internal/switcher/account_switcher_test.go`
## [0.2.3] - 2026-04-15
**Type:** Patch — Veto 5xx pour écarter les faux positifs persistants