@burdenoff/fe-libs 2026.914.1 → 2026.914.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.
Files changed (47) hide show
  1. package/dist/shared/assistant/index.d.ts +1 -0
  2. package/dist/shared/assistant/index.d.ts.map +1 -1
  3. package/dist/shared/assistant/speech/browserSpeechEngine.d.ts.map +1 -1
  4. package/dist/shared/assistant/speech/browserSpeechEngine.js +53 -26
  5. package/dist/shared/assistant/speech/createSpeechEngine.d.ts +25 -2
  6. package/dist/shared/assistant/speech/createSpeechEngine.d.ts.map +1 -1
  7. package/dist/shared/assistant/speech/createSpeechEngine.js +36 -13
  8. package/dist/shared/assistant/speech/hostedTtsProtocol.d.ts +25 -1
  9. package/dist/shared/assistant/speech/hostedTtsProtocol.d.ts.map +1 -1
  10. package/dist/shared/assistant/speech/hostedTtsProtocol.js +15 -8
  11. package/dist/shared/assistant/speech/hostedTtsSpeechEngine.d.ts +16 -1
  12. package/dist/shared/assistant/speech/hostedTtsSpeechEngine.d.ts.map +1 -1
  13. package/dist/shared/assistant/speech/hostedTtsSpeechEngine.js +84 -52
  14. package/dist/shared/assistant/speech/hostedVoiceCatalogue.d.ts.map +1 -1
  15. package/dist/shared/assistant/speech/hostedVoiceCatalogue.js +2 -1
  16. package/dist/shared/assistant/speech/index.d.ts +1 -1
  17. package/dist/shared/assistant/speech/index.d.ts.map +1 -1
  18. package/dist/shared/assistant/speech/routingSpeechEngine.d.ts.map +1 -1
  19. package/dist/shared/assistant/speech/routingSpeechEngine.js +41 -20
  20. package/dist/shared/assistant/speech/types.d.ts +10 -0
  21. package/dist/shared/assistant/speech/types.d.ts.map +1 -1
  22. package/dist/shared/assistant/turnActivity.d.ts +5 -1
  23. package/dist/shared/assistant/turnActivity.d.ts.map +1 -1
  24. package/dist/shared/assistant/ui/AssistantMessageList.d.ts.map +1 -1
  25. package/dist/shared/assistant/ui/AssistantMessageList.js +28 -27
  26. package/dist/shared/assistant/ui/AssistantSpeechProvider.d.ts.map +1 -1
  27. package/dist/shared/assistant/ui/AssistantSpeechProvider.js +209 -190
  28. package/dist/shared/assistant/ui/AssistantTurnActivity.d.ts +6 -3
  29. package/dist/shared/assistant/ui/AssistantTurnActivity.d.ts.map +1 -1
  30. package/dist/shared/assistant/ui/AssistantTurnActivity.js +8 -8
  31. package/dist/shared/assistant/ui/usePrefersReducedMotion.d.ts +55 -0
  32. package/dist/shared/assistant/ui/usePrefersReducedMotion.d.ts.map +1 -0
  33. package/dist/shared/assistant/ui/usePrefersReducedMotion.js +28 -0
  34. package/dist/shared/assistant/ui/voice/VoiceMiniController.d.ts +4 -2
  35. package/dist/shared/assistant/ui/voice/VoiceMiniController.d.ts.map +1 -1
  36. package/dist/shared/assistant/ui/voice/VoiceStage.d.ts +4 -2
  37. package/dist/shared/assistant/ui/voice/VoiceStage.d.ts.map +1 -1
  38. package/dist/shared/assistant/ui/voice/VoiceStatusText.d.ts +12 -1
  39. package/dist/shared/assistant/ui/voice/VoiceStatusText.d.ts.map +1 -1
  40. package/dist/shared/assistant/ui/voice/VoiceStatusText.js +19 -18
  41. package/dist/shared/assistant/voice/speechVoices.d.ts +15 -0
  42. package/dist/shared/assistant/voice/speechVoices.d.ts.map +1 -1
  43. package/dist/shared/assistant/voice/speechVoices.js +31 -26
  44. package/dist/shared/assistant/voice/voiceStatus.d.ts +8 -2
  45. package/dist/shared/assistant/voice/voiceStatus.d.ts.map +1 -1
  46. package/dist/shared-assistant.js +100 -99
  47. package/package.json +1 -1
@@ -111,6 +111,7 @@ export * from './preview/entity/AssistantEntityPreview';
111
111
  export * from './ui/panelOverlays';
112
112
  export * from './ui/useDropdownEscape';
113
113
  export * from './ui/useOverlayFocus';
114
+ export * from './ui/usePrefersReducedMotion';
114
115
  export * from './preview/useAssistantPreviewBridge';
