chore(ideai): état runtime — tickets, mémoire, tâches de fond
Ticket #92 rouvert, mises à jour de carnets/tâches de fond. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
File diff suppressed because one or more lines are too long
@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#43"
|
issueRef: "#43"
|
||||||
version: 5
|
version: 6
|
||||||
updatedBy: {"kind":"agent","agent_id":"dce19c75-9669-4e45-b8de-9950025157da"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1784667145901
|
updatedAt: 1784707900405
|
||||||
---
|
---
|
||||||
# Ticket #43 — Cadrage consolidé v2 du système de plugins
|
# Ticket #43 — Cadrage consolidé v2 du système de plugins
|
||||||
|
|
||||||
|
|||||||
@ -2,15 +2,15 @@
|
|||||||
id: "63e80352-8ce1-4116-9ec3-b4cb3fc5c077"
|
id: "63e80352-8ce1-4116-9ec3-b4cb3fc5c077"
|
||||||
number: 43
|
number: 43
|
||||||
title: "Systeme de plugins"
|
title: "Systeme de plugins"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "medium"
|
priority: "medium"
|
||||||
sprint: null
|
sprint: null
|
||||||
links: []
|
links: []
|
||||||
agentRefs: []
|
agentRefs: []
|
||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"agent","agent_id":"dce19c75-9669-4e45-b8de-9950025157da"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783879315858
|
createdAt: 1783879315858
|
||||||
updatedAt: 1784667145901
|
updatedAt: 1784707900405
|
||||||
version: 5
|
version: 6
|
||||||
---
|
---
|
||||||
Système de plugins/extensions pour IdeA (à la VSCode/Visual Studio) : permettre d'ajouter des menus (dropdown façon Panneaux/Paramètres), des items dans des menus existants, des types de layout custom (à la GitGraph), et des tools MCP.
|
Système de plugins/extensions pour IdeA (à la VSCode/Visual Studio) : permettre d'ajouter des menus (dropdown façon Panneaux/Paramètres), des items dans des menus existants, des types de layout custom (à la GitGraph), et des tools MCP.
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#64"
|
issueRef: "#64"
|
||||||
version: 5
|
version: 6
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"user"}
|
||||||
updatedAt: 1784193766706
|
updatedAt: 1784718418070
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,16 +2,16 @@
|
|||||||
id: "c8f1c5b3-7674-4c6c-bba5-bb2c5faf201b"
|
id: "c8f1c5b3-7674-4c6c-bba5-bb2c5faf201b"
|
||||||
number: 64
|
number: 64
|
||||||
title: "Web : créer/ajouter un projet depuis le navigateur (folder browser serveur)"
|
title: "Web : créer/ajouter un projet depuis le navigateur (folder browser serveur)"
|
||||||
status: "open"
|
status: "closed"
|
||||||
priority: "medium"
|
priority: "medium"
|
||||||
sprint: "028179b1-eaf4-41e9-9c1f-7c37125117e6"
|
sprint: "028179b1-eaf4-41e9-9c1f-7c37125117e6"
|
||||||
links: [{"target":"#13","kind":"dependsOn"}]
|
links: [{"target":"#13","kind":"dependsOn"}]
|
||||||
agentRefs: []
|
agentRefs: []
|
||||||
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
updatedBy: {"kind":"user"}
|
||||||
createdAt: 1784183727404
|
createdAt: 1784183727404
|
||||||
updatedAt: 1784193766706
|
updatedAt: 1784718418070
|
||||||
version: 5
|
version: 6
|
||||||
---
|
---
|
||||||
Issu de la validation live de #13 (mode client/serveur web). En web, le bouton « Browse » (choisir un dossier de projet) est inopérant : `pickFolder()` renvoie `UNSUPPORTED_ON_WEB` car il s'appuie sur le dialogue natif OS de Tauri, absent du navigateur. Sélectionner un projet EXISTANT est déjà couvert par la liste (list_projects/open_project). Il manque CRÉER/AJOUTER un projet = choisir un dossier côté SERVEUR.
|
Issu de la validation live de #13 (mode client/serveur web). En web, le bouton « Browse » (choisir un dossier de projet) est inopérant : `pickFolder()` renvoie `UNSUPPORTED_ON_WEB` car il s'appuie sur le dialogue natif OS de Tauri, absent du navigateur. Sélectionner un projet EXISTANT est déjà couvert par la liste (list_projects/open_project). Il manque CRÉER/AJOUTER un projet = choisir un dossier côté SERVEUR.
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
issueRef: "#7"
|
issueRef: "#7"
|
||||||
version: 7
|
version: 8
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
updatedAt: 1783329459094
|
updatedAt: 1784718581033
|
||||||
---
|
---
|
||||||
|
|||||||
@ -2,15 +2,15 @@
|
|||||||
id: "9f6979fb-a68f-4660-9d57-cf69ea1daf85"
|
id: "9f6979fb-a68f-4660-9d57-cf69ea1daf85"
|
||||||
number: 7
|
number: 7
|
||||||
title: "Gestion des session limite"
|
title: "Gestion des session limite"
|
||||||
status: "qa"
|
status: "closed"
|
||||||
priority: "high"
|
priority: "high"
|
||||||
sprint: "d8f3f37b-87ca-4509-9116-45a99bc711df"
|
sprint: "d8f3f37b-87ca-4509-9116-45a99bc711df"
|
||||||
links: []
|
links: []
|
||||||
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||||
createdBy: {"kind":"user"}
|
createdBy: {"kind":"user"}
|
||||||
updatedBy: {"kind":"user"}
|
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||||
createdAt: 1783167495082
|
createdAt: 1783167495082
|
||||||
updatedAt: 1783329459094
|
updatedAt: 1784718581033
|
||||||
version: 7
|
version: 8
|
||||||
---
|
---
|
||||||
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.
|
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.
|
||||||
25
.ideai/tickets/92/carnet.md
Normal file
25
.ideai/tickets/92/carnet.md
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
issueRef: "#92"
|
||||||
|
version: 8
|
||||||
|
updatedBy: {"kind":"user"}
|
||||||
|
updatedAt: 1784788822167
|
||||||
|
---
|
||||||
|
## Résumé de livraison
|
||||||
|
|
||||||
|
Backend et frontend livrés sur `feature/ticket92-opencode-provider-cloud`, mergée dans `develop` (merge `12c7d10`).
|
||||||
|
|
||||||
|
**Backend** (commit `23a3c27`) :
|
||||||
|
- Domain : `OpenCodeProviderConfig { provider_id, model, api_key_ref: SecretRef }` sur `AgentProfile.opencode_provider`, invariant `opencode_backend_is_consistent()` (llamacpp local XOR provider cloud, jamais les deux).
|
||||||
|
- Port `SecretStore` + adaptateur `FsSecretStore` (AES-256-GCM via `ring`, clé locale `secret.key` chmod 0600) — la clé API cloud n'est jamais en clair dans `profiles.json`.
|
||||||
|
- Catalogue de providers **statique** (`application/agent/provider_catalogue.rs`) exposé via la commande Tauri `list_opencode_providers`.
|
||||||
|
- Use case `SaveOpenCodeProviderProfile` (scelle la clé API dans le `SecretStore`, mint/réutilise un `SecretRef`) exposé via `save_opencode_provider_profile`. Pas de patch partiel : la clé littérale est obligatoire à chaque appel, y compris en édition.
|
||||||
|
- `DeleteProfile` purge le secret associé si le profil supprimé porte `opencode_provider`.
|
||||||
|
- Résolution de la clé au lancement dans les deux générateurs de `opencode.json` (`infrastructure/assistant/mod.rs`, `application/agent/lifecycle.rs`) ; échec dur si secret absent.
|
||||||
|
- QA vert : `cargo build --workspace` + `cargo test --workspace -- --test-threads=1` (tests de couverture SaveOpenCodeProviderProfile/DeleteProfile ajoutés suite à un premier retour QA).
|
||||||
|
|
||||||
|
**Frontend** (commit `c181b43`) :
|
||||||
|
- First-run wizard : segmented control Local/Cloud exclusif dans le formulaire de profil OpenCode, sous-formulaire cloud (provider → modèle en cascade, clé API masquée jamais pré-remplie), validation inline, bannière d'erreur de sauvegarde.
|
||||||
|
- En édition d'un profil cloud existant : champ clé toujours vide, bouton de sauvegarde désactivé tant que la clé n'est pas ressaisie (contrainte backend, pas de patch partiel).
|
||||||
|
- QA vert : `npm run build` + `vitest run` (952 tests, y compris un test ajouté pour le parcours d'édition suite à un retour QA).
|
||||||
|
|
||||||
|
**Dette hors périmètre signalée par Architect, non traitée ici** : duplication de deux fonctions `opencode_config_json`/`opencode_provider_config_json` entre `infrastructure/assistant/mod.rs` et `application/agent/lifecycle.rs` — à trancher (laquelle est la vraie) dans un ticket séparé si besoin.
|
||||||
16
.ideai/tickets/92/issue.md
Normal file
16
.ideai/tickets/92/issue.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
id: "9ba8d2f4-49fa-4536-a38e-891f1df3e3b7"
|
||||||
|
number: 92
|
||||||
|
title: "Configurer OpenCode avec un provider Opencode"
|
||||||
|
status: "open"
|
||||||
|
priority: "high"
|
||||||
|
sprint: null
|
||||||
|
links: []
|
||||||
|
agentRefs: []
|
||||||
|
createdBy: {"kind":"user"}
|
||||||
|
updatedBy: {"kind":"user"}
|
||||||
|
createdAt: 1784729443275
|
||||||
|
updatedAt: 1784788822167
|
||||||
|
version: 8
|
||||||
|
---
|
||||||
|
On peut actuellement utiliser un profile AI qui utilise OpenCode pour llamacpp. J'aimerais que l'on puisse configurer des profil AI OpenCode avec llamacpp comme actuellement, mais aussi en selectionnant un provider listé dans la commande /connect de OpenCode. Je pense que le mieux serait que lors de la création d'un profile AI OpenCode, il nous soit demandé si on souhaite utiliser LlamaCpp ou un provider OpenCode. Dans le cas d'un provider llamaCpp, on utilise la même chose qu'actuellement, dans l'autre cas on nous demande quel provider et il faudrait être capable de récupérer la liste fournie par OpenCode. Une fois le provider selectionné, il faudra que l'utilisateur puisse entrer une clé API car les providers opencodes en demadnent toujours un. Pour la partie utilisation ensuite d'opencode dans les agent, je pense que cette page peut aider: https://opencode.ai/docs/fr/cli/. On y trouve entre autre la commande pour se connecter avec opencode auth login. Le but est que la partie configuration se fasse dans les profil AI comme jusqu'à présent, et que l'utilisateur puisse directement attribuer un agent à son profile AI et le lancer sans configurer d'autre choses. OpenCode marche déjà correctement avec llamacpp, j'insiste sur le fait qu'on ne fait qu'ajouter la possibilité de configurer un provider autre que llamacpp
|
||||||
@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
"nextNumber": 92
|
"nextNumber": 93
|
||||||
}
|
}
|
||||||
@ -77,13 +77,13 @@
|
|||||||
"issueRef": "#7",
|
"issueRef": "#7",
|
||||||
"path": "7",
|
"path": "7",
|
||||||
"title": "Gestion des session limite",
|
"title": "Gestion des session limite",
|
||||||
"status": "qa",
|
"status": "closed",
|
||||||
"priority": "high",
|
"priority": "high",
|
||||||
"sprint": "d8f3f37b-87ca-4509-9116-45a99bc711df",
|
"sprint": "d8f3f37b-87ca-4509-9116-45a99bc711df",
|
||||||
"assignedAgentIds": [
|
"assignedAgentIds": [
|
||||||
"a6ced819-b893-4213-b003-9e9dc79b9641"
|
"a6ced819-b893-4213-b003-9e9dc79b9641"
|
||||||
],
|
],
|
||||||
"updatedAt": 1783329459094
|
"updatedAt": 1784718581033
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"issueRef": "#8",
|
"issueRef": "#8",
|
||||||
@ -465,11 +465,11 @@
|
|||||||
"issueRef": "#43",
|
"issueRef": "#43",
|
||||||
"path": "43",
|
"path": "43",
|
||||||
"title": "Systeme de plugins",
|
"title": "Systeme de plugins",
|
||||||
"status": "open",
|
"status": "closed",
|
||||||
"priority": "medium",
|
"priority": "medium",
|
||||||
"sprint": null,
|
"sprint": null,
|
||||||
"assignedAgentIds": [],
|
"assignedAgentIds": [],
|
||||||
"updatedAt": 1784667145901
|
"updatedAt": 1784707900405
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"issueRef": "#44",
|
"issueRef": "#44",
|
||||||
@ -667,11 +667,11 @@
|
|||||||
"issueRef": "#64",
|
"issueRef": "#64",
|
||||||
"path": "64",
|
"path": "64",
|
||||||
"title": "Web : créer/ajouter un projet depuis le navigateur (folder browser serveur)",
|
"title": "Web : créer/ajouter un projet depuis le navigateur (folder browser serveur)",
|
||||||
"status": "open",
|
"status": "closed",
|
||||||
"priority": "medium",
|
"priority": "medium",
|
||||||
"sprint": "028179b1-eaf4-41e9-9c1f-7c37125117e6",
|
"sprint": "028179b1-eaf4-41e9-9c1f-7c37125117e6",
|
||||||
"assignedAgentIds": [],
|
"assignedAgentIds": [],
|
||||||
"updatedAt": 1784193766706
|
"updatedAt": 1784718418070
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"issueRef": "#65",
|
"issueRef": "#65",
|
||||||
@ -950,6 +950,16 @@
|
|||||||
"a6ced819-b893-4213-b003-9e9dc79b9641"
|
"a6ced819-b893-4213-b003-9e9dc79b9641"
|
||||||
],
|
],
|
||||||
"updatedAt": 1784652150003
|
"updatedAt": 1784652150003
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"issueRef": "#92",
|
||||||
|
"path": "92",
|
||||||
|
"title": "Configurer OpenCode avec un provider Opencode",
|
||||||
|
"status": "open",
|
||||||
|
"priority": "high",
|
||||||
|
"sprint": null,
|
||||||
|
"assignedAgentIds": [],
|
||||||
|
"updatedAt": 1784788822167
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user