feat(inject): collage natif Hyprland compatible avec Telegram Desktop #85

Merged
silex merged 1 commit from feat/hyprland-paste into main 2026-10-11 02:02:29 +00:00
Owner

Objectif

Conserver Ctrl+Maj+V pour Telegram Desktop (Qt), Chromium et les terminaux, sans imposer un Ctrl+V global ni tenter plusieurs collages successifs.

Changements

  • Nouveau sink.paste_backend = "wtype" | "hyprland", défaut wtype inchangé ; variable MURMUR_SINK_PASTE_BACKEND et résolution TOML/env/overrides.
  • Backend Hyprland : lecture non active de hyprctl -j status, sélection du dispatcher Lua ou hyprlang, adresse active strictement validée puis recontrôlée avant un unique dispatch ciblé.
  • Un seul budget de cinq secondes pour les lectures et l’émission ; sorties bornées, groupes de processus interrompus/récoltés au timeout, réponse ok obligatoire, aucun repli ni seconde tentative après un résultat ambigu.
  • Aucun texte provider, titre ou classe de fenêtre interpolé dans le code Lua ; les réponses contenant des titres privés ne sont pas exposées dans les erreurs.
  • type, paste+none, les listes de raccourcis vides et --clipboard-only gardent leur contrat. Le backend ne confirme pas la consommation du collage : paste+transient reste refusé.
  • doctor vérifie conditionnellement hyprctl et la session, sans envoyer de touches ; pas de dépendance Hyprland dans les chemins passifs/frappe.
  • Correction de shift+insert : wtype -M shift -k Insert -m shift, au lieu de taper littéralement « Insert ».
  • Documentation, exemple de configuration et compte-rendu desktop actualisés.

Closes #70.

Vérifications

  • make lint test build module-check : réussi, toute la suite Go avec -race, tests Python, vérification/tidy des modules.
  • make installcheck : réussi.
  • go test -cover ./internal/inject : 96,4 % de couverture.
  • Cas simulés : dispatch Lua/hyprlang, trois raccourcis, fenêtre absente/invalide ou focus changé, annulation, timeout et récolte des helpers, erreurs/réponses invalides sans retry, chemins n’utilisant pas Hyprland.
  • Tests du chemin Go réel sink.New → Deliver sous Hyprland 0.56.2 (Lua), avec sentinelle sans retour à la ligne :
    • Telegram Desktop : vrai champ de message, texte recopié identique puis retiré ; aucun message envoyé.
    • Chromium : textarea local vérifié via DOM et barre d’adresse/recherche vérifiée par sélection/copie ; aucune navigation/soumission.
    • Kitty avec la configuration habituelle : récepteur raw isolé, texte exact et bracketed paste ; aucun shell issu du texte.
    • Presse-papiers original restauré octet pour octet ; fenêtres et profil temporaire nettoyés.

Activation locale et limites

La version de cette branche (27d91913df5d2e9806d0a0558314d3e913363ffa) a été installée localement sous le mandat de Mathieu ; ~/.config/murmur/config.toml contient maintenant paste_backend = "hyprland", sans changement du raccourci, des retours à la ligne ni de la politique clipboard. Binaire/config précédents sauvegardés ; murmur doctor --json est entièrement vert, avec le check de session Hyprland. Cette modification de configuration locale n’est pas incluse dans le dépôt Murmur.

Le backend demande hyprctl -j status (Hyprland 0.55+). La syntaxe hyprlang historique est testée par mocks, pas par une session graphique réelle. Un changement de focus après le dernier contrôle reste une course, mais le collage ne suit pas la nouvelle fenêtre : l’adresse ciblée reste fixe. Aucun nouveau cycle complet microphone/STT/cleanup n’est revendiqué par le test de livraison.

PR proposée pour revue, sans fusion dans main.

— Pi 🥧

