feat(agent): reprise des sessions au redémarrage (B2) — commande + ResumeProjectPanel

- Tauri : commande list_resumable_agents (projectId) + ResumableAgentListDto
  { resumable } / ResumableAgentDto (camelCase, conversationId omis si None),
  câblage state.rs (réutilise stores + ProfileStore, aucun nouveau port).
- Front : gateway listResumableAgents, ResumeProjectPanel monté à l'ouverture
  de projet (opt-in, FR) : Reprendre (launch_agent nodeId+conversationId),
  Nouvelle conversation (setCellConversation(null) puis launch), Ignorer,
  Tout reprendre/ignorer. resumeSupported=false ⇒ « relance à neuf ».
- doc : §15.2 coquille agents→resumable (alignée use case/back/front).

Tests : app-tauri dto 9/9 ; vitest 324 (+10) ; workspace Rust 0 échec. 0 régression.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-09 13:04:41 +02:00
parent b82e3e1a40
commit 7375f706da
15 changed files with 992 additions and 6 deletions

View File

@ -18,7 +18,8 @@ use application::{
DetectAgentDrift, DetectProfiles, DismissEmbedderSuggestion, FirstRunState, GetMemory,
GitBranches, GitCheckout, GitCommit, GitGraph, GitInit, GitLog, GitStage, GitStatus,
GitUnstage, HealthUseCase, InspectConversation, LaunchAgent, ListAgents, ListEmbedderProfiles,
ListLayouts, ListMemories, ListProfiles, ListProjects, ListSkills, ListTemplates,
ListLayouts, ListMemories, ListProfiles, ListProjects, ListResumableAgents, ListSkills,
ListTemplates,
LiveAgentRegistry, LoadLayout, MoveTabToNewWindow, MutateLayout, OnnxModelView, OpenProject,
OpenTerminal, OrchestratorService, ReadAgentContext, ReadMemoryIndex, ReadProjectContext,
RecallMemory, ReferenceProfiles, RenameLayout, ResizeTerminal, ResolveMemoryLinks,
@ -131,6 +132,9 @@ pub struct AppState {
pub launch_agent: Arc<LaunchAgent>,
/// Hot-swap an agent's runtime profile, relaunching its live session in place (§15.1).
pub change_agent_profile: Arc<ChangeAgentProfile>,
/// Read-only inventory of a project's resumable agent cells, for the reopen
/// panel (§15.2).
pub list_resumable_agents: Arc<ListResumableAgents>,
/// Best-effort inspection of a conversation (last topic + token indicator)
/// for the resume popup (T7). Optional/extensible: backed by a `Vec` of
/// [`domain::ports::SessionInspector`]s; an empty/missing match yields empty
@ -531,6 +535,15 @@ impl AppState {
Arc::clone(&events_port),
));
// Read-only inventory of resumable agent cells (§15.2). Reuses the shared
// project/fs/context/profile stores already injected above — no new port.
let list_resumable_agents = Arc::new(ListResumableAgents::new(
Arc::clone(&store_port),
Arc::clone(&fs_port),
Arc::clone(&contexts_port),
Arc::clone(&profile_store_port),
));
// --- Conversation inspection (T7) ---
// Best-effort, optional, extensible: a `Vec` of SessionInspectors routed
// by profile. Adding an inspectable CLI = pushing one more adapter here.
@ -717,6 +730,7 @@ impl AppState {
delete_agent,
launch_agent,
change_agent_profile,
list_resumable_agents,
inspect_conversation,
project_store,
create_template,