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é.
|
||||
@ -16,3 +16,5 @@
|
||||
{"id":"7d70c87a-e7b5-468a-90c7-41decf1185bc","conversation":"09b15ec3-ce2f-0af2-2903-ef699df9de41","atMs":1781974090422,"source":{"kind":"agent","agentId":"af7f86da-76bc-48e1-9900-71f45a624800"},"role":"response","text":"Lot B frontend `workstate delegation/queue snapshot` implémenté sur la branche active `feature/workstate-delegation-queue`. Aucun commit effectué.\n\nFichiers modifiés:\n- `frontend/src/domain/index.ts`\n- `frontend/src/adapters/mock/index.ts`\n- `frontend/src/features/workstate/ProjectWorkStatePanel.tsx`\n- `frontend/src/features/workstate/useProjectWorkState.ts`\n- `frontend/src/features/workstate/workstate.test.tsx`\n\nChoix UI:\n- Sous-liste compacte uniquement pour les agents qui ont des tickets, sans bruit visuel pour les agents sans ticket.\n- Tickets triés par `position`, affichés en `#N In progress` / `#N Queued`.\n- Source humaine libellée `Human`; source agent affichée avec `requesterLabel` + id agent court quand disponible.\n- `taskPreview` affiché inline, avec suffixe léger `+N` si `taskLen > taskPreview.length`.\n- `ticketId` court en monospace avec `title` complet.\n\nDétails techniques:\n- Ajout des types `AgentTicketState`, `TicketWorkStatus`, `TicketWorkSource` et `AgentWorkState.tickets`.\n- `MockWorkStateGateway` accepte et normalise les états legacy sans `tickets` en `tickets: []`.\n- `useProjectWorkState` rafraîchit maintenant aussi sur l’événement domaine `delegationReady`, via l’infrastructure `SystemGateway.onDomainEvent` déjà existante.\n\nVérifications réelles:\n- `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx` : OK, `2 passed`, `17 passed`.\n- `cd frontend && npx tsc --noEmit` : OK, aucune sortie d’erreur.\n\nBlocage: aucun. Les fichiers runtime `.ideai/*` dirty et les changements backend existants ont été ignorés comme demandé."}
|
||||
{"id":"5a2a42de-9ce4-461b-8d08-5b282a7b4db2","conversation":"09b15ec3-ce2f-0af2-2903-ef699df9de41","atMs":1781976069973,"source":{"kind":"agent","agentId":"a6ced819-b893-4213-b003-9e9dc79b9641"},"role":"prompt","text":"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.\n\nContexte backend disponible:\n- `ProjectWorkState` contient maintenant `conversations: ConversationWorkSummary[]` top-level.\n- `AgentTicketState.conversationId` existe déjà; le frontend doit joindre via `conversationId`.\n- DTO camelCase attendu:\n - `ConversationWorkSummary`: `conversationId`, `status` (`ready|missing|partial|unavailable`), `objectivePreview: string | null`, `summaryPreview: string | null`, `summaryLen`, `upTo: string | null`, `recentTurns: ConversationTurnWorkPreview[]`.\n - `ConversationTurnWorkPreview`: `role` (`prompt|response|toolActivity`), `source` (`{kind:'human'} | {kind:'agent'; agentId:string}`), `atMs`, `textPreview`, `textLen`.\n\nÀ faire:\n1. Étendre les types frontend dans `frontend/src/domain/index.ts`: `ProjectWorkState.conversations`, `ConversationWorkSummary`, `ConversationPreviewStatus`, `ConversationTurnWorkPreview`.\n2. Adapter le mock gateway pour accepter/normaliser les états legacy sans `conversations` en `conversations: []`.\n3. Dans `ProjectWorkStatePanel.tsx`, construire une map `conversationId -> summary` et sous chaque ticket afficher une ligne compacte thread si summary disponible:\n - priorité: `Goal: <objectivePreview>` si présent; sinon `summaryPreview`; sinon dernier `recentTurn.textPreview` avec préfixe `Last:`; sinon rien de verbeux.\n - badge discret: `Summary` pour ready, `No summary` pour missing, `Partial`, `Unavailable`.\n - Ne pas afficher JSON brut, chemins, markdown volumineux, ni créer de modal/action.\n - Ne pas casser l'affichage ticket si aucune summary n'existe pour ce `conversationId`.\n4. 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.\n\nContraintes:\n- Pas de nouvelle commande Tauri, pas d'action UX, pas de lecture logs/handoff côté frontend.\n- Respecte le style dense existant du panneau Work.\n- Ne committe pas.\n- Ignore dirty runtime `.ideai/*`.\n\nVérifications demandées:\n- `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx`\n- `cd frontend && npx tsc --noEmit`\n\nRetourne fichiers modifiés, choix UI, résultats réels des commandes, et tout blocage."}
|
||||
{"id":"11b7df5e-f50e-4f4e-b680-37d5fb10af72","conversation":"09b15ec3-ce2f-0af2-2903-ef699df9de41","atMs":1781976255451,"source":{"kind":"agent","agentId":"af7f86da-76bc-48e1-9900-71f45a624800"},"role":"response","text":"Lot C frontend `workstate conversation summaries` implémenté sur la branche active `feature/workstate-conversation-summaries`. Aucun commit effectué.\n\nFichiers modifiés:\n- `frontend/src/domain/index.ts`\n- `frontend/src/adapters/mock/index.ts`\n- `frontend/src/features/workstate/ProjectWorkStatePanel.tsx`\n- `frontend/src/features/workstate/workstate.test.tsx`\n\nChoix UI:\n- `ProjectWorkStatePanel` construit une map `conversationId -> ConversationWorkSummary` au niveau du panel et joint les summaries sous chaque ticket.\n- La ligne thread reste compacte: badge discret (`Summary`, `No summary`, `Partial`, `Unavailable`) + texte court.\n- Priorité d’affichage respectée: `Goal: <objectivePreview>`, sinon `summaryPreview`, sinon `Last: <recentTurn.textPreview>`, sinon aucune ligne summary.\n- Aucun JSON brut, chemin, markdown long, modal ou action UX ajouté.\n- Si un ticket n’a pas de summary correspondant, l’affichage ticket reste inchangé.\n\nDétails techniques:\n- Ajout des types TS `ConversationWorkSummary`, `ConversationPreviewStatus`, `ConversationTurnWorkPreview` et `ProjectWorkState.conversations`.\n- `MockWorkStateGateway` normalise les états legacy sans `conversations` en `conversations: []`; l’état vide par défaut renvoie aussi `{ agents: [], conversations: [] }`.\n- Tests ajoutés pour normalisation mock, objectif/résumé joint via `conversationId`, et badges `partial`/`unavailable` sans masquer les tickets.\n\nVérifications réelles:\n- `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx` : OK, `2 passed`, `19 passed`.\n- `cd frontend && npx tsc --noEmit` : OK, aucune sortie d’erreur.\n\nBlocage: aucun. Les fichiers runtime `.ideai/*` dirty et les changements backend existants ont été ignorés comme demandé."}
|
||||
{"id":"889dc0de-b092-4103-9650-e5f73c8b18e0","conversation":"09b15ec3-ce2f-0af2-2903-ef699df9de41","atMs":1781977298082,"source":{"kind":"agent","agentId":"a6ced819-b893-4213-b003-9e9dc79b9641"},"role":"prompt","text":"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.\n\nContexte backend:\n- `attach_live_agent({ request: { projectId, agentId, nodeId } }) -> { agentId, nodeId, sessionId, kind }` (contrat changé; plus de tableau). Zéro spawn.\n- `stop_live_agent({ request: { projectId, agentId } }) -> { agentId, sessionId, kind }`.\n- `kind`: `\"pty\" | \"structured\"`.\n\nPérimètre frontend Lot D:\n1. Adapter les ports/adapters TS au nouveau contrat attach + nouvelle commande stop.\n - Ne pas appeler `launchAgent` depuis Work.\n - Ne pas faire appeler `close_terminal` directement par le panneau Work pour stopper un agent.\n2. Dans `ProjectWorkStatePanel`, ajouter actions minimales:\n - `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.\n - `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.\n - `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.\n - `View` disclosure pour détails conversation Lot C (objectif, summaryPreview, recentTurns bornés déjà fournis), sans endpoint log.\n - `Copy` summary via clipboard, uniquement texte déjà exposé par Lot C; état bref `Copied`; désactivé si rien à copier.\n3. Garder l'UI dense, pas de modal conversation, pas de log brut, pas de nouvelle commande Tauri.\n\nContraintes:\n- Respecte patterns existants de gateways/layout/events.\n- Si certains helpers layout/focus n'existent pas, fais le minimum cohérent et explique l'écart.\n- Ne committe pas.\n- Ignore dirty runtime `.ideai/*`.\n\nTests attendus:\n- `Open` focus une cellule visible et n'appelle pas launch.\n- `Attach` appelle `attachLiveAgent` puis mutation layout sur cible déterministe; désactivé sans cible.\n- `Stop` confirmation puis `stopLiveAgent`, refresh Work; warning si busy.\n- `View conversation` n'affiche que les champs Lot C.\n- `Copy summary` copie uniquement la preview exposée.\n- Non-régression des tests workstate/projects.\n\nVérifications demandées:\n- `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx` (ajoute autres tests ciblés si pertinents)\n- `cd frontend && npx tsc --noEmit`\n\nRetourne fichiers modifiés, choix UI/écarts, résultats réels, blocages."}
|
||||
{"id":"c269039f-212a-42a7-a520-2770cb7cc773","conversation":"09b15ec3-ce2f-0af2-2903-ef699df9de41","atMs":1781977717382,"source":{"kind":"agent","agentId":"af7f86da-76bc-48e1-9900-71f45a624800"},"role":"response","text":"Lot D frontend `workstate controlled actions` implémenté sur la branche active `feature/workstate-controlled-actions`. Aucun commit effectué.\n\nFichiers modifiés:\n- `frontend/src/ports/index.ts`\n- `frontend/src/adapters/agent.ts`\n- `frontend/src/adapters/agent.test.ts`\n- `frontend/src/adapters/mock/index.ts`\n- `frontend/src/features/workstate/ProjectWorkStatePanel.tsx`\n- `frontend/src/features/workstate/workstate.test.tsx`\n- `frontend/src/features/layout/singletonAgent.test.tsx`\n- `frontend/src/features/layout/agentAlreadyRunning.test.tsx`\n\nChoix UI / comportement:\n- `attach_live_agent` adapté au nouveau contrat: retour direct `{ agentId, nodeId, sessionId, kind }`, plus de tableau.\n- Ajout du port/adapters `stopLiveAgent(projectId, agentId)` vers `stop_live_agent`; Work ne passe pas par `close_terminal`.\n- `LiveAgent.sessionId` est maintenant requis et `kind: \"pty\" | \"structured\"` est typé côté frontend.\n- Dans Work:\n - `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`.\n - `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.\n - `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.\n - `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.\n - `Copy` copie uniquement le texte de preview déjà affiché (`Goal: ...`, `summaryPreview`, ou `Last: ...`) et montre brièvement `Copied`.\n\nÉcart / limite assumée:\n- 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.\n- 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()`.\n\nTests ajoutés/couverts:\n- `Open` focus cellule visible et n’appelle pas `launchAgent`.\n- `Attach` appelle `attachLiveAgent` puis mutation layout sur cible déterministe; pas de `launchAgent` depuis Work.\n- `Attach` désactivé sans cible visible.\n- `Stop` confirme avec warning busy, appelle `stopLiveAgent`, refresh Work, nettoie la session visible.\n- `View conversation` n’affiche que les previews Lot C.\n- `Copy summary` copie uniquement la preview exposée.\n- Tests adapter Tauri mis à jour pour attach retour direct + stop.\n\nVérifications réelles:\n- `cd frontend && npx vitest run src/features/workstate/workstate.test.tsx src/features/projects/projects.test.tsx` : OK, `2 passed`, `25 passed`.\n- Test ciblé supplémentaire: `cd frontend && npx vitest run src/adapters/agent.test.ts` : OK, `1 passed`, `8 passed`.\n- `cd frontend && npx tsc --noEmit` : OK, aucune sortie d’erreur.\n\nBlocage: aucun. Les fichiers runtime `.ideai/*` dirty et les changements backend existants ont été ignorés comme demandé."}
|
||||
|
||||
Reference in New Issue
Block a user