@burdenoff/website-sdk 2026.1105.2 → 2026.1105.3

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/README.md CHANGED
@@ -420,6 +420,60 @@ publishes audio, video or data, and it sends the avatar nothing to say.
420
420
  site's main bundle and the view's chunk carry none of it. On alpha, a browser
421
421
  WebSocket cannot carry Cloudflare Access service-token headers, so the
422
422
  stream needs the Access cookie for the gateway host.
423
+ - **The mic through the browser's own speech recognition (BOFF-9797 Stage C,
424
+ the operator's decision of 2026-11-05, dark).** The same `mic: true` opt-in
425
+ (default unset: no mic); the server's availability decides how the mic works.
426
+ Where the last `ok` answer carries `mic: {"mode": "browser",
427
+ "maxPressSeconds": 30}` (contract v1.6, the avatar service's
428
+ `AVATAR_WEB_MIC=browser`; read strictly: any other value is `unreadable` and
429
+ means no mic) and the consent version's words describe it (the new
430
+ `AvatarConsentCopy.micNotice`), the mic uses `SpeechRecognition` /
431
+ `webkitSpeechRecognition`, as the product assistant does: the browser's own
432
+ speech service turns the voice into text, and **nothing of a press reaches
433
+ our server**; the text goes into the box and leaves only on Send. Offered
434
+ only in a secure context with a recognizer, and never in Firefox (`Firefox/`,
435
+ `FxiOS/`: desktop Firefox gains an on-device recognizer in release 160) or
436
+ Brave (`navigator.brave`: no speech service behind its recognizer). The
437
+ gateway's stream is never offered beside a `mic` the server sent (readable or
438
+ not), nor under words that name a `micNotice`; without a `mic` it is offered
439
+ exactly as before. The first tap shows the notice the words name,
440
+ `web-mic-2026-11-21-c` (714 bytes, SHA-256 `0a15bf5d…8e06de8f`); agreement is
441
+ kept per notice version, so another version is shown again. Two new consent
442
+ versions, DRAFTS for the privacy review that no server names yet:
443
+ `web-consent-2026-11-21-c` (bot check `turnstile`, 1,761 bytes, SHA-256
444
+ `824f389a…111790db`) and `web-consent-2026-11-22-c` (bot check `off`, 1,717
445
+ bytes, SHA-256 `d84a038b…1eb6200c`), Stage D's words with the mic's sentences
446
+ added. Tap to start, tap to stop on every platform: the recognizer
447
+ (`en-IN`, one `en-US` retry on `language-not-supported`, interim results,
448
+ `continuous` except on a touch device) starts inside the tap where the
449
+ browser reports the microphone granted; otherwise the tap first opens the
450
+ microphone and releases it at once (`getUserMedia`, nothing kept or sent),
451
+ which is what raises the permission prompt on Android Chrome and iOS, and
452
+ the recognizer starts 250 ms later (the Chat dictation's mobile handling,
453
+ `use-speech-input`). The 30 s limit counts from its `onstart`, and an engine
454
+ that ends by itself (a pause, a phone's single utterance, `no-speech`) is
455
+ replaced in the same press, its words joined: at once on a computer, after
456
+ 120 ms on a touch device, after a 2 s cooldown after a throw (or, on a
457
+ computer, an instant end); only 8 instant ends in a row, or 60 recognizers
458
+ in all, end a press by itself. The last words after `stop()` are waited for
459
+ (3 s), and a tap meanwhile does nothing. A refused microphone
460
+ (`NotAllowedError`, or `not-allowed` where the microphone was not
461
+ confirmed) says it is blocked (the mic stays); a refusal right after a grant
462
+ is retried once after 350 ms; refused again, or `service-not-allowed`,
463
+ `audio-capture`, no microphone, or a second `network` in a row, it says it
464
+ can't be used here and goes for the page. Words heard before any failure are
465
+ kept. Inside a Stage D session a tap while the avatar speaks sends
466
+ `interrupt`, recording sends `listening` marks from `onstart`, never within
467
+ 5 s of the one before (at most 12 a minute, within the session's 30 turns a
468
+ minute); the mic goes the moment a question is sent and is back once its
469
+ answer has gone to the session, so the avatar never starts an answer into
470
+ an open microphone (a tap while it speaks sends `interrupt` first; how fast
471
+ the cut lands, and whether to mute the avatar locally on that tap, are open
472
+ Stage D items). What is heard and the box carry rrweb's `rr-block`/`rr-mask` (the box also `rr-ignore`), so a site's
473
+ session replay records none of it before Send, and nothing in the mic calls
474
+ the site's analytics. **Before alpha is switched on:** each of the four sites'
475
+ session replay must be off, or honour those classes, and each privacy notice
476
+ (`/privacy#live-avatar`) needs its microphone paragraph.
423
477
  - **The answers after the first (BOFF-9797 Stage D, dark).** Only where the
424
478
  create's 201 carries `followUps: {maxAnswers, idleSeconds,
425
479
  maxAnswerWaitSeconds}` (the avatar service adds it only under its
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { E as ExplorePanelAvatarLive, a as ExploreLocale, A as AvatarConversation } from '../explore-avatar-live-config-BL8FTm0I.mjs';
3
+ import { E as ExplorePanelAvatarLive, a as ExploreLocale, A as AvatarConversation } from '../explore-avatar-live-config-BxiE66Im.mjs';
4
4
  import '../types-CTUJNvQu.mjs';
5
5
  import '../use-explore-chat-CbfohA9O.mjs';
6
6
  import '../explore-types-Ol1Mm3dW.mjs';
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { E as ExplorePanelAvatarLive, a as ExploreLocale, A as AvatarConversation } from '../explore-avatar-live-config-auLKxSzx.js';
3
+ import { E as ExplorePanelAvatarLive, a as ExploreLocale, A as AvatarConversation } from '../explore-avatar-live-config-1zeXdMer.js';
4
4
  import '../types-CTUJNvQu.js';
5
5
  import '../use-explore-chat-B3dOOvJN.js';
6
6
  import '../explore-types-Ol1Mm3dW.js';