feat(background): livraison auto au propriétaire + projection des tâches de fond dans le work-state (T1+T3)
T1 — Wake automatique du propriétaire à la complétion. La complétion d'une tâche de fond est désormais livrée à l'agent propriétaire dès que la session accepte l'envoi (wake.rs : mark_completion_delivered au send accepté), via un drain de flux dédié (structured.rs : drain_reply_stream_with_readiness). L'inbox médiée enfile l'item sans démarrer de tour ni marquer l'agent busy (input/mod.rs : enqueue FIFO silencieux). Régression couverte (tests/agent_wake.rs, tests input/mod.rs). T3 — Tâches de fond projetées dans le read-model du panneau Work. AgentWorkState porte désormais background_tasks (VO AgentBackgroundTaskState), alimenté par un builder best-effort with_background_tasks(store) : union list_open_for_agent + dispatch des completions non livrées par owner_agent_id, erreur store => Vec vide (aucune régression live/busy/tickets). DTO Tauri backgroundTasks et wiring du BackgroundTaskStore côté state.rs. Le frontend, déjà câblé, affiche Cancel/Retry (mapping queued/waiting -> pending, tri sur updatedAtMs). Borne V1 : une tâche terminale déjà livrée n'est plus énumérable (Retry limité à la fenêtre non livrée). Tests : cargo build --workspace OK ; cargo test -p application / -p app-tauri / -p infrastructure verts ; frontend build + vitest verts. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -193,10 +193,7 @@ impl CancelBackgroundTask {
|
||||
///
|
||||
/// # Errors
|
||||
/// [`AppError`] if the runner or store fails.
|
||||
pub async fn execute(
|
||||
&self,
|
||||
task_id: TaskId,
|
||||
) -> Result<CancelBackgroundTaskOutput, AppError> {
|
||||
pub async fn execute(&self, task_id: TaskId) -> Result<CancelBackgroundTaskOutput, AppError> {
|
||||
self.runner.cancel(task_id).await.map_err(map_port_err)?;
|
||||
let task = self.store.get(task_id).await.map_err(map_port_err)?;
|
||||
Ok(CancelBackgroundTaskOutput { task })
|
||||
@ -256,10 +253,7 @@ impl RetryBackgroundTask {
|
||||
/// # Errors
|
||||
/// [`AppError::NotFound`] if the task is unknown, [`AppError::Invalid`] if it
|
||||
/// is not a terminal command task or its command is no longer available.
|
||||
pub async fn execute(
|
||||
&self,
|
||||
task_id: TaskId,
|
||||
) -> Result<SpawnBackgroundCommandOutput, AppError> {
|
||||
pub async fn execute(&self, task_id: TaskId) -> Result<SpawnBackgroundCommandOutput, AppError> {
|
||||
let old = self
|
||||
.store
|
||||
.get(task_id)
|
||||
|
||||
Reference in New Issue
Block a user