dsh-live-voice 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +75 -3
- package/PLAN.md +19 -1
- package/README.md +1 -1
- package/docs/CONFIGURATION.md +17 -3
- package/docs/VOICE-LIFECYCLE.md +5 -1
- package/lib/client.js +512 -318
- package/lib/server.js +157 -4
- package/package.json +1 -1
- package/src/app/client/apply.tsx +96 -40
- package/src/app/client/i18n/catalogs/base.ts +6 -0
- package/src/app/client/i18n/catalogs/en.ts +9 -0
- package/src/app/client/i18n/catalogs/es.ts +9 -0
- package/src/app/client/i18n/catalogs/fr.ts +9 -0
- package/src/app/client/i18n/catalogs/hi.ts +9 -0
- package/src/app/client/i18n/catalogs/pt-BR.ts +9 -0
- package/src/app/client/i18n/catalogs/zh.ts +8 -0
- package/src/app/server/apply.ts +4 -0
- package/src/app/server/registerRoutes.ts +40 -0
- package/src/modules/conversation/ARCHITECTURE.md +2 -0
- package/src/modules/core/ARCHITECTURE.md +1 -1
- package/src/modules/core/coordinator.ts +8 -6
- package/src/modules/core/qwen/QwenSettings.tsx +15 -14
- package/src/modules/core/settings.ts +26 -8
- package/src/modules/core/transcript.ts +5 -43
- package/src/modules/recognition/engines/whisper/WhisperRecognitionEngine.ts +5 -3
- package/src/modules/recognition/engines/whisper/WhisperSettings.tsx +19 -20
- package/src/modules/settings/ARCHITECTURE.md +1 -1
- package/src/modules/settings/models/settingsHost.ts +45 -0
- package/src/modules/settings/models/settingsStorage.ts +45 -10
- package/src/modules/settings/sections/recognition/RecognitionFilterSettings.tsx +2 -2
- package/src/modules/settings/sections/recognition/SilenceDetectionSettings.tsx +37 -7
- package/src/modules/settings/sections/recognition/VoiceCommandSettings.tsx +2 -2
- package/src/modules/settings/sections/speak/OutputFilterSettings.tsx +4 -4
- package/src/modules/settings/sections/speak/SpeechAdvancedSettings.tsx +2 -2
- package/src/modules/settings/sections/speak/SpeechEngineSettings.tsx +2 -2
- package/src/modules/settings/services/releases.ts +9 -1
- package/src/shared/ARCHITECTURE.md +1 -1
- package/src/shared/design-system/forms/DraftField.tsx +79 -0
- package/src/shared/design-system/forms/NumberField.tsx +4 -10
- package/src/shared/design-system/forms/TextAreaField.tsx +4 -10
- package/src/shared/design-system/forms/TextField.tsx +4 -10
- package/src/styles/index.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,43 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to DSH Live Voice are documented in this file.
|
|
4
4
|
|
|
5
|
-
## [0.3.
|
|
5
|
+
## [0.3.2] - Unreleased
|
|
6
|
+
|
|
7
|
+
### Release Changes
|
|
8
|
+
|
|
9
|
+
Voice control feels more immediate: the new default Short profile sends captured speech for recognition after 500 ms of silence, reducing the wait before transcription and voice-command execution. Maintainer feedback reports a noticeably more responsive experience in daily use. This reduces the segmentation delay, not model inference time, and does not claim improved recognition accuracy. Natural, Long, and Custom remain available for longer pauses. All Live Voice preferences now live on the DSH server instead of in browser storage, so browsers connecting to the same host load the same saved configuration. Legacy browser preferences are intentionally not migrated; configure them once again after updating.
|
|
10
|
+
|
|
11
|
+
### Changes
|
|
12
|
+
|
|
13
|
+
- Adjust silence-detection profiles to Short (500 ms, now the default), Natural (1000 ms), and Long (2000 ms).
|
|
14
|
+
- Add a persisted Custom silence profile with whole-millisecond input from 100 to 10,000 ms for Qwen and Whisper capture, translated into every supported interface language.
|
|
15
|
+
- Move every Live Voice preference to authenticated server-side persistence, including engines, languages, device selections, conversation policy, silence timing, response/send delays, filters, voice commands, and editable spoken-context text.
|
|
16
|
+
- Save normalized settings atomically with owner-only file permissions and serialize partial updates to preserve unrelated preferences during concurrent saves.
|
|
17
|
+
- Remove browser-storage reads and writes from the plugin; keep release-check metadata in memory only.
|
|
18
|
+
- Add translated server load/save errors in all six interface languages, with no browser-storage fallback.
|
|
19
|
+
- Add regression coverage for persistence across host-store recreation and independent clients, concurrent updates, file permissions, invalid requests, corrupted storage, and ignored legacy browser preferences.
|
|
20
|
+
|
|
21
|
+
### Bug Fixes
|
|
22
|
+
|
|
23
|
+
- Make dictation append-only: append final recognized chunks at the end of the current composer and keep provisional hypotheses out of its text. Existing text and manual edits are preserved; explicit Clear and normal submission remain separate actions.
|
|
24
|
+
- Accept manual composer updates when React skips the exact echo of an earlier voice write, preventing later chunks from restoring stale draft snapshots. Muting, cancellation, commands, and rejected short phrases no longer perform unnecessary whole-draft writes.
|
|
25
|
+
- Add mounted regressions for skipped voice echoes, manual replacement, delayed publications, and append-only final chunks; document the append-only lifecycle contract.
|
|
26
|
+
- Preserve spaces, commas, line breaks, and unfinished entries while editing voice commands and other settings. Normalize and save text only when the field loses focus, not on every keystroke.
|
|
27
|
+
- Centralize text inputs, textareas, and numeric inputs on one shared draft-field component. Parent updates and delayed server responses no longer overwrite an active edit; invalid numeric drafts restore the saved value on blur.
|
|
28
|
+
- Apply the same blur-only saving behavior to Qwen and Whisper connection fields, and allow empty voice-command fields without restoring fallback phrases.
|
|
29
|
+
- Add regressions for raw typing, comma-separated commands, blur-only commits, late parent updates, empty text, numeric validation, and restored defaults.
|
|
30
|
+
|
|
31
|
+
### Upgrade Notes
|
|
32
|
+
|
|
33
|
+
- Legacy browser preferences are not imported. The first load without saved server preferences uses defaults; configure Live Voice once again. Qwen and Whisper connection settings already stored on the host remain unchanged.
|
|
34
|
+
- Restart the DSH server after updating to load the new settings route, then refresh the browser. Refreshing the page alone is not sufficient.
|
|
35
|
+
- Device selections are shared too, but the selected device must exist and be usable in the current browser. Microphone permissions and browser language-pack installations remain browser-managed capabilities.
|
|
36
|
+
|
|
37
|
+
## [0.3.1] - 2026-10-03
|
|
38
|
+
|
|
39
|
+
### Release Changes
|
|
40
|
+
|
|
41
|
+
This release simplifies the Settings interface, supports larger Qwen recognition uploads, and confirms compatibility with the current tested DSH release.
|
|
6
42
|
|
|
7
43
|
### Changes
|
|
8
44
|
|
|
@@ -14,14 +50,26 @@ All notable changes to DSH Live Voice are documented in this file.
|
|
|
14
50
|
|
|
15
51
|
- Split agent guidance and architecture documentation by application, domain module, and shared design-system boundaries.
|
|
16
52
|
|
|
53
|
+
### Bug Fixes
|
|
54
|
+
|
|
55
|
+
- Increase the default Qwen recognition audio-upload limit from 2 MB to 50 MB and add regression coverage for uploads larger than 2 MB.
|
|
56
|
+
- Derive the installed-version badge and newer-release test fixture from package metadata instead of hard-coded plugin versions.
|
|
57
|
+
|
|
17
58
|
### Compatibility
|
|
18
59
|
|
|
19
|
-
- Confirm tested compatibility with DeepSeek Harness **0.2.0-rc.2
|
|
60
|
+
- Confirm tested compatibility with DeepSeek Harness **0.2.0-rc.2** and correct the tested-version release link.
|
|
20
61
|
|
|
21
|
-
|
|
62
|
+
**Full Changelog:** https://github.com/victorwads/dsh-live-voice/compare/v0.3.0...v0.3.1
|
|
63
|
+
|
|
64
|
+
## [0.3.0] - 2026-09-24
|
|
65
|
+
|
|
66
|
+
### Release Changes
|
|
67
|
+
|
|
68
|
+
This release adds multilingual DSH-native localization, voice-aware agent context, smoother host-audio playback, and a modular foundation for future development.
|
|
22
69
|
|
|
23
70
|
### Features
|
|
24
71
|
|
|
72
|
+
- Translate the plugin interface into English, Portuguese (Brazil), Spanish, French, Hindi, and Chinese through the DSH locale service. Interface language remains independent of recognition language, synthesis language, and user-defined voice commands.
|
|
25
73
|
- Add a configurable, session-scoped Live Voice context for agent responses. During an active voice conversation with automatic spoken responses enabled, the agent receives editable guidance that its user-facing response will be spoken aloud.
|
|
26
74
|
- Add an English Live Voice context editor and Restore default action to Speaking settings; interface labels and help remain localized.
|
|
27
75
|
- Standardize host speech as compact AAC/M4A played in the browser: macOS `say` and Qwen synthesize internally to WAV, the DSH host transcodes it before transport, and up to three upcoming segments are synthesized ahead to reduce gaps.
|
|
@@ -34,9 +82,27 @@ All notable changes to DSH Live Voice are documented in this file.
|
|
|
34
82
|
- Make automatic Steer delivery use DSH's Ctrl/Cmd+Enter accelerated composer gesture instead of the public normal-submit action, so messages are sent to the running agent rather than silently added to its queue. Add a lifecycle regression for the gesture.
|
|
35
83
|
- Deduplicate voice-context synchronization so the PUT request fires only when the payload actually changes, instead of on every coordinator state update.
|
|
36
84
|
- Prevent automatic assistant speech in speaker mode from overtaking the user's turn. Playback now waits for all pending backend transcriptions to finish and for the automatic-send countdown and delivery attempt to complete, avoiding canceled recognition, discarded transcripts, and interrupted automatic delivery.
|
|
85
|
+
- Consume visible assistant history when restarting voice conversation so previous responses and text streamed while voice mode was off are not replayed.
|
|
86
|
+
|
|
87
|
+
### Changes
|
|
88
|
+
|
|
89
|
+
- Migrate React UI components to TSX and organize the implementation into application composition roots, domain modules, and a reusable design system.
|
|
90
|
+
- Add a Preview.js component workspace with synthetic voice-bar and Settings scenarios for isolated UI development.
|
|
91
|
+
- Change the project license and package metadata from GPL-3.0-only to Apache-2.0.
|
|
92
|
+
|
|
93
|
+
### Documentation
|
|
94
|
+
|
|
95
|
+
- Add dedicated configuration, engine-selection, architecture, review, and voice-lifecycle guides.
|
|
96
|
+
- Update the quick-start command to install the plugin into the DSH web profile.
|
|
97
|
+
|
|
98
|
+
**Full Changelog:** https://github.com/victorwads/dsh-live-voice/compare/v0.2.3...v0.3.0
|
|
37
99
|
|
|
38
100
|
## [0.2.3] - 2026-09-21
|
|
39
101
|
|
|
102
|
+
### Release Changes
|
|
103
|
+
|
|
104
|
+
This release makes plugin updates and tested-version information visible in Settings and clarifies the recognition-engine roadmap.
|
|
105
|
+
|
|
40
106
|
### Features
|
|
41
107
|
|
|
42
108
|
- Add an update notification in Live Voice settings when a newer GitHub release is available. The check runs at most once every 24 hours and the action opens the matching release.
|
|
@@ -54,6 +120,12 @@ All notable changes to DSH Live Voice are documented in this file.
|
|
|
54
120
|
- Handle release tags with a leading `v` and prerelease identifiers correctly when deciding whether an update is newer.
|
|
55
121
|
- Ignore unexpected release URLs and fall back to the repository releases page.
|
|
56
122
|
|
|
123
|
+
### Documentation
|
|
124
|
+
|
|
125
|
+
- Improve README clarity and remove duplicated content.
|
|
126
|
+
|
|
127
|
+
**Full Changelog:** https://github.com/victorwads/dsh-live-voice/compare/v0.2.2...v0.2.3
|
|
128
|
+
|
|
57
129
|
## [0.2.2] - 2026-09-19
|
|
58
130
|
|
|
59
131
|
### Features
|
package/PLAN.md
CHANGED
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
This document describes the product plan and local implementation progress. The published npm version is a documentation placeholder; the working tree now contains an initial plugin undergoing integration validation. Features below describe intended behavior unless verified in the progress section.
|
|
4
4
|
|
|
5
|
+
## Append-only composer dictation
|
|
6
|
+
|
|
7
|
+
Final recognized chunks now append to the current composer end; interim hypotheses only drive recognition status and interruption policy. Dictation never owns or replaces an earlier substring. Muting, cancellation, commands, and rejected phrases no longer rewrite the draft. Explicit Clear and normal submission remain intentional exceptions. Client synchronization accepts a newer editor revision or a new manual publication even when the exact voice echo was skipped, while preserving optimistic text across unchanged stale slot renders. Mounted regressions cover delayed publications, manual edits between final chunks, manual replacement and clearing, and native result-index deduplication. The append-only requirement is documented in the voice lifecycle, configuration guide, and module architecture. Validation: `npm test` passed all 188 automated tests, including TypeScript and rebuilt runtime bundles; formatting and diff whitespace checks passed. Existing React act/JSDOM diagnostics remain separate from physical-microphone and authenticated-runtime acceptance, which were not performed.
|
|
8
|
+
|
|
9
|
+
## Shared blur-only settings editing
|
|
10
|
+
|
|
11
|
+
Text inputs, textareas, and numeric fields now share `forms/DraftField.tsx`, which keeps raw edits local until blur. Voice commands preserve spaces, commas, line breaks, and incomplete phrases while typing; normalization and server persistence run only through `onCommit`. Active drafts survive parent updates and delayed server responses. Empty voice-command fields no longer restore fallback phrases. Invalid numeric drafts restore the saved value on blur. Qwen and Whisper connection fields use the same component and save on blur. Automated regression coverage exercises the shared controls and a mounted settings controller using the real settings normalizer. Validation: `npm test` passed all 190 automated tests, including TypeScript and rebuilt runtime bundles; `npm run format:check` and `git diff --check` passed. The maintainer reports the updated editing behavior is working; this is not physical-microphone or authenticated-runtime automation.
|
|
12
|
+
|
|
13
|
+
## Server-side Live Voice preferences
|
|
14
|
+
|
|
15
|
+
All plugin preferences now use an authenticated GET/PUT settings route and an atomic, owner-only host file at `~/.dsh/dsh-live-voice.settings.json`. Browsers load the same host-wide preferences; legacy browser settings are intentionally ignored without migration. Save requests merge normalized patches serially to preserve unrelated concurrent edits. All browser-storage access was removed from plugin source, including the release metadata cache (now memory-only). Load/save failures use translated messages in all six catalogs. The built client and server bundles were regenerated and reviewed.
|
|
16
|
+
|
|
17
|
+
Validation: `npm test` passed all 187 automated tests, including TypeScript and client/server builds. Added coverage for preferences across store recreation and independent clients, concurrent and rapid patches, owner-only file permissions, malformed requests, corrupted host storage, route cleanup, and ignored legacy browser settings. Existing React act/JSDOM diagnostics remain in lifecycle fixtures. Physical-microphone and authenticated DSH runtime acceptance were not performed. The DSH server must be restarted to load the new route, followed by a browser refresh. `npm run check:dist` rebuilds successfully but reports the expected unstaged generated-bundle differences against Git; no staging, commit, or publication was performed.
|
|
18
|
+
|
|
19
|
+
## 0.3.2 work in progress
|
|
20
|
+
|
|
21
|
+
The next release version is reserved as 0.3.2; this is not a completed release or publication. Silence detection now offers Short (500 ms, default), Natural (1000 ms), Long (2000 ms), and a persisted Custom profile (100–10,000 whole milliseconds). Maintainer feedback reports substantially more responsive voice commands with shorter silence windows; release notes distinguish this reduced waiting time from model speed or accuracy. Existing persisted profile choices are preserved. Custom edits save on blur and invalid edits restore the saved value. Qwen and Whisper share the same normalized timing; Browser SpeechRecognition keeps its own segmentation. Validation: `npm test` passed all 184 automated tests after making Short the default, with regression coverage for default timing and preservation of saved profiles, including the build and TypeScript check. An isolated headless Chrome smoke with a synthetic settings controller passed four-option selection, saving 300/400 ms, restoring invalid edits, and retaining the custom value across profile switches without page errors. The test suite still emits existing React act/JSDOM event diagnostics in lifecycle fixtures; these are not physical-device results. Physical-microphone and authenticated-runtime acceptance remain unverified and separate checks.
|
|
22
|
+
|
|
5
23
|
## 0.3.1 release preparation
|
|
6
24
|
|
|
7
25
|
The Settings interface now groups primary fields under collapsed General sections, adds icons to tabs and subsection headings, and keeps recognition capability status outside the General section. All six interface catalogs include the new section label. Release metadata and the lockfile use 0.3.1; the version-badge regression derives the current and next release versions from build-injected package metadata.
|
|
@@ -46,7 +64,7 @@ The pause segmentation controls are nested inside the Speech recognition card an
|
|
|
46
64
|
|
|
47
65
|
## Simple provider-independent voice detection
|
|
48
66
|
|
|
49
|
-
Recognition provider configuration and browser-side audio segmentation are now separate concerns in Settings. Provider connection controls remain inside Speech recognition and change with the selected engine. Engines whose raw audio is captured by this plugin opt into a separate Voice detection block; currently that is Whisper HTTP, while Browser SpeechRecognition continues to manage its own boundaries. The
|
|
67
|
+
Recognition provider configuration and browser-side audio segmentation are now separate concerns in Settings. Provider connection controls remain inside Speech recognition and change with the selected engine. Engines whose raw audio is captured by this plugin opt into a separate Voice detection block; currently that is Whisper HTTP, while Browser SpeechRecognition continues to manage its own boundaries. The interface now offers Short (500 ms), Natural (1000 ms), Long (2000 ms), and Custom (100–10,000 ms) pause profiles. The selected browser preference is passed into the capture adapter, so it can be reused by future external recognition providers without making VAD look like a whisper.cpp server setting.
|
|
50
68
|
|
|
51
69
|
## Host-side Whisper HTTP recognition
|
|
52
70
|
|
package/README.md
CHANGED
|
@@ -63,7 +63,7 @@ Detailed guides for deep-diving into engines and configurations:
|
|
|
63
63
|
|
|
64
64
|
## ✨ Features at a Glance
|
|
65
65
|
|
|
66
|
-
- 🎙️ **Voice Typing:**
|
|
66
|
+
- 🎙️ **Voice Typing:** Append final recognized speech to the end of the DSH composer without replacing manual edits.
|
|
67
67
|
- 👐 **Hands-Free Conversation:** Continuous dialogue that stays active across chat sessions.
|
|
68
68
|
- ❓ **Spoken Structured Questions:** Narrates DSH prompt questions and submits your spoken answer.
|
|
69
69
|
- ⌨️ **Hold-to-Talk (Push-to-Talk):** Hold `Control` anywhere on the page to speak; release to send.
|
package/docs/CONFIGURATION.md
CHANGED
|
@@ -4,8 +4,20 @@ DSH Live Voice integrates directly into DeepSeek Harness settings under **DSH Se
|
|
|
4
4
|
|
|
5
5
|
This guide covers all conversation modes, acoustic settings, silence thresholds, audio device routing, voice commands, and external engine configurations.
|
|
6
6
|
|
|
7
|
+
## Server-side preferences
|
|
8
|
+
|
|
9
|
+
All Live Voice preferences are loaded and saved on the DSH host, including engines, languages, devices, conversation mode, delays, silence detection, filters, voice commands, and editable spoken-context text. They are shared by browsers connecting to the same host and survive server restarts. The authenticated settings route persists normalized preferences atomically to `~/.dsh/dsh-live-voice.settings.json` (with owner-only file permissions). Qwen and Whisper connection configurations remain in their existing host-side stores.
|
|
10
|
+
|
|
11
|
+
Legacy browser preferences are not imported or used. The first load without a server preferences file uses defaults; configure them once again. No settings are written to browser storage, and release-check metadata is cached only in memory. A failed server load or save is reported instead of falling back to browser persistence. Reload after a load failure to retry. Device IDs are shared too, but a selected device must still exist and be usable on the current browser; microphone permission and browser language-pack installation remain browser-managed capabilities, not plugin preferences.
|
|
12
|
+
|
|
13
|
+
After updating the plugin, restart the DSH server to load the new settings route, then refresh the browser.
|
|
14
|
+
|
|
7
15
|
---
|
|
8
16
|
|
|
17
|
+
## Append-only dictation
|
|
18
|
+
|
|
19
|
+
Live Voice appends final recognized chunks to the end of the current message draft. Manual edits and existing composer text are preserved; caret position does not move dictation into an earlier part of the draft. Provisional recognition results no longer appear inside the composer or replace earlier text. A final chunk becomes visible when recognition completes. Cancelling or muting recognition leaves committed text intact. Only an explicit Clear command or normal message submission may intentionally clear the composer.
|
|
20
|
+
|
|
9
21
|
## 1. Acoustic Modes & Turn-Taking
|
|
10
22
|
|
|
11
23
|
How listening and speaking coordinate depends on whether you use speakers or headphones:
|
|
@@ -79,9 +91,11 @@ Configure your microphone and speech-to-text (STT) engine:
|
|
|
79
91
|
- *Process recognition locally on this device:* Ensures speech is not sent to external browser vendor cloud servers.
|
|
80
92
|
- *Automatically install language pack:* Allows the browser to download offline language packs on demand.
|
|
81
93
|
- **Silence Detection (VAD) Profiles:**
|
|
82
|
-
- *Short (
|
|
83
|
-
- *Natural (
|
|
84
|
-
- *Long (
|
|
94
|
+
- *Short (500 ms - default):* Fast turnaround for concise commands.
|
|
95
|
+
- *Natural (1000 ms):* Balanced for conversational cadence.
|
|
96
|
+
- *Long (2000 ms):* Accommodates thinking pauses during complex prompts.
|
|
97
|
+
- *Custom:* Choose any whole-millisecond value from 100 to 10,000 ms, including 300 or 400 ms. The value is saved when the field loses focus and retained when switching profiles; invalid edits revert to the saved value. Shorter pauses may split speech between phrases.
|
|
98
|
+
- These profiles apply to Qwen and Whisper plugin-managed capture, not Browser SpeechRecognition. The pause ends a transcription chunk, not the total recognition latency or the separate automatic message-send countdown. Actual boundaries are evaluated in audio-buffer increments.
|
|
85
99
|
- **Maximum Utterance Limit:** Split continuous speech after 10 to 300 seconds (default: 60s) to keep transcription chunks manageable.
|
|
86
100
|
|
|
87
101
|
---
|
package/docs/VOICE-LIFECYCLE.md
CHANGED
|
@@ -6,7 +6,7 @@ This is the natural-language behavioral contract for conversation lifecycle and
|
|
|
6
6
|
|
|
7
7
|
### Persisted preferences
|
|
8
8
|
|
|
9
|
-
Engine, language, input/output device, Speakers/Headphones mode, delivery mode, delays, filters, and customized voice-command phrases
|
|
9
|
+
Engine, language, input/output device, Speakers/Headphones mode, delivery mode, delays, filters, and customized voice-command phrases survive conversations and reloads through the host-side `dsh-live-voice.settings` preferences. Browser storage is not read or written; legacy browser values are intentionally not migrated.
|
|
10
10
|
|
|
11
11
|
### Application continuity
|
|
12
12
|
|
|
@@ -46,6 +46,10 @@ Capture, recognition, user speech activity, message delivery, agent generation,
|
|
|
46
46
|
| Unmount/dispose/pagehide | Invalidate pending work and release every owned resource |
|
|
47
47
|
| Late async result | Ignore it unless its session and operation generation are still current |
|
|
48
48
|
|
|
49
|
+
## Append-only dictation contract
|
|
50
|
+
|
|
51
|
+
Recognition is append-only at the end of the current composer. Only final recognized chunks are committed; provisional hypotheses affect recognition/activity status but never insert, replace, or remove composer text. Each final chunk appends after the latest published manual text, regardless of caret position. Live Voice must not restore an older full-draft snapshot over a manual edit, even when React skips the exact echo of a previous voice write. Muting, cancellation, rejected short phrases, and voice-command recognition do not rewrite the composer. The explicit Clear command and ordinary user submission remain intentional exceptions; they are not dictation writes.
|
|
52
|
+
|
|
49
53
|
## Invariants
|
|
50
54
|
|
|
51
55
|
1. A new session never inherits soft mute.
|