Pinia et l'architecture d'un front temps réel
Pinia : l'état qui appartient à l'application
Les composables donnent de l'état par appelant ; certaines données appartiennent à l'application entiÚre (l'utilisateur connecté, le panier, les préférences). C'est le rÎle du store Pinia :
export const useCartStore = defineStore('cart', () => {
const lines = ref<QuoteLine[]>([]) // state
const total = computed(() => lines.value.reduce(...)) // getter
async function addLine(variant: Variant, qty: number) { ... } // action
return { lines, total, addLine }
})
MĂȘme grammaire que les composables (ref/computed/fonctions) â mais singleton : tous les composants qui appellent useCartStore() voient LE mĂȘme Ă©tat. La rĂšgle de partage : Ă©tat local d'une feature â composable ; Ă©tat transverse de l'app â store. Le projet copilot suit exactement ça : Pinia pour l'app (session, prĂ©fĂ©rences, avec persistedstate), composables pour le copilot.
Le cas d'école : anatomie du front copilot
Le dĂ©fi : un chat streamĂ© en SSE, une UI gĂ©nĂ©rĂ©e par le LLM, des tools qui s'exĂ©cutent au navigateur, un state synchronisĂ© par patches â sans plat de spaghettis. La rĂ©ponse, en couches :
[protocole] sse-stream.ts, ag-ui-protocol.ts â parser le flux, typer les Ă©vĂ©nements
[état] useCopilotRun / Messages / CanvasPanel / Hitl / FrontendTools
chaque composable possÚde SA tranche d'état, le run les orchestre
[rendu] registry ag-ui : spec de bloc validĂ©e â composant NuxtUI montĂ©
[pages] assemblent â et ne savent presque rien
Les trois décisions qui font que ça tient :
- le protocole est isolĂ© : un seul fichier sait parser du SSE â tout le reste consomme des Ă©vĂ©nements typĂ©s (changer de transport ne toucherait qu'un fichier) ;
- l'Ă©tat est dĂ©coupĂ© par responsabilitĂ© (les ~25 composables) â pas un « mĂ©ga-store copilot » que tout le monde mute ;
- le rendu est dĂ©claratif : les Ă©vĂ©nements muettent l'Ă©tat, le template dĂ©rive de l'Ă©tat â personne ne touche le DOM Ă la main. Le flux est Ă sens unique :
Ă©vĂ©nement SSE â Ă©tat â rendu, la boucle rĂ©active de la leçon 1 Ă l'Ă©chelle d'une app.
Store Pinia vs composable : la rĂšgle de partage :