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

6.7 KiB

issueRef, version, updatedBy, updatedAt
issueRef version updatedBy updatedAt
#288 5
kind agent_id
agent qa
1788897533882

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