chore(wip): état runtime .ideai (flux conversation live)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
---
|
||||
upTo: 11b7df5e-f50e-4f4e-b680-37d5fb10af72
|
||||
upTo: c269039f-212a-42a7-a520-2770cb7cc773
|
||||
objective: [Ping inter-agent depuis Main] Test du pont MCP inter-agents. Si tu reçois ce message, réponds via idea_reply avec : (1) "DevFrontend OK — pont inter-agent fonctionnel", (2) le résultat de 144 ÷ 12, e
|
||||
---
|
||||
**Objectif :** [Ping inter-agent depuis Main] Test du pont MCP inter-agents. Si tu reçois ce message, réponds via idea_reply avec : (1) "DevFrontend OK — pont inter-agent fonctionnel", (2) le résultat de 144 ÷ 12, e
|
||||
@ -21,4 +21,6 @@ objective: [Ping inter-agent depuis Main] Test du pont MCP inter-agents. Si tu r
|
||||
- **Prompt:** Implémente le Lot B frontend `workstate delegation/queue snapshot` sur la branche active `feature/workstate-delegation-queue`, en t'appuyant sur le backend/Tauri déjà modifié par DevBackend. Contexte backend disponible: - `ProjectWorkState.agents[].tickets` est maintenant exposé côté DTO camelCase. - Ticket fields TS attendus: `ticketId`, `conversationId`, `position`, `status` (`"inProgress" | "queued"`), `source` (`{ kind: "human" } | { kind: "agent"; agentId: string }`), `requesterLabel`, `taskPreview`, `taskLen`. - Backend inclut les tickets `human` et `agent`; l'UI doit donc libeller clairement "tickets"/"inputs" ou gérer Human/Agent sans prétendre que tout est délégation agent. À faire: 1. Étendre les types frontend dans `frontend/src/domain/index.ts` (`AgentTicketState`, `TicketWorkStatus`, `TicketWorkSource`, `AgentWorkState.tickets`). 2. Adapter le mock gateway pour accepter/normaliser `tickets` si nécessaire. 3. Dans `frontend/src/features/workstate/ProjectWorkStatePanel.tsx`, afficher sous chaque agent une mini-liste compacte des tickets FIFO: - `#1 In progress` ou `#2 Queued` (position + 1), badge visuel cohérent avec l'existant, - requester/source (`Human` pour source human, label requester et/ou agent id court pour agent), - `taskPreview`, indication légère si `taskLen > taskPreview.length`, ticket id court monospace, - agent sans ticket: ne pas ajouter de bruit visuel excessif. 4. Dans le hook `useProjectWorkState`, ajouter un refresh sur l'event `delegationReady` si l'infrastructure d'events frontend existe déjà pour les autres events; sinon explique précisément pourquoi. 5. Mettre à jour/ajouter les tests Vitest pertinents: agent avec ticket inProgress, deux tickets en ordre, agent sans ticket, event `delegationReady` déclenche refresh, mock renvoie tickets. Contraintes: - Respecte le design existant, pas d'actions d'annulation/résolution, pas de nouvelle commande Tauri, pas de lecture logs/handoff. - Ne committe pas. - Ignore les fichiers runtime `.ideai/*` dirty. Vérifications demandées: `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx`, puis `cd frontend && npx tsc --noEmit`. Retourne fichiers modifiés, choix UI, résultats réels des commandes, et tout blocage.
|
||||
- **Response:** Lot B frontend `workstate delegation/queue snapshot` implémenté sur la branche active `feature/workstate-delegation-queue`. Aucun commit effectué. Fichiers modifiés: - `frontend/src/domain/index.ts` - `frontend/src/adapters/mock/index.ts` - `frontend/src/features/workstate/ProjectWorkStatePanel.tsx` - `frontend/src/features/workstate/useProjectWorkState.ts` - `frontend/src/features/workstate/workstate.test.tsx` Choix UI: - Sous-liste compacte uniquement pour les agents qui ont des tickets, sans bruit visuel pour les agents sans ticket. - Tickets triés par `position`, affichés en `#N In progress` / `#N Queued`. - Source humaine libellée `Human`; source agent affichée avec `requesterLabel` + id agent court quand disponible. - `taskPreview` affiché inline, avec suffixe léger `+N` si `taskLen > taskPreview.length`. - `ticketId` court en monospace avec `title` complet. Détails techniques: - Ajout des types `AgentTicketState`, `TicketWorkStatus`, `TicketWorkSource` et `AgentWorkState.tickets`. - `MockWorkStateGateway` accepte et normalise les états legacy sans `tickets` en `tickets: []`. - `useProjectWorkState` rafraîchit maintenant aussi sur l’événement domaine `delegationReady`, via l’infrastructure `SystemGateway.onDomainEvent` déjà existante. Vérifications réelles: - `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx` : OK, `2 passed`, `17 passed`. - `cd frontend && npx tsc --noEmit` : OK, aucune sortie d’erreur. Blocage: aucun. Les fichiers runtime `.ideai/*` dirty et les changements backend existants ont été ignorés comme demandé.
|
||||
- **Prompt:** Implémente le Lot C frontend `workstate conversation summaries` sur la branche active `feature/workstate-conversation-summaries`, en t'appuyant sur le backend/Tauri déjà modifié par DevBackend. Contexte backend disponible: - `ProjectWorkState` contient maintenant `conversations: ConversationWorkSummary[]` top-level. - `AgentTicketState.conversationId` existe déjà; le frontend doit joindre via `conversationId`. - DTO camelCase attendu: - `ConversationWorkSummary`: `conversationId`, `status` (`ready|missing|partial|unavailable`), `objectivePreview: string | null`, `summaryPreview: string | null`, `summaryLen`, `upTo: string | null`, `recentTurns: ConversationTurnWorkPreview[]`. - `ConversationTurnWorkPreview`: `role` (`prompt|response|toolActivity`), `source` (`{kind:'human'} | {kind:'agent'; agentId:string}`), `atMs`, `textPreview`, `textLen`. À faire: 1. Étendre les types frontend dans `frontend/src/domain/index.ts`: `ProjectWorkState.conversations`, `ConversationWorkSummary`, `ConversationPreviewStatus`, `ConversationTurnWorkPreview`. 2. Adapter le mock gateway pour accepter/normaliser les états legacy sans `conversations` en `conversations: []`. 3. Dans `ProjectWorkStatePanel.tsx`, construire une map `conversationId -> summary` et sous chaque ticket afficher une ligne compacte thread si summary disponible: - priorité: `Goal: <objectivePreview>` si présent; sinon `summaryPreview`; sinon dernier `recentTurn.textPreview` avec préfixe `Last:`; sinon rien de verbeux. - badge discret: `Summary` pour ready, `No summary` pour missing, `Partial`, `Unavailable`. - Ne pas afficher JSON brut, chemins, markdown volumineux, ni créer de modal/action. - Ne pas casser l'affichage ticket si aucune summary n'existe pour ce `conversationId`. 4. Mettre à jour/ajouter les tests Vitest: mock sans `conversations` normalisé; ticket avec `conversationId` affiche objectif/résumé; `partial`/`unavailable` ne masque pas le ticket; refresh existants restent verts. Contraintes: - Pas de nouvelle commande Tauri, pas d'action UX, pas de lecture logs/handoff côté frontend. - Respecte le style dense existant du panneau Work. - Ne committe pas. - Ignore dirty runtime `.ideai/*`. Vérifications demandées: - `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx` - `cd frontend && npx tsc --noEmit` Retourne fichiers modifiés, choix UI, résultats réels des commandes, et tout blocage.
|
||||
- **Response:** Lot C frontend `workstate conversation summaries` implémenté sur la branche active `feature/workstate-conversation-summaries`. Aucun commit effectué. Fichiers modifiés: - `frontend/src/domain/index.ts` - `frontend/src/adapters/mock/index.ts` - `frontend/src/features/workstate/ProjectWorkStatePanel.tsx` - `frontend/src/features/workstate/workstate.test.tsx` Choix UI: - `ProjectWorkStatePanel` construit une map `conversationId -> ConversationWorkSummary` au niveau du panel et joint les summaries sous chaque ticket. - La ligne thread reste compacte: badge discret (`Summary`, `No summary`, `Partial`, `Unavailable`) + texte court. - Priorité d’affichage respectée: `Goal: <objectivePreview>`, sinon `summaryPreview`, sinon `Last: <recentTurn.textPreview>`, sinon aucune ligne summary. - Aucun JSON brut, chemin, markdown long, modal ou action UX ajouté. - Si un ticket n’a pas de summary correspondant, l’affichage ticket reste inchangé. Détails techniques: - Ajout des types TS `ConversationWorkSummary`, `ConversationPreviewStatus`, `ConversationTurnWorkPreview` et `ProjectWorkState.conversations`. - `MockWorkStateGateway` normalise les états legacy sans `conversations` en `conversations: []`; l’état vide par défaut renvoie aussi `{ agents: [], conversations: [] }`. - Tests ajoutés pour normalisation mock, objectif/résumé joint via `conversationId`, et badges `partial`/`unavailable` sans masquer les tickets. Vérifications réelles: - `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx` : OK, `2 passed`, `19 passed`. - `cd frontend && npx tsc --noEmit` : OK, aucune sortie d’erreur. Blocage: aucun. Les fichiers runtime `.ideai/*` dirty et les changements backend existants ont été ignorés comme demandé.
|
||||
- **Response:** Lot C frontend `workstate conversation summaries` implémenté sur la branche active `feature/workstate-conversation-summaries`. Aucun commit effectué. Fichiers modifiés: - `frontend/src/domain/index.ts` - `frontend/src/adapters/mock/index.ts` - `frontend/src/features/workstate/ProjectWorkStatePanel.tsx` - `frontend/src/features/workstate/workstate.test.tsx` Choix UI: - `ProjectWorkStatePanel` construit une map `conversationId -> ConversationWorkSummary` au niveau du panel et joint les summaries sous chaque ticket. - La ligne thread reste compacte: badge discret (`Summary`, `No summary`, `Partial`, `Unavailable`) + texte court. - Priorité d’affichage respectée: `Goal: <objectivePreview>`, sinon `summaryPreview`, sinon `Last: <recentTurn.textPreview>`, sinon aucune ligne summary. - Aucun JSON brut, chemin, markdown long, modal ou action UX ajouté. - Si un ticket n’a pas de summary correspondant, l’affichage ticket reste inchangé. Détails techniques: - Ajout des types TS `ConversationWorkSummary`, `ConversationPreviewStatus`, `ConversationTurnWorkPreview` et `ProjectWorkState.conversations`. - `MockWorkStateGateway` normalise les états legacy sans `conversations` en `conversations: []`; l’état vide par défaut renvoie aussi `{ agents: [], conversations: [] }`. - Tests ajoutés pour normalisation mock, objectif/résumé joint via `conversationId`, et badges `partial`/`unavailable` sans masquer les tickets. Vérifications réelles: - `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx` : OK, `2 passed`, `19 passed`. - `cd frontend && npx tsc --noEmit` : OK, aucune sortie d’erreur. Blocage: aucun. Les fichiers runtime `.ideai/*` dirty et les changements backend existants ont été ignorés comme demandé.
|
||||
- **Prompt:** Implémente le frontend du Lot D `workstate controlled actions` sur la branche active `feature/workstate-controlled-actions`, en t'appuyant sur le backend/Tauri déjà modifié par DevBackend. Contexte backend: - `attach_live_agent({ request: { projectId, agentId, nodeId } }) -> { agentId, nodeId, sessionId, kind }` (contrat changé; plus de tableau). Zéro spawn. - `stop_live_agent({ request: { projectId, agentId } }) -> { agentId, sessionId, kind }`. - `kind`: `"pty" | "structured"`. Périmètre frontend Lot D: 1. Adapter les ports/adapters TS au nouveau contrat attach + nouvelle commande stop. - Ne pas appeler `launchAgent` depuis Work. - Ne pas faire appeler `close_terminal` directement par le panneau Work pour stopper un agent. 2. Dans `ProjectWorkStatePanel`, ajouter actions minimales: - `Open` / `Go to cell` si agent live et `live.nodeId` visible dans le layout actif. Frontend-only focus/scroll/highlight si helper existant; sinon implémentation minimale testable suivant patterns existants. - `Attach` si agent live mais cellule non visible et cible déterministe existe. Si pas de cible, action désactivée/message court. Ne crée pas de session; appeler `attachLiveAgent`, puis mutation layout existante pour associer `sessionId`/agent si nécessaire. - `Stop` si agent live, avec confirmation. Si agent busy/inProgress, le texte de confirmation doit signaler que le tour sera interrompu. Appeler `stopLiveAgent`, puis refresh Work/layout. - `View` disclosure pour détails conversation Lot C (objectif, summaryPreview, recentTurns bornés déjà fournis), sans endpoint log. - `Copy` summary via clipboard, uniquement texte déjà exposé par Lot C; état bref `Copied`; désactivé si rien à copier. 3. Garder l'UI dense, pas de modal conversation, pas de log brut, pas de nouvelle commande Tauri. Contraintes: - Respecte patterns existants de gateways/layout/events. - Si certains helpers layout/focus n'existent pas, fais le minimum cohérent et explique l'écart. - Ne committe pas. - Ignore dirty runtime `.ideai/*`. Tests attendus: - `Open` focus une cellule visible et n'appelle pas launch. - `Attach` appelle `attachLiveAgent` puis mutation layout sur cible déterministe; désactivé sans cible. - `Stop` confirmation puis `stopLiveAgent`, refresh Work; warning si busy. - `View conversation` n'affiche que les champs Lot C. - `Copy summary` copie uniquement la preview exposée. - Non-régression des tests workstate/projects. Vérifications demandées: - `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx` (ajoute autres tests ciblés si pertinents) - `cd frontend && npx tsc --noEmit` Retourne fichiers modifiés, choix UI/écarts, résultats réels, blocages.
|
||||
- **Response:** Lot D frontend `workstate controlled actions` implémenté sur la branche active `feature/workstate-controlled-actions`. Aucun commit effectué. Fichiers modifiés: - `frontend/src/ports/index.ts` - `frontend/src/adapters/agent.ts` - `frontend/src/adapters/agent.test.ts` - `frontend/src/adapters/mock/index.ts` - `frontend/src/features/workstate/ProjectWorkStatePanel.tsx` - `frontend/src/features/workstate/workstate.test.tsx` - `frontend/src/features/layout/singletonAgent.test.tsx` - `frontend/src/features/layout/agentAlreadyRunning.test.tsx` Choix UI / comportement: - `attach_live_agent` adapté au nouveau contrat: retour direct `{ agentId, nodeId, sessionId, kind }`, plus de tableau. - Ajout du port/adapters `stopLiveAgent(projectId, agentId)` vers `stop_live_agent`; Work ne passe pas par `close_terminal`. - `LiveAgent.sessionId` est maintenant requis et `kind: "pty" | "structured"` est typé côté frontend. - Dans Work: - `Open` apparaît si l’agent est live dans une cellule visible; action frontend-only qui scroll/focus/highlight via `data-node-id`. Aucun appel à `launchAgent`. - `Attach` apparaît si l’agent est live mais hors layout visible; cible déterministe = première cellule visible vide (`!session && !agent`). Appelle `attachLiveAgent`, puis `attachLiveAgentToCell` pour associer session/agent au layout. Désactivé avec message court s’il n’y a pas de cellule vide visible. - `Stop` apparaît si agent live; confirmation native. Si l’agent est busy ou a un ticket `inProgress`, le texte confirme que le tour courant sera interrompu. Appelle `stopLiveAgent`, refresh Work, et nettoie la session de la cellule visible si elle correspond. - `View` est un disclosure inline compact pour les champs Lot C déjà exposés: objectif, `summaryPreview`, `recentTurns`. Pas de log brut, pas de modal, pas d’endpoint. - `Copy` copie uniquement le texte de preview déjà affiché (`Goal: ...`, `summaryPreview`, ou `Last: ...`) et montre brièvement `Copied`. Écart / limite assumée: - Il n’existait pas de helper focus exporté depuis `LayoutGrid`; j’ai repris le même mécanisme minimal DOM (`[data-node-id]`, scroll + outline temporaire) localement dans Work. - Il n’existait pas de méthode publique `refreshLayout` dans `useLayout`; après Stop, le layout visible est rafraîchi par mutation ciblée `setSession(..., null)` quand la cellule live est dans le layout actif, et Work est rafraîchi via `useProjectWorkState.refresh()`. Tests ajoutés/couverts: - `Open` focus cellule visible et n’appelle pas `launchAgent`. - `Attach` appelle `attachLiveAgent` puis mutation layout sur cible déterministe; pas de `launchAgent` depuis Work. - `Attach` désactivé sans cible visible. - `Stop` confirme avec warning busy, appelle `stopLiveAgent`, refresh Work, nettoie la session visible. - `View conversation` n’affiche que les previews Lot C. - `Copy summary` copie uniquement la preview exposée. - Tests adapter Tauri mis à jour pour attach retour direct + stop. Vérifications réelles: - `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx` : OK, `2 passed`, `25 passed`. - Test ciblé supplémentaire: `cd frontend && npx vitest run src/adapters/agent.test.ts` : OK, `1 passed`, `8 passed`. - `cd frontend && npx tsc --noEmit` : OK, aucune sortie d’erreur. Blocage: aucun. Les fichiers runtime `.ideai/*` dirty et les changements backend existants ont été ignorés comme demandé.
|
||||
Reference in New Issue
Block a user