diff --git a/.ideai/sprints/028179b1-eaf4-41e9-9c1f-7c37125117e6/sprint.md b/.ideai/sprints/028179b1-eaf4-41e9-9c1f-7c37125117e6/sprint.md new file mode 100644 index 0000000..51f0075 --- /dev/null +++ b/.ideai/sprints/028179b1-eaf4-41e9-9c1f-7c37125117e6/sprint.md @@ -0,0 +1,11 @@ +--- +id: "028179b1-eaf4-41e9-9c1f-7c37125117e6" +order: 2 +name: "Client - serveur" +status: "planned" +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783329381447 +updatedAt: 1783330421737 +version: 4 +--- diff --git a/.ideai/sprints/5afd6780-0f76-40d7-a10f-32ee52469d74/sprint.md b/.ideai/sprints/5afd6780-0f76-40d7-a10f-32ee52469d74/sprint.md new file mode 100644 index 0000000..23f495d --- /dev/null +++ b/.ideai/sprints/5afd6780-0f76-40d7-a10f-32ee52469d74/sprint.md @@ -0,0 +1,11 @@ +--- +id: "5afd6780-0f76-40d7-a10f-32ee52469d74" +order: 1 +name: "UI rework" +status: "planned" +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783329530306 +updatedAt: 1783330421736 +version: 3 +--- diff --git a/.ideai/sprints/d8f3f37b-87ca-4509-9116-45a99bc711df/sprint.md b/.ideai/sprints/d8f3f37b-87ca-4509-9116-45a99bc711df/sprint.md new file mode 100644 index 0000000..015f1bb --- /dev/null +++ b/.ideai/sprints/d8f3f37b-87ca-4509-9116-45a99bc711df/sprint.md @@ -0,0 +1,11 @@ +--- +id: "d8f3f37b-87ca-4509-9116-45a99bc711df" +order: 3 +name: "Session limites handle" +status: "planned" +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783329454681 +updatedAt: 1783330421738 +version: 3 +--- diff --git a/.ideai/sprints/index.json b/.ideai/sprints/index.json new file mode 100644 index 0000000..ebcb365 --- /dev/null +++ b/.ideai/sprints/index.json @@ -0,0 +1,32 @@ +{ + "version": 1, + "sprints": [ + { + "id": "5afd6780-0f76-40d7-a10f-32ee52469d74", + "path": "5afd6780-0f76-40d7-a10f-32ee52469d74", + "order": 1, + "name": "UI rework", + "status": "planned", + "updatedAt": 1783330421736, + "version": 3 + }, + { + "id": "028179b1-eaf4-41e9-9c1f-7c37125117e6", + "path": "028179b1-eaf4-41e9-9c1f-7c37125117e6", + "order": 2, + "name": "Client - serveur", + "status": "planned", + "updatedAt": 1783330421737, + "version": 4 + }, + { + "id": "d8f3f37b-87ca-4509-9116-45a99bc711df", + "path": "d8f3f37b-87ca-4509-9116-45a99bc711df", + "order": 3, + "name": "Session limites handle", + "status": "planned", + "updatedAt": 1783330421738, + "version": 3 + } + ] +} \ No newline at end of file diff --git a/.ideai/tickets/1/carnet.md b/.ideai/tickets/1/carnet.md new file mode 100644 index 0000000..3bd5f30 --- /dev/null +++ b/.ideai/tickets/1/carnet.md @@ -0,0 +1,29 @@ +--- +issueRef: "#1" +version: 11 +updatedBy: {"kind":"user"} +updatedAt: 1783175265022 +--- +- Cadrage: background-tasks-first-class-design. Arbitrage 5 écarts: b8-arbitration-outcomes. +- FAIT B8 runner PTY + boucle sink fermée + refactor point-2. QA vert. Commit backend 8cac147. +- FAIT UI cancel/retry câblés (cancel_background_task/retry_background_task). Commit frontend c179f93. +- FAIT déclencheur in-app: surface MCP idea_run_in_background (BE-1+BE-2), commit f08dae6. Ferme l'écart de périmètre « aucun producteur ». +- Dette tracée: #2 (PtyPort::wait + tee live), #3 (persistance sûre invocation/retry-after-reboot + énumération store), #5 (contrat DTO work-state). + +## MAJ 2026-07-04 — part autonome de #1 clôturée (Main) +- AppImage rebuild frais confirmé (build 2026-07-03 23:56 > dernier source 23:53), inclut T1+T3, NO_STRIP=true. +- VALIDATION AUTOMATISÉE VERTE : cargo build --workspace OK ; cargo test -p application / -p app-tauri / -p infrastructure = 0 failed ; frontend npm run build OK + vitest 459/460. L'unique rouge = flake de timing src/features/permissions/permissions.test.tsx (passe en isolation 2/2, non touché par #1, pas une régression). +- COMMITS Git sur feature/background-tasks-first-class : eb9cc16 (code T1+T3, 21 fichiers) + ebd992e (19 notes mémoire + MEMORY.md). AUCUN merge vers develop. Runtime .ideai/{background-tasks,proposals,tickets}/ volontairement non commités. + +## ⚠️ MAJ 2026-07-04 — IMPACT TOPOLOGIE (constat Git, cadrage #4) +- `feature/background-tasks-first-class` (#1) est DÉRIVÉE du `develop` ANORMAL/rembobiné (merge-base #1↔main = 1fc7869, pré-canonique ; a9653bc tip develop est ancêtre de #1). Donc #1 = baseline PRÉ-CANONIQUE (spawn_turn=0, run_turn batch, pas d'AgentTurnEvent). +- La vraie ligne d'intégration est `main` (canonique, release ~01/07), PAS le develop rembobiné (18 commits en retard sur main). ⇒ la cible de merge « → develop » prévue au point 3 ci-dessous est INVALIDÉE. +- #1 modifie massivement les fichiers divergés côté canonique : orchestrator/service.rs +425, domain/events.rs +184, lifecycle.rs +83, session/codex.rs. ⇒ portage sur canonique = CONFLITS NON TRIVIAUX attendus, pas un simple changement de cible. +- PLAN Git (Phase C, à faire quand on reprendra #1) : branche fraîche `feature/background-tasks-first-class-canonical` depuis main + cherry-pick séquentiel des 17 commits (ancienne branche gardée comme filet), conflits sémantiques service/events escaladés à DevBackend/Architect, puis QA avant tout merge. +- Décision de reconstruction de `develop` sur `main` : DESTRUCTIVE (rewrite branche partagée) → en attente validation utilisateur. + +## RESTE — DÉPENDANT UTILISATEUR (Main ne peut pas seul) +1. Re-QA LIVE T3 : relancer l'AppImage fraîche puis vérifier onglet Work → Cancel/Retry (T3-a..f du cadrage workstate-background-tasks-projection-fix). QA non pilotable depuis sandbox → besoin app lancée. +2. T2 — reconcile après reboot (fin AVANT wake), protocole MANUEL, coordination reboot utilisateur. +3. [CIBLE À REVOIR] merge de #1 : ne plus viser le develop rembobiné. Porter #1 sur canonique (Phase C ci-dessus) PUIS merger vers develop-reconstruit/main. Dépend de la décision de reconstruction de develop. +Main travaille sur #4 (annonces inter-agent) en attendant la dispo utilisateur pour 1-2-3. \ No newline at end of file diff --git a/.ideai/tickets/1/issue.md b/.ideai/tickets/1/issue.md new file mode 100644 index 0000000..bba7c6e --- /dev/null +++ b/.ideai/tickets/1/issue.md @@ -0,0 +1,24 @@ +--- +id: "ec19c041-7a44-456d-994d-f0dcb7c52f39" +number: 1 +title: "Tâches de fond — finaliser B8 (runner PTY) et clôturer le chantier" +status: "closed" +priority: "medium" +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783026129089 +updatedAt: 1783175265022 +version: 11 +--- +Description : + +Le chantier « tâches de fond de 1re classe » est livré et QA-vert jusqu'à B7 inclus (mailbox bornée, rendez-vous inter-agent comme tâche durable, reconcile au boot, réveil du propriétaire, UI F1–F4). Commité sur feature/background-tasks-first-class (e05edc6 backend, 5d88c95 frontend), non mergé. Reste à fermer les points suivants avant de considérer le chantier terminé. + +Reste à faire : + +- [ ] B8 — runner de commandes couplé PTY : créer un BackgroundTask{kind: Command} au spawn d'une commande longue (côté pty.rs / LocalProcessSpawner) et pousser exit/stdout/stderr dans le completion sink. C'est ce qui active le flux run_in_background complet : une commande qui finit après la fin du tour de l'agent réveille automatiquement son propriétaire avec le résultat. Aujourd'hui le sink est prêt mais aucun runner concret ne s'y abonne. +- [ ] UI cancel / retry des tâches de fond : les boutons existent mais sont désactivés faute de commande Tauri. Exposer cancel/retry (dépend de B8) et brancher l'UI. +- [ ] Validation live end-to-end de la feature dans l'app réelle : lancer un build/commande longue en run_in_background, laisser le tour se terminer, vérifier que le propriétaire est bien re-réveillé avec le résultat (et idem après redémarrage d'IdeA entre la fin et le wake — le reconcile doit retrouver la complétion). +- [ ] Merge feature/background-tasks-first-class → develop (sur validation) : résorbe aussi les 4 tests de protocole MCP périmés qui sont encore rouges sur develop (le fix d'alignement vit sur cette branche). \ No newline at end of file diff --git a/.ideai/tickets/10/carnet.md b/.ideai/tickets/10/carnet.md new file mode 100644 index 0000000..d082d71 --- /dev/null +++ b/.ideai/tickets/10/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#10" +version: 5 +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedAt: 1783241883970 +--- diff --git a/.ideai/tickets/10/issue.md b/.ideai/tickets/10/issue.md new file mode 100644 index 0000000..fdd6ebb --- /dev/null +++ b/.ideai/tickets/10/issue.md @@ -0,0 +1,15 @@ +--- +id: "37bfbb89-a8a5-475f-91bf-ecfd60ee4203" +number: 10 +title: "Ticket par sprint" +status: "closed" +priority: "medium" +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +createdAt: 1783183841014 +updatedAt: 1783241883970 +version: 5 +--- +J'aimerais pouvoir regrouper mes tickets en sprints. C'est a dire en catégories qui auraient elles meme un ordre d'execution (sprint 1, sprint 2 etc) \ No newline at end of file diff --git a/.ideai/tickets/11/carnet.md b/.ideai/tickets/11/carnet.md new file mode 100644 index 0000000..bf377a8 --- /dev/null +++ b/.ideai/tickets/11/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#11" +version: 6 +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedAt: 1783278726067 +--- diff --git a/.ideai/tickets/11/issue.md b/.ideai/tickets/11/issue.md new file mode 100644 index 0000000..0763a0f --- /dev/null +++ b/.ideai/tickets/11/issue.md @@ -0,0 +1,15 @@ +--- +id: "dad53cb9-a818-4475-be12-fd3ba6c59638" +number: 11 +title: "Interface de création de sprint" +status: "closed" +priority: "medium" +links: [{"target":"#10","kind":"dependsOn"}] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +createdAt: 1783183911244 +updatedAt: 1783278726067 +version: 6 +--- +Pour créer des sprints, j'aimerais une inteface de création dans laquelle je pourrais facilement ajouter/enlever des tickets de mes différents sprint \ No newline at end of file diff --git a/.ideai/tickets/12/carnet.md b/.ideai/tickets/12/carnet.md new file mode 100644 index 0000000..8f9e2c1 --- /dev/null +++ b/.ideai/tickets/12/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#12" +version: 5 +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedAt: 1783312900907 +--- diff --git a/.ideai/tickets/12/issue.md b/.ideai/tickets/12/issue.md new file mode 100644 index 0000000..f4c1bfb --- /dev/null +++ b/.ideai/tickets/12/issue.md @@ -0,0 +1,15 @@ +--- +id: "fb8a73f9-c871-4513-aa09-b35fbbef637a" +number: 12 +title: "Checkbox pour les filters des tickets" +status: "closed" +priority: "low" +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +createdAt: 1783184054842 +updatedAt: 1783312900907 +version: 5 +--- +Pour les filtres des tickets, j'aimerais qu'on ai une checkbox plutot que la selection d'un seul filtre, de façon a pouvoir faire des combinaisons de plusieurs priorité et de plusieurs status par exemple \ No newline at end of file diff --git a/.ideai/tickets/13/carnet.md b/.ideai/tickets/13/carnet.md new file mode 100644 index 0000000..99617ed --- /dev/null +++ b/.ideai/tickets/13/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#13" +version: 4 +updatedBy: {"kind":"user"} +updatedAt: 1783329397368 +--- diff --git a/.ideai/tickets/13/issue.md b/.ideai/tickets/13/issue.md new file mode 100644 index 0000000..b8e7f0a --- /dev/null +++ b/.ideai/tickets/13/issue.md @@ -0,0 +1,16 @@ +--- +id: "036783fa-9856-4643-8c28-653b93ac36e1" +number: 13 +title: "Server/client mode" +status: "open" +priority: "low" +sprint: "028179b1-eaf4-41e9-9c1f-7c37125117e6" +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783184188272 +updatedAt: 1783329397368 +version: 4 +--- +J'aimerais pouvoir utiliser IdeA sous forme de client/server. C'est a dire que IdeA aurait son backend sur une machine et son interface qui serait un frontend web. Les agents etc seraient tous côté server. C'est a dire que la cli de Claude serait celle côté serveur, l'interface client ne serait que l'affichage frontend, une UI. Je pense que tout est faisable, il faudrait cependant parler du côté CLI. Est ce qu'il serait possible de garde rle CLI natif comme il est actuellement, de l'afficher côté client tout en gardant l'installation claude code, codex etc côté serveur ? Peut etre qu'en ssh ça passerait ? Ce ticket ne pourra pas être fait en autonomie par un agent sans une review agent-utilisateur avant. \ No newline at end of file diff --git a/.ideai/tickets/14/carnet.md b/.ideai/tickets/14/carnet.md new file mode 100644 index 0000000..bd9248d --- /dev/null +++ b/.ideai/tickets/14/carnet.md @@ -0,0 +1,20 @@ +--- +issueRef: "#14" +version: 7 +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedAt: 1783456579694 +--- +## Production #14 — livrée dans develop (validation e2e live restante) + +Périmètre figé avec l'utilisateur : adapter HTTP OpenAI-compatible **purement additif** (zéro régression Claude/Codex), parité **tool-calling + MCP** complète, canal HTTP natif robuste. + +### Cycle +- Cadrage Architect : slug mémoire `ticket14-local-lan-openai-adapter-scoping` (asymétrie CLI-vs-serveur HTTP, port ToolInvoker in-process, reprise sans id provider). +- Backend (DevBackend) : variante `StructuredAdapter::OpenAiCompatible`, VO `HttpChatConfig`, `openai_compat.rs`, port `ToolInvoker` déléguant à la même OrchestratorService que le MCP. GO QA (domain 467 / application 530 / infrastructure 523 / app-tauri 247, 0 échec). Défaut réel corrigé : timeout post-contact mappé Io. +- Frontend (DevFrontend) : types DTO miroir, wizard/settings (endpoint/model/apiKeyEnv=nom de var/timeouts, validation miroir backend), profil de référence Ollama éditable, erreur endpoint rendue via bannière role="alert". GO QA (tsc 0 + vitest 59 fichiers / 566 tests, 0 échec). Défaut réel corrigé : erreur endpoint invisible dans le DOM. + +### Git +- Backend `aab4bca`, frontend `d89380c`, merge `--no-ff` `3c6cd04` → develop. Branche feature supprimée. **Local uniquement, rien poussé.** + +### Reste à faire (hors code) +- Validation e2e **live contre un vrai endpoint Ollama/LAN** : lancement cellule, conversation headless, reprise, délégation inter-agents, vivacité/timeout, endpoint indisponible/modèle absent (critère d'acceptation n°7). Non exercée en tests automatisés — c'est la raison du statut QA plutôt que closed. diff --git a/.ideai/tickets/14/issue.md b/.ideai/tickets/14/issue.md new file mode 100644 index 0000000..5466931 --- /dev/null +++ b/.ideai/tickets/14/issue.md @@ -0,0 +1,75 @@ +--- +id: "0c1f1991-b6db-47b7-bbef-2478bc7874ab" +number: 14 +title: "Integration de profils IA locaux/LAN comme profils IdeA canoniques" +status: "qa" +priority: "medium" +sprint: null +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +createdAt: 1783184495846 +updatedAt: 1783456579694 +version: 7 +--- +Objectif : permettre à IdeA d'utiliser des modèles hébergés localement ou sur le réseau local, par exemple Qwen via Ollama ou un runtime Docker exposant une API, avec le même niveau d'intégration produit que les profils Claude Code et OpenAI Codex CLI. + +La finalité n'est pas un simple profil custom lancé dans un terminal brut. Ces profils doivent devenir de vrais profils IA IdeA : sélectionnables, lançables depuis les cellules, pilotés par la conversation headless canonique, compatibles avec les mécanismes de conversation/reprise, et utilisables par l'orchestration de la même manière que Claude/Codex. + +## Cible produit + +Ajouter une famille de profil structuré pour serveurs de modèles locaux ou LAN, idéalement basée sur une API HTTP compatible OpenAI/Ollama : + +- endpoint configurable (`localhost`, machine LAN, container Docker, etc.) ; +- modèle configurable (`qwen...`, autre modèle local) ; +- authentification optionnelle via nom de variable d'environnement, jamais clé en clair ; +- profil visible et sélectionnable dans IdeA comme Claude/Codex ; +- cellule IdeA utilisable de façon canonique : conversation headless, historique, reprise, délégation, affichage des réponses et état de vivacité. + +## Contraintes importantes + +- Ne pas considérer le mode PTY/TUI comme suffisant pour ce ticket. +- Éviter une dépendance obligatoire à `ollama`, `docker` ou une commande shell quand une API HTTP suffit. +- Étudier explicitement les impacts commandes/headless : + - adapter HTTP natif ; + - wrapper CLI éventuel ; + - Docker/LAN ; + - sandbox et permissions ; + - absence ou présence de tool-calling/MCP côté modèle local. +- Le résultat doit s'intégrer dans le modèle existant `StructuredAdapter` / `AgentSessionFactory`, pas contourner le runtime IA d'IdeA. + +## Travail attendu + +1. Ajouter un adapter structuré pour modèle local/LAN, par exemple `StructuredAdapter::OpenAiCompatible` ou `LocalChat`. +2. Étendre le modèle de profil pour porter la configuration nécessaire : endpoint, model, apiKeyEnv optionnel, timeouts/liveness si nécessaire. +3. Implémenter une session headless `AgentSession` : + - `send(prompt)` ; + - émission de `ReplyEvent` ; + - gestion propre des erreurs réseau/modèle ; + - conversation id ou stratégie de reprise compatible avec le modèle IdeA. +4. Brancher l'adapter dans `StructuredSessionFactory`. +5. Rendre ces profils sélectionnables dans le wizard/settings au même titre que Claude/Codex. +6. Ajouter un profil de référence local, par exemple “Ollama / OpenAI-compatible local model”, éditable. +7. Vérifier l'intégration avec : + - lancement depuis une cellule ; + - conversation headless ; + - reprise ; + - changement de profil ; + - délégation inter-agents quand applicable ; + - état de vivacité/timeout ; + - erreurs endpoint indisponible/modèle absent. + +## Critères d'acceptation + +- Je peux configurer un profil Qwen hébergé via Ollama ou endpoint LAN. +- Je peux créer/lancer un agent IdeA avec ce profil comme avec Claude/Codex. +- La cellule utilise le chemin headless structuré, pas un terminal brut PTY. +- Les conversations apparaissent et se comportent comme les conversations Claude/Codex. +- La reprise ne mélange pas l'id logique IdeA avec un éventuel id provider. +- Un endpoint indisponible produit une erreur propre dans l'UI, sans bloquer IdeA. +- Les dépendances à `ollama`, Docker ou une CLI externe sont documentées et non imposées si le mode HTTP suffit. +- Tests backend couvrant factory, session adapter, erreurs HTTP et sérialisation du profil. +- Tests frontend couvrant configuration/sélection du nouveau profil. + +Review agent-user requise avant démarrage d'implémentation pour figer le périmètre exact : HTTP natif uniquement, support d'un wrapper CLI, et niveau attendu de tool-calling/MCP pour les modèles locaux. diff --git a/.ideai/tickets/15/carnet.md b/.ideai/tickets/15/carnet.md new file mode 100644 index 0000000..61b881a --- /dev/null +++ b/.ideai/tickets/15/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#15" +version: 2 +updatedBy: {"kind":"user"} +updatedAt: 1783329462104 +--- diff --git a/.ideai/tickets/15/issue.md b/.ideai/tickets/15/issue.md new file mode 100644 index 0000000..340806f --- /dev/null +++ b/.ideai/tickets/15/issue.md @@ -0,0 +1,22 @@ +--- +id: "5de121f3-1cd1-4a73-bcab-b0a43a7c257f" +number: 15 +title: "Limites de session — re-livraison automatique parquée au reset (stretch B5, délégation durable)" +status: "open" +priority: "low" +sprint: "d8f3f37b-87ca-4509-9116-45a99bc711df" +links: [{"target":"#7","kind":"dependsOn"}] +agentRefs: [] +createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedBy: {"kind":"user"} +createdAt: 1783208599385 +updatedAt: 1783329462104 +version: 2 +--- +Extrait du cadrage Architect du ticket #7 (baseline livrée : propagation inter-agent B1→B3 + F1/F2). Stretch non retenu dans #7. + +Objectif : quand A délègue à B via idea_ask_agent et que B atteint sa limite, au lieu de demander à A de ré-interroger après le reset, PARQUER le waiter de A par (requester,target) ; au execute_resume de B (reprise auto au reset), RE-LIVRER la tâche d'origine et router la complétion vers le waiter de A s'il est encore vivant (sinon drop, contrainte in-memory). + +Coût/risque (Architect) : rapproche du modèle de « délégation durable » tout en restant in-memory → fragile aux redémarrages/interruptions de A, ré-introduit une forme de blocage long côté A. À rattacher au design durable-delegation-runtime-agent-identity-design plutôt que de le traiter en rustine in-memory. + +Dépend de : #7 (baseline inter-agent B1→B3). Voir mémoire ticket7-session-limit-interagent-cadrage. \ No newline at end of file diff --git a/.ideai/tickets/16/carnet.md b/.ideai/tickets/16/carnet.md new file mode 100644 index 0000000..5b83c91 --- /dev/null +++ b/.ideai/tickets/16/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#16" +version: 7 +updatedBy: {"kind":"user"} +updatedAt: 1783405334263 +--- diff --git a/.ideai/tickets/16/issue.md b/.ideai/tickets/16/issue.md new file mode 100644 index 0000000..aec8128 --- /dev/null +++ b/.ideai/tickets/16/issue.md @@ -0,0 +1,17 @@ +--- +id: "0a3585f0-9774-4109-a4e3-746dc5b2a4b2" +number: 16 +title: "[UI] réorganisation des menus" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783329576091 +updatedAt: 1783405334263 +version: 7 +--- +J'aimerais réorganiser les mesnus de façon à être un peu plus proche de l'interface d'un IDE plus classique. J'aiemrais plutot avoir des menu déroulant en haut de la fenetre que d'avoir cette barre latérale +Les menus déroulant pourraient afficher des fenetres flottantes, ce qui laisserait plus de place pour l'affichage. \ No newline at end of file diff --git a/.ideai/tickets/17/carnet.md b/.ideai/tickets/17/carnet.md new file mode 100644 index 0000000..f29b6b3 --- /dev/null +++ b/.ideai/tickets/17/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#17" +version: 10 +updatedBy: {"kind":"user"} +updatedAt: 1783405334977 +--- diff --git a/.ideai/tickets/17/issue.md b/.ideai/tickets/17/issue.md new file mode 100644 index 0000000..c73dd75 --- /dev/null +++ b/.ideai/tickets/17/issue.md @@ -0,0 +1,16 @@ +--- +id: "66aaef66-c70a-4153-81e9-a8f323686092" +number: 17 +title: "[UI] fenetre de gestion de tickets" +status: "closed" +priority: "medium" +sprint: null +links: [{"target":"#16","kind":"dependsOn"},{"target":"#18","kind":"dependsOn"}] +agentRefs: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783329807682 +updatedAt: 1783405334977 +version: 10 +--- +J'aimerais une fenetre dédiée à la gestion des tickets. Autant pour le listing que pour la création/edition des tickets. Dans un même temps, j'aimerais qu'on améliore la gestion des tickets lié lorsque l'on édite les tickets en utilisant la popup du ticket #18. J'aiemrais aussi que l'agent permettant l'écriture des tickets soit proposé de façon plus évidante. Je pense qu'un bouton en bas à droite de la fenetre d'édition ouverte serait bien. \ No newline at end of file diff --git a/.ideai/tickets/18/carnet.md b/.ideai/tickets/18/carnet.md new file mode 100644 index 0000000..5566e9f --- /dev/null +++ b/.ideai/tickets/18/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#18" +version: 9 +updatedBy: {"kind":"user"} +updatedAt: 1783405335941 +--- diff --git a/.ideai/tickets/18/issue.md b/.ideai/tickets/18/issue.md new file mode 100644 index 0000000..bd9215c --- /dev/null +++ b/.ideai/tickets/18/issue.md @@ -0,0 +1,16 @@ +--- +id: "5c17d6d3-c537-45b1-a17e-9c4edee963d1" +number: 18 +title: "[UI] Créer une popup de selection de ticket" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783330038271 +updatedAt: 1783405335941 +version: 9 +--- +Pour différentes feature comme la création de sprint ou même le link d'un ticket à d'autres, il est necessaire de selectionner un ticket. Pour ça j'aimerais un popup qui puisse être utilisée dans ces différentes features pour la selection d'un ticket. Il faudrait une barre de recherche ainsi que la possibilité d'appliquer des filtres sur l'avancée ainsi que la priorité des tickets, comme pour le listing principal des tickets. \ No newline at end of file diff --git a/.ideai/tickets/19/carnet.md b/.ideai/tickets/19/carnet.md new file mode 100644 index 0000000..2a860ea --- /dev/null +++ b/.ideai/tickets/19/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#19" +version: 8 +updatedBy: {"kind":"user"} +updatedAt: 1783405337651 +--- diff --git a/.ideai/tickets/19/issue.md b/.ideai/tickets/19/issue.md new file mode 100644 index 0000000..182dbcb --- /dev/null +++ b/.ideai/tickets/19/issue.md @@ -0,0 +1,16 @@ +--- +id: "b1c84dd2-cef7-4e48-a501-1a30eedb02f2" +number: 19 +title: "[UI] implémentation de la popup de selection de ticket dans la création d'un sprint" +status: "closed" +priority: "low" +sprint: null +links: [{"target":"#18","kind":"dependsOn"}] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783330352910 +updatedAt: 1783405337651 +version: 8 +--- +Lors de l'edition d'un sprint, j'aimerais que pour selectionner un ticket, ça soit la popup de selection de ticket qui soit utilisée \ No newline at end of file diff --git a/.ideai/tickets/2/carnet.md b/.ideai/tickets/2/carnet.md new file mode 100644 index 0000000..073c2ae --- /dev/null +++ b/.ideai/tickets/2/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#2" +version: 2 +updatedBy: {"kind":"user"} +updatedAt: 1783184142093 +--- diff --git a/.ideai/tickets/2/issue.md b/.ideai/tickets/2/issue.md new file mode 100644 index 0000000..1726af8 --- /dev/null +++ b/.ideai/tickets/2/issue.md @@ -0,0 +1,24 @@ +--- +id: "0a492d45-e195-4df7-a2ad-65649372abf0" +number: 2 +title: "Tâches de fond — dette A : PtyPort::wait/try_wait + tee live UI + robustesse détection de fin" +status: "open" +priority: "low" +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedBy: {"kind":"user"} +createdAt: 1783082860742 +updatedAt: 1783184142093 +version: 2 +--- +Dette issue de l'arbitrage B8 (mémoire projet: b8-arbitration-outcomes, point 1). + +B8 a été accepté sans rendu live des tâches de fond. Le cœur complétion→wake fonctionne, mais la détection de fin du runner repose sur l'EOF du stream PTY single-consumer, ce qui est fragile et empêche un tee UI (une re-souscription UI casserait la détection EOF). + +Reste à faire : +- Ajouter `PtyPort::wait` / `try_wait` pour découpler la détection d'exit de la consommation d'output (retirer l'EOF-comme-proxy-de-fin). +- Une fois découplé, brancher un tee de la sortie PTY vers l'UI pour le rendu live des tâches de fond (F-live). +- NE PAS introduire de broadcast multi-consommateur (décision Architect). + +Périmètre touchant un port figé (PtyPort) : cadrage Architect requis avant implémentation. \ No newline at end of file diff --git a/.ideai/tickets/20/carnet.md b/.ideai/tickets/20/carnet.md new file mode 100644 index 0000000..5d700c6 --- /dev/null +++ b/.ideai/tickets/20/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#20" +version: 2 +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedAt: 1783331176736 +--- diff --git a/.ideai/tickets/20/issue.md b/.ideai/tickets/20/issue.md new file mode 100644 index 0000000..e01c40a --- /dev/null +++ b/.ideai/tickets/20/issue.md @@ -0,0 +1,26 @@ +--- +id: "1be19ee5-fd03-42ea-8df6-da18704807a9" +number: 20 +title: "[Backend] Dette ticket_list — matching #ref dans text + curseur opaque/stable" +status: "open" +priority: "low" +sprint: null +links: [{"target":"#18","kind":"relatesTo"}] +agentRefs: [] +createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +createdAt: 1783331172226 +updatedAt: 1783331176736 +version: 2 +--- +Dette backend identifiée pendant le cadrage du sprint UI rework (gate G4), non bloquante pour la popup #18 qui démarre sur le contrat actuel. + +Deux écarts sur la commande `ticket_list` (handler `crates/app-tauri/src/tickets.rs:681`, filtre store `crates/infrastructure/src/issues.rs`) : + +1. Recherche `text` : appliquée serveur sur titre (issues.rs:322) + description/carnet (issues.rs:326/465) mais PAS sur le `#ref`/numéro de ticket. Étendre le matching `text` à `issue_ref` pour permettre la recherche par numéro dans la popup de sélection. + +2. `cursor` : actuellement un offset numérique parsé en usize avec fallback silencieux à 0 si invalide (tickets.rs:1231), non opaque et non stable face à des mutations entre pages. Contractualiser un curseur opaque + stable (ordre déterministe préservé). + +Garde G3-bis déjà en place côté frontend : `TicketPicker`/`useTicketSearch` traitent `cursor` comme un token opaque (jamais construit/incrémenté côté client), donc la migration vers un curseur opaque backend n'exigera AUCUN changement frontend — cette dette est non-breaking. + +statuses[]/priorities[] sont conformes (OR intra-facette, AND inter-facette, testés) — rien à faire de ce côté. \ No newline at end of file diff --git a/.ideai/tickets/21/carnet.md b/.ideai/tickets/21/carnet.md new file mode 100644 index 0000000..1b1d285 --- /dev/null +++ b/.ideai/tickets/21/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#21" +version: 7 +updatedBy: {"kind":"user"} +updatedAt: 1783437364397 +--- diff --git a/.ideai/tickets/21/issue.md b/.ideai/tickets/21/issue.md new file mode 100644 index 0000000..682030c --- /dev/null +++ b/.ideai/tickets/21/issue.md @@ -0,0 +1,16 @@ +--- +id: "4ffe9f90-2264-4861-b7da-f5535b0a622f" +number: 21 +title: "[UI] pouvoir trier les ticket par..." +status: "closed" +priority: "low" +sprint: null +links: [{"target":"#16","kind":"dependsOn"},{"target":"#18","kind":"dependsOn"}] +agentRefs: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783331825658 +updatedAt: 1783437364397 +version: 7 +--- +J'aiemrais qu'on ajoute une option "trier par..." dans la popup de selection des tickets et dans la liste principale des tickets. On pourrait trier par numéro de ticket, priorité, status, ou titre du ticket. Avec chaque fois croissant/decroissant. \ No newline at end of file diff --git a/.ideai/tickets/22/carnet.md b/.ideai/tickets/22/carnet.md new file mode 100644 index 0000000..366a1b8 --- /dev/null +++ b/.ideai/tickets/22/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#22" +version: 5 +updatedBy: {"kind":"user"} +updatedAt: 1783437364871 +--- diff --git a/.ideai/tickets/22/issue.md b/.ideai/tickets/22/issue.md new file mode 100644 index 0000000..c553ca9 --- /dev/null +++ b/.ideai/tickets/22/issue.md @@ -0,0 +1,16 @@ +--- +id: "2b90fd78-8fce-449d-ab61-e5aee5ede08c" +number: 22 +title: "[UI] Anchor de views" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783405028818 +updatedAt: 1783437364871 +version: 5 +--- +J'aimerais qu'à la manière d'un IDE classique, il soit possible d'ancrer des views sur le côté droite ou gauche et de proposer un format vertical. 9a peut être utilise par exemple pour git, les work, les agents, les skills etc. J'ai en tête les IDE comme Visual COde ou la suite Jetbrains par exemple. \ No newline at end of file diff --git a/.ideai/tickets/23/carnet.md b/.ideai/tickets/23/carnet.md new file mode 100644 index 0000000..60aef9c --- /dev/null +++ b/.ideai/tickets/23/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#23" +version: 6 +updatedBy: {"kind":"user"} +updatedAt: 1783437365276 +--- diff --git a/.ideai/tickets/23/issue.md b/.ideai/tickets/23/issue.md new file mode 100644 index 0000000..efda7cc --- /dev/null +++ b/.ideai/tickets/23/issue.md @@ -0,0 +1,16 @@ +--- +id: "ed815933-ed48-466d-b265-3724f3ea943b" +number: 23 +title: "[UI] rendre les fenêtres View séparée de IdeA" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783405188644 +updatedAt: 1783437365276 +version: 6 +--- +J'aimerais que les fenêtre qu'on affiche via le menu View soient des fenêtre à part entières, qu'on puisse les déplacer sur les différents écrans, les mettre fullscreen etc, que ça soit des enetres "systeme" normales \ No newline at end of file diff --git a/.ideai/tickets/25/carnet.md b/.ideai/tickets/25/carnet.md new file mode 100644 index 0000000..949b0c9 --- /dev/null +++ b/.ideai/tickets/25/carnet.md @@ -0,0 +1,25 @@ +--- +issueRef: "#25" +version: 11 +updatedBy: {"kind":"user"} +updatedAt: 1783491435654 +--- +## Root cause +`OpenTicketAssistant::execute` fabriquait un plan OS-sandbox bespoke via `SandboxPlan::project_read_only` (grant RO sur project_root, posture Deny). Sous Landlock, un grant RO fait *handle* la classe read/exec (`AccessFs::from_read(V1)` inclut Execute). Le binaire CLI (codex/claude) vit hors du project root ⇒ `execve` refusé ⇒ EACCES (os error 13) au spawn sandboxé. Indépendant de la CLI. Les agents workspace n'ont pas le bug (plan no-op sous posture Allow). + +## Correctif (backend-pur, zéro port/DTO) +Décision Main : option fallback `None`. La surface assistant de ticket passe désormais `None` en 5e arg de `factory.start` (aligné sur les agents workspace). Garde-fous restants : policy MCP `idea_ticket_read/update*` + advisory LP3. Helper `ticket_assistant_sandbox` et preset `SandboxPlan::project_read_only` supprimés (plus aucun appelant). + +Fichiers : crates/application/src/ticket_assistant.rs (+tests), crates/domain/src/sandbox.rs. + +## Validation +- `cargo test --workspace` VERT (app-tauri 63, application 80, infrastructure 254, domain OK). +- Test ciblé : `factory.start` reçoit `SessionPlan::None` + `sandbox.is_none()`. +- Tests Landlock infra verts sur la machine. +- RÉSERVE : repro live Codex+Claude non exécutée — nécessite rebuild + swap de l'AppImage active + relance IdeA (interrompt la session). + +## Git +Commit `961a2ca` → merge `--no-ff` `cb20fab` dans develop. Local only, pas de push. + +## Reste à faire +Repro live après rebuild AppImage pour clôture définitive. Dette différée : write-fence OS uniforme sur toutes les surfaces (cf. cadrage Architect) si l'on veut une clôture write-OS. \ No newline at end of file diff --git a/.ideai/tickets/25/issue.md b/.ideai/tickets/25/issue.md new file mode 100644 index 0000000..740e65a --- /dev/null +++ b/.ideai/tickets/25/issue.md @@ -0,0 +1,16 @@ +--- +id: "6123b180-b36b-4807-ba31-46d60d3ef022" +number: 25 +title: "[Bug] Codex/Claude erreur lors de l'utilisation dans l'edition d'un ticket" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783406391625 +updatedAt: 1783491435654 +version: 11 +--- +J'ai voulu créer un ticket via Codex dasn l'interface d'edition d'un ticket, mais j'ai eu cette erreur: process error: agent session start failed: codex: Permission non accordée (os error 13). J'aéi séléctionné que je voulais utiliser codex et l'erreur est apparue quand j'ai essayé de lui donné mon premier message. Je me rend compte que j'ai la même erreur avec Claude \ No newline at end of file diff --git a/.ideai/tickets/26/carnet.md b/.ideai/tickets/26/carnet.md new file mode 100644 index 0000000..da263d8 --- /dev/null +++ b/.ideai/tickets/26/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#26" +version: 4 +updatedBy: {"kind":"user"} +updatedAt: 1783491079604 +--- diff --git a/.ideai/tickets/26/issue.md b/.ideai/tickets/26/issue.md new file mode 100644 index 0000000..7fcd9f0 --- /dev/null +++ b/.ideai/tickets/26/issue.md @@ -0,0 +1,16 @@ +--- +id: "2201b898-9c45-4057-9014-5284897507ad" +number: 26 +title: "[UI] refonte totale de la gestion des menus via agent UX" +status: "open" +priority: "medium" +sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74" +links: [] +agentRefs: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783437525356 +updatedAt: 1783491079604 +version: 4 +--- +J'aimerais une refonte totale de l'UX et de l'UI d'IdeA pour tout ce qui touche aux menus. Je n'aime pas la disposition actuelle. Il est important de garder l'aspect fenêtre flottantes, le fait de pouvoir anchor les fenêtres sur le côté d'IdeA, mais je n'aime pas le fait qu'il y ai deux listes déroulantes View et Window. Onne comprends pas vraiemnt la différence. De plus, l'affichage de l'onglet du projet avec le nom "Projet : IdeA" sur lequel cliquer pour changer de projet je n'aime pas. Je pense peut être plutot ajouter un + à côté de l'onglet du projet pour pouvoir ouvrir plusieurs projet en parallèle ? (A l''approbation de UX). Par contre je ne veux pas qu'on touche aux cellules des agents, elles sont très bien comme ça, on se contente des menus et des fenêtres. \ No newline at end of file diff --git a/.ideai/tickets/27/carnet.md b/.ideai/tickets/27/carnet.md new file mode 100644 index 0000000..6549c2c --- /dev/null +++ b/.ideai/tickets/27/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#27" +version: 3 +updatedBy: {"kind":"user"} +updatedAt: 1783440116446 +--- diff --git a/.ideai/tickets/27/issue.md b/.ideai/tickets/27/issue.md new file mode 100644 index 0000000..2543fce --- /dev/null +++ b/.ideai/tickets/27/issue.md @@ -0,0 +1,16 @@ +--- +id: "d7459ae0-31ae-49b2-bd93-2419397b0343" +number: 27 +title: "[Bug] L'outil assistance IA n'a pas les commandes MCP" +status: "open" +priority: "high" +sprint: null +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783439818722 +updatedAt: 1783440116446 +version: 3 +--- +Il semblerait que l'outil assistance IA des tickets n'ait pas connaissance des tools MCP pour l'edition des tickets. J'ai essayé de demandé à l'assistant de modifié le ticket pour que ça aille dans le sens de la conversation que j'ai eu avec lui et il m'a dabord donné un .md. Quand je lui ai demandé de modifier lui même le ticket, il est allé dans le fichier directement pour apporter des modifications au lieu d'utiliser le tool MCP d'IdeA \ No newline at end of file diff --git a/.ideai/tickets/28/carnet.md b/.ideai/tickets/28/carnet.md new file mode 100644 index 0000000..be663a6 --- /dev/null +++ b/.ideai/tickets/28/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#28" +version: 3 +updatedBy: {"kind":"user"} +updatedAt: 1783491458775 +--- diff --git a/.ideai/tickets/28/issue.md b/.ideai/tickets/28/issue.md new file mode 100644 index 0000000..0160d05 --- /dev/null +++ b/.ideai/tickets/28/issue.md @@ -0,0 +1,33 @@ +--- +id: "9d8ec8cf-312a-4f90-8199-e37b183ba11e" +number: 28 +title: "First-run wizard : bouton « Save and continue » figé (busy bloqué par l'auto-détection)" +status: "closed" +priority: "high" +sprint: null +links: [] +agentRefs: [] +createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedBy: {"kind":"user"} +createdAt: 1783458330440 +updatedAt: 1783491458775 +version: 3 +--- +## Symptôme (confirmé live, build 0.3.0 @2026-07-07 22:46, = develop 3c6cd04) +Au premier lancement, le wizard affiche les profils de référence (Claude/Codex/Ollama), l'utilisateur remplit le profil Ollama et coche la case, mais **« Save and continue » ET « Detect installed CLIs » restent grisés** → impossible de finir le first-run. Confirmé par l'utilisateur : les deux boutons sont grisés. + +## Diagnostic (source + JS embarqué vérifiés) +- Le JS embarqué contient exactement `disabled: n.busy` sur le bouton (`FirstRunWizard.tsx:103`) — **aucune** condition de validation. Donc bouton grisé ⇔ `busy` reste `true`. +- `useFirstRun.reload()` : `setBusy(true)` → affiche les lignes (d'où formulaire visible/éditable) → `await detectProfiles(refs)` (auto-détection à l'ouverture) → `finally { setBusy(false) }`. Le `finally` ne s'exécute que **si la détection se termine**. Si la promesse `detectProfiles` ne se résout jamais, `busy` reste figé → les deux boutons restent grisés. + +## Causes racines suspectées (2 défauts #14 qui se combinent) +1. **Profil Ollama sans commande de détection** : `detect: None` → `detection_spec` retombe sur `"{command} --version"` = `openai-compatible --version` (`runtime/mod.rs:64`), binaire inexistant → ligne « ✗ not found », et surtout probe inutile. +2. **`block_on` sur runtime tokio imbriqué** dans le chemin de détection : `DetectProfiles::execute` (`usecases.rs:79`) appelle `runtime.detect()` synchrone → `futures_block_on` construit un runtime current-thread et `block_on` (`runtime/mod.rs:231`) **à l'intérieur** de la commande async Tauri `detect_profiles` (`commands.rs:752`). Pattern qui peut paniquer (« Cannot start a runtime from within a runtime ») / rester pendu → la promesse ne se résout jamais. Se déclenche probablement sur une machine **sans Claude/Codex installés**. + +## Attendu du fix +- `busy` doit **toujours** revenir à `false` même si la détection panique/pend (le `finally` ne doit pas dépendre du résultat de la détection ; détection best-effort, non bloquante, éventuellement bornée par timeout). +- Donner une commande/stratégie de détection correcte au profil OpenAI-compatible (ou ne pas le sonder comme un CLI — c'est un endpoint HTTP, pas un binaire). +- Corriger le `block_on` imbriqué dans le runtime de détection (ne pas bloquer dans un contexte async Tauri). + +## Validation QA +Reproduire sur une machine **sans** Claude/Codex installés + Ollama lancé ; vérifier que le wizard reste utilisable (boutons cliquables) et que le profil Ollama se persiste et démarre. \ No newline at end of file diff --git a/.ideai/tickets/29/carnet.md b/.ideai/tickets/29/carnet.md new file mode 100644 index 0000000..88a7ba7 --- /dev/null +++ b/.ideai/tickets/29/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#29" +version: 4 +updatedBy: {"kind":"user"} +updatedAt: 1783491123831 +--- diff --git a/.ideai/tickets/29/issue.md b/.ideai/tickets/29/issue.md new file mode 100644 index 0000000..9a6b791 --- /dev/null +++ b/.ideai/tickets/29/issue.md @@ -0,0 +1,16 @@ +--- +id: "51f19ca1-6b67-491b-b750-735c48a89d4b" +number: 29 +title: "[UI] Garder les filtres des tickets entre deux redemarrage" +status: "open" +priority: "low" +sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74" +links: [] +agentRefs: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783491008871 +updatedAt: 1783491123831 +version: 4 +--- +J'aimerais garder les filtres des tickets en mémoire entre deux redemarrage ou ouverture de la fenetre ou d ela popup de choix de tickets. \ No newline at end of file diff --git a/.ideai/tickets/3/carnet.md b/.ideai/tickets/3/carnet.md new file mode 100644 index 0000000..b2cde7b --- /dev/null +++ b/.ideai/tickets/3/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#3" +version: 2 +updatedBy: {"kind":"user"} +updatedAt: 1783184146749 +--- diff --git a/.ideai/tickets/3/issue.md b/.ideai/tickets/3/issue.md new file mode 100644 index 0000000..3ea76dd --- /dev/null +++ b/.ideai/tickets/3/issue.md @@ -0,0 +1,22 @@ +--- +id: "fedd343e-f9c1-467b-bab4-455f51907de7" +number: 3 +title: "Tâches de fond — dette B : persistance sûre de l'invocation (retry-after-reboot, secrets) + énumération terminale/projet du store" +status: "open" +priority: "low" +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedBy: {"kind":"user"} +createdAt: 1783082860758 +updatedAt: 1783184146749 +version: 2 +--- +Dette issue de l'arbitrage B8 (mémoire projet: b8-arbitration-outcomes, points 2 et 5). + +En V1, le registre d'invocations pour le retry est in-memory et session-scoped (le SpawnSpec porte des secrets, interdit dans .ideai/background-tasks/*.json qui voyage avec le projet). Conséquences à résorber : + +- Retry-after-reboot : persistance SÛRE de l'invocation (redaction des secrets et/ou store machine-local hors projet) pour permettre le retry après un redémarrage d'IdeA. +- Énumération store : aujourd'hui `list_background_tasks` sans agentId ne renvoie que les complétions non livrées du projet ; le store n'énumère pas les tâches terminales/ouvertes par projet (historique completed/failed partiel). Enrichir BackgroundTaskStore pour l'énumération terminale/projet. + +Cadrage Architect requis (persistance de secrets = sensible). \ No newline at end of file diff --git a/.ideai/tickets/30/carnet.md b/.ideai/tickets/30/carnet.md new file mode 100644 index 0000000..43790f9 --- /dev/null +++ b/.ideai/tickets/30/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#30" +version: 3 +updatedBy: {"kind":"user"} +updatedAt: 1783491223434 +--- diff --git a/.ideai/tickets/30/issue.md b/.ideai/tickets/30/issue.md new file mode 100644 index 0000000..4f8468e --- /dev/null +++ b/.ideai/tickets/30/issue.md @@ -0,0 +1,16 @@ +--- +id: "f2c4ed9c-ba54-42c1-90aa-0345d4ff4c6b" +number: 30 +title: "[Bug] Le handle de limite session n'est pas fonctionnel quand c'est Main qui limite session" +status: "open" +priority: "medium" +sprint: null +links: [{"target":"#27","kind":"blockedBy"}] +agentRefs: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783491181648 +updatedAt: 1783491223434 +version: 3 +--- +Lorsque l'agent qui atteint sa limite est celui à qui ont parle, la limite de session n'est pas récupérée par IdeA et n'est pas gérée \ No newline at end of file diff --git a/.ideai/tickets/31/carnet.md b/.ideai/tickets/31/carnet.md new file mode 100644 index 0000000..640c39f --- /dev/null +++ b/.ideai/tickets/31/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#31" +version: 1 +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedAt: 1783491197541 +--- diff --git a/.ideai/tickets/31/issue.md b/.ideai/tickets/31/issue.md new file mode 100644 index 0000000..733cf62 --- /dev/null +++ b/.ideai/tickets/31/issue.md @@ -0,0 +1,31 @@ +--- +id: "83d320f1-766b-4744-b518-8e39a2518e9c" +number: 31 +title: "Détection de profils séquentielle : N × 800 ms au pire, résultat potentiellement partiel" +status: "open" +priority: "low" +sprint: null +links: [{"target":"#28","kind":"relatesTo"}] +agentRefs: [] +createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +createdAt: 1783491197541 +updatedAt: 1783491197541 +version: 1 +--- +## Origine +Relevé par Git en revue du diff du ticket #28 (merge 710fa8f), hors périmètre du fix. + +## Constat +Depuis #28, `DetectProfiles::execute` séquence les `await` candidat par candidat, chaque sonde bornée par `tokio::time::timeout(800ms)`. N profils indisponibles coûtent donc **N × 800 ms** au pire. + +Côté frontend, `DETECT_TIMEOUT_MS = 3 s` relâche le flag `detecting`. À partir de ~4 candidats muets, le tour de détection dépasse ce délai : l'indicateur « Detecting… » disparaît avant que les résultats n'arrivent. + +## Impact +Cosmétique. L'UI **ne gèle plus** (c'est bien l'objet de #28, corrigé) ; le risque résiduel est un affichage de disponibilité qui arrive après la retombée de l'indicateur. + +## Piste de fix +Paralléliser les sondes avec `futures::future::join_all` dans `DetectProfiles::execute` (`crates/application/src/agent/usecases.rs`) : le coût au pire retombe à ~800 ms quel que soit N, largement sous le timeout UI. + +## Validation +Test `#[tokio::test(flavor = "multi_thread")]` sur `DetectProfiles::execute` avec N candidats muets, asserting que la durée totale reste bornée par ~1 × timeout et non N ×. \ No newline at end of file diff --git a/.ideai/tickets/32/carnet.md b/.ideai/tickets/32/carnet.md new file mode 100644 index 0000000..76aa4e7 --- /dev/null +++ b/.ideai/tickets/32/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#32" +version: 5 +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedAt: 1783491681672 +--- diff --git a/.ideai/tickets/32/issue.md b/.ideai/tickets/32/issue.md new file mode 100644 index 0000000..e60ef3d --- /dev/null +++ b/.ideai/tickets/32/issue.md @@ -0,0 +1,23 @@ +--- +id: "9291e7ad-a300-4f15-83b1-93f56f6e1b79" +number: 32 +title: "[Bug] Erreur CLI Ollama profile" +status: "inProgress" +priority: "medium" +sprint: null +links: [{"target":"#14","kind":"relatesTo"}] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +createdAt: 1783491571863 +updatedAt: 1783491681672 +version: 5 +--- +J'ai créé un profile IA Ollama et j'ai ajouté un agent avec ce profile (agent TestOllama), mais quand + j'essaie d'afficher sa cli j'ai un bandeau rouge qui dit "Échec du lancement de l'agent : process error: pty spawn + failed: Unable to spawn openai-compatible because: + No viable candidates found in PATH "/tmp/.mount_IdeA_0mlgJnH/usr/bin/:/tmp/.mount_IdeA_0mlgJnH/usr/sbin/:/tmp/.mount_ + IdeA_0mlgJnH/usr/games/:/tmp/.mount_IdeA_0mlgJnH/bin/:/tmp/.mount_IdeA_0mlgJnH/sbin/:/home/anthony/.local/bin:/run/us + er/1000/fnm_multishells/4610_1783490075749/bin:/home/anthony/.local/share/fnm:/home/anthony/go/bin:/home/anthony/.car + go/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl: + /usr/bin/core_perl:/home/anthony/.local/share/JetBrains/Toolbox/scripts" \ No newline at end of file diff --git a/.ideai/tickets/33/carnet.md b/.ideai/tickets/33/carnet.md new file mode 100644 index 0000000..d63e8db --- /dev/null +++ b/.ideai/tickets/33/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#33" +version: 1 +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedAt: 1783492190391 +--- diff --git a/.ideai/tickets/33/issue.md b/.ideai/tickets/33/issue.md new file mode 100644 index 0000000..4c419b9 --- /dev/null +++ b/.ideai/tickets/33/issue.md @@ -0,0 +1,39 @@ +--- +id: "c3e1fbcc-cedc-48a5-a00e-b22ea8dc90de" +number: 33 +title: "[Dette] Fallthrough silencieux du routage structuré (lifecycle.rs:1705)" +status: "open" +priority: "high" +sprint: null +links: [{"target":"#32","kind":"relatesTo"},{"target":"#14","kind":"relatesTo"}] +agentRefs: [] +createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +createdAt: 1783492190391 +updatedAt: 1783492190391 +version: 1 +--- +Cause racine structurelle identifiée par Architect lors du cadrage de #32. + +`LaunchAgent::execute` (crates/application/src/agent/lifecycle.rs:1705) route vers la session structurée avec : + +```rust +if let (Some(factory), Some(structured), true) = ( + self.session_factory.as_ref(), self.structured.as_ref(), + profile.structured_adapter.is_some(), +) +``` + +Ce `if let` **confond deux situations distinctes** : +- « profil structuré, mais factory non câblée » (cas de l'UI : `state.rs:1466` construit le `LaunchAgent` sans `.with_structured(...)`) ; +- « profil non structuré » (vrai profil PTY historique). + +Dans les deux cas on tombe silencieusement, sans erreur ni branche explicite, sur `lifecycle.rs:1746` `self.pty.spawn(spec)`. + +C'est ce fallthrough qui a produit le bug #32 : un profil `openAiCompatible` (aucun binaire) atteignait `CommandBuilder::new("openai-compatible")`. Claude et Codex tombent dans le **même** fallthrough ; ça ne passe inaperçu que parce qu'un binaire `claude`/`codex` existe dans le PATH. + +Le fix de #32 neutralise le cas transport-backed, mais **le piège reste armé** pour le prochain adapter. + +**Attendu** : remplacer le `if let` par un `match` explicite qui distingue les deux cas, et décider du comportement quand un profil structuré rencontre une factory non câblée (erreur explicite plutôt que dégradation muette vers le PTY). + +Hors périmètre de #32 (déposé comme bug). Cadrage Architect requis avant implémentation. \ No newline at end of file diff --git a/.ideai/tickets/34/carnet.md b/.ideai/tickets/34/carnet.md new file mode 100644 index 0000000..2908498 --- /dev/null +++ b/.ideai/tickets/34/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#34" +version: 1 +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedAt: 1783492562056 +--- diff --git a/.ideai/tickets/34/issue.md b/.ideai/tickets/34/issue.md new file mode 100644 index 0000000..8c6ce19 --- /dev/null +++ b/.ideai/tickets/34/issue.md @@ -0,0 +1,29 @@ +--- +id: "8dca00bf-ec0f-4da1-a231-46b27c711b78" +number: 34 +title: "[Risque] ChatBridge.scrollback non borné (croissance mémoire)" +status: "open" +priority: "medium" +sprint: null +links: [{"target":"#32","kind":"relatesTo"}] +agentRefs: [] +createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +createdAt: 1783492562056 +updatedAt: 1783492562056 +version: 1 +--- +Identifié par Architect lors du cadrage de #32 (variante B). + +`ChatBridge` retient le scrollback d'une session chat pour le rejouer au remount (`reattach_agent_chat`). L'enregistrement se fait par un `push` nu, **sans aucun cap** : + +- `app-tauri/src/chat.rs:161` — `push` sans borne. +- `app-tauri/src/chat.rs:47` — la doc prétend « Bounded only by the conversation length (a turn count) », ce qui est un euphémisme : chaque `TextDelta` (quelques octets) est retenu à vie. + +**Dormant jusqu'ici** : aucune session structurée vivante ne passait par ce chemin. **Devient actif avec #32 variante B** (cellule chat pour les adapters transport-backed) : une conversation Ollama longue fait croître le `Vec` sans borne. + +Distinct de la rétention/rotation du transcript disque (mémoire `conversation-log-ls6-rotation-and-paginated-read`), qui porte sur `log.jsonl`, pas sur ce buffer mémoire. + +**Attendu** : borner le scrollback (cap en nombre d'événements ou en octets, avec troncature par la tête), corriger la doc `chat.rs:47`, et décider si le remount doit signaler une troncature à l'UI. + +Hors périmètre #32. Cadrage Architect requis. \ No newline at end of file diff --git a/.ideai/tickets/4/carnet.md b/.ideai/tickets/4/carnet.md new file mode 100644 index 0000000..8710bcc --- /dev/null +++ b/.ideai/tickets/4/carnet.md @@ -0,0 +1,28 @@ +--- +issueRef: "#4" +version: 9 +updatedBy: {"kind":"user"} +updatedAt: 1783437430509 +--- +## 🔄 REDÉMARRAGE DE ZÉRO (2026-07-04) — décision utilisateur + +TOUT le travail #4 précédent (sur base canonique/main) est ABANDONNÉ comme ligne de livraison. Raison : l'utilisateur a réaligné main = develop = feature/background-tasks-first-class (ebd992e, base PRÉ-canonique de #1). Le moteur de conversation « canonique » (spawn_turn/AgentTurnEvent/agentBusyChanged) sur lequel reposait l'ancien #4 n'est PLUS sur main/develop. On refait #4 de zéro sur la base develop. + +BRANCHE DE TRAVAIL : `feature/agent-live-announcements` (créée depuis develop ebd992e). + +BRANCHES SUPPRIMÉES (obsolètes) : feature/announcements-canonical, feature/inter-agent-announcements. +FILETS DE RÉCUPÉRATION (si on veut repiquer du code) : +- backup/announcements-work-20260704 (691b2ce) = ancien #4 complet (backend B0-B3 + frontend F1/F2/F3 recâblé busy + tests). +- backup/inter-agent-announcements-71d307d (71d307d) = backend annonces d'origine. +- backup/main-canonical-20260704 (3cff2b1) = moteur canonique + releases. + +OBJECTIF PRODUIT (inchangé, reconfirmé utilisateur) : affichage live sur la cellule d'un agent de ce qu'il raconte quand un AUTRE agent le sollicite via idea_ask_agent. Overlay sur la cellule CIBLE (« un agent est en train de lui parler » + annonces défilantes), monté quand la cible est busy, retiré à l'idle. Preview côté DEMANDEUR près de la liste d'agents, filtré par ticket + requester==self. + +⚠️ ATTENTION base develop : moteur « batch » (run_turn), PAS le canonique. À cadrer par Architect : quels signaux live develop émet-il déjà (annonces intermédiaires ? busy/idle par agent ? l'ancien #4 utilisait agentBusyChanged + read-model agents[].busy — existent-ils sur develop ?), et que faut-il (ré)implémenter côté backend pour que les annonces soient LIVE (pas flushées en fin de tour). Réutiliser les composants frontend depuis backup/announcements-work-20260704 si le contrat de signaux le permet. + +## RESTE À FAIRE (cycle complet sur base develop) +1. [EN COURS] Architect : cadrage from-scratch sur base develop (signaux live disponibles + à créer, contrat Announcement/Final, plan B/F, réutilisabilité du code sauvegardé). +2. Git : branche de travail = feature/agent-live-announcements (FAIT). +3. DevBackend : mécanisme annonces/Final + signaux live sur moteur develop. +4. DevFrontend : F1 store + F2 preview demandeur + F3 overlay cible. +5. QA : reproduire le déclenchement inter-agent + constater overlay/preview live + fermeture à l'idle. \ No newline at end of file diff --git a/.ideai/tickets/4/issue.md b/.ideai/tickets/4/issue.md new file mode 100644 index 0000000..3e03988 --- /dev/null +++ b/.ideai/tickets/4/issue.md @@ -0,0 +1,35 @@ +--- +id: "547f6a47-9c86-4c16-9018-f050af75a6aa" +number: 4 +title: "Annonces inter-agent (UI live) — reprise et finalisation : overlay cellule cible + preview demandeur (F1-F3)" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedBy: {"kind":"user"} +createdAt: 1783083604350 +updatedAt: 1783437430509 +version: 9 +--- +Objectif produit (demande utilisateur, design figé le 2026-07-02) : +Quand un agent en contacte un autre via idea_ask_agent, l'agent CONTACTÉ doit afficher, par-dessus sa cellule, un overlay « un agent est en train de lui parler » avec ses réflexions/annonces en cours qui défilent ; l'agent DEMANDEUR affiche un petit preview des annonces près de la drop-list d'agents, filtré par ticket. L'overlay est piloté par le live-state (monté sur Working, retiré au Final/idle, persiste tant qu'≥1 ticket actif sur la cible). Design et cadrage complets en mémoire projet : inter-agent-announcements-feature-and-codex-final-bug (+ inter-agent-live-context-shared-per-agent). + +ÉTAT ACTUEL (vérifié 2026-07-03) : +- Backend B0-B3 DÉJÀ implémenté sur la branche feature/inter-agent-announcements, commit 71d307d : + - ReplyEvent::Announcement (non terminal) vs Final (terminal, résout le ticket). + - DomainEvent::AgentAnnouncement{project_id, requester, target, ticket_id, text, at_ms}. + - Relay Tauri (crates/app-tauri/src/events.rs), DTO. + - Fix du Final Codex : dernier agent_message avant turn.completed = Final (avant : le préambule était renvoyé au demandeur au lieu de la conclusion). 18 fichiers backend + tests. +- FRONTEND F1/F2/F3 : JAMAIS écrit. Aucune référence « announcement » sous frontend/src. C'est la pièce visuelle centrale de la demande (preview demandeur + overlay cible) — absente. +- La branche feature/inter-agent-announcements est 15 commits EN RETARD sur develop, jamais mergée. Une seconde branche feature/inter-agent-announcements-v2 ne contient PAS le code d'annonces (repartie sur d'autres fixes codex/orchestrator). + +RESTE À FAIRE : +1. Architect : cadrer la REPRISE — décider du rebase de 71d307d sur develop actuel, arbitrer les conflits avec le nouveau modèle de conversation (le fix Final Codex et le modèle de fil ont évolué depuis ; cf. inter-agent-live-context-shared-per-agent : log canonique PAR AGENT + vues par paire). Confirmer que le contrat Announcement/Final tient encore. +2. Git : décider de la topologie (rebase vs re-cherry-pick du backend sur une branche fraîche depuis develop). +3. DevBackend : réintégrer/adapter B0-B3 sur develop actuel si des conflits d'API le nécessitent. +4. DevFrontend : écrire F1 (store/gateway annonces, index par ticket/target, borné ~20-50), F2 (preview cellule demandeur près de la drop-list, filtré par ticket_id), F3 (overlay cellule cible : texte haut + annonces défilantes au centre, monté sur live-state Working, retiré au Final/idle). +5. QA e2e : reproduire le bug initial (Main→Architect→QA avec préambule+outil+conclusion, vérifier que le demandeur ne reçoit QUE la conclusion), puis constater le preview demandeur + l'overlay cible pendant le travail, et la fermeture au Final. + +Chantier DISTINCT du ticket #1 (tâches de fond). Non prioritaire tant que #1 n'est pas mergé, sauf décision contraire. \ No newline at end of file diff --git a/.ideai/tickets/5/carnet.md b/.ideai/tickets/5/carnet.md new file mode 100644 index 0000000..0af8e95 --- /dev/null +++ b/.ideai/tickets/5/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#5" +version: 4 +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedAt: 1783328740886 +--- diff --git a/.ideai/tickets/5/issue.md b/.ideai/tickets/5/issue.md new file mode 100644 index 0000000..d335f73 --- /dev/null +++ b/.ideai/tickets/5/issue.md @@ -0,0 +1,22 @@ +--- +id: "bd0f52c4-480f-4cf8-9c4c-05d05fb9e102" +number: 5 +title: "Tâches de fond — dette de contrat DTO work-state : summary non affiché + owner/project inutiles + tri" +status: "closed" +priority: "low" +links: [{"target":"#1","kind":"relatesTo"}] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +createdAt: 1783115680555 +updatedAt: 1783328740886 +version: 4 +--- +Dette de contrat mineure détectée lors du fix T3 du ticket #1 (projection background_tasks dans le read-model work-state, branche feature/background-tasks-first-class). Non bloquant : Cancel/Retry fonctionnent en live. + +Points à traiter : + +- [ ] `summary` : le DTO backend `AgentBackgroundTaskStateDto` émet un `summary` (résumé/erreur/raison du résultat terminal) que le type frontend `BackgroundCompletion` ne porte pas → info perdue, non affichée dans le panneau. Décider si on l'affiche (utile pour comprendre un échec/annulation d'un coup d'œil) et brancher. +- [ ] `ownerAgentId`/`projectId` absents du payload par-agent : inoffensif (les tâches sont imbriquées sous leur agent, fallback ownerAgentId = agentId), mais le chemin de merge top-level dans `normalizeProjectWorkState` reste du code défensif inutilisé pour ce contrat. À nettoyer ou documenter comme volontaire. + +Contexte : mémoire projet `workstate-background-tasks-projection-fix` (décision d'archi) et `tickets-t3-frontend-validation-verdict` (verdict FE + écarts). Le point tri sur finishedAtMs a déjà été corrigé (bascule sur updatedAtMs) et n'est PAS dans cette dette. \ No newline at end of file diff --git a/.ideai/tickets/6/carnet.md b/.ideai/tickets/6/carnet.md new file mode 100644 index 0000000..dcb10e0 --- /dev/null +++ b/.ideai/tickets/6/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#6" +version: 15 +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedAt: 1783312054217 +--- diff --git a/.ideai/tickets/6/issue.md b/.ideai/tickets/6/issue.md new file mode 100644 index 0000000..e340c45 --- /dev/null +++ b/.ideai/tickets/6/issue.md @@ -0,0 +1,15 @@ +--- +id: "b9ec818e-918e-489a-983c-04c62757bf53" +number: 6 +title: "Suppression d'un ticket" +status: "closed" +priority: "low" +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +createdAt: 1783166803287 +updatedAt: 1783312054217 +version: 15 +--- +Un ticket doit pouvoir être supprimé \ No newline at end of file diff --git a/.ideai/tickets/7/carnet.md b/.ideai/tickets/7/carnet.md new file mode 100644 index 0000000..d78e587 --- /dev/null +++ b/.ideai/tickets/7/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#7" +version: 7 +updatedBy: {"kind":"user"} +updatedAt: 1783329459094 +--- diff --git a/.ideai/tickets/7/issue.md b/.ideai/tickets/7/issue.md new file mode 100644 index 0000000..d1c6016 --- /dev/null +++ b/.ideai/tickets/7/issue.md @@ -0,0 +1,16 @@ +--- +id: "9f6979fb-a68f-4660-9d57-cf69ea1daf85" +number: 7 +title: "Gestion des session limite" +status: "qa" +priority: "high" +sprint: "d8f3f37b-87ca-4509-9116-45a99bc711df" +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1783167495082 +updatedAt: 1783329459094 +version: 7 +--- +J'aimerais que IdeA puisse gérer les session limite des profile IA. Lorsqu'un profile IA atteint une session limite, j'aimerais que IdeA le sache, qu'il récupère l'heure et la date du reset et qu'il puisse automatiquement reprendre le travail une fois le reset fait. Lorsqu'une reprise automatique est prévue, il faut que l'utilisateur puisse cancel la reprise. Il est important de noter que les agent s'appelant entre eux avec des profile IA différents, il faut prendre en compte qu'un agent A qui appelle un agent B, peut voir l'agent B atteindre la session limite. IdeA devra savoir gérer ça correctement. \ No newline at end of file diff --git a/.ideai/tickets/8/carnet.md b/.ideai/tickets/8/carnet.md new file mode 100644 index 0000000..3a5bc66 --- /dev/null +++ b/.ideai/tickets/8/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#8" +version: 6 +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedAt: 1783310831918 +--- diff --git a/.ideai/tickets/8/issue.md b/.ideai/tickets/8/issue.md new file mode 100644 index 0000000..152c340 --- /dev/null +++ b/.ideai/tickets/8/issue.md @@ -0,0 +1,15 @@ +--- +id: "80a751de-3c20-485e-b810-148862a71d45" +number: 8 +title: "Création de ticket via agent IA" +status: "closed" +priority: "medium" +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +createdAt: 1783167694310 +updatedAt: 1783310831918 +version: 6 +--- +j'aimerais que l'écriture des tickets puisse se faire assisté par un agent IA. Dans l'edition du ticket, j'aimerais qu'on ai la possibilité d'ouvrir une ocnversation. Dans cette conversation on pourrait choisir l'un des profile IA d'IdeA. Ici, la fenetre de chat serait entièrement fournit par l'UI d'IdeA (donc pas une CLI). La session serait propre au ticket, l'agent n'aurait aucun droit d'écriture de code ou d'edition de fichier, il ne pourrait que lire les fichiers du dossier et editer le ticket actuel. Le but serait vraiment pour l'utilisateur de pouvoir discuter de sa feature avec l'agent et que l'agent en tire ce qui est necessaire. Je pense que le mieux serait que IdeA fournisse le context de cet agent, stockée chez IdeA, et qu'a l'ouverture du chat, un agent temporaire soit invoqué avec ce contexte et que la conversation se fasse via les commandes headless. \ No newline at end of file diff --git a/.ideai/tickets/9/carnet.md b/.ideai/tickets/9/carnet.md new file mode 100644 index 0000000..e66a0dd --- /dev/null +++ b/.ideai/tickets/9/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#9" +version: 6 +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +updatedAt: 1783210849647 +--- diff --git a/.ideai/tickets/9/issue.md b/.ideai/tickets/9/issue.md new file mode 100644 index 0000000..1c145dd --- /dev/null +++ b/.ideai/tickets/9/issue.md @@ -0,0 +1,15 @@ +--- +id: "6ab62c34-3704-4d1c-b57c-ec42ae25ca55" +number: 9 +title: "Ne pas revert la description d'un ticket lorsque l'on change la priorité" +status: "closed" +priority: "medium" +links: [] +agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}] +createdBy: {"kind":"user"} +updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} +createdAt: 1783168333077 +updatedAt: 1783210849647 +version: 6 +--- +Lors de l'edition d'un ticket, si l'on tape la description et que sans cliquer sur save change on change la priorité, la description ou le titre qui était en train d'être édité est revert. Il faut que pendant l'edition les modifications soient persistantes. Pour s'assurer que l'utilistateur n'oublie pas de sauvegarder, j'aimerais que si l'on clique sur "close" sans avoir sauvegardé, uen popup nous en informe pour nous demander si on veut sauvegarder avant de fermer \ No newline at end of file diff --git a/.ideai/tickets/counter.json b/.ideai/tickets/counter.json new file mode 100644 index 0000000..e74e19d --- /dev/null +++ b/.ideai/tickets/counter.json @@ -0,0 +1,3 @@ +{ + "nextNumber": 35 +} \ No newline at end of file diff --git a/.ideai/tickets/index.json b/.ideai/tickets/index.json new file mode 100644 index 0000000..9c3fe2f --- /dev/null +++ b/.ideai/tickets/index.json @@ -0,0 +1,375 @@ +{ + "version": 1, + "issues": [ + { + "issueRef": "#1", + "path": "1", + "title": "Tâches de fond — finaliser B8 (runner PTY) et clôturer le chantier", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783175265022 + }, + { + "issueRef": "#2", + "path": "2", + "title": "Tâches de fond — dette A : PtyPort::wait/try_wait + tee live UI + robustesse détection de fin", + "status": "open", + "priority": "low", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783184142093 + }, + { + "issueRef": "#3", + "path": "3", + "title": "Tâches de fond — dette B : persistance sûre de l'invocation (retry-after-reboot, secrets) + énumération terminale/projet du store", + "status": "open", + "priority": "low", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783184146749 + }, + { + "issueRef": "#4", + "path": "4", + "title": "Annonces inter-agent (UI live) — reprise et finalisation : overlay cellule cible + preview demandeur (F1-F3)", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783437430509 + }, + { + "issueRef": "#5", + "path": "5", + "title": "Tâches de fond — dette de contrat DTO work-state : summary non affiché + owner/project inutiles + tri", + "status": "closed", + "priority": "low", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783328740886 + }, + { + "issueRef": "#6", + "path": "6", + "title": "Suppression d'un ticket", + "status": "closed", + "priority": "low", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783312054217 + }, + { + "issueRef": "#7", + "path": "7", + "title": "Gestion des session limite", + "status": "qa", + "priority": "high", + "sprint": "d8f3f37b-87ca-4509-9116-45a99bc711df", + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783329459094 + }, + { + "issueRef": "#8", + "path": "8", + "title": "Création de ticket via agent IA", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783310831918 + }, + { + "issueRef": "#9", + "path": "9", + "title": "Ne pas revert la description d'un ticket lorsque l'on change la priorité", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783210849647 + }, + { + "issueRef": "#10", + "path": "10", + "title": "Ticket par sprint", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783241883970 + }, + { + "issueRef": "#11", + "path": "11", + "title": "Interface de création de sprint", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783278726067 + }, + { + "issueRef": "#12", + "path": "12", + "title": "Checkbox pour les filters des tickets", + "status": "closed", + "priority": "low", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783312900907 + }, + { + "issueRef": "#13", + "path": "13", + "title": "Server/client mode", + "status": "open", + "priority": "low", + "sprint": "028179b1-eaf4-41e9-9c1f-7c37125117e6", + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783329397368 + }, + { + "issueRef": "#14", + "path": "14", + "title": "Integration de profils IA locaux/LAN comme profils IdeA canoniques", + "status": "qa", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783456579694 + }, + { + "issueRef": "#15", + "path": "15", + "title": "Limites de session — re-livraison automatique parquée au reset (stretch B5, délégation durable)", + "status": "open", + "priority": "low", + "sprint": "d8f3f37b-87ca-4509-9116-45a99bc711df", + "assignedAgentIds": [], + "updatedAt": 1783329462104 + }, + { + "issueRef": "#16", + "path": "16", + "title": "[UI] réorganisation des menus", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783405334263 + }, + { + "issueRef": "#17", + "path": "17", + "title": "[UI] fenetre de gestion de tickets", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "updatedAt": 1783405334977 + }, + { + "issueRef": "#18", + "path": "18", + "title": "[UI] Créer une popup de selection de ticket", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783405335941 + }, + { + "issueRef": "#19", + "path": "19", + "title": "[UI] implémentation de la popup de selection de ticket dans la création d'un sprint", + "status": "closed", + "priority": "low", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783405337651 + }, + { + "issueRef": "#20", + "path": "20", + "title": "[Backend] Dette ticket_list — matching #ref dans text + curseur opaque/stable", + "status": "open", + "priority": "low", + "sprint": null, + "assignedAgentIds": [], + "updatedAt": 1783331176736 + }, + { + "issueRef": "#21", + "path": "21", + "title": "[UI] pouvoir trier les ticket par...", + "status": "closed", + "priority": "low", + "sprint": null, + "assignedAgentIds": [], + "updatedAt": 1783437364397 + }, + { + "issueRef": "#22", + "path": "22", + "title": "[UI] Anchor de views", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "updatedAt": 1783437364871 + }, + { + "issueRef": "#23", + "path": "23", + "title": "[UI] rendre les fenêtres View séparée de IdeA", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "updatedAt": 1783437365276 + }, + { + "issueRef": "#25", + "path": "25", + "title": "[Bug] Codex/Claude erreur lors de l'utilisation dans l'edition d'un ticket", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783491435654 + }, + { + "issueRef": "#26", + "path": "26", + "title": "[UI] refonte totale de la gestion des menus via agent UX", + "status": "open", + "priority": "medium", + "sprint": "5afd6780-0f76-40d7-a10f-32ee52469d74", + "assignedAgentIds": [], + "updatedAt": 1783491079604 + }, + { + "issueRef": "#27", + "path": "27", + "title": "[Bug] L'outil assistance IA n'a pas les commandes MCP", + "status": "open", + "priority": "high", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783440116446 + }, + { + "issueRef": "#28", + "path": "28", + "title": "First-run wizard : bouton « Save and continue » figé (busy bloqué par l'auto-détection)", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "updatedAt": 1783491458775 + }, + { + "issueRef": "#29", + "path": "29", + "title": "[UI] Garder les filtres des tickets entre deux redemarrage", + "status": "open", + "priority": "low", + "sprint": "5afd6780-0f76-40d7-a10f-32ee52469d74", + "assignedAgentIds": [], + "updatedAt": 1783491123831 + }, + { + "issueRef": "#30", + "path": "30", + "title": "[Bug] Le handle de limite session n'est pas fonctionnel quand c'est Main qui limite session", + "status": "open", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "updatedAt": 1783491223434 + }, + { + "issueRef": "#31", + "path": "31", + "title": "Détection de profils séquentielle : N × 800 ms au pire, résultat potentiellement partiel", + "status": "open", + "priority": "low", + "sprint": null, + "assignedAgentIds": [], + "updatedAt": 1783491197541 + }, + { + "issueRef": "#32", + "path": "32", + "title": "[Bug] Erreur CLI Ollama profile", + "status": "inProgress", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "a6ced819-b893-4213-b003-9e9dc79b9641" + ], + "updatedAt": 1783491681672 + }, + { + "issueRef": "#33", + "path": "33", + "title": "[Dette] Fallthrough silencieux du routage structuré (lifecycle.rs:1705)", + "status": "open", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "updatedAt": 1783492190391 + }, + { + "issueRef": "#34", + "path": "34", + "title": "[Risque] ChatBridge.scrollback non borné (croissance mémoire)", + "status": "open", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "updatedAt": 1783492562056 + } + ] +} \ No newline at end of file