chore(ideai): versionne le store tickets/sprints/mémoire du sprint Modeles locaux

Store d'orchestration du sprint « Modeles locaux » : sprint 883534aa,
tickets #35/#36 (et #32/#37–#41 du store), compteurs et index, notes
mémoire de livraison (#35 CRUD/statut, #36 multi-profils, OpenCode↔llama.cpp).

Runtime transitoire volontairement exclu (background-tasks/, agent scratch
testllamacpp.md).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 15:50:46 +02:00
parent 72476a650a
commit a244f32f31
25 changed files with 347 additions and 8 deletions

View File

@ -73,3 +73,7 @@
- [ticket14-local-lan-openai-adapter-scoping](ticket14-local-lan-openai-adapter-scoping.md) — memory note ticket14-local-lan-openai-adapter-scoping
- [ticket28-firstrun-detect-hang-scoping](ticket28-firstrun-detect-hang-scoping.md) — Cadrage hexagonal du bug bloquant first-run (#28) — panic block_on imbriqué dans detect + découplage busy/détection, contrats et point de vérité QA.
- [ticket28-f1-frontend-delivered](ticket28-f1-frontend-delivered.md) — Lot F1 du ticket #28 livré sur feature/ticket28-firstrun-detect-hang — invariant busy/detectProfiles, flag detecting, timeout UI, test de non-régression.
- [opencode-llamacpp-replaces-ollama](opencode-llamacpp-replaces-ollama.md) — memory note opencode-llamacpp-replaces-ollama
- [f36-multi-opencode-profiles-frontend](f36-multi-opencode-profiles-frontend.md) — Multiplicité des profils OpenCode locaux côté UI first-run wizard — livrée, verte, sans gap backend.
- [f35-launch-status-done-config-crud-blocked](f35-launch-status-done-config-crud-blocked.md) — F35.1 UI statut de lancement du serveur local livrée+verte ; F35.2 config CRUD bloquée sur un DTO figé qui ne matche pas le wire réel + delete manquant.
- [f35-config-crud-delivered](f35-config-crud-delivered.md) — F35.2 (config serveur local + sélection dans les profils OpenCode) livrée et verte sur feature/modeles-locaux ; clôt le sprint modèles locaux F34-F36.

View File

@ -0,0 +1,13 @@
---
name: f35-config-crud-delivered
description: F35.2 (config serveur local + sélection dans les profils OpenCode) livrée et verte sur feature/modeles-locaux ; clôt le sprint modèles locaux F34-F36.
metadata:
type: project
---
Ticket #35 F35.2 LIVRÉ (vert) sur `feature/modeles-locaux`. Débloqué par le contrat PLAT d'Architect.
**Contrat backend** : `list_model_servers` / `save_model_server({request:{config}})` / `delete_model_server({serverId})`. DTO plat camelCase `LocalModelServerConfig { id, kind:"llamaCpp", name, baseURL, port, modelPath?, servedModelName, binaryPath?, args, autoStart, stopPolicy }`. PIÈGE intégré : `save_model_server` exige un UUID valide dans `config.id` même à la création (backend ne génère PAS l'id serveur, seulement le model.id interne caché) → le front minte l'UUID client-side (`newModelServerId`). Erreur suppression référencée = `code:"model_server_in_use"`.
**Livré** : `ModelServerGateway` (port + adapter Tauri `adapters/modelServer.ts` + `MockModelServerGateway` avec `markInUse`). Feature `features/model-servers/` : `useModelServers` (CRUD, traduit in-use en message FR actionnable), `ModelServersPanel` (déclarer/éditer/supprimer), `ModelServerSelect` (dropdown binding avec « None » = serveur externe + préserve un id orphelin « unknown/removed »). Dans `FirstRunWizard`, le champ texte `localModelServerId` (F36) est remplacé par `ModelServerSelect`.
Cohérent avec F35.1 (badge corrèle via localModelServerId). tsc 0 ; suite 608/608. Sprint modèles locaux (F34 backend, F35, F36) désormais complet côté frontend.

View File

@ -0,0 +1,16 @@
---
name: f35-launch-status-done-config-crud-blocked
description: F35.1 UI statut de lancement du serveur local livrée+verte ; F35.2 config CRUD bloquée sur un DTO figé qui ne matche pas le wire réel + delete manquant.
metadata:
type: project
---
Ticket #35 sur `feature/modeles-locaux`.
**F35.1 LIVRÉ (vert)** : événements `model_server_status_changed`/`agent_launch_failed` déjà exposés via `domain://event`. Consommés dans `useAgents``modelServerStatusByServer` (par serverId) + `launchFailureByAgent` (par agentId). Badge `ModelServerLaunchBadge` monté par ligne dans `AgentsPanel`, corrélé via `profile.opencode.localModelServerId`. Contrat réel ≠ DTO figé du ticket : `serverId` sur l'enveloppe (pas par état) ; états camelCase `notConfigured|probing|starting|ready{reused}|failed{code,message}` ; PAS de `baseURL`/`model` émis dans le statut. Je me suis aligné sur le wire réel.
**F35.2 BLOQUÉ — 3 gaps backend remontés à Main :**
1. (bloquant) `save_model_server`/`list_model_servers` transmettent le domaine `LocalModelServerConfig` en `serde(transparent)`, forme IMBRIQUÉE : `{id, kind:"llamaCpp", name, endpoint:{baseURL,port}, model:{id,label,path?,servedName}, binary?, args, autoStart, stopPolicy}`. Le DTO figé du ticket est plat et FAUX (kind "llamacpp", baseURL/port/modelPath/servedModelName/binaryPath à plat). Pire : `model` exige `id`+`label` non-vides (LocalModelRef::new) absents du DTO figé → payload figé rejeté. Besoin arbitrage Architect : (A) couche DTO plate app-tauri qui remplit model.id/label, ou (B) MAJ du DTO figé vers la forme imbriquée + sémantique de model.id/label.
2. Pas de commande `delete_model_server`.
3. (côté moi) créer `ModelServerGateway`/port/adapter une fois le contrat tranché.
Saisie simple de `localModelServerId` (F36) laissée en place, pas de régression. tsc propre ; suite 593/593.

View File

@ -0,0 +1,17 @@
---
name: f36-multi-opencode-profiles-frontend
description: Multiplicité des profils OpenCode locaux côté UI first-run wizard — livrée, verte, sans gap backend.
metadata:
type: project
---
Ticket #36 (F36.1) livré côté frontend sur `feature/modeles-locaux`.
**Constat clé** : aucun gap backend. Le backend supporte déjà N profils OpenCode (identité = ProfileId) via `clone_opencode_profile_from_seed`, `list_profiles`, `save_profile`, `delete_profile`, `configure_profiles`. `OpenCodeConfig` DTO expose `localModelServerId` (camelCase).
**Ce qui manquait, purement front** : la commande clone n'était câblée dans aucun gateway, et le miroir TS `OpenCodeConfig` n'avait pas `localModelServerId`.
**Livré** : `ProfileGateway.cloneOpenCodeProfileFromSeed` (port + adapter Tauri + mock) ; le first-run wizard (`FirstRunWizard.tsx` + `useFirstRun.ts`) gère désormais une LISTE de profils OpenCode — bouton "Add OpenCode profile" + "Duplicate" par ligne, name éditable, cases reasoning/attachment, champ localModelServerId (saisie simple).
**Reste** : lot F35 = UI riche de config serveur local (remplacera la saisie simple de `localModelServerId`). Le wizard reste la surface de gestion de profils (`Settings ▸ Configure profiles` = `forceOpen`) ; il lit `firstRunState().referenceProfiles`, pas `list_profiles` — à vérifier au lot F35 pour l'édition de profils OpenCode déjà persistés.
tsc propre ; 62 tests first-run/mock verts ; suite complète 581/581.

View File

@ -0,0 +1,35 @@
---
name: opencode-llamacpp-replaces-ollama
description: memory note opencode-llamacpp-replaces-ollama
metadata:
type: project
---
---
title: OpenCode local provider — llama.cpp remplace Ollama (chantier livré)
type: decision
description: Le provider local d'OpenCode passe d'Ollama à llama.cpp (llama-server OpenAI-compatible). Profil éditable baseURL/apiKey/model. Livré sur develop (merge 2e98f1f). Clôt le diagnostic tool-calling Ollama.
---
# OpenCode local : llama.cpp remplace Ollama (2026-07-11)
## Pourquoi
Le tool-calling des modèles locaux via **Ollama** ne s'est jamais déclenché nativement en live : OpenCode fuyait les appels d'outils en texte `<function=...>` (émulation par prompt), jamais parsés. Diagnostic utilisateur : la faute est dans la relation **OpenCode↔Ollama**. Décision : abandonner Ollama comme provider OpenCode et passer à **llama.cpp** (`llama-server`, endpoint OpenAI-compatible). Voir historique : [[opencode-config-model-agnostic-tool-diagnostic]], [[opencode-ollama-native-tool-call-flag]], [[opencode-ollama-tool-calling-surface-overload]] (contexte Ollama, désormais superseded).
## Contrat livré
`OpenCodeConfig` (domaine + DTO app-tauri + type frontend) :
`{ baseURL: String (requis, http/https), apiKey: Option<String>, model: String (requis), reasoning: Option<bool>=true, attachment: Option<bool>=false }`. Sérialisation wire camelCase (`baseURL` via serde rename), `apiKey`/`reasoning`/`attachment` `skip_serializing_if=None`.
Seed profil canonique : `opencode-ollama`**`opencode-llamacpp`** ("OpenCode + llama.cpp"), command `opencode`, adapter `OpenCode`, defaults `baseURL=http://localhost:8080/v1`, `apiKey=sk-no-key`, `model=qwen3-coder-30b`.
`opencode_config_json` (crates/application/src/agent/lifecycle.rs) régénère un opencode.json MINIMAL : provider `llamacpp` (`npm=@ai-sdk/openai-compatible`, `options.baseURL/apiKey` du profil, def modèle `llamacpp/<model>` avec `tool_call:true,reasoning,attachment`), MCP `idea` inchangé, `permission bash/edit=ask`, `disabled_providers=["anthropic","openai","gemini","ollama"]`. `apiKey` omis (pas `null`) si absent. Plus aucun résidu `ollama`/préfixe `ollama/`/allow-list diagnostic.
Frontend : wizard profil OpenCode = 3 champs éditables **Base URL / Model / API key(optionnel)** (`FirstRunWizard.tsx`, `profile.ts`, mocks). L'embedder Ollama (`ollamaDetected`, mémoire vectorielle) est un AUTRE usage, NON touché.
## État
- Fichiers : domain/profile.rs, application/{catalogue.rs,lifecycle.rs,tests/agent_lifecycle.rs}, infrastructure/session/opencode.rs ; frontend domain/index.ts, adapters/mock/*, features/first-run/*.
- QA VERT : domain 244, application 81+64, infra 263/10 (les 10 = bind-port sandbox, identiques sur develop = non-régression), frontend 574, tsc propre. Claude/Codex non régressés.
- Git : commit `4e70631`, merge `--no-ff` `2e98f1f` sur `develop`. Base branche = `eaba05d` (profil OpenCode process-backed). WIP diagnostic Ollama capsulé dans `3cdedf2` sur `feature/opencode-glm47-flash-tool-diagnostic`. PAS de push distant.
- Tickets : #32 fermé ; #42/#43 (Ollama) retirés du store.
## Reste ouvert
E2E live llama.cpp jamais exécuté (aucun `llama-server` joignable sur :8080 au moment QA ; `llama-server` 9859 + `opencode` 1.17.18 installés). À valider côté utilisateur : lancer llama-server, relancer l'Appointe rebuild, créer un agent profil llama.cpp, vérifier un vrai `tool_use` MCP (pas de `<function=` texte). Rebuild AppImage requis pour le live (binaire qui tourne = AppImage). Build via `NO_STRIP=true` cf [[appimage-build-no-strip-relr-dyn-fix]].

View File

@ -0,0 +1,11 @@
---
id: "883534aa-7fc1-4d83-a9c0-17cac4a4eea5"
order: 4
name: "Modeles locaux"
status: "planned"
createdBy: {"kind":"user"}
updatedBy: {"kind":"user"}
createdAt: 1783757092388
updatedAt: 1783757205620
version: 2
---

View File

@ -27,6 +27,15 @@
"status": "planned",
"updatedAt": 1783330421738,
"version": 3
},
{
"id": "883534aa-7fc1-4d83-a9c0-17cac4a4eea5",
"path": "883534aa-7fc1-4d83-a9c0-17cac4a4eea5",
"order": 4,
"name": "Modeles locaux",
"status": "planned",
"updatedAt": 1783757205620,
"version": 2
}
]
}

View File

@ -1,6 +1,6 @@
---
issueRef: "#32"
version: 5
version: 6
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
updatedAt: 1783491681672
updatedAt: 1783723378815
---

View File

@ -2,7 +2,7 @@
id: "9291e7ad-a300-4f15-83b1-93f56f6e1b79"
number: 32
title: "[Bug] Erreur CLI Ollama profile"
status: "inProgress"
status: "closed"
priority: "medium"
sprint: null
links: [{"target":"#14","kind":"relatesTo"}]
@ -10,8 +10,8 @@ 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
updatedAt: 1783723378815
version: 6
---
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

View File

@ -0,0 +1,6 @@
---
issueRef: "#35"
version: 5
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
updatedAt: 1783757457771
---

View File

@ -0,0 +1,16 @@
---
id: "77ef65a5-bbb8-44d2-a610-27bf15c54a0a"
number: 35
title: "Avoir llamacpp intégré"
status: "inProgress"
priority: "high"
sprint: "883534aa-7fc1-4d83-a9c0-17cac4a4eea5"
links: []
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
createdBy: {"kind":"user"}
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
createdAt: 1783756863540
updatedAt: 1783757457771
version: 5
---
Nous avons llamacpp qui marche super avec OpencCode à présent. J'aimerais maintenant que llamacpp soit lancé automatiquement via IdeA avec le bon modele à la bonne url et bon port si celui-ci n'est pas encore lancé

View File

@ -0,0 +1,6 @@
---
issueRef: "#36"
version: 5
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
updatedAt: 1783757458773
---

View File

@ -0,0 +1,16 @@
---
id: "3bb071b9-08eb-4e1b-b4b4-dccee8114a7e"
number: 36
title: "[UI] Pouvoir déclarer plusieurs profils AI de modeles locaux"
status: "inProgress"
priority: "medium"
sprint: "883534aa-7fc1-4d83-a9c0-17cac4a4eea5"
links: []
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
createdBy: {"kind":"user"}
updatedBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"}
createdAt: 1783757232381
updatedAt: 1783757458773
version: 5
---
Actuellement chaque type de profils ne peux déclarer qu'un seul profile AI. J'aimerais que le profile OpenCode puisse permetre d'en décalrer plusieurs différents.

View File

@ -0,0 +1,6 @@
---
issueRef: "#37"
version: 5
updatedBy: {"kind":"user"}
updatedAt: 1783757520082
---

View File

@ -0,0 +1,16 @@
---
id: "a2b6212a-8725-4ace-b8a4-c3a41e2c2988"
number: 37
title: "[UI] garder les tickets dans les sprints, mais ajouter l'affichage du status et la possibiliter de filtrer les tickets"
status: "open"
priority: "low"
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
links: []
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
createdBy: {"kind":"user"}
updatedBy: {"kind":"user"}
createdAt: 1783757421147
updatedAt: 1783757520082
version: 5
---
Actuelleemnt dans les sprints les tickets sont retirés une fois fait. J'aimerais que les tickets restent dans le sprints mais qu'on ajoute l'affichage du status de chaque ticket. J'aimerais aussi qu'on ai la possibilité de trier les tickets via leur status, leur priorité etc comme sur la liste des tickets

View File

@ -0,0 +1,6 @@
---
issueRef: "#38"
version: 5
updatedBy: {"kind":"user"}
updatedAt: 1783757636999
---

View File

@ -0,0 +1,16 @@
---
id: "7e89bfc9-dc56-4656-a154-690f02e69756"
number: 38
title: "[UI] Pouvoir ajouter un ticket à un sprint pendant sa création"
status: "open"
priority: "low"
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
links: []
agentRefs: []
createdBy: {"kind":"user"}
updatedBy: {"kind":"user"}
createdAt: 1783757548614
updatedAt: 1783757636999
version: 5
---
J'aimerais que dans la création de ticket on puisse lui attribuer un sprint via une popup comme celle du choix de tickets

View File

@ -0,0 +1,6 @@
---
issueRef: "#39"
version: 3
updatedBy: {"kind":"user"}
updatedAt: 1783757851100
---

View File

@ -0,0 +1,16 @@
---
id: "02ff2d0c-4312-47c3-b84c-834029723fc4"
number: 39
title: "[UI] Fermer toutes les fernetres lors de la fermeture de la fenetre principale principale"
status: "open"
priority: "low"
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
links: []
agentRefs: []
createdBy: {"kind":"user"}
updatedBy: {"kind":"user"}
createdAt: 1783757707896
updatedAt: 1783757851100
version: 3
---
Quand on ferme la fenetre principale d'IdeA, j'aimerais que toutes les fenêtres IdeA se ferment aussi.

View File

@ -0,0 +1,6 @@
---
issueRef: "#40"
version: 5
updatedBy: {"kind":"user"}
updatedAt: 1783757857115
---

View File

@ -0,0 +1,16 @@
---
id: "6b04c8d1-177c-422a-9955-7fee2e8afdeb"
number: 40
title: "[UI] réouvrir les fenetres au lancement d'IdeA"
status: "open"
priority: "low"
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
links: [{"target":"#39","kind":"dependsOn"}]
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
createdBy: {"kind":"user"}
updatedBy: {"kind":"user"}
createdAt: 1783757766786
updatedAt: 1783757857115
version: 5
---
Au lancement d'IdeA, j'aimerais que les fenêtres fermées lors de la précédentes fermeture de la fenêtre principale d'IdeA soient automatiqument réouvertes dans le même status, position, écran que quand elles ont été fermée

View File

@ -0,0 +1,6 @@
---
issueRef: "#41"
version: 4
updatedBy: {"kind":"user"}
updatedAt: 1783757942954
---

View File

@ -0,0 +1,16 @@
---
id: "7d026901-333a-46a6-87f6-7384bf742310"
number: 41
title: "[UI] Selection multiple lors de la selection de tickets pour les sprints"
status: "open"
priority: "low"
sprint: "5afd6780-0f76-40d7-a10f-32ee52469d74"
links: []
agentRefs: [{"agentId":"a6ced819-b893-4213-b003-9e9dc79b9641","role":"assigned"}]
createdBy: {"kind":"user"}
updatedBy: {"kind":"user"}
createdAt: 1783757895085
updatedAt: 1783757942954
version: 4
---
Lorsque je selectionne les tickets pour mes sprints, j'iamerais que la selection me permette d'en choisir plusieurs à la fois pour ne pas avoir à réouvrir chaque fois la fenetre.

View File

@ -1,3 +1,3 @@
{
"nextNumber": 35
"nextNumber": 42
}

View File

@ -343,13 +343,13 @@
"issueRef": "#32",
"path": "32",
"title": "[Bug] Erreur CLI Ollama profile",
"status": "inProgress",
"status": "closed",
"priority": "medium",
"sprint": null,
"assignedAgentIds": [
"a6ced819-b893-4213-b003-9e9dc79b9641"
],
"updatedAt": 1783491681672
"updatedAt": 1783723378815
},
{
"issueRef": "#33",
@ -370,6 +370,86 @@
"sprint": null,
"assignedAgentIds": [],
"updatedAt": 1783492562056
},
{
"issueRef": "#35",
"path": "35",
"title": "Avoir llamacpp intégré",
"status": "inProgress",
"priority": "high",
"sprint": "883534aa-7fc1-4d83-a9c0-17cac4a4eea5",
"assignedAgentIds": [
"a6ced819-b893-4213-b003-9e9dc79b9641"
],
"updatedAt": 1783757457771
},
{
"issueRef": "#36",
"path": "36",
"title": "[UI] Pouvoir déclarer plusieurs profils AI de modeles locaux",
"status": "inProgress",
"priority": "medium",
"sprint": "883534aa-7fc1-4d83-a9c0-17cac4a4eea5",
"assignedAgentIds": [
"a6ced819-b893-4213-b003-9e9dc79b9641"
],
"updatedAt": 1783757458773
},
{
"issueRef": "#37",
"path": "37",
"title": "[UI] garder les tickets dans les sprints, mais ajouter l'affichage du status et la possibiliter de filtrer les tickets",
"status": "open",
"priority": "low",
"sprint": "5afd6780-0f76-40d7-a10f-32ee52469d74",
"assignedAgentIds": [
"a6ced819-b893-4213-b003-9e9dc79b9641"
],
"updatedAt": 1783757520082
},
{
"issueRef": "#38",
"path": "38",
"title": "[UI] Pouvoir ajouter un ticket à un sprint pendant sa création",
"status": "open",
"priority": "low",
"sprint": "5afd6780-0f76-40d7-a10f-32ee52469d74",
"assignedAgentIds": [],
"updatedAt": 1783757636999
},
{
"issueRef": "#39",
"path": "39",
"title": "[UI] Fermer toutes les fernetres lors de la fermeture de la fenetre principale principale",
"status": "open",
"priority": "low",
"sprint": "5afd6780-0f76-40d7-a10f-32ee52469d74",
"assignedAgentIds": [],
"updatedAt": 1783757851100
},
{
"issueRef": "#40",
"path": "40",
"title": "[UI] réouvrir les fenetres au lancement d'IdeA",
"status": "open",
"priority": "low",
"sprint": "5afd6780-0f76-40d7-a10f-32ee52469d74",
"assignedAgentIds": [
"a6ced819-b893-4213-b003-9e9dc79b9641"
],
"updatedAt": 1783757857115
},
{
"issueRef": "#41",
"path": "41",
"title": "[UI] Selection multiple lors de la selection de tickets pour les sprints",
"status": "open",
"priority": "low",
"sprint": "5afd6780-0f76-40d7-a10f-32ee52469d74",
"assignedAgentIds": [
"a6ced819-b893-4213-b003-9e9dc79b9641"
],
"updatedAt": 1783757942954
}
]
}