Le frontend consomme l'exécution structurée livrée en D4 :
- AgentChatView : jumeau chat de TerminalView. Accumule les textDelta du
tour courant, badges toolActivity, fige sur final (le contenu final
remplace les deltas, pas de double rendu). Saisie Enter/Shift+Enter.
Au montage : reattach (rejoue le scrollback) ou launch ; au démontage :
détache seulement (jamais de close). Vue pure pilotée par le port.
- LayoutGrid/LeafView : routage cellKind — AgentChatView si "chat",
TerminalView sinon (chemin PTY inchangé). Cache cellKindBySession pour
router correctement après ré-attache/navigation.
- Port AgentGateway : sendPrompt / reattachChat / closeAgentSession ;
cellKind sur TerminalHandle. Adapter Tauri (invoke + Channel<ReplyChunk>)
et mock (MockChatSession, _setChatAgents) étendus.
- Types TS mirrors : CellKind, ReplyChunk, ReattachChatDto + cellKind sur
TerminalSession.
Tests (QA) : 21 Vitest verts — routage chat/pty (non-régression terminal),
accumulation/non-doublon (garde anti-always-green delta!=final), ré-attache
sans re-spawn, envoi Enter vs Shift+Enter, badges toolActivity, mock stream.
npx vitest run : 345 passed, 0 failed. npm run build vert.
Reste D6 (messagerie inter-agents via send_blocking) et D7 (menu restreint
Claude/Codex + retrait custom) pour clore §17.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>