115
116
  export * from './preview/AssistantPreviewOverlay';
116
117
  export * from './ui/composer/AssistantLanguageSelector';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AAGxB,cAAc,wBAAwB,CAAC;AAKvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAG9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,gBAAgB,CAAC;AAK/B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAG3C,cAAc,QAAQ,CAAC;AAEvB,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAG/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AAGrC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,0CAA0C,CAAC;AACzD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AACrD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wCAAwC,CAAC;AACvD,cAAc,yBAAyB,CAAC;AACxC,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,0BAA0B,CAAC;AAGzC,cAAc,WAAW,CAAC;AAE1B,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AAErC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAE3C,cAAc,kCAAkC,CAAC;AAEjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAElC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAE1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAE1C,cAAc,iCAAiC,CAAC;AAGhD,cAAc,OAAO,CAAC;AACtB,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"browserSpeechEngine.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/browserSpeechEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EACV,YAAY,EAKb,MAAM,SAAS,CAAC;AAsCjB,eAAO,MAAM,mBAAmB,EAAE,YAsGjC,CAAC"}
1
+ {"version":3,"file":"browserSpeechEngine.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/browserSpeechEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EACV,YAAY,EAKb,MAAM,SAAS,CAAC;AAqEjB,eAAO,MAAM,mBAAmB,EAAE,YA6HjC,CAAC"}
@@ -22,7 +22,17 @@ function n(e) {
22
22
  default: return "unknown";
23
23
  }
24
24
  }
