feat(session-limits): LS5 — détecteur niveau 2 déclaratif + parsing temps partagé

Ajoute un détecteur niveau 2 (RateLimitParser, regex confiné à l'infra) qui
repère les mentions de limite de session dans la sortie textuelle, et factorise
le parsing d'heures dans un module pur (timeparse) partagé entre les niveaux 1
et 2. Le détecteur Claude niveau 1 est refactoré vers timeparse (~-121 lignes).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-16 20:02:24 +02:00
parent 9000b4d09f
commit 98bfcf4f22
7 changed files with 724 additions and 122 deletions

View File

@ -250,12 +250,11 @@ mod tests {
.await
.expect("chaque réveil doit tirer")
.expect("canal ouvert");
if let ScheduledTask::ResumeAgent {
// `ScheduledTask` est mono-variante : déstructuration directe (pas de `if let`).
let ScheduledTask::ResumeAgent {
conversation_id, ..
} = task
{
got.push(conversation_id.expect("conv présent"));
}
} = task;
got.push(conversation_id.expect("conv présent"));
}
got.sort();
assert_eq!(got, vec!["a".to_owned(), "b".to_owned(), "c".to_owned()]);
@ -282,12 +281,10 @@ mod tests {
.await
.expect("les survivants doivent tirer")
.expect("canal ouvert");
if let ScheduledTask::ResumeAgent {
let ScheduledTask::ResumeAgent {
conversation_id, ..
} = task
{
got.push(conversation_id.expect("conv présent"));
}
} = task;
got.push(conversation_id.expect("conv présent"));
}
got.sort();
assert_eq!(got, vec!["keep-1".to_owned(), "keep-2".to_owned()]);