Files
IdeA/.ideai/tickets/288/carnet.md

74 lines
7.3 KiB
Markdown

---
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.