[M2] StreamingMessageTracker : mise à jour in-place via m.replace #195

Closed
opened 2026-04-06 08:53:06 +00:00 by charles · 0 comments
Owner

Contexte

Les agents IA simulent le streaming en envoyant leur réponse via des edits successifs (m.relates_to.rel_type: "m.replace"). Fractal+ doit détecter ce pattern et mettre à jour le message en place avec un curseur animé.

Critères d'acceptation

  • Struct StreamingMessageTracker avec active_streams: DashMap<OwnedEventId, StreamState>
  • StreamState contient : agent_user_id, first_seen, last_update, edit_count, is_complete
  • Méthode on_edit() retourne StreamAction::UpdateInPlace { body, show_cursor } si edit < 30s après le message original, sinon StreamAction::NormalEdit
  • Après > 5s sans nouvel edit : marquer comme complet (is_complete = true), masquer le curseur
  • Le curseur animé est un | clignotant en CSS
  • Ne s'applique qu'aux messages d'agents connus (dépend de #192)

Notes techniques

  • Crate : crates/fractal-ai/ (logique) + crates/fractal-gtk/ (rendu curseur)
  • Voir specs §4.3 (ST-M2-03)
## Contexte Les agents IA simulent le streaming en envoyant leur réponse via des edits successifs (`m.relates_to.rel_type: "m.replace"`). Fractal+ doit détecter ce pattern et mettre à jour le message en place avec un curseur animé. ## Critères d'acceptation - [ ] Struct `StreamingMessageTracker` avec `active_streams: DashMap<OwnedEventId, StreamState>` - [ ] `StreamState` contient : `agent_user_id`, `first_seen`, `last_update`, `edit_count`, `is_complete` - [ ] Méthode `on_edit()` retourne `StreamAction::UpdateInPlace { body, show_cursor }` si edit < 30s après le message original, sinon `StreamAction::NormalEdit` - [ ] Après > 5s sans nouvel edit : marquer comme complet (`is_complete = true`), masquer le curseur - [ ] Le curseur animé est un `|` clignotant en CSS - [ ] Ne s'applique qu'aux messages d'agents connus (dépend de #192) ## Notes techniques - Crate : `crates/fractal-ai/` (logique) + `crates/fractal-gtk/` (rendu curseur) - Voir specs §4.3 (ST-M2-03)
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/my-fractal#195
No description provided.