25
- var r = 0, i = {
25
+ function r(e, t) {
26
+ if (!t) return null;
27
+ let n;
28
+ try {
29
+ n = e.getVoices();
30
+ } catch {
31
+ return null;
32
+ }
33
+ return n.find((e) => e === t) ?? n.find((e) => e.name === t.name && e.lang === t.lang) ?? null;
34
+ }
35
+ var i = 0, a = {
26
36
  id: "browser-speech-synthesis",
27
37
  isSupported() {
28
38
  return e() !== null && t();
@@ -40,50 +50,67 @@ var r = 0, i = {
40
50
  let r = () => t();
41
51
  return n.addEventListener("voiceschanged", r), () => n.removeEventListener("voiceschanged", r);
42
52
  },
43
- speak(i, a, o = {}) {
44
- let s = e();
45
- if (!s || !t()) {
46
- o.onError?.("unsupported");
53
+ speak(a, o, s = {}) {
54
+ let c = e();
55
+ if (!c || !t()) {
56
+ s.onError?.("unsupported");
47
57
  return;
48
58
  }
49
- let c = i.filter((e) => e.trim().length > 0);
50
- if (c.length === 0) {
51
- o.onEnd?.();
59
+ let l = a.filter((e) => e.trim().length > 0);
60
+ if (l.length === 0) {
61
+ s.onEnd?.();
52
62
  return;
53
63
  }
54
- r += 1;
55
- let l = r;
64
+ i += 1;
65
+ let u = i;
56
66
  try {
57
- s.cancel();
67
+ c.cancel();
58
68
  } catch {}
59
- c.forEach((e, t) => {
60
- let i = new window.SpeechSynthesisUtterance(e);
61
- i.lang = a.lang, a.voice && (i.voice = a.voice), a.rate !== void 0 && (i.rate = a.rate), i.onstart = () => {
62
- l === r && o.onChunkStart?.(t);
63
- }, i.onerror = (e) => {
64
- if (l === r) {
65
- r += 1;
69
+ let d = r(c, o.voice);
70
+ l.forEach((e, t) => {
71
+ if (u !== i) return;
72
+ let r;
73
+ try {
74
+ r = new window.SpeechSynthesisUtterance(e), r.lang = o.lang, d && (r.voice = d), o.rate !== void 0 && (r.rate = o.rate);
75
+ } catch {
76
+ i += 1;
77
+ try {
78
+ c.cancel();
79
+ } catch {}
80
+ s.onError?.("unknown");
81
+ return;
82
+ }
83
+ r.onstart = () => {
84
+ u === i && s.onChunkStart?.(t);
85
+ }, r.onerror = (e) => {
86
+ if (u === i) {
87
+ i += 1;
66
88
  try {
67
- s.cancel();
89
+ c.cancel();
68
90
  } catch {}
69
- o.onError?.(n(e.error));
91
+ s.onError?.(n(e.error));
70
92
  }
71
- }, t === c.length - 1 && (i.onend = () => {
72
- l === r && o.onEnd?.();
93
+ }, t === l.length - 1 && (r.onend = () => {
94
+ u === i && s.onEnd?.();
73
95
  });
74
96
  try {
75
- s.speak(i);
97
+ c.speak(r);
76
98
  } catch {
77
- l === r && o.onError?.("unknown");
99
+ if (u !== i) return;
100
+ i += 1;
101
+ try {
102
+ c.cancel();
103
+ } catch {}
104
+ s.onError?.("unknown");
78
105
  }
79
106
  });
80
107
  },
81
108
  cancel() {
82
- r += 1;
109
+ i += 1;
83
110
  try {
84
111
  e()?.cancel();
85
112
  } catch {}
86
113
  }
87
114
  };
88
115
  //#endregion
89
- export { i as browserSpeechEngine };
116
+ export { a as browserSpeechEngine };
@@ -1,3 +1,4 @@
1
+ import { HostedSpeechEngine } from './hostedTtsSpeechEngine';
1
2
  import { SpeechEngine } from './types';
2
3
  export interface SpeechEngineConfig {
3
4
  /** Our proxy's URL. Empty/undefined keeps the device engine. */
@@ -21,6 +22,11 @@ export interface SpeechEngineConfig {
21
22
  * access tokens expire and the engine outlives any one of them — reading a
22
23
  * token once at configure time would work until it rotated and then fail
23
24
  * exactly where it is hardest to notice, mid-reply.
25
+ *
26
+ * ★ Several callers may configure, and the LAST `getHeaders` given wins, without
27
+ * rebuilding the engine. Only a change of ENDPOINT rebuilds it. A call that
28
+ * repeats the endpoint without `getHeaders` keeps the existing source rather
29
+ * than silently making every later request anonymous (and refused).
24
30
  */
25
31
  export declare function configureSpeechEngine(options: {
26
32
  ttsEndpoint?: string | null;
@@ -42,9 +48,26 @@ export declare function readSpeechEngineConfig(): SpeechEngineConfig;
42
48
  */
43
49
  export declare function createSpeechEngines(config?: SpeechEngineConfig): {
44
50
  device: SpeechEngine;
45
- hosted: SpeechEngine | null;
51
+ hosted: HostedSpeechEngine | null;
46
52
  };
47
53
  export declare function getSpeechEngine(): SpeechEngine;
48
- /** Test seam: drop the singleton so the next call re-reads the config. */
54
+ /**
55
+ * Be told when `getSpeechEngine()` would return a different engine.
56
+ *
57
+ * ★★ Without this a panel mounted BEFORE the host configured hosted speech kept
58
+ * the device engine it read at mount (BOFF-7283): `AssistantSpeechProvider`
59
+ * read the engine as a default prop, so it only noticed the change if something
60
+ * else happened to re-render it — and until then spoke with the device voice.
61
+ * The provider subscribes through `useSyncExternalStore`.
62
+ */
63
+ export declare function subscribeSpeechEngine(listener: () => void): () => void;
64
+ /**
65
+ * Drop the singleton so the next call re-reads the config, and tell subscribers.
66
+ *
67
+ * ★ The notification is DEFERRED to a microtask. `configureSpeechEngine` is
68
+ * called during render by the product providers, and a synchronous notify would
69
+ * update another component while this one is rendering — which React rejects.
70
+ * Coalesced, so a burst of resets notifies once.
71
+ */
49
72
  export declare function resetSpeechEngine(): void;
50
73
  //# sourceMappingURL=createSpeechEngine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSpeechEngine.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/createSpeechEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C,GAAG,IAAI,CAmBP;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,kBAAkB,CAY3D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,kBAA6C,GAAG;IAC1F,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CAC7B,CASA;AAeD,wBAAgB,eAAe,IAAI,YAAY,CAG9C;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
1
+ {"version":3,"file":"createSpeechEngine.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/createSpeechEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAEzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAqBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C,GAAG,IAAI,CA2BP;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,kBAAkB,CAY3D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,kBAA6C,GAAG;IAC1F,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACnC,CASA;AAiBD,wBAAgB,eAAe,IAAI,YAAY,CAO9C;AAqBD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAKtE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CASxC"}
@@ -2,26 +2,30 @@ import { browserSpeechEngine as e } from "./browserSpeechEngine.js";
2
2
  import { createHostedTtsEngine as t } from "./hostedTtsSpeechEngine.js";
3
3
  import { createRoutingSpeechEngine as n } from "./routingSpeechEngine.js";
4
4
  //#region src/shared/assistant/speech/createSpeechEngine.ts
5
- var r, i;
6
- function a(e) {
5
+ var r, i, a = () => i?.() ?? {};
6
+ function o(e) {
7
7
  let t = e.ttsEndpoint?.trim() || void 0;
8
- t === r && e.getHeaders === i || (r = t, i = e.getHeaders, u());
8
+ if (t === r) {
9
+ e.getHeaders && (i = e.getHeaders), t && p();
10
+ return;
11
+ }
12
+ r = t, i = e.getHeaders, _();
9
13
  }
10
- function o() {
14
+ function s() {
11
15
  if (r) return {
12
16
  endpoint: r,
13
- getHeaders: i
17
+ getHeaders: a
14
18
  };
15
19
  if (typeof window < "u") {
16
20
  let e = window.__HB_TTS_ENDPOINT__;
17
21
  if (e) return {
18
22
  endpoint: e,
19
- getHeaders: i
23
+ getHeaders: a
20
24
  };
21
25
  }
22
26
  return { endpoint: (void 0)?.trim() || null };
23
27
  }
24
- function s(n = o()) {
28
+ function c(n = s()) {
25
29
  return {
26
30
  device: e,
27
31
  hosted: n.endpoint ? t({
@@ -31,12 +35,31 @@ function s(n = o()) {
31
35
  }) : null
32
36
  };
33
37
  }
34
- var c = null;
35
- function l() {
36
- return c ||= n(s()), c;
38
+ var l = null, u = null;
39
+ function d() {
40
+ if (!l) {
41
+ let e = c();
42
+ u = e.hosted, l = n(e);
43
+ }
44
+ return l;
45
+ }
46
+ var f = !1;
47
+ function p() {
48
+ f || (f = !0, queueMicrotask(() => {
49
+ f = !1, u?.headersChanged();
50
+ }));
51
+ }
52
+ var m = /* @__PURE__ */ new Set(), h = !1;
53
+ function g(e) {
54
+ return m.add(e), () => {
55
+ m.delete(e);
56
+ };
37
57
  }
38
- function u() {
39
- c = null;
58
+ function _() {
59
+ l = null, u = null, !h && (h = !0, queueMicrotask(() => {
60
+ h = !1;
61
+ for (let e of [...m]) e();
62
+ }));
40
63
  }
41
64
  //#endregion
42
- export { a as configureSpeechEngine, s as createSpeechEngines, l as getSpeechEngine, o as readSpeechEngineConfig, u as resetSpeechEngine };
65
+ export { o as configureSpeechEngine, c as createSpeechEngines, d as getSpeechEngine, s as readSpeechEngineConfig, _ as resetSpeechEngine, g as subscribeSpeechEngine };
@@ -61,7 +61,8 @@ export declare const SPEAKING_RATE_MAX_SYNC = 4;
61
61
  export declare const SPEAKING_RATE_MAX_STREAMING = 2;
62
62
  export declare const SPEAKING_RATE_MAX = 4;
63
63
  /**
64
- * Should a failure stop the engine claiming support for the rest of the page?
64
+ * Should a failure stop the engine claiming support — for `disableDurationMs`,
65
+ * not for the rest of the page?
65
66
  *
66
67
  * ★ `not-allowed` has TWO producers and only one of them is terminal:
67
68
  *
@@ -83,6 +84,29 @@ export declare const SPEAKING_RATE_MAX = 4;
83
84
  * DOM, no Audio), so the decision is kept where it CAN be.
84
85
  */
85
86
  export declare function shouldDisableEngine(reason: string | undefined, transient: boolean): boolean;
87
+ /**
88
+ * How long a disabled hosted engine stays off before it is tried again.
89
+ *
90
+ * ★★ Bounded, not for the rest of the page (BOFF-7283). "Every later request
91
+ * will be refused identically" is true of a genuinely wrong credential and false
92
+ * of everything else that surfaces as the same status:
93
+ *
94
+ * - the proxy answers 401 when ITS auth check cannot reach the gateway and gets
95
+ * a JSON error back (a gateway 503 included) — an outage, not a refusal;
96
+ * - a token that was stale at the moment of the request is fresh a minute
97
+ * later, because `getHeaders` is read per request;
98
+ * - a proxy redeploy that briefly 404s comes back on its own.
99
+ *
100
+ * A page-lifetime latch turned any of those into device voices (or, before the
101
+ * fallback was fixed, silence) until the user happened to reload — with nothing
102
+ * on screen explaining why. The cost of a bound is one failed request per
103
+ * window while a refusal is real, which is negligible.
104
+ *
105
+ * `unsupported` (404/501: no such route) is held longer than `not-allowed`,
106
+ * because it only recovers on a deploy.
107
+ */
108
+ export declare const HOSTED_DISABLE_MS: Readonly<Record<'not-allowed' | 'unsupported', number>>;
109
+ export declare function disableDurationMs(reason: string | undefined): number;
86
110
  /** Vendor limit is 5000 bytes per request; stay well inside it. */
87
111
  export declare const HOSTED_TTS_MAX_CHARS = 2000;
88
112
  export declare function buildRequest(text: string, languageCode: string, tier: string, voiceName?: string | null, speakingRate?: number): HostedTtsRequest;
@@ -1 +1 @@
1
- {"version":3,"file":"hostedTtsProtocol.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/hostedTtsProtocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,sBAAsB,IAAM,CAAC;AAC1C,eAAO,MAAM,2BAA2B,IAAM,CAAC;AAC/C,eAAO,MAAM,iBAAiB,IAAyB,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAG3F;AAED,mEAAmE;AACnE,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,YAAY,CAAC,EAAE,MAAM,GACpB,gBAAgB,CAUlB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAOrE;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAaxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,IAAI,EAAE,WAAW,GAAG,qBAAqB,GACxC,UAAU,GAAG,IAAI,CAWnB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAuB,GAAG,MAAM,EAAE,CAenF"}
1
+ {"version":3,"file":"hostedTtsProtocol.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/hostedTtsProtocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,sBAAsB,IAAM,CAAC;AAC1C,eAAO,MAAM,2BAA2B,IAAM,CAAC;AAC/C,eAAO,MAAM,iBAAiB,IAAyB,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAG3F;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,GAAG,aAAa,EAAE,MAAM,CAAC,CAGrF,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEpE;AAED,mEAAmE;AACnE,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,YAAY,CAAC,EAAE,MAAM,GACpB,gBAAgB,CAUlB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAOrE;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAaxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,IAAI,EAAE,WAAW,GAAG,qBAAqB,GACxC,UAAU,GAAG,IAAI,CAWnB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAuB,GAAG,MAAM,EAAE,CAenF"}
@@ -3,8 +3,15 @@ var e = .25, t = 4, n = 2, r = 4;
3
3
  function i(e, t) {
4
4
  return t ? !1 : e === "not-allowed" || e === "unsupported";
5
5
  }
6
- var a = 2e3;
7
- function o(e, t, n, r, i) {
6
+ var a = {
7
+ "not-allowed": 6e4,
8
+ unsupported: 10 * 6e4
9
+ };
10
+ function o(e) {
11
+ return e === "unsupported" ? a.unsupported : a["not-allowed"];
12
+ }
13
+ var s = 2e3;
14
+ function c(e, t, n, r, i) {
8
15
  let a = {
9
16
  text: e,
10
17
  languageCode: t,
@@ -12,25 +19,25 @@ function o(e, t, n, r, i) {
12
19
  };
13
20
  return r && r.toLowerCase().startsWith(t.toLowerCase()) && (a.voiceName = r), i !== void 0 && (a.speakingRate = i), a;
14
21
  }
15
- function s(e) {
22
+ function l(e) {
16
23
  return e === 401 || e === 403 ? "not-allowed" : e === 404 || e === 501 ? "unsupported" : "unknown";
17
24
  }
18
- function c(e) {
25
+ function u(e) {
19
26
  let t = globalThis.Buffer, n = typeof atob == "function" ? atob(e) : t?.from(e, "base64").toString("binary") ?? "", r = new Uint8Array(n.length);
20
27
  for (let e = 0; e < n.length; e += 1) r[e] = n.charCodeAt(e);
21
28
  return r;
22
29
  }
23
- function l(e, t) {
30
+ function d(e, t) {
24
31
  if (t instanceof ArrayBuffer) return t.byteLength > 0 ? new Uint8Array(t) : null;
25
32
  if (e?.includes("json") || typeof t == "object") {
26
33
  let e = t.audioContent;
27
34
  if (!e) return null;
28
- let n = c(e);
35
+ let n = u(e);
29
36
  return n.length > 0 ? n : null;
30
37
  }
31
38
  return null;
32
39
  }
33
- function u(e, t = a) {
40
+ function f(e, t = s) {
34
41
  if (e.length <= t) return [e];
35
42
  let n = [], r = e;
36
43
  for (; r.length > t;) {
@@ -40,4 +47,4 @@ function u(e, t = a) {
40
47
  return r && n.push(r), n.filter((e) => e.length > 0);
41
48
  }
42
49
  //#endregion
43
- export { a as HOSTED_TTS_MAX_CHARS, r as SPEAKING_RATE_MAX, n as SPEAKING_RATE_MAX_STREAMING, t as SPEAKING_RATE_MAX_SYNC, e as SPEAKING_RATE_MIN, c as base64ToBytes, o as buildRequest, s as classifyHttpFailure, l as decodeAudioResponse, i as shouldDisableEngine, u as splitForVendor };
50
+ export { a as HOSTED_DISABLE_MS, s as HOSTED_TTS_MAX_CHARS, r as SPEAKING_RATE_MAX, n as SPEAKING_RATE_MAX_STREAMING, t as SPEAKING_RATE_MAX_SYNC, e as SPEAKING_RATE_MIN, u as base64ToBytes, c as buildRequest, l as classifyHttpFailure, d as decodeAudioResponse, o as disableDurationMs, i as shouldDisableEngine, f as splitForVendor };
@@ -5,6 +5,21 @@ export interface HostedTtsOptions {
5
5
  /** Extra headers per request (auth). Called fresh each time so a rotated token is picked up. */
6
6
  getHeaders?: () => Record<string, string>;
7
7
  fetchImpl?: typeof fetch;
8
+ /** Test seam: the clock the disable window is measured against. */
9
+ now?: () => number;
8
10
  }
9
- export declare function createHostedTtsEngine(options: HostedTtsOptions): SpeechEngine;
11
+ /**
12
+ * The hosted engine, plus the one hook its owner needs beyond `SpeechEngine`.
13
+ */
14
+ export interface HostedSpeechEngine extends SpeechEngine {
15
+ /**
16
+ * The configured header source may now yield different headers.
17
+ *
18
+ * Lifts a refusal (401/403) that was earned with DIFFERENT headers — a stale
19
+ * or missing token that the host has since corrected — instead of keeping
20
+ * hosted speech off for the rest of the window. A no-op otherwise.
21
+ */
22
+ headersChanged(): void;
23
+ }
24
+ export declare function createHostedTtsEngine(options: HostedTtsOptions): HostedSpeechEngine;
10
25
  //# sourceMappingURL=hostedTtsSpeechEngine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hostedTtsSpeechEngine.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/hostedTtsSpeechEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAUH,OAAO,KAAK,EAAE,YAAY,EAA4D,MAAM,SAAS,CAAC;AAEtG,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,gGAAgG;IAChG,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,CAkP7E"}
1
+ {"version":3,"file":"hostedTtsSpeechEngine.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/hostedTtsSpeechEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAWH,OAAO,KAAK,EAAE,YAAY,EAA4D,MAAM,SAAS,CAAC;AAEtG,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,gGAAgG;IAChG,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD;;;;;;OAMG;IACH,cAAc,IAAI,IAAI,CAAC;CACxB;AAgBD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,GAAG,kBAAkB,CA6UnF"}
@@ -1,62 +1,89 @@
1
1
  import { HOSTED_TTS_TIER as e, HOSTED_VOICES as t, hostedLocaleFor as n } from "./hostedVoiceCatalogue.js";
2
- import { buildRequest as r, classifyHttpFailure as i, decodeAudioResponse as a, shouldDisableEngine as o, splitForVendor as s } from "./hostedTtsProtocol.js";
2
+ import { buildRequest as r, classifyHttpFailure as i, decodeAudioResponse as a, disableDurationMs as o, shouldDisableEngine as s, splitForVendor as c } from "./hostedTtsProtocol.js";
3
3
  //#region src/shared/assistant/speech/hostedTtsSpeechEngine.ts
4
- function c(c) {
5
- let l = c.fetchImpl ?? ((...e) => fetch(...e)), u = null, d = null, f = 0, p = null, m = !1, h = () => {
6
- d &&= (URL.revokeObjectURL(d), null);
7
- }, g = () => {
8
- if (u) {
9
- u.onended = null, u.onerror = null;
4
+ function l(e) {
5
+ let t = Object.entries(e).map(([e, t]) => `${e.toLowerCase()}:${t}`).sort().join("\n"), n = 5381;
6
+ for (let e = 0; e < t.length; e += 1) n = (n << 5) + n + t.charCodeAt(e) | 0;
7
+ return `${t.length}:${n >>> 0}`;
8
+ }
9
+ function u(u) {
10
+ let d = u.fetchImpl ?? ((...e) => fetch(...e)), f = u.now ?? (() => Date.now()), p = null, m = null, h = 0, g = null, _ = 0, v = null, y = null, b = () => {
11
+ try {
12
+ return u.getHeaders?.() ?? {};
13
+ } catch {
14
+ return {};
15
+ }
16
+ }, x = () => f() >= _ ? !1 : y === null ? !0 : l(b()) === y, S = /* @__PURE__ */ new Set(), C = () => {
17
+ for (let e of [...S]) e();
18
+ }, w = () => {
19
+ v !== null && clearTimeout(v), v = null;
20
+ }, T = (e) => {
21
+ w(), v = setTimeout(() => {
22
+ v = null;
23
+ let e = _ - f();
24
+ if (e > 0) {
25
+ T(e);
26
+ return;
27
+ }
28
+ C();
29
+ }, e);
30
+ }, E = (e, t) => {
31
+ _ = f() + e, y = t, T(e), C();
32
+ }, D = () => {
33
+ m &&= (URL.revokeObjectURL(m), null);
34
+ }, O = () => {
35
+ if (p) {
36
+ p.onended = null, p.onerror = null;
10
37
  try {
11
- u.pause();
38
+ p.pause();
12
39
  } catch {}
13
- u = null;
40
+ p = null;
14
41
  }
15
- h();
42
+ D();
16
43
  };
17
- async function _(t, o, s) {
18
- let u = r(t, n(o.lang) ?? o.lang, e, o.voice?.name ?? null, o.rate), d = await l(c.endpoint, {
44
+ async function k(t, o, s) {
45
+ let c = r(t, n(o.lang) ?? o.lang, e, o.voice?.name ?? null, o.rate), f = u.getHeaders?.() ?? {}, p = await d(u.endpoint, {
19
46
  method: "POST",
20
47
  signal: s,
21
48
  headers: {
22
49
  "content-type": "application/json",
23
- ...c.getHeaders?.() ?? {}
50
+ ...f
24
51
  },
25
- body: JSON.stringify(u)
52
+ body: JSON.stringify(c)
26
53
  });
27
- if (!d.ok) {
28
- let e = /* @__PURE__ */ Error(`hosted tts ${d.status}`);
29
- throw e.reason = i(d.status), e;
54
+ if (!p.ok) {
55
+ let e = /* @__PURE__ */ Error(`hosted tts ${p.status}`);
56
+ throw e.reason = i(p.status), e.headers = l(f), e;
30
57
  }
31
- let f = d.headers.get("content-type"), p = a(f, f?.includes("json") ? await d.json() : await d.arrayBuffer());
32
- if (!p) {
58
+ let m = p.headers.get("content-type"), h = a(m, m?.includes("json") ? await p.json() : await p.arrayBuffer());
59
+ if (!h) {
33
60
  let e = /* @__PURE__ */ Error("hosted tts returned no audio");
34
61
  throw e.reason = "unknown", e;
35
62
  }
36
- return p;
63
+ return h;
37
64
  }
38
- function v(e, t, n) {
65
+ function A(e, t, n) {
39
66
  return new Promise((r, i) => {
40
- if (t !== f) {
67
+ if (t !== h) {
41
68
  r();
42
69
  return;
43
70
  }
44
71
  let a = new Blob([e.slice().buffer], { type: "audio/mpeg" });
45
- h(), d = URL.createObjectURL(a);
46
- let o = new Audio(d);
47
- u = o, o.onended = () => {
48
- t === f && r();
72
+ D(), m = URL.createObjectURL(a);
73
+ let o = new Audio(m);
74
+ p = o, o.onended = () => {
75
+ t === h && r();
49
76
  }, o.onerror = () => {
50
- if (t !== f) {
77
+ if (t !== h) {
51
78
  r();
52
79
  return;
53
80
  }
54
81
  let e = /* @__PURE__ */ Error("audio playback failed");
55
82
  e.reason = "unknown", i(e);
56
83
  }, o.play().then(() => {
57
- t === f && n?.();
84
+ t === h && n?.();
58
85
  }, (e) => {
59
- if (t !== f) {
86
+ if (t !== h) {
60
87
  r();
61
88
  return;
62
89
  }
@@ -68,54 +95,59 @@ function c(c) {
68
95
  return {
69
96
  id: "hosted-tts",
70
97
  isSupported() {
71
- return m ? !1 : typeof window < "u" && typeof window.Audio == "function" && typeof fetch == "function";
98
+ return x() ? !1 : typeof window < "u" && typeof window.Audio == "function" && typeof fetch == "function";
72
99
  },
73
100
  listVoices() {
74
- return [...t];
101
+ return x() ? [] : [...t];
75
102
  },
76
- subscribeVoices() {
77
- return () => {};
103
+ subscribeVoices(e) {
104
+ return S.add(e), () => {
105
+ S.delete(e);
106
+ };
78
107
  },
79
108
  speak(e, t, n = {}) {
80
- let r = e.filter((e) => e.trim().length > 0).flatMap((e) => s(e));
109
+ let r = e.filter((e) => e.trim().length > 0).flatMap((e) => c(e));
81
110
  if (r.length === 0) {
82
111
  n.onEnd?.();
83
112
  return;
84
113
  }
85
- f += 1;
86
- let i = f;
87
- g();
114
+ h += 1;
115
+ let i = h;
116
+ O();
88
117
  let a = new AbortController();
89
- p = a;
90
- let c = !1, l = () => {
91
- c || (c = !0, n.onStart?.());
92
- }, u = (e) => {
93
- let n = _(e, t, a.signal);
118
+ g = a;
119
+ let l = !1, u = () => {
120
+ l || (l = !0, n.onStart?.());
121
+ }, d = (e) => {
122
+ let n = k(e, t, a.signal);
94
123
  return n.catch(() => {}), n;
95
124
  };
96
125
  (async () => {
97
126
  try {
98
- let e = u(r[0]);
127
+ let e = d(r[0]);
99
128
  for (let t = 0; t < r.length; t += 1) {
100
- if (i !== f) return;
129
+ if (i !== h) return;
101
130
  let a = await e;
102
- if (i !== f) return;
131
+ if (i !== h) return;
103
132
  let o = r[t + 1];
104
- o !== void 0 && (e = u(o)), n.onChunkStart?.(t), await v(a, i, l);
133
+ o !== void 0 && (e = d(o)), n.onChunkStart?.(t), await A(a, i, u);
105
134
  }
106
- i === f && n.onEnd?.();
135
+ i === h && n.onEnd?.();
107
136
  } catch (e) {
108
- if (a.abort(), i !== f) return;
109
- f += 1, g();
137
+ if (a.abort(), i !== h) return;
138
+ h += 1, O();
110
139
  let t = e?.reason;
111
- o(t, e?.transient === !0) && (m = !0), n.onError?.(t === "not-allowed" || t === "unsupported" || t === "cancelled" ? t : "unknown");
140
+ s(t, e?.transient === !0) && E(o(t), t === "not-allowed" ? e.headers ?? null : null), n.onError?.(t === "not-allowed" || t === "unsupported" || t === "cancelled" ? t : "unknown");
112
141
  }
113
142
  })();
114
143
  },
144
+ headersChanged() {
145
+ f() >= _ || y === null || x() || (_ = 0, y = null, w(), C());
146
+ },
115
147
  cancel() {
116
- f += 1, p?.abort(), p = null, g();
148
+ h += 1, g?.abort(), g = null, O();
117
149
  }
118
150
  };
119
151
  }
120
152
  //#endregion
121
- export { c as createHostedTtsEngine };
153
+ export { u as createHostedTtsEngine };
@@ -1 +1 @@
1
- {"version":3,"file":"hostedVoiceCatalogue.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/hostedVoiceCatalogue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,mFAAmF;AACnF,eAAO,MAAM,eAAe,cAAc,CAAC;AAyE3C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,eAAe,EAQnD,CAAC;AAiCF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO1D;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE3D"}
1
+ {"version":3,"file":"hostedVoiceCatalogue.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/hostedVoiceCatalogue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,mFAAmF;AACnF,eAAO,MAAM,eAAe,cAAc,CAAC;AA4E3C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,eAAe,EASnD,CAAC;AAiCF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO1D;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE3D"}
@@ -33,7 +33,8 @@ function i(e) {
33
33
  var a = n.flatMap((e) => t.map((t) => ({
34
34
  name: `${e}-Chirp3-HD-${t}`,
35
35
  lang: i(e),
36
- localService: !1
36
+ localService: !1,
37
+ source: "hosted"
37
38
  }))), o = /* @__PURE__ */ new Map();
38
39
  for (let e of n) for (let t of new Set([i(e), e])) {
39
40
  let n = t.toLowerCase().split("-")[0];
@@ -1,6 +1,6 @@
1
1
  export { browserSpeechEngine } from './browserSpeechEngine';
2
2
  export { createHostedTtsEngine } from './hostedTtsSpeechEngine';
3
- export { configureSpeechEngine, createSpeechEngines, getSpeechEngine, readSpeechEngineConfig, resetSpeechEngine, } from './createSpeechEngine';
3
+ export { configureSpeechEngine, createSpeechEngines, getSpeechEngine, readSpeechEngineConfig, resetSpeechEngine, subscribeSpeechEngine, } from './createSpeechEngine';
4
4
  export { createRoutingSpeechEngine } from './routingSpeechEngine';
5
5
  export type { SpeechEngineConfig } from './createSpeechEngine';
6
6
  export { HOSTED_VOICES, HOSTED_TTS_TIER, hostedSupportsLanguage } from './hostedVoiceCatalogue';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChG,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,GAChB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChG,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,GAChB,MAAM,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"routingSpeechEngine.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/routingSpeechEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAA4D,MAAM,SAAS,CAAC;AAEtG,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,4EAA4E;IAC5E,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAgB,yBAAyB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,cAAc,GAAG,YAAY,CAoG1F"}
1
+ {"version":3,"file":"routingSpeechEngine.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/speech/routingSpeechEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,OAAO,KAAK,EAAE,YAAY,EAA4D,MAAM,SAAS,CAAC;AAEtG,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,4EAA4E;IAC5E,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAgB,yBAAyB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,cAAc,GAAG,YAAY,CAyJ1F"}