feat(session-limits): LS8-front — filet humain niveau 3 (saisie d'heure de reprise)

UI permettant à l'humain de renseigner l'heure de reprise quand le
niveau 2 détecte une limite sans heure exploitable.

- ports/index.ts : setResumeAt(agentId, resetsAtMs) sur InputGateway.
- adapters/input.ts : setResumeAt → invoke("set_resume_at").
- adapters/mock/index.ts : MockInputGateway.setResumeAt (resumeArmings[]).
- features/agents/useAgents.ts : action setResumeAt (sans mutation optimiste).
- features/agents/AgentLimitBadge.tsx : formulaire de saisie d'heure sur
  l'état suspected sans heure + helper pur timeInputToEpochMs (TODO LS7 retiré).
- features/agents/AgentsPanel.tsx : câblage onSetResumeAt.

Tests AgentLimitBadge.test.tsx mis à jour au nouveau contrat + couverture LS8 ;
typecheck propre, suite agents verte.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-17 08:44:54 +02:00
parent c480d2820a
commit 5d9dd32c29
7 changed files with 225 additions and 29 deletions

View File

@ -1561,6 +1561,8 @@ export class MockInputGateway implements InputGateway {
readonly frontAttached: { agentId: string; attached: boolean }[] = [];
/** All recorded cancel-resume calls, in order. */
readonly cancelledResumes: string[] = [];
/** All recorded set-resume-at armings (human net, level 3), in order. */
readonly resumeArmings: { agentId: string; resetsAtMs: number }[] = [];
/**
* What {@link cancelResume} resolves to (mirrors the backend `bool`: whether a
* pending resume was disarmed). Tests can flip it to exercise the "already
@ -1588,6 +1590,10 @@ export class MockInputGateway implements InputGateway {
this.cancelledResumes.push(agentId);
return this.cancelResumeResult;
}
async setResumeAt(agentId: string, resetsAtMs: number): Promise<void> {
this.resumeArmings.push({ agentId, resetsAtMs });
}
}
/** In-memory permissions gateway. */