--- issueRef: "#288" version: 5 updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} updatedAt: 1788898181382 --- #288 — Tool MCP de redemarrage autonome d'un agent ## Demande utilisateur Ajouter un tool MCP permettant a un agent de demander son propre redemarrage apres ajout de capabilities/plugins, pour continuer le travail avec les nouveaux outils disponibles. ## Cadrage UX - CLI custom: afficher exactement `------- redemarrage de l'agent -------` au call, puis `------- redemarrage de l'agent termine -------` apres injection reussie; en echec `------- redemarrage de l'agent echoue -------` + message court. - TUI native: ne pas injecter ces separateurs; afficher un overlay avec phases `Redemarrage de l'agent...`, `Arret de l'agent en cours...`, `Relance de l'agent...`, `Reprise du travail...`; garder les progress/messages dans l'overlay jusqu'a idle/fin de travail. - Le prompt/instruction de reprise interne est invisible dans l'UI humaine et le viewer transcript. ## Cadrage Architecture - Tool core `idea_restart_self({ reason?: string })` self-only via requester MCP handshake, sans target fourni par le modele. - Retour MCP immediat: `{ restartId, status: "scheduled", message }`; la relance est prouvee par events/UI car le process appelant est stoppe ensuite. - Use case atomique: snapshot reprise -> stop runtime -> relance via LaunchAgent avec `fresh_start=false` et meme `conversation_id` -> injection interne invisible -> events completed/failed. - Events: `AgentRestartRequested`, `AgentRestartPhaseChanged`, `AgentRestartCompleted`, `AgentRestartFailed`. - Invariant: liberer Busy/mailbox meme si la connexion MCP disparait quand l'agent est tue. - Memoire durable ajoutee: `ticket288-agent-self-restart-architecture`. ## DevBackend — livre - Tool MCP `idea_restart_self({ reason? })` implemente. - Identite issue du requester MCP; requester absent/malformed/non live refuse; restart concurrent refuse. - Retour immediat `scheduled` puis orchestration detachee avec delai de flush avant arret du bridge. - Snapshot node/conversation/dimensions/mode structure; stop PTY/structured; nettoyage mailbox/Busy; relance via LaunchAgent avec meme conversation_id et fresh_start=false; injection interne invisible. - Events frontend exposes sur `domain://event`: `agentRestartRequested`, `agentRestartPhaseChanged`, `agentRestartCompleted`, `agentRestartFailed`; phases `stopping`, `releasingInput`, `launching`, `resuming`. - Fichiers touches annonces: `crates/domain/src/{events,orchestrator}.rs`, `crates/application/src/{lib,orchestrator/mod,orchestrator/service}.rs`, `crates/infrastructure/src/orchestrator/mcp/tools.rs`, `crates/infrastructure/tests/mcp_server.rs`, `crates/backend/src/{lib,events}.rs`, `crates/app-tauri/src/commands.rs`, `crates/web-server/src/lib.rs`. - Validations DevBackend: domaine orchestrateur 45/45, mapping MCP 27/27, serveur MCP 41/41, orchestrateur applicatif 81/81, backend 87 passants + 7 socket ignores, app-tauri 82 passants + 1 socket ignore, `cargo check --workspace`, `cargo fmt --check`, `git diff --check` verts. - Reserve: web-server 103/110 en serie; 7 echecs preexistants/fixture PTY `error` au lieu de `terminal.attached`, hors #288 selon DevBackend; un lancement parallele a aussi touche `EMFILE`. ## Etat Backend et frontend livres. En attente validation QA. ## DevFrontend — livre - Ajout des quatre events de restart au `DomainEvent` frontend et de la phase typee. - Projection ephemere partagee dans le provider projet, conservee a travers le demontage/remontage de la cellule pendant la relance. - CLI custom: separateurs UX exacts requested/completed/failed, message d'echec court, deduplication par `(restartId, event type)` et verrouillage du composer durant le cycle. - TUI native: overlay prioritaire sans injection de separateur dans xterm, libelles de phase exacts et annonces/progress conserves jusqu'au signal idle. L'ordre `busy:false` puis `completed` du runtime structure est traite sans overlay bloque. - Aucun ajout au transcript: les marqueurs restent un etat de presentation frontend; le prompt interne de reprise n'est pas consomme ni projete par le frontend. - Tests: provider/overlay (phases, reprise, idle, echec), CLI custom (separateurs, deduplication, echec), integration LayoutGrid (priorite du voile et absence de separateur TUI). - Validations: `npm run test -- --run src/features/announcements/AnnouncementsProvider.test.tsx src/features/agents/CustomAgentChatView.test.tsx src/features/layout/LayoutGrid.cellControlsLayering.test.tsx` -> 92/92; `npm run build` -> OK; `git diff --check` -> OK. - Reserve validation globale: `npm test` termine avec 34 echecs hors fichiers #288 (notamment suites web en timeout et tests agents lies au gateway plugin `listProjectSettings` du chantier deja present); les 3 suites ciblees #288 restent vertes. ## QA — validation independante Verdict: VERT pour #288 sur `feature/288-agent-self-restart-mcp`, avec reserves hors perimetre confirmees. Commandes executees depuis `/home/anthony/Documents/Projects/IdeA`: - `git status --short --branch` -> branche `feature/288-agent-self-restart-mcp`, changements non committes dans le perimetre #288 + metadata ticket. - `cargo test -p infrastructure --test mcp_server restart_self` -> 1/1 passant. - `cargo test -p infrastructure restart_self` -> 3 tests restart-self passants: mapping/catalogue self-only, requester absent/malforme rejete, payload scheduled via handshake. - `cargo test -p backend self_restart_contract_tests` -> 1/1 passant; relance conserve `conversation_id` et `fresh_start=false`. - `cargo test -p backend agent_restart_events_expose_stable_camel_case_contract` -> 1/1 passant; events/phases wire `agentRestartPhaseChanged`, `agentRestartFailed`, `releasingInput`, `launching`. - `npm run test -- --run src/features/announcements/AnnouncementsProvider.test.tsx src/features/agents/CustomAgentChatView.test.tsx src/features/layout/LayoutGrid.cellControlsLayering.test.tsx` depuis `frontend` -> 3 fichiers / 92 tests passants. - `npm run build` depuis `frontend` -> OK. - `cargo check --workspace` -> OK. - `cargo fmt --check` -> OK. - `git diff --check` -> OK. Reserves verifiees: - `cargo test -p web-server` en parallele a echoue avec EMFILE (`Too many open files`) sur 38 tests; ce run n'est pas probant pour #288. - `cargo test -p web-server -- --test-threads=1` reproduit la reserve stable: 103/110, 7 echecs WebSocket/PTY `left: "error" right: "terminal.attached"`; aucun test restart/self-restart dans la liste. - `npm test` depuis `frontend` reproduit 34 echecs globaux hors fichiers #288: `agents.test.tsx` (`listProjectSettings` absent dans le mock), `ProjectsView.ls7.test.tsx`, `WebAgentCell.test.tsx`, `WebApp.test.tsx`, `WebDesktopWorkspace.test.tsx`, `WebMenus.test.tsx`, `WebTicketsSprints.test.tsx`. Les suites #288 ciblees restent vertes. ## Git / AppImage - Git a commite localement #288: `6353757` (`feat(mcp,orchestrator,frontend): tool idea_restart_self, redemarrage autonome d'un agent — #288`). - Git a merge localement vers `develop` avec `c646371` (`--no-ff`), sans action distante. - AppImage reconstruite par Main apres merge: `/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`. - Le remplacement de l'AppImage installee et la relance d'IdeA restent manuels, car relancer IdeA tuerait l'orchestrateur courant.