Reference
Auto-generated from Python docstrings for the orateur package.
orateur
Orateur - minimal local speech-to-text and speech-to-speech.
audio_capture
Audio capture for speech recognition.
AudioCapture(device_id: Optional[int] = None, config=None)
Handles audio recording for STT.
Source code in src/orateur/audio_capture.py
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | |
start_recording(level_callback=None) -> bool
Start recording. level_callback(chunk_rms: float) is called per chunk if provided.
Source code in src/orateur/audio_capture.py
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | |
audio_utils
Audio utility functions for waveform visualization.
audio_to_levels(audio: np.ndarray, num_bars: int = 60) -> list[float]
Split audio into segments and return RMS per segment normalized to 0-1.
Args: audio: 1D float32 audio array num_bars: Number of bars/levels to return
Returns: List of floats in [0, 1] representing normalized RMS per segment
Source code in src/orateur/audio_utils.py
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | |
cli
Orateur CLI.
cmd_run(args)
Run main loop.
Source code in src/orateur/cli.py
36 37 38 | |
cmd_setup(args)
Install GPU-accelerated pywhispercpp (CUDA, Metal, or PyPI CPU).
Source code in src/orateur/cli.py
320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 | |
cmd_speak(args)
TTS from arg, clipboard, or selection.
Source code in src/orateur/cli.py
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | |
cmd_sts(args)
Speech-to-Speech: record -> STT -> LLM -> TTS.
Source code in src/orateur/cli.py
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | |
cmd_transcribe(args)
Record and transcribe only.
Source code in src/orateur/cli.py
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | |
cmd_ui(args)
Run UI daemon for Quickshell (FIFO commands, JSON events on stdout).
Source code in src/orateur/cli.py
285 286 287 288 289 290 | |
cmd_ui_send(args)
Send a JSON command to the UI daemon (reads from stdin or first arg).
Source code in src/orateur/cli.py
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 | |
config
Configuration manager for Orateur.
ConfigManager()
Manages application configuration and settings.
Source code in src/orateur/config.py
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | |
get_setting(key: str, default: Any = None) -> Any
Get a configuration setting.
Source code in src/orateur/config.py
99 100 101 | |
get_temp_directory() -> Path
Get the temporary directory for audio files.
Source code in src/orateur/config.py
107 108 109 110 111 112 | |
save_config() -> bool
Save current configuration to file.
Source code in src/orateur/config.py
89 90 91 92 93 94 95 96 97 | |
set_setting(key: str, value: Any) -> None
Set a configuration setting.
Source code in src/orateur/config.py
103 104 105 | |
desktop_notify
Best-effort desktop notifications (Linux: notify-send; macOS: AppleScript).
notify(summary: str, body: str = '', *, urgency: str = 'normal') -> None
Send a desktop notification when supported on this OS. Never raises.
Source code in src/orateur/desktop_notify.py
78 79 80 81 82 83 84 85 86 87 88 | |
install_quickshell
Install Quickshell Orateur component when Quickshell is detected.
install_quickshell() -> bool
Install Orateur Quickshell component to ~/.config/quickshell/orateur/.
Detects Quickshell; if present, copies or symlinks quickshell/orateur/ from the repo to the config directory. Prefers symlink when ORATEUR_ROOT is set (development/editable install).
Source code in src/orateur/install_quickshell.py
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | |
install_stt
Setup-time installation of pywhispercpp with GPU support.
Installs either: - Build from source (absadiki/pywhispercpp) with CUDA on Linux x86_64 when CUDA is detected - Build from source with Metal on macOS Apple Silicon (arm64) - PyPI (CPU) otherwise
When run via the launcher (installed users): installs into ~/.local/share/orateur/venv. When run via uv run (development): installs into project .venv.
download_whisper_model(model_name: Optional[str] = None) -> bool
Download ggml weights into pywhispercpp's MODELS_DIR (same layout as Model()).
Runs in a subprocess with the same Python as pip/pywhispercpp so (1) the package is visible immediately after pip install without restarting the parent process, and (2) we use the venv where STT packages were installed (active venv or fixed venv).
Source code in src/orateur/install_stt.py
524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 | |
install_pywhispercpp(backend: Optional[str] = None, force: bool = False) -> bool
Detect GPU backend and install pywhispercpp.
backend: 'nvidia' = CUDA from source (Linux x86_64 + CUDA); 'metal' = Metal from source (macOS arm64); 'cpu' = PyPI CPU wheel; None = auto (CUDA on Linux+CUDA, Metal on Apple Silicon, else PyPI). force: If True, reinstall even when already installed.
Source code in src/orateur/install_stt.py
364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 | |
llm
LLM backends for Speech-to-Speech.
LLMBackend(config: object)
Bases: ABC
Abstract base class for LLM backends (used in STS pipeline).
Subclasses store config as needed.
Source code in src/orateur/llm/base.py
10 11 | |
generate(user_text: str, system_prompt: Optional[str] = None, model_override: Optional[str] = None) -> str
abstractmethod
Generate a response from the LLM.
Args: user_text: The user's input (transcribed speech) system_prompt: Optional system prompt model_override: Optional model name override
Returns: Generated text response
Source code in src/orateur/llm/base.py
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
get_available_models() -> list[str]
Return list of available model names (if applicable).
Source code in src/orateur/llm/base.py
42 43 44 | |
initialize(config) -> bool
abstractmethod
Initialize the backend. Returns True on success.
Source code in src/orateur/llm/base.py
13 14 15 16 | |
is_ready() -> bool
Check if backend is ready.
Source code in src/orateur/llm/base.py
38 39 40 | |
get_llm_backend(name: str, config) -> Optional[LLMBackend]
Get and initialize an LLM backend by name.
Source code in src/orateur/llm/registry.py
25 26 27 28 29 30 31 32 33 34 35 36 37 38 | |
is_llm_disabled(name: str) -> bool
True when config explicitly turns off the LLM (no Ollama connection).
Source code in src/orateur/llm/registry.py
18 19 20 21 22 | |
list_llm_backends() -> list[str]
List registered LLM backend names (includes explicit disable sentinel).
Source code in src/orateur/llm/registry.py
41 42 43 | |
base
Abstract LLM backend interface.
LLMBackend(config: object)
Bases: ABC
Abstract base class for LLM backends (used in STS pipeline).
Subclasses store config as needed.
Source code in src/orateur/llm/base.py
10 11 | |
generate(user_text: str, system_prompt: Optional[str] = None, model_override: Optional[str] = None) -> str
abstractmethod
Generate a response from the LLM.
Args: user_text: The user's input (transcribed speech) system_prompt: Optional system prompt model_override: Optional model name override
Returns: Generated text response
Source code in src/orateur/llm/base.py
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
get_available_models() -> list[str]
Return list of available model names (if applicable).
Source code in src/orateur/llm/base.py
42 43 44 | |
initialize(config) -> bool
abstractmethod
Initialize the backend. Returns True on success.
Source code in src/orateur/llm/base.py
13 14 15 16 | |
is_ready() -> bool
Check if backend is ready.
Source code in src/orateur/llm/base.py
38 39 40 | |
mcp_tools
MCP tools: fetch from servers, convert to OpenAI format, execute tool calls.
mcp_connections(config: Any)
async
Connect to MCP servers, yield (ollama_tools, tool_to_server, call_tool). Uses: async with stdio_client(params) as (read, write), ClientSession(read, write).
Source code in src/orateur/llm/mcp_tools.py
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | |
ollama
Ollama LLM backend.
OllamaBackend(config)
Bases: LLMBackend
Ollama local LLM with optional MCP tools.
Source code in src/orateur/llm/ollama.py
53 54 55 56 | |
registry
LLM backend registry.
get_llm_backend(name: str, config) -> Optional[LLMBackend]
Get and initialize an LLM backend by name.
Source code in src/orateur/llm/registry.py
25 26 27 28 29 30 31 32 33 34 35 36 37 38 | |
is_llm_disabled(name: str) -> bool
True when config explicitly turns off the LLM (no Ollama connection).
Source code in src/orateur/llm/registry.py
18 19 20 21 22 | |
list_llm_backends() -> list[str]
List registered LLM backend names (includes explicit disable sentinel).
Source code in src/orateur/llm/registry.py
41 42 43 | |
register_llm_backend(name: str, backend_cls: Type[LLMBackend]) -> None
Register a new LLM backend.
Source code in src/orateur/llm/registry.py
46 47 48 | |
log
Application-wide logging configuration.
All orateur.* log records go to stderr. When you run orateur run in a terminal,
you should see them in that terminal. Set ORATEUR_LOG_LEVEL=DEBUG for more detail.
ensure_logging_configured() -> None
Ensure the orateur logger has a stderr handler.
orateur.cli calls setup_logging() first; this is a fallback when run() is
entered without the CLI (tests, embedding). Safe to call after setup_logging (no-op).
Source code in src/orateur/log.py
46 47 48 49 50 51 52 53 54 | |
get_logger(name: str) -> logging.Logger
Get a logger for the given module name.
Source code in src/orateur/log.py
39 40 41 42 43 | |
setup_logging(level: str | int | None = None, format_string: str = '%(levelname)s - %(name)s - %(message)s') -> None
Configure logging for the application.
Logs to stderr. Level can be set via ORATEUR_LOG_LEVEL env var (DEBUG, INFO, WARNING, ERROR).
Source code in src/orateur/log.py
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
main
Main application loop for Orateur.
run(config: ConfigManager | None = None) -> None
Run the main loop (used by systemd).
Source code in src/orateur/main.py
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 | |
paths
Centralized path constants for Orateur with XDG Base Directory support.
quickshell_spawn
Optional Quickshell child process for orateur run.
start_quickshell() -> Optional[subprocess.Popen]
Spawn quickshell -c orateur detached from our stdin; returns None if not found.
Source code in src/orateur/quickshell_spawn.py
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | |
shortcuts
Global keyboard shortcuts: Linux uses evdev; macOS and Windows use pynput.
EvdevShortcutManager(config)
Listens for multiple shortcuts and invokes callbacks (Linux /dev/input).
Source code in src/orateur/shortcuts.py
149 150 151 152 153 154 155 156 157 158 | |
PynputShortcutManager(config)
Listens for global hotkeys via pynput (macOS / Windows).
Source code in src/orateur/shortcuts.py
275 276 277 278 279 280 281 | |
UnsupportedShortcutManager(config)
Placeholder when the platform has no backend.
Source code in src/orateur/shortcuts.py
359 360 | |
sts_pipeline
Speech-to-Speech pipeline: STT -> LLM -> TTS.
run_sts(config, audio_data, sample_rate: int = 16000, language_override: Optional[str] = None, stt=None, tts=None, llm=None, ui_mirror: Optional[Callable[..., None]] = None) -> bool
Run Speech-to-Speech: transcribe -> LLM -> TTS.
If stt, tts, or llm are provided and ready, they are reused. Otherwise new backends are created (for CLI compatibility).
Returns True if audio was played successfully.
Source code in src/orateur/sts_pipeline.py
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | |
stt
STT (Speech-to-Text) backends.
STTBackend(config: object)
Bases: ABC
Abstract base class for Speech-to-Text backends.
Subclasses store config as needed.
Source code in src/orateur/stt/base.py
12 13 | |
get_available_models() -> list[str]
Return list of available model names for this backend.
Source code in src/orateur/stt/base.py
46 47 48 | |
initialize(config) -> bool
abstractmethod
Initialize the backend. Returns True on success.
Source code in src/orateur/stt/base.py
15 16 17 18 | |
is_ready() -> bool
Check if backend is ready for transcription.
Source code in src/orateur/stt/base.py
42 43 44 | |
transcribe(audio_data: np.ndarray, sample_rate: int = 16000, language_override: Optional[str] = None, prompt_override: Optional[str] = None) -> str
abstractmethod
Transcribe audio to text.
Args: audio_data: NumPy array of float32 audio samples (mono) sample_rate: Sample rate (typically 16000) language_override: Optional language code (e.g. 'en', 'fr') prompt_override: Optional Whisper initial prompt override
Returns: Transcribed text string
Source code in src/orateur/stt/base.py
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | |
get_stt_backend(name: str, config) -> Optional[STTBackend]
Get and initialize an STT backend by name.
Source code in src/orateur/stt/registry.py
13 14 15 16 17 18 19 20 21 | |
list_stt_backends() -> list[str]
List registered STT backend names.
Source code in src/orateur/stt/registry.py
24 25 26 | |
base
Abstract STT backend interface.
STTBackend(config: object)
Bases: ABC
Abstract base class for Speech-to-Text backends.
Subclasses store config as needed.
Source code in src/orateur/stt/base.py
12 13 | |
get_available_models() -> list[str]
Return list of available model names for this backend.
Source code in src/orateur/stt/base.py
46 47 48 | |
initialize(config) -> bool
abstractmethod
Initialize the backend. Returns True on success.
Source code in src/orateur/stt/base.py
15 16 17 18 | |
is_ready() -> bool
Check if backend is ready for transcription.
Source code in src/orateur/stt/base.py
42 43 44 | |
transcribe(audio_data: np.ndarray, sample_rate: int = 16000, language_override: Optional[str] = None, prompt_override: Optional[str] = None) -> str
abstractmethod
Transcribe audio to text.
Args: audio_data: NumPy array of float32 audio samples (mono) sample_rate: Sample rate (typically 16000) language_override: Optional language code (e.g. 'en', 'fr') prompt_override: Optional Whisper initial prompt override
Returns: Transcribed text string
Source code in src/orateur/stt/base.py
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | |
pywhispercpp
pywhispercpp STT backend.
PyWhisperCppBackend(config)
Bases: STTBackend
Whisper via pywhispercpp (local CPU, or GPU via CUDA / Metal / Vulkan per build).
Source code in src/orateur/stt/pywhispercpp.py
29 30 31 32 33 34 | |
whisper_models_dir() -> Path
Where pywhispercpp stores ggml weights (uses platformdirs; not ~/.local on macOS).
Source code in src/orateur/stt/pywhispercpp.py
16 17 18 19 20 21 22 23 | |
registry
STT backend registry - plug-n-play discovery.
get_stt_backend(name: str, config) -> Optional[STTBackend]
Get and initialize an STT backend by name.
Source code in src/orateur/stt/registry.py
13 14 15 16 17 18 19 20 21 | |
list_stt_backends() -> list[str]
List registered STT backend names.
Source code in src/orateur/stt/registry.py
24 25 26 | |
register_stt_backend(name: str, backend_cls: Type[STTBackend]) -> None
Register a new STT backend.
Source code in src/orateur/stt/registry.py
29 30 31 | |
text_injector
Text injection via clipboard + synthetic paste (ydotool on Linux, pynput on macOS/Windows).
TextInjector(config=None)
Inject text into focused app via clipboard + paste hotkey.
Source code in src/orateur/text_injector.py
30 31 32 | |
tts
TTS (Text-to-Speech) backends.
TTSBackend(config: object)
Bases: ABC
Abstract base class for Text-to-Speech backends.
Subclasses store config as needed.
Source code in src/orateur/tts/base.py
11 12 | |
estimate_duration(text: str) -> float
Estimate TTS duration in seconds from text (heuristic). ~150 words/min ≈ 2.5 words/sec; fallback ~4 chars/sec.
Source code in src/orateur/tts/base.py
73 74 75 76 77 78 79 80 81 82 83 | |
get_available_voices() -> list[str]
Return list of available voice names.
Source code in src/orateur/tts/base.py
89 90 91 | |
initialize(config) -> bool
abstractmethod
Initialize the backend. Returns True on success.
Source code in src/orateur/tts/base.py
14 15 16 17 | |
is_ready() -> bool
Check if backend is ready.
Source code in src/orateur/tts/base.py
85 86 87 | |
stop_playback() -> None
Stop in-flight playback if supported. Override in backends that play audio.
Source code in src/orateur/tts/base.py
93 94 95 | |
synthesize(text: str, voice: Optional[str] = None) -> Optional[Path]
abstractmethod
Synthesize text to audio file.
Args: text: Text to speak voice: Optional voice name (uses default if None)
Returns: Path to WAV file, or None on failure
Source code in src/orateur/tts/base.py
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | |
synthesize_and_play(text: str, voice: Optional[str] = None, volume: Optional[float] = None, level_callback: Optional[Callable[[float], None]] = None) -> bool
Synthesize and play audio. Default implementation: synthesize then play file.
Source code in src/orateur/tts/base.py
37 38 39 40 41 42 43 44 45 46 47 48 49 50 | |
get_tts_backend(name: str, config) -> Optional[TTSBackend]
Get and initialize a TTS backend by name.
Source code in src/orateur/tts/registry.py
13 14 15 16 17 18 19 20 21 | |
list_tts_backends() -> list[str]
List registered TTS backend names.
Source code in src/orateur/tts/registry.py
24 25 26 | |
base
Abstract TTS backend interface.
TTSBackend(config: object)
Bases: ABC
Abstract base class for Text-to-Speech backends.
Subclasses store config as needed.
Source code in src/orateur/tts/base.py
11 12 | |
estimate_duration(text: str) -> float
Estimate TTS duration in seconds from text (heuristic). ~150 words/min ≈ 2.5 words/sec; fallback ~4 chars/sec.
Source code in src/orateur/tts/base.py
73 74 75 76 77 78 79 80 81 82 83 | |
get_available_voices() -> list[str]
Return list of available voice names.
Source code in src/orateur/tts/base.py
89 90 91 | |
initialize(config) -> bool
abstractmethod
Initialize the backend. Returns True on success.
Source code in src/orateur/tts/base.py
14 15 16 17 | |
is_ready() -> bool
Check if backend is ready.
Source code in src/orateur/tts/base.py
85 86 87 | |
stop_playback() -> None
Stop in-flight playback if supported. Override in backends that play audio.
Source code in src/orateur/tts/base.py
93 94 95 | |
synthesize(text: str, voice: Optional[str] = None) -> Optional[Path]
abstractmethod
Synthesize text to audio file.
Args: text: Text to speak voice: Optional voice name (uses default if None)
Returns: Path to WAV file, or None on failure
Source code in src/orateur/tts/base.py
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | |
synthesize_and_play(text: str, voice: Optional[str] = None, volume: Optional[float] = None, level_callback: Optional[Callable[[float], None]] = None) -> bool
Synthesize and play audio. Default implementation: synthesize then play file.
Source code in src/orateur/tts/base.py
37 38 39 40 41 42 43 44 45 46 47 48 49 50 | |
pocket_tts
Pocket TTS backend.
PocketTTSBackend(config)
Bases: TTSBackend
Pocket TTS text-to-speech.
Source code in src/orateur/tts/pocket_tts.py
33 34 35 36 37 38 39 40 41 42 43 | |
registry
TTS backend registry.
get_tts_backend(name: str, config) -> Optional[TTSBackend]
Get and initialize a TTS backend by name.
Source code in src/orateur/tts/registry.py
13 14 15 16 17 18 19 20 21 | |
list_tts_backends() -> list[str]
List registered TTS backend names.
Source code in src/orateur/tts/registry.py
24 25 26 | |
register_tts_backend(name: str, backend_cls: Type[TTSBackend]) -> None
Register a new TTS backend.
Source code in src/orateur/tts/registry.py
29 30 31 | |
ui_daemon
Orateur UI daemon: JSON-RPC over FIFO (commands) and stdout (events).
Reads commands from ~/.cache/orateur/cmd.fifo, writes events to stdout. Used by the Quickshell OrateurWidget.
Use orateur ui --events-only with Quickshell when orateur run handles STT/TTS
(one model load). Full orateur ui loads STT/TTS/LLM for FIFO-driven recording.
ui_mirror
Mirror UI events to ~/.cache/orateur/ui_events.jsonl when ui_events_mirror is enabled.
Any client can follow this file (e.g. Quickshell tail -F, the Tauri desktop app). Lines are
NDJSON with the same shape as orateur ui stdout: {"event": "...", ...}.
reset_ui_events_file() -> None
Clear the JSONL file (unlink + recreate) so tail -F clients see a fresh file.
Source code in src/orateur/ui_mirror.py
38 39 40 41 42 43 44 45 46 | |
send(config: ConfigManager, event: str, **payload: Any) -> None
Append one UI event line (non-blocking aside from a short file lock).
Source code in src/orateur/ui_mirror.py
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | |