/* Copyright 2026 Lotus Guild SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE in the repository root for full details. */ /** * Custom widget actions exchanged between the Lotus host (cinny) and this fork. * Kept dependency-free so both `widget.ts` and `lotus/*` can import it without * a circular dependency. */ export enum LotusWidgetActions { /** * fromWidget: in-call per-participant speaking / mute state. * NOTE: matrix-widget-api `transport.send` is request/response — the host * MUST register a handler that replies/acks each one (cinny's `listenAction` * does, replying `{}`). If the host has no handler, ClientWidgetApi * immediately error-replies "unsupported from-widget action", so the data is * silently dropped and each throttled send rejects (caught) — functional miss * + log churn, not a hang. */ CallState = "io.lotus.call_state", /** toWidget: pin/spotlight (or clear, with userId=null) a participant. */ FocusParticipant = "io.lotus.focus_participant", /** toWidget: play an audio clip into the call as a separate published track. */ InjectAudio = "io.lotus.inject_audio", /** toWidget: set audio/screenshare encoding quality (bitrate/framerate). */ SetQuality = "io.lotus.set_quality", /** toWidget: per-user avatar-decoration image URLs for in-call tiles. */ Decorations = "io.lotus.decorations", /** toWidget: deafen remote audio (and optionally mute screenshare audio). */ SetDeafen = "io.lotus.set_deafen", /** * fromWidget: sent on (re)registration of a lotus toWidget handler (e.g. * decorations) so the host can re-push state that would otherwise only be * sent on change (decorations roster, the current focus pin) after an * EC-side reconnect/remount. cinny's `resendForkState()` should respond to * this the same way it responds to a fresh join. */ RequestState = "io.lotus.request_state", /** * fromWidget: real state of the in-source denoise engine — * `{ active: boolean, model: string, error?: string }` — sent once the * processor attaches (or after the rnnoise fallback also fails), so the host * toggle can reflect reality rather than the requested state. */ DenoiseState = "io.lotus.denoise_state", } /** toWidget Lotus actions that must be allow-listed in `initializeWidget`. */ export const LOTUS_TO_WIDGET_ACTIONS: LotusWidgetActions[] = [ LotusWidgetActions.FocusParticipant, LotusWidgetActions.InjectAudio, LotusWidgetActions.SetQuality, LotusWidgetActions.Decorations, LotusWidgetActions.SetDeafen, ];