## Objectif Conserver **Ctrl+Maj+V** pour Telegram Desktop (Qt), Chromium et les terminaux, sans imposer un Ctrl+V global ni tenter plusieurs collages successifs. ## Changements - Nouveau `sink.paste_backend = "wtype" | "hyprland"`, défaut **wtype** inchangé ; variable `MURMUR_SINK_PASTE_BACKEND` et résolution TOML/env/overrides. - Backend Hyprland : lecture non active de `hyprctl -j status`, sélection du dispatcher Lua ou hyprlang, adresse active strictement validée puis recontrôlée avant un unique dispatch ciblé. - Un seul budget de cinq secondes pour les lectures et l’émission ; sorties bornées, groupes de processus interrompus/récoltés au timeout, réponse `ok` obligatoire, aucun repli ni seconde tentative après un résultat ambigu. - Aucun texte provider, titre ou classe de fenêtre interpolé dans le code Lua ; les réponses contenant des titres privés ne sont pas exposées dans les erreurs. - `type`, `paste+none`, les listes de raccourcis vides et `--clipboard-only` gardent leur contrat. Le backend ne confirme pas la consommation du collage : `paste+transient` reste refusé. - `doctor` vérifie conditionnellement `hyprctl` et la session, sans envoyer de touches ; pas de dépendance Hyprland dans les chemins passifs/frappe. - Correction de `shift+insert` : `wtype -M shift -k Insert -m shift`, au lieu de taper littéralement « Insert ». - Documentation, exemple de configuration et compte-rendu desktop actualisés. Closes #70. ## Vérifications - `make lint test build module-check` : **réussi**, toute la suite Go avec `-race`, tests Python, vérification/tidy des modules. - `make installcheck` : **réussi**. - `go test -cover ./internal/inject` : **96,4 %** de couverture. - Cas simulés : dispatch Lua/hyprlang, trois raccourcis, fenêtre absente/invalide ou focus changé, annulation, timeout et récolte des helpers, erreurs/réponses invalides sans retry, chemins n’utilisant pas Hyprland. - Tests **du chemin Go réel `sink.New` → `Deliver`** sous Hyprland 0.56.2 (Lua), avec sentinelle sans retour à la ligne : - Telegram Desktop : vrai champ de message, texte recopié identique puis retiré ; aucun message envoyé. - Chromium : textarea local vérifié via DOM et barre d’adresse/recherche vérifiée par sélection/copie ; aucune navigation/soumission. - Kitty avec la configuration habituelle : récepteur raw isolé, texte exact et bracketed paste ; aucun shell issu du texte. - Presse-papiers original restauré octet pour octet ; fenêtres et profil temporaire nettoyés. ## Activation locale et limites La version de cette branche (`27d91913df5d2e9806d0a0558314d3e913363ffa`) a été installée localement sous le mandat de Mathieu ; `~/.config/murmur/config.toml` contient maintenant `paste_backend = "hyprland"`, sans changement du raccourci, des retours à la ligne ni de la politique clipboard. Binaire/config précédents sauvegardés ; `murmur doctor --json` est entièrement vert, avec le check de session Hyprland. Cette modification de configuration locale n’est pas incluse dans le dépôt Murmur. Le backend demande `hyprctl -j status` (Hyprland 0.55+). La syntaxe hyprlang historique est testée par mocks, pas par une session graphique réelle. Un changement de focus après le dernier contrôle reste une course, mais le collage ne suit pas la nouvelle fenêtre : l’adresse ciblée reste fixe. Aucun nouveau cycle complet microphone/STT/cleanup n’est revendiqué par le test de livraison. PR proposée pour revue, **sans fusion dans main**. — Pi 🥧
feat(inject): add native Hyprland paste backend
Some checks failed
CI / amd64 / Go 1.23.12 (pull_request) Has been cancelled
CI / amd64 / Go 1.26.5 (pull_request) Has been cancelled
CI / arm64 cross-build / Go 1.23.12 (pull_request) Has been cancelled
CI / arm64 cross-build / Go 1.26.5 (pull_request) Has been cancelled
CI / amd64 / Go 1.23.12 (push) Has been cancelled
CI / amd64 / Go 1.26.5 (push) Has been cancelled
CI / arm64 cross-build / Go 1.23.12 (push) Has been cancelled
CI / arm64 cross-build / Go 1.26.5 (push) Has been cancelled
27d91913df
Keep wtype as the default and for direct typing. Select the native Lua or hyprlang dispatcher using a read-only session probe, pin the active window, and retain one bounded delivery attempt without fallback. Add conditional doctor checks, regression tests, documentation, and desktop validation evidence.

Also emit a named Insert key for shift+insert (#70).

Agent: Pi 🥧
silex merged commit 13e88f5848 into main 2026-10-11 02:02:29 +00:00
Sign in to join this conversation.
No reviewers
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
2027a/murmur!85
No description provided.