feat(frontend): queue custom CLI messages while agent is busy and add Final/latest-message navigation — #352 (QA verte)

Custom CLI composer stays active during busy turns: submitting while the
agent works enqueues the message instead of sending it. Local FIFO queue
scoped per cell (projectId+agentId+layoutId+nodeId), entries carry id,
text, attachments snapshot and createdAtMs; single in-flight
transmission, entry removed at send time, auto-drain only on final
chunk, queue preserved on error/Stop with 'Relancer l'agent' action on
stopped cells. 'En attente · N' panel anchored above the composer:
order, 2-line preview, per-entry edit/delete with transient undo, clear
all with confirmation; main button switches Send / 'Mettre en attente'
with live announcement; layout contract updated (CLI visible while
busy, textarea enabled, Stop available). Chat navigation: round up-arrow
under the agent bar jumps to previous Final, round down-arrow above the
composer appears when not at bottom to jump to latest message,
auto-scroll suspended while reading history, prefers-reduced-motion and
44px a11y targets respected.
Ports unchanged (AgentGateway send/cancel/reattach, restartCellAgentRuntime).
QA verte reconfirmée par Git: targeted suites 115/115
(CustomAgentChatView/LayoutGrid/LayoutGrid.chat), git diff --check;
QA: npm run typecheck OK, npm run build OK.
Réserves documentées: queue renderer-local (non persistée après restart
complet), validation visuelle cellules très étroites restante.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-09-13 22:58:27 +02:00
parent 4ec196b988
commit 76d91c3487
6 changed files with 702 additions and 45 deletions

View File

@ -204,6 +204,14 @@
line-height: 1.35;
}
.stopped-agent-cell__queued {
margin: 0 0 8px;
color: var(--color-warning);
font-size: 12px;
font-weight: 650;
line-height: 1.35;
}
.stopped-agent-cell__help {
margin: 4px 0 0;
color: var(--color-muted);
@ -249,6 +257,10 @@
background: var(--color-primary-hover);
}
.stopped-agent-cell__button--queued {
min-height: 44px;
}
@media (max-width: 640px) {
.stopped-agent-cell {
padding: 34px 10px 10px;