feat(sessions): masquer les sessions externes + terminal plein écran

Masquage persistant des sessions Claude découvertes (lancées hors Arboretum)
qui polluent la liste — calqué sur repos.hidden :
- table hidden_sessions (#9) clé claudeSessionId ; helpers DB
- DiscoveryService pose le champ additif SessionSummary.hidden (resume/fork
  restent possibles, survit à un re-scan)
- routes POST/DELETE /sessions/:id/hide, POST /sessions/hide-discovered
  (masse, un clic), GET /sessions?includeHidden=true
- UI : bouton Masquer par ligne, « Masquer l'historique externe », toggle
  « Afficher les masquées », badge masquée ; store + i18n EN/FR + audit

Terminal plein écran (corrige le sizing) :
- SessionView root s'étire (flex-1) → xterm calcule les bonnes dimensions
- refit robuste (requestAnimationFrame + après resync), h-full sur le wrapper
- bouton plein écran (API Fullscreen), tabbar mobile masquée en fullbleed

DialogPrompt : options en liste verticale pleine largeur (plus de troncature
ni de chevauchement sur les libellés longs / multi-lignes).

Doc : centre d'aide (sessions), README EN/FR, site (showcase), CLAUDE.md.
Tests : discovery (hidden) + route hide/unhide/hide-discovered.
This commit is contained in:
2026-06-22 16:02:27 +02:00
parent bf9c6ba8f3
commit dacff2b98f
22 changed files with 360 additions and 34 deletions

View File

@@ -4,18 +4,21 @@
<span class="badge bg-amber-900 text-amber-200">{{ t(`sessions.dialog.kind.${dialog.kind}`) }}</span>
<span class="text-sm text-amber-100">{{ dialog.waitingFor ?? t('sessions.dialog.waiting') }}</span>
</div>
<div class="mt-2 flex flex-wrap gap-2">
<!-- Options empilées verticalement et pleine largeur : un libellé long (ex. AskUserQuestion) wrappe
proprement au lieu d'être tronqué/collé au suivant comme avec un flex-wrap horizontal. -->
<div class="mt-2 flex flex-col gap-1.5">
<button
v-for="opt in dialog.options"
:key="opt.n"
class="btn text-xs"
class="btn w-full items-start justify-start whitespace-normal break-words text-left text-xs"
:class="opt.selected ? 'border-amber-400 text-amber-200' : ''"
:disabled="busy"
@click="respond('select', opt.n)"
>
<span class="font-mono text-amber-400">{{ opt.n }}</span> {{ opt.label }}
<span class="font-mono text-amber-400">{{ opt.n }}</span>
<span class="min-w-0 flex-1">{{ opt.label }}</span>
</button>
<button class="btn-danger text-xs" :disabled="busy" @click="respond('deny')">
<button class="btn-danger w-full justify-start text-left text-xs" :disabled="busy" @click="respond('deny')">
{{ t('sessions.dialog.deny') }}
</button>
</div>