feat(ai): ConversationExporter + ZenMode + GNOME search/notifications (#65, #68, #69) #170

Closed
charles wants to merge 5 commits from feat/65-68-69-export-zen-gnome into main
Owner

Résumé

Implémentation des trois issues dans la crate fractal-ai :

#65 — Export de conversation (src/export.rs)

  • ExportFormat enum : Markdown, Html, Pdf
  • ExportOptions { format, since, until, include_media } avec filtrage temporel
  • ExportMessage { sender, body, timestamp, event_id }
  • export_to_markdown() — format ## room\n\n---\n\n**sender** (date)\nbody\n\n
  • export_to_html() — document HTML autonome, police monospace, fond #f8f8f8, CSS inline
  • ConversationExporter::render() — dispatch selon format ; PDF retourne un message indiquant wkhtmltopdf

#68 — Mode Zen (src/zen.rs)

  • ZenModeConfig { remember_between_sessions: bool }Defaultfalse
  • ZenModeState enum : Inactive, Active { activated_at: i64 }
  • ZenModeController : activate(), deactivate(), toggle(), is_active()
  • to_config_value() -> toml::Value — persiste uniquement si remember_between_sessions = true
  • from_config_value(v, config) — restaure l'état depuis le TOML

#69 — Intégration bureau GNOME (src/gnome.rs)

  • GnomeNotificationAction enum : Reply, MarkRead, ForwardToAgent
  • notification_action_to_hint()(action_name, target_value) pour GNotification::add_button_with_target
  • SearchIndex SQLite via sqlx : upsert, search (LIKE case-insensitive), prune_older_than
  • Schéma : search_index(event_id PK, room_id, sender, snippet, ts) + index sur snippet

Modifications transverses

  • Cargo.toml : ajout de sqlx et toml (workspace)
  • lib.rs : pub mod export, pub mod zen, pub mod gnome + re-exports

Plan de test

  • cargo check -p fractal-ai sans erreur
  • cargo test -p fractal-ai : vérifier export_to_markdown et export_to_html
  • Instancier ZenModeController::default() et tester toggle() / round-trip TOML
  • Vérifier notification_action_to_hint pour chaque variante
  • SearchIndex::open() + upsert + search + prune_older_than sur une DB temporaire

Closes #65, #68, #69

## Résumé Implémentation des trois issues dans la crate `fractal-ai` : ### #65 — Export de conversation (`src/export.rs`) - `ExportFormat` enum : `Markdown`, `Html`, `Pdf` - `ExportOptions { format, since, until, include_media }` avec filtrage temporel - `ExportMessage { sender, body, timestamp, event_id }` - `export_to_markdown()` — format `## room\n\n---\n\n**sender** (date)\nbody\n\n` - `export_to_html()` — document HTML autonome, police monospace, fond `#f8f8f8`, CSS inline - `ConversationExporter::render()` — dispatch selon format ; PDF retourne un message indiquant `wkhtmltopdf` ### #68 — Mode Zen (`src/zen.rs`) - `ZenModeConfig { remember_between_sessions: bool }` — `Default` → `false` - `ZenModeState` enum : `Inactive`, `Active { activated_at: i64 }` - `ZenModeController` : `activate()`, `deactivate()`, `toggle()`, `is_active()` - `to_config_value() -> toml::Value` — persiste uniquement si `remember_between_sessions = true` - `from_config_value(v, config)` — restaure l'état depuis le TOML ### #69 — Intégration bureau GNOME (`src/gnome.rs`) - `GnomeNotificationAction` enum : `Reply`, `MarkRead`, `ForwardToAgent` - `notification_action_to_hint()` → `(action_name, target_value)` pour `GNotification::add_button_with_target` - `SearchIndex` SQLite via `sqlx` : `upsert`, `search` (LIKE case-insensitive), `prune_older_than` - Schéma : `search_index(event_id PK, room_id, sender, snippet, ts)` + index sur `snippet` ### Modifications transverses - `Cargo.toml` : ajout de `sqlx` et `toml` (workspace) - `lib.rs` : `pub mod export`, `pub mod zen`, `pub mod gnome` + re-exports ## Plan de test - [ ] `cargo check -p fractal-ai` sans erreur - [ ] `cargo test -p fractal-ai` : vérifier `export_to_markdown` et `export_to_html` - [ ] Instancier `ZenModeController::default()` et tester `toggle()` / round-trip TOML - [ ] Vérifier `notification_action_to_hint` pour chaque variante - [ ] `SearchIndex::open()` + `upsert` + `search` + `prune_older_than` sur une DB temporaire Closes #65, #68, #69
charles closed this pull request 2026-04-06 02:36:11 +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.