fix(runtime): cancel de background task immédiat et fiable depuis le workstate (#199, QA verte)
Transforme l'annulation d'une background task en contrat immédiat, observable et non-best-effort: - domain/background_task: états Cancelling/Cancelled/CancelFailed et transitions idempotentes; un kill PTY qui échoue est surfacé en CancelFailed plutôt qu'en succès silencieux. - infrastructure/runner + store: cancel effectif de la task ciblée, reconcile marque Cancelling même sans live handle, et départage CancelFailed des tâches pending au boot. - application/background + workstate + orchestrator/wake: chemin de cancel initié depuis le workstate, projection synchronisée de l'état (pas d'attente d'un cycle ambigu). - frontend: projection workstate de l'état cancelled/cancelling/cancelFailed (cancellingRow/cancelFailedRow/cancelButtons), normalization et services. Tests QA verts: background_task_cancel, background_task_runner cancel_wins_even_if_output_is_still_available, background_task_store reconcile_marks_cancelling_without_live_handle_cancel_failed_and_pending, workstate.test.tsx.
This commit is contained in:
@ -4447,8 +4447,7 @@ pub async fn spawn_background_command(
|
||||
|
||||
/// `cancel_background_task` — request cancellation of a running background task.
|
||||
///
|
||||
/// The terminal `Cancelled` state is written by the completion sink; this returns
|
||||
/// the task as currently persisted (absent if it no longer exists).
|
||||
/// Returns the task as currently persisted after the cancel request.
|
||||
///
|
||||
/// # Errors
|
||||
/// Returns an [`ErrorDto`] (`INVALID` for a malformed id, `PROCESS`/`STORE` on
|
||||
@ -4457,13 +4456,13 @@ pub async fn spawn_background_command(
|
||||
pub async fn cancel_background_task(
|
||||
task_id: String,
|
||||
state: State<'_, AppState>,
|
||||
) -> Result<Option<BackgroundTaskDto>, ErrorDto> {
|
||||
) -> Result<BackgroundTaskDto, ErrorDto> {
|
||||
let id = parse_task_id(&task_id)?;
|
||||
state
|
||||
.cancel_background_task
|
||||
.execute(id)
|
||||
.await
|
||||
.map(|out| out.task.map(BackgroundTaskDto::from))
|
||||
.map(|out| BackgroundTaskDto::from(out.task))
|
||||
.map_err(ErrorDto::from)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user