feat: SttExtension pour l'EventBus (#9) #115

Closed
charles wants to merge 2 commits from feat/9-stt-extension into main
Owner

Résumé

  • Ajoute event_id: String à EventContext dans fractal-ext — clé stable pour le cache SQLite et référence dans les jobs STT
  • Réécrit SttExtension dans fractal-stt/src/extension.rs pour implémenter le trait Extension de fractal-ext
  • Met à jour fractal-stt/src/lib.rs pour exporter SttExtension et TranscriptionJob

Détail de l'implémentation

SttExtension :

  • id()"fractal-stt", name()"Speech-to-Text"
  • on_init() : appelle engine.health_check(), log info si Ready, warn sur ModelMissing ou Unavailable
  • on_sync_event() : filtre les m.room.message de msgtype m.audio/m.voice ; en mode auto, dispatche un TranscriptionJob via mpsc::Sender::try_send (fire-and-forget, ne bloque jamais le handler)
  • message_decorations() : en mode manuel, retourne un MessageDecoration::InlineWidget (fractal-stt:transcript-button) pour permettre à l'UI d'afficher un bouton "Transcrire"

TranscriptionJob : contient event_id, AudioData (placeholder MXC), TranscribeOptions.

Plan de test

  • cargo test -p fractal-stt — 5 tests unitaires dans extension::tests :
    • is_audio_event_detects_m_audio
    • is_audio_event_detects_m_voice
    • is_audio_event_ignores_m_text
    • is_audio_event_ignores_non_message_events
    • extract_mxc_url_works
  • cargo test -p fractal-ext — vérifier que les usages existants de EventContext compilent avec le nouveau champ event_id
  • Intégration : instancier SttExtension::new(engine, false, tx), appeler on_init() et vérifier le log warning si le moteur est indisponible
  • Mode auto : envoyer un EventContext avec event_type = "m.room.message" et msgtype = "m.audio", vérifier que le TranscriptionJob est reçu côté rx
  • Mode manuel : appeler message_decorations() et vérifier le retour InlineWidget { widget_id: "fractal-stt:transcript-button", … }

Closes #9

## Résumé - Ajoute `event_id: String` à `EventContext` dans `fractal-ext` — clé stable pour le cache SQLite et référence dans les jobs STT - Réécrit `SttExtension` dans `fractal-stt/src/extension.rs` pour implémenter le trait `Extension` de `fractal-ext` - Met à jour `fractal-stt/src/lib.rs` pour exporter `SttExtension` et `TranscriptionJob` ### Détail de l'implémentation **`SttExtension`** : - `id()` → `"fractal-stt"`, `name()` → `"Speech-to-Text"` - `on_init()` : appelle `engine.health_check()`, log `info` si `Ready`, `warn` sur `ModelMissing` ou `Unavailable` - `on_sync_event()` : filtre les `m.room.message` de msgtype `m.audio`/`m.voice` ; en mode auto, dispatche un `TranscriptionJob` via `mpsc::Sender::try_send` (fire-and-forget, ne bloque jamais le handler) - `message_decorations()` : en mode manuel, retourne un `MessageDecoration::InlineWidget` (`fractal-stt:transcript-button`) pour permettre à l'UI d'afficher un bouton "Transcrire" **`TranscriptionJob`** : contient `event_id`, `AudioData` (placeholder MXC), `TranscribeOptions`. ## Plan de test - [ ] `cargo test -p fractal-stt` — 5 tests unitaires dans `extension::tests` : - `is_audio_event_detects_m_audio` - `is_audio_event_detects_m_voice` - `is_audio_event_ignores_m_text` - `is_audio_event_ignores_non_message_events` - `extract_mxc_url_works` - [ ] `cargo test -p fractal-ext` — vérifier que les usages existants de `EventContext` compilent avec le nouveau champ `event_id` - [ ] Intégration : instancier `SttExtension::new(engine, false, tx)`, appeler `on_init()` et vérifier le log warning si le moteur est indisponible - [ ] Mode auto : envoyer un `EventContext` avec `event_type = "m.room.message"` et `msgtype = "m.audio"`, vérifier que le `TranscriptionJob` est reçu côté `rx` - [ ] Mode manuel : appeler `message_decorations()` et vérifier le retour `InlineWidget { widget_id: "fractal-stt:transcript-button", … }` Closes #9
- TranscriptionJob (event_id + AudioData + TranscribeOptions) remplace TranscribeRequest
- Auto mode: try_send fire-and-forget sans bloquer on_sync_event
- Manuel mode: InlineWidget "fractal-stt:transcript-button" via message_decorations()
- on_init(): health_check avec warn sur ModelMissing / Unavailable
- Tests unitaires : is_audio_event, extract_mxc_url

Closes #9 (partial)
feat(fractal-stt): mettre à jour lib.rs pour exporter SttExtension et TranscriptionJob
Some checks failed
CI / cargo check (pull_request) Has been cancelled
CI / cargo test (pull_request) Has been cancelled
CI / clippy + rustfmt (pull_request) Has been cancelled
e4d031e9f9
- Exporte SttExtension et TranscriptionJob depuis le module extension
- Conserve les exports existants (pipeline, openai, vosk, whisper, types)
- Aligné avec la spec issue #9

Closes #9
charles closed this pull request 2026-04-06 02:07:58 +00:00
Some checks are pending
CI / cargo check (pull_request) Has been cancelled
CI / cargo test (pull_request) Has been cancelled
CI / clippy + rustfmt (pull_request) Has been cancelled
qa
Required

Pull request closed

Sign in to join this conversation.
No description provided.