conduit/lib/features/hermes/controllers
cogwheel 43182d7282
Some checks are pending
L10n / l10n (push) Waiting to run
fix: resolve reported rendering, voice, terminal, and connection bugs (#643)
* fix: resolve reported rendering, voice, terminal, and connection bugs

LaTeX (#642, #533): render complex MathJax SVGs through the compatible
renderer so underbrace/boxed/pmatrix no longer glitch or leak `amp`, and
center block equations horizontally.

Fonts (#501): rebuild the bundled Geist faces, which mapped lowercase
Greek omega to the uppercase glyph.

Hermes (#637): connection tests now exercise authenticated capability and
toolset discovery instead of the unauthenticated health endpoint, so a
server that only answers /health no longer reports "connected".

Voice (#632): request microphone permission before starting the Android
foreground service, which crashed when permission had never been granted.

Voice (#630): stop local STT while TTS plays so the model no longer hears
itself. Barge-in is off by default and opt-in from Audio settings, and the
voice overlay gains a speakerphone toggle.

Transport (#629): drop the plaintext-HTTP restriction for Hermes and
direct connections. Tailscale/Headscale CGNAT addresses and other private
networks were rejected outright. Custom headers and the self-signed
certificate toggle are now shared by all backends via a single Hermes
transport configurator.

Terminal (#626): download now opens the native save dialog instead of the
share sheet.

Terminal (#608): route the `terminal:display_file` event into the Terminal
files panel rather than dropping it in the chat event handler.

Auth (#606): drive reverse-proxy login through the real WebView identity
and cookie store so Authelia and similar providers finish sign-in.

Also fixes pre-existing test failures on main: three assertions still
expected the single-newline block join replaced in #641, and six expected
the "Delete connection" button label renamed to "Delete" in #628.

* fix: route Android speakerphone and address review feedback

Speakerphone on Android: setSpeakerphoneOn is deprecated and no-ops on
Android 12+ once a communication device is selected, which the voice
session does for Bluetooth SCO. The toggle rendered but never changed the
route. Select the built-in speaker as the communication device instead,
keeping the legacy call as the pre-31 fallback, and tear down the active
SCO route before re-routing so a headset cannot keep owning playback.

Voice: treat TtsError as a terminal assistant-speech event. With barge-in
disabled the recognizer is stopped for playback and only TtsCompleted
restarted it, so a failed TTS request left voice mode active with no way
to accept the next utterance.

Hermes: cancel active runs when certificate trust changes. A trust-only
edit rebuilt the transport while old cancellation tokens stayed live.

Terminal: sanitize the download file name, which comes from the server's
Content-Disposition header, before passing it to the save dialog.

Hermes settings: use the existing headerName/headerValue/addHeader/
removeHeader localizations instead of hardcoded English.

Adds coverage for the speakerphone toggle, TTS-error recovery, and
HttpClient forwarding through the desktop RPC channel factory.

* fix: fall back for dot-only download file names

`.` and `..` survive character sanitization but name a directory rather
than a file, so writing them throws instead of producing a download. Use
the timestamp fallback for those, and cover the sanitizer directly.

Windows reserved device names are not handled: this app ships only iOS and
Android targets.
2026-08-18 15:25:53 +05:30
..
hermes_busy_turn_controller.dart feat: add Hermes Desktop Gateway backend (#636) 2026-08-16 19:51:36 +05:30
hermes_connection_controller.dart fix: resolve reported rendering, voice, terminal, and connection bugs (#643) 2026-08-18 15:25:53 +05:30