merge feature/multi-profiles-codex-clarification-toast-notices dans develop
Résout le conflit d'imports/helpers de tests dans crates/application/tests/model_server.rs par union des deux côtés (imports application/domain + helpers aid/nid/sess). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -70,3 +70,6 @@
|
||||
- [ticket101-cross-talk-multi-project-rootcause](ticket101-cross-talk-multi-project-rootcause.md) — memory note ticket101-cross-talk-multi-project-rootcause
|
||||
- [ticket103-network-permission-ux-surface](ticket103-network-permission-ux-surface.md) — Stable UX convention for agent network permissions in IdeA.
|
||||
- [codex-network-access-config-fix](codex-network-access-config-fix.md) — memory note codex-network-access-config-fix
|
||||
- [multi-profile-codex-claude-model-catalogue-scoping](multi-profile-codex-claude-model-catalogue-scoping.md) — memory note multi-profile-codex-claude-model-catalogue-scoping
|
||||
- [model-catalogue-compat-cadrage](model-catalogue-compat-cadrage.md) — Frontières hexagonales, ports, DTO, fallback et matrice de compatibilité versionnée pour l'évolution du catalogue de modèles des profils structurés Codex/Claude.
|
||||
- [tickets-70-100-102-ux-surface-scoping](tickets-70-100-102-ux-surface-scoping.md) — memory note tickets-70-100-102-ux-surface-scoping
|
||||
|
||||
25
.ideai/memory/model-catalogue-compat-cadrage.md
Normal file
25
.ideai/memory/model-catalogue-compat-cadrage.md
Normal file
@ -0,0 +1,25 @@
|
||||
---
|
||||
name: model-catalogue-compat-cadrage
|
||||
description: Frontières hexagonales, ports, DTO, fallback et matrice de compatibilité versionnée pour l'évolution du catalogue de modèles des profils structurés Codex/Claude.
|
||||
metadata:
|
||||
type: reference
|
||||
---
|
||||
Évolution de `ListClaudeModels`/`ListCodexModels` (catalogue statique `application/src/agent/model_catalogue.rs`) vers un catalogue enrichi par compatibilité CLI.
|
||||
|
||||
**Décisions tranchées :**
|
||||
- JAMAIS scraper les TUI `/model`, JAMAIS exécuter les CLIs pour énumérer les modèles. Seule exécution CLI autorisée : `<cli> --version` (pattern existant `infrastructure/runtime::detection_spec` + port `ProcessSpawner`). Saisie libre toujours ouverte.
|
||||
- 3 sources non bloquantes à dégradation indépendante : API provider `/v1/models` (best-effort, uniquement si clé env/SecretStore présente, sinon skip), catalogue statique seed, matrice de compat.
|
||||
|
||||
**Hexagonal :**
|
||||
- Domaine (pur) : VO `CliVersion` (Ord), enum `ModelCompatibility {Compatible|Unknown|LikelyTooRecent}` (miroir des 3 états produit), VO `CompatibilityMatrix` (forme seule), fonction pure `evaluate_compatibility(matrix, adapter, model_id, Option<CliVersion>)` — version None ⇒ Unknown, modèle absent ⇒ Unknown, min<=ver ⇒ Compatible, min>ver ⇒ LikelyTooRecent.
|
||||
- Nouveaux ports : `CliVersionReader`, `ProviderModelCatalogue` (Ok(vec![]) si pas de clé), `CompatibilityMatrixSource` (infaillible).
|
||||
- Application : use case unique `ResolveModelCatalogue{adapter}` async, jamais de hard-error sur échec source (warnings + fallback). `ListClaude/CodexModels` deviennent des façades.
|
||||
- Infra : `ProcessCliVersionReader`, `HttpProviderModelCatalogue` (reqwest), `EmbeddedCompatibilityMatrix`.
|
||||
|
||||
**Matrice de compat = DONNÉE, pas code** : JSON versionné maintenu dans IdeA, bundlé via `include_str!` (seed infaillible) + override optionnel `app_data_dir/IdeA/model-compat.json`. Ajouter un modèle = éditer le JSON, zéro code (Open/Closed).
|
||||
|
||||
**DTO (rupture front)** : `ProfileModelCatalogDto` passe de `transparent Vec` à `{ models:[{...,compatibility,source}], cliVersion:string|null, warnings:string[] }`. Répercuter ports TS + 2 adapters + mock + ProfilesSettings.
|
||||
|
||||
**Découpage** : B1 domaine pur, B2 use case ports mockés, B3 infra ; F1 contrat, F2 ProfilesSettings 3 badges. UX passe avant F2 (libellés des 3 états, warnings, cliVersion null).
|
||||
|
||||
**Point ouvert produit** : récup clé provider — proposé best-effort sur clé env/SecretStore existante, pas de prompt dédié.
|
||||
@ -0,0 +1,50 @@
|
||||
---
|
||||
name: multi-profile-codex-claude-model-catalogue-scoping
|
||||
description: memory note multi-profile-codex-claude-model-catalogue-scoping
|
||||
metadata:
|
||||
type: project
|
||||
---
|
||||
# Cadrage : profils multiples Codex/Claude + catalogue de modèles
|
||||
|
||||
Demande utilisateur : plusieurs profils Codex et Claude, chacun avec son modèle, assignables aux
|
||||
agents ; lister les modèles plutôt que saisie manuelle quand possible.
|
||||
|
||||
## État vérifié de l'existant (2026-07-26)
|
||||
|
||||
Le backend est déjà générique multi-profils, contrairement à ce qu'on pourrait croire à la lecture
|
||||
seule des mémoires F35/F36 (qui documentaient le cas OpenCode) :
|
||||
|
||||
- `AgentProfile` (crates/domain/src/profile.rs) porte déjà `model: Option<String>` (ticket #99,
|
||||
explicitement prévu pour Codex/Claude), et `profiles.json` (FsProfileStore) est une **liste**
|
||||
indexée par `id`, pas un slot singleton par provider.
|
||||
- Commandes déjà câblées : `list_profiles`, `save_profile` (upsert générique par id),
|
||||
`delete_profile`, `reference_profiles`, `detect_profiles`.
|
||||
- Ce qui existe **seulement pour OpenCode** : `clone_opencode_profile_from_seed` (alloue un id
|
||||
frais via IdGenerator) et `save_opencode_provider_profile`, plus un vrai catalogue de modèles
|
||||
(`crates/application/src/agent/provider_catalogue.rs`, lit le cache models.dev d'OpenCode avec
|
||||
repli statique).
|
||||
- `catalogue.rs` : un seul profil de référence Claude et un seul Codex, aucun `.with_model(...)`.
|
||||
- Frontend `ProfilesSettings.tsx` : simple list+delete, pas de create/duplicate/edit inline ;
|
||||
toute édition rouvre `FirstRunWizard`.
|
||||
|
||||
## Gaps identifiés (pas de migration de schéma nécessaire)
|
||||
|
||||
1. Backend : généraliser le pattern `CloneOpenCodeProfileFromSeed` (fresh_profile_id via
|
||||
IdGenerator) en un use case `CloneProfileFromSeed` non spécifique à OpenCode, pour dupliquer un
|
||||
profil Claude/Codex avec un nom + `model` en override. Ne PAS laisser le frontend miner l'id
|
||||
(romprait la discipline IdGenerator déjà en place).
|
||||
2. Backend : catalogue de modèles Claude/Codex — aucune API fiable côté CLI, donc liste statique
|
||||
curée (même esprit que `static_fallback_catalogue()` d'OpenCode), exposée par commande Tauri
|
||||
infaillible (`list_claude_models`/`list_codex_models` ou générique par `structuredAdapter`).
|
||||
Le frontend garde toujours un champ de saisie manuelle en repli (liste jamais garantie
|
||||
exhaustive).
|
||||
3. Frontend : refonte `ProfilesSettings.tsx` en onglets Codex/Claude/OpenCode avec
|
||||
create/duplicate/edit/delete par onglet + `ModelSelect` searchable partagé ; simplifier
|
||||
`FirstRunWizard` pour ne créer qu'un profil par défaut par provider détecté, avec renvoi vers
|
||||
Settings pour en ajouter d'autres.
|
||||
|
||||
## Découpage de livraison
|
||||
DevBackend (use case + catalogues + commandes, petit lot, zéro migration) → DevFrontend (refonte
|
||||
Settings + first-run simplifié) → QA (créer 2 profils Claude modèles différents + 2 Codex, assigner
|
||||
à des agents distincts, vérifier le bon modèle atteint la CLI au lancement, non-régression
|
||||
OpenCode) → Git (branche feature unique, lot petit et couplé).
|
||||
51
.ideai/memory/tickets-70-100-102-ux-surface-scoping.md
Normal file
51
.ideai/memory/tickets-70-100-102-ux-surface-scoping.md
Normal file
@ -0,0 +1,51 @@
|
||||
---
|
||||
name: tickets-70-100-102-ux-surface-scoping
|
||||
description: memory note tickets-70-100-102-ux-surface-scoping
|
||||
metadata:
|
||||
type: project
|
||||
---
|
||||
---
|
||||
title: Cadrage UX tickets #70 #100 #102 — modèles locaux et bugs terminal
|
||||
type: design
|
||||
description: Surface utilisateur attendue pour supprimer les modèles llama.cpp téléchargés, et règle UX pour les bugs de scroll/fit OpenCode qui doivent être corrigés sans nouvelle UI.
|
||||
---
|
||||
|
||||
# Cadrage UX tickets #70 #100 #102
|
||||
|
||||
## #70 — Gestion des modèles locaux téléchargés
|
||||
|
||||
Ajouter une affordance humaine de suppression des artefacts de modèles téléchargés par les serveurs locaux llama.cpp, dans la surface existante `Local model servers` / configuration OpenCode locale.
|
||||
|
||||
Principes visibles :
|
||||
- La suppression d'un serveur déclaré et la suppression du fichier modèle téléchargé sont deux actions distinctes.
|
||||
- Une action destructive sur le fichier modèle doit être explicite, confirmée, et impossible pendant un usage actif/téléchargement du même artefact.
|
||||
- Le libellé doit parler de `modèle téléchargé`, pas de cache interne ou chemin technique en premier niveau.
|
||||
- Les modèles issus d'un `localPath` utilisateur ne doivent jamais être proposés à la suppression comme s'ils appartenaient à IdeA.
|
||||
|
||||
États attendus par serveur :
|
||||
- Aucun modèle téléchargé connu : aucun bouton de suppression de modèle, ou bouton désactivé avec tooltip `Aucun modèle téléchargé par IdeA`.
|
||||
- Modèle téléchargé disponible : bouton secondaire/destructif `Supprimer le modèle téléchargé`.
|
||||
- Téléchargement/préparation en cours : action désactivée, texte `Téléchargement en cours`.
|
||||
- Serveur/agent utilisant ce modèle : action désactivée, texte `Modèle utilisé par un agent en cours`.
|
||||
- Suppression en cours : ligne locale occupée, action désactivée, message `Suppression du modèle...`.
|
||||
- Succès : toast/status non bloquant `Modèle téléchargé supprimé` ; la configuration serveur reste présente.
|
||||
- Échec : alerte inline `Impossible de supprimer le modèle téléchargé : <raison courte>`.
|
||||
|
||||
Confirmation :
|
||||
- Titre : `Supprimer le modèle téléchargé ?`
|
||||
- Corps : `Le serveur local restera configuré, mais IdeA devra retélécharger ce modèle au prochain lancement.`
|
||||
- Si la taille est connue : ajouter `Espace libéré : <taille>.`
|
||||
- Action principale destructive : `Supprimer le modèle`
|
||||
- Action secondaire : `Annuler`
|
||||
|
||||
## #100 — Scroll OpenCode
|
||||
|
||||
Pas de décision UX spécifique. Le comportement attendu est celui d'une cellule terminal native : l'utilisateur peut remonter dans le scrollback OpenCode jusqu'à la limite de rétention disponible, avec molette, trackpad, scrollbar et clavier, sans blocage prématuré propre à OpenCode.
|
||||
|
||||
Ne pas ajouter de bouton, message ou mode spécial OpenCode. QA doit valider le comportement visible dans une cellule OpenCode longue.
|
||||
|
||||
## #102 — Fit TUI après switch/layout/ajout cellule
|
||||
|
||||
Pas de nouvelle surface UX spécifique. Le terminal doit s'afficher correctement automatiquement après switch de projet, switch de layout, ajout/suppression/split/resize de cellules et rattachement d'une session existante.
|
||||
|
||||
Ne pas afficher de message demandant à l'utilisateur de redimensionner. Éviter tout flash durable vide/noir ; un voile technique transitoire n'est acceptable que s'il reste très bref et non bloquant.
|
||||
@ -2,15 +2,15 @@
|
||||
id: "4709958c-5082-44fd-a1fd-d6bad85f9361"
|
||||
number: 100
|
||||
title: "[Bug] Problème sur le scroll des agents OpenCode"
|
||||
status: "open"
|
||||
status: "closed"
|
||||
priority: "high"
|
||||
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||
links: []
|
||||
agentRefs: []
|
||||
createdBy: {"kind":"user"}
|
||||
updatedBy: {"kind":"user"}
|
||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||
createdAt: 1784992615586
|
||||
updatedAt: 1784993984569
|
||||
version: 3
|
||||
updatedAt: 1785083912470
|
||||
version: 4
|
||||
---
|
||||
Quand un agent est un agent opencode, je ne peux aps scroll très haut dans sa cellule.
|
||||
Quand un agent est un agent opencode, je ne peux aps scroll très haut dans sa cellule.
|
||||
|
||||
@ -2,15 +2,15 @@
|
||||
id: "e91fd358-da94-4382-aa70-6a3fe5a63840"
|
||||
number: 102
|
||||
title: "[Bug] Devoir resize les cellule pour afficher la TUI d'un agent"
|
||||
status: "open"
|
||||
status: "closed"
|
||||
priority: "medium"
|
||||
sprint: "e28a4d53-8bd2-446a-b0ac-2a017373b8b2"
|
||||
links: []
|
||||
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||
createdBy: {"kind":"user"}
|
||||
updatedBy: {"kind":"user"}
|
||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||
createdAt: 1784993319700
|
||||
updatedAt: 1784993980505
|
||||
version: 4
|
||||
updatedAt: 1785083912470
|
||||
version: 5
|
||||
---
|
||||
J'ai toujours un soucis qui fait que quand je switch de projet IdeA ou de layout ou que j'ajoute des cellules ou autres, je suis obligé de resize un coup la cellule pour que son constenu s'affiche correctement
|
||||
J'ai toujours un soucis qui fait que quand je switch de projet IdeA ou de layout ou que j'ajoute des cellules ou autres, je suis obligé de resize un coup la cellule pour que son constenu s'affiche correctement
|
||||
|
||||
@ -2,15 +2,15 @@
|
||||
id: "e73ed25f-8e22-48a5-84ea-521212ea80b5"
|
||||
number: 70
|
||||
title: "Pouvoir gérer les models AI locaux téléchargés via les serveur llamacpp"
|
||||
status: "open"
|
||||
status: "closed"
|
||||
priority: "low"
|
||||
sprint: null
|
||||
links: []
|
||||
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
|
||||
createdBy: {"kind":"user"}
|
||||
updatedBy: {"kind":"user"}
|
||||
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
|
||||
createdAt: 1784194016529
|
||||
updatedAt: 1784194049447
|
||||
version: 4
|
||||
updatedAt: 1785083912470
|
||||
version: 5
|
||||
---
|
||||
Avec les serveurs de models locaux llamacpp, on télécharge des modeles, j'aimerais aussi pouvoir les supprimer
|
||||
Avec les serveurs de models locaux llamacpp, on télécharge des modeles, j'aimerais aussi pouvoir les supprimer
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
{
|
||||
"nextNumber": 104
|
||||
"nextNumber": 107
|
||||
}
|
||||
@ -731,13 +731,13 @@
|
||||
"issueRef": "#70",
|
||||
"path": "70",
|
||||
"title": "Pouvoir gérer les models AI locaux téléchargés via les serveur llamacpp",
|
||||
"status": "open",
|
||||
"status": "closed",
|
||||
"priority": "low",
|
||||
"sprint": null,
|
||||
"assignedAgentIds": [
|
||||
"a6ced819-b893-4213-b003-9e9dc79b9641"
|
||||
],
|
||||
"updatedAt": 1784194049447
|
||||
"updatedAt": 1785083912470
|
||||
},
|
||||
{
|
||||
"issueRef": "#71",
|
||||
@ -1035,11 +1035,11 @@
|
||||
"issueRef": "#100",
|
||||
"path": "100",
|
||||
"title": "[Bug] Problème sur le scroll des agents OpenCode",
|
||||
"status": "open",
|
||||
"status": "closed",
|
||||
"priority": "high",
|
||||
"sprint": "e28a4d53-8bd2-446a-b0ac-2a017373b8b2",
|
||||
"assignedAgentIds": [],
|
||||
"updatedAt": 1784993984569
|
||||
"updatedAt": 1785083912470
|
||||
},
|
||||
{
|
||||
"issueRef": "#101",
|
||||
@ -1057,13 +1057,13 @@
|
||||
"issueRef": "#102",
|
||||
"path": "102",
|
||||
"title": "[Bug] Devoir resize les cellule pour afficher la TUI d'un agent",
|
||||
"status": "open",
|
||||
"status": "closed",
|
||||
"priority": "medium",
|
||||
"sprint": "e28a4d53-8bd2-446a-b0ac-2a017373b8b2",
|
||||
"assignedAgentIds": [
|
||||
"a6ced819-b893-4213-b003-9e9dc79b9641"
|
||||
],
|
||||
"updatedAt": 1784993980505
|
||||
"updatedAt": 1785083912470
|
||||
},
|
||||
{
|
||||
"issueRef": "#103",
|
||||
@ -1078,4 +1078,4 @@
|
||||
"updatedAt": 1785013507979
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user