fix(custom-cli): le bouton Stop annule le tour courant sans fermer la session et cascade l'annulation aux agents délégués — stop_agent suit l'arbre des dépendances actives (cancel_current_turn + préemption runtime + enfants d'exécution), TurnCancel tue le process du tour en cours, autorisation requester/sous-arbre sur idea_stop_agent, fixtures DTO runtime_state/node_id alignées — #257 (QA verte)

This commit is contained in:
2026-08-28 22:57:32 +02:00
parent 9505a3305d
commit 1aabc3d702
12 changed files with 534 additions and 110 deletions

View File

@ -11,8 +11,8 @@ use application::AppError;
use application::{
AgentCapability, AgentTicketState, AgentWorkState, CreateAgentOutput,
InspectConversationOutput, LaunchAgentOutput, ListAgentsOutput, ListedAgentCapabilities,
LiveSessionKind, LiveSessionSnapshot, LiveWorkSession, ProjectWorkState, TicketWorkSource,
TicketWorkStatus,
LiveRuntimeState, LiveSessionKind, LiveSessionSnapshot, LiveWorkSession, ProjectWorkState,
TicketWorkSource, TicketWorkStatus,
};
use domain::ids::{AgentId, NodeId, ProfileId, SessionId};
use domain::ports::ConversationDetails;
@ -292,6 +292,7 @@ fn project_work_state_dto_serialises_live_and_busy_camelcase() {
ticket,
since_ms: 1_234,
},
runtime_state: None,
tickets: vec![],
background_tasks: vec![],
}],
@ -328,6 +329,7 @@ fn project_work_state_dto_serialises_tickets_camelcase() {
profile_id: profile,
live: None,
busy: domain::AgentBusyState::Idle,
runtime_state: None,
tickets: vec![
AgentTicketState {
ticket_id: head_ticket,
@ -690,18 +692,21 @@ fn stop_live_agent_response_serialises_camelcase_with_kind() {
use application::{LiveSessionKind, StopLiveAgentOutput};
let agent = AgentId::from_uuid(Uuid::from_u128(11));
let node = NodeId::from_uuid(Uuid::from_u128(12));
let session = SessionId::from_uuid(Uuid::from_u128(13));
let dto = StopLiveAgentResponseDto::from(StopLiveAgentOutput {
agent_id: agent,
node_id: node,
session_id: session,
kind: LiveSessionKind::Structured,
runtime_state: LiveRuntimeState::Stopped,
});
let v = serde_json::to_value(&dto).unwrap();
assert_eq!(v["agentId"], agent.to_string());
assert_eq!(v["sessionId"], session.to_string());
assert_eq!(v["kind"], "structured");
// Stop response carries no node id (the session is gone).
assert_eq!(v["runtimeState"], "stopped");
assert!(v.get("nodeId").is_none());
assert!(v.get("session_id").is_none());
}