feat(session-limits): LS7 — câblage backend app-tauri (taps niveaux 1&2 + reprise annulable)
Branche le SessionLimitService dans l'application Tauri et expose la surface de reprise/annulation au front. - application/agent/lifecycle.rs : LaunchAgentOutput.profile exposé (None sur réattache/idempotent, Some sur lancement effectif). - application/terminal/registry.rs : StructuredSessions::meta_for_session() (lookup agent/node par SessionId pour le tap niveau 1). - app-tauri/state.rs : ResumeContext(s), AppAgentResumer (impl du port AgentResumer au-dessus de LaunchAgent), instanciation + câblage du SessionLimitService (TokioScheduler + drain des réveils) dans AppState::build. - app-tauri/commands.rs : taps niveau 1 (agent_send) et niveau 2 (launch_agent, parser regex confiné), alimentation de resume_contexts, commande cancel_resume. - app-tauri/lib.rs : enregistrement de cancel_resume dans le handler. - app-tauri/Cargo.toml : dépendance async-trait. Tests : session_limit_wiring.rs (2 tests de composition) + meta_for_session dans structured_registry_d1.rs ; fixtures dto_agents/dto_chat ajustées (profile: None). Tout vert. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -936,6 +936,15 @@ pub struct LaunchAgentOutput {
|
||||
/// avec les use cases A/B et le câblage qui ne lisent que `session` /
|
||||
/// `assigned_conversation_id`.
|
||||
pub structured: Option<StructuredSessionDescriptor>,
|
||||
/// Le **profil résolu** de l'agent lors d'un (re)lancement *effectif* (LS7,
|
||||
/// ARCHITECTURE §21.10-4). `LaunchAgent::execute` le résout déjà en interne (zéro
|
||||
/// I/O supplémentaire) ; on l'expose pour que le câblage app-tauri décide d'armer —
|
||||
/// ou non — le détecteur de limite **niveau 2** (PTY) via la règle de sélection
|
||||
/// `infrastructure::ratelimit::applies` (anti-double-détection N1/N2), sans
|
||||
/// reconstruire la frontière infra côté domaine. `None` sur une **réattache**
|
||||
/// (rebind/idempotent) où aucun profil n'est re-résolu — le câblage n'arme alors
|
||||
/// rien (best-effort, le tour est sans nouvelle session).
|
||||
pub profile: Option<AgentProfile>,
|
||||
}
|
||||
|
||||
/// Registry mapping each [`ProjectorKey`] to its concrete
|
||||
@ -1331,6 +1340,8 @@ impl LaunchAgent {
|
||||
assigned_conversation_id: None,
|
||||
engine_session_id: None,
|
||||
structured: None,
|
||||
// Réattache (rebind de vue) : aucun profil re-résolu.
|
||||
profile: None,
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1350,6 +1361,8 @@ impl LaunchAgent {
|
||||
assigned_conversation_id: None,
|
||||
engine_session_id: None,
|
||||
structured: None,
|
||||
// Idempotent (pas de respawn) : aucun profil re-résolu.
|
||||
profile: None,
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1388,6 +1401,8 @@ impl LaunchAgent {
|
||||
node_id,
|
||||
conversation_id: existing.conversation_id(),
|
||||
}),
|
||||
// Réattache structurée (rebind de vue) : aucun profil re-résolu.
|
||||
profile: None,
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1605,6 +1620,9 @@ impl LaunchAgent {
|
||||
// Chemin PTY/terminal brut : pas de session moteur structurée à cacher.
|
||||
engine_session_id: None,
|
||||
structured: None,
|
||||
// Lancement effectif : profil résolu exposé pour la sélection du détecteur
|
||||
// de limite niveau 2 (§21.10-4) côté câblage.
|
||||
profile: Some(profile.clone()),
|
||||
})
|
||||
}
|
||||
|
||||
@ -1690,6 +1708,9 @@ impl LaunchAgent {
|
||||
node_id,
|
||||
conversation_id: engine_session_id,
|
||||
}),
|
||||
// Lancement structuré effectif : profil résolu exposé (le tap niveau 2 PTY ne
|
||||
// l'arme pas — `applies` est faux pour un profil structuré, §21.10-4).
|
||||
profile: Some(profile.clone()),
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user