fix(calls): say when ML noise suppression fails or falls back; drop the spoofable listener (#260) #413

Merged
jared merged 1 commits from fix/denoise-state-notice into lotus 2026-10-18 10:53:40 -04:00
Owner

Refs #260. This covers the denoise half. The issue's audio-output half (io.lotus.audio_output_state) is in the #310 work, waiting on the fork's lotus.24 package.

Problem

  • The fork reports what noise suppression actually runs as io.lotus.denoise_state { active, model, error? }. The host never listened ("Unknown or unsupported from-widget action"), so when ML didn't attach, the call silently published the raw mic while Settings still said ML was on.
  • The only listener left, LotusDenoiseFeature, waited for a {type: 'lotus-denoise-status'} postMessage that nothing sends any more. It also accepted that message from any frame, with no source or origin check, and showed its text as a system toast.

Change

  • New useDenoiseNotices(embed), mounted next to useScreenshareNotices. When the user has ML selected:
    • active: false → "ML noise suppression couldn't start, so your microphone is sending unfiltered audio. You can pick another model in Settings → Calls."
    • A different model → "DeepFilterNet 3 couldn't start, so noise suppression is using RNNoise instead."
  • LotusDenoiseFeature is deleted.

Verified with a real failure: on lotus the dev server 404s the worklets (#293), with ML / RNNoise selected and joining the Voice Lounge.

  • Before: no toast, plus 1 "host did not ack io.lotus.denoise_state".
  • After: the toast above, and 0 no-ack logs.

Unit tests for the texts. tsc clean · unit tests pass · ESLint clean.

🤖 Generated with Claude Code

https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5

Refs #260. This covers the denoise half. The issue's audio-output half (`io.lotus.audio_output_state`) is in the #310 work, waiting on the fork's lotus.24 package. **Problem** - The fork reports what noise suppression actually runs as `io.lotus.denoise_state { active, model, error? }`. The host never listened ("Unknown or unsupported from-widget action"), so when ML didn't attach, the call silently published the **raw mic** while Settings still said ML was on. - The only listener left, `LotusDenoiseFeature`, waited for a `{type: 'lotus-denoise-status'}` postMessage that nothing sends any more. It also accepted that message from **any frame**, with no source or origin check, and showed its text as a system toast. **Change** - New `useDenoiseNotices(embed)`, mounted next to `useScreenshareNotices`. When the user has ML selected: - `active: false` → "ML noise suppression couldn't start, so your microphone is sending unfiltered audio. You can pick another model in Settings → Calls." - A different `model` → "DeepFilterNet 3 couldn't start, so noise suppression is using RNNoise instead." - `LotusDenoiseFeature` is deleted. **Verified** with a real failure: on `lotus` the dev server 404s the worklets (#293), with ML / RNNoise selected and joining the Voice Lounge. - **Before:** no toast, plus 1 "host did not ack io.lotus.denoise_state". - **After:** the toast above, and 0 no-ack logs. Unit tests for the texts. `tsc` clean · unit tests pass · ESLint clean. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
jared added 1 commit 2026-10-18 00:48:53 -04:00
fix(calls): say when ML noise suppression fails or falls back; drop the spoofable listener (#260)
CI / Build & Quality Checks (pull_request) Successful in 2m46s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 7s
CI / Playwright smoke (e2e) (pull_request) Successful in 18m56s
acc17f422b
The fork reports what actually runs as io.lotus.denoise_state, but the
host never listened ("unsupported action"), so a failed ML denoiser
silently published the raw mic. Handle it: toast when ML did not start
or fell back to another model. Remove LotusDenoiseFeature, which waited
for a postMessage nothing sends any more and accepted it from any frame.

Refs #260

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
jared merged commit 9c3fdfff39 into lotus 2026-10-18 10:53:40 -04:